@dzhechkov/harness-cli 0.8.17 → 0.8.19

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dzhechkov/harness-cli",
3
- "version": "0.8.17",
3
+ "version": "0.8.19",
4
4
  "description": "The dz CLI — install AI skills for Claude Code, Codex, OpenCode, Hermes, OpenClaude, GitHub Copilot. 87 commands, 14 presets, 10 platform targets.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -42,23 +42,23 @@
42
42
  "src"
43
43
  ],
44
44
  "dependencies": {
45
- "@dzhechkov/harness-core": "^0.8.24",
45
+ "@dzhechkov/harness-core": "^0.8.27",
46
46
  "@dzhechkov/harness-presets": "^0.5.18",
47
47
  "@dzhechkov/skills-devops": "^0.3.17",
48
48
  "@dzhechkov/scout": "^0.8.11",
49
49
  "@dzhechkov/skills-mcp": "^0.3.10",
50
50
  "@dzhechkov/skills-web3": "^0.2.9",
51
- "@dzhechkov/skills-qe": "^0.3.14",
52
51
  "@dzhechkov/skills-meta": "^0.9.55",
53
- "@dzhechkov/skills-ecc": "^0.1.12",
54
- "@dzhechkov/skills-news": "^0.1.16",
55
52
  "@dzhechkov/skills-academic": "^0.3.7",
53
+ "@dzhechkov/skills-qe": "^0.3.14",
54
+ "@dzhechkov/skills-news": "^0.1.16",
55
+ "@dzhechkov/skills-ecc": "^0.1.12",
56
56
  "@dzhechkov/skills-pm": "^0.1.5",
57
- "@dzhechkov/skills-idea2prd": "^0.1.15",
58
57
  "@dzhechkov/skills-taste": "^0.1.5",
59
- "@dzhechkov/skills-presentation-storyteller": "^0.1.14",
58
+ "@dzhechkov/skills-idea2prd": "^0.1.15",
60
59
  "@dzhechkov/skills-reverse-engineering": "^0.3.4",
61
- "@dzhechkov/skills-website-cloner": "^0.1.5"
60
+ "@dzhechkov/skills-website-cloner": "^0.1.5",
61
+ "@dzhechkov/skills-presentation-storyteller": "^0.1.14"
62
62
  },
63
63
  "devDependencies": {
64
64
  "@types/node": "^25.6.0",
package/sbom.json CHANGED
@@ -25,7 +25,7 @@
25
25
  "hashes": [
26
26
  {
27
27
  "alg": "SHA-256",
28
- "content": "0a9553b413db2cf2e1ac11fa7809974dbba743e457bc2898850e32536f70a000"
28
+ "content": "45af5a47278e24f2049789ac96bba2c18597e29e26f3a9df3ac95fc5b52719c2"
29
29
  }
30
30
  ]
31
31
  },
@@ -125,7 +125,7 @@
125
125
  "hashes": [
126
126
  {
127
127
  "alg": "SHA-256",
128
- "content": "40ce13aec8fc6cb0beb1ed02f07bb22438f940d52ef59d02f6dc9352e67b8d79"
128
+ "content": "22cddd1ff809cea9301af0905195bc1f2ff29730ce1b8a257c99c518457cff34"
129
129
  }
130
130
  ]
131
131
  },
@@ -135,7 +135,7 @@
135
135
  "hashes": [
136
136
  {
137
137
  "alg": "SHA-256",
138
- "content": "b5b87557988b5ec5e58913f53068e35dd5a8f8aac6c62f409d13ab9d9b8202b7"
138
+ "content": "724695fafaa2a68b6c279ea1f55f14732888ee7ba6919f991ace14fa54620b08"
139
139
  }
140
140
  ]
141
141
  },
@@ -145,7 +145,7 @@
145
145
  "hashes": [
146
146
  {
147
147
  "alg": "SHA-256",
148
- "content": "4d0925b3047fc96233ddb1118b071a0a1eca35995a06f30cdfc8b2e613f1ec31"
148
+ "content": "2935abfc89e4a704d9615b0417ff19279487c05a8a97347b2de6c88908276d33"
149
149
  }
150
150
  ]
151
151
  },
@@ -379,7 +379,7 @@
379
379
  },
380
380
  {
381
381
  "name": "dz:canonical-json-sha256-v2",
382
- "value": "1db45f8ab165516a8592bf9bb9dba68993f66e0f4a8b8e42b93c1cfa140a85f7"
382
+ "value": "5f0c597e704b7b515d40f4a95b784b26d4fe2a5adf1f1309a350541506eb14d4"
383
383
  }
384
384
  ]
385
385
  },
@@ -409,7 +409,7 @@
409
409
  "hashes": [
410
410
  {
411
411
  "alg": "SHA-256",
412
- "content": "5ba834f5795e8d4208159aa6fbee738f38978ada811f49ba85f6798079970144"
412
+ "content": "f0bc9f52737064a3d5b26fb2ef07c0aa79e003dfca5e1277cd0988a65cdeeb8e"
413
413
  }
414
414
  ]
415
415
  },
package/src/cli.ts CHANGED
@@ -6855,10 +6855,15 @@ function cmdSbom(options: Map<string, string>, flags: Set<string>, cwd: string,
6855
6855
  return 0;
6856
6856
  }
6857
6857
 
6858
- function cmdPublish(options: Map<string, string>, flags: Set<string>, cwd: string, write: Write): number {
6858
+ function cmdPublish(options: Map<string, string>, flags: Set<string>, cwd: string, writeOutput: Write): number {
6859
+ const json = flags.has('json');
6860
+ // Under --json stdout carries exactly one JSON document, so every human line — guard notes, refusals,
6861
+ // progress — goes to stderr instead of being dropped: a refusal that prints nothing is the silent
6862
+ // failure this repo forbids (QE P2 2026-09-10).
6863
+ const write: Write = json ? (line) => { process.stderr.write(`${line}\n`); } : writeOutput;
6859
6864
  // Reject unknown flags/options so a typo (e.g. `--dry-rum`) can NEVER be
6860
6865
  // silently swallowed and flip the command into live-publish mode.
6861
- const allowedFlags = new Set(['dry-run', 'no-dry-run', 'yes', 'confirm', 'bump-only', 'help', 'require-signing', 'provenance', 'no-provenance']);
6866
+ const allowedFlags = new Set(['dry-run', 'no-dry-run', 'yes', 'confirm', 'bump-only', 'help', 'require-signing', 'provenance', 'no-provenance', 'json']);
6862
6867
  const allowedOptions = new Set(['filter', 'claim-check', 'no-guard', 'sign-key']);
6863
6868
  const allowedHelp = ' allowed: --dry-run (default), --yes/--confirm/--no-dry-run (go live), --bump-only, --filter <substr>, --claim-check <off|warn|error>, --no-guard "<reason>" (skip the guard pre-flight; logged)';
6864
6869
  for (const flag of flags) {
@@ -7120,6 +7125,11 @@ function cmdPublish(options: Map<string, string>, flags: Set<string>, cwd: strin
7120
7125
  },
7121
7126
  });
7122
7127
 
7128
+ if (json) {
7129
+ writeOutput(JSON.stringify(report));
7130
+ return report.errors > 0 ? 1 : 0;
7131
+ }
7132
+
7123
7133
  write(`\ndz publish${dryRun ? ' --dry-run' : ''}${bumpOnly ? ' --bump-only' : ''}${claimCheckOpt !== 'warn' ? ` --claim-check ${claimCheckOpt}` : ''}`);
7124
7134
  write(` Published: ${report.published} Skipped: ${report.skipped} Errors: ${report.errors}\n`);
7125
7135
  for (const pkg of report.packages) {
@@ -7134,6 +7144,22 @@ function cmdPublish(options: Map<string, string>, flags: Set<string>, cwd: strin
7134
7144
  if (pkg.status === 'error' && pkg.error) {
7135
7145
  for (const line of pkg.error.split('\n')) write(` ${line}`);
7136
7146
  }
7147
+ const probeLog = (pkg as typeof pkg & {
7148
+ readonly probeLog?: readonly {
7149
+ readonly attempt: number;
7150
+ readonly stdout: string;
7151
+ readonly stderr: string;
7152
+ readonly code: number | null;
7153
+ readonly ms: number;
7154
+ }[];
7155
+ }).probeLog;
7156
+ if (pkg.status === 'error' && probeLog && probeLog.length > 0) {
7157
+ for (const probe of probeLog.slice(-3)) {
7158
+ const output = probe.stderr || probe.stdout;
7159
+ const firstLine = output.split(/\r?\n/, 1)[0]?.trim() || '(empty)';
7160
+ write(` probe ${probe.attempt}: code ${String(probe.code)}, ${probe.ms}ms — ${firstLine}`);
7161
+ }
7162
+ }
7137
7163
  // The rollback branch cannot tell "publish failed" from "publish landed, registry never answered":
7138
7164
  // both restore package.json. The operator can — one registry query — so say what to check.
7139
7165
  if (pkg.status === 'error' && pkg.error?.startsWith('registry did not confirm')) {