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,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* run_slo_probe tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Scans tests/slo/ for probe files, executes each (.sh via bash, .k6.js via k6),
|
|
5
|
+
* reports PASS/FAIL/TOOL_MISSING/NOT_IMPLEMENTED/NO_PROBE/TIMEOUT/ERROR.
|
|
6
|
+
* Writes .forgecraft/slo-probe-run.json after execution.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import type { ToolResult } from "../shared/types.js";
|
|
10
|
+
import type { ProbeStatus } from "./run-harness.js";
|
|
11
|
+
export declare const runSloProbeSchema: z.ZodObject<{
|
|
12
|
+
project_dir: z.ZodString;
|
|
13
|
+
timeout_ms: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
project_dir: string;
|
|
16
|
+
timeout_ms?: number | undefined;
|
|
17
|
+
}, {
|
|
18
|
+
project_dir: string;
|
|
19
|
+
timeout_ms?: number | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
export type RunSloProbeInput = z.infer<typeof runSloProbeSchema>;
|
|
22
|
+
export interface SloProbeResult {
|
|
23
|
+
service: string;
|
|
24
|
+
probeId: string;
|
|
25
|
+
probeFile: string | null;
|
|
26
|
+
probeType: string;
|
|
27
|
+
status: ProbeStatus;
|
|
28
|
+
durationMs: number;
|
|
29
|
+
output?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface SloProbeRunJson {
|
|
32
|
+
timestamp: string;
|
|
33
|
+
passed: number;
|
|
34
|
+
failed: number;
|
|
35
|
+
errors: number;
|
|
36
|
+
notFound: number;
|
|
37
|
+
results: Array<{
|
|
38
|
+
service: string;
|
|
39
|
+
probeId: string;
|
|
40
|
+
status: string;
|
|
41
|
+
durationMs: number;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
export declare function parseSloProbeFileName(fileName: string): {
|
|
45
|
+
service: string;
|
|
46
|
+
probeId: string;
|
|
47
|
+
probeType: string;
|
|
48
|
+
};
|
|
49
|
+
export declare function runSloProbeHandler(args: RunSloProbeInput): Promise<ToolResult>;
|
|
50
|
+
//# sourceMappingURL=run-slo-probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-slo-probe.d.ts","sourceRoot":"","sources":["../../src/tools/run-slo-probe.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,eAAO,MAAM,iBAAiB;;;;;;;;;EAM5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAIjE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ;AAID,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,CAiCA;AAuFD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,UAAU,CAAC,CA8DrB"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* run_slo_probe tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Scans tests/slo/ for probe files, executes each (.sh via bash, .k6.js via k6),
|
|
5
|
+
* reports PASS/FAIL/TOOL_MISSING/NOT_IMPLEMENTED/NO_PROBE/TIMEOUT/ERROR.
|
|
6
|
+
* Writes .forgecraft/slo-probe-run.json after execution.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { join, resolve } from "node:path";
|
|
11
|
+
import { spawnSync } from "node:child_process";
|
|
12
|
+
import { isToolAvailable, isNotImplementedOutput, combineOutput, } from "./probe-runners.js";
|
|
13
|
+
// ── Schema ───────────────────────────────────────────────────────────
|
|
14
|
+
export const runSloProbeSchema = z.object({
|
|
15
|
+
project_dir: z.string().describe("Absolute path to the project root."),
|
|
16
|
+
timeout_ms: z
|
|
17
|
+
.number()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("Timeout per probe in ms. Default: 15000."),
|
|
20
|
+
});
|
|
21
|
+
// ── Probe file parsing ────────────────────────────────────────────────
|
|
22
|
+
export function parseSloProbeFileName(fileName) {
|
|
23
|
+
const typeMap = {
|
|
24
|
+
".alert.sh": "alert_exists",
|
|
25
|
+
".metric.sh": "metric_present",
|
|
26
|
+
".dashboard.sh": "dashboard_exists",
|
|
27
|
+
".slo.sh": "slo_assertion",
|
|
28
|
+
".k6.js": "synthetic_load",
|
|
29
|
+
};
|
|
30
|
+
let probeType = "unknown";
|
|
31
|
+
let baseName = fileName;
|
|
32
|
+
for (const [ext, type] of Object.entries(typeMap)) {
|
|
33
|
+
if (fileName.endsWith(ext)) {
|
|
34
|
+
probeType = type;
|
|
35
|
+
baseName = fileName.slice(0, fileName.length - ext.length);
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (probeType === "unknown" && fileName.endsWith(".sh")) {
|
|
40
|
+
baseName = fileName.slice(0, -3);
|
|
41
|
+
}
|
|
42
|
+
const probeIdx = baseName.indexOf("-probe-");
|
|
43
|
+
if (probeIdx !== -1) {
|
|
44
|
+
return {
|
|
45
|
+
service: baseName.slice(0, probeIdx),
|
|
46
|
+
probeId: baseName.slice(probeIdx + 1),
|
|
47
|
+
probeType,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return { service: baseName, probeId: "unknown", probeType };
|
|
51
|
+
}
|
|
52
|
+
// ── Probe execution ───────────────────────────────────────────────────
|
|
53
|
+
function runSloProbeFile(probePath, fileName, timeoutMs) {
|
|
54
|
+
const start = Date.now();
|
|
55
|
+
if (fileName.endsWith(".k6.js")) {
|
|
56
|
+
if (!isToolAvailable("k6")) {
|
|
57
|
+
return {
|
|
58
|
+
status: "tool_missing",
|
|
59
|
+
durationMs: Date.now() - start,
|
|
60
|
+
output: "k6 not found (install: https://k6.io)",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const result = spawnSync("k6", ["run", probePath], {
|
|
65
|
+
timeout: timeoutMs,
|
|
66
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
67
|
+
encoding: "utf-8",
|
|
68
|
+
});
|
|
69
|
+
const durationMs = Date.now() - start;
|
|
70
|
+
const output = combineOutput(result.stdout, result.stderr);
|
|
71
|
+
if (result.error?.message?.includes("ENOENT")) {
|
|
72
|
+
return { status: "tool_missing", durationMs, output: "k6 not found" };
|
|
73
|
+
}
|
|
74
|
+
if (result.signal === "SIGTERM" ||
|
|
75
|
+
result.error?.message?.includes("ETIMEDOUT")) {
|
|
76
|
+
return { status: "timeout", durationMs, output: "timed out" };
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
status: result.status === 0 ? "pass" : "fail",
|
|
80
|
+
durationMs,
|
|
81
|
+
output,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
return {
|
|
86
|
+
status: "error",
|
|
87
|
+
durationMs: Date.now() - start,
|
|
88
|
+
output: String(err),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// All .sh files run via bash
|
|
93
|
+
try {
|
|
94
|
+
const result = spawnSync("bash", [probePath], {
|
|
95
|
+
timeout: timeoutMs,
|
|
96
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
97
|
+
encoding: "utf-8",
|
|
98
|
+
});
|
|
99
|
+
const durationMs = Date.now() - start;
|
|
100
|
+
const output = combineOutput(result.stdout, result.stderr);
|
|
101
|
+
if (result.error?.message?.includes("ENOENT")) {
|
|
102
|
+
return { status: "tool_missing", durationMs, output: "bash not found" };
|
|
103
|
+
}
|
|
104
|
+
if (result.signal === "SIGTERM" ||
|
|
105
|
+
result.error?.message?.includes("ETIMEDOUT")) {
|
|
106
|
+
return { status: "timeout", durationMs, output: "timed out" };
|
|
107
|
+
}
|
|
108
|
+
if (isNotImplementedOutput(output)) {
|
|
109
|
+
return { status: "not_implemented", durationMs, output };
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
status: result.status === 0 ? "pass" : "fail",
|
|
113
|
+
durationMs,
|
|
114
|
+
output,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
return {
|
|
119
|
+
status: "error",
|
|
120
|
+
durationMs: Date.now() - start,
|
|
121
|
+
output: String(err),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ── Handler ───────────────────────────────────────────────────────────
|
|
126
|
+
export async function runSloProbeHandler(args) {
|
|
127
|
+
const projectDir = resolve(args.project_dir);
|
|
128
|
+
const timeoutMs = args.timeout_ms ?? 15000;
|
|
129
|
+
const sloDir = join(projectDir, "tests", "slo");
|
|
130
|
+
if (!existsSync(sloDir)) {
|
|
131
|
+
const timestamp = new Date().toISOString();
|
|
132
|
+
writeSloProbeRunJson(projectDir, timestamp, []);
|
|
133
|
+
return {
|
|
134
|
+
content: [
|
|
135
|
+
{
|
|
136
|
+
type: "text",
|
|
137
|
+
text: formatSloRunReport([], timestamp),
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
let probeFiles = [];
|
|
143
|
+
try {
|
|
144
|
+
probeFiles = readdirSync(sloDir).filter((f) => f.endsWith(".sh") || f.endsWith(".k6.js"));
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
probeFiles = [];
|
|
148
|
+
}
|
|
149
|
+
const results = [];
|
|
150
|
+
if (probeFiles.length === 0) {
|
|
151
|
+
const timestamp = new Date().toISOString();
|
|
152
|
+
writeSloProbeRunJson(projectDir, timestamp, []);
|
|
153
|
+
return {
|
|
154
|
+
content: [
|
|
155
|
+
{
|
|
156
|
+
type: "text",
|
|
157
|
+
text: formatSloRunReport([], timestamp),
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
for (const fileName of probeFiles) {
|
|
163
|
+
const { service, probeId, probeType } = parseSloProbeFileName(fileName);
|
|
164
|
+
const probePath = join(sloDir, fileName);
|
|
165
|
+
const run = runSloProbeFile(probePath, fileName, timeoutMs);
|
|
166
|
+
results.push({
|
|
167
|
+
service,
|
|
168
|
+
probeId,
|
|
169
|
+
probeFile: fileName,
|
|
170
|
+
probeType,
|
|
171
|
+
...run,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
const timestamp = new Date().toISOString();
|
|
175
|
+
writeSloProbeRunJson(projectDir, timestamp, results);
|
|
176
|
+
return {
|
|
177
|
+
content: [{ type: "text", text: formatSloRunReport(results, timestamp) }],
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
// ── JSON writer ───────────────────────────────────────────────────────
|
|
181
|
+
function writeSloProbeRunJson(projectDir, timestamp, results) {
|
|
182
|
+
try {
|
|
183
|
+
const dir = join(projectDir, ".forgecraft");
|
|
184
|
+
mkdirSync(dir, { recursive: true });
|
|
185
|
+
const runJson = {
|
|
186
|
+
timestamp,
|
|
187
|
+
passed: results.filter((r) => r.status === "pass").length,
|
|
188
|
+
failed: results.filter((r) => r.status === "fail").length,
|
|
189
|
+
errors: results.filter((r) => ["error", "tool_missing", "not_implemented", "timeout"].includes(r.status)).length,
|
|
190
|
+
notFound: results.filter((r) => r.status === "no_probe").length,
|
|
191
|
+
results: results.map((r) => ({
|
|
192
|
+
service: r.service,
|
|
193
|
+
probeId: r.probeId,
|
|
194
|
+
status: r.status,
|
|
195
|
+
durationMs: r.durationMs,
|
|
196
|
+
})),
|
|
197
|
+
};
|
|
198
|
+
writeFileSync(join(dir, "slo-probe-run.json"), JSON.stringify(runJson, null, 2), "utf-8");
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
/* non-throwing */
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// ── Report formatter ──────────────────────────────────────────────────
|
|
205
|
+
function formatSloRunReport(results, timestamp) {
|
|
206
|
+
if (results.length === 0) {
|
|
207
|
+
return [
|
|
208
|
+
"## SLO Probe Run Report",
|
|
209
|
+
`_Executed: ${timestamp}_`,
|
|
210
|
+
"",
|
|
211
|
+
"No probe files found. Run `generate_slo_probe` first.",
|
|
212
|
+
"",
|
|
213
|
+
buildSloLoopInstructions([]).join("\n"),
|
|
214
|
+
].join("\n");
|
|
215
|
+
}
|
|
216
|
+
const passed = results.filter((r) => r.status === "pass").length;
|
|
217
|
+
const failed = results.filter((r) => r.status === "fail").length;
|
|
218
|
+
const errors = results.filter((r) => ["error", "tool_missing", "not_implemented", "timeout"].includes(r.status)).length;
|
|
219
|
+
const notFound = results.filter((r) => r.status === "no_probe").length;
|
|
220
|
+
const lines = [
|
|
221
|
+
"## SLO Probe Run Report",
|
|
222
|
+
`_Executed: ${timestamp}_`,
|
|
223
|
+
"",
|
|
224
|
+
`### Results: ${passed} passed / ${failed} failed / ${errors} errors / ${notFound} not found`,
|
|
225
|
+
"",
|
|
226
|
+
"| Service | Probe | Type | File | Status | Duration |",
|
|
227
|
+
"|---|---|---|---|---|---|",
|
|
228
|
+
];
|
|
229
|
+
for (const r of results) {
|
|
230
|
+
const dur = r.durationMs > 0 ? `${(r.durationMs / 1000).toFixed(1)}s` : "—";
|
|
231
|
+
lines.push(`| ${r.service} | ${r.probeId} | ${r.probeType} | ${r.probeFile ?? "—"} | ${formatSloStatus(r.status)} | ${dur} |`);
|
|
232
|
+
}
|
|
233
|
+
lines.push(...buildSloLoopInstructions(results));
|
|
234
|
+
return lines.join("\n");
|
|
235
|
+
}
|
|
236
|
+
function buildSloLoopInstructions(results) {
|
|
237
|
+
const lines = [
|
|
238
|
+
"",
|
|
239
|
+
"### The Loop",
|
|
240
|
+
"",
|
|
241
|
+
"**SLO probe failures mean monitoring contracts are not verified — regenerate from NFR contracts, not patch dashboards.**",
|
|
242
|
+
"",
|
|
243
|
+
];
|
|
244
|
+
const failed = results.filter((r) => r.status === "fail");
|
|
245
|
+
const notImpl = results.filter((r) => r.status === "not_implemented");
|
|
246
|
+
const noProbe = results.filter((r) => r.status === "no_probe");
|
|
247
|
+
const allPassing = results.length > 0 && results.every((r) => r.status === "pass");
|
|
248
|
+
if (failed.length > 0) {
|
|
249
|
+
lines.push(`❌ ${failed.length} probe${failed.length === 1 ? "" : "s"} failed — for each failing probe:`, " 1. Read the NFR contract in docs/nfr-contracts.md", " 2. Read the SLO spec in .forgecraft/slo/{service}.yaml", " 3. Update Prometheus rules / Grafana dashboards / alertmanager config to match contracts", " 4. Call run_slo_probe again — repeat until green", "");
|
|
250
|
+
}
|
|
251
|
+
if (notImpl.length > 0) {
|
|
252
|
+
lines.push(`⚠️ ${notImpl.length} probe${notImpl.length === 1 ? "" : "s"} not yet implemented — fill in the TODO sections:`);
|
|
253
|
+
for (const r of notImpl) {
|
|
254
|
+
lines.push(` - tests/slo/${r.probeFile ?? r.probeId}: implement the actual check`);
|
|
255
|
+
}
|
|
256
|
+
lines.push("");
|
|
257
|
+
}
|
|
258
|
+
if (noProbe.length > 0) {
|
|
259
|
+
lines.push(`📋 ${noProbe.length} service${noProbe.length === 1 ? "" : "s"} have no probe files — run:`, " generate_slo_probe (scaffolds probe files from .forgecraft/slo/ specs)", " Then implement the TODO sections", "");
|
|
260
|
+
}
|
|
261
|
+
if (allPassing) {
|
|
262
|
+
lines.push("✅ All SLO probes passing — L4 monitoring contracts verified.", " Call close_cycle to evaluate gates and advance the cycle.");
|
|
263
|
+
}
|
|
264
|
+
else if (results.length > 0) {
|
|
265
|
+
lines.push("Run layer_status to see full coverage picture.");
|
|
266
|
+
}
|
|
267
|
+
return lines;
|
|
268
|
+
}
|
|
269
|
+
function formatSloStatus(status) {
|
|
270
|
+
const map = {
|
|
271
|
+
pass: "✅ PASS",
|
|
272
|
+
fail: "❌ FAIL",
|
|
273
|
+
tool_missing: "⚠️ TOOL_MISSING",
|
|
274
|
+
not_implemented: "⏳ NOT_IMPLEMENTED",
|
|
275
|
+
timeout: "⏱ TIMEOUT",
|
|
276
|
+
no_probe: "❌ NO_PROBE",
|
|
277
|
+
error: "⚠️ ERROR",
|
|
278
|
+
};
|
|
279
|
+
return map[status] ?? status;
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=run-slo-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-slo-probe.js","sourceRoot":"","sources":["../../src/tools/run-slo-probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,20 +7,20 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
9
9
|
import { dirname } from "node:path";
|
|
10
|
-
export const USE_CASES_STUB = `<!-- UNFILLED: Use Cases -->
|
|
11
|
-
# Use Cases
|
|
12
|
-
|
|
13
|
-
## UC-01: [Name]
|
|
14
|
-
**Actor**: <!-- FILL: who? -->
|
|
15
|
-
**Precondition**: <!-- FILL: what must be true before? -->
|
|
16
|
-
**Steps**: <!-- FILL: numbered steps -->
|
|
17
|
-
**Success**: <!-- FILL: what changed? -->
|
|
18
|
-
|
|
19
|
-
## UC-02: [Name]
|
|
20
|
-
<!-- FILL -->
|
|
21
|
-
|
|
22
|
-
## UC-03: [Name]
|
|
23
|
-
<!-- FILL -->
|
|
10
|
+
export const USE_CASES_STUB = `<!-- UNFILLED: Use Cases -->
|
|
11
|
+
# Use Cases
|
|
12
|
+
|
|
13
|
+
## UC-01: [Name]
|
|
14
|
+
**Actor**: <!-- FILL: who? -->
|
|
15
|
+
**Precondition**: <!-- FILL: what must be true before? -->
|
|
16
|
+
**Steps**: <!-- FILL: numbered steps -->
|
|
17
|
+
**Success**: <!-- FILL: what changed? -->
|
|
18
|
+
|
|
19
|
+
## UC-02: [Name]
|
|
20
|
+
<!-- FILL -->
|
|
21
|
+
|
|
22
|
+
## UC-03: [Name]
|
|
23
|
+
<!-- FILL -->
|
|
24
24
|
`;
|
|
25
25
|
/**
|
|
26
26
|
* Build the UNFILLED stub content for docs/diagrams/c4-context.md.
|
|
@@ -29,16 +29,16 @@ export const USE_CASES_STUB = `<!-- UNFILLED: Use Cases -->
|
|
|
29
29
|
* @returns Stub content with UNFILLED markers
|
|
30
30
|
*/
|
|
31
31
|
export function buildC4ContextStub(projectName) {
|
|
32
|
-
return `<!-- UNFILLED: C4 Context Diagram -->
|
|
33
|
-
<!-- Run \`forgecraft generate_diagram\` to auto-generate from your spec -->
|
|
34
|
-
# System Context Diagram
|
|
35
|
-
\`\`\`mermaid
|
|
36
|
-
C4Context
|
|
37
|
-
title System Context: ${projectName}
|
|
38
|
-
Person(user, "User", "<!-- FILL: Who uses the system? -->")
|
|
39
|
-
System(system, "${projectName}", "<!-- FILL: What does the system do in one sentence? -->")
|
|
40
|
-
Rel(user, system, "<!-- FILL: Primary interaction -->")
|
|
41
|
-
\`\`\`
|
|
32
|
+
return `<!-- UNFILLED: C4 Context Diagram -->
|
|
33
|
+
<!-- Run \`forgecraft generate_diagram\` to auto-generate from your spec -->
|
|
34
|
+
# System Context Diagram
|
|
35
|
+
\`\`\`mermaid
|
|
36
|
+
C4Context
|
|
37
|
+
title System Context: ${projectName}
|
|
38
|
+
Person(user, "User", "<!-- FILL: Who uses the system? -->")
|
|
39
|
+
System(system, "${projectName}", "<!-- FILL: What does the system do in one sentence? -->")
|
|
40
|
+
Rel(user, system, "<!-- FILL: Primary interaction -->")
|
|
41
|
+
\`\`\`
|
|
42
42
|
`;
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
@@ -51,32 +51,32 @@ C4Context
|
|
|
51
51
|
* @returns Stub content with UNFILLED markers and structural Mermaid syntax
|
|
52
52
|
*/
|
|
53
53
|
export function buildSequenceDiagramStub(feature) {
|
|
54
|
-
return `<!-- UNFILLED: Sequence Diagram — ${feature} -->
|
|
55
|
-
<!-- Replace participant labels and messages with real actors and contracts -->
|
|
56
|
-
# Sequence Diagram: ${feature}
|
|
57
|
-
|
|
58
|
-
\`\`\`mermaid
|
|
59
|
-
sequenceDiagram
|
|
60
|
-
participant Client as <!-- FILL: initiating actor, e.g. Browser / CLI / Service -->
|
|
61
|
-
participant API as <!-- FILL: entry-point service, e.g. API Gateway -->
|
|
62
|
-
participant Service as <!-- FILL: domain service, e.g. AuthService -->
|
|
63
|
-
participant Store as <!-- FILL: persistence layer, e.g. Database -->
|
|
64
|
-
|
|
65
|
-
Note over Client,Store: <!-- FILL: describe the primary flow in one sentence -->
|
|
66
|
-
|
|
67
|
-
Client->>API: <!-- FILL: request, e.g. POST /login {credentials} -->
|
|
68
|
-
API->>Service: <!-- FILL: delegate, e.g. authenticate(credentials) -->
|
|
69
|
-
Service->>Store: <!-- FILL: query, e.g. findUserByEmail(email) -->
|
|
70
|
-
Store-->>Service: <!-- FILL: result, e.g. User | null -->
|
|
71
|
-
|
|
72
|
-
alt <!-- FILL: failure case, e.g. User not found or wrong password -->
|
|
73
|
-
Service-->>API: <!-- FILL: error response, e.g. AuthError -->
|
|
74
|
-
API-->>Client: <!-- FILL: HTTP error, e.g. 401 Unauthorized -->
|
|
75
|
-
else <!-- FILL: success case -->
|
|
76
|
-
Service-->>API: <!-- FILL: success result, e.g. JWT token -->
|
|
77
|
-
API-->>Client: <!-- FILL: HTTP success, e.g. 200 OK {token} -->
|
|
78
|
-
end
|
|
79
|
-
\`\`\`
|
|
54
|
+
return `<!-- UNFILLED: Sequence Diagram — ${feature} -->
|
|
55
|
+
<!-- Replace participant labels and messages with real actors and contracts -->
|
|
56
|
+
# Sequence Diagram: ${feature}
|
|
57
|
+
|
|
58
|
+
\`\`\`mermaid
|
|
59
|
+
sequenceDiagram
|
|
60
|
+
participant Client as <!-- FILL: initiating actor, e.g. Browser / CLI / Service -->
|
|
61
|
+
participant API as <!-- FILL: entry-point service, e.g. API Gateway -->
|
|
62
|
+
participant Service as <!-- FILL: domain service, e.g. AuthService -->
|
|
63
|
+
participant Store as <!-- FILL: persistence layer, e.g. Database -->
|
|
64
|
+
|
|
65
|
+
Note over Client,Store: <!-- FILL: describe the primary flow in one sentence -->
|
|
66
|
+
|
|
67
|
+
Client->>API: <!-- FILL: request, e.g. POST /login {credentials} -->
|
|
68
|
+
API->>Service: <!-- FILL: delegate, e.g. authenticate(credentials) -->
|
|
69
|
+
Service->>Store: <!-- FILL: query, e.g. findUserByEmail(email) -->
|
|
70
|
+
Store-->>Service: <!-- FILL: result, e.g. User | null -->
|
|
71
|
+
|
|
72
|
+
alt <!-- FILL: failure case, e.g. User not found or wrong password -->
|
|
73
|
+
Service-->>API: <!-- FILL: error response, e.g. AuthError -->
|
|
74
|
+
API-->>Client: <!-- FILL: HTTP error, e.g. 401 Unauthorized -->
|
|
75
|
+
else <!-- FILL: success case -->
|
|
76
|
+
Service-->>API: <!-- FILL: success result, e.g. JWT token -->
|
|
77
|
+
API-->>Client: <!-- FILL: HTTP success, e.g. 200 OK {token} -->
|
|
78
|
+
end
|
|
79
|
+
\`\`\`
|
|
80
80
|
`;
|
|
81
81
|
}
|
|
82
82
|
/**
|
|
@@ -90,30 +90,30 @@ sequenceDiagram
|
|
|
90
90
|
* @returns Stub content with UNFILLED markers and structural Mermaid syntax
|
|
91
91
|
*/
|
|
92
92
|
export function buildStateMachineDiagramStub(entityName) {
|
|
93
|
-
return `<!-- UNFILLED: State Machine — ${entityName} -->
|
|
94
|
-
<!-- Replace state names (Draft, Pending, Active, etc.) and transition labels -->
|
|
95
|
-
<!-- with the actual lifecycle states of your domain entity. -->
|
|
96
|
-
# State Machine: ${entityName}
|
|
97
|
-
|
|
98
|
-
\`\`\`mermaid
|
|
99
|
-
stateDiagram-v2
|
|
100
|
-
[*] --> Draft
|
|
101
|
-
|
|
102
|
-
Draft --> Pending: submit()
|
|
103
|
-
Pending --> Active: approve()
|
|
104
|
-
Pending --> Rejected: reject()
|
|
105
|
-
Active --> Completed: complete()
|
|
106
|
-
Active --> Cancelled: cancel()
|
|
107
|
-
|
|
108
|
-
Completed --> [*]
|
|
109
|
-
Rejected --> [*]
|
|
110
|
-
Cancelled --> [*]
|
|
111
|
-
|
|
112
|
-
note right of Active
|
|
113
|
-
FILL: add invariant or constraint
|
|
114
|
-
e.g. "requires valid payment method"
|
|
115
|
-
end note
|
|
116
|
-
\`\`\`
|
|
93
|
+
return `<!-- UNFILLED: State Machine — ${entityName} -->
|
|
94
|
+
<!-- Replace state names (Draft, Pending, Active, etc.) and transition labels -->
|
|
95
|
+
<!-- with the actual lifecycle states of your domain entity. -->
|
|
96
|
+
# State Machine: ${entityName}
|
|
97
|
+
|
|
98
|
+
\`\`\`mermaid
|
|
99
|
+
stateDiagram-v2
|
|
100
|
+
[*] --> Draft
|
|
101
|
+
|
|
102
|
+
Draft --> Pending: submit()
|
|
103
|
+
Pending --> Active: approve()
|
|
104
|
+
Pending --> Rejected: reject()
|
|
105
|
+
Active --> Completed: complete()
|
|
106
|
+
Active --> Cancelled: cancel()
|
|
107
|
+
|
|
108
|
+
Completed --> [*]
|
|
109
|
+
Rejected --> [*]
|
|
110
|
+
Cancelled --> [*]
|
|
111
|
+
|
|
112
|
+
note right of Active
|
|
113
|
+
FILL: add invariant or constraint
|
|
114
|
+
e.g. "requires valid payment method"
|
|
115
|
+
end note
|
|
116
|
+
\`\`\`
|
|
117
117
|
`;
|
|
118
118
|
}
|
|
119
119
|
/**
|
|
@@ -126,29 +126,29 @@ stateDiagram-v2
|
|
|
126
126
|
* @returns Stub content with UNFILLED markers and structural Mermaid syntax
|
|
127
127
|
*/
|
|
128
128
|
export function buildFlowDiagramStub(ucName) {
|
|
129
|
-
return `<!-- UNFILLED: Flow Diagram — ${ucName} -->
|
|
130
|
-
<!-- Replace node labels and edge conditions with real user journey steps -->
|
|
131
|
-
# Flow: ${ucName}
|
|
132
|
-
|
|
133
|
-
\`\`\`mermaid
|
|
134
|
-
flowchart TD
|
|
135
|
-
Start([<!-- FILL: trigger, e.g. User opens registration page -->])
|
|
136
|
-
|
|
137
|
-
Start --> Input[<!-- FILL: first action, e.g. Fill in name, email, password -->]
|
|
138
|
-
Input --> Validate{<!-- FILL: validation check, e.g. All fields valid? -->}
|
|
139
|
-
|
|
140
|
-
Validate -->|<!-- FILL: failure label, e.g. Invalid -->| Error[<!-- FILL: error action, e.g. Show validation errors -->]
|
|
141
|
-
Error --> Input
|
|
142
|
-
|
|
143
|
-
Validate -->|<!-- FILL: success label, e.g. Valid -->| Process[<!-- FILL: main action, e.g. Create account -->]
|
|
144
|
-
Process --> Check{<!-- FILL: guard check, e.g. Email already exists? -->}
|
|
145
|
-
|
|
146
|
-
Check -->|<!-- FILL: conflict label, e.g. Yes -->| Conflict[<!-- FILL: conflict action, e.g. Show duplicate email error -->]
|
|
147
|
-
Conflict --> End([<!-- FILL: exit label, e.g. User corrects email -->])
|
|
148
|
-
|
|
149
|
-
Check -->|<!-- FILL: proceed label, e.g. No -->| Success[<!-- FILL: success action, e.g. Send confirmation email -->]
|
|
150
|
-
Success --> End
|
|
151
|
-
\`\`\`
|
|
129
|
+
return `<!-- UNFILLED: Flow Diagram — ${ucName} -->
|
|
130
|
+
<!-- Replace node labels and edge conditions with real user journey steps -->
|
|
131
|
+
# Flow: ${ucName}
|
|
132
|
+
|
|
133
|
+
\`\`\`mermaid
|
|
134
|
+
flowchart TD
|
|
135
|
+
Start([<!-- FILL: trigger, e.g. User opens registration page -->])
|
|
136
|
+
|
|
137
|
+
Start --> Input[<!-- FILL: first action, e.g. Fill in name, email, password -->]
|
|
138
|
+
Input --> Validate{<!-- FILL: validation check, e.g. All fields valid? -->}
|
|
139
|
+
|
|
140
|
+
Validate -->|<!-- FILL: failure label, e.g. Invalid -->| Error[<!-- FILL: error action, e.g. Show validation errors -->]
|
|
141
|
+
Error --> Input
|
|
142
|
+
|
|
143
|
+
Validate -->|<!-- FILL: success label, e.g. Valid -->| Process[<!-- FILL: main action, e.g. Create account -->]
|
|
144
|
+
Process --> Check{<!-- FILL: guard check, e.g. Email already exists? -->}
|
|
145
|
+
|
|
146
|
+
Check -->|<!-- FILL: conflict label, e.g. Yes -->| Conflict[<!-- FILL: conflict action, e.g. Show duplicate email error -->]
|
|
147
|
+
Conflict --> End([<!-- FILL: exit label, e.g. User corrects email -->])
|
|
148
|
+
|
|
149
|
+
Check -->|<!-- FILL: proceed label, e.g. No -->| Success[<!-- FILL: success action, e.g. Send confirmation email -->]
|
|
150
|
+
Success --> End
|
|
151
|
+
\`\`\`
|
|
152
152
|
`;
|
|
153
153
|
}
|
|
154
154
|
/**
|
|
@@ -161,24 +161,24 @@ flowchart TD
|
|
|
161
161
|
* @returns Stub content with UNFILLED markers and structural Mermaid syntax
|
|
162
162
|
*/
|
|
163
163
|
export function buildC4ContainerStub(projectName) {
|
|
164
|
-
return `<!-- UNFILLED: C4 Container Diagram -->
|
|
165
|
-
<!-- Replace container labels, technology fields, and relations with your stack -->
|
|
166
|
-
# Container Diagram — ${projectName}
|
|
167
|
-
|
|
168
|
-
\`\`\`mermaid
|
|
169
|
-
C4Container
|
|
170
|
-
title Container Diagram: ${projectName}
|
|
171
|
-
|
|
172
|
-
Person(user, "<!-- FILL: actor name -->", "<!-- FILL: actor description -->")
|
|
173
|
-
|
|
174
|
-
Container(web, "<!-- FILL: frontend name, e.g. Web Application -->", "<!-- FILL: technology, e.g. React -->", "<!-- FILL: responsibility -->")
|
|
175
|
-
Container(api, "<!-- FILL: backend name, e.g. API Server -->", "<!-- FILL: technology, e.g. Node.js / Express -->", "<!-- FILL: responsibility -->")
|
|
176
|
-
Container(db, "<!-- FILL: database name, e.g. Primary Database -->", "<!-- FILL: technology, e.g. PostgreSQL -->", "<!-- FILL: responsibility -->")
|
|
177
|
-
|
|
178
|
-
Rel(user, web, "<!-- FILL: interaction, e.g. Uses -->", "<!-- FILL: protocol, e.g. HTTPS -->")
|
|
179
|
-
Rel(web, api, "<!-- FILL: call, e.g. API calls -->", "<!-- FILL: protocol, e.g. REST / JSON -->")
|
|
180
|
-
Rel(api, db, "<!-- FILL: query, e.g. Reads and writes -->", "<!-- FILL: protocol, e.g. SQL -->")
|
|
181
|
-
\`\`\`
|
|
164
|
+
return `<!-- UNFILLED: C4 Container Diagram -->
|
|
165
|
+
<!-- Replace container labels, technology fields, and relations with your stack -->
|
|
166
|
+
# Container Diagram — ${projectName}
|
|
167
|
+
|
|
168
|
+
\`\`\`mermaid
|
|
169
|
+
C4Container
|
|
170
|
+
title Container Diagram: ${projectName}
|
|
171
|
+
|
|
172
|
+
Person(user, "<!-- FILL: actor name -->", "<!-- FILL: actor description -->")
|
|
173
|
+
|
|
174
|
+
Container(web, "<!-- FILL: frontend name, e.g. Web Application -->", "<!-- FILL: technology, e.g. React -->", "<!-- FILL: responsibility -->")
|
|
175
|
+
Container(api, "<!-- FILL: backend name, e.g. API Server -->", "<!-- FILL: technology, e.g. Node.js / Express -->", "<!-- FILL: responsibility -->")
|
|
176
|
+
Container(db, "<!-- FILL: database name, e.g. Primary Database -->", "<!-- FILL: technology, e.g. PostgreSQL -->", "<!-- FILL: responsibility -->")
|
|
177
|
+
|
|
178
|
+
Rel(user, web, "<!-- FILL: interaction, e.g. Uses -->", "<!-- FILL: protocol, e.g. HTTPS -->")
|
|
179
|
+
Rel(web, api, "<!-- FILL: call, e.g. API calls -->", "<!-- FILL: protocol, e.g. REST / JSON -->")
|
|
180
|
+
Rel(api, db, "<!-- FILL: query, e.g. Reads and writes -->", "<!-- FILL: protocol, e.g. SQL -->")
|
|
181
|
+
\`\`\`
|
|
182
182
|
`;
|
|
183
183
|
}
|
|
184
184
|
/**
|