@cesarandreslopez/occ 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/README.md +31 -8
  2. package/dist/src/cli.d.ts +16 -0
  3. package/dist/src/cli.js +46 -4
  4. package/dist/src/cli.js.map +1 -1
  5. package/dist/src/code/build.d.ts +22 -0
  6. package/dist/src/code/build.js +47 -13
  7. package/dist/src/code/build.js.map +1 -1
  8. package/dist/src/code/cache.js +30 -1
  9. package/dist/src/code/cache.js.map +1 -1
  10. package/dist/src/code/check.js +46 -6
  11. package/dist/src/code/check.js.map +1 -1
  12. package/dist/src/code/command.js +125 -69
  13. package/dist/src/code/command.js.map +1 -1
  14. package/dist/src/code/context.d.ts +54 -0
  15. package/dist/src/code/context.js +67 -0
  16. package/dist/src/code/context.js.map +1 -0
  17. package/dist/src/code/diff.d.ts +12 -2
  18. package/dist/src/code/diff.js +15 -3
  19. package/dist/src/code/diff.js.map +1 -1
  20. package/dist/src/code/discover.d.ts +2 -2
  21. package/dist/src/code/discover.js +8 -10
  22. package/dist/src/code/discover.js.map +1 -1
  23. package/dist/src/code/focus.js +34 -26
  24. package/dist/src/code/focus.js.map +1 -1
  25. package/dist/src/code/incremental.js +1 -1
  26. package/dist/src/code/incremental.js.map +1 -1
  27. package/dist/src/code/index-io.js +10 -2
  28. package/dist/src/code/index-io.js.map +1 -1
  29. package/dist/src/code/isolated-chunk-runner.js +17 -2
  30. package/dist/src/code/isolated-chunk-runner.js.map +1 -1
  31. package/dist/src/code/isolated-runner.js +17 -3
  32. package/dist/src/code/isolated-runner.js.map +1 -1
  33. package/dist/src/code/isolated.js +32 -6
  34. package/dist/src/code/isolated.js.map +1 -1
  35. package/dist/src/code/languages.js +23 -3
  36. package/dist/src/code/languages.js.map +1 -1
  37. package/dist/src/code/map.d.ts +47 -0
  38. package/dist/src/code/map.js +155 -12
  39. package/dist/src/code/map.js.map +1 -1
  40. package/dist/src/code/output.d.ts +3 -1
  41. package/dist/src/code/output.js +11 -0
  42. package/dist/src/code/output.js.map +1 -1
  43. package/dist/src/code/parsers.js +115 -36
  44. package/dist/src/code/parsers.js.map +1 -1
  45. package/dist/src/code/preview.js +24 -22
  46. package/dist/src/code/preview.js.map +1 -1
  47. package/dist/src/code/query.js +0 -0
  48. package/dist/src/code/query.js.map +1 -1
  49. package/dist/src/code/search.d.ts +39 -0
  50. package/dist/src/code/search.js +154 -0
  51. package/dist/src/code/search.js.map +1 -0
  52. package/dist/src/code/session.d.ts +9 -3
  53. package/dist/src/code/session.js +16 -4
  54. package/dist/src/code/session.js.map +1 -1
  55. package/dist/src/code/slim.d.ts +2 -0
  56. package/dist/src/code/slim.js +16 -1
  57. package/dist/src/code/slim.js.map +1 -1
  58. package/dist/src/code/store.d.ts +23 -0
  59. package/dist/src/code/store.js +61 -6
  60. package/dist/src/code/store.js.map +1 -1
  61. package/dist/src/code/tree-sitter.d.ts +1 -0
  62. package/dist/src/code/tree-sitter.js +11 -10
  63. package/dist/src/code/tree-sitter.js.map +1 -1
  64. package/dist/src/code/tree.d.ts +7 -0
  65. package/dist/src/code/tree.js +364 -0
  66. package/dist/src/code/tree.js.map +1 -0
  67. package/dist/src/code/types.d.ts +131 -0
  68. package/dist/src/code/types.js +47 -0
  69. package/dist/src/code/types.js.map +1 -1
  70. package/dist/src/doc/batch.d.ts +2 -0
  71. package/dist/src/doc/batch.js +3 -1
  72. package/dist/src/doc/batch.js.map +1 -1
  73. package/dist/src/doc/discover.js +2 -2
  74. package/dist/src/doc/discover.js.map +1 -1
  75. package/dist/src/doc/inspect-odt.js +3 -1
  76. package/dist/src/doc/inspect-odt.js.map +1 -1
  77. package/dist/src/doc/inspect-pdf.d.ts +6 -0
  78. package/dist/src/doc/inspect-pdf.js +11 -1
  79. package/dist/src/doc/inspect-pdf.js.map +1 -1
  80. package/dist/src/doc/inspect.js +2 -2
  81. package/dist/src/doc/inspect.js.map +1 -1
  82. package/dist/src/doc/types.d.ts +1 -0
  83. package/dist/src/doc/types.js +7 -0
  84. package/dist/src/doc/types.js.map +1 -1
  85. package/dist/src/git/api.d.ts +7 -1
  86. package/dist/src/git/api.js +32 -10
  87. package/dist/src/git/api.js.map +1 -1
  88. package/dist/src/git/client.js +5 -1
  89. package/dist/src/git/client.js.map +1 -1
  90. package/dist/src/git/command.js +22 -2
  91. package/dist/src/git/command.js.map +1 -1
  92. package/dist/src/git/output.d.ts +2 -1
  93. package/dist/src/git/output.js +7 -1
  94. package/dist/src/git/output.js.map +1 -1
  95. package/dist/src/git/parse.d.ts +2 -1
  96. package/dist/src/git/parse.js +222 -2
  97. package/dist/src/git/parse.js.map +1 -1
  98. package/dist/src/git/types.d.ts +49 -5
  99. package/dist/src/git/types.js +21 -0
  100. package/dist/src/git/types.js.map +1 -1
  101. package/dist/src/health.d.ts +8 -0
  102. package/dist/src/health.js +15 -0
  103. package/dist/src/health.js.map +1 -1
  104. package/dist/src/index.d.ts +23 -11
  105. package/dist/src/index.js +14 -5
  106. package/dist/src/index.js.map +1 -1
  107. package/dist/src/inspect/xlsx-cells.js +4 -2
  108. package/dist/src/inspect/xlsx-cells.js.map +1 -1
  109. package/dist/src/markdown/convert.d.ts +9 -0
  110. package/dist/src/markdown/convert.js +23 -1
  111. package/dist/src/markdown/convert.js.map +1 -1
  112. package/dist/src/output/tabular.js +33 -16
  113. package/dist/src/output/tabular.js.map +1 -1
  114. package/dist/src/parsers/odf.js +4 -2
  115. package/dist/src/parsers/odf.js.map +1 -1
  116. package/dist/src/scc.d.ts +3 -0
  117. package/dist/src/scc.js +2 -0
  118. package/dist/src/scc.js.map +1 -1
  119. package/dist/src/skills/command.d.ts +6 -0
  120. package/dist/src/skills/command.js +18 -3
  121. package/dist/src/skills/command.js.map +1 -1
  122. package/dist/src/slide/inspect-odp.js +3 -2
  123. package/dist/src/slide/inspect-odp.js.map +1 -1
  124. package/dist/src/slide/inspect-pptx.js +4 -3
  125. package/dist/src/slide/inspect-pptx.js.map +1 -1
  126. package/dist/src/stats.js +3 -1
  127. package/dist/src/stats.js.map +1 -1
  128. package/dist/src/structure/extract.js +16 -3
  129. package/dist/src/structure/extract.js.map +1 -1
  130. package/dist/src/utils.d.ts +7 -0
  131. package/dist/src/utils.js +19 -0
  132. package/dist/src/utils.js.map +1 -1
  133. package/dist/src/walker.js +15 -3
  134. package/dist/src/walker.js.map +1 -1
  135. package/dist/src/workspace/analyze.d.ts +3 -0
  136. package/dist/src/workspace/analyze.js +26 -15
  137. package/dist/src/workspace/analyze.js.map +1 -1
  138. package/dist/src/workspace/bundle.js +11 -3
  139. package/dist/src/workspace/bundle.js.map +1 -1
  140. package/dist/src/workspace/command.d.ts +6 -0
  141. package/dist/src/workspace/command.js +73 -44
  142. package/dist/src/workspace/command.js.map +1 -1
  143. package/dist/src/workspace/describe.js +22 -13
  144. package/dist/src/workspace/describe.js.map +1 -1
  145. package/dist/src/workspace/documents.d.ts +3 -0
  146. package/dist/src/workspace/documents.js +25 -14
  147. package/dist/src/workspace/documents.js.map +1 -1
  148. package/dist/src/workspace/prepare.js +3 -1
  149. package/dist/src/workspace/prepare.js.map +1 -1
  150. package/dist/src/workspace/types.d.ts +4 -0
  151. package/package.json +12 -11
  152. package/skills/occ/SKILL.md +27 -24
  153. package/skills/occ/reference/code.md +62 -1
  154. package/skills/occ/reference/git.md +17 -1
package/README.md CHANGED
@@ -24,9 +24,9 @@ OCC started as a way to make office documents visible in the same workflows that
24
24
  - extract structured table content from documents (`occ table inspect`)
25
25
  - analyze workspaces for combined code, document, and structure metrics (`occ workspace analyze`) and cross-document references (`occ workspace documents`)
26
26
  - quickly describe whether a directory is a code, office, documentation, data, or mixed project (`occ describe`, `occ workspace describe`)
27
- - summarize code metrics through `scc`
27
+ - summarize code metrics and file-level complexity through `scc`
28
28
  - explore JavaScript, TypeScript, Vue Single-File Components, Python, Go, Rust, Java, C/C++, Kotlin, and other tree-sitter-backed repositories with symbol search, exact `nodeId` source reads, syntax checks, call analysis, dependency inspection, and inheritance queries (`occ code`)
29
- - track git changes, diffs, commit history, and churn — and map a diff to the code symbols it touches (`occ git`, `occ code diff`, `occ code history`)
29
+ - track git changes, diffs, commit history, churn, and file-level co-change — and map a diff to the code symbols it touches (`occ git`, `occ code diff`, `occ code history`)
30
30
 
31
31
  ## Agent Skills
32
32
 
@@ -68,11 +68,12 @@ After install the skill lands at `<skills-dir>/occ/SKILL.md` and your agent surf
68
68
  - **Spreadsheet inspection via `occ sheet inspect`** — workbook properties, hidden sheets, names, formulas, links, comments, schema preview, and token estimates for XLSX
69
69
  - **Presentation inspection via `occ slide inspect`** — metadata, risk flags, per-slide inventory, and content preview for PPTX and ODP
70
70
  - **Table extraction via `occ table inspect`** — structured table content from DOCX, XLSX, PPTX, ODT, and ODP with auto-detected headers, sample row limits, and merged cell support
71
- - **Code metrics via scc** — auto-detects code files and integrates scc output
71
+ - **Code metrics via scc** — auto-detects code files and integrates scc output, including file-level `Complexity` where scc provides it
72
72
  - **Code exploration via `occ code`** — JS/TS, Vue SFC, Python, Go, Rust, Java, C/C++, Kotlin, and other tree-sitter-backed symbol lookup, exact `nodeId` source reads with `occ code source`, syntax checks with `occ code check`, content search, callers/callees, dependency categories, inheritance, module coupling, and ambiguity-aware chains
73
73
  - **Repository map / pack via `occ code map` / `occ code pack`** — token-budgeted, PageRank-ranked repo map (top symbol signatures per file) or content pack, with a pluggable heuristic or BPE (`o200k_base` / `cl100k_base`) tokenizer for exact budgets, and opt-in query/path focus (`--query`, `--focus-path`, `--focus-depth`) to bias the map toward a specific task
74
74
  - **Workspace analysis via `occ workspace`** — fast directory description plus combined code, document, and structure analysis with versioned JSON contracts, per-document summaries, and cross-reference detection
75
- - **Git context via `occ git`** — changed files, diff summaries and token-bounded patches, commit/file history, and churn hotspots over a typed, shell-injection-safe git client; plus git-aware code (`occ code diff`, `occ code history`, `occ code map --changed-from`) that maps a diff to the code symbols it touches
75
+ - **Directory tree via `occ code dirtree`** — bounded, ignore-aware trees from the built code index with focus drill-in and map-mode symbol annotations
76
+ - **Git context via `occ git`** — changed files, diff summaries and token-bounded patches, commit/file history, churn hotspots, and file-level co-change over a typed, shell-injection-safe git client; plus git-aware code (`occ code diff`, `occ code history`, `occ code map --changed-from`) that maps a diff to the code symbols it touches
76
77
  - **Multiple output modes** — grouped by type, per-file breakdown, or JSON
77
78
  - **CI-friendly** — ASCII-only, no-color mode for pipelines
78
79
  - **Flexible filtering** — include/exclude extensions, exclude directories, .gitignore-aware
@@ -162,6 +163,7 @@ occ code index --path . --format json
162
163
  # Token-budgeted, PageRank-ranked repo map (signatures) and pack (content)
163
164
  occ code map --path . --map-tokens 4096
164
165
  occ code pack --path . --map-tokens 8192 --tokenizer o200k_base
166
+ occ code dirtree --path . --mode map --map-tokens 4096
165
167
 
166
168
  # Git-aware code: which symbols a diff touched, and a diff-focused repo map
167
169
  occ code diff --base main --map-tokens 4096
@@ -173,6 +175,7 @@ occ git changed --base main
173
175
  occ git diff --base main --patch --map-tokens 2048
174
176
  occ git history src/cli.ts --limit 10
175
177
  occ git churn --sort churn --limit 20
178
+ occ git cochange --target src/cli.ts --limit 20
176
179
 
177
180
  # Workspace-level analysis (code + documents + structures)
178
181
  occ workspace analyze --format json
@@ -310,6 +313,9 @@ occ code analyze chain ambiguousCaller duplicate --path test/fixtures/code-explo
310
313
  occ code map --path . --map-tokens 4096
311
314
  occ code pack --path . --map-tokens 8192 --tokenizer o200k_base
312
315
 
316
+ # Bounded directory tree from the built, ignore-aware code index
317
+ occ code dirtree --path . --mode map --map-tokens 4096
318
+
313
319
  # Focus the map on a task — by query and/or path (with graph neighbors)
314
320
  occ code map --path . --query "workspace context injection" --focus-path src/services/memory --map-tokens 4096
315
321
 
@@ -324,9 +330,13 @@ Highlights of the current code exploration behavior:
324
330
 
325
331
  - **Full index export** via `occ code index` — dump the complete graph (files, symbols, edges, language capabilities) as JSON or a summary line
326
332
  - **Repository map and pack** via `occ code map` / `occ code pack` — PageRank-ranked, token-budgeted output (symbol signatures or file content) that greedily admits the highest-ranked files within the budget, shrinking content or shedding low-rank symbols rather than dropping a file that nearly fits, with a pluggable heuristic or BPE tokenizer (`--tokenizer o200k_base|cl100k_base`)
333
+ - **Directory tree** via `occ code dirtree` / `buildDirectoryTree` / `session.getDirectoryTree` — bounded, ignore-aware tree output derived from `CodebaseIndex.files` with `truncatedPaths` for drill-in and map mode for top symbol signatures per subtree
327
334
  - **Focused maps** via `--query`, `--focus-path` (repeatable), and `--focus-depth` — opt-in, additive relevance scoring (query + path + graph neighbors) blended with the global rank so task-relevant files surface within the budget; omitting the flags keeps the global PageRank overview unchanged
328
335
  - **Change-aware exploration** via `occ code diff` (symbols touched by a git diff range, with removed-symbol recovery), `occ code history <symbol>` (git line history for a symbol), and `occ code map --changed-from <ref>` (diff-focused repo maps)
329
336
  - **Exact, pattern, type, and content search** over the repository graph
337
+ - **Fuzzy symbol search** via `searchSymbols` / `session.searchSymbols` (`createOcc().code.searchSymbols`) — rank symbols across name, container-qualified name, and file path with match positions/spans for highlighting; the corpus is memoized per index so repeated queries in long-running hosts pay the build once
338
+ - **Code-context projection** via `buildCodeContext` / `session.projectContext` (`createOcc().code.context`) — project a full or slim index down to per-file exported symbols, a deduplicated local import graph, and external dependency roots
339
+ - **Symbol→node linkage** — index `files[].symbols[]` entries (and the slim format, `occ code map` / `find` / `index` JSON) carry a `nodeId`, so a file symbol addresses its graph node directly without scanning `nodes`
330
340
  - **Single-symbol source reads** via `occ code source` — read one symbol body by stable `nodeId` (from `occ code map` / `find` / `index` JSON) or a disambiguated name, reading file content on demand and refusing paths that escape the repo root
331
341
  - **Language-server-free syntax checks** via `occ code check` — TS/JS, Vue SFC, Python, and the vendored tree-sitter languages; exits nonzero only when `valid` is false
332
342
  - **Call analysis** with explicit `resolved`, `ambiguous`, and `unresolved` states
@@ -360,8 +370,10 @@ import { createCodeQuerySession } from '@cesarandreslopez/occ/code/session';
360
370
  const session = await createCodeQuerySession({ repoRoot: './my-repo' });
361
371
  session.findByName('UserService');
362
372
  session.analyzeCalls('bootstrap');
373
+ session.searchSymbols('usrsvc', { limit: 10 }); // fuzzy match across name, container, and path
374
+ session.projectContext(); // per-file exports + local import graph + external dependency roots
363
375
  session.chunk({ maxChunkWords: 200 });
364
- await session.refresh(); // rebuild index when files change
376
+ await session.refresh(); // rebuild index when files change (accepts an optional AbortSignal)
365
377
  ```
366
378
 
367
379
  For persistent caching across sessions with automatic freshness checks:
@@ -374,6 +386,12 @@ const store = openCodeIndexStore({
374
386
  cacheDir: '.occ-cache',
375
387
  });
376
388
 
389
+ // Probe the persisted cache cheaply — before the first getSession() and without
390
+ // deserializing the index or reparsing files (both return null when no usable
391
+ // cache exists yet). Handy for long-running hosts deciding whether to refresh.
392
+ const meta = await store.peekMetadata(); // persisted metadata, validated against repo/options/version
393
+ const freshness = await store.isFresh(); // stat-only working-tree vs. manifest diff
394
+
377
395
  // First call builds + caches; subsequent calls load from cache
378
396
  const session = await store.getSession({ strategy: 'prefer-cache' });
379
397
  session.findByName('UserService');
@@ -395,8 +413,11 @@ const session = await occ.code.createSession({ repoRoot: './my-repo' });
395
413
  const description = await occ.workspace.describe('./my-project');
396
414
  const analysis = await occ.workspace.analyze('./my-project', { includeCode: true });
397
415
  const doc = await occ.doc.inspect('report.docx', {});
416
+ const status = await occ.health(); // version, capability flags, and a `features` map for probing
398
417
  ```
399
418
 
419
+ The facade also exposes the code helpers directly: `occ.code.searchSymbols(index, query, options)` (fuzzy symbol search), `occ.code.context(index)` (per-file exports + local import graph), `occ.code.mapChanged(index, { changed, ...RepoMapOptions })` (the programmatic form of `occ code map --changed-from`), `occ.code.directoryTree(index, options)` / `session.getDirectoryTree(options)`, and `occ.git.cochange(options)`. Hosts that must support multiple OCC versions can feature-detect with `status.features?.['code.directoryTree'] === true`, `status.features?.['git.cochange'] === true`, or `status.features?.['metrics.fileComplexity'] === true` — the map only ever gains keys, so a missing key means the feature is unavailable.
420
+
400
421
  For large or untrusted repositories, preview the size first, then build the index in an isolated subprocess with a budget. Pair with the slim variant when the consumer only needs the graph (no source content):
401
422
 
402
423
  ```ts
@@ -493,7 +514,7 @@ Available subpath exports:
493
514
  | `@cesarandreslopez/occ/code/build` | `buildCodebaseIndex` — graph construction (with optional `maxFiles`/`maxBytes`/`onBudgetExceeded` budget controls and `CodeIndexBudgetExceededError`); also `parseCodeFiles` (bounded-concurrency parse pool) + `assembleCodebaseIndex` for staged indexing |
494
515
  | `@cesarandreslopez/occ/code/types` | TypeScript types (`CodebaseIndex`, `CodeNode`, `CodeEdge`, `IndexTruncation`, etc.) |
495
516
  | `@cesarandreslopez/occ/code/query` | Query functions (`findByName`, `analyzeCalls`, `analyzeDeps`, etc.) |
496
- | `@cesarandreslopez/occ/code/discover` | `discoverCodeFiles` — file discovery |
517
+ | `@cesarandreslopez/occ/code/discover` | `discoverCodeFiles` — code file discovery (defaults to the shared `DEFAULT_EXCLUDE_DIRS`, re-exported here and from the package root — now also covering `out`, `.next`, `__pycache__`, and `.venv`) |
497
518
  | `@cesarandreslopez/occ/code/preview` | `previewCodebaseSize` — cheap size + per-language estimate without parsing, with budget pressure reporting |
498
519
  | `@cesarandreslopez/occ/code/isolated` | `buildCodebaseIndexIsolated` — runs `buildCodebaseIndex` in a forked subprocess, optionally returning a slim index; also `chunkFromStoreIsolated` — runs store-backed code chunking in a forked subprocess (options `ChunkFromStoreIsolatedOptions`, `SerializableCodeChunkOptions`) |
499
520
  | `@cesarandreslopez/occ/code/incremental` | `computeManifestDiff`, `classifyChangedFiles`, `findResolutionImpactedFiles`, `spliceIndexInputs` — primitives behind incremental `update()`/`ensureFresh()` (manifest diff + resolution-impact + graph splice) |
@@ -503,7 +524,7 @@ Available subpath exports:
503
524
  | `@cesarandreslopez/occ/code/store` | `openCodeIndexStore`, `openChunkCodeIndexStore` — persistent index store with cache strategies (the chunk variant pins `contentMode: 'full'`; `update(changedFiles?)` does a true incremental refresh — manifest diff + targeted re-parse + graph splice; `chunkIsolated(options?)` chunks the cached index in a forked subprocess) |
504
525
  | `@cesarandreslopez/occ/code/cache` | Index caching utilities (legacy — prefer `./code/store`) |
505
526
  | `@cesarandreslopez/occ/code/diff` | `computeCodeDiff`, `joinHunksToSymbols` — map a git diff range to changed code symbols (added/removed/modified, new/removed exports, removed-symbol recovery) |
506
- | `@cesarandreslopez/occ/git` | Git context API — `getGitChangedFiles`, `getGitDiffSummary`, `getGitDiffPatch`, `getGitDiffHunks`, `getGitDiffFunctionContext`, `getGitCommitHistory`, `getGitFileHistory`, `getGitChurnSummary`, `resolveGitRange` (also `./git/types`, `./git/api`, `./git/client`, `./git/parse`) |
527
+ | `@cesarandreslopez/occ/git` | Git context API — `getGitChangedFiles`, `getGitDiffSummary`, `getGitDiffPatch`, `getGitDiffHunks`, `getGitDiffFunctionContext`, `getGitCommitHistory`, `getGitFileHistory`, `getGitChurnSummary`, `getGitCochange`, `resolveGitRange` (also `./git/types`, `./git/api`, `./git/client`, `./git/parse`) |
507
528
  | `@cesarandreslopez/occ/doc/inspect` | `inspectDocument` — document metadata and content extraction |
508
529
  | `@cesarandreslopez/occ/doc/types` | Document inspection types |
509
530
  | `@cesarandreslopez/occ/doc/discover` | Document file discovery (now includes prose formats by default; opt into data files via `includeDataFiles`; new `discoverDocumentSet` returns `{ documents, skipped }`) |
@@ -526,7 +547,7 @@ Available subpath exports:
526
547
  | `@cesarandreslopez/occ/slide/inspect` | `inspectPresentation` — presentation inspection |
527
548
  | `@cesarandreslopez/occ/table/inspect` | Table extraction from documents |
528
549
  | `@cesarandreslopez/occ/table/types` | Table extraction types |
529
- | `@cesarandreslopez/occ/health` | `health()` — liveness probe with version + capability flags |
550
+ | `@cesarandreslopez/occ/health` | `health()` — liveness probe with version, capability flags, and a stable `features` map (only-added keys like `code.searchSymbols` / `store.isFresh`) for fine-grained feature detection |
530
551
  | `@cesarandreslopez/occ/errors` | `OccAbortError`, `OCC_ABORTED`, `isOccAbortError` — typed abort error that survives `instanceof` across forked subprocesses |
531
552
  | `@cesarandreslopez/occ/types` | Shared types (`ConfidenceLevel`, `ParseResult`, `ParserOutput`, etc.) |
532
553
  | `@cesarandreslopez/occ/tokens` | Token estimation utilities |
@@ -703,6 +724,7 @@ occ git history src/cli.ts --line-start 10 --line-end 50
703
724
 
704
725
  # Rank changed files by churn to find hotspots
705
726
  occ git churn --sort churn --limit 20 --format json
727
+ occ git cochange --target src/cli.ts --limit 20 --format json
706
728
  ```
707
729
 
708
730
  Current git context highlights:
@@ -711,6 +733,7 @@ Current git context highlights:
711
733
  - **`occ git diff`** — per-file churn summary, or the raw unified patch with `--patch`, token-bounded via `--map-tokens` / `--tokenizer` (degrades gracefully, reporting `filesOmitted`, when the diff exceeds the git buffer)
712
734
  - **`occ git history`** — commit history for a range, or per-file history with `--follow`, `--since`, `--limit`, and line-scoped `git log -L` via `--line-start` / `--line-end`
713
735
  - **`occ git churn`** — files ranked by `--sort churn|commits|added|deleted|net` (default `churn`) with commit, addition, deletion, net, and last-touched metrics
736
+ - **`occ git cochange`** — file pairs ranked by historical co-change count and lift, with `--target` for one-file impact context and `--max-commit-files` to ignore sweeping commits
714
737
  - **Symbol-level changes** — pair with `occ code diff` to see which _symbols_ (not just files and lines) a diff touched
715
738
 
716
739
  ## Documentation
package/dist/src/cli.d.ts CHANGED
@@ -19,6 +19,22 @@ declare const CliOptionsSchema: z.ZodObject<{
19
19
  showConfidence: z.ZodOptional<z.ZodBoolean>;
20
20
  }, z.core.$loose>;
21
21
  type CliOptions = z.infer<typeof CliOptionsSchema>;
22
+ /**
23
+ * Resolve the scc binary, degrading to null (documents-only) when scc is not
24
+ * available instead of aborting the whole scan. Returns a warning string when
25
+ * scc could not be found so the caller can surface it without failing.
26
+ */
27
+ export declare function resolveSccBinary(resolve?: () => Promise<string>): Promise<{
28
+ binary: string | null;
29
+ warning: string | null;
30
+ }>;
31
+ /**
32
+ * Translate directory-style ignore patterns into scc --exclude-dir names. scc
33
+ * excludes by directory basename, so only single-segment directory patterns
34
+ * (optionally with a trailing slash, `/**`, or `/*`) can be forwarded; negations,
35
+ * multi-segment paths, and wildcard patterns are left to apply to documents only.
36
+ */
37
+ export declare function deriveSccExcludeDirs(ignorePatterns: string[]): string[];
22
38
  export declare function run(argv: string[]): Promise<void>;
23
39
  export declare function applyTokenBudget(output: string, opts: CliOptions): Promise<string>;
24
40
  export {};
package/dist/src/cli.js CHANGED
@@ -48,6 +48,45 @@ const CliOptionsSchema = z
48
48
  function collectOption(value, previous = []) {
49
49
  return [...previous, value];
50
50
  }
51
+ /**
52
+ * Resolve the scc binary, degrading to null (documents-only) when scc is not
53
+ * available instead of aborting the whole scan. Returns a warning string when
54
+ * scc could not be found so the caller can surface it without failing.
55
+ */
56
+ export async function resolveSccBinary(resolve = checkScc) {
57
+ try {
58
+ return { binary: await resolve(), warning: null };
59
+ }
60
+ catch {
61
+ return {
62
+ binary: null,
63
+ warning: 'scc not found; skipping code analysis (documents only). ' +
64
+ 'Run "npm install" to auto-download it, or install from https://github.com/boyter/scc.',
65
+ };
66
+ }
67
+ }
68
+ /**
69
+ * Translate directory-style ignore patterns into scc --exclude-dir names. scc
70
+ * excludes by directory basename, so only single-segment directory patterns
71
+ * (optionally with a trailing slash, `/**`, or `/*`) can be forwarded; negations,
72
+ * multi-segment paths, and wildcard patterns are left to apply to documents only.
73
+ */
74
+ export function deriveSccExcludeDirs(ignorePatterns) {
75
+ const dirs = [];
76
+ for (const raw of ignorePatterns) {
77
+ const pattern = raw.trim();
78
+ if (!pattern || pattern.startsWith('!') || pattern.startsWith('#'))
79
+ continue;
80
+ const stripped = pattern.replace(/^\.?\/+/, '').replace(/\/(\*\*|\*)?$/, '');
81
+ if (!stripped || stripped === '.' || stripped === '..')
82
+ continue;
83
+ if (/[/*?[\]{}]/.test(stripped))
84
+ continue;
85
+ if (!dirs.includes(stripped))
86
+ dirs.push(stripped);
87
+ }
88
+ return dirs;
89
+ }
51
90
  const PackageJsonSchema = z.object({ version: z.string() }).passthrough();
52
91
  // Find package.json — works from both src/ (dev) and dist/src/ (built)
53
92
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -75,7 +114,7 @@ export async function run(argv) {
75
114
  .option('--include-ext <exts>', 'comma-separated extensions to include')
76
115
  .option('--exclude-ext <exts>', 'comma-separated extensions to exclude')
77
116
  .option('--exclude-dir <dirs>', 'directories to skip (comma-separated)', 'node_modules,.git')
78
- .option('--ignore-pattern <pattern>', 'gitignore-style pattern to ignore', collectOption, [])
117
+ .option('--ignore-pattern <pattern>', 'gitignore-style pattern to ignore (directory-name patterns also excluded from code metrics)', collectOption, [])
79
118
  .option('--no-gitignore', 'disable .gitignore respect')
80
119
  // Note: this is a global option, so it is inherited by every subcommand. It is
81
120
  // intentionally not constrained with .choices() because subcommands (e.g. `git churn`)
@@ -206,7 +245,10 @@ async function execute(directories, opts) {
206
245
  const includeCode = opts.code !== false;
207
246
  let sccBinary = null;
208
247
  if (includeCode) {
209
- sccBinary = await checkScc();
248
+ const resolved = await resolveSccBinary();
249
+ sccBinary = resolved.binary;
250
+ if (resolved.warning)
251
+ await writeStream(process.stderr, `Warning: ${resolved.warning}\n`);
210
252
  }
211
253
  // Find and parse office documents
212
254
  const { files, skipped } = await findFiles(directories, {
@@ -230,12 +272,12 @@ async function execute(directories, opts) {
230
272
  showConfidence: opts.showConfidence,
231
273
  });
232
274
  let sccData = null;
233
- if (includeCode) {
275
+ if (includeCode && sccBinary) {
234
276
  if (showProgress)
235
277
  process.stderr.write('\rAnalyzing code with scc...');
236
278
  sccData = await runScc(sccBinary, directories, {
237
279
  byFile: opts.byFile,
238
- excludeDir: excludeDirs,
280
+ excludeDir: [...excludeDirs, ...deriveSccExcludeDirs(opts.ignorePattern ?? [])],
239
281
  sort: opts.sort,
240
282
  ci: opts.ci,
241
283
  noGitignore: !opts.gitignore,
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -78,6 +78,22 @@ export declare class CodeIndexBudgetExceededError extends Error {
78
78
  readonly budget: CodeIndexBudget;
79
79
  constructor(budget: CodeIndexBudget);
80
80
  }
81
+ /**
82
+ * Pre-parse stat snapshot for a file retained by the build. Structurally
83
+ * compatible with the incremental manifest entry shape. Captured BEFORE
84
+ * parsing, so an edit made while the build is running diverges from the
85
+ * recorded stat and is detected by the next freshness check.
86
+ */
87
+ export interface BuildFileStat {
88
+ relativePath: string;
89
+ size: number;
90
+ mtimeMs: number;
91
+ }
92
+ export interface BuildCodebaseResult {
93
+ index: CodebaseIndex;
94
+ /** Stats for the budgeted file set, keyed for manifest reuse by stores. */
95
+ fileStats: BuildFileStat[];
96
+ }
81
97
  /**
82
98
  * Parse `files` with bounded concurrency. Both result arrays are returned in
83
99
  * input order (per-slot results are compacted after the pool drains).
@@ -86,5 +102,11 @@ export declare class CodeIndexBudgetExceededError extends Error {
86
102
  */
87
103
  export declare function parseCodeFiles(files: string[], options: ParseCodeFilesOptions, onProgress?: OnProgress, signal?: AbortSignal, yielder?: Yielder): Promise<ParseCodeFilesResult>;
88
104
  export declare function buildCodebaseIndex(options: BuildCodebaseOptions, onProgress?: OnProgress, signal?: AbortSignal): Promise<CodebaseIndex>;
105
+ /**
106
+ * Like {@link buildCodebaseIndex}, but also returns the pre-parse stat
107
+ * snapshot of the budgeted file set so callers persisting a freshness
108
+ * manifest don't have to re-stat every file after the build.
109
+ */
110
+ export declare function buildCodebaseIndexWithStats(options: BuildCodebaseOptions, onProgress?: OnProgress, signal?: AbortSignal): Promise<BuildCodebaseResult>;
89
111
  export declare function assembleCodebaseIndex(input: AssembleCodebaseIndexInput, onProgress?: OnProgress, signal?: AbortSignal): CodebaseIndex;
90
112
  export declare function assembleCodebaseIndexCooperative(input: AssembleCodebaseIndexInput, yielder: Yielder, onProgress?: OnProgress, signal?: AbortSignal): Promise<CodebaseIndex>;
@@ -107,7 +107,7 @@ async function withFileSizes(filePaths, signal) {
107
107
  const statted = await mapWithConcurrency(filePaths, 32, async (filePath) => {
108
108
  try {
109
109
  const fileStat = await stat(filePath);
110
- return fileStat.isFile() ? { path: filePath, size: fileStat.size } : null;
110
+ return fileStat.isFile() ? { path: filePath, size: fileStat.size, mtimeMs: fileStat.mtimeMs } : null;
111
111
  }
112
112
  catch {
113
113
  // Files can disappear between discovery and stat; they are dropped from
@@ -329,6 +329,15 @@ export async function parseCodeFiles(files, options, onProgress, signal, yielder
329
329
  return { parsedFiles, skippedFiles };
330
330
  }
331
331
  export async function buildCodebaseIndex(options, onProgress, signal) {
332
+ const { index } = await buildCodebaseIndexWithStats(options, onProgress, signal);
333
+ return index;
334
+ }
335
+ /**
336
+ * Like {@link buildCodebaseIndex}, but also returns the pre-parse stat
337
+ * snapshot of the budgeted file set so callers persisting a freshness
338
+ * manifest don't have to re-stat every file after the build.
339
+ */
340
+ export async function buildCodebaseIndexWithStats(options, onProgress, signal) {
332
341
  const repoRoot = path.resolve(options.repoRoot);
333
342
  const contentMode = options.contentMode ?? 'excerpt';
334
343
  const cooperative = isCooperative(options.cooperative);
@@ -366,9 +375,18 @@ export async function buildCodebaseIndex(options, onProgress, signal) {
366
375
  skippedFiles,
367
376
  truncated: budgeted.truncated,
368
377
  };
369
- return yielder
370
- ? assembleCodebaseIndexCooperative(input, yielder, onProgress, signal)
378
+ const index = yielder
379
+ ? await assembleCodebaseIndexCooperative(input, yielder, onProgress, signal)
371
380
  : assembleCodebaseIndex(input, onProgress, signal);
381
+ const budgetedPaths = new Set(budgeted.files);
382
+ const fileStats = discoveredWithSizes
383
+ .filter(file => budgetedPaths.has(file.path))
384
+ .map(file => ({
385
+ relativePath: normalizePath(path.relative(repoRoot, file.path)),
386
+ size: file.size,
387
+ mtimeMs: file.mtimeMs,
388
+ }));
389
+ return { index, fileStats };
372
390
  }
373
391
  /**
374
392
  * Assemble the node/edge graph from already-parsed files. Synchronous —
@@ -437,8 +455,14 @@ function* assembleSteps(input, onProgress, signal) {
437
455
  });
438
456
  const symbolIndex = new Map();
439
457
  for (const symbol of file.symbols) {
440
- const containerId = symbol.containerName
441
- ? makeId('class', file.path, symbol.containerName, file.symbols.find(candidate => candidate.type === 'class' && candidate.name === symbol.containerName)?.line)
458
+ // Containers can be classes or interface-like types (interfaces, traits,
459
+ // protocols). Rebuild the container id exactly as the container node's own
460
+ // id is constructed below so member `contains` edges resolve to a real node.
461
+ const container = symbol.containerName
462
+ ? file.symbols.find(candidate => (candidate.type === 'class' || candidate.type === 'interface') && candidate.name === symbol.containerName)
463
+ : undefined;
464
+ const containerId = container
465
+ ? makeId(container.type, file.path, container.name, container.line, container.containerName)
442
466
  : moduleNode.id;
443
467
  const node = {
444
468
  id: makeId(symbol.type, file.path, symbol.name, symbol.line, symbol.containerName),
@@ -457,6 +481,10 @@ function* assembleSteps(input, onProgress, signal) {
457
481
  signature: symbol.signature,
458
482
  };
459
483
  pushNode(node);
484
+ // Stamp the graph linkage onto the file symbol so index consumers can
485
+ // jump from files[].symbols[] to nodes without a scan. Node ids are
486
+ // deterministic, so re-assembly over cached parses stamps identically.
487
+ symbol.nodeId = node.id;
460
488
  symbolByIdentity.set(makeId(symbol.type, file.path, symbol.name, symbol.line, symbol.containerName), node);
461
489
  mapPush(symbolIndex, symbol.name, node);
462
490
  edges.push({
@@ -506,12 +534,18 @@ function* assembleSteps(input, onProgress, signal) {
506
534
  const sourceSymbols = topLevelSymbolsByFile.get(fileImport.resolvedPath);
507
535
  if (sourceSymbols) {
508
536
  for (const name of sourceSymbols.keys()) {
509
- fileMap.set(name, fileImport.resolvedPath);
537
+ fileMap.set(name, { path: fileImport.resolvedPath, sourceName: name });
510
538
  }
511
539
  }
512
540
  }
513
541
  else {
514
- fileMap.set(binding.localName, fileImport.resolvedPath);
542
+ // For aliased re-exports (`export { foo as baz }`) the source module
543
+ // exports the original name, so resolution must look it up by
544
+ // importedName, not the outward alias.
545
+ fileMap.set(binding.localName, {
546
+ path: fileImport.resolvedPath,
547
+ sourceName: binding.importedName ?? binding.localName,
548
+ });
515
549
  }
516
550
  }
517
551
  }
@@ -666,9 +700,9 @@ function* assembleSteps(input, onProgress, signal) {
666
700
  else if (namespaceBinding?.modulePath) {
667
701
  let importedFileSymbols = topLevelSymbolsByFile.get(namespaceBinding.modulePath)?.get(call.calleeName) ?? [];
668
702
  if (importedFileSymbols.length === 0) {
669
- const reExportSource = reExportsByFile.get(namespaceBinding.modulePath)?.get(call.calleeName);
670
- if (reExportSource) {
671
- importedFileSymbols = topLevelSymbolsByFile.get(reExportSource)?.get(call.calleeName) ?? [];
703
+ const reExport = reExportsByFile.get(namespaceBinding.modulePath)?.get(call.calleeName);
704
+ if (reExport) {
705
+ importedFileSymbols = topLevelSymbolsByFile.get(reExport.path)?.get(reExport.sourceName) ?? [];
672
706
  }
673
707
  }
674
708
  if (importedFileSymbols.length > 0)
@@ -678,9 +712,9 @@ function* assembleSteps(input, onProgress, signal) {
678
712
  const symbolName = directBinding.importedName ?? call.calleeName;
679
713
  let importedFileSymbols = topLevelSymbolsByFile.get(directBinding.modulePath)?.get(symbolName) ?? [];
680
714
  if (importedFileSymbols.length === 0) {
681
- const reExportSource = reExportsByFile.get(directBinding.modulePath)?.get(symbolName);
682
- if (reExportSource) {
683
- importedFileSymbols = topLevelSymbolsByFile.get(reExportSource)?.get(symbolName) ?? [];
715
+ const reExport = reExportsByFile.get(directBinding.modulePath)?.get(symbolName);
716
+ if (reExport) {
717
+ importedFileSymbols = topLevelSymbolsByFile.get(reExport.path)?.get(reExport.sourceName) ?? [];
684
718
  }
685
719
  }
686
720
  if (importedFileSymbols.length > 0)