scip-cli 2.11.0__tar.gz → 3.0.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 (267) hide show
  1. {scip_cli-2.11.0 → scip_cli-3.0.0}/.github/workflows/ci.yml +7 -1
  2. {scip_cli-2.11.0 → scip_cli-3.0.0}/.gitignore +5 -0
  3. {scip_cli-2.11.0 → scip_cli-3.0.0}/PKG-INFO +2 -2
  4. {scip_cli-2.11.0 → scip_cli-3.0.0}/README.md +1 -1
  5. scip_cli-3.0.0/docs/benchmarks.md +188 -0
  6. scip_cli-3.0.0/docs/incremental-reindex-roadmap.md +76 -0
  7. scip_cli-3.0.0/scip_cli/SKILL.md +135 -0
  8. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/__init__.py +1 -1
  9. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/__main__.py +8 -0
  10. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/commands/reindex.py +41 -22
  11. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/exclude.py +12 -0
  12. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/indexing/constants.py +14 -0
  13. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/indexing/convert.py +15 -5
  14. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/indexing/core.py +12 -10
  15. scip_cli-3.0.0/scip_cli/indexing/document_upsert.py +116 -0
  16. scip_cli-3.0.0/scip_cli/indexing/git_delta.py +170 -0
  17. scip_cli-3.0.0/scip_cli/indexing/github_npm.py +146 -0
  18. scip_cli-3.0.0/scip_cli/indexing/incremental.py +328 -0
  19. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/indexing/orchestrate.py +1 -14
  20. scip_cli-3.0.0/scip_cli/indexing/performance.py +67 -0
  21. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/indexing/postprocess.py +5 -0
  22. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/indexing/runners.py +8 -3
  23. scip_cli-3.0.0/scip_cli/indexing/shard_files.py +98 -0
  24. scip_cli-3.0.0/scip_cli/indexing/shards.py +144 -0
  25. scip_cli-3.0.0/scip_cli/indexing/source_discovery.py +244 -0
  26. scip_cli-3.0.0/scip_cli/indexing/ts_projects.py +110 -0
  27. scip_cli-3.0.0/scip_cli/indexing/typescript.py +158 -0
  28. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/merge.py +137 -20
  29. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/metadata.py +19 -4
  30. scip_cli-3.0.0/scip_cli/smoke_config.py +57 -0
  31. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/sql.py +26 -0
  32. scip_cli-3.0.0/scripts/bench_fingerprint_smoke.py +129 -0
  33. scip_cli-3.0.0/scripts/bench_incremental.py +310 -0
  34. scip_cli-3.0.0/scripts/bench_incremental.sh +27 -0
  35. scip_cli-3.0.0/scripts/bench_incremental_gate.py +603 -0
  36. scip_cli-3.0.0/scripts/bench_incremental_gate.sh +25 -0
  37. scip_cli-3.0.0/scripts/generate_incremental_bench_fixture.py +95 -0
  38. scip_cli-3.0.0/scripts/smoke.local.example.json +6 -0
  39. scip_cli-3.0.0/tests/fixtures/incremental-bench/package.json +1 -0
  40. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/alpha/src/index.ts +1 -0
  41. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/alpha/src/util1.ts +4 -0
  42. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/alpha/src/util2.ts +4 -0
  43. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/alpha/src/util3.ts +4 -0
  44. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/alpha/tsconfig.json +9 -0
  45. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/beta/src/index.ts +1 -0
  46. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/beta/src/util1.ts +4 -0
  47. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/beta/src/util2.ts +4 -0
  48. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/beta/src/util3.ts +4 -0
  49. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/beta/tsconfig.json +9 -0
  50. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/index.ts +1 -0
  51. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/meta.ts +1 -0
  52. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_00.ts +4 -0
  53. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_01.ts +4 -0
  54. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_02.ts +4 -0
  55. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_03.ts +4 -0
  56. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_04.ts +4 -0
  57. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_05.ts +4 -0
  58. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_06.ts +4 -0
  59. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_07.ts +4 -0
  60. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_08.ts +4 -0
  61. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_09.ts +4 -0
  62. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_10.ts +4 -0
  63. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_11.ts +4 -0
  64. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_12.ts +4 -0
  65. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_13.ts +4 -0
  66. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_14.ts +4 -0
  67. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_15.ts +4 -0
  68. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_16.ts +4 -0
  69. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_17.ts +4 -0
  70. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_18.ts +4 -0
  71. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_19.ts +4 -0
  72. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_20.ts +4 -0
  73. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_21.ts +4 -0
  74. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_22.ts +4 -0
  75. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_23.ts +4 -0
  76. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_24.ts +4 -0
  77. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_25.ts +4 -0
  78. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_26.ts +4 -0
  79. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_27.ts +4 -0
  80. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_28.ts +4 -0
  81. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_29.ts +4 -0
  82. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_30.ts +4 -0
  83. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_31.ts +4 -0
  84. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_32.ts +4 -0
  85. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_33.ts +4 -0
  86. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_34.ts +4 -0
  87. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_35.ts +4 -0
  88. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_36.ts +4 -0
  89. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_37.ts +4 -0
  90. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_38.ts +4 -0
  91. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_39.ts +4 -0
  92. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_40.ts +4 -0
  93. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_41.ts +4 -0
  94. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_42.ts +4 -0
  95. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_43.ts +4 -0
  96. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_44.ts +4 -0
  97. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_45.ts +4 -0
  98. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_46.ts +4 -0
  99. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_47.ts +4 -0
  100. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_48.ts +4 -0
  101. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_49.ts +4 -0
  102. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_50.ts +4 -0
  103. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_51.ts +4 -0
  104. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_52.ts +4 -0
  105. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_53.ts +4 -0
  106. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_54.ts +4 -0
  107. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_55.ts +4 -0
  108. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_56.ts +4 -0
  109. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_57.ts +4 -0
  110. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_58.ts +4 -0
  111. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_59.ts +4 -0
  112. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/bulk/tsconfig.json +9 -0
  113. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/gamma/src/index.ts +1 -0
  114. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/gamma/src/util1.ts +4 -0
  115. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/gamma/src/util2.ts +4 -0
  116. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/gamma/src/util3.ts +4 -0
  117. scip_cli-3.0.0/tests/fixtures/incremental-bench/packages/gamma/tsconfig.json +9 -0
  118. scip_cli-3.0.0/tests/incremental_equivalence.py +55 -0
  119. scip_cli-3.0.0/tests/test_document_upsert.py +99 -0
  120. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_e2e.py +1 -1
  121. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_exclude_globs.py +7 -0
  122. scip_cli-3.0.0/tests/test_git_delta.py +465 -0
  123. scip_cli-3.0.0/tests/test_incremental_equivalence.py +83 -0
  124. scip_cli-3.0.0/tests/test_incremental_shards.py +241 -0
  125. scip_cli-3.0.0/tests/test_index_performance.py +27 -0
  126. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_indexer_fallback.py +24 -3
  127. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_metadata.py +15 -0
  128. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_python_index_integration.py +1 -1
  129. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_reindex.py +23 -3
  130. scip_cli-3.0.0/tests/test_shard_files.py +146 -0
  131. scip_cli-3.0.0/tests/test_source_discovery.py +101 -0
  132. scip_cli-3.0.0/tests/test_sql.py +30 -0
  133. scip_cli-2.11.0/docs/incremental-reindex-roadmap.md +0 -42
  134. scip_cli-2.11.0/scip_cli/SKILL.md +0 -172
  135. scip_cli-2.11.0/scip_cli/indexing/shards.py +0 -195
  136. scip_cli-2.11.0/scip_cli/indexing/typescript.py +0 -356
  137. scip_cli-2.11.0/tests/test_incremental_shards.py +0 -227
  138. {scip_cli-2.11.0 → scip_cli-3.0.0}/.agents/commands/migration-problems.md +0 -0
  139. {scip_cli-2.11.0 → scip_cli-3.0.0}/.agents/rules/agent.mdc +0 -0
  140. {scip_cli-2.11.0 → scip_cli-3.0.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  141. {scip_cli-2.11.0 → scip_cli-3.0.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  142. {scip_cli-2.11.0 → scip_cli-3.0.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
  143. {scip_cli-2.11.0 → scip_cli-3.0.0}/.github/pull_request_template.md +0 -0
  144. {scip_cli-2.11.0 → scip_cli-3.0.0}/.pre-commit-config.yaml +0 -0
  145. {scip_cli-2.11.0 → scip_cli-3.0.0}/AGENTS.md +0 -0
  146. {scip_cli-2.11.0 → scip_cli-3.0.0}/CODE_OF_CONDUCT.md +0 -0
  147. {scip_cli-2.11.0 → scip_cli-3.0.0}/CONTRIBUTING.md +0 -0
  148. {scip_cli-2.11.0 → scip_cli-3.0.0}/LICENSE +0 -0
  149. {scip_cli-2.11.0 → scip_cli-3.0.0}/SECURITY.md +0 -0
  150. {scip_cli-2.11.0 → scip_cli-3.0.0}/docs/port.md +0 -0
  151. {scip_cli-2.11.0 → scip_cli-3.0.0}/docs/ports/conclusions.md +0 -0
  152. {scip_cli-2.11.0 → scip_cli-3.0.0}/docs/ports/experiment-summary.md +0 -0
  153. {scip_cli-2.11.0 → scip_cli-3.0.0}/docs/ports/go-experiment.md +0 -0
  154. {scip_cli-2.11.0 → scip_cli-3.0.0}/docs/ports/go.md +0 -0
  155. {scip_cli-2.11.0 → scip_cli-3.0.0}/docs/ports/plan.md +0 -0
  156. {scip_cli-2.11.0 → scip_cli-3.0.0}/docs/ports/rust-experiment.md +0 -0
  157. {scip_cli-2.11.0 → scip_cli-3.0.0}/docs/ports/rust.md +0 -0
  158. {scip_cli-2.11.0 → scip_cli-3.0.0}/docs/ports/summary.md +0 -0
  159. {scip_cli-2.11.0 → scip_cli-3.0.0}/docs/ports/zig-experiment.md +0 -0
  160. {scip_cli-2.11.0 → scip_cli-3.0.0}/docs/ports/zig.md +0 -0
  161. {scip_cli-2.11.0 → scip_cli-3.0.0}/pyproject.toml +0 -0
  162. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/analyze/__init__.py +0 -0
  163. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/analyze/common.py +0 -0
  164. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/analyze/file.py +0 -0
  165. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/analyze/graph.py +0 -0
  166. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/analyze/live.py +0 -0
  167. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/analyze/project.py +0 -0
  168. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/analyze/sections.py +0 -0
  169. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/analyze/symbol.py +0 -0
  170. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/analyze/targets.py +0 -0
  171. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/cache.py +0 -0
  172. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/cli_args.py +0 -0
  173. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/commands/__init__.py +0 -0
  174. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/commands/analyze.py +0 -0
  175. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/commands/code.py +0 -0
  176. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/commands/deps.py +0 -0
  177. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/commands/members.py +0 -0
  178. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/commands/rdeps.py +0 -0
  179. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/commands/refs.py +0 -0
  180. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/commands/search.py +0 -0
  181. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/commands/skill.py +0 -0
  182. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/commands/symbols.py +0 -0
  183. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/config.py +0 -0
  184. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/debug.py +0 -0
  185. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/discover.py +0 -0
  186. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/indexing/__init__.py +0 -0
  187. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/indexing/languages.py +0 -0
  188. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/output.py +0 -0
  189. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/paths.py +0 -0
  190. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/project.py +0 -0
  191. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/queries.py +0 -0
  192. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/scip_tool.py +0 -0
  193. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/scope.py +0 -0
  194. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/session.py +0 -0
  195. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/source.py +0 -0
  196. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/symbols.py +0 -0
  197. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/targets.py +0 -0
  198. {scip_cli-2.11.0 → scip_cli-3.0.0}/scip_cli/tsconfig.py +0 -0
  199. {scip_cli-2.11.0 → scip_cli-3.0.0}/scripts/bench.sh +0 -0
  200. {scip_cli-2.11.0 → scip_cli-3.0.0}/scripts/bench_postprocess.py +0 -0
  201. {scip_cli-2.11.0 → scip_cli-3.0.0}/scripts/build.sh +0 -0
  202. {scip_cli-2.11.0 → scip_cli-3.0.0}/scripts/publish.sh +0 -0
  203. {scip_cli-2.11.0 → scip_cli-3.0.0}/scripts/test.sh +0 -0
  204. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/__init__.py +0 -0
  205. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/analyze_db.py +0 -0
  206. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/bench_db.py +0 -0
  207. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/conftest.py +0 -0
  208. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/e2e_harness.py +0 -0
  209. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixture_catalog.py +0 -0
  210. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/package.json +0 -0
  211. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/__tests__/fixtureOnly.spec.ts +0 -0
  212. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/app/handler.ts +0 -0
  213. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/config.ts +0 -0
  214. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/consumer.ts +0 -0
  215. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/dead.ts +0 -0
  216. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/domain/i18n/en.ts +0 -0
  217. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/domain/i18n/index.ts +0 -0
  218. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/domain/i18n/useLocale.ts +0 -0
  219. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/domain/labels/index.ts +0 -0
  220. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/events/streamTypes.ts +0 -0
  221. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/gateway/index.ts +0 -0
  222. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/helper.ts +0 -0
  223. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/hooks/useHookA.ts +0 -0
  224. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/hooks/useHookB.ts +0 -0
  225. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/hooks/useItems.ts +0 -0
  226. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/index.ts +0 -0
  227. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/integrations/inferenceClient.ts +0 -0
  228. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/lib/handler.ts +0 -0
  229. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/loaders/useInference.ts +0 -0
  230. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/models/MutationAggregate.ts +0 -0
  231. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/pages/panelPage.ts +0 -0
  232. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/rules/applyRule.ts +0 -0
  233. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/types/a.ts +0 -0
  234. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/types/b.ts +0 -0
  235. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/ui/Button.ts +0 -0
  236. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/ui/LazyPanel.ts +0 -0
  237. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/ui/buttonConsumer.ts +0 -0
  238. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/ui/menuModule.ts +0 -0
  239. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/user.ts +0 -0
  240. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/widget.ts +0 -0
  241. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/src/widgets/OrphanWidget.ts +0 -0
  242. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/fixtures/typescript-project/tsconfig.json +0 -0
  243. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/perf_util.py +0 -0
  244. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_analyze.py +0 -0
  245. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_analyze_graph.py +0 -0
  246. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_analyze_live.py +0 -0
  247. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_analyze_perf.py +0 -0
  248. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_bench_queries.py +0 -0
  249. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_cache.py +0 -0
  250. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_composability.py +0 -0
  251. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_config.py +0 -0
  252. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_discover.py +0 -0
  253. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_e2e_analyze_patterns.py +0 -0
  254. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_e2e_perf.py +0 -0
  255. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_index_batching.py +0 -0
  256. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_index_prune.py +0 -0
  257. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_indexer_env.py +0 -0
  258. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_merge.py +0 -0
  259. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_multi_symbol.py +0 -0
  260. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_pure_functions.py +0 -0
  261. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_qualified_symbols.py +0 -0
  262. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_scip_tool.py +0 -0
  263. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_scope.py +0 -0
  264. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_symbols_freq.py +0 -0
  265. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_targets.py +0 -0
  266. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_tsconfig.py +0 -0
  267. {scip_cli-2.11.0 → scip_cli-3.0.0}/tests/test_typescript_projects.py +0 -0
@@ -29,7 +29,13 @@ 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
+ # GitHub npx spec runs prepare (needs pnpm for snapshot fixtures); CI installs a built global binary instead.
33
+ git clone --depth 1 --branch feat/partial-files https://github.com/flesler/scip-typescript.git /tmp/scip-typescript
34
+ cd /tmp/scip-typescript
35
+ npm install --ignore-scripts
36
+ npm run build
37
+ npm install -g .
38
+ cd -
33
39
  mkdir -p ~/.local/bin
34
40
  curl -sL https://github.com/scip-code/scip/releases/download/v0.9.0/scip-linux-amd64.tar.gz | tar xz -C ~/.local/bin
35
41
  echo "$VIRTUAL_ENV/bin" >> $GITHUB_PATH
@@ -49,5 +49,10 @@ dogfood.md
49
49
 
50
50
  # Local-only dev scripts (repo-specific smoke harnesses)
51
51
  scripts/deep-smoke.sh
52
+ scripts/smoke.local.json
52
53
  tmp/
53
54
  *.db
55
+ node_modules/
56
+
57
+ # Generated when indexing the incremental-bench fixture (sources are .ts)
58
+ tests/fixtures/incremental-bench/**/*.js
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: scip-cli
3
- Version: 2.11.0
3
+ Version: 3.0.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
 
@@ -0,0 +1,188 @@
1
+ # Incremental reindex benchmarks
2
+
3
+ Results from benchmarking `scip-cli reindex --incremental` on ephemeral fixtures.
4
+ **Do not name customer repos, paths, or symbols in this file.** Large-monorepo numbers use a local tmpfs checkout (16 shard tsconfigs, ~14k source files, ~90 MB index).
5
+
6
+ Related: [incremental-reindex-roadmap.md](incremental-reindex-roadmap.md) (phases and design).
7
+
8
+ **Fork:** `github:flesler/scip-typescript#feat/partial-files` (`SCIP_TYPESCRIPT_NPX_PACKAGE`).
9
+ **Upstream:** https://github.com/sourcegraph/scip-typescript — PR to upstream **pending** (not opened).
10
+ Local dev: `npm link` from a clone of that branch (>= `ce6e9c9`).
11
+
12
+ ---
13
+
14
+ ## Progress log (newest first)
15
+
16
+ | Date | Change | Result |
17
+ |------|--------|--------|
18
+ | 2026-09-25 | **Git-only incremental** (drop hashes/stat/mtime; `--incremental` requires git) | Shard skip = git delta + `tsconfig_digest`; warm git-delta scan **~0.04s** on 4-shard fixture |
19
+ | 2026-09-25 | **Fork squashed for upstream PR** (`ce6e9c9`, `--files` only on `sourcegraph/main`) | One commit; TSC `--incremental` dropped from fork branch |
20
+ | 2026-09-25 | **Large monorepo cold discovery** (16 shards, ~21k source paths, no node_modules) | **Git ls-files ~12.6s** vs **skip-dir glob ~26.6s**; warm incremental **~0.2s** 16/0 |
21
+ | 2026-09-25 | **Git-aware + skip-dir discovery** (`FINGERPRINT_DISCOVERY=auto`) | Old `**/*` glob walked `node_modules` (~4s); skip-dir glob skips `SKIP_DIR_NAMES` |
22
+ | 2026-09-25 | **Fingerprint path cache** (`file_stats` + `tsconfig_digest`, stat fast-path) | Warm **4.1s → 0.2s**; modify_large **~7s → ~3s**; glob was 4s, hash reads 0.14s |
23
+ | 2026-09-25 | **`PARTIAL_REINDEX_MAX_RATIO=1.0`** (disable full-shard fallback) | modify_large partial ~3s; forced full (`ratio=0.002`) ~100s |
24
+ | 2026-09-25 | **mtime rejected** (re-benchmarked) | Fingerprint-only ~2% faster than hash; warm **136s** when mtimes retouched |
25
+ | 2026-09-25 | **Fork `a985dfc`:** map Commander `options.files` → `indexFiles` (CLI `--files` was ignored) | `scip_typescript` **8.5s → 1.7s**; modify_large **~15s → ~7s** |
26
+ | 2026-09-25 | **Fork `22afafb`:** `--files` paths as `createProgram` rootNames (not full shard list) | Program sources **1760 → 662**; `createProgram` ~2s → ~1s (minor alone; matters with fix above) |
27
+ | 2026-09-25 | **scip-cli:** direct-only incremental path; in-place `index.db` upsert | Warm **~4.1s** before fingerprint cache |
28
+ | 2026-09-25 | Postprocess skip on partial part DBs (`skip_postprocess` when `index_files` set) | modify_large **~105s → ~10s** (pre-`--files` fix) |
29
+ | Earlier | Phase 1 shard reuse | Warm **~9s** vs full **~117s** |
30
+
31
+ ### Fork commit (feat/partial-files)
32
+
33
+ Single squashed commit for upstream PR (`ce6e9c9` on fork; rebased onto `sourcegraph/main`):
34
+
35
+ | Piece | What |
36
+ |-------|------|
37
+ | `--files` CLI | Repeatable repo-relative paths; Commander `.files` → `.indexFiles` |
38
+ | `resolveIndexRootNames()` | Only `--files` entries passed as `createProgram` rootNames |
39
+ | Partial index loop | FileIndexer runs on subset; stderr logs loaded vs total project sources |
40
+
41
+ Stderr when partial index works:
42
+
43
+ ```text
44
+ partial index: 4 document(s), 662/1760 project sources in program
45
+ + apps/api/tsconfig.shard-03.json (139ms)
46
+ ```
47
+
48
+ ---
49
+
50
+ ## Current architecture (settled)
51
+
52
+ - **Git incremental:** `reindex --incremental` in a git repo stores `manifest.git_commit` + per-shard `tsconfig_digest`. Shard skip when git delta empty for shard. Partial: git delta → importer closure → `--files` → upsert into live `index.db`.
53
+ - **Full reindex:** plain `reindex`, `--unversioned`, or non-git (no incremental).
54
+ - **Env:** `SCIP_CLI_FILE_INCREMENTAL=1`. Profiling: `SCIP_CLI_INDEX_TIMING=1`.
55
+
56
+ ---
57
+
58
+ ## Current performance (large monorepo smoke, git-only + fork `ce6e9c9`)
59
+
60
+ Numbers from a private local checkout — not reproducible from the public repo alone. Copy `scripts/smoke.local.example.json` to a gitignored `smoke.local.json` beside it and set `root` to your monorepo.
61
+
62
+ | Scenario | Wall | Dominant phases |
63
+ |----------|------|-----------------|
64
+ | **Warm 16/0** | **~0.2s** | `git_delta_scan` — git diff + per-shard tsconfig digest compare |
65
+ | **modify_large 15/1** (partial 4/1760) | **~3s** | `scip_typescript` ~1.7s + upsert ~0.1s |
66
+ | **seed_cold** | ~125s | 16 shards full index |
67
+
68
+ Example `INDEX_TIMING:summary` (modify_large):
69
+
70
+ ```text
71
+ INDEX_TIMING:summary git_delta_scan=12ms parallel_index=2792ms \
72
+ scip_typescript=1778ms scip_convert=61ms apply_updates=101ms \
73
+ shards_reused=15 shards_dirty=1 postprocess_skipped=1 \
74
+ notes=apps/api/tsconfig.shard-03.json:partial 4/1760 dirty=1
75
+ ```
76
+
77
+ ### Where time goes (modify_large)
78
+
79
+ | Phase | ~ms | Notes |
80
+ |-------|-----|-------|
81
+ | `git_delta_scan` | **~10–50** | Git subprocess + tsconfig filter per shard (no file content reads) |
82
+ | `scip_typescript` | 1700 | Was **8500** before `--files` CLI fix |
83
+ | `scip_convert` | 60 | Small partial `.scip` |
84
+ | `apply_updates` | 100 | Targeted upsert into large `index.db` |
85
+
86
+ ## How we benchmark
87
+
88
+ ### Gate runner
89
+
90
+ ```bash
91
+ cp scripts/smoke.local.example.json scripts/smoke.local.json
92
+ # edit root + touch_large for your local monorepo checkout
93
+
94
+ scripts/bench_incremental_gate.sh --branch smoke # warm + modify_large
95
+ scripts/bench_incremental_gate.sh --branch fixture # mini fixture (no local config)
96
+ ```
97
+
98
+ **Monorepo smoke:** `scripts/smoke.local.json` (gitignored) points at a local checkout with persisted scope (`metadata.json` lists shard tsconfigs).
99
+
100
+ **Scenarios:** `seed_cold`, `seed_warm`, `warm` (16/0), `modify_large` (touch configured `touch_large` path).
101
+
102
+ **Rules:**
103
+
104
+ - **One benchmark at a time** — no parallel gate + manual runs on the smoke checkout.
105
+ - Background runs OK; **wait for exit** before starting another or reporting numbers.
106
+ - `SCIP_CLI_INDEX_TIMING=1` for per-phase breakdown.
107
+
108
+ Gate artifacts and baselines are written under the repo's gitignored benchmark directory (see `scripts/bench_incremental_gate.py`).
109
+
110
+ ### Other
111
+
112
+ | Tool | Purpose |
113
+ |------|---------|
114
+ | `scripts/bench_incremental.sh` | Smaller fixture loops |
115
+ | `scripts/bench_fingerprint_smoke.py` | monorepo warm incremental + git-delta scan timing |
116
+ | `SCIP_CLI_INDEX_TIMING=1` | `INDEX_TIMING:<phase>=Nms` on stderr |
117
+
118
+ ### Tests
119
+
120
+ `tests/test_incremental_equivalence.py` — incremental fixture flows (real `scip-typescript` via npx fork).
121
+
122
+ ---
123
+
124
+ ## Historical results (superseded)
125
+
126
+ <details>
127
+ <summary>Gate branches before direct-only + fork fixes (2026-09-25 morning)</summary>
128
+
129
+ ### fingerprint
130
+
131
+ | Scenario | hash | mtime |
132
+ |----------|------|-------|
133
+ | warm | 9.2s / 16/0 | 25.9s / 15/1 |
134
+
135
+ ### phase3
136
+
137
+ | modify_large | FILE_INCREMENTAL=0 | =1 |
138
+ |--------------|-------------------|-----|
139
+ | | 104s | 26s* |
140
+
141
+ \*Postprocess-skip + broken `--files` CLI masked true partial SCIP time.
142
+
143
+ ### direct vs legacy (shard DB + merge)
144
+
145
+ | Scenario | legacy | direct |
146
+ |----------|--------|--------|
147
+ | warm | 4.88s | 4.39s |
148
+ | modify_large | 15.15s | 15.88s |
149
+
150
+ Direct won warm + disk; modify_large looked slower due to SCIP variance — actually `--files` was not applied.
151
+
152
+ </details>
153
+
154
+ ---
155
+
156
+ ## Improvements (chronological)
157
+
158
+ 1. **Phase 1 — shard reuse** — warm ~9s vs full ~117s.
159
+ 2. **Phase 2 — TSC incremental** — no win; off by default.
160
+ 3. **Phase 3 — `--files` + upsert** — designed for partial shard reindex (CLI wiring broken until fork `a985dfc`).
161
+ 4. **Postprocess skip** — skip symbol trim on partial part DBs (`skip_postprocess` in convert).
162
+ 5. **Direct-only incremental** — manifest + in-place upsert; no shard `.db` files (~40 MB cache saved).
163
+ 6. **Fork rootNames** — smaller TypeScript program when `--files` set (example shard: 1760 → 662 sources).
164
+ 7. **Fork `--files` CLI fix** — **largest win:** indexer ran on all shard files despite `--files` flag.
165
+ 8. **Fingerprint path cache** — warm ~4s → ~0.2s (superseded by git-only incremental).
166
+ 9. **Git-only incremental** — manifest stores `git_commit` + `tsconfig_digest` only; no per-file hashes.
167
+
168
+ ---
169
+
170
+ ## Known limitations / next work
171
+
172
+ 1. **TS program closure** — 4 `--files` paths may still pull hundreds of sources into the TypeScript program (fork).
173
+ 2. **Importer closure** — scip-cli expands 1 dirty file to N paths via SQLite (`expand_reindex_paths`); distinct from TS program closure.
174
+ 3. **Further fork ideas** — shrink checker work on non-indexed files (hard).
175
+
176
+ ---
177
+
178
+ ## Reproduce (fixture only — no customer paths)
179
+
180
+ ```bash
181
+ pip install -e ".[dev]"
182
+ npm link # from scip-typescript clone on feat/partial-files (commit >= ce6e9c9)
183
+
184
+ pytest tests/test_incremental_equivalence.py
185
+ scripts/bench_incremental_gate.sh --branch fixture
186
+ ```
187
+
188
+ For a large monorepo, copy `scripts/smoke.local.example.json` to `scripts/smoke.local.json` and run the smoke gate locally.
@@ -0,0 +1,76 @@
1
+ # Incremental reindex (settled)
2
+
3
+ ## Model
4
+
5
+ Two modes only:
6
+
7
+ | Mode | Trigger | Behaviour |
8
+ |------|---------|-----------|
9
+ | **Git incremental** | `reindex --incremental` in a git repo (not `--unversioned`) | Manifest stores `git_commit` + per-shard `tsconfig_digest`. Shard skip when git delta empty for shard. Partial reindex via `--files` on dirty paths ∪ importers. Upsert into live `index.db`. |
10
+ | **Full reindex** | Plain `reindex`, `--unversioned`, or non-git | No incremental. Clears shard manifest (unless `--incremental` on same run). Full indexer per shard. |
11
+
12
+ **Removed:** content hashes, stat fast-path, `SCIP_CLI_FINGERPRINT=*`, `SCIP_CLI_FINGERPRINT_DISCOVERY=*`, `SCIP_CLI_FINGERPRINT_CACHE`, manifest `file_hashes` / `fingerprint`.
13
+
14
+ ## Git delta (change detection)
15
+
16
+ Since `manifest.git_commit`:
17
+
18
+ 1. `git diff <commit>..HEAD` (committed)
19
+ 2. `git diff` (unstaged)
20
+ 3. `git diff --cached` (staged)
21
+ 4. `git ls-files --others --exclude-standard` (untracked)
22
+
23
+ `git mv` is treated as **delete old path + add new path** (implementation disables git rename folding so the old path lands in the removal set).
24
+
25
+ Deletions flow to `remove_documents_by_paths`. Modifications/additions filtered through tsconfig include/exclude, then importer closure for partial scope.
26
+
27
+ ## Manifest v4
28
+
29
+ ```json
30
+ {
31
+ "version": 4,
32
+ "git_commit": "<HEAD at last successful index>",
33
+ "shards": {
34
+ "packages/a/tsconfig.json": {
35
+ "tsconfig_digest": "<hex sha256 — see below>"
36
+ }
37
+ }
38
+ }
39
+ ```
40
+
41
+ ### `tsconfig_digest`
42
+
43
+ Per-shard **SHA-256 hex** of the tsconfig *chain* (not source files). Built in `tsconfig_chain_digest()`:
44
+
45
+ 1. Shard key (`packages/a/tsconfig.json` posix path) + `\0`
46
+ 2. For each file in `extends` chain (root tsconfig first, then parents), in order:
47
+ - absolute path string + `\0`
48
+ - raw file bytes + `\0`
49
+
50
+ Any change to the shard tsconfig or an extended parent (include/exclude/files, compiler options, path) changes the digest → **full shard reindex** even when git reports no file changes.
51
+
52
+ Shard skip: `tsconfig_digest` unchanged **and** no paths in git delta intersect this shard (via tsconfig include/exclude rules).
53
+
54
+ ## Env
55
+
56
+ | Variable | Default | Purpose |
57
+ |----------|---------|---------|
58
+ | `SCIP_CLI_FILE_INCREMENTAL` | `1` | Partial `--files` reindex when git delta is small |
59
+
60
+ ## Benchmarks
61
+
62
+ See [benchmarks.md](benchmarks.md).
63
+
64
+ ```bash
65
+ scripts/bench_incremental_gate.sh --branch fixture
66
+ scripts/bench_fingerprint_smoke.py # requires local smoke.local.json
67
+ SCIP_CLI_INDEX_TIMING=1 scip-cli reindex --incremental
68
+ ```
69
+
70
+ ## Upstream (scip-typescript)
71
+
72
+ | | |
73
+ |---|---|
74
+ | **Upstream** | https://github.com/sourcegraph/scip-typescript |
75
+ | **Fork** | https://github.com/flesler/scip-typescript (`feat/partial-files`, `--files` only) |
76
+ | **Pin** | `ce6e9c9` on `feat/partial-files` |
@@ -0,0 +1,135 @@
1
+ ---
2
+ name: scip-cli
3
+ description: Read when needing symbol lookup or SQL health dashboards in code.
4
+ ---
5
+
6
+ TypeScript/JavaScript, Python, Go, Rust — not GraphQL, CSS, or other files. Run from project root.
7
+
8
+ **Contributors:** `pip install -e ".[dev]"` so bare `scip-cli` on PATH is this checkout.
9
+
10
+ ## Quick guide
11
+
12
+ |Question|Command|Output|
13
+ |---|---|---|
14
+ |Definition / body|`code X`|Snippet (default 80 lines/def; `members Class` for big types)|
15
+ |Usages|`refs X`|`file:line` refs|
16
+ |Symbols in file|`symbols file`|`start-end kind name` (bare filename ok)|
17
+ |Find by name|`search pattern`|Matching symbols|
18
+ |Who imports this file?|`rdeps file`|Importer paths|
19
+ |What does this use?|`deps target`|Outbound deps (symbol or file)|
20
+ |Class members|`members Class`|Methods/fields + line ranges|
21
+ |Health / risk|`analyze`|SQL dashboard — project, dir, file, or symbol|
22
+
23
+ Default `--limit` is **10** on query commands unless noted. Stdout = records; stderr = warnings/progress. Pipe with `--paths-only` / `--names-only`.
24
+
25
+ ## Gotchas
26
+
27
+ - **Bare names** — functions, types, classes. Members need qualifiers: `code Widget.run`, `members pkg.MyClass`. Consts/vars are not indexed — use `rg`. Class methods: `members Class`, not bare `code method`.
28
+ - **Ambiguity** — `code`/`refs` return up to `--limit` matches; `members`/`analyze` pick first with stderr warning. Narrow with dotted names or query `--path`.
29
+ - **Stale index** — run `reindex` after substantive edits (no auto-invalidation).
30
+ - **Query `--path` ≠ reindex scope** — query `--path` filters results only. `reindex --path` / `--tsconfig` persist TS scope and replace cache; full `reindex` restores.
31
+ - **Monorepos** — walks `tsconfig*.json` (skips `node_modules`, `.git`). Dedupes nested projects. Extra roots: `.scip-cli.json` (README). Query scope: `--path packages/api`.
32
+ - **allowJs** — when tsconfig `allowJs: true`, matching `.js`/`.jsx` under `include`/`files` are indexed. No root `tsconfig.json`: `--infer-tsconfig`.
33
+ - **First run** may auto-index (parallel by default, `SCIP_CLI_INDEX_WORKERS`). >10 tsconfigs log progress. Prerequisites: Node (TS/Python), Go, or Rust toolchain; `scip` converter auto-downloads. `brew install scip` is the wrong package.
34
+
35
+ ## Pipelines
36
+
37
+ |Goal|Pipeline|
38
+ |---|---|
39
+ |Blast radius|`scip-cli rdeps file.ts \|xargs -I{} scip-cli symbols {}`|
40
+ |Health briefing|`scip-cli analyze --limit 40 --per-check-limit 5`|
41
+ |Importer files|`scip-cli refs Foo --paths-only`|
42
+ |Symbols in importers|`scip-cli refs Foo --paths-only \|xargs -I{} scip-cli symbols {}`|
43
+ |Classes → members|`scip-cli search Handler --kind class --names-only \|xargs -I{} scip-cli members {}`|
44
+ |Members → defs|`scip-cli members Widget --names-only \|xargs -I{} scip-cli code Widget.{}`|
45
+ |Topic files|`scip-cli search Dynamo --paths-only`|
46
+ |Outbound files|`scip-cli deps file.ts --paths-only`|
47
+
48
+ `xargs` reopens the index each call — cap fan-out with `--limit` on the first command.
49
+
50
+ ## Commands
51
+
52
+ ### code
53
+
54
+ ```bash
55
+ code [--kind KIND] [--limit N] [--max-lines N] [--offset N] [--full] [--path PATH] [--snippet] [--line-numbers] <symbol> [...]
56
+ ```
57
+
58
+ `--kind`: `function`, `method`, `class`, `property`. Multiple symbols: each block prefixed on stdout. `--max-lines` per body (default 80; also 32k char cap unless `--full` or `--max-lines 0`). `--offset` is body-relative. `SCIP_CLI_MAX_DEF_LINES` overrides cap.
59
+
60
+ ### refs
61
+
62
+ ```bash
63
+ refs [--limit N] [--path PATH] [--paths-only] <symbol> [...]
64
+ ```
65
+
66
+ `file:line` per ref (reads source for lines). Multi-symbol groups prefixed on stdout.
67
+
68
+ ### search
69
+
70
+ ```bash
71
+ search [--kind KIND] [--limit N] [--path PATH] [--names-only] [--paths-only] <pattern> [...]
72
+ ```
73
+
74
+ `file:line kind name`. Patterns OR'd. Filters noisy symbols.
75
+
76
+ ### symbols
77
+
78
+ ```bash
79
+ symbols [--limit N] [--path PATH] <file>
80
+ ```
81
+
82
+ ### rdeps
83
+
84
+ ```bash
85
+ rdeps [--limit N] [--path PATH] <file>
86
+ ```
87
+
88
+ Bare importer paths on stdout.
89
+
90
+ ### deps
91
+
92
+ ```bash
93
+ deps [--limit N] [--path PATH] [--paths-only] <symbol|file>
94
+ ```
95
+
96
+ Symbol: deps inside definition range. File: external symbols referenced. Format `file:line symbol`; `--paths-only` dedupes files.
97
+
98
+ ### members
99
+
100
+ ```bash
101
+ members [--limit N] [--path PATH] [--names-only] <symbol>
102
+ ```
103
+
104
+ `start:end kind name`. Prefix match under parent; missing ranges filled from source when needed.
105
+
106
+ ### analyze
107
+
108
+ ```bash
109
+ analyze [--limit N] [--per-check-limit N] [--path PATH] [--include-tests] [--priority LEVEL] [--check NAME] [target]
110
+ ```
111
+
112
+ |Target|Scope|
113
+ |---|---|
114
+ |_(omit)_|Project dashboards|
115
+ |directory|Dir dashboards + per-file sections (indexed files under dir)|
116
+ |file|File dashboards + top symbols by external consumers|
117
+ |symbol|Pressure, consumers, deps, affected|
118
+
119
+ Priority **high → medium → low**. `--limit` = total finding rows (default 20); headers/truncation don't count. `--per-check-limit` caps each section. Agents: `--limit 40 --per-check-limit 5`. `--priority high` or `high,medium` (`1`/`2`/`3`) skips lower tiers. `--check NAME` (repeatable/comma) ANDs with priority.
120
+
121
+ **Easy wins:** cycles, dead exports, dead files (production). Stale types = types with no external refs. Dead = no cross-file refs in index, not `vulture`. Empty `rdeps` on a hit is often a SCIP miss — verify with `rg -F STEM` (basename in `(...)`, same-file hits ignored).
122
+
123
+ ### reindex
124
+
125
+ ```bash
126
+ reindex [--path DIR ...] [--tsconfig GLOB ...] [--exclude [GLOB ...]] [--fresh] [--incremental] [--unversioned] [--with-external]
127
+ ```
128
+
129
+ `--path` and `--tsconfig` are TS-only and mutually exclusive. `--tsconfig` globs expanded in-tool; one heap per file by default (`SCIP_CLI_TS_INDEX_BATCH_SIZE` overrides). Scope/exclude persist in `metadata.json`.
130
+
131
+ `--exclude GLOB` drops matching docs post-convert (repeatable; merges `.scip-cli.json` `excludeGlobs`). Bare `--exclude` clears list; `--exclude foo --exclude` keeps `foo`. No `/` = basename; with `/` = repo-relative.
132
+
133
+ `--fresh` clears persisted metadata (unless combined with scope flags on same command).
134
+
135
+ `--incremental` — git repo required; errors with `--unversioned` or non-git. Reuses `shards/manifest.json` (`git_commit` + per-shard `tsconfig_digest`); skips clean shards. Dirty: git delta ∪ importer closure → fork `--files` → upsert live `index.db`; deletions remove documents. `SCIP_CLI_FILE_INCREMENTAL=0|1` (default on). `--unversioned` forces glob/full discovery (persisted). Plain `reindex` clears manifest. No `--incremental` 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__ = "3.0.0"
@@ -202,6 +202,14 @@ def main() -> None:
202
202
  "Reuse cached per-project index parts when inputs are unchanged (full reindex clears the incremental cache)"
203
203
  ),
204
204
  )
205
+ reindex_parser.add_argument(
206
+ "--unversioned",
207
+ action="store_true",
208
+ help=(
209
+ "Discover sources via on-disk glob instead of git (persisted in metadata.json; "
210
+ "for tarballs or when gitignored files must be indexed). Cleared by reindex --fresh"
211
+ ),
212
+ )
205
213
  reindex_parser.add_argument(
206
214
  "--with-external",
207
215
  action="store_true",
@@ -12,9 +12,11 @@ from ..cache import (
12
12
  )
13
13
  from ..indexing import index_project, log_index_complete
14
14
  from ..indexing.shards import clear_shard_cache
15
- from ..metadata import UNSET, apply_metadata_updates
15
+ from ..indexing.source_discovery import is_versioned_repo
16
+ from ..metadata import UNSET, apply_metadata_updates, index_unversioned
16
17
  from ..paths import normalize_path_scope
17
18
  from ..project import Language, find_project_root_and_language
19
+ from ..sql import finalize_index_db
18
20
  from ..tsconfig import expand_tsconfig_patterns
19
21
 
20
22
 
@@ -29,12 +31,22 @@ def main(args):
29
31
  exclude_groups = getattr(args, "exclude", None)
30
32
  fresh = getattr(args, "fresh", False)
31
33
  incremental = getattr(args, "incremental", False)
34
+ unversioned = getattr(args, "unversioned", False)
32
35
  if incremental and fresh:
33
36
  print("Error: reindex --incremental and --fresh cannot be combined", file=sys.stderr)
34
37
  sys.exit(1)
35
38
  if incremental and lang is not None and lang != Language.TYPESCRIPT:
36
39
  print("Error: reindex --incremental is only supported for TypeScript projects", file=sys.stderr)
37
40
  sys.exit(1)
41
+ if incremental and (index_unversioned(root) or not is_versioned_repo(root)):
42
+ print(
43
+ (
44
+ "Error: reindex --incremental requires a git repository "
45
+ "(use full reindex without --incremental for --unversioned or non-git projects)"
46
+ ),
47
+ file=sys.stderr,
48
+ )
49
+ sys.exit(1)
38
50
  if path_args and tsconfig_args:
39
51
  print("Error: reindex --path and --tsconfig cannot be combined", file=sys.stderr)
40
52
  sys.exit(1)
@@ -52,14 +64,11 @@ def main(args):
52
64
  sys.exit(1)
53
65
  scope_paths = [path.as_posix() for path in tsconfig_paths]
54
66
  scope_update = scope_paths
55
- print(f"Index scope: {', '.join(scope_paths)}", file=sys.stderr)
56
- print(
57
- (
58
- "Warning: scoped reindex replaces the cache with only these tsconfig files; "
59
- "run reindex --fresh to restore the full index"
60
- ),
61
- file=sys.stderr,
62
- )
67
+ if len(scope_paths) == 1:
68
+ print(f"Index scope: {scope_paths[0]}", file=sys.stderr)
69
+ else:
70
+ patterns = ", ".join(tsconfig_args)
71
+ print(f"Index scope: {patterns} ({len(scope_paths)} tsconfigs)", file=sys.stderr)
63
72
  elif path_args:
64
73
  scope_paths: list[str] = []
65
74
  for path in path_args:
@@ -69,14 +78,10 @@ def main(args):
69
78
  sys.exit(1)
70
79
  scope_paths.append(normalized)
71
80
  scope_update = scope_paths
72
- print(f"Index scope: {', '.join(scope_paths)}", file=sys.stderr)
73
- print(
74
- (
75
- "Warning: scoped reindex replaces the cache with only these projects; "
76
- "run reindex --fresh to restore the full index"
77
- ),
78
- file=sys.stderr,
79
- )
81
+ if len(scope_paths) == 1:
82
+ print(f"Index scope: {scope_paths[0]}", file=sys.stderr)
83
+ else:
84
+ print(f"Index scope: {len(scope_paths)} paths", file=sys.stderr)
80
85
 
81
86
  exclude_update: list[str] | object = UNSET
82
87
  if exclude_groups is not None:
@@ -98,6 +103,7 @@ def main(args):
98
103
  fresh=fresh,
99
104
  scope_paths=scope_update,
100
105
  exclude_globs=exclude_update,
106
+ unversioned=unversioned if unversioned else UNSET,
101
107
  )
102
108
  cleanup_in_progress_index(cache_dir)
103
109
  if fresh or not incremental:
@@ -110,7 +116,7 @@ def main(args):
110
116
  os.environ["SCIP_CLI_KEEP_EXTERNAL"] = "1"
111
117
 
112
118
  started = time.perf_counter()
113
- _output_db, skipped, total = index_project(
119
+ _output_db, skipped, total, promote = index_project(
114
120
  root,
115
121
  lang,
116
122
  cache_dir,
@@ -124,13 +130,26 @@ def main(args):
124
130
  print(f"Error: {e}", file=sys.stderr)
125
131
  sys.exit(1)
126
132
 
127
- next_db = index_db_path(cache_dir, replace=True)
128
- if not next_db.is_file():
133
+ live_db = index_db_path(cache_dir, replace=False)
134
+ from scip_cli.indexing.performance import phase
135
+
136
+ if promote:
137
+ next_db = index_db_path(cache_dir, replace=True)
138
+ if not next_db.is_file():
139
+ cleanup_in_progress_index(cache_dir)
140
+ print("Error: No index.db found after indexing", file=sys.stderr)
141
+ sys.exit(1)
142
+ with phase("finalize"):
143
+ finalize_index_db(next_db)
144
+ with phase("promote"):
145
+ promote_next_index(cache_dir)
146
+ elif live_db.is_file():
147
+ with phase("finalize"):
148
+ finalize_index_db(live_db)
149
+ elif not live_db.is_file():
129
150
  cleanup_in_progress_index(cache_dir)
130
151
  print("Error: No index.db found after indexing", file=sys.stderr)
131
152
  sys.exit(1)
132
-
133
- promote_next_index(cache_dir)
134
153
  log_index_complete(
135
154
  index_db_path(cache_dir, replace=False),
136
155
  lang.value,
@@ -88,3 +88,15 @@ def path_matches_any_glob(relative_path: str, patterns: tuple[str, ...] | list[s
88
88
  if not patterns:
89
89
  return False
90
90
  return any(path_matches_glob(relative_path, pattern) for pattern in patterns)
91
+
92
+
93
+ def filter_excluded_paths(
94
+ paths: tuple[str, ...] | frozenset[str] | list[str],
95
+ exclude_globs: tuple[str, ...],
96
+ ) -> tuple[str, ...]:
97
+ """Drop repo-relative paths that match persisted/config exclude globs."""
98
+ if not exclude_globs:
99
+ if isinstance(paths, tuple):
100
+ return paths
101
+ return tuple(sorted(paths))
102
+ return tuple(sorted(path for path in paths if not path_matches_any_glob(path, exclude_globs)))
@@ -1,5 +1,7 @@
1
1
  """Indexing constants."""
2
2
 
3
+ import os
4
+
3
5
  INDEX_TIMEOUT = 300
4
6
  DEFAULT_MAX_HEAP_MB = 8192
5
7
  PROGRESS_LOG_MIN_PROJECTS = 10
@@ -7,6 +9,18 @@ SCIP_INSTALL_URL = "https://github.com/scip-code/scip/releases"
7
9
 
8
10
  # Language indexers (npx / go install) use latest on first use.
9
11
  # The scip expt-convert binary is pinned separately in scip_tool.py (DB schema).
12
+ #
13
+ # TODO: Remove github_npm.py and runners github: branch when switching back to upstream npm.
14
+ # scip-typescript npx fallback (when the binary is not on PATH). Fork adds --files
15
+ # for partial document indexing (see docs/benchmarks.md). Pin >= ce6e9c9.
16
+ SCIP_TYPESCRIPT_NPX_PACKAGE = "github:flesler/scip-typescript#feat/partial-files"
17
+
18
+
19
+ def file_incremental_enabled() -> bool:
20
+ """Partial reindex via fork --files (default on)."""
21
+ return os.environ.get("SCIP_CLI_FILE_INCREMENTAL", "1").lower() not in {"0", "false", "no"}
22
+
23
+
10
24
  # scip-typescript accepts many tsconfig paths per invocation (one .scip, one convert, no merge).
11
25
  # Split only when SCIP_CLI_TS_INDEX_BATCH_SIZE is set (OOM/timeout tuning).
12
26
  DEFAULT_TS_INDEX_BATCH_SIZE = None