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
|
@@ -4,7 +4,13 @@
|
|
|
4
4
|
import { extname, basename, dirname } from "node:path";
|
|
5
5
|
// ── Constants ─────────────────────────────────────────────────────────
|
|
6
6
|
/** Directories that are considered "route/controller" layers. */
|
|
7
|
-
export const ROUTE_DIRS = [
|
|
7
|
+
export const ROUTE_DIRS = [
|
|
8
|
+
"routes",
|
|
9
|
+
"controllers",
|
|
10
|
+
"handlers",
|
|
11
|
+
"api",
|
|
12
|
+
"endpoints",
|
|
13
|
+
];
|
|
8
14
|
/** ORM/DB client call patterns to flag in route files. */
|
|
9
15
|
export const DB_CALL_PATTERNS = [
|
|
10
16
|
/\bprisma\.\w+\.\w+\s*\(/, // prisma.user.findMany(
|
|
@@ -18,19 +24,34 @@ export const DB_CALL_PATTERNS = [
|
|
|
18
24
|
];
|
|
19
25
|
/** Lines that are comments or imports — excluded from DB call detection. */
|
|
20
26
|
export const COMMENT_OR_IMPORT = /^\s*(\/\/|\/\*|\*|#|import\s|require\s*\()/;
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Keywords that indicate an instruction file covers architecture/conventions/decisions.
|
|
29
|
+
* Intentionally broad to be tech-agnostic: web services, libraries, CLIs,
|
|
30
|
+
* GitHub Actions, and ML projects each use different vocabulary.
|
|
31
|
+
*/
|
|
24
32
|
export const INSTRUCTION_COVERAGE_KEYWORDS = [
|
|
33
|
+
// Web service / layered architecture terms
|
|
25
34
|
"architecture",
|
|
35
|
+
"layer",
|
|
36
|
+
"repository",
|
|
37
|
+
"service",
|
|
38
|
+
// Universal design terms
|
|
26
39
|
"convention",
|
|
27
40
|
"decision",
|
|
41
|
+
"pattern",
|
|
42
|
+
"module",
|
|
43
|
+
"interface",
|
|
44
|
+
"constraint",
|
|
45
|
+
"behavior",
|
|
46
|
+
// Documentation/traceability
|
|
28
47
|
"adr",
|
|
29
48
|
"domain",
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
49
|
+
// Action/CLI/tool-specific
|
|
50
|
+
"workflow",
|
|
51
|
+
"input",
|
|
52
|
+
"output",
|
|
53
|
+
"command",
|
|
54
|
+
"tool",
|
|
34
55
|
];
|
|
35
56
|
/** Minimum distinct keyword hits to award score 2 for Self-describing. */
|
|
36
57
|
export const MIN_KEYWORD_HITS = 3;
|
|
@@ -67,7 +88,11 @@ export function collectDbViolations(lines, relPath, violations) {
|
|
|
67
88
|
continue;
|
|
68
89
|
const matchedPattern = DB_CALL_PATTERNS.find((p) => p.test(line));
|
|
69
90
|
if (matchedPattern) {
|
|
70
|
-
violations.push({
|
|
91
|
+
violations.push({
|
|
92
|
+
file: relPath,
|
|
93
|
+
line: i + 1,
|
|
94
|
+
snippet: line.slice(0, 120),
|
|
95
|
+
});
|
|
71
96
|
}
|
|
72
97
|
}
|
|
73
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scorer-utils.js","sourceRoot":"","sources":["../../../src/analyzers/scorers/scorer-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"scorer-utils.js","sourceRoot":"","sources":["../../../src/analyzers/scorers/scorer-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Self-describing scorer: instruction file exists
|
|
3
|
-
*
|
|
2
|
+
* Self-describing scorer: instruction file exists and covers architecture/convention keywords.
|
|
3
|
+
*
|
|
4
|
+
* Sentinel-aware: a compact CLAUDE.md that navigates to the right docs is better
|
|
5
|
+
* than a verbose file that repeats them. Line count is irrelevant — keyword coverage
|
|
6
|
+
* is the signal.
|
|
4
7
|
*/
|
|
5
8
|
import type { GsPropertyScore } from "../../shared/types.js";
|
|
6
9
|
/**
|
|
7
10
|
* Score the Self-describing GS property.
|
|
8
|
-
* 2 = instruction file
|
|
9
|
-
* 1 = file
|
|
11
|
+
* 2 = instruction file exists and covers ≥ MIN_KEYWORD_HITS architecture/convention keywords.
|
|
12
|
+
* 1 = file exists but covers fewer keywords (present but not describing the architecture).
|
|
10
13
|
* 0 = no instruction file found.
|
|
11
14
|
*/
|
|
12
15
|
export declare function scoreSelfDescribing(projectDir: string): GsPropertyScore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-describing-scorer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/scorers/self-describing-scorer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"self-describing-scorer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/scorers/self-describing-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAO7D;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAuCvE"}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Self-describing scorer: instruction file exists
|
|
3
|
-
*
|
|
2
|
+
* Self-describing scorer: instruction file exists and covers architecture/convention keywords.
|
|
3
|
+
*
|
|
4
|
+
* Sentinel-aware: a compact CLAUDE.md that navigates to the right docs is better
|
|
5
|
+
* than a verbose file that repeats them. Line count is irrelevant — keyword coverage
|
|
6
|
+
* is the signal.
|
|
4
7
|
*/
|
|
5
8
|
import { existsSync, readFileSync } from "node:fs";
|
|
6
9
|
import { join } from "node:path";
|
|
7
|
-
import { gs,
|
|
10
|
+
import { gs, INSTRUCTION_COVERAGE_KEYWORDS, MIN_KEYWORD_HITS, } from "./scorer-utils.js";
|
|
8
11
|
/**
|
|
9
12
|
* Score the Self-describing GS property.
|
|
10
|
-
* 2 = instruction file
|
|
11
|
-
* 1 = file
|
|
13
|
+
* 2 = instruction file exists and covers ≥ MIN_KEYWORD_HITS architecture/convention keywords.
|
|
14
|
+
* 1 = file exists but covers fewer keywords (present but not describing the architecture).
|
|
12
15
|
* 0 = no instruction file found.
|
|
13
16
|
*/
|
|
14
17
|
export function scoreSelfDescribing(projectDir) {
|
|
@@ -28,24 +31,20 @@ export function scoreSelfDescribing(projectDir) {
|
|
|
28
31
|
try {
|
|
29
32
|
content = readFileSync(join(projectDir, found), "utf-8");
|
|
30
33
|
}
|
|
31
|
-
catch {
|
|
32
|
-
|
|
33
|
-
if (lines.length < MIN_INSTRUCTION_FILE_LINES) {
|
|
34
|
-
return gs("self-describing", 1, [
|
|
35
|
-
`${found} found but only ${lines.length} non-empty lines (< ${MIN_INSTRUCTION_FILE_LINES} — treat as stub)`,
|
|
36
|
-
]);
|
|
34
|
+
catch {
|
|
35
|
+
/* empty */
|
|
37
36
|
}
|
|
38
37
|
const lower = content.toLowerCase();
|
|
39
38
|
const hits = INSTRUCTION_COVERAGE_KEYWORDS.filter((kw) => lower.includes(kw));
|
|
40
|
-
if (hits.length
|
|
41
|
-
return gs("self-describing",
|
|
42
|
-
`${found} found
|
|
43
|
-
`Missing keywords: ${INSTRUCTION_COVERAGE_KEYWORDS.filter((kw) => !lower.includes(kw)).slice(0, 5).join(", ")}`,
|
|
39
|
+
if (hits.length >= MIN_KEYWORD_HITS) {
|
|
40
|
+
return gs("self-describing", 2, [
|
|
41
|
+
`${found} found — covers: ${hits.join(", ")}`,
|
|
44
42
|
]);
|
|
45
43
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
const missing = INSTRUCTION_COVERAGE_KEYWORDS.filter((kw) => !lower.includes(kw));
|
|
45
|
+
return gs("self-describing", 1, [
|
|
46
|
+
`${found} found but covers fewer than ${MIN_KEYWORD_HITS} architecture/convention keywords`,
|
|
47
|
+
`Add navigation or constraints referencing: ${missing.slice(0, 5).join(", ")}`,
|
|
49
48
|
]);
|
|
50
49
|
}
|
|
51
50
|
//# sourceMappingURL=self-describing-scorer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-describing-scorer.js","sourceRoot":"","sources":["../../../src/analyzers/scorers/self-describing-scorer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"self-describing-scorer.js","sourceRoot":"","sources":["../../../src/analyzers/scorers/self-describing-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,EAAE,EACF,6BAA6B,EAC7B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,MAAM,gBAAgB,GAAG;QACvB,WAAW;QACX,eAAe;QACf,iCAAiC;QACjC,gBAAgB;QAChB,aAAa;QACb,gBAAgB;KACjB,CAAC;IAEF,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,WAAW;IACb,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9E,IAAI,IAAI,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE;YAC9B,GAAG,KAAK,oBAAoB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,6BAA6B,CAAC,MAAM,CAClD,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAC5B,CAAC;IACF,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE;QAC9B,GAAG,KAAK,gCAAgC,gBAAgB,mCAAmC;QAC3F,8CAA8C,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KAC/E,CAAC,CAAC;AACL,CAAC"}
|
package/dist/cli/help.js
CHANGED
|
@@ -5,57 +5,57 @@
|
|
|
5
5
|
* Print usage help to stdout.
|
|
6
6
|
*/
|
|
7
7
|
export function showHelp() {
|
|
8
|
-
console.log(`
|
|
9
|
-
ForgeCraft MCP — engineering standards for AI coding assistants
|
|
10
|
-
|
|
11
|
-
USAGE
|
|
12
|
-
npx forgecraft-mcp <command> [arguments] [flags]
|
|
13
|
-
npx forgecraft-mcp serve (default — starts MCP server)
|
|
14
|
-
|
|
15
|
-
COMMANDS
|
|
16
|
-
setup <dir> First-time project setup (auto-detects stack)
|
|
17
|
-
refresh <dir> Re-sync instruction files after project changes
|
|
18
|
-
audit <dir> Check project against configured standards
|
|
19
|
-
scaffold <dir> Generate project structure and instruction files
|
|
20
|
-
review [dir] Generate code review checklist
|
|
21
|
-
list [tags|hooks|skills] Discover available resources
|
|
22
|
-
classify [dir] Suggest tags for a project
|
|
23
|
-
generate <dir> Generate instruction files only
|
|
24
|
-
convert <dir> Generate migration plan
|
|
25
|
-
add-hook <name> <dir> Install a quality-gate hook
|
|
26
|
-
add-module <name> <dir> Scaffold a feature module
|
|
27
|
-
verify [dir] Run tests + score §4.3 GS properties + report layer violations
|
|
28
|
-
advice [dir] Quality cycle checklist + tool stack + example configs for your tags
|
|
29
|
-
metrics [dir] External quality report: LOC, coverage, layer violations, dead code, complexity
|
|
30
|
-
|
|
31
|
-
CI / BARE GATE COMMANDS (exit codes: 0 = pass, 1 = fail)
|
|
32
|
-
check-cascade [dir] Run cascade gate checks — exit 1 if required steps are incomplete
|
|
33
|
-
violations [dir] Report active gate violations — exit 1 if any violations present
|
|
34
|
-
status [dir] Print live project state snapshot (cascade + roadmap + git + Status.md)
|
|
35
|
-
|
|
36
|
-
FLAGS (vary by command)
|
|
37
|
-
--json Machine-readable JSON output (for CI/scripting)
|
|
38
|
-
--tags <tags...> Project classification tags (or read from forgecraft.yaml)
|
|
39
|
-
--tier <tier> Content depth: core | recommended | optional
|
|
40
|
-
--targets <targets...> AI assistant targets: claude cursor copilot windsurf cline aider
|
|
41
|
-
--name <name> Project name
|
|
42
|
-
--description <text> Project description for tag detection
|
|
43
|
-
--dry-run Preview without writing files
|
|
44
|
-
--apply Apply changes (for refresh, default is preview)
|
|
45
|
-
--add-tags <tags...> Add tags during refresh
|
|
46
|
-
--remove-tags <tags...> Remove tags during refresh
|
|
47
|
-
--no-anti-patterns Skip anti-pattern scanning (for audit)
|
|
48
|
-
--language <lang> typescript | python (default: typescript)
|
|
49
|
-
--scope <scope> comprehensive | focused (for review)
|
|
50
|
-
--test-cmd <cmd> Test command override for verify (default: npm test)
|
|
51
|
-
--timeout <ms> Test suite timeout in milliseconds (default: 120000)
|
|
52
|
-
--threshold <n> Minimum GS score out of 12 for pass (default: 10)
|
|
53
|
-
--mutation Run Stryker mutation testing (slow, opt-in; used by metrics)
|
|
54
|
-
--coverage-dir <path> Path to existing coverage report directory (used by metrics)
|
|
55
|
-
--force Overwrite existing files
|
|
56
|
-
--compact Strip explanatory bullet tails and deduplicate lines (~20-40% smaller output)
|
|
57
|
-
--tag <tag> Single tag filter (for add-hook)
|
|
58
|
-
--check Drift-check mode for refresh: exit 1 if tag/tier drift detected (CI gate)
|
|
8
|
+
console.log(`
|
|
9
|
+
ForgeCraft MCP — engineering standards for AI coding assistants
|
|
10
|
+
|
|
11
|
+
USAGE
|
|
12
|
+
npx forgecraft-mcp <command> [arguments] [flags]
|
|
13
|
+
npx forgecraft-mcp serve (default — starts MCP server)
|
|
14
|
+
|
|
15
|
+
COMMANDS
|
|
16
|
+
setup <dir> First-time project setup (auto-detects stack)
|
|
17
|
+
refresh <dir> Re-sync instruction files after project changes
|
|
18
|
+
audit <dir> Check project against configured standards
|
|
19
|
+
scaffold <dir> Generate project structure and instruction files
|
|
20
|
+
review [dir] Generate code review checklist
|
|
21
|
+
list [tags|hooks|skills] Discover available resources
|
|
22
|
+
classify [dir] Suggest tags for a project
|
|
23
|
+
generate <dir> Generate instruction files only
|
|
24
|
+
convert <dir> Generate migration plan
|
|
25
|
+
add-hook <name> <dir> Install a quality-gate hook
|
|
26
|
+
add-module <name> <dir> Scaffold a feature module
|
|
27
|
+
verify [dir] Run tests + score §4.3 GS properties + report layer violations
|
|
28
|
+
advice [dir] Quality cycle checklist + tool stack + example configs for your tags
|
|
29
|
+
metrics [dir] External quality report: LOC, coverage, layer violations, dead code, complexity
|
|
30
|
+
|
|
31
|
+
CI / BARE GATE COMMANDS (exit codes: 0 = pass, 1 = fail)
|
|
32
|
+
check-cascade [dir] Run cascade gate checks — exit 1 if required steps are incomplete
|
|
33
|
+
violations [dir] Report active gate violations — exit 1 if any violations present
|
|
34
|
+
status [dir] Print live project state snapshot (cascade + roadmap + git + Status.md)
|
|
35
|
+
|
|
36
|
+
FLAGS (vary by command)
|
|
37
|
+
--json Machine-readable JSON output (for CI/scripting)
|
|
38
|
+
--tags <tags...> Project classification tags (or read from forgecraft.yaml)
|
|
39
|
+
--tier <tier> Content depth: core | recommended | optional
|
|
40
|
+
--targets <targets...> AI assistant targets: claude cursor copilot windsurf cline aider
|
|
41
|
+
--name <name> Project name
|
|
42
|
+
--description <text> Project description for tag detection
|
|
43
|
+
--dry-run Preview without writing files
|
|
44
|
+
--apply Apply changes (for refresh, default is preview)
|
|
45
|
+
--add-tags <tags...> Add tags during refresh
|
|
46
|
+
--remove-tags <tags...> Remove tags during refresh
|
|
47
|
+
--no-anti-patterns Skip anti-pattern scanning (for audit)
|
|
48
|
+
--language <lang> typescript | python (default: typescript)
|
|
49
|
+
--scope <scope> comprehensive | focused (for review)
|
|
50
|
+
--test-cmd <cmd> Test command override for verify (default: npm test)
|
|
51
|
+
--timeout <ms> Test suite timeout in milliseconds (default: 120000)
|
|
52
|
+
--threshold <n> Minimum GS score out of 12 for pass (default: 10)
|
|
53
|
+
--mutation Run Stryker mutation testing (slow, opt-in; used by metrics)
|
|
54
|
+
--coverage-dir <path> Path to existing coverage report directory (used by metrics)
|
|
55
|
+
--force Overwrite existing files
|
|
56
|
+
--compact Strip explanatory bullet tails and deduplicate lines (~20-40% smaller output)
|
|
57
|
+
--tag <tag> Single tag filter (for add-hook)
|
|
58
|
+
--check Drift-check mode for refresh: exit 1 if tag/tier drift detected (CI gate)
|
|
59
59
|
`);
|
|
60
60
|
}
|
|
61
61
|
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface DetectResult {
|
|
2
|
+
applies: boolean;
|
|
3
|
+
evidence: string[];
|
|
4
|
+
}
|
|
5
|
+
export interface ScoreResult {
|
|
6
|
+
score: 0 | 1 | 2;
|
|
7
|
+
evidence: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface Discipline {
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
detect(repoPath: string): DetectResult;
|
|
13
|
+
score(repoPath: string): ScoreResult;
|
|
14
|
+
}
|
|
15
|
+
export declare const DISCIPLINES: readonly Discipline[];
|
|
16
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/disciplines/catalog.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC;IACvC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC;CACtC;AA+KD,eAAO,MAAM,WAAW,EAAE,SAAS,UAAU,EAO5C,CAAC"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural disciplines catalog.
|
|
3
|
+
*
|
|
4
|
+
* A "discipline" is a recognised way to organise a codebase — SOLID,
|
|
5
|
+
* hexagonal, layered, clean architecture, DDD, and TDD-as-a-practice.
|
|
6
|
+
* Each entry knows two things:
|
|
7
|
+
*
|
|
8
|
+
* 1. `detect(repoPath)` — does this discipline appear to apply at all?
|
|
9
|
+
* A heuristic scan of file names, directory structure, and well-known
|
|
10
|
+
* vocabulary. Cheap, read-only, no parsing.
|
|
11
|
+
* 2. `score(repoPath)` — given that it applies, how well is it followed?
|
|
12
|
+
* 0/1/2 scale, mirroring the existing GS scorer convention. Bodies
|
|
13
|
+
* are placeholders for now; calibration anchors come later.
|
|
14
|
+
*
|
|
15
|
+
* The catalog is intentionally additive: a repo can match many disciplines
|
|
16
|
+
* at once (e.g. a hexagonal codebase that also speaks DDD), and a repo
|
|
17
|
+
* with nothing recognisable matches none.
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
const TODO_PLACEHOLDER = {
|
|
22
|
+
score: 0,
|
|
23
|
+
evidence: ["TODO: scoring heuristic not yet implemented (skeleton)"],
|
|
24
|
+
};
|
|
25
|
+
function listDirsRecursive(repoPath, maxDepth = 3) {
|
|
26
|
+
const out = [];
|
|
27
|
+
function walk(dir, depth) {
|
|
28
|
+
if (depth > maxDepth)
|
|
29
|
+
return;
|
|
30
|
+
let entries;
|
|
31
|
+
try {
|
|
32
|
+
entries = readdirSync(dir, { withFileTypes: true, encoding: "utf8" });
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
for (const e of entries) {
|
|
38
|
+
if (!e.isDirectory())
|
|
39
|
+
continue;
|
|
40
|
+
const name = e.name;
|
|
41
|
+
if (name === "node_modules" || name.startsWith("."))
|
|
42
|
+
continue;
|
|
43
|
+
const full = join(dir, name);
|
|
44
|
+
out.push(full);
|
|
45
|
+
walk(full, depth + 1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
walk(repoPath, 0);
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
function hasDirNamed(repoPath, names) {
|
|
52
|
+
const dirs = listDirsRecursive(repoPath);
|
|
53
|
+
const lower = new Set(names.map((n) => n.toLowerCase()));
|
|
54
|
+
const hits = [];
|
|
55
|
+
for (const d of dirs) {
|
|
56
|
+
const base = d.split(/[\\/]/).pop().toLowerCase();
|
|
57
|
+
if (lower.has(base))
|
|
58
|
+
hits.push(d);
|
|
59
|
+
}
|
|
60
|
+
return hits;
|
|
61
|
+
}
|
|
62
|
+
function hasAnyFile(repoPath, files) {
|
|
63
|
+
const hits = [];
|
|
64
|
+
for (const f of files) {
|
|
65
|
+
const full = join(repoPath, f);
|
|
66
|
+
if (existsSync(full) && safeIsFile(full))
|
|
67
|
+
hits.push(f);
|
|
68
|
+
}
|
|
69
|
+
return hits;
|
|
70
|
+
}
|
|
71
|
+
function safeIsFile(p) {
|
|
72
|
+
try {
|
|
73
|
+
return statSync(p).isFile();
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const SOLID = {
|
|
80
|
+
name: "SOLID",
|
|
81
|
+
description: "Class-oriented design principles (SRP, OCP, LSP, ISP, DIP).",
|
|
82
|
+
detect(repoPath) {
|
|
83
|
+
const interfaceDirs = hasDirNamed(repoPath, ["interfaces", "abstractions"]);
|
|
84
|
+
const classy = hasAnyFile(repoPath, [
|
|
85
|
+
"tsconfig.json",
|
|
86
|
+
"pom.xml",
|
|
87
|
+
"build.gradle",
|
|
88
|
+
"*.csproj",
|
|
89
|
+
]);
|
|
90
|
+
const evidence = [];
|
|
91
|
+
if (interfaceDirs.length > 0)
|
|
92
|
+
evidence.push(`interface dirs: ${interfaceDirs.length}`);
|
|
93
|
+
if (classy.length > 0)
|
|
94
|
+
evidence.push(`class-oriented project: ${classy.join(", ")}`);
|
|
95
|
+
return { applies: evidence.length > 0, evidence };
|
|
96
|
+
},
|
|
97
|
+
score: () => TODO_PLACEHOLDER,
|
|
98
|
+
};
|
|
99
|
+
const TDD = {
|
|
100
|
+
name: "TDD",
|
|
101
|
+
description: "Test-driven development practice (tests present and central).",
|
|
102
|
+
detect(repoPath) {
|
|
103
|
+
const testDirs = hasDirNamed(repoPath, [
|
|
104
|
+
"tests",
|
|
105
|
+
"test",
|
|
106
|
+
"__tests__",
|
|
107
|
+
"spec",
|
|
108
|
+
]);
|
|
109
|
+
const configs = hasAnyFile(repoPath, [
|
|
110
|
+
"vitest.config.ts",
|
|
111
|
+
"vitest.config.js",
|
|
112
|
+
"jest.config.js",
|
|
113
|
+
"jest.config.ts",
|
|
114
|
+
"karma.conf.js",
|
|
115
|
+
"phpunit.xml",
|
|
116
|
+
]);
|
|
117
|
+
const evidence = [];
|
|
118
|
+
if (testDirs.length > 0)
|
|
119
|
+
evidence.push(`test dirs: ${testDirs.length}`);
|
|
120
|
+
if (configs.length > 0)
|
|
121
|
+
evidence.push(`test configs: ${configs.join(", ")}`);
|
|
122
|
+
return { applies: testDirs.length > 0 || configs.length > 0, evidence };
|
|
123
|
+
},
|
|
124
|
+
score: () => TODO_PLACEHOLDER,
|
|
125
|
+
};
|
|
126
|
+
const HEXAGONAL = {
|
|
127
|
+
name: "Hexagonal",
|
|
128
|
+
description: "Ports & adapters — domain isolated behind explicit ports.",
|
|
129
|
+
detect(repoPath) {
|
|
130
|
+
const dirs = hasDirNamed(repoPath, ["ports", "adapters", "hexagon"]);
|
|
131
|
+
const evidence = dirs.length > 0 ? [`hexagonal dirs: ${dirs.length}`] : [];
|
|
132
|
+
return { applies: dirs.length >= 2, evidence };
|
|
133
|
+
},
|
|
134
|
+
score: () => TODO_PLACEHOLDER,
|
|
135
|
+
};
|
|
136
|
+
const LAYERED = {
|
|
137
|
+
name: "Layered",
|
|
138
|
+
description: "Classic n-tier separation (controllers / services / repositories).",
|
|
139
|
+
detect(repoPath) {
|
|
140
|
+
const dirs = hasDirNamed(repoPath, [
|
|
141
|
+
"controllers",
|
|
142
|
+
"services",
|
|
143
|
+
"repositories",
|
|
144
|
+
"dao",
|
|
145
|
+
"presentation",
|
|
146
|
+
"business",
|
|
147
|
+
"persistence",
|
|
148
|
+
]);
|
|
149
|
+
const evidence = dirs.length > 0 ? [`layered dirs: ${dirs.length}`] : [];
|
|
150
|
+
return { applies: dirs.length >= 2, evidence };
|
|
151
|
+
},
|
|
152
|
+
score: () => TODO_PLACEHOLDER,
|
|
153
|
+
};
|
|
154
|
+
const CLEAN_ARCHITECTURE = {
|
|
155
|
+
name: "CleanArchitecture",
|
|
156
|
+
description: "Concentric rings — entities, use cases, interface adapters, frameworks.",
|
|
157
|
+
detect(repoPath) {
|
|
158
|
+
const dirs = hasDirNamed(repoPath, [
|
|
159
|
+
"entities",
|
|
160
|
+
"usecases",
|
|
161
|
+
"use-cases",
|
|
162
|
+
"interface-adapters",
|
|
163
|
+
"frameworks",
|
|
164
|
+
]);
|
|
165
|
+
const evidence = dirs.length > 0 ? [`clean-arch dirs: ${dirs.length}`] : [];
|
|
166
|
+
return { applies: dirs.length >= 2, evidence };
|
|
167
|
+
},
|
|
168
|
+
score: () => TODO_PLACEHOLDER,
|
|
169
|
+
};
|
|
170
|
+
const DDD = {
|
|
171
|
+
name: "DDD",
|
|
172
|
+
description: "Domain-driven design vocabulary (aggregate, value object, repository).",
|
|
173
|
+
detect(repoPath) {
|
|
174
|
+
const dirs = hasDirNamed(repoPath, [
|
|
175
|
+
"aggregates",
|
|
176
|
+
"valueobjects",
|
|
177
|
+
"value-objects",
|
|
178
|
+
"domain",
|
|
179
|
+
"domainevents",
|
|
180
|
+
"domain-events",
|
|
181
|
+
"boundedcontexts",
|
|
182
|
+
]);
|
|
183
|
+
const evidence = dirs.length > 0 ? [`ddd dirs: ${dirs.length}`] : [];
|
|
184
|
+
return { applies: dirs.length >= 1, evidence };
|
|
185
|
+
},
|
|
186
|
+
score: () => TODO_PLACEHOLDER,
|
|
187
|
+
};
|
|
188
|
+
export const DISCIPLINES = [
|
|
189
|
+
SOLID,
|
|
190
|
+
TDD,
|
|
191
|
+
HEXAGONAL,
|
|
192
|
+
LAYERED,
|
|
193
|
+
CLEAN_ARCHITECTURE,
|
|
194
|
+
DDD,
|
|
195
|
+
];
|
|
196
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/disciplines/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface DetectedDiscipline {
|
|
2
|
+
name: string;
|
|
3
|
+
applies: boolean;
|
|
4
|
+
evidence: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface ScoredDiscipline {
|
|
7
|
+
name: string;
|
|
8
|
+
score: 0 | 1 | 2;
|
|
9
|
+
evidence: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function detectApplicableDisciplines(repoPath: string): DetectedDiscipline[];
|
|
12
|
+
export declare function scoreApplicableDisciplines(repoPath: string): ScoredDiscipline[];
|
|
13
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/disciplines/runner.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,GACf,kBAAkB,EAAE,CAKtB;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,GACf,gBAAgB,EAAE,CAapB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disciplines runner — apply the catalog to a concrete repo path.
|
|
3
|
+
*
|
|
4
|
+
* Two entry points:
|
|
5
|
+
* - detectApplicableDisciplines: which disciplines match this codebase?
|
|
6
|
+
* - scoreApplicableDisciplines: of those that match, how well are they
|
|
7
|
+
* followed? Score bodies are skeletons today (see `catalog.ts`); the
|
|
8
|
+
* runner shape is the contract callers can rely on.
|
|
9
|
+
*
|
|
10
|
+
* Detection and scoring are deliberately split so callers can render a
|
|
11
|
+
* "this repo speaks N disciplines" summary without paying for scoring.
|
|
12
|
+
*/
|
|
13
|
+
import { DISCIPLINES } from "./catalog.js";
|
|
14
|
+
export function detectApplicableDisciplines(repoPath) {
|
|
15
|
+
return DISCIPLINES.map((d) => {
|
|
16
|
+
const r = d.detect(repoPath);
|
|
17
|
+
return { name: d.name, applies: r.applies, evidence: r.evidence };
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function scoreApplicableDisciplines(repoPath) {
|
|
21
|
+
const out = [];
|
|
22
|
+
for (const d of DISCIPLINES) {
|
|
23
|
+
const det = d.detect(repoPath);
|
|
24
|
+
if (!det.applies)
|
|
25
|
+
continue;
|
|
26
|
+
const sc = d.score(repoPath);
|
|
27
|
+
out.push({
|
|
28
|
+
name: d.name,
|
|
29
|
+
score: sc.score,
|
|
30
|
+
evidence: [...det.evidence, ...sc.evidence],
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/disciplines/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAc3C,MAAM,UAAU,2BAA2B,CACzC,QAAgB;IAEhB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,QAAgB;IAEhB,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,OAAO;YAAE,SAAS;QAC3B,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../src/registry/composer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,GAAG,EACH,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAW5B,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IAC/C,QAAQ,CAAC,gBAAgB,EAAE,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,cAAc,EAAE,CAAC;IAC3C,uFAAuF;IACvF,QAAQ,CAAC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACvC,gHAAgH;IAChH,QAAQ,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,CAAC;IACxD;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,gBAAgB,EAAE,CAAC;CAC7C;AAED,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,GAAG,EAAE,EACjB,YAAY,EAAE,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,EACtC,OAAO,CAAC,EAAE,cAAc,GACvB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../src/registry/composer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,GAAG,EACH,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAW5B,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IAC/C,QAAQ,CAAC,gBAAgB,EAAE,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,cAAc,EAAE,CAAC;IAC3C,uFAAuF;IACvF,QAAQ,CAAC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACvC,gHAAgH;IAChH,QAAQ,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,CAAC;IACxD;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,gBAAgB,EAAE,CAAC;CAC7C;AAED,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,GAAG,EAAE,EACjB,YAAY,EAAE,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,EACtC,OAAO,CAAC,EAAE,cAAc,GACvB,iBAAiB,CAsKnB"}
|
|
@@ -79,13 +79,18 @@ export function composeTemplates(activeTags, allTemplates, options) {
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
|
-
// Compose hooks (deduplicate by name — not tier-filtered)
|
|
82
|
+
// Compose hooks (deduplicate by name — stack-filtered, not tier-filtered)
|
|
83
83
|
if (templateSet.hooks) {
|
|
84
84
|
for (const hook of templateSet.hooks) {
|
|
85
|
-
if (
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
if (seenHookNames.has(hook.name))
|
|
86
|
+
continue;
|
|
87
|
+
// Skip hooks that declare a stack restriction when no active tag matches
|
|
88
|
+
if (hook.stack?.length &&
|
|
89
|
+
!hook.stack.some((s) => orderedTags.includes(s))) {
|
|
90
|
+
continue;
|
|
88
91
|
}
|
|
92
|
+
seenHookNames.add(hook.name);
|
|
93
|
+
hooks.push(hook);
|
|
89
94
|
}
|
|
90
95
|
}
|
|
91
96
|
// Compose skills (deduplicate by id, filter by tier)
|