@momentiq/dark-factory-cli 2.8.0 → 2.10.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/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +42 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/prove.d.ts +11 -0
- package/dist/commands/prove.d.ts.map +1 -0
- package/dist/commands/prove.js +167 -0
- package/dist/commands/prove.js.map +1 -0
- package/dist/commands/publish.d.ts +13 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +168 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/evidence/cerebe.d.ts +48 -0
- package/dist/evidence/cerebe.d.ts.map +1 -0
- package/dist/evidence/cerebe.js +163 -0
- package/dist/evidence/cerebe.js.map +1 -0
- package/dist/evidence/prove.d.ts +24 -0
- package/dist/evidence/prove.d.ts.map +1 -0
- package/dist/evidence/prove.js +170 -0
- package/dist/evidence/prove.js.map +1 -0
- package/dist/evidence/publish.d.ts +35 -0
- package/dist/evidence/publish.d.ts.map +1 -0
- package/dist/evidence/publish.js +177 -0
- package/dist/evidence/publish.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +2 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/prove.d.ts +7 -0
- package/dist/mcp/tools/prove.d.ts.map +1 -0
- package/dist/mcp/tools/prove.js +109 -0
- package/dist/mcp/tools/prove.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/evidence/publish.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAEV,kBAAkB,EAClB,iBAAiB,EAElB,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKzE,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACnE;AAGD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;CACnB;AAGD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,cAAc,EAAE,CAAC;IAEzB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAElC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAMD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CA4E5B;AAUD,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA6BpC;AA2CD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpD"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// Cycle 331.1 verifiable-objectives Phase 2 (momentiq-ai/dark-factory#207) —
|
|
2
|
+
// the publish orchestration behind `df publish`. After `df verify` produces the
|
|
3
|
+
// diffHash-bound evidence bundle in CI, publish uploads it to Cerebe object
|
|
4
|
+
// storage and emits a `PublishedEvidence` pointer manifest (`{routeId →
|
|
5
|
+
// upload_id, diffHash}`) the hosted worker (Phase 3) joins against the
|
|
6
|
+
// objectives manifest.
|
|
7
|
+
//
|
|
8
|
+
// Two layers, split for testability:
|
|
9
|
+
// - `collectPublishArtifacts` — reads the per-SHA gate JSON + each route's
|
|
10
|
+
// working-tree artifacts (UI screenshots) from disk.
|
|
11
|
+
// - `buildPublishManifest` — uploads staged artifacts via an injected
|
|
12
|
+
// uploader and assembles the manifest. Degrade-and-pass (spec §5): a null
|
|
13
|
+
// uploader (Cerebe unconfigured) or any upload failure yields a `degraded`
|
|
14
|
+
// manifest, never a thrown error — capture must not block the merge verdict.
|
|
15
|
+
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
16
|
+
import { basename, extname, join, relative, resolve, sep } from "node:path";
|
|
17
|
+
import { readQualityGateEvidence } from "./quality-gates.js";
|
|
18
|
+
// How many failed-artifact details to inline in `degradedReason` before
|
|
19
|
+
// truncating (the full count is always stated).
|
|
20
|
+
const MAX_DEGRADED_DETAILS = 3;
|
|
21
|
+
export async function buildPublishManifest(input) {
|
|
22
|
+
const provenance = input.provenance ?? "consumer-attested";
|
|
23
|
+
// Air-gap / unconfigured: degrade-and-pass. Record route exit codes (still
|
|
24
|
+
// useful as a structural outcome) but upload nothing.
|
|
25
|
+
if (input.uploader === null) {
|
|
26
|
+
return {
|
|
27
|
+
schemaVersion: 1,
|
|
28
|
+
commit: input.commit,
|
|
29
|
+
provenance,
|
|
30
|
+
status: "degraded",
|
|
31
|
+
...(input.diffHash !== undefined ? { diffHash: input.diffHash } : {}),
|
|
32
|
+
routes: emptyRoutePointers(input.routes),
|
|
33
|
+
degradedReason: "Cerebe not configured (CEREBE_API_URL / CEREBE_API_KEY unset) — evidence captured but not published.",
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const uploader = input.uploader;
|
|
37
|
+
const failures = [];
|
|
38
|
+
const tryUpload = async (source) => {
|
|
39
|
+
try {
|
|
40
|
+
const r = await uploader.uploadFile({
|
|
41
|
+
bytes: source.bytes,
|
|
42
|
+
filename: basename(source.path),
|
|
43
|
+
contentType: source.contentType,
|
|
44
|
+
sessionId: input.sessionId,
|
|
45
|
+
userId: input.userId,
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
path: source.path,
|
|
49
|
+
uploadId: r.uploadId,
|
|
50
|
+
sha256: r.sha256,
|
|
51
|
+
contentType: r.contentType,
|
|
52
|
+
sizeBytes: r.sizeBytes,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
failures.push(`${source.path}: ${err.message}`);
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
let gateEvidence;
|
|
61
|
+
if (input.gate) {
|
|
62
|
+
gateEvidence = (await tryUpload(input.gate)) ?? undefined;
|
|
63
|
+
}
|
|
64
|
+
const routes = {};
|
|
65
|
+
for (const r of input.routes) {
|
|
66
|
+
const artifacts = [];
|
|
67
|
+
for (const source of r.sources) {
|
|
68
|
+
const ptr = await tryUpload(source);
|
|
69
|
+
if (ptr)
|
|
70
|
+
artifacts.push(ptr);
|
|
71
|
+
}
|
|
72
|
+
routes[r.routeId] = { routeId: r.routeId, exitCode: r.exitCode, artifacts };
|
|
73
|
+
}
|
|
74
|
+
const status = failures.length > 0 ? "degraded" : "complete";
|
|
75
|
+
const degradedReason = failures.length > 0
|
|
76
|
+
? `Cerebe upload failed for ${failures.length} artifact(s): ${failures
|
|
77
|
+
.slice(0, MAX_DEGRADED_DETAILS)
|
|
78
|
+
.join("; ")}${failures.length > MAX_DEGRADED_DETAILS ? "; …" : ""}`
|
|
79
|
+
: undefined;
|
|
80
|
+
return {
|
|
81
|
+
schemaVersion: 1,
|
|
82
|
+
commit: input.commit,
|
|
83
|
+
provenance,
|
|
84
|
+
status,
|
|
85
|
+
...(gateEvidence !== undefined ? { gateEvidence } : {}),
|
|
86
|
+
...(input.diffHash !== undefined ? { diffHash: input.diffHash } : {}),
|
|
87
|
+
routes,
|
|
88
|
+
...(degradedReason !== undefined ? { degradedReason } : {}),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function emptyRoutePointers(routes) {
|
|
92
|
+
const out = {};
|
|
93
|
+
for (const r of routes) {
|
|
94
|
+
out[r.routeId] = { routeId: r.routeId, exitCode: r.exitCode, artifacts: [] };
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
// Read the per-SHA gate JSON + each route's working-tree artifacts. Returns
|
|
99
|
+
// `null` when no (current, non-stale) evidence exists for the commit — the
|
|
100
|
+
// "nothing to publish" case (`df verify` never ran, or ran for a different
|
|
101
|
+
// diff).
|
|
102
|
+
export async function collectPublishArtifacts(loaded, commit, cwd) {
|
|
103
|
+
const { evidence, path: gatePath, stale } = await readQualityGateEvidence(loaded, commit);
|
|
104
|
+
if (!evidence || stale || evidence.commit !== commit)
|
|
105
|
+
return null;
|
|
106
|
+
const gate = {
|
|
107
|
+
path: toPosixRelative(gatePath, cwd),
|
|
108
|
+
contentType: "application/json",
|
|
109
|
+
bytes: readFileSync(gatePath),
|
|
110
|
+
};
|
|
111
|
+
// Map routeId → evidenceKind so we know which routes emit file artifacts.
|
|
112
|
+
const routeTable = loaded.config.validation.verificationRoutes ?? [];
|
|
113
|
+
const evidenceKindById = new Map(routeTable.map((r) => [r.id, r.evidenceKind]));
|
|
114
|
+
const routes = [];
|
|
115
|
+
for (const [routeId, result] of Object.entries(evidence.gateResults ?? {})) {
|
|
116
|
+
const sources =
|
|
117
|
+
// The Playwright UI route is the only v1 route that writes separate file
|
|
118
|
+
// artifacts (screenshots / ARIA) into the working tree; other kinds carry
|
|
119
|
+
// their outcome in the gate JSON alone.
|
|
120
|
+
evidenceKindById.get(routeId) === "playwright" ? readUiArtifacts(cwd, commit) : [];
|
|
121
|
+
routes.push({ routeId, exitCode: result.exitCode, sources });
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
gate,
|
|
125
|
+
routes,
|
|
126
|
+
...(evidence.diffHash !== undefined ? { diffHash: evidence.diffHash } : {}),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// The Playwright UI route writes to `<repoRoot>/agent-reviews/quality-gates/
|
|
130
|
+
// ui/<sha>/...` (working tree; see skills/verify/producer/playwright-route.sh).
|
|
131
|
+
// Read every regular file under that tree, in a deterministic order.
|
|
132
|
+
function readUiArtifacts(cwd, commit) {
|
|
133
|
+
const root = resolve(cwd, "agent-reviews", "quality-gates", "ui", commit);
|
|
134
|
+
if (!existsSync(root))
|
|
135
|
+
return [];
|
|
136
|
+
const out = [];
|
|
137
|
+
for (const abs of walkFiles(root)) {
|
|
138
|
+
out.push({
|
|
139
|
+
path: toPosixRelative(abs, cwd),
|
|
140
|
+
contentType: contentTypeForPath(abs),
|
|
141
|
+
bytes: readFileSync(abs),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
146
|
+
function walkFiles(dir) {
|
|
147
|
+
const out = [];
|
|
148
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
149
|
+
const abs = join(dir, entry.name);
|
|
150
|
+
if (entry.isDirectory())
|
|
151
|
+
out.push(...walkFiles(abs));
|
|
152
|
+
else if (entry.isFile())
|
|
153
|
+
out.push(abs);
|
|
154
|
+
}
|
|
155
|
+
return out.sort();
|
|
156
|
+
}
|
|
157
|
+
const CONTENT_TYPES = {
|
|
158
|
+
".png": "image/png",
|
|
159
|
+
".jpg": "image/jpeg",
|
|
160
|
+
".jpeg": "image/jpeg",
|
|
161
|
+
".webp": "image/webp",
|
|
162
|
+
".json": "application/json",
|
|
163
|
+
".txt": "text/plain",
|
|
164
|
+
".log": "text/plain",
|
|
165
|
+
".html": "text/html",
|
|
166
|
+
".xml": "application/xml",
|
|
167
|
+
".yaml": "application/yaml",
|
|
168
|
+
".yml": "application/yaml",
|
|
169
|
+
};
|
|
170
|
+
export function contentTypeForPath(p) {
|
|
171
|
+
return CONTENT_TYPES[extname(p).toLowerCase()] ?? "application/octet-stream";
|
|
172
|
+
}
|
|
173
|
+
// Repo-relative, POSIX-separated path for the manifest (stable across OSes).
|
|
174
|
+
function toPosixRelative(abs, cwd) {
|
|
175
|
+
return relative(cwd, abs).split(sep).join("/");
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/evidence/publish.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqCpE,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CACxB,OAAO,EAAE,OAAO,cAAc,EAAE,gBAAgB,KAC7C,OAAO,CAAC,OAAO,cAAc,EAAE,gBAAgB,CAAC,CAAC;CAOvD;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,sBAA2B,GAAG,SAAS,CA8D5E"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -41,6 +41,7 @@ import { registerHandoffTools } from "./tools/handoff.js";
|
|
|
41
41
|
import { registerReviewBypassTools } from "./tools/review-bypass.js";
|
|
42
42
|
import { registerSkillsTools } from "./tools/skills-install.js";
|
|
43
43
|
import { registerOnboardTool } from "./tools/onboard.js";
|
|
44
|
+
import { registerProveTool } from "./tools/prove.js";
|
|
44
45
|
import { registerStatsGateTools } from "./tools/stats-gate.js";
|
|
45
46
|
function readPackageMeta() {
|
|
46
47
|
// dist/mcp/server.js → ../../package.json (two levels up from compiled
|
|
@@ -101,6 +102,7 @@ export function createMcpServer(opts = {}) {
|
|
|
101
102
|
registerHandoffTools(server, toolOpts); // cycle12.2 — df_handoff + df_accept + df_rehydrate + df_handoffs (v2 Issue-anchor)
|
|
102
103
|
registerSkillsTools(server, toolOpts); // DFP #192 — df_skills_install + df_skills_list (consumer-shape skills)
|
|
103
104
|
registerOnboardTool(server, toolOpts); // cycle 15 Phase C — df_onboard
|
|
105
|
+
registerProveTool(server, toolOpts); // cycle 331.1 #207 — df_prove closeout proof readout
|
|
104
106
|
// step 4 — URI-addressable resources (df://repo/...). Single call
|
|
105
107
|
// registers all 9 resources at once; see src/mcp/resources.ts.
|
|
106
108
|
registerResources(server, toolOpts);
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,wEAAwE;AACxE,oEAAoE;AACpE,wEAAwE;AACxE,gDAAgD;AAChD,EAAE;AACF,qEAAqE;AACrE,uEAAuE;AACvE,oEAAoE;AACpE,kEAAkE;AAClE,2DAA2D;AAC3D,4DAA4D;AAC5D,iEAAiE;AACjE,iEAAiE;AACjE,+DAA+D;AAC/D,kEAAkE;AAClE,+DAA+D;AAC/D,UAAU;AACV,EAAE;AACF,wEAAwE;AACxE,oEAAoE;AACpE,oEAAoE;AACpE,mEAAmE;AACnE,qEAAqE;AACrE,iEAAiE;AACjE,WAAW;AAEX,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAO/D,SAAS,eAAe;IACtB,uEAAuE;IACvE,qEAAqE;IACrE,qEAAqE;IACrE,sDAAsD;IACtD,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwC,CAAC;IACtE,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,4BAA4B;QACjD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO;KACnC,CAAC;AACJ,CAAC;AA4BD,MAAM,UAAU,eAAe,CAAC,OAA+B,EAAE;IAC/D,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,uEAAuE;IACvE,iEAAiE;IACjE,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EACnD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,EAAE;YACX,2DAA2D;YAC3D,8DAA8D;YAC9D,8DAA8D;YAC9D,mDAAmD;YACnD,mCAAmC;YACnC,OAAO,EAAE,EAAE;SACZ;QACD,YAAY,EACV,8DAA8D;YAC9D,8DAA8D;YAC9D,sDAAsD;KACzD,CACF,CAAC;IAEF,+DAA+D;IAC/D,2DAA2D;IAC3D,+DAA+D;IAC/D,2DAA2D;IAC3D,qCAAqC;IAErC,yDAAyD;IACzD,kEAAkE;IAClE,kEAAkE;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAS,SAAS;IACvD,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAS,0CAA0C;IACxF,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAM,sCAAsC;IACpF,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAW,sCAAsC;IACpF,yBAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAE,8CAA8C;IAC5F,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAK,mCAAmC;IACjF,yBAAyB,CAAC,MAAM,EAAE;QAChC,GAAG,QAAQ;QACX,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS;YACnC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,cAAc,EAAE;YAC7C,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC,CAA4C,oDAAoD;IACnG,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAM,8DAA8D;IAC5G,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAQ,oFAAoF;IACnI,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAS,wEAAwE;IACvH,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAS,gCAAgC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export interface RegisterProveToolOptions {
|
|
3
|
+
cwd?: string;
|
|
4
|
+
now?: () => string;
|
|
5
|
+
}
|
|
6
|
+
export declare function registerProveTool(server: McpServer, opts?: RegisterProveToolOptions): void;
|
|
7
|
+
//# sourceMappingURL=prove.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prove.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/prove.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,MAAM,WAAW,wBAAwB;IAEvC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAoCD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,GAAE,wBAA6B,GAAG,IAAI,CAiE9F"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// df_prove MCP tool — Cycle 331.1 verifiable-objectives (#207).
|
|
2
|
+
//
|
|
3
|
+
// The agent-facing half of "declare victory with proof": returns the
|
|
4
|
+
// BoundProofRecord for a commit — each declared objective joined against its
|
|
5
|
+
// local evidence and resolved to proven / pending / failed — so an MCP-driven
|
|
6
|
+
// agent can cite the proof at closeout instead of asserting "done".
|
|
7
|
+
//
|
|
8
|
+
// Shares the exact join core with the `df prove` CLI (evidence/prove.ts), so the
|
|
9
|
+
// MCP structuredContent and `df prove --json` stay byte-equivalent. Trust
|
|
10
|
+
// boundary: agent-attested, evidence-backed (not independent verification).
|
|
11
|
+
import { resolve } from "node:path";
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
import { buildProofRecord, collectProofInputs } from "../../evidence/prove.js";
|
|
14
|
+
import { resolveCommit } from "../../git.js";
|
|
15
|
+
function renderProofMarkdown(record) {
|
|
16
|
+
const s = record.summary;
|
|
17
|
+
if (s.total === 0) {
|
|
18
|
+
return `**df_prove**: ${record.commit.slice(0, 12)} — no objectives declared (.darkfactory/objectives.yaml absent or empty).`;
|
|
19
|
+
}
|
|
20
|
+
const glyph = { proven: "✓", pending: "…", failed: "✗" };
|
|
21
|
+
const lines = [
|
|
22
|
+
`**df_prove**: ${record.commit.slice(0, 12)} — ${s.proven} proven · ${s.pending} pending · ${s.failed} failed (${s.total} total)`,
|
|
23
|
+
];
|
|
24
|
+
for (const o of record.objectives) {
|
|
25
|
+
lines.push(` ${glyph[o.status] ?? "?"} ${o.id} [${o.status}${o.enforced ? ", enforced" : ""}] — ${o.text}`);
|
|
26
|
+
for (const b of o.bindings) {
|
|
27
|
+
lines.push(` ${b.kind}[${b.ref}] ${b.status} — ${b.detail}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return lines.join("\n");
|
|
31
|
+
}
|
|
32
|
+
const bindingZ = z.object({
|
|
33
|
+
kind: z.string().describe("'route' | 'critic' | 'test' (mirrors the EvidenceBinding kind)."),
|
|
34
|
+
ref: z.string().describe("routeId | criticId | test ref."),
|
|
35
|
+
status: z.string().describe("'proven' | 'pending' | 'failed'."),
|
|
36
|
+
detail: z.string().describe("Short human derivation of the status."),
|
|
37
|
+
uploadId: z.string().optional().describe("Cerebe object id, present once df publish has run."),
|
|
38
|
+
});
|
|
39
|
+
const objectiveZ = z.object({
|
|
40
|
+
id: z.string(),
|
|
41
|
+
text: z.string(),
|
|
42
|
+
enforced: z.boolean(),
|
|
43
|
+
status: z.string().describe("'proven' | 'pending' | 'failed' — worst-of its bindings."),
|
|
44
|
+
bindings: z.array(bindingZ),
|
|
45
|
+
});
|
|
46
|
+
export function registerProveTool(server, opts = {}) {
|
|
47
|
+
server.registerTool("df_prove", {
|
|
48
|
+
title: "Closeout proof readout: which objectives are proven by their evidence",
|
|
49
|
+
description: "Join `.darkfactory/objectives.yaml` against the local evidence for a " +
|
|
50
|
+
"commit (route exit codes from `df verify`, critic verdicts from " +
|
|
51
|
+
"`df review`) and return a BoundProofRecord — each objective resolved to " +
|
|
52
|
+
"proven / pending / failed. A `pending` binding awaits evidence (e.g. the " +
|
|
53
|
+
"critic fleet has not run on HEAD yet), distinct from `failed`. Use this " +
|
|
54
|
+
"at closeout to cite proof instead of asserting completion. " +
|
|
55
|
+
"Agent-attested, evidence-backed — not independent verification.",
|
|
56
|
+
inputSchema: {
|
|
57
|
+
commit: z
|
|
58
|
+
.string()
|
|
59
|
+
.min(1)
|
|
60
|
+
.describe("Commit reference accepted by `git rev-parse` (SHA, 'HEAD', branch)."),
|
|
61
|
+
},
|
|
62
|
+
outputSchema: {
|
|
63
|
+
schemaVersion: z.number(),
|
|
64
|
+
commit: z.string().describe("Resolved commit SHA."),
|
|
65
|
+
diffHash: z.string().optional().describe("The gated diff hash evidence binds to."),
|
|
66
|
+
provenance: z.string().describe("'consumer-attested' for the local readout."),
|
|
67
|
+
generatedAt: z.string(),
|
|
68
|
+
objectives: z.array(objectiveZ),
|
|
69
|
+
summary: z.object({
|
|
70
|
+
proven: z.number(),
|
|
71
|
+
pending: z.number(),
|
|
72
|
+
failed: z.number(),
|
|
73
|
+
total: z.number(),
|
|
74
|
+
}),
|
|
75
|
+
},
|
|
76
|
+
annotations: {
|
|
77
|
+
readOnlyHint: true,
|
|
78
|
+
openWorldHint: false,
|
|
79
|
+
},
|
|
80
|
+
}, async ({ commit }) => {
|
|
81
|
+
const cwd = resolve(opts.cwd ?? process.cwd());
|
|
82
|
+
const now = opts.now ?? (() => new Date().toISOString());
|
|
83
|
+
let record;
|
|
84
|
+
try {
|
|
85
|
+
const collected = await collectProofInputs(cwd, commit);
|
|
86
|
+
if (collected) {
|
|
87
|
+
record = buildProofRecord(collected.inputs, now());
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// No manifest → an empty record (the "no objectives declared" signal).
|
|
91
|
+
// Still resolve the ref to a SHA so `commit` matches the contract (a
|
|
92
|
+
// resolved SHA) regardless of whether a manifest exists.
|
|
93
|
+
const sha = await resolveCommit(commit, cwd);
|
|
94
|
+
record = buildProofRecord({ commit: sha, objectives: [], gateResults: {}, criticResults: {} }, now());
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return {
|
|
99
|
+
isError: true,
|
|
100
|
+
content: [{ type: "text", text: `**df_prove**: error for "${commit}" — ${err.message}` }],
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
structuredContent: record,
|
|
105
|
+
content: [{ type: "text", text: renderProofMarkdown(record) }],
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=prove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prove.js","sourceRoot":"","sources":["../../../src/mcp/tools/prove.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@momentiq/dark-factory-cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.10.0",
|
|
4
4
|
"description": "Dark Factory OSS CLI — multi-vendor adversarial critic orchestration (Cursor, Codex, Gemini, Grok) with min-complete-quorum aggregation and trusted-surface rebind",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://momentiq.ai/dark-factory",
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"@google/genai": "^2.2.0",
|
|
99
99
|
"@iarna/toml": "2.2.5",
|
|
100
100
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
101
|
-
"@momentiq/dark-factory-schemas": "0.
|
|
101
|
+
"@momentiq/dark-factory-schemas": "0.11.0",
|
|
102
102
|
"@openai/codex-sdk": "^0.130.0",
|
|
103
103
|
"@yarnpkg/lockfile": "1.1.0",
|
|
104
104
|
"ajv": "^8.20.0",
|