@sdd-method/sdd-cli 0.9.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/LICENSE +201 -0
- package/NOTICE +17 -0
- package/README.md +151 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/bundle.d.ts +20 -0
- package/dist/lib/bundle.d.ts.map +1 -0
- package/dist/lib/bundle.js +75 -0
- package/dist/lib/bundle.js.map +1 -0
- package/dist/lib/generate-claude-md/index.d.ts +16 -0
- package/dist/lib/generate-claude-md/index.d.ts.map +1 -0
- package/dist/lib/generate-claude-md/index.js +89 -0
- package/dist/lib/generate-claude-md/index.js.map +1 -0
- package/dist/lib/hooks-seed/entries.d.ts +16 -0
- package/dist/lib/hooks-seed/entries.d.ts.map +1 -0
- package/dist/lib/hooks-seed/entries.js +47 -0
- package/dist/lib/hooks-seed/entries.js.map +1 -0
- package/dist/lib/hooks-seed/index.d.ts +17 -0
- package/dist/lib/hooks-seed/index.d.ts.map +1 -0
- package/dist/lib/hooks-seed/index.js +15 -0
- package/dist/lib/hooks-seed/index.js.map +1 -0
- package/dist/lib/hooks-seed/merge.d.ts +24 -0
- package/dist/lib/hooks-seed/merge.d.ts.map +1 -0
- package/dist/lib/hooks-seed/merge.js +73 -0
- package/dist/lib/hooks-seed/merge.js.map +1 -0
- package/dist/lib/hooks-seed/types.d.ts +27 -0
- package/dist/lib/hooks-seed/types.d.ts.map +1 -0
- package/dist/lib/hooks-seed/types.js +20 -0
- package/dist/lib/hooks-seed/types.js.map +1 -0
- package/dist/lib/init/app.d.ts +21 -0
- package/dist/lib/init/app.d.ts.map +1 -0
- package/dist/lib/init/app.js +132 -0
- package/dist/lib/init/app.js.map +1 -0
- package/dist/lib/init/ci-workflow.d.ts +29 -0
- package/dist/lib/init/ci-workflow.d.ts.map +1 -0
- package/dist/lib/init/ci-workflow.js +78 -0
- package/dist/lib/init/ci-workflow.js.map +1 -0
- package/dist/lib/init/claude-md.d.ts +19 -0
- package/dist/lib/init/claude-md.d.ts.map +1 -0
- package/dist/lib/init/claude-md.js +140 -0
- package/dist/lib/init/claude-md.js.map +1 -0
- package/dist/lib/init/index.d.ts +33 -0
- package/dist/lib/init/index.d.ts.map +1 -0
- package/dist/lib/init/index.js +232 -0
- package/dist/lib/init/index.js.map +1 -0
- package/dist/lib/init/integration.d.ts +53 -0
- package/dist/lib/init/integration.d.ts.map +1 -0
- package/dist/lib/init/integration.js +237 -0
- package/dist/lib/init/integration.js.map +1 -0
- package/dist/lib/init/platform.d.ts +26 -0
- package/dist/lib/init/platform.d.ts.map +1 -0
- package/dist/lib/init/platform.js +188 -0
- package/dist/lib/init/platform.js.map +1 -0
- package/dist/lib/list/discover.d.ts +8 -0
- package/dist/lib/list/discover.d.ts.map +1 -0
- package/dist/lib/list/discover.js +77 -0
- package/dist/lib/list/discover.js.map +1 -0
- package/dist/lib/list/format.d.ts +9 -0
- package/dist/lib/list/format.d.ts.map +1 -0
- package/dist/lib/list/format.js +44 -0
- package/dist/lib/list/format.js.map +1 -0
- package/dist/lib/list/index.d.ts +12 -0
- package/dist/lib/list/index.d.ts.map +1 -0
- package/dist/lib/list/index.js +15 -0
- package/dist/lib/list/index.js.map +1 -0
- package/dist/lib/lock-file.d.ts +14 -0
- package/dist/lib/lock-file.d.ts.map +1 -0
- package/dist/lib/lock-file.js +80 -0
- package/dist/lib/lock-file.js.map +1 -0
- package/dist/lib/mcp/build-info.d.ts +9 -0
- package/dist/lib/mcp/build-info.d.ts.map +1 -0
- package/dist/lib/mcp/build-info.js +10 -0
- package/dist/lib/mcp/build-info.js.map +1 -0
- package/dist/lib/mcp/errors.d.ts +23 -0
- package/dist/lib/mcp/errors.d.ts.map +1 -0
- package/dist/lib/mcp/errors.js +25 -0
- package/dist/lib/mcp/errors.js.map +1 -0
- package/dist/lib/mcp/parse/frontmatter.d.ts +22 -0
- package/dist/lib/mcp/parse/frontmatter.d.ts.map +1 -0
- package/dist/lib/mcp/parse/frontmatter.js +49 -0
- package/dist/lib/mcp/parse/frontmatter.js.map +1 -0
- package/dist/lib/mcp/parse/gate-registry.d.ts +19 -0
- package/dist/lib/mcp/parse/gate-registry.d.ts.map +1 -0
- package/dist/lib/mcp/parse/gate-registry.js +68 -0
- package/dist/lib/mcp/parse/gate-registry.js.map +1 -0
- package/dist/lib/mcp/parse/paths.d.ts +21 -0
- package/dist/lib/mcp/parse/paths.d.ts.map +1 -0
- package/dist/lib/mcp/parse/paths.js +83 -0
- package/dist/lib/mcp/parse/paths.js.map +1 -0
- package/dist/lib/mcp/pin/errors.d.ts +11 -0
- package/dist/lib/mcp/pin/errors.d.ts.map +1 -0
- package/dist/lib/mcp/pin/errors.js +32 -0
- package/dist/lib/mcp/pin/errors.js.map +1 -0
- package/dist/lib/mcp/pin/index.d.ts +18 -0
- package/dist/lib/mcp/pin/index.d.ts.map +1 -0
- package/dist/lib/mcp/pin/index.js +29 -0
- package/dist/lib/mcp/pin/index.js.map +1 -0
- package/dist/lib/mcp/pin/read.d.ts +24 -0
- package/dist/lib/mcp/pin/read.d.ts.map +1 -0
- package/dist/lib/mcp/pin/read.js +64 -0
- package/dist/lib/mcp/pin/read.js.map +1 -0
- package/dist/lib/mcp/pin/resolve.d.ts +12 -0
- package/dist/lib/mcp/pin/resolve.d.ts.map +1 -0
- package/dist/lib/mcp/pin/resolve.js +33 -0
- package/dist/lib/mcp/pin/resolve.js.map +1 -0
- package/dist/lib/mcp/prompts/evaluate-cascade.d.ts +14 -0
- package/dist/lib/mcp/prompts/evaluate-cascade.d.ts.map +1 -0
- package/dist/lib/mcp/prompts/evaluate-cascade.js +147 -0
- package/dist/lib/mcp/prompts/evaluate-cascade.js.map +1 -0
- package/dist/lib/mcp/prompts/index.d.ts +9 -0
- package/dist/lib/mcp/prompts/index.d.ts.map +1 -0
- package/dist/lib/mcp/prompts/index.js +23 -0
- package/dist/lib/mcp/prompts/index.js.map +1 -0
- package/dist/lib/mcp/prompts/propose-adr.d.ts +12 -0
- package/dist/lib/mcp/prompts/propose-adr.d.ts.map +1 -0
- package/dist/lib/mcp/prompts/propose-adr.js +94 -0
- package/dist/lib/mcp/prompts/propose-adr.js.map +1 -0
- package/dist/lib/mcp/prompts/review-data-model-change.d.ts +10 -0
- package/dist/lib/mcp/prompts/review-data-model-change.d.ts.map +1 -0
- package/dist/lib/mcp/prompts/review-data-model-change.js +134 -0
- package/dist/lib/mcp/prompts/review-data-model-change.js.map +1 -0
- package/dist/lib/mcp/prompts/template-loader.d.ts +29 -0
- package/dist/lib/mcp/prompts/template-loader.d.ts.map +1 -0
- package/dist/lib/mcp/prompts/template-loader.js +44 -0
- package/dist/lib/mcp/prompts/template-loader.js.map +1 -0
- package/dist/lib/mcp/prompts/types.d.ts +17 -0
- package/dist/lib/mcp/prompts/types.d.ts.map +1 -0
- package/dist/lib/mcp/prompts/types.js +10 -0
- package/dist/lib/mcp/prompts/types.js.map +1 -0
- package/dist/lib/mcp/prompts/write-capability-spec.d.ts +8 -0
- package/dist/lib/mcp/prompts/write-capability-spec.d.ts.map +1 -0
- package/dist/lib/mcp/prompts/write-capability-spec.js +85 -0
- package/dist/lib/mcp/prompts/write-capability-spec.js.map +1 -0
- package/dist/lib/mcp/prompts/write-feature-spec.d.ts +10 -0
- package/dist/lib/mcp/prompts/write-feature-spec.d.ts.map +1 -0
- package/dist/lib/mcp/prompts/write-feature-spec.js +94 -0
- package/dist/lib/mcp/prompts/write-feature-spec.js.map +1 -0
- package/dist/lib/mcp/prompts/write-work-order.d.ts +7 -0
- package/dist/lib/mcp/prompts/write-work-order.d.ts.map +1 -0
- package/dist/lib/mcp/prompts/write-work-order.js +69 -0
- package/dist/lib/mcp/prompts/write-work-order.js.map +1 -0
- package/dist/lib/mcp/reader.d.ts +37 -0
- package/dist/lib/mcp/reader.d.ts.map +1 -0
- package/dist/lib/mcp/reader.js +93 -0
- package/dist/lib/mcp/reader.js.map +1 -0
- package/dist/lib/mcp/resources/adrs.d.ts +3 -0
- package/dist/lib/mcp/resources/adrs.d.ts.map +1 -0
- package/dist/lib/mcp/resources/adrs.js +97 -0
- package/dist/lib/mcp/resources/adrs.js.map +1 -0
- package/dist/lib/mcp/resources/data-models.d.ts +14 -0
- package/dist/lib/mcp/resources/data-models.d.ts.map +1 -0
- package/dist/lib/mcp/resources/data-models.js +81 -0
- package/dist/lib/mcp/resources/data-models.js.map +1 -0
- package/dist/lib/mcp/resources/gates.d.ts +9 -0
- package/dist/lib/mcp/resources/gates.d.ts.map +1 -0
- package/dist/lib/mcp/resources/gates.js +90 -0
- package/dist/lib/mcp/resources/gates.js.map +1 -0
- package/dist/lib/mcp/resources/glossary.d.ts +16 -0
- package/dist/lib/mcp/resources/glossary.d.ts.map +1 -0
- package/dist/lib/mcp/resources/glossary.js +87 -0
- package/dist/lib/mcp/resources/glossary.js.map +1 -0
- package/dist/lib/mcp/resources/specs.d.ts +23 -0
- package/dist/lib/mcp/resources/specs.d.ts.map +1 -0
- package/dist/lib/mcp/resources/specs.js +151 -0
- package/dist/lib/mcp/resources/specs.js.map +1 -0
- package/dist/lib/mcp/resources/version.d.ts +3 -0
- package/dist/lib/mcp/resources/version.d.ts.map +1 -0
- package/dist/lib/mcp/resources/version.js +45 -0
- package/dist/lib/mcp/resources/version.js.map +1 -0
- package/dist/lib/mcp/server.d.ts +29 -0
- package/dist/lib/mcp/server.d.ts.map +1 -0
- package/dist/lib/mcp/server.js +104 -0
- package/dist/lib/mcp/server.js.map +1 -0
- package/dist/lib/mcp/tools/cascade-impact.d.ts +22 -0
- package/dist/lib/mcp/tools/cascade-impact.d.ts.map +1 -0
- package/dist/lib/mcp/tools/cascade-impact.js +53 -0
- package/dist/lib/mcp/tools/cascade-impact.js.map +1 -0
- package/dist/lib/mcp/tools/find-consumers-of-contract.d.ts +7 -0
- package/dist/lib/mcp/tools/find-consumers-of-contract.d.ts.map +1 -0
- package/dist/lib/mcp/tools/find-consumers-of-contract.js +70 -0
- package/dist/lib/mcp/tools/find-consumers-of-contract.js.map +1 -0
- package/dist/lib/mcp/tools/find-consumers.d.ts +7 -0
- package/dist/lib/mcp/tools/find-consumers.d.ts.map +1 -0
- package/dist/lib/mcp/tools/find-consumers.js +52 -0
- package/dist/lib/mcp/tools/find-consumers.js.map +1 -0
- package/dist/lib/mcp/tools/find-dependencies.d.ts +8 -0
- package/dist/lib/mcp/tools/find-dependencies.d.ts.map +1 -0
- package/dist/lib/mcp/tools/find-dependencies.js +89 -0
- package/dist/lib/mcp/tools/find-dependencies.js.map +1 -0
- package/dist/lib/mcp/tools/find-dependents.d.ts +8 -0
- package/dist/lib/mcp/tools/find-dependents.d.ts.map +1 -0
- package/dist/lib/mcp/tools/find-dependents.js +89 -0
- package/dist/lib/mcp/tools/find-dependents.js.map +1 -0
- package/dist/lib/mcp/tools/find-producers.d.ts +8 -0
- package/dist/lib/mcp/tools/find-producers.d.ts.map +1 -0
- package/dist/lib/mcp/tools/find-producers.js +57 -0
- package/dist/lib/mcp/tools/find-producers.js.map +1 -0
- package/dist/lib/mcp/tools/find-related-specs.d.ts +9 -0
- package/dist/lib/mcp/tools/find-related-specs.d.ts.map +1 -0
- package/dist/lib/mcp/tools/find-related-specs.js +92 -0
- package/dist/lib/mcp/tools/find-related-specs.js.map +1 -0
- package/dist/lib/mcp/tools/list-adrs.d.ts +3 -0
- package/dist/lib/mcp/tools/list-adrs.d.ts.map +1 -0
- package/dist/lib/mcp/tools/list-adrs.js +73 -0
- package/dist/lib/mcp/tools/list-adrs.js.map +1 -0
- package/dist/lib/mcp/tools/query-gate-status.d.ts +3 -0
- package/dist/lib/mcp/tools/query-gate-status.d.ts.map +1 -0
- package/dist/lib/mcp/tools/query-gate-status.js +82 -0
- package/dist/lib/mcp/tools/query-gate-status.js.map +1 -0
- package/dist/lib/mcp/tools/search-specs.d.ts +12 -0
- package/dist/lib/mcp/tools/search-specs.d.ts.map +1 -0
- package/dist/lib/mcp/tools/search-specs.js +151 -0
- package/dist/lib/mcp/tools/search-specs.js.map +1 -0
- package/dist/lib/mcp/workspace.d.ts +25 -0
- package/dist/lib/mcp/workspace.d.ts.map +1 -0
- package/dist/lib/mcp/workspace.js +129 -0
- package/dist/lib/mcp/workspace.js.map +1 -0
- package/dist/lib/mcp-seed/entries.d.ts +19 -0
- package/dist/lib/mcp-seed/entries.d.ts.map +1 -0
- package/dist/lib/mcp-seed/entries.js +14 -0
- package/dist/lib/mcp-seed/entries.js.map +1 -0
- package/dist/lib/mcp-seed/index.d.ts +36 -0
- package/dist/lib/mcp-seed/index.d.ts.map +1 -0
- package/dist/lib/mcp-seed/index.js +28 -0
- package/dist/lib/mcp-seed/index.js.map +1 -0
- package/dist/lib/mcp-seed/merge.d.ts +34 -0
- package/dist/lib/mcp-seed/merge.d.ts.map +1 -0
- package/dist/lib/mcp-seed/merge.js +99 -0
- package/dist/lib/mcp-seed/merge.js.map +1 -0
- package/dist/lib/mcp-seed/types.d.ts +24 -0
- package/dist/lib/mcp-seed/types.d.ts.map +1 -0
- package/dist/lib/mcp-seed/types.js +13 -0
- package/dist/lib/mcp-seed/types.js.map +1 -0
- package/dist/lib/plan/index.d.ts +19 -0
- package/dist/lib/plan/index.d.ts.map +1 -0
- package/dist/lib/plan/index.js +69 -0
- package/dist/lib/plan/index.js.map +1 -0
- package/dist/lib/plan/read-sdd.d.ts +46 -0
- package/dist/lib/plan/read-sdd.d.ts.map +1 -0
- package/dist/lib/plan/read-sdd.js +102 -0
- package/dist/lib/plan/read-sdd.js.map +1 -0
- package/dist/lib/plan/render-template.d.ts +8 -0
- package/dist/lib/plan/render-template.d.ts.map +1 -0
- package/dist/lib/plan/render-template.js +60 -0
- package/dist/lib/plan/render-template.js.map +1 -0
- package/dist/lib/repo-kind.d.ts +20 -0
- package/dist/lib/repo-kind.d.ts.map +1 -0
- package/dist/lib/repo-kind.js +73 -0
- package/dist/lib/repo-kind.js.map +1 -0
- package/dist/lib/scripts.d.ts +2 -0
- package/dist/lib/scripts.d.ts.map +1 -0
- package/dist/lib/scripts.js +7 -0
- package/dist/lib/scripts.js.map +1 -0
- package/dist/lib/sdd-index/cascade.d.ts +46 -0
- package/dist/lib/sdd-index/cascade.d.ts.map +1 -0
- package/dist/lib/sdd-index/cascade.js +91 -0
- package/dist/lib/sdd-index/cascade.js.map +1 -0
- package/dist/lib/sdd-index/contracts.d.ts +29 -0
- package/dist/lib/sdd-index/contracts.d.ts.map +1 -0
- package/dist/lib/sdd-index/contracts.js +216 -0
- package/dist/lib/sdd-index/contracts.js.map +1 -0
- package/dist/lib/sdd-index/data-model.d.ts +13 -0
- package/dist/lib/sdd-index/data-model.d.ts.map +1 -0
- package/dist/lib/sdd-index/data-model.js +23 -0
- package/dist/lib/sdd-index/data-model.js.map +1 -0
- package/dist/lib/sdd-index/execution-map.d.ts +34 -0
- package/dist/lib/sdd-index/execution-map.d.ts.map +1 -0
- package/dist/lib/sdd-index/execution-map.js +105 -0
- package/dist/lib/sdd-index/execution-map.js.map +1 -0
- package/dist/lib/sdd-index/graph.d.ts +28 -0
- package/dist/lib/sdd-index/graph.d.ts.map +1 -0
- package/dist/lib/sdd-index/graph.js +122 -0
- package/dist/lib/sdd-index/graph.js.map +1 -0
- package/dist/lib/sdd-index/index.d.ts +29 -0
- package/dist/lib/sdd-index/index.d.ts.map +1 -0
- package/dist/lib/sdd-index/index.js +79 -0
- package/dist/lib/sdd-index/index.js.map +1 -0
- package/dist/lib/sdd-index/repo-config.d.ts +23 -0
- package/dist/lib/sdd-index/repo-config.d.ts.map +1 -0
- package/dist/lib/sdd-index/repo-config.js +150 -0
- package/dist/lib/sdd-index/repo-config.js.map +1 -0
- package/dist/lib/sdd-index/types.d.ts +106 -0
- package/dist/lib/sdd-index/types.d.ts.map +1 -0
- package/dist/lib/sdd-index/types.js +13 -0
- package/dist/lib/sdd-index/types.js.map +1 -0
- package/dist/lib/sdd-index/watch.d.ts +24 -0
- package/dist/lib/sdd-index/watch.d.ts.map +1 -0
- package/dist/lib/sdd-index/watch.js +112 -0
- package/dist/lib/sdd-index/watch.js.map +1 -0
- package/dist/lib/spawn.d.ts +8 -0
- package/dist/lib/spawn.d.ts.map +1 -0
- package/dist/lib/spawn.js +16 -0
- package/dist/lib/spawn.js.map +1 -0
- package/dist/lib/sync/apply.d.ts +3 -0
- package/dist/lib/sync/apply.d.ts.map +1 -0
- package/dist/lib/sync/apply.js +16 -0
- package/dist/lib/sync/apply.js.map +1 -0
- package/dist/lib/sync/diff.d.ts +8 -0
- package/dist/lib/sync/diff.d.ts.map +1 -0
- package/dist/lib/sync/diff.js +48 -0
- package/dist/lib/sync/diff.js.map +1 -0
- package/dist/lib/sync/index.d.ts +17 -0
- package/dist/lib/sync/index.d.ts.map +1 -0
- package/dist/lib/sync/index.js +184 -0
- package/dist/lib/sync/index.js.map +1 -0
- package/dist/lib/sync/settings-merge.d.ts +45 -0
- package/dist/lib/sync/settings-merge.d.ts.map +1 -0
- package/dist/lib/sync/settings-merge.js +109 -0
- package/dist/lib/sync/settings-merge.js.map +1 -0
- package/dist/lib/sync/source-tag.d.ts +5 -0
- package/dist/lib/sync/source-tag.d.ts.map +1 -0
- package/dist/lib/sync/source-tag.js +34 -0
- package/dist/lib/sync/source-tag.js.map +1 -0
- package/dist/lib/sync/yaml-block-merge.d.ts +50 -0
- package/dist/lib/sync/yaml-block-merge.d.ts.map +1 -0
- package/dist/lib/sync/yaml-block-merge.js +113 -0
- package/dist/lib/sync/yaml-block-merge.js.map +1 -0
- package/dist/lib/validate/aggregate.d.ts +13 -0
- package/dist/lib/validate/aggregate.d.ts.map +1 -0
- package/dist/lib/validate/aggregate.js +35 -0
- package/dist/lib/validate/aggregate.js.map +1 -0
- package/dist/lib/validate/dispatch.d.ts +34 -0
- package/dist/lib/validate/dispatch.d.ts.map +1 -0
- package/dist/lib/validate/dispatch.js +167 -0
- package/dist/lib/validate/dispatch.js.map +1 -0
- package/dist/lib/validate/index.d.ts +13 -0
- package/dist/lib/validate/index.d.ts.map +1 -0
- package/dist/lib/validate/index.js +69 -0
- package/dist/lib/validate/index.js.map +1 -0
- package/dist/lib/validate/runner.d.ts +16 -0
- package/dist/lib/validate/runner.d.ts.map +1 -0
- package/dist/lib/validate/runner.js +66 -0
- package/dist/lib/validate/runner.js.map +1 -0
- package/dist/verbs/generate-claude-md.d.ts +3 -0
- package/dist/verbs/generate-claude-md.d.ts.map +1 -0
- package/dist/verbs/generate-claude-md.js +36 -0
- package/dist/verbs/generate-claude-md.js.map +1 -0
- package/dist/verbs/init.d.ts +3 -0
- package/dist/verbs/init.d.ts.map +1 -0
- package/dist/verbs/init.js +90 -0
- package/dist/verbs/init.js.map +1 -0
- package/dist/verbs/list.d.ts +3 -0
- package/dist/verbs/list.d.ts.map +1 -0
- package/dist/verbs/list.js +43 -0
- package/dist/verbs/list.js.map +1 -0
- package/dist/verbs/mcp.d.ts +3 -0
- package/dist/verbs/mcp.d.ts.map +1 -0
- package/dist/verbs/mcp.js +22 -0
- package/dist/verbs/mcp.js.map +1 -0
- package/dist/verbs/plan.d.ts +3 -0
- package/dist/verbs/plan.d.ts.map +1 -0
- package/dist/verbs/plan.js +41 -0
- package/dist/verbs/plan.js.map +1 -0
- package/dist/verbs/sync.d.ts +3 -0
- package/dist/verbs/sync.d.ts.map +1 -0
- package/dist/verbs/sync.js +27 -0
- package/dist/verbs/sync.js.map +1 -0
- package/dist/verbs/validate.d.ts +3 -0
- package/dist/verbs/validate.d.ts.map +1 -0
- package/dist/verbs/validate.js +21 -0
- package/dist/verbs/validate.js.map +1 -0
- package/package.json +61 -0
- package/scripts/README.md +48 -0
- package/scripts/sync-method-baseline.sh +258 -0
- package/scripts/validate-app-dependencies.sh +289 -0
- package/scripts/validate-app-docs.sh +185 -0
- package/scripts/validate-integration-docs.sh +222 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { access, readdir, stat } from "node:fs/promises";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
import { liveReader } from "../mcp/reader.js";
|
|
4
|
+
import { parseRepoConfigFile } from "../sdd-index/repo-config.js";
|
|
5
|
+
/**
|
|
6
|
+
* Read everything `plan --pilot` needs from the SDD filesystem: the service's
|
|
7
|
+
* repo-config manifest (domain, service_type, aggregates, dependencies,
|
|
8
|
+
* contracts), the count of feature spec files under the capability, and
|
|
9
|
+
* presence of the capability spec + traceability manifest.
|
|
10
|
+
*
|
|
11
|
+
* Repo-config parsing delegates to the shared sdd-index module so the
|
|
12
|
+
* `plan --pilot` path and the MCP dependency-graph tools see the same
|
|
13
|
+
* view. The richer ADR 0110 shape (package/version/stability) is
|
|
14
|
+
* flattened back to path-strings here to preserve the legacy
|
|
15
|
+
* `RepoConfig` contract.
|
|
16
|
+
*/
|
|
17
|
+
export async function readSdd(inputs) {
|
|
18
|
+
const { sddRoot, service, capability, domain } = inputs;
|
|
19
|
+
const manifestAbsPath = join(sddRoot, "orchestration/repo-config", domain, `${service}.yaml`);
|
|
20
|
+
const repoConfig = await readRepoConfigFor(sddRoot, manifestAbsPath);
|
|
21
|
+
const featuresDir = join(sddRoot, "docs/domains", domain, "product/features", capability);
|
|
22
|
+
const featureSpecs = await listFeatureSpecs(featuresDir);
|
|
23
|
+
const featureSpecRelativePaths = featureSpecs.map((p) => join("docs/domains", domain, "product/features", capability, p));
|
|
24
|
+
const capabilitySpecPath = join("docs/domains", domain, "product", `${capability}.md`);
|
|
25
|
+
const capabilitySpecPresent = await fileExists(join(sddRoot, capabilitySpecPath));
|
|
26
|
+
const traceabilityManifestPath = join("docs/domains", domain, "product", `${capability}.traceability.yaml`);
|
|
27
|
+
const traceabilityManifestPresent = await fileExists(join(sddRoot, traceabilityManifestPath));
|
|
28
|
+
return {
|
|
29
|
+
sddRoot,
|
|
30
|
+
service,
|
|
31
|
+
capability,
|
|
32
|
+
domain,
|
|
33
|
+
repoConfig,
|
|
34
|
+
featureSpecCount: featureSpecs.length,
|
|
35
|
+
featureSpecRelativePaths,
|
|
36
|
+
capabilitySpecPresent,
|
|
37
|
+
capabilitySpecPath,
|
|
38
|
+
traceabilityManifestPresent,
|
|
39
|
+
traceabilityManifestPath,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async function readRepoConfigFor(sddRoot, manifestAbsPath) {
|
|
43
|
+
const empty = {
|
|
44
|
+
path: manifestAbsPath,
|
|
45
|
+
aggregates: [],
|
|
46
|
+
internalDependencies: [],
|
|
47
|
+
contracts: { openapi: [], proto: [], avro: [], spicedb: [] },
|
|
48
|
+
};
|
|
49
|
+
if (!(await fileExists(manifestAbsPath)))
|
|
50
|
+
return empty;
|
|
51
|
+
const reader = liveReader(sddRoot);
|
|
52
|
+
const relPath = relative(sddRoot, manifestAbsPath);
|
|
53
|
+
const warnings = [];
|
|
54
|
+
const node = parseRepoConfigFile(reader, relPath, warnings);
|
|
55
|
+
if (!node)
|
|
56
|
+
return empty;
|
|
57
|
+
return legacyShape(node, manifestAbsPath);
|
|
58
|
+
}
|
|
59
|
+
function legacyShape(node, sourcePath) {
|
|
60
|
+
const byKind = {
|
|
61
|
+
openapi: [],
|
|
62
|
+
proto: [],
|
|
63
|
+
avro: [],
|
|
64
|
+
spicedb: [],
|
|
65
|
+
};
|
|
66
|
+
for (const ref of node.contracts)
|
|
67
|
+
byKind[ref.kind].push(ref.path);
|
|
68
|
+
return {
|
|
69
|
+
path: sourcePath,
|
|
70
|
+
...(node.description !== undefined ? { description: node.description } : {}),
|
|
71
|
+
...(node.serviceType !== undefined ? { serviceType: node.serviceType } : {}),
|
|
72
|
+
aggregates: Array.from(node.aggregates),
|
|
73
|
+
internalDependencies: Array.from(node.internalDependencies),
|
|
74
|
+
contracts: byKind,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async function listFeatureSpecs(featuresDir) {
|
|
78
|
+
if (!(await fileExists(featuresDir)))
|
|
79
|
+
return [];
|
|
80
|
+
const entries = await readdir(featuresDir);
|
|
81
|
+
const specs = [];
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
if (!entry.endsWith(".md"))
|
|
84
|
+
continue;
|
|
85
|
+
const full = join(featuresDir, entry);
|
|
86
|
+
const s = await stat(full);
|
|
87
|
+
if (s.isFile())
|
|
88
|
+
specs.push(entry);
|
|
89
|
+
}
|
|
90
|
+
specs.sort();
|
|
91
|
+
return specs;
|
|
92
|
+
}
|
|
93
|
+
async function fileExists(path) {
|
|
94
|
+
try {
|
|
95
|
+
await access(path);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=read-sdd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-sdd.js","sourceRoot":"","sources":["../../../src/lib/plan/read-sdd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SddSnapshot } from "./read-sdd.js";
|
|
2
|
+
export interface RenderInputs {
|
|
3
|
+
snapshot: SddSnapshot;
|
|
4
|
+
platformCliVersionHint: string;
|
|
5
|
+
today: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function renderPilotKickoff(inputs: RenderInputs): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=render-template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-template.d.ts","sourceRoot":"","sources":["../../../src/lib/plan/render-template.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAKjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,CAAC;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAa9E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const TEMPLATE_REL_PATH = "docs/method/methods/pilot-kickoff-template.md";
|
|
4
|
+
const VAR_PATTERN = /\{\{\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\}\}/g;
|
|
5
|
+
export async function renderPilotKickoff(inputs) {
|
|
6
|
+
const { snapshot } = inputs;
|
|
7
|
+
const templatePath = join(snapshot.sddRoot, TEMPLATE_REL_PATH);
|
|
8
|
+
const template = await readFile(templatePath, "utf8");
|
|
9
|
+
const vars = buildVars(inputs);
|
|
10
|
+
return template.replace(VAR_PATTERN, (match, name) => {
|
|
11
|
+
if (!(name in vars)) {
|
|
12
|
+
// Leave unknown placeholders intact so the human can see what wasn't
|
|
13
|
+
// prefilled and fill it themselves, rather than silently blanking.
|
|
14
|
+
return match;
|
|
15
|
+
}
|
|
16
|
+
return vars[name] ?? "";
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function buildVars(inputs) {
|
|
20
|
+
const { snapshot, platformCliVersionHint, today } = inputs;
|
|
21
|
+
const { repoConfig } = snapshot;
|
|
22
|
+
const inlineList = (items, sep = ", ") => items.length === 0 ? "_(none declared — fill in)_" : items.join(sep);
|
|
23
|
+
const bulletList = (items) => items.length === 0 ? "- _(none declared — fill in)_" : items.map((i) => `- ${i}`).join("\n");
|
|
24
|
+
return {
|
|
25
|
+
service_name: snapshot.service,
|
|
26
|
+
capability: snapshot.capability,
|
|
27
|
+
capability_display: toTitleCase(snapshot.capability.replace(/-/g, " ")),
|
|
28
|
+
domain: snapshot.domain,
|
|
29
|
+
domain_display: toTitleCase(snapshot.domain),
|
|
30
|
+
service_type: repoConfig.serviceType ?? "_(not declared — fill in)_",
|
|
31
|
+
today,
|
|
32
|
+
platform_cli_version_hint: platformCliVersionHint,
|
|
33
|
+
capability_spec_path: snapshot.capabilitySpecPath,
|
|
34
|
+
capability_spec_present: snapshot.capabilitySpecPresent ? "present" : "**MISSING — author before kickoff**",
|
|
35
|
+
capability_spec_state: snapshot.capabilitySpecPresent
|
|
36
|
+
? "Exists; run `/validate-intent-quality` before kickoff"
|
|
37
|
+
: "**MISSING** — author before kickoff",
|
|
38
|
+
traceability_manifest_path: snapshot.traceabilityManifestPath,
|
|
39
|
+
traceability_manifest_present: snapshot.traceabilityManifestPresent ? "present" : "**MISSING — author before kickoff**",
|
|
40
|
+
traceability_manifest_state: snapshot.traceabilityManifestPresent
|
|
41
|
+
? "Exists; confirm `status:` before kickoff"
|
|
42
|
+
: "**MISSING** — author before kickoff",
|
|
43
|
+
feature_spec_count: String(snapshot.featureSpecCount),
|
|
44
|
+
feature_spec_paths_inline: inlineList(snapshot.featureSpecRelativePaths),
|
|
45
|
+
feature_spec_paths_list: bulletList(snapshot.featureSpecRelativePaths),
|
|
46
|
+
aggregate_count: String(repoConfig.aggregates.length),
|
|
47
|
+
aggregate_list_inline: inlineList(repoConfig.aggregates),
|
|
48
|
+
internal_dependencies_inline: repoConfig.internalDependencies.length === 0
|
|
49
|
+
? "_(none — zero internal mocking required)_"
|
|
50
|
+
: repoConfig.internalDependencies.join(", "),
|
|
51
|
+
openapi_count: String(repoConfig.contracts.openapi.length),
|
|
52
|
+
proto_count: String(repoConfig.contracts.proto.length),
|
|
53
|
+
avro_count: String(repoConfig.contracts.avro.length),
|
|
54
|
+
spicedb_count: String(repoConfig.contracts.spicedb.length),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function toTitleCase(s) {
|
|
58
|
+
return s.replace(/\b\w/g, (c) => c.toUpperCase());
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=render-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-template.js","sourceRoot":"","sources":["../../../src/lib/plan/render-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type Profile = "platform" | "application" | "integration";
|
|
2
|
+
export type RepoKind = "platform-product" | "application-product" | "integration-product";
|
|
3
|
+
export type BundleName = "platform-baseline" | "app-baseline" | "integration-baseline";
|
|
4
|
+
export declare const REPO_KIND_FILE = ".sdd-repo-kind";
|
|
5
|
+
/**
|
|
6
|
+
* Legacy marker filename from the pre-rebrand era. Read-only fallback during
|
|
7
|
+
* the rebrand transition: `readRepoKind` accepts either filename; `sync`
|
|
8
|
+
* auto-migrates legacy → canonical. New writes always use `REPO_KIND_FILE`.
|
|
9
|
+
* Drop after one minor-version overlap.
|
|
10
|
+
*/
|
|
11
|
+
export declare const LEGACY_REPO_KIND_FILE = ".iteraitive-repo-kind";
|
|
12
|
+
export declare function profileFromRepoKind(kind: RepoKind): Profile;
|
|
13
|
+
export declare function repoKindFromProfile(profile: Profile): RepoKind;
|
|
14
|
+
export declare function profileFromBundleName(name: BundleName): Profile;
|
|
15
|
+
export declare function bundleNameFromProfile(profile: Profile): BundleName;
|
|
16
|
+
export declare function isRepoKind(value: string): value is RepoKind;
|
|
17
|
+
export declare function isBundleName(value: string): value is BundleName;
|
|
18
|
+
export declare function readRepoKind(repoRoot: string): Promise<RepoKind | null>;
|
|
19
|
+
export declare function writeRepoKind(repoRoot: string, kind: RepoKind): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=repo-kind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-kind.d.ts","sourceRoot":"","sources":["../../src/lib/repo-kind.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,aAAa,GAAG,aAAa,CAAC;AAEjE,MAAM,MAAM,QAAQ,GAChB,kBAAkB,GAClB,qBAAqB,GACrB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,UAAU,GAClB,mBAAmB,GACnB,cAAc,GACd,sBAAsB,CAAC;AAE3B,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AA0B7D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAE3D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAE9D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAE/D;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAElE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAE3D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,UAAU,CAE/D;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAoB7E;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export const REPO_KIND_FILE = ".sdd-repo-kind";
|
|
4
|
+
/**
|
|
5
|
+
* Legacy marker filename from the pre-rebrand era. Read-only fallback during
|
|
6
|
+
* the rebrand transition: `readRepoKind` accepts either filename; `sync`
|
|
7
|
+
* auto-migrates legacy → canonical. New writes always use `REPO_KIND_FILE`.
|
|
8
|
+
* Drop after one minor-version overlap.
|
|
9
|
+
*/
|
|
10
|
+
export const LEGACY_REPO_KIND_FILE = ".iteraitive-repo-kind";
|
|
11
|
+
const PROFILE_BY_REPO_KIND = {
|
|
12
|
+
"platform-product": "platform",
|
|
13
|
+
"application-product": "application",
|
|
14
|
+
"integration-product": "integration",
|
|
15
|
+
};
|
|
16
|
+
const REPO_KIND_BY_PROFILE = {
|
|
17
|
+
platform: "platform-product",
|
|
18
|
+
application: "application-product",
|
|
19
|
+
integration: "integration-product",
|
|
20
|
+
};
|
|
21
|
+
const PROFILE_BY_BUNDLE_NAME = {
|
|
22
|
+
"platform-baseline": "platform",
|
|
23
|
+
"app-baseline": "application",
|
|
24
|
+
"integration-baseline": "integration",
|
|
25
|
+
};
|
|
26
|
+
const BUNDLE_NAME_BY_PROFILE = {
|
|
27
|
+
platform: "platform-baseline",
|
|
28
|
+
application: "app-baseline",
|
|
29
|
+
integration: "integration-baseline",
|
|
30
|
+
};
|
|
31
|
+
export function profileFromRepoKind(kind) {
|
|
32
|
+
return PROFILE_BY_REPO_KIND[kind];
|
|
33
|
+
}
|
|
34
|
+
export function repoKindFromProfile(profile) {
|
|
35
|
+
return REPO_KIND_BY_PROFILE[profile];
|
|
36
|
+
}
|
|
37
|
+
export function profileFromBundleName(name) {
|
|
38
|
+
return PROFILE_BY_BUNDLE_NAME[name];
|
|
39
|
+
}
|
|
40
|
+
export function bundleNameFromProfile(profile) {
|
|
41
|
+
return BUNDLE_NAME_BY_PROFILE[profile];
|
|
42
|
+
}
|
|
43
|
+
export function isRepoKind(value) {
|
|
44
|
+
return value in PROFILE_BY_REPO_KIND;
|
|
45
|
+
}
|
|
46
|
+
export function isBundleName(value) {
|
|
47
|
+
return value in PROFILE_BY_BUNDLE_NAME;
|
|
48
|
+
}
|
|
49
|
+
export async function readRepoKind(repoRoot) {
|
|
50
|
+
// Canonical first; fall back to legacy marker during the rebrand transition.
|
|
51
|
+
for (const filename of [REPO_KIND_FILE, LEGACY_REPO_KIND_FILE]) {
|
|
52
|
+
const path = join(repoRoot, filename);
|
|
53
|
+
let raw;
|
|
54
|
+
try {
|
|
55
|
+
raw = await readFile(path, "utf8");
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
if (err.code === "ENOENT")
|
|
59
|
+
continue;
|
|
60
|
+
throw err;
|
|
61
|
+
}
|
|
62
|
+
const value = raw.trim();
|
|
63
|
+
if (!isRepoKind(value)) {
|
|
64
|
+
throw new Error(`Unrecognised ${filename} value: ${JSON.stringify(value)} at ${path}`);
|
|
65
|
+
}
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
export async function writeRepoKind(repoRoot, kind) {
|
|
71
|
+
await writeFile(join(repoRoot, REPO_KIND_FILE), `${kind}\n`, "utf8");
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=repo-kind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-kind.js","sourceRoot":"","sources":["../../src/lib/repo-kind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAcjC,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAC/C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAE7D,MAAM,oBAAoB,GAAwC;IAChE,kBAAkB,EAAE,UAAU;IAC9B,qBAAqB,EAAE,aAAa;IACpC,qBAAqB,EAAE,aAAa;CACrC,CAAC;AAEF,MAAM,oBAAoB,GAAwC;IAChE,QAAQ,EAAE,kBAAkB;IAC5B,WAAW,EAAE,qBAAqB;IAClC,WAAW,EAAE,qBAAqB;CACnC,CAAC;AAEF,MAAM,sBAAsB,GAA0C;IACpE,mBAAmB,EAAE,UAAU;IAC/B,cAAc,EAAE,aAAa;IAC7B,sBAAsB,EAAE,aAAa;CACtC,CAAC;AAEF,MAAM,sBAAsB,GAA0C;IACpE,QAAQ,EAAE,mBAAmB;IAC7B,WAAW,EAAE,cAAc;IAC3B,WAAW,EAAE,sBAAsB;CACpC,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,IAAc;IAChD,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAgB;IACpD,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK,IAAI,oBAAoB,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,IAAI,sBAAsB,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,6EAA6E;IAC7E,KAAK,MAAM,QAAQ,IAAI,CAAC,cAAc,EAAE,qBAAqB,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtC,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAC/D,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,gBAAgB,QAAQ,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CACtE,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,IAAc;IAEd,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.d.ts","sourceRoot":"","sources":["../../src/lib/scripts.ts"],"names":[],"mappings":"AAGA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGzD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { dirname, resolve } from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
export function resolveBundledScript(name) {
|
|
4
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
return resolve(here, "..", "..", "scripts", name);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/lib/scripts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library-level wrapper around `validate-cascade-completeness.sh --json`.
|
|
3
|
+
* Extracted from `src/lib/mcp/tools/cascade-impact.ts` so the tool and
|
|
4
|
+
* the Phase 5 `evaluate_cascade` prompt share one implementation.
|
|
5
|
+
*
|
|
6
|
+
* Structured errors are returned via `CascadeImpactError` rather than
|
|
7
|
+
* thrown at the McpEnvelopeError layer — callers decide whether to
|
|
8
|
+
* propagate as a tool error or embed in a prompt message.
|
|
9
|
+
*/
|
|
10
|
+
import type { SddReader } from "../mcp/reader.js";
|
|
11
|
+
export declare const VALIDATOR_REL_PATH = "orchestration/scripts/validate-cascade-completeness.sh";
|
|
12
|
+
export type CascadeChangeType = "service" | "capability" | "entity";
|
|
13
|
+
export interface CascadeImpactArgs {
|
|
14
|
+
readonly change_type: CascadeChangeType;
|
|
15
|
+
readonly target: string;
|
|
16
|
+
}
|
|
17
|
+
export interface CascadeImpactPayload {
|
|
18
|
+
readonly query: {
|
|
19
|
+
readonly change_type: CascadeChangeType;
|
|
20
|
+
readonly target: string;
|
|
21
|
+
};
|
|
22
|
+
readonly affected: {
|
|
23
|
+
readonly services: ReadonlyArray<{
|
|
24
|
+
readonly service: string;
|
|
25
|
+
readonly domain: string | null;
|
|
26
|
+
readonly aggregates: readonly string[];
|
|
27
|
+
readonly internal_dependencies: readonly string[];
|
|
28
|
+
}>;
|
|
29
|
+
readonly capabilities: readonly string[];
|
|
30
|
+
readonly entities: readonly string[];
|
|
31
|
+
readonly contracts: readonly string[];
|
|
32
|
+
};
|
|
33
|
+
readonly missing_cascades: Readonly<Record<string, unknown>>;
|
|
34
|
+
readonly links: readonly string[];
|
|
35
|
+
readonly pin_to_commit: string;
|
|
36
|
+
readonly sources: readonly string[];
|
|
37
|
+
}
|
|
38
|
+
export type CascadeErrorCode = "CASCADE_VALIDATOR_UNAVAILABLE" | "CASCADE_VALIDATOR_FAILED" | "CASCADE_VALIDATOR_OUTPUT_INVALID";
|
|
39
|
+
export declare class CascadeImpactError extends Error {
|
|
40
|
+
readonly code: CascadeErrorCode;
|
|
41
|
+
readonly remediation: string;
|
|
42
|
+
readonly context: Record<string, unknown>;
|
|
43
|
+
constructor(code: CascadeErrorCode, message: string, remediation: string, context?: Record<string, unknown>);
|
|
44
|
+
}
|
|
45
|
+
export declare function runCascadeImpact(reader: SddReader, args: CascadeImpactArgs): CascadeImpactPayload;
|
|
46
|
+
//# sourceMappingURL=cascade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cascade.d.ts","sourceRoot":"","sources":["../../../src/lib/sdd-index/cascade.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD,eAAO,MAAM,kBAAkB,2DAC2B,CAAC;AAE3D,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACrF,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;YAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;YACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;YAC/B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;YACvC,QAAQ,CAAC,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;QACH,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;QACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;QACrC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;KACvC,CAAC;IACF,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,MAAM,gBAAgB,GACxB,+BAA+B,GAC/B,0BAA0B,GAC1B,kCAAkC,CAAC;AAEvC,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAGxC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAQxC;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,iBAAiB,GACtB,oBAAoB,CAuFtB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library-level wrapper around `validate-cascade-completeness.sh --json`.
|
|
3
|
+
* Extracted from `src/lib/mcp/tools/cascade-impact.ts` so the tool and
|
|
4
|
+
* the Phase 5 `evaluate_cascade` prompt share one implementation.
|
|
5
|
+
*
|
|
6
|
+
* Structured errors are returned via `CascadeImpactError` rather than
|
|
7
|
+
* thrown at the McpEnvelopeError layer — callers decide whether to
|
|
8
|
+
* propagate as a tool error or embed in a prompt message.
|
|
9
|
+
*/
|
|
10
|
+
import { spawnSync } from "node:child_process";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { getSddIndex } from "./index.js";
|
|
13
|
+
export const VALIDATOR_REL_PATH = "orchestration/scripts/validate-cascade-completeness.sh";
|
|
14
|
+
export class CascadeImpactError extends Error {
|
|
15
|
+
code;
|
|
16
|
+
remediation;
|
|
17
|
+
context;
|
|
18
|
+
constructor(code, message, remediation, context = {}) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.name = "CascadeImpactError";
|
|
21
|
+
this.code = code;
|
|
22
|
+
this.remediation = remediation;
|
|
23
|
+
this.context = context;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function runCascadeImpact(reader, args) {
|
|
27
|
+
const validator = join(reader.sddRoot, VALIDATOR_REL_PATH);
|
|
28
|
+
if (!reader.isFile(VALIDATOR_REL_PATH)) {
|
|
29
|
+
throw new CascadeImpactError("CASCADE_VALIDATOR_UNAVAILABLE", `Cascade validator script not found at ${VALIDATOR_REL_PATH}.`, "The adopter SDD must ship orchestration/scripts/validate-cascade-completeness.sh (distributed by the method baseline). Run `sdd-cli sync` to refresh the orchestration tree, or hand-install the script from the canonical method repo.", { expected_path: VALIDATOR_REL_PATH, sdd_root: reader.sddRoot });
|
|
30
|
+
}
|
|
31
|
+
const mode = args.change_type === "entity"
|
|
32
|
+
? "entities"
|
|
33
|
+
: args.change_type === "capability"
|
|
34
|
+
? "capabilities"
|
|
35
|
+
: "services";
|
|
36
|
+
const result = spawnSync(validator, ["--json", mode, args.target], { cwd: reader.sddRoot, encoding: "utf8", timeout: 30_000 });
|
|
37
|
+
if (result.status !== 0) {
|
|
38
|
+
throw new CascadeImpactError("CASCADE_VALIDATOR_FAILED", `Cascade validator exited with code ${result.status ?? "(killed)"}.`, "Run the script directly to reproduce and inspect stderr. The MCP tool does not interpret non-zero exits.", {
|
|
39
|
+
exit_code: result.status,
|
|
40
|
+
stderr: result.stderr.slice(0, 2000),
|
|
41
|
+
command: [validator, "--json", mode, args.target],
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
let scriptOutput;
|
|
45
|
+
try {
|
|
46
|
+
scriptOutput = JSON.parse(result.stdout);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
throw new CascadeImpactError("CASCADE_VALIDATOR_OUTPUT_INVALID", `Cascade validator stdout was not valid JSON (${err.message}).`, "The script should emit a JSON object when called with --json. If the installed script does not yet support --json, upgrade the adopter orchestration tree or open an upstream PR against sdd-method.", { stdout_prefix: result.stdout.slice(0, 500) });
|
|
50
|
+
}
|
|
51
|
+
const index = getSddIndex(reader);
|
|
52
|
+
const affected = scriptOutput["affected"] ?? {};
|
|
53
|
+
const affectedServices = asStringArray(affected["services"]);
|
|
54
|
+
const servicesWithMetadata = affectedServices.map((id) => {
|
|
55
|
+
const svc = index.services.get(id);
|
|
56
|
+
return {
|
|
57
|
+
service: id,
|
|
58
|
+
domain: svc?.domain ?? null,
|
|
59
|
+
aggregates: svc ? Array.from(svc.aggregates) : [],
|
|
60
|
+
internal_dependencies: svc ? Array.from(svc.internalDependencies) : [],
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
const links = [];
|
|
64
|
+
for (const contractPath of asStringArray(affected["contracts"])) {
|
|
65
|
+
links.push(`sdd://contracts/${contractPath}`);
|
|
66
|
+
}
|
|
67
|
+
for (const id of affectedServices) {
|
|
68
|
+
const svc = index.services.get(id);
|
|
69
|
+
if (svc)
|
|
70
|
+
links.push(`sdd://repo-config/${svc.domain}/${id}`);
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
query: { change_type: args.change_type, target: args.target },
|
|
74
|
+
affected: {
|
|
75
|
+
services: servicesWithMetadata,
|
|
76
|
+
capabilities: asStringArray(affected["capabilities"]),
|
|
77
|
+
entities: asStringArray(affected["entities"]),
|
|
78
|
+
contracts: asStringArray(affected["contracts"]),
|
|
79
|
+
},
|
|
80
|
+
missing_cascades: scriptOutput["missing_cascades"] ?? {},
|
|
81
|
+
links,
|
|
82
|
+
pin_to_commit: reader.pin,
|
|
83
|
+
sources: [`sdd://${VALIDATOR_REL_PATH}`],
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function asStringArray(v) {
|
|
87
|
+
if (!Array.isArray(v))
|
|
88
|
+
return [];
|
|
89
|
+
return v.filter((x) => typeof x === "string");
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=cascade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cascade.js","sourceRoot":"","sources":["../../../src/lib/sdd-index/cascade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract producer metadata from contract artefacts.
|
|
3
|
+
*
|
|
4
|
+
* Each adopter uses different conventions inside the raw artefact
|
|
5
|
+
* format (OpenAPI `x-*` extensions, proto options, Avro doc fields,
|
|
6
|
+
* SpiceDB comments). We try a few best-effort patterns and fall back
|
|
7
|
+
* to marking the node as metadata-incomplete — it's better to return
|
|
8
|
+
* a partial graph than to fail hard.
|
|
9
|
+
*
|
|
10
|
+
* The shape we care about:
|
|
11
|
+
* - `producedAggregates` — aggregate names this contract describes
|
|
12
|
+
* - `producedEvents` — event names this contract publishes
|
|
13
|
+
*
|
|
14
|
+
* Producer / consumer *service* linkage is derived later in graph.ts
|
|
15
|
+
* from repo-config declarations, not from the artefact itself.
|
|
16
|
+
*/
|
|
17
|
+
import type { SddReader } from "../mcp/reader.js";
|
|
18
|
+
import type { ContractKind, ContractNode } from "./types.js";
|
|
19
|
+
export interface ContractParseResult {
|
|
20
|
+
readonly aggregates: readonly string[];
|
|
21
|
+
readonly events: readonly string[];
|
|
22
|
+
readonly metadataIncomplete: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parse a single contract artefact and return its producer metadata.
|
|
26
|
+
* `relPath` is relative to the SDD root.
|
|
27
|
+
*/
|
|
28
|
+
export declare function readContract(reader: SddReader, relPath: string, kind: ContractKind): ContractNode;
|
|
29
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../src/lib/sdd-index/contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CACtC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,YAAY,GACjB,YAAY,CAuBd"}
|