scip-cli 2.11.0__tar.gz → 2.12.0__tar.gz

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 (158) hide show
  1. {scip_cli-2.11.0 → scip_cli-2.12.0}/.github/workflows/ci.yml +1 -1
  2. {scip_cli-2.11.0 → scip_cli-2.12.0}/PKG-INFO +2 -2
  3. {scip_cli-2.11.0 → scip_cli-2.12.0}/README.md +1 -1
  4. {scip_cli-2.11.0 → scip_cli-2.12.0}/docs/incremental-reindex-roadmap.md +9 -6
  5. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/SKILL.md +1 -1
  6. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/__init__.py +1 -1
  7. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/indexing/constants.py +6 -0
  8. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/indexing/shards.py +6 -0
  9. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/indexing/typescript.py +26 -4
  10. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_incremental_shards.py +47 -1
  11. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_indexer_fallback.py +1 -2
  12. {scip_cli-2.11.0 → scip_cli-2.12.0}/.agents/commands/migration-problems.md +0 -0
  13. {scip_cli-2.11.0 → scip_cli-2.12.0}/.agents/rules/agent.mdc +0 -0
  14. {scip_cli-2.11.0 → scip_cli-2.12.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {scip_cli-2.11.0 → scip_cli-2.12.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  16. {scip_cli-2.11.0 → scip_cli-2.12.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
  17. {scip_cli-2.11.0 → scip_cli-2.12.0}/.github/pull_request_template.md +0 -0
  18. {scip_cli-2.11.0 → scip_cli-2.12.0}/.gitignore +0 -0
  19. {scip_cli-2.11.0 → scip_cli-2.12.0}/.pre-commit-config.yaml +0 -0
  20. {scip_cli-2.11.0 → scip_cli-2.12.0}/AGENTS.md +0 -0
  21. {scip_cli-2.11.0 → scip_cli-2.12.0}/CODE_OF_CONDUCT.md +0 -0
  22. {scip_cli-2.11.0 → scip_cli-2.12.0}/CONTRIBUTING.md +0 -0
  23. {scip_cli-2.11.0 → scip_cli-2.12.0}/LICENSE +0 -0
  24. {scip_cli-2.11.0 → scip_cli-2.12.0}/SECURITY.md +0 -0
  25. {scip_cli-2.11.0 → scip_cli-2.12.0}/docs/port.md +0 -0
  26. {scip_cli-2.11.0 → scip_cli-2.12.0}/docs/ports/conclusions.md +0 -0
  27. {scip_cli-2.11.0 → scip_cli-2.12.0}/docs/ports/experiment-summary.md +0 -0
  28. {scip_cli-2.11.0 → scip_cli-2.12.0}/docs/ports/go-experiment.md +0 -0
  29. {scip_cli-2.11.0 → scip_cli-2.12.0}/docs/ports/go.md +0 -0
  30. {scip_cli-2.11.0 → scip_cli-2.12.0}/docs/ports/plan.md +0 -0
  31. {scip_cli-2.11.0 → scip_cli-2.12.0}/docs/ports/rust-experiment.md +0 -0
  32. {scip_cli-2.11.0 → scip_cli-2.12.0}/docs/ports/rust.md +0 -0
  33. {scip_cli-2.11.0 → scip_cli-2.12.0}/docs/ports/summary.md +0 -0
  34. {scip_cli-2.11.0 → scip_cli-2.12.0}/docs/ports/zig-experiment.md +0 -0
  35. {scip_cli-2.11.0 → scip_cli-2.12.0}/docs/ports/zig.md +0 -0
  36. {scip_cli-2.11.0 → scip_cli-2.12.0}/pyproject.toml +0 -0
  37. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/__main__.py +0 -0
  38. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/analyze/__init__.py +0 -0
  39. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/analyze/common.py +0 -0
  40. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/analyze/file.py +0 -0
  41. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/analyze/graph.py +0 -0
  42. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/analyze/live.py +0 -0
  43. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/analyze/project.py +0 -0
  44. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/analyze/sections.py +0 -0
  45. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/analyze/symbol.py +0 -0
  46. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/analyze/targets.py +0 -0
  47. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/cache.py +0 -0
  48. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/cli_args.py +0 -0
  49. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/commands/__init__.py +0 -0
  50. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/commands/analyze.py +0 -0
  51. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/commands/code.py +0 -0
  52. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/commands/deps.py +0 -0
  53. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/commands/members.py +0 -0
  54. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/commands/rdeps.py +0 -0
  55. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/commands/refs.py +0 -0
  56. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/commands/reindex.py +0 -0
  57. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/commands/search.py +0 -0
  58. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/commands/skill.py +0 -0
  59. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/commands/symbols.py +0 -0
  60. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/config.py +0 -0
  61. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/debug.py +0 -0
  62. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/discover.py +0 -0
  63. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/exclude.py +0 -0
  64. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/indexing/__init__.py +0 -0
  65. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/indexing/convert.py +0 -0
  66. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/indexing/core.py +0 -0
  67. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/indexing/languages.py +0 -0
  68. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/indexing/orchestrate.py +0 -0
  69. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/indexing/postprocess.py +0 -0
  70. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/indexing/runners.py +0 -0
  71. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/merge.py +0 -0
  72. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/metadata.py +0 -0
  73. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/output.py +0 -0
  74. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/paths.py +0 -0
  75. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/project.py +0 -0
  76. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/queries.py +0 -0
  77. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/scip_tool.py +0 -0
  78. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/scope.py +0 -0
  79. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/session.py +0 -0
  80. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/source.py +0 -0
  81. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/sql.py +0 -0
  82. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/symbols.py +0 -0
  83. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/targets.py +0 -0
  84. {scip_cli-2.11.0 → scip_cli-2.12.0}/scip_cli/tsconfig.py +0 -0
  85. {scip_cli-2.11.0 → scip_cli-2.12.0}/scripts/bench.sh +0 -0
  86. {scip_cli-2.11.0 → scip_cli-2.12.0}/scripts/bench_postprocess.py +0 -0
  87. {scip_cli-2.11.0 → scip_cli-2.12.0}/scripts/build.sh +0 -0
  88. {scip_cli-2.11.0 → scip_cli-2.12.0}/scripts/publish.sh +0 -0
  89. {scip_cli-2.11.0 → scip_cli-2.12.0}/scripts/test.sh +0 -0
  90. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/__init__.py +0 -0
  91. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/analyze_db.py +0 -0
  92. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/bench_db.py +0 -0
  93. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/conftest.py +0 -0
  94. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/e2e_harness.py +0 -0
  95. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixture_catalog.py +0 -0
  96. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/package.json +0 -0
  97. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/__tests__/fixtureOnly.spec.ts +0 -0
  98. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/app/handler.ts +0 -0
  99. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/config.ts +0 -0
  100. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/consumer.ts +0 -0
  101. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/dead.ts +0 -0
  102. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/domain/i18n/en.ts +0 -0
  103. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/domain/i18n/index.ts +0 -0
  104. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/domain/i18n/useLocale.ts +0 -0
  105. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/domain/labels/index.ts +0 -0
  106. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/events/streamTypes.ts +0 -0
  107. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/gateway/index.ts +0 -0
  108. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/helper.ts +0 -0
  109. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/hooks/useHookA.ts +0 -0
  110. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/hooks/useHookB.ts +0 -0
  111. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/hooks/useItems.ts +0 -0
  112. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/index.ts +0 -0
  113. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/integrations/inferenceClient.ts +0 -0
  114. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/lib/handler.ts +0 -0
  115. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/loaders/useInference.ts +0 -0
  116. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/models/MutationAggregate.ts +0 -0
  117. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/pages/panelPage.ts +0 -0
  118. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/rules/applyRule.ts +0 -0
  119. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/types/a.ts +0 -0
  120. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/types/b.ts +0 -0
  121. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/ui/Button.ts +0 -0
  122. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/ui/LazyPanel.ts +0 -0
  123. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/ui/buttonConsumer.ts +0 -0
  124. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/ui/menuModule.ts +0 -0
  125. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/user.ts +0 -0
  126. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/widget.ts +0 -0
  127. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/src/widgets/OrphanWidget.ts +0 -0
  128. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/fixtures/typescript-project/tsconfig.json +0 -0
  129. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/perf_util.py +0 -0
  130. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_analyze.py +0 -0
  131. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_analyze_graph.py +0 -0
  132. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_analyze_live.py +0 -0
  133. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_analyze_perf.py +0 -0
  134. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_bench_queries.py +0 -0
  135. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_cache.py +0 -0
  136. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_composability.py +0 -0
  137. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_config.py +0 -0
  138. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_discover.py +0 -0
  139. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_e2e.py +0 -0
  140. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_e2e_analyze_patterns.py +0 -0
  141. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_e2e_perf.py +0 -0
  142. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_exclude_globs.py +0 -0
  143. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_index_batching.py +0 -0
  144. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_index_prune.py +0 -0
  145. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_indexer_env.py +0 -0
  146. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_merge.py +0 -0
  147. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_metadata.py +0 -0
  148. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_multi_symbol.py +0 -0
  149. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_pure_functions.py +0 -0
  150. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_python_index_integration.py +0 -0
  151. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_qualified_symbols.py +0 -0
  152. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_reindex.py +0 -0
  153. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_scip_tool.py +0 -0
  154. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_scope.py +0 -0
  155. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_symbols_freq.py +0 -0
  156. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_targets.py +0 -0
  157. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_tsconfig.py +0 -0
  158. {scip_cli-2.11.0 → scip_cli-2.12.0}/tests/test_typescript_projects.py +0 -0
@@ -29,7 +29,7 @@ jobs:
29
29
  python -m venv .venv
30
30
  source .venv/bin/activate
31
31
  pip install -e ".[dev]"
32
- npm install -g @sourcegraph/scip-typescript
32
+ npm install -g github:flesler/scip-typescript#feat/incremental-tsc
33
33
  mkdir -p ~/.local/bin
34
34
  curl -sL https://github.com/scip-code/scip/releases/download/v0.9.0/scip-linux-amd64.tar.gz | tar xz -C ~/.local/bin
35
35
  echo "$VIRTUAL_ENV/bin" >> $GITHUB_PATH
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: scip-cli
3
- Version: 2.11.0
3
+ Version: 2.12.0
4
4
  Summary: Fast code intelligence via SCIP indexes
5
5
  Project-URL: Homepage, https://github.com/flesler/scip-cli
6
6
  Author: Ariel Flesler
@@ -252,7 +252,7 @@ Other environment variables:
252
252
  |`SCIP_CLI_MAX_DEF_LINES`|Max definition lines in `code` output|
253
253
  |`SCIP_CLI_DEBUG`|Log SQL queries to stderr|
254
254
 
255
- **Version policy:** only the `scip` converter (`expt-convert`) is pinned to the 0.8.x release line because it defines the SQLite schema. Language indexers (`scip-typescript`, `scip-python` via `npx`; `scip-go` via `go install @latest`) install at latest on first use. `rust-analyzer` installs via `rustup component add`.
255
+ **Version policy:** only the `scip` converter (`expt-convert`) is pinned to the 0.8.x release line because it defines the SQLite schema. `scip-typescript` installs via npx from the GitHub fork in `scip_cli/indexing/constants.py` when not on PATH (until upstream ships incremental flags). `scip-python` via `npx` at latest; `scip-go` via `go install @latest`. `rust-analyzer` installs via `rustup component add`.
256
256
 
257
257
  Large monorepos (>10 tsconfig projects) log per-project progress to stderr during indexing; smaller repos stay quiet aside from the final `Indexed … (size)` line.
258
258
 
@@ -231,7 +231,7 @@ Other environment variables:
231
231
  |`SCIP_CLI_MAX_DEF_LINES`|Max definition lines in `code` output|
232
232
  |`SCIP_CLI_DEBUG`|Log SQL queries to stderr|
233
233
 
234
- **Version policy:** only the `scip` converter (`expt-convert`) is pinned to the 0.8.x release line because it defines the SQLite schema. Language indexers (`scip-typescript`, `scip-python` via `npx`; `scip-go` via `go install @latest`) install at latest on first use. `rust-analyzer` installs via `rustup component add`.
234
+ **Version policy:** only the `scip` converter (`expt-convert`) is pinned to the 0.8.x release line because it defines the SQLite schema. `scip-typescript` installs via npx from the GitHub fork in `scip_cli/indexing/constants.py` when not on PATH (until upstream ships incremental flags). `scip-python` via `npx` at latest; `scip-go` via `go install @latest`. `rust-analyzer` installs via `rustup component add`.
235
235
 
236
236
  Large monorepos (>10 tsconfig projects) log per-project progress to stderr during indexing; smaller repos stay quiet aside from the final `Indexed … (size)` line.
237
237
 
@@ -18,13 +18,16 @@ Per-tsconfig shard cache with content fingerprints. **Shippable:** unit + integr
18
18
  - [x] Stderr stats: `Incremental: N shard(s) reused, M reindexed`
19
19
  - [x] Update `scip_cli/SKILL.md` and README flag list
20
20
 
21
- ## Phase 2 — scip-typescript fork: TSC incremental program
21
+ ## Phase 2 — scip-typescript fork: TSC incremental program (in progress)
22
22
 
23
- - [ ] Fork `sourcegraph/scip-typescript`
24
- - [ ] `--incremental` / `--ts-build-info-file` CLI flags
25
- - [ ] `createIncrementalProgram` + `createIncrementalCompilerHost` in `ProjectIndexer`
26
- - [ ] Default `tsBuildInfoFile` under scip-cli cache dir (not repo root)
27
- - [ ] scip-cli passes `--ts-build-info-file` when shard is dirty
23
+ Fork work lives outside this repo (local clone + PR to `sourcegraph/scip-typescript`).
24
+
25
+ - [x] Fork `sourcegraph/scip-typescript` (local: implement + tests passing)
26
+ - [x] `--incremental` / `--ts-build-info-dir` CLI flags
27
+ - [x] `createIncrementalProgram` + `createIncrementalCompilerHost` in `ProjectIndexer`
28
+ - [x] scip-cli passes `--incremental --ts-build-info-dir <cache>/tsbuildinfo` on `reindex --incremental` dirty shards
29
+ - [x] npx fallback via `github:flesler/scip-typescript#feat/incremental-tsc` (`SCIP_TYPESCRIPT_NPX_PACKAGE`; switch back when upstream merges)
30
+ - [ ] Upstream PR merged or fork published to npm long-term
28
31
  - [ ] Benchmark dirty shard: program build time before/after
29
32
 
30
33
  ## Phase 3 — File-level incremental inside a shard
@@ -169,4 +169,4 @@ reindex [--path DIR ...] [--tsconfig FILE_OR_GLOB ...] [--exclude [GLOB ...]] [-
169
169
 
170
170
  `--fresh` ignores persisted `metadata.json` and clears it before indexing unless `--path`, `--tsconfig`, or `--exclude` are set on the same command (use `reindex --fresh` to restore a full index).
171
171
 
172
- `--incremental` reuses cached per-project part DBs under `shards/` in the project cache dir (`~/.cache/scip-cli/projects/<slug>/`, alongside `index.db` and `metadata.json`) when inputs are unchanged. **Currently TypeScript only** (Python reindex rejects the flag). Forces one indexer run per discovered project. A plain `reindex` clears the incremental cache; run `reindex --incremental` after an initial full index to benefit. Cannot combine with `--fresh`.
172
+ `--incremental` reuses cached per-project part DBs under `shards/` in the project cache dir (`~/.cache/scip-cli/projects/<slug>/`, alongside `index.db` and `metadata.json`) when inputs are unchanged. **Currently TypeScript only** (Python reindex rejects the flag). Forces one indexer run per discovered project. On dirty shards passes TSC incremental flags; `.tsbuildinfo` under `tsbuildinfo/` in the same cache dir. When `scip-typescript` is not on PATH, npx installs from the GitHub fork (`SCIP_TYPESCRIPT_NPX_PACKAGE` in `indexing/constants.py`) until upstream ships those flags. A plain `reindex` clears the incremental cache; run `reindex --incremental` after an initial full index to benefit. Cannot combine with `--fresh`.
@@ -1,3 +1,3 @@
1
1
  """scip-cli: Fast code intelligence via SCIP indexes."""
2
2
 
3
- __version__ = "2.11.0"
3
+ __version__ = "2.12.0"
@@ -7,6 +7,12 @@ SCIP_INSTALL_URL = "https://github.com/scip-code/scip/releases"
7
7
 
8
8
  # Language indexers (npx / go install) use latest on first use.
9
9
  # The scip expt-convert binary is pinned separately in scip_tool.py (DB schema).
10
+ #
11
+ # scip-typescript npx fallback (when the binary is not on PATH). Fork adds
12
+ # --incremental / --ts-build-info-dir for reindex --incremental. Switch back to
13
+ # @sourcegraph/scip-typescript once upstream merges and releases; otherwise
14
+ # publish the fork to npm long-term.
15
+ SCIP_TYPESCRIPT_NPX_PACKAGE = "github:flesler/scip-typescript#feat/incremental-tsc"
10
16
  # scip-typescript accepts many tsconfig paths per invocation (one .scip, one convert, no merge).
11
17
  # Split only when SCIP_CLI_TS_INDEX_BATCH_SIZE is set (OOM/timeout tuning).
12
18
  DEFAULT_TS_INDEX_BATCH_SIZE = None
@@ -13,6 +13,7 @@ from ..tsconfig import resolved_exclude, resolved_include_or_files, tsconfig_for
13
13
  MANIFEST_VERSION = 1
14
14
  MANIFEST_FILENAME = "manifest.json"
15
15
  SHARDS_DIRNAME = "shards"
16
+ TSBUILDINFO_DIRNAME = "tsbuildinfo"
16
17
 
17
18
  _SOURCE_SUFFIXES = frozenset({".ts", ".tsx", ".js", ".jsx", ".mts", ".cts", ".mjs", ".cjs"})
18
19
 
@@ -21,6 +22,11 @@ def shards_dir(cache_dir: Path) -> Path:
21
22
  return Path(cache_dir) / SHARDS_DIRNAME
22
23
 
23
24
 
25
+ def ts_build_info_dir(cache_dir: Path) -> Path:
26
+ """Directory for per-tsconfig .tsbuildinfo files passed to scip-typescript."""
27
+ return Path(cache_dir) / TSBUILDINFO_DIRNAME
28
+
29
+
24
30
  def manifest_path(cache_dir: Path) -> Path:
25
31
  return shards_dir(cache_dir) / MANIFEST_FILENAME
26
32
 
@@ -14,7 +14,7 @@ from ..config import CONFIG_FILENAME, load_project_config, resolve_index_roots
14
14
  from ..discover import discover_typescript_projects
15
15
  from ..scope import load_index_scope, projects_matching_scope
16
16
  from ..tsconfig import allow_js_overlay, scope_tsconfig_paths, tsconfig_for_project
17
- from .constants import PROGRESS_LOG_MIN_PROJECTS
17
+ from .constants import PROGRESS_LOG_MIN_PROJECTS, SCIP_TYPESCRIPT_NPX_PACKAGE
18
18
  from .convert import convert_scip_to_db
19
19
  from .orchestrate import (
20
20
  batch_projects,
@@ -34,6 +34,7 @@ from .shards import (
34
34
  shard_db_filename,
35
35
  shard_db_path,
36
36
  shard_key,
37
+ ts_build_info_dir,
37
38
  )
38
39
 
39
40
 
@@ -67,11 +68,22 @@ def typescript_projects(root: Path) -> list[Path]:
67
68
  return sorted(merged.values(), key=str)
68
69
 
69
70
 
70
- def _typescript_index_args(root, output_scip, projects):
71
+ def _typescript_index_args(
72
+ root,
73
+ output_scip,
74
+ projects,
75
+ *,
76
+ cache_dir: Path | None = None,
77
+ tsc_incremental: bool = False,
78
+ ):
71
79
  args = ["index", "--output", str(output_scip)]
72
80
  root = Path(root)
73
81
  if not (root / "tsconfig.json").exists():
74
82
  args.insert(1, "--infer-tsconfig")
83
+ if tsc_incremental and cache_dir is not None:
84
+ build_info_dir = ts_build_info_dir(cache_dir)
85
+ build_info_dir.mkdir(parents=True, exist_ok=True)
86
+ args.extend(["--incremental", "--ts-build-info-dir", str(build_info_dir)])
75
87
  args.extend(str(project) for project in projects)
76
88
  return args
77
89
 
@@ -110,6 +122,8 @@ def index_ts_projects(
110
122
  *,
111
123
  output_db: Path | None = None,
112
124
  exclude_globs: tuple[str, ...] = (),
125
+ cache_dir: Path | None = None,
126
+ tsc_incremental: bool = False,
113
127
  ):
114
128
  """Index one or more TypeScript projects into work_dir/index.db (or output_db when set)."""
115
129
  root = Path(root)
@@ -119,13 +133,19 @@ def index_ts_projects(
119
133
  part_scip = work_dir / "index.scip"
120
134
  db_path = Path(output_db) if output_db is not None else work_dir / "index.db"
121
135
  index_projects = materialize_allow_js_projects(root, projects, work_dir)
122
- index_args = _typescript_index_args(root, part_scip, index_projects)
136
+ index_args = _typescript_index_args(
137
+ root,
138
+ part_scip,
139
+ index_projects,
140
+ cache_dir=cache_dir,
141
+ tsc_incremental=tsc_incremental,
142
+ )
123
143
  result = run_indexer_with_fallback(
124
144
  "scip-typescript",
125
145
  index_args,
126
146
  str(root),
127
147
  env=env,
128
- npx_package="@sourcegraph/scip-typescript",
148
+ npx_package=SCIP_TYPESCRIPT_NPX_PACKAGE,
129
149
  )
130
150
  if result.returncode != 0:
131
151
  return label, None, result.stderr.strip() or "indexing failed"
@@ -161,6 +181,8 @@ def _index_shard_batch(
161
181
  env,
162
182
  output_db=output_db,
163
183
  exclude_globs=exclude_globs,
184
+ cache_dir=cache_dir,
185
+ tsc_incremental=True,
164
186
  )
165
187
  if db_path is None:
166
188
  return label, None, error
@@ -13,6 +13,7 @@ from scip_cli.indexing.shards import (
13
13
  save_shard_manifest,
14
14
  shard_db_path,
15
15
  shard_key,
16
+ ts_build_info_dir,
16
17
  )
17
18
 
18
19
 
@@ -29,6 +30,41 @@ def _write_ts_project(root: Path, rel_dir: str, *, source: str = "export const x
29
30
  return Path(rel_dir)
30
31
 
31
32
 
33
+ class TestTsBuildInfoDir:
34
+ def test_lives_under_cache_dir(self, tmp_path):
35
+ cache_dir = tmp_path / "cache"
36
+ assert ts_build_info_dir(cache_dir) == cache_dir / "tsbuildinfo"
37
+
38
+
39
+ class TestTypescriptIndexArgs:
40
+ def test_incremental_passes_tsc_flags(self, tmp_path):
41
+ from scip_cli.indexing.typescript import _typescript_index_args
42
+
43
+ cache_dir = tmp_path / "cache"
44
+ args = _typescript_index_args(
45
+ tmp_path,
46
+ tmp_path / "out.scip",
47
+ [Path("pkg/tsconfig.json")],
48
+ cache_dir=cache_dir,
49
+ tsc_incremental=True,
50
+ )
51
+ assert "--incremental" in args
52
+ assert "--ts-build-info-dir" in args
53
+ assert str(ts_build_info_dir(cache_dir)) in args
54
+
55
+ def test_full_reindex_omits_tsc_flags(self, tmp_path):
56
+ from scip_cli.indexing.typescript import _typescript_index_args
57
+
58
+ args = _typescript_index_args(
59
+ tmp_path,
60
+ tmp_path / "out.scip",
61
+ [Path("pkg/tsconfig.json")],
62
+ tsc_incremental=False,
63
+ )
64
+ assert "--incremental" not in args
65
+ assert "--ts-build-info-dir" not in args
66
+
67
+
32
68
  class TestShardFingerprint:
33
69
  def test_fingerprint_stable_for_same_tree(self, tmp_path):
34
70
  root = tmp_path / "repo"
@@ -205,7 +241,17 @@ class TestIndexTypescriptIncremental:
205
241
  cache_dir = tmp_path / "cache"
206
242
  calls: list[list[Path]] = []
207
243
 
208
- def fake_index_ts_projects(_root, batch, work_dir, _env, *, output_db=None, exclude_globs=()):
244
+ def fake_index_ts_projects(
245
+ _root,
246
+ batch,
247
+ work_dir,
248
+ _env,
249
+ *,
250
+ output_db=None,
251
+ exclude_globs=(),
252
+ cache_dir=None,
253
+ tsc_incremental=False,
254
+ ):
209
255
  calls.append(list(batch))
210
256
  db = Path(output_db) if output_db is not None else Path(work_dir) / "index.db"
211
257
  label = batch[0].as_posix()
@@ -247,8 +247,7 @@ class TestRunIndexerWithFallback:
247
247
  ["index"],
248
248
  "/tmp",
249
249
  env={},
250
- npx_package="@sourcegraph/scip-typescript",
251
- npx_version="0.4.0",
250
+ npx_package="github:flesler/scip-typescript#feat/incremental-tsc",
252
251
  )
253
252
  assert result is mock_result
254
253
  mock_npx.assert_called_once()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes