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.
- scip_cli-3.2.0/.agents/commands/dogfood.md +15 -0
- scip_cli-3.2.0/.agents/commands/release.md +69 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/.agents/rules/agent.mdc +5 -3
- scip_cli-3.2.0/.agents/skills/new-command/SKILL.md +38 -0
- scip_cli-3.2.0/.agents/skills/sql-bench/SKILL.md +29 -0
- scip_cli-3.2.0/.agents/skills/test/SKILL.md +42 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/.gitignore +0 -1
- scip_cli-3.2.0/.pre-commit-config.yaml +10 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/CONTRIBUTING.md +2 -3
- {scip_cli-3.0.0 → scip_cli-3.2.0}/PKG-INFO +27 -43
- {scip_cli-3.0.0 → scip_cli-3.2.0}/README.md +26 -42
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/SKILL.md +21 -4
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/__init__.py +1 -1
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/__main__.py +19 -3
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/common.py +5 -0
- scip_cli-3.2.0/scip_cli/analyze/entrypoints/__init__.py +77 -0
- scip_cli-3.2.0/scip_cli/analyze/entrypoints/golang.py +28 -0
- scip_cli-3.2.0/scip_cli/analyze/entrypoints/paths.py +34 -0
- scip_cli-3.2.0/scip_cli/analyze/entrypoints/python.py +128 -0
- scip_cli-3.2.0/scip_cli/analyze/entrypoints/rust.py +49 -0
- scip_cli-3.2.0/scip_cli/analyze/entrypoints/typescript.py +143 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/file.py +52 -1
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/project.py +59 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/sections.py +22 -1
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/symbol.py +9 -1
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/cache.py +1 -1
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/analyze.py +12 -3
- scip_cli-3.2.0/scip_cli/commands/query.py +66 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/reindex.py +26 -16
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/discover.py +15 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/convert.py +12 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/core.py +6 -3
- scip_cli-3.2.0/scip_cli/indexing/import_mentions.py +201 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/incremental.py +2 -5
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/languages.py +11 -5
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/runners.py +12 -1
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/ts_projects.py +3 -2
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/session.py +2 -2
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/source.py +13 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/sql.py +7 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/bench_fingerprint_smoke.py +1 -3
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/bench_incremental.py +26 -19
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/bench_incremental_gate.py +20 -6
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/publish.sh +15 -1
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/smoke.local.example.json +1 -1
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/test.sh +1 -2
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/analyze_db.py +17 -0
- scip_cli-3.2.0/tests/conftest.py +35 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/e2e_harness.py +8 -1
- scip_cli-3.2.0/tests/fixture_cache.py +113 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixture_catalog.py +8 -0
- scip_cli-3.2.0/tests/fixtures/typescript-project/bin/cli-entry.ts +5 -0
- scip_cli-3.2.0/tests/fixtures/typescript-project/bin/npm-script-only.ts +3 -0
- scip_cli-3.2.0/tests/fixtures/typescript-project/package.json +11 -0
- scip_cli-3.2.0/tests/fixtures/typescript-project/src/heuristic/classifyLeaf.test.ts +5 -0
- scip_cli-3.2.0/tests/fixtures/typescript-project/src/heuristic/classifyLeaf.ts +3 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_analyze.py +58 -3
- scip_cli-3.2.0/tests/test_analyze_live.py +282 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_cache.py +2 -2
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_discover.py +20 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_e2e.py +58 -1
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_e2e_analyze_patterns.py +37 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_exclude_globs.py +1 -13
- scip_cli-3.2.0/tests/test_import_mentions.py +25 -0
- scip_cli-3.2.0/tests/test_incremental_equivalence.py +52 -0
- scip_cli-3.2.0/tests/test_indexer_failure_message.py +29 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_indexer_fallback.py +26 -1
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_python_index_integration.py +9 -1
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_reindex.py +121 -18
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_scope.py +6 -6
- scip_cli-3.0.0/.pre-commit-config.yaml +0 -20
- scip_cli-3.0.0/docs/benchmarks.md +0 -188
- scip_cli-3.0.0/docs/incremental-reindex-roadmap.md +0 -76
- scip_cli-3.0.0/docs/port.md +0 -80
- scip_cli-3.0.0/docs/ports/conclusions.md +0 -424
- scip_cli-3.0.0/docs/ports/experiment-summary.md +0 -257
- scip_cli-3.0.0/docs/ports/go-experiment.md +0 -252
- scip_cli-3.0.0/docs/ports/go.md +0 -203
- scip_cli-3.0.0/docs/ports/plan.md +0 -161
- scip_cli-3.0.0/docs/ports/rust-experiment.md +0 -324
- scip_cli-3.0.0/docs/ports/rust.md +0 -264
- scip_cli-3.0.0/docs/ports/summary.md +0 -118
- scip_cli-3.0.0/docs/ports/zig-experiment.md +0 -333
- scip_cli-3.0.0/docs/ports/zig.md +0 -283
- scip_cli-3.0.0/scripts/bench_incremental.sh +0 -27
- scip_cli-3.0.0/scripts/bench_incremental_gate.sh +0 -25
- scip_cli-3.0.0/tests/conftest.py +0 -25
- scip_cli-3.0.0/tests/fixtures/typescript-project/package.json +0 -5
- scip_cli-3.0.0/tests/test_analyze_live.py +0 -71
- scip_cli-3.0.0/tests/test_incremental_equivalence.py +0 -83
- {scip_cli-3.0.0 → scip_cli-3.2.0}/.agents/commands/migration-problems.md +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/.github/pull_request_template.md +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/.github/workflows/ci.yml +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/AGENTS.md +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/CODE_OF_CONDUCT.md +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/LICENSE +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/SECURITY.md +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/pyproject.toml +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/__init__.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/graph.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/live.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/analyze/targets.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/cli_args.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/__init__.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/code.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/deps.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/members.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/rdeps.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/refs.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/search.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/skill.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/commands/symbols.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/config.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/debug.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/exclude.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/__init__.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/constants.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/document_upsert.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/git_delta.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/github_npm.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/orchestrate.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/performance.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/postprocess.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/shard_files.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/shards.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/source_discovery.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/indexing/typescript.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/merge.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/metadata.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/output.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/paths.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/project.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/queries.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/scip_tool.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/scope.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/smoke_config.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/symbols.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/targets.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scip_cli/tsconfig.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/bench.sh +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/bench_postprocess.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/build.sh +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/scripts/generate_incremental_bench_fixture.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/__init__.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/bench_db.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/package.json +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/alpha/src/index.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/alpha/src/util1.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/alpha/src/util2.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/alpha/src/util3.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/alpha/tsconfig.json +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/beta/src/index.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/beta/src/util1.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/beta/src/util2.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/beta/src/util3.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/beta/tsconfig.json +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/index.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/meta.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_00.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_01.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_02.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_03.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_04.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_05.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_06.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_07.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_08.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_09.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_10.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_11.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_12.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_13.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_14.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_15.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_16.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_17.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_18.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_19.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_20.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_21.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_22.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_23.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_24.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_25.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_26.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_27.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_28.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_29.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_30.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_31.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_32.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_33.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_34.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_35.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_36.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_37.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_38.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_39.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_40.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_41.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_42.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_43.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_44.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_45.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_46.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_47.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_48.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_49.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_50.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_51.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_52.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_53.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_54.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_55.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_56.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_57.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_58.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/src/modules/module_59.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/bulk/tsconfig.json +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/gamma/src/index.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/gamma/src/util1.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/gamma/src/util2.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/gamma/src/util3.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/incremental-bench/packages/gamma/tsconfig.json +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/__tests__/fixtureOnly.spec.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/app/handler.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/config.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/consumer.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/dead.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/domain/i18n/en.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/domain/i18n/index.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/domain/i18n/useLocale.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/domain/labels/index.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/events/streamTypes.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/gateway/index.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/helper.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/hooks/useHookA.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/hooks/useHookB.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/hooks/useItems.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/index.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/integrations/inferenceClient.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/lib/handler.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/loaders/useInference.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/models/MutationAggregate.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/pages/panelPage.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/rules/applyRule.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/types/a.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/types/b.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/ui/Button.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/ui/LazyPanel.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/ui/buttonConsumer.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/ui/menuModule.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/user.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/widget.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/src/widgets/OrphanWidget.ts +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/fixtures/typescript-project/tsconfig.json +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/incremental_equivalence.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/perf_util.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_analyze_graph.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_analyze_perf.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_bench_queries.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_composability.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_config.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_document_upsert.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_e2e_perf.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_git_delta.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_incremental_shards.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_index_batching.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_index_performance.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_index_prune.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_indexer_env.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_merge.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_metadata.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_multi_symbol.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_pure_functions.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_qualified_symbols.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_scip_tool.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_shard_files.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_source_discovery.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_sql.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_symbols_freq.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_targets.py +0 -0
- {scip_cli-3.0.0 → scip_cli-3.2.0}/tests/test_tsconfig.py +0 -0
- {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
|
|
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
|
|
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.
|
|
@@ -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
|
|
51
|
+
# Install pre-commit hook (same command as CI — no pre-push hook)
|
|
52
52
|
pre-commit install
|
|
53
53
|
|
|
54
|
-
|
|
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.
|
|
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
|
|
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
|
-
-
|
|
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
|
|
115
|
+
Same indexing steps as Option A; this only avoids the first-run download/build:
|
|
113
116
|
|
|
114
117
|
```bash
|
|
115
|
-
# TypeScript/JavaScript indexer
|
|
116
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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/
|
|
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
|
|
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
|
|
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**|
|
|
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
|
|
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
|
-
-
|
|
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
|
|
94
|
+
Same indexing steps as Option A; this only avoids the first-run download/build:
|
|
92
95
|
|
|
93
96
|
```bash
|
|
94
|
-
# TypeScript/JavaScript indexer
|
|
95
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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/
|
|
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
|
|
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
|
|
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**|
|
|
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
|