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
|
@@ -10,27 +10,84 @@ import { createLogger } from "../shared/logger/index.js";
|
|
|
10
10
|
const logger = createLogger("analyzers/package-json");
|
|
11
11
|
/** Framework/dependency patterns that map to tags. */
|
|
12
12
|
const DEPENDENCY_PATTERNS = [
|
|
13
|
-
{
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
{ packages: ["
|
|
19
|
-
{
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
{
|
|
13
|
+
{
|
|
14
|
+
packages: ["react", "react-dom"],
|
|
15
|
+
tag: "WEB-REACT",
|
|
16
|
+
evidence: "react in dependencies",
|
|
17
|
+
},
|
|
18
|
+
{ packages: ["next"], tag: "WEB-NEXT", evidence: "next.js in dependencies" },
|
|
19
|
+
{
|
|
20
|
+
packages: ["@remix-run/react"],
|
|
21
|
+
tag: "WEB-REACT",
|
|
22
|
+
evidence: "remix in dependencies",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
packages: ["express", "fastify", "koa", "hapi", "nestjs"],
|
|
26
|
+
tag: "API",
|
|
27
|
+
evidence: "HTTP framework in dependencies",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
packages: ["ethers", "web3", "viem", "@solana/web3.js"],
|
|
31
|
+
tag: "WEB3",
|
|
32
|
+
evidence: "blockchain library in dependencies",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
packages: ["socket.io", "ws", "pusher"],
|
|
36
|
+
tag: "REALTIME",
|
|
37
|
+
evidence: "WebSocket library in dependencies",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
packages: ["xstate", "robot3"],
|
|
41
|
+
tag: "STATE-MACHINE",
|
|
42
|
+
evidence: "state machine library in dependencies",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
packages: ["phaser", "pixi.js", "three", "babylon"],
|
|
46
|
+
tag: "GAME",
|
|
47
|
+
evidence: "game engine in dependencies",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
packages: ["commander", "yargs", "meow", "oclif"],
|
|
51
|
+
tag: "CLI",
|
|
52
|
+
evidence: "CLI framework in dependencies",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
packages: ["react-native", "expo"],
|
|
56
|
+
tag: "MOBILE",
|
|
57
|
+
evidence: "mobile framework in dependencies",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
packages: ["@tensorflow/tfjs", "onnxruntime-node"],
|
|
61
|
+
tag: "ML",
|
|
62
|
+
evidence: "ML library in dependencies",
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
packages: ["terraform-cdk", "pulumi", "@aws-cdk"],
|
|
66
|
+
tag: "INFRA",
|
|
67
|
+
evidence: "IaC library in dependencies",
|
|
68
|
+
},
|
|
25
69
|
];
|
|
26
70
|
/** File patterns that indicate tags. Optional confidence overrides the default 0.7. */
|
|
27
71
|
const FILE_PATTERNS = [
|
|
28
|
-
{
|
|
72
|
+
{
|
|
73
|
+
files: ["next.config.js", "next.config.mjs", "next.config.ts"],
|
|
74
|
+
tag: "WEB-NEXT",
|
|
75
|
+
evidence: "next.config found",
|
|
76
|
+
},
|
|
29
77
|
{ files: ["tsconfig.json"], tag: "LIBRARY", evidence: "TypeScript project" },
|
|
30
|
-
{
|
|
78
|
+
{
|
|
79
|
+
files: [".solhint.json", "hardhat.config.ts", "foundry.toml"],
|
|
80
|
+
tag: "WEB3",
|
|
81
|
+
evidence: "smart contract tooling found",
|
|
82
|
+
},
|
|
31
83
|
// Docker alone is insufficient for INFRA — set below 0.6 threshold.
|
|
32
84
|
// IaC deps (terraform-cdk, pulumi, @aws-cdk) in DEPENDENCY_PATTERNS correctly trigger INFRA at 0.6+.
|
|
33
|
-
{
|
|
85
|
+
{
|
|
86
|
+
files: ["Dockerfile", "docker-compose.yml", "docker-compose.yaml"],
|
|
87
|
+
tag: "INFRA",
|
|
88
|
+
evidence: "Docker config found",
|
|
89
|
+
confidence: 0.45,
|
|
90
|
+
},
|
|
34
91
|
];
|
|
35
92
|
/**
|
|
36
93
|
* Analyze a project directory and detect likely tags from config files.
|
|
@@ -124,21 +181,27 @@ function analyzePythonProject(projectDir) {
|
|
|
124
181
|
if (existsSync(pyprojectPath)) {
|
|
125
182
|
try {
|
|
126
183
|
const content = readFileSync(pyprojectPath, "utf-8");
|
|
127
|
-
if (content.includes("fastapi") ||
|
|
184
|
+
if (content.includes("fastapi") ||
|
|
185
|
+
content.includes("flask") ||
|
|
186
|
+
content.includes("django")) {
|
|
128
187
|
detections.push({
|
|
129
188
|
tag: "API",
|
|
130
189
|
confidence: 0.85,
|
|
131
190
|
evidence: ["Python web framework in pyproject.toml"],
|
|
132
191
|
});
|
|
133
192
|
}
|
|
134
|
-
if (content.includes("pandas") ||
|
|
193
|
+
if (content.includes("pandas") ||
|
|
194
|
+
content.includes("apache-airflow") ||
|
|
195
|
+
content.includes("prefect")) {
|
|
135
196
|
detections.push({
|
|
136
197
|
tag: "DATA-PIPELINE",
|
|
137
198
|
confidence: 0.8,
|
|
138
199
|
evidence: ["Data processing library in pyproject.toml"],
|
|
139
200
|
});
|
|
140
201
|
}
|
|
141
|
-
if (content.includes("scikit-learn") ||
|
|
202
|
+
if (content.includes("scikit-learn") ||
|
|
203
|
+
content.includes("torch") ||
|
|
204
|
+
content.includes("tensorflow")) {
|
|
142
205
|
detections.push({
|
|
143
206
|
tag: "ML",
|
|
144
207
|
confidence: 0.85,
|
|
@@ -197,22 +260,119 @@ export function analyzeDescription(description) {
|
|
|
197
260
|
const detections = [];
|
|
198
261
|
const lower = description.toLowerCase();
|
|
199
262
|
const descriptionPatterns = [
|
|
200
|
-
{
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
{
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
{
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
263
|
+
{
|
|
264
|
+
keywords: ["react", "next.js", "nextjs", "frontend", "ui component"],
|
|
265
|
+
tag: "WEB-REACT",
|
|
266
|
+
evidence: "React/frontend mentioned in description",
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
keywords: ["api", "rest", "graphql", "backend", "server", "endpoint"],
|
|
270
|
+
tag: "API",
|
|
271
|
+
evidence: "API/backend mentioned in description",
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
keywords: [
|
|
275
|
+
"blockchain",
|
|
276
|
+
"crypto",
|
|
277
|
+
"defi",
|
|
278
|
+
"web3",
|
|
279
|
+
"solidity",
|
|
280
|
+
"ethereum",
|
|
281
|
+
"smart contract",
|
|
282
|
+
],
|
|
283
|
+
tag: "WEB3",
|
|
284
|
+
evidence: "Blockchain/Web3 mentioned in description",
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
keywords: ["game", "arcade", "gameplay", "player"],
|
|
288
|
+
tag: "GAME",
|
|
289
|
+
evidence: "Game mentioned in description",
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
keywords: [
|
|
293
|
+
"social",
|
|
294
|
+
"networking",
|
|
295
|
+
"linkedin",
|
|
296
|
+
"profile",
|
|
297
|
+
"feed",
|
|
298
|
+
"connection",
|
|
299
|
+
],
|
|
300
|
+
tag: "SOCIAL",
|
|
301
|
+
evidence: "Social features mentioned in description",
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
keywords: ["realtime", "real-time", "websocket", "live", "streaming"],
|
|
305
|
+
tag: "REALTIME",
|
|
306
|
+
evidence: "Real-time features mentioned in description",
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
keywords: ["state machine", "workflow", "finite state", "transition"],
|
|
310
|
+
tag: "STATE-MACHINE",
|
|
311
|
+
evidence: "State machine mentioned in description",
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
keywords: ["cli", "command-line", "command line", "terminal tool"],
|
|
315
|
+
tag: "CLI",
|
|
316
|
+
evidence: "CLI tool mentioned in description",
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
keywords: ["library", "package", "npm", "sdk", "module"],
|
|
320
|
+
tag: "LIBRARY",
|
|
321
|
+
evidence: "Library/package mentioned in description",
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
keywords: ["data pipeline", "etl", "data processing", "batch"],
|
|
325
|
+
tag: "DATA-PIPELINE",
|
|
326
|
+
evidence: "Data pipeline mentioned in description",
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
keywords: [
|
|
330
|
+
"machine learning",
|
|
331
|
+
"ml model",
|
|
332
|
+
"training",
|
|
333
|
+
"inference",
|
|
334
|
+
"neural",
|
|
335
|
+
],
|
|
336
|
+
tag: "ML",
|
|
337
|
+
evidence: "ML mentioned in description",
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
keywords: ["hipaa", "phi", "healthcare", "medical", "patient"],
|
|
341
|
+
tag: "HEALTHCARE",
|
|
342
|
+
evidence: "Healthcare mentioned in description",
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
keywords: ["financial", "fintech", "payment", "transaction", "banking"],
|
|
346
|
+
tag: "FINTECH",
|
|
347
|
+
evidence: "Fintech mentioned in description",
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
keywords: [
|
|
351
|
+
"analytics",
|
|
352
|
+
"dashboard",
|
|
353
|
+
"reporting",
|
|
354
|
+
"metrics",
|
|
355
|
+
"data warehouse",
|
|
356
|
+
],
|
|
357
|
+
tag: "ANALYTICS",
|
|
358
|
+
evidence: "Analytics mentioned in description",
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
keywords: ["mobile", "react native", "flutter", "ios", "android"],
|
|
362
|
+
tag: "MOBILE",
|
|
363
|
+
evidence: "Mobile mentioned in description",
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
keywords: [
|
|
367
|
+
"infrastructure",
|
|
368
|
+
"terraform",
|
|
369
|
+
"kubernetes",
|
|
370
|
+
"devops",
|
|
371
|
+
"deploy",
|
|
372
|
+
],
|
|
373
|
+
tag: "INFRA",
|
|
374
|
+
evidence: "Infrastructure mentioned in description",
|
|
375
|
+
},
|
|
216
376
|
];
|
|
217
377
|
for (const pattern of descriptionPatterns) {
|
|
218
378
|
const found = pattern.keywords.filter((kw) => lower.includes(kw));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../src/analyzers/package-json.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,MAAM,MAAM,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AAStD,sDAAsD;AACtD,MAAM,mBAAmB,GAIpB;IACH,
|
|
1
|
+
{"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../src/analyzers/package-json.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,10 @@ import type { GsPropertyScore } from "../../shared/types.js";
|
|
|
6
6
|
* Score the Composable GS property.
|
|
7
7
|
* 2 = services + repositories + interface files, 1 = services only, 0 = none.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* Project-type aware:
|
|
10
|
+
* - GitHub Actions: composability measured via action.yml interface contract
|
|
11
|
+
* - Libraries/CLIs: composability measured via exported types and public API surface
|
|
12
|
+
* - Web services: conventional service/repository layer split
|
|
11
13
|
*/
|
|
12
14
|
export declare function scoreComposable(projectDir: string, allFiles: string[]): GsPropertyScore;
|
|
13
15
|
//# sourceMappingURL=composable-scorer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composable-scorer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/scorers/composable-scorer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"composable-scorer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/scorers/composable-scorer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAsC7D;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,eAAe,CAmEvF"}
|
|
@@ -4,14 +4,49 @@
|
|
|
4
4
|
import { existsSync } from "node:fs";
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { gs, isSourceCodeFile } from "./scorer-utils.js";
|
|
7
|
+
/**
|
|
8
|
+
* Detect whether a project is a GitHub Action (has action.yml / action.yaml at root).
|
|
9
|
+
* GitHub Actions define their composability contract through action.yml inputs/outputs —
|
|
10
|
+
* a service/repository layer split is not applicable to this project type.
|
|
11
|
+
*/
|
|
12
|
+
function isGitHubAction(projectDir) {
|
|
13
|
+
return existsSync(join(projectDir, "action.yml")) || existsSync(join(projectDir, "action.yaml"));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Detect whether a project is a library, CLI, or standalone tool.
|
|
17
|
+
* These project types expose composability through exported types and interfaces
|
|
18
|
+
* rather than internal service/repository layers.
|
|
19
|
+
*/
|
|
20
|
+
function isLibraryOrCli(projectDir, allFiles) {
|
|
21
|
+
const hasSrc = existsSync(join(projectDir, "src"));
|
|
22
|
+
const root = hasSrc ? join(projectDir, "src") : projectDir;
|
|
23
|
+
// Has a shared/ or types/ directory with source files → library interface pattern
|
|
24
|
+
const hasSharedOrTypes = existsSync(join(root, "shared")) || existsSync(join(root, "types"));
|
|
25
|
+
// Has index.ts at the root of src/ → explicit public API surface (library pattern)
|
|
26
|
+
const hasIndexExport = existsSync(join(root, "index.ts")) || existsSync(join(root, "index.js"));
|
|
27
|
+
// Has a bin/ directory or bin field in package.json → CLI project
|
|
28
|
+
const hasBin = existsSync(join(projectDir, "bin"));
|
|
29
|
+
// No route/controller files anywhere → not a web service
|
|
30
|
+
const hasRouteFiles = allFiles.some((f) => /\/(routes?|controllers?|handlers?|endpoints?|api)\//i.test(f.replace(/\\/g, "/")));
|
|
31
|
+
return !hasRouteFiles && (hasSharedOrTypes || hasIndexExport || hasBin);
|
|
32
|
+
}
|
|
7
33
|
/**
|
|
8
34
|
* Score the Composable GS property.
|
|
9
35
|
* 2 = services + repositories + interface files, 1 = services only, 0 = none.
|
|
10
36
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
37
|
+
* Project-type aware:
|
|
38
|
+
* - GitHub Actions: composability measured via action.yml interface contract
|
|
39
|
+
* - Libraries/CLIs: composability measured via exported types and public API surface
|
|
40
|
+
* - Web services: conventional service/repository layer split
|
|
13
41
|
*/
|
|
14
42
|
export function scoreComposable(projectDir, allFiles) {
|
|
43
|
+
// GitHub Actions define their contract through action.yml — service layers don't apply
|
|
44
|
+
if (isGitHubAction(projectDir)) {
|
|
45
|
+
return gs("composable", 2, [
|
|
46
|
+
"GitHub Action detected — composability contract defined by action.yml inputs/outputs",
|
|
47
|
+
"Interface boundary enforced by the GitHub Actions runner (not an internal service layer)",
|
|
48
|
+
]);
|
|
49
|
+
}
|
|
15
50
|
const hasSrc = existsSync(join(projectDir, "src"));
|
|
16
51
|
const root = hasSrc ? "src" : "";
|
|
17
52
|
const serviceDir = [
|
|
@@ -43,6 +78,19 @@ export function scoreComposable(projectDir, allFiles) {
|
|
|
43
78
|
"No repository layer found — consider extracting DB access to repositories/",
|
|
44
79
|
]);
|
|
45
80
|
}
|
|
81
|
+
// Library/CLI projects: check for public API surface as composability evidence
|
|
82
|
+
if (isLibraryOrCli(projectDir, allFiles)) {
|
|
83
|
+
if (hasInterfaces) {
|
|
84
|
+
return gs("composable", 2, [
|
|
85
|
+
"Library/CLI project — composability measured via exported interface surface",
|
|
86
|
+
"Interface/type files detected — public API contract is explicit",
|
|
87
|
+
]);
|
|
88
|
+
}
|
|
89
|
+
return gs("composable", 1, [
|
|
90
|
+
"Library/CLI project — composability measured via exported interface surface",
|
|
91
|
+
"No dedicated interface/type files found — consider adding types/ or shared/ for explicit contracts",
|
|
92
|
+
]);
|
|
93
|
+
}
|
|
46
94
|
return gs("composable", 0, [
|
|
47
95
|
"No service layer found — business logic likely lives in route handlers",
|
|
48
96
|
"No repository layer found",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composable-scorer.js","sourceRoot":"","sources":["../../../src/analyzers/scorers/composable-scorer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEzD
|
|
1
|
+
{"version":3,"file":"composable-scorer.js","sourceRoot":"","sources":["../../../src/analyzers/scorers/composable-scorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
import type { GsPropertyScore } from "../../shared/types.js";
|
|
5
5
|
/**
|
|
6
6
|
* Score the Executable GS property.
|
|
7
|
-
* 2 = tests passed + CI configured OR verification-state.json with passed steps
|
|
8
|
-
*
|
|
7
|
+
* 2 = tests passed + CI configured OR verification-state.json with passed steps
|
|
8
|
+
* OR tests passed + harness-run.json with ≥1 PASS result AND L2 coverage ≥ 50%.
|
|
9
|
+
* 1 = tests passed locally but no CI, no verification state, or harness exists but 0% passing.
|
|
9
10
|
* 0 = tests failed OR no test infrastructure.
|
|
10
11
|
*/
|
|
11
12
|
export declare function scoreExecutable(projectDir: string, testsPassed: boolean): GsPropertyScore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executable-scorer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/scorers/executable-scorer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"executable-scorer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/scorers/executable-scorer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA8C7D;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,OAAO,GACnB,eAAe,CA8EjB"}
|
|
@@ -4,10 +4,44 @@
|
|
|
4
4
|
import { existsSync, readFileSync } from "node:fs";
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { gs } from "./scorer-utils.js";
|
|
7
|
+
/**
|
|
8
|
+
* Read harness-run.json from .forgecraft/harness-run.json.
|
|
9
|
+
* Returns null when file is missing or unparseable.
|
|
10
|
+
*/
|
|
11
|
+
function readHarnessRun(projectDir) {
|
|
12
|
+
const runJsonPath = join(projectDir, ".forgecraft", "harness-run.json");
|
|
13
|
+
if (!existsSync(runJsonPath))
|
|
14
|
+
return null;
|
|
15
|
+
try {
|
|
16
|
+
const raw = readFileSync(runJsonPath, "utf-8");
|
|
17
|
+
return JSON.parse(raw);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Count total use cases in docs/use-cases.md.
|
|
25
|
+
* Returns 0 when file is missing or unparseable.
|
|
26
|
+
*/
|
|
27
|
+
function countUseCases(projectDir) {
|
|
28
|
+
const useCasesPath = join(projectDir, "docs", "use-cases.md");
|
|
29
|
+
if (!existsSync(useCasesPath))
|
|
30
|
+
return 0;
|
|
31
|
+
try {
|
|
32
|
+
const content = readFileSync(useCasesPath, "utf-8");
|
|
33
|
+
const matches = content.match(/^##\s+UC-\d{3}:/gm);
|
|
34
|
+
return matches?.length ?? 0;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
7
40
|
/**
|
|
8
41
|
* Score the Executable GS property.
|
|
9
|
-
* 2 = tests passed + CI configured OR verification-state.json with passed steps
|
|
10
|
-
*
|
|
42
|
+
* 2 = tests passed + CI configured OR verification-state.json with passed steps
|
|
43
|
+
* OR tests passed + harness-run.json with ≥1 PASS result AND L2 coverage ≥ 50%.
|
|
44
|
+
* 1 = tests passed locally but no CI, no verification state, or harness exists but 0% passing.
|
|
11
45
|
* 0 = tests failed OR no test infrastructure.
|
|
12
46
|
*/
|
|
13
47
|
export function scoreExecutable(projectDir, testsPassed) {
|
|
@@ -34,8 +68,12 @@ export function scoreExecutable(projectDir, testsPassed) {
|
|
|
34
68
|
}
|
|
35
69
|
}
|
|
36
70
|
const ciPaths = [
|
|
37
|
-
".github/workflows",
|
|
38
|
-
"
|
|
71
|
+
".github/workflows",
|
|
72
|
+
".gitlab-ci.yml",
|
|
73
|
+
".circleci/config.yml",
|
|
74
|
+
"Jenkinsfile",
|
|
75
|
+
".travis.yml",
|
|
76
|
+
"azure-pipelines.yml",
|
|
39
77
|
];
|
|
40
78
|
const hasCi = ciPaths.some((p) => existsSync(join(projectDir, p)));
|
|
41
79
|
if (hasCi) {
|
|
@@ -43,9 +81,31 @@ export function scoreExecutable(projectDir, testsPassed) {
|
|
|
43
81
|
"Tests passed + CI pipeline configured (automated runtime execution evidence)",
|
|
44
82
|
]);
|
|
45
83
|
}
|
|
84
|
+
// Harness evidence path
|
|
85
|
+
const harnessRun = readHarnessRun(projectDir);
|
|
86
|
+
if (harnessRun) {
|
|
87
|
+
const totalUcs = countUseCases(projectDir);
|
|
88
|
+
const l2Coverage = totalUcs > 0 ? harnessRun.passed / totalUcs : 0;
|
|
89
|
+
const pct = Math.round(l2Coverage * 100);
|
|
90
|
+
const evidenceLine = pct >= 100
|
|
91
|
+
? `Harness run: ${harnessRun.passed}/${totalUcs} UCs passing (100% L2 coverage) — behavioral contracts verified`
|
|
92
|
+
: `Harness run: ${harnessRun.passed}/${totalUcs} UCs passing (${pct}% L2 coverage) — run more probes for full coverage`;
|
|
93
|
+
if (harnessRun.passed >= 1 && l2Coverage >= 0.5) {
|
|
94
|
+
return gs("executable", 2, [
|
|
95
|
+
"Tests passed + harness execution evidence recorded",
|
|
96
|
+
evidenceLine,
|
|
97
|
+
]);
|
|
98
|
+
}
|
|
99
|
+
// Harness exists but insufficient coverage
|
|
100
|
+
return gs("executable", 1, [
|
|
101
|
+
"Tests passed locally but harness coverage below 50% or 0 probes passing",
|
|
102
|
+
evidenceLine,
|
|
103
|
+
]);
|
|
104
|
+
}
|
|
46
105
|
return gs("executable", 1, [
|
|
47
106
|
"Tests passed locally but no CI configured and no verification-state.json",
|
|
48
107
|
"Local pass is necessary but not sufficient for pre-release — add CI or record_verification steps",
|
|
108
|
+
"No harness-run.json found — run run_harness to generate behavioral execution evidence",
|
|
49
109
|
]);
|
|
50
110
|
}
|
|
51
111
|
//# sourceMappingURL=executable-scorer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executable-scorer.js","sourceRoot":"","sources":["../../../src/analyzers/scorers/executable-scorer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAEvC
|
|
1
|
+
{"version":3,"file":"executable-scorer.js","sourceRoot":"","sources":["../../../src/analyzers/scorers/executable-scorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,9 +8,11 @@ export declare const ROUTE_DIRS: string[];
|
|
|
8
8
|
export declare const DB_CALL_PATTERNS: RegExp[];
|
|
9
9
|
/** Lines that are comments or imports — excluded from DB call detection. */
|
|
10
10
|
export declare const COMMENT_OR_IMPORT: RegExp;
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Keywords that indicate an instruction file covers architecture/conventions/decisions.
|
|
13
|
+
* Intentionally broad to be tech-agnostic: web services, libraries, CLIs,
|
|
14
|
+
* GitHub Actions, and ML projects each use different vocabulary.
|
|
15
|
+
*/
|
|
14
16
|
export declare const INSTRUCTION_COVERAGE_KEYWORDS: string[];
|
|
15
17
|
/** Minimum distinct keyword hits to award score 2 for Self-describing. */
|
|
16
18
|
export declare const MIN_KEYWORD_HITS = 3;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scorer-utils.d.ts","sourceRoot":"","sources":["../../../src/analyzers/scorers/scorer-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"scorer-utils.d.ts","sourceRoot":"","sources":["../../../src/analyzers/scorers/scorer-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,cAAc,EACf,MAAM,uBAAuB,CAAC;AAI/B,iEAAiE;AACjE,eAAO,MAAM,UAAU,UAMtB,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,EAAE,MAAM,EASpC,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,QAA+C,CAAC;AAE9E;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,UAuBzC,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAIlC,sCAAsC;AACtC,wBAAgB,EAAE,CAChB,QAAQ,EAAE,UAAU,EACpB,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAChB,QAAQ,EAAE,MAAM,EAAE,GACjB,eAAe,CAEjB;AAID,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI1D;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAK7D;AAED,6DAA6D;AAC7D,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI/D;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKrD;AAID,6DAA6D;AAC7D,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,cAAc,EAAE,GAC3B,IAAI,CAaN;AAED,gDAAgD;AAChD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,MAAM,CAGR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAMxE"}
|