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
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* consolidate_status tool.
|
|
3
|
+
*
|
|
4
|
+
* Produces a compact, structured project state snapshot — cascade score,
|
|
5
|
+
* roadmap progress, recent git activity, and Status.md summary — in one call.
|
|
6
|
+
* Closes the session drift gap: every session prompt starts with current state
|
|
7
|
+
* rather than stale spec state.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
11
|
+
import { join, resolve } from "node:path";
|
|
12
|
+
import { execSync } from "node:child_process";
|
|
13
|
+
import { runCascadeChecks, loadCascadeDecisions } from "./check-cascade.js";
|
|
14
|
+
import { parseRoadmapItems, findNextRoadmapItem, deriveTestCommand, } from "./close-cycle.js";
|
|
15
|
+
import { buildGateViolationReport } from "./gate-violations.js";
|
|
16
|
+
import { buildLayerReport } from "./layer-status.js";
|
|
17
|
+
// ── Schema ───────────────────────────────────────────────────────────
|
|
18
|
+
export const consolidateStatusSchema = z.object({
|
|
19
|
+
project_dir: z.string().describe("Absolute path to the project root."),
|
|
20
|
+
});
|
|
21
|
+
// ── Handler ───────────────────────────────────────────────────────────
|
|
22
|
+
/**
|
|
23
|
+
* Produce a live project state snapshot and return it as a text block.
|
|
24
|
+
*
|
|
25
|
+
* @param args - Validated input
|
|
26
|
+
* @returns MCP-style tool result with formatted snapshot text
|
|
27
|
+
*/
|
|
28
|
+
export async function consolidateStatusHandler(args) {
|
|
29
|
+
const projectDir = resolve(args.project_dir);
|
|
30
|
+
const snapshot = buildConsolidatedStatus(projectDir);
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: "text", text: formatConsolidatedStatus(snapshot) }],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// ── Core builder ──────────────────────────────────────────────────────
|
|
36
|
+
/**
|
|
37
|
+
* Build a ConsolidatedStatus snapshot from the project directory.
|
|
38
|
+
* All reads are non-throwing — missing artifacts produce empty/null fields.
|
|
39
|
+
*
|
|
40
|
+
* @param projectDir - Absolute path to project root
|
|
41
|
+
* @returns Structured project state snapshot
|
|
42
|
+
*/
|
|
43
|
+
export function buildConsolidatedStatus(projectDir) {
|
|
44
|
+
const violationReport = buildGateViolationReport(projectDir);
|
|
45
|
+
const harnessData = readHarnessData(projectDir);
|
|
46
|
+
const envProbeData = readProbeRunData(projectDir, "env-probe-run.json");
|
|
47
|
+
const sloProbeData = readProbeRunData(projectDir, "slo-probe-run.json");
|
|
48
|
+
return {
|
|
49
|
+
generatedAt: new Date().toISOString(),
|
|
50
|
+
...readCascadeStatus(projectDir),
|
|
51
|
+
roadmap: readRoadmapProgress(projectDir),
|
|
52
|
+
recentCommits: readRecentCommits(projectDir, 5),
|
|
53
|
+
uncommittedFiles: readUncommittedFiles(projectDir, 10),
|
|
54
|
+
testCommand: deriveTestCommand(projectDir) ?? null,
|
|
55
|
+
activeViolationCount: violationReport.active.length,
|
|
56
|
+
activeViolationSummary: violationReport.active.map((v) => `${v.hook}: ${v.message}`),
|
|
57
|
+
statusSummary: readStatusTail(projectDir),
|
|
58
|
+
layerSummary: readLayerSummary(projectDir),
|
|
59
|
+
harnessLastRun: harnessData.lastRun,
|
|
60
|
+
harnessPassed: harnessData.passed,
|
|
61
|
+
harnessTotal: harnessData.total,
|
|
62
|
+
envProbeLastRun: envProbeData.lastRun,
|
|
63
|
+
envProbePassed: envProbeData.passed,
|
|
64
|
+
envProbeTotal: envProbeData.total,
|
|
65
|
+
sloProbeLastRun: sloProbeData.lastRun,
|
|
66
|
+
sloProbePassed: sloProbeData.passed,
|
|
67
|
+
sloProbeTotal: sloProbeData.total,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// ── Section readers ───────────────────────────────────────────────────
|
|
71
|
+
/**
|
|
72
|
+
* Read cascade pass/fail status from the project.
|
|
73
|
+
* Returns unconfigured (required: 0) when no forgecraft.yaml is present.
|
|
74
|
+
* SKIP steps are treated as optional (not counted in required total).
|
|
75
|
+
*/
|
|
76
|
+
function readCascadeStatus(projectDir) {
|
|
77
|
+
const yamlPath = join(projectDir, "forgecraft.yaml");
|
|
78
|
+
if (!existsSync(yamlPath)) {
|
|
79
|
+
return { cascadeScore: { passing: 0, required: 0 }, cascadeLines: [] };
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const decisions = loadCascadeDecisions(projectDir);
|
|
83
|
+
const steps = runCascadeChecks(projectDir, decisions);
|
|
84
|
+
// SKIP status means the step was explicitly marked non-required via a decision.
|
|
85
|
+
const requiredSteps = steps.filter((s) => s.status !== "SKIP");
|
|
86
|
+
const passing = requiredSteps.filter((s) => s.status === "PASS").length;
|
|
87
|
+
const cascadeLines = steps.map((s) => {
|
|
88
|
+
const isOptional = s.status === "SKIP";
|
|
89
|
+
const icon = s.status === "PASS" ? "✅" : isOptional ? "⚠️ " : "❌";
|
|
90
|
+
const suffix = isOptional ? " (optional)" : "";
|
|
91
|
+
return `${icon} ${s.name}${suffix}`;
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
cascadeScore: { passing, required: requiredSteps.length },
|
|
95
|
+
cascadeLines,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return { cascadeScore: { passing: 0, required: 0 }, cascadeLines: [] };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Read roadmap progress: total items, done count, next unblocked item.
|
|
104
|
+
*/
|
|
105
|
+
function readRoadmapProgress(projectDir) {
|
|
106
|
+
const roadmapPath = join(projectDir, "docs", "roadmap.md");
|
|
107
|
+
if (!existsSync(roadmapPath))
|
|
108
|
+
return null;
|
|
109
|
+
try {
|
|
110
|
+
const content = readFileSync(roadmapPath, "utf-8");
|
|
111
|
+
const items = parseRoadmapItems(content);
|
|
112
|
+
if (items.length === 0)
|
|
113
|
+
return null;
|
|
114
|
+
const done = items.filter((i) => i.status === "done").length;
|
|
115
|
+
const next = findNextRoadmapItem(projectDir);
|
|
116
|
+
return {
|
|
117
|
+
total: items.length,
|
|
118
|
+
done,
|
|
119
|
+
nextId: next?.id ?? null,
|
|
120
|
+
nextTitle: next?.title ?? null,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Read the last N git commit subjects from the project directory.
|
|
129
|
+
* Returns empty array when git is unavailable or directory is not a repo.
|
|
130
|
+
*/
|
|
131
|
+
export function readRecentCommits(projectDir, count) {
|
|
132
|
+
if (!existsSync(join(projectDir, ".git")))
|
|
133
|
+
return [];
|
|
134
|
+
try {
|
|
135
|
+
const raw = execSync(`git log --oneline -${count}`, {
|
|
136
|
+
cwd: projectDir,
|
|
137
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
138
|
+
})
|
|
139
|
+
.toString()
|
|
140
|
+
.trim();
|
|
141
|
+
return raw.length === 0
|
|
142
|
+
? []
|
|
143
|
+
: raw
|
|
144
|
+
.split("\n")
|
|
145
|
+
.map((l) => l.trim())
|
|
146
|
+
.filter((l) => l.length > 0);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Read uncommitted changed files (staged + unstaged), up to maxFiles.
|
|
154
|
+
* Returns empty array when git is unavailable.
|
|
155
|
+
*/
|
|
156
|
+
export function readUncommittedFiles(projectDir, maxFiles) {
|
|
157
|
+
if (!existsSync(join(projectDir, ".git")))
|
|
158
|
+
return [];
|
|
159
|
+
try {
|
|
160
|
+
const raw = execSync("git status --porcelain", {
|
|
161
|
+
cwd: projectDir,
|
|
162
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
163
|
+
})
|
|
164
|
+
.toString()
|
|
165
|
+
.trim();
|
|
166
|
+
if (raw.length === 0)
|
|
167
|
+
return [];
|
|
168
|
+
return raw
|
|
169
|
+
.split("\n")
|
|
170
|
+
.map((l) => l.trim())
|
|
171
|
+
.filter((l) => l.length > 0)
|
|
172
|
+
.slice(0, maxFiles);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Read the tail of Status.md, truncated to the last 600 characters.
|
|
180
|
+
*/
|
|
181
|
+
function readStatusTail(projectDir) {
|
|
182
|
+
const statusPath = join(projectDir, "Status.md");
|
|
183
|
+
if (!existsSync(statusPath))
|
|
184
|
+
return "(not found)";
|
|
185
|
+
try {
|
|
186
|
+
const content = readFileSync(statusPath, "utf-8");
|
|
187
|
+
return content.length > 600 ? `…\n${content.slice(-600)}` : content;
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return "(unreadable)";
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Read harness-run.json for the last run timestamp, passed count, and total results.
|
|
195
|
+
* Non-throwing — returns zeroed values when file is absent or unparseable.
|
|
196
|
+
*/
|
|
197
|
+
function readHarnessData(projectDir) {
|
|
198
|
+
const runJsonPath = join(projectDir, ".forgecraft", "harness-run.json");
|
|
199
|
+
if (!existsSync(runJsonPath))
|
|
200
|
+
return { lastRun: null, passed: 0, total: 0 };
|
|
201
|
+
try {
|
|
202
|
+
const raw = readFileSync(runJsonPath, "utf-8");
|
|
203
|
+
const parsed = JSON.parse(raw);
|
|
204
|
+
const passed = parsed.passed ?? 0;
|
|
205
|
+
const total = (parsed.passed ?? 0) +
|
|
206
|
+
(parsed.failed ?? 0) +
|
|
207
|
+
(parsed.errors ?? 0) +
|
|
208
|
+
(parsed.notFound ?? 0);
|
|
209
|
+
return { lastRun: parsed.timestamp ?? null, passed, total };
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return { lastRun: null, passed: 0, total: 0 };
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Read a probe run JSON file (env-probe-run.json or slo-probe-run.json) from .forgecraft/.
|
|
217
|
+
* Non-throwing — returns zeroed values when file is absent or unparseable.
|
|
218
|
+
*/
|
|
219
|
+
function readProbeRunData(projectDir, fileName) {
|
|
220
|
+
const runJsonPath = join(projectDir, ".forgecraft", fileName);
|
|
221
|
+
if (!existsSync(runJsonPath))
|
|
222
|
+
return { lastRun: null, passed: 0, total: 0 };
|
|
223
|
+
try {
|
|
224
|
+
const raw = readFileSync(runJsonPath, "utf-8");
|
|
225
|
+
const parsed = JSON.parse(raw);
|
|
226
|
+
const passed = parsed.passed ?? 0;
|
|
227
|
+
const total = (parsed.passed ?? 0) + (parsed.failed ?? 0);
|
|
228
|
+
return { lastRun: parsed.timestamp ?? null, passed, total };
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
return { lastRun: null, passed: 0, total: 0 };
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Read layer completion summary from the project.
|
|
236
|
+
* Returns null when docs/use-cases.md is absent.
|
|
237
|
+
*/
|
|
238
|
+
function readLayerSummary(projectDir) {
|
|
239
|
+
try {
|
|
240
|
+
const report = buildLayerReport(projectDir);
|
|
241
|
+
if (report.ucs.length === 0)
|
|
242
|
+
return null;
|
|
243
|
+
const l2Passing = report.l2.filter((u) => u.hasProbe).length;
|
|
244
|
+
return {
|
|
245
|
+
l1: { passing: report.ucs.length, total: report.ucs.length },
|
|
246
|
+
l2: { passing: l2Passing, total: report.ucs.length },
|
|
247
|
+
l3: report.l3,
|
|
248
|
+
l4: report.l4,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// ── Formatter ─────────────────────────────────────────────────────────
|
|
256
|
+
/**
|
|
257
|
+
* Format a ConsolidatedStatus snapshot as a human-readable markdown block.
|
|
258
|
+
*
|
|
259
|
+
* @param snapshot - The structured snapshot to format
|
|
260
|
+
* @returns Formatted markdown text
|
|
261
|
+
*/
|
|
262
|
+
export function formatConsolidatedStatus(snapshot) {
|
|
263
|
+
const lines = [
|
|
264
|
+
"## Project Status Snapshot",
|
|
265
|
+
`_Generated: ${snapshot.generatedAt}_`,
|
|
266
|
+
"",
|
|
267
|
+
];
|
|
268
|
+
// Cascade
|
|
269
|
+
const { passing, required } = snapshot.cascadeScore;
|
|
270
|
+
const cascadeLabel = required === 0 ? "unconfigured" : `${passing}/${required} required`;
|
|
271
|
+
lines.push(`### Cascade: ${cascadeLabel}`);
|
|
272
|
+
for (const line of snapshot.cascadeLines) {
|
|
273
|
+
lines.push(`- ${line}`);
|
|
274
|
+
}
|
|
275
|
+
lines.push("");
|
|
276
|
+
// Roadmap
|
|
277
|
+
if (snapshot.roadmap) {
|
|
278
|
+
const { done, total, nextId, nextTitle } = snapshot.roadmap;
|
|
279
|
+
lines.push(`### Roadmap: ${done}/${total} done`);
|
|
280
|
+
if (nextId && nextTitle) {
|
|
281
|
+
lines.push(`Next: **${nextId}** — ${nextTitle}`);
|
|
282
|
+
}
|
|
283
|
+
else if (done === total) {
|
|
284
|
+
lines.push("All items complete — ready for hardening.");
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
lines.push("No unblocked items — check dependencies.");
|
|
288
|
+
}
|
|
289
|
+
lines.push("");
|
|
290
|
+
}
|
|
291
|
+
// Recent commits
|
|
292
|
+
if (snapshot.recentCommits.length > 0) {
|
|
293
|
+
lines.push("### Recent commits");
|
|
294
|
+
for (const commit of snapshot.recentCommits) {
|
|
295
|
+
lines.push(`- ${commit}`);
|
|
296
|
+
}
|
|
297
|
+
lines.push("");
|
|
298
|
+
}
|
|
299
|
+
// Uncommitted changes
|
|
300
|
+
if (snapshot.uncommittedFiles.length > 0) {
|
|
301
|
+
lines.push("### Uncommitted changes");
|
|
302
|
+
for (const file of snapshot.uncommittedFiles) {
|
|
303
|
+
lines.push(`- ${file}`);
|
|
304
|
+
}
|
|
305
|
+
lines.push("");
|
|
306
|
+
}
|
|
307
|
+
// Test command
|
|
308
|
+
if (snapshot.testCommand) {
|
|
309
|
+
lines.push(`### Test command: \`${snapshot.testCommand}\``);
|
|
310
|
+
lines.push("");
|
|
311
|
+
}
|
|
312
|
+
// Gate violations
|
|
313
|
+
if (snapshot.activeViolationCount > 0) {
|
|
314
|
+
lines.push(`### ⚠️ Gate Violations: ${snapshot.activeViolationCount} active`);
|
|
315
|
+
for (const summary of snapshot.activeViolationSummary) {
|
|
316
|
+
lines.push(`- ${summary}`);
|
|
317
|
+
}
|
|
318
|
+
lines.push("");
|
|
319
|
+
}
|
|
320
|
+
// Layer coverage
|
|
321
|
+
if (snapshot.layerSummary) {
|
|
322
|
+
const { l1, l2, l3, l4 } = snapshot.layerSummary;
|
|
323
|
+
const l2Pct = l2.total > 0 ? Math.round((l2.passing / l2.total) * 100) : 0;
|
|
324
|
+
lines.push("### Layer Coverage");
|
|
325
|
+
lines.push(`- L1 Blueprint: ${l1.passing}/${l1.total} documented`);
|
|
326
|
+
// Build L2 line with harness execution data if available
|
|
327
|
+
let l2Line = `- L2 Harness: ${l2.passing}/${l2.total} (${l2Pct}%) have probes`;
|
|
328
|
+
if (snapshot.harnessLastRun) {
|
|
329
|
+
const lastRunDate = snapshot.harnessLastRun.slice(0, 10);
|
|
330
|
+
l2Line += ` | harness: ${snapshot.harnessPassed}/${snapshot.harnessTotal} passing, last run: ${lastRunDate}`;
|
|
331
|
+
}
|
|
332
|
+
lines.push(l2Line);
|
|
333
|
+
// Build L3 line with env probe evidence if available
|
|
334
|
+
let l3Line = `- L3 Environment: ${l3}`;
|
|
335
|
+
if (snapshot.envProbeLastRun) {
|
|
336
|
+
const lastRunDate = snapshot.envProbeLastRun.slice(0, 10);
|
|
337
|
+
l3Line += ` | env probe: ${snapshot.envProbePassed ?? 0}/${snapshot.envProbeTotal ?? 0} passing, last run: ${lastRunDate}`;
|
|
338
|
+
}
|
|
339
|
+
lines.push(l3Line);
|
|
340
|
+
// Build L4 line with slo probe evidence if available
|
|
341
|
+
let l4Line = `- L4 Monitoring: ${l4}`;
|
|
342
|
+
if (snapshot.sloProbeLastRun) {
|
|
343
|
+
const lastRunDate = snapshot.sloProbeLastRun.slice(0, 10);
|
|
344
|
+
l4Line += ` | slo probe: ${snapshot.sloProbePassed ?? 0}/${snapshot.sloProbeTotal ?? 0} passing, last run: ${lastRunDate}`;
|
|
345
|
+
}
|
|
346
|
+
lines.push(l4Line);
|
|
347
|
+
lines.push("");
|
|
348
|
+
}
|
|
349
|
+
// Status.md
|
|
350
|
+
lines.push("### Status.md");
|
|
351
|
+
lines.push("```");
|
|
352
|
+
lines.push(snapshot.statusSummary);
|
|
353
|
+
lines.push("```");
|
|
354
|
+
return lines.join("\n");
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=consolidate-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consolidate-status.js","sourceRoot":"","sources":["../../src/tools/consolidate-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tag-driven executable gate matrix for the Executable Sprint phase.
|
|
3
|
+
*
|
|
4
|
+
* Each project tag maps to one or more verification tools. When `generate_roadmap`
|
|
5
|
+
* runs, it reads the project's tags from forgecraft.yaml and selects the appropriate
|
|
6
|
+
* gates. Gate files (hurl specs, Playwright tests, SQL scripts, WebSocket clients)
|
|
7
|
+
* are written alongside the session prompt stubs so the AI has a runnable starting
|
|
8
|
+
* point rather than prose instructions alone.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* A single executable gate: the tool to use, where the gate file lives,
|
|
12
|
+
* and how to generate the starter content.
|
|
13
|
+
*/
|
|
14
|
+
export interface ExecutableGate {
|
|
15
|
+
/** Short tool identifier shown in roadmap and prompts */
|
|
16
|
+
readonly tool: string;
|
|
17
|
+
/** Human-readable description of what this gate verifies */
|
|
18
|
+
readonly label: string;
|
|
19
|
+
/** Relative path for the generated gate file. `{ucId}` is replaced at generation time. */
|
|
20
|
+
readonly gatePathTemplate: string;
|
|
21
|
+
/** Inline documentation URL shown in stubs */
|
|
22
|
+
readonly docsUrl: string;
|
|
23
|
+
/** Generate runnable stub content for a specific use case */
|
|
24
|
+
readonly buildStub: (ucId: string, ucTitle: string) => string;
|
|
25
|
+
/** One-line command to run all gates of this type */
|
|
26
|
+
readonly runCommand: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the applicable executable gates for a project's tags.
|
|
30
|
+
* Deduplicates by tool so a project tagged API+AUTH doesn't get two hurl gates.
|
|
31
|
+
*
|
|
32
|
+
* @param tags - Project classification tags from forgecraft.yaml
|
|
33
|
+
* @returns Ordered, deduplicated list of applicable gates
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveExecutableGates(tags: ReadonlyArray<string>): ReadonlyArray<ExecutableGate>;
|
|
36
|
+
/**
|
|
37
|
+
* Format the gate file path for a specific use case.
|
|
38
|
+
*
|
|
39
|
+
* @param gate - The gate definition
|
|
40
|
+
* @param ucId - Use-case ID (e.g. UC-001)
|
|
41
|
+
* @returns Relative file path
|
|
42
|
+
*/
|
|
43
|
+
export declare function gateFilePath(gate: ExecutableGate, ucId: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Build a one-line summary of all active gates for inclusion in the roadmap
|
|
46
|
+
* phase description header.
|
|
47
|
+
*
|
|
48
|
+
* @param gates - Resolved gates
|
|
49
|
+
* @returns Comma-separated tool list string
|
|
50
|
+
*/
|
|
51
|
+
export declare function gateToolSummary(gates: ReadonlyArray<ExecutableGate>): string;
|
|
52
|
+
//# sourceMappingURL=executable-gates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executable-gates.d.ts","sourceRoot":"","sources":["../../src/tools/executable-gates.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9D,qDAAqD;IACrD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAwSD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAC1B,aAAa,CAAC,cAAc,CAAC,CAwB/B;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,MAAM,CAE5E"}
|