forgecraft-mcp 1.3.2 → 1.6.1
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/README.md +2 -2
- 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/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/artifacts/commit-hooks.d.ts +1 -1
- package/dist/artifacts/commit-hooks.d.ts.map +1 -1
- package/dist/artifacts/commit-hooks.js +2 -0
- package/dist/artifacts/commit-hooks.js.map +1 -1
- package/dist/cli/commands.d.ts +35 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +109 -2
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +7 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- 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/remote-gates.js +1 -1
- package/dist/registry/remote-gates.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.map +1 -1
- package/dist/shared/cnt-health.js +12 -4
- package/dist/shared/cnt-health.js.map +1 -1
- package/dist/shared/config.d.ts +8 -0
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js +23 -0
- package/dist/shared/config.js.map +1 -1
- 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/result-utils.d.ts +27 -0
- package/dist/shared/result-utils.d.ts.map +1 -0
- package/dist/shared/result-utils.js +41 -0
- package/dist/shared/result-utils.js.map +1 -0
- 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 +28 -0
- package/dist/shared/types/gates.d.ts.map +1 -1
- package/dist/shared/types/project.d.ts +66 -0
- package/dist/shared/types/project.d.ts.map +1 -1
- package/dist/shared/types/project.js.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/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/change-request.d.ts +53 -0
- package/dist/tools/change-request.d.ts.map +1 -0
- package/dist/tools/change-request.js +375 -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.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-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-helpers.d.ts +21 -2
- package/dist/tools/close-cycle-helpers.d.ts.map +1 -1
- package/dist/tools/close-cycle-helpers.js +66 -10
- package/dist/tools/close-cycle-helpers.js.map +1 -1
- package/dist/tools/close-cycle.d.ts +2 -2
- package/dist/tools/close-cycle.d.ts.map +1 -1
- package/dist/tools/close-cycle.js +342 -4
- package/dist/tools/close-cycle.js.map +1 -1
- package/dist/tools/consolidate-status.d.ts +112 -0
- package/dist/tools/consolidate-status.d.ts.map +1 -0
- package/dist/tools/consolidate-status.js +356 -0
- package/dist/tools/consolidate-status.js.map +1 -0
- 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 +332 -0
- package/dist/tools/executable-gates.js.map +1 -0
- package/dist/tools/forgecraft-dispatch-extended.d.ts.map +1 -1
- package/dist/tools/forgecraft-dispatch-extended.js +75 -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 +21 -0
- package/dist/tools/forgecraft-dispatch.js.map +1 -1
- package/dist/tools/forgecraft-router.d.ts +8 -0
- package/dist/tools/forgecraft-router.d.ts.map +1 -1
- package/dist/tools/forgecraft-router.js +21 -1
- package/dist/tools/forgecraft-router.js.map +1 -1
- package/dist/tools/forgecraft-schema-params.d.ts +61 -4
- package/dist/tools/forgecraft-schema-params.d.ts.map +1 -1
- package/dist/tools/forgecraft-schema-params.js +95 -0
- package/dist/tools/forgecraft-schema-params.js.map +1 -1
- package/dist/tools/forgecraft-schema.d.ts +62 -5
- package/dist/tools/forgecraft-schema.d.ts.map +1 -1
- package/dist/tools/forgecraft-schema.js +24 -0
- package/dist/tools/forgecraft-schema.js.map +1 -1
- package/dist/tools/gate-violations.d.ts +59 -0
- package/dist/tools/gate-violations.d.ts.map +1 -0
- package/dist/tools/gate-violations.js +152 -0
- package/dist/tools/gate-violations.js.map +1 -0
- package/dist/tools/generate-adr.js +6 -6
- package/dist/tools/generate-adr.js.map +1 -1
- 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 +52 -0
- package/dist/tools/generate-harness.d.ts.map +1 -0
- package/dist/tools/generate-harness.js +333 -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 +4 -4
- package/dist/tools/generate-session-prompt.d.ts.map +1 -1
- package/dist/tools/generate-session-prompt.js +66 -16
- 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 +133 -0
- package/dist/tools/layer-status.d.ts.map +1 -0
- package/dist/tools/layer-status.js +593 -0
- package/dist/tools/layer-status.js.map +1 -0
- 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/roadmap-builder.d.ts +34 -1
- package/dist/tools/roadmap-builder.d.ts.map +1 -1
- package/dist/tools/roadmap-builder.js +153 -11
- 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-writer.d.ts.map +1 -1
- package/dist/tools/scaffold-writer.js +4 -0
- package/dist/tools/scaffold-writer.js.map +1 -1
- 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 +111 -14
- 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-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/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 +11 -2
- package/templates/api/harness/uc-template.hurl +20 -0
- package/templates/docs-manifest.yaml +224 -0
- package/templates/game/harness/uc-template.sim.ts +29 -0
- 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 +212 -20
- package/templates/web-react/harness/uc-template.spec.ts +35 -0
package/dist/tools/verify.js
CHANGED
|
@@ -16,6 +16,7 @@ import { scoreGsProperties, findDirectDbCallsInRoutes, findMissingTestFiles, } f
|
|
|
16
16
|
import { analyzeProject } from "../analyzers/package-json.js";
|
|
17
17
|
import { loadUserOverrides } from "../registry/loader.js";
|
|
18
18
|
import { formatReport } from "./verify-formatter.js";
|
|
19
|
+
import { computeMaturityTier } from "../shared/types.js";
|
|
19
20
|
// ── Schema ─────────────────────────────────────────────────────────────
|
|
20
21
|
export const verifySchema = z.object({
|
|
21
22
|
project_dir: z
|
|
@@ -56,6 +57,7 @@ export async function verifyHandler(args) {
|
|
|
56
57
|
const propertyScores = scoreGsProperties(projectDir, testSuite.passed, layerViolations, missingTestFiles);
|
|
57
58
|
const totalScore = propertyScores.reduce((sum, p) => sum + p.score, 0);
|
|
58
59
|
const overallPass = testSuite.passed && totalScore >= args.pass_threshold;
|
|
60
|
+
const maturityTier = computeMaturityTier(totalScore);
|
|
59
61
|
const result = {
|
|
60
62
|
testSuite,
|
|
61
63
|
propertyScores,
|
|
@@ -63,6 +65,7 @@ export async function verifyHandler(args) {
|
|
|
63
65
|
layerViolations,
|
|
64
66
|
missingTestFiles,
|
|
65
67
|
overallPass,
|
|
68
|
+
maturityTier,
|
|
66
69
|
};
|
|
67
70
|
const report = formatReport(result, args.pass_threshold);
|
|
68
71
|
const driftWarning = detectTagDrift(projectDir);
|
package/dist/tools/verify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/tools/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/tools/verify.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "forgecraft-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.1",
|
|
4
4
|
"mcpName": "io.github.jghiringhelli/forgecraft",
|
|
5
5
|
"description": "CLI + MCP sentinel for engineering standards — SOLID, testing, architecture, CI/CD — auto-tailored to your stack. Minimal MCP footprint (~200 tokens) via CLI-first design.",
|
|
6
6
|
"type": "module",
|
|
@@ -19,11 +19,17 @@
|
|
|
19
19
|
"test:mutation": "stryker run",
|
|
20
20
|
"test:mutation:ci": "stryker run --reporters progress,clear-text",
|
|
21
21
|
"test:mutation:sentinel": "stryker run stryker.sentinel.json",
|
|
22
|
+
"test:mutation:brownfield": "stryker run stryker.brownfield.json",
|
|
22
23
|
"lint": "eslint src/",
|
|
24
|
+
"ship": "bash scripts/ship.sh",
|
|
25
|
+
"protect": "bash scripts/protect-branch.sh",
|
|
26
|
+
"audit:tests": "node scripts/audit-tests.cjs",
|
|
27
|
+
"post-results": "node scripts/post-results.cjs",
|
|
23
28
|
"clean": "rimraf dist",
|
|
24
29
|
"prepare": "node -e \"if(require('fs').existsSync('.git')&&require('fs').existsSync('scripts/setup-hooks.sh')){require('child_process').execSync('bash scripts/setup-hooks.sh',{stdio:'inherit'})}\"",
|
|
25
30
|
"prepublishOnly": "npm run clean && npm run build",
|
|
26
|
-
"export:taxonomy": "npx ts-node --esm scripts/export-taxonomy.ts"
|
|
31
|
+
"export:taxonomy": "npx ts-node --esm scripts/export-taxonomy.ts",
|
|
32
|
+
"docs:generate": "typedoc"
|
|
27
33
|
},
|
|
28
34
|
"keywords": [
|
|
29
35
|
"mcp",
|
|
@@ -70,6 +76,8 @@
|
|
|
70
76
|
"zod": "^3.24.2"
|
|
71
77
|
},
|
|
72
78
|
"devDependencies": {
|
|
79
|
+
"@commitlint/cli": "^19.8.1",
|
|
80
|
+
"@commitlint/config-conventional": "^19.8.1",
|
|
73
81
|
"@stryker-mutator/core": "^9.6.0",
|
|
74
82
|
"@stryker-mutator/vitest-runner": "^9.6.0",
|
|
75
83
|
"@types/express": "^5.0.6",
|
|
@@ -83,6 +91,7 @@
|
|
|
83
91
|
"express": "^5.2.1",
|
|
84
92
|
"rimraf": "^6.0.1",
|
|
85
93
|
"supertest": "^7.2.2",
|
|
94
|
+
"typedoc": "^0.28.19",
|
|
86
95
|
"typescript": "^5.7.3",
|
|
87
96
|
"vitest": "^3.0.5"
|
|
88
97
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# L2 Harness: {{uc_id}} — {{uc_title}}
|
|
2
|
+
# Actor: {{actor}}
|
|
3
|
+
# Precondition: {{precondition}}
|
|
4
|
+
# Postcondition: {{postcondition}}
|
|
5
|
+
#
|
|
6
|
+
# This is a behavioral harness probe. A failure is a specification violation.
|
|
7
|
+
# Implement the main flow steps from the use case below.
|
|
8
|
+
|
|
9
|
+
# Step 1: [precondition setup if needed]
|
|
10
|
+
# POST http://{{host}}/api/auth/login
|
|
11
|
+
# ...
|
|
12
|
+
|
|
13
|
+
# Step 2: [primary action]
|
|
14
|
+
# TODO: implement UC main flow as HTTP sequence
|
|
15
|
+
GET http://{{host}}/api/endpoint
|
|
16
|
+
Authorization: Bearer {{token}}
|
|
17
|
+
|
|
18
|
+
HTTP 200
|
|
19
|
+
[Asserts]
|
|
20
|
+
# jsonpath "$.field" == "expected_value"
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# docs-manifest.yaml — canonical schema for the GS document taxonomy
|
|
2
|
+
#
|
|
3
|
+
# This file is the SINGLE SOURCE OF TRUTH for the document layout that all
|
|
4
|
+
# Pragmaworks GS-aware tools (forgecraft, chronicle, chronicle-team) honor.
|
|
5
|
+
# Projects do NOT copy this file. They write their own ./docs/manifest.yaml
|
|
6
|
+
# which references this canonical schema and overrides paths where needed.
|
|
7
|
+
#
|
|
8
|
+
# Canonical location:
|
|
9
|
+
# github.com/jghiringhelli/forgecraft-mcp/templates/docs-manifest.yaml
|
|
10
|
+
# (also reachable via the forgecraft npm package)
|
|
11
|
+
#
|
|
12
|
+
# A project's docs/manifest.yaml LOOKS LIKE:
|
|
13
|
+
#
|
|
14
|
+
# schema_source: forgecraft@1.5.0/templates/docs-manifest.yaml
|
|
15
|
+
# project:
|
|
16
|
+
# name: my-app
|
|
17
|
+
# type: api
|
|
18
|
+
# overrides:
|
|
19
|
+
# documents.specs.path: docs/product/ # legacy layout, mapped in
|
|
20
|
+
# documents.use_cases.path: docs/uc/
|
|
21
|
+
#
|
|
22
|
+
# Tools resolve paths in this order:
|
|
23
|
+
# 1. project's docs/manifest.yaml `overrides:` block (highest priority)
|
|
24
|
+
# 2. project's docs/manifest.yaml top-level fields
|
|
25
|
+
# 3. this canonical schema's defaults
|
|
26
|
+
#
|
|
27
|
+
# That is what "back-compat" means here: the canonical layout is the default;
|
|
28
|
+
# legacy projects map their existing files into the schema via overrides.
|
|
29
|
+
|
|
30
|
+
version: 1
|
|
31
|
+
|
|
32
|
+
# ── Project metadata ─────────────────────────────────────────────────────
|
|
33
|
+
project:
|
|
34
|
+
name: <required> # human-readable project name
|
|
35
|
+
type: <required> # library | cli | api | service | app | tool
|
|
36
|
+
release_phase: greenfield # greenfield | brownfield | maintenance
|
|
37
|
+
|
|
38
|
+
# ── Document types and their canonical locations ─────────────────────────
|
|
39
|
+
# Each entry defines:
|
|
40
|
+
# path — where files live (or active_path/done_path for archived types)
|
|
41
|
+
# pattern — glob applied for discovery
|
|
42
|
+
# required_on — conventional-commit types that MUST touch a file in this slot
|
|
43
|
+
# archive_when (optional) — when files move from active_path to done_path
|
|
44
|
+
documents:
|
|
45
|
+
|
|
46
|
+
# SPECS — what we are building (product/use-case-driven specs)
|
|
47
|
+
specs:
|
|
48
|
+
path: docs/specs/
|
|
49
|
+
pattern: "*.md"
|
|
50
|
+
required_on: [feat, refactor]
|
|
51
|
+
description: >
|
|
52
|
+
Product-level specs. One per feature or major capability.
|
|
53
|
+
Answers: what does the user do, what outcome do they want, what is in/out of scope?
|
|
54
|
+
|
|
55
|
+
# ADRs — architectural decision records (how we build, with rationale)
|
|
56
|
+
adrs:
|
|
57
|
+
active_path: docs/adrs/active/
|
|
58
|
+
done_path: docs/adrs/done/
|
|
59
|
+
pattern: "ADR-*.md"
|
|
60
|
+
required_on: [] # encouraged on feat/refactor when a decision is made
|
|
61
|
+
archive_when: superseded
|
|
62
|
+
description: >
|
|
63
|
+
Architectural Decision Records. One file per decision (e.g. ADR-0007-pick-postgres.md).
|
|
64
|
+
Active = currently in force. Done = superseded or rolled back, kept for history.
|
|
65
|
+
|
|
66
|
+
# USE CASES — actor + action + outcome (executable scenarios)
|
|
67
|
+
use_cases:
|
|
68
|
+
path: docs/use-cases/
|
|
69
|
+
pattern: "UC-*.md"
|
|
70
|
+
required_on: [feat]
|
|
71
|
+
description: >
|
|
72
|
+
Executable use cases. Each one: actor, preconditions, steps, expected outcome.
|
|
73
|
+
These bind specs to harness/tests.
|
|
74
|
+
|
|
75
|
+
# ROADMAPS — planned/active/done work items
|
|
76
|
+
roadmaps:
|
|
77
|
+
active_path: docs/roadmaps/active/
|
|
78
|
+
done_path: docs/roadmaps/done/
|
|
79
|
+
pattern: "RM-*.md"
|
|
80
|
+
required_on: [] # roadmap items are pulled from tickets/issues, not commits
|
|
81
|
+
archive_when: implemented
|
|
82
|
+
description: >
|
|
83
|
+
Roadmap items. One file per planned chunk of work (e.g. RM-0042-add-oauth.md).
|
|
84
|
+
Active = open. Done = shipped (kept for history and changelog generation).
|
|
85
|
+
|
|
86
|
+
# SCHEMAS — diagrams, data schemas, API schemas
|
|
87
|
+
schemas:
|
|
88
|
+
path: docs/schemas/
|
|
89
|
+
pattern: "*.{md,mmd,json,yaml}"
|
|
90
|
+
required_on: [feat]
|
|
91
|
+
description: >
|
|
92
|
+
Mermaid diagrams (.mmd or fenced .md), JSON Schema, OpenAPI specs, ER diagrams.
|
|
93
|
+
Required when data model or API surface changes.
|
|
94
|
+
|
|
95
|
+
# DECISIONS — lightweight bug-fix or operational decisions
|
|
96
|
+
decisions:
|
|
97
|
+
path: docs/decisions/
|
|
98
|
+
pattern: "*.md"
|
|
99
|
+
required_on: [] # optional even on fix; encouraged when behavior is intentionally redefined
|
|
100
|
+
description: >
|
|
101
|
+
One-pager rationale for non-architectural decisions: bug-fix interpretations,
|
|
102
|
+
operational tweaks, "we chose X over Y because Z" notes that don't warrant a full ADR.
|
|
103
|
+
Filename pattern: YYYY-MM-DD-slug.md.
|
|
104
|
+
|
|
105
|
+
# CONTRACTS — behavioral contracts (what the system promises)
|
|
106
|
+
contracts:
|
|
107
|
+
path: docs/contracts/
|
|
108
|
+
pattern: "*.{md,yaml}"
|
|
109
|
+
required_on: []
|
|
110
|
+
description: >
|
|
111
|
+
Behavioral contracts. NFRs, SLOs, API contracts, error semantics.
|
|
112
|
+
Often referenced from specs and ADRs.
|
|
113
|
+
|
|
114
|
+
# SESSION PROMPTS — bound to roadmap items (forgecraft + chronicle convention)
|
|
115
|
+
session_prompts:
|
|
116
|
+
path: docs/session-prompts/
|
|
117
|
+
pattern: "RM-*.md"
|
|
118
|
+
required_on: []
|
|
119
|
+
description: >
|
|
120
|
+
Per-roadmap-item prompts that drive AI sessions. One per RM-* item.
|
|
121
|
+
Generated by forgecraft propose_session, executed by chronicle.
|
|
122
|
+
|
|
123
|
+
# ── Cascade rules — which commit types require which doc updates ─────────
|
|
124
|
+
# These are enforced by:
|
|
125
|
+
# - .claude/hooks/pre-commit-doc-cascade.sh (local, advisory)
|
|
126
|
+
# - .github/workflows/validate-pr.yml (CI, blocking when severity=error)
|
|
127
|
+
#
|
|
128
|
+
# Severity:
|
|
129
|
+
# error — blocks commit/PR
|
|
130
|
+
# warning — emits a notice; does not block
|
|
131
|
+
# info — logs only
|
|
132
|
+
cascade:
|
|
133
|
+
feat:
|
|
134
|
+
required: [specs]
|
|
135
|
+
encouraged: [use_cases, schemas, adrs]
|
|
136
|
+
severity: warning # bump to error once a project's baseline is clean
|
|
137
|
+
|
|
138
|
+
fix:
|
|
139
|
+
required: [] # no doc requirement; regression test is mandatory (see human_judgment)
|
|
140
|
+
encouraged: [decisions]
|
|
141
|
+
require_regression_test: true
|
|
142
|
+
severity: warning
|
|
143
|
+
|
|
144
|
+
refactor:
|
|
145
|
+
required: []
|
|
146
|
+
encouraged: [adrs, decisions]
|
|
147
|
+
severity: info
|
|
148
|
+
|
|
149
|
+
perf:
|
|
150
|
+
required: []
|
|
151
|
+
encouraged: [decisions, schemas]
|
|
152
|
+
severity: info
|
|
153
|
+
|
|
154
|
+
docs:
|
|
155
|
+
required: []
|
|
156
|
+
encouraged: []
|
|
157
|
+
severity: info
|
|
158
|
+
|
|
159
|
+
test:
|
|
160
|
+
required: []
|
|
161
|
+
encouraged: []
|
|
162
|
+
severity: info
|
|
163
|
+
|
|
164
|
+
chore:
|
|
165
|
+
required: []
|
|
166
|
+
encouraged: []
|
|
167
|
+
severity: info
|
|
168
|
+
|
|
169
|
+
ci:
|
|
170
|
+
required: []
|
|
171
|
+
encouraged: []
|
|
172
|
+
severity: info
|
|
173
|
+
|
|
174
|
+
revert:
|
|
175
|
+
required: []
|
|
176
|
+
encouraged: [decisions]
|
|
177
|
+
severity: info
|
|
178
|
+
|
|
179
|
+
# ── Anti-drift — public API surface enforcement ─────────────────────────
|
|
180
|
+
# When the public surface changes (exports, public types, CLI flags, MCP tool
|
|
181
|
+
# schemas), a spec or ADR touch is required regardless of commit type.
|
|
182
|
+
api_surface:
|
|
183
|
+
detect:
|
|
184
|
+
typescript:
|
|
185
|
+
exports_glob: "src/**/index.ts"
|
|
186
|
+
public_types_glob: "src/types/**/*.ts"
|
|
187
|
+
cli:
|
|
188
|
+
flags_glob: "src/cli/**/*.ts"
|
|
189
|
+
mcp:
|
|
190
|
+
tools_glob: "src/tools/**/*.ts"
|
|
191
|
+
on_change_require: [specs, adrs]
|
|
192
|
+
severity: warning
|
|
193
|
+
|
|
194
|
+
# ── Human-judgment gate — "no untested or unreviewed code to prod" ──────
|
|
195
|
+
human_judgment:
|
|
196
|
+
protected_branches: [main, develop]
|
|
197
|
+
require_review: true
|
|
198
|
+
min_reviewers: 1 # set 0 for solo mode (still requires PR + checks)
|
|
199
|
+
require_tests_pass: true # CI must show tests green
|
|
200
|
+
require_human_ack: true # at least one human comment/approval on the PR
|
|
201
|
+
block_ai_only_merge: true # disallow merge when only the PR author has interacted
|
|
202
|
+
|
|
203
|
+
# ── Recording layers — three-tier memory contract ───────────────────────
|
|
204
|
+
# This block is informational. It documents how project / individual / team
|
|
205
|
+
# memory split across tools, so each tool knows its lane.
|
|
206
|
+
recording:
|
|
207
|
+
project:
|
|
208
|
+
owner: forgecraft
|
|
209
|
+
surface: docs/* + .forgecraft/* + .claude/hooks/*
|
|
210
|
+
scope: cascade docs, gates, hooks, harness contracts
|
|
211
|
+
individual:
|
|
212
|
+
owner: chronicle
|
|
213
|
+
surface: ~/.chronicle/ (per-user memory store)
|
|
214
|
+
scope: prompt history, decisions, findings, developer habits, work style
|
|
215
|
+
team:
|
|
216
|
+
owner: chronicle-team
|
|
217
|
+
surface: shared DB (Railway) + dashboard
|
|
218
|
+
scope: shared memory, prompt analytics, ticket integration, workload split (axon)
|
|
219
|
+
|
|
220
|
+
# ── Brownfield ingestion settings ───────────────────────────────────────
|
|
221
|
+
brownfield:
|
|
222
|
+
scanner: pragmaworks-cli # external tool, not embedded
|
|
223
|
+
override_file: docs/manifest.yaml # generated/edited during ingestion
|
|
224
|
+
report_path: reports/brownfield-audit.md
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L2 Harness: {{uc_id}} — {{uc_title}}
|
|
3
|
+
*
|
|
4
|
+
* Headless simulation probe — verifies behavioral invariants without rendering.
|
|
5
|
+
* Runs the use case scenario through the game engine in headless mode.
|
|
6
|
+
* Failure = specification violation.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
// TODO: Import your game engine / simulation module
|
|
10
|
+
// import { GameEngine } from '../../src/engine';
|
|
11
|
+
|
|
12
|
+
async function runProbe(): Promise<void> {
|
|
13
|
+
// Set up precondition: {{precondition}}
|
|
14
|
+
// const engine = new GameEngine({ headless: true });
|
|
15
|
+
|
|
16
|
+
// Execute main flow: {{main_flow_summary}}
|
|
17
|
+
|
|
18
|
+
// Assert postcondition: {{postcondition}}
|
|
19
|
+
// if (!engine.state.matches(expectedState)) {
|
|
20
|
+
// throw new Error(`UC postcondition violated: ${engine.state}`);
|
|
21
|
+
// }
|
|
22
|
+
|
|
23
|
+
throw new Error("Not implemented: add simulation scenario for {{uc_id}}");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
runProbe().catch((err) => {
|
|
27
|
+
console.error(err);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
## Layer Navigation Protocol
|
|
2
|
+
|
|
3
|
+
ForgeCraft tracks automation depth across four active layers. Before beginning
|
|
4
|
+
implementation work, call `layer_status` to understand the current state.
|
|
5
|
+
|
|
6
|
+
| Layer | What it means | How to advance |
|
|
7
|
+
|---|---|---|
|
|
8
|
+
| **L1 Blueprint** | Use case documented + implementation + tests | Write formal UC, implement, add tests |
|
|
9
|
+
| **L2 Harness** | Use case has executable probe in `.forgecraft/harness/` | Create `uc-NNN.yaml` with probe definitions |
|
|
10
|
+
| **L3 Environment** | All infra state derivable from spec | Add CI, Dockerfile, env schema to spec |
|
|
11
|
+
| **L4 Monitoring** | Runtime drift evaluated against spec | Add health probes, drift detection config |
|
|
12
|
+
|
|
13
|
+
**Layer completion is a spec gap, not a todo list.** A missing L2 probe is not
|
|
14
|
+
something to schedule — it is an incomplete grammar. The gate fires until the probe exists.
|
|
15
|
+
|
|
16
|
+
**L2 probe types available**: `mcp_call`, `playwright`, `api_call`, `db_query`,
|
|
17
|
+
`file_system`, `headless_sim`
|
|
18
|
+
|
|
19
|
+
**To add a probe**: create `.forgecraft/harness/uc-NNN.yaml` following the format
|
|
20
|
+
in any existing probe file. One probe is enough to move a UC from ❌ to ✅.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
## Non-Functional Requirement Contracts
|
|
2
|
+
|
|
3
|
+
Declare SLA and throughput obligations as measurable assertions.
|
|
4
|
+
Aspirations ("should be fast") are not contracts. Each row is machine-checkable.
|
|
5
|
+
|
|
6
|
+
<!-- Fill in actual values before pre-release. -->
|
|
7
|
+
|
|
8
|
+
| Operation | P99 Latency | Max Latency | Throughput | Notes |
|
|
9
|
+
|---|---|---|---|---|
|
|
10
|
+
| [Primary read] | ≤ __ms | ≤ __ms | __ RPS | |
|
|
11
|
+
| [Primary write] | ≤ __ms | ≤ __ms | __ RPS | |
|
|
12
|
+
| [Background job] | — | ≤ __s | — | Async |
|
|
13
|
+
|
|
14
|
+
## Availability
|
|
15
|
+
- Uptime SLA: __% (e.g., 99.9%)
|
|
16
|
+
- Max planned downtime per month: __ minutes
|
|
17
|
+
|
|
18
|
+
## Correctness Constraints
|
|
19
|
+
- [List idempotency, determinism, or monotonicity requirements]
|
|
20
|
+
|
|
21
|
+
**Verification**: Load tests in `tests/harness/` must assert these bounds.
|
|
22
|
+
Gate: `nfr-contracts-required` fires until this file has measurable values.
|