@dzhechkov/harness-cli 0.3.235 → 0.3.236
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 +8 -40
- package/README.md +30 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +83 -1
- package/dist/cli.js.map +1 -1
- package/package.json +2 -2
- package/sbom.json +7 -87
- package/src/cli.ts +88 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dzhechkov/harness-cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.236",
|
|
4
4
|
"description": "The dz CLI — install AI skills for Claude Code, Codex, OpenCode, Hermes, OpenClaude, GitHub Copilot. 35 commands, 13 presets, 6 platform targets.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"@dzhechkov/skills-reverse-engineering": "^0.1.0",
|
|
58
58
|
"@dzhechkov/skills-presentation-storyteller": "^0.1.0",
|
|
59
59
|
"@dzhechkov/skills-website-cloner": "^0.1.0",
|
|
60
|
-
"@dzhechkov/harness-core": "0.3.
|
|
60
|
+
"@dzhechkov/harness-core": "0.3.127"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@types/node": "^25.6.0",
|
package/sbom.json
CHANGED
|
@@ -9,86 +9,6 @@
|
|
|
9
9
|
}
|
|
10
10
|
},
|
|
11
11
|
"components": [
|
|
12
|
-
{
|
|
13
|
-
"type": "file",
|
|
14
|
-
"name": ".agentic-qe/brain.rvf",
|
|
15
|
-
"hashes": [
|
|
16
|
-
{
|
|
17
|
-
"alg": "SHA-256",
|
|
18
|
-
"content": "8136cd4cc145d3dbe6ed3ae4489946bbc26e3e44172f0e5241ac45dde38bfead"
|
|
19
|
-
}
|
|
20
|
-
]
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"type": "file",
|
|
24
|
-
"name": ".agentic-qe/brain.rvf.lock",
|
|
25
|
-
"hashes": [
|
|
26
|
-
{
|
|
27
|
-
"alg": "SHA-256",
|
|
28
|
-
"content": "99fa5178a48b6953b8f3a6f1690204a3b5449004b7dd105e7a3155ad3658266c"
|
|
29
|
-
}
|
|
30
|
-
]
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"type": "file",
|
|
34
|
-
"name": ".agentic-qe/memory.db",
|
|
35
|
-
"hashes": [
|
|
36
|
-
{
|
|
37
|
-
"alg": "SHA-256",
|
|
38
|
-
"content": "456372cb9a8c12f98ae6378338b8469d9be6df05cbe03a99b412d83d962b3d11"
|
|
39
|
-
}
|
|
40
|
-
]
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"type": "file",
|
|
44
|
-
"name": ".agentic-qe/memory.db-shm",
|
|
45
|
-
"hashes": [
|
|
46
|
-
{
|
|
47
|
-
"alg": "SHA-256",
|
|
48
|
-
"content": "cab99dd5d4068013a0c5f4f1c2d29dbec07729dc47c1d77adba6a53b773d0026"
|
|
49
|
-
}
|
|
50
|
-
]
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
"type": "file",
|
|
54
|
-
"name": ".agentic-qe/memory.db-wal",
|
|
55
|
-
"hashes": [
|
|
56
|
-
{
|
|
57
|
-
"alg": "SHA-256",
|
|
58
|
-
"content": "2cc80ec378c1f9cd2588676588ee1b73bfe4f2f7ef3b96879c295eb86dccd2c2"
|
|
59
|
-
}
|
|
60
|
-
]
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"type": "file",
|
|
64
|
-
"name": ".agentic-qe/patterns.rvf",
|
|
65
|
-
"hashes": [
|
|
66
|
-
{
|
|
67
|
-
"alg": "SHA-256",
|
|
68
|
-
"content": "9090b2e6d339eaa183672ac0cf9f625dbd5f9fc76d64afcdb34a3f5871c31c5a"
|
|
69
|
-
}
|
|
70
|
-
]
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
"type": "file",
|
|
74
|
-
"name": ".agentic-qe/patterns.rvf.idmap.json",
|
|
75
|
-
"hashes": [
|
|
76
|
-
{
|
|
77
|
-
"alg": "SHA-256",
|
|
78
|
-
"content": "c2693f9a7f47a2d2bffe3004188e70ce08411bf8db47d07c60551d18ff7640c4"
|
|
79
|
-
}
|
|
80
|
-
]
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
"type": "file",
|
|
84
|
-
"name": ".agentic-qe/patterns.rvf.lock",
|
|
85
|
-
"hashes": [
|
|
86
|
-
{
|
|
87
|
-
"alg": "SHA-256",
|
|
88
|
-
"content": "84842f3916c558b1f4f2da2a5b0236587f146dda1f6ab4ba4c31ed7b8b17f943"
|
|
89
|
-
}
|
|
90
|
-
]
|
|
91
|
-
},
|
|
92
12
|
{
|
|
93
13
|
"type": "file",
|
|
94
14
|
"name": "CHANGELOG.md",
|
|
@@ -105,7 +25,7 @@
|
|
|
105
25
|
"hashes": [
|
|
106
26
|
{
|
|
107
27
|
"alg": "SHA-256",
|
|
108
|
-
"content": "
|
|
28
|
+
"content": "1e36d7e9e6022d412c030975ec686b1ab91c61c64c807ef2e9ff3fa75ac8917c"
|
|
109
29
|
}
|
|
110
30
|
]
|
|
111
31
|
},
|
|
@@ -185,7 +105,7 @@
|
|
|
185
105
|
"hashes": [
|
|
186
106
|
{
|
|
187
107
|
"alg": "SHA-256",
|
|
188
|
-
"content": "
|
|
108
|
+
"content": "8a00bf14c3fdd437b7e482da8c4018366041755714ed1791b1c523f9dee5de6c"
|
|
189
109
|
}
|
|
190
110
|
]
|
|
191
111
|
},
|
|
@@ -195,7 +115,7 @@
|
|
|
195
115
|
"hashes": [
|
|
196
116
|
{
|
|
197
117
|
"alg": "SHA-256",
|
|
198
|
-
"content": "
|
|
118
|
+
"content": "dea4446db1109285c1fc5f5283d7263462cb446f12b0d9b1e1e821374d0ca57d"
|
|
199
119
|
}
|
|
200
120
|
]
|
|
201
121
|
},
|
|
@@ -205,7 +125,7 @@
|
|
|
205
125
|
"hashes": [
|
|
206
126
|
{
|
|
207
127
|
"alg": "SHA-256",
|
|
208
|
-
"content": "
|
|
128
|
+
"content": "a253625c94835ef94bbd141b1dd759578433423bd098314fd977c515f140dafe"
|
|
209
129
|
}
|
|
210
130
|
]
|
|
211
131
|
},
|
|
@@ -265,7 +185,7 @@
|
|
|
265
185
|
"hashes": [
|
|
266
186
|
{
|
|
267
187
|
"alg": "SHA-256",
|
|
268
|
-
"content": "
|
|
188
|
+
"content": "543319797d47d599a646c7d695f82aa31491ffd97579edd691b6a9cb99af76ef"
|
|
269
189
|
}
|
|
270
190
|
]
|
|
271
191
|
},
|
|
@@ -285,7 +205,7 @@
|
|
|
285
205
|
"hashes": [
|
|
286
206
|
{
|
|
287
207
|
"alg": "SHA-256",
|
|
288
|
-
"content": "
|
|
208
|
+
"content": "c5d4902f9b0c4133318b15e757d07856872177dc92752d5996440524342b7f88"
|
|
289
209
|
}
|
|
290
210
|
]
|
|
291
211
|
},
|
|
@@ -305,7 +225,7 @@
|
|
|
305
225
|
"hashes": [
|
|
306
226
|
{
|
|
307
227
|
"alg": "SHA-256",
|
|
308
|
-
"content": "
|
|
228
|
+
"content": "0538f3cfd8eb880305c08fef05a78601263003c54a6f1b44f97cd7ebd7bd37f9"
|
|
309
229
|
}
|
|
310
230
|
]
|
|
311
231
|
},
|
package/src/cli.ts
CHANGED
|
@@ -48,6 +48,9 @@ import {
|
|
|
48
48
|
runInitAgentsMd,
|
|
49
49
|
runInitGeminiMd,
|
|
50
50
|
TARGET_NAMES,
|
|
51
|
+
buildParityMatrix,
|
|
52
|
+
TARGET_CAPABILITIES,
|
|
53
|
+
TARGET_SHORT_LABELS,
|
|
51
54
|
WORKFLOW_NAMES,
|
|
52
55
|
importEcc,
|
|
53
56
|
recordPattern,
|
|
@@ -204,6 +207,7 @@ Usage:
|
|
|
204
207
|
dz verify-pack --pack <dir> [--pubkey <path>] (signature check; fail-closed; key from the repo, never the pack)
|
|
205
208
|
dz publish [--filter <name>] [--bump-only] [--claim-check <off|warn|error>] [--require-signing] [--provenance|--no-provenance] (dry-run by default; pass --yes/--confirm/--no-dry-run to go live; claim-check gate default warn — surfaces README claim findings, never blocks; error fails an offending package)
|
|
206
209
|
dz release [--filter <name>] [--tag] [--publish] [--json] [--dry-run] [--no-issue] (VERIFIED release: 4 HARD gates in FRONT of dz publish — full package test suites, audit >=high, node --check of every dist/bin file, bin smoke-boot via "node <bin> --help" — any red gate STOPS the release (exit 1) + best-effort gh issue; all green ⇒ re-sign reminder, then prints the ready dz publish command (or chains with --publish); never duplicates publish's own gates)
|
|
210
|
+
dz parity [--target <name>] [--json] (the honest feature×target map, COMPUTED from the capability model — which harness feature is full / manual / absent on each of the ${TARGET_NAMES.length} targets, and via which form)
|
|
207
211
|
dz setup --target <name> [--preset <name>] [--select id,id,...] [--skills-dir <dir>] [--project <dir>] [--memory agentdb] [--no-memory] [--no-hooks] [--install-driver] [--force] [--enrich]
|
|
208
212
|
dz teach "<pattern>" [--reward <0-1>] [--domain <name>] [--type rule|success-pattern|lesson-learned] [--project <dir>] [--no-mirror] (--project pins the learned store to <dir>/.dz, not the cwd — pin to a canonical brain)
|
|
209
213
|
dz teach --from-json <file> [--project <dir>] [--no-mirror] (bulk-import a 'dz recall --all --json' export — share a learned store across machines)
|
|
@@ -3571,6 +3575,88 @@ function cmdPublish(options: Map<string, string>, flags: Set<string>, cwd: strin
|
|
|
3571
3575
|
return report.errors > 0 ? 1 : 0;
|
|
3572
3576
|
}
|
|
3573
3577
|
|
|
3578
|
+
/* ------------------------------------------------------------------ */
|
|
3579
|
+
/* dz parity — the honest feature×target map (target-parity-matrix, */
|
|
3580
|
+
/* ADR-001): computed from the declarative model, never hand-written */
|
|
3581
|
+
/* ------------------------------------------------------------------ */
|
|
3582
|
+
|
|
3583
|
+
function cmdParity(options: Map<string, string>, flags: Set<string>, write: Write): number {
|
|
3584
|
+
const json = flags.has('json');
|
|
3585
|
+
if (flags.has('help')) {
|
|
3586
|
+
write('dz parity [--target <name>] [--json] — the computed feature×target map (never hand-written)');
|
|
3587
|
+
write(` targets: ${TARGET_NAMES.join(', ')}`);
|
|
3588
|
+
return 0;
|
|
3589
|
+
}
|
|
3590
|
+
const allowedFlags = new Set(['json', 'help']);
|
|
3591
|
+
const allowedOptions = new Set(['target']);
|
|
3592
|
+
// A stray positional is a typo'd invocation, not something to silently ignore (Codex QE gap 7).
|
|
3593
|
+
if (options.has('_positional_0')) {
|
|
3594
|
+
write(json ? JSON.stringify({ error: `unexpected argument "${options.get('_positional_0')}"`, exitCode: 1 }) : `dz parity: unexpected argument "${options.get('_positional_0')}"\n allowed: --target <name>, --json`);
|
|
3595
|
+
return 1;
|
|
3596
|
+
}
|
|
3597
|
+
for (const flag of flags) {
|
|
3598
|
+
if (!allowedFlags.has(flag)) {
|
|
3599
|
+
write(json ? JSON.stringify({ error: `unknown option --${flag}`, exitCode: 1 }) : `dz parity: unknown option --${flag}\n allowed: --target <name>, --json`);
|
|
3600
|
+
return 1;
|
|
3601
|
+
}
|
|
3602
|
+
}
|
|
3603
|
+
for (const key of options.keys()) {
|
|
3604
|
+
if (key.startsWith('_positional_')) continue;
|
|
3605
|
+
if (!allowedOptions.has(key)) {
|
|
3606
|
+
write(json ? JSON.stringify({ error: `unknown option --${key}`, exitCode: 1 }) : `dz parity: unknown option --${key}\n allowed: --target <name>, --json`);
|
|
3607
|
+
return 1;
|
|
3608
|
+
}
|
|
3609
|
+
}
|
|
3610
|
+
|
|
3611
|
+
const matrix = buildParityMatrix();
|
|
3612
|
+
const target = options.get('target');
|
|
3613
|
+
if (target !== undefined && !TARGET_NAMES.includes(target as (typeof TARGET_NAMES)[number])) {
|
|
3614
|
+
if (json) write(JSON.stringify({ error: `unknown target "${target}"`, targets: TARGET_NAMES, exitCode: 1 }, null, 2));
|
|
3615
|
+
else write(`dz parity: unknown target "${target}" — one of: ${TARGET_NAMES.join(', ')}`);
|
|
3616
|
+
return 1;
|
|
3617
|
+
}
|
|
3618
|
+
|
|
3619
|
+
if (json) {
|
|
3620
|
+
const rows = matrix.map((r) => ({
|
|
3621
|
+
id: r.feature.id,
|
|
3622
|
+
title: r.feature.title,
|
|
3623
|
+
cells: target !== undefined ? { [target]: r.cells[target as (typeof TARGET_NAMES)[number]] } : r.cells,
|
|
3624
|
+
}));
|
|
3625
|
+
// A filtered response stays internally consistent: capabilities are filtered too (Codex QE gap 9).
|
|
3626
|
+
const caps = target !== undefined ? { [target]: TARGET_CAPABILITIES[target as (typeof TARGET_NAMES)[number]] } : TARGET_CAPABILITIES;
|
|
3627
|
+
write(JSON.stringify({ targets: target !== undefined ? [target] : TARGET_NAMES, capabilities: caps, features: rows }, null, 2));
|
|
3628
|
+
return 0;
|
|
3629
|
+
}
|
|
3630
|
+
|
|
3631
|
+
if (target !== undefined) {
|
|
3632
|
+
const t = target as (typeof TARGET_NAMES)[number];
|
|
3633
|
+
write(`\ndz parity — ${t} (capabilities: ${TARGET_CAPABILITIES[t].join(', ')})\n`);
|
|
3634
|
+
for (const r of matrix) {
|
|
3635
|
+
const c = r.cells[t];
|
|
3636
|
+
const icon = c.level === 'full' ? '✓' : c.level === 'manual' ? '◐' : '—';
|
|
3637
|
+
write(` ${icon} ${r.feature.title.padEnd(58)} ${c.level === 'none' ? 'not available on this target' : `via ${c.via ?? ''}`}`);
|
|
3638
|
+
}
|
|
3639
|
+
write('\n ✓ full (the complete experience) ◐ manual (works, you drive it by hand) — not available');
|
|
3640
|
+
return 0;
|
|
3641
|
+
}
|
|
3642
|
+
|
|
3643
|
+
// Grid: one column per target, short header, one row per feature. Computed, never hand-written;
|
|
3644
|
+
// the labels live NEXT TO the model (a local map here would be a second, unchecked registry).
|
|
3645
|
+
const short: Record<string, string> = TARGET_SHORT_LABELS;
|
|
3646
|
+
write('\ndz parity — feature × target (computed from the model; dz parity --target <name> for detail)\n');
|
|
3647
|
+
write(` ${'feature'.padEnd(52)} ${TARGET_NAMES.map((t) => (short[t] ?? t).padStart(4)).join('')}`);
|
|
3648
|
+
for (const r of matrix) {
|
|
3649
|
+
const cells = TARGET_NAMES.map((t) => {
|
|
3650
|
+
const c = r.cells[t];
|
|
3651
|
+
return (c.level === 'full' ? '✓' : c.level === 'manual' ? '◐' : '—').padStart(4);
|
|
3652
|
+
}).join('');
|
|
3653
|
+
write(` ${r.feature.title.slice(0, 52).padEnd(52)} ${cells}`);
|
|
3654
|
+
}
|
|
3655
|
+
write('\n ✓ full ◐ manual (available, driven by hand) — not available');
|
|
3656
|
+
write(` columns: ${TARGET_NAMES.map((t) => `${short[t] ?? t}=${t}`).join(' ')}`);
|
|
3657
|
+
return 0;
|
|
3658
|
+
}
|
|
3659
|
+
|
|
3574
3660
|
/* ------------------------------------------------------------------ */
|
|
3575
3661
|
/* dz release — verified-release conveyor (feature release-verified, */
|
|
3576
3662
|
/* ADR-001): 4 HARD gates in FRONT of the untouched dz publish. */
|
|
@@ -5732,6 +5818,8 @@ export async function runCli(argv: string[], io: CliIo = {}): Promise<number> {
|
|
|
5732
5818
|
return cmdPublish(options, flags, cwd, write);
|
|
5733
5819
|
case 'release':
|
|
5734
5820
|
return cmdRelease(options, flags, cwd, write, io.releaseRunner);
|
|
5821
|
+
case 'parity':
|
|
5822
|
+
return cmdParity(options, flags, write);
|
|
5735
5823
|
case 'registry':
|
|
5736
5824
|
return cmdRegistry(options, cwd, write);
|
|
5737
5825
|
case 'benchmark':
|