@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,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public facade for the in-memory SDD index. Consumers call
|
|
3
|
+
* `getSddIndex(reader)` and get a fully-populated `SddIndex` with
|
|
4
|
+
* lazy-built, per-reader caching.
|
|
5
|
+
*
|
|
6
|
+
* Cache keying is by `sddRoot + pin` so a pinned read and a live read
|
|
7
|
+
* maintain separate indexes (scope doc §Pin semantics: pinned reads
|
|
8
|
+
* bypass live index; no drift detection).
|
|
9
|
+
*/
|
|
10
|
+
import { readContract } from "./contracts.js";
|
|
11
|
+
import { readExecutionMap } from "./execution-map.js";
|
|
12
|
+
import { buildGraph } from "./graph.js";
|
|
13
|
+
import { readAllRepoConfigs } from "./repo-config.js";
|
|
14
|
+
export { REPO_CONFIG_DIR, parseRepoConfigFile, readAllRepoConfigs, } from "./repo-config.js";
|
|
15
|
+
export { EXECUTION_MAP_PATH, readExecutionMap } from "./execution-map.js";
|
|
16
|
+
export { readContract } from "./contracts.js";
|
|
17
|
+
export { buildGraph } from "./graph.js";
|
|
18
|
+
/** Internal cache: `${sddRoot}|${pin}` → index. */
|
|
19
|
+
const cache = new Map();
|
|
20
|
+
export function getSddIndex(reader) {
|
|
21
|
+
const key = `${reader.sddRoot}|${reader.pin}`;
|
|
22
|
+
const existing = cache.get(key);
|
|
23
|
+
if (existing)
|
|
24
|
+
return existing;
|
|
25
|
+
const fresh = buildSddIndex(reader);
|
|
26
|
+
cache.set(key, fresh);
|
|
27
|
+
return fresh;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Drop any cached index for the given reader. Called by the file-watch
|
|
31
|
+
* invalidation hook (WS6) when the SDD changes under a live reader.
|
|
32
|
+
* Pinned-reader caches are never invalidated — the tree at that SHA is
|
|
33
|
+
* immutable by definition.
|
|
34
|
+
*/
|
|
35
|
+
export function invalidateSddIndex(reader) {
|
|
36
|
+
if (reader.pin !== "HEAD")
|
|
37
|
+
return;
|
|
38
|
+
const key = `${reader.sddRoot}|${reader.pin}`;
|
|
39
|
+
cache.delete(key);
|
|
40
|
+
}
|
|
41
|
+
/** Exposed for tests; production callers should use getSddIndex(). */
|
|
42
|
+
export function clearSddIndexCache() {
|
|
43
|
+
cache.clear();
|
|
44
|
+
}
|
|
45
|
+
export function buildSddIndex(reader) {
|
|
46
|
+
const warnings = [];
|
|
47
|
+
const repoConfigResult = readAllRepoConfigs(reader);
|
|
48
|
+
warnings.push(...repoConfigResult.warnings);
|
|
49
|
+
const serviceList = Array.from(repoConfigResult.services);
|
|
50
|
+
// Build a unique set of contract refs across all services.
|
|
51
|
+
const contractKinds = new Map();
|
|
52
|
+
for (const svc of serviceList) {
|
|
53
|
+
for (const ref of svc.contracts) {
|
|
54
|
+
if (!contractKinds.has(ref.path))
|
|
55
|
+
contractKinds.set(ref.path, ref.kind);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const contractList = [];
|
|
59
|
+
for (const [path, kind] of contractKinds) {
|
|
60
|
+
contractList.push(readContract(reader, path, kind));
|
|
61
|
+
}
|
|
62
|
+
const mapResult = readExecutionMap(reader);
|
|
63
|
+
warnings.push(...mapResult.warnings);
|
|
64
|
+
const graph = buildGraph(serviceList, contractList, mapResult.edges);
|
|
65
|
+
warnings.push(...graph.warnings);
|
|
66
|
+
return {
|
|
67
|
+
sddRoot: reader.sddRoot,
|
|
68
|
+
pin: reader.pin,
|
|
69
|
+
builtAt: Date.now(),
|
|
70
|
+
services: graph.services,
|
|
71
|
+
contracts: graph.contracts,
|
|
72
|
+
producers: graph.producers,
|
|
73
|
+
consumers: graph.consumers,
|
|
74
|
+
pins: graph.pins,
|
|
75
|
+
executionEdges: mapResult.edges,
|
|
76
|
+
warnings,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/sdd-index/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse orchestration/repo-config/**\/*.yaml into ServiceNode records.
|
|
3
|
+
*
|
|
4
|
+
* Accepts both the pre-ADR-0110 shape (contracts as lists of path
|
|
5
|
+
* strings) and the extended shape (`{path, package?, version?, stability?}`).
|
|
6
|
+
* Unknown top-level fields are preserved in `ServiceNode.extra` so that
|
|
7
|
+
* adopter-specific schema additions don't get lost.
|
|
8
|
+
*/
|
|
9
|
+
import type { SddReader } from "../mcp/reader.js";
|
|
10
|
+
import type { ServiceNode } from "./types.js";
|
|
11
|
+
export declare const REPO_CONFIG_DIR = "orchestration/repo-config";
|
|
12
|
+
export interface RepoConfigReadResult {
|
|
13
|
+
readonly services: readonly ServiceNode[];
|
|
14
|
+
readonly warnings: readonly string[];
|
|
15
|
+
}
|
|
16
|
+
export declare function readAllRepoConfigs(reader: SddReader): RepoConfigReadResult;
|
|
17
|
+
/**
|
|
18
|
+
* Parse a single repo-config YAML file. `warnings` is appended to as a
|
|
19
|
+
* side channel — callers interested in parse quality should pass in a
|
|
20
|
+
* fresh array.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseRepoConfigFile(reader: SddReader, relPath: string, warnings: string[]): ServiceNode | null;
|
|
23
|
+
//# sourceMappingURL=repo-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-config.d.ts","sourceRoot":"","sources":["../../../src/lib/sdd-index/repo-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAGV,WAAW,EAEZ,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAS3D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,oBAAoB,CAW1E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,GACjB,WAAW,GAAG,IAAI,CAsFpB"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse orchestration/repo-config/**\/*.yaml into ServiceNode records.
|
|
3
|
+
*
|
|
4
|
+
* Accepts both the pre-ADR-0110 shape (contracts as lists of path
|
|
5
|
+
* strings) and the extended shape (`{path, package?, version?, stability?}`).
|
|
6
|
+
* Unknown top-level fields are preserved in `ServiceNode.extra` so that
|
|
7
|
+
* adopter-specific schema additions don't get lost.
|
|
8
|
+
*/
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { parse as parseYaml } from "yaml";
|
|
11
|
+
import { walkFiles } from "../mcp/reader.js";
|
|
12
|
+
export const REPO_CONFIG_DIR = "orchestration/repo-config";
|
|
13
|
+
const CONTRACT_KINDS = [
|
|
14
|
+
"openapi",
|
|
15
|
+
"proto",
|
|
16
|
+
"avro",
|
|
17
|
+
"spicedb",
|
|
18
|
+
];
|
|
19
|
+
export function readAllRepoConfigs(reader) {
|
|
20
|
+
const services = [];
|
|
21
|
+
const warnings = [];
|
|
22
|
+
const files = walkFiles(reader, REPO_CONFIG_DIR, (p) => p.endsWith(".yaml") || p.endsWith(".yml"));
|
|
23
|
+
for (const relPath of files) {
|
|
24
|
+
const parsed = parseRepoConfigFile(reader, relPath, warnings);
|
|
25
|
+
if (parsed)
|
|
26
|
+
services.push(parsed);
|
|
27
|
+
}
|
|
28
|
+
return { services, warnings };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parse a single repo-config YAML file. `warnings` is appended to as a
|
|
32
|
+
* side channel — callers interested in parse quality should pass in a
|
|
33
|
+
* fresh array.
|
|
34
|
+
*/
|
|
35
|
+
export function parseRepoConfigFile(reader, relPath, warnings) {
|
|
36
|
+
const raw = reader.readFile(relPath);
|
|
37
|
+
if (raw === null)
|
|
38
|
+
return null;
|
|
39
|
+
let doc;
|
|
40
|
+
try {
|
|
41
|
+
doc = parseYaml(raw);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
warnings.push(`repo-config: ${relPath} failed to parse as YAML (${err.message})`);
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
if (!doc || typeof doc !== "object" || Array.isArray(doc)) {
|
|
48
|
+
warnings.push(`repo-config: ${relPath} is not a YAML mapping`);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const record = doc;
|
|
52
|
+
// Derive identity from file path: orchestration/repo-config/{domain}/{service}.yaml
|
|
53
|
+
const pathParts = relPath.split("/");
|
|
54
|
+
const fileName = pathParts[pathParts.length - 1] ?? "";
|
|
55
|
+
const derivedDomain = pathParts[pathParts.length - 2];
|
|
56
|
+
const derivedId = fileName.replace(/\.ya?ml$/, "");
|
|
57
|
+
const id = stringField(record, "repo") ?? derivedId;
|
|
58
|
+
const domain = stringField(record, "domain") ?? derivedDomain ?? "";
|
|
59
|
+
if (!domain) {
|
|
60
|
+
warnings.push(`repo-config: ${relPath} missing domain (no 'domain' field and no parent directory)`);
|
|
61
|
+
}
|
|
62
|
+
const serviceType = stringField(record, "service_type");
|
|
63
|
+
const description = stringField(record, "description");
|
|
64
|
+
const aggregates = stringArray(record["aggregates"]);
|
|
65
|
+
const deps = record["dependencies"];
|
|
66
|
+
const internalDependencies = deps && typeof deps === "object" && !Array.isArray(deps)
|
|
67
|
+
? stringArray(deps["internal"])
|
|
68
|
+
: [];
|
|
69
|
+
const contractsRecord = record["contracts"] &&
|
|
70
|
+
typeof record["contracts"] === "object" &&
|
|
71
|
+
!Array.isArray(record["contracts"])
|
|
72
|
+
? record["contracts"]
|
|
73
|
+
: {};
|
|
74
|
+
const contracts = [];
|
|
75
|
+
for (const kind of CONTRACT_KINDS) {
|
|
76
|
+
const entries = contractsRecord[kind];
|
|
77
|
+
if (!Array.isArray(entries))
|
|
78
|
+
continue;
|
|
79
|
+
for (const entry of entries) {
|
|
80
|
+
const ref = parseContractEntry(entry, kind, relPath, warnings);
|
|
81
|
+
if (ref)
|
|
82
|
+
contracts.push(ref);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const reservedKeys = new Set([
|
|
86
|
+
"repo",
|
|
87
|
+
"domain",
|
|
88
|
+
"service_type",
|
|
89
|
+
"description",
|
|
90
|
+
"aggregates",
|
|
91
|
+
"dependencies",
|
|
92
|
+
"contracts",
|
|
93
|
+
]);
|
|
94
|
+
const extra = {};
|
|
95
|
+
for (const [k, v] of Object.entries(record)) {
|
|
96
|
+
if (!reservedKeys.has(k))
|
|
97
|
+
extra[k] = v;
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
id,
|
|
101
|
+
domain,
|
|
102
|
+
...(serviceType !== undefined ? { serviceType } : {}),
|
|
103
|
+
...(description !== undefined ? { description } : {}),
|
|
104
|
+
aggregates,
|
|
105
|
+
internalDependencies,
|
|
106
|
+
contracts,
|
|
107
|
+
sourcePath: join(reader.sddRoot, relPath),
|
|
108
|
+
...(Object.keys(extra).length > 0 ? { extra } : {}),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function parseContractEntry(entry, kind, sourceRel, warnings) {
|
|
112
|
+
if (typeof entry === "string") {
|
|
113
|
+
return { path: entry, kind };
|
|
114
|
+
}
|
|
115
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
116
|
+
warnings.push(`repo-config: ${sourceRel} contains a ${kind} contract entry that is neither string nor mapping`);
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
const obj = entry;
|
|
120
|
+
const path = stringField(obj, "path");
|
|
121
|
+
if (!path) {
|
|
122
|
+
warnings.push(`repo-config: ${sourceRel} has a ${kind} contract entry with no 'path'`);
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
const pkg = stringField(obj, "package");
|
|
126
|
+
const version = stringField(obj, "version");
|
|
127
|
+
const stability = parseStability(stringField(obj, "stability"));
|
|
128
|
+
return {
|
|
129
|
+
path,
|
|
130
|
+
kind,
|
|
131
|
+
...(pkg !== undefined ? { package: pkg } : {}),
|
|
132
|
+
...(version !== undefined ? { version } : {}),
|
|
133
|
+
...(stability !== undefined ? { stability } : {}),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function parseStability(v) {
|
|
137
|
+
if (v === "provisional" || v === "locked")
|
|
138
|
+
return v;
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
function stringField(record, key) {
|
|
142
|
+
const v = record[key];
|
|
143
|
+
return typeof v === "string" && v.length > 0 ? v : undefined;
|
|
144
|
+
}
|
|
145
|
+
function stringArray(v) {
|
|
146
|
+
if (!Array.isArray(v))
|
|
147
|
+
return [];
|
|
148
|
+
return v.filter((x) => typeof x === "string");
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=repo-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-config.js","sourceRoot":"","sources":["../../../src/lib/sdd-index/repo-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the in-memory SDD index that backs the Phase 2
|
|
3
|
+
* dependency-graph tools. Shape follows:
|
|
4
|
+
*
|
|
5
|
+
* - orchestration/repo-config/{domain}/{service}.yaml
|
|
6
|
+
* per ADR 0110 §4.3 (path + package + version + stability)
|
|
7
|
+
* - contract artefacts (OpenAPI / proto / Avro / SpiceDB)
|
|
8
|
+
* with producer metadata extracted where present
|
|
9
|
+
* - docs/platform/execution-dependency-map.md (optional overlay)
|
|
10
|
+
* per ADR 0074 §4.3
|
|
11
|
+
*/
|
|
12
|
+
export type ContractKind = "openapi" | "proto" | "avro" | "spicedb";
|
|
13
|
+
export type StabilityClass = "provisional" | "locked";
|
|
14
|
+
/** Dependency kinds from ADR 0073 / ADR 0074 §4.3. */
|
|
15
|
+
export type DependencyKind = "build-start" | "go-live" | "migration-dependency";
|
|
16
|
+
/**
|
|
17
|
+
* Consumer-side contract reference. Each repo-config entry declares how
|
|
18
|
+
* this service consumes (or produces) a given contract artefact.
|
|
19
|
+
*
|
|
20
|
+
* Pre-ADR-0110 entries that were raw strings are parsed as `{ path }`
|
|
21
|
+
* with no package/version/stability set. Consumers of this structure
|
|
22
|
+
* must tolerate undefined fields.
|
|
23
|
+
*/
|
|
24
|
+
export interface ContractRef {
|
|
25
|
+
readonly path: string;
|
|
26
|
+
readonly kind: ContractKind;
|
|
27
|
+
readonly package?: string;
|
|
28
|
+
readonly version?: string;
|
|
29
|
+
readonly stability?: StabilityClass;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* One row from orchestration/repo-config/{domain}/{service}.yaml, with
|
|
33
|
+
* the service's identity derived from the file path when the YAML does
|
|
34
|
+
* not declare it explicitly.
|
|
35
|
+
*/
|
|
36
|
+
export interface ServiceNode {
|
|
37
|
+
/** Service identity — YAML `repo` field, or derived from file basename. */
|
|
38
|
+
readonly id: string;
|
|
39
|
+
readonly domain: string;
|
|
40
|
+
readonly serviceType?: string;
|
|
41
|
+
readonly description?: string;
|
|
42
|
+
/** Aggregate names this service owns (repo-config `aggregates`). */
|
|
43
|
+
readonly aggregates: readonly string[];
|
|
44
|
+
/** Internal-service dependencies (repo-config `dependencies.internal`). */
|
|
45
|
+
readonly internalDependencies: readonly string[];
|
|
46
|
+
/** All contract refs declared by this service (from any type). */
|
|
47
|
+
readonly contracts: readonly ContractRef[];
|
|
48
|
+
/** Absolute path to the source YAML for debugging. */
|
|
49
|
+
readonly sourcePath: string;
|
|
50
|
+
/** Unknown YAML fields preserved for future compatibility. */
|
|
51
|
+
readonly extra?: Readonly<Record<string, unknown>>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* One contract artefact discovered during indexing. `producers` and
|
|
55
|
+
* `consumers` are populated by the graph-builder pass after all
|
|
56
|
+
* services have been read.
|
|
57
|
+
*/
|
|
58
|
+
export interface ContractNode {
|
|
59
|
+
readonly path: string;
|
|
60
|
+
readonly kind: ContractKind;
|
|
61
|
+
/** Aggregate / event names extracted from the artefact (producer side). */
|
|
62
|
+
readonly producedAggregates: readonly string[];
|
|
63
|
+
readonly producedEvents: readonly string[];
|
|
64
|
+
/** Service ids that claim to produce this contract (from repo-config). */
|
|
65
|
+
readonly producers: readonly string[];
|
|
66
|
+
/** Service ids that consume this contract (from repo-config). */
|
|
67
|
+
readonly consumers: readonly string[];
|
|
68
|
+
/** True when producer metadata could not be parsed cleanly. */
|
|
69
|
+
readonly metadataIncomplete: boolean;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Overlay edge from docs/platform/execution-dependency-map.md. This is
|
|
73
|
+
* an optional adopter-owned file; missing-is-fine.
|
|
74
|
+
*/
|
|
75
|
+
export interface ExecutionEdge {
|
|
76
|
+
readonly from: string;
|
|
77
|
+
readonly to: string;
|
|
78
|
+
readonly kind: DependencyKind;
|
|
79
|
+
readonly note?: string;
|
|
80
|
+
}
|
|
81
|
+
export interface SddIndex {
|
|
82
|
+
/** Absolute SDD root at the time the index was built. */
|
|
83
|
+
readonly sddRoot: string;
|
|
84
|
+
/** Resolved pin (SHA or "HEAD"). Echoed in tool responses. */
|
|
85
|
+
readonly pin: string;
|
|
86
|
+
/** Time the index was built, millis since epoch. */
|
|
87
|
+
readonly builtAt: number;
|
|
88
|
+
/** service-id → ServiceNode */
|
|
89
|
+
readonly services: ReadonlyMap<string, ServiceNode>;
|
|
90
|
+
/** contract path → ContractNode */
|
|
91
|
+
readonly contracts: ReadonlyMap<string, ContractNode>;
|
|
92
|
+
/** aggregate or event name → producer service ids */
|
|
93
|
+
readonly producers: ReadonlyMap<string, readonly string[]>;
|
|
94
|
+
/** aggregate or event name → consumer service ids */
|
|
95
|
+
readonly consumers: ReadonlyMap<string, readonly string[]>;
|
|
96
|
+
/** contract path → (service id → pinned version) */
|
|
97
|
+
readonly pins: ReadonlyMap<string, ReadonlyMap<string, string>>;
|
|
98
|
+
/** Overlay edges from the execution-dependency-map, if present. */
|
|
99
|
+
readonly executionEdges: readonly ExecutionEdge[];
|
|
100
|
+
/**
|
|
101
|
+
* Build-time warnings (malformed YAML, missing producer metadata,
|
|
102
|
+
* etc.) surfaced to callers as `metadata_incomplete: true` + details.
|
|
103
|
+
*/
|
|
104
|
+
readonly warnings: readonly string[];
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/sdd-index/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the in-memory SDD index that backs the Phase 2
|
|
3
|
+
* dependency-graph tools. Shape follows:
|
|
4
|
+
*
|
|
5
|
+
* - orchestration/repo-config/{domain}/{service}.yaml
|
|
6
|
+
* per ADR 0110 §4.3 (path + package + version + stability)
|
|
7
|
+
* - contract artefacts (OpenAPI / proto / Avro / SpiceDB)
|
|
8
|
+
* with producer metadata extracted where present
|
|
9
|
+
* - docs/platform/execution-dependency-map.md (optional overlay)
|
|
10
|
+
* per ADR 0074 §4.3
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/sdd-index/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index invalidation watcher. Polls mtimes on the directories that
|
|
3
|
+
* feed the SDD index at a fixed cadence (30s by default — matches the
|
|
4
|
+
* scope doc §Process lifecycle ceiling). On any change, drops the
|
|
5
|
+
* cached index for that reader so the next query triggers a rebuild.
|
|
6
|
+
*
|
|
7
|
+
* Poll-only by design: the scope doc notes that file-watch on NFS/SMB
|
|
8
|
+
* is unreliable and treats the 30s fallback as the documented ceiling.
|
|
9
|
+
* An adopter on a watch-capable filesystem can swap in chokidar later
|
|
10
|
+
* without changing the public surface.
|
|
11
|
+
*/
|
|
12
|
+
import type { SddReader } from "../mcp/reader.js";
|
|
13
|
+
export interface IndexWatcherOptions {
|
|
14
|
+
/** Poll interval in milliseconds. Default 30_000. */
|
|
15
|
+
readonly intervalMs?: number;
|
|
16
|
+
/** Optional callback fired after each detected change. */
|
|
17
|
+
readonly onInvalidate?: () => void;
|
|
18
|
+
}
|
|
19
|
+
export interface IndexWatcher {
|
|
20
|
+
/** Stop polling and release timers. Safe to call multiple times. */
|
|
21
|
+
stop(): void;
|
|
22
|
+
}
|
|
23
|
+
export declare function startIndexWatcher(reader: SddReader, opts?: IndexWatcherOptions): IndexWatcher;
|
|
24
|
+
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/lib/sdd-index/watch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAKlD,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,IAAI,IAAI,IAAI,CAAC;CACd;AAOD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,IAAI,GAAE,mBAAwB,GAC7B,YAAY,CA8Bd"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index invalidation watcher. Polls mtimes on the directories that
|
|
3
|
+
* feed the SDD index at a fixed cadence (30s by default — matches the
|
|
4
|
+
* scope doc §Process lifecycle ceiling). On any change, drops the
|
|
5
|
+
* cached index for that reader so the next query triggers a rebuild.
|
|
6
|
+
*
|
|
7
|
+
* Poll-only by design: the scope doc notes that file-watch on NFS/SMB
|
|
8
|
+
* is unreliable and treats the 30s fallback as the documented ceiling.
|
|
9
|
+
* An adopter on a watch-capable filesystem can swap in chokidar later
|
|
10
|
+
* without changing the public surface.
|
|
11
|
+
*/
|
|
12
|
+
import { readdirSync, statSync } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { invalidateSddIndex } from "./index.js";
|
|
15
|
+
import { REPO_CONFIG_DIR } from "./repo-config.js";
|
|
16
|
+
import { EXECUTION_MAP_PATH } from "./execution-map.js";
|
|
17
|
+
export function startIndexWatcher(reader, opts = {}) {
|
|
18
|
+
if (reader.pin !== "HEAD") {
|
|
19
|
+
// Pinned readers point at an immutable tree; no invalidation possible.
|
|
20
|
+
return { stop() { } };
|
|
21
|
+
}
|
|
22
|
+
const intervalMs = opts.intervalMs ?? 30_000;
|
|
23
|
+
let stopped = false;
|
|
24
|
+
let snapshot = takeSnapshot(reader);
|
|
25
|
+
const timer = setInterval(() => {
|
|
26
|
+
if (stopped)
|
|
27
|
+
return;
|
|
28
|
+
const next = takeSnapshot(reader);
|
|
29
|
+
if (!snapshotsEqual(snapshot, next)) {
|
|
30
|
+
snapshot = next;
|
|
31
|
+
invalidateSddIndex(reader);
|
|
32
|
+
opts.onInvalidate?.();
|
|
33
|
+
}
|
|
34
|
+
}, intervalMs);
|
|
35
|
+
// Don't keep the process alive for polling alone.
|
|
36
|
+
if (typeof timer.unref === "function")
|
|
37
|
+
timer.unref();
|
|
38
|
+
return {
|
|
39
|
+
stop() {
|
|
40
|
+
if (stopped)
|
|
41
|
+
return;
|
|
42
|
+
stopped = true;
|
|
43
|
+
clearInterval(timer);
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function takeSnapshot(reader) {
|
|
48
|
+
const repoConfigMtimes = new Map();
|
|
49
|
+
walkMtimes(reader.sddRoot, REPO_CONFIG_DIR, repoConfigMtimes);
|
|
50
|
+
const executionMapMtime = tryMtime(join(reader.sddRoot, EXECUTION_MAP_PATH));
|
|
51
|
+
return { repoConfigMtimes, executionMapMtime };
|
|
52
|
+
}
|
|
53
|
+
function walkMtimes(root, relDir, out) {
|
|
54
|
+
const absDir = join(root, relDir);
|
|
55
|
+
try {
|
|
56
|
+
const stat = statSync(absDir);
|
|
57
|
+
if (!stat.isDirectory())
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const stack = [absDir];
|
|
64
|
+
while (stack.length > 0) {
|
|
65
|
+
const dir = stack.pop();
|
|
66
|
+
if (!dir)
|
|
67
|
+
continue;
|
|
68
|
+
let entries;
|
|
69
|
+
try {
|
|
70
|
+
entries = readdirSync(dir);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
const full = join(dir, entry);
|
|
77
|
+
let s;
|
|
78
|
+
try {
|
|
79
|
+
s = statSync(full);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (s.isDirectory()) {
|
|
85
|
+
stack.push(full);
|
|
86
|
+
}
|
|
87
|
+
else if (s.isFile()) {
|
|
88
|
+
out.set(full, s.mtimeMs);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function tryMtime(path) {
|
|
94
|
+
try {
|
|
95
|
+
return statSync(path).mtimeMs;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function snapshotsEqual(a, b) {
|
|
102
|
+
if (a.executionMapMtime !== b.executionMapMtime)
|
|
103
|
+
return false;
|
|
104
|
+
if (a.repoConfigMtimes.size !== b.repoConfigMtimes.size)
|
|
105
|
+
return false;
|
|
106
|
+
for (const [k, v] of a.repoConfigMtimes) {
|
|
107
|
+
if (b.repoConfigMtimes.get(k) !== v)
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/lib/sdd-index/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface SpawnResult {
|
|
2
|
+
exitCode: number;
|
|
3
|
+
}
|
|
4
|
+
export interface SpawnOptions {
|
|
5
|
+
cwd?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function spawnBashScript(scriptPath: string, args: readonly string[], opts?: SpawnOptions): Promise<SpawnResult>;
|
|
8
|
+
//# sourceMappingURL=spawn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../src/lib/spawn.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,WAAW,CAAC,CAYtB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { access } from "node:fs/promises";
|
|
3
|
+
export async function spawnBashScript(scriptPath, args, opts = {}) {
|
|
4
|
+
await access(scriptPath);
|
|
5
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
6
|
+
const child = spawn("bash", [scriptPath, ...args], {
|
|
7
|
+
stdio: "inherit",
|
|
8
|
+
cwd: opts.cwd ?? process.cwd(),
|
|
9
|
+
});
|
|
10
|
+
child.on("error", rejectPromise);
|
|
11
|
+
child.on("close", (code) => {
|
|
12
|
+
resolvePromise({ exitCode: code ?? 1 });
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=spawn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/lib/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAU1C,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,IAAuB,EACvB,OAAqB,EAAE;IAEvB,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IACzB,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE;YACjD,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;SAC/B,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACjC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/apply.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { copyFile, mkdir, rm } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
export async function copyManagedFiles(incomingPaths, payloadDir, targetRepo) {
|
|
4
|
+
for (const p of incomingPaths) {
|
|
5
|
+
const src = join(payloadDir, p);
|
|
6
|
+
const dst = join(targetRepo, p);
|
|
7
|
+
await mkdir(dirname(dst), { recursive: true });
|
|
8
|
+
await copyFile(src, dst);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export async function removeManagedFiles(paths, targetRepo) {
|
|
12
|
+
for (const p of paths) {
|
|
13
|
+
await rm(join(targetRepo, p), { force: true });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/lib/sync/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAgC,EAChC,UAAkB,EAClB,UAAkB;IAElB,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAChC,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAwB,EACxB,UAAkB;IAElB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const PROTECTED_PREFIXES: readonly string[];
|
|
2
|
+
export declare function findProtectedPaths(paths: readonly string[]): string[];
|
|
3
|
+
export declare function findMissingPayloadFiles(incomingPaths: readonly string[], payloadDir: string): Promise<string[]>;
|
|
4
|
+
export declare function findConflicts(incomingPaths: readonly string[], payloadDir: string, targetRepo: string): Promise<string[]>;
|
|
5
|
+
export declare function computeRemovals(prevPaths: readonly string[], incomingPaths: readonly string[], options: {
|
|
6
|
+
noDelete: boolean;
|
|
7
|
+
}): string[];
|
|
8
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/diff.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAAiB,CAAC;AAElE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAIrE;AAED,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAWnB;AAED,wBAAsB,aAAa,CACjC,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,OAAO,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC7B,MAAM,EAAE,CAIV"}
|