@dzhechkov/harness-cli 0.4.6 → 0.5.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/.dz-manifest.json +125 -21
- package/LICENSE +21 -0
- package/README.md +501 -30
- package/dist/bin.d.ts +10 -0
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +45 -12
- package/dist/bin.js.map +1 -1
- package/dist/cli.d.ts +110 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2206 -195
- package/dist/cli.js.map +1 -1
- package/dist/core-compat.d.ts +106 -0
- package/dist/core-compat.d.ts.map +1 -0
- package/dist/core-compat.js +252 -0
- package/dist/core-compat.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/package.json +12 -12
- package/sbom.json +280 -20
- package/src/bin.ts +43 -12
- package/src/cli.ts +2315 -184
- package/src/core-compat.ts +240 -0
- package/src/index.ts +4 -0
package/dist/bin.d.ts
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
3
|
* `dz` executable entry point.
|
|
4
|
+
*
|
|
5
|
+
* Two phases, and the split is load-bearing (feature dz-cli-defects, D5):
|
|
6
|
+
*
|
|
7
|
+
* phase 1 — ZERO `@dzhechkov/harness-core` imports: probe the installed core version
|
|
8
|
+
* and refuse with a NAMED message if it is below `MIN_CORE`;
|
|
9
|
+
* phase 2 — `await import('./cli.js')`, which is where the ~100-name static graph is
|
|
10
|
+
* linked. A STATIC import here would link that graph before any guard could
|
|
11
|
+
* run, which is exactly how a cached lower core produced a bare
|
|
12
|
+
* `SyntaxError: … does not provide an export named 'GRADE_SUCCESS_FLOOR'`
|
|
13
|
+
* with nothing pointing at the cause.
|
|
4
14
|
*/
|
|
5
15
|
export {};
|
|
6
16
|
//# sourceMappingURL=bin.d.ts.map
|
package/dist/bin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
|
package/dist/bin.js
CHANGED
|
@@ -1,17 +1,50 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
3
|
* `dz` executable entry point.
|
|
4
|
+
*
|
|
5
|
+
* Two phases, and the split is load-bearing (feature dz-cli-defects, D5):
|
|
6
|
+
*
|
|
7
|
+
* phase 1 — ZERO `@dzhechkov/harness-core` imports: probe the installed core version
|
|
8
|
+
* and refuse with a NAMED message if it is below `MIN_CORE`;
|
|
9
|
+
* phase 2 — `await import('./cli.js')`, which is where the ~100-name static graph is
|
|
10
|
+
* linked. A STATIC import here would link that graph before any guard could
|
|
11
|
+
* run, which is exactly how a cached lower core produced a bare
|
|
12
|
+
* `SyntaxError: … does not provide an export named 'GRADE_SUCCESS_FLOOR'`
|
|
13
|
+
* with nothing pointing at the cause.
|
|
4
14
|
*/
|
|
5
|
-
import {
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
//
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
import { checkCoreCompat, describeMissingExportError, resolveInstalledCoreVersion, MIN_CORE } from './core-compat.js';
|
|
16
|
+
const foundCore = resolveInstalledCoreVersion(import.meta.url);
|
|
17
|
+
const compat = checkCoreCompat({ found: foundCore, min: MIN_CORE });
|
|
18
|
+
if (!compat.ok) {
|
|
19
|
+
// stderr, and no stack: the user needs one actionable line, not a trace.
|
|
20
|
+
console.error(compat.message);
|
|
21
|
+
process.exitCode = 1;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
let code;
|
|
25
|
+
try {
|
|
26
|
+
const { runCli } = await import('./cli.js');
|
|
27
|
+
code = await runCli(process.argv.slice(2));
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
// The version probe fails OPEN, so a missing-binding link error can still reach us.
|
|
31
|
+
// Translate exactly that class into the named form; re-throw everything else
|
|
32
|
+
// unchanged so real bugs still surface.
|
|
33
|
+
const named = describeMissingExportError(error, foundCore);
|
|
34
|
+
if (named === null)
|
|
35
|
+
throw error;
|
|
36
|
+
console.error(named);
|
|
37
|
+
code = 1;
|
|
38
|
+
}
|
|
39
|
+
// `process.exit()` here TRUNCATED large output on a pipe, silently and at exactly the
|
|
40
|
+
// pipe buffer size. On a pipe (not a TTY, not a file) Node's stdout is ASYNCHRONOUS, so
|
|
41
|
+
// `process.exit` discards whatever has not flushed yet: `dz recall --all --json > file`
|
|
42
|
+
// wrote 122826 bytes while `dz recall --all --json | jq` got exactly 65536 and a parse
|
|
43
|
+
// error. That is data loss in the documented sharing path, and silent — the exit code
|
|
44
|
+
// was 0 and the JSON simply stopped mid-string.
|
|
45
|
+
//
|
|
46
|
+
// So: set the code and let the process end when the event loop drains, which is what
|
|
47
|
+
// flushes stdout. `process.exitCode` preserves the status without the race.
|
|
48
|
+
process.exitCode = code;
|
|
49
|
+
}
|
|
17
50
|
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEtH,MAAM,SAAS,GAAG,2BAA2B,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/D,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;AAEpE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;IACf,yEAAyE;IACzE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;KAAM,CAAC;IACN,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,oFAAoF;QACpF,6EAA6E;QAC7E,wCAAwC;QACxC,MAAM,KAAK,GAAG,0BAA0B,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3D,IAAI,KAAK,KAAK,IAAI;YAAE,MAAM,KAAK,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,GAAG,CAAC,CAAC;IACX,CAAC;IAED,sFAAsF;IACtF,wFAAwF;IACxF,wFAAwF;IACxF,uFAAuF;IACvF,sFAAsF;IACtF,gDAAgD;IAChD,EAAE;IACF,qFAAqF;IACrF,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC1B,CAAC"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -3,10 +3,24 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @packageDocumentation
|
|
5
5
|
*/
|
|
6
|
+
import { spawn, type ChildProcess } from 'node:child_process';
|
|
7
|
+
import { runSyncCodexHooks, type CodexHooksSyncReport, type BridgeFamily } from '@dzhechkov/harness-core';
|
|
6
8
|
/** Output sink + working directory — injectable so the CLI is testable. */
|
|
7
9
|
export interface CliIo {
|
|
8
10
|
readonly cwd?: string;
|
|
9
11
|
readonly write?: (line: string) => void;
|
|
12
|
+
/**
|
|
13
|
+
* Diagnostics sink — **stderr**, defaulting to `console.error`.
|
|
14
|
+
*
|
|
15
|
+
* Before feature dz-cli-defects `CliIo` had no stderr seam at all, so every
|
|
16
|
+
* diagnostic (including the top-level error handler) landed on stdout and
|
|
17
|
+
* `dz list > skills.txt` wrote the error INTO the data file. `write` stays "data
|
|
18
|
+
* only"; `writeErr` is "diagnosis only".
|
|
19
|
+
*
|
|
20
|
+
* There is deliberately **no** fall-back to `write`: a test that wants to assert on
|
|
21
|
+
* stderr must inject `writeErr`, or the assertion would be theatre.
|
|
22
|
+
*/
|
|
23
|
+
readonly writeErr?: (line: string) => void;
|
|
10
24
|
/**
|
|
11
25
|
* Pre-read STDIN content (injectable so `dz brain ground`'s hook path is testable without
|
|
12
26
|
* an actual pipe). When omitted, the CLI reads fd 0 synchronously — but only for the one
|
|
@@ -38,5 +52,101 @@ export type ReleaseExecRunner = (cmd: string, opts: {
|
|
|
38
52
|
stderr: string;
|
|
39
53
|
timedOut?: boolean;
|
|
40
54
|
};
|
|
55
|
+
export interface CodexHooksSyncInput {
|
|
56
|
+
readonly codexHome?: string | undefined;
|
|
57
|
+
readonly project?: string | undefined;
|
|
58
|
+
readonly check?: boolean;
|
|
59
|
+
readonly remove?: boolean;
|
|
60
|
+
/** `false` = the user's `--no-verify`. Anything else runs the live probe. */
|
|
61
|
+
readonly verify?: boolean;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The argv → operation mapping, extracted so it can be PINNED.
|
|
65
|
+
*
|
|
66
|
+
* It is the mapping that was broken: `--verify`, `--no-verify` and `--project` were parsed,
|
|
67
|
+
* validated, listed in the usage line — and then never reached `runSyncCodexHooks`, so the CRITICAL
|
|
68
|
+
* finding (a `ready` with no live proof behind it) lived entirely in three missing object keys.
|
|
69
|
+
* A function that returns the options object is testable without a codex binary; an inline literal
|
|
70
|
+
* is not.
|
|
71
|
+
*/
|
|
72
|
+
export declare function codexHooksSyncOptions(input: CodexHooksSyncInput): Parameters<typeof runSyncCodexHooks>[0];
|
|
73
|
+
export interface CodexHooksSummary {
|
|
74
|
+
readonly ok: boolean;
|
|
75
|
+
readonly stdout: readonly string[];
|
|
76
|
+
readonly stderr: readonly string[];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* What the user is told about a sync report — the ONE place the success word can be printed.
|
|
80
|
+
*
|
|
81
|
+
* `report.ready` is the whole gate: installed ∧ executable ∧ trusted ∧ a live, non-bypassed probe
|
|
82
|
+
* that WITNESSED our block. Nothing else may print "ready" (AM-17 / G-G), and `--no-verify` never
|
|
83
|
+
* can, because it never measured.
|
|
84
|
+
*/
|
|
85
|
+
export declare function codexHooksSummary(report: CodexHooksSyncReport, label?: string): CodexHooksSummary;
|
|
86
|
+
export declare function deliverCodexHooks(input: CodexHooksSyncInput, sync?: (options: Parameters<typeof runSyncCodexHooks>[0]) => CodexHooksSyncReport, label?: string): CodexHooksSummary & {
|
|
87
|
+
readonly report: CodexHooksSyncReport;
|
|
88
|
+
};
|
|
89
|
+
/** Test seam for the chokepoint: NEW-C4's proof needs to call it with a hostile pid. */
|
|
90
|
+
export declare function __wfSignalChildTestSeam(child: unknown, signal: string, detached: boolean): boolean;
|
|
91
|
+
/** Exposed for the unit test: the kill set must NAME every live child's pid. */
|
|
92
|
+
export declare function __wfKillGroupTestSeam(): {
|
|
93
|
+
register: (pid: number, child: ChildProcess) => void;
|
|
94
|
+
killAll: () => number[];
|
|
95
|
+
size: () => number;
|
|
96
|
+
};
|
|
97
|
+
export interface ClaudeBridgeRun {
|
|
98
|
+
stdout: string;
|
|
99
|
+
stderr: string;
|
|
100
|
+
exitCode: number | null;
|
|
101
|
+
timedOut: boolean;
|
|
102
|
+
spawnError: string | null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Run one `claude` call with the prompt on STDIN. Spawn-injectable, and NEVER throws: a missing
|
|
106
|
+
* binary, a crash and a hang all come back as DATA, because the taxonomy above them can only name
|
|
107
|
+
* a failure it is handed. (The first draft of this function let the ENOENT escape as an uncaught
|
|
108
|
+
* exception and the command never settled — the acid A1 red, quoted in red-green.md.)
|
|
109
|
+
*
|
|
110
|
+
* Mirrors `probeContent`'s settled-flag + SIGTERM deadline shape (`cli.ts` probes) and scrubs
|
|
111
|
+
* `PROBE_SCRUB_ENV`, so a bridge launched from inside a nested Claude session cannot inherit the
|
|
112
|
+
* parent's session identity (SEC-4).
|
|
113
|
+
*/
|
|
114
|
+
export declare function runClaudeBridge(bin: string, argv: string[], promptStdin: string, timeoutMs: number, cwd?: string, spawnImpl?: typeof spawn): Promise<ClaudeBridgeRun>;
|
|
115
|
+
/** Test seam for H9: the exact environment ONE family's child would receive. */
|
|
116
|
+
export declare function __wfChildEnvTestSeam(family: BridgeFamily, parent: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
117
|
+
/**
|
|
118
|
+
* THE child-process wrapper both the qe-bridge and the loop runner ride (ADR-002 O1: ONE impure
|
|
119
|
+
* wrapper, not two). Generalized from `runClaudeBridge` with the same guarantees — a settled flag so
|
|
120
|
+
* no path resolves twice, a deadline timer that SIGTERMs, the `PROBE_SCRUB_ENV` scrub so a bridge
|
|
121
|
+
* launched from inside a nested Claude session cannot inherit it, and an injectable `spawnImpl` —
|
|
122
|
+
* plus the two knobs the generalization adds:
|
|
123
|
+
*
|
|
124
|
+
* • `stdinText: null` ⇒ `stdio[0] = 'ignore'`. MEASURED: codex-cli 0.148.0 prints
|
|
125
|
+
* `Reading additional input from stdin...` and WAITS when stdin is left open. Passing an empty
|
|
126
|
+
* string is not the same thing as closing it.
|
|
127
|
+
* • `detached: true` ⇒ the child leads its OWN process group, so the runner can kill the whole
|
|
128
|
+
* group (AM-10). `onSpawn` hands the live child to the caller's registry at the only moment the
|
|
129
|
+
* pid is knowable.
|
|
130
|
+
*
|
|
131
|
+
* Never throws: a spawn failure resolves with `spawnError` set, exactly like the original.
|
|
132
|
+
*/
|
|
133
|
+
export declare function runChildBridge(bin: string, argv: string[], opts: {
|
|
134
|
+
stdinText: string | null;
|
|
135
|
+
timeoutMs: number;
|
|
136
|
+
cwd: string;
|
|
137
|
+
detached: boolean;
|
|
138
|
+
spawnImpl?: typeof spawn;
|
|
139
|
+
onSpawn?: (child: ChildProcess) => void;
|
|
140
|
+
/**
|
|
141
|
+
* `'scrub'` (default) — inherit the parent environment minus `PROBE_SCRUB_ENV`. The historical
|
|
142
|
+
* qe-bridge posture; unchanged so its suites keep their meaning.
|
|
143
|
+
* `'allowlist'` — build the child's environment from a NAMED list and nothing else
|
|
144
|
+
* (Step-8 HIGH-9). A deny-list can only remove what somebody thought of; every cloud token,
|
|
145
|
+
* registry credential and unrelated secret in the parent survived it. The loop runner uses this.
|
|
146
|
+
*/
|
|
147
|
+
envMode?: 'scrub' | 'allowlist';
|
|
148
|
+
/** Extra variable names the allowlist should carry (a family's own auth, named by the caller). */
|
|
149
|
+
envExtra?: readonly string[];
|
|
150
|
+
}): Promise<ClaudeBridgeRun>;
|
|
41
151
|
export declare function runCli(argv: string[], io?: CliIo): Promise<number>;
|
|
42
152
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|