* feat(progress): add per-language progress reporting to scope-resolution phase (#1741)
The scope-resolution phase (which can run 74+ minutes on large Java/Kotlin
repos) previously emitted zero progress updates, causing the CLI progress bar
to freeze at ~49% with a stale "Parsing code" label — making users think
the tool was stuck.
- Add `scopeResolution` to PipelinePhase type and PHASE_LABELS
- Add `onProgress` callback to `runScopeResolution` with per-file updates
during the extract loop and sub-phase boundary markers (building scope
model, resolving references, emitting edges)
- Wire progress through `scopeResolutionPhase` with pre-counted file totals,
per-language labels, and pipeline-wide percent mapping (90-95 internal)
- Bump mro/communities/processes percent ranges to 95-100 to maintain
monotonic progress after scope resolution
- Add `scopeResolution` to mro's deps (latent ordering fix: mro reads
EXTENDS edges that scope resolution writes via preEmitInheritanceEdges)
* fix(progress): clamp overallRatio, fire final extract event, fix mro @deps JSDoc
- Clamp overallRatio to [0,1] so percent never exceeds 95 when
readFileContents drops files (langFileCount < totalScopeFiles)
- Fire onProgress for the last file in the extract loop even when
files.length is not divisible by progressInterval
- Update mro @deps JSDoc to include scopeResolution
* fix(progress): ensure bar redraws at every state transition
- Fire initial 'extracting' event at file 0 so the sub-phase label
appears immediately, not after progressInterval files
- Emit a completion event at percent 95 when scope resolution finishes
so the bar definitively reaches the phase ceiling before mro starts
* feat(progress): improve UX with human-readable elapsed, language counter, cleaner labels
- Format elapsed time as "5m 12s" / "1h 20m" instead of raw "(312s)"
for all pipeline phases (CLI-wide improvement)
- Add language counter "[1/3]" to scope-resolution detail so users
know how many languages remain and which is active
- Rename sub-phases for clarity: "building scope model" → "analyzing
types", "emitting edges" → "linking symbols"
- Remove nested parentheses from detail strings for cleaner display
- Expand scope-resolution percent range from 5 to 8 points (90-98
internal → 54-59% display) for more visible bar motion
- Re-allocate mro (98), communities (98-99), processes (99-100)
* feat(progress): typed sub-phases, i18n locales, and test coverage
- Extract ScopeResolutionSubPhase union type with exhaustive switch
guard so adding a sub-phase without updating phase.ts is a compile
error
- Add scopeResolution key to en and zh-CN locale files so the web UI
shows translated labels instead of raw message fallback
- Extract formatElapsed to its own module with 7 boundary-value tests
(0s, 59s, 60s, 3599s, 3600s, 3661s, 7323s)
- Add runScopeResolution onProgress integration test proving sub-phase
order (extracting → analyzing types → resolving references → linking
symbols) and the 0-file early-return path
---------
Co-authored-by: Test <test@example.com>