spectra-cli 4.1.1 → 4.3.0
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.
- package/README.md +12 -5
- package/dist/.spectra-build-meta.json +9 -0
- package/dist/adapters/go-adapter.d.ts.map +1 -1
- package/dist/adapters/go-adapter.js +2 -0
- package/dist/adapters/go-adapter.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/java-adapter.d.ts.map +1 -1
- package/dist/adapters/java-adapter.js +2 -0
- package/dist/adapters/java-adapter.js.map +1 -1
- package/dist/adapters/language-adapter.d.ts +42 -9
- package/dist/adapters/language-adapter.d.ts.map +1 -1
- package/dist/adapters/python-adapter.d.ts +34 -6
- package/dist/adapters/python-adapter.d.ts.map +1 -1
- package/dist/adapters/python-adapter.js +168 -61
- package/dist/adapters/python-adapter.js.map +1 -1
- package/dist/adapters/ts-js-adapter.d.ts +13 -5
- package/dist/adapters/ts-js-adapter.d.ts.map +1 -1
- package/dist/adapters/ts-js-adapter.js +55 -14
- package/dist/adapters/ts-js-adapter.js.map +1 -1
- package/dist/batch/batch-orchestrator.d.ts +74 -5
- package/dist/batch/batch-orchestrator.d.ts.map +1 -1
- package/dist/batch/batch-orchestrator.js +583 -70
- package/dist/batch/batch-orchestrator.js.map +1 -1
- package/dist/batch/delta-regenerator.d.ts +2 -2
- package/dist/batch/delta-regenerator.d.ts.map +1 -1
- package/dist/batch/delta-regenerator.js +21 -28
- package/dist/batch/delta-regenerator.js.map +1 -1
- package/dist/batch/module-grouper.d.ts +9 -2
- package/dist/batch/module-grouper.d.ts.map +1 -1
- package/dist/batch/module-grouper.js +3 -1
- package/dist/batch/module-grouper.js.map +1 -1
- package/dist/batch/regen-plan.d.ts +78 -0
- package/dist/batch/regen-plan.d.ts.map +1 -0
- package/dist/batch/regen-plan.js +93 -0
- package/dist/batch/regen-plan.js.map +1 -0
- package/dist/cli/commands/batch.d.ts.map +1 -1
- package/dist/cli/commands/batch.js +36 -8
- package/dist/cli/commands/batch.js.map +1 -1
- package/dist/cli/commands/graph.js +1 -1
- package/dist/cli/commands/graph.js.map +1 -1
- package/dist/cli/commands/index.d.ts +8 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +274 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/query.d.ts.map +1 -1
- package/dist/cli/commands/query.js +3 -1
- package/dist/cli/commands/query.js.map +1 -1
- package/dist/cli/commands/scaffold-kb.d.ts +9 -0
- package/dist/cli/commands/scaffold-kb.d.ts.map +1 -0
- package/dist/cli/commands/scaffold-kb.js +179 -0
- package/dist/cli/commands/scaffold-kb.js.map +1 -0
- package/dist/cli/index.js +33 -14
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/error-handler.d.ts +0 -6
- package/dist/cli/utils/error-handler.d.ts.map +1 -1
- package/dist/cli/utils/error-handler.js +0 -13
- package/dist/cli/utils/error-handler.js.map +1 -1
- package/dist/cli/utils/parse-args.d.ts +55 -3
- package/dist/cli/utils/parse-args.d.ts.map +1 -1
- package/dist/cli/utils/parse-args.js +176 -13
- package/dist/cli/utils/parse-args.js.map +1 -1
- package/dist/cli/version-meta.d.ts +16 -0
- package/dist/cli/version-meta.d.ts.map +1 -0
- package/dist/cli/version-meta.js +28 -0
- package/dist/cli/version-meta.js.map +1 -0
- package/dist/core/ast-analyzer.d.ts.map +1 -1
- package/dist/core/ast-analyzer.js +75 -5
- package/dist/core/ast-analyzer.js.map +1 -1
- package/dist/core/import-resolver.d.ts +93 -0
- package/dist/core/import-resolver.d.ts.map +1 -0
- package/dist/core/import-resolver.js +414 -0
- package/dist/core/import-resolver.js.map +1 -0
- package/dist/core/query-mappers/base-mapper.d.ts +13 -0
- package/dist/core/query-mappers/base-mapper.d.ts.map +1 -1
- package/dist/core/query-mappers/go-mapper.d.ts +68 -0
- package/dist/core/query-mappers/go-mapper.d.ts.map +1 -1
- package/dist/core/query-mappers/go-mapper.js +421 -0
- package/dist/core/query-mappers/go-mapper.js.map +1 -1
- package/dist/core/query-mappers/java-mapper.d.ts +196 -0
- package/dist/core/query-mappers/java-mapper.d.ts.map +1 -1
- package/dist/core/query-mappers/java-mapper.js +600 -0
- package/dist/core/query-mappers/java-mapper.js.map +1 -1
- package/dist/core/query-mappers/python-mapper.d.ts +55 -0
- package/dist/core/query-mappers/python-mapper.d.ts.map +1 -1
- package/dist/core/query-mappers/python-mapper.js +273 -0
- package/dist/core/query-mappers/python-mapper.js.map +1 -1
- package/dist/core/query-mappers/typescript-mapper.d.ts +102 -0
- package/dist/core/query-mappers/typescript-mapper.d.ts.map +1 -1
- package/dist/core/query-mappers/typescript-mapper.js +470 -0
- package/dist/core/query-mappers/typescript-mapper.js.map +1 -1
- package/dist/core/single-spec-orchestrator.d.ts +21 -0
- package/dist/core/single-spec-orchestrator.d.ts.map +1 -1
- package/dist/core/single-spec-orchestrator.js +187 -23
- package/dist/core/single-spec-orchestrator.js.map +1 -1
- package/dist/core/skeleton-hash.d.ts +33 -0
- package/dist/core/skeleton-hash.d.ts.map +1 -0
- package/dist/core/skeleton-hash.js +76 -0
- package/dist/core/skeleton-hash.js.map +1 -0
- package/dist/core/tree-sitter-analyzer.d.ts +7 -0
- package/dist/core/tree-sitter-analyzer.d.ts.map +1 -1
- package/dist/core/tree-sitter-analyzer.js +32 -1
- package/dist/core/tree-sitter-analyzer.js.map +1 -1
- package/dist/core/tree-sitter-fallback.d.ts +12 -4
- package/dist/core/tree-sitter-fallback.d.ts.map +1 -1
- package/dist/core/tree-sitter-fallback.js +160 -12
- package/dist/core/tree-sitter-fallback.js.map +1 -1
- package/dist/extraction/extraction-types.d.ts +25 -25
- package/dist/extraction/image-extractor.d.ts.map +1 -1
- package/dist/extraction/image-extractor.js +3 -1
- package/dist/extraction/image-extractor.js.map +1 -1
- package/dist/extraction/markdown-extractor.d.ts.map +1 -1
- package/dist/extraction/markdown-extractor.js +3 -1
- package/dist/extraction/markdown-extractor.js.map +1 -1
- package/dist/generator/frontmatter.d.ts +5 -0
- package/dist/generator/frontmatter.d.ts.map +1 -1
- package/dist/generator/frontmatter.js +4 -0
- package/dist/generator/frontmatter.js.map +1 -1
- package/dist/generator/index-generator.d.ts +3 -3
- package/dist/generator/index-generator.d.ts.map +1 -1
- package/dist/generator/index-generator.js +1 -1
- package/dist/generator/index-generator.js.map +1 -1
- package/dist/graph/directory-graph.d.ts +14 -4
- package/dist/graph/directory-graph.d.ts.map +1 -1
- package/dist/graph/directory-graph.js +71 -128
- package/dist/graph/directory-graph.js.map +1 -1
- package/dist/graph/mermaid-renderer.d.ts +8 -5
- package/dist/graph/mermaid-renderer.d.ts.map +1 -1
- package/dist/graph/mermaid-renderer.js +3 -3
- package/dist/graph/mermaid-renderer.js.map +1 -1
- package/dist/graph/topological-sort.d.ts +13 -6
- package/dist/graph/topological-sort.d.ts.map +1 -1
- package/dist/graph/topological-sort.js +2 -2
- package/dist/graph/topological-sort.js.map +1 -1
- package/dist/kb-mcp/index.d.ts +14 -0
- package/dist/kb-mcp/index.d.ts.map +1 -0
- package/dist/kb-mcp/index.js +24 -0
- package/dist/kb-mcp/index.js.map +1 -0
- package/dist/kb-mcp/lib/kb-error.d.ts +21 -0
- package/dist/kb-mcp/lib/kb-error.d.ts.map +1 -0
- package/dist/kb-mcp/lib/kb-error.js +28 -0
- package/dist/kb-mcp/lib/kb-error.js.map +1 -0
- package/dist/kb-mcp/lib/kb-locator.d.ts +58 -0
- package/dist/kb-mcp/lib/kb-locator.d.ts.map +1 -0
- package/dist/kb-mcp/lib/kb-locator.js +85 -0
- package/dist/kb-mcp/lib/kb-locator.js.map +1 -0
- package/dist/kb-mcp/lib/result-merger.d.ts +35 -0
- package/dist/kb-mcp/lib/result-merger.d.ts.map +1 -0
- package/dist/kb-mcp/lib/result-merger.js +64 -0
- package/dist/kb-mcp/lib/result-merger.js.map +1 -0
- package/dist/kb-mcp/server.d.ts +12 -0
- package/dist/kb-mcp/server.d.ts.map +1 -0
- package/dist/kb-mcp/server.js +29 -0
- package/dist/kb-mcp/server.js.map +1 -0
- package/dist/kb-mcp/tools/kb-api-lookup.d.ts +28 -0
- package/dist/kb-mcp/tools/kb-api-lookup.d.ts.map +1 -0
- package/dist/kb-mcp/tools/kb-api-lookup.js +237 -0
- package/dist/kb-mcp/tools/kb-api-lookup.js.map +1 -0
- package/dist/kb-mcp/tools/kb-doc-lookup.d.ts +20 -0
- package/dist/kb-mcp/tools/kb-doc-lookup.d.ts.map +1 -0
- package/dist/kb-mcp/tools/kb-doc-lookup.js +92 -0
- package/dist/kb-mcp/tools/kb-doc-lookup.js.map +1 -0
- package/dist/kb-mcp/tools/kb-search.d.ts +23 -0
- package/dist/kb-mcp/tools/kb-search.d.ts.map +1 -0
- package/dist/kb-mcp/tools/kb-search.js +126 -0
- package/dist/kb-mcp/tools/kb-search.js.map +1 -0
- package/dist/knowledge-graph/call-resolver.d.ts +64 -0
- package/dist/knowledge-graph/call-resolver.d.ts.map +1 -0
- package/dist/knowledge-graph/call-resolver.js +323 -0
- package/dist/knowledge-graph/call-resolver.js.map +1 -0
- package/dist/knowledge-graph/import-resolver.d.ts +39 -0
- package/dist/knowledge-graph/import-resolver.d.ts.map +1 -0
- package/dist/knowledge-graph/import-resolver.js +214 -0
- package/dist/knowledge-graph/import-resolver.js.map +1 -0
- package/dist/knowledge-graph/incremental.d.ts +131 -0
- package/dist/knowledge-graph/incremental.d.ts.map +1 -0
- package/dist/knowledge-graph/incremental.js +432 -0
- package/dist/knowledge-graph/incremental.js.map +1 -0
- package/dist/knowledge-graph/index.d.ts +85 -0
- package/dist/knowledge-graph/index.d.ts.map +1 -0
- package/dist/knowledge-graph/index.js +198 -0
- package/dist/knowledge-graph/index.js.map +1 -0
- package/dist/knowledge-graph/module-derivation.d.ts +252 -0
- package/dist/knowledge-graph/module-derivation.d.ts.map +1 -0
- package/dist/knowledge-graph/module-derivation.js +418 -0
- package/dist/knowledge-graph/module-derivation.js.map +1 -0
- package/dist/knowledge-graph/persistence.d.ts +310 -0
- package/dist/knowledge-graph/persistence.d.ts.map +1 -0
- package/dist/knowledge-graph/persistence.js +280 -0
- package/dist/knowledge-graph/persistence.js.map +1 -0
- package/dist/knowledge-graph/query-helpers.d.ts +191 -0
- package/dist/knowledge-graph/query-helpers.d.ts.map +1 -0
- package/dist/knowledge-graph/query-helpers.js +559 -0
- package/dist/knowledge-graph/query-helpers.js.map +1 -0
- package/dist/knowledge-graph/relativize.d.ts +51 -0
- package/dist/knowledge-graph/relativize.d.ts.map +1 -0
- package/dist/knowledge-graph/relativize.js +104 -0
- package/dist/knowledge-graph/relativize.js.map +1 -0
- package/dist/knowledge-graph/unified-graph.d.ts +310 -0
- package/dist/knowledge-graph/unified-graph.d.ts.map +1 -0
- package/dist/knowledge-graph/unified-graph.js +182 -0
- package/dist/knowledge-graph/unified-graph.js.map +1 -0
- package/dist/mcp/agent-context-tools.d.ts +53 -0
- package/dist/mcp/agent-context-tools.d.ts.map +1 -0
- package/dist/mcp/agent-context-tools.js +806 -0
- package/dist/mcp/agent-context-tools.js.map +1 -0
- package/dist/mcp/file-nav-tools.d.ts +42 -0
- package/dist/mcp/file-nav-tools.d.ts.map +1 -0
- package/dist/mcp/file-nav-tools.js +318 -0
- package/dist/mcp/file-nav-tools.js.map +1 -0
- package/dist/mcp/graph-tools.d.ts +22 -0
- package/dist/mcp/graph-tools.d.ts.map +1 -1
- package/dist/mcp/graph-tools.js +204 -133
- package/dist/mcp/graph-tools.js.map +1 -1
- package/dist/mcp/lib/file-nav-helpers.d.ts +128 -0
- package/dist/mcp/lib/file-nav-helpers.d.ts.map +1 -0
- package/dist/mcp/lib/file-nav-helpers.js +305 -0
- package/dist/mcp/lib/file-nav-helpers.js.map +1 -0
- package/dist/mcp/lib/response-helpers.d.ts +67 -0
- package/dist/mcp/lib/response-helpers.d.ts.map +1 -0
- package/dist/mcp/lib/response-helpers.js +103 -0
- package/dist/mcp/lib/response-helpers.js.map +1 -0
- package/dist/mcp/lib/telemetry.d.ts +69 -0
- package/dist/mcp/lib/telemetry.d.ts.map +1 -0
- package/dist/mcp/lib/telemetry.js +113 -0
- package/dist/mcp/lib/telemetry.js.map +1 -0
- package/dist/mcp/lib/tool-response.d.ts +46 -0
- package/dist/mcp/lib/tool-response.d.ts.map +1 -0
- package/dist/mcp/lib/tool-response.js +83 -0
- package/dist/mcp/lib/tool-response.js.map +1 -0
- package/dist/mcp/server.d.ts +14 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +216 -158
- package/dist/mcp/server.js.map +1 -1
- package/dist/models/call-site.d.ts +68 -0
- package/dist/models/call-site.d.ts.map +1 -0
- package/dist/models/call-site.js +60 -0
- package/dist/models/call-site.js.map +1 -0
- package/dist/models/code-skeleton.d.ts +80 -6
- package/dist/models/code-skeleton.d.ts.map +1 -1
- package/dist/models/code-skeleton.js +30 -0
- package/dist/models/code-skeleton.js.map +1 -1
- package/dist/models/drift-item.d.ts +4 -4
- package/dist/models/module-spec.d.ts +173 -94
- package/dist/models/module-spec.d.ts.map +1 -1
- package/dist/models/module-spec.js +6 -0
- package/dist/models/module-spec.js.map +1 -1
- package/dist/panoramic/adr-decision-pipeline.d.ts +53 -0
- package/dist/panoramic/adr-decision-pipeline.d.ts.map +1 -0
- package/dist/panoramic/adr-decision-pipeline.js +685 -0
- package/dist/panoramic/adr-decision-pipeline.js.map +1 -0
- package/dist/panoramic/api-surface-generator.d.ts +56 -0
- package/dist/panoramic/api-surface-generator.d.ts.map +1 -0
- package/dist/panoramic/api-surface-generator.js +1671 -0
- package/dist/panoramic/api-surface-generator.js.map +1 -0
- package/dist/panoramic/architecture-ir-builder.d.ts +19 -0
- package/dist/panoramic/architecture-ir-builder.d.ts.map +1 -0
- package/dist/panoramic/architecture-ir-builder.js +561 -0
- package/dist/panoramic/architecture-ir-builder.js.map +1 -0
- package/dist/panoramic/architecture-ir-exporters.d.ts +7 -0
- package/dist/panoramic/architecture-ir-exporters.d.ts.map +1 -0
- package/dist/panoramic/architecture-ir-exporters.js +183 -0
- package/dist/panoramic/architecture-ir-exporters.js.map +1 -0
- package/dist/panoramic/architecture-ir-generator.d.ts +36 -0
- package/dist/panoramic/architecture-ir-generator.d.ts.map +1 -0
- package/dist/panoramic/architecture-ir-generator.js +51 -0
- package/dist/panoramic/architecture-ir-generator.js.map +1 -0
- package/dist/panoramic/architecture-ir-mermaid-adapter.d.ts +6 -0
- package/dist/panoramic/architecture-ir-mermaid-adapter.d.ts.map +1 -0
- package/dist/panoramic/architecture-ir-mermaid-adapter.js +98 -0
- package/dist/panoramic/architecture-ir-mermaid-adapter.js.map +1 -0
- package/dist/panoramic/architecture-ir-model.d.ts +87 -0
- package/dist/panoramic/architecture-ir-model.d.ts.map +1 -0
- package/dist/panoramic/architecture-ir-model.js +20 -0
- package/dist/panoramic/architecture-ir-model.js.map +1 -0
- package/dist/panoramic/architecture-narrative.d.ts +68 -0
- package/dist/panoramic/architecture-narrative.d.ts.map +1 -0
- package/dist/panoramic/architecture-narrative.js +401 -0
- package/dist/panoramic/architecture-narrative.js.map +1 -0
- package/dist/panoramic/architecture-overview-generator.d.ts +31 -0
- package/dist/panoramic/architecture-overview-generator.d.ts.map +1 -0
- package/dist/panoramic/architecture-overview-generator.js +454 -0
- package/dist/panoramic/architecture-overview-generator.js.map +1 -0
- package/dist/panoramic/architecture-overview-model.d.ts +77 -0
- package/dist/panoramic/architecture-overview-model.d.ts.map +1 -0
- package/dist/panoramic/architecture-overview-model.js +31 -0
- package/dist/panoramic/architecture-overview-model.js.map +1 -0
- package/dist/panoramic/batch-project-docs.d.ts.map +1 -1
- package/dist/panoramic/batch-project-docs.js +4 -2
- package/dist/panoramic/batch-project-docs.js.map +1 -1
- package/dist/panoramic/builders/component-view-builder.d.ts +25 -1
- package/dist/panoramic/builders/component-view-builder.d.ts.map +1 -1
- package/dist/panoramic/builders/component-view-builder.js +83 -3
- package/dist/panoramic/builders/component-view-builder.js.map +1 -1
- package/dist/panoramic/builders/doc-graph-builder.d.ts +15 -2
- package/dist/panoramic/builders/doc-graph-builder.d.ts.map +1 -1
- package/dist/panoramic/builders/doc-graph-builder.js +20 -0
- package/dist/panoramic/builders/doc-graph-builder.js.map +1 -1
- package/dist/panoramic/component-view-builder.d.ts +17 -0
- package/dist/panoramic/component-view-builder.d.ts.map +1 -0
- package/dist/panoramic/component-view-builder.js +652 -0
- package/dist/panoramic/component-view-builder.js.map +1 -0
- package/dist/panoramic/component-view-model.d.ts +127 -0
- package/dist/panoramic/component-view-model.d.ts.map +1 -0
- package/dist/panoramic/component-view-model.js +65 -0
- package/dist/panoramic/component-view-model.js.map +1 -0
- package/dist/panoramic/config-reference-generator.d.ts +78 -0
- package/dist/panoramic/config-reference-generator.d.ts.map +1 -0
- package/dist/panoramic/config-reference-generator.js +199 -0
- package/dist/panoramic/config-reference-generator.js.map +1 -0
- package/dist/panoramic/coverage-auditor.d.ts +95 -0
- package/dist/panoramic/coverage-auditor.d.ts.map +1 -0
- package/dist/panoramic/coverage-auditor.js +290 -0
- package/dist/panoramic/coverage-auditor.js.map +1 -0
- package/dist/panoramic/cross-package-analyzer.d.ts +112 -0
- package/dist/panoramic/cross-package-analyzer.d.ts.map +1 -0
- package/dist/panoramic/cross-package-analyzer.js +258 -0
- package/dist/panoramic/cross-package-analyzer.js.map +1 -0
- package/dist/panoramic/data-model-generator.d.ts +528 -0
- package/dist/panoramic/data-model-generator.d.ts.map +1 -0
- package/dist/panoramic/data-model-generator.js +647 -0
- package/dist/panoramic/data-model-generator.js.map +1 -0
- package/dist/panoramic/doc-graph-builder.d.ts +80 -0
- package/dist/panoramic/doc-graph-builder.d.ts.map +1 -0
- package/dist/panoramic/doc-graph-builder.js +352 -0
- package/dist/panoramic/doc-graph-builder.js.map +1 -0
- package/dist/panoramic/docs-bundle-manifest-reader.d.ts +26 -0
- package/dist/panoramic/docs-bundle-manifest-reader.d.ts.map +1 -0
- package/dist/panoramic/docs-bundle-manifest-reader.js +106 -0
- package/dist/panoramic/docs-bundle-manifest-reader.js.map +1 -0
- package/dist/panoramic/docs-bundle-orchestrator.d.ts +14 -0
- package/dist/panoramic/docs-bundle-orchestrator.d.ts.map +1 -0
- package/dist/panoramic/docs-bundle-orchestrator.js +538 -0
- package/dist/panoramic/docs-bundle-orchestrator.js.map +1 -0
- package/dist/panoramic/docs-bundle-profiles.d.ts +4 -0
- package/dist/panoramic/docs-bundle-profiles.d.ts.map +1 -0
- package/dist/panoramic/docs-bundle-profiles.js +82 -0
- package/dist/panoramic/docs-bundle-profiles.js.map +1 -0
- package/dist/panoramic/docs-bundle-types.d.ts +94 -0
- package/dist/panoramic/docs-bundle-types.d.ts.map +1 -0
- package/dist/panoramic/docs-bundle-types.js +10 -0
- package/dist/panoramic/docs-bundle-types.js.map +1 -0
- package/dist/panoramic/docs-quality-evaluator.d.ts +31 -0
- package/dist/panoramic/docs-quality-evaluator.d.ts.map +1 -0
- package/dist/panoramic/docs-quality-evaluator.js +941 -0
- package/dist/panoramic/docs-quality-evaluator.js.map +1 -0
- package/dist/panoramic/docs-quality-model.d.ts +125 -0
- package/dist/panoramic/docs-quality-model.d.ts.map +1 -0
- package/dist/panoramic/docs-quality-model.js +166 -0
- package/dist/panoramic/docs-quality-model.js.map +1 -0
- package/dist/panoramic/dynamic-scenarios-builder.d.ts +18 -0
- package/dist/panoramic/dynamic-scenarios-builder.d.ts.map +1 -0
- package/dist/panoramic/dynamic-scenarios-builder.js +316 -0
- package/dist/panoramic/dynamic-scenarios-builder.js.map +1 -0
- package/dist/panoramic/event-surface-generator.d.ts +52 -0
- package/dist/panoramic/event-surface-generator.d.ts.map +1 -0
- package/dist/panoramic/event-surface-generator.js +507 -0
- package/dist/panoramic/event-surface-generator.js.map +1 -0
- package/dist/panoramic/generator-registry.d.ts +1 -1
- package/dist/panoramic/generator-registry.d.ts.map +1 -1
- package/dist/panoramic/generator-registry.js +5 -2
- package/dist/panoramic/generator-registry.js.map +1 -1
- package/dist/panoramic/generators/cross-package-analyzer.d.ts +5 -5
- package/dist/panoramic/generators/cross-package-analyzer.d.ts.map +1 -1
- package/dist/panoramic/generators/cross-package-analyzer.js +1 -1
- package/dist/panoramic/generators/cross-package-analyzer.js.map +1 -1
- package/dist/panoramic/generators/data-model-generator.d.ts +27 -27
- package/dist/panoramic/graph/confidence-mapper.d.ts +18 -0
- package/dist/panoramic/graph/confidence-mapper.d.ts.map +1 -1
- package/dist/panoramic/graph/confidence-mapper.js +26 -0
- package/dist/panoramic/graph/confidence-mapper.js.map +1 -1
- package/dist/panoramic/graph/graph-builder.d.ts +72 -2
- package/dist/panoramic/graph/graph-builder.d.ts.map +1 -1
- package/dist/panoramic/graph/graph-builder.js +330 -46
- package/dist/panoramic/graph/graph-builder.js.map +1 -1
- package/dist/panoramic/graph/graph-paths.d.ts +8 -0
- package/dist/panoramic/graph/graph-paths.d.ts.map +1 -1
- package/dist/panoramic/graph/graph-paths.js +10 -0
- package/dist/panoramic/graph/graph-paths.js.map +1 -1
- package/dist/panoramic/graph/graph-query.d.ts +49 -2
- package/dist/panoramic/graph/graph-query.d.ts.map +1 -1
- package/dist/panoramic/graph/graph-query.js +117 -19
- package/dist/panoramic/graph/graph-query.js.map +1 -1
- package/dist/panoramic/graph/graph-types.d.ts +32 -3
- package/dist/panoramic/graph/graph-types.d.ts.map +1 -1
- package/dist/panoramic/graph/index.d.ts +2 -1
- package/dist/panoramic/graph/index.d.ts.map +1 -1
- package/dist/panoramic/graph/index.js +1 -1
- package/dist/panoramic/graph/index.js.map +1 -1
- package/dist/panoramic/hyperedges/schema.d.ts +6 -6
- package/dist/panoramic/interface-surface-generator.d.ts +50 -0
- package/dist/panoramic/interface-surface-generator.d.ts.map +1 -0
- package/dist/panoramic/interface-surface-generator.js +388 -0
- package/dist/panoramic/interface-surface-generator.js.map +1 -0
- package/dist/panoramic/interfaces.d.ts +2 -2
- package/dist/panoramic/mock-readme-generator.d.ts +90 -0
- package/dist/panoramic/mock-readme-generator.d.ts.map +1 -0
- package/dist/panoramic/mock-readme-generator.js +111 -0
- package/dist/panoramic/mock-readme-generator.js.map +1 -0
- package/dist/panoramic/models/component-view-model.d.ts +1 -1
- package/dist/panoramic/models/component-view-model.d.ts.map +1 -1
- package/dist/panoramic/models/component-view-model.js.map +1 -1
- package/dist/panoramic/narrative-provenance-adapter.d.ts +8 -0
- package/dist/panoramic/narrative-provenance-adapter.d.ts.map +1 -0
- package/dist/panoramic/narrative-provenance-adapter.js +99 -0
- package/dist/panoramic/narrative-provenance-adapter.js.map +1 -0
- package/dist/panoramic/parser-registry.d.ts +1 -1
- package/dist/panoramic/parser-registry.js +1 -1
- package/dist/panoramic/parsers/types.d.ts +6 -6
- package/dist/panoramic/pattern-hints-generator.d.ts +28 -0
- package/dist/panoramic/pattern-hints-generator.d.ts.map +1 -0
- package/dist/panoramic/pattern-hints-generator.js +218 -0
- package/dist/panoramic/pattern-hints-generator.js.map +1 -0
- package/dist/panoramic/pattern-hints-model.d.ts +89 -0
- package/dist/panoramic/pattern-hints-model.d.ts.map +1 -0
- package/dist/panoramic/pattern-hints-model.js +61 -0
- package/dist/panoramic/pattern-hints-model.js.map +1 -0
- package/dist/panoramic/pattern-knowledge-base.d.ts +31 -0
- package/dist/panoramic/pattern-knowledge-base.d.ts.map +1 -0
- package/dist/panoramic/pattern-knowledge-base.js +407 -0
- package/dist/panoramic/pattern-knowledge-base.js.map +1 -0
- package/dist/panoramic/pipelines/adr-evidence-verifier.d.ts.map +1 -1
- package/dist/panoramic/pipelines/adr-evidence-verifier.js +1 -29
- package/dist/panoramic/pipelines/adr-evidence-verifier.js.map +1 -1
- package/dist/panoramic/pipelines/coverage-auditor.d.ts.map +1 -1
- package/dist/panoramic/pipelines/coverage-auditor.js +4 -2
- package/dist/panoramic/pipelines/coverage-auditor.js.map +1 -1
- package/dist/panoramic/pipelines/docs-bundle-orchestrator.js +13 -6
- package/dist/panoramic/pipelines/docs-bundle-orchestrator.js.map +1 -1
- package/dist/panoramic/pipelines/product-ux-docs.d.ts +5 -0
- package/dist/panoramic/pipelines/product-ux-docs.d.ts.map +1 -1
- package/dist/panoramic/pipelines/product-ux-docs.js +34 -6
- package/dist/panoramic/pipelines/product-ux-docs.js.map +1 -1
- package/dist/panoramic/product-ux-docs.d.ts +104 -0
- package/dist/panoramic/product-ux-docs.d.ts.map +1 -0
- package/dist/panoramic/product-ux-docs.js +817 -0
- package/dist/panoramic/product-ux-docs.js.map +1 -0
- package/dist/panoramic/qa/__tests__/citation.test.d.ts +2 -0
- package/dist/panoramic/qa/__tests__/citation.test.d.ts.map +1 -0
- package/dist/panoramic/qa/__tests__/citation.test.js +193 -0
- package/dist/panoramic/qa/__tests__/citation.test.js.map +1 -0
- package/dist/panoramic/qa/__tests__/debt-context.test.d.ts +2 -0
- package/dist/panoramic/qa/__tests__/debt-context.test.d.ts.map +1 -0
- package/dist/panoramic/qa/__tests__/debt-context.test.js +154 -0
- package/dist/panoramic/qa/__tests__/debt-context.test.js.map +1 -0
- package/dist/panoramic/qa/__tests__/graph-retriever.test.d.ts +2 -0
- package/dist/panoramic/qa/__tests__/graph-retriever.test.d.ts.map +1 -0
- package/dist/panoramic/qa/__tests__/graph-retriever.test.js +148 -0
- package/dist/panoramic/qa/__tests__/graph-retriever.test.js.map +1 -0
- package/dist/panoramic/qa/__tests__/index.test.d.ts +2 -0
- package/dist/panoramic/qa/__tests__/index.test.d.ts.map +1 -0
- package/dist/panoramic/qa/__tests__/index.test.js +246 -0
- package/dist/panoramic/qa/__tests__/index.test.js.map +1 -0
- package/dist/panoramic/qa/__tests__/llm-caller.test.d.ts +2 -0
- package/dist/panoramic/qa/__tests__/llm-caller.test.d.ts.map +1 -0
- package/dist/panoramic/qa/__tests__/llm-caller.test.js +168 -0
- package/dist/panoramic/qa/__tests__/llm-caller.test.js.map +1 -0
- package/dist/panoramic/qa/__tests__/prompt-builder.test.d.ts +2 -0
- package/dist/panoramic/qa/__tests__/prompt-builder.test.d.ts.map +1 -0
- package/dist/panoramic/qa/__tests__/prompt-builder.test.js +150 -0
- package/dist/panoramic/qa/__tests__/prompt-builder.test.js.map +1 -0
- package/dist/panoramic/qa/__tests__/qa-integration.test.d.ts +2 -0
- package/dist/panoramic/qa/__tests__/qa-integration.test.d.ts.map +1 -0
- package/dist/panoramic/qa/__tests__/qa-integration.test.js +296 -0
- package/dist/panoramic/qa/__tests__/qa-integration.test.js.map +1 -0
- package/dist/panoramic/qa/__tests__/rag-reranker.test.d.ts +2 -0
- package/dist/panoramic/qa/__tests__/rag-reranker.test.d.ts.map +1 -0
- package/dist/panoramic/qa/__tests__/rag-reranker.test.js +136 -0
- package/dist/panoramic/qa/__tests__/rag-reranker.test.js.map +1 -0
- package/dist/panoramic/qa/index.d.ts.map +1 -1
- package/dist/panoramic/qa/index.js +10 -3
- package/dist/panoramic/qa/index.js.map +1 -1
- package/dist/panoramic/query.d.ts +1 -0
- package/dist/panoramic/query.d.ts.map +1 -1
- package/dist/panoramic/query.js +5 -0
- package/dist/panoramic/query.js.map +1 -1
- package/dist/panoramic/runtime-topology-generator.d.ts +77 -0
- package/dist/panoramic/runtime-topology-generator.d.ts.map +1 -0
- package/dist/panoramic/runtime-topology-generator.js +676 -0
- package/dist/panoramic/runtime-topology-generator.js.map +1 -0
- package/dist/panoramic/runtime-topology-model.d.ts +145 -0
- package/dist/panoramic/runtime-topology-model.d.ts.map +1 -0
- package/dist/panoramic/runtime-topology-model.js +300 -0
- package/dist/panoramic/runtime-topology-model.js.map +1 -0
- package/dist/panoramic/troubleshooting-generator.d.ts +51 -0
- package/dist/panoramic/troubleshooting-generator.d.ts.map +1 -0
- package/dist/panoramic/troubleshooting-generator.js +451 -0
- package/dist/panoramic/troubleshooting-generator.js.map +1 -0
- package/dist/panoramic/utils/text-segmenter.d.ts +15 -0
- package/dist/panoramic/utils/text-segmenter.d.ts.map +1 -1
- package/dist/panoramic/utils/text-segmenter.js +38 -0
- package/dist/panoramic/utils/text-segmenter.js.map +1 -1
- package/dist/panoramic/workspace-index-generator.d.ts +148 -0
- package/dist/panoramic/workspace-index-generator.d.ts.map +1 -0
- package/dist/panoramic/workspace-index-generator.js +497 -0
- package/dist/panoramic/workspace-index-generator.js.map +1 -0
- package/dist/runtime-bootstrap.d.ts +9 -0
- package/dist/runtime-bootstrap.d.ts.map +1 -0
- package/dist/runtime-bootstrap.js +33 -0
- package/dist/runtime-bootstrap.js.map +1 -0
- package/dist/scaffold-kb/api-entities-serializer.d.ts +12 -0
- package/dist/scaffold-kb/api-entities-serializer.d.ts.map +1 -0
- package/dist/scaffold-kb/api-entities-serializer.js +144 -0
- package/dist/scaffold-kb/api-entities-serializer.js.map +1 -0
- package/dist/scaffold-kb/arbitration.d.ts +44 -0
- package/dist/scaffold-kb/arbitration.d.ts.map +1 -0
- package/dist/scaffold-kb/arbitration.js +144 -0
- package/dist/scaffold-kb/arbitration.js.map +1 -0
- package/dist/scaffold-kb/chunk-splitter.d.ts +20 -0
- package/dist/scaffold-kb/chunk-splitter.d.ts.map +1 -0
- package/dist/scaffold-kb/chunk-splitter.js +309 -0
- package/dist/scaffold-kb/chunk-splitter.js.map +1 -0
- package/dist/scaffold-kb/doc-graph-builder.d.ts +26 -0
- package/dist/scaffold-kb/doc-graph-builder.d.ts.map +1 -0
- package/dist/scaffold-kb/doc-graph-builder.js +72 -0
- package/dist/scaffold-kb/doc-graph-builder.js.map +1 -0
- package/dist/scaffold-kb/entity-extractor.d.ts +40 -0
- package/dist/scaffold-kb/entity-extractor.d.ts.map +1 -0
- package/dist/scaffold-kb/entity-extractor.js +0 -0
- package/dist/scaffold-kb/entity-extractor.js.map +1 -0
- package/dist/scaffold-kb/entity-heuristic.d.ts +14 -0
- package/dist/scaffold-kb/entity-heuristic.d.ts.map +1 -0
- package/dist/scaffold-kb/entity-heuristic.js +107 -0
- package/dist/scaffold-kb/entity-heuristic.js.map +1 -0
- package/dist/scaffold-kb/entity-matcher.d.ts +20 -0
- package/dist/scaffold-kb/entity-matcher.d.ts.map +1 -0
- package/dist/scaffold-kb/entity-matcher.js +53 -0
- package/dist/scaffold-kb/entity-matcher.js.map +1 -0
- package/dist/scaffold-kb/entity-util.d.ts +11 -0
- package/dist/scaffold-kb/entity-util.d.ts.map +1 -0
- package/dist/scaffold-kb/entity-util.js +23 -0
- package/dist/scaffold-kb/entity-util.js.map +1 -0
- package/dist/scaffold-kb/evidence-envelope.d.ts +17 -0
- package/dist/scaffold-kb/evidence-envelope.d.ts.map +1 -0
- package/dist/scaffold-kb/evidence-envelope.js +32 -0
- package/dist/scaffold-kb/evidence-envelope.js.map +1 -0
- package/dist/scaffold-kb/index.d.ts +20 -0
- package/dist/scaffold-kb/index.d.ts.map +1 -0
- package/dist/scaffold-kb/index.js +102 -0
- package/dist/scaffold-kb/index.js.map +1 -0
- package/dist/scaffold-kb/ingest/ingest-core.d.ts +47 -0
- package/dist/scaffold-kb/ingest/ingest-core.d.ts.map +1 -0
- package/dist/scaffold-kb/ingest/ingest-core.js +231 -0
- package/dist/scaffold-kb/ingest/ingest-core.js.map +1 -0
- package/dist/scaffold-kb/ingest/office-parser.d.ts +33 -0
- package/dist/scaffold-kb/ingest/office-parser.d.ts.map +1 -0
- package/dist/scaffold-kb/ingest/office-parser.js +187 -0
- package/dist/scaffold-kb/ingest/office-parser.js.map +1 -0
- package/dist/scaffold-kb/ingest/url-fetcher.d.ts +43 -0
- package/dist/scaffold-kb/ingest/url-fetcher.d.ts.map +1 -0
- package/dist/scaffold-kb/ingest/url-fetcher.js +245 -0
- package/dist/scaffold-kb/ingest/url-fetcher.js.map +1 -0
- package/dist/scaffold-kb/ingester.d.ts +38 -0
- package/dist/scaffold-kb/ingester.d.ts.map +1 -0
- package/dist/scaffold-kb/ingester.js +261 -0
- package/dist/scaffold-kb/ingester.js.map +1 -0
- package/dist/scaffold-kb/injection-format.d.ts +25 -0
- package/dist/scaffold-kb/injection-format.d.ts.map +1 -0
- package/dist/scaffold-kb/injection-format.js +55 -0
- package/dist/scaffold-kb/injection-format.js.map +1 -0
- package/dist/scaffold-kb/kb-writer.d.ts +13 -0
- package/dist/scaffold-kb/kb-writer.d.ts.map +1 -0
- package/dist/scaffold-kb/kb-writer.js +69 -0
- package/dist/scaffold-kb/kb-writer.js.map +1 -0
- package/dist/scaffold-kb/keyword-extract.d.ts +16 -0
- package/dist/scaffold-kb/keyword-extract.d.ts.map +1 -0
- package/dist/scaffold-kb/keyword-extract.js +49 -0
- package/dist/scaffold-kb/keyword-extract.js.map +1 -0
- package/dist/scaffold-kb/query-sanitizer.d.ts +28 -0
- package/dist/scaffold-kb/query-sanitizer.d.ts.map +1 -0
- package/dist/scaffold-kb/query-sanitizer.js +38 -0
- package/dist/scaffold-kb/query-sanitizer.js.map +1 -0
- package/dist/scaffold-kb/recall-eval.d.ts +48 -0
- package/dist/scaffold-kb/recall-eval.d.ts.map +1 -0
- package/dist/scaffold-kb/recall-eval.js +55 -0
- package/dist/scaffold-kb/recall-eval.js.map +1 -0
- package/dist/scaffold-kb/schema-compat.d.ts +22 -0
- package/dist/scaffold-kb/schema-compat.d.ts.map +1 -0
- package/dist/scaffold-kb/schema-compat.js +32 -0
- package/dist/scaffold-kb/schema-compat.js.map +1 -0
- package/dist/scaffold-kb/search-core.d.ts +42 -0
- package/dist/scaffold-kb/search-core.d.ts.map +1 -0
- package/dist/scaffold-kb/search-core.js +89 -0
- package/dist/scaffold-kb/search-core.js.map +1 -0
- package/dist/scaffold-kb/sqlite-engine.d.ts +58 -0
- package/dist/scaffold-kb/sqlite-engine.d.ts.map +1 -0
- package/dist/scaffold-kb/sqlite-engine.js +61 -0
- package/dist/scaffold-kb/sqlite-engine.js.map +1 -0
- package/dist/scaffold-kb/sqlite-writer.d.ts +18 -0
- package/dist/scaffold-kb/sqlite-writer.d.ts.map +1 -0
- package/dist/scaffold-kb/sqlite-writer.js +76 -0
- package/dist/scaffold-kb/sqlite-writer.js.map +1 -0
- package/dist/scaffold-kb/tokenizer.d.ts +26 -0
- package/dist/scaffold-kb/tokenizer.d.ts.map +1 -0
- package/dist/scaffold-kb/tokenizer.js +97 -0
- package/dist/scaffold-kb/tokenizer.js.map +1 -0
- package/dist/scaffold-kb/types.d.ts +157 -0
- package/dist/scaffold-kb/types.d.ts.map +1 -0
- package/dist/scaffold-kb/types.js +5 -0
- package/dist/scaffold-kb/types.js.map +1 -0
- package/dist/utils/file-scanner.d.ts +15 -0
- package/dist/utils/file-scanner.d.ts.map +1 -1
- package/dist/utils/file-scanner.js +18 -1
- package/dist/utils/file-scanner.js.map +1 -1
- package/dist/utils/string-distance.d.ts +20 -0
- package/dist/utils/string-distance.d.ts.map +1 -0
- package/dist/utils/string-distance.js +38 -0
- package/dist/utils/string-distance.js.map +1 -0
- package/package.json +22 -3
- package/plugins/demo-kb-en/.claude-plugin/plugin.json +11 -0
- package/plugins/demo-kb-en/.mcp.json +8 -0
- package/plugins/demo-kb-en/FIXTURE.json +23 -0
- package/plugins/demo-kb-en/FIXTURE.md +53 -0
- package/plugins/demo-kb-en/ingest-samples/meeting-notes.md +13 -0
- package/plugins/demo-kb-en/kb/api-entities.json +3445 -0
- package/plugins/demo-kb-en/kb/chunks.sqlite +0 -0
- package/plugins/demo-kb-en/kb/doc-graph.json +113 -0
- package/plugins/demo-kb-zh/.claude-plugin/plugin.json +11 -0
- package/plugins/demo-kb-zh/.mcp.json +8 -0
- package/plugins/demo-kb-zh/FIXTURE.json +23 -0
- package/plugins/demo-kb-zh/FIXTURE.md +63 -0
- package/plugins/demo-kb-zh/ingest-samples/meeting-notes.md +13 -0
- package/plugins/demo-kb-zh/kb/api-entities.json +990 -0
- package/plugins/demo-kb-zh/kb/chunks.sqlite +0 -0
- package/plugins/demo-kb-zh/kb/doc-graph.json +113 -0
- package/plugins/spec-driver/.claude-plugin/plugin.json +1 -1
- package/plugins/spec-driver/README.md +50 -1
- package/plugins/spec-driver/agents/implement.md +20 -1
- package/plugins/spec-driver/agents/plan.md +20 -1
- package/plugins/spec-driver/agents/quality-review.md +20 -1
- package/plugins/spec-driver/agents/spec-review.md +20 -1
- package/plugins/spec-driver/agents/verify.md +108 -1
- package/plugins/spec-driver/config/orchestration.yaml +39 -31
- package/plugins/spec-driver/contracts/orchestration-overrides-contract.yaml +27 -0
- package/plugins/spec-driver/contracts/orchestration-schema.mjs +272 -227
- package/plugins/spec-driver/contracts/wrapper-source-of-truth.yaml +3 -0
- package/plugins/spec-driver/docs/customization.md +134 -0
- package/plugins/spec-driver/docs/spectra-mcp-integration.md +165 -0
- package/plugins/spec-driver/hooks/hooks.json +9 -0
- package/plugins/spec-driver/hooks/stop-fix-compliance-check.sh +36 -0
- package/plugins/spec-driver/lib/delegation-contract.mjs +84 -0
- package/plugins/spec-driver/lib/orchestration-resolver.mjs +49 -0
- package/plugins/spec-driver/lib/orchestrator.mjs +29 -1
- package/plugins/spec-driver/lib/preference-rules.mjs +96 -0
- package/plugins/spec-driver/scripts/codex-skills.sh +28 -28
- package/plugins/spec-driver/scripts/dev/spike-fix-compliance-e2e.mjs +130 -0
- package/plugins/spec-driver/scripts/fix-compliance-judge.mjs +415 -0
- package/plugins/spec-driver/scripts/generate-adoption-insights.mjs +48 -1
- package/plugins/spec-driver/scripts/goal-loop-cli.mjs +307 -0
- package/plugins/spec-driver/scripts/init-project.sh +56 -0
- package/plugins/spec-driver/scripts/kb-prequery.mjs +125 -0
- package/plugins/spec-driver/scripts/lib/config-schema.mjs +200 -94
- package/plugins/spec-driver/scripts/lib/ensure-gitignore.sh +277 -0
- package/plugins/spec-driver/scripts/lib/extract-wrapper-body.mjs +136 -0
- package/plugins/spec-driver/scripts/lib/fix-compliance-core.mjs +434 -0
- package/plugins/spec-driver/scripts/lib/fix-compliance-io.mjs +335 -0
- package/plugins/spec-driver/scripts/lib/goal-loop-core.mjs +783 -0
- package/plugins/spec-driver/scripts/lib/init-project-output.sh +28 -0
- package/plugins/spec-driver/scripts/lib/load-zod.mjs +62 -0
- package/plugins/spec-driver/scripts/lib/project-profile-resolver.mjs +141 -49
- package/plugins/spec-driver/scripts/lib/project-profile-schema.mjs +88 -54
- package/plugins/spec-driver/scripts/postinstall.sh +13 -1
- package/plugins/spec-driver/scripts/record-workflow-run.mjs +75 -0
- package/plugins/spec-driver/scripts/sync-delegation-contract.mjs +187 -0
- package/plugins/spec-driver/scripts/sync-preference-rules.mjs +148 -0
- package/plugins/spec-driver/scripts/validate-orchestrator-models.mjs +156 -0
- package/plugins/spec-driver/scripts/validate-wrapper-sources.mjs +46 -1
- package/plugins/spec-driver/skills/spec-driver-feature/SKILL.md +302 -0
- package/plugins/spec-driver/skills/spec-driver-fix/SKILL.md +97 -8
- package/plugins/spec-driver/skills/spec-driver-implement/SKILL.md +18 -0
- package/plugins/spec-driver/skills/spec-driver-refactor/SKILL.md +10 -0
- package/plugins/spec-driver/skills/spec-driver-resume/SKILL.md +12 -1
- package/plugins/spec-driver/skills/spec-driver-story/SKILL.md +30 -0
- package/plugins/spec-driver/templates/delegation-contract.md +27 -0
- package/plugins/spec-driver/templates/goal-loop-override-template.yaml +284 -0
- package/plugins/spec-driver/templates/preference-rules.md +39 -0
- package/plugins/spec-driver/templates/specify-base/project-context-template.yaml +10 -0
- package/plugins/spectra/.claude-plugin/plugin.json +1 -1
- package/plugins/spectra/README.md +48 -1
- package/plugins/spectra/hooks/post-commit.sh +40 -0
- package/templates/module-spec.hbs +1 -0
- package/templates/product-overview.hbs +1 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<!-- spec-driver:section:badges -->
|
|
4
4
|

|
|
5
5
|

|
|
6
|
-

|
|
7
7
|

|
|
8
8
|

|
|
9
9
|
<!-- spec-driver:section:badges:end -->
|
|
@@ -53,6 +53,12 @@
|
|
|
53
53
|
| **M-100** Spectra Evolution | ✅ Delivered | reverse-spec → Spectra rebrand · panoramic Phase 1(多语言索引、跨包依赖、LLM 语义增强、多格式输出) | [blueprint](specs/M-100-spectra-evolution/blueprint.md) |
|
|
54
54
|
| **M-101** Phase 2 — Reading Platform | ✅ Delivered | Graph schema v2.0 + Hyperedges · LLM cost transparency · SpecStore + sourceKind · TODO/Open Questions extraction · Natural language Q&A + interactive `graph.html` · Default model upgrade to Sonnet 4.6 / Opus 4.7 1M | [blueprint](specs/M-101-phase2-reading-platform/blueprint.md) · [postmortem](specs/M-101-phase2-reading-platform/postmortem.md) |
|
|
55
55
|
| **M-102 / M-103** Phase 3 | 🟡 In Progress | Python AST function-level graph (v4.1) · E2E fixture infrastructure · large-project baseline · LLM concurrency optimizer | [proposal](specs/M-102-phase3/proposal.md) |
|
|
56
|
+
| **M7** Spectra MCP Productization | ✅ Delivered | 17 MCP tools(统一 `{code}` 响应契约 + 全工具 telemetry)· file navigation + symbol fuzzy match · batch 默认增量 + byte-stable graph.json · 44 stdio E2E · spec-driver 4.2.1(委派硬约束)· SWE-Bench Verified 5-cohort 评测 | [milestone](docs/design/milestone-M7-spectra-mcp-productization.md) · [评测报告](specs/147-competitor-evaluation-platform/PUBLISH-REPORT-M7.md) |
|
|
57
|
+
| **M8** Trust Repair + Drift Flagship | ✅ Delivered | 增量缓存正确性(混合大小写/混语言)· MCP 触发率工程 · 委派契约全 skill 单源化(F185)· FAIL_TO_PASS 评测 oracle(评测设施 v2)· `batch --mode graph-only`(纯 AST·零 LLM 建图)· `spectra --version` build 元数据 · **领域知识脚手架** `scaffold-kb` + KB MCP(doc-graph + FTS5 双层联查)· AST-anchored spec drift 原型(spec + prototype) | [milestone](docs/design/milestone-M8-trust-repair-and-drift-flagship.md) |
|
|
58
|
+
|
|
59
|
+
> **M8 note** — Spectra release contract is bumped to **4.3.0** (F186: build-stamped `--version`, wrapper sha256 gate); the npm `spectra-cli` publish of 4.3.0 is staged pending explicit authorization. The M7 eval re-judge on the new FAIL_TO_PASS oracle is wired and ready to run.
|
|
60
|
+
|
|
61
|
+
> **Honest benchmark note (M7, 2026-06)** — We ran a 150-run SWE-Bench Verified comparison (bare Claude Code vs Spec Driver vs Spec Driver + Spectra MCP vs SuperPowers vs GStack). After correcting a one-sided oracle bias (the fuzzy-match scorer penalized frameworks for writing tests — see [report §4.5](specs/147-competitor-evaluation-platform/PUBLISH-REPORT-M7.md)), **all five cohorts tie on completion rate** within N=30 noise. Two honest signals: structured workflows cost **4-12× more tokens with no completion gain on single-file fixes**, and Spectra MCP's real gap is *adoption, not quality* — runs that actually called the MCP tools passed at 43% vs 12% for those that didn't, with the heaviest MCP usage producing the strongest single fix in the dataset. M8 targets exactly these: trigger-rate engineering + a real FAIL_TO_PASS execution oracle.
|
|
56
62
|
|
|
57
63
|
## Quick Start
|
|
58
64
|
|
|
@@ -75,7 +81,7 @@ spectra batch --mode reading --html # ~2-5 min for typical project
|
|
|
75
81
|
/spec-driver:spec-driver-feature Add OAuth2 login flow
|
|
76
82
|
```
|
|
77
83
|
|
|
78
|
-
After step 4, AI coding assistants (Claude Code, Cursor, Codex with MCP) can query your codebase architecture via
|
|
84
|
+
After step 4, AI coding assistants (Claude Code, Cursor, Codex with MCP) can query your codebase architecture via **17 MCP tools** (6 graph queries + 3 agent-context + 3 file-navigation + 5 pipeline) — **see [How AI Coding Assistants Use Spectra](#-how-ai-coding-assistants-use-spectra) below**.
|
|
79
85
|
|
|
80
86
|
---
|
|
81
87
|
|
|
@@ -89,10 +95,10 @@ A hybrid AST + LLM pipeline that reverse-engineers source code into structured S
|
|
|
89
95
|
|
|
90
96
|
- 📝 **9-section module specs** — AST-extracted intent / interface / data / dependencies / quality / lifecycle / etc. (TS/JS interface 100% AST-extracted)
|
|
91
97
|
- 🌐 **Knowledge graph schema v2.0** — `references` / `conceptually_related_to` / `rationale_for` edges + multi-node hyperedges
|
|
92
|
-
- 🔍 **
|
|
98
|
+
- 🔍 **17 MCP tools** — graph queries (community / god-nodes / hyperedges / path) + agent context (impact / context / detect_changes with unified `{code}` error contract + per-call telemetry) + file navigation (token-efficient line-range reads, symbol fuzzy match) + pipeline (prepare / generate / batch / diff / panoramic-query)
|
|
93
99
|
- 📊 **Interactive `graph.html`** — D3-force visualization with hyperedge convex hulls (self-contained, no server)
|
|
94
100
|
- 💰 **LLM cost transparency** — `--dry-run` cost preview + `--budget N` enforcement + `tokenUsage` in every spec frontmatter
|
|
95
|
-
- ⚡ **Lightweight modes** — `--mode reading` (skip product docs) / `--mode code-only` (skip
|
|
101
|
+
- ⚡ **Lightweight modes** — `--mode reading` (skip product docs) / `--mode code-only` (skip enrichment, still per-module spec-gen LLM) / `--mode graph-only` (pure AST, zero LLM, no auth)
|
|
96
102
|
- 🚧 **Technical debt extraction** — TODO/FIXME/HACK code comments + design-doc Open Questions
|
|
97
103
|
- 🔄 **Continuous sync** — `spectra watch` (file watcher) or `spectra install` (post-commit hook)
|
|
98
104
|
- 🌍 **Multi-language** — TS/JS (ts-morph) + Python (AST + tree-sitter) + Go/Java/Rust (tree-sitter)
|
|
@@ -163,7 +169,7 @@ This is **AI-for-AI architecture memory**: the AI never has to re-read your code
|
|
|
163
169
|
- **Token economics** — Querying a 50K-token graph instead of re-reading 500K LOC saves 90%+ tokens per session
|
|
164
170
|
- **Cross-session memory** — `_meta/graph.json` persists between Claude Code sessions; AI can ask "what changed since last time?"
|
|
165
171
|
- **Multi-IDE compatible** — Same MCP server works for Claude Code, Cursor, Codex, Aider, OpenCode, etc.
|
|
166
|
-
- **Hook-driven freshness** — `spectra install` registers a post-commit hook that incrementally rebuilds the graph; AI always queries the latest
|
|
172
|
+
- **Hook-driven freshness** — `spectra install --git` registers a post-commit hook that incrementally rebuilds the graph; AI always queries the latest
|
|
167
173
|
|
|
168
174
|
#### Trigger via auto-injection (PreToolUse hook)
|
|
169
175
|
|
|
@@ -318,6 +324,7 @@ Notes:
|
|
|
318
324
|
## Documentation
|
|
319
325
|
|
|
320
326
|
- 📘 **[Spectra CLI Reference](docs/spectra-cli-reference.md)** — full command list, knowledge graph workflows, architecture pipeline diagram
|
|
327
|
+
- 📚 **[Domain Knowledge Scaffold Guide](docs/scaffold-kb-guide.md)** — build a vendor doc KB (`scaffold-kb`), ship it as a plugin, query via KB MCP tools
|
|
321
328
|
- 🎼 **[Spec Driver Modes](docs/spec-driver-modes.md)** — 8 modes detailed, sub-agents, generated artifacts, quality gates
|
|
322
329
|
- ⚙️ **[Configuration](docs/configuration.md)** — model presets (`spec-driver.config.yaml`) + project-level orchestration overrides (`.specify/orchestration-overrides.yaml`)
|
|
323
330
|
- 🏛️ **[Repository Architecture](docs/repository-architecture.md)** — `src/` layout, tech stack, testing, sync contracts
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"commit": "4d1fb050e7dd1f585a3aa7f95c138bcf5b2d5cb6",
|
|
3
|
+
"dirty": true,
|
|
4
|
+
"sourceDirty": false,
|
|
5
|
+
"distSha256": "96551a712ad01d1ae5870418faa7a4567137424d48453ea61407d4ada3dc9cc8",
|
|
6
|
+
"distFileCount": 342,
|
|
7
|
+
"builtAtIso": "2026-07-19T03:58:42.612Z",
|
|
8
|
+
"note": "F176 版本门禁凭据;勿手改。distSha256 绑定 dist 内容;sourceDirty 只看 build 输入。"
|
|
9
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"go-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/go-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACb,MAAM,uBAAuB,CAAC;AAI/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,qBAAa,iBAAkB,YAAW,eAAe;IACvD,QAAQ,CAAC,EAAE,QAAQ;IAEnB,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAU;IAEjD,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAoB;IAE5D,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAE5C;IAEH;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"go-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/go-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACb,MAAM,uBAAuB,CAAC;AAI/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,qBAAa,iBAAkB,YAAW,eAAe;IACvD,QAAQ,CAAC,EAAE,QAAQ;IAEnB,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAU;IAEjD,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAoB;IAE5D,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAE5C;IAEH;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,YAAY,CAAC;IASxB;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAI9D;;OAEG;IACH,cAAc,IAAI,mBAAmB;IAWrC;;OAEG;IACH,eAAe,IAAI,YAAY;IAO/B;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAMlE"}
|
|
@@ -15,6 +15,8 @@ export class GoLanguageAdapter {
|
|
|
15
15
|
const analyzer = TreeSitterAnalyzer.getInstance();
|
|
16
16
|
return analyzer.analyze(filePath, 'go', {
|
|
17
17
|
includePrivate: options?.includePrivate,
|
|
18
|
+
// Feature 153 — 透传 extractCallSites flag(与 PythonLanguageAdapter 行为一致)
|
|
19
|
+
extractCallSites: options?.extractCallSites,
|
|
18
20
|
});
|
|
19
21
|
}
|
|
20
22
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"go-adapter.js","sourceRoot":"","sources":["../../src/adapters/go-adapter.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAGnF,MAAM,OAAO,iBAAiB;IACnB,EAAE,GAAG,IAAI,CAAC;IAEV,SAAS,GAAwB,CAAC,IAAI,CAAC,CAAC;IAExC,UAAU,GAAwB,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAEnD,iBAAiB,GAAwB,IAAI,GAAG,CAAC;QACxD,QAAQ;KACT,CAAC,CAAC;IAEH;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,QAAgB,EAChB,OAA4B;QAE5B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;QAClD,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE;YACtC,cAAc,EAAE,OAAO,EAAE,cAAc;
|
|
1
|
+
{"version":3,"file":"go-adapter.js","sourceRoot":"","sources":["../../src/adapters/go-adapter.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAGnF,MAAM,OAAO,iBAAiB;IACnB,EAAE,GAAG,IAAI,CAAC;IAEV,SAAS,GAAwB,CAAC,IAAI,CAAC,CAAC;IAExC,UAAU,GAAwB,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAEnD,iBAAiB,GAAwB,IAAI,GAAG,CAAC;QACxD,QAAQ;KACT,CAAC,CAAC;IAEH;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,QAAgB,EAChB,OAA4B;QAE5B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;QAClD,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE;YACtC,cAAc,EAAE,OAAO,EAAE,cAAc;YACvC,uEAAuE;YACvE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB;SAC5C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO;YACL,iBAAiB,EAAE,IAAI;YACvB,aAAa,EAAE,0BAA0B;YACzC,aAAa,EAAE,kBAAkB;YACjC,qBAAqB,EAAE,yBAAyB;YAChD,gBAAgB,EAAE,qCAAqC;YACvD,YAAY,EAAE,qCAAqC;SACpD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO;YACL,WAAW,EAAE,eAAe;YAC5B,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,OAAO,6BAA6B,CAAC,QAAQ,EAAE;YAC7C,WAAW,EAAE,IAAI;YACjB,gBAAgB,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export type { LanguageAdapter } from './language-adapter.js';
|
|
|
6
6
|
export type { LanguageTerminology } from './language-adapter.js';
|
|
7
7
|
export type { TestPatterns } from './language-adapter.js';
|
|
8
8
|
export type { AnalyzeFileOptions } from './language-adapter.js';
|
|
9
|
-
export type {
|
|
9
|
+
export type { ModuleGraphOptions } from './language-adapter.js';
|
|
10
10
|
export { LanguageAdapterRegistry } from './language-adapter-registry.js';
|
|
11
11
|
export { TsJsLanguageAdapter } from './ts-js-adapter.js';
|
|
12
12
|
export { PythonLanguageAdapter } from './python-adapter.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAGzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAYxD;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAYxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"java-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/java-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACb,MAAM,uBAAuB,CAAC;AAI/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,qBAAa,mBAAoB,YAAW,eAAe;IACzD,QAAQ,CAAC,EAAE,UAAU;IAErB,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAY;IAEnD,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAsB;IAE9D,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAQ5C;IAEH;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"java-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/java-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACb,MAAM,uBAAuB,CAAC;AAI/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,qBAAa,mBAAoB,YAAW,eAAe;IACzD,QAAQ,CAAC,EAAE,UAAU;IAErB,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAY;IAEnD,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAsB;IAE9D,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAQ5C;IAEH;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,YAAY,CAAC;IASxB;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAI9D;;OAEG;IACH,cAAc,IAAI,mBAAmB;IAWrC;;OAEG;IACH,eAAe,IAAI,YAAY;IAO/B;;;OAGG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAMlE"}
|
|
@@ -21,6 +21,8 @@ export class JavaLanguageAdapter {
|
|
|
21
21
|
const analyzer = TreeSitterAnalyzer.getInstance();
|
|
22
22
|
return analyzer.analyze(filePath, 'java', {
|
|
23
23
|
includePrivate: options?.includePrivate,
|
|
24
|
+
// Feature 154 — 透传 extractCallSites flag(与 python-adapter.ts 对齐,CL-05 默认 false)
|
|
25
|
+
extractCallSites: options?.extractCallSites,
|
|
24
26
|
});
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"java-adapter.js","sourceRoot":"","sources":["../../src/adapters/java-adapter.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAGnF,MAAM,OAAO,mBAAmB;IACrB,EAAE,GAAG,MAAM,CAAC;IAEZ,SAAS,GAAwB,CAAC,MAAM,CAAC,CAAC;IAE1C,UAAU,GAAwB,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAErD,iBAAiB,GAAwB,IAAI,GAAG,CAAC;QACxD,QAAQ,EAAI,QAAQ;QACpB,OAAO,EAAK,SAAS;QACrB,KAAK,EAAO,gBAAgB;QAC5B,SAAS,EAAG,YAAY;QACxB,OAAO,EAAK,cAAc;QAC1B,WAAW,EAAE,aAAa;QAC1B,MAAM,EAAM,gBAAgB;KAC7B,CAAC,CAAC;IAEH;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,QAAgB,EAChB,OAA4B;QAE5B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;QAClD,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE;YACxC,cAAc,EAAE,OAAO,EAAE,cAAc;
|
|
1
|
+
{"version":3,"file":"java-adapter.js","sourceRoot":"","sources":["../../src/adapters/java-adapter.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAGnF,MAAM,OAAO,mBAAmB;IACrB,EAAE,GAAG,MAAM,CAAC;IAEZ,SAAS,GAAwB,CAAC,MAAM,CAAC,CAAC;IAE1C,UAAU,GAAwB,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAErD,iBAAiB,GAAwB,IAAI,GAAG,CAAC;QACxD,QAAQ,EAAI,QAAQ;QACpB,OAAO,EAAK,SAAS;QACrB,KAAK,EAAO,gBAAgB;QAC5B,SAAS,EAAG,YAAY;QACxB,OAAO,EAAK,cAAc;QAC1B,WAAW,EAAE,aAAa;QAC1B,MAAM,EAAM,gBAAgB;KAC7B,CAAC,CAAC;IAEH;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,QAAgB,EAChB,OAA4B;QAE5B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;QAClD,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE;YACxC,cAAc,EAAE,OAAO,EAAE,cAAc;YACvC,gFAAgF;YAChF,gBAAgB,EAAE,OAAO,EAAE,gBAAgB;SAC5C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO;YACL,iBAAiB,EAAE,MAAM;YACzB,aAAa,EAAE,+BAA+B;YAC9C,aAAa,EAAE,gCAAgC;YAC/C,qBAAqB,EAAE,mBAAmB;YAC1C,gBAAgB,EAAE,yDAAyD;YAC3E,YAAY,EAAE,sCAAsC;SACrD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO;YACL,WAAW,EAAE,sCAAsC;YACnD,QAAQ,EAAE,CAAC,eAAe,CAAC;SAC5B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,OAAO,6BAA6B,CAAC,QAAQ,EAAE;YAC7C,WAAW,EAAE,MAAM;YACnB,gBAAgB,EAAE,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 语言适配器接口定义
|
|
3
3
|
* 定义一种编程语言支持所需的全部能力契约:文件分析、降级分析、
|
|
4
|
-
*
|
|
4
|
+
* 模块图构建(可选)、术语映射、测试文件模式。
|
|
5
|
+
*
|
|
6
|
+
* Feature 156 W1.4:模块图统一使用 ModuleGraph
|
|
7
|
+
* (UnifiedGraph 派生视图,src/knowledge-graph/module-derivation.ts)。
|
|
5
8
|
*/
|
|
6
9
|
import type { CodeSkeleton, Language } from '../models/code-skeleton.js';
|
|
7
|
-
import type {
|
|
10
|
+
import type { ModuleGraph } from '../knowledge-graph/module-derivation.js';
|
|
8
11
|
import type { CommentRegion } from '../debt-scanner/types.js';
|
|
12
|
+
import type { TsConfigResolutionContext } from '../core/import-resolver.js';
|
|
9
13
|
export type { CommentRegion };
|
|
10
14
|
/**
|
|
11
15
|
* 文件分析选项
|
|
@@ -15,11 +19,37 @@ export interface AnalyzeFileOptions {
|
|
|
15
19
|
includePrivate?: boolean;
|
|
16
20
|
/** 类继承层级最大解析深度(默认 5) */
|
|
17
21
|
maxDepth?: number;
|
|
22
|
+
/**
|
|
23
|
+
* 抽取函数调用点(Feature 151 + CL-05),默认 false。
|
|
24
|
+
*
|
|
25
|
+
* 设计动机:抽 callSites 会增加 AST 遍历开销(NFR-1 性能),
|
|
26
|
+
* spec drift check / 单文件分析等无 graph 需求的场景不需要 callSites,保持默认 false。
|
|
27
|
+
* panoramic 流水线(batch-orchestrator / batch-project-docs / coverage-auditor)
|
|
28
|
+
* 必须显式传 true 才能让 graph.json 含 calls 边。
|
|
29
|
+
*/
|
|
30
|
+
extractCallSites?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* 项目根目录绝对路径(Feature 156 W1.0 新增,FR-28)。
|
|
33
|
+
*
|
|
34
|
+
* 用于 import-resolver 解析 tsconfig path alias 与跨包相对路径。
|
|
35
|
+
* 缺失时仍可解析相对路径(fallback 用 path.dirname(filePath) 作 base),
|
|
36
|
+
* 但 alias 会失效。
|
|
37
|
+
*/
|
|
38
|
+
projectRoot?: string;
|
|
39
|
+
/**
|
|
40
|
+
* tsconfig 解析上下文(Feature 181 收口:统一替代历史 pathAliases + baseUrl 双字段)。
|
|
41
|
+
*
|
|
42
|
+
* 由 import-resolver.findNearestTsConfig + buildTsConfigContext 生成,承载
|
|
43
|
+
* tsconfig.compilerOptions 的 baseUrl + paths(含 extends 链),交由
|
|
44
|
+
* 单一权威 import-resolver.resolveTsJsImport 解析 alias / baseUrl。
|
|
45
|
+
* 缺失时仍可解析相对路径,但 alias / baseUrl 会失效。
|
|
46
|
+
*/
|
|
47
|
+
tsConfigContext?: TsConfigResolutionContext | null;
|
|
18
48
|
}
|
|
19
49
|
/**
|
|
20
|
-
*
|
|
50
|
+
* 模块图构建选项(W1.4:ModuleGraphOptions)
|
|
21
51
|
*/
|
|
22
|
-
export interface
|
|
52
|
+
export interface ModuleGraphOptions {
|
|
23
53
|
/** 用于过滤分析文件的 Glob 模式 */
|
|
24
54
|
includeOnly?: string;
|
|
25
55
|
/** 排除模式 */
|
|
@@ -59,7 +89,7 @@ export interface TestPatterns {
|
|
|
59
89
|
/**
|
|
60
90
|
* 语言适配器接口
|
|
61
91
|
* 定义一种编程语言支持所需的全部能力:文件分析、降级分析、
|
|
62
|
-
*
|
|
92
|
+
* 模块图构建(可选)、术语映射、测试文件模式。
|
|
63
93
|
*/
|
|
64
94
|
export interface LanguageAdapter {
|
|
65
95
|
/** 适配器唯一标识(如 'ts-js', 'python', 'go') */
|
|
@@ -94,14 +124,17 @@ export interface LanguageAdapter {
|
|
|
94
124
|
*/
|
|
95
125
|
analyzeFallback(filePath: string): Promise<CodeSkeleton>;
|
|
96
126
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
127
|
+
* 构建项目级模块图(可选能力)
|
|
128
|
+
* 并非所有语言在初始阶段都需要模块图支持。
|
|
129
|
+
*
|
|
130
|
+
* Feature 156 W1.4:所有实现内部统一走 buildUnifiedGraph + deriveModuleGraph
|
|
131
|
+
* 派生路径,不再依赖 dependency-cruiser 等外部工具。
|
|
99
132
|
*
|
|
100
133
|
* @param projectRoot - 项目根目录
|
|
101
134
|
* @param options - 构建选项(可选)
|
|
102
|
-
* @returns
|
|
135
|
+
* @returns ModuleGraph(UnifiedGraph 派生视图)
|
|
103
136
|
*/
|
|
104
|
-
|
|
137
|
+
buildModuleGraph?(projectRoot: string, options?: ModuleGraphOptions): Promise<ModuleGraph>;
|
|
105
138
|
/**
|
|
106
139
|
* 返回该语言的术语映射
|
|
107
140
|
* 用于 LLM prompt 的语言参数化。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/language-adapter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"language-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/language-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAE5E,YAAY,EAAE,aAAa,EAAE,CAAC;AAM9B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;CACpD;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa;IACb,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,cAAc;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc;IACd,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAMD;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IAExC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAEzC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAEhD;;;;;;;OAOG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAEnF;;;;;;OAMG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzD;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,CACf,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,WAAW,CAAC,CAAC;IAExB;;;OAGG;IACH,cAAc,IAAI,mBAAmB,CAAC;IAEtC;;;OAGG;IACH,eAAe,IAAI,YAAY,CAAC;IAEhC;;;;;;;;;OASG;IACH,eAAe,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC9D"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { CodeSkeleton, Language } from '../models/code-skeleton.js';
|
|
2
2
|
import type { ExtractionResult } from '../extraction/extraction-types.js';
|
|
3
|
-
import type { LanguageAdapter, AnalyzeFileOptions,
|
|
4
|
-
import type {
|
|
3
|
+
import type { LanguageAdapter, AnalyzeFileOptions, ModuleGraphOptions, LanguageTerminology, TestPatterns } from './language-adapter.js';
|
|
4
|
+
import type { ModuleGraph } from '../knowledge-graph/module-derivation.js';
|
|
5
5
|
import type { CommentRegion } from '../debt-scanner/types.js';
|
|
6
6
|
export declare class PythonLanguageAdapter implements LanguageAdapter {
|
|
7
7
|
readonly id = "python";
|
|
@@ -35,7 +35,7 @@ export declare class PythonLanguageAdapter implements LanguageAdapter {
|
|
|
35
35
|
* 递归扫描项目根目录下所有 `.py` 文件,排除语言生态常见忽略目录。
|
|
36
36
|
*
|
|
37
37
|
* 复用 `defaultIgnoreDirs` 并叠加 Python 项目惯例(test/tests/dist 等)。
|
|
38
|
-
* 由 `extractSymbolNodes` 与 `
|
|
38
|
+
* 由 `extractSymbolNodes` 与 `buildModuleGraph` 共用,避免 DRY 违反。
|
|
39
39
|
*
|
|
40
40
|
* @throws 当根目录不可读时抛出(调用方按需 try-catch 决定是否吞掉)
|
|
41
41
|
*/
|
|
@@ -53,9 +53,37 @@ export declare class PythonLanguageAdapter implements LanguageAdapter {
|
|
|
53
53
|
*/
|
|
54
54
|
extractSymbolNodes(projectRoot: string): Promise<ExtractionResult[]>;
|
|
55
55
|
/**
|
|
56
|
-
* 构建 Python
|
|
57
|
-
*
|
|
56
|
+
* 构建 Python 项目的模块图(Feature 156 W1.4:UnifiedGraph 派生路径)
|
|
57
|
+
*
|
|
58
|
+
* 流程:
|
|
59
|
+
* 1. 递归扫描所有 .py 文件,排除语言生态忽略目录
|
|
60
|
+
* 2. 解析 Python import → 相对路径(包含 dot-relative + namedImports 展开)
|
|
61
|
+
* 3. 把推断到的 resolvedPath 写回 CodeSkeleton.imports[i]
|
|
62
|
+
* 4. buildModuleGraphFromCodeSkeletons 一站式派生
|
|
63
|
+
*
|
|
64
|
+
* Python import 解析规则:
|
|
65
|
+
* - 绝对模块(`import foo` / `from foo import x`):用 basename map(EC-6 简化策略)
|
|
66
|
+
* - 单点相对(`from . import utils` / `from . import a, b`):
|
|
67
|
+
* * 当 moduleSpecifier === '.':把每个 namedImport 名字 N 当作候选模块,
|
|
68
|
+
* 在当前包目录尝试解析 ./N.py 或 ./N/__init__.py
|
|
69
|
+
* * 多个 named import 都命中时,取第一个命中的(resolvedPath 是单值字段);
|
|
70
|
+
* - 双点相对(`from .. import x`):同理,往上一级查
|
|
71
|
+
* - 带模块名相对(`from .nn import Module`):解析 `.nn` 子模块
|
|
72
|
+
*/
|
|
73
|
+
buildModuleGraph(projectRoot: string, _options?: ModuleGraphOptions): Promise<ModuleGraph>;
|
|
74
|
+
/**
|
|
75
|
+
* 解析单条 Python ImportReference 为 0..N 条带 resolvedPath 的 ImportReference。
|
|
76
|
+
*
|
|
77
|
+
* CRIT-4 v2:处理 dot-relative + namedImports 展开。当 specifier 为纯点号('.'/'..')时,
|
|
78
|
+
* 把 namedImports 每个名字 N 展开为候选 specifier `.N` / `..N`,用相对路径解析每个候选;
|
|
79
|
+
* 任一命中即派生一条 edge(resolvedPath 写回)。
|
|
80
|
+
*
|
|
81
|
+
* 返回 ImportReference 数组:
|
|
82
|
+
* - 命中 0 个候选:返回原 imp(不带 resolvedPath,下游 deriveImportEdges 跳过)
|
|
83
|
+
* - 命中 1 个:返回单元素数组(imp + resolvedPath)
|
|
84
|
+
* - 命中 N 个(仅 dot-relative + multi-named 才会发生):返回 N 元素数组,
|
|
85
|
+
* 每个元素是同一 imp 的副本但 resolvedPath 各异 + namedImports 收窄到对应名字
|
|
58
86
|
*/
|
|
59
|
-
|
|
87
|
+
private resolvePythonImport;
|
|
60
88
|
}
|
|
61
89
|
//# sourceMappingURL=python-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"python-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/python-adapter.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"python-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/python-adapter.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAmB,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAI3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D,qBAAa,qBAAsB,YAAW,eAAe;IAC3D,QAAQ,CAAC,EAAE,YAAY;IAEvB,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAc;IAErD,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAA4B;IAEpE,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAQ5C;IAEH;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,YAAY,CAAC;IASxB;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAI9D;;OAEG;IACH,cAAc,IAAI,mBAAmB;IAWrC;;OAEG;IACH,eAAe,IAAI,YAAY;IAO/B;;;;;OAKG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAOjE;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;IA6BnB;;;;;;;;;;OAUG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IA8E1E;;;;;;;;;;;;;;;;;OAiBG;IACG,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CAAC,WAAW,CAAC;IA6EvB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,mBAAmB;CAyE5B"}
|
|
@@ -11,6 +11,8 @@ import * as fs from 'node:fs';
|
|
|
11
11
|
import { TreeSitterAnalyzer } from '../core/tree-sitter-analyzer.js';
|
|
12
12
|
import { analyzeFallback as treeSitterFallback } from '../core/tree-sitter-fallback.js';
|
|
13
13
|
import { extractCommentsWithTreeSitter } from './tree-sitter-comment-extractor.js';
|
|
14
|
+
import { buildModuleGraphFromCodeSkeletons } from '../knowledge-graph/module-derivation.js';
|
|
15
|
+
import { createGitignoreFilter } from '../utils/file-scanner.js';
|
|
14
16
|
export class PythonLanguageAdapter {
|
|
15
17
|
id = 'python';
|
|
16
18
|
languages = ['python'];
|
|
@@ -31,6 +33,8 @@ export class PythonLanguageAdapter {
|
|
|
31
33
|
const analyzer = TreeSitterAnalyzer.getInstance();
|
|
32
34
|
return analyzer.analyze(filePath, 'python', {
|
|
33
35
|
includePrivate: options?.includePrivate,
|
|
36
|
+
// Feature 151 — 透传 extractCallSites flag(CL-05 默认 false)
|
|
37
|
+
extractCallSites: options?.extractCallSites,
|
|
34
38
|
});
|
|
35
39
|
}
|
|
36
40
|
/**
|
|
@@ -77,7 +81,7 @@ export class PythonLanguageAdapter {
|
|
|
77
81
|
* 递归扫描项目根目录下所有 `.py` 文件,排除语言生态常见忽略目录。
|
|
78
82
|
*
|
|
79
83
|
* 复用 `defaultIgnoreDirs` 并叠加 Python 项目惯例(test/tests/dist 等)。
|
|
80
|
-
* 由 `extractSymbolNodes` 与 `
|
|
84
|
+
* 由 `extractSymbolNodes` 与 `buildModuleGraph` 共用,避免 DRY 违反。
|
|
81
85
|
*
|
|
82
86
|
* @throws 当根目录不可读时抛出(调用方按需 try-catch 决定是否吞掉)
|
|
83
87
|
*/
|
|
@@ -86,16 +90,24 @@ export class PythonLanguageAdapter {
|
|
|
86
90
|
...this.defaultIgnoreDirs,
|
|
87
91
|
'test', 'tests', 'dist', 'node_modules', '.git',
|
|
88
92
|
]);
|
|
93
|
+
// F194:叠加 .gitignore 过滤层(只叠加不替换硬编码集)。
|
|
94
|
+
// 基准 = resolvedRoot(与 file-scanner walkDir 的 path.relative(baseDir, fullPath) 同口径,不做 sep 转换)。
|
|
95
|
+
const isGitignored = createGitignoreFilter(resolvedRoot);
|
|
89
96
|
const pyFiles = [];
|
|
90
97
|
function walk(dir) {
|
|
91
98
|
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
99
|
+
const relPath = path.relative(resolvedRoot, path.join(dir, entry.name));
|
|
92
100
|
if (entry.isDirectory()) {
|
|
93
|
-
|
|
101
|
+
// 目录命中 .gitignore 则剪枝(保留硬编码集与点前缀剪枝不变)
|
|
102
|
+
if (!ignoreNames.has(entry.name) && !entry.name.startsWith('.') && !isGitignored(relPath)) {
|
|
94
103
|
walk(path.join(dir, entry.name));
|
|
95
104
|
}
|
|
96
105
|
}
|
|
97
106
|
else if (entry.isFile() && entry.name.endsWith('.py')) {
|
|
98
|
-
|
|
107
|
+
// 文件命中 .gitignore 则跳过
|
|
108
|
+
if (!isGitignored(relPath)) {
|
|
109
|
+
pyFiles.push(path.join(dir, entry.name));
|
|
110
|
+
}
|
|
99
111
|
}
|
|
100
112
|
}
|
|
101
113
|
}
|
|
@@ -185,76 +197,171 @@ export class PythonLanguageAdapter {
|
|
|
185
197
|
return results;
|
|
186
198
|
}
|
|
187
199
|
/**
|
|
188
|
-
* 构建 Python
|
|
189
|
-
*
|
|
200
|
+
* 构建 Python 项目的模块图(Feature 156 W1.4:UnifiedGraph 派生路径)
|
|
201
|
+
*
|
|
202
|
+
* 流程:
|
|
203
|
+
* 1. 递归扫描所有 .py 文件,排除语言生态忽略目录
|
|
204
|
+
* 2. 解析 Python import → 相对路径(包含 dot-relative + namedImports 展开)
|
|
205
|
+
* 3. 把推断到的 resolvedPath 写回 CodeSkeleton.imports[i]
|
|
206
|
+
* 4. buildModuleGraphFromCodeSkeletons 一站式派生
|
|
207
|
+
*
|
|
208
|
+
* Python import 解析规则:
|
|
209
|
+
* - 绝对模块(`import foo` / `from foo import x`):用 basename map(EC-6 简化策略)
|
|
210
|
+
* - 单点相对(`from . import utils` / `from . import a, b`):
|
|
211
|
+
* * 当 moduleSpecifier === '.':把每个 namedImport 名字 N 当作候选模块,
|
|
212
|
+
* 在当前包目录尝试解析 ./N.py 或 ./N/__init__.py
|
|
213
|
+
* * 多个 named import 都命中时,取第一个命中的(resolvedPath 是单值字段);
|
|
214
|
+
* - 双点相对(`from .. import x`):同理,往上一级查
|
|
215
|
+
* - 带模块名相对(`from .nn import Module`):解析 `.nn` 子模块
|
|
190
216
|
*/
|
|
191
|
-
async
|
|
217
|
+
async buildModuleGraph(projectRoot, _options) {
|
|
192
218
|
const resolvedRoot = path.resolve(projectRoot);
|
|
193
|
-
// 递归扫描所有 .py
|
|
219
|
+
// 递归扫描所有 .py 文件
|
|
194
220
|
const pyFiles = this.scanPyFiles(resolvedRoot);
|
|
195
|
-
// 构建模块名 →
|
|
221
|
+
// 构建模块名 → 相对路径映射(绝对 import 用)
|
|
196
222
|
const pyModuleMap = new Map();
|
|
197
|
-
|
|
198
|
-
|
|
223
|
+
const relPyFiles = [];
|
|
224
|
+
const relPySet = new Set();
|
|
225
|
+
for (const absF of pyFiles) {
|
|
226
|
+
const rel = path.relative(resolvedRoot, absF).split(path.sep).join('/');
|
|
227
|
+
relPyFiles.push(rel);
|
|
228
|
+
relPySet.add(rel);
|
|
229
|
+
pyModuleMap.set(path.basename(absF, '.py'), rel);
|
|
199
230
|
}
|
|
200
|
-
|
|
201
|
-
const
|
|
202
|
-
for (const
|
|
231
|
+
// 收集 CodeSkeleton(含推断的 resolvedPath),喂给 buildGraphFromCodeSkeletons
|
|
232
|
+
const codeSkeletons = new Map();
|
|
233
|
+
for (const absPath of pyFiles) {
|
|
234
|
+
const relFrom = path.relative(resolvedRoot, absPath).split(path.sep).join('/');
|
|
203
235
|
try {
|
|
204
|
-
const skeleton = await this.analyzeFile(
|
|
205
|
-
const
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
continue;
|
|
212
|
-
const resolvedPath = pyModuleMap.get(topModule);
|
|
213
|
-
if (resolvedPath) {
|
|
214
|
-
const relTo = path.relative(resolvedRoot, resolvedPath);
|
|
215
|
-
nodeSet.add(relTo);
|
|
216
|
-
rawEdges.push({ from: relFrom, to: relTo });
|
|
217
|
-
}
|
|
218
|
-
}
|
|
236
|
+
const skeleton = await this.analyzeFile(absPath);
|
|
237
|
+
const newImports = skeleton.imports.flatMap((imp) => this.resolvePythonImport(imp, relFrom, relPySet, pyModuleMap));
|
|
238
|
+
codeSkeletons.set(relFrom, {
|
|
239
|
+
...skeleton,
|
|
240
|
+
filePath: relFrom,
|
|
241
|
+
imports: newImports,
|
|
242
|
+
});
|
|
219
243
|
}
|
|
220
244
|
catch {
|
|
221
|
-
//
|
|
245
|
+
// WARN-2 修订:解析失败时不注入空 skeleton(loc:1 占位会污染 module 节点 + 跨语言统计)。
|
|
246
|
+
// 改为在 metadata 标 parseError,buildGraphFromCodeSkeletons 之前过滤掉。
|
|
247
|
+
// 仍保留 module 节点的最小占位(让 graph 可见该文件存在),但 imports/exports 必为空。
|
|
248
|
+
codeSkeletons.set(relFrom, {
|
|
249
|
+
filePath: relFrom,
|
|
250
|
+
language: 'python',
|
|
251
|
+
loc: 0,
|
|
252
|
+
exports: [],
|
|
253
|
+
imports: [],
|
|
254
|
+
hash: '0'.repeat(64),
|
|
255
|
+
analyzedAt: new Date().toISOString(),
|
|
256
|
+
parserUsed: 'tree-sitter',
|
|
257
|
+
metadata: { parseError: true },
|
|
258
|
+
});
|
|
222
259
|
}
|
|
223
260
|
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
connectedNodes.add(e.to);
|
|
261
|
+
// 兜底:scan 到的文件但 codeSkeletons 漏掉的(不应该发生),补一个空骨架
|
|
262
|
+
for (const rel of relPyFiles) {
|
|
263
|
+
if (!codeSkeletons.has(rel)) {
|
|
264
|
+
codeSkeletons.set(rel, {
|
|
265
|
+
filePath: rel,
|
|
266
|
+
language: 'python',
|
|
267
|
+
loc: 1,
|
|
268
|
+
exports: [],
|
|
269
|
+
imports: [],
|
|
270
|
+
hash: '0'.repeat(64),
|
|
271
|
+
analyzedAt: new Date().toISOString(),
|
|
272
|
+
parserUsed: 'tree-sitter',
|
|
273
|
+
});
|
|
274
|
+
}
|
|
239
275
|
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
276
|
+
// WARN-2:过滤掉 parseError 的 skeleton 不让它进 buildUnifiedGraph 派生 module 节点
|
|
277
|
+
// —— 但保留一条诊断日志会更好;当前为 silent 跳过(与现有 stderr noise budget 一致)。
|
|
278
|
+
const cleanSkeletons = new Map();
|
|
279
|
+
for (const [k, sk] of codeSkeletons) {
|
|
280
|
+
const md = sk.metadata;
|
|
281
|
+
if (md?.parseError)
|
|
282
|
+
continue;
|
|
283
|
+
cleanSkeletons.set(k, sk);
|
|
284
|
+
}
|
|
285
|
+
return buildModuleGraphFromCodeSkeletons(cleanSkeletons, resolvedRoot, 'python');
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* 解析单条 Python ImportReference 为 0..N 条带 resolvedPath 的 ImportReference。
|
|
289
|
+
*
|
|
290
|
+
* CRIT-4 v2:处理 dot-relative + namedImports 展开。当 specifier 为纯点号('.'/'..')时,
|
|
291
|
+
* 把 namedImports 每个名字 N 展开为候选 specifier `.N` / `..N`,用相对路径解析每个候选;
|
|
292
|
+
* 任一命中即派生一条 edge(resolvedPath 写回)。
|
|
293
|
+
*
|
|
294
|
+
* 返回 ImportReference 数组:
|
|
295
|
+
* - 命中 0 个候选:返回原 imp(不带 resolvedPath,下游 deriveImportEdges 跳过)
|
|
296
|
+
* - 命中 1 个:返回单元素数组(imp + resolvedPath)
|
|
297
|
+
* - 命中 N 个(仅 dot-relative + multi-named 才会发生):返回 N 元素数组,
|
|
298
|
+
* 每个元素是同一 imp 的副本但 resolvedPath 各异 + namedImports 收窄到对应名字
|
|
299
|
+
*/
|
|
300
|
+
resolvePythonImport(imp, fromRel, relPySet, pyModuleMap) {
|
|
301
|
+
const spec = imp.moduleSpecifier;
|
|
302
|
+
const fromDir = path.dirname(fromRel);
|
|
303
|
+
// 工具函数:从一个目录起始,解析 "moduleSegment[/subSegment...]" 为实际 .py 文件
|
|
304
|
+
// 返回相对项目根的路径,未命中返回 null
|
|
305
|
+
const tryResolveAtDir = (baseDir, segments) => {
|
|
306
|
+
const joinedSegs = segments.join('/');
|
|
307
|
+
const candidates = [
|
|
308
|
+
`${baseDir}/${joinedSegs}.py`,
|
|
309
|
+
`${baseDir}/${joinedSegs}/__init__.py`,
|
|
310
|
+
];
|
|
311
|
+
for (const c of candidates) {
|
|
312
|
+
// path.normalize 处理 './a/../b' 这类
|
|
313
|
+
const norm = path.posix.normalize(c.startsWith('/') ? c : `./${c}`).replace(/^\.\//, '');
|
|
314
|
+
if (relPySet.has(norm))
|
|
315
|
+
return norm;
|
|
316
|
+
}
|
|
317
|
+
return null;
|
|
257
318
|
};
|
|
319
|
+
// Case A: 纯点号 specifier('.', '..')—— 必须靠 namedImports 展开
|
|
320
|
+
if (/^\.+$/.test(spec)) {
|
|
321
|
+
const dots = spec.length;
|
|
322
|
+
// dots=1: 当前包;dots=2: 父包;以此类推
|
|
323
|
+
let baseDir = fromDir;
|
|
324
|
+
for (let i = 1; i < dots; i++) {
|
|
325
|
+
baseDir = path.dirname(baseDir) === '.' ? '' : path.dirname(baseDir);
|
|
326
|
+
}
|
|
327
|
+
// 如果没有 namedImports,无法展开 → 保留原 imp
|
|
328
|
+
const named = imp.namedImports ?? [];
|
|
329
|
+
if (named.length === 0)
|
|
330
|
+
return [imp];
|
|
331
|
+
const out = [];
|
|
332
|
+
for (const name of named) {
|
|
333
|
+
const resolved = tryResolveAtDir(baseDir || '.', [name]);
|
|
334
|
+
if (resolved && resolved !== fromRel) {
|
|
335
|
+
out.push({ ...imp, resolvedPath: resolved, namedImports: [name] });
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return out.length > 0 ? out : [imp];
|
|
339
|
+
}
|
|
340
|
+
// Case B: dot-relative + 模块名('.foo' / '..foo.bar')
|
|
341
|
+
const dotRelMatch = /^(\.+)(.*)$/.exec(spec);
|
|
342
|
+
if (dotRelMatch && dotRelMatch[1].length >= 1 && dotRelMatch[2].length > 0) {
|
|
343
|
+
const dots = dotRelMatch[1].length;
|
|
344
|
+
const tail = dotRelMatch[2];
|
|
345
|
+
let baseDir = fromDir;
|
|
346
|
+
for (let i = 1; i < dots; i++) {
|
|
347
|
+
baseDir = path.dirname(baseDir) === '.' ? '' : path.dirname(baseDir);
|
|
348
|
+
}
|
|
349
|
+
const segs = tail.split('.');
|
|
350
|
+
const resolved = tryResolveAtDir(baseDir || '.', segs);
|
|
351
|
+
if (resolved && resolved !== fromRel) {
|
|
352
|
+
return [{ ...imp, resolvedPath: resolved }];
|
|
353
|
+
}
|
|
354
|
+
return [imp];
|
|
355
|
+
}
|
|
356
|
+
// Case C: 绝对 import — 用 basename map(保留原简化策略,EC-6 留给后续 Feature)
|
|
357
|
+
const topModule = spec.split('.')[0];
|
|
358
|
+
if (!topModule)
|
|
359
|
+
return [imp];
|
|
360
|
+
const resolvedRel = pyModuleMap.get(topModule);
|
|
361
|
+
if (resolvedRel && resolvedRel !== fromRel) {
|
|
362
|
+
return [{ ...imp, resolvedPath: resolvedRel }];
|
|
363
|
+
}
|
|
364
|
+
return [imp];
|
|
258
365
|
}
|
|
259
366
|
}
|
|
260
367
|
//# sourceMappingURL=python-adapter.js.map
|