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.
Files changed (254) hide show
  1. package/README.md +2 -2
  2. package/dist/analyzers/anchors/anchor-loader.d.ts +47 -0
  3. package/dist/analyzers/anchors/anchor-loader.d.ts.map +1 -0
  4. package/dist/analyzers/anchors/anchor-loader.js +113 -0
  5. package/dist/analyzers/anchors/anchor-loader.js.map +1 -0
  6. package/dist/analyzers/anti-pattern.d.ts.map +1 -1
  7. package/dist/analyzers/anti-pattern.js +38 -26
  8. package/dist/analyzers/anti-pattern.js.map +1 -1
  9. package/dist/analyzers/completeness-helpers.d.ts +5 -0
  10. package/dist/analyzers/completeness-helpers.d.ts.map +1 -1
  11. package/dist/analyzers/completeness-helpers.js +17 -0
  12. package/dist/analyzers/completeness-helpers.js.map +1 -1
  13. package/dist/analyzers/completeness.d.ts.map +1 -1
  14. package/dist/analyzers/completeness.js +4 -4
  15. package/dist/analyzers/completeness.js.map +1 -1
  16. package/dist/analyzers/gs-scorer.d.ts +3 -1
  17. package/dist/analyzers/gs-scorer.d.ts.map +1 -1
  18. package/dist/analyzers/gs-scorer.js +5 -2
  19. package/dist/analyzers/gs-scorer.js.map +1 -1
  20. package/dist/analyzers/scorers/composable-scorer.d.ts +4 -2
  21. package/dist/analyzers/scorers/composable-scorer.d.ts.map +1 -1
  22. package/dist/analyzers/scorers/composable-scorer.js +50 -2
  23. package/dist/analyzers/scorers/composable-scorer.js.map +1 -1
  24. package/dist/analyzers/scorers/executable-scorer.d.ts +3 -2
  25. package/dist/analyzers/scorers/executable-scorer.d.ts.map +1 -1
  26. package/dist/analyzers/scorers/executable-scorer.js +64 -4
  27. package/dist/analyzers/scorers/executable-scorer.js.map +1 -1
  28. package/dist/analyzers/scorers/scorer-utils.d.ts +5 -3
  29. package/dist/analyzers/scorers/scorer-utils.d.ts.map +1 -1
  30. package/dist/analyzers/scorers/scorer-utils.js +34 -9
  31. package/dist/analyzers/scorers/scorer-utils.js.map +1 -1
  32. package/dist/analyzers/scorers/self-describing-scorer.d.ts +7 -4
  33. package/dist/analyzers/scorers/self-describing-scorer.d.ts.map +1 -1
  34. package/dist/analyzers/scorers/self-describing-scorer.js +17 -18
  35. package/dist/analyzers/scorers/self-describing-scorer.js.map +1 -1
  36. package/dist/artifacts/commit-hooks.d.ts +1 -1
  37. package/dist/artifacts/commit-hooks.d.ts.map +1 -1
  38. package/dist/artifacts/commit-hooks.js +2 -0
  39. package/dist/artifacts/commit-hooks.js.map +1 -1
  40. package/dist/cli/commands.d.ts +35 -1
  41. package/dist/cli/commands.d.ts.map +1 -1
  42. package/dist/cli/commands.js +109 -2
  43. package/dist/cli/commands.js.map +1 -1
  44. package/dist/cli/help.d.ts.map +1 -1
  45. package/dist/cli/help.js +7 -0
  46. package/dist/cli/help.js.map +1 -1
  47. package/dist/cli.d.ts.map +1 -1
  48. package/dist/cli.js +10 -1
  49. package/dist/cli.js.map +1 -1
  50. package/dist/disciplines/catalog.d.ts +16 -0
  51. package/dist/disciplines/catalog.d.ts.map +1 -0
  52. package/dist/disciplines/catalog.js +196 -0
  53. package/dist/disciplines/catalog.js.map +1 -0
  54. package/dist/disciplines/runner.d.ts +13 -0
  55. package/dist/disciplines/runner.d.ts.map +1 -0
  56. package/dist/disciplines/runner.js +35 -0
  57. package/dist/disciplines/runner.js.map +1 -0
  58. package/dist/registry/remote-gates.js +1 -1
  59. package/dist/registry/remote-gates.js.map +1 -1
  60. package/dist/sentinel/detect.d.ts +41 -0
  61. package/dist/sentinel/detect.d.ts.map +1 -0
  62. package/dist/sentinel/detect.js +122 -0
  63. package/dist/sentinel/detect.js.map +1 -0
  64. package/dist/sentinel/write.d.ts +54 -0
  65. package/dist/sentinel/write.d.ts.map +1 -0
  66. package/dist/sentinel/write.js +75 -0
  67. package/dist/sentinel/write.js.map +1 -0
  68. package/dist/shared/cnt-health.d.ts.map +1 -1
  69. package/dist/shared/cnt-health.js +12 -4
  70. package/dist/shared/cnt-health.js.map +1 -1
  71. package/dist/shared/config.d.ts +8 -0
  72. package/dist/shared/config.d.ts.map +1 -1
  73. package/dist/shared/config.js +23 -0
  74. package/dist/shared/config.js.map +1 -1
  75. package/dist/shared/project-gates-helpers.d.ts +9 -0
  76. package/dist/shared/project-gates-helpers.d.ts.map +1 -1
  77. package/dist/shared/project-gates-helpers.js +35 -0
  78. package/dist/shared/project-gates-helpers.js.map +1 -1
  79. package/dist/shared/result-utils.d.ts +27 -0
  80. package/dist/shared/result-utils.d.ts.map +1 -0
  81. package/dist/shared/result-utils.js +41 -0
  82. package/dist/shared/result-utils.js.map +1 -0
  83. package/dist/shared/types/config.d.ts +7 -1
  84. package/dist/shared/types/config.d.ts.map +1 -1
  85. package/dist/shared/types/gates.d.ts +28 -0
  86. package/dist/shared/types/gates.d.ts.map +1 -1
  87. package/dist/shared/types/project.d.ts +66 -0
  88. package/dist/shared/types/project.d.ts.map +1 -1
  89. package/dist/shared/types/project.js.map +1 -1
  90. package/dist/shared/types/verify.d.ts +51 -1
  91. package/dist/shared/types/verify.d.ts.map +1 -1
  92. package/dist/shared/types/verify.js +37 -1
  93. package/dist/shared/types/verify.js.map +1 -1
  94. package/dist/tools/advise-session-advisor.d.ts +16 -0
  95. package/dist/tools/advise-session-advisor.d.ts.map +1 -0
  96. package/dist/tools/advise-session-advisor.js +89 -0
  97. package/dist/tools/advise-session-advisor.js.map +1 -0
  98. package/dist/tools/advise-session-signals.d.ts +21 -0
  99. package/dist/tools/advise-session-signals.d.ts.map +1 -0
  100. package/dist/tools/advise-session-signals.js +113 -0
  101. package/dist/tools/advise-session-signals.js.map +1 -0
  102. package/dist/tools/advise-session.d.ts +22 -0
  103. package/dist/tools/advise-session.d.ts.map +1 -0
  104. package/dist/tools/advise-session.js +31 -0
  105. package/dist/tools/advise-session.js.map +1 -0
  106. package/dist/tools/change-request.d.ts +53 -0
  107. package/dist/tools/change-request.d.ts.map +1 -0
  108. package/dist/tools/change-request.js +375 -0
  109. package/dist/tools/change-request.js.map +1 -0
  110. package/dist/tools/check-cascade-contracts.d.ts +13 -0
  111. package/dist/tools/check-cascade-contracts.d.ts.map +1 -1
  112. package/dist/tools/check-cascade-contracts.js +73 -2
  113. package/dist/tools/check-cascade-contracts.js.map +1 -1
  114. package/dist/tools/check-cascade.d.ts +4 -3
  115. package/dist/tools/check-cascade.d.ts.map +1 -1
  116. package/dist/tools/check-cascade.js +30 -12
  117. package/dist/tools/check-cascade.js.map +1 -1
  118. package/dist/tools/check-spec-consistency.d.ts +25 -0
  119. package/dist/tools/check-spec-consistency.d.ts.map +1 -0
  120. package/dist/tools/check-spec-consistency.js +339 -0
  121. package/dist/tools/check-spec-consistency.js.map +1 -0
  122. package/dist/tools/check-t4.d.ts +54 -0
  123. package/dist/tools/check-t4.d.ts.map +1 -0
  124. package/dist/tools/check-t4.js +305 -0
  125. package/dist/tools/check-t4.js.map +1 -0
  126. package/dist/tools/close-cycle-helpers.d.ts +21 -2
  127. package/dist/tools/close-cycle-helpers.d.ts.map +1 -1
  128. package/dist/tools/close-cycle-helpers.js +66 -10
  129. package/dist/tools/close-cycle-helpers.js.map +1 -1
  130. package/dist/tools/close-cycle.d.ts +2 -2
  131. package/dist/tools/close-cycle.d.ts.map +1 -1
  132. package/dist/tools/close-cycle.js +342 -4
  133. package/dist/tools/close-cycle.js.map +1 -1
  134. package/dist/tools/consolidate-status.d.ts +112 -0
  135. package/dist/tools/consolidate-status.d.ts.map +1 -0
  136. package/dist/tools/consolidate-status.js +356 -0
  137. package/dist/tools/consolidate-status.js.map +1 -0
  138. package/dist/tools/executable-gates.d.ts +52 -0
  139. package/dist/tools/executable-gates.d.ts.map +1 -0
  140. package/dist/tools/executable-gates.js +332 -0
  141. package/dist/tools/executable-gates.js.map +1 -0
  142. package/dist/tools/forgecraft-dispatch-extended.d.ts.map +1 -1
  143. package/dist/tools/forgecraft-dispatch-extended.js +75 -0
  144. package/dist/tools/forgecraft-dispatch-extended.js.map +1 -1
  145. package/dist/tools/forgecraft-dispatch.d.ts.map +1 -1
  146. package/dist/tools/forgecraft-dispatch.js +21 -0
  147. package/dist/tools/forgecraft-dispatch.js.map +1 -1
  148. package/dist/tools/forgecraft-router.d.ts +8 -0
  149. package/dist/tools/forgecraft-router.d.ts.map +1 -1
  150. package/dist/tools/forgecraft-router.js +21 -1
  151. package/dist/tools/forgecraft-router.js.map +1 -1
  152. package/dist/tools/forgecraft-schema-params.d.ts +61 -4
  153. package/dist/tools/forgecraft-schema-params.d.ts.map +1 -1
  154. package/dist/tools/forgecraft-schema-params.js +95 -0
  155. package/dist/tools/forgecraft-schema-params.js.map +1 -1
  156. package/dist/tools/forgecraft-schema.d.ts +62 -5
  157. package/dist/tools/forgecraft-schema.d.ts.map +1 -1
  158. package/dist/tools/forgecraft-schema.js +24 -0
  159. package/dist/tools/forgecraft-schema.js.map +1 -1
  160. package/dist/tools/gate-violations.d.ts +59 -0
  161. package/dist/tools/gate-violations.d.ts.map +1 -0
  162. package/dist/tools/gate-violations.js +152 -0
  163. package/dist/tools/gate-violations.js.map +1 -0
  164. package/dist/tools/generate-adr.js +6 -6
  165. package/dist/tools/generate-adr.js.map +1 -1
  166. package/dist/tools/generate-env-probe.d.ts +49 -0
  167. package/dist/tools/generate-env-probe.d.ts.map +1 -0
  168. package/dist/tools/generate-env-probe.js +365 -0
  169. package/dist/tools/generate-env-probe.js.map +1 -0
  170. package/dist/tools/generate-harness.d.ts +52 -0
  171. package/dist/tools/generate-harness.d.ts.map +1 -0
  172. package/dist/tools/generate-harness.js +333 -0
  173. package/dist/tools/generate-harness.js.map +1 -0
  174. package/dist/tools/generate-roadmap.d.ts +1 -1
  175. package/dist/tools/generate-roadmap.d.ts.map +1 -1
  176. package/dist/tools/generate-roadmap.js +38 -4
  177. package/dist/tools/generate-roadmap.js.map +1 -1
  178. package/dist/tools/generate-session-prompt.d.ts +4 -4
  179. package/dist/tools/generate-session-prompt.d.ts.map +1 -1
  180. package/dist/tools/generate-session-prompt.js +66 -16
  181. package/dist/tools/generate-session-prompt.js.map +1 -1
  182. package/dist/tools/generate-slo-probe.d.ts +53 -0
  183. package/dist/tools/generate-slo-probe.d.ts.map +1 -0
  184. package/dist/tools/generate-slo-probe.js +366 -0
  185. package/dist/tools/generate-slo-probe.js.map +1 -0
  186. package/dist/tools/layer-status-gates.d.ts +24 -0
  187. package/dist/tools/layer-status-gates.d.ts.map +1 -0
  188. package/dist/tools/layer-status-gates.js +151 -0
  189. package/dist/tools/layer-status-gates.js.map +1 -0
  190. package/dist/tools/layer-status.d.ts +133 -0
  191. package/dist/tools/layer-status.d.ts.map +1 -0
  192. package/dist/tools/layer-status.js +593 -0
  193. package/dist/tools/layer-status.js.map +1 -0
  194. package/dist/tools/postcondition-coverage.d.ts +57 -0
  195. package/dist/tools/postcondition-coverage.d.ts.map +1 -0
  196. package/dist/tools/postcondition-coverage.js +256 -0
  197. package/dist/tools/postcondition-coverage.js.map +1 -0
  198. package/dist/tools/probe-runners.d.ts +21 -0
  199. package/dist/tools/probe-runners.d.ts.map +1 -0
  200. package/dist/tools/probe-runners.js +246 -0
  201. package/dist/tools/probe-runners.js.map +1 -0
  202. package/dist/tools/probe-templates.d.ts +27 -0
  203. package/dist/tools/probe-templates.d.ts.map +1 -0
  204. package/dist/tools/probe-templates.js +279 -0
  205. package/dist/tools/probe-templates.js.map +1 -0
  206. package/dist/tools/propose-session.d.ts +28 -0
  207. package/dist/tools/propose-session.d.ts.map +1 -0
  208. package/dist/tools/propose-session.js +333 -0
  209. package/dist/tools/propose-session.js.map +1 -0
  210. package/dist/tools/roadmap-builder.d.ts +34 -1
  211. package/dist/tools/roadmap-builder.d.ts.map +1 -1
  212. package/dist/tools/roadmap-builder.js +153 -11
  213. package/dist/tools/roadmap-builder.js.map +1 -1
  214. package/dist/tools/run-env-probe.d.ts +57 -0
  215. package/dist/tools/run-env-probe.d.ts.map +1 -0
  216. package/dist/tools/run-env-probe.js +270 -0
  217. package/dist/tools/run-env-probe.js.map +1 -0
  218. package/dist/tools/run-harness.d.ts +52 -0
  219. package/dist/tools/run-harness.d.ts.map +1 -0
  220. package/dist/tools/run-harness.js +279 -0
  221. package/dist/tools/run-harness.js.map +1 -0
  222. package/dist/tools/run-slo-probe.d.ts +50 -0
  223. package/dist/tools/run-slo-probe.d.ts.map +1 -0
  224. package/dist/tools/run-slo-probe.js +281 -0
  225. package/dist/tools/run-slo-probe.js.map +1 -0
  226. package/dist/tools/scaffold-writer.d.ts.map +1 -1
  227. package/dist/tools/scaffold-writer.js +4 -0
  228. package/dist/tools/scaffold-writer.js.map +1 -1
  229. package/dist/tools/session-prompt-builders.d.ts +20 -0
  230. package/dist/tools/session-prompt-builders.d.ts.map +1 -1
  231. package/dist/tools/session-prompt-builders.js +111 -14
  232. package/dist/tools/session-prompt-builders.js.map +1 -1
  233. package/dist/tools/session-prompt-sections.d.ts +4 -2
  234. package/dist/tools/session-prompt-sections.d.ts.map +1 -1
  235. package/dist/tools/session-prompt-sections.js +22 -10
  236. package/dist/tools/session-prompt-sections.js.map +1 -1
  237. package/dist/tools/setup-monitoring.d.ts +41 -0
  238. package/dist/tools/setup-monitoring.d.ts.map +1 -0
  239. package/dist/tools/setup-monitoring.js +364 -0
  240. package/dist/tools/setup-monitoring.js.map +1 -0
  241. package/dist/tools/verify-formatter.d.ts.map +1 -1
  242. package/dist/tools/verify-formatter.js +15 -1
  243. package/dist/tools/verify-formatter.js.map +1 -1
  244. package/dist/tools/verify.d.ts.map +1 -1
  245. package/dist/tools/verify.js +3 -0
  246. package/dist/tools/verify.js.map +1 -1
  247. package/package.json +11 -2
  248. package/templates/api/harness/uc-template.hurl +20 -0
  249. package/templates/docs-manifest.yaml +224 -0
  250. package/templates/game/harness/uc-template.sim.ts +29 -0
  251. package/templates/universal/claude-md-blocks/layer-navigation.md +20 -0
  252. package/templates/universal/claude-md-blocks/nfr-contracts.md +22 -0
  253. package/templates/universal/hooks.yaml +212 -20
  254. package/templates/web-react/harness/uc-template.spec.ts +35 -0
@@ -0,0 +1,151 @@
1
+ /**
2
+ * L1 gate violation detection for layer_status.
3
+ *
4
+ * Reads .forgecraft/gates/active/*.yaml, filters for gates with layers
5
+ * containing L1, evaluates file_system conditions, and returns violations
6
+ * to surface in the layer_status L1 section.
7
+ */
8
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ // ── YAML minimal parser ───────────────────────────────────────────────
11
+ /**
12
+ * Extract a scalar string field from YAML text (top-level key only).
13
+ * Non-throwing — returns undefined on parse failure.
14
+ */
15
+ function extractField(yaml, field) {
16
+ const re = new RegExp(`^${field}:\\s*(.+)$`, "m");
17
+ const m = re.exec(yaml);
18
+ return m ? m[1].trim() : undefined;
19
+ }
20
+ /**
21
+ * Check whether the YAML text contains a layers block with the given layer tag.
22
+ */
23
+ function hasLayer(yaml, layer) {
24
+ // Look for "- layer: L1" (or L2, L3, L4) anywhere in the file
25
+ const re = new RegExp(`^\\s+-\\s+layer:\\s+${layer}\\s*$`, "m");
26
+ return re.test(yaml);
27
+ }
28
+ /**
29
+ * Extract the paths list from a check.paths block in YAML.
30
+ * Returns entries that look like file/directory path strings.
31
+ */
32
+ function extractCheckPaths(yaml) {
33
+ // Find the `paths:` block under `check:` — capture indented list items
34
+ const match = /^check:[\s\S]*?paths:\s*\n((?:\s+-\s+.+\n?)*)/m.exec(yaml);
35
+ if (!match)
36
+ return [];
37
+ const block = match[1];
38
+ const paths = [];
39
+ for (const line of block.split("\n")) {
40
+ const m = /^\s+-\s+(.+)$/.exec(line.trim() ? line : "");
41
+ if (m)
42
+ paths.push(m[1].trim());
43
+ }
44
+ return paths;
45
+ }
46
+ /**
47
+ * Extract the check type from a gate YAML.
48
+ */
49
+ function extractCheckType(yaml) {
50
+ // Look for `type:` under the check block
51
+ const checkBlock = /^check:\s*\n([\s\S]*?)(?=^\w|\z)/m.exec(yaml);
52
+ if (!checkBlock)
53
+ return undefined;
54
+ const m = /^\s+type:\s+(\S+)/m.exec(checkBlock[1]);
55
+ return m ? m[1].trim() : undefined;
56
+ }
57
+ /**
58
+ * Extract the check condition from a gate YAML.
59
+ */
60
+ function extractCheckCondition(yaml) {
61
+ const checkBlock = /^check:\s*\n([\s\S]*?)(?=^\w|\z)/m.exec(yaml);
62
+ if (!checkBlock)
63
+ return undefined;
64
+ const m = /^\s+condition:\s+(\S+)/m.exec(checkBlock[1]);
65
+ return m ? m[1].trim() : undefined;
66
+ }
67
+ // ── Gate violation evaluator ──────────────────────────────────────────
68
+ /**
69
+ * Evaluate a single file_system gate against a project directory.
70
+ * Returns a violation record if the gate is firing, or undefined if it passes.
71
+ */
72
+ function evaluateFilesystemGate(projectDir, gateId, yaml) {
73
+ const condition = extractCheckCondition(yaml);
74
+ const paths = extractCheckPaths(yaml);
75
+ if (paths.length === 0)
76
+ return undefined;
77
+ let firing = false;
78
+ if (condition === "file_missing") {
79
+ // Gate fires if ALL listed paths are missing (none exist)
80
+ firing = paths.every((p) => !existsSync(join(projectDir, p)));
81
+ }
82
+ else if (condition === "none_of_these_exist") {
83
+ // Gate fires if none of the listed paths exist
84
+ firing = paths.every((p) => !existsSync(join(projectDir, p)));
85
+ }
86
+ if (!firing)
87
+ return undefined;
88
+ // Build message from fixHint or failureMessage
89
+ const rawFixHint = extractField(yaml, "fixHint");
90
+ const fixHint = rawFixHint
91
+ ? rawFixHint.replace(/\s+/g, " ").trim()
92
+ : undefined;
93
+ const rawFailure = extractField(yaml, "failureMessage");
94
+ const summary = rawFailure
95
+ ? rawFailure.replace(/\s+/g, " ").trim().slice(0, 120)
96
+ : `${paths.slice(0, 2).join(", ")} missing`;
97
+ return { gateId, message: summary, fixHint };
98
+ }
99
+ // ── Main export ───────────────────────────────────────────────────────
100
+ /**
101
+ * Scan .forgecraft/gates/active/*.yaml for gates with an L1 layer entry.
102
+ * Evaluate file_system conditions; report logic/mcp gates as "requires audit".
103
+ *
104
+ * @param projectDir - Absolute path to project root
105
+ * @returns Array of active L1 gate violations
106
+ */
107
+ export function detectL1GateViolations(projectDir) {
108
+ const gatesDir = join(projectDir, ".forgecraft", "gates", "active");
109
+ if (!existsSync(gatesDir))
110
+ return [];
111
+ let files;
112
+ try {
113
+ files = readdirSync(gatesDir).filter((f) => f.endsWith(".yaml"));
114
+ }
115
+ catch {
116
+ return [];
117
+ }
118
+ const violations = [];
119
+ for (const file of files) {
120
+ const filePath = join(gatesDir, file);
121
+ let yaml;
122
+ try {
123
+ yaml = readFileSync(filePath, "utf-8");
124
+ }
125
+ catch {
126
+ continue;
127
+ }
128
+ // Only process gates that declare an L1 layer
129
+ if (!hasLayer(yaml, "L1"))
130
+ continue;
131
+ const gateId = extractField(yaml, "id") ?? file.replace(".yaml", "");
132
+ const checkType = extractCheckType(yaml);
133
+ if (checkType === "file_system") {
134
+ const violation = evaluateFilesystemGate(projectDir, gateId, yaml);
135
+ if (violation)
136
+ violations.push(violation);
137
+ }
138
+ else if (checkType === "logic" || checkType === "mcp") {
139
+ // Logic and MCP gates cannot be evaluated without running tooling —
140
+ // surface them as "requires audit to evaluate" so they are visible.
141
+ violations.push({
142
+ gateId,
143
+ message: "requires audit to evaluate (logic/mcp check)",
144
+ fixHint: extractField(yaml, "fixHint"),
145
+ });
146
+ }
147
+ // Other check types (process, tooled, cli) are skipped — cannot evaluate statically
148
+ }
149
+ return violations;
150
+ }
151
+ //# sourceMappingURL=layer-status-gates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-status-gates.js","sourceRoot":"","sources":["../../src/tools/layer-status-gates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * layer_status tool handler.
3
+ *
4
+ * Reports L1–L4 completion per use case by reading docs/use-cases.md
5
+ * and scanning for harness probes, infra config, and monitoring artifacts.
6
+ * Works on any project with docs/use-cases.md — does not require forgecraft.yaml.
7
+ */
8
+ import { z } from "zod";
9
+ import type { ToolResult } from "../shared/types.js";
10
+ import { type L1GateViolation } from "./layer-status-gates.js";
11
+ export type { L1GateViolation };
12
+ export interface HarnessRunSummary {
13
+ readonly probeFilesFound: number;
14
+ readonly lastRunTimestamp: string | null;
15
+ }
16
+ /**
17
+ * Check tests/harness/ and .forgecraft/harness-run.json for probe file count
18
+ * and last run timestamp.
19
+ */
20
+ export declare function buildHarnessRunSummary(projectDir: string): HarnessRunSummary;
21
+ export declare const layerStatusSchema: z.ZodObject<{
22
+ project_dir: z.ZodString;
23
+ }, "strip", z.ZodTypeAny, {
24
+ project_dir: string;
25
+ }, {
26
+ project_dir: string;
27
+ }>;
28
+ export type LayerStatusInput = z.infer<typeof layerStatusSchema>;
29
+ export interface UcRecord {
30
+ readonly id: string;
31
+ readonly title: string;
32
+ }
33
+ export interface UcL1Status extends UcRecord {
34
+ readonly documented: true;
35
+ readonly testsFound: boolean;
36
+ }
37
+ export interface UcL2Status extends UcRecord {
38
+ readonly hasProbe: boolean;
39
+ readonly probeTypes: ReadonlyArray<string>;
40
+ /** true if tests/harness/uc-NNN-happy.* exists */
41
+ readonly hasHappyProbe: boolean;
42
+ /** count of tests/harness/uc-NNN-error-*.* files */
43
+ readonly errorProbeCount: number;
44
+ /** last run status from harness-run.json, or null if not run */
45
+ readonly lastRunStatus: string | null;
46
+ }
47
+ export type L3Status = "not-started" | "partial" | "complete";
48
+ export type L4Status = "not-started" | "partial" | "complete";
49
+ export interface LayerReport {
50
+ readonly projectName: string;
51
+ readonly projectDir?: string;
52
+ readonly generatedAt: string;
53
+ readonly ucs: ReadonlyArray<UcRecord>;
54
+ readonly l1: ReadonlyArray<UcL1Status>;
55
+ readonly l2: ReadonlyArray<UcL2Status>;
56
+ readonly l3: L3Status;
57
+ readonly l3Checks: Readonly<Record<string, boolean>>;
58
+ readonly l4: L4Status;
59
+ readonly l4Checks: Readonly<Record<string, boolean>>;
60
+ /** Active L1 gate violations detected from .forgecraft/gates/active/ */
61
+ readonly l1GateViolations: ReadonlyArray<L1GateViolation>;
62
+ /** Evidence from .forgecraft/env-probe-run.json, or null if not run */
63
+ readonly envProbeEvidence: {
64
+ passed: number;
65
+ failed: number;
66
+ timestamp: string;
67
+ } | null;
68
+ /** Evidence from .forgecraft/slo-probe-run.json, or null if not run */
69
+ readonly sloProbeEvidence: {
70
+ passed: number;
71
+ failed: number;
72
+ timestamp: string;
73
+ } | null;
74
+ }
75
+ /**
76
+ * Parse use case records from docs/use-cases.md content.
77
+ * Extracts UC-NNN id and title from `## UC-NNN: Title` headers.
78
+ */
79
+ export declare function parseUseCases(content: string): UcRecord[];
80
+ /**
81
+ * Build L1 status for all parsed use cases.
82
+ * L1 = UC is documented. Test coverage is surfaced as a sub-check.
83
+ */
84
+ export declare function buildL1Status(projectDir: string, ucs: ReadonlyArray<UcRecord>): UcL1Status[];
85
+ /**
86
+ * Build L2 status for all use cases.
87
+ * L2 = .forgecraft/harness/uc-NNN.yaml exists.
88
+ */
89
+ export declare function buildL2Status(projectDir: string, ucs: ReadonlyArray<UcRecord>): UcL2Status[];
90
+ /**
91
+ * Evaluate L3 (environment/infrastructure) readiness.
92
+ */
93
+ export declare function buildL3Status(projectDir: string): {
94
+ status: L3Status;
95
+ checks: Record<string, boolean>;
96
+ envProbeEvidence: {
97
+ passed: number;
98
+ failed: number;
99
+ timestamp: string;
100
+ } | null;
101
+ };
102
+ /**
103
+ * Evaluate L4 (self-monitoring/drift detection) readiness.
104
+ */
105
+ export declare function buildL4Status(projectDir: string): {
106
+ status: L4Status;
107
+ checks: Record<string, boolean>;
108
+ sloProbeEvidence: {
109
+ passed: number;
110
+ failed: number;
111
+ timestamp: string;
112
+ } | null;
113
+ };
114
+ /**
115
+ * Build the full layer report for a project directory.
116
+ * All reads are non-throwing — missing artifacts produce empty/default fields.
117
+ *
118
+ * @param projectDir - Absolute path to project root
119
+ * @returns Structured layer report
120
+ */
121
+ export declare function buildLayerReport(projectDir: string): LayerReport;
122
+ /**
123
+ * Format a LayerReport as a human-readable markdown block.
124
+ */
125
+ export declare function formatLayerReport(report: LayerReport): string;
126
+ /**
127
+ * Handler for the layer_status action.
128
+ *
129
+ * @param args - Validated input with project_dir
130
+ * @returns MCP-style tool result with formatted layer report
131
+ */
132
+ export declare function layerStatusHandler(args: LayerStatusInput): Promise<ToolResult>;
133
+ //# sourceMappingURL=layer-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-status.d.ts","sourceRoot":"","sources":["../../src/tools/layer-status.ts"],"names":[],"mappings":"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"}