@deftai/directive 0.61.2 → 0.63.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/{branch-parity.d.ts → branch-fixtures.d.ts} +1 -3
- package/dist/{branch-parity.js → branch-fixtures.js} +3 -110
- package/dist/dispatch.d.ts +1 -1
- package/dist/dispatch.js +4 -1
- package/dist/framework-check-updates.d.ts +10 -0
- package/dist/framework-check-updates.js +68 -0
- package/dist/install-cli/coverage-map.js +3 -2
- package/dist/orchestration-cli/coverage-map.js +1 -1
- package/dist/{policy-parity.d.ts → policy-fixtures.d.ts} +1 -3
- package/dist/{policy-parity.js → policy-fixtures.js} +4 -100
- package/dist/{release-e2e-parity.d.ts → release-e2e-fixtures.d.ts} +1 -3
- package/dist/release-e2e-fixtures.js +38 -0
- package/dist/{story-ready-parity.d.ts → story-ready-fixtures.d.ts} +1 -3
- package/dist/{story-ready-parity.js → story-ready-fixtures.js} +4 -121
- package/dist/{triage-aux-a-parity.d.ts → triage-aux-a-fixtures.d.ts} +1 -3
- package/dist/{triage-aux-a-parity.js → triage-aux-a-fixtures.js} +3 -73
- package/dist/{triage-aux-b-parity.d.ts → triage-aux-b-fixtures.d.ts} +1 -3
- package/dist/triage-aux-b-fixtures.js +167 -0
- package/dist/{triage-bootstrap-parity.d.ts → triage-bootstrap-fixtures.d.ts} +1 -3
- package/dist/{triage-bootstrap-parity.js → triage-bootstrap-fixtures.js} +4 -91
- package/dist/{triage-classify-parity.d.ts → triage-classify-fixtures.d.ts} +1 -3
- package/dist/{triage-classify-parity.js → triage-classify-fixtures.js} +4 -94
- package/dist/{triage-queue-parity.d.ts → triage-queue-fixtures.d.ts} +1 -3
- package/dist/{triage-queue-parity.js → triage-queue-fixtures.js} +4 -86
- package/dist/{triage-scope-parity.d.ts → triage-scope-fixtures.d.ts} +1 -3
- package/dist/{triage-scope-parity.js → triage-scope-fixtures.js} +4 -91
- package/dist/umbrella-current-shape.d.ts +9 -0
- package/dist/umbrella-current-shape.js +56 -0
- package/dist/{vbrief-preflight-parity.d.ts → vbrief-preflight-fixtures.d.ts} +1 -3
- package/dist/vbrief-preflight-fixtures.js +79 -0
- package/dist/{wip-cap-parity.d.ts → wip-cap-fixtures.d.ts} +1 -3
- package/dist/{wip-cap-parity.js → wip-cap-fixtures.js} +4 -91
- package/package.json +4 -15
- package/dist/cache-parity.d.ts +0 -36
- package/dist/cache-parity.js +0 -165
- package/dist/codebase-parity.d.ts +0 -31
- package/dist/codebase-parity.js +0 -303
- package/dist/doc-cli-parity.d.ts +0 -29
- package/dist/doc-cli-parity.js +0 -159
- package/dist/doctor-parity.d.ts +0 -42
- package/dist/doctor-parity.js +0 -157
- package/dist/intake-parity.d.ts +0 -30
- package/dist/intake-parity.js +0 -203
- package/dist/lifecycle-packs-parity.d.ts +0 -30
- package/dist/lifecycle-packs-parity.js +0 -377
- package/dist/orchestration-parity.d.ts +0 -38
- package/dist/orchestration-parity.js +0 -364
- package/dist/parity.d.ts +0 -36
- package/dist/parity.js +0 -176
- package/dist/platform-parity.d.ts +0 -26
- package/dist/platform-parity.js +0 -309
- package/dist/pr-closing-keywords-parity.d.ts +0 -45
- package/dist/pr-closing-keywords-parity.js +0 -259
- package/dist/pr-merge-readiness-parity.d.ts +0 -44
- package/dist/pr-merge-readiness-parity.js +0 -296
- package/dist/pr-monitor-parity.d.ts +0 -44
- package/dist/pr-monitor-parity.js +0 -283
- package/dist/pr-protected-issues-parity.d.ts +0 -41
- package/dist/pr-protected-issues-parity.js +0 -220
- package/dist/pr-wait-mergeable-parity.d.ts +0 -45
- package/dist/pr-wait-mergeable-parity.js +0 -340
- package/dist/release-e2e-parity.js +0 -114
- package/dist/release-parity.d.ts +0 -40
- package/dist/release-parity.js +0 -226
- package/dist/release-publish-parity.d.ts +0 -36
- package/dist/release-publish-parity.js +0 -138
- package/dist/release-rollback-parity.d.ts +0 -37
- package/dist/release-rollback-parity.js +0 -161
- package/dist/render-parity.d.ts +0 -36
- package/dist/render-parity.js +0 -385
- package/dist/scm-parity.d.ts +0 -39
- package/dist/scm-parity.js +0 -181
- package/dist/scope-lifecycle-parity.d.ts +0 -35
- package/dist/scope-lifecycle-parity.js +0 -177
- package/dist/session-parity.d.ts +0 -39
- package/dist/session-parity.js +0 -262
- package/dist/slice-parity.d.ts +0 -36
- package/dist/slice-parity.js +0 -304
- package/dist/swarm-parity.d.ts +0 -28
- package/dist/swarm-parity.js +0 -327
- package/dist/triage-actions-parity.d.ts +0 -36
- package/dist/triage-actions-parity.js +0 -357
- package/dist/triage-aux-b-parity.js +0 -308
- package/dist/triage-summary-parity.d.ts +0 -50
- package/dist/triage-summary-parity.js +0 -306
- package/dist/validate-content-parity.d.ts +0 -33
- package/dist/validate-content-parity.js +0 -356
- package/dist/vbrief-activate-parity.d.ts +0 -39
- package/dist/vbrief-activate-parity.js +0 -216
- package/dist/vbrief-build-parity.d.ts +0 -28
- package/dist/vbrief-build-parity.js +0 -399
- package/dist/vbrief-preflight-parity.js +0 -163
- package/dist/vbrief-reconcile-parity.d.ts +0 -23
- package/dist/vbrief-reconcile-parity.js +0 -609
- package/dist/vbrief-validate-parity.d.ts +0 -27
- package/dist/vbrief-validate-parity.js +0 -122
- package/dist/vbrief-validation-parity.d.ts +0 -28
- package/dist/vbrief-validation-parity.js +0 -645
- package/dist/verify-env-parity.d.ts +0 -28
- package/dist/verify-env-parity.js +0 -272
- package/dist/verify-source-parity.d.ts +0 -26
- package/dist/verify-source-parity.js +0 -178
|
@@ -1,377 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Golden-output parity harness (#1787 s2): runs BOTH the frozen Python oracles
|
|
4
|
-
* (`packs_slice`, `quarantine_ext`, `_lifecycle_hygiene`, `_event_detect`) and
|
|
5
|
-
* the ported TS lifecycle/packs modules over shared fixtures, cache-off.
|
|
6
|
-
*
|
|
7
|
-
* Exit codes: 0 parity / 1 divergence / 2 harness setup error.
|
|
8
|
-
*/
|
|
9
|
-
import { execFileSync } from "node:child_process";
|
|
10
|
-
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
11
|
-
import { tmpdir } from "node:os";
|
|
12
|
-
import { dirname, join, resolve } from "node:path";
|
|
13
|
-
import { fileURLToPath } from "node:url";
|
|
14
|
-
import { eventDetect, lifecycleHygiene } from "@deftai/directive-core/lifecycle";
|
|
15
|
-
import { packsSlice, quarantineExt } from "@deftai/directive-core/packs";
|
|
16
|
-
const NOW_ISO = "2026-06-01T12:00:00.000Z";
|
|
17
|
-
function runCapture(cmd, args, cwd, env = {}) {
|
|
18
|
-
const merged = {
|
|
19
|
-
...process.env,
|
|
20
|
-
DEFT_CACHE_DISABLE: "1",
|
|
21
|
-
PYTHONUTF8: "1",
|
|
22
|
-
...env,
|
|
23
|
-
};
|
|
24
|
-
for (const key of Object.keys(merged)) {
|
|
25
|
-
if (merged[key] === undefined)
|
|
26
|
-
delete merged[key];
|
|
27
|
-
}
|
|
28
|
-
try {
|
|
29
|
-
const stdout = execFileSync(cmd, args, {
|
|
30
|
-
cwd,
|
|
31
|
-
encoding: "utf8",
|
|
32
|
-
env: merged,
|
|
33
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
34
|
-
});
|
|
35
|
-
return { status: 0, stdout, stderr: "" };
|
|
36
|
-
}
|
|
37
|
-
catch (err) {
|
|
38
|
-
const e = err;
|
|
39
|
-
return {
|
|
40
|
-
status: typeof e.status === "number" ? e.status : 2,
|
|
41
|
-
stdout: typeof e.stdout === "string" ? e.stdout : "",
|
|
42
|
-
stderr: typeof e.stderr === "string" ? e.stderr : "",
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
function resolveDeftRoot() {
|
|
47
|
-
if (process.env.DEFT_ROOT !== undefined && process.env.DEFT_ROOT.length > 0) {
|
|
48
|
-
return resolve(process.env.DEFT_ROOT);
|
|
49
|
-
}
|
|
50
|
-
return resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
|
|
51
|
-
}
|
|
52
|
-
function runPythonScript(deftRoot, script) {
|
|
53
|
-
return runCapture("uv", ["run", "python", "-c", script], deftRoot);
|
|
54
|
-
}
|
|
55
|
-
function writeJson(path, data) {
|
|
56
|
-
writeFileSync(path, `${JSON.stringify(data)}\n`, { encoding: "utf8" });
|
|
57
|
-
}
|
|
58
|
-
function makeLifecycle(root) {
|
|
59
|
-
for (const folder of ["proposed", "pending", "active", "completed", "cancelled"]) {
|
|
60
|
-
mkdirSync(join(root, "vbrief", folder), { recursive: true });
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
function writeFixturePack(repo) {
|
|
64
|
-
const schema = {
|
|
65
|
-
"x-sliceRegistry": {
|
|
66
|
-
recent: {
|
|
67
|
-
path: "lessons",
|
|
68
|
-
filters: ["since"],
|
|
69
|
-
description: "Lessons dated on or after --since.",
|
|
70
|
-
},
|
|
71
|
-
"by-tag": {
|
|
72
|
-
path: "lessons",
|
|
73
|
-
filters: ["tag"],
|
|
74
|
-
description: "Lessons carrying any requested --tag.",
|
|
75
|
-
},
|
|
76
|
-
},
|
|
77
|
-
"x-display": {
|
|
78
|
-
heading: "title",
|
|
79
|
-
fields: [],
|
|
80
|
-
body: "body",
|
|
81
|
-
noun: "lessons",
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
const source = {
|
|
85
|
-
pack: "lessons-pack-0.1",
|
|
86
|
-
version: "0.1",
|
|
87
|
-
lessons: [
|
|
88
|
-
{
|
|
89
|
-
id: "old-windows",
|
|
90
|
-
title: "Old Windows Lesson (2026-03)",
|
|
91
|
-
date: "2026-03",
|
|
92
|
-
issue_refs: [],
|
|
93
|
-
tags: ["windows", "encoding"],
|
|
94
|
-
source: "PR #1",
|
|
95
|
-
body: "Body about cp1252.",
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
id: "mid-swarm",
|
|
99
|
-
title: "Mid Swarm Lesson (2026-05)",
|
|
100
|
-
date: "2026-05",
|
|
101
|
-
issue_refs: ["#42"],
|
|
102
|
-
tags: ["swarm"],
|
|
103
|
-
source: null,
|
|
104
|
-
body: "Body about a swarm cohort.",
|
|
105
|
-
},
|
|
106
|
-
],
|
|
107
|
-
};
|
|
108
|
-
const packDir = join(repo, "packs", "lessons");
|
|
109
|
-
mkdirSync(packDir, { recursive: true });
|
|
110
|
-
mkdirSync(join(repo, "vbrief", "schemas"), { recursive: true });
|
|
111
|
-
writeJson(join(packDir, "lessons-pack-0.1.json"), source);
|
|
112
|
-
writeJson(join(repo, "vbrief", "schemas", "lessons-pack.schema.json"), schema);
|
|
113
|
-
}
|
|
114
|
-
function writeStrandedEpic(repo) {
|
|
115
|
-
makeLifecycle(repo);
|
|
116
|
-
const old = "2026-04-01T00:00:00Z";
|
|
117
|
-
writeJson(join(repo, "vbrief", "active", "2026-04-01-epic.vbrief.json"), {
|
|
118
|
-
vBRIEFInfo: { version: "0.6" },
|
|
119
|
-
plan: {
|
|
120
|
-
title: "OAuth Epic",
|
|
121
|
-
status: "running",
|
|
122
|
-
updated: old,
|
|
123
|
-
metadata: { kind: "epic" },
|
|
124
|
-
references: [
|
|
125
|
-
{ type: "x-vbrief/plan", uri: "completed/2026-04-01-child-a.vbrief.json" },
|
|
126
|
-
{ type: "x-vbrief/plan", uri: "active/2026-04-01-child-b.vbrief.json" },
|
|
127
|
-
],
|
|
128
|
-
items: [],
|
|
129
|
-
},
|
|
130
|
-
});
|
|
131
|
-
writeJson(join(repo, "vbrief", "completed", "2026-04-01-child-a.vbrief.json"), {
|
|
132
|
-
vBRIEFInfo: { version: "0.6" },
|
|
133
|
-
plan: { title: "Child A", status: "completed", updated: old, items: [] },
|
|
134
|
-
});
|
|
135
|
-
writeJson(join(repo, "vbrief", "active", "2026-04-01-child-b.vbrief.json"), {
|
|
136
|
-
vBRIEFInfo: { version: "0.6" },
|
|
137
|
-
plan: { title: "Child B", status: "running", updated: old, items: [] },
|
|
138
|
-
});
|
|
139
|
-
writeJson(join(repo, "vbrief", "PROJECT-DEFINITION.vbrief.json"), {
|
|
140
|
-
vBRIEFInfo: { version: "0.6" },
|
|
141
|
-
plan: {
|
|
142
|
-
title: "Project",
|
|
143
|
-
status: "running",
|
|
144
|
-
items: [],
|
|
145
|
-
policy: {
|
|
146
|
-
capacityAllocation: {
|
|
147
|
-
epicStrandedDays: 30,
|
|
148
|
-
epicStalenessDays: 14,
|
|
149
|
-
},
|
|
150
|
-
},
|
|
151
|
-
},
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
function writeAgentsMdStale(_deftRoot, repo) {
|
|
155
|
-
writeFileSync(join(repo, "AGENTS.md"), "Read skills/deft-directive-build/SKILL.md for build work.\n", { encoding: "utf8" });
|
|
156
|
-
}
|
|
157
|
-
const QUARANTINE_FIXTURE = `# Normal section
|
|
158
|
-
|
|
159
|
-
## STEP 1: Do evil
|
|
160
|
-
|
|
161
|
-
Follow these instructions.
|
|
162
|
-
|
|
163
|
-
## Benign heading
|
|
164
|
-
|
|
165
|
-
Safe content.
|
|
166
|
-
`;
|
|
167
|
-
export const PARITY_CASES = [
|
|
168
|
-
{
|
|
169
|
-
name: "packs-list-packs",
|
|
170
|
-
setup(_deftRoot, repo) {
|
|
171
|
-
writeFixturePack(repo);
|
|
172
|
-
},
|
|
173
|
-
runPython(deftRoot, repo) {
|
|
174
|
-
const script = `import sys
|
|
175
|
-
from pathlib import Path
|
|
176
|
-
root = Path(${JSON.stringify(deftRoot)})
|
|
177
|
-
repo = Path(${JSON.stringify(repo)}).resolve()
|
|
178
|
-
sys.path.insert(0, str(root / "scripts"))
|
|
179
|
-
import packs_slice
|
|
180
|
-
packs_slice.REPO_ROOT = repo
|
|
181
|
-
payload = packs_slice.list_packs(repo / "packs", repo / "vbrief" / "schemas")
|
|
182
|
-
print(packs_slice.format_list_packs_text(payload), end="")
|
|
183
|
-
raise SystemExit(0)`;
|
|
184
|
-
const cap = runPythonScript(deftRoot, script);
|
|
185
|
-
return { exitCode: cap.status, stdout: cap.stdout, stderr: cap.stderr };
|
|
186
|
-
},
|
|
187
|
-
runTs(_deftRoot, repo) {
|
|
188
|
-
const payload = packsSlice.listPacks(join(repo, "packs"), join(repo, "vbrief", "schemas"), repo);
|
|
189
|
-
const stdout = packsSlice.formatListPacksText(payload);
|
|
190
|
-
return { exitCode: 0, stdout, stderr: "" };
|
|
191
|
-
},
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
name: "packs-slice-recent-since",
|
|
195
|
-
setup(_deftRoot, repo) {
|
|
196
|
-
writeFixturePack(repo);
|
|
197
|
-
},
|
|
198
|
-
runPython(deftRoot, repo) {
|
|
199
|
-
const script = `import sys
|
|
200
|
-
from pathlib import Path
|
|
201
|
-
root = Path(${JSON.stringify(deftRoot)})
|
|
202
|
-
repo = Path(${JSON.stringify(repo)}).resolve()
|
|
203
|
-
sys.path.insert(0, str(root / "scripts"))
|
|
204
|
-
import packs_slice
|
|
205
|
-
packs_slice.REPO_ROOT = repo
|
|
206
|
-
packs_slice.PACK_REGISTRY["lessons"] = {
|
|
207
|
-
"source": repo / "packs" / "lessons" / "lessons-pack-0.1.json",
|
|
208
|
-
"schema": repo / "vbrief" / "schemas" / "lessons-pack.schema.json",
|
|
209
|
-
}
|
|
210
|
-
source_path = repo / "packs" / "lessons" / "lessons-pack-0.1.json"
|
|
211
|
-
schema_path = repo / "vbrief" / "schemas" / "lessons-pack.schema.json"
|
|
212
|
-
registry = packs_slice.load_registry(schema_path)
|
|
213
|
-
data = packs_slice.load_source(source_path)
|
|
214
|
-
result = packs_slice.slice_pack(data["pack"], "recent", registry, data, source_path, since="2026-05")
|
|
215
|
-
display = packs_slice.load_display(schema_path)
|
|
216
|
-
print(packs_slice.format_slice_text(result, display), end="")
|
|
217
|
-
raise SystemExit(0)`;
|
|
218
|
-
const cap = runPythonScript(deftRoot, script);
|
|
219
|
-
return { exitCode: cap.status, stdout: cap.stdout, stderr: cap.stderr };
|
|
220
|
-
},
|
|
221
|
-
runTs(_deftRoot, repo) {
|
|
222
|
-
const source = join(repo, "packs", "lessons", "lessons-pack-0.1.json");
|
|
223
|
-
const schema = join(repo, "vbrief", "schemas", "lessons-pack.schema.json");
|
|
224
|
-
const registry = packsSlice.loadRegistry(schema);
|
|
225
|
-
const data = packsSlice.loadSource(source);
|
|
226
|
-
const result = packsSlice.slicePack(String(data.pack ?? "lessons"), "recent", registry, data, source, { since: "2026-05", repoRoot: repo });
|
|
227
|
-
const display = packsSlice.loadDisplay(schema);
|
|
228
|
-
return { exitCode: 0, stdout: packsSlice.formatSliceText(result, display), stderr: "" };
|
|
229
|
-
},
|
|
230
|
-
},
|
|
231
|
-
{
|
|
232
|
-
name: "quarantine-ext-heading",
|
|
233
|
-
runPython(deftRoot) {
|
|
234
|
-
const script = `import sys
|
|
235
|
-
from pathlib import Path
|
|
236
|
-
root = Path(${JSON.stringify(deftRoot)})
|
|
237
|
-
sys.path.insert(0, str(root / "scripts"))
|
|
238
|
-
import quarantine_ext
|
|
239
|
-
text = ${JSON.stringify(QUARANTINE_FIXTURE)}
|
|
240
|
-
sys.stdout.write(quarantine_ext.quarantine_body(text))
|
|
241
|
-
raise SystemExit(0)`;
|
|
242
|
-
const cap = runPythonScript(deftRoot, script);
|
|
243
|
-
return { exitCode: cap.status, stdout: cap.stdout, stderr: cap.stderr };
|
|
244
|
-
},
|
|
245
|
-
runTs() {
|
|
246
|
-
const stdout = quarantineExt.quarantineBody(QUARANTINE_FIXTURE);
|
|
247
|
-
return { exitCode: 0, stdout, stderr: "" };
|
|
248
|
-
},
|
|
249
|
-
},
|
|
250
|
-
{
|
|
251
|
-
name: "lifecycle-stranded-nudge",
|
|
252
|
-
setup(_deftRoot, repo) {
|
|
253
|
-
writeStrandedEpic(repo);
|
|
254
|
-
},
|
|
255
|
-
runPython(deftRoot, repo) {
|
|
256
|
-
const script = `import sys
|
|
257
|
-
from datetime import datetime, UTC
|
|
258
|
-
from pathlib import Path
|
|
259
|
-
root = Path(${JSON.stringify(deftRoot)})
|
|
260
|
-
repo = Path(${JSON.stringify(repo)})
|
|
261
|
-
sys.path.insert(0, str(root / "scripts"))
|
|
262
|
-
import _lifecycle_hygiene as lifecycle_hygiene
|
|
263
|
-
now = datetime.fromisoformat(${JSON.stringify(NOW_ISO)}.replace("Z", "+00:00"))
|
|
264
|
-
nudges = lifecycle_hygiene.detect_lifecycle_nudges(repo, now=now)
|
|
265
|
-
lines = [n.message for n in nudges if n.kind == "stranded"]
|
|
266
|
-
print("\\n".join(lines))
|
|
267
|
-
raise SystemExit(0)`;
|
|
268
|
-
const cap = runPythonScript(deftRoot, script);
|
|
269
|
-
return { exitCode: cap.status, stdout: cap.stdout, stderr: cap.stderr };
|
|
270
|
-
},
|
|
271
|
-
runTs(_deftRoot, repo) {
|
|
272
|
-
const now = new Date(NOW_ISO);
|
|
273
|
-
const nudges = lifecycleHygiene.detectLifecycleNudges(repo, { now });
|
|
274
|
-
const lines = nudges.filter((n) => n.kind === "stranded").map((n) => n.message);
|
|
275
|
-
return { exitCode: 0, stdout: `${lines.join("\n")}\n`, stderr: "" };
|
|
276
|
-
},
|
|
277
|
-
},
|
|
278
|
-
{
|
|
279
|
-
name: "event-detect-agents-md-stale",
|
|
280
|
-
setup(deftRoot, repo) {
|
|
281
|
-
writeAgentsMdStale(deftRoot, repo);
|
|
282
|
-
},
|
|
283
|
-
runPython(deftRoot, repo) {
|
|
284
|
-
const script = `import json, sys
|
|
285
|
-
from pathlib import Path
|
|
286
|
-
root = Path(${JSON.stringify(deftRoot)})
|
|
287
|
-
repo = Path(${JSON.stringify(repo)})
|
|
288
|
-
sys.path.insert(0, str(root / "scripts"))
|
|
289
|
-
import _event_detect as event_detect
|
|
290
|
-
payload = event_detect.detect_agents_md_stale(repo, framework_root=root)
|
|
291
|
-
print(json.dumps(payload, sort_keys=True) if payload else "null")
|
|
292
|
-
raise SystemExit(0)`;
|
|
293
|
-
const cap = runPythonScript(deftRoot, script);
|
|
294
|
-
return { exitCode: cap.status, stdout: cap.stdout, stderr: cap.stderr };
|
|
295
|
-
},
|
|
296
|
-
runTs(deftRoot, repo) {
|
|
297
|
-
eventDetect.clearRegistryCache();
|
|
298
|
-
const payload = eventDetect.detectAgentsMdStale(repo, { frameworkRoot: deftRoot });
|
|
299
|
-
const stdout = payload === null ? "null\n" : `${JSON.stringify(payload, Object.keys(payload).sort())}\n`;
|
|
300
|
-
return { exitCode: 0, stdout, stderr: "" };
|
|
301
|
-
},
|
|
302
|
-
},
|
|
303
|
-
];
|
|
304
|
-
export function normalizeOutput(text) {
|
|
305
|
-
return text.replace(/\r\n/g, "\n");
|
|
306
|
-
}
|
|
307
|
-
export function diffCase(python, ts, caseName) {
|
|
308
|
-
const pyOut = normalizeOutput(python.stdout);
|
|
309
|
-
const tsOut = normalizeOutput(ts.stdout);
|
|
310
|
-
const pyErr = normalizeOutput(python.stderr);
|
|
311
|
-
const tsErr = normalizeOutput(ts.stderr);
|
|
312
|
-
return {
|
|
313
|
-
caseName,
|
|
314
|
-
exitMismatch: python.exitCode !== ts.exitCode,
|
|
315
|
-
stdoutMismatch: pyOut !== tsOut,
|
|
316
|
-
stderrMismatch: pyErr !== tsErr,
|
|
317
|
-
pythonExit: python.exitCode,
|
|
318
|
-
tsExit: ts.exitCode,
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
export function runParity() {
|
|
322
|
-
const deftRoot = resolveDeftRoot();
|
|
323
|
-
const diffs = [];
|
|
324
|
-
for (const testCase of PARITY_CASES) {
|
|
325
|
-
const pyRepo = mkdtempSync(join(tmpdir(), "deft-lp-parity-py-"));
|
|
326
|
-
const tsRepo = mkdtempSync(join(tmpdir(), "deft-lp-parity-ts-"));
|
|
327
|
-
try {
|
|
328
|
-
if (testCase.setup !== undefined) {
|
|
329
|
-
testCase.setup(deftRoot, pyRepo);
|
|
330
|
-
testCase.setup(deftRoot, tsRepo);
|
|
331
|
-
}
|
|
332
|
-
const python = testCase.runPython(deftRoot, pyRepo);
|
|
333
|
-
const ts = testCase.runTs(deftRoot, tsRepo);
|
|
334
|
-
diffs.push(diffCase(python, ts, testCase.name));
|
|
335
|
-
}
|
|
336
|
-
finally {
|
|
337
|
-
rmSync(pyRepo, { recursive: true, force: true });
|
|
338
|
-
rmSync(tsRepo, { recursive: true, force: true });
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
const ok = diffs.every((d) => !d.exitMismatch && !d.stdoutMismatch && !d.stderrMismatch);
|
|
342
|
-
return { ok, diffs };
|
|
343
|
-
}
|
|
344
|
-
export function renderReport(result) {
|
|
345
|
-
if (result.ok) {
|
|
346
|
-
return `lifecycle-packs parity: CLEAN -- Python and TS agree on ${PARITY_CASES.length} case(s).`;
|
|
347
|
-
}
|
|
348
|
-
const lines = ["lifecycle-packs parity: DIVERGENCE"];
|
|
349
|
-
for (const d of result.diffs) {
|
|
350
|
-
if (d.exitMismatch || d.stdoutMismatch || d.stderrMismatch) {
|
|
351
|
-
lines.push(` case: ${d.caseName}`);
|
|
352
|
-
if (d.exitMismatch)
|
|
353
|
-
lines.push(` exit: python=${d.pythonExit} ts=${d.tsExit}`);
|
|
354
|
-
if (d.stdoutMismatch)
|
|
355
|
-
lines.push(" stdout mismatch");
|
|
356
|
-
if (d.stderrMismatch)
|
|
357
|
-
lines.push(" stderr mismatch");
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
return lines.join("\n");
|
|
361
|
-
}
|
|
362
|
-
if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
363
|
-
try {
|
|
364
|
-
const result = runParity();
|
|
365
|
-
if (result.ok) {
|
|
366
|
-
process.stdout.write(`${renderReport(result)}\n`);
|
|
367
|
-
process.exit(0);
|
|
368
|
-
}
|
|
369
|
-
process.stderr.write(`${renderReport(result)}\n`);
|
|
370
|
-
process.exit(1);
|
|
371
|
-
}
|
|
372
|
-
catch (err) {
|
|
373
|
-
process.stderr.write(`lifecycle-packs parity: harness error -- ${String(err)}\n`);
|
|
374
|
-
process.exit(2);
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
//# sourceMappingURL=lifecycle-packs-parity.js.map
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
export interface ScenarioResult {
|
|
3
|
-
readonly name: string;
|
|
4
|
-
readonly exitCode: number;
|
|
5
|
-
readonly stdout: string;
|
|
6
|
-
readonly stderr: string;
|
|
7
|
-
}
|
|
8
|
-
export interface ParityScenario {
|
|
9
|
-
readonly name: string;
|
|
10
|
-
readonly module: "subagent_monitor" | "probe_session" | "verify_investigation" | "verify_judgment_gates";
|
|
11
|
-
readonly argv: readonly string[];
|
|
12
|
-
readonly setup?: (root: string) => void;
|
|
13
|
-
}
|
|
14
|
-
export interface ParityResult {
|
|
15
|
-
readonly ok: boolean;
|
|
16
|
-
readonly scenarios: Array<{
|
|
17
|
-
readonly name: string;
|
|
18
|
-
readonly exitMismatch: boolean;
|
|
19
|
-
readonly pythonExit: number;
|
|
20
|
-
readonly tsExit: number;
|
|
21
|
-
readonly stdoutMismatch: boolean;
|
|
22
|
-
readonly stderrMismatch: boolean;
|
|
23
|
-
readonly pythonStdout: string;
|
|
24
|
-
readonly tsStdout: string;
|
|
25
|
-
readonly pythonStderr: string;
|
|
26
|
-
readonly tsStderr: string;
|
|
27
|
-
}>;
|
|
28
|
-
}
|
|
29
|
-
export declare const PARITY_SCENARIOS: readonly ParityScenario[];
|
|
30
|
-
export declare function normaliseHarnessNoise(text: string): string;
|
|
31
|
-
export declare function diffParity(python: ScenarioResult, ts: ScenarioResult): {
|
|
32
|
-
exitMismatch: boolean;
|
|
33
|
-
stdoutMismatch: boolean;
|
|
34
|
-
stderrMismatch: boolean;
|
|
35
|
-
};
|
|
36
|
-
export declare function runParity(): ParityResult;
|
|
37
|
-
export declare function renderReport(result: ParityResult): string;
|
|
38
|
-
//# sourceMappingURL=orchestration-parity.d.ts.map
|