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
|
@@ -1,76 +1,76 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* scaffold-templates: Static template strings and render functions for scaffold_project.
|
|
3
3
|
*/
|
|
4
|
-
export const PROJECT_SPECIFIC_TEMPLATE = `# Project-Specific Rules
|
|
5
|
-
<!-- This file is owned by YOU. ForgeCraft will never overwrite it. -->
|
|
6
|
-
<!-- Add project-specific rules, framework choices, conventions, and corrections here. -->
|
|
7
|
-
<!-- The sentinel CLAUDE.md links here so any AI reading your project can find it. -->
|
|
8
|
-
|
|
9
|
-
## Framework & Stack Choices
|
|
10
|
-
<!-- e.g. We use Prisma for ORM. Deploy target is Railway. Python 3.11+. -->
|
|
11
|
-
|
|
12
|
-
## Custom Corrections Log
|
|
13
|
-
<!-- Log AI corrections so the pattern isn't repeated. -->
|
|
14
|
-
<!-- Format: - YYYY-MM-DD: [description of correction] -->
|
|
15
|
-
|
|
16
|
-
## Project-Specific Gates
|
|
17
|
-
<!-- Add quality rules specific to this project that don't belong in universal standards. -->
|
|
4
|
+
export const PROJECT_SPECIFIC_TEMPLATE = `# Project-Specific Rules
|
|
5
|
+
<!-- This file is owned by YOU. ForgeCraft will never overwrite it. -->
|
|
6
|
+
<!-- Add project-specific rules, framework choices, conventions, and corrections here. -->
|
|
7
|
+
<!-- The sentinel CLAUDE.md links here so any AI reading your project can find it. -->
|
|
8
|
+
|
|
9
|
+
## Framework & Stack Choices
|
|
10
|
+
<!-- e.g. We use Prisma for ORM. Deploy target is Railway. Python 3.11+. -->
|
|
11
|
+
|
|
12
|
+
## Custom Corrections Log
|
|
13
|
+
<!-- Log AI corrections so the pattern isn't repeated. -->
|
|
14
|
+
<!-- Format: - YYYY-MM-DD: [description of correction] -->
|
|
15
|
+
|
|
16
|
+
## Project-Specific Gates
|
|
17
|
+
<!-- Add quality rules specific to this project that don't belong in universal standards. -->
|
|
18
18
|
`;
|
|
19
19
|
export const EXCEPTIONS_TEMPLATE = JSON.stringify({
|
|
20
20
|
version: "1",
|
|
21
21
|
_comment: "Hook false-positive exceptions. Add entries here to prevent rediscovering the same false positive each session. Each entry: {id, hook, pattern, reason, addedAt, addedBy, adr?}",
|
|
22
22
|
exceptions: [],
|
|
23
23
|
}, null, 2) + "\n";
|
|
24
|
-
export const PROJECT_GATES_TEMPLATE = `version: "1"
|
|
25
|
-
# Project-specific quality gates.
|
|
26
|
-
# Gates you discover while working that should be enforced for this project.
|
|
27
|
-
# Set generalizable: true + fill in evidence to contribute to the community registry.
|
|
28
|
-
# See: https://github.com/jghiringhelli/quality-gates/issues/new?template=quality-gate-proposal.md
|
|
29
|
-
gates: []
|
|
24
|
+
export const PROJECT_GATES_TEMPLATE = `version: "1"
|
|
25
|
+
# Project-specific quality gates.
|
|
26
|
+
# Gates you discover while working that should be enforced for this project.
|
|
27
|
+
# Set generalizable: true + fill in evidence to contribute to the community registry.
|
|
28
|
+
# See: https://github.com/jghiringhelli/quality-gates/issues/new?template=quality-gate-proposal.md
|
|
29
|
+
gates: []
|
|
30
30
|
`;
|
|
31
|
-
export const SMOKE_TESTS_README = `# Smoke Tests
|
|
32
|
-
|
|
33
|
-
Generated by ForgeCraft scaffold. Fill in the critical paths from your tech spec.
|
|
34
|
-
|
|
35
|
-
## What smoke tests cover
|
|
36
|
-
- Every API entry point that serves real users
|
|
37
|
-
- Every critical user journey end-to-end
|
|
38
|
-
- Every DB migration (verify schema applied correctly)
|
|
39
|
-
- Every external integration handshake
|
|
40
|
-
|
|
41
|
-
## Format
|
|
42
|
-
Use the tool configured in forgecraft.yaml deployment.testing.smokeTool (or default to HTTP assertions).
|
|
43
|
-
All smoke tests must complete in < 60 seconds total.
|
|
44
|
-
|
|
45
|
-
## Running
|
|
46
|
-
See forgecraft.yaml tools.test or your project's test runner.
|
|
47
|
-
Results are written to .forgecraft/reports/smoke-latest.json.
|
|
48
|
-
|
|
49
|
-
## Required before deployment
|
|
50
|
-
All smoke tests must pass against staging before any production deploy.
|
|
51
|
-
See verification.yaml deployment-gates phase.
|
|
31
|
+
export const SMOKE_TESTS_README = `# Smoke Tests
|
|
32
|
+
|
|
33
|
+
Generated by ForgeCraft scaffold. Fill in the critical paths from your tech spec.
|
|
34
|
+
|
|
35
|
+
## What smoke tests cover
|
|
36
|
+
- Every API entry point that serves real users
|
|
37
|
+
- Every critical user journey end-to-end
|
|
38
|
+
- Every DB migration (verify schema applied correctly)
|
|
39
|
+
- Every external integration handshake
|
|
40
|
+
|
|
41
|
+
## Format
|
|
42
|
+
Use the tool configured in forgecraft.yaml deployment.testing.smokeTool (or default to HTTP assertions).
|
|
43
|
+
All smoke tests must complete in < 60 seconds total.
|
|
44
|
+
|
|
45
|
+
## Running
|
|
46
|
+
See forgecraft.yaml tools.test or your project's test runner.
|
|
47
|
+
Results are written to .forgecraft/reports/smoke-latest.json.
|
|
48
|
+
|
|
49
|
+
## Required before deployment
|
|
50
|
+
All smoke tests must pass against staging before any production deploy.
|
|
51
|
+
See verification.yaml deployment-gates phase.
|
|
52
52
|
`;
|
|
53
|
-
export const LOAD_TESTS_README = `# Load Tests
|
|
54
|
-
|
|
55
|
-
Generated by ForgeCraft scaffold. Fill in the parameters from your tech spec.
|
|
56
|
-
|
|
57
|
-
## Parameters (fill in from forgecraft.yaml deployment.testing.load)
|
|
58
|
-
- Concurrent users: [TODO: concurrentUsers from forgecraft.yaml]
|
|
59
|
-
- Target RPS: [TODO: targetRps from forgecraft.yaml]
|
|
60
|
-
- p99 ceiling: [TODO: p99CeilingMs ms]
|
|
61
|
-
- Duration: [TODO: durationSeconds seconds minimum]
|
|
62
|
-
|
|
63
|
-
## When these parameters are missing
|
|
64
|
-
Deploying without stated load test parameters is full deployment with manual monitoring.
|
|
65
|
-
The paper requires: parameters named in spec BEFORE the test runs, not after.
|
|
66
|
-
Add them to forgecraft.yaml deployment.testing.load before running.
|
|
67
|
-
|
|
68
|
-
## Tool
|
|
69
|
-
Use the tool configured in forgecraft.yaml deployment.testing.load.tool (k6, Artillery, Locust, etc.)
|
|
70
|
-
Results are written to .forgecraft/reports/load-latest.json.
|
|
71
|
-
|
|
72
|
-
## Required before pre-release
|
|
73
|
-
See verification.yaml pre-release-hardening phase, load-test step.
|
|
53
|
+
export const LOAD_TESTS_README = `# Load Tests
|
|
54
|
+
|
|
55
|
+
Generated by ForgeCraft scaffold. Fill in the parameters from your tech spec.
|
|
56
|
+
|
|
57
|
+
## Parameters (fill in from forgecraft.yaml deployment.testing.load)
|
|
58
|
+
- Concurrent users: [TODO: concurrentUsers from forgecraft.yaml]
|
|
59
|
+
- Target RPS: [TODO: targetRps from forgecraft.yaml]
|
|
60
|
+
- p99 ceiling: [TODO: p99CeilingMs ms]
|
|
61
|
+
- Duration: [TODO: durationSeconds seconds minimum]
|
|
62
|
+
|
|
63
|
+
## When these parameters are missing
|
|
64
|
+
Deploying without stated load test parameters is full deployment with manual monitoring.
|
|
65
|
+
The paper requires: parameters named in spec BEFORE the test runs, not after.
|
|
66
|
+
Add them to forgecraft.yaml deployment.testing.load before running.
|
|
67
|
+
|
|
68
|
+
## Tool
|
|
69
|
+
Use the tool configured in forgecraft.yaml deployment.testing.load.tool (k6, Artillery, Locust, etc.)
|
|
70
|
+
Results are written to .forgecraft/reports/load-latest.json.
|
|
71
|
+
|
|
72
|
+
## Required before pre-release
|
|
73
|
+
See verification.yaml pre-release-hardening phase, load-test step.
|
|
74
74
|
`;
|
|
75
75
|
/**
|
|
76
76
|
* Render the bootstrap README for docs/adrs/.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold-writer.d.ts","sourceRoot":"","sources":["../../src/tools/scaffold-writer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,oBAAoB,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold-writer.d.ts","sourceRoot":"","sources":["../../src/tools/scaffold-writer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,oBAAoB,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAM7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAoBzE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,QAAQ,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CACjC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,EAC7C,OAAO,EAAE,aAAa,EACtB,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EACvB,kBAAkB,EAAE,kBAAkB,EACtC,UAAU,EAAE,gBAAgB,GAAG,IAAI,GAClC,mBAAmB,CAkPrB"}
|
|
@@ -10,6 +10,7 @@ import { renderInstructionFile, renderSkill } from "../registry/renderer.js";
|
|
|
10
10
|
import { renderSentinelTree } from "../registry/sentinel-renderer.js";
|
|
11
11
|
import { writeFileIfMissing } from "../shared/filesystem.js";
|
|
12
12
|
import { ensureGateDirs } from "../shared/project-gates.js";
|
|
13
|
+
import { installGitHooks } from "../shared/hook-installer.js";
|
|
13
14
|
import { resolveTemplatePlaceholders } from "../shared/template-resolver.js";
|
|
14
15
|
import { PROJECT_SPECIFIC_TEMPLATE, EXCEPTIONS_TEMPLATE, PROJECT_GATES_TEMPLATE, renderAdrsReadme, renderGitignore, renderSmokeTestsReadme, renderLoadTestsReadme, } from "./scaffold-templates.js";
|
|
15
16
|
import { buildC4ContextStub, buildC4ContainerStub, buildSequenceDiagramStub, buildStateMachineDiagramStub, buildFlowDiagramStub, USE_CASES_STUB, writeSpecStub, } from "./scaffold-spec-stubs.js";
|
|
@@ -71,6 +72,10 @@ export function writeScaffoldFiles(input, composed, context, statusMdContent, pr
|
|
|
71
72
|
}
|
|
72
73
|
}
|
|
73
74
|
trackWrite("Status.md", join(input.project_dir, "Status.md"), statusMdContent);
|
|
75
|
+
// Write .claude/state.md placeholder — index.md is written by writeCntFiles (setup-cnt.ts)
|
|
76
|
+
const claudeDir = join(input.project_dir, ".claude");
|
|
77
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
78
|
+
trackWrite(".claude/state.md", join(claudeDir, "state.md"), "# Project State\n_Not yet run. Call close_cycle to generate._\n");
|
|
74
79
|
mkdirSync(join(input.project_dir, "docs"), { recursive: true });
|
|
75
80
|
trackWrite("docs/PRD.md", join(input.project_dir, "docs", "PRD.md"), prdContent);
|
|
76
81
|
trackWrite("docs/TechSpec.md", join(input.project_dir, "docs", "TechSpec.md"), techSpecContent);
|
|
@@ -136,6 +141,10 @@ export function writeScaffoldFiles(input, composed, context, statusMdContent, pr
|
|
|
136
141
|
trackWrite("tests/load/README.md", join(loadDir, "README.md"), renderLoadTestsReadme(userConfig.deployment));
|
|
137
142
|
trackWrite(".forgecraft/reports/.gitkeep", join(reportsDir, ".gitkeep"), "");
|
|
138
143
|
}
|
|
144
|
+
// Auto-install git hooks after all files are written. Skip silently when
|
|
145
|
+
// not a git repo (dry-run or detached worktrees). Existing hooks are
|
|
146
|
+
// preserved (force=false) so husky/lefthook configs are not stomped.
|
|
147
|
+
installGitHooks(input.project_dir, false);
|
|
139
148
|
return { filesCreated, filesSkipped };
|
|
140
149
|
}
|
|
141
150
|
//# sourceMappingURL=scaffold-writer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold-writer.js","sourceRoot":"","sources":["../../src/tools/scaffold-writer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAE7E,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,4BAA4B,EAC5B,oBAAoB,EACpB,cAAc,EACd,aAAa,GACd,MAAM,0BAA0B,CAAC;AAgBlC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAyB,EACzB,QAA6C,EAC7C,OAAsB,EACtB,eAAuB,EACvB,UAAkB,EAClB,eAAuB,EACvB,kBAAsC,EACtC,UAAmC;IAEnC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,aAAa,GAAG,KAAK,CAAC,cAAgC,CAAC;IAE7D,SAAS,UAAU,CACjB,YAAoB,EACpB,QAAgB,EAChB,OAAe;QAEf,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YACpD,MAAM,aAAa,GAAG,kBAAkB,CACtC,QAAQ,CAAC,iBAAiB,EAC1B,OAAO,CACR,CAAC;YACF,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC5D,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,UAAU,CACR,IAAI,CAAC,YAAY,EACjB,QAAQ,EACR,2BAA2B,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAC9D,CAAC;YACJ,CAAC;YACD,MAAM,mBAAmB,GAAG,IAAI,CAC9B,KAAK,CAAC,WAAW,EACjB,SAAS,EACT,WAAW,EACX,qBAAqB,CACtB,CAAC;YACF,UAAU,CACR,uCAAuC,EACvC,mBAAmB,EACnB,yBAAyB,CAC1B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,qBAAqB,CACnC,QAAQ,CAAC,iBAAiB,EAC1B,OAAO,EACP,MAAM,EACN,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CACjC,CAAC;YACF,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS;gBACvC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC;gBACxE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;YACnD,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS;gBACzC,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,IAAI,YAAY,CAAC,QAAQ,EAAE;gBACtD,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC1B,UAAU,CACR,YAAY,EACZ,UAAU,EACV,2BAA2B,CAAC,OAAO,EAAE,kBAAkB,CAAC,CACzD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,UAAU,CACR,WAAW,EACX,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,EACpC,eAAe,CAChB,CAAC;IAEF,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,UAAU,CACR,aAAa,EACb,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EACzC,UAAU,CACX,CAAC;IACF,UAAU,CACR,kBAAkB,EAClB,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,EAC9C,eAAe,CAChB,CAAC;IAEF,aAAa,CACX,6BAA6B,EAC7B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,EAC5D,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,EACtC,KAAK,CAAC,KAAK,EACX,YAAY,EACZ,YAAY,CACb,CAAC;IACF,aAAa,CACX,+BAA+B,EAC/B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAC9D,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,EACxC,KAAK,CAAC,KAAK,EACX,YAAY,EACZ,YAAY,CACb,CAAC;IACF,aAAa,CACX,mCAAmC,EACnC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,qBAAqB,CAAC,EAClE,wBAAwB,CAAC,cAAc,CAAC,EACxC,KAAK,CAAC,KAAK,EACX,YAAY,EACZ,YAAY,CACb,CAAC;IACF,aAAa,CACX,gCAAgC,EAChC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,CAAC,EAC/D,4BAA4B,CAAC,gBAAgB,CAAC,EAC9C,KAAK,CAAC,KAAK,EACX,YAAY,EACZ,YAAY,CACb,CAAC;IACF,aAAa,CACX,+BAA+B,EAC/B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAC9D,oBAAoB,CAAC,yBAAyB,CAAC,EAC/C,KAAK,CAAC,KAAK,EACX,YAAY,EACZ,YAAY,CACb,CAAC;IACF,aAAa,CACX,mBAAmB,EACnB,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC,EAC/C,cAAc,EACd,KAAK,CAAC,KAAK,EACX,YAAY,EACZ,YAAY,CACb,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,UAAU,CACR,qBAAqB,EACrB,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAC1B,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,CACrC,CAAC;IAEF,UAAU,CACR,cAAc,EACd,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,cAAc,CAAC,EACvC,kFAAkF,CACnF,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7D,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,UAAU,CAAC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QACnE,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpD,UAAU,CAAC,oBAAoB,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,UAAU,CACR,YAAY,EACZ,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,EACrC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAChC,CAAC;IAEF,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC7D,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,aAAa,CAAC,cAAc,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAC5D,YAAY,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,YAAY,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;IACnE,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,aAAa,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAC;QACjE,YAAY,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,YAAY,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACtD,CAAC;IACD,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAElC,IAAI,UAAU,EAAE,UAAU,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QACrE,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,UAAU,CACR,uBAAuB,EACvB,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAC3B,sBAAsB,CAAC,UAAU,CAAC,UAAU,CAAC,CAC9C,CAAC;QACF,UAAU,CACR,sBAAsB,EACtB,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAC1B,qBAAqB,CAAC,UAAU,CAAC,UAAU,CAAC,CAC7C,CAAC;QACF,UAAU,CACR,8BAA8B,EAC9B,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAC5B,EAAE,CACH,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACxC,CAAC"}
|
|
1
|
+
{"version":3,"file":"scaffold-writer.js","sourceRoot":"","sources":["../../src/tools/scaffold-writer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAE7E,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,4BAA4B,EAC5B,oBAAoB,EACpB,cAAc,EACd,aAAa,GACd,MAAM,0BAA0B,CAAC;AAgBlC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAyB,EACzB,QAA6C,EAC7C,OAAsB,EACtB,eAAuB,EACvB,UAAkB,EAClB,eAAuB,EACvB,kBAAsC,EACtC,UAAmC;IAEnC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,aAAa,GAAG,KAAK,CAAC,cAAgC,CAAC;IAE7D,SAAS,UAAU,CACjB,YAAoB,EACpB,QAAgB,EAChB,OAAe;QAEf,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YACpD,MAAM,aAAa,GAAG,kBAAkB,CACtC,QAAQ,CAAC,iBAAiB,EAC1B,OAAO,CACR,CAAC;YACF,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC5D,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,UAAU,CACR,IAAI,CAAC,YAAY,EACjB,QAAQ,EACR,2BAA2B,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAC9D,CAAC;YACJ,CAAC;YACD,MAAM,mBAAmB,GAAG,IAAI,CAC9B,KAAK,CAAC,WAAW,EACjB,SAAS,EACT,WAAW,EACX,qBAAqB,CACtB,CAAC;YACF,UAAU,CACR,uCAAuC,EACvC,mBAAmB,EACnB,yBAAyB,CAC1B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,qBAAqB,CACnC,QAAQ,CAAC,iBAAiB,EAC1B,OAAO,EACP,MAAM,EACN,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CACjC,CAAC;YACF,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS;gBACvC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC;gBACxE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;YACnD,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS;gBACzC,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,IAAI,YAAY,CAAC,QAAQ,EAAE;gBACtD,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC1B,UAAU,CACR,YAAY,EACZ,UAAU,EACV,2BAA2B,CAAC,OAAO,EAAE,kBAAkB,CAAC,CACzD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,UAAU,CACR,WAAW,EACX,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,EACpC,eAAe,CAChB,CAAC;IAEF,2FAA2F;IAC3F,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACrD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,UAAU,CACR,kBAAkB,EAClB,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAC3B,iEAAiE,CAClE,CAAC;IAEF,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,UAAU,CACR,aAAa,EACb,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EACzC,UAAU,CACX,CAAC;IACF,UAAU,CACR,kBAAkB,EAClB,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,EAC9C,eAAe,CAChB,CAAC;IAEF,aAAa,CACX,6BAA6B,EAC7B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,EAC5D,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,EACtC,KAAK,CAAC,KAAK,EACX,YAAY,EACZ,YAAY,CACb,CAAC;IACF,aAAa,CACX,+BAA+B,EAC/B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAC9D,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,EACxC,KAAK,CAAC,KAAK,EACX,YAAY,EACZ,YAAY,CACb,CAAC;IACF,aAAa,CACX,mCAAmC,EACnC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,qBAAqB,CAAC,EAClE,wBAAwB,CAAC,cAAc,CAAC,EACxC,KAAK,CAAC,KAAK,EACX,YAAY,EACZ,YAAY,CACb,CAAC;IACF,aAAa,CACX,gCAAgC,EAChC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,CAAC,EAC/D,4BAA4B,CAAC,gBAAgB,CAAC,EAC9C,KAAK,CAAC,KAAK,EACX,YAAY,EACZ,YAAY,CACb,CAAC;IACF,aAAa,CACX,+BAA+B,EAC/B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAC9D,oBAAoB,CAAC,yBAAyB,CAAC,EAC/C,KAAK,CAAC,KAAK,EACX,YAAY,EACZ,YAAY,CACb,CAAC;IACF,aAAa,CACX,mBAAmB,EACnB,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC,EAC/C,cAAc,EACd,KAAK,CAAC,KAAK,EACX,YAAY,EACZ,YAAY,CACb,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,UAAU,CACR,qBAAqB,EACrB,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAC1B,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,CACrC,CAAC;IAEF,UAAU,CACR,cAAc,EACd,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,cAAc,CAAC,EACvC,kFAAkF,CACnF,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7D,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,UAAU,CAAC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QACnE,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpD,UAAU,CAAC,oBAAoB,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,UAAU,CACR,YAAY,EACZ,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,EACrC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAChC,CAAC;IAEF,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC7D,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,aAAa,CAAC,cAAc,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAC5D,YAAY,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,YAAY,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;IACnE,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,aAAa,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAC;QACjE,YAAY,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,YAAY,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACtD,CAAC;IACD,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAElC,IAAI,UAAU,EAAE,UAAU,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QACrE,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,UAAU,CACR,uBAAuB,EACvB,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAC3B,sBAAsB,CAAC,UAAU,CAAC,UAAU,CAAC,CAC9C,CAAC;QACF,UAAU,CACR,sBAAsB,EACtB,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAC1B,qBAAqB,CAAC,UAAU,CAAC,UAAU,CAAC,CAC7C,CAAC;QACF,UAAU,CACR,8BAA8B,EAC9B,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAC5B,EAAE,CACH,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,qEAAqE;IACrE,qEAAqE;IACrE,eAAe,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAE1C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* score_rubric tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Gathers evidence for all 7 GS properties and emits a structured evaluation
|
|
5
|
+
* prompt. The calling LLM scores 0/1/2 per property using the provided criteria
|
|
6
|
+
* as a starting framework — but is explicitly invited to override, add its own
|
|
7
|
+
* criteria, and flag anything it finds lacking regardless of what the heuristics say.
|
|
8
|
+
*
|
|
9
|
+
* The tool itself performs no scoring. It is a deterministic evidence collector.
|
|
10
|
+
* The intelligence lives in the LLM that reads its output.
|
|
11
|
+
*
|
|
12
|
+
* Read-only — no files written.
|
|
13
|
+
*/
|
|
14
|
+
import type { ToolResult } from "../shared/types.js";
|
|
15
|
+
export interface ScoreRubricInput {
|
|
16
|
+
readonly project_dir: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function scoreRubricHandler(args: ScoreRubricInput): Promise<ToolResult>;
|
|
19
|
+
//# sourceMappingURL=score-rubric.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-rubric.d.ts","sourceRoot":"","sources":["../../src/tools/score-rubric.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAOrD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AA0bD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,UAAU,CAAC,CAKrB"}
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* score_rubric tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Gathers evidence for all 7 GS properties and emits a structured evaluation
|
|
5
|
+
* prompt. The calling LLM scores 0/1/2 per property using the provided criteria
|
|
6
|
+
* as a starting framework — but is explicitly invited to override, add its own
|
|
7
|
+
* criteria, and flag anything it finds lacking regardless of what the heuristics say.
|
|
8
|
+
*
|
|
9
|
+
* The tool itself performs no scoring. It is a deterministic evidence collector.
|
|
10
|
+
* The intelligence lives in the LLM that reads its output.
|
|
11
|
+
*
|
|
12
|
+
* Read-only — no files written.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { auditCntHealth } from "../shared/cnt-health.js";
|
|
17
|
+
import { getActiveProjectGates } from "../shared/project-gates.js";
|
|
18
|
+
import { readBrownfieldFlag } from "../shared/config.js";
|
|
19
|
+
// ── Evidence collectors ───────────────────────────────────────────────
|
|
20
|
+
function safeRead(path, maxLines = 20) {
|
|
21
|
+
try {
|
|
22
|
+
const lines = readFileSync(path, "utf-8").split("\n");
|
|
23
|
+
return lines.slice(0, maxLines).join("\n");
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return "(not found)";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function safeCount(dir, ext) {
|
|
30
|
+
if (!existsSync(dir))
|
|
31
|
+
return 0;
|
|
32
|
+
try {
|
|
33
|
+
const files = readdirSync(dir);
|
|
34
|
+
return ext ? files.filter((f) => f.endsWith(ext)).length : files.length;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function safeCountPattern(dir, pattern) {
|
|
41
|
+
if (!existsSync(dir))
|
|
42
|
+
return 0;
|
|
43
|
+
try {
|
|
44
|
+
return readdirSync(dir).filter((f) => pattern.test(f)).length;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return 0;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function fileWords(path) {
|
|
51
|
+
try {
|
|
52
|
+
return readFileSync(path, "utf-8").split(/\s+/).filter(Boolean).length;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function countMarkers(dir) {
|
|
59
|
+
if (!existsSync(dir))
|
|
60
|
+
return 0;
|
|
61
|
+
const MARKER = "[NEEDS CLARIFICATION]";
|
|
62
|
+
let count = 0;
|
|
63
|
+
try {
|
|
64
|
+
for (const f of readdirSync(dir)) {
|
|
65
|
+
if (!f.endsWith(".md"))
|
|
66
|
+
continue;
|
|
67
|
+
try {
|
|
68
|
+
const content = readFileSync(join(dir, f), "utf-8");
|
|
69
|
+
let pos = 0;
|
|
70
|
+
while ((pos = content.indexOf(MARKER, pos)) !== -1) {
|
|
71
|
+
count++;
|
|
72
|
+
pos += MARKER.length;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// skip
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// skip
|
|
82
|
+
}
|
|
83
|
+
return count;
|
|
84
|
+
}
|
|
85
|
+
function readHarnessEvidence(projectDir) {
|
|
86
|
+
const path = join(projectDir, ".forgecraft", "harness-run.json");
|
|
87
|
+
if (!existsSync(path))
|
|
88
|
+
return null;
|
|
89
|
+
try {
|
|
90
|
+
const raw = JSON.parse(readFileSync(path, "utf-8"));
|
|
91
|
+
const notImplemented = (raw.results ?? []).filter((r) => r.status === "not_implemented").length;
|
|
92
|
+
return {
|
|
93
|
+
passed: raw.passed ?? 0,
|
|
94
|
+
failed: raw.failed ?? 0,
|
|
95
|
+
notImplemented,
|
|
96
|
+
timestamp: raw.timestamp ?? null,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function readProbeEvidence(projectDir, filename) {
|
|
104
|
+
const path = join(projectDir, ".forgecraft", filename);
|
|
105
|
+
if (!existsSync(path))
|
|
106
|
+
return null;
|
|
107
|
+
try {
|
|
108
|
+
const raw = JSON.parse(readFileSync(path, "utf-8"));
|
|
109
|
+
return {
|
|
110
|
+
passed: raw.passed ?? 0,
|
|
111
|
+
failed: raw.failed ?? 0,
|
|
112
|
+
timestamp: raw.timestamp ?? null,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function adrStatuses(projectDir) {
|
|
120
|
+
const canonical = join(projectDir, "docs", "adrs", "active");
|
|
121
|
+
const legacy = join(projectDir, "docs", "adrs");
|
|
122
|
+
const dir = existsSync(canonical) ? canonical : legacy;
|
|
123
|
+
if (!existsSync(dir))
|
|
124
|
+
return { total: 0, accepted: 0, retroactive: 0, markers: 0 };
|
|
125
|
+
let accepted = 0;
|
|
126
|
+
let retroactive = 0;
|
|
127
|
+
let total = 0;
|
|
128
|
+
const MARKER = "[NEEDS CLARIFICATION]";
|
|
129
|
+
let markers = 0;
|
|
130
|
+
try {
|
|
131
|
+
for (const f of readdirSync(dir)) {
|
|
132
|
+
if (!f.endsWith(".md"))
|
|
133
|
+
continue;
|
|
134
|
+
total++;
|
|
135
|
+
const content = readFileSync(join(dir, f), "utf-8");
|
|
136
|
+
if (/\*\*Status:\*\*\s*Accepted/i.test(content))
|
|
137
|
+
accepted++;
|
|
138
|
+
if (/\*\*Status:\*\*\s*Retroactive/i.test(content))
|
|
139
|
+
retroactive++;
|
|
140
|
+
let pos = 0;
|
|
141
|
+
while ((pos = content.indexOf(MARKER, pos)) !== -1) {
|
|
142
|
+
markers++;
|
|
143
|
+
pos += MARKER.length;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// skip
|
|
149
|
+
}
|
|
150
|
+
return { total, accepted, retroactive, markers };
|
|
151
|
+
}
|
|
152
|
+
function hookInstallationStatus(projectDir) {
|
|
153
|
+
const gitHooksDir = join(projectDir, ".git", "hooks");
|
|
154
|
+
const sourceHooksDir = join(projectDir, ".forgecraft", "hooks");
|
|
155
|
+
if (!existsSync(sourceHooksDir))
|
|
156
|
+
return { installed: 0, missing: 0 };
|
|
157
|
+
if (!existsSync(gitHooksDir))
|
|
158
|
+
return { installed: 0, missing: 5 };
|
|
159
|
+
const EXPECTED = [
|
|
160
|
+
"pre-commit",
|
|
161
|
+
"commit-msg",
|
|
162
|
+
"post-commit",
|
|
163
|
+
"prepare-commit-msg",
|
|
164
|
+
"pre-push",
|
|
165
|
+
];
|
|
166
|
+
let installed = 0;
|
|
167
|
+
let missing = 0;
|
|
168
|
+
for (const hook of EXPECTED) {
|
|
169
|
+
if (existsSync(join(gitHooksDir, hook)))
|
|
170
|
+
installed++;
|
|
171
|
+
else
|
|
172
|
+
missing++;
|
|
173
|
+
}
|
|
174
|
+
return { installed, missing };
|
|
175
|
+
}
|
|
176
|
+
// ── Evidence assembler ────────────────────────────────────────────────
|
|
177
|
+
function gatherEvidence(projectDir) {
|
|
178
|
+
const claudeMdPath = join(projectDir, "CLAUDE.md");
|
|
179
|
+
const indexMdPath = join(projectDir, ".claude", "index.md");
|
|
180
|
+
const coreMdPath = join(projectDir, ".claude", "core.md");
|
|
181
|
+
const prdPath = [
|
|
182
|
+
join(projectDir, "docs", "PRD.md"),
|
|
183
|
+
join(projectDir, "docs", "prd.md"),
|
|
184
|
+
].find(existsSync);
|
|
185
|
+
const claudeMdLines = existsSync(claudeMdPath)
|
|
186
|
+
? readFileSync(claudeMdPath, "utf-8").split("\n").length
|
|
187
|
+
: 0;
|
|
188
|
+
const claudeMdHead = safeRead(claudeMdPath, 5);
|
|
189
|
+
const isSentinel = existsSync(claudeMdPath) &&
|
|
190
|
+
readFileSync(claudeMdPath, "utf-8").includes("<!-- ForgeCraft sentinel:");
|
|
191
|
+
const cntHealth = (() => {
|
|
192
|
+
try {
|
|
193
|
+
return auditCntHealth(projectDir);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
})();
|
|
199
|
+
const cntLeafCount = safeCount(join(projectDir, ".claude", "standards"), ".md");
|
|
200
|
+
const cntRoutingPass = cntHealth?.routingPass ?? null;
|
|
201
|
+
const unroutedLeaves = cntHealth?.unroutedLeaves ?? [];
|
|
202
|
+
const ucDir = join(projectDir, "docs", "use-cases");
|
|
203
|
+
const ucCount = safeCountPattern(ucDir, /^UC-\d{3}/);
|
|
204
|
+
const monolithUcPath = join(projectDir, "docs", "use-cases.md");
|
|
205
|
+
const ucMonolithWords = fileWords(monolithUcPath);
|
|
206
|
+
const harnessDir = [
|
|
207
|
+
join(projectDir, "tests", "harness"),
|
|
208
|
+
join(projectDir, "test", "harness"),
|
|
209
|
+
].find(existsSync);
|
|
210
|
+
const probeCount = harnessDir ? safeCount(harnessDir) : 0;
|
|
211
|
+
const harnessEvidence = readHarnessEvidence(projectDir);
|
|
212
|
+
const envEvidence = readProbeEvidence(projectDir, "env-probe-run.json");
|
|
213
|
+
const sloEvidence = readProbeEvidence(projectDir, "slo-probe-run.json");
|
|
214
|
+
const adrs = adrStatuses(projectDir);
|
|
215
|
+
const decisionCount = safeCount(join(projectDir, "docs", "decisions"), ".md");
|
|
216
|
+
const decisionMarkers = countMarkers(join(projectDir, "docs", "decisions"));
|
|
217
|
+
let gateCount = 0;
|
|
218
|
+
let warningGates = 0;
|
|
219
|
+
let errorGates = 0;
|
|
220
|
+
try {
|
|
221
|
+
const gates = getActiveProjectGates(projectDir);
|
|
222
|
+
gateCount = gates.length;
|
|
223
|
+
warningGates = gates.filter((g) => g.severity === "warning").length;
|
|
224
|
+
errorGates = gates.filter((g) => g.severity === "error").length;
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// skip
|
|
228
|
+
}
|
|
229
|
+
const hooks = hookInstallationStatus(projectDir);
|
|
230
|
+
const brownfield = readBrownfieldFlag(projectDir);
|
|
231
|
+
const sessionPromptsExist = existsSync(join(projectDir, "docs", "session-prompts"));
|
|
232
|
+
const prdWords = prdPath ? fileWords(prdPath) : 0;
|
|
233
|
+
const prdRelPath = prdPath
|
|
234
|
+
? prdPath.replace(projectDir, "").replace(/^[\\/]/, "")
|
|
235
|
+
: null;
|
|
236
|
+
const indexMdHead = safeRead(indexMdPath, 10);
|
|
237
|
+
const coreMdLines = existsSync(coreMdPath)
|
|
238
|
+
? readFileSync(coreMdPath, "utf-8").split("\n").length
|
|
239
|
+
: 0;
|
|
240
|
+
return {
|
|
241
|
+
// Self-describing
|
|
242
|
+
claudeMd: `${claudeMdLines} lines | sentinel: ${isSentinel} | head:\n${claudeMdHead}`,
|
|
243
|
+
cntLeaves: `${cntLeafCount} leaf nodes`,
|
|
244
|
+
indexMd: existsSync(indexMdPath)
|
|
245
|
+
? `present | head:\n${indexMdHead}`
|
|
246
|
+
: "absent",
|
|
247
|
+
coreMd: `${coreMdLines} lines`,
|
|
248
|
+
cntRoutingPass: cntRoutingPass === null ? "unknown" : String(cntRoutingPass),
|
|
249
|
+
unroutedLeaves: unroutedLeaves.length > 0 ? unroutedLeaves.join(", ") : "none",
|
|
250
|
+
// Bounded
|
|
251
|
+
sessionPrompts: sessionPromptsExist
|
|
252
|
+
? "docs/session-prompts/ exists"
|
|
253
|
+
: "absent",
|
|
254
|
+
cntBounded: cntRoutingPass
|
|
255
|
+
? "routing directives present"
|
|
256
|
+
: "routing directives missing",
|
|
257
|
+
// Verifiable
|
|
258
|
+
ucCount: String(ucCount),
|
|
259
|
+
ucMonolith: ucMonolithWords > 0 ? `use-cases.md: ${ucMonolithWords} words` : "absent",
|
|
260
|
+
probeCount: String(probeCount),
|
|
261
|
+
harnessEvidence: harnessEvidence
|
|
262
|
+
? `${harnessEvidence.passed} passed / ${harnessEvidence.failed} failed / ${harnessEvidence.notImplemented} not_implemented @ ${harnessEvidence.timestamp}`
|
|
263
|
+
: "not run",
|
|
264
|
+
// Defended
|
|
265
|
+
gateCount: String(gateCount),
|
|
266
|
+
gateSeverities: `${errorGates} error-severity / ${warningGates} warning-severity`,
|
|
267
|
+
hooksInstalled: `${hooks.installed}/5 installed | ${hooks.missing} missing`,
|
|
268
|
+
brownfield: String(brownfield),
|
|
269
|
+
// Auditable
|
|
270
|
+
adrs: `${adrs.total} total | ${adrs.accepted} Accepted | ${adrs.retroactive} Retroactive | ${adrs.markers} unresolved markers`,
|
|
271
|
+
decisions: `${decisionCount} files | ${decisionMarkers} unresolved markers`,
|
|
272
|
+
// Composable
|
|
273
|
+
prd: prdRelPath ? `${prdRelPath}: ${prdWords} words` : "absent",
|
|
274
|
+
chainLinks: `PRD:${prdRelPath ? "✓" : "✗"} UCs:${ucCount > 0 ? "✓" : "✗"} Probes:${probeCount > 0 ? "✓" : "✗"} ADRs:${adrs.total > 0 ? "✓" : "✗"} Gates:${gateCount > 0 ? "✓" : "✗"}`,
|
|
275
|
+
// Executable
|
|
276
|
+
envEvidence: envEvidence
|
|
277
|
+
? `${envEvidence.passed} passed / ${envEvidence.failed} failed @ ${envEvidence.timestamp}`
|
|
278
|
+
: "not run",
|
|
279
|
+
sloEvidence: sloEvidence
|
|
280
|
+
? `${sloEvidence.passed} passed / ${sloEvidence.failed} failed @ ${sloEvidence.timestamp}`
|
|
281
|
+
: "not run",
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
// ── Scoring prompt builder ─────────────────────────────────────────────
|
|
285
|
+
function buildScoringPrompt(projectDir, evidence) {
|
|
286
|
+
const relDir = projectDir.split(/[\\/]/).pop() ?? projectDir;
|
|
287
|
+
return [
|
|
288
|
+
`# GS Rubric Evaluation — ${relDir}`,
|
|
289
|
+
"",
|
|
290
|
+
"You are evaluating this project against the 7 Generative Specification properties.",
|
|
291
|
+
"Score each property 0 / 1 / 2 using the criteria below as a **starting framework**.",
|
|
292
|
+
"",
|
|
293
|
+
"**Important:** The criteria below describe what the tooling can detect. You are not limited to them.",
|
|
294
|
+
"If you see something the heuristics miss — a property that is technically present but",
|
|
295
|
+
"hollow, spec artifacts that exist but are incoherent, tests that pass trivially — flag it.",
|
|
296
|
+
"Reduce the score. Add a note. The goal is an honest assessment, not a passing grade.",
|
|
297
|
+
"",
|
|
298
|
+
"---",
|
|
299
|
+
"",
|
|
300
|
+
"## Evidence",
|
|
301
|
+
"",
|
|
302
|
+
"### Self-describing",
|
|
303
|
+
`- CLAUDE.md: ${evidence["claudeMd"]}`,
|
|
304
|
+
`- CNT: ${evidence["cntLeaves"]} | routing: ${evidence["cntRoutingPass"]} | unrouted: ${evidence["unroutedLeaves"]}`,
|
|
305
|
+
`- .claude/index.md: ${evidence["indexMd"]}`,
|
|
306
|
+
`- .claude/core.md: ${evidence["coreMd"]}`,
|
|
307
|
+
"",
|
|
308
|
+
"### Bounded",
|
|
309
|
+
`- Session prompts: ${evidence["sessionPrompts"]}`,
|
|
310
|
+
`- CNT context loading: ${evidence["cntBounded"]}`,
|
|
311
|
+
"",
|
|
312
|
+
"### Verifiable",
|
|
313
|
+
`- Use cases (canonical): ${evidence["ucCount"]} UC files`,
|
|
314
|
+
`- Use cases (monolith): ${evidence["ucMonolith"]}`,
|
|
315
|
+
`- L2 probes: ${evidence["probeCount"]} files`,
|
|
316
|
+
`- Harness run: ${evidence["harnessEvidence"]}`,
|
|
317
|
+
"",
|
|
318
|
+
"### Defended",
|
|
319
|
+
`- Active gates: ${evidence["gateCount"]} (${evidence["gateSeverities"]})`,
|
|
320
|
+
`- Git hooks: ${evidence["hooksInstalled"]}`,
|
|
321
|
+
`- Brownfield project: ${evidence["brownfield"]}`,
|
|
322
|
+
"",
|
|
323
|
+
"### Auditable",
|
|
324
|
+
`- ADRs: ${evidence["adrs"]}`,
|
|
325
|
+
`- Decision records: ${evidence["decisions"]}`,
|
|
326
|
+
"",
|
|
327
|
+
"### Composable",
|
|
328
|
+
`- PRD: ${evidence["prd"]}`,
|
|
329
|
+
`- Chain presence: ${evidence["chainLinks"]}`,
|
|
330
|
+
"",
|
|
331
|
+
"### Executable",
|
|
332
|
+
`- L2 Harness: ${evidence["harnessEvidence"]}`,
|
|
333
|
+
`- L3 Env probes: ${evidence["envEvidence"]}`,
|
|
334
|
+
`- L4 SLO probes: ${evidence["sloEvidence"]}`,
|
|
335
|
+
"",
|
|
336
|
+
"---",
|
|
337
|
+
"",
|
|
338
|
+
"## Scoring Criteria (starting framework — override freely)",
|
|
339
|
+
"",
|
|
340
|
+
"### 1. Self-describing (0–2)",
|
|
341
|
+
"- **0**: No CLAUDE.md, or a monolithic blob with no CNT navigation",
|
|
342
|
+
"- **1**: CLAUDE.md present; some CNT nodes exist but routing is incomplete or absent",
|
|
343
|
+
"- **2**: Sentinel CLAUDE.md + CNT with routing directives for all domains; index.md clearly describes when to load each node",
|
|
344
|
+
"",
|
|
345
|
+
"### 2. Bounded (0–2)",
|
|
346
|
+
"- **0**: No session prompts; Claude loads all context on every call",
|
|
347
|
+
"- **1**: Session prompts or CNT routing exist but scope boundaries are vague or unrouted leaves remain",
|
|
348
|
+
"- **2**: Every generated session has explicit scope; CNT routing loads only relevant context; no context bloat",
|
|
349
|
+
"",
|
|
350
|
+
"### 3. Verifiable (0–2)",
|
|
351
|
+
"- **0**: No use cases, or use cases exist but no tests are bound to them",
|
|
352
|
+
"- **1**: Use cases exist; some probes exist; harness has not been run or has not_implemented probes",
|
|
353
|
+
"- **2**: All UCs have probes; harness ran with 0 failures and 0 not_implemented; L2 coverage ≥ 80%",
|
|
354
|
+
"",
|
|
355
|
+
"### 4. Defended (0–2)",
|
|
356
|
+
"- **0**: No gates, or gates are defined but hooks are not installed so they never fire",
|
|
357
|
+
"- **1**: Gates defined; hooks installed; but gates are all warning-severity or coverage is low",
|
|
358
|
+
"- **2**: Error-severity gates in force; hooks installed and firing; gates cover the main failure modes",
|
|
359
|
+
"",
|
|
360
|
+
"### 5. Auditable (0–2)",
|
|
361
|
+
"- **0**: No ADRs or decisions; no record of why choices were made",
|
|
362
|
+
"- **1**: ADRs exist but majority are Retroactive stubs with unresolved markers; decision trail is incomplete",
|
|
363
|
+
"- **2**: All significant decisions have Accepted ADRs with full Context/Decision/Alternatives; decision records link to chronicle sessions where relevant",
|
|
364
|
+
"",
|
|
365
|
+
"### 6. Composable (0–2)",
|
|
366
|
+
"- **0**: No visible derivation chain; spec is a monolith or absent",
|
|
367
|
+
"- **1**: Some chain links present (e.g. PRD → UCs, or UCs → probes) but not end-to-end; cross-references between layers are missing",
|
|
368
|
+
"- **2**: Full chain intact: PRD → UCs → ADRs → probes → gates; each layer is derivable from the prior; cross-references present",
|
|
369
|
+
"",
|
|
370
|
+
"### 7. Executable (0–2)",
|
|
371
|
+
"- **0**: No executable spec artifacts; everything is documentation only",
|
|
372
|
+
"- **1**: Probes exist but have not been run, are stubs (not_implemented), or have failures",
|
|
373
|
+
"- **2**: L2 probes all passing; L3 env probes run and passing; L4 SLO probes run and passing; monitoring contracts verified",
|
|
374
|
+
"",
|
|
375
|
+
"---",
|
|
376
|
+
"",
|
|
377
|
+
"## Your Task",
|
|
378
|
+
"",
|
|
379
|
+
"Fill in the scorecard below. For each property:",
|
|
380
|
+
"1. State the score (0, 1, or 2)",
|
|
381
|
+
"2. Give a one-line rationale",
|
|
382
|
+
"3. If you disagree with or want to add to the criteria above, say so explicitly",
|
|
383
|
+
"4. Flag anything that looks hollow, superficial, or missing regardless of the heuristics",
|
|
384
|
+
"",
|
|
385
|
+
"```",
|
|
386
|
+
"| Property | Score | Rationale |",
|
|
387
|
+
"|---|---|---|",
|
|
388
|
+
"| Self-describing | /2 | |",
|
|
389
|
+
"| Bounded | /2 | |",
|
|
390
|
+
"| Verifiable | /2 | |",
|
|
391
|
+
"| Defended | /2 | |",
|
|
392
|
+
"| Auditable | /2 | |",
|
|
393
|
+
"| Composable | /2 | |",
|
|
394
|
+
"| Executable | /2 | |",
|
|
395
|
+
"| **Total** | /14 | |",
|
|
396
|
+
"```",
|
|
397
|
+
"",
|
|
398
|
+
"After the scorecard, add a **Flags** section for anything the evidence doesn't capture but you",
|
|
399
|
+
"noticed — incoherent spec language, contradictory requirements, test scaffolding that trivially",
|
|
400
|
+
"passes, CNT nodes that exist but are empty, ADRs that are technically Accepted but clearly",
|
|
401
|
+
"placeholder content, etc. These flags don't change the score but tell the practitioner what",
|
|
402
|
+
"to work on that the tooling cannot detect.",
|
|
403
|
+
].join("\n");
|
|
404
|
+
}
|
|
405
|
+
// ── Handler ───────────────────────────────────────────────────────────
|
|
406
|
+
export async function scoreRubricHandler(args) {
|
|
407
|
+
const evidence = gatherEvidence(args.project_dir);
|
|
408
|
+
const prompt = buildScoringPrompt(args.project_dir, evidence);
|
|
409
|
+
return { content: [{ type: "text", text: prompt }] };
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=score-rubric.js.map
|