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,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* propose_session tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Produces a pre-implementation impact assessment before generate_session_prompt runs.
|
|
5
|
+
* Adapted from OpenSpec's Propose phase, extended with forgecraft's layer-awareness.
|
|
6
|
+
*
|
|
7
|
+
* Output: which specs will change (ADDED/MODIFIED), which layers are affected,
|
|
8
|
+
* which gates must pass before close_cycle, and an implementation checklist.
|
|
9
|
+
* Writes .forgecraft/proposal.md as a persistent artifact.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, } from "node:fs";
|
|
13
|
+
import { join, resolve } from "node:path";
|
|
14
|
+
import { parseUseCases } from "./layer-status.js";
|
|
15
|
+
import { detectClarificationMarkers } from "./session-prompt-builders.js";
|
|
16
|
+
// ── Schema ────────────────────────────────────────────────────────────
|
|
17
|
+
export const proposeSessionSchema = z.object({
|
|
18
|
+
project_dir: z.string().describe("Absolute path to the project root."),
|
|
19
|
+
item_description: z
|
|
20
|
+
.string()
|
|
21
|
+
.min(10)
|
|
22
|
+
.optional()
|
|
23
|
+
.describe("What this session should build or fix. One sentence with actor, behavior, and postcondition."),
|
|
24
|
+
roadmap_item_id: z
|
|
25
|
+
.string()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("Roadmap item ID to propose for (e.g. 'RM-001'). Reads title from docs/roadmap.md."),
|
|
28
|
+
});
|
|
29
|
+
// ── Handler ──────────────────────────────────────────────────────────
|
|
30
|
+
export async function proposeSessionHandler(args) {
|
|
31
|
+
const projectDir = resolve(args.project_dir);
|
|
32
|
+
let itemDescription = args.item_description;
|
|
33
|
+
if (!itemDescription && args.roadmap_item_id) {
|
|
34
|
+
itemDescription =
|
|
35
|
+
resolveRoadmapTitle(projectDir, args.roadmap_item_id) ?? undefined;
|
|
36
|
+
}
|
|
37
|
+
if (!itemDescription) {
|
|
38
|
+
return {
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
41
|
+
type: "text",
|
|
42
|
+
text: "## Proposal Blocked\n\nProvide `item_description` or a valid `roadmap_item_id`.",
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const useCases = loadUseCases(projectDir);
|
|
48
|
+
const relatedUcIds = matchRelatedUcs(itemDescription, useCases);
|
|
49
|
+
const specDelta = buildSpecDelta(projectDir, itemDescription, relatedUcIds, useCases);
|
|
50
|
+
const gateRequirements = loadRequiredGates(projectDir);
|
|
51
|
+
const clarifications = detectClarificationMarkers(projectDir);
|
|
52
|
+
const layerSummary = buildLayerSummary(projectDir, relatedUcIds, useCases);
|
|
53
|
+
const checklist = buildChecklist(projectDir, itemDescription, specDelta, relatedUcIds);
|
|
54
|
+
const proposal = renderProposal({
|
|
55
|
+
projectDir,
|
|
56
|
+
itemDescription,
|
|
57
|
+
specDelta,
|
|
58
|
+
layerSummary,
|
|
59
|
+
gateRequirements,
|
|
60
|
+
clarifications,
|
|
61
|
+
checklist,
|
|
62
|
+
});
|
|
63
|
+
const forgecraftDir = join(projectDir, ".forgecraft");
|
|
64
|
+
mkdirSync(forgecraftDir, { recursive: true });
|
|
65
|
+
writeFileSync(join(forgecraftDir, "proposal.md"), proposal, "utf-8");
|
|
66
|
+
return { content: [{ type: "text", text: proposal }] };
|
|
67
|
+
}
|
|
68
|
+
// ── Use Case Matching ─────────────────────────────────────────────────
|
|
69
|
+
function loadUseCases(projectDir) {
|
|
70
|
+
const path = join(projectDir, "docs", "use-cases.md");
|
|
71
|
+
if (!existsSync(path))
|
|
72
|
+
return [];
|
|
73
|
+
try {
|
|
74
|
+
return parseUseCases(readFileSync(path, "utf-8"));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function matchRelatedUcs(description, ucs) {
|
|
81
|
+
if (ucs.length === 0)
|
|
82
|
+
return [];
|
|
83
|
+
const lower = description.toLowerCase();
|
|
84
|
+
const words = lower.split(/\s+/).filter((w) => w.length > 3);
|
|
85
|
+
return ucs
|
|
86
|
+
.filter((uc) => {
|
|
87
|
+
const title = uc.title.toLowerCase();
|
|
88
|
+
return words.some((w) => title.includes(w));
|
|
89
|
+
})
|
|
90
|
+
.map((uc) => uc.id);
|
|
91
|
+
}
|
|
92
|
+
// ── Spec Delta ────────────────────────────────────────────────────────
|
|
93
|
+
function buildSpecDelta(projectDir, description, relatedUcIds, ucs) {
|
|
94
|
+
const deltas = [];
|
|
95
|
+
// Use cases
|
|
96
|
+
if (existsSync(join(projectDir, "docs", "use-cases.md"))) {
|
|
97
|
+
if (relatedUcIds.length > 0) {
|
|
98
|
+
deltas.push({
|
|
99
|
+
artifact: "docs/use-cases.md",
|
|
100
|
+
change: "MODIFIED",
|
|
101
|
+
reason: `Affects use case(s): ${relatedUcIds.join(", ")}`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else if (ucs.length > 0) {
|
|
105
|
+
deltas.push({
|
|
106
|
+
artifact: "docs/use-cases.md",
|
|
107
|
+
change: "MODIFIED",
|
|
108
|
+
reason: "May require a new use case entry for this session",
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
deltas.push({
|
|
114
|
+
artifact: "docs/use-cases.md",
|
|
115
|
+
change: "ADDED",
|
|
116
|
+
reason: "Use cases file does not exist — create before implementing",
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// PRD
|
|
120
|
+
if (!existsSync(join(projectDir, "docs", "PRD.md"))) {
|
|
121
|
+
deltas.push({
|
|
122
|
+
artifact: "docs/PRD.md",
|
|
123
|
+
change: "ADDED",
|
|
124
|
+
reason: "Product requirements not found — run setup_project",
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
deltas.push({
|
|
129
|
+
artifact: "docs/PRD.md",
|
|
130
|
+
change: "MODIFIED",
|
|
131
|
+
reason: "Requirement coverage may need updating after session",
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// ADR — check if a related ADR likely exists
|
|
135
|
+
const adrHint = needsAdr(description);
|
|
136
|
+
if (adrHint) {
|
|
137
|
+
deltas.push({
|
|
138
|
+
artifact: "docs/adrs/NNNN-<decision-slug>.md",
|
|
139
|
+
change: "ADDED",
|
|
140
|
+
reason: adrHint,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// Session prompt
|
|
144
|
+
deltas.push({
|
|
145
|
+
artifact: ".forgecraft/proposal.md",
|
|
146
|
+
change: "ADDED",
|
|
147
|
+
reason: "This proposal (written now)",
|
|
148
|
+
});
|
|
149
|
+
return deltas;
|
|
150
|
+
}
|
|
151
|
+
function needsAdr(description) {
|
|
152
|
+
const triggers = [
|
|
153
|
+
["database", "DB", "storage", "schema", "migration"],
|
|
154
|
+
["auth", "authentication", "authorization", "JWT", "token"],
|
|
155
|
+
["api", "endpoint", "REST", "GraphQL", "gRPC"],
|
|
156
|
+
["cache", "Redis", "CDN"],
|
|
157
|
+
["queue", "event", "message", "Kafka", "SQS"],
|
|
158
|
+
["deploy", "infrastructure", "IaC", "container", "Docker", "Kubernetes"],
|
|
159
|
+
];
|
|
160
|
+
const lower = description.toLowerCase();
|
|
161
|
+
for (const group of triggers) {
|
|
162
|
+
if (group.some((kw) => lower.includes(kw.toLowerCase()))) {
|
|
163
|
+
return `Decision involves ${group[0]} — likely needs an ADR before committing`;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
// ── Gate Loading ──────────────────────────────────────────────────────
|
|
169
|
+
function loadRequiredGates(projectDir) {
|
|
170
|
+
const dirs = [
|
|
171
|
+
join(projectDir, ".forgecraft", "gates", "active"),
|
|
172
|
+
join(projectDir, ".forgecraft", "gates", "project", "active"),
|
|
173
|
+
];
|
|
174
|
+
const gates = [];
|
|
175
|
+
for (const dir of dirs) {
|
|
176
|
+
if (!existsSync(dir))
|
|
177
|
+
continue;
|
|
178
|
+
try {
|
|
179
|
+
for (const f of readdirSync(dir).filter((n) => n.endsWith(".yaml"))) {
|
|
180
|
+
const gate = parseGateYaml(join(dir, f));
|
|
181
|
+
if (gate)
|
|
182
|
+
gates.push(gate);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
/* skip */
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return gates;
|
|
190
|
+
}
|
|
191
|
+
function parseGateYaml(filePath) {
|
|
192
|
+
try {
|
|
193
|
+
const text = readFileSync(filePath, "utf-8");
|
|
194
|
+
const id = /^id:\s*(.+)$/m.exec(text)?.[1]?.trim() ?? "";
|
|
195
|
+
const description = /^description:\s*(.+)$/m.exec(text)?.[1]?.trim() ?? "";
|
|
196
|
+
const priority = /^priority:\s*(.+)$/m.exec(text)?.[1]?.trim() ?? "P2";
|
|
197
|
+
const layer = /^layer:\s*(.+)$/m.exec(text)?.[1]?.trim() ?? "L1";
|
|
198
|
+
if (!id)
|
|
199
|
+
return null;
|
|
200
|
+
return { gateId: id, description, priority, layer };
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function buildLayerSummary(projectDir, relatedUcIds, ucs) {
|
|
207
|
+
const harnessDir = join(projectDir, "tests", "harness");
|
|
208
|
+
const envDir = join(projectDir, "tests", "env");
|
|
209
|
+
const sloDir = join(projectDir, "tests", "slo");
|
|
210
|
+
const candidates = relatedUcIds.length > 0
|
|
211
|
+
? ucs.filter((uc) => relatedUcIds.includes(uc.id))
|
|
212
|
+
: ucs.slice(0, 5); // show first 5 if no match
|
|
213
|
+
return candidates.map((uc) => {
|
|
214
|
+
const lower = uc.id.toLowerCase().replace(/_/g, "-");
|
|
215
|
+
const l2 = existsSync(harnessDir) &&
|
|
216
|
+
readdirSync(harnessDir).some((f) => f.toLowerCase().startsWith(lower))
|
|
217
|
+
? "✅ probes found"
|
|
218
|
+
: "❌ no probes";
|
|
219
|
+
const l3 = existsSync(envDir) &&
|
|
220
|
+
readdirSync(envDir).some((f) => f.toLowerCase().startsWith(lower))
|
|
221
|
+
? "✅ env probes"
|
|
222
|
+
: "—";
|
|
223
|
+
const l4 = existsSync(sloDir) &&
|
|
224
|
+
readdirSync(sloDir).some((f) => f.toLowerCase().startsWith(lower))
|
|
225
|
+
? "✅ slo probes"
|
|
226
|
+
: "—";
|
|
227
|
+
const l1 = existsSync(join(projectDir, "docs", "use-cases.md"))
|
|
228
|
+
? "✅ use case"
|
|
229
|
+
: "❌ missing";
|
|
230
|
+
return { ucId: uc.id, title: uc.title, l1, l2, l3, l4 };
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
// ── Checklist ─────────────────────────────────────────────────────────
|
|
234
|
+
function buildChecklist(projectDir, _description, specDelta, relatedUcIds) {
|
|
235
|
+
const items = [];
|
|
236
|
+
// Cascade check
|
|
237
|
+
items.push("Run `check_cascade` — all 5 steps must be complete before starting");
|
|
238
|
+
// Clarifications
|
|
239
|
+
items.push("Resolve all `[NEEDS CLARIFICATION]` markers in spec artifacts");
|
|
240
|
+
// Spec updates
|
|
241
|
+
const added = specDelta.filter((d) => d.change === "ADDED");
|
|
242
|
+
if (added.length > 0) {
|
|
243
|
+
for (const d of added) {
|
|
244
|
+
items.push(`Create missing artifact: \`${d.artifact}\` — ${d.reason}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Harness
|
|
248
|
+
if (relatedUcIds.length > 0) {
|
|
249
|
+
items.push(`Run \`generate_harness\` for affected use cases: ${relatedUcIds.join(", ")}`);
|
|
250
|
+
items.push("Implement harness probe TODO sections before closing");
|
|
251
|
+
}
|
|
252
|
+
// TDD loop
|
|
253
|
+
items.push("Write failing probes first, then implement until green");
|
|
254
|
+
items.push("Run `run_harness` — all L2 probes must pass before `close_cycle`");
|
|
255
|
+
// Env / infra check
|
|
256
|
+
if (existsSync(join(projectDir, "tests", "env"))) {
|
|
257
|
+
items.push("Run `run_env_probe` — L3 env contracts must hold after changes");
|
|
258
|
+
}
|
|
259
|
+
// Close
|
|
260
|
+
items.push("Run `close_cycle` — evaluates all gates and writes `.claude/state.md`");
|
|
261
|
+
items.push("Update `Status.md` with completed changes and next steps");
|
|
262
|
+
return items;
|
|
263
|
+
}
|
|
264
|
+
// ── Roadmap Resolution ────────────────────────────────────────────────
|
|
265
|
+
function resolveRoadmapTitle(projectDir, itemId) {
|
|
266
|
+
const path = join(projectDir, "docs", "roadmap.md");
|
|
267
|
+
if (!existsSync(path))
|
|
268
|
+
return null;
|
|
269
|
+
const text = readFileSync(path, "utf-8");
|
|
270
|
+
const re = new RegExp(`\\|\\s*${itemId}\\s*\\|[^|]+\\|([^|]+)\\|`);
|
|
271
|
+
const m = re.exec(text);
|
|
272
|
+
return m ? (m[1]?.trim() ?? null) : null;
|
|
273
|
+
}
|
|
274
|
+
function renderProposal(input) {
|
|
275
|
+
const { itemDescription, specDelta, layerSummary, gateRequirements, clarifications, checklist, } = input;
|
|
276
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
277
|
+
const lines = [];
|
|
278
|
+
lines.push(`# Session Proposal`, ``, `**Date:** ${date}`, `**Scope:** ${itemDescription}`, ``);
|
|
279
|
+
lines.push(`> This proposal is a pre-implementation impact assessment.`);
|
|
280
|
+
lines.push(`> Resolve all blockers, then run \`generate_session_prompt\` to commit to implementation.`, ``);
|
|
281
|
+
// Spec delta
|
|
282
|
+
lines.push(`## Spec Delta`, ``);
|
|
283
|
+
lines.push(`| Artifact | Change | Reason |`, `|---|---|---|`);
|
|
284
|
+
for (const d of specDelta) {
|
|
285
|
+
const badge = d.change === "ADDED"
|
|
286
|
+
? "🆕 ADDED"
|
|
287
|
+
: d.change === "MODIFIED"
|
|
288
|
+
? "✏️ MODIFIED"
|
|
289
|
+
: "🗑 REMOVED";
|
|
290
|
+
lines.push(`| \`${d.artifact}\` | ${badge} | ${d.reason} |`);
|
|
291
|
+
}
|
|
292
|
+
lines.push(``);
|
|
293
|
+
// Layer readiness
|
|
294
|
+
if (layerSummary.length > 0) {
|
|
295
|
+
lines.push(`## Layer Readiness — Affected Use Cases`, ``);
|
|
296
|
+
lines.push(`| UC | Title | L1 Spec | L2 Probes | L3 Env | L4 SLO |`, `|---|---|---|---|---|---|`);
|
|
297
|
+
for (const r of layerSummary) {
|
|
298
|
+
lines.push(`| ${r.ucId} | ${r.title} | ${r.l1} | ${r.l2} | ${r.l3} | ${r.l4} |`);
|
|
299
|
+
}
|
|
300
|
+
lines.push(``);
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
lines.push(`## Layer Readiness`, ``, `_No use cases found. Run \`setup_project\` to create the spec foundation._`, ``);
|
|
304
|
+
}
|
|
305
|
+
// Clarifications
|
|
306
|
+
if (clarifications.length > 0) {
|
|
307
|
+
lines.push(`## ⚠️ Unresolved Clarifications — Must Resolve Before Session`, ``);
|
|
308
|
+
lines.push(`| File | Marker |`, `|---|---|`);
|
|
309
|
+
for (const c of clarifications) {
|
|
310
|
+
lines.push(`| \`${c.file}\` | ${c.marker} |`);
|
|
311
|
+
}
|
|
312
|
+
lines.push(``, `Resolve these before running \`generate_session_prompt\`.`, ``);
|
|
313
|
+
}
|
|
314
|
+
// Gates
|
|
315
|
+
if (gateRequirements.length > 0) {
|
|
316
|
+
lines.push(`## Gates That Must Pass Before \`close_cycle\``, ``);
|
|
317
|
+
lines.push(`| Gate ID | Layer | Priority | Description |`, `|---|---|---|---|`);
|
|
318
|
+
for (const g of gateRequirements) {
|
|
319
|
+
lines.push(`| ${g.gateId} | ${g.layer} | ${g.priority} | ${g.description} |`);
|
|
320
|
+
}
|
|
321
|
+
lines.push(``);
|
|
322
|
+
}
|
|
323
|
+
// Checklist
|
|
324
|
+
lines.push(`## Pre-Implementation Checklist`, ``);
|
|
325
|
+
for (const item of checklist) {
|
|
326
|
+
lines.push(`- [ ] ${item}`);
|
|
327
|
+
}
|
|
328
|
+
lines.push(``);
|
|
329
|
+
lines.push(`---`);
|
|
330
|
+
lines.push(`_Proposal written to \`.forgecraft/proposal.md\`. Run \`generate_session_prompt\` when ready to commit._`);
|
|
331
|
+
return lines.join("\n");
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=propose-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose-session.js","sourceRoot":"","sources":["../../src/tools/propose-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,yEAAyE;AAEzE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACtE,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CACP,8FAA8F,CAC/F;IACH,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,mFAAmF,CACpF;CACJ,CAAC,CAAC;AAqBH,wEAAwE;AAExE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAyB;IAEzB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE7C,IAAI,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC;IAC5C,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7C,eAAe;YACb,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,SAAS,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,iFAAiF;iBACxF;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,eAAe,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,cAAc,CAC9B,UAAU,EACV,eAAe,EACf,YAAY,EACZ,QAAQ,CACT,CAAC;IACF,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,iBAAiB,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,cAAc,CAC9B,UAAU,EACV,eAAe,EACf,SAAS,EACT,YAAY,CACb,CAAC;IAEF,MAAM,QAAQ,GAAG,cAAc,CAAC;QAC9B,UAAU;QACV,eAAe;QACf,SAAS;QACT,YAAY;QACZ,gBAAgB;QAChB,cAAc;QACd,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACtD,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAErE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,yEAAyE;AAEzE,SAAS,YAAY,CACnB,UAAkB;IAElB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACtB,WAAmB,EACnB,GAAyC;IAEzC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7D,OAAO,GAAG;SACP,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,yEAAyE;AAEzE,SAAS,cAAc,CACrB,UAAkB,EAClB,WAAmB,EACnB,YAAsB,EACtB,GAAyC;IAEzC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,YAAY;IACZ,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACzD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,mBAAmB;gBAC7B,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,wBAAwB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC1D,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,mBAAmB;gBAC7B,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,mDAAmD;aAC5D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,mBAAmB;YAC7B,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,4DAA4D;SACrE,CAAC,CAAC;IACL,CAAC;IAED,MAAM;IACN,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,aAAa;YACvB,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,oDAAoD;SAC7D,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,aAAa;YACvB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,sDAAsD;SAC/D,CAAC,CAAC;IACL,CAAC;IAED,6CAA6C;IAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,mCAAmC;YAC7C,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,OAAO;SAChB,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB;IACjB,MAAM,CAAC,IAAI,CAAC;QACV,QAAQ,EAAE,yBAAyB;QACnC,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,6BAA6B;KACtC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,WAAmB;IACnC,MAAM,QAAQ,GAAG;QACf,CAAC,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC;QACpD,CAAC,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,CAAC;QAC3D,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;QAC9C,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC;QACzB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC;QAC7C,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC;KACzE,CAAC;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;YACzD,OAAO,qBAAqB,KAAK,CAAC,CAAC,CAAC,0CAA0C,CAAC;QACjF,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yEAAyE;AAEzE,SAAS,iBAAiB,CAAC,UAAkB;IAC3C,MAAM,IAAI,GAAG;QACX,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC;QAClD,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;KAC9D,CAAC;IACF,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,IAAI,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACpE,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;gBACzC,IAAI,IAAI;oBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACzD,MAAM,WAAW,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC3E,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;QACvE,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;QACjE,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAaD,SAAS,iBAAiB,CACxB,UAAkB,EAClB,YAAsB,EACtB,GAAyC;IAEzC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAEhD,MAAM,UAAU,GACd,YAAY,CAAC,MAAM,GAAG,CAAC;QACrB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,2BAA2B;IAElD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrD,MAAM,EAAE,GACN,UAAU,CAAC,UAAU,CAAC;YACtB,WAAW,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACpE,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,aAAa,CAAC;QACpB,MAAM,EAAE,GACN,UAAU,CAAC,MAAM,CAAC;YAClB,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAChE,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,GAAG,CAAC;QACV,MAAM,EAAE,GACN,UAAU,CAAC,MAAM,CAAC;YAClB,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAChE,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,GAAG,CAAC;QACV,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;YAC7D,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,WAAW,CAAC;QAChB,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yEAAyE;AAEzE,SAAS,cAAc,CACrB,UAAkB,EAClB,YAAoB,EACpB,SAAsB,EACtB,YAAsB;IAEtB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,gBAAgB;IAChB,KAAK,CAAC,IAAI,CACR,oEAAoE,CACrE,CAAC;IAEF,iBAAiB;IACjB,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAE5E,eAAe;IACf,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,QAAQ,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,UAAU;IACV,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CACR,oDAAoD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9E,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACrE,CAAC;IAED,WAAW;IACX,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACrE,KAAK,CAAC,IAAI,CACR,kEAAkE,CACnE,CAAC;IAEF,oBAAoB;IACpB,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACjD,KAAK,CAAC,IAAI,CACR,gEAAgE,CACjE,CAAC;IACJ,CAAC;IAED,QAAQ;IACR,KAAK,CAAC,IAAI,CACR,uEAAuE,CACxE,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IAEvE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yEAAyE;AAEzE,SAAS,mBAAmB,CAC1B,UAAkB,EAClB,MAAc;IAEd,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,UAAU,MAAM,2BAA2B,CAAC,CAAC;IACnE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AAcD,SAAS,cAAc,CAAC,KAAoB;IAC1C,MAAM,EACJ,eAAe,EACf,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,SAAS,GACV,GAAG,KAAK,CAAC;IACV,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CACR,oBAAoB,EACpB,EAAE,EACF,aAAa,IAAI,EAAE,EACnB,cAAc,eAAe,EAAE,EAC/B,EAAE,CACH,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IACzE,KAAK,CAAC,IAAI,CACR,2FAA2F,EAC3F,EAAE,CACH,CAAC;IAEF,aAAa;IACb,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,gCAAgC,EAAE,eAAe,CAAC,CAAC;IAC9D,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,KAAK,GACT,CAAC,CAAC,MAAM,KAAK,OAAO;YAClB,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU;gBACvB,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,YAAY,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;IAC/D,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,kBAAkB;IAClB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,yCAAyC,EAAE,EAAE,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CACR,wDAAwD,EACxD,2BAA2B,CAC5B,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CACrE,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CACR,oBAAoB,EACpB,EAAE,EACF,4EAA4E,EAC5E,EAAE,CACH,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CACR,+DAA+D,EAC/D,EAAE,CACH,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,CAAC,IAAI,CACR,EAAE,EACF,2DAA2D,EAC3D,EAAE,CACH,CAAC;IACJ,CAAC;IAED,QAAQ;IACR,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,gDAAgD,EAAE,EAAE,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CACR,8CAA8C,EAC9C,mBAAmB,CACpB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,WAAW,IAAI,CAClE,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,YAAY;IACZ,KAAK,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CACR,0GAA0G,CAC3G,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -8,20 +8,20 @@ import { writeFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
|
8
8
|
import { join, dirname } from "node:path";
|
|
9
9
|
import yaml from "js-yaml";
|
|
10
10
|
// ── Constants ────────────────────────────────────────────────────────
|
|
11
|
-
export const PROJECT_SPECIFIC_PLACEHOLDER = `# Project-Specific Rules
|
|
12
|
-
<!-- This file is owned by YOU. ForgeCraft will never overwrite it. -->
|
|
13
|
-
<!-- Add project-specific rules, framework choices, conventions, and custom corrections here. -->
|
|
14
|
-
<!-- The sentinel CLAUDE.md links here for any AI reading your project. -->
|
|
15
|
-
|
|
16
|
-
## Framework & Stack Choices
|
|
17
|
-
<!-- e.g. We use Prisma for ORM. Deploy target is Railway. -->
|
|
18
|
-
|
|
19
|
-
## Custom Corrections
|
|
20
|
-
<!-- Log corrections here so the AI learns from them. -->
|
|
21
|
-
<!-- Format: - YYYY-MM-DD: [description of correction] -->
|
|
22
|
-
|
|
23
|
-
## Project-Specific Gates
|
|
24
|
-
<!-- Add any quality rules specific to this project that don't belong in universal standards. -->
|
|
11
|
+
export const PROJECT_SPECIFIC_PLACEHOLDER = `# Project-Specific Rules
|
|
12
|
+
<!-- This file is owned by YOU. ForgeCraft will never overwrite it. -->
|
|
13
|
+
<!-- Add project-specific rules, framework choices, conventions, and custom corrections here. -->
|
|
14
|
+
<!-- The sentinel CLAUDE.md links here for any AI reading your project. -->
|
|
15
|
+
|
|
16
|
+
## Framework & Stack Choices
|
|
17
|
+
<!-- e.g. We use Prisma for ORM. Deploy target is Railway. -->
|
|
18
|
+
|
|
19
|
+
## Custom Corrections
|
|
20
|
+
<!-- Log corrections here so the AI learns from them. -->
|
|
21
|
+
<!-- Format: - YYYY-MM-DD: [description of correction] -->
|
|
22
|
+
|
|
23
|
+
## Project-Specific Gates
|
|
24
|
+
<!-- Add any quality rules specific to this project that don't belong in universal standards. -->
|
|
25
25
|
`;
|
|
26
26
|
// ── Project Specific File ────────────────────────────────────────────
|
|
27
27
|
/**
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review_stubs tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Scans docs/adrs/active/, docs/decisions/, and .claude/standards/ for files
|
|
5
|
+
* containing unresolved [NEEDS CLARIFICATION] markers. Triages them by priority
|
|
6
|
+
* so practitioners know what to fill in first.
|
|
7
|
+
*
|
|
8
|
+
* Priority:
|
|
9
|
+
* high — ADRs (Retroactive status, most recently dated)
|
|
10
|
+
* medium — Decision records with unresolved markers
|
|
11
|
+
* low — CNT leaf nodes with placeholder content
|
|
12
|
+
*
|
|
13
|
+
* Idempotent — read-only, no files written.
|
|
14
|
+
*/
|
|
15
|
+
import type { ToolResult } from "../shared/types.js";
|
|
16
|
+
export interface StubFile {
|
|
17
|
+
readonly relPath: string;
|
|
18
|
+
readonly type: "adr" | "decision" | "cnt-leaf";
|
|
19
|
+
readonly status: string | null;
|
|
20
|
+
readonly date: string | null;
|
|
21
|
+
readonly markerCount: number;
|
|
22
|
+
readonly priority: "high" | "medium" | "low";
|
|
23
|
+
readonly firstLine: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ReviewStubsInput {
|
|
26
|
+
readonly project_dir: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function reviewStubsHandler(args: ReviewStubsInput): Promise<ToolResult>;
|
|
29
|
+
//# sourceMappingURL=review-stubs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-stubs.d.ts","sourceRoot":"","sources":["../../src/tools/review-stubs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,GAAG,UAAU,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAwID,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,UAAU,CAAC,CA+DrB"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review_stubs tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Scans docs/adrs/active/, docs/decisions/, and .claude/standards/ for files
|
|
5
|
+
* containing unresolved [NEEDS CLARIFICATION] markers. Triages them by priority
|
|
6
|
+
* so practitioners know what to fill in first.
|
|
7
|
+
*
|
|
8
|
+
* Priority:
|
|
9
|
+
* high — ADRs (Retroactive status, most recently dated)
|
|
10
|
+
* medium — Decision records with unresolved markers
|
|
11
|
+
* low — CNT leaf nodes with placeholder content
|
|
12
|
+
*
|
|
13
|
+
* Idempotent — read-only, no files written.
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
const MARKER = "[NEEDS CLARIFICATION]";
|
|
18
|
+
const SCAFFOLD_SENTINEL = "<!-- ForgeCraft sentinel:";
|
|
19
|
+
// ── Scanners ──────────────────────────────────────────────────────────
|
|
20
|
+
function extractStatusLine(content) {
|
|
21
|
+
const match = /\*\*Status:\*\*\s*(.+)/i.exec(content);
|
|
22
|
+
return match ? (match[1]?.trim() ?? null) : null;
|
|
23
|
+
}
|
|
24
|
+
function extractDateLine(content) {
|
|
25
|
+
const match = /\*\*Date:\*\*\s*(\d{4}-\d{2}-\d{2})/i.exec(content);
|
|
26
|
+
return match ? (match[1] ?? null) : null;
|
|
27
|
+
}
|
|
28
|
+
function countMarkers(content) {
|
|
29
|
+
let count = 0;
|
|
30
|
+
let pos = 0;
|
|
31
|
+
while ((pos = content.indexOf(MARKER, pos)) !== -1) {
|
|
32
|
+
count++;
|
|
33
|
+
pos += MARKER.length;
|
|
34
|
+
}
|
|
35
|
+
return count;
|
|
36
|
+
}
|
|
37
|
+
function firstHeadingLine(content) {
|
|
38
|
+
const line = content.split("\n").find((l) => l.startsWith("#"));
|
|
39
|
+
return line ? line.replace(/^#+\s*/, "").trim() : "(no title)";
|
|
40
|
+
}
|
|
41
|
+
function scanDir(projectDir, relDir, type) {
|
|
42
|
+
const absDir = join(projectDir, ...relDir.split("/"));
|
|
43
|
+
if (!existsSync(absDir))
|
|
44
|
+
return [];
|
|
45
|
+
const stubs = [];
|
|
46
|
+
try {
|
|
47
|
+
for (const filename of readdirSync(absDir)) {
|
|
48
|
+
if (!filename.endsWith(".md"))
|
|
49
|
+
continue;
|
|
50
|
+
const fullPath = join(absDir, filename);
|
|
51
|
+
let content = "";
|
|
52
|
+
try {
|
|
53
|
+
content = readFileSync(fullPath, "utf-8");
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// Skip scaffold-generated files — they're intentionally long
|
|
59
|
+
if (type === "cnt-leaf" && content.startsWith(SCAFFOLD_SENTINEL))
|
|
60
|
+
continue;
|
|
61
|
+
const markerCount = countMarkers(content);
|
|
62
|
+
const status = extractStatusLine(content);
|
|
63
|
+
const date = extractDateLine(content);
|
|
64
|
+
const firstLine = firstHeadingLine(content);
|
|
65
|
+
// Only include files that have markers OR retroactive ADRs without them
|
|
66
|
+
const isRetroactive = type === "adr" &&
|
|
67
|
+
(status?.toLowerCase().includes("retroactive") ?? false);
|
|
68
|
+
if (markerCount === 0 && !isRetroactive)
|
|
69
|
+
continue;
|
|
70
|
+
const priority = derivePriority(type, status, date);
|
|
71
|
+
stubs.push({
|
|
72
|
+
relPath: `${relDir}/${filename}`,
|
|
73
|
+
type,
|
|
74
|
+
status,
|
|
75
|
+
date,
|
|
76
|
+
markerCount,
|
|
77
|
+
priority,
|
|
78
|
+
firstLine,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// non-throwing
|
|
84
|
+
}
|
|
85
|
+
return stubs;
|
|
86
|
+
}
|
|
87
|
+
function derivePriority(type, status, date) {
|
|
88
|
+
if (type === "adr") {
|
|
89
|
+
// Recent retroactive ADRs are high priority
|
|
90
|
+
if (date) {
|
|
91
|
+
const age = Date.now() - new Date(date).getTime();
|
|
92
|
+
const ninetyDays = 90 * 24 * 60 * 60 * 1000;
|
|
93
|
+
return age < ninetyDays ? "high" : "medium";
|
|
94
|
+
}
|
|
95
|
+
return status?.toLowerCase().includes("retroactive") ? "medium" : "high";
|
|
96
|
+
}
|
|
97
|
+
if (type === "decision")
|
|
98
|
+
return "medium";
|
|
99
|
+
return "low";
|
|
100
|
+
}
|
|
101
|
+
// ── Formatter ─────────────────────────────────────────────────────────
|
|
102
|
+
function renderGroup(label, stubs, lines) {
|
|
103
|
+
if (stubs.length === 0)
|
|
104
|
+
return;
|
|
105
|
+
lines.push(`### ${label}`, "");
|
|
106
|
+
for (const s of stubs) {
|
|
107
|
+
const markerNote = s.markerCount > 0 ? `${s.markerCount} marker(s)` : "no markers";
|
|
108
|
+
const statusNote = s.status ? ` [${s.status}]` : "";
|
|
109
|
+
lines.push(`- \`${s.relPath}\`${statusNote} — ${markerNote}`);
|
|
110
|
+
lines.push(` > ${s.firstLine}`);
|
|
111
|
+
if (s.type === "adr") {
|
|
112
|
+
if (s.markerCount > 0) {
|
|
113
|
+
lines.push(" > Fill Context / Decision / Alternatives / Consequences, then change Status to `Accepted`.");
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
lines.push(" > Retroactive ADR with no markers — verify the decision is still in force and set Status to `Accepted` or `Superseded`.");
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else if (s.type === "decision") {
|
|
120
|
+
lines.push(" > Fill Trigger / Root Cause / Fix / Regression Test.");
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
lines.push(" > Expand this leaf node or remove the placeholder if the domain is not yet relevant.");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
lines.push("");
|
|
127
|
+
}
|
|
128
|
+
// ── Handler ───────────────────────────────────────────────────────────
|
|
129
|
+
export async function reviewStubsHandler(args) {
|
|
130
|
+
const projectDir = args.project_dir;
|
|
131
|
+
const adrStubs = scanDir(projectDir, "docs/adrs/active", "adr");
|
|
132
|
+
const legacyAdrStubs = existsSync(join(projectDir, "docs", "adrs", "active"))
|
|
133
|
+
? []
|
|
134
|
+
: scanDir(projectDir, "docs/adrs", "adr");
|
|
135
|
+
const allAdrStubs = [...adrStubs, ...legacyAdrStubs];
|
|
136
|
+
const decisionStubs = scanDir(projectDir, "docs/decisions", "decision");
|
|
137
|
+
const cntStubs = scanDir(projectDir, "docs/decisions", "cnt-leaf").concat(scanDir(projectDir, ".claude/standards", "cnt-leaf"));
|
|
138
|
+
const allStubs = [...allAdrStubs, ...decisionStubs, ...cntStubs];
|
|
139
|
+
if (allStubs.length === 0) {
|
|
140
|
+
return {
|
|
141
|
+
content: [
|
|
142
|
+
{
|
|
143
|
+
type: "text",
|
|
144
|
+
text: [
|
|
145
|
+
"## Stub Triage",
|
|
146
|
+
"",
|
|
147
|
+
"No unresolved stubs found. All ADRs, decisions, and CNT leaves are either filled in or absent.",
|
|
148
|
+
"",
|
|
149
|
+
"If you recently ran `extract_adrs_from_history`, stubs may have been placed in `docs/adrs/` — check there if this seems wrong.",
|
|
150
|
+
].join("\n"),
|
|
151
|
+
},
|
|
152
|
+
],
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const high = allStubs.filter((s) => s.priority === "high");
|
|
156
|
+
const medium = allStubs.filter((s) => s.priority === "medium");
|
|
157
|
+
const low = allStubs.filter((s) => s.priority === "low");
|
|
158
|
+
const totalMarkers = allStubs.reduce((sum, s) => sum + s.markerCount, 0);
|
|
159
|
+
const lines = [
|
|
160
|
+
"## Stub Triage",
|
|
161
|
+
"",
|
|
162
|
+
`Found **${allStubs.length}** stub file(s) with **${totalMarkers}** unresolved marker(s).`,
|
|
163
|
+
"",
|
|
164
|
+
"Work through these in order. Each resolved stub improves your **Auditable** GS property score.",
|
|
165
|
+
"",
|
|
166
|
+
];
|
|
167
|
+
renderGroup("High Priority — fill these first", high, lines);
|
|
168
|
+
renderGroup("Medium Priority", medium, lines);
|
|
169
|
+
renderGroup("Low Priority (CNT leaf nodes)", low, lines);
|
|
170
|
+
lines.push("### How to prioritize", "", "1. **Still in force** — fill Context/Decision/Alternatives, change Status → `Accepted`", "2. **Since superseded** — record briefly, mark `Superseded by ADR-XXXX`", "3. **Not a real decision** — delete the stub", "", "Once all stubs are resolved, re-run `audit` — the Auditable property score will improve.");
|
|
171
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=review-stubs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-stubs.js","sourceRoot":"","sources":["../../src/tools/review-stubs.ts"],"names":[],"mappings":"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"}
|