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