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
package/dist/tools/add-module.js
CHANGED
|
@@ -60,97 +60,97 @@ function generateTypeScriptModule(moduleDir, moduleName, className, tags) {
|
|
|
60
60
|
const files = [];
|
|
61
61
|
const relBase = `src/modules/${moduleName}`;
|
|
62
62
|
// Types
|
|
63
|
-
const typesContent = `/**
|
|
64
|
-
* ${className} module types.
|
|
65
|
-
*/
|
|
66
|
-
|
|
67
|
-
export interface ${className} {
|
|
68
|
-
readonly id: string;
|
|
69
|
-
// TODO: Define ${className} properties
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export interface Create${className}Input {
|
|
73
|
-
// TODO: Define creation input
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export interface Update${className}Input {
|
|
77
|
-
readonly id: string;
|
|
78
|
-
// TODO: Define update input
|
|
79
|
-
}
|
|
63
|
+
const typesContent = `/**
|
|
64
|
+
* ${className} module types.
|
|
65
|
+
*/
|
|
66
|
+
|
|
67
|
+
export interface ${className} {
|
|
68
|
+
readonly id: string;
|
|
69
|
+
// TODO: Define ${className} properties
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface Create${className}Input {
|
|
73
|
+
// TODO: Define creation input
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface Update${className}Input {
|
|
77
|
+
readonly id: string;
|
|
78
|
+
// TODO: Define update input
|
|
79
|
+
}
|
|
80
80
|
`;
|
|
81
81
|
writeFileSync(join(moduleDir, "types.ts"), typesContent);
|
|
82
82
|
files.push(`${relBase}/types.ts`);
|
|
83
83
|
// Interface
|
|
84
|
-
const interfaceContent = `/**
|
|
85
|
-
* ${className} service interface.
|
|
86
|
-
*
|
|
87
|
-
* Defines the contract — implementations are swappable.
|
|
88
|
-
*/
|
|
89
|
-
|
|
90
|
-
import type { ${className}, Create${className}Input, Update${className}Input } from "./types.js";
|
|
91
|
-
|
|
92
|
-
export interface I${className}Service {
|
|
93
|
-
create(input: Create${className}Input): Promise<${className}>;
|
|
94
|
-
findById(id: string): Promise<${className} | null>;
|
|
95
|
-
update(input: Update${className}Input): Promise<${className}>;
|
|
96
|
-
delete(id: string): Promise<void>;
|
|
97
|
-
}
|
|
84
|
+
const interfaceContent = `/**
|
|
85
|
+
* ${className} service interface.
|
|
86
|
+
*
|
|
87
|
+
* Defines the contract — implementations are swappable.
|
|
88
|
+
*/
|
|
89
|
+
|
|
90
|
+
import type { ${className}, Create${className}Input, Update${className}Input } from "./types.js";
|
|
91
|
+
|
|
92
|
+
export interface I${className}Service {
|
|
93
|
+
create(input: Create${className}Input): Promise<${className}>;
|
|
94
|
+
findById(id: string): Promise<${className} | null>;
|
|
95
|
+
update(input: Update${className}Input): Promise<${className}>;
|
|
96
|
+
delete(id: string): Promise<void>;
|
|
97
|
+
}
|
|
98
98
|
`;
|
|
99
99
|
writeFileSync(join(moduleDir, "interface.ts"), interfaceContent);
|
|
100
100
|
files.push(`${relBase}/interface.ts`);
|
|
101
101
|
// Service implementation
|
|
102
|
-
const serviceContent = `/**
|
|
103
|
-
* ${className} service implementation.
|
|
104
|
-
*/
|
|
105
|
-
|
|
106
|
-
import type { ${className}, Create${className}Input, Update${className}Input } from "./types.js";
|
|
107
|
-
import type { I${className}Service } from "./interface.js";
|
|
108
|
-
|
|
109
|
-
export class ${className}Service implements I${className}Service {
|
|
110
|
-
async create(input: Create${className}Input): Promise<${className}> {
|
|
111
|
-
// TODO: Implement creation logic
|
|
112
|
-
throw new Error("Not implemented");
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
async findById(id: string): Promise<${className} | null> {
|
|
116
|
-
// TODO: Implement find logic
|
|
117
|
-
throw new Error("Not implemented");
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
async update(input: Update${className}Input): Promise<${className}> {
|
|
121
|
-
// TODO: Implement update logic
|
|
122
|
-
throw new Error("Not implemented");
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
async delete(id: string): Promise<void> {
|
|
126
|
-
// TODO: Implement delete logic
|
|
127
|
-
throw new Error("Not implemented");
|
|
128
|
-
}
|
|
129
|
-
}
|
|
102
|
+
const serviceContent = `/**
|
|
103
|
+
* ${className} service implementation.
|
|
104
|
+
*/
|
|
105
|
+
|
|
106
|
+
import type { ${className}, Create${className}Input, Update${className}Input } from "./types.js";
|
|
107
|
+
import type { I${className}Service } from "./interface.js";
|
|
108
|
+
|
|
109
|
+
export class ${className}Service implements I${className}Service {
|
|
110
|
+
async create(input: Create${className}Input): Promise<${className}> {
|
|
111
|
+
// TODO: Implement creation logic
|
|
112
|
+
throw new Error("Not implemented");
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async findById(id: string): Promise<${className} | null> {
|
|
116
|
+
// TODO: Implement find logic
|
|
117
|
+
throw new Error("Not implemented");
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async update(input: Update${className}Input): Promise<${className}> {
|
|
121
|
+
// TODO: Implement update logic
|
|
122
|
+
throw new Error("Not implemented");
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async delete(id: string): Promise<void> {
|
|
126
|
+
// TODO: Implement delete logic
|
|
127
|
+
throw new Error("Not implemented");
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
130
|
`;
|
|
131
131
|
writeFileSync(join(moduleDir, "service.ts"), serviceContent);
|
|
132
132
|
files.push(`${relBase}/service.ts`);
|
|
133
133
|
// Index barrel
|
|
134
|
-
const indexContent = `export type { ${className}, Create${className}Input, Update${className}Input } from "./types.js";
|
|
135
|
-
export type { I${className}Service } from "./interface.js";
|
|
136
|
-
export { ${className}Service } from "./service.js";
|
|
134
|
+
const indexContent = `export type { ${className}, Create${className}Input, Update${className}Input } from "./types.js";
|
|
135
|
+
export type { I${className}Service } from "./interface.js";
|
|
136
|
+
export { ${className}Service } from "./service.js";
|
|
137
137
|
`;
|
|
138
138
|
writeFileSync(join(moduleDir, "index.ts"), indexContent);
|
|
139
139
|
files.push(`${relBase}/index.ts`);
|
|
140
140
|
// API routes if API tag present
|
|
141
141
|
if (tags.includes("API")) {
|
|
142
|
-
const routesContent = `/**
|
|
143
|
-
* ${className} API routes.
|
|
144
|
-
*/
|
|
145
|
-
|
|
146
|
-
// TODO: Register routes with your HTTP framework
|
|
147
|
-
// Example:
|
|
148
|
-
// router.post("/${moduleName}", create${className}Handler);
|
|
149
|
-
// router.get("/${moduleName}/:id", get${className}Handler);
|
|
150
|
-
// router.put("/${moduleName}/:id", update${className}Handler);
|
|
151
|
-
// router.delete("/${moduleName}/:id", delete${className}Handler);
|
|
152
|
-
|
|
153
|
-
export {};
|
|
142
|
+
const routesContent = `/**
|
|
143
|
+
* ${className} API routes.
|
|
144
|
+
*/
|
|
145
|
+
|
|
146
|
+
// TODO: Register routes with your HTTP framework
|
|
147
|
+
// Example:
|
|
148
|
+
// router.post("/${moduleName}", create${className}Handler);
|
|
149
|
+
// router.get("/${moduleName}/:id", get${className}Handler);
|
|
150
|
+
// router.put("/${moduleName}/:id", update${className}Handler);
|
|
151
|
+
// router.delete("/${moduleName}/:id", delete${className}Handler);
|
|
152
|
+
|
|
153
|
+
export {};
|
|
154
154
|
`;
|
|
155
155
|
writeFileSync(join(moduleDir, "routes.ts"), routesContent);
|
|
156
156
|
files.push(`${relBase}/routes.ts`);
|
|
@@ -158,17 +158,17 @@ export {};
|
|
|
158
158
|
// Test file
|
|
159
159
|
const testDir = join(moduleDir, "__tests__");
|
|
160
160
|
mkdirSync(testDir, { recursive: true });
|
|
161
|
-
const testContent = `import { describe, it, expect } from "vitest";
|
|
162
|
-
import { ${className}Service } from "../service.js";
|
|
163
|
-
|
|
164
|
-
describe("${className}Service", () => {
|
|
165
|
-
it("should be defined", () => {
|
|
166
|
-
const service = new ${className}Service();
|
|
167
|
-
expect(service).toBeDefined();
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
// TODO: Add comprehensive tests
|
|
171
|
-
});
|
|
161
|
+
const testContent = `import { describe, it, expect } from "vitest";
|
|
162
|
+
import { ${className}Service } from "../service.js";
|
|
163
|
+
|
|
164
|
+
describe("${className}Service", () => {
|
|
165
|
+
it("should be defined", () => {
|
|
166
|
+
const service = new ${className}Service();
|
|
167
|
+
expect(service).toBeDefined();
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
// TODO: Add comprehensive tests
|
|
171
|
+
});
|
|
172
172
|
`;
|
|
173
173
|
writeFileSync(join(testDir, `${moduleName}.test.ts`), testContent);
|
|
174
174
|
files.push(`${relBase}/__tests__/${moduleName}.test.ts`);
|
|
@@ -185,48 +185,48 @@ function generatePythonModule(moduleDir, moduleName, className, _tags) {
|
|
|
185
185
|
writeFileSync(join(moduleDir, "__init__.py"), `"""${className} module."""\n`);
|
|
186
186
|
files.push(`${relBase}/__init__.py`);
|
|
187
187
|
// models.py
|
|
188
|
-
const modelsContent = `"""${className} data models."""
|
|
189
|
-
|
|
190
|
-
from dataclasses import dataclass
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
@dataclass
|
|
194
|
-
class ${className}:
|
|
195
|
-
id: str
|
|
196
|
-
# TODO: Define ${className} fields
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
@dataclass
|
|
200
|
-
class Create${className}Input:
|
|
201
|
-
# TODO: Define creation input
|
|
202
|
-
pass
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
@dataclass
|
|
206
|
-
class Update${className}Input:
|
|
207
|
-
id: str
|
|
208
|
-
# TODO: Define update input
|
|
188
|
+
const modelsContent = `"""${className} data models."""
|
|
189
|
+
|
|
190
|
+
from dataclasses import dataclass
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
@dataclass
|
|
194
|
+
class ${className}:
|
|
195
|
+
id: str
|
|
196
|
+
# TODO: Define ${className} fields
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
@dataclass
|
|
200
|
+
class Create${className}Input:
|
|
201
|
+
# TODO: Define creation input
|
|
202
|
+
pass
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
@dataclass
|
|
206
|
+
class Update${className}Input:
|
|
207
|
+
id: str
|
|
208
|
+
# TODO: Define update input
|
|
209
209
|
`;
|
|
210
210
|
writeFileSync(join(moduleDir, "models.py"), modelsContent);
|
|
211
211
|
files.push(`${relBase}/models.py`);
|
|
212
212
|
// service.py
|
|
213
|
-
const serviceContent = `"""${className} service."""
|
|
214
|
-
|
|
215
|
-
from .models import ${className}, Create${className}Input, Update${className}Input
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
class ${className}Service:
|
|
219
|
-
async def create(self, input: Create${className}Input) -> ${className}:
|
|
220
|
-
raise NotImplementedError
|
|
221
|
-
|
|
222
|
-
async def find_by_id(self, id: str) -> ${className} | None:
|
|
223
|
-
raise NotImplementedError
|
|
224
|
-
|
|
225
|
-
async def update(self, input: Update${className}Input) -> ${className}:
|
|
226
|
-
raise NotImplementedError
|
|
227
|
-
|
|
228
|
-
async def delete(self, id: str) -> None:
|
|
229
|
-
raise NotImplementedError
|
|
213
|
+
const serviceContent = `"""${className} service."""
|
|
214
|
+
|
|
215
|
+
from .models import ${className}, Create${className}Input, Update${className}Input
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
class ${className}Service:
|
|
219
|
+
async def create(self, input: Create${className}Input) -> ${className}:
|
|
220
|
+
raise NotImplementedError
|
|
221
|
+
|
|
222
|
+
async def find_by_id(self, id: str) -> ${className} | None:
|
|
223
|
+
raise NotImplementedError
|
|
224
|
+
|
|
225
|
+
async def update(self, input: Update${className}Input) -> ${className}:
|
|
226
|
+
raise NotImplementedError
|
|
227
|
+
|
|
228
|
+
async def delete(self, id: str) -> None:
|
|
229
|
+
raise NotImplementedError
|
|
230
230
|
`;
|
|
231
231
|
writeFileSync(join(moduleDir, "service.py"), serviceContent);
|
|
232
232
|
files.push(`${relBase}/service.py`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advice-registry.d.ts","sourceRoot":"","sources":["../../src/tools/advice-registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAI9C,UAAU,SAAS;IACjB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"advice-registry.d.ts","sourceRoot":"","sources":["../../src/tools/advice-registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAI9C,UAAU,SAAS;IACjB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAqPtD,CAAC;AAIF,eAAO,MAAM,UAAU;;;GAYtB,CAAC;AAEF,eAAO,MAAM,UAAU,UAUtB,CAAC;AAIF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,CAuCtD"}
|
|
@@ -5,8 +5,14 @@ export const TAG_ADVICE = {
|
|
|
5
5
|
API: {
|
|
6
6
|
tools: [
|
|
7
7
|
{ layer: "Contract (CDC)", tools: "Pact, Spring Cloud Contract" },
|
|
8
|
-
{
|
|
9
|
-
|
|
8
|
+
{
|
|
9
|
+
layer: "Subcutaneous / API",
|
|
10
|
+
tools: "Supertest (Node), httpx (Python)",
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
layer: "Smoke",
|
|
14
|
+
tools: "Playwright `APIRequestContext` — no browser overhead",
|
|
15
|
+
},
|
|
10
16
|
{ layer: "Security DAST", tools: "OWASP ZAP (staging, pre-prod)" },
|
|
11
17
|
],
|
|
12
18
|
cycleAdditions: [
|
|
@@ -20,8 +26,14 @@ export const TAG_ADVICE = {
|
|
|
20
26
|
},
|
|
21
27
|
"WEB-REACT": {
|
|
22
28
|
tools: [
|
|
23
|
-
{
|
|
24
|
-
|
|
29
|
+
{
|
|
30
|
+
layer: "Component / Unit",
|
|
31
|
+
tools: "@testing-library/react + @testing-library/user-event",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
layer: "Visual Regression",
|
|
35
|
+
tools: "Chromatic or Percy (per Storybook story)",
|
|
36
|
+
},
|
|
25
37
|
{ layer: "a11y", tools: "axe-core + @axe-core/playwright" },
|
|
26
38
|
{ layer: "Smoke", tools: "Playwright (full browser)" },
|
|
27
39
|
],
|
|
@@ -35,6 +47,42 @@ export const TAG_ADVICE = {
|
|
|
35
47
|
],
|
|
36
48
|
smokeNote: "React smoke uses full browser Playwright. Covers: page load + console errors, auth redirect, critical a11y.",
|
|
37
49
|
},
|
|
50
|
+
"WEB-NEXT": {
|
|
51
|
+
tools: [
|
|
52
|
+
{
|
|
53
|
+
layer: "Component / Unit",
|
|
54
|
+
tools: "@testing-library/react + @testing-library/user-event",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
layer: "API Routes",
|
|
58
|
+
tools: "Hurl (contract tests for /api/* routes) or Supertest",
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
layer: "E2E / SSR",
|
|
62
|
+
tools: "Playwright (server-side rendering + hydration verification)",
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
layer: "Performance",
|
|
66
|
+
tools: "Lighthouse CI (Core Web Vitals — LCP, FCP, CLS)",
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
layer: "Bundle",
|
|
70
|
+
tools: "@next/bundle-analyzer + size-limit (first-load JS budget)",
|
|
71
|
+
},
|
|
72
|
+
{ layer: "a11y", tools: "axe-core + @axe-core/playwright" },
|
|
73
|
+
],
|
|
74
|
+
cycleAdditions: [
|
|
75
|
+
"Pre-commit: `next build` exits 0 — catches server/client boundary violations and type errors",
|
|
76
|
+
"Pre-commit: ESLint @next/next/no-img-element — enforces next/image over raw <img>",
|
|
77
|
+
"PR gate: Hurl contract tests for every /api/* route (happy path + 401 + 400)",
|
|
78
|
+
"PR gate: Playwright E2E — SSR pages render with correct data, auth redirect, form submission",
|
|
79
|
+
"PR gate: axe automated a11y on all public routes (0 violations at A/AA level)",
|
|
80
|
+
"PR gate: Bundle size budget — first-load JS ≤ 200kB per page",
|
|
81
|
+
"Staging: Playwright browser smoke — pages load with real data, no hydration errors in console",
|
|
82
|
+
"Staging: Lighthouse CI — Core Web Vitals (LCP < 2.5s, FCP < 1.8s, CLS < 0.1)",
|
|
83
|
+
],
|
|
84
|
+
smokeNote: "Next.js smoke is dual-layer: Playwright for UI/SSR (hydration, auth, data) + Hurl for /api/* contracts. Both are required.",
|
|
85
|
+
},
|
|
38
86
|
"WEB-STATIC": {
|
|
39
87
|
tools: [
|
|
40
88
|
{ layer: "Smoke", tools: "Playwright (full browser)" },
|
|
@@ -49,10 +97,22 @@ export const TAG_ADVICE = {
|
|
|
49
97
|
},
|
|
50
98
|
GAME: {
|
|
51
99
|
tools: [
|
|
52
|
-
{
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
100
|
+
{
|
|
101
|
+
layer: "Headless Unit (Tier 1)",
|
|
102
|
+
tools: "Vitest / Jest — zero browser, pre-commit",
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
layer: "Browser Smoke (Tier 2)",
|
|
106
|
+
tools: "Playwright (full browser — canvas, WebGL)",
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
layer: "Perf Smoke (Tier 3)",
|
|
110
|
+
tools: "Playwright + CDP (`Performance.getMetrics` FPS floor)",
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
layer: "Visual QA Gate",
|
|
114
|
+
tools: "Playwright screenshots + PCA silhouette checks",
|
|
115
|
+
},
|
|
56
116
|
],
|
|
57
117
|
cycleAdditions: [
|
|
58
118
|
"Pre-commit: Headless unit — state machines, physics, scoring, save/load round-trip",
|
|
@@ -78,7 +138,10 @@ export const TAG_ADVICE = {
|
|
|
78
138
|
},
|
|
79
139
|
ML: {
|
|
80
140
|
tools: [
|
|
81
|
-
{
|
|
141
|
+
{
|
|
142
|
+
layer: "Model Evaluation",
|
|
143
|
+
tools: "pytest + metrics assertions (accuracy, F1, AUC floors)",
|
|
144
|
+
},
|
|
82
145
|
{ layer: "Drift Detection", tools: "Evidently AI, Alibi Detect" },
|
|
83
146
|
],
|
|
84
147
|
cycleAdditions: [
|
|
@@ -91,7 +154,10 @@ export const TAG_ADVICE = {
|
|
|
91
154
|
},
|
|
92
155
|
CLI: {
|
|
93
156
|
tools: [
|
|
94
|
-
{
|
|
157
|
+
{
|
|
158
|
+
layer: "Subprocess Integration",
|
|
159
|
+
tools: "execa, child_process, subprocess.run",
|
|
160
|
+
},
|
|
95
161
|
],
|
|
96
162
|
cycleAdditions: [
|
|
97
163
|
"PR gate: Subprocess integration tests — spawns real CLI binary, asserts stdout/stderr/exit code",
|
|
@@ -103,8 +169,14 @@ export const TAG_ADVICE = {
|
|
|
103
169
|
},
|
|
104
170
|
LIBRARY: {
|
|
105
171
|
tools: [
|
|
106
|
-
{
|
|
107
|
-
|
|
172
|
+
{
|
|
173
|
+
layer: "Public API Tests",
|
|
174
|
+
tools: "Test against exported surface only (not internals)",
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
layer: "Multi-version",
|
|
178
|
+
tools: "Matrix test against peer dependency version range",
|
|
179
|
+
},
|
|
108
180
|
],
|
|
109
181
|
cycleAdditions: [
|
|
110
182
|
"PR gate: Test only against the public API surface (barrel exports)",
|
|
@@ -116,7 +188,10 @@ export const TAG_ADVICE = {
|
|
|
116
188
|
},
|
|
117
189
|
REALTIME: {
|
|
118
190
|
tools: [
|
|
119
|
-
{
|
|
191
|
+
{
|
|
192
|
+
layer: "WebSocket / SSE",
|
|
193
|
+
tools: "ws (test client), EventSource, Socket.IO mock",
|
|
194
|
+
},
|
|
120
195
|
],
|
|
121
196
|
cycleAdditions: [
|
|
122
197
|
"PR gate: Reconnect and message ordering tests",
|
|
@@ -127,8 +202,14 @@ export const TAG_ADVICE = {
|
|
|
127
202
|
},
|
|
128
203
|
FINTECH: {
|
|
129
204
|
tools: [
|
|
130
|
-
{
|
|
131
|
-
|
|
205
|
+
{
|
|
206
|
+
layer: "Precision",
|
|
207
|
+
tools: "Decimal arithmetic — never IEEE 754 floats for currency",
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
layer: "Audit Log",
|
|
211
|
+
tools: "Assert every mutation event is logged (completeness test)",
|
|
212
|
+
},
|
|
132
213
|
],
|
|
133
214
|
cycleAdditions: [
|
|
134
215
|
"PR gate: Financial precision tests — decimal arithmetic, rounding mode asserted",
|
|
@@ -140,7 +221,10 @@ export const TAG_ADVICE = {
|
|
|
140
221
|
},
|
|
141
222
|
HEALTHCARE: {
|
|
142
223
|
tools: [
|
|
143
|
-
{
|
|
224
|
+
{
|
|
225
|
+
layer: "PHI Access Control",
|
|
226
|
+
tools: "Integration tests asserting role-based PHI visibility",
|
|
227
|
+
},
|
|
144
228
|
],
|
|
145
229
|
cycleAdditions: [
|
|
146
230
|
"PR gate: PHI field access control — assert non-authorized roles cannot read PHI fields",
|
|
@@ -154,8 +238,14 @@ export const TAG_ADVICE = {
|
|
|
154
238
|
// ── Base quality cycle ─────────────────────────────────────────────────
|
|
155
239
|
export const BASE_TOOLS = [
|
|
156
240
|
{ layer: "Unit (Solitary)", tools: "Vitest / Jest (JS/TS), pytest (Python)" },
|
|
157
|
-
{
|
|
158
|
-
|
|
241
|
+
{
|
|
242
|
+
layer: "Unit (Sociable)",
|
|
243
|
+
tools: "Same runner — allow real, fast non-I/O collaborators",
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
layer: "Integration (DB)",
|
|
247
|
+
tools: "Testcontainers, SQLite in-process, pg-mem",
|
|
248
|
+
},
|
|
159
249
|
{ layer: "Integration (External)", tools: "msw (HTTP stubs), WireMock" },
|
|
160
250
|
{ layer: "SAST", tools: "npm audit, Semgrep, ESLint security plugins, Snyk" },
|
|
161
251
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advice-registry.js","sourceRoot":"","sources":["../../src/tools/advice-registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,MAAM,CAAC,MAAM,UAAU,GAAoC;IACzD,GAAG,EAAE;QACH,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,6BAA6B,EAAE;YACjE,
|
|
1
|
+
{"version":3,"file":"advice-registry.js","sourceRoot":"","sources":["../../src/tools/advice-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advice generation for the session advisor.
|
|
3
|
+
*
|
|
4
|
+
* Converts a ProjectSignals snapshot into a prioritised list of
|
|
5
|
+
* AdviceItems, then formats them as human-readable markdown.
|
|
6
|
+
* Plain-English first — GS vocabulary only when the project is configured.
|
|
7
|
+
*/
|
|
8
|
+
import type { ProjectSignals } from "./advise-session-signals.js";
|
|
9
|
+
export interface AdviceItem {
|
|
10
|
+
readonly priority: "critical" | "high" | "medium" | "low";
|
|
11
|
+
readonly message: string;
|
|
12
|
+
readonly action?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function buildAdviceItems(signals: ProjectSignals, maxItems: number): AdviceItem[];
|
|
15
|
+
export declare function formatAdvice(items: AdviceItem[], recentActivity: string | null): string;
|
|
16
|
+
//# sourceMappingURL=advise-session-advisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-session-advisor.d.ts","sourceRoot":"","sources":["../../src/tools/advise-session-advisor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAIlE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC1D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAwED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,UAAU,EAAE,CAWd;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,EAAE,EACnB,cAAc,EAAE,MAAM,GAAG,IAAI,GAC5B,MAAM,CAaR"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advice generation for the session advisor.
|
|
3
|
+
*
|
|
4
|
+
* Converts a ProjectSignals snapshot into a prioritised list of
|
|
5
|
+
* AdviceItems, then formats them as human-readable markdown.
|
|
6
|
+
* Plain-English first — GS vocabulary only when the project is configured.
|
|
7
|
+
*/
|
|
8
|
+
// ── Priority labels ───────────────────────────────────────────────────
|
|
9
|
+
const LABEL = {
|
|
10
|
+
critical: "[CRITICAL]",
|
|
11
|
+
high: "[HIGH]",
|
|
12
|
+
medium: "[MEDIUM]",
|
|
13
|
+
low: "[LOW]",
|
|
14
|
+
};
|
|
15
|
+
// ── Advice rules ─────────────────────────────────────────────────────
|
|
16
|
+
function violationItems(signals) {
|
|
17
|
+
return signals.topViolations.map((msg) => ({
|
|
18
|
+
priority: "critical",
|
|
19
|
+
message: `Gate violation: ${msg}`,
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
function constitutionItem(signals) {
|
|
23
|
+
if (signals.hasConstitution)
|
|
24
|
+
return null;
|
|
25
|
+
return {
|
|
26
|
+
priority: "high",
|
|
27
|
+
message: "No AI rules file found (CLAUDE.md / .clinerules / .windsurfrules / copilot-instructions.md / CONVENTIONS.md) — the assistant has no project rules to follow.",
|
|
28
|
+
action: 'Run forgecraft_actions { action: "setup_project" } to generate the right file for your agent.',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function testItem(signals) {
|
|
32
|
+
if (!signals.hasSourceCode || signals.hasTests)
|
|
33
|
+
return null;
|
|
34
|
+
return {
|
|
35
|
+
priority: "high",
|
|
36
|
+
message: "No test directory found — bugs accumulate silently without a test suite.",
|
|
37
|
+
action: "Add a tests/ directory and write at least one test before the next commit.",
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function schemaItem(signals) {
|
|
41
|
+
if (!signals.hasSourceCode || signals.hasSchema)
|
|
42
|
+
return null;
|
|
43
|
+
return {
|
|
44
|
+
priority: "medium",
|
|
45
|
+
message: "No schema artifact found — the system vocabulary (API, DB, events) is implicit.",
|
|
46
|
+
action: "Add openapi.yaml, prisma/schema.prisma, or docs/schemas/ to make contracts explicit.",
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function specItem(signals) {
|
|
50
|
+
if (signals.hasSpec)
|
|
51
|
+
return null;
|
|
52
|
+
return {
|
|
53
|
+
priority: "medium",
|
|
54
|
+
message: "No spec or PRD found — intent exists only in contributor heads.",
|
|
55
|
+
action: "Add docs/specs/PRD.md describing what the project does and why.",
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function greenItem() {
|
|
59
|
+
return {
|
|
60
|
+
priority: "low",
|
|
61
|
+
message: "Project looks healthy — no missing artifacts or active gate violations detected.",
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// ── Public API ───────────────────────────────────────────────────────
|
|
65
|
+
export function buildAdviceItems(signals, maxItems) {
|
|
66
|
+
const candidates = [
|
|
67
|
+
...violationItems(signals),
|
|
68
|
+
constitutionItem(signals),
|
|
69
|
+
testItem(signals),
|
|
70
|
+
schemaItem(signals),
|
|
71
|
+
specItem(signals),
|
|
72
|
+
].filter((i) => i !== null);
|
|
73
|
+
if (candidates.length === 0)
|
|
74
|
+
return [greenItem()];
|
|
75
|
+
return candidates.slice(0, maxItems);
|
|
76
|
+
}
|
|
77
|
+
export function formatAdvice(items, recentActivity) {
|
|
78
|
+
const lines = ["## Session Advisor", ""];
|
|
79
|
+
if (recentActivity) {
|
|
80
|
+
lines.push(`**Last commit:** ${recentActivity}`, "");
|
|
81
|
+
}
|
|
82
|
+
for (const item of items) {
|
|
83
|
+
lines.push(`${LABEL[item.priority]} ${item.message}`);
|
|
84
|
+
if (item.action)
|
|
85
|
+
lines.push(` → ${item.action}`);
|
|
86
|
+
}
|
|
87
|
+
return lines.join("\n");
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=advise-session-advisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-session-advisor.js","sourceRoot":"","sources":["../../src/tools/advise-session-advisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project signal reader for the session advisor.
|
|
3
|
+
*
|
|
4
|
+
* Reads filesystem state and active gate violations to produce a
|
|
5
|
+
* ProjectSignals snapshot. Intentionally fast — no git subprocess,
|
|
6
|
+
* no cascade execution. Used both by the MCP action and the shell hook.
|
|
7
|
+
*/
|
|
8
|
+
export interface ProjectSignals {
|
|
9
|
+
readonly hasConfig: boolean;
|
|
10
|
+
readonly hasConstitution: boolean;
|
|
11
|
+
readonly hasSpec: boolean;
|
|
12
|
+
readonly hasAdrs: boolean;
|
|
13
|
+
readonly hasTests: boolean;
|
|
14
|
+
readonly hasSchema: boolean;
|
|
15
|
+
readonly hasSourceCode: boolean;
|
|
16
|
+
readonly activeViolationCount: number;
|
|
17
|
+
readonly topViolations: readonly string[];
|
|
18
|
+
readonly recentActivity: string | null;
|
|
19
|
+
}
|
|
20
|
+
export declare function readProjectSignals(projectDir: string): ProjectSignals;
|
|
21
|
+
//# sourceMappingURL=advise-session-signals.d.ts.map
|