scip-cli 3.0.0__tar.gz → 3.2.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 (287) hide show
  1. scip_cli-3.2.0/.agents/commands/dogfood.md +15 -0
  2. scip_cli-3.2.0/.agents/commands/release.md +69 -0
  3. {scip_cli-3.0.0 → scip_cli-3.2.0}/.agents/rules/agent.mdc +5 -3
  4. scip_cli-3.2.0/.agents/skills/new-command/SKILL.md +38 -0
  5. scip_cli-3.2.0/.agents/skills/sql-bench/SKILL.md +29 -0
  6. scip_cli-3.2.0/.agents/skills/test/SKILL.md +42 -0
  7. {scip_cli-3.0.0 → scip_cli-3.2.0}/.gitignore +0 -1
  8. scip_cli-3.2.0/.pre-commit-config.yaml +10 -0
  9. {scip_cli-3.0.0 → scip_cli-3.2.0}/CONTRIBUTING.md +2 -3
  10. {scip_cli-3.0.0 → scip_cli-3.2.0}/PKG-INFO +27 -43
  11. {scip_cli-3.0.0 → scip_cli-3.2.0}/README.md +26 -42
  12. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/SKILL.md +21 -4
  13. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/__init__.py +1 -1
  14. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/__main__.py +19 -3
  15. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/common.py +5 -0
  16. scip_cli-3.2.0/scip_cli/analyze/entrypoints/__init__.py +77 -0
  17. scip_cli-3.2.0/scip_cli/analyze/entrypoints/golang.py +28 -0
  18. scip_cli-3.2.0/scip_cli/analyze/entrypoints/paths.py +34 -0
  19. scip_cli-3.2.0/scip_cli/analyze/entrypoints/python.py +128 -0
  20. scip_cli-3.2.0/scip_cli/analyze/entrypoints/rust.py +49 -0
  21. scip_cli-3.2.0/scip_cli/analyze/entrypoints/typescript.py +143 -0
  22. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/file.py +52 -1
  23. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/project.py +59 -0
  24. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/sections.py +22 -1
  25. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/symbol.py +9 -1
  26. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/cache.py +1 -1
  27. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/analyze.py +12 -3
  28. scip_cli-3.2.0/scip_cli/commands/query.py +66 -0
  29. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/reindex.py +26 -16
  30. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/discover.py +15 -0
  31. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/convert.py +12 -0
  32. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/core.py +6 -3
  33. scip_cli-3.2.0/scip_cli/indexing/import_mentions.py +201 -0
  34. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/incremental.py +2 -5
  35. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/languages.py +11 -5
  36. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/runners.py +12 -1
  37. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/ts_projects.py +3 -2
  38. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/session.py +2 -2
  39. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/source.py +13 -0
  40. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/sql.py +7 -0
  41. {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/bench_fingerprint_smoke.py +1 -3
  42. {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/bench_incremental.py +26 -19
  43. {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/bench_incremental_gate.py +20 -6
  44. {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/publish.sh +15 -1
  45. {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/smoke.local.example.json +1 -1
  46. {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/test.sh +1 -2
  47. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/analyze_db.py +17 -0
  48. scip_cli-3.2.0/tests/conftest.py +35 -0
  49. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/e2e_harness.py +8 -1
  50. scip_cli-3.2.0/tests/fixture_cache.py +113 -0
  51. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixture_catalog.py +8 -0
  52. scip_cli-3.2.0/tests/fixtures/typescript-project/bin/cli-entry.ts +5 -0
  53. scip_cli-3.2.0/tests/fixtures/typescript-project/bin/npm-script-only.ts +3 -0
  54. scip_cli-3.2.0/tests/fixtures/typescript-project/package.json +11 -0
  55. scip_cli-3.2.0/tests/fixtures/typescript-project/src/heuristic/classifyLeaf.test.ts +5 -0
  56. scip_cli-3.2.0/tests/fixtures/typescript-project/src/heuristic/classifyLeaf.ts +3 -0
  57. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_analyze.py +58 -3
  58. scip_cli-3.2.0/tests/test_analyze_live.py +282 -0
  59. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_cache.py +2 -2
  60. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_discover.py +20 -0
  61. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_e2e.py +58 -1
  62. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_e2e_analyze_patterns.py +37 -0
  63. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_exclude_globs.py +1 -13
  64. scip_cli-3.2.0/tests/test_import_mentions.py +25 -0
  65. scip_cli-3.2.0/tests/test_incremental_equivalence.py +52 -0
  66. scip_cli-3.2.0/tests/test_indexer_failure_message.py +29 -0
  67. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_indexer_fallback.py +26 -1
  68. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_python_index_integration.py +9 -1
  69. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_reindex.py +121 -18
  70. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_scope.py +6 -6
  71. scip_cli-3.0.0/.pre-commit-config.yaml +0 -20
  72. scip_cli-3.0.0/docs/benchmarks.md +0 -188
  73. scip_cli-3.0.0/docs/incremental-reindex-roadmap.md +0 -76
  74. scip_cli-3.0.0/docs/port.md +0 -80
  75. scip_cli-3.0.0/docs/ports/conclusions.md +0 -424
  76. scip_cli-3.0.0/docs/ports/experiment-summary.md +0 -257
  77. scip_cli-3.0.0/docs/ports/go-experiment.md +0 -252
  78. scip_cli-3.0.0/docs/ports/go.md +0 -203
  79. scip_cli-3.0.0/docs/ports/plan.md +0 -161
  80. scip_cli-3.0.0/docs/ports/rust-experiment.md +0 -324
  81. scip_cli-3.0.0/docs/ports/rust.md +0 -264
  82. scip_cli-3.0.0/docs/ports/summary.md +0 -118
  83. scip_cli-3.0.0/docs/ports/zig-experiment.md +0 -333
  84. scip_cli-3.0.0/docs/ports/zig.md +0 -283
  85. scip_cli-3.0.0/scripts/bench_incremental.sh +0 -27
  86. scip_cli-3.0.0/scripts/bench_incremental_gate.sh +0 -25
  87. scip_cli-3.0.0/tests/conftest.py +0 -25
  88. scip_cli-3.0.0/tests/fixtures/typescript-project/package.json +0 -5
  89. scip_cli-3.0.0/tests/test_analyze_live.py +0 -71
  90. scip_cli-3.0.0/tests/test_incremental_equivalence.py +0 -83
  91. {scip_cli-3.0.0 → scip_cli-3.2.0}/.agents/commands/migration-problems.md +0 -0
  92. {scip_cli-3.0.0 → scip_cli-3.2.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  93. {scip_cli-3.0.0 → scip_cli-3.2.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  94. {scip_cli-3.0.0 → scip_cli-3.2.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
  95. {scip_cli-3.0.0 → scip_cli-3.2.0}/.github/pull_request_template.md +0 -0
  96. {scip_cli-3.0.0 → scip_cli-3.2.0}/.github/workflows/ci.yml +0 -0
  97. {scip_cli-3.0.0 → scip_cli-3.2.0}/AGENTS.md +0 -0
  98. {scip_cli-3.0.0 → scip_cli-3.2.0}/CODE_OF_CONDUCT.md +0 -0
  99. {scip_cli-3.0.0 → scip_cli-3.2.0}/LICENSE +0 -0
  100. {scip_cli-3.0.0 → scip_cli-3.2.0}/SECURITY.md +0 -0
  101. {scip_cli-3.0.0 → scip_cli-3.2.0}/pyproject.toml +0 -0
  102. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/__init__.py +0 -0
  103. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/graph.py +0 -0
  104. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/live.py +0 -0
  105. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/targets.py +0 -0
  106. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/cli_args.py +0 -0
  107. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/__init__.py +0 -0
  108. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/code.py +0 -0
  109. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/deps.py +0 -0
  110. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/members.py +0 -0
  111. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/rdeps.py +0 -0
  112. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/refs.py +0 -0
  113. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/search.py +0 -0
  114. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/skill.py +0 -0
  115. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/symbols.py +0 -0
  116. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/config.py +0 -0
  117. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/debug.py +0 -0
  118. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/exclude.py +0 -0
  119. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/__init__.py +0 -0
  120. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/constants.py +0 -0
  121. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/document_upsert.py +0 -0
  122. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/git_delta.py +0 -0
  123. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/github_npm.py +0 -0
  124. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/orchestrate.py +0 -0
  125. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/performance.py +0 -0
  126. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/postprocess.py +0 -0
  127. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/shard_files.py +0 -0
  128. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/shards.py +0 -0
  129. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/source_discovery.py +0 -0
  130. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/typescript.py +0 -0
  131. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/merge.py +0 -0
  132. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/metadata.py +0 -0
  133. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/output.py +0 -0
  134. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/paths.py +0 -0
  135. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/project.py +0 -0
  136. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/queries.py +0 -0
  137. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/scip_tool.py +0 -0
  138. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/scope.py +0 -0
  139. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/smoke_config.py +0 -0
  140. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/symbols.py +0 -0
  141. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/targets.py +0 -0
  142. {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/tsconfig.py +0 -0
  143. {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/bench.sh +0 -0
  144. {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/bench_postprocess.py +0 -0
  145. {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/build.sh +0 -0
  146. {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/generate_incremental_bench_fixture.py +0 -0
  147. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/__init__.py +0 -0
  148. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/bench_db.py +0 -0
  149. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/package.json +0 -0
  150. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/alpha/src/index.ts +0 -0
  151. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/alpha/src/util1.ts +0 -0
  152. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/alpha/src/util2.ts +0 -0
  153. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/alpha/src/util3.ts +0 -0
  154. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/alpha/tsconfig.json +0 -0
  155. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/beta/src/index.ts +0 -0
  156. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/beta/src/util1.ts +0 -0
  157. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/beta/src/util2.ts +0 -0
  158. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/beta/src/util3.ts +0 -0
  159. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/beta/tsconfig.json +0 -0
  160. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/index.ts +0 -0
  161. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/meta.ts +0 -0
  162. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_00.ts +0 -0
  163. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_01.ts +0 -0
  164. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_02.ts +0 -0
  165. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_03.ts +0 -0
  166. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_04.ts +0 -0
  167. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_05.ts +0 -0
  168. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_06.ts +0 -0
  169. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_07.ts +0 -0
  170. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_08.ts +0 -0
  171. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_09.ts +0 -0
  172. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_10.ts +0 -0
  173. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_11.ts +0 -0
  174. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_12.ts +0 -0
  175. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_13.ts +0 -0
  176. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_14.ts +0 -0
  177. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_15.ts +0 -0
  178. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_16.ts +0 -0
  179. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_17.ts +0 -0
  180. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_18.ts +0 -0
  181. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_19.ts +0 -0
  182. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_20.ts +0 -0
  183. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_21.ts +0 -0
  184. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_22.ts +0 -0
  185. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_23.ts +0 -0
  186. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_24.ts +0 -0
  187. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_25.ts +0 -0
  188. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_26.ts +0 -0
  189. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_27.ts +0 -0
  190. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_28.ts +0 -0
  191. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_29.ts +0 -0
  192. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_30.ts +0 -0
  193. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_31.ts +0 -0
  194. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_32.ts +0 -0
  195. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_33.ts +0 -0
  196. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_34.ts +0 -0
  197. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_35.ts +0 -0
  198. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_36.ts +0 -0
  199. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_37.ts +0 -0
  200. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_38.ts +0 -0
  201. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_39.ts +0 -0
  202. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_40.ts +0 -0
  203. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_41.ts +0 -0
  204. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_42.ts +0 -0
  205. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_43.ts +0 -0
  206. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_44.ts +0 -0
  207. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_45.ts +0 -0
  208. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_46.ts +0 -0
  209. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_47.ts +0 -0
  210. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_48.ts +0 -0
  211. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_49.ts +0 -0
  212. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_50.ts +0 -0
  213. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_51.ts +0 -0
  214. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_52.ts +0 -0
  215. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_53.ts +0 -0
  216. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_54.ts +0 -0
  217. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_55.ts +0 -0
  218. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_56.ts +0 -0
  219. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_57.ts +0 -0
  220. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_58.ts +0 -0
  221. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_59.ts +0 -0
  222. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/tsconfig.json +0 -0
  223. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/gamma/src/index.ts +0 -0
  224. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/gamma/src/util1.ts +0 -0
  225. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/gamma/src/util2.ts +0 -0
  226. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/gamma/src/util3.ts +0 -0
  227. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/gamma/tsconfig.json +0 -0
  228. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/__tests__/fixtureOnly.spec.ts +0 -0
  229. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/app/handler.ts +0 -0
  230. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/config.ts +0 -0
  231. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/consumer.ts +0 -0
  232. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/dead.ts +0 -0
  233. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/domain/i18n/en.ts +0 -0
  234. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/domain/i18n/index.ts +0 -0
  235. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/domain/i18n/useLocale.ts +0 -0
  236. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/domain/labels/index.ts +0 -0
  237. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/events/streamTypes.ts +0 -0
  238. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/gateway/index.ts +0 -0
  239. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/helper.ts +0 -0
  240. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/hooks/useHookA.ts +0 -0
  241. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/hooks/useHookB.ts +0 -0
  242. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/hooks/useItems.ts +0 -0
  243. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/index.ts +0 -0
  244. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/integrations/inferenceClient.ts +0 -0
  245. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/lib/handler.ts +0 -0
  246. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/loaders/useInference.ts +0 -0
  247. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/models/MutationAggregate.ts +0 -0
  248. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/pages/panelPage.ts +0 -0
  249. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/rules/applyRule.ts +0 -0
  250. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/types/a.ts +0 -0
  251. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/types/b.ts +0 -0
  252. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/ui/Button.ts +0 -0
  253. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/ui/LazyPanel.ts +0 -0
  254. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/ui/buttonConsumer.ts +0 -0
  255. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/ui/menuModule.ts +0 -0
  256. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/user.ts +0 -0
  257. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/widget.ts +0 -0
  258. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/widgets/OrphanWidget.ts +0 -0
  259. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/tsconfig.json +0 -0
  260. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/incremental_equivalence.py +0 -0
  261. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/perf_util.py +0 -0
  262. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_analyze_graph.py +0 -0
  263. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_analyze_perf.py +0 -0
  264. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_bench_queries.py +0 -0
  265. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_composability.py +0 -0
  266. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_config.py +0 -0
  267. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_document_upsert.py +0 -0
  268. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_e2e_perf.py +0 -0
  269. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_git_delta.py +0 -0
  270. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_incremental_shards.py +0 -0
  271. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_index_batching.py +0 -0
  272. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_index_performance.py +0 -0
  273. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_index_prune.py +0 -0
  274. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_indexer_env.py +0 -0
  275. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_merge.py +0 -0
  276. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_metadata.py +0 -0
  277. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_multi_symbol.py +0 -0
  278. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_pure_functions.py +0 -0
  279. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_qualified_symbols.py +0 -0
  280. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_scip_tool.py +0 -0
  281. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_shard_files.py +0 -0
  282. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_source_discovery.py +0 -0
  283. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_sql.py +0 -0
  284. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_symbols_freq.py +0 -0
  285. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_targets.py +0 -0
  286. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_tsconfig.py +0 -0
  287. {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_typescript_projects.py +0 -0
@@ -0,0 +1,15 @@
1
+ # Dogfood analyze on this repo
2
+
3
+ Human-invoked pass before broad review. From repo root with editable `scip-cli` on PATH:
4
+
5
+ ```bash
6
+ scip-cli reindex
7
+ scip-cli analyze --limit 25
8
+ scip-cli analyze --priority high --limit 25
9
+ scip-cli analyze scip_cli --limit 15
10
+ scip-cli analyze scip_cli/queries.py --limit 20
11
+ ```
12
+
13
+ Interpret README § *Finding easy wins with analyze* (cycles → dead exports → same-file → stale types). Fix or extend `analyze` per `agent.mdc` § Analyze feedback loop before spawning review subagents.
14
+
15
+ Do not commit unless the user asks.
@@ -0,0 +1,69 @@
1
+ ---
2
+ argument-hint: "[major | minor | patch]"
3
+ ---
4
+
5
+ # Release scip-cli (tag + GitHub)
6
+
7
+ Bump level: **`$ARGUMENTS`** — must be exactly `major`, `minor`, or `patch`. Compute the next semver from `scip_cli/__init__.py` (same rules as `scripts/publish.sh`: patch +1; minor +1 and patch 0; major +1 and minor/patch 0). Tag and release **`vX.Y.Z`** for that computed version.
8
+
9
+ ## Commit messages (this repo)
10
+
11
+ - **Day-to-day:** sentence case, verb first — e.g. `Add entrypoint fixtures`, `Pass indexer binary name to npx fallback`. **Not** Conventional Commits (`feat(scope):`, `chore:`, …).
12
+ - **Version bump commit:** subject **only** `vX.Y.Z` (same string as the tag), e.g. `v3.2.0`.
13
+
14
+ Do not commit, tag, or push unless the user invoked this release command.
15
+
16
+ ## Preflight
17
+
18
+ 1. Repo root; working tree clean before the bump commit.
19
+ 2. `./scripts/test.sh`
20
+ 3. If `$ARGUMENTS` is missing or not `major`/`minor`/`patch`, stop and ask.
21
+ 4. After bump, `git rev-parse "vX.Y.Z"` must fail (tag must not exist yet).
22
+
23
+ ## Bump version
24
+
25
+ Use the bump logic in `scripts/publish.sh` (or run that script’s Python block with `BUMP_LEVEL=$ARGUMENTS`). Then:
26
+
27
+ ```bash
28
+ git add scip_cli/__init__.py
29
+ git commit -m "vX.Y.Z"
30
+ ```
31
+
32
+ ## Tag (non-interactive — never open the editor)
33
+
34
+ Always pass **both** tag name and message on the command line:
35
+
36
+ ```bash
37
+ git tag -a "vX.Y.Z" -m "vX.Y.Z"
38
+ ```
39
+
40
+ Do **not** run bare `git tag vX.Y.Z` (Git may open an editor for the annotation).
41
+
42
+ Push branch and tag:
43
+
44
+ ```bash
45
+ git push origin HEAD "vX.Y.Z"
46
+ ```
47
+
48
+ ## GitHub release (`gh`)
49
+
50
+ Read `~/.claude/skills/gh/references/releases.md`. Use the repo scripts:
51
+
52
+ ```bash
53
+ GH_SCRIPTS="${GH_SCRIPTS:-$HOME/.claude/skills/gh/scripts}"
54
+ REPO="$(gh repo view --json nameWithOwner -q .nameWithOwner 2>/dev/null || echo flesler/scip-cli)"
55
+
56
+ "$GH_SCRIPTS/release-notes.sh" X.Y.Z --install '```bash
57
+ pip install scip-cli=={{VERSION}}
58
+ ```'
59
+
60
+ "$GH_SCRIPTS/sync-github-release.sh" "$REPO" X.Y.Z \
61
+ --install '```bash
62
+ pip install scip-cli=={{VERSION}}
63
+ ```' \
64
+ --execute
65
+ ```
66
+
67
+ **Do not** run `gh release create` by hand unless the user rejects the script path. **Do not** upload PyPI (`twine`) or run full `./scripts/publish.sh` unless the user explicitly asks.
68
+
69
+ Report: bump level, new version, tag pushed, release URL, PyPI skipped unless requested.
@@ -7,6 +7,8 @@ alwaysApply: true
7
7
 
8
8
  **Work from repo root.** CLI usage, flags, and user gotchas: `scip-cli skill` (source: `scip_cli/SKILL.md`). Read once per task — do not duplicate SKILL here.
9
9
 
10
+ **Cursor:** Skills in `.cursor/skills/` (`test`, `sql-bench`, `new-command`) — folder name = frontmatter `name:`; agent reads when relevant. Slash commands in `.cursor/commands/` only for workflows you invoke (`dogfood`, `migration-problems`, `release`); never pair the same workflow as both.
11
+
10
12
  **Almost always:** bare `scip-cli` on PATH must be **this checkout live** (`pip install -e ".[dev]"`). All examples use `scip-cli` — never `.venv/bin/scip-cli`, `python -m scip_cli`, or other paths. Only swap to PyPI briefly to smoke-test a release.
11
13
 
12
14
  ## Bootstrap
@@ -34,11 +36,11 @@ Node.js + `npx` required for integration tests (`scip-typescript`). Optional: `S
34
36
  |Full suite|`pytest`|
35
37
  |E2e loop|`pytest tests/test_e2e.py tests/test_e2e_analyze_patterns.py`|
36
38
  |Lint / format|`ruff check .` / `ruff format .`|
37
- |Typecheck|`basedpyright scip_cli/`|
39
+ |Typecheck|`basedpyright --warnings scip_cli/ scripts/`|
38
40
 
39
- Pre-commit: ruff + ruff-format + basedpyright + full pytest. E2e before commit on command changes.
41
+ Pre-commit, CI, and publish: `./scripts/test.sh` (same gate). No pre-push hook. E2e before commit on command changes.
40
42
 
41
- **Use `scripts/test.sh`** before committing to catch all issues (lint, format, types, tests). This matches what pre-commit runs.
43
+ **Use `scripts/test.sh`** before committing to catch all issues (lint, format, types, tests). This matches what pre-commit and CI run.
42
44
 
43
45
  ## Improving this repo (do this before review subagents)
44
46
 
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: new-command
3
+ description: Read when adding or changing a scip-cli CLI subcommand.
4
+ ---
5
+
6
+ # New or changed CLI command
7
+
8
+ User-facing reference lives in `scip_cli/SKILL.md` + `README.md` (must match `scip_cli/__main__.py` flags). Run `scip-cli skill` to verify dump.
9
+
10
+ ## Checklist
11
+
12
+ 1. **`scip_cli/commands/<name>.py`** — `main(args)`; thin handler. Use `session.setup()` for index DB unless the command is `reindex` / `skill`.
13
+ 2. **`scip_cli/__main__.py`** — import; `add_parser`; wire `dispatch["<name>"] = <module>.main`.
14
+ 3. **Shared flags** — reuse `scip_cli/cli_args.py` (`add_path_argument`, `add_limit_argument`, …) when siblings use them.
15
+ 4. **SQL** — keep queries in `scip_cli/queries.py` or `scip_cli/analyze/`, not fat command modules.
16
+ 5. **Docs** — quick-guide row + `### <name>` section in `scip_cli/SKILL.md`; bullet in README § Commands.
17
+ 6. **Tests** — `tests/test_e2e.py` (or `test_e2e_analyze_patterns.py` for analyze-only); add `scip_cli.commands.<name>.setup` to `tests/e2e_harness.py` `COMMAND_SETUP_PATHS`.
18
+ 7. **Verify** — follow skill `test`; run narrowed pytest then e2e loop.
19
+
20
+ ## Patterns
21
+
22
+ - **Read-only DB:** `db, project_root = setup()` in `try` / `finally: db.close()`. Connection already has `configure_read_connection` via `get_db`.
23
+ - **Errors:** raise `RuntimeError` or let `sqlite3.Error` bubble — `__main__.main` maps them to stderr + exit code.
24
+ - **Output:** stdout = records; stderr = warnings (match existing commands).
25
+
26
+ ## Map
27
+
28
+ |Concern|Path|
29
+ |---|---|
30
+ |Entry / argparse|`scip_cli/__main__.py`|
31
+ |Handlers|`scip_cli/commands/`|
32
+ |Index open|`scip_cli/session.py`, `scip_cli/indexing/core.py`|
33
+ |User skill install|`scip-cli skill <path>` copies `scip_cli/SKILL.md`|
34
+
35
+ ## Cursor repo conventions
36
+
37
+ - **Skills** (`.cursor/skills/<name>/`, frontmatter `name:` = folder name): agent reads when the task matches — e.g. `test`, `sql-bench`, `new-command`.
38
+ - **Commands** (`.cursor/commands/`): only workflows **you** invoke with slash — e.g. `dogfood`, `migration-problems`. Never duplicate the same workflow as a skill and a command.
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: sql-bench
3
+ description: Read when changing queries.py, analyze SQL, symbols SQL, or sql.py.
4
+ ---
5
+
6
+ # SQL / query performance
7
+
8
+ Small fixture DB hides regressions on 40MB+ indexes. CI perf tests only catch gross mistakes on the tiny project.
9
+
10
+ ## Required before commit
11
+
12
+ Touching `scip_cli/queries.py`, `scip_cli/analyze/*`, `scip_cli/symbols.py` SQL, or `scip_cli/sql.py`:
13
+
14
+ ```bash
15
+ scripts/bench.sh --baseline # once per change series
16
+ # … edit …
17
+ scripts/bench.sh --compare
18
+ ```
19
+
20
+ Synthetic scale: `tests/bench_db.py` + `tests/test_bench_queries.py`. Lines `BENCH:<name>:<ms>`; compare table ratio >1.0 = regression.
21
+
22
+ ## Correctness vs speed
23
+
24
+ - Behavior / SCIP shapes → fixture e2e (skill `test`).
25
+ - Graph plumbing only → `analyze_db` unit tests.
26
+
27
+ ## Optional: real cached index
28
+
29
+ Replace `<project-slug>` under `~/.cache/scip-cli/projects/` — snippet in `agent.mdc` § Large cached index benchmark.
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: test
3
+ description: Read when running or writing scip-cli tests (pytest, e2e, CI parity).
4
+ ---
5
+
6
+ # scip-cli tests
7
+
8
+ Repo root only. Bootstrap: `.cursor/rules/agent.mdc` (editable install, Node for fixture index).
9
+
10
+ ## Pick a suite
11
+
12
+ |Goal|Command|
13
+ |---|---|
14
+ |Pre-commit / CI / publish|`scripts/test.sh`|
15
+ |Full|`pytest`|
16
+ |CLI + fixture index|`pytest tests/test_e2e.py tests/test_e2e_analyze_patterns.py`|
17
+ |One class / test|`pytest tests/test_e2e.py::TestQuery -q`|
18
+ |Analyze unit / graph|`pytest tests/test_analyze_graph.py tests/test_analyze.py`|
19
+ |SQL perf (not correctness)|`scripts/bench.sh` — see skill `sql-bench`|
20
+
21
+ `scripts/test.sh` uses `.venv/bin/{ruff,basedpyright,pytest}`; create venv + `pip install -e ".[dev]"` if missing.
22
+
23
+ ## E2e rules
24
+
25
+ - In-process only: `tests/e2e_harness.py` (`CliRunner`, `run_cli`) patches `scip_cli.commands.<cmd>.setup` — **never** subprocess `scip-cli` in tests.
26
+ - **Never** call `reindex` in e2e (mutates `~/.cache/scip-cli`).
27
+ - Session fixture `indexed_fixture` indexes `tests/fixtures/typescript-project/` once (real `scip-typescript`).
28
+ - Stable symbols/paths: add constants to `tests/fixture_catalog.py`; import in tests — do not hardcode fixture paths in test bodies.
29
+ - New CLI command: append `scip_cli.commands.<cmd>.setup` to `COMMAND_SETUP_PATHS` in `e2e_harness.py`.
30
+
31
+ ## Fixture vs in-memory DB
32
+
33
+ |Need|Layer|
34
+ |---|---|
35
+ |SCIP symbol shapes, analyze false positives, CLI output|Fixture e2e (`test_e2e*.py`)|
36
+ |Tarjan, section wiring, one-off SQL plumbing|`tests/analyze_db.py` + `test_analyze_graph.py`|
37
+
38
+ Prefer fixture e2e for indexer-dependent behavior. Details: `agent.mdc` § TDD.
39
+
40
+ ## After command / flag changes
41
+
42
+ Run e2e loop at minimum before commit; `scripts/test.sh` before push.
@@ -45,7 +45,6 @@ Thumbs.db
45
45
  # Project specific
46
46
  TODO.md
47
47
  todo.md
48
- dogfood.md
49
48
 
50
49
  # Local-only dev scripts (repo-specific smoke harnesses)
51
50
  scripts/deep-smoke.sh
@@ -0,0 +1,10 @@
1
+ repos:
2
+ - repo: local
3
+ hooks:
4
+ - id: ci-gate
5
+ name: CI gate (scripts/test.sh)
6
+ entry: bash scripts/test.sh
7
+ language: system
8
+ pass_filenames: false
9
+ always_run: true
10
+ stages: [pre-commit]
@@ -48,11 +48,10 @@ cd scip-cli
48
48
  # Install with dev dependencies
49
49
  pip install -e ".[dev]"
50
50
 
51
- # Install pre-commit hooks
51
+ # Install pre-commit hook (same command as CI — no pre-push hook)
52
52
  pre-commit install
53
53
 
54
- # Run tests
55
- pytest
54
+ ./scripts/test.sh
56
55
 
57
56
  # Run linter
58
57
  ruff check .
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: scip-cli
3
- Version: 3.0.0
3
+ Version: 3.2.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
@@ -26,6 +26,8 @@ Description-Content-Type: text/markdown
26
26
 
27
27
  Python CLI for AI agents. Queries SCIP indexes for precise refs, definitions, and repo health analysis — TypeScript/JavaScript, Python, Go, Rust.
28
28
 
29
+ **Related (optional):** [scip-atlas](https://github.com/flesler/scip-atlas) builds `atlas.db` (git paths, commits, owners) from this cache's `index.db`. [scip-atlas-web](https://github.com/flesler/scip-atlas-web) packs both into a slim DB and a single-file browser explorer. You do not need them for CLI or agent workflows.
30
+
29
31
  ## Why
30
32
 
31
33
  AI agents waste tokens on grep and file scanning. scip-cli gives them precise, type-aware code navigation in milliseconds — and `analyze` surfaces dead code, cycles, and coupling so agents (and humans) can fix real problems fast.
@@ -91,7 +93,7 @@ python -m venv .venv && source .venv/bin/activate
91
93
  pip install -e ".[dev]"
92
94
  ```
93
95
 
94
- Tests and lint: `pytest`, `ruff check .`, `basedpyright scip_cli/` from the same environment (or `scripts/test.sh` for the publish gate).
96
+ Tests and lint: `scripts/test.sh` (same as CI and pre-commit), or run `pytest`, `ruff check .`, `basedpyright --warnings scip_cli/ scripts/` from `.venv`.
95
97
 
96
98
  ### 2. Install prerequisites (optional)
97
99
 
@@ -101,7 +103,8 @@ On **first index**, scip-cli runs language indexers and builds a SQLite cache. Y
101
103
 
102
104
  Install `scip-cli` and run it. On first index, scip-cli will:
103
105
 
104
- - Download `scip-typescript` / `scip-python` via `npx`, `scip-go` via `go install`, or `rust-analyzer` via `rustup` when not already on PATH
106
+ - Install `scip-typescript` from the [flesler/scip-typescript](https://github.com/flesler/scip-typescript) fork (`feat/partial-files`) when not on PATH — clones, `npm install`, and builds into `~/.cache/scip-cli/tools/github-npm/` (upstream npm does not ship partial `--files` yet)
107
+ - Download `scip-python` via `npx`, `scip-go` via `go install`, or `rust-analyzer` via `rustup` when not already on PATH
105
108
  - Download the `scip` converter binary from [GitHub releases](https://github.com/scip-code/scip/releases) into `~/.cache/scip-cli/bin/` when not already on PATH
106
109
  - Walk the repo for `tsconfig*.json` project roots (TypeScript monorepos), run `scip-typescript` per project (parallel by default), convert each partial index, then merge into one `index.db`
107
110
 
@@ -109,11 +112,12 @@ No `.scip-cli.json` required for discovery. Subsequent queries read the cached d
109
112
 
110
113
  **Option B: Install indexers globally ahead of time**
111
114
 
112
- Same indexing steps as Option A; this only avoids `npx` download on the first run:
115
+ Same indexing steps as Option A; this only avoids the first-run download/build:
113
116
 
114
117
  ```bash
115
- # TypeScript/JavaScript indexer (also handles plain JS via --infer-tsconfig)
116
- npm install -g @sourcegraph/scip-typescript
118
+ # TypeScript/JavaScript indexer — fork with partial --files (required for incremental reindex)
119
+ git clone --depth 1 --branch feat/partial-files https://github.com/flesler/scip-typescript.git
120
+ cd scip-typescript && npm install --ignore-scripts && npm run build && npm install -g .
117
121
 
118
122
  # Python indexer
119
123
  npm install -g @sourcegraph/scip-python
@@ -153,8 +157,9 @@ scip-cli <command> [arguments]
153
157
  - `rdeps <file>` - Find files that depend on a file (`--path`)
154
158
  - `deps <symbol|file>` - Find outbound dependencies (what a symbol or file calls) (`--path`, `--paths-only`)
155
159
  - `members <symbol>` - List members of a class/interface (`--path`)
160
+ - `query <sql>` - SQL against the project index (`--format tsv|csv|json`, default tsv; read-only unless `--write`)
156
161
  - `analyze [target]` - SQL health dashboards (`--limit`, `--per-check-limit`, `--priority`, `--check`, `--include-tests`). No target: project-wide; directory or file path; symbol name. See [Finding easy wins with `analyze`](#finding-easy-wins-with-analyze).
157
- - `reindex` - Force re-indexing of the current project (`--path` to limit scope; repeatable)
162
+ - `reindex` - Force re-indexing (`--path`, `--tsconfig`, `--exclude`, `--fresh`, `--no-incremental`; incremental by default in git TS repos)
158
163
  - `skill [path]` - Install or dump the SKILL.md
159
164
 
160
165
  ### Examples
@@ -190,6 +195,10 @@ scip-cli members Widget
190
195
  # Project health dashboard (or: scip-cli analyze src/foo.ts / scip-cli analyze greet)
191
196
  scip-cli analyze
192
197
 
198
+ # List index tables / columns (read-only SQL)
199
+ scip-cli query "SELECT name FROM sqlite_schema WHERE type='table' ORDER BY 1"
200
+ scip-cli query "PRAGMA table_info(global_symbols)"
201
+
193
202
  # Install skill file
194
203
  scip-cli skill ~/.claude/skills/scip-cli/SKILL.md
195
204
  ```
@@ -222,7 +231,10 @@ scip-cli deps greet --paths-only | sort -u
222
231
  3. Runs `scip-typescript` per project (in parallel when there are multiple projects; set `SCIP_CLI_INDEX_WORKERS=1` to force serial), `scip-python` for Python, `scip-go` for Go, or `rust-analyzer scip` for Rust
223
232
  4. Converts each SCIP output to SQLite with `scip expt-convert`, then merges partial databases when needed
224
233
  5. Caches the result in `~/.cache/scip-cli/projects/<dirname>-<hash>/index.db` (e.g. `my-monorepo-1a3f7a`)
225
- 6. Subsequent queries are SQLite lookups against that cache (not re-indexing)
234
+ 6. Compacts the database after each reindex (`VACUUM` + WAL checkpoint)
235
+ 7. Subsequent queries are SQLite lookups against that cache (not re-indexing)
236
+
237
+ **Incremental reindex (TypeScript, v3.0+):** plain `scip-cli reindex` in a git worktree is incremental by default — reuses unchanged tsconfig shards via `shards/manifest.json` (`git_commit` + per-shard `tsconfig_digest`). Dirty shards reindex only changed files (git delta → importer closure → fork `--files`) and upsert into the live `index.db`. Use `--no-incremental` or `--fresh` for a full rebuild; `--unversioned` and non-git projects always full-reindex. Bench locally with `python scripts/bench_incremental_gate.py --branch fixture`.
226
238
 
227
239
  ## Configuration
228
240
 
@@ -249,27 +261,28 @@ Other environment variables:
249
261
  |`SCIP_CLI_MAX_HEAP_MB`|Node heap for `scip-typescript` / `scip-python` (overrides `maxHeapMb` in config)|
250
262
  |`SCIP_CLI_TS_INDEX_BATCH_SIZE`|Split large TS repos into multiple `scip-typescript` runs (default: all tsconfigs in one run)|
251
263
  |`SCIP_CLI_MERGE_BATCH_SIZE`|SQLite ATTACH batch size when merging part DBs (max 9)|
264
+ |`SCIP_CLI_INDEX_TIMING`|`1` — per-phase `INDEX_TIMING:` lines on stderr during reindex|
252
265
  |`SCIP_CLI_MAX_DEF_LINES`|Max definition lines in `code` output|
253
266
  |`SCIP_CLI_DEBUG`|Log SQL queries to stderr|
254
267
 
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`.
268
+ **Version policy:** only the `scip` converter (`expt-convert`) is pinned to the 0.8.x release line because it defines the SQLite schema. **TypeScript** uses [flesler/scip-typescript](https://github.com/flesler/scip-typescript) `feat/partial-files` (see `SCIP_TYPESCRIPT_NPX_PACKAGE` in `scip_cli/indexing/constants.py`) — auto-built when not on PATH; switch back to `@sourcegraph/scip-typescript` on npm once upstream merges `--files`. `scip-python` via `npx` at latest; `scip-go` via `go install @latest`. `rust-analyzer` installs via `rustup component add`.
256
269
 
257
270
  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
271
 
259
272
  Scoped indexing without editing `.scip-cli.json`:
260
273
 
261
274
  ```bash
262
- scip-cli reindex --path packages/server
275
+ scip-cli reindex --path packages/core
263
276
  scip-cli reindex --path packages/api --path packages/worker
264
277
  scip-cli reindex --tsconfig 'apps/api/tsconfig.*.json'
265
278
  scip-cli reindex --tsconfig tsconfig.app.json --tsconfig tsconfig.spec.json
266
279
  scip-cli reindex --exclude '**/*.test.ts' '**/*.spec.ts'
267
280
  scip-cli reindex --exclude # clear persisted excludes
268
281
  scip-cli reindex --fresh # full index; clear metadata.json
269
- scip-cli reindex --incremental # reuse unchanged project shards (see SKILL for language support)
282
+ scip-cli reindex --no-incremental # full rebuild; clears shard manifest
270
283
  ```
271
284
 
272
- `--path` limits which discovered tsconfig **directories** are indexed (prefix match, same idea as query `--path`). `--tsconfig` skips discovery and indexes those `tsconfig*.json` **files** (repeatable; globs are expanded inside the tool). File-based runs default to one `scip-typescript` process per file so each gets its own heap (`SCIP_CLI_TS_INDEX_BATCH_SIZE` still overrides). Cannot combine `--path` and `--tsconfig`. **TypeScript only.** Scope and exclude defaults are saved in `metadata.json` next to `index.db` and reused on later `reindex` runs; use `reindex --fresh` to clear them and restore a full index. `--exclude` updates the persisted exclude list; a lone bare `--exclude` clears it.
285
+ `--path` limits which discovered tsconfig **directories** are indexed (prefix match, same idea as query `--path`). `--tsconfig` skips discovery and indexes those `tsconfig*.json` **files** (repeatable; globs are repo-relative to the detected project root — run from monorepo root or shorten the glob). File-based runs default to one `scip-typescript` process per file so each gets its own heap (`SCIP_CLI_TS_INDEX_BATCH_SIZE` still overrides). Cannot combine `--path` and `--tsconfig`. **TypeScript only** for `--path` and `--tsconfig`. Scope and exclude defaults are saved in `metadata.json` next to `index.db` and reused on later `reindex` runs; use `reindex --fresh` to clear them and restore a full index. `--exclude` updates the persisted exclude list (honored during incremental reindex too); a lone bare `--exclude` clears it. Incremental is the default in git TypeScript repos; `--no-incremental`, `--fresh`, `--unversioned`, or non-git force full reindex.
273
286
 
274
287
  When a tsconfig (after `extends`) has `allowJs: true`, matching `.js`/`.jsx` files under that config's `include`/`files` are indexed too (same roots as `.ts`/`.tsx`). `allowJs: false` or unset leaves JavaScript out. JS-only repos with no `tsconfig.json` still use `--infer-tsconfig`.
275
288
 
@@ -297,7 +310,7 @@ Sections are tagged `[high]`, `[medium]`, `[low]` and listed in that order.
297
310
  |---|---|---|
298
311
  |**high**|Cycles, dead exports, dead files, stale types (unreferenced is omitted when dead exports is on)|Nuke or fix cycles; delete unused; `_` prefix|
299
312
  |**medium**|Same-file only, change surface (file target)|Module-private by usage|
300
- |**low**|Test-only consumers, coupling, bottlenecks, hotspots|Noisy on Python (index omits many same-file calls); verify with `rg`|
313
+ |**low**|Single-importer files (`[test-only]` when sole importer is tests), test-only consumers, coupling, bottlenecks, hotspots|Noisy on Python (index omits many same-file calls); verify with `rg`|
301
314
 
302
315
  Use `--priority high` for a quick gate; `--priority high,medium` adds context. File drill-down adds change surface and unused imports.
303
316
 
@@ -323,7 +336,7 @@ scip-cli analyze scip_cli --limit 15 # directory: scoped project +
323
336
 
324
337
  **Defaults:** project-wide and directory analyze skip `tests/`, `*.test.*`, `*.spec.*`, `conftest.py`, and `__tests__/`. Pass `--include-tests` to include them. File-target analyze always includes that file.
325
338
 
326
- **Limits:** "Dead export" means no cross-file mentions in the index — not unreachable code. Same-file private helpers are expected. Re-run `reindex` after large changes; the index is a snapshot.
339
+ **Limits:** "Dead export" means no cross-file mentions in the index — not unreachable code. Same-file private helpers are expected. Shebang lines and manifest entrypoints (`package.json` main/bin/scripts with dist→src mapping for TypeScript; Python `pyproject`/`setup.py`/`setup.cfg` scripts) are excluded from project-level dead files and dead exports. Re-run `reindex` after large changes; the index is a snapshot.
327
340
 
328
341
  ## Performance
329
342
 
@@ -338,35 +351,6 @@ Inspired by [scip-query](https://github.com/PlunderStruck/scip-query), scip-cli
338
351
 
339
352
  The speedup comes from using optimized direct SQLite queries and cutting some nice but very slow goodies (like ts-morph).
340
353
 
341
- ## Architecture
342
-
343
- ```
344
- scip_cli/
345
- ├── __init__.py
346
- ├── __main__.py # CLI entry point
347
- ├── cli_args.py # Shared argparse helpers
348
- ├── config.py # .scip-cli.json loader
349
- ├── discover.py # TypeScript project discovery
350
- ├── merge.py # SQLite index merging
351
- ├── scip_tool.py # scip binary download
352
- ├── sql.py # SQLite helpers
353
- ├── paths.py # --path scope filtering
354
- ├── project.py # Project root + language detection
355
- ├── cache.py # Index cache paths
356
- ├── metadata.py # Persisted reindex defaults (metadata.json)
357
- ├── scope.py # Scoped reindex helpers
358
- ├── debug.py # SCIP_CLI_DEBUG stderr helpers
359
- ├── indexing.py # SCIP index build + get_db
360
- ├── symbols.py # Symbol parsing and kinds
361
- ├── queries.py # Symbol/file SQL queries
362
- ├── source.py # Filesystem source reads
363
- ├── output.py # CLI formatting helpers
364
- ├── session.py # setup() and single-match resolution
365
- ├── targets.py # file-path heuristics (tests; analyze uses analyze/targets.py)
366
- ├── analyze/ # SQL dashboard queries (project/file/symbol)
367
- └── commands/ # Subcommand implementations
368
- ```
369
-
370
354
  ## Development
371
355
 
372
356
  ```bash
@@ -5,6 +5,8 @@
5
5
 
6
6
  Python CLI for AI agents. Queries SCIP indexes for precise refs, definitions, and repo health analysis — TypeScript/JavaScript, Python, Go, Rust.
7
7
 
8
+ **Related (optional):** [scip-atlas](https://github.com/flesler/scip-atlas) builds `atlas.db` (git paths, commits, owners) from this cache's `index.db`. [scip-atlas-web](https://github.com/flesler/scip-atlas-web) packs both into a slim DB and a single-file browser explorer. You do not need them for CLI or agent workflows.
9
+
8
10
  ## Why
9
11
 
10
12
  AI agents waste tokens on grep and file scanning. scip-cli gives them precise, type-aware code navigation in milliseconds — and `analyze` surfaces dead code, cycles, and coupling so agents (and humans) can fix real problems fast.
@@ -70,7 +72,7 @@ python -m venv .venv && source .venv/bin/activate
70
72
  pip install -e ".[dev]"
71
73
  ```
72
74
 
73
- Tests and lint: `pytest`, `ruff check .`, `basedpyright scip_cli/` from the same environment (or `scripts/test.sh` for the publish gate).
75
+ Tests and lint: `scripts/test.sh` (same as CI and pre-commit), or run `pytest`, `ruff check .`, `basedpyright --warnings scip_cli/ scripts/` from `.venv`.
74
76
 
75
77
  ### 2. Install prerequisites (optional)
76
78
 
@@ -80,7 +82,8 @@ On **first index**, scip-cli runs language indexers and builds a SQLite cache. Y
80
82
 
81
83
  Install `scip-cli` and run it. On first index, scip-cli will:
82
84
 
83
- - Download `scip-typescript` / `scip-python` via `npx`, `scip-go` via `go install`, or `rust-analyzer` via `rustup` when not already on PATH
85
+ - Install `scip-typescript` from the [flesler/scip-typescript](https://github.com/flesler/scip-typescript) fork (`feat/partial-files`) when not on PATH — clones, `npm install`, and builds into `~/.cache/scip-cli/tools/github-npm/` (upstream npm does not ship partial `--files` yet)
86
+ - Download `scip-python` via `npx`, `scip-go` via `go install`, or `rust-analyzer` via `rustup` when not already on PATH
84
87
  - Download the `scip` converter binary from [GitHub releases](https://github.com/scip-code/scip/releases) into `~/.cache/scip-cli/bin/` when not already on PATH
85
88
  - Walk the repo for `tsconfig*.json` project roots (TypeScript monorepos), run `scip-typescript` per project (parallel by default), convert each partial index, then merge into one `index.db`
86
89
 
@@ -88,11 +91,12 @@ No `.scip-cli.json` required for discovery. Subsequent queries read the cached d
88
91
 
89
92
  **Option B: Install indexers globally ahead of time**
90
93
 
91
- Same indexing steps as Option A; this only avoids `npx` download on the first run:
94
+ Same indexing steps as Option A; this only avoids the first-run download/build:
92
95
 
93
96
  ```bash
94
- # TypeScript/JavaScript indexer (also handles plain JS via --infer-tsconfig)
95
- npm install -g @sourcegraph/scip-typescript
97
+ # TypeScript/JavaScript indexer — fork with partial --files (required for incremental reindex)
98
+ git clone --depth 1 --branch feat/partial-files https://github.com/flesler/scip-typescript.git
99
+ cd scip-typescript && npm install --ignore-scripts && npm run build && npm install -g .
96
100
 
97
101
  # Python indexer
98
102
  npm install -g @sourcegraph/scip-python
@@ -132,8 +136,9 @@ scip-cli <command> [arguments]
132
136
  - `rdeps <file>` - Find files that depend on a file (`--path`)
133
137
  - `deps <symbol|file>` - Find outbound dependencies (what a symbol or file calls) (`--path`, `--paths-only`)
134
138
  - `members <symbol>` - List members of a class/interface (`--path`)
139
+ - `query <sql>` - SQL against the project index (`--format tsv|csv|json`, default tsv; read-only unless `--write`)
135
140
  - `analyze [target]` - SQL health dashboards (`--limit`, `--per-check-limit`, `--priority`, `--check`, `--include-tests`). No target: project-wide; directory or file path; symbol name. See [Finding easy wins with `analyze`](#finding-easy-wins-with-analyze).
136
- - `reindex` - Force re-indexing of the current project (`--path` to limit scope; repeatable)
141
+ - `reindex` - Force re-indexing (`--path`, `--tsconfig`, `--exclude`, `--fresh`, `--no-incremental`; incremental by default in git TS repos)
137
142
  - `skill [path]` - Install or dump the SKILL.md
138
143
 
139
144
  ### Examples
@@ -169,6 +174,10 @@ scip-cli members Widget
169
174
  # Project health dashboard (or: scip-cli analyze src/foo.ts / scip-cli analyze greet)
170
175
  scip-cli analyze
171
176
 
177
+ # List index tables / columns (read-only SQL)
178
+ scip-cli query "SELECT name FROM sqlite_schema WHERE type='table' ORDER BY 1"
179
+ scip-cli query "PRAGMA table_info(global_symbols)"
180
+
172
181
  # Install skill file
173
182
  scip-cli skill ~/.claude/skills/scip-cli/SKILL.md
174
183
  ```
@@ -201,7 +210,10 @@ scip-cli deps greet --paths-only | sort -u
201
210
  3. Runs `scip-typescript` per project (in parallel when there are multiple projects; set `SCIP_CLI_INDEX_WORKERS=1` to force serial), `scip-python` for Python, `scip-go` for Go, or `rust-analyzer scip` for Rust
202
211
  4. Converts each SCIP output to SQLite with `scip expt-convert`, then merges partial databases when needed
203
212
  5. Caches the result in `~/.cache/scip-cli/projects/<dirname>-<hash>/index.db` (e.g. `my-monorepo-1a3f7a`)
204
- 6. Subsequent queries are SQLite lookups against that cache (not re-indexing)
213
+ 6. Compacts the database after each reindex (`VACUUM` + WAL checkpoint)
214
+ 7. Subsequent queries are SQLite lookups against that cache (not re-indexing)
215
+
216
+ **Incremental reindex (TypeScript, v3.0+):** plain `scip-cli reindex` in a git worktree is incremental by default — reuses unchanged tsconfig shards via `shards/manifest.json` (`git_commit` + per-shard `tsconfig_digest`). Dirty shards reindex only changed files (git delta → importer closure → fork `--files`) and upsert into the live `index.db`. Use `--no-incremental` or `--fresh` for a full rebuild; `--unversioned` and non-git projects always full-reindex. Bench locally with `python scripts/bench_incremental_gate.py --branch fixture`.
205
217
 
206
218
  ## Configuration
207
219
 
@@ -228,27 +240,28 @@ Other environment variables:
228
240
  |`SCIP_CLI_MAX_HEAP_MB`|Node heap for `scip-typescript` / `scip-python` (overrides `maxHeapMb` in config)|
229
241
  |`SCIP_CLI_TS_INDEX_BATCH_SIZE`|Split large TS repos into multiple `scip-typescript` runs (default: all tsconfigs in one run)|
230
242
  |`SCIP_CLI_MERGE_BATCH_SIZE`|SQLite ATTACH batch size when merging part DBs (max 9)|
243
+ |`SCIP_CLI_INDEX_TIMING`|`1` — per-phase `INDEX_TIMING:` lines on stderr during reindex|
231
244
  |`SCIP_CLI_MAX_DEF_LINES`|Max definition lines in `code` output|
232
245
  |`SCIP_CLI_DEBUG`|Log SQL queries to stderr|
233
246
 
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`.
247
+ **Version policy:** only the `scip` converter (`expt-convert`) is pinned to the 0.8.x release line because it defines the SQLite schema. **TypeScript** uses [flesler/scip-typescript](https://github.com/flesler/scip-typescript) `feat/partial-files` (see `SCIP_TYPESCRIPT_NPX_PACKAGE` in `scip_cli/indexing/constants.py`) — auto-built when not on PATH; switch back to `@sourcegraph/scip-typescript` on npm once upstream merges `--files`. `scip-python` via `npx` at latest; `scip-go` via `go install @latest`. `rust-analyzer` installs via `rustup component add`.
235
248
 
236
249
  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
250
 
238
251
  Scoped indexing without editing `.scip-cli.json`:
239
252
 
240
253
  ```bash
241
- scip-cli reindex --path packages/server
254
+ scip-cli reindex --path packages/core
242
255
  scip-cli reindex --path packages/api --path packages/worker
243
256
  scip-cli reindex --tsconfig 'apps/api/tsconfig.*.json'
244
257
  scip-cli reindex --tsconfig tsconfig.app.json --tsconfig tsconfig.spec.json
245
258
  scip-cli reindex --exclude '**/*.test.ts' '**/*.spec.ts'
246
259
  scip-cli reindex --exclude # clear persisted excludes
247
260
  scip-cli reindex --fresh # full index; clear metadata.json
248
- scip-cli reindex --incremental # reuse unchanged project shards (see SKILL for language support)
261
+ scip-cli reindex --no-incremental # full rebuild; clears shard manifest
249
262
  ```
250
263
 
251
- `--path` limits which discovered tsconfig **directories** are indexed (prefix match, same idea as query `--path`). `--tsconfig` skips discovery and indexes those `tsconfig*.json` **files** (repeatable; globs are expanded inside the tool). File-based runs default to one `scip-typescript` process per file so each gets its own heap (`SCIP_CLI_TS_INDEX_BATCH_SIZE` still overrides). Cannot combine `--path` and `--tsconfig`. **TypeScript only.** Scope and exclude defaults are saved in `metadata.json` next to `index.db` and reused on later `reindex` runs; use `reindex --fresh` to clear them and restore a full index. `--exclude` updates the persisted exclude list; a lone bare `--exclude` clears it.
264
+ `--path` limits which discovered tsconfig **directories** are indexed (prefix match, same idea as query `--path`). `--tsconfig` skips discovery and indexes those `tsconfig*.json` **files** (repeatable; globs are repo-relative to the detected project root — run from monorepo root or shorten the glob). File-based runs default to one `scip-typescript` process per file so each gets its own heap (`SCIP_CLI_TS_INDEX_BATCH_SIZE` still overrides). Cannot combine `--path` and `--tsconfig`. **TypeScript only** for `--path` and `--tsconfig`. Scope and exclude defaults are saved in `metadata.json` next to `index.db` and reused on later `reindex` runs; use `reindex --fresh` to clear them and restore a full index. `--exclude` updates the persisted exclude list (honored during incremental reindex too); a lone bare `--exclude` clears it. Incremental is the default in git TypeScript repos; `--no-incremental`, `--fresh`, `--unversioned`, or non-git force full reindex.
252
265
 
253
266
  When a tsconfig (after `extends`) has `allowJs: true`, matching `.js`/`.jsx` files under that config's `include`/`files` are indexed too (same roots as `.ts`/`.tsx`). `allowJs: false` or unset leaves JavaScript out. JS-only repos with no `tsconfig.json` still use `--infer-tsconfig`.
254
267
 
@@ -276,7 +289,7 @@ Sections are tagged `[high]`, `[medium]`, `[low]` and listed in that order.
276
289
  |---|---|---|
277
290
  |**high**|Cycles, dead exports, dead files, stale types (unreferenced is omitted when dead exports is on)|Nuke or fix cycles; delete unused; `_` prefix|
278
291
  |**medium**|Same-file only, change surface (file target)|Module-private by usage|
279
- |**low**|Test-only consumers, coupling, bottlenecks, hotspots|Noisy on Python (index omits many same-file calls); verify with `rg`|
292
+ |**low**|Single-importer files (`[test-only]` when sole importer is tests), test-only consumers, coupling, bottlenecks, hotspots|Noisy on Python (index omits many same-file calls); verify with `rg`|
280
293
 
281
294
  Use `--priority high` for a quick gate; `--priority high,medium` adds context. File drill-down adds change surface and unused imports.
282
295
 
@@ -302,7 +315,7 @@ scip-cli analyze scip_cli --limit 15 # directory: scoped project +
302
315
 
303
316
  **Defaults:** project-wide and directory analyze skip `tests/`, `*.test.*`, `*.spec.*`, `conftest.py`, and `__tests__/`. Pass `--include-tests` to include them. File-target analyze always includes that file.
304
317
 
305
- **Limits:** "Dead export" means no cross-file mentions in the index — not unreachable code. Same-file private helpers are expected. Re-run `reindex` after large changes; the index is a snapshot.
318
+ **Limits:** "Dead export" means no cross-file mentions in the index — not unreachable code. Same-file private helpers are expected. Shebang lines and manifest entrypoints (`package.json` main/bin/scripts with dist→src mapping for TypeScript; Python `pyproject`/`setup.py`/`setup.cfg` scripts) are excluded from project-level dead files and dead exports. Re-run `reindex` after large changes; the index is a snapshot.
306
319
 
307
320
  ## Performance
308
321
 
@@ -317,35 +330,6 @@ Inspired by [scip-query](https://github.com/PlunderStruck/scip-query), scip-cli
317
330
 
318
331
  The speedup comes from using optimized direct SQLite queries and cutting some nice but very slow goodies (like ts-morph).
319
332
 
320
- ## Architecture
321
-
322
- ```
323
- scip_cli/
324
- ├── __init__.py
325
- ├── __main__.py # CLI entry point
326
- ├── cli_args.py # Shared argparse helpers
327
- ├── config.py # .scip-cli.json loader
328
- ├── discover.py # TypeScript project discovery
329
- ├── merge.py # SQLite index merging
330
- ├── scip_tool.py # scip binary download
331
- ├── sql.py # SQLite helpers
332
- ├── paths.py # --path scope filtering
333
- ├── project.py # Project root + language detection
334
- ├── cache.py # Index cache paths
335
- ├── metadata.py # Persisted reindex defaults (metadata.json)
336
- ├── scope.py # Scoped reindex helpers
337
- ├── debug.py # SCIP_CLI_DEBUG stderr helpers
338
- ├── indexing.py # SCIP index build + get_db
339
- ├── symbols.py # Symbol parsing and kinds
340
- ├── queries.py # Symbol/file SQL queries
341
- ├── source.py # Filesystem source reads
342
- ├── output.py # CLI formatting helpers
343
- ├── session.py # setup() and single-match resolution
344
- ├── targets.py # file-path heuristics (tests; analyze uses analyze/targets.py)
345
- ├── analyze/ # SQL dashboard queries (project/file/symbol)
346
- └── commands/ # Subcommand implementations
347
- ```
348
-
349
333
  ## Development
350
334
 
351
335
  ```bash