@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,48 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export const PROTECTED_PREFIXES = ["content/"];
|
|
4
|
+
export function findProtectedPaths(paths) {
|
|
5
|
+
return paths.filter((p) => PROTECTED_PREFIXES.some((prefix) => p.startsWith(prefix)));
|
|
6
|
+
}
|
|
7
|
+
export async function findMissingPayloadFiles(incomingPaths, payloadDir) {
|
|
8
|
+
const missing = [];
|
|
9
|
+
for (const p of incomingPaths) {
|
|
10
|
+
try {
|
|
11
|
+
await readFile(join(payloadDir, p));
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
if (err.code === "ENOENT")
|
|
15
|
+
missing.push(p);
|
|
16
|
+
else
|
|
17
|
+
throw err;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return missing;
|
|
21
|
+
}
|
|
22
|
+
export async function findConflicts(incomingPaths, payloadDir, targetRepo) {
|
|
23
|
+
const conflicts = [];
|
|
24
|
+
for (const p of incomingPaths) {
|
|
25
|
+
const targetPath = join(targetRepo, p);
|
|
26
|
+
let targetContent;
|
|
27
|
+
try {
|
|
28
|
+
targetContent = await readFile(targetPath);
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
if (err.code === "ENOENT")
|
|
32
|
+
continue;
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
const bundleContent = await readFile(join(payloadDir, p));
|
|
36
|
+
if (!targetContent.equals(bundleContent)) {
|
|
37
|
+
conflicts.push(p);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return conflicts;
|
|
41
|
+
}
|
|
42
|
+
export function computeRemovals(prevPaths, incomingPaths, options) {
|
|
43
|
+
if (options.noDelete)
|
|
44
|
+
return [];
|
|
45
|
+
const incoming = new Set(incomingPaths);
|
|
46
|
+
return prevPaths.filter((p) => !incoming.has(p));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/lib/sync/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,kBAAkB,GAAsB,CAAC,UAAU,CAAC,CAAC;AAElE,MAAM,UAAU,kBAAkB,CAAC,KAAwB;IACzD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACxB,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAC1D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,aAAgC,EAChC,UAAkB;IAElB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;gBACjE,MAAM,GAAG,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,aAAgC,EAChC,UAAkB,EAClB,UAAkB;IAElB,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACvC,IAAI,aAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,aAAa,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAC/D,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YACzC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,SAA4B,EAC5B,aAAgC,EAChC,OAA8B;IAE9B,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACxC,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface SyncOptions {
|
|
2
|
+
bundle: string;
|
|
3
|
+
targetRepo: string;
|
|
4
|
+
dryRun: boolean;
|
|
5
|
+
allowOverwrite: boolean;
|
|
6
|
+
delete: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* When set, sync upserts the harness-specific hooks baseline per
|
|
9
|
+
* ADR 0129. Unset = CI-only baseline.
|
|
10
|
+
*/
|
|
11
|
+
agentHarness?: "claude-code";
|
|
12
|
+
}
|
|
13
|
+
export interface SyncResult {
|
|
14
|
+
exitCode: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function runSync(opts: SyncOptions, stdout?: (line: string) => void): Promise<SyncResult>;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/index.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,wBAAsB,OAAO,CAC3B,IAAI,EAAE,WAAW,EACjB,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAA2C,GACpE,OAAO,CAAC,UAAU,CAAC,CAiMrB"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { access, readFile } from "node:fs/promises";
|
|
3
|
+
import { loadBundle } from "../bundle.js";
|
|
4
|
+
import { readLockFile, writeLockFile } from "../lock-file.js";
|
|
5
|
+
import { REPO_KIND_FILE, profileFromBundleName, repoKindFromProfile, writeRepoKind, } from "../repo-kind.js";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { copyManagedFiles, removeManagedFiles } from "./apply.js";
|
|
8
|
+
import { PROTECTED_PREFIXES, computeRemovals, findConflicts, findMissingPayloadFiles, findProtectedPaths, } from "./diff.js";
|
|
9
|
+
import { syncMethodManagedSettings } from "./settings-merge.js";
|
|
10
|
+
import { renderMethodManagedWorkflowBlock, renderMethodValidationWorkflow, WORKFLOW_REL_PATH, BLOCK_BEGIN, BLOCK_END, } from "../init/ci-workflow.js";
|
|
11
|
+
import { detectBlockDrift, writeMarkedBlockFile, } from "./yaml-block-merge.js";
|
|
12
|
+
const SECTION_RULE = "═".repeat(59);
|
|
13
|
+
export async function runSync(opts, stdout = (line) => process.stdout.write(line)) {
|
|
14
|
+
if (!(await exists(opts.bundle))) {
|
|
15
|
+
stdout(fail(`Bundle not found: ${opts.bundle}`));
|
|
16
|
+
return { exitCode: 1 };
|
|
17
|
+
}
|
|
18
|
+
if (!(await exists(opts.targetRepo))) {
|
|
19
|
+
stdout(fail(`Target repo not found: ${opts.targetRepo}`));
|
|
20
|
+
return { exitCode: 1 };
|
|
21
|
+
}
|
|
22
|
+
stdout(section("Sync Method Baseline"));
|
|
23
|
+
const bundle = await loadBundle(opts.bundle);
|
|
24
|
+
try {
|
|
25
|
+
const missing = await findMissingPayloadFiles(bundle.managedPaths, bundle.payloadDir);
|
|
26
|
+
if (missing.length > 0) {
|
|
27
|
+
stdout(fail(`Missing payload file listed in MANAGED_PATHS.txt: ${missing[0]}`));
|
|
28
|
+
return { exitCode: 1 };
|
|
29
|
+
}
|
|
30
|
+
const protectedIncoming = findProtectedPaths(bundle.managedPaths);
|
|
31
|
+
if (protectedIncoming.length > 0) {
|
|
32
|
+
stdout(fail(`Incoming bundle attempts to manage protected product-owned path: ${protectedIncoming[0]}`));
|
|
33
|
+
stdout(fail(`Method baseline bundles must not manage files under: ${PROTECTED_PREFIXES.join(" ")}`));
|
|
34
|
+
return { exitCode: 1 };
|
|
35
|
+
}
|
|
36
|
+
const conflicts = await findConflicts(bundle.managedPaths, bundle.payloadDir, opts.targetRepo);
|
|
37
|
+
if (conflicts.length > 0 && !opts.allowOverwrite) {
|
|
38
|
+
stdout(fail(`Found ${conflicts.length} conflicting managed file(s). Re-run with --allow-overwrite to apply.`));
|
|
39
|
+
for (const p of conflicts)
|
|
40
|
+
stdout(` - ${p}\n`);
|
|
41
|
+
return { exitCode: 1 };
|
|
42
|
+
}
|
|
43
|
+
const prevLock = await readLockFile(opts.targetRepo);
|
|
44
|
+
const prevPaths = prevLock?.managedPaths ?? [];
|
|
45
|
+
const protectedPrev = findProtectedPaths(prevPaths);
|
|
46
|
+
if (protectedPrev.length > 0) {
|
|
47
|
+
stdout(fail(`Existing lock file contains protected product-owned path: ${protectedPrev[0]}`));
|
|
48
|
+
stdout(fail("Resolve this manually before refreshing the method baseline."));
|
|
49
|
+
return { exitCode: 1 };
|
|
50
|
+
}
|
|
51
|
+
const removals = computeRemovals(prevPaths, bundle.managedPaths, {
|
|
52
|
+
noDelete: !opts.delete,
|
|
53
|
+
});
|
|
54
|
+
stdout(info(`Incoming managed files: ${bundle.managedPaths.length}`));
|
|
55
|
+
stdout(info(`Conflicts: ${conflicts.length}`));
|
|
56
|
+
stdout(info(`Removals from previous baseline: ${removals.length}`));
|
|
57
|
+
stdout(info(`Protected ownership prefixes: ${PROTECTED_PREFIXES.join(" ")}`));
|
|
58
|
+
if (opts.dryRun) {
|
|
59
|
+
stdout(info("Dry run enabled. No files modified."));
|
|
60
|
+
if (conflicts.length > 0) {
|
|
61
|
+
stdout(info("Conflicting files:"));
|
|
62
|
+
for (const p of conflicts)
|
|
63
|
+
stdout(` - ${p}\n`);
|
|
64
|
+
}
|
|
65
|
+
if (removals.length > 0) {
|
|
66
|
+
stdout(info("Files that would be removed:"));
|
|
67
|
+
for (const p of removals)
|
|
68
|
+
stdout(` - ${p}\n`);
|
|
69
|
+
}
|
|
70
|
+
return { exitCode: 0 };
|
|
71
|
+
}
|
|
72
|
+
const profile = profileFromBundleName(bundle.manifest.bundleName);
|
|
73
|
+
const repoKind = repoKindFromProfile(profile);
|
|
74
|
+
await copyManagedFiles(bundle.managedPaths, bundle.payloadDir, opts.targetRepo);
|
|
75
|
+
await removeManagedFiles(removals, opts.targetRepo);
|
|
76
|
+
await writeRepoKind(opts.targetRepo, repoKind);
|
|
77
|
+
const settingsResult = await syncMethodManagedSettings({
|
|
78
|
+
targetRepo: opts.targetRepo,
|
|
79
|
+
profile,
|
|
80
|
+
allowOverwrite: opts.allowOverwrite,
|
|
81
|
+
...(opts.agentHarness ? { agentHarness: opts.agentHarness } : {}),
|
|
82
|
+
});
|
|
83
|
+
if (settingsResult.refused) {
|
|
84
|
+
const conflicts = [];
|
|
85
|
+
if (settingsResult.drifted.length > 0)
|
|
86
|
+
conflicts.push(`mcpServers: ${settingsResult.drifted.join(", ")}`);
|
|
87
|
+
if (settingsResult.hooksDrifted.length > 0)
|
|
88
|
+
conflicts.push(`hooks: ${settingsResult.hooksDrifted.join(", ")}`);
|
|
89
|
+
stdout(fail(`.claude/settings.json has adopter-modified method entries (${conflicts.join("; ")}). Re-run with --allow-overwrite to rewrite them.`));
|
|
90
|
+
return { exitCode: 1 };
|
|
91
|
+
}
|
|
92
|
+
if (settingsResult.wroteFile) {
|
|
93
|
+
const labels = [];
|
|
94
|
+
if (settingsResult.added.length > 0)
|
|
95
|
+
labels.push(`mcp added: ${settingsResult.added.join(", ")}`);
|
|
96
|
+
if (settingsResult.updated.length > 0)
|
|
97
|
+
labels.push(`mcp updated: ${settingsResult.updated.join(", ")}`);
|
|
98
|
+
if (settingsResult.hooksChangedEvents.length > 0)
|
|
99
|
+
labels.push(`hooks: ${settingsResult.hooksChangedEvents.join(", ")}`);
|
|
100
|
+
stdout(info(`Refreshed ${settingsResult.path} (${labels.join("; ") || "no changes"}).`));
|
|
101
|
+
}
|
|
102
|
+
const workflowBlock = renderMethodManagedWorkflowBlock(profile);
|
|
103
|
+
const workflowAbsPath = join(opts.targetRepo, WORKFLOW_REL_PATH);
|
|
104
|
+
const existingWorkflow = await tryReadFile(workflowAbsPath);
|
|
105
|
+
const blockDrifted = existingWorkflow !== null &&
|
|
106
|
+
detectBlockDrift(existingWorkflow, workflowBlock, {
|
|
107
|
+
begin: BLOCK_BEGIN,
|
|
108
|
+
end: BLOCK_END,
|
|
109
|
+
});
|
|
110
|
+
if (blockDrifted && !opts.allowOverwrite) {
|
|
111
|
+
stdout(fail(`${WORKFLOW_REL_PATH} has adopter edits inside the method-managed block. Re-run with --allow-overwrite to refresh, or revert the in-block changes.`));
|
|
112
|
+
return { exitCode: 1 };
|
|
113
|
+
}
|
|
114
|
+
// When the target file doesn't exist at all, seed with the full
|
|
115
|
+
// template (block + adopter footer). When it exists, write the
|
|
116
|
+
// block only — writeMarkedBlockFile preserves adopter content
|
|
117
|
+
// around the markers.
|
|
118
|
+
const incoming = existingWorkflow === null
|
|
119
|
+
? renderMethodValidationWorkflow(profile)
|
|
120
|
+
: workflowBlock;
|
|
121
|
+
const workflowResult = await writeMarkedBlockFile(workflowAbsPath, incoming, { begin: BLOCK_BEGIN, end: BLOCK_END }, opts.allowOverwrite);
|
|
122
|
+
if (workflowResult.refused) {
|
|
123
|
+
stdout(fail(`${WORKFLOW_REL_PATH} exists without method-managed markers — refusing to overwrite adopter content. Re-run with --allow-overwrite to replace the file.`));
|
|
124
|
+
return { exitCode: 1 };
|
|
125
|
+
}
|
|
126
|
+
if (workflowResult.changed) {
|
|
127
|
+
stdout(info(`Refreshed ${WORKFLOW_REL_PATH}.`));
|
|
128
|
+
}
|
|
129
|
+
const bundleSha = await sha256File(opts.bundle);
|
|
130
|
+
await writeLockFile(opts.targetRepo, {
|
|
131
|
+
methodRepo: "sdd-method",
|
|
132
|
+
bundleVersion: bundle.manifest.bundleVersion,
|
|
133
|
+
sourceCommit: bundle.manifest.sourceCommit,
|
|
134
|
+
bundleSha256: bundleSha,
|
|
135
|
+
syncedAtUtc: nowUtcIso(),
|
|
136
|
+
managedPaths: [...bundle.managedPaths],
|
|
137
|
+
});
|
|
138
|
+
stdout(pass(`Method baseline synced to: ${opts.targetRepo}`));
|
|
139
|
+
stdout(info("Updated lock file: method-baseline.lock"));
|
|
140
|
+
stdout(info(`Set repo kind marker: ${REPO_KIND_FILE} = ${repoKind}`));
|
|
141
|
+
return { exitCode: 0 };
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
await bundle.cleanup();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function section(title) {
|
|
148
|
+
return `\n${SECTION_RULE}\n ${title}\n${SECTION_RULE}\n\n`;
|
|
149
|
+
}
|
|
150
|
+
function info(msg) {
|
|
151
|
+
return `[INFO] ${msg}\n`;
|
|
152
|
+
}
|
|
153
|
+
function pass(msg) {
|
|
154
|
+
return `[PASS] ${msg}\n`;
|
|
155
|
+
}
|
|
156
|
+
function fail(msg) {
|
|
157
|
+
return `[FAIL] ${msg}\n`;
|
|
158
|
+
}
|
|
159
|
+
async function exists(path) {
|
|
160
|
+
try {
|
|
161
|
+
await access(path);
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async function tryReadFile(path) {
|
|
169
|
+
try {
|
|
170
|
+
await access(path);
|
|
171
|
+
return await readFile(path, "utf8");
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async function sha256File(path) {
|
|
178
|
+
const buf = await readFile(path);
|
|
179
|
+
return createHash("sha256").update(buf).digest("hex");
|
|
180
|
+
}
|
|
181
|
+
function nowUtcIso() {
|
|
182
|
+
return new Date().toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EACL,gCAAgC,EAChC,8BAA8B,EAC9B,iBAAiB,EACjB,WAAW,EACX,SAAS,GACV,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAmB/B,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAiB,EACjB,SAAiC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IAErE,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACjD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC1D,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAExC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAC3C,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,UAAU,CAClB,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,CACJ,IAAI,CAAC,qDAAqD,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CACxE,CAAC;YACF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAClE,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,CACJ,IAAI,CACF,oEAAoE,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAC3F,CACF,CAAC;YACF,MAAM,CACJ,IAAI,CACF,wDAAwD,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACvF,CACF,CAAC;YACF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,aAAa,CACnC,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,UAAU,EACjB,IAAI,CAAC,UAAU,CAChB,CAAC;QACF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACjD,MAAM,CACJ,IAAI,CACF,SAAS,SAAS,CAAC,MAAM,uEAAuE,CACjG,CACF,CAAC;YACF,KAAK,MAAM,CAAC,IAAI,SAAS;gBAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,QAAQ,EAAE,YAAY,IAAI,EAAE,CAAC;QAC/C,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,CACJ,IAAI,CACF,6DAA6D,aAAa,CAAC,CAAC,CAAC,EAAE,CAChF,CACF,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,CAAC;YAC7E,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE;YAC/D,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,cAAc,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,oCAAoC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,iCAAiC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAE9E,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;YACpD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBACnC,KAAK,MAAM,CAAC,IAAI,SAAS;oBAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBAC7C,KAAK,MAAM,CAAC,IAAI,QAAQ;oBAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACjD,CAAC;YACD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAE9C,MAAM,gBAAgB,CACpB,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,UAAU,EACjB,IAAI,CAAC,UAAU,CAChB,CAAC;QACF,MAAM,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAE/C,MAAM,cAAc,GAAG,MAAM,yBAAyB,CAAC;YACrD,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO;YACP,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClE,CAAC,CAAC;QACH,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,IAAI,cAAc,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBACnC,SAAS,CAAC,IAAI,CAAC,eAAe,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrE,IAAI,cAAc,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;gBACxC,SAAS,CAAC,IAAI,CAAC,UAAU,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrE,MAAM,CACJ,IAAI,CACF,8DAA8D,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,mDAAmD,CACtI,CACF,CAAC;YACF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,cAAc,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/D,IAAI,cAAc,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,gBAAgB,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnE,IAAI,cAAc,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,UAAU,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxE,MAAM,CACJ,IAAI,CAAC,aAAa,cAAc,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,CACjF,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,gCAAgC,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QACjE,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,eAAe,CAAC,CAAC;QAC5D,MAAM,YAAY,GAChB,gBAAgB,KAAK,IAAI;YACzB,gBAAgB,CAAC,gBAAgB,EAAE,aAAa,EAAE;gBAChD,KAAK,EAAE,WAAW;gBAClB,GAAG,EAAE,SAAS;aACf,CAAC,CAAC;QACL,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzC,MAAM,CACJ,IAAI,CACF,GAAG,iBAAiB,+HAA+H,CACpJ,CACF,CAAC;YACF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACzB,CAAC;QACD,gEAAgE;QAChE,+DAA+D;QAC/D,8DAA8D;QAC9D,sBAAsB;QACtB,MAAM,QAAQ,GACZ,gBAAgB,KAAK,IAAI;YACvB,CAAC,CAAC,8BAA8B,CAAC,OAAO,CAAC;YACzC,CAAC,CAAC,aAAa,CAAC;QACpB,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAC/C,eAAe,EACf,QAAQ,EACR,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,EACtC,IAAI,CAAC,cAAc,CACpB,CAAC;QACF,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,CACJ,IAAI,CACF,GAAG,iBAAiB,oIAAoI,CACzJ,CACF,CAAC;YACF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,aAAa,iBAAiB,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE;YACnC,UAAU,EAAE,YAAY;YACxB,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa;YAC5C,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY;YAC1C,YAAY,EAAE,SAAS;YACvB,WAAW,EAAE,SAAS,EAAE;YACxB,YAAY,EAAE,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;SACvC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,8BAA8B,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,yBAAyB,cAAc,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC;QACtE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,KAAK,YAAY,OAAO,KAAK,KAAK,YAAY,MAAM,CAAC;AAC9D,CAAC;AAED,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,UAAU,GAAG,IAAI,CAAC;AAC3B,CAAC;AAED,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,UAAU,GAAG,IAAI,CAAC;AAC3B,CAAC;AAED,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,UAAU,GAAG,IAAI,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `.claude/settings.json` merge pass during `sdd-cli sync`. Method-
|
|
3
|
+
* managed `mcpServers` entries (see src/lib/mcp-seed/) get upserted;
|
|
4
|
+
* any adopter-added entries or other top-level keys are preserved.
|
|
5
|
+
*
|
|
6
|
+
* The file cannot ship in the method baseline bundle because it
|
|
7
|
+
* carries per-adopter absolute paths. That's why this is a separate
|
|
8
|
+
* sync step, outside the bundle-driven `copyManagedFiles` path.
|
|
9
|
+
*
|
|
10
|
+
* Conflict handling mirrors ADR 0114: if the adopter has manually
|
|
11
|
+
* modified a method-owned entry, sync refuses unless
|
|
12
|
+
* `--allow-overwrite` is passed.
|
|
13
|
+
*/
|
|
14
|
+
import type { HookEventName } from "../hooks-seed/index.js";
|
|
15
|
+
import type { Profile } from "../repo-kind.js";
|
|
16
|
+
export interface SettingsMergeOptions {
|
|
17
|
+
readonly targetRepo: string;
|
|
18
|
+
readonly profile: Profile;
|
|
19
|
+
readonly allowOverwrite: boolean;
|
|
20
|
+
/** When set, also upsert the harness-specific hooks baseline. */
|
|
21
|
+
readonly agentHarness?: "claude-code";
|
|
22
|
+
}
|
|
23
|
+
export interface SettingsMergeResult {
|
|
24
|
+
/** `.claude/settings.json` relative path; echoed for logging. */
|
|
25
|
+
readonly path: string;
|
|
26
|
+
/** Method-managed ids that drifted from the seed before this sync. */
|
|
27
|
+
readonly drifted: readonly string[];
|
|
28
|
+
/** Ids added by this run (not previously present). */
|
|
29
|
+
readonly added: readonly string[];
|
|
30
|
+
/** Ids updated by this run (previously present but different). */
|
|
31
|
+
readonly updated: readonly string[];
|
|
32
|
+
/** Ids unchanged. */
|
|
33
|
+
readonly unchanged: readonly string[];
|
|
34
|
+
/** Hook events touched by this run (empty when hooks layer skipped). */
|
|
35
|
+
readonly hooksChangedEvents: readonly HookEventName[];
|
|
36
|
+
/** Hook events where adopter drift was detected. */
|
|
37
|
+
readonly hooksDrifted: readonly HookEventName[];
|
|
38
|
+
/** Whether the file was written. */
|
|
39
|
+
readonly wroteFile: boolean;
|
|
40
|
+
/** Set when drift exists and --allow-overwrite was not passed. */
|
|
41
|
+
readonly refused: boolean;
|
|
42
|
+
}
|
|
43
|
+
export declare const SETTINGS_REL_PATH = ".claude/settings.json";
|
|
44
|
+
export declare function syncMethodManagedSettings(opts: SettingsMergeOptions): Promise<SettingsMergeResult>;
|
|
45
|
+
//# sourceMappingURL=settings-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-merge.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/settings-merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAeH,OAAO,KAAK,EAAE,aAAa,EAAqB,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,iEAAiE;IACjE,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,qBAAqB;IACrB,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,wEAAwE;IACxE,QAAQ,CAAC,kBAAkB,EAAE,SAAS,aAAa,EAAE,CAAC;IACtD,oDAAoD;IACpD,QAAQ,CAAC,YAAY,EAAE,SAAS,aAAa,EAAE,CAAC;IAChD,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,iBAAiB,0BAA0B,CAAC;AAEzD,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CA2E9B"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `.claude/settings.json` merge pass during `sdd-cli sync`. Method-
|
|
3
|
+
* managed `mcpServers` entries (see src/lib/mcp-seed/) get upserted;
|
|
4
|
+
* any adopter-added entries or other top-level keys are preserved.
|
|
5
|
+
*
|
|
6
|
+
* The file cannot ship in the method baseline bundle because it
|
|
7
|
+
* carries per-adopter absolute paths. That's why this is a separate
|
|
8
|
+
* sync step, outside the bundle-driven `copyManagedFiles` path.
|
|
9
|
+
*
|
|
10
|
+
* Conflict handling mirrors ADR 0114: if the adopter has manually
|
|
11
|
+
* modified a method-owned entry, sync refuses unless
|
|
12
|
+
* `--allow-overwrite` is passed.
|
|
13
|
+
*/
|
|
14
|
+
import { access, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
15
|
+
import { dirname, join } from "node:path";
|
|
16
|
+
import { buildMethodManagedServers, detectManagedDrift, upsertMethodManagedServers, } from "../mcp-seed/index.js";
|
|
17
|
+
import { buildMethodManagedHooks, detectHooksDrift, upsertMethodManagedHooks, } from "../hooks-seed/index.js";
|
|
18
|
+
export const SETTINGS_REL_PATH = ".claude/settings.json";
|
|
19
|
+
export async function syncMethodManagedSettings(opts) {
|
|
20
|
+
const absPath = join(opts.targetRepo, SETTINGS_REL_PATH);
|
|
21
|
+
const existing = await readSettings(absPath);
|
|
22
|
+
const owned = buildMethodManagedServers(
|
|
23
|
+
// Only platform profile gets an explicit SDD_REPO_PATH — for
|
|
24
|
+
// platform the target repo IS the SDD. App/integration leave it
|
|
25
|
+
// empty so the adopter configures their sibling platform SDD
|
|
26
|
+
// manually (see docs/method/onboarding/mcp-harness-setup.md).
|
|
27
|
+
opts.profile === "platform" ? { sddRepoPath: opts.targetRepo } : {});
|
|
28
|
+
const drifted = detectManagedDrift(existing, owned);
|
|
29
|
+
const hooksActive = opts.agentHarness === "claude-code";
|
|
30
|
+
const ownedHooks = hooksActive ? buildMethodManagedHooks() : undefined;
|
|
31
|
+
const hooksDrifted = hooksActive && ownedHooks
|
|
32
|
+
? detectHooksDrift(existing, ownedHooks)
|
|
33
|
+
: [];
|
|
34
|
+
if ((drifted.length > 0 || hooksDrifted.length > 0) && !opts.allowOverwrite) {
|
|
35
|
+
return {
|
|
36
|
+
path: SETTINGS_REL_PATH,
|
|
37
|
+
drifted,
|
|
38
|
+
added: [],
|
|
39
|
+
updated: [],
|
|
40
|
+
unchanged: [],
|
|
41
|
+
hooksChangedEvents: [],
|
|
42
|
+
hooksDrifted,
|
|
43
|
+
wroteFile: false,
|
|
44
|
+
refused: true,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const mcpResult = upsertMethodManagedServers(existing, owned);
|
|
48
|
+
let nextSettings = mcpResult.settings;
|
|
49
|
+
let hooksChangedEvents = [];
|
|
50
|
+
if (hooksActive && ownedHooks) {
|
|
51
|
+
const hooksResult = upsertMethodManagedHooks(nextSettings, ownedHooks);
|
|
52
|
+
nextSettings = hooksResult.settings;
|
|
53
|
+
hooksChangedEvents = [...hooksResult.changedEvents];
|
|
54
|
+
}
|
|
55
|
+
const changed = mcpResult.changed || hooksChangedEvents.length > 0;
|
|
56
|
+
if (!changed) {
|
|
57
|
+
return {
|
|
58
|
+
path: SETTINGS_REL_PATH,
|
|
59
|
+
drifted,
|
|
60
|
+
added: mcpResult.added,
|
|
61
|
+
updated: mcpResult.updated,
|
|
62
|
+
unchanged: mcpResult.unchanged,
|
|
63
|
+
hooksChangedEvents: [],
|
|
64
|
+
hooksDrifted,
|
|
65
|
+
wroteFile: false,
|
|
66
|
+
refused: false,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
await mkdir(dirname(absPath), { recursive: true });
|
|
70
|
+
await writeFile(absPath, JSON.stringify(nextSettings, null, 2) + "\n", "utf8");
|
|
71
|
+
return {
|
|
72
|
+
path: SETTINGS_REL_PATH,
|
|
73
|
+
drifted,
|
|
74
|
+
added: mcpResult.added,
|
|
75
|
+
updated: mcpResult.updated,
|
|
76
|
+
unchanged: mcpResult.unchanged,
|
|
77
|
+
hooksChangedEvents,
|
|
78
|
+
hooksDrifted,
|
|
79
|
+
wroteFile: true,
|
|
80
|
+
refused: false,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async function readSettings(absPath) {
|
|
84
|
+
if (!(await fileExists(absPath)))
|
|
85
|
+
return {};
|
|
86
|
+
const raw = await readFile(absPath, "utf8");
|
|
87
|
+
if (raw.trim().length === 0)
|
|
88
|
+
return {};
|
|
89
|
+
try {
|
|
90
|
+
const parsed = JSON.parse(raw);
|
|
91
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
92
|
+
return parsed;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
/* fall through — treat malformed as empty so we at least seed method content */
|
|
97
|
+
}
|
|
98
|
+
return {};
|
|
99
|
+
}
|
|
100
|
+
async function fileExists(path) {
|
|
101
|
+
try {
|
|
102
|
+
await access(path);
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=settings-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-merge.js","sourceRoot":"","sources":["../../../src/lib/sync/settings-merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function isAdrPath(managedPath: string): boolean;
|
|
2
|
+
export declare function ensureSourceTag(content: string, tag: string): string;
|
|
3
|
+
export declare function stripSourceTag(content: string): string;
|
|
4
|
+
export declare function contentForCompare(managedPath: string, content: string): string;
|
|
5
|
+
//# sourceMappingURL=source-tag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-tag.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/source-tag.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAKtD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAiBpE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,MAAM,CAER"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const SOURCE_LINE_PREFIX = "* **Source:** ";
|
|
2
|
+
const STATUS_LINE_PREFIX = "* **Status:** ";
|
|
3
|
+
export function isAdrPath(managedPath) {
|
|
4
|
+
return (managedPath.startsWith("docs/platform/adr/") ||
|
|
5
|
+
managedPath.startsWith("docs/method/adr/"));
|
|
6
|
+
}
|
|
7
|
+
export function ensureSourceTag(content, tag) {
|
|
8
|
+
if (content.split("\n").some((line) => line.startsWith(SOURCE_LINE_PREFIX))) {
|
|
9
|
+
return content;
|
|
10
|
+
}
|
|
11
|
+
if (!content.split("\n").some((line) => line.startsWith(STATUS_LINE_PREFIX))) {
|
|
12
|
+
return content;
|
|
13
|
+
}
|
|
14
|
+
const out = [];
|
|
15
|
+
let inserted = false;
|
|
16
|
+
for (const line of content.split("\n")) {
|
|
17
|
+
out.push(line);
|
|
18
|
+
if (!inserted && line.startsWith(STATUS_LINE_PREFIX)) {
|
|
19
|
+
out.push(`${SOURCE_LINE_PREFIX}${tag}`);
|
|
20
|
+
inserted = true;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return out.join("\n");
|
|
24
|
+
}
|
|
25
|
+
export function stripSourceTag(content) {
|
|
26
|
+
return content
|
|
27
|
+
.split("\n")
|
|
28
|
+
.filter((line) => !line.startsWith(SOURCE_LINE_PREFIX))
|
|
29
|
+
.join("\n");
|
|
30
|
+
}
|
|
31
|
+
export function contentForCompare(managedPath, content) {
|
|
32
|
+
return isAdrPath(managedPath) ? stripSourceTag(content) : content;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=source-tag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-tag.js","sourceRoot":"","sources":["../../../src/lib/sync/source-tag.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAC5C,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAE5C,MAAM,UAAU,SAAS,CAAC,WAAmB;IAC3C,OAAO,CACL,WAAW,CAAC,UAAU,CAAC,oBAAoB,CAAC;QAC5C,WAAW,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,GAAW;IAC1D,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC;QAC5E,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC;QAC7E,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,IAAI,CAAC,GAAG,kBAAkB,GAAG,GAAG,EAAE,CAAC,CAAC;YACxC,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,OAAO;SACX,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;SACtD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,WAAmB,EACnB,OAAe;IAEf,OAAO,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge-aware write for files with `# method-managed: begin/end`
|
|
3
|
+
* markers. The method block is replaced; content outside the block
|
|
4
|
+
* (including content above a lone trailing block, or below it, or
|
|
5
|
+
* both) is preserved verbatim.
|
|
6
|
+
*
|
|
7
|
+
* Conflict model (per ADR 0114, narrowed to block scope):
|
|
8
|
+
* - If the existing file has no markers, treat it as adopter-authored.
|
|
9
|
+
* Refuse to replace unless `allowOverwrite` is true.
|
|
10
|
+
* - If the existing file has markers, upsert the block. Lines outside
|
|
11
|
+
* the markers survive unchanged.
|
|
12
|
+
* - Drift inside the block does not block here — callers compare the
|
|
13
|
+
* in-block slice to the incoming slice separately if they need
|
|
14
|
+
* refuse-on-drift semantics (see `detectBlockDrift`).
|
|
15
|
+
*/
|
|
16
|
+
export interface BlockMarkers {
|
|
17
|
+
readonly begin: string;
|
|
18
|
+
readonly end: string;
|
|
19
|
+
}
|
|
20
|
+
export interface BlockMergeResult {
|
|
21
|
+
/** Serialised output that should be written to disk. */
|
|
22
|
+
readonly output: string;
|
|
23
|
+
/** True if input lacked markers and `allowOverwrite` was false. */
|
|
24
|
+
readonly refused: boolean;
|
|
25
|
+
/** True if the output differs from the existing file. */
|
|
26
|
+
readonly changed: boolean;
|
|
27
|
+
/** The extracted pre-block and post-block adopter content (for debug). */
|
|
28
|
+
readonly preAdopter: string;
|
|
29
|
+
readonly postAdopter: string;
|
|
30
|
+
}
|
|
31
|
+
export interface MergeBlockOptions {
|
|
32
|
+
readonly existing: string | null;
|
|
33
|
+
readonly incomingBlock: string;
|
|
34
|
+
readonly markers: BlockMarkers;
|
|
35
|
+
readonly allowOverwrite: boolean;
|
|
36
|
+
}
|
|
37
|
+
export declare function mergeMarkedBlock(opts: MergeBlockOptions): BlockMergeResult;
|
|
38
|
+
/**
|
|
39
|
+
* Detect whether the method block in `existing` differs from the
|
|
40
|
+
* incoming block. Returns true if the adopter has edited inside the
|
|
41
|
+
* markers (drift); false if no markers, exact match, or no file.
|
|
42
|
+
* Callers use this to implement refuse-on-drift policy where desired.
|
|
43
|
+
*/
|
|
44
|
+
export declare function detectBlockDrift(existing: string | null, incomingBlock: string, markers: BlockMarkers): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Apply the merge and write the result to disk. Creates the target
|
|
47
|
+
* directory if absent.
|
|
48
|
+
*/
|
|
49
|
+
export declare function writeMarkedBlockFile(absPath: string, incomingBlock: string, markers: BlockMarkers, allowOverwrite: boolean): Promise<BlockMergeResult>;
|
|
50
|
+
//# sourceMappingURL=yaml-block-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-block-merge.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/yaml-block-merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,CA2D1E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,YAAY,GACpB,OAAO,CAOT;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,YAAY,EACrB,cAAc,EAAE,OAAO,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAa3B"}
|