forgecraft-mcp 1.4.0 → 1.7.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 +67 -0
- package/README.md +527 -525
- package/dist/analyzers/anchors/anchor-loader.d.ts +47 -0
- package/dist/analyzers/anchors/anchor-loader.d.ts.map +1 -0
- package/dist/analyzers/anchors/anchor-loader.js +113 -0
- package/dist/analyzers/anchors/anchor-loader.js.map +1 -0
- package/dist/analyzers/anti-pattern.d.ts.map +1 -1
- package/dist/analyzers/anti-pattern.js +38 -26
- package/dist/analyzers/anti-pattern.js.map +1 -1
- package/dist/analyzers/completeness-helpers.d.ts +5 -0
- package/dist/analyzers/completeness-helpers.d.ts.map +1 -1
- package/dist/analyzers/completeness-helpers.js +17 -0
- package/dist/analyzers/completeness-helpers.js.map +1 -1
- package/dist/analyzers/completeness.d.ts.map +1 -1
- package/dist/analyzers/completeness.js +4 -4
- package/dist/analyzers/completeness.js.map +1 -1
- package/dist/analyzers/gs-scorer.d.ts +3 -1
- package/dist/analyzers/gs-scorer.d.ts.map +1 -1
- package/dist/analyzers/gs-scorer.js +5 -2
- package/dist/analyzers/gs-scorer.js.map +1 -1
- package/dist/analyzers/package-json.d.ts.map +1 -1
- package/dist/analyzers/package-json.js +194 -34
- package/dist/analyzers/package-json.js.map +1 -1
- package/dist/analyzers/scorers/composable-scorer.d.ts +4 -2
- package/dist/analyzers/scorers/composable-scorer.d.ts.map +1 -1
- package/dist/analyzers/scorers/composable-scorer.js +50 -2
- package/dist/analyzers/scorers/composable-scorer.js.map +1 -1
- package/dist/analyzers/scorers/executable-scorer.d.ts +3 -2
- package/dist/analyzers/scorers/executable-scorer.d.ts.map +1 -1
- package/dist/analyzers/scorers/executable-scorer.js +64 -4
- package/dist/analyzers/scorers/executable-scorer.js.map +1 -1
- package/dist/analyzers/scorers/scorer-utils.d.ts +5 -3
- package/dist/analyzers/scorers/scorer-utils.d.ts.map +1 -1
- package/dist/analyzers/scorers/scorer-utils.js +34 -9
- package/dist/analyzers/scorers/scorer-utils.js.map +1 -1
- package/dist/analyzers/scorers/self-describing-scorer.d.ts +7 -4
- package/dist/analyzers/scorers/self-describing-scorer.d.ts.map +1 -1
- package/dist/analyzers/scorers/self-describing-scorer.js +17 -18
- package/dist/analyzers/scorers/self-describing-scorer.js.map +1 -1
- package/dist/cli/help.js +51 -51
- package/dist/disciplines/catalog.d.ts +16 -0
- package/dist/disciplines/catalog.d.ts.map +1 -0
- package/dist/disciplines/catalog.js +196 -0
- package/dist/disciplines/catalog.js.map +1 -0
- package/dist/disciplines/runner.d.ts +13 -0
- package/dist/disciplines/runner.d.ts.map +1 -0
- package/dist/disciplines/runner.js +35 -0
- package/dist/disciplines/runner.js.map +1 -0
- package/dist/registry/composer.d.ts.map +1 -1
- package/dist/registry/composer.js +9 -4
- package/dist/registry/composer.js.map +1 -1
- package/dist/registry/loader-tag.d.ts.map +1 -1
- package/dist/registry/loader-tag.js +1 -0
- package/dist/registry/loader-tag.js.map +1 -1
- package/dist/registry/remote-gates.js +1 -1
- package/dist/registry/remote-gates.js.map +1 -1
- package/dist/registry/renderer-skeletons.js +92 -92
- package/dist/registry/sentinel-renderer.js +299 -20
- package/dist/registry/sentinel-renderer.js.map +1 -1
- package/dist/sentinel/detect.d.ts +41 -0
- package/dist/sentinel/detect.d.ts.map +1 -0
- package/dist/sentinel/detect.js +122 -0
- package/dist/sentinel/detect.js.map +1 -0
- package/dist/sentinel/write.d.ts +54 -0
- package/dist/sentinel/write.d.ts.map +1 -0
- package/dist/sentinel/write.js +75 -0
- package/dist/sentinel/write.js.map +1 -0
- package/dist/shared/cnt-health.d.ts +16 -0
- package/dist/shared/cnt-health.d.ts.map +1 -1
- package/dist/shared/cnt-health.js +55 -8
- package/dist/shared/cnt-health.js.map +1 -1
- package/dist/shared/config.d.ts +14 -0
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js +45 -0
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/gs-score-logger.js +6 -6
- package/dist/shared/hook-installer.d.ts +58 -0
- package/dist/shared/hook-installer.d.ts.map +1 -0
- package/dist/shared/hook-installer.js +316 -0
- package/dist/shared/hook-installer.js.map +1 -0
- package/dist/shared/project-gates-helpers.d.ts +9 -0
- package/dist/shared/project-gates-helpers.d.ts.map +1 -1
- package/dist/shared/project-gates-helpers.js +35 -0
- package/dist/shared/project-gates-helpers.js.map +1 -1
- package/dist/shared/types/config.d.ts +7 -1
- package/dist/shared/types/config.d.ts.map +1 -1
- package/dist/shared/types/gates.d.ts +34 -0
- package/dist/shared/types/gates.d.ts.map +1 -1
- package/dist/shared/types/project.d.ts +68 -2
- package/dist/shared/types/project.d.ts.map +1 -1
- package/dist/shared/types/project.js +1 -0
- package/dist/shared/types/project.js.map +1 -1
- package/dist/shared/types/templates.d.ts +8 -1
- package/dist/shared/types/templates.d.ts.map +1 -1
- package/dist/shared/types/verify.d.ts +51 -1
- package/dist/shared/types/verify.d.ts.map +1 -1
- package/dist/shared/types/verify.js +37 -1
- package/dist/shared/types/verify.js.map +1 -1
- package/dist/tools/add-hook.d.ts.map +1 -1
- package/dist/tools/add-hook.js +8 -1
- package/dist/tools/add-hook.js.map +1 -1
- package/dist/tools/add-module.js +123 -123
- package/dist/tools/advice-registry.d.ts.map +1 -1
- package/dist/tools/advice-registry.js +108 -18
- package/dist/tools/advice-registry.js.map +1 -1
- package/dist/tools/advise-session-advisor.d.ts +16 -0
- package/dist/tools/advise-session-advisor.d.ts.map +1 -0
- package/dist/tools/advise-session-advisor.js +89 -0
- package/dist/tools/advise-session-advisor.js.map +1 -0
- package/dist/tools/advise-session-signals.d.ts +21 -0
- package/dist/tools/advise-session-signals.d.ts.map +1 -0
- package/dist/tools/advise-session-signals.js +113 -0
- package/dist/tools/advise-session-signals.js.map +1 -0
- package/dist/tools/advise-session.d.ts +22 -0
- package/dist/tools/advise-session.d.ts.map +1 -0
- package/dist/tools/advise-session.js +31 -0
- package/dist/tools/advise-session.js.map +1 -0
- package/dist/tools/analyze-harness.d.ts +18 -0
- package/dist/tools/analyze-harness.d.ts.map +1 -0
- package/dist/tools/analyze-harness.js +298 -0
- package/dist/tools/analyze-harness.js.map +1 -0
- package/dist/tools/audit.d.ts.map +1 -1
- package/dist/tools/audit.js +19 -0
- package/dist/tools/audit.js.map +1 -1
- package/dist/tools/change-request.d.ts +53 -0
- package/dist/tools/change-request.d.ts.map +1 -0
- package/dist/tools/change-request.js +395 -0
- package/dist/tools/change-request.js.map +1 -0
- package/dist/tools/check-cascade-contracts.d.ts +13 -0
- package/dist/tools/check-cascade-contracts.d.ts.map +1 -1
- package/dist/tools/check-cascade-contracts.js +73 -2
- package/dist/tools/check-cascade-contracts.js.map +1 -1
- package/dist/tools/check-cascade-report.js +64 -64
- package/dist/tools/check-cascade-steps.d.ts +3 -0
- package/dist/tools/check-cascade-steps.d.ts.map +1 -1
- package/dist/tools/check-cascade-steps.js +104 -15
- package/dist/tools/check-cascade-steps.js.map +1 -1
- package/dist/tools/check-cascade.d.ts +4 -3
- package/dist/tools/check-cascade.d.ts.map +1 -1
- package/dist/tools/check-cascade.js +30 -12
- package/dist/tools/check-cascade.js.map +1 -1
- package/dist/tools/check-derivation-chain.d.ts +37 -0
- package/dist/tools/check-derivation-chain.d.ts.map +1 -0
- package/dist/tools/check-derivation-chain.js +418 -0
- package/dist/tools/check-derivation-chain.js.map +1 -0
- package/dist/tools/check-spec-consistency.d.ts +25 -0
- package/dist/tools/check-spec-consistency.d.ts.map +1 -0
- package/dist/tools/check-spec-consistency.js +339 -0
- package/dist/tools/check-spec-consistency.js.map +1 -0
- package/dist/tools/check-t4.d.ts +54 -0
- package/dist/tools/check-t4.d.ts.map +1 -0
- package/dist/tools/check-t4.js +305 -0
- package/dist/tools/check-t4.js.map +1 -0
- package/dist/tools/close-cycle.d.ts +11 -0
- package/dist/tools/close-cycle.d.ts.map +1 -1
- package/dist/tools/close-cycle.js +364 -4
- package/dist/tools/close-cycle.js.map +1 -1
- package/dist/tools/cnt-add-routing.d.ts +31 -0
- package/dist/tools/cnt-add-routing.d.ts.map +1 -0
- package/dist/tools/cnt-add-routing.js +99 -0
- package/dist/tools/cnt-add-routing.js.map +1 -0
- package/dist/tools/configure-mcp.d.ts.map +1 -1
- package/dist/tools/configure-mcp.js +52 -2
- package/dist/tools/configure-mcp.js.map +1 -1
- package/dist/tools/consolidate-status.d.ts +31 -0
- package/dist/tools/consolidate-status.d.ts.map +1 -1
- package/dist/tools/consolidate-status.js +105 -0
- package/dist/tools/consolidate-status.js.map +1 -1
- package/dist/tools/executable-gates.d.ts +52 -0
- package/dist/tools/executable-gates.d.ts.map +1 -0
- package/dist/tools/executable-gates.js +333 -0
- package/dist/tools/executable-gates.js.map +1 -0
- package/dist/tools/extract-adrs-from-spec.d.ts +33 -0
- package/dist/tools/extract-adrs-from-spec.d.ts.map +1 -0
- package/dist/tools/extract-adrs-from-spec.js +410 -0
- package/dist/tools/extract-adrs-from-spec.js.map +1 -0
- package/dist/tools/extract-adrs-history.d.ts +47 -0
- package/dist/tools/extract-adrs-history.d.ts.map +1 -0
- package/dist/tools/extract-adrs-history.js +265 -0
- package/dist/tools/extract-adrs-history.js.map +1 -0
- package/dist/tools/forgecraft-dispatch-extended.d.ts.map +1 -1
- package/dist/tools/forgecraft-dispatch-extended.js +137 -0
- package/dist/tools/forgecraft-dispatch-extended.js.map +1 -1
- package/dist/tools/forgecraft-dispatch.d.ts.map +1 -1
- package/dist/tools/forgecraft-dispatch.js +16 -0
- package/dist/tools/forgecraft-dispatch.js.map +1 -1
- package/dist/tools/forgecraft-schema-params.d.ts +174 -2
- package/dist/tools/forgecraft-schema-params.d.ts.map +1 -1
- package/dist/tools/forgecraft-schema-params.js +197 -0
- package/dist/tools/forgecraft-schema-params.js.map +1 -1
- package/dist/tools/forgecraft-schema.d.ts +179 -7
- package/dist/tools/forgecraft-schema.d.ts.map +1 -1
- package/dist/tools/forgecraft-schema.js +37 -0
- package/dist/tools/forgecraft-schema.js.map +1 -1
- package/dist/tools/generate-adr.js +6 -6
- package/dist/tools/generate-adr.js.map +1 -1
- package/dist/tools/generate-decision.d.ts +77 -0
- package/dist/tools/generate-decision.d.ts.map +1 -0
- package/dist/tools/generate-decision.js +162 -0
- package/dist/tools/generate-decision.js.map +1 -0
- package/dist/tools/generate-env-probe.d.ts +49 -0
- package/dist/tools/generate-env-probe.d.ts.map +1 -0
- package/dist/tools/generate-env-probe.js +365 -0
- package/dist/tools/generate-env-probe.js.map +1 -0
- package/dist/tools/generate-harness.d.ts +53 -0
- package/dist/tools/generate-harness.d.ts.map +1 -0
- package/dist/tools/generate-harness.js +395 -0
- package/dist/tools/generate-harness.js.map +1 -0
- package/dist/tools/generate-roadmap.d.ts +1 -1
- package/dist/tools/generate-roadmap.d.ts.map +1 -1
- package/dist/tools/generate-roadmap.js +38 -4
- package/dist/tools/generate-roadmap.js.map +1 -1
- package/dist/tools/generate-session-prompt.d.ts +3 -3
- package/dist/tools/generate-session-prompt.d.ts.map +1 -1
- package/dist/tools/generate-session-prompt.js +9 -1
- package/dist/tools/generate-session-prompt.js.map +1 -1
- package/dist/tools/generate-slo-probe.d.ts +53 -0
- package/dist/tools/generate-slo-probe.d.ts.map +1 -0
- package/dist/tools/generate-slo-probe.js +366 -0
- package/dist/tools/generate-slo-probe.js.map +1 -0
- package/dist/tools/layer-status-gates.d.ts +24 -0
- package/dist/tools/layer-status-gates.d.ts.map +1 -0
- package/dist/tools/layer-status-gates.js +151 -0
- package/dist/tools/layer-status-gates.js.map +1 -0
- package/dist/tools/layer-status.d.ts +126 -0
- package/dist/tools/layer-status.d.ts.map +1 -0
- package/dist/tools/layer-status.js +647 -0
- package/dist/tools/layer-status.js.map +1 -0
- package/dist/tools/list.d.ts.map +1 -1
- package/dist/tools/list.js +9 -5
- package/dist/tools/list.js.map +1 -1
- package/dist/tools/postcondition-coverage.d.ts +57 -0
- package/dist/tools/postcondition-coverage.d.ts.map +1 -0
- package/dist/tools/postcondition-coverage.js +256 -0
- package/dist/tools/postcondition-coverage.js.map +1 -0
- package/dist/tools/probe-runners.d.ts +21 -0
- package/dist/tools/probe-runners.d.ts.map +1 -0
- package/dist/tools/probe-runners.js +246 -0
- package/dist/tools/probe-runners.js.map +1 -0
- package/dist/tools/probe-templates.d.ts +27 -0
- package/dist/tools/probe-templates.d.ts.map +1 -0
- package/dist/tools/probe-templates.js +279 -0
- package/dist/tools/probe-templates.js.map +1 -0
- package/dist/tools/propose-session.d.ts +28 -0
- package/dist/tools/propose-session.d.ts.map +1 -0
- package/dist/tools/propose-session.js +333 -0
- package/dist/tools/propose-session.js.map +1 -0
- package/dist/tools/refresh-output.js +14 -14
- package/dist/tools/review-stubs.d.ts +29 -0
- package/dist/tools/review-stubs.d.ts.map +1 -0
- package/dist/tools/review-stubs.js +173 -0
- package/dist/tools/review-stubs.js.map +1 -0
- package/dist/tools/roadmap-builder.d.ts +49 -1
- package/dist/tools/roadmap-builder.d.ts.map +1 -1
- package/dist/tools/roadmap-builder.js +210 -5
- package/dist/tools/roadmap-builder.js.map +1 -1
- package/dist/tools/run-env-probe.d.ts +57 -0
- package/dist/tools/run-env-probe.d.ts.map +1 -0
- package/dist/tools/run-env-probe.js +270 -0
- package/dist/tools/run-env-probe.js.map +1 -0
- package/dist/tools/run-harness.d.ts +52 -0
- package/dist/tools/run-harness.d.ts.map +1 -0
- package/dist/tools/run-harness.js +279 -0
- package/dist/tools/run-harness.js.map +1 -0
- package/dist/tools/run-slo-probe.d.ts +50 -0
- package/dist/tools/run-slo-probe.d.ts.map +1 -0
- package/dist/tools/run-slo-probe.js +281 -0
- package/dist/tools/run-slo-probe.js.map +1 -0
- package/dist/tools/scaffold-spec-stubs.js +115 -115
- package/dist/tools/scaffold-templates.js +62 -62
- package/dist/tools/scaffold-writer.d.ts.map +1 -1
- package/dist/tools/scaffold-writer.js +9 -0
- package/dist/tools/scaffold-writer.js.map +1 -1
- package/dist/tools/score-rubric.d.ts +19 -0
- package/dist/tools/score-rubric.d.ts.map +1 -0
- package/dist/tools/score-rubric.js +411 -0
- package/dist/tools/score-rubric.js.map +1 -0
- package/dist/tools/session-prompt-builders.d.ts +20 -0
- package/dist/tools/session-prompt-builders.d.ts.map +1 -1
- package/dist/tools/session-prompt-builders.js +78 -5
- package/dist/tools/session-prompt-builders.js.map +1 -1
- package/dist/tools/session-prompt-sections.d.ts +4 -2
- package/dist/tools/session-prompt-sections.d.ts.map +1 -1
- package/dist/tools/session-prompt-sections.js +22 -10
- package/dist/tools/session-prompt-sections.js.map +1 -1
- package/dist/tools/setup-artifact-writers.d.ts +69 -4
- package/dist/tools/setup-artifact-writers.d.ts.map +1 -1
- package/dist/tools/setup-artifact-writers.js +681 -5
- package/dist/tools/setup-artifact-writers.js.map +1 -1
- package/dist/tools/setup-cnt-builders.d.ts.map +1 -1
- package/dist/tools/setup-cnt-builders.js +162 -34
- package/dist/tools/setup-cnt-builders.js.map +1 -1
- package/dist/tools/setup-monitoring.d.ts +41 -0
- package/dist/tools/setup-monitoring.d.ts.map +1 -0
- package/dist/tools/setup-monitoring.js +364 -0
- package/dist/tools/setup-monitoring.js.map +1 -0
- package/dist/tools/setup-phase1.d.ts.map +1 -1
- package/dist/tools/setup-phase1.js +14 -1
- package/dist/tools/setup-phase1.js.map +1 -1
- package/dist/tools/setup-phase2.d.ts +14 -0
- package/dist/tools/setup-phase2.d.ts.map +1 -1
- package/dist/tools/setup-phase2.js +130 -3
- package/dist/tools/setup-phase2.js.map +1 -1
- package/dist/tools/setup-project.d.ts +8 -0
- package/dist/tools/setup-project.d.ts.map +1 -1
- package/dist/tools/setup-project.js +52 -2
- package/dist/tools/setup-project.js.map +1 -1
- package/dist/tools/spec-parser-tags.d.ts.map +1 -1
- package/dist/tools/spec-parser-tags.js +1 -0
- package/dist/tools/spec-parser-tags.js.map +1 -1
- package/dist/tools/verify-formatter.d.ts.map +1 -1
- package/dist/tools/verify-formatter.js +15 -1
- package/dist/tools/verify-formatter.js.map +1 -1
- package/dist/tools/verify.d.ts.map +1 -1
- package/dist/tools/verify.js +3 -0
- package/dist/tools/verify.js.map +1 -1
- package/package.json +98 -89
- package/templates/analytics/instructions.yaml +37 -37
- package/templates/analytics/mcp-servers.yaml +11 -11
- package/templates/analytics/structure.yaml +25 -25
- package/templates/api/harness/uc-template.hurl +20 -0
- package/templates/api/instructions.yaml +231 -231
- package/templates/api/mcp-servers.yaml +22 -22
- package/templates/api/nfr.yaml +23 -23
- package/templates/api/review.yaml +103 -103
- package/templates/api/structure.yaml +34 -34
- package/templates/api/verification.yaml +132 -132
- package/templates/cli/instructions.yaml +31 -31
- package/templates/cli/mcp-servers.yaml +11 -11
- package/templates/cli/review.yaml +53 -53
- package/templates/cli/structure.yaml +16 -16
- package/templates/data-lineage/instructions.yaml +28 -28
- package/templates/data-lineage/mcp-servers.yaml +22 -22
- package/templates/data-pipeline/instructions.yaml +84 -84
- package/templates/data-pipeline/mcp-servers.yaml +13 -13
- package/templates/data-pipeline/nfr.yaml +39 -39
- package/templates/data-pipeline/structure.yaml +23 -23
- package/templates/docs-manifest.yaml +227 -0
- package/templates/fintech/hooks.yaml +55 -55
- package/templates/fintech/instructions.yaml +112 -112
- package/templates/fintech/mcp-servers.yaml +13 -13
- package/templates/fintech/nfr.yaml +46 -46
- package/templates/fintech/playbook.yaml +210 -210
- package/templates/fintech/verification.yaml +239 -239
- package/templates/game/harness/uc-template.sim.ts +29 -0
- package/templates/game/instructions.yaml +289 -289
- package/templates/game/mcp-servers.yaml +38 -38
- package/templates/game/nfr.yaml +64 -64
- package/templates/game/playbook.yaml +214 -214
- package/templates/game/review.yaml +97 -97
- package/templates/game/structure.yaml +67 -67
- package/templates/game/verification.yaml +174 -174
- package/templates/healthcare/instructions.yaml +42 -42
- package/templates/healthcare/mcp-servers.yaml +13 -13
- package/templates/healthcare/nfr.yaml +47 -47
- package/templates/hipaa/instructions.yaml +41 -41
- package/templates/hipaa/mcp-servers.yaml +13 -13
- package/templates/infra/instructions.yaml +104 -104
- package/templates/infra/mcp-servers.yaml +20 -20
- package/templates/infra/nfr.yaml +46 -46
- package/templates/infra/review.yaml +65 -65
- package/templates/infra/structure.yaml +25 -25
- package/templates/library/instructions.yaml +36 -36
- package/templates/library/mcp-servers.yaml +20 -20
- package/templates/library/review.yaml +56 -56
- package/templates/library/structure.yaml +19 -19
- package/templates/medallion-architecture/instructions.yaml +41 -41
- package/templates/medallion-architecture/mcp-servers.yaml +22 -22
- package/templates/ml/instructions.yaml +85 -85
- package/templates/ml/mcp-servers.yaml +11 -11
- package/templates/ml/nfr.yaml +39 -39
- package/templates/ml/structure.yaml +25 -25
- package/templates/ml/verification.yaml +156 -156
- package/templates/mobile/instructions.yaml +44 -44
- package/templates/mobile/mcp-servers.yaml +11 -11
- package/templates/mobile/nfr.yaml +49 -49
- package/templates/mobile/structure.yaml +27 -27
- package/templates/mobile/verification.yaml +121 -121
- package/templates/observability-xray/instructions.yaml +40 -40
- package/templates/observability-xray/mcp-servers.yaml +15 -15
- package/templates/realtime/instructions.yaml +42 -42
- package/templates/realtime/mcp-servers.yaml +13 -13
- package/templates/soc2/instructions.yaml +41 -41
- package/templates/soc2/mcp-servers.yaml +24 -24
- package/templates/social/instructions.yaml +43 -43
- package/templates/social/mcp-servers.yaml +24 -24
- package/templates/state-machine/instructions.yaml +42 -42
- package/templates/state-machine/mcp-servers.yaml +11 -11
- package/templates/tools-registry.yaml +164 -164
- package/templates/universal/claude-md-blocks/layer-navigation.md +20 -0
- package/templates/universal/claude-md-blocks/nfr-contracts.md +22 -0
- package/templates/universal/hooks.yaml +879 -723
- package/templates/universal/instructions.yaml +1692 -1692
- package/templates/universal/mcp-servers.yaml +50 -50
- package/templates/universal/nfr.yaml +197 -197
- package/templates/universal/reference.yaml +326 -326
- package/templates/universal/review.yaml +204 -204
- package/templates/universal/skills.yaml +262 -262
- package/templates/universal/structure.yaml +67 -67
- package/templates/universal/verification.yaml +416 -416
- package/templates/web-next/hooks.yaml +114 -0
- package/templates/web-next/instructions.yaml +106 -0
- package/templates/web-react/harness/uc-template.spec.ts +35 -0
- package/templates/web-react/hooks.yaml +156 -44
- package/templates/web-react/instructions.yaml +296 -207
- package/templates/web-react/mcp-servers.yaml +20 -20
- package/templates/web-react/nfr.yaml +27 -27
- package/templates/web-react/review.yaml +94 -94
- package/templates/web-react/structure.yaml +46 -46
- package/templates/web-react/verification.yaml +126 -126
- package/templates/web-static/hooks.yaml +85 -0
- package/templates/web-static/instructions.yaml +204 -115
- package/templates/web-static/mcp-servers.yaml +20 -20
- package/templates/web3/instructions.yaml +44 -44
- package/templates/web3/mcp-servers.yaml +11 -11
- package/templates/web3/verification.yaml +159 -159
- package/templates/zero-trust/instructions.yaml +41 -41
- package/templates/zero-trust/mcp-servers.yaml +15 -15
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* extract_adrs_from_spec tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Reads a project specification file and derives ADR stubs from technology
|
|
5
|
+
* decisions described within it. Unlike extract_adrs_from_history (which walks
|
|
6
|
+
* git log for brownfield projects), this tool is for greenfield projects where
|
|
7
|
+
* all architectural decisions are encoded in the spec before implementation begins.
|
|
8
|
+
*
|
|
9
|
+
* Each generated ADR includes the actual spec excerpt as context — making the
|
|
10
|
+
* artifact genuinely derived from the spec, not a generic placeholder.
|
|
11
|
+
*/
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, } from "node:fs";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
// ── Schema ───────────────────────────────────────────────────────────
|
|
16
|
+
export const extractAdrsFromSpecSchema = z.object({
|
|
17
|
+
project_dir: z
|
|
18
|
+
.string()
|
|
19
|
+
.describe("Absolute path to the project root directory."),
|
|
20
|
+
spec_path: z
|
|
21
|
+
.string()
|
|
22
|
+
.optional()
|
|
23
|
+
.describe("Path to the specification file. Auto-detected from docs/PRD.md, docs/TechSpec.md, " +
|
|
24
|
+
"docs/spec.md if omitted."),
|
|
25
|
+
max_adrs: z
|
|
26
|
+
.number()
|
|
27
|
+
.int()
|
|
28
|
+
.min(1)
|
|
29
|
+
.max(20)
|
|
30
|
+
.optional()
|
|
31
|
+
.describe("Maximum number of ADR files to generate. Default: 10."),
|
|
32
|
+
});
|
|
33
|
+
// ── Spec discovery ───────────────────────────────────────────────────
|
|
34
|
+
const SPEC_CANDIDATE_PATHS = [
|
|
35
|
+
"docs/PRD.md",
|
|
36
|
+
"docs/TechSpec.md",
|
|
37
|
+
"docs/tech-spec.md",
|
|
38
|
+
"docs/functional-spec.md",
|
|
39
|
+
"docs/spec.md",
|
|
40
|
+
"SPEC.md",
|
|
41
|
+
];
|
|
42
|
+
function resolveSpecPath(projectDir, specPath) {
|
|
43
|
+
if (specPath) {
|
|
44
|
+
const full = specPath.startsWith("/") || specPath.match(/^[A-Za-z]:/)
|
|
45
|
+
? specPath
|
|
46
|
+
: join(projectDir, specPath);
|
|
47
|
+
return existsSync(full) ? full : null;
|
|
48
|
+
}
|
|
49
|
+
for (const p of SPEC_CANDIDATE_PATHS) {
|
|
50
|
+
const full = join(projectDir, p);
|
|
51
|
+
if (existsSync(full))
|
|
52
|
+
return full;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
// ── ADR directory resolution ─────────────────────────────────────────
|
|
57
|
+
function resolveAdrDir(projectDir) {
|
|
58
|
+
const active = join(projectDir, "docs", "adrs", "active");
|
|
59
|
+
if (existsSync(active))
|
|
60
|
+
return active;
|
|
61
|
+
const legacy = join(projectDir, "docs", "adrs");
|
|
62
|
+
if (existsSync(legacy))
|
|
63
|
+
return legacy;
|
|
64
|
+
const adr = join(projectDir, "docs", "adr");
|
|
65
|
+
if (existsSync(adr))
|
|
66
|
+
return adr;
|
|
67
|
+
return join(projectDir, "docs", "adrs", "active");
|
|
68
|
+
}
|
|
69
|
+
function nextAdrNumber(adrDir) {
|
|
70
|
+
if (!existsSync(adrDir))
|
|
71
|
+
return 1;
|
|
72
|
+
const files = readdirSync(adrDir).filter((f) => /^\d/.test(f) || /^adr/i.test(f));
|
|
73
|
+
if (files.length === 0)
|
|
74
|
+
return 1;
|
|
75
|
+
const nums = files
|
|
76
|
+
.map((f) => parseInt(f.replace(/\D.*/, ""), 10))
|
|
77
|
+
.filter((n) => !isNaN(n));
|
|
78
|
+
return nums.length > 0 ? Math.max(...nums) + 1 : 1;
|
|
79
|
+
}
|
|
80
|
+
function slugExists(adrDir, slug) {
|
|
81
|
+
if (!existsSync(adrDir))
|
|
82
|
+
return false;
|
|
83
|
+
return readdirSync(adrDir).some((f) => f.includes(slug));
|
|
84
|
+
}
|
|
85
|
+
// ── Spec parsing ─────────────────────────────────────────────────────
|
|
86
|
+
/** Extract a section and its content up to the next same-or-higher-level header. */
|
|
87
|
+
function extractSection(content, headerPattern) {
|
|
88
|
+
const match = content.match(headerPattern);
|
|
89
|
+
if (!match || match.index === undefined)
|
|
90
|
+
return null;
|
|
91
|
+
const start = match.index;
|
|
92
|
+
const level = (match[1] ?? "#").length; // heading level from the hash count
|
|
93
|
+
const afterStart = content.slice(start + match[0].length);
|
|
94
|
+
// Find next header of same or higher level
|
|
95
|
+
const nextHeader = new RegExp(`^#{1,${level}}\\s`, "m");
|
|
96
|
+
const end = afterStart.search(nextHeader);
|
|
97
|
+
return end >= 0
|
|
98
|
+
? content.slice(start, start + match[0].length + end).trim()
|
|
99
|
+
: content.slice(start).trim();
|
|
100
|
+
}
|
|
101
|
+
function parseTechTable(sectionText) {
|
|
102
|
+
const rows = [];
|
|
103
|
+
const lines = sectionText.split("\n");
|
|
104
|
+
for (const line of lines) {
|
|
105
|
+
if (!line.startsWith("|"))
|
|
106
|
+
continue;
|
|
107
|
+
const cells = line
|
|
108
|
+
.split("|")
|
|
109
|
+
.map((c) => c.trim())
|
|
110
|
+
.filter(Boolean);
|
|
111
|
+
if (cells.length < 2)
|
|
112
|
+
continue;
|
|
113
|
+
if (cells[0]?.match(/^[-:]+$/))
|
|
114
|
+
continue; // separator row
|
|
115
|
+
if (cells[0]?.toLowerCase() === "layer" ||
|
|
116
|
+
cells[0]?.toLowerCase() === "component")
|
|
117
|
+
continue;
|
|
118
|
+
rows.push({
|
|
119
|
+
layer: cells[0] ?? "",
|
|
120
|
+
technology: cells[1] ?? "",
|
|
121
|
+
notes: cells[2] ?? "",
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return rows;
|
|
125
|
+
}
|
|
126
|
+
const DECISION_PATTERNS = [
|
|
127
|
+
/(?:we\s+)?(?:chose|selected|adopted|use|using|decided\s+(?:on|to\s+use))\s+([\w/+.-]+(?:\s+[\w/+.-]+)?)\s+(?:because|for|over|instead|as)\s+(.{10,120})/gi,
|
|
128
|
+
/([\w/+.-]+)\s+(?:over|instead\s+of)\s+([\w/+.-]+)\s+because\s+(.{10,120})/gi,
|
|
129
|
+
];
|
|
130
|
+
function extractExplicitDecisions(content) {
|
|
131
|
+
const decisions = [];
|
|
132
|
+
for (const pattern of DECISION_PATTERNS) {
|
|
133
|
+
pattern.lastIndex = 0;
|
|
134
|
+
let m;
|
|
135
|
+
while ((m = pattern.exec(content)) !== null) {
|
|
136
|
+
decisions.push({
|
|
137
|
+
sentence: m[0].slice(0, 200).trim(),
|
|
138
|
+
technology: (m[1] ?? "").trim(),
|
|
139
|
+
rationale: (m[2] ?? m[3] ?? "").trim(),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return decisions.slice(0, 5);
|
|
144
|
+
}
|
|
145
|
+
// ── ADR candidate builder ─────────────────────────────────────────────
|
|
146
|
+
/**
|
|
147
|
+
* Technology clusters: map technology keywords to ADR categories.
|
|
148
|
+
* First matching cluster wins.
|
|
149
|
+
*/
|
|
150
|
+
const TECH_CLUSTERS = [
|
|
151
|
+
{
|
|
152
|
+
slug: "ai-integration",
|
|
153
|
+
titleTemplate: (t) => `AI/LLM Integration — ${t.slice(0, 2).join(" + ")}`,
|
|
154
|
+
keywords: /\b(openai|anthropic|claude|gpt|llm|langchain|hugging\s?face|embedding|vector|pgvector|rag|ai\s*\/?\s*llm)\b/i,
|
|
155
|
+
category: "AI and LLM integration",
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
slug: "auth-strategy",
|
|
159
|
+
titleTemplate: (t) => `Authentication Strategy — ${t.slice(0, 2).join(" + ")}`,
|
|
160
|
+
keywords: /\b(jwt|auth|oauth|sso|identity|nextauth|clerk|supabase\s+auth|cognito|auth0|bcrypt|session)\b/i,
|
|
161
|
+
category: "authentication and authorization",
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
slug: "database",
|
|
165
|
+
titleTemplate: (t) => `Database Selection — ${t.slice(0, 2).join(" + ")}`,
|
|
166
|
+
keywords: /\b(postgresql|mysql|mongodb|redis|sqlite|supabase|prisma|drizzle|typeorm|sequelize|firebase|dynamo|neon|planetscale)\b/i,
|
|
167
|
+
category: "database and persistence",
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
slug: "deployment",
|
|
171
|
+
titleTemplate: (t) => `Deployment Strategy — ${t.slice(0, 2).join(" + ")}`,
|
|
172
|
+
keywords: /\b(railway|vercel|fly\.io|render|heroku|aws|gcp|azure|docker|kubernetes|k8s|cloudflare|lambda)\b/i,
|
|
173
|
+
category: "deployment and infrastructure",
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
slug: "testing-strategy",
|
|
177
|
+
titleTemplate: (t) => `Testing Strategy — ${t.slice(0, 2).join(" + ")}`,
|
|
178
|
+
keywords: /\b(vitest|jest|playwright|cypress|testing-library|storybook|mocha|supertest|hurl)\b/i,
|
|
179
|
+
category: "testing tools and approach",
|
|
180
|
+
},
|
|
181
|
+
];
|
|
182
|
+
const STACK_KEYWORDS = /\b(next\.?js|nestjs|express|fastify|react|vue|angular|svelte|nuxt|remix|django|flask|fastapi|rails|spring|laravel|node\.?js|typescript|python|go|rust|java|kotlin)\b/i;
|
|
183
|
+
function buildAdrCandidates(tableRows, explicitDecisions, specExcerpt, specRelPath) {
|
|
184
|
+
const candidates = [];
|
|
185
|
+
// Group table rows by cluster
|
|
186
|
+
const clusterBuckets = new Map();
|
|
187
|
+
const stackRows = [];
|
|
188
|
+
for (const row of tableRows) {
|
|
189
|
+
const combined = `${row.layer} ${row.technology} ${row.notes}`;
|
|
190
|
+
let matched = false;
|
|
191
|
+
for (const cluster of TECH_CLUSTERS) {
|
|
192
|
+
if (cluster.keywords.test(combined)) {
|
|
193
|
+
if (!clusterBuckets.has(cluster.slug))
|
|
194
|
+
clusterBuckets.set(cluster.slug, []);
|
|
195
|
+
clusterBuckets.get(cluster.slug).push(row);
|
|
196
|
+
matched = true;
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (!matched && STACK_KEYWORDS.test(combined)) {
|
|
201
|
+
stackRows.push(row);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Stack selection ADR (covers frontend + backend layers not captured by specific clusters)
|
|
205
|
+
const stackEntries = [...stackRows];
|
|
206
|
+
if (stackEntries.length > 0) {
|
|
207
|
+
const techs = stackEntries
|
|
208
|
+
.map((r) => r.technology.split(/[+,]/)[0].trim())
|
|
209
|
+
.slice(0, 4);
|
|
210
|
+
const tableMarkdown = stackEntries
|
|
211
|
+
.map((r) => `| ${r.layer} | ${r.technology} | ${r.notes} |`)
|
|
212
|
+
.join("\n");
|
|
213
|
+
candidates.push({
|
|
214
|
+
slug: "stack-selection",
|
|
215
|
+
title: `Stack Selection — ${techs.join(" + ")}`,
|
|
216
|
+
context: [
|
|
217
|
+
`This decision was identified from the project specification (${specRelPath}).`,
|
|
218
|
+
`The following technology layers were declared in the spec:`,
|
|
219
|
+
"",
|
|
220
|
+
"| Layer | Technology | Notes |",
|
|
221
|
+
"|-------|-----------|-------|",
|
|
222
|
+
tableMarkdown,
|
|
223
|
+
].join("\n"),
|
|
224
|
+
decision: `The project uses ${techs.join(", ")} as stated in the specification.`,
|
|
225
|
+
consequences: [
|
|
226
|
+
"**Positive:** technology choices are explicit and captured before implementation begins.",
|
|
227
|
+
"**Risk:** any deviation from these choices requires a superseding ADR.",
|
|
228
|
+
"**Action:** verify these choices still hold before implementation — update this ADR if the spec was updated after scaffold.",
|
|
229
|
+
].join("\n"),
|
|
230
|
+
specExcerpt,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
// One ADR per detected cluster
|
|
234
|
+
for (const cluster of TECH_CLUSTERS) {
|
|
235
|
+
const rows = clusterBuckets.get(cluster.slug) ?? [];
|
|
236
|
+
if (rows.length === 0)
|
|
237
|
+
continue;
|
|
238
|
+
const techs = rows.map((r) => r.technology.split(/[+,]/)[0].trim());
|
|
239
|
+
const tableMarkdown = rows
|
|
240
|
+
.map((r) => `| ${r.layer} | ${r.technology} | ${r.notes} |`)
|
|
241
|
+
.join("\n");
|
|
242
|
+
candidates.push({
|
|
243
|
+
slug: cluster.slug,
|
|
244
|
+
title: cluster.titleTemplate(techs),
|
|
245
|
+
context: [
|
|
246
|
+
`This decision concerns ${cluster.category} in this project.`,
|
|
247
|
+
`Source: ${specRelPath}`,
|
|
248
|
+
"",
|
|
249
|
+
"| Layer | Technology | Notes |",
|
|
250
|
+
"|-------|-----------|-------|",
|
|
251
|
+
tableMarkdown,
|
|
252
|
+
].join("\n"),
|
|
253
|
+
decision: rows
|
|
254
|
+
.map((r) => `- **${r.layer}:** ${r.technology}${r.notes ? ` (${r.notes})` : ""}`)
|
|
255
|
+
.join("\n"),
|
|
256
|
+
consequences: [
|
|
257
|
+
`**Positive:** ${cluster.category} is explicitly documented before implementation.`,
|
|
258
|
+
"**Risk:** changing these choices mid-project requires updating dependent ADRs and tests.",
|
|
259
|
+
"**Action:** verify these choices against current project state.",
|
|
260
|
+
].join("\n"),
|
|
261
|
+
specExcerpt,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
// One ADR per explicit decision sentence (if not already captured)
|
|
265
|
+
for (const d of explicitDecisions) {
|
|
266
|
+
if (candidates.some((c) => c.slug.includes(d.technology.toLowerCase().slice(0, 6))))
|
|
267
|
+
continue;
|
|
268
|
+
candidates.push({
|
|
269
|
+
slug: `decision-${d.technology
|
|
270
|
+
.toLowerCase()
|
|
271
|
+
.replace(/[^a-z0-9]/g, "-")
|
|
272
|
+
.slice(0, 30)}`,
|
|
273
|
+
title: `Decision — ${d.technology}`,
|
|
274
|
+
context: `Explicitly stated in the specification (${specRelPath}):\n\n> "${d.sentence}"`,
|
|
275
|
+
decision: `${d.technology}: ${d.rationale}`,
|
|
276
|
+
consequences: [
|
|
277
|
+
"**Positive:** explicit decision recorded before implementation.",
|
|
278
|
+
"**Action:** verify this decision is still current.",
|
|
279
|
+
].join("\n"),
|
|
280
|
+
specExcerpt: d.sentence,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
return candidates;
|
|
284
|
+
}
|
|
285
|
+
// ── ADR file writer ───────────────────────────────────────────────────
|
|
286
|
+
function buildAdrContent(num, candidate, date) {
|
|
287
|
+
const numStr = String(num).padStart(4, "0");
|
|
288
|
+
return [
|
|
289
|
+
`# ADR-${numStr}: ${candidate.title}`,
|
|
290
|
+
"",
|
|
291
|
+
`**Status:** Retroactive`,
|
|
292
|
+
`**Date:** ${date}`,
|
|
293
|
+
`**Deciders:** Project team`,
|
|
294
|
+
`**Source:** Derived from specification`,
|
|
295
|
+
"",
|
|
296
|
+
"---",
|
|
297
|
+
"",
|
|
298
|
+
"## Context",
|
|
299
|
+
"",
|
|
300
|
+
candidate.context,
|
|
301
|
+
"",
|
|
302
|
+
"## Decision",
|
|
303
|
+
"",
|
|
304
|
+
candidate.decision,
|
|
305
|
+
"",
|
|
306
|
+
"## Consequences",
|
|
307
|
+
"",
|
|
308
|
+
candidate.consequences,
|
|
309
|
+
"",
|
|
310
|
+
"## Spec Excerpt",
|
|
311
|
+
"",
|
|
312
|
+
"```",
|
|
313
|
+
candidate.specExcerpt.slice(0, 400).trim(),
|
|
314
|
+
"```",
|
|
315
|
+
"",
|
|
316
|
+
"> This ADR was retroactively recorded from the project specification.",
|
|
317
|
+
"> Review and expand with team context before implementation begins.",
|
|
318
|
+
"",
|
|
319
|
+
].join("\n");
|
|
320
|
+
}
|
|
321
|
+
// ── Handler ──────────────────────────────────────────────────────────
|
|
322
|
+
export async function extractAdrsFromSpecHandler(args) {
|
|
323
|
+
const { project_dir, spec_path, max_adrs = 10 } = args;
|
|
324
|
+
const specFile = resolveSpecPath(project_dir, spec_path);
|
|
325
|
+
if (!specFile) {
|
|
326
|
+
return {
|
|
327
|
+
content: [
|
|
328
|
+
{
|
|
329
|
+
type: "text",
|
|
330
|
+
text: "No specification file found. Pass `spec_path` or create one of: " +
|
|
331
|
+
SPEC_CANDIDATE_PATHS.join(", "),
|
|
332
|
+
},
|
|
333
|
+
],
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
const specContent = readFileSync(specFile, "utf-8");
|
|
337
|
+
const specRelPath = specFile
|
|
338
|
+
.replace(project_dir.replace(/\\/g, "/"), "")
|
|
339
|
+
.replace(/\\/g, "/")
|
|
340
|
+
.replace(/^\//, "");
|
|
341
|
+
// Find tech stack section
|
|
342
|
+
const techSectionPattern = /^(#{1,3})\s+(?:\d+\.\s+)?(?:tech(?:nology)?(?:\s+stack)?|stack|architecture|infrastructure|frameworks?)\s*$/im;
|
|
343
|
+
const techSection = extractSection(specContent, techSectionPattern) ?? "";
|
|
344
|
+
const tableRows = parseTechTable(techSection || specContent.slice(0, 3000));
|
|
345
|
+
const explicitDecisions = extractExplicitDecisions(specContent);
|
|
346
|
+
// Use first 1000 chars of tech section as the common spec excerpt
|
|
347
|
+
const specExcerpt = (techSection || specContent).slice(0, 1000).trim();
|
|
348
|
+
const candidates = buildAdrCandidates(tableRows, explicitDecisions, specExcerpt, specRelPath).slice(0, max_adrs);
|
|
349
|
+
if (candidates.length === 0) {
|
|
350
|
+
return {
|
|
351
|
+
content: [
|
|
352
|
+
{
|
|
353
|
+
type: "text",
|
|
354
|
+
text: `No technology decisions detected in ${specRelPath}.\n\n` +
|
|
355
|
+
"ForgeCraft looks for: tech stack tables, bullet lists in architecture sections, " +
|
|
356
|
+
"and explicit 'chose X because Y' language.\n\n" +
|
|
357
|
+
"Consider using `generate_adr` to write ADRs manually from the spec.",
|
|
358
|
+
},
|
|
359
|
+
],
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
const adrDir = resolveAdrDir(project_dir);
|
|
363
|
+
mkdirSync(adrDir, { recursive: true });
|
|
364
|
+
const date = new Date().toISOString().split("T")[0];
|
|
365
|
+
const written = [];
|
|
366
|
+
const skipped = [];
|
|
367
|
+
let nextNum = nextAdrNumber(adrDir);
|
|
368
|
+
for (const candidate of candidates) {
|
|
369
|
+
if (slugExists(adrDir, candidate.slug)) {
|
|
370
|
+
skipped.push(candidate.slug);
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
const numStr = String(nextNum).padStart(4, "0");
|
|
374
|
+
const filename = `${numStr}-${candidate.slug}.md`;
|
|
375
|
+
const filepath = join(adrDir, filename);
|
|
376
|
+
writeFileSync(filepath, buildAdrContent(nextNum, candidate, date), "utf-8");
|
|
377
|
+
written.push(filename);
|
|
378
|
+
nextNum++;
|
|
379
|
+
}
|
|
380
|
+
const adrRelDir = adrDir
|
|
381
|
+
.replace(project_dir.replace(/\\/g, "/"), "")
|
|
382
|
+
.replace(/\\/g, "/")
|
|
383
|
+
.replace(/^\//, "");
|
|
384
|
+
const lines = [
|
|
385
|
+
`## ADRs Extracted from Spec`,
|
|
386
|
+
"",
|
|
387
|
+
`**Source:** \`${specRelPath}\``,
|
|
388
|
+
`**Output:** \`${adrRelDir}/\``,
|
|
389
|
+
"",
|
|
390
|
+
written.length > 0
|
|
391
|
+
? `**Created (${written.length}):**\n${written.map((f) => `- \`${f}\``).join("\n")}`
|
|
392
|
+
: "**Created:** none",
|
|
393
|
+
"",
|
|
394
|
+
skipped.length > 0
|
|
395
|
+
? `**Skipped (${skipped.length}, already exist):**\n${skipped.map((s) => `- \`${s}\``).join("\n")}`
|
|
396
|
+
: "",
|
|
397
|
+
"",
|
|
398
|
+
"Each ADR contains the spec excerpt as context and is marked **Retroactive**.",
|
|
399
|
+
"Review and expand with team rationale before implementation begins.",
|
|
400
|
+
"",
|
|
401
|
+
"**Next steps:**",
|
|
402
|
+
"1. Open each ADR and confirm the decision is still current",
|
|
403
|
+
"2. Add alternatives considered and rejection rationale",
|
|
404
|
+
"3. Run `check_cascade` — ADRs now satisfy cascade step 4",
|
|
405
|
+
].filter((l) => l !== undefined);
|
|
406
|
+
return {
|
|
407
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=extract-adrs-from-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-adrs-from-spec.js","sourceRoot":"","sources":["../../src/tools/extract-adrs-from-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* extract_adrs_from_history tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Scans git log for architectural decision candidates and emits
|
|
5
|
+
* retroactive ADR stubs into docs/adrs/active/.
|
|
6
|
+
*
|
|
7
|
+
* Uses heuristics:
|
|
8
|
+
* - Commit message keywords: "switch to", "replace", "adopt", "migrate",
|
|
9
|
+
* "chose", "use X instead", "move from", "change from", "refactor to"
|
|
10
|
+
* - Large feat/refactor commits (≥ threshold files changed)
|
|
11
|
+
* - Merge commit PR titles that describe architectural choices
|
|
12
|
+
*
|
|
13
|
+
* Each stub has Status: Retroactive and the commit date/message pre-filled.
|
|
14
|
+
* Practitioners resolve [NEEDS CLARIFICATION] sections after review.
|
|
15
|
+
*
|
|
16
|
+
* Idempotent: skips commits whose slug already exists in docs/adrs/active/.
|
|
17
|
+
*/
|
|
18
|
+
import type { ToolResult } from "../shared/types.js";
|
|
19
|
+
export interface CommitCandidate {
|
|
20
|
+
readonly hash: string;
|
|
21
|
+
readonly date: string;
|
|
22
|
+
readonly subject: string;
|
|
23
|
+
readonly filesChanged: number;
|
|
24
|
+
readonly reason: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ExtractAdrsHistoryInput {
|
|
27
|
+
readonly project_dir: string;
|
|
28
|
+
/** Max candidates to return (default 10, to avoid flooding). */
|
|
29
|
+
readonly max_candidates?: number;
|
|
30
|
+
/** Min files changed to flag a large commit (default 5). */
|
|
31
|
+
readonly large_commit_threshold?: number;
|
|
32
|
+
/** Branch or ref to walk (default: HEAD). */
|
|
33
|
+
readonly ref?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Run git log and return candidates for architectural decisions.
|
|
37
|
+
* Non-throwing — returns empty array when not a git repo or git unavailable.
|
|
38
|
+
*/
|
|
39
|
+
export declare function findArchDecisionCandidates(projectDir: string, maxCandidates: number, largeCommitThreshold: number, ref: string): CommitCandidate[];
|
|
40
|
+
/**
|
|
41
|
+
* Scan git history for architectural decisions and emit retroactive ADR stubs.
|
|
42
|
+
*
|
|
43
|
+
* @param args - Input with project_dir and optional config
|
|
44
|
+
* @returns MCP tool result with written/skipped counts and candidate list
|
|
45
|
+
*/
|
|
46
|
+
export declare function extractAdrsFromHistoryHandler(args: ExtractAdrsHistoryInput): Promise<ToolResult>;
|
|
47
|
+
//# sourceMappingURL=extract-adrs-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-adrs-history.d.ts","sourceRoot":"","sources":["../../src/tools/extract-adrs-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gEAAgE;IAChE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,6CAA6C;IAC7C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAuCD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,oBAAoB,EAAE,MAAM,EAC5B,GAAG,EAAE,MAAM,GACV,eAAe,EAAE,CAsDnB;AAwFD;;;;;GAKG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,UAAU,CAAC,CAuHrB"}
|