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
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Spec Driver 定制指引(Fork 用户)
|
|
2
|
+
|
|
3
|
+
本文档针对 **fork 了 spectra plugin 并修改 plugin name** 的用户,说明如何调整 spec-driver 的 sub-agent 配置以匹配自定义 namespace。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 背景
|
|
8
|
+
|
|
9
|
+
Spec Driver 的 5 个 sub-agent(`plan` / `implement` / `verify` / `spec-review` / `quality-review`)在 frontmatter 中声明了访问 spectra MCP 工具的 namespace:
|
|
10
|
+
|
|
11
|
+
```yaml
|
|
12
|
+
tools: [..., mcp__plugin_spectra_spectra__context, mcp__plugin_spectra_spectra__impact]
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
这个 namespace 由 Claude Code plugin 系统根据 **plugin name** 自动生成:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
mcp__plugin_{your-plugin-name}_spectra__{tool-name}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
如果你将 spectra fork 并改名,需要批量更新这些 namespace。
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 一键替换指引
|
|
26
|
+
|
|
27
|
+
### 方法 1: sed(macOS / Linux)
|
|
28
|
+
|
|
29
|
+
假设你将 spectra plugin 改名为 `my-spectra-fork`:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# 预览变更(dry-run)
|
|
33
|
+
grep -rn "mcp__plugin_spectra_spectra__" plugins/spec-driver/agents/
|
|
34
|
+
|
|
35
|
+
# 执行替换(macOS)
|
|
36
|
+
find plugins/spec-driver/agents -name "*.md" -exec sed -i '' \
|
|
37
|
+
's/mcp__plugin_spectra_spectra__/mcp__plugin_my-spectra-fork_spectra__/g' {} \;
|
|
38
|
+
|
|
39
|
+
# 执行替换(Linux)
|
|
40
|
+
find plugins/spec-driver/agents -name "*.md" -exec sed -i \
|
|
41
|
+
's/mcp__plugin_spectra_spectra__/mcp__plugin_my-spectra-fork_spectra__/g' {} \;
|
|
42
|
+
|
|
43
|
+
# 验证替换结果
|
|
44
|
+
grep -rn "mcp__plugin_" plugins/spec-driver/agents/
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 方法 2: awk
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
for f in plugins/spec-driver/agents/plan.md \
|
|
51
|
+
plugins/spec-driver/agents/implement.md \
|
|
52
|
+
plugins/spec-driver/agents/verify.md \
|
|
53
|
+
plugins/spec-driver/agents/spec-review.md \
|
|
54
|
+
plugins/spec-driver/agents/quality-review.md; do
|
|
55
|
+
awk '{gsub(/mcp__plugin_spectra_spectra__/, "mcp__plugin_my-spectra-fork_spectra__"); print}' \
|
|
56
|
+
"$f" > "$f.tmp" && mv "$f.tmp" "$f"
|
|
57
|
+
done
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 方法 3: 使用脚本(推荐,可重复运行)
|
|
61
|
+
|
|
62
|
+
创建 `scripts/update-spectra-namespace.sh`:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
#!/usr/bin/env bash
|
|
66
|
+
set -euo pipefail
|
|
67
|
+
|
|
68
|
+
OLD_NAMESPACE="${1:-mcp__plugin_spectra_spectra__}"
|
|
69
|
+
NEW_NAMESPACE="${2:?需要提供新 namespace,例如: mcp__plugin_my-spectra-fork_spectra__}"
|
|
70
|
+
|
|
71
|
+
echo "替换 namespace: $OLD_NAMESPACE → $NEW_NAMESPACE"
|
|
72
|
+
|
|
73
|
+
find plugins/spec-driver/agents -name "*.md" | while read -r f; do
|
|
74
|
+
if grep -q "$OLD_NAMESPACE" "$f"; then
|
|
75
|
+
sed -i '' "s|${OLD_NAMESPACE}|${NEW_NAMESPACE}|g" "$f"
|
|
76
|
+
echo " 已更新: $f"
|
|
77
|
+
fi
|
|
78
|
+
done
|
|
79
|
+
|
|
80
|
+
echo "完成。验证结果:"
|
|
81
|
+
grep -rn "mcp__plugin_" plugins/spec-driver/agents/ | head -20
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
运行:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
chmod +x scripts/update-spectra-namespace.sh
|
|
88
|
+
bash scripts/update-spectra-namespace.sh \
|
|
89
|
+
"mcp__plugin_spectra_spectra__" \
|
|
90
|
+
"mcp__plugin_my-spectra-fork_spectra__"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 受影响的文件清单
|
|
96
|
+
|
|
97
|
+
| 文件 | 需替换的工具 |
|
|
98
|
+
|------|------------|
|
|
99
|
+
| `plugins/spec-driver/agents/plan.md` | `context`, `impact` |
|
|
100
|
+
| `plugins/spec-driver/agents/implement.md` | `context`, `impact` |
|
|
101
|
+
| `plugins/spec-driver/agents/verify.md` | `detect_changes`, `impact` |
|
|
102
|
+
| `plugins/spec-driver/agents/spec-review.md` | `impact`, `context` |
|
|
103
|
+
| `plugins/spec-driver/agents/quality-review.md` | `impact`, `context` |
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 验证替换正确性
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# 1. 不应有旧 namespace 残留
|
|
111
|
+
grep -rn "mcp__plugin_spectra_spectra__" plugins/spec-driver/agents/ && echo "ERROR: 旧 namespace 残留" || echo "✅ 旧 namespace 已清除"
|
|
112
|
+
|
|
113
|
+
# 2. 新 namespace 应存在于所有 5 个文件
|
|
114
|
+
grep -rn "mcp__plugin_my-spectra-fork_spectra__" plugins/spec-driver/agents/ | wc -l
|
|
115
|
+
# 预期: 至少 8 行(5 个文件共 8 个工具声明)
|
|
116
|
+
|
|
117
|
+
# 3. 验证 MCP server 名称不变(server-name 仍是 spectra)
|
|
118
|
+
cat plugins/spectra/.mcp.json 2>/dev/null | grep -i "spectra" || cat plugins/my-spectra-fork/.mcp.json | grep -i "spectra"
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 注意事项
|
|
124
|
+
|
|
125
|
+
- **替换的是 plugin-name 部分**,不是 server-name(`spectra`)。server-name 由 `.mcp.json` 的 server key 决定,若你的 fork 保持 server key 为 `spectra`,则 namespace 中间段仍是 `_spectra__`。
|
|
126
|
+
- 如果同时修改了 server key,需调整替换命令中的 `_spectra__` 部分为你的新 server key。
|
|
127
|
+
- 替换后运行 `npm run repo:check` 确认仓库同步状态正常。
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 相关文档
|
|
132
|
+
|
|
133
|
+
- [Spectra MCP 集成指引](./spectra-mcp-integration.md) — namespace 规则详细说明
|
|
134
|
+
- [Milestone M7 设计文档](../../docs/design/milestone-M7-spectra-mcp-productization.md)
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Spectra MCP 集成指引
|
|
2
|
+
|
|
3
|
+
本文档说明如何将 **Spectra** 和 **Spec Driver** 两个 Claude Code plugin 协同部署,让 spec-driver 的 sub-agent 能够调用 spectra 的 MCP 工具(`impact` / `context` / `detect_changes`)。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 一、为什么需要协同部署
|
|
8
|
+
|
|
9
|
+
Spec Driver 的核心 sub-agent(`plan` / `implement` / `verify` / `spec-review` / `quality-review`)在工作时需要感知代码库的符号依赖关系。这些能力由 Spectra 的 MCP 工具提供:
|
|
10
|
+
|
|
11
|
+
| Spectra MCP 工具 | 用途 |
|
|
12
|
+
|-----------------|------|
|
|
13
|
+
| `mcp__plugin_spectra_spectra__context` | 获取指定符号的 360° 上下文(定义 + 调用方 + 被调用方 + 相关 spec) |
|
|
14
|
+
| `mcp__plugin_spectra_spectra__impact` | blast radius 分析 — 反向 BFS 找受影响的所有符号 |
|
|
15
|
+
| `mcp__plugin_spectra_spectra__detect_changes` | git diff → changedSymbols → impact 链 |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 二、为什么 namespace 是 `mcp__plugin_spectra_spectra__*`
|
|
20
|
+
|
|
21
|
+
Claude Code plugin 系统会根据以下规则自动生成 MCP 工具的命名空间:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
mcp__plugin_{plugin-name}_{mcp-server-name}__{tool-name}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
对于 spectra plugin:
|
|
28
|
+
- **plugin-name**: `spectra`(`plugin.json` 中的 `name` 字段)
|
|
29
|
+
- **mcp-server-name**: `spectra`(`.mcp.json` 中的 server key)
|
|
30
|
+
- **tool-name**: `context` / `impact` / `detect_changes`
|
|
31
|
+
|
|
32
|
+
因此完整 namespace 为 `mcp__plugin_spectra_spectra__context` 等。
|
|
33
|
+
|
|
34
|
+
> **长期 follow-up**: Anthropic 正在讨论 plugin `namespaceStrategy` RFC,未来可能允许插件声明简洁 namespace(如 `mcp__spectra__*`)。RFC 落地后可将 sub-agent frontmatter 改回简洁版本。
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 三、2 步开箱即用部署
|
|
39
|
+
|
|
40
|
+
### Step 1: 安装两个 plugin
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
claude plugin install spectra
|
|
44
|
+
claude plugin install spec-driver
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
或从本仓库本地安装:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
claude plugin install ./plugins/spectra
|
|
51
|
+
claude plugin install ./plugins/spec-driver
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Step 2: 验证安装
|
|
55
|
+
|
|
56
|
+
在 Claude Code 中运行:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
/spec-driver:spec-driver-feature 描述一个简单需求
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
如果 `plan` sub-agent 能够在分析时调用 `mcp__plugin_spectra_spectra__context`,则集成成功。
|
|
63
|
+
|
|
64
|
+
无需任何额外配置——sub-agent 的 frontmatter 已预置正确 plugin namespace。
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 四、故障排查
|
|
69
|
+
|
|
70
|
+
### 问题 1: `plugin:spectra:spectra:failed` 或 MCP server 启动失败
|
|
71
|
+
|
|
72
|
+
**可能原因**:
|
|
73
|
+
- spectra-cli 版本过旧(< 4.2.0),缺少 Feature 155 agent-context tools
|
|
74
|
+
- volta / node 版本不兼容
|
|
75
|
+
|
|
76
|
+
**排查步骤**:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# 检查当前安装版本
|
|
80
|
+
spectra --version
|
|
81
|
+
|
|
82
|
+
# 应为 4.2.0+,否则更新
|
|
83
|
+
npm install -g spectra-cli@latest
|
|
84
|
+
|
|
85
|
+
# 验证 agent-context-tools 已包含
|
|
86
|
+
ls $(npm root -g)/spectra-cli/dist/mcp/agent-context-tools.js
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 问题 2: sub-agent 提示"工具 mcp__plugin_spectra_spectra__context 不可用"
|
|
90
|
+
|
|
91
|
+
**可能原因**:
|
|
92
|
+
1. spectra plugin 未安装 → 执行 Step 1 安装
|
|
93
|
+
2. spectra MCP server 启动失败 → 查看 `claude plugin status spectra`
|
|
94
|
+
3. 当前项目没有 spectra graph 缓存 → 先运行 `spectra run .` 生成 graph
|
|
95
|
+
|
|
96
|
+
**快速验证**:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# 确认 spectra plugin 正常
|
|
100
|
+
claude plugin status spectra
|
|
101
|
+
|
|
102
|
+
# 手动生成 graph(首次使用需要)
|
|
103
|
+
spectra run .
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 问题 3: fork 了 spectra plugin,namespace 不一致
|
|
107
|
+
|
|
108
|
+
如果你 fork 了 spectra plugin 并改名(如 `my-spectra-fork`),sub-agent 需要使用不同的 namespace。
|
|
109
|
+
|
|
110
|
+
详见 [customization.md](./customization.md)。
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 五、验证矩阵
|
|
115
|
+
|
|
116
|
+
| 验证项 | 命令 | 预期结果 |
|
|
117
|
+
|--------|------|----------|
|
|
118
|
+
| spectra 版本 | `spectra --version` | `4.2.0` |
|
|
119
|
+
| agent-context-tools 存在 | `ls $(npm root -g)/spectra-cli/dist/mcp/` | 含 `agent-context-tools.js` |
|
|
120
|
+
| spectra plugin 状态 | `claude plugin status spectra` | `active` |
|
|
121
|
+
| spec-driver sub-agent namespace | grep frontmatter | 含 `mcp__plugin_spectra_spectra__` |
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 七、Driver 偏好引导设计(F170d)
|
|
126
|
+
|
|
127
|
+
### 为什么需要这层引导
|
|
128
|
+
|
|
129
|
+
F170c 实测(host shell N=10×4 轮)发现:driver(Claude Sonnet 4.6)在「评估 symbol 改动影响」类任务上 **0/10 主动调用** spectra `impact`,而是默认 1 Read + 6 Grep。即使把 tool description 升级到 100-500 字 + 4 要素 + 显式 chained usage,主动调用率仍是 **0%**。
|
|
130
|
+
|
|
131
|
+
**业务洞察**:tool description 只提供「理论可用性」(这个工具能做什么),不能改变 driver 的工具选择**偏好**。Grep 是 Anthropic 训练数据中 caller-analysis 的默认工具,cognitive overhead 更低。要改变偏好,必须在 **prompt level** 提供「任务匹配性」引导——明确告诉 driver「什么任务该用什么工具」。
|
|
132
|
+
|
|
133
|
+
F170d 因此在两处注入引导:
|
|
134
|
+
1. **5 个 sub-agent**(plan / implement / verify / spec-review / quality-review)的 prompt body 内嵌「工具优先使用规则」表(按各 agent frontmatter `tools` 过滤)。agent body 即 Claude Code 子代理的 system prompt,故引导随子代理上下文抵达 driver。
|
|
135
|
+
2. **5 个主编排器 SKILL.md** 的「子代理调度时的工具优先级提示」块,要求编排器 dispatch 时在 `Task()` prompt 中显式带上工具优先级提示。
|
|
136
|
+
|
|
137
|
+
### 单一事实源与一致性守护
|
|
138
|
+
|
|
139
|
+
引导文案的 canonical source 是 [`templates/preference-rules.md`](../templates/preference-rules.md)(R1-R4 规则 + 关键原则,anchor 标记)。三处消费方(agent 文件 / SKILL 提示 / F170d harness 注入)都从它派生:
|
|
140
|
+
|
|
141
|
+
- **生成**:`node plugins/spec-driver/scripts/sync-preference-rules.mjs --write` 按各 agent `tools` 过滤渲染并写入 `<!-- BEGIN/END preference-rules -->` 之间。
|
|
142
|
+
- **守护**:`npm run repo:check` 的 `preference-rules:agent-block-sync` 检测漂移(同 `--check`),保证 5 个 agent 块永不与单一源脱节。
|
|
143
|
+
|
|
144
|
+
### 度量诚实声明(guided vs spontaneous)
|
|
145
|
+
|
|
146
|
+
F170d 的 SC-002 度量命名为 **guided active-call rate**:它测的是「引导送达 driver 后,driver 是否遵循引导改用 MCP」,**不等于** F170c 测的「spontaneous preference(内在偏好)」。0%(无引导)→ ≥50%(有引导)的对比意义是 **「prompt 层引导能驱动 driver 改用 MCP」**,不宣称「模型内在偏好被改变」。
|
|
147
|
+
|
|
148
|
+
### fork 用户自定义(override 机制)
|
|
149
|
+
|
|
150
|
+
fork 用户想调整引导文案(增删规则行、改语气 SHOULD↔MUST、换工具优先级):
|
|
151
|
+
|
|
152
|
+
1. 编辑 `plugins/spec-driver/templates/preference-rules.md` 的 `block-start`/`block-end` 之间内容(保持 anchor 契约 `<!-- preference-rules:R# tool=xxx -->`)。
|
|
153
|
+
2. 跑 `node plugins/spec-driver/scripts/sync-preference-rules.mjs --write` 重新生成 5 个 agent 块(按各自 tools 自动过滤)。
|
|
154
|
+
3. 跑 `npm run repo:check` 确认 `preference-rules:agent-block-sync` 通过。
|
|
155
|
+
|
|
156
|
+
无需改任何脚本逻辑——template 是唯一需要编辑的文件。
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 八、相关资源
|
|
161
|
+
|
|
162
|
+
- [Spectra MCP Server 源码](../../src/mcp/server.ts)
|
|
163
|
+
- [fork 用户定制指引](./customization.md)
|
|
164
|
+
- [Milestone M7 设计文档](../../docs/design/milestone-M7-spectra-mcp-productization.md)
|
|
165
|
+
- [F170d spec](../../specs/170d-driver-preference-shaping/spec.md) · [preference-rules 单一源](../templates/preference-rules.md)
|
|
@@ -42,6 +42,15 @@
|
|
|
42
42
|
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/stop-task-check.sh"
|
|
43
43
|
}
|
|
44
44
|
]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"matcher": "",
|
|
48
|
+
"hooks": [
|
|
49
|
+
{
|
|
50
|
+
"type": "command",
|
|
51
|
+
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/stop-fix-compliance-check.sh"
|
|
52
|
+
}
|
|
53
|
+
]
|
|
45
54
|
}
|
|
46
55
|
],
|
|
47
56
|
"WorktreeCreate": [
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Stop Hook: fix 模式流程依从性判定(Feature 208,阻断型)
|
|
3
|
+
#
|
|
4
|
+
# 薄壳职责(research.md D3):读 stdin payload → 转发给 Node CLI → 按 CLI 退出码原样转发 0/2,
|
|
5
|
+
# 任何非 0/2 的异常退出码一律兜底为 0(放行)。自身无判定逻辑,构成 FR-013 fail-open 的第二道保险
|
|
6
|
+
# (即便 Node 判定器抛出未捕获异常,本层仍兜底放行,不把崩溃泄漏为 Claude Code 侧未定义阻断)。
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
# 定位插件根:优先 CLAUDE_PLUGIN_ROOT,缺省时按脚本自身相对路径推导(hooks/ 的上一级)
|
|
11
|
+
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-}"
|
|
12
|
+
if [ -z "$PLUGIN_ROOT" ]; then
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
14
|
+
PLUGIN_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
CLI="${FIX_COMPLIANCE_CLI:-$PLUGIN_ROOT/scripts/fix-compliance-judge.mjs}"
|
|
18
|
+
|
|
19
|
+
# node 不可用 → 放行(无法判定不阻断,FR-013)
|
|
20
|
+
if ! command -v node >/dev/null 2>&1; then
|
|
21
|
+
exit 0
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
# stdin 转发给 CLI;临时禁用 errexit 以便捕获非零退出码做兜底判定
|
|
25
|
+
STDIN_PAYLOAD="$(cat)"
|
|
26
|
+
|
|
27
|
+
set +e
|
|
28
|
+
printf '%s' "$STDIN_PAYLOAD" | node "$CLI" --mode hook --project-root "$(pwd)"
|
|
29
|
+
CLI_EXIT=$?
|
|
30
|
+
set -e
|
|
31
|
+
|
|
32
|
+
# 退出码转发:0/2 原样转发,其余(崩溃/信号)兜底放行
|
|
33
|
+
if [ "$CLI_EXIT" -eq 2 ]; then
|
|
34
|
+
exit 2
|
|
35
|
+
fi
|
|
36
|
+
exit 0
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* delegation-contract — 「编排器必须委派子代理」硬约束块渲染核心(plugin-owned,自包含,无 root 依赖)
|
|
3
|
+
*
|
|
4
|
+
* canonical 源:templates/delegation-contract.md 的 block-start/block-end 之间内容。
|
|
5
|
+
* 与 preference-rules 不同:delegation-contract 是**整块原样注入**(无 per-row tool 过滤),
|
|
6
|
+
* 被注入到 5 个主编排器 SKILL.md 正文(fix/story/feature/implement/resume)。
|
|
7
|
+
*
|
|
8
|
+
* 被两处消费:
|
|
9
|
+
* - plugins/spec-driver/scripts/sync-delegation-contract.mjs(按各 SKILL 锚点注入约束块)
|
|
10
|
+
* - tests(纯函数级断言)
|
|
11
|
+
*
|
|
12
|
+
* 设计意图:plugin 必须自包含(发布后不依赖仓库 root scripts/),故渲染逻辑落在 plugin lib。
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export const BEGIN_MARKER = '<!-- BEGIN delegation-contract (generated from templates/delegation-contract.md; do not edit) -->';
|
|
16
|
+
export const END_MARKER = '<!-- END delegation-contract -->';
|
|
17
|
+
|
|
18
|
+
const BLOCK_START_RE = /<!--\s*delegation-contract:block-start\s*-->/;
|
|
19
|
+
const BLOCK_END_RE = /<!--\s*delegation-contract:block-end\s*-->/;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 提取 canonical 块文本:取 block-start/block-end marker 之间的内容。
|
|
23
|
+
* 若无 block-start → 原样返回(兼容单测直接传 block 内容的场景)。
|
|
24
|
+
* 有 block-start 却无 block-end → fail-loud(对齐 preference-rules,禁止静默截断到 EOF)。
|
|
25
|
+
*/
|
|
26
|
+
export function extractCanonicalBlock(templateText) {
|
|
27
|
+
const lines = String(templateText ?? '').split('\n');
|
|
28
|
+
const start = lines.findIndex((l) => BLOCK_START_RE.test(l));
|
|
29
|
+
if (start < 0) return String(templateText ?? '');
|
|
30
|
+
let end = -1;
|
|
31
|
+
for (let i = start + 1; i < lines.length; i++) {
|
|
32
|
+
if (BLOCK_END_RE.test(lines[i])) { end = i; break; }
|
|
33
|
+
}
|
|
34
|
+
if (end < 0) {
|
|
35
|
+
throw new Error('[delegation-contract] template 含 block-start 但缺 block-end,拒绝静默截断');
|
|
36
|
+
}
|
|
37
|
+
return lines.slice(start + 1, end).join('\n');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** 将 canonical 块包裹 BEGIN/END marker(供 SKILL 文件嵌入)。 */
|
|
41
|
+
export function wrapWithMarkers(block) {
|
|
42
|
+
return `${BEGIN_MARKER}\n${String(block).trimEnd()}\n${END_MARKER}`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 计算 SKILL 文件应有的内容(注入或替换约束块)。
|
|
47
|
+
* - 若已含 BEGIN..END → 仅替换 marker 之间内容(锚点不移动,幂等)。
|
|
48
|
+
* - 否则 → 在 anchorHeading 行**之后**(紧随该标题行的下一行)插入 wrapped 块,前后各留一空行。
|
|
49
|
+
* - anchorHeading 在 skillText 中未找到 → fail-loud(不静默跳过)。
|
|
50
|
+
*
|
|
51
|
+
* @param {string} skillText SKILL.md 全文
|
|
52
|
+
* @param {string} templateText delegation-contract.md 全文(或仅 block 内容)
|
|
53
|
+
* @param {string} anchorHeading 形如 '## 工作流定义',必须与 SKILL 中某行完整匹配
|
|
54
|
+
* @returns {string}
|
|
55
|
+
*/
|
|
56
|
+
export function computeExpectedSkillContent(skillText, templateText, anchorHeading) {
|
|
57
|
+
const block = extractCanonicalBlock(templateText);
|
|
58
|
+
const wrapped = wrapWithMarkers(block);
|
|
59
|
+
|
|
60
|
+
const beginIdx = skillText.indexOf(BEGIN_MARKER);
|
|
61
|
+
// 在 BEGIN 之后查找 END,避免匹配到文档引用里的字面 marker
|
|
62
|
+
const endIdx = beginIdx >= 0 ? skillText.indexOf(END_MARKER, beginIdx + BEGIN_MARKER.length) : -1;
|
|
63
|
+
if (beginIdx >= 0 && endIdx > beginIdx) {
|
|
64
|
+
const before = skillText.slice(0, beginIdx);
|
|
65
|
+
const after = skillText.slice(endIdx + END_MARKER.length);
|
|
66
|
+
return before + wrapped + after;
|
|
67
|
+
}
|
|
68
|
+
// fail-loud(codex CRITICAL):孤儿 BEGIN(有 BEGIN 无 END,如手动截断/上次写入中断)若放行
|
|
69
|
+
// 会落入首次插入路径 → 文件出现双 BEGIN 单 END,且此后 --check 稳定假绿,守护永远看不见
|
|
70
|
+
if (beginIdx >= 0) {
|
|
71
|
+
throw new Error('[delegation-contract] SKILL 含 BEGIN marker 但缺 END marker(畸形块),拒绝重复注入;请手动修复或删除残块后重跑 sync');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// 首次插入:定位锚点标题行
|
|
75
|
+
const lines = skillText.split('\n');
|
|
76
|
+
const anchorIdx = lines.findIndex((l) => l === anchorHeading);
|
|
77
|
+
if (anchorIdx < 0) {
|
|
78
|
+
throw new Error(`[delegation-contract] 锚点未找到: ${JSON.stringify(anchorHeading)}`);
|
|
79
|
+
}
|
|
80
|
+
// 在锚点标题行之后插入,前后各留一空行
|
|
81
|
+
const head = lines.slice(0, anchorIdx + 1).join('\n');
|
|
82
|
+
const tail = lines.slice(anchorIdx + 1).join('\n').replace(/^\n+/, '');
|
|
83
|
+
return `${head}\n\n${wrapped}\n\n${tail}`;
|
|
84
|
+
}
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
orchestrationOverridesSchema,
|
|
24
24
|
orchestrationMergedSchema,
|
|
25
25
|
formatZodIssue,
|
|
26
|
+
zodAvailable,
|
|
26
27
|
} from '../contracts/orchestration-schema.mjs';
|
|
27
28
|
|
|
28
29
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
@@ -208,6 +209,54 @@ export async function resolveOrchestrationConfig({ projectRoot, _loadBase, _load
|
|
|
208
209
|
};
|
|
209
210
|
}
|
|
210
211
|
|
|
212
|
+
// ── zod 缺失短路(步骤 1 成功之后、步骤 2 safeParse 之前)────────
|
|
213
|
+
// 缺 zod 时全部 schema 为 null,无法 safeParse;此处 best-effort 信任 base、
|
|
214
|
+
// 跳过项目级 overrides(用户输入无法校验),返回结构化结果而非硬崩。
|
|
215
|
+
if (!zodAvailable) {
|
|
216
|
+
// 纯对象检查(复用既有 isPlainObject 守卫模式)
|
|
217
|
+
const isBaseRawPlainObject =
|
|
218
|
+
rawBase !== null &&
|
|
219
|
+
rawBase !== undefined &&
|
|
220
|
+
Object.prototype.toString.call(rawBase) === '[object Object]';
|
|
221
|
+
|
|
222
|
+
if (!isBaseRawPlainObject) {
|
|
223
|
+
// base 解析结果不是纯对象 → 视为 base 损坏,退 generateFallbackConfig
|
|
224
|
+
diagnostics.push(createDiagnostic(
|
|
225
|
+
'error',
|
|
226
|
+
'orchestration.base-invalid',
|
|
227
|
+
'[orchestration] base 配置不是合法对象(zod 缺失 + base 非纯对象)',
|
|
228
|
+
));
|
|
229
|
+
const fallbackConfig = generateFallbackConfig();
|
|
230
|
+
return {
|
|
231
|
+
mergedConfig: fallbackConfig,
|
|
232
|
+
baseConfig: fallbackConfig,
|
|
233
|
+
fieldSources: {},
|
|
234
|
+
diagnostics,
|
|
235
|
+
isFallback: true,
|
|
236
|
+
isBaseInvalid: true,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// base 是纯对象 → best-effort 信任,跳过 overrides(无法校验用户输入)
|
|
241
|
+
diagnostics.push(createDiagnostic(
|
|
242
|
+
'warning',
|
|
243
|
+
'orchestration.zod-unavailable',
|
|
244
|
+
'[orchestration] 未能加载 zod,已跳过 orchestration schema 校验并 best-effort 信任 base 配置;' +
|
|
245
|
+
'项目级 orchestration-overrides 在缺 zod 时不被应用。' +
|
|
246
|
+
'如需完整校验请在已安装依赖的目录运行(npm i)或从仓内源路径运行 spec-driver 脚本',
|
|
247
|
+
));
|
|
248
|
+
const baseFieldSources = buildBaseOnlyFieldSources(rawBase);
|
|
249
|
+
return {
|
|
250
|
+
mergedConfig: rawBase,
|
|
251
|
+
baseConfig: rawBase,
|
|
252
|
+
fieldSources: baseFieldSources,
|
|
253
|
+
diagnostics,
|
|
254
|
+
isFallback: true,
|
|
255
|
+
isBaseInvalid: false,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
// ── zod 缺失短路结束 ─────────────────────────────────────────────
|
|
259
|
+
|
|
211
260
|
// ── 步骤 2:base Zod 校验 ──────────────────────────────────
|
|
212
261
|
const baseParseResult = orchestrationBaseSchema.safeParse(rawBase);
|
|
213
262
|
if (!baseParseResult.success) {
|
|
@@ -10,7 +10,7 @@ import path from 'path';
|
|
|
10
10
|
import { fileURLToPath } from 'url';
|
|
11
11
|
import { parseYamlDocument } from '../scripts/lib/simple-yaml.mjs';
|
|
12
12
|
import { generateFallbackConfig } from './orchestrator-fallback.mjs';
|
|
13
|
-
import { orchestrationBaseSchema, formatZodIssue } from '../contracts/orchestration-schema.mjs';
|
|
13
|
+
import { orchestrationBaseSchema, formatZodIssue, zodAvailable } from '../contracts/orchestration-schema.mjs';
|
|
14
14
|
|
|
15
15
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
16
16
|
|
|
@@ -58,6 +58,34 @@ export class Orchestrator {
|
|
|
58
58
|
const content = fs.readFileSync(configPath, 'utf-8');
|
|
59
59
|
const parsed = parseYamlDocument(content);
|
|
60
60
|
|
|
61
|
+
// ── zod 缺失守卫(YAML 解析成功之后、safeParse 之前)────────────
|
|
62
|
+
// 缺 zod 时 orchestrationBaseSchema 为 null,调用 .safeParse 会抛 TypeError 被外层
|
|
63
|
+
// catch 误判为加载失败并丢弃真实配置。显式守卫在此 best-effort 信任已解析 YAML。
|
|
64
|
+
if (!zodAvailable) {
|
|
65
|
+
const isParsedPlainObject =
|
|
66
|
+
parsed !== null &&
|
|
67
|
+
parsed !== undefined &&
|
|
68
|
+
Object.prototype.toString.call(parsed) === '[object Object]';
|
|
69
|
+
|
|
70
|
+
if (isParsedPlainObject) {
|
|
71
|
+
// parsed 是纯对象 → best-effort 信任已解析的 YAML
|
|
72
|
+
this.logger.warn(
|
|
73
|
+
'[ORCHESTRATOR] zod 未加载,已跳过 orchestration schema 校验并 best-effort 信任已解析配置',
|
|
74
|
+
);
|
|
75
|
+
this.config = parsed;
|
|
76
|
+
this.isFallback = false; // 真实配置,非最小桩
|
|
77
|
+
} else {
|
|
78
|
+
// parsed 不是纯对象(YAML 解析为 null/数组/标量等)→ 退 generateFallbackConfig
|
|
79
|
+
this.logger.warn(
|
|
80
|
+
'[ORCHESTRATOR] zod 未加载且 YAML 解析结果非纯对象,使用 fallback 配置',
|
|
81
|
+
);
|
|
82
|
+
this.config = generateFallbackConfig();
|
|
83
|
+
this.isFallback = true;
|
|
84
|
+
}
|
|
85
|
+
return; // 跳过 safeParse,退出 loadAndValidateConfig
|
|
86
|
+
}
|
|
87
|
+
// ── zod 缺失守卫结束 ─────────────────────────────────────────────
|
|
88
|
+
|
|
61
89
|
// 使用 orchestrationBaseSchema.safeParse 替代手写校验(CL-016,T-011)
|
|
62
90
|
const zodResult = orchestrationBaseSchema.safeParse(parsed);
|
|
63
91
|
if (!zodResult.success) {
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* preference-rules — 「工具优先使用规则」渲染核心(plugin-owned,自包含,无 root 依赖)
|
|
3
|
+
*
|
|
4
|
+
* canonical 渲染逻辑:从 templates/preference-rules.md 的 canonical 块按 agent frontmatter
|
|
5
|
+
* tools 过滤规则行。被三处消费:
|
|
6
|
+
* - plugins/spec-driver/scripts/sync-preference-rules.mjs(生成 agent 块)
|
|
7
|
+
* - scripts/feature-170d-driver-preference.mjs(harness 注入,经 driver-eval-core 复用)
|
|
8
|
+
* - tests(经 driver-eval-core re-export)
|
|
9
|
+
*
|
|
10
|
+
* 设计意图:plugin 必须自包含(发布后不依赖仓库 root scripts/),故渲染逻辑落在 plugin lib。
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export const NS = 'mcp__plugin_spectra_spectra__';
|
|
14
|
+
export const BEGIN_MARKER = '<!-- BEGIN preference-rules (generated from templates/preference-rules.md; do not edit) -->';
|
|
15
|
+
export const END_MARKER = '<!-- END preference-rules -->';
|
|
16
|
+
|
|
17
|
+
const ROW_ANCHOR_RE = /<!--\s*preference-rules:(R\d)\s+tool=([a-z_]+)\s*-->/;
|
|
18
|
+
const ROWS_END_RE = /<!--\s*\/preference-rules:rows\s*-->/;
|
|
19
|
+
const SKIP_MARKER_RE = /<!--\s*preference-rules:(block-start|block-end|meta\b[^>]*)\s*-->/;
|
|
20
|
+
const BLOCK_START_RE = /<!--\s*preference-rules:block-start\s*-->/;
|
|
21
|
+
const BLOCK_END_RE = /<!--\s*preference-rules:block-end\s*-->/;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 提取 canonical 块文本:若含 block-start/block-end marker 则取其间内容;
|
|
25
|
+
* 否则原样返回(兼容仅传 block 内容的调用,如单测合成 TPL)。
|
|
26
|
+
*/
|
|
27
|
+
export function extractCanonicalBlock(templateText) {
|
|
28
|
+
const lines = String(templateText ?? '').split('\n');
|
|
29
|
+
const start = lines.findIndex((l) => BLOCK_START_RE.test(l));
|
|
30
|
+
if (start < 0) return String(templateText ?? '');
|
|
31
|
+
let end = -1;
|
|
32
|
+
for (let i = start + 1; i < lines.length; i++) {
|
|
33
|
+
if (BLOCK_END_RE.test(lines[i])) { end = i; break; }
|
|
34
|
+
}
|
|
35
|
+
// fail-loud(codex C3):有 block-start 却无 block-end → template 损坏,禁止静默截断到 EOF
|
|
36
|
+
if (end < 0) {
|
|
37
|
+
throw new Error('[preference-rules] template 含 block-start 但缺 block-end,拒绝静默截断');
|
|
38
|
+
}
|
|
39
|
+
return lines.slice(start + 1, end).join('\n');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** 从 fully-qualified agentTools 提取 toolKey 集合(impact/context/detect_changes)。 */
|
|
43
|
+
export function toolKeysFromAgentTools(agentTools) {
|
|
44
|
+
const keys = new Set();
|
|
45
|
+
for (const t of agentTools || []) {
|
|
46
|
+
if (typeof t === 'string' && t.startsWith(NS)) keys.add(t.slice(NS.length));
|
|
47
|
+
}
|
|
48
|
+
return keys;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** 解析 agent .md frontmatter 的 tools: 行,返回 fully-qualified spectra MCP 工具数组。 */
|
|
52
|
+
export function parseFrontmatterTools(agentText) {
|
|
53
|
+
const m = String(agentText ?? '').match(/^tools:\s*\[(.*)\]/m);
|
|
54
|
+
if (!m) return [];
|
|
55
|
+
const re = new RegExp(`${NS}\\w+`, 'g');
|
|
56
|
+
return m[1].match(re) ?? [];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* 纯函数:按 agentTools 过滤 canonical 块的规则行,渲染「工具优先使用规则」块。
|
|
61
|
+
* 入参可为完整 template 文本(含 block-start/block-end)或仅 block 内容;二者皆可。
|
|
62
|
+
* 输出不含任何 anchor / block 注释。
|
|
63
|
+
* @param {string} templateText
|
|
64
|
+
* @param {string[]} agentTools 形如 ['mcp__plugin_spectra_spectra__impact', ...]
|
|
65
|
+
* @returns {string}
|
|
66
|
+
*/
|
|
67
|
+
export function renderInjectionBlock(templateText, agentTools) {
|
|
68
|
+
const keys = toolKeysFromAgentTools(agentTools);
|
|
69
|
+
// 先抽取 canonical 块(丢弃 template 文件的人类文档头),再过滤规则行
|
|
70
|
+
const lines = extractCanonicalBlock(templateText).split('\n');
|
|
71
|
+
const out = [];
|
|
72
|
+
let inRows = false;
|
|
73
|
+
|
|
74
|
+
for (let i = 0; i < lines.length; i++) {
|
|
75
|
+
const line = lines[i];
|
|
76
|
+
if (SKIP_MARKER_RE.test(line)) continue;
|
|
77
|
+
const anchor = line.match(ROW_ANCHOR_RE);
|
|
78
|
+
if (anchor) {
|
|
79
|
+
inRows = true;
|
|
80
|
+
const tool = anchor[2];
|
|
81
|
+
const rowLine = lines[i + 1] ?? '';
|
|
82
|
+
if (keys.has(tool)) out.push(rowLine);
|
|
83
|
+
i++;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (ROWS_END_RE.test(line)) { inRows = false; continue; }
|
|
87
|
+
if (inRows) continue;
|
|
88
|
+
out.push(line);
|
|
89
|
+
}
|
|
90
|
+
return out.join('\n').replace(/\n{3,}/g, '\n\n').trim() + '\n';
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** 将渲染块包裹 BEGIN/END marker(供 agent 文件嵌入)。 */
|
|
94
|
+
export function wrapWithMarkers(renderedBlock) {
|
|
95
|
+
return `${BEGIN_MARKER}\n${renderedBlock.trimEnd()}\n${END_MARKER}`;
|
|
96
|
+
}
|