@principles/pd-cli 1.152.12 → 1.152.13

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.
Files changed (296) hide show
  1. package/package.json +13 -7
  2. package/CHANGELOG.md +0 -23
  3. package/dist/commands/__tests__/intent-flag-wiring.test.d.ts +0 -9
  4. package/dist/commands/__tests__/intent-flag-wiring.test.d.ts.map +0 -1
  5. package/dist/commands/__tests__/intent-flag-wiring.test.js +0 -237
  6. package/dist/commands/__tests__/intent-flag-wiring.test.js.map +0 -1
  7. package/dist/commands/__tests__/legacy-cleanup.test.d.ts +0 -18
  8. package/dist/commands/__tests__/legacy-cleanup.test.d.ts.map +0 -1
  9. package/dist/commands/__tests__/legacy-cleanup.test.js +0 -467
  10. package/dist/commands/__tests__/legacy-cleanup.test.js.map +0 -1
  11. package/dist/commands/__tests__/mvp-smoke.test.d.ts +0 -15
  12. package/dist/commands/__tests__/mvp-smoke.test.d.ts.map +0 -1
  13. package/dist/commands/__tests__/mvp-smoke.test.js +0 -262
  14. package/dist/commands/__tests__/mvp-smoke.test.js.map +0 -1
  15. package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.d.ts +0 -2
  16. package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.d.ts.map +0 -1
  17. package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.js +0 -60
  18. package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.js.map +0 -1
  19. package/dist/commands/__tests__/rulecode-flag-wiring.test.d.ts +0 -21
  20. package/dist/commands/__tests__/rulecode-flag-wiring.test.d.ts.map +0 -1
  21. package/dist/commands/__tests__/rulecode-flag-wiring.test.js +0 -186
  22. package/dist/commands/__tests__/rulecode-flag-wiring.test.js.map +0 -1
  23. package/dist/commands/__tests__/rulecode-handler.test.d.ts +0 -16
  24. package/dist/commands/__tests__/rulecode-handler.test.d.ts.map +0 -1
  25. package/dist/commands/__tests__/rulecode-handler.test.js +0 -285
  26. package/dist/commands/__tests__/rulecode-handler.test.js.map +0 -1
  27. package/dist/commands/__tests__/run-rulehost-flag-wiring.test.d.ts +0 -24
  28. package/dist/commands/__tests__/run-rulehost-flag-wiring.test.d.ts.map +0 -1
  29. package/dist/commands/__tests__/run-rulehost-flag-wiring.test.js +0 -232
  30. package/dist/commands/__tests__/run-rulehost-flag-wiring.test.js.map +0 -1
  31. package/dist/commands/__tests__/runtime-activation-nextaction.test.d.ts +0 -15
  32. package/dist/commands/__tests__/runtime-activation-nextaction.test.d.ts.map +0 -1
  33. package/dist/commands/__tests__/runtime-activation-nextaction.test.js +0 -73
  34. package/dist/commands/__tests__/runtime-activation-nextaction.test.js.map +0 -1
  35. package/dist/commands/__tests__/runtime-probe-config.test.d.ts +0 -20
  36. package/dist/commands/__tests__/runtime-probe-config.test.d.ts.map +0 -1
  37. package/dist/commands/__tests__/runtime-probe-config.test.js +0 -389
  38. package/dist/commands/__tests__/runtime-probe-config.test.js.map +0 -1
  39. package/dist/commands/__tests__/telemetry-flag-wiring.test.d.ts +0 -9
  40. package/dist/commands/__tests__/telemetry-flag-wiring.test.d.ts.map +0 -1
  41. package/dist/commands/__tests__/telemetry-flag-wiring.test.js +0 -76
  42. package/dist/commands/__tests__/telemetry-flag-wiring.test.js.map +0 -1
  43. package/dist/commands/__tests__/version.test.d.ts +0 -2
  44. package/dist/commands/__tests__/version.test.d.ts.map +0 -1
  45. package/dist/commands/__tests__/version.test.js +0 -238
  46. package/dist/commands/__tests__/version.test.js.map +0 -1
  47. package/dist/commands/runtime-uat.guard.test.d.ts +0 -2
  48. package/dist/commands/runtime-uat.guard.test.d.ts.map +0 -1
  49. package/dist/commands/runtime-uat.guard.test.js +0 -153
  50. package/dist/commands/runtime-uat.guard.test.js.map +0 -1
  51. package/dist/services/__tests__/cli-output.test.d.ts +0 -18
  52. package/dist/services/__tests__/cli-output.test.d.ts.map +0 -1
  53. package/dist/services/__tests__/cli-output.test.js +0 -103
  54. package/dist/services/__tests__/cli-output.test.js.map +0 -1
  55. package/dist/services/__tests__/evaluator-runner-deps.test.d.ts +0 -2
  56. package/dist/services/__tests__/evaluator-runner-deps.test.d.ts.map +0 -1
  57. package/dist/services/__tests__/evaluator-runner-deps.test.js +0 -343
  58. package/dist/services/__tests__/evaluator-runner-deps.test.js.map +0 -1
  59. package/dist/services/__tests__/rulehost-readiness.test.d.ts +0 -2
  60. package/dist/services/__tests__/rulehost-readiness.test.d.ts.map +0 -1
  61. package/dist/services/__tests__/rulehost-readiness.test.js +0 -311
  62. package/dist/services/__tests__/rulehost-readiness.test.js.map +0 -1
  63. package/dist/services/__tests__/runtime-adapter-resolver.test.d.ts +0 -18
  64. package/dist/services/__tests__/runtime-adapter-resolver.test.d.ts.map +0 -1
  65. package/dist/services/__tests__/runtime-adapter-resolver.test.js +0 -673
  66. package/dist/services/__tests__/runtime-adapter-resolver.test.js.map +0 -1
  67. package/dist/utils/production-workspace-guard.test.d.ts +0 -2
  68. package/dist/utils/production-workspace-guard.test.d.ts.map +0 -1
  69. package/dist/utils/production-workspace-guard.test.js +0 -137
  70. package/dist/utils/production-workspace-guard.test.js.map +0 -1
  71. package/scripts/llm-dogfood.ts +0 -456
  72. package/scripts/migrate-illegal-expected-decision.ts +0 -252
  73. package/src/commands/__tests__/intent-flag-wiring.test.ts +0 -282
  74. package/src/commands/__tests__/legacy-cleanup.test.ts +0 -602
  75. package/src/commands/__tests__/mvp-smoke.test.ts +0 -300
  76. package/src/commands/__tests__/pain-retry-maxTokens-flag.test.ts +0 -73
  77. package/src/commands/__tests__/rulecode-flag-wiring.test.ts +0 -237
  78. package/src/commands/__tests__/rulecode-handler.test.ts +0 -369
  79. package/src/commands/__tests__/run-rulehost-flag-wiring.test.ts +0 -292
  80. package/src/commands/__tests__/runtime-activation-nextaction.test.ts +0 -81
  81. package/src/commands/__tests__/runtime-probe-config.test.ts +0 -432
  82. package/src/commands/__tests__/telemetry-flag-wiring.test.ts +0 -84
  83. package/src/commands/__tests__/version.test.ts +0 -251
  84. package/src/commands/admission-gate.ts +0 -30
  85. package/src/commands/artifact.ts +0 -82
  86. package/src/commands/build-trajectory-evidence.ts +0 -298
  87. package/src/commands/candidate.ts +0 -1250
  88. package/src/commands/codex-ingest-catchup.ts +0 -114
  89. package/src/commands/codex-ingest-quarantine.ts +0 -127
  90. package/src/commands/codex-reconcile.ts +0 -84
  91. package/src/commands/codex-setup.ts +0 -476
  92. package/src/commands/codex-worker.ts +0 -185
  93. package/src/commands/command-helpers.ts +0 -24
  94. package/src/commands/config-doctor.ts +0 -193
  95. package/src/commands/console.ts +0 -797
  96. package/src/commands/context.ts +0 -72
  97. package/src/commands/demo-story-a.ts +0 -241
  98. package/src/commands/diagnose.ts +0 -756
  99. package/src/commands/errors-list.ts +0 -441
  100. package/src/commands/evolution-tasks-list.ts +0 -48
  101. package/src/commands/evolution-tasks-show.ts +0 -62
  102. package/src/commands/flow.ts +0 -60
  103. package/src/commands/health-codex.ts +0 -576
  104. package/src/commands/health.ts +0 -315
  105. package/src/commands/history.ts +0 -63
  106. package/src/commands/intent.ts +0 -457
  107. package/src/commands/legacy-cleanup.ts +0 -531
  108. package/src/commands/legacy-import.ts +0 -104
  109. package/src/commands/mvp-smoke.ts +0 -160
  110. package/src/commands/pain-evidence.ts +0 -226
  111. package/src/commands/pain-list.ts +0 -239
  112. package/src/commands/pain-record.ts +0 -612
  113. package/src/commands/pain-retry.ts +0 -916
  114. package/src/commands/principles-stats.ts +0 -700
  115. package/src/commands/proven-channel-baseline.ts +0 -115
  116. package/src/commands/quality-scorecard.ts +0 -272
  117. package/src/commands/remediation-output.ts +0 -66
  118. package/src/commands/rulecode.ts +0 -465
  119. package/src/commands/run.ts +0 -89
  120. package/src/commands/runtime-activation.ts +0 -1629
  121. package/src/commands/runtime-artifact-repair.ts +0 -524
  122. package/src/commands/runtime-canary.ts +0 -395
  123. package/src/commands/runtime-compatibility-scan.ts +0 -105
  124. package/src/commands/runtime-diagnostics-export.ts +0 -229
  125. package/src/commands/runtime-features.ts +0 -153
  126. package/src/commands/runtime-gfi-snapshot.ts +0 -135
  127. package/src/commands/runtime-health-snapshot.ts +0 -108
  128. package/src/commands/runtime-init.ts +0 -429
  129. package/src/commands/runtime-internalization-enqueue-successors.ts +0 -530
  130. package/src/commands/runtime-internalization-integrity-repair.ts +0 -79
  131. package/src/commands/runtime-internalization-integrity.ts +0 -107
  132. package/src/commands/runtime-internalization-queue.ts +0 -135
  133. package/src/commands/runtime-internalization-retry.ts +0 -191
  134. package/src/commands/runtime-internalization-run-once.ts +0 -791
  135. package/src/commands/runtime-internalization-run-rulehost.ts +0 -749
  136. package/src/commands/runtime-internalization-wake-once.ts +0 -87
  137. package/src/commands/runtime-pain-flood-simulation.ts +0 -121
  138. package/src/commands/runtime-pruning.ts +0 -438
  139. package/src/commands/runtime-recovery-failed-tasks.ts +0 -258
  140. package/src/commands/runtime-recovery.ts +0 -109
  141. package/src/commands/runtime-synthetic-baseline.ts +0 -70
  142. package/src/commands/runtime-uat.guard.test.ts +0 -175
  143. package/src/commands/runtime-uat.ts +0 -380
  144. package/src/commands/runtime.ts +0 -473
  145. package/src/commands/samples-list.ts +0 -39
  146. package/src/commands/samples-review.ts +0 -36
  147. package/src/commands/task.ts +0 -271
  148. package/src/commands/telemetry.ts +0 -349
  149. package/src/commands/trace.ts +0 -174
  150. package/src/commands/trajectory-db-unavailable.ts +0 -19
  151. package/src/commands/trajectory.ts +0 -64
  152. package/src/commands/version.ts +0 -49
  153. package/src/config-reader.ts +0 -122
  154. package/src/index.ts +0 -1276
  155. package/src/legacy/legacy-import.ts +0 -179
  156. package/src/legacy/session-history-import.ts +0 -203
  157. package/src/resolve-workspace.ts +0 -106
  158. package/src/services/__tests__/cli-output.test.ts +0 -130
  159. package/src/services/__tests__/evaluator-runner-deps.test.ts +0 -382
  160. package/src/services/__tests__/rulehost-readiness.test.ts +0 -363
  161. package/src/services/__tests__/runtime-adapter-resolver.test.ts +0 -793
  162. package/src/services/cli-output.ts +0 -95
  163. package/src/services/config-doctor.ts +0 -697
  164. package/src/services/console-launcher.ts +0 -537
  165. package/src/services/demo-rule-compiler.ts +0 -40
  166. package/src/services/demo-story-a-runner.ts +0 -471
  167. package/src/services/mainline-snapshot-assembler.ts +0 -579
  168. package/src/services/pain-flood-simulation-runner.ts +0 -462
  169. package/src/services/pd-config-loader.ts +0 -433
  170. package/src/services/proven-channel-baseline-runner.ts +0 -157
  171. package/src/services/quality-scorecard/data-extractor.ts +0 -150
  172. package/src/services/quality-scorecard/local-evaluator.ts +0 -142
  173. package/src/services/quality-scorecard/strong-model-gate.ts +0 -202
  174. package/src/services/resolve-runtime-from-pd-config.ts +0 -230
  175. package/src/services/rulehost-pipeline-runner.ts +0 -1214
  176. package/src/services/rulehost-readiness.ts +0 -326
  177. package/src/services/runtime-adapter-resolver.ts +0 -364
  178. package/src/services/synthetic-baseline-runner.ts +0 -400
  179. package/src/services/version-report.ts +0 -253
  180. package/src/services/workspace-tool-semantics.ts +0 -26
  181. package/src/utils/path-security.ts +0 -96
  182. package/src/utils/production-workspace-guard.test.ts +0 -157
  183. package/src/utils/production-workspace-guard.ts +0 -210
  184. package/tests/bdd/cli-contract.steps.ts +0 -346
  185. package/tests/bdd/principles-stats.steps.ts +0 -211
  186. package/tests/bdd/support/gherkin-loader.ts +0 -147
  187. package/tests/bdd/support/repo-root.ts +0 -62
  188. package/tests/bdd/support/vitest-bdd.ts +0 -179
  189. package/tests/commands/admission-gate-coverage.test.ts +0 -79
  190. package/tests/commands/build-trajectory-evidence.test.ts +0 -508
  191. package/tests/commands/candidate-audit-repair.test.ts +0 -421
  192. package/tests/commands/candidate-intake.test.ts +0 -732
  193. package/tests/commands/candidate-internalization-backfill.test.ts +0 -548
  194. package/tests/commands/candidate-internalize-lineage.test.ts +0 -628
  195. package/tests/commands/candidate-internalize.test.ts +0 -299
  196. package/tests/commands/candidate-route.test.ts +0 -329
  197. package/tests/commands/candidate-show.test.ts +0 -95
  198. package/tests/commands/cli-command-tree.test.ts +0 -144
  199. package/tests/commands/cli-help-snapshot.test.ts +0 -155
  200. package/tests/commands/cli-skill-contract.test.ts +0 -121
  201. package/tests/commands/codex-consent-reversibility.steps.test.ts +0 -299
  202. package/tests/commands/codex-ingest-quarantine.test.ts +0 -136
  203. package/tests/commands/codex-setup.test.ts +0 -297
  204. package/tests/commands/codex-worker-daemon.test.ts +0 -95
  205. package/tests/commands/codex-worker-registration.test.ts +0 -207
  206. package/tests/commands/config-doctor.test.ts +0 -336
  207. package/tests/commands/console-launcher-edge-cases.test.ts +0 -388
  208. package/tests/commands/console-open.test.ts +0 -1381
  209. package/tests/commands/context.test.ts +0 -114
  210. package/tests/commands/demo-story-a.test.ts +0 -318
  211. package/tests/commands/diagnose.test.ts +0 -1803
  212. package/tests/commands/errors-list.test.ts +0 -679
  213. package/tests/commands/evolution-tasks-list.test.ts +0 -41
  214. package/tests/commands/evolution-tasks-show.test.ts +0 -46
  215. package/tests/commands/health-codex.test.ts +0 -349
  216. package/tests/commands/health-host-wiring.test.ts +0 -76
  217. package/tests/commands/health-reliability.test.ts +0 -99
  218. package/tests/commands/health.test.ts +0 -413
  219. package/tests/commands/intent.test.ts +0 -321
  220. package/tests/commands/legacy-cleanup.test.ts +0 -148
  221. package/tests/commands/pain-evidence.test.ts +0 -518
  222. package/tests/commands/pain-list.test.ts +0 -219
  223. package/tests/commands/pain-record-async.test.ts +0 -335
  224. package/tests/commands/pain-record-session-parser.test.ts +0 -228
  225. package/tests/commands/pain-record.test.ts +0 -851
  226. package/tests/commands/pain-retry.test.ts +0 -1121
  227. package/tests/commands/plugin-config-resolution-cutover.test.ts +0 -229
  228. package/tests/commands/pri-393-runtime-config-unification.test.ts +0 -443
  229. package/tests/commands/principles-stats-wiring.test.ts +0 -135
  230. package/tests/commands/principles-stats.test.ts +0 -274
  231. package/tests/commands/product-path-regression.test.ts +0 -86
  232. package/tests/commands/proven-channel-baseline.test.ts +0 -441
  233. package/tests/commands/rulecode.test.ts +0 -177
  234. package/tests/commands/run-rulehost-handler.test.ts +0 -908
  235. package/tests/commands/runtime-activation-approve-flag-wiring.test.ts +0 -227
  236. package/tests/commands/runtime-activation-deactivate-flag-wiring.test.ts +0 -167
  237. package/tests/commands/runtime-activation-dispatch-flag-wiring.test.ts +0 -262
  238. package/tests/commands/runtime-activation-governance-audit.test.ts +0 -95
  239. package/tests/commands/runtime-activation-list-flag-wiring.test.ts +0 -193
  240. package/tests/commands/runtime-activation-promote-flag-wiring.test.ts +0 -248
  241. package/tests/commands/runtime-activation-shadow-telemetry.test.ts +0 -130
  242. package/tests/commands/runtime-activation.test.ts +0 -2052
  243. package/tests/commands/runtime-artifact-repair-registration.test.ts +0 -74
  244. package/tests/commands/runtime-artifact-repair.test.ts +0 -404
  245. package/tests/commands/runtime-canary.test.ts +0 -430
  246. package/tests/commands/runtime-compatibility-scan.test.ts +0 -146
  247. package/tests/commands/runtime-diagnostics-export.test.ts +0 -175
  248. package/tests/commands/runtime-features.test.ts +0 -249
  249. package/tests/commands/runtime-health-snapshot.test.ts +0 -358
  250. package/tests/commands/runtime-init-empty-workspace.test.ts +0 -252
  251. package/tests/commands/runtime-init.test.ts +0 -420
  252. package/tests/commands/runtime-internalization-enqueue-successors.test.ts +0 -782
  253. package/tests/commands/runtime-internalization-integrity-repair.test.ts +0 -239
  254. package/tests/commands/runtime-internalization-integrity.test.ts +0 -140
  255. package/tests/commands/runtime-internalization-queue.test.ts +0 -380
  256. package/tests/commands/runtime-internalization-retry-owner-authority.test.ts +0 -431
  257. package/tests/commands/runtime-internalization-run-once-evaluator-parity.test.ts +0 -269
  258. package/tests/commands/runtime-internalization-run-once-language.test.ts +0 -303
  259. package/tests/commands/runtime-internalization-run-once-real-config.test.ts +0 -237
  260. package/tests/commands/runtime-internalization-run-once-rollout-parity.test.ts +0 -706
  261. package/tests/commands/runtime-internalization-run-once.test.ts +0 -1791
  262. package/tests/commands/runtime-internalization-wake-once.test.ts +0 -171
  263. package/tests/commands/runtime-internalization.test.ts +0 -53
  264. package/tests/commands/runtime-pain-flood-simulation.test.ts +0 -418
  265. package/tests/commands/runtime-pruning.test.ts +0 -694
  266. package/tests/commands/runtime-recovery-failed-tasks.test.ts +0 -328
  267. package/tests/commands/runtime-recovery.test.ts +0 -120
  268. package/tests/commands/runtime-synthetic-baseline.test.ts +0 -249
  269. package/tests/commands/runtime-uat.test.ts +0 -397
  270. package/tests/commands/runtime.test.ts +0 -392
  271. package/tests/commands/samples-list.test.ts +0 -43
  272. package/tests/commands/samples-review.test.ts +0 -41
  273. package/tests/commands/task.test.ts +0 -153
  274. package/tests/commands/telemetry.test.ts +0 -190
  275. package/tests/commands/trace.test.ts +0 -316
  276. package/tests/config-reader.test.ts +0 -143
  277. package/tests/e2e/candidate-intake-e2e.test.ts +0 -338
  278. package/tests/e2e/cli-full-flow.test.ts +0 -233
  279. package/tests/e2e/cross-package-acceptance.test.ts +0 -635
  280. package/tests/helpers/pd-cli-path.ts +0 -5
  281. package/tests/pd-cli-smoke.test.ts +0 -13
  282. package/tests/resolve-workspace.test.ts +0 -196
  283. package/tests/services/config-doctor-signal-health.test.ts +0 -109
  284. package/tests/services/console-launcher.test.ts +0 -114
  285. package/tests/services/demo-rule-compiler.test.ts +0 -242
  286. package/tests/services/mainline-snapshot-assembler.test.ts +0 -572
  287. package/tests/services/pd-config-loader.test.ts +0 -505
  288. package/tests/services/proven-channel-baseline-runner.test.ts +0 -30
  289. package/tests/services/quality-scorecard/strong-model-gate.test.ts +0 -133
  290. package/tests/services/resolve-runtime-from-pd-config.test.ts +0 -485
  291. package/tests/services/rulehost-pipeline-e2e.test.ts +0 -538
  292. package/tests/services/rulehost-pipeline-runner.test.ts +0 -1242
  293. package/tests/services/workspace-tool-semantics.test.ts +0 -76
  294. package/tests/utils/path-security.test.ts +0 -180
  295. package/tsconfig.json +0 -26
  296. package/vitest.config.ts +0 -10
@@ -1,473 +0,0 @@
1
- /**
2
- * pd runtime probe command — Runtime health and capabilities inspection.
3
- *
4
- * Usage:
5
- * pd runtime probe --runtime openclaw-cli [--openclaw-local|--openclaw-gateway] [--json]
6
- * pd runtime probe --runtime pi-ai --provider <name> --model <id> --apiKeyEnv <name> [--baseUrl <url>] [--json]
7
- *
8
- * HG-01 HARD GATE: This command must deliver.
9
- */
10
- import * as path from 'path';
11
- import type { Command } from 'commander';
12
- import { probeRuntime, PDRuntimeError, isRuntimeConfigError } from '@principles/core/runtime-v2';
13
- import { resolveRuntimeFromPdConfig, resolveRuntimeWithOverrides } from '../services/resolve-runtime-from-pd-config.js';
14
-
15
- interface RuntimeProbeOptions {
16
- runtime: string;
17
- openclawLocal?: boolean;
18
- openclawGateway?: boolean;
19
- agent?: string;
20
- provider?: string;
21
- model?: string;
22
- apiKeyEnv?: string;
23
- baseUrl?: string;
24
- maxRetries?: number;
25
- timeoutMs?: number;
26
- workspace?: string;
27
- json?: boolean;
28
- }
29
-
30
- /**
31
- * Format capabilities as a key-value table for console output.
32
- */
33
- function formatCapabilitiesTable(capabilities: Record<string, unknown>): string {
34
- const lines: string[] = [];
35
- for (const [key, value] of Object.entries(capabilities)) {
36
- const displayValue = typeof value === 'boolean' ? (value ? 'yes' : 'no') : String(value);
37
- lines.push(` ${key.padEnd(40)} ${displayValue}`);
38
- }
39
- return lines.join('\n');
40
- }
41
-
42
- /**
43
- * openclaw-cli probe branch (existing behavior, unchanged).
44
- */
45
- async function handleOpenClawProbe(opts: RuntimeProbeOptions): Promise<void> {
46
- // Validate mutually exclusive flags (HG-03)
47
- if (opts.openclawLocal && opts.openclawGateway) {
48
- console.error('error: --openclaw-local and --openclaw-gateway are mutually exclusive');
49
- process.exit(1);
50
- }
51
-
52
- // Require explicit runtime mode (HG-03, DPB-09)
53
- if (!opts.openclawLocal && !opts.openclawGateway) {
54
- console.error('error: --openclaw-local or --openclaw-gateway is required for --runtime openclaw-cli');
55
- process.exit(1);
56
- }
57
-
58
- const runtimeMode = opts.openclawLocal ? 'local' : 'gateway';
59
-
60
- try {
61
- const result = await probeRuntime({
62
- runtimeKind: 'openclaw-cli',
63
- runtimeMode,
64
- agentId: opts.agent,
65
- });
66
-
67
- // Per finding #2: status must reflect actual health
68
- // healthy=false → status=failed, exit 1
69
- // healthy=true + degraded=true → status=degraded
70
- // healthy=true + degraded=false → status=succeeded
71
- let exitCode = 0;
72
- const status = !result.health.healthy ? 'failed'
73
- : result.health.degraded ? 'degraded'
74
- : 'succeeded';
75
- if (!result.health.healthy) exitCode = 1;
76
-
77
- if (opts.json) {
78
- console.log(JSON.stringify({
79
- status,
80
- runtimeKind: result.runtimeKind,
81
- health: result.health,
82
- capabilities: result.capabilities,
83
- }, null, 2));
84
- if (exitCode !== 0) {
85
- process.exit(exitCode);
86
- }
87
- return;
88
- }
89
-
90
- // Human-readable output
91
- console.log(`\nRuntime: ${result.runtimeKind}`);
92
- console.log(`Mode: ${runtimeMode}`);
93
- console.log(`Status: ${status}`);
94
- console.log('');
95
- console.log('Health:');
96
- console.log(` healthy: ${result.health.healthy ? 'yes' : 'no'}`);
97
- console.log(` degraded: ${result.health.degraded ? 'yes' : 'no'}`);
98
- if (result.health.warnings.length > 0) {
99
- console.log(` warnings:`);
100
- for (const w of result.health.warnings) {
101
- console.log(` - ${w}`);
102
- }
103
- }
104
- console.log(` lastCheckedAt: ${result.health.lastCheckedAt}`);
105
- console.log('');
106
- console.log('Capabilities:');
107
- console.log(formatCapabilitiesTable(result.capabilities));
108
- console.log('');
109
-
110
- if (exitCode !== 0) {
111
- process.exit(exitCode);
112
- }
113
- } catch (error: unknown) {
114
- const message = error instanceof Error ? error.message : String(error);
115
- let errorCategory = 'execution_failed';
116
- if (error instanceof PDRuntimeError) {
117
- errorCategory = error.category;
118
- }
119
- if (opts.json) {
120
- console.log(JSON.stringify({
121
- status: 'failed',
122
- errorCategory,
123
- message,
124
- runtimeKind: 'openclaw-cli',
125
- }, null, 2));
126
- } else {
127
- console.error(`error: ${message} (${errorCategory})`);
128
- }
129
- process.exit(1);
130
- }
131
- }
132
-
133
- /**
134
- * pi-ai probe branch — validates flags, calls probeRuntime, formats output.
135
- *
136
- * PRI-402: When --workspace is provided without explicit --provider,
137
- * reads pi-ai config from .pd/config.yaml via resolveRuntimeWithOverrides.
138
- * JSON output includes configSource, runtimeProfileId, runtimeProfileLabel
139
- * for alignment with `pd config doctor`.
140
- */
141
- async function handlePiAiProbe(opts: RuntimeProbeOptions): Promise<void> {
142
- // D-01: flags are required for pi-ai probe unless --workspace is provided (policy fallback)
143
- const workspaceDir = opts.workspace ? path.resolve(opts.workspace) : undefined;
144
- let provider = opts.provider ?? '';
145
- let model = opts.model ?? '';
146
- let apiKeyEnv = opts.apiKeyEnv ?? '';
147
- let baseUrl = opts.baseUrl ?? '';
148
- let { timeoutMs, maxRetries } = opts;
149
-
150
- // PRI-402: Track config source and profile info for JSON output
151
- let configSource: string | null = null;
152
- let runtimeProfileId: string | null = null;
153
- let runtimeProfileLabel: string | null = null;
154
-
155
- // PRI-393: always load workspace policy from .pd/config.yaml (not .state/workflows.yaml)
156
- if (workspaceDir) {
157
- const resolved = resolveRuntimeWithOverrides(workspaceDir, {
158
- provider: opts.provider,
159
- model: opts.model,
160
- apiKeyEnv: opts.apiKeyEnv,
161
- baseUrl: opts.baseUrl,
162
- maxRetries: opts.maxRetries,
163
- timeoutMs: opts.timeoutMs,
164
- });
165
- for (const w of resolved.legacyWarnings) console.warn(`Warning: ${w}`);
166
-
167
- // PRI-402: capture profile info regardless of merge result
168
- ({ configSource, runtimeProfileId, runtimeProfileLabel } = resolved);
169
-
170
- if (resolved.mergedConfig) {
171
- provider = provider || resolved.mergedConfig.provider || '';
172
- model = model || resolved.mergedConfig.model || '';
173
- apiKeyEnv = apiKeyEnv || resolved.mergedConfig.apiKeyEnv || '';
174
- baseUrl = baseUrl || resolved.mergedConfig.baseUrl || '';
175
- timeoutMs = timeoutMs ?? resolved.mergedConfig.timeoutMs;
176
- maxRetries = maxRetries ?? resolved.mergedConfig.maxRetries;
177
- } else if (isRuntimeConfigError(resolved.result)) {
178
- // PRI-402: fail-loud JSON when config.yaml is broken (EP-03, EP-04)
179
- if (opts.json) {
180
- console.log(JSON.stringify({
181
- ok: false,
182
- status: 'failed',
183
- reason: resolved.result.reason,
184
- message: resolved.result.message,
185
- nextAction: resolved.result.nextAction,
186
- configSource: resolved.configSource,
187
- }, null, 2));
188
- } else {
189
- console.error(`error: could not resolve runtime from .pd/config.yaml — ${resolved.result.message}`);
190
- console.error(`nextAction: ${resolved.result.nextAction}`);
191
- }
192
- process.exit(1);
193
- return;
194
- }
195
- }
196
-
197
- if (!provider) {
198
- // PRI-402: fail-loud JSON when provider is missing (EP-03, EP-04)
199
- if (opts.json) {
200
- console.log(JSON.stringify({
201
- ok: false,
202
- status: 'failed',
203
- reason: 'provider_missing',
204
- message: '--provider is required for --runtime pi-ai (or set in .pd/config.yaml)',
205
- nextAction: 'Set provider in .pd/config.yaml runtimeProfiles, or pass --provider explicitly',
206
- configSource,
207
- }, null, 2));
208
- } else {
209
- console.error("error: --provider is required for --runtime pi-ai (or set in .pd/config.yaml)");
210
- console.error(" e.g.: pd runtime probe --runtime pi-ai --provider openrouter --model anthropic/claude-sonnet-4 --apiKeyEnv OPENROUTER_API_KEY");
211
- }
212
- process.exit(1);
213
- return;
214
- }
215
- if (!model) {
216
- if (opts.json) {
217
- console.log(JSON.stringify({
218
- ok: false,
219
- status: 'failed',
220
- reason: 'model_missing',
221
- message: '--model is required for --runtime pi-ai (or set in .pd/config.yaml)',
222
- nextAction: 'Set model in .pd/config.yaml runtimeProfiles, or pass --model explicitly',
223
- configSource,
224
- }, null, 2));
225
- } else {
226
- console.error("error: --model is required for --runtime pi-ai (or set in .pd/config.yaml)");
227
- console.error(" e.g.: pd runtime probe --runtime pi-ai --provider openrouter --model anthropic/claude-sonnet-4 --apiKeyEnv OPENROUTER_API_KEY");
228
- }
229
- process.exit(1);
230
- return;
231
- }
232
- if (!apiKeyEnv) {
233
- if (opts.json) {
234
- console.log(JSON.stringify({
235
- ok: false,
236
- status: 'failed',
237
- reason: 'apiKeyEnv_missing',
238
- message: '--apiKeyEnv is required for --runtime pi-ai (or set in .pd/config.yaml)',
239
- nextAction: 'Set apiKeyEnv in .pd/config.yaml runtimeProfiles, or pass --apiKeyEnv explicitly',
240
- configSource,
241
- }, null, 2));
242
- } else {
243
- console.error("error: --apiKeyEnv is required for --runtime pi-ai (or set in .pd/config.yaml)");
244
- console.error(" e.g.: pd runtime probe --runtime pi-ai --provider openrouter --model anthropic/claude-sonnet-4 --apiKeyEnv OPENROUTER_API_KEY");
245
- }
246
- process.exit(1);
247
- return;
248
- }
249
-
250
- // D-09: check env var exists before calling probeRuntime
251
- if (!process.env[apiKeyEnv]) {
252
- if (opts.json) {
253
- console.log(JSON.stringify({
254
- ok: false,
255
- status: 'failed',
256
- reason: 'api_key_not_set',
257
- message: `Environment variable '${apiKeyEnv}' is not set`,
258
- nextAction: `Set the environment variable '${apiKeyEnv}' with a valid API key`,
259
- configSource,
260
- }, null, 2));
261
- } else {
262
- console.error(`error: environment variable '${apiKeyEnv}' is not set`);
263
- }
264
- process.exit(1);
265
- return;
266
- }
267
-
268
- try {
269
- const result = await probeRuntime({
270
- runtimeKind: 'pi-ai',
271
- provider,
272
- model,
273
- apiKeyEnv,
274
- baseUrl,
275
- maxRetries: maxRetries,
276
- timeoutMs: timeoutMs ?? 120_000, // D-04: probe timeout 120s (matches Runtime defaults)
277
- });
278
-
279
- // Narrow to pi-ai result (TypeScript can't infer from input args alone)
280
- if (result.runtimeKind !== 'pi-ai') {
281
- throw new Error('unexpected: probeRuntime returned non-pi-ai result');
282
- }
283
-
284
- // Determine status from health
285
- let exitCode = 0;
286
- const status = !result.health.healthy ? 'failed'
287
- : result.health.degraded ? 'degraded'
288
- : 'succeeded';
289
- if (!result.health.healthy) exitCode = 1;
290
-
291
- if (opts.json) {
292
- // PRI-402: include configSource, runtimeProfileId, runtimeProfileLabel in JSON output
293
- const jsonOutput: Record<string, unknown> = {
294
- ok: result.health.healthy,
295
- status,
296
- runtimeKind: result.runtimeKind,
297
- provider: result.provider,
298
- model: result.model,
299
- baseUrlPresent: !!baseUrl,
300
- health: result.health,
301
- capabilities: result.capabilities,
302
- };
303
- if (configSource) jsonOutput.configSource = configSource;
304
- if (runtimeProfileId) jsonOutput.runtimeProfileId = runtimeProfileId;
305
- if (runtimeProfileLabel) jsonOutput.runtimeProfileLabel = runtimeProfileLabel;
306
- console.log(JSON.stringify(jsonOutput, null, 2));
307
- if (exitCode !== 0) process.exit(exitCode);
308
- return;
309
- }
310
-
311
- // D-05: human-readable output
312
- console.log(`\nRuntime: ${result.runtimeKind}`);
313
- console.log(`Provider: ${result.provider}`);
314
- console.log(`Model: ${result.model}`);
315
- if (baseUrl) console.log(`BaseUrl: ${baseUrl}`);
316
- if (runtimeProfileLabel) console.log(`Profile: ${runtimeProfileLabel}`);
317
- if (configSource) console.log(`Config: ${configSource}`);
318
- console.log(`Status: ${status}`);
319
- console.log('');
320
- console.log('Health:');
321
- console.log(` healthy: ${result.health.healthy ? 'yes' : 'no'}`);
322
- console.log(` degraded: ${result.health.degraded ? 'yes' : 'no'}`);
323
- if (result.health.warnings.length > 0) {
324
- console.log(' warnings:');
325
- for (const w of result.health.warnings) {
326
- console.log(` - ${w}`);
327
- }
328
- }
329
- console.log(` lastCheckedAt: ${result.health.lastCheckedAt}`);
330
- console.log('');
331
- console.log('Capabilities:');
332
- console.log(formatCapabilitiesTable(result.capabilities));
333
- console.log('');
334
-
335
- if (exitCode !== 0) process.exit(exitCode);
336
- } catch (error: unknown) {
337
- // D-10: test complete failure → error category + raw error
338
- const message = error instanceof Error ? error.message : String(error);
339
- let errorCategory = 'execution_failed';
340
- if (error instanceof PDRuntimeError) {
341
- errorCategory = error.category;
342
- }
343
- if (opts.json) {
344
- console.log(JSON.stringify({
345
- ok: false,
346
- status: 'failed',
347
- errorCategory,
348
- message,
349
- runtimeKind: 'pi-ai',
350
- configSource,
351
- }, null, 2));
352
- } else {
353
- console.error(`error: ${message} (${errorCategory})`);
354
- }
355
- process.exit(1);
356
- }
357
- }
358
-
359
- /**
360
- * --runtime config probe branch — PRI-393
361
- * Resolves runtime from .pd/config.yaml, then dispatches to pi-ai or openclaw-cli probe.
362
- */
363
- async function handleConfigProbe(opts: RuntimeProbeOptions): Promise<void> {
364
- const workspaceDir = opts.workspace ? path.resolve(opts.workspace) : undefined;
365
- if (!workspaceDir) {
366
- if (opts.json) {
367
- console.log(JSON.stringify({
368
- ok: false,
369
- status: 'failed',
370
- reason: 'workspace_missing',
371
- message: '--workspace is required for --runtime config',
372
- nextAction: 'Provide --workspace <path> pointing to a PD workspace directory',
373
- }, null, 2));
374
- } else {
375
- console.error('error: --workspace is required for --runtime config');
376
- }
377
- process.exit(1);
378
- return;
379
- }
380
-
381
- const resolved = resolveRuntimeFromPdConfig(workspaceDir);
382
- for (const w of resolved.legacyWarnings) console.warn(`Warning: ${w}`);
383
-
384
- if (isRuntimeConfigError(resolved.result)) {
385
- if (opts.json) {
386
- console.log(JSON.stringify({
387
- ok: false,
388
- status: 'failed',
389
- errorCategory: 'config_error',
390
- message: resolved.result.message,
391
- reason: resolved.result.reason,
392
- nextAction: resolved.result.nextAction,
393
- configSource: resolved.configSource,
394
- }, null, 2));
395
- } else {
396
- console.error(`error: ${resolved.result.message}`);
397
- console.error(`nextAction: ${resolved.result.nextAction}`);
398
- }
399
- process.exit(1);
400
- return;
401
- }
402
-
403
- const config = resolved.result;
404
- // Dispatch to the appropriate runtime probe
405
- if (config.runtimeKind === 'pi-ai') {
406
- return handlePiAiProbe({
407
- ...opts,
408
- provider: opts.provider ?? config.provider,
409
- model: opts.model ?? config.model,
410
- apiKeyEnv: opts.apiKeyEnv ?? config.apiKeyEnv,
411
- baseUrl: opts.baseUrl ?? config.baseUrl,
412
- timeoutMs: opts.timeoutMs ?? config.timeoutMs,
413
- });
414
- }
415
-
416
- if (config.runtimeKind === 'openclaw-cli') {
417
- return handleOpenClawProbe({
418
- ...opts,
419
- openclawLocal: config.openclawMode === 'local' ? true : opts.openclawLocal,
420
- openclawGateway: config.openclawMode === 'gateway' ? true : opts.openclawGateway,
421
- });
422
- }
423
-
424
- console.error(`error: unsupported runtimeKind '${config.runtimeKind}' from .pd/config.yaml`);
425
- process.exit(1);
426
- return;
427
- }
428
-
429
- /**
430
- * pd runtime probe — dispatches to openclaw-cli, pi-ai, or config branch.
431
- */
432
- export async function handleRuntimeProbe(opts: RuntimeProbeOptions): Promise<void> {
433
- if (opts.runtime === 'openclaw-cli') {
434
- return handleOpenClawProbe(opts);
435
- }
436
-
437
- if (opts.runtime === 'pi-ai') {
438
- return handlePiAiProbe(opts);
439
- }
440
-
441
- if (opts.runtime === 'config') {
442
- return handleConfigProbe(opts);
443
- }
444
-
445
- console.error(`error: unsupported --runtime '${opts.runtime}' (supported: openclaw-cli, pi-ai, config)`);
446
- process.exit(1);
447
- return;
448
- }
449
-
450
- /**
451
- * Register the `pd runtime probe` command on a Commander instance.
452
- * Used by index.ts and tests to ensure real command wiring is verified (EP-04).
453
- */
454
- export function registerRuntimeProbeCommand(runtimeCmd: Command): Command {
455
- return runtimeCmd
456
- .command('probe', { hidden: true })
457
- .description('Probe runtime health and capabilities (HG-01 HARD GATE)')
458
- .requiredOption('-r, --runtime <kind>', "Runtime kind: 'openclaw-cli', 'pi-ai', or 'config'")
459
- .option('--openclaw-local', 'Use local OpenClaw (mutually exclusive with --openclaw-gateway)')
460
- .option('--openclaw-gateway', 'Use gateway OpenClaw (mutually exclusive with --openclaw-local)')
461
- .option('-a, --agent <agentId>', 'Agent ID to probe')
462
- .option('--provider <name>', 'LLM provider (e.g., openrouter) \u2014 for pi-ai, falls back to .pd/config.yaml')
463
- .option('--model <id>', 'Model ID (e.g., anthropic/claude-sonnet-4) \u2014 for pi-ai, falls back to .pd/config.yaml')
464
- .option('--apiKeyEnv <name>', 'Env var name for API key (e.g., OPENROUTER_API_KEY) \u2014 for pi-ai, falls back to .pd/config.yaml')
465
- .option('--baseUrl <url>', 'Custom base URL for OpenAI-compatible providers \u2014 for pi-ai, falls back to .pd/config.yaml')
466
- .option('--maxRetries <n>', 'Max retry attempts for LLM failures', parseInt)
467
- .option('--timeoutMs <ms>', 'Timeout in milliseconds for probe', parseInt)
468
- .option('-w, --workspace <path>', 'Workspace directory \u2014 loads pi-ai config from .pd/config.yaml')
469
- .option('--json', 'Output raw JSON')
470
- .action(async (opts) => {
471
- await handleRuntimeProbe(opts);
472
- });
473
- }
@@ -1,39 +0,0 @@
1
- /**
2
- * pd samples list command implementation.
3
- *
4
- * Usage: pd samples list [--status pending|approved|rejected]
5
- */
6
-
7
- import { listCorrectionSamples, TrajectoryDbUnavailableError } from '@principles/core/trajectory-store';
8
- import { resolveWorkspaceDir } from '../resolve-workspace.js';
9
- import { exitWithTrajectoryDbUnavailable } from './trajectory-db-unavailable.js';
10
-
11
- interface SamplesListOptions {
12
- status?: 'pending' | 'approved' | 'rejected';
13
- }
14
-
15
- export async function handleSamplesList(opts: SamplesListOptions): Promise<void> {
16
- const workspaceDir = resolveWorkspaceDir();
17
- const status = opts.status ?? 'pending';
18
-
19
- let samples;
20
- try {
21
- samples = listCorrectionSamples(workspaceDir, status);
22
- } catch (err) {
23
- if (err instanceof TrajectoryDbUnavailableError) {
24
- return exitWithTrajectoryDbUnavailable(err);
25
- }
26
- throw err;
27
- }
28
-
29
- if (samples.length === 0) {
30
- console.log('No correction samples found.');
31
- return;
32
- }
33
-
34
- console.log(`Correction Samples (${status}):`);
35
- for (const sample of samples) {
36
- console.log(` [${sample.sampleId}] session=${sample.sessionId} score=${sample.qualityScore} created=${sample.createdAt}`);
37
- }
38
- console.log(`${samples.length} sample(s)`);
39
- }
@@ -1,36 +0,0 @@
1
- /**
2
- * pd samples review command implementation.
3
- *
4
- * Usage: pd samples review <sample-id> approve|reject [note]
5
- */
6
-
7
- import { reviewCorrectionSample, TrajectoryDbUnavailableError } from '@principles/core/trajectory-store';
8
- import { resolveWorkspaceDir } from '../resolve-workspace.js';
9
- import { exitWithTrajectoryDbUnavailable } from './trajectory-db-unavailable.js';
10
-
11
- type ReviewDecision = 'approved' | 'rejected';
12
-
13
- interface SamplesReviewOptions {
14
- sampleId: string;
15
- decision: ReviewDecision;
16
- note?: string;
17
- }
18
-
19
- export async function handleSamplesReview(opts: SamplesReviewOptions): Promise<void> {
20
- const workspaceDir = resolveWorkspaceDir();
21
-
22
- try {
23
- reviewCorrectionSample(opts.sampleId, opts.decision, opts.note, workspaceDir);
24
- } catch (err) {
25
- if (err instanceof TrajectoryDbUnavailableError) {
26
- return exitWithTrajectoryDbUnavailable(err);
27
- }
28
- if (err instanceof Error && err.message.includes('Sample not found')) {
29
- console.error(`Error: Sample not found: ${opts.sampleId}`);
30
- process.exit(1);
31
- }
32
- throw err;
33
- }
34
-
35
- console.log(`Sample ${opts.sampleId} marked as ${opts.decision}`);
36
- }