@bigking67/pi-67 0.10.5 → 0.10.6

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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.10.6]
4
+
5
+ - Adds runtime request retry to the canonical `xtalpi-pi-tools` provider path,
6
+ including attempt/retry/suppression telemetry in debug JSONL output.
7
+ - Adds final-answer compliance repair to Bash and PowerShell xtalpi smoke:
8
+ validated tool runs that only miss required final text get one `--no-tools`
9
+ repair pass instead of rerunning tools.
10
+ - Accepts `pi-67 doctor --no-skill-list` and raises doctor skill-list timeout
11
+ defaults to 60 seconds.
12
+ - Supports command-level `pi-67 report --json`, emitting either a dry-run JSON
13
+ object or the generated report JSON.
14
+ - Runs full `scripts/pi67-smoke.sh --ci` in the npm publish workflow before
15
+ pack/publish.
16
+
3
17
  ## [0.10.5]
4
18
 
5
19
  - Uses `git fetch` plus `git merge --ff-only FETCH_HEAD` in Bash and
package/README.md CHANGED
@@ -52,6 +52,14 @@ For automation, `pi-67 update --check --json` includes explicit `actions`,
52
52
  `blocked`, and `warnings` arrays. Each action lists planned writes and preserved
53
53
  paths, so update previews stay auditable instead of relying on prose output.
54
54
 
55
+ Long or slow doctor runs can skip Pi's live skill listing while still checking
56
+ local metadata, config, provider/model, shared skill files, and endpoint
57
+ contracts:
58
+
59
+ ```bash
60
+ pi-67 doctor --no-skill-list
61
+ ```
62
+
55
63
  If the local manager may be stale, run the latest npm package for one repair:
56
64
 
57
65
  ```bash
@@ -143,6 +151,7 @@ pi-67 doctor
143
151
  pi-67 smoke --quick
144
152
  pi-67 status
145
153
  pi-67 report
154
+ pi-67 report --json
146
155
  pi-67 version
147
156
  pi-67 xtalpi health
148
157
  pi-67 xtalpi smoke --quick
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bigking67/pi-67",
3
- "version": "0.10.5",
3
+ "version": "0.10.6",
4
4
  "description": "Cross-platform manager CLI for the pi-67 Pi Coding Agent distribution.",
5
5
  "type": "module",
6
6
  "bin": {
package/scripts/check.mjs CHANGED
@@ -59,6 +59,14 @@ function runArgsSelfTests() {
59
59
  parseCommandOptions(["--help"], { bools: [] }).options.help,
60
60
  "command option parser must accept --help for every command",
61
61
  );
62
+ assert(
63
+ parseCommandOptions(["--no-skill-list"], { bools: ["no-skill-list"] }).options.noSkillList,
64
+ "command option parser must accept doctor --no-skill-list",
65
+ );
66
+ assert(
67
+ parseCommandOptions(["--json"], { bools: ["json"] }).options.json,
68
+ "command option parser must accept command-level --json",
69
+ );
62
70
  }
63
71
 
64
72
  function runCliHelpContractSelfTests() {
@@ -4,7 +4,7 @@ import { isWindows } from "../lib/platform.mjs";
4
4
 
5
5
  export async function doctorCommand(ctx, argv) {
6
6
  const { options } = parseCommandOptions(argv, {
7
- bools: ["json", "quiet", "dry-run", "deep-mcp", "strict-shared-skills"],
7
+ bools: ["json", "quiet", "dry-run", "deep-mcp", "no-skill-list", "strict-shared-skills"],
8
8
  strings: ["mcp-timeout-ms", "skill-list-timeout-seconds"],
9
9
  });
10
10
  if (options.help) {
@@ -19,6 +19,7 @@ export async function doctorCommand(ctx, argv) {
19
19
  if (options.strictSharedSkills) args.push(isWindows() ? "-StrictSharedSkills" : "--strict-shared-skills");
20
20
  if (!isWindows() && options.deepMcp) args.push("--deep-mcp");
21
21
  if (!isWindows() && options.mcpTimeoutMs) args.push("--mcp-timeout-ms", options.mcpTimeoutMs);
22
+ if (!isWindows() && options.noSkillList) args.push("--no-skill-list");
22
23
  if (options.skillListTimeoutSeconds) {
23
24
  args.push(isWindows() ? "-SkillListTimeoutSeconds" : "--skill-list-timeout-seconds", options.skillListTimeoutSeconds);
24
25
  }
@@ -38,8 +39,9 @@ Options:
38
39
  --quiet Reduce human output where supported.
39
40
  --deep-mcp Run deeper MCP probes on POSIX platforms.
40
41
  --mcp-timeout-ms N Timeout for deep MCP probes on POSIX platforms.
42
+ --no-skill-list Skip pi skill list on POSIX platforms; accepted as a no-op on Windows.
41
43
  --skill-list-timeout-seconds N
42
- Timeout for pi skill list on POSIX platforms.
44
+ Timeout for pi skill list where enabled.
43
45
  --strict-shared-skills Treat differing shared skills as blocking.
44
46
  --dry-run Print the script invocation without running it.
45
47
 
@@ -1,10 +1,13 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
1
3
  import { parseCommandOptions } from "../lib/args.mjs";
2
4
  import { runDistroScript } from "../lib/distro-scripts.mjs";
3
5
  import { isWindows } from "../lib/platform.mjs";
6
+ import { printJson } from "../lib/output.mjs";
4
7
 
5
8
  export async function reportCommand(ctx, argv) {
6
9
  const { options } = parseCommandOptions(argv, {
7
- bools: ["dry-run", "no-doctor"],
10
+ bools: ["json", "dry-run", "no-doctor"],
8
11
  strings: ["operation", "output"],
9
12
  });
10
13
  if (options.help) {
@@ -15,21 +18,39 @@ export async function reportCommand(ctx, argv) {
15
18
  ? ["-AgentDir", ctx.agentDir, "-RepoRoot", ctx.repoRoot, "-SkillsDir", ctx.skillsDir]
16
19
  : ["--agent-dir", ctx.agentDir, "--repo-root", ctx.repoRoot, "--skills-dir", ctx.skillsDir];
17
20
  if (options.operation) args.push(isWindows() ? "-Operation" : "--operation", options.operation);
18
- if (options.output) args.push(isWindows() ? "-Output" : "--output", options.output);
21
+ const outputPath = options.output || path.join(ctx.agentDir, "pi67-report.json");
22
+ const resolvedOutputPath = path.isAbsolute(outputPath) ? outputPath : path.resolve(ctx.repoRoot, outputPath);
23
+ args.push(isWindows() ? "-Output" : "--output", outputPath);
19
24
  if (options.noDoctor) args.push(isWindows() ? "-NoDoctor" : "--no-doctor");
20
25
  if (ctx.dryRun || options.dryRun) args.push(isWindows() ? "-DryRun" : "--dry-run");
26
+ const json = ctx.json || options.json;
27
+ if (json && (ctx.dryRun || options.dryRun)) {
28
+ printJson({
29
+ schema: "pi67.report-command.v1",
30
+ dryRun: true,
31
+ output: resolvedOutputPath,
32
+ operation: options.operation || "manual",
33
+ doctor: options.noDoctor ? "skipped" : "enabled",
34
+ });
35
+ return;
36
+ }
21
37
  runDistroScript(ctx, { sh: "pi67-report.sh", ps1: "pi67-report.ps1" }, args, {
22
38
  dryRun: false,
39
+ stdio: json ? "pipe" : "inherit",
23
40
  });
41
+ if (json) {
42
+ process.stdout.write(fs.readFileSync(resolvedOutputPath, "utf8"));
43
+ }
24
44
  }
25
45
 
26
46
  function printReportHelp() {
27
47
  process.stdout.write(`pi-67 report - generate pi67-report.json
28
48
 
29
49
  Usage:
30
- pi-67 report [--operation NAME] [--output FILE] [--no-doctor] [--dry-run]
50
+ pi-67 report [--json] [--operation NAME] [--output FILE] [--no-doctor] [--dry-run]
31
51
 
32
52
  Options:
53
+ --json Emit the generated report JSON to stdout.
33
54
  --operation NAME Operation label to embed in the report.
34
55
  --output FILE Output path. Defaults to the distro report location.
35
56
  --no-doctor Skip doctor data collection where supported.
@@ -17,11 +17,15 @@ export function runDistroScript(ctx, names, args = [], options = {}) {
17
17
  cwd: ctx.repoRoot,
18
18
  dryRun: options.dryRun,
19
19
  env: options.env,
20
+ stdio: options.stdio,
21
+ timeoutMs: options.timeoutMs,
20
22
  });
21
23
  }
22
24
  return runCommand("bash", [file, ...args], {
23
25
  cwd: ctx.repoRoot,
24
26
  dryRun: options.dryRun,
25
27
  env: options.env,
28
+ stdio: options.stdio,
29
+ timeoutMs: options.timeoutMs,
26
30
  });
27
31
  }