@principles/pd-cli 1.152.12 → 1.152.14
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/dist/commands/candidate.d.ts.map +1 -1
- package/dist/commands/candidate.js +34 -7
- package/dist/commands/candidate.js.map +1 -1
- package/dist/commands/diagnose.d.ts.map +1 -1
- package/dist/commands/diagnose.js +23 -7
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/pain-retry.d.ts.map +1 -1
- package/dist/commands/pain-retry.js +21 -7
- package/dist/commands/pain-retry.js.map +1 -1
- package/package.json +13 -7
- package/CHANGELOG.md +0 -23
- package/dist/commands/__tests__/intent-flag-wiring.test.d.ts +0 -9
- package/dist/commands/__tests__/intent-flag-wiring.test.d.ts.map +0 -1
- package/dist/commands/__tests__/intent-flag-wiring.test.js +0 -237
- package/dist/commands/__tests__/intent-flag-wiring.test.js.map +0 -1
- package/dist/commands/__tests__/legacy-cleanup.test.d.ts +0 -18
- package/dist/commands/__tests__/legacy-cleanup.test.d.ts.map +0 -1
- package/dist/commands/__tests__/legacy-cleanup.test.js +0 -467
- package/dist/commands/__tests__/legacy-cleanup.test.js.map +0 -1
- package/dist/commands/__tests__/mvp-smoke.test.d.ts +0 -15
- package/dist/commands/__tests__/mvp-smoke.test.d.ts.map +0 -1
- package/dist/commands/__tests__/mvp-smoke.test.js +0 -262
- package/dist/commands/__tests__/mvp-smoke.test.js.map +0 -1
- package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.d.ts +0 -2
- package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.d.ts.map +0 -1
- package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.js +0 -60
- package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.js.map +0 -1
- package/dist/commands/__tests__/rulecode-flag-wiring.test.d.ts +0 -21
- package/dist/commands/__tests__/rulecode-flag-wiring.test.d.ts.map +0 -1
- package/dist/commands/__tests__/rulecode-flag-wiring.test.js +0 -186
- package/dist/commands/__tests__/rulecode-flag-wiring.test.js.map +0 -1
- package/dist/commands/__tests__/rulecode-handler.test.d.ts +0 -16
- package/dist/commands/__tests__/rulecode-handler.test.d.ts.map +0 -1
- package/dist/commands/__tests__/rulecode-handler.test.js +0 -285
- package/dist/commands/__tests__/rulecode-handler.test.js.map +0 -1
- package/dist/commands/__tests__/run-rulehost-flag-wiring.test.d.ts +0 -24
- package/dist/commands/__tests__/run-rulehost-flag-wiring.test.d.ts.map +0 -1
- package/dist/commands/__tests__/run-rulehost-flag-wiring.test.js +0 -232
- package/dist/commands/__tests__/run-rulehost-flag-wiring.test.js.map +0 -1
- package/dist/commands/__tests__/runtime-activation-nextaction.test.d.ts +0 -15
- package/dist/commands/__tests__/runtime-activation-nextaction.test.d.ts.map +0 -1
- package/dist/commands/__tests__/runtime-activation-nextaction.test.js +0 -73
- package/dist/commands/__tests__/runtime-activation-nextaction.test.js.map +0 -1
- package/dist/commands/__tests__/runtime-probe-config.test.d.ts +0 -20
- package/dist/commands/__tests__/runtime-probe-config.test.d.ts.map +0 -1
- package/dist/commands/__tests__/runtime-probe-config.test.js +0 -389
- package/dist/commands/__tests__/runtime-probe-config.test.js.map +0 -1
- package/dist/commands/__tests__/telemetry-flag-wiring.test.d.ts +0 -9
- package/dist/commands/__tests__/telemetry-flag-wiring.test.d.ts.map +0 -1
- package/dist/commands/__tests__/telemetry-flag-wiring.test.js +0 -76
- package/dist/commands/__tests__/telemetry-flag-wiring.test.js.map +0 -1
- package/dist/commands/__tests__/version.test.d.ts +0 -2
- package/dist/commands/__tests__/version.test.d.ts.map +0 -1
- package/dist/commands/__tests__/version.test.js +0 -238
- package/dist/commands/__tests__/version.test.js.map +0 -1
- package/dist/commands/runtime-uat.guard.test.d.ts +0 -2
- package/dist/commands/runtime-uat.guard.test.d.ts.map +0 -1
- package/dist/commands/runtime-uat.guard.test.js +0 -153
- package/dist/commands/runtime-uat.guard.test.js.map +0 -1
- package/dist/services/__tests__/cli-output.test.d.ts +0 -18
- package/dist/services/__tests__/cli-output.test.d.ts.map +0 -1
- package/dist/services/__tests__/cli-output.test.js +0 -103
- package/dist/services/__tests__/cli-output.test.js.map +0 -1
- package/dist/services/__tests__/evaluator-runner-deps.test.d.ts +0 -2
- package/dist/services/__tests__/evaluator-runner-deps.test.d.ts.map +0 -1
- package/dist/services/__tests__/evaluator-runner-deps.test.js +0 -343
- package/dist/services/__tests__/evaluator-runner-deps.test.js.map +0 -1
- package/dist/services/__tests__/rulehost-readiness.test.d.ts +0 -2
- package/dist/services/__tests__/rulehost-readiness.test.d.ts.map +0 -1
- package/dist/services/__tests__/rulehost-readiness.test.js +0 -311
- package/dist/services/__tests__/rulehost-readiness.test.js.map +0 -1
- package/dist/services/__tests__/runtime-adapter-resolver.test.d.ts +0 -18
- package/dist/services/__tests__/runtime-adapter-resolver.test.d.ts.map +0 -1
- package/dist/services/__tests__/runtime-adapter-resolver.test.js +0 -673
- package/dist/services/__tests__/runtime-adapter-resolver.test.js.map +0 -1
- package/dist/utils/production-workspace-guard.test.d.ts +0 -2
- package/dist/utils/production-workspace-guard.test.d.ts.map +0 -1
- package/dist/utils/production-workspace-guard.test.js +0 -137
- package/dist/utils/production-workspace-guard.test.js.map +0 -1
- package/scripts/llm-dogfood.ts +0 -456
- package/scripts/migrate-illegal-expected-decision.ts +0 -252
- package/src/commands/__tests__/intent-flag-wiring.test.ts +0 -282
- package/src/commands/__tests__/legacy-cleanup.test.ts +0 -602
- package/src/commands/__tests__/mvp-smoke.test.ts +0 -300
- package/src/commands/__tests__/pain-retry-maxTokens-flag.test.ts +0 -73
- package/src/commands/__tests__/rulecode-flag-wiring.test.ts +0 -237
- package/src/commands/__tests__/rulecode-handler.test.ts +0 -369
- package/src/commands/__tests__/run-rulehost-flag-wiring.test.ts +0 -292
- package/src/commands/__tests__/runtime-activation-nextaction.test.ts +0 -81
- package/src/commands/__tests__/runtime-probe-config.test.ts +0 -432
- package/src/commands/__tests__/telemetry-flag-wiring.test.ts +0 -84
- package/src/commands/__tests__/version.test.ts +0 -251
- package/src/commands/admission-gate.ts +0 -30
- package/src/commands/artifact.ts +0 -82
- package/src/commands/build-trajectory-evidence.ts +0 -298
- package/src/commands/candidate.ts +0 -1250
- package/src/commands/codex-ingest-catchup.ts +0 -114
- package/src/commands/codex-ingest-quarantine.ts +0 -127
- package/src/commands/codex-reconcile.ts +0 -84
- package/src/commands/codex-setup.ts +0 -476
- package/src/commands/codex-worker.ts +0 -185
- package/src/commands/command-helpers.ts +0 -24
- package/src/commands/config-doctor.ts +0 -193
- package/src/commands/console.ts +0 -797
- package/src/commands/context.ts +0 -72
- package/src/commands/demo-story-a.ts +0 -241
- package/src/commands/diagnose.ts +0 -756
- package/src/commands/errors-list.ts +0 -441
- package/src/commands/evolution-tasks-list.ts +0 -48
- package/src/commands/evolution-tasks-show.ts +0 -62
- package/src/commands/flow.ts +0 -60
- package/src/commands/health-codex.ts +0 -576
- package/src/commands/health.ts +0 -315
- package/src/commands/history.ts +0 -63
- package/src/commands/intent.ts +0 -457
- package/src/commands/legacy-cleanup.ts +0 -531
- package/src/commands/legacy-import.ts +0 -104
- package/src/commands/mvp-smoke.ts +0 -160
- package/src/commands/pain-evidence.ts +0 -226
- package/src/commands/pain-list.ts +0 -239
- package/src/commands/pain-record.ts +0 -612
- package/src/commands/pain-retry.ts +0 -916
- package/src/commands/principles-stats.ts +0 -700
- package/src/commands/proven-channel-baseline.ts +0 -115
- package/src/commands/quality-scorecard.ts +0 -272
- package/src/commands/remediation-output.ts +0 -66
- package/src/commands/rulecode.ts +0 -465
- package/src/commands/run.ts +0 -89
- package/src/commands/runtime-activation.ts +0 -1629
- package/src/commands/runtime-artifact-repair.ts +0 -524
- package/src/commands/runtime-canary.ts +0 -395
- package/src/commands/runtime-compatibility-scan.ts +0 -105
- package/src/commands/runtime-diagnostics-export.ts +0 -229
- package/src/commands/runtime-features.ts +0 -153
- package/src/commands/runtime-gfi-snapshot.ts +0 -135
- package/src/commands/runtime-health-snapshot.ts +0 -108
- package/src/commands/runtime-init.ts +0 -429
- package/src/commands/runtime-internalization-enqueue-successors.ts +0 -530
- package/src/commands/runtime-internalization-integrity-repair.ts +0 -79
- package/src/commands/runtime-internalization-integrity.ts +0 -107
- package/src/commands/runtime-internalization-queue.ts +0 -135
- package/src/commands/runtime-internalization-retry.ts +0 -191
- package/src/commands/runtime-internalization-run-once.ts +0 -791
- package/src/commands/runtime-internalization-run-rulehost.ts +0 -749
- package/src/commands/runtime-internalization-wake-once.ts +0 -87
- package/src/commands/runtime-pain-flood-simulation.ts +0 -121
- package/src/commands/runtime-pruning.ts +0 -438
- package/src/commands/runtime-recovery-failed-tasks.ts +0 -258
- package/src/commands/runtime-recovery.ts +0 -109
- package/src/commands/runtime-synthetic-baseline.ts +0 -70
- package/src/commands/runtime-uat.guard.test.ts +0 -175
- package/src/commands/runtime-uat.ts +0 -380
- package/src/commands/runtime.ts +0 -473
- package/src/commands/samples-list.ts +0 -39
- package/src/commands/samples-review.ts +0 -36
- package/src/commands/task.ts +0 -271
- package/src/commands/telemetry.ts +0 -349
- package/src/commands/trace.ts +0 -174
- package/src/commands/trajectory-db-unavailable.ts +0 -19
- package/src/commands/trajectory.ts +0 -64
- package/src/commands/version.ts +0 -49
- package/src/config-reader.ts +0 -122
- package/src/index.ts +0 -1276
- package/src/legacy/legacy-import.ts +0 -179
- package/src/legacy/session-history-import.ts +0 -203
- package/src/resolve-workspace.ts +0 -106
- package/src/services/__tests__/cli-output.test.ts +0 -130
- package/src/services/__tests__/evaluator-runner-deps.test.ts +0 -382
- package/src/services/__tests__/rulehost-readiness.test.ts +0 -363
- package/src/services/__tests__/runtime-adapter-resolver.test.ts +0 -793
- package/src/services/cli-output.ts +0 -95
- package/src/services/config-doctor.ts +0 -697
- package/src/services/console-launcher.ts +0 -537
- package/src/services/demo-rule-compiler.ts +0 -40
- package/src/services/demo-story-a-runner.ts +0 -471
- package/src/services/mainline-snapshot-assembler.ts +0 -579
- package/src/services/pain-flood-simulation-runner.ts +0 -462
- package/src/services/pd-config-loader.ts +0 -433
- package/src/services/proven-channel-baseline-runner.ts +0 -157
- package/src/services/quality-scorecard/data-extractor.ts +0 -150
- package/src/services/quality-scorecard/local-evaluator.ts +0 -142
- package/src/services/quality-scorecard/strong-model-gate.ts +0 -202
- package/src/services/resolve-runtime-from-pd-config.ts +0 -230
- package/src/services/rulehost-pipeline-runner.ts +0 -1214
- package/src/services/rulehost-readiness.ts +0 -326
- package/src/services/runtime-adapter-resolver.ts +0 -364
- package/src/services/synthetic-baseline-runner.ts +0 -400
- package/src/services/version-report.ts +0 -253
- package/src/services/workspace-tool-semantics.ts +0 -26
- package/src/utils/path-security.ts +0 -96
- package/src/utils/production-workspace-guard.test.ts +0 -157
- package/src/utils/production-workspace-guard.ts +0 -210
- package/tests/bdd/cli-contract.steps.ts +0 -346
- package/tests/bdd/principles-stats.steps.ts +0 -211
- package/tests/bdd/support/gherkin-loader.ts +0 -147
- package/tests/bdd/support/repo-root.ts +0 -62
- package/tests/bdd/support/vitest-bdd.ts +0 -179
- package/tests/commands/admission-gate-coverage.test.ts +0 -79
- package/tests/commands/build-trajectory-evidence.test.ts +0 -508
- package/tests/commands/candidate-audit-repair.test.ts +0 -421
- package/tests/commands/candidate-intake.test.ts +0 -732
- package/tests/commands/candidate-internalization-backfill.test.ts +0 -548
- package/tests/commands/candidate-internalize-lineage.test.ts +0 -628
- package/tests/commands/candidate-internalize.test.ts +0 -299
- package/tests/commands/candidate-route.test.ts +0 -329
- package/tests/commands/candidate-show.test.ts +0 -95
- package/tests/commands/cli-command-tree.test.ts +0 -144
- package/tests/commands/cli-help-snapshot.test.ts +0 -155
- package/tests/commands/cli-skill-contract.test.ts +0 -121
- package/tests/commands/codex-consent-reversibility.steps.test.ts +0 -299
- package/tests/commands/codex-ingest-quarantine.test.ts +0 -136
- package/tests/commands/codex-setup.test.ts +0 -297
- package/tests/commands/codex-worker-daemon.test.ts +0 -95
- package/tests/commands/codex-worker-registration.test.ts +0 -207
- package/tests/commands/config-doctor.test.ts +0 -336
- package/tests/commands/console-launcher-edge-cases.test.ts +0 -388
- package/tests/commands/console-open.test.ts +0 -1381
- package/tests/commands/context.test.ts +0 -114
- package/tests/commands/demo-story-a.test.ts +0 -318
- package/tests/commands/diagnose.test.ts +0 -1803
- package/tests/commands/errors-list.test.ts +0 -679
- package/tests/commands/evolution-tasks-list.test.ts +0 -41
- package/tests/commands/evolution-tasks-show.test.ts +0 -46
- package/tests/commands/health-codex.test.ts +0 -349
- package/tests/commands/health-host-wiring.test.ts +0 -76
- package/tests/commands/health-reliability.test.ts +0 -99
- package/tests/commands/health.test.ts +0 -413
- package/tests/commands/intent.test.ts +0 -321
- package/tests/commands/legacy-cleanup.test.ts +0 -148
- package/tests/commands/pain-evidence.test.ts +0 -518
- package/tests/commands/pain-list.test.ts +0 -219
- package/tests/commands/pain-record-async.test.ts +0 -335
- package/tests/commands/pain-record-session-parser.test.ts +0 -228
- package/tests/commands/pain-record.test.ts +0 -851
- package/tests/commands/pain-retry.test.ts +0 -1121
- package/tests/commands/plugin-config-resolution-cutover.test.ts +0 -229
- package/tests/commands/pri-393-runtime-config-unification.test.ts +0 -443
- package/tests/commands/principles-stats-wiring.test.ts +0 -135
- package/tests/commands/principles-stats.test.ts +0 -274
- package/tests/commands/product-path-regression.test.ts +0 -86
- package/tests/commands/proven-channel-baseline.test.ts +0 -441
- package/tests/commands/rulecode.test.ts +0 -177
- package/tests/commands/run-rulehost-handler.test.ts +0 -908
- package/tests/commands/runtime-activation-approve-flag-wiring.test.ts +0 -227
- package/tests/commands/runtime-activation-deactivate-flag-wiring.test.ts +0 -167
- package/tests/commands/runtime-activation-dispatch-flag-wiring.test.ts +0 -262
- package/tests/commands/runtime-activation-governance-audit.test.ts +0 -95
- package/tests/commands/runtime-activation-list-flag-wiring.test.ts +0 -193
- package/tests/commands/runtime-activation-promote-flag-wiring.test.ts +0 -248
- package/tests/commands/runtime-activation-shadow-telemetry.test.ts +0 -130
- package/tests/commands/runtime-activation.test.ts +0 -2052
- package/tests/commands/runtime-artifact-repair-registration.test.ts +0 -74
- package/tests/commands/runtime-artifact-repair.test.ts +0 -404
- package/tests/commands/runtime-canary.test.ts +0 -430
- package/tests/commands/runtime-compatibility-scan.test.ts +0 -146
- package/tests/commands/runtime-diagnostics-export.test.ts +0 -175
- package/tests/commands/runtime-features.test.ts +0 -249
- package/tests/commands/runtime-health-snapshot.test.ts +0 -358
- package/tests/commands/runtime-init-empty-workspace.test.ts +0 -252
- package/tests/commands/runtime-init.test.ts +0 -420
- package/tests/commands/runtime-internalization-enqueue-successors.test.ts +0 -782
- package/tests/commands/runtime-internalization-integrity-repair.test.ts +0 -239
- package/tests/commands/runtime-internalization-integrity.test.ts +0 -140
- package/tests/commands/runtime-internalization-queue.test.ts +0 -380
- package/tests/commands/runtime-internalization-retry-owner-authority.test.ts +0 -431
- package/tests/commands/runtime-internalization-run-once-evaluator-parity.test.ts +0 -269
- package/tests/commands/runtime-internalization-run-once-language.test.ts +0 -303
- package/tests/commands/runtime-internalization-run-once-real-config.test.ts +0 -237
- package/tests/commands/runtime-internalization-run-once-rollout-parity.test.ts +0 -706
- package/tests/commands/runtime-internalization-run-once.test.ts +0 -1791
- package/tests/commands/runtime-internalization-wake-once.test.ts +0 -171
- package/tests/commands/runtime-internalization.test.ts +0 -53
- package/tests/commands/runtime-pain-flood-simulation.test.ts +0 -418
- package/tests/commands/runtime-pruning.test.ts +0 -694
- package/tests/commands/runtime-recovery-failed-tasks.test.ts +0 -328
- package/tests/commands/runtime-recovery.test.ts +0 -120
- package/tests/commands/runtime-synthetic-baseline.test.ts +0 -249
- package/tests/commands/runtime-uat.test.ts +0 -397
- package/tests/commands/runtime.test.ts +0 -392
- package/tests/commands/samples-list.test.ts +0 -43
- package/tests/commands/samples-review.test.ts +0 -41
- package/tests/commands/task.test.ts +0 -153
- package/tests/commands/telemetry.test.ts +0 -190
- package/tests/commands/trace.test.ts +0 -316
- package/tests/config-reader.test.ts +0 -143
- package/tests/e2e/candidate-intake-e2e.test.ts +0 -338
- package/tests/e2e/cli-full-flow.test.ts +0 -233
- package/tests/e2e/cross-package-acceptance.test.ts +0 -635
- package/tests/helpers/pd-cli-path.ts +0 -5
- package/tests/pd-cli-smoke.test.ts +0 -13
- package/tests/resolve-workspace.test.ts +0 -196
- package/tests/services/config-doctor-signal-health.test.ts +0 -109
- package/tests/services/console-launcher.test.ts +0 -114
- package/tests/services/demo-rule-compiler.test.ts +0 -242
- package/tests/services/mainline-snapshot-assembler.test.ts +0 -572
- package/tests/services/pd-config-loader.test.ts +0 -505
- package/tests/services/proven-channel-baseline-runner.test.ts +0 -30
- package/tests/services/quality-scorecard/strong-model-gate.test.ts +0 -133
- package/tests/services/resolve-runtime-from-pd-config.test.ts +0 -485
- package/tests/services/rulehost-pipeline-e2e.test.ts +0 -538
- package/tests/services/rulehost-pipeline-runner.test.ts +0 -1242
- package/tests/services/workspace-tool-semantics.test.ts +0 -76
- package/tests/utils/path-security.test.ts +0 -180
- package/tsconfig.json +0 -26
- package/vitest.config.ts +0 -10
package/src/commands/rulecode.ts
DELETED
|
@@ -1,465 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pd rulecode — RuleCode dialect spec, static validation, and sandbox replay.
|
|
3
|
-
*
|
|
4
|
-
* PRI-439 Phase 5: Read-only CLI commands that mirror 3 of the 4 Artificer L2
|
|
5
|
-
* agent tools (read_rulecode_spec, validate_rulecode, replay_rulecode). These
|
|
6
|
-
* commands let operators inspect the RuleCode contract and dry-run code
|
|
7
|
-
* against the same pure-logic validators the Artificer L2 agent uses.
|
|
8
|
-
*
|
|
9
|
-
* Subcommands:
|
|
10
|
-
* - spec : print the RuleCode dialect spec text
|
|
11
|
-
* - validate : run static validation (forbidden patterns + return shape +
|
|
12
|
-
* matched=false decision check) on a code string
|
|
13
|
-
* - replay : run sandbox replay of code against a golden trace JSON file
|
|
14
|
-
*
|
|
15
|
-
* All three are READ-ONLY: no DB mutation, no artifact writes, no approvals,
|
|
16
|
-
* no activations. Failure paths include structured reason + nextAction
|
|
17
|
-
* (CLI Operator Gate rule 6).
|
|
18
|
-
*
|
|
19
|
-
* JSON mode is strict: --json outputs exactly one parseable JSON object on
|
|
20
|
-
* stdout, no banners (CLI Operator Gate rule 1).
|
|
21
|
-
*
|
|
22
|
-
* ERR refs:
|
|
23
|
-
* - ERR-001 (no any): all types explicit; untrusted JSON parsed as unknown
|
|
24
|
-
* - ERR-005 (no as bypass): golden trace cases validated with type guards
|
|
25
|
-
* - ERR-009 (fail loud): missing --code/--code-file fails with reason
|
|
26
|
-
* - ERR-002 (graceful degradation with reason): all failure paths include
|
|
27
|
-
* reason + nextAction
|
|
28
|
-
* - ERR-014 (bounded preview): safeStringifyPreview on unknown payloads
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
import * as path from 'node:path';
|
|
32
|
-
import * as fs from 'node:fs';
|
|
33
|
-
import type { Command } from 'commander';
|
|
34
|
-
import { isPathInside } from '../utils/path-security.js';
|
|
35
|
-
import {
|
|
36
|
-
RULECODE_SPEC_TEXT,
|
|
37
|
-
checkForbiddenPatterns,
|
|
38
|
-
checkReturnStatementsMissingFields,
|
|
39
|
-
checkMatchedFalseDecisions,
|
|
40
|
-
evaluateRefinerRuleHostGate,
|
|
41
|
-
buildGoldenTraceFromArtificer,
|
|
42
|
-
createProductionGateDeps,
|
|
43
|
-
} from '@principles/core/runtime-v2';
|
|
44
|
-
import type { GoldenTraceCaseInput } from '@principles/core/runtime-v2';
|
|
45
|
-
import { emitResult } from '../services/cli-output.js';
|
|
46
|
-
|
|
47
|
-
// ── Output types ─────────────────────────────────────────────────────────────
|
|
48
|
-
|
|
49
|
-
export interface RulecodeSpecOutput {
|
|
50
|
-
status: 'ok';
|
|
51
|
-
spec: string;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export interface RulecodeValidateOutput {
|
|
55
|
-
status: 'ok' | 'failed';
|
|
56
|
-
valid: boolean;
|
|
57
|
-
violationCount: number;
|
|
58
|
-
violations: string[];
|
|
59
|
-
reason?: string;
|
|
60
|
-
nextAction?: string;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export interface RulecodeReplayOutput {
|
|
64
|
-
status: 'ok' | 'failed';
|
|
65
|
-
decision: string;
|
|
66
|
-
reasons: string[];
|
|
67
|
-
failedCases: { caseId: string; errorType: string; message: string }[];
|
|
68
|
-
forbiddenPatternViolations: string[];
|
|
69
|
-
reason?: string;
|
|
70
|
-
nextAction?: string;
|
|
71
|
-
/**
|
|
72
|
-
* PRI-634-F R2 (review P2): structured failure attribution
|
|
73
|
-
* ({layer, reasonCode, evidence, nextAction}) — machine-readable on
|
|
74
|
-
* `--json`, printed on the text path. Absent when replay passed.
|
|
75
|
-
*/
|
|
76
|
-
failure?: { layer: string; reasonCode: string; evidence: string; nextAction: string };
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Resolve code from --code (inline) or --code-file (path). Fails loud if
|
|
83
|
-
* neither is provided or the file cannot be read.
|
|
84
|
-
*/
|
|
85
|
-
function resolveCode(opts: { code?: string; codeFile?: string }): { code?: string; error?: { reason: string; nextAction: string } } {
|
|
86
|
-
if (opts.code && opts.code.trim().length > 0) {
|
|
87
|
-
return { code: opts.code };
|
|
88
|
-
}
|
|
89
|
-
if (opts.codeFile) {
|
|
90
|
-
try {
|
|
91
|
-
const resolved = path.resolve(opts.codeFile);
|
|
92
|
-
const content = fs.readFileSync(resolved, 'utf8');
|
|
93
|
-
if (content.trim().length === 0) {
|
|
94
|
-
return { error: { reason: `code file is empty: ${resolved}`, nextAction: 'provide a non-empty rule implementation file' } };
|
|
95
|
-
}
|
|
96
|
-
return { code: content };
|
|
97
|
-
} catch (err) {
|
|
98
|
-
const reason = err instanceof Error ? err.message : String(err);
|
|
99
|
-
return { error: { reason: `cannot read --code-file: ${reason}`, nextAction: 'verify the file path exists and is readable' } };
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return { error: { reason: 'no code provided: pass --code <string> or --code-file <path>', nextAction: 'specify one of --code or --code-file' } };
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Type guard: validate that an unknown value is a GoldenTraceCaseInput.
|
|
107
|
-
* Treats parsed JSON as untrusted (Runtime Contract Rule 1/2/4).
|
|
108
|
-
*/
|
|
109
|
-
function isGoldenTraceCaseInput(value: unknown): value is GoldenTraceCaseInput {
|
|
110
|
-
if (typeof value !== 'object' || value === null) return false;
|
|
111
|
-
const v = value as Record<string, unknown>;
|
|
112
|
-
if (typeof v.caseId !== 'string' || v.caseId.length === 0) return false;
|
|
113
|
-
if (v.kind !== 'positive' && v.kind !== 'negative') return false;
|
|
114
|
-
if (typeof v.toolName !== 'string' || v.toolName.length === 0) return false;
|
|
115
|
-
if (typeof v.params !== 'object' || v.params === null) return false;
|
|
116
|
-
if (typeof v.expectedDecision !== 'string') return false;
|
|
117
|
-
return true;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Load and validate golden trace cases from a JSON file.
|
|
122
|
-
* Returns either the validated cases or a structured error.
|
|
123
|
-
* Exported for boundary regression tests (internal test surface).
|
|
124
|
-
*/
|
|
125
|
-
export function loadGoldenTraceCases(
|
|
126
|
-
filePath: string,
|
|
127
|
-
workspaceDir?: string,
|
|
128
|
-
): { cases?: GoldenTraceCaseInput[]; error?: { reason: string; nextAction: string } } {
|
|
129
|
-
let raw: string;
|
|
130
|
-
try {
|
|
131
|
-
if (!filePath || filePath.trim().length === 0) {
|
|
132
|
-
throw new Error('golden trace path is empty');
|
|
133
|
-
}
|
|
134
|
-
const resolved = path.resolve(filePath);
|
|
135
|
-
// CWE-22 boundary: canonical containment against the workspace root
|
|
136
|
-
// (rejects sibling-prefix and traversal escapes; relative workspaces
|
|
137
|
-
// canonicalize consistently). Filesystem-root targets are rejected by
|
|
138
|
-
// containment when a workspace root is supplied.
|
|
139
|
-
const normalized = path.normalize(resolved);
|
|
140
|
-
if (normalized.split(/[\\/]/).includes('..')) {
|
|
141
|
-
throw new Error('golden trace path contains parent traversal');
|
|
142
|
-
}
|
|
143
|
-
if (workspaceDir) {
|
|
144
|
-
if (!isPathInside(workspaceDir, resolved)) {
|
|
145
|
-
throw new Error('golden trace path must be inside the workspace directory');
|
|
146
|
-
}
|
|
147
|
-
} else if (normalized === path.parse(normalized).root) {
|
|
148
|
-
throw new Error('golden trace path resolves to filesystem root');
|
|
149
|
-
}
|
|
150
|
-
raw = fs.readFileSync(resolved, 'utf8');
|
|
151
|
-
} catch (err) {
|
|
152
|
-
const reason = err instanceof Error ? err.message : String(err);
|
|
153
|
-
return { error: { reason: `cannot read --golden-trace file: ${reason}`, nextAction: 'verify the file path exists and is readable' } };
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
let parsed: unknown;
|
|
157
|
-
try {
|
|
158
|
-
parsed = JSON.parse(raw);
|
|
159
|
-
} catch (err) {
|
|
160
|
-
const reason = err instanceof Error ? err.message : String(err);
|
|
161
|
-
return { error: { reason: `golden trace file is not valid JSON: ${reason}`, nextAction: 'fix the JSON syntax in the golden trace file' } };
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (!Array.isArray(parsed)) {
|
|
165
|
-
return { error: { reason: 'golden trace file must contain a JSON array of cases', nextAction: 'provide an array of GoldenTraceCaseInput objects' } };
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Validate each element (Runtime Contract Rule 4 — validate array element types)
|
|
169
|
-
const cases: GoldenTraceCaseInput[] = [];
|
|
170
|
-
for (let i = 0; i < parsed.length; i++) {
|
|
171
|
-
const element = parsed[i];
|
|
172
|
-
if (!isGoldenTraceCaseInput(element)) {
|
|
173
|
-
return { error: { reason: `golden trace case at index ${i} is malformed (requires caseId, kind, toolName, params, expectedDecision)`, nextAction: `fix case at index ${i} in the golden trace file` } };
|
|
174
|
-
}
|
|
175
|
-
cases.push(element);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
if (cases.length < 2) {
|
|
179
|
-
return { error: { reason: `golden trace must contain at least 2 cases (1 positive + 1 negative), got ${cases.length}`, nextAction: 'add more cases to the golden trace file' } };
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return { cases };
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// ── Handlers ─────────────────────────────────────────────────────────────────
|
|
186
|
-
|
|
187
|
-
interface SpecOptions {
|
|
188
|
-
workspace?: string;
|
|
189
|
-
json?: boolean;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export async function handleRulecodeSpec(opts: SpecOptions): Promise<void> {
|
|
193
|
-
const output: RulecodeSpecOutput = {
|
|
194
|
-
status: 'ok',
|
|
195
|
-
spec: RULECODE_SPEC_TEXT,
|
|
196
|
-
};
|
|
197
|
-
emitResult(output, {
|
|
198
|
-
json: opts.json ?? false,
|
|
199
|
-
formatText: (o) => o.spec,
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
interface ValidateOptions {
|
|
204
|
-
code?: string;
|
|
205
|
-
codeFile?: string;
|
|
206
|
-
workspace?: string;
|
|
207
|
-
json?: boolean;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
export async function handleRulecodeValidate(opts: ValidateOptions): Promise<void> {
|
|
211
|
-
const json = opts.json ?? false;
|
|
212
|
-
const codeResult = resolveCode(opts);
|
|
213
|
-
if (codeResult.error || codeResult.code === undefined) {
|
|
214
|
-
const { error } = codeResult;
|
|
215
|
-
const output: RulecodeValidateOutput = {
|
|
216
|
-
status: 'failed',
|
|
217
|
-
valid: false,
|
|
218
|
-
violationCount: 0,
|
|
219
|
-
violations: [],
|
|
220
|
-
reason: error?.reason ?? 'unknown error',
|
|
221
|
-
nextAction: error?.nextAction ?? 'check input and retry',
|
|
222
|
-
};
|
|
223
|
-
emitResult(output, {
|
|
224
|
-
json,
|
|
225
|
-
formatText: (o) => `Error: ${o.reason}\n→ ${o.nextAction}`,
|
|
226
|
-
});
|
|
227
|
-
process.exitCode = 1;
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const { code } = codeResult;
|
|
232
|
-
const forbidden = checkForbiddenPatterns(code);
|
|
233
|
-
const missingFields = checkReturnStatementsMissingFields(code);
|
|
234
|
-
const matchedFalseViolations = checkMatchedFalseDecisions(code);
|
|
235
|
-
|
|
236
|
-
const allViolations = [
|
|
237
|
-
...forbidden.map((label) => `forbidden pattern: ${label}`),
|
|
238
|
-
...missingFields,
|
|
239
|
-
...matchedFalseViolations,
|
|
240
|
-
];
|
|
241
|
-
|
|
242
|
-
const output: RulecodeValidateOutput = {
|
|
243
|
-
status: allViolations.length === 0 ? 'ok' : 'failed',
|
|
244
|
-
valid: allViolations.length === 0,
|
|
245
|
-
violationCount: allViolations.length,
|
|
246
|
-
violations: allViolations,
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
if (allViolations.length > 0) {
|
|
250
|
-
output.reason = `${allViolations.length} static violation(s) found`;
|
|
251
|
-
output.nextAction = 'fix the listed violations, then run `pd rulecode replay` to verify sandbox behavior';
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
emitResult(output, {
|
|
255
|
-
json,
|
|
256
|
-
formatText: (o) => {
|
|
257
|
-
if (o.valid) return 'VALID: no static violations detected.';
|
|
258
|
-
const lines = [`INVALID: ${o.violationCount} violation(s):`];
|
|
259
|
-
for (const v of o.violations) lines.push(` - ${v}`);
|
|
260
|
-
return lines.join('\n');
|
|
261
|
-
},
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
if (output.status === 'failed') {
|
|
265
|
-
process.exitCode = 1;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
interface ReplayOptions {
|
|
270
|
-
code?: string;
|
|
271
|
-
codeFile?: string;
|
|
272
|
-
goldenTrace?: string;
|
|
273
|
-
workspace?: string;
|
|
274
|
-
json?: boolean;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
export async function handleRulecodeReplay(opts: ReplayOptions): Promise<void> {
|
|
278
|
-
const json = opts.json ?? false;
|
|
279
|
-
const codeResult = resolveCode(opts);
|
|
280
|
-
if (codeResult.error || codeResult.code === undefined) {
|
|
281
|
-
const { error } = codeResult;
|
|
282
|
-
const output: RulecodeReplayOutput = {
|
|
283
|
-
status: 'failed',
|
|
284
|
-
decision: 'rejected_input',
|
|
285
|
-
reasons: [],
|
|
286
|
-
failedCases: [],
|
|
287
|
-
forbiddenPatternViolations: [],
|
|
288
|
-
reason: error?.reason ?? 'unknown error',
|
|
289
|
-
nextAction: error?.nextAction ?? 'check input and retry',
|
|
290
|
-
};
|
|
291
|
-
emitResult(output, {
|
|
292
|
-
json,
|
|
293
|
-
formatText: (o) => `Error: ${o.reason}\n→ ${o.nextAction}`,
|
|
294
|
-
});
|
|
295
|
-
process.exitCode = 1;
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
if (!opts.goldenTrace) {
|
|
300
|
-
// Should not happen — --golden-trace is requiredOption. Defense-in-depth.
|
|
301
|
-
const output: RulecodeReplayOutput = {
|
|
302
|
-
status: 'failed',
|
|
303
|
-
decision: 'rejected_input',
|
|
304
|
-
reasons: [],
|
|
305
|
-
failedCases: [],
|
|
306
|
-
forbiddenPatternViolations: [],
|
|
307
|
-
reason: '--golden-trace is required',
|
|
308
|
-
nextAction: 'pass --golden-trace <path> with a JSON file of golden trace cases',
|
|
309
|
-
};
|
|
310
|
-
emitResult(output, {
|
|
311
|
-
json,
|
|
312
|
-
formatText: (o) => `Error: ${o.reason}\n→ ${o.nextAction}`,
|
|
313
|
-
});
|
|
314
|
-
process.exitCode = 1;
|
|
315
|
-
return;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
const traceResult = loadGoldenTraceCases(opts.goldenTrace, opts.workspace);
|
|
319
|
-
if (traceResult.error || traceResult.cases === undefined) {
|
|
320
|
-
const { error } = traceResult;
|
|
321
|
-
const output: RulecodeReplayOutput = {
|
|
322
|
-
status: 'failed',
|
|
323
|
-
decision: 'rejected_input',
|
|
324
|
-
reasons: [],
|
|
325
|
-
failedCases: [],
|
|
326
|
-
forbiddenPatternViolations: [],
|
|
327
|
-
reason: error?.reason ?? 'unknown error',
|
|
328
|
-
nextAction: error?.nextAction ?? 'check golden trace file and retry',
|
|
329
|
-
};
|
|
330
|
-
emitResult(output, {
|
|
331
|
-
json,
|
|
332
|
-
formatText: (o) => `Error: ${o.reason}\n→ ${o.nextAction}`,
|
|
333
|
-
});
|
|
334
|
-
process.exitCode = 1;
|
|
335
|
-
return;
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// Build the GoldenTrace from the artificer-input shape.
|
|
339
|
-
const buildResult = buildGoldenTraceFromArtificer({
|
|
340
|
-
cases: traceResult.cases,
|
|
341
|
-
sourceArtifactId: undefined,
|
|
342
|
-
});
|
|
343
|
-
if (!buildResult.ok) {
|
|
344
|
-
const output: RulecodeReplayOutput = {
|
|
345
|
-
status: 'failed',
|
|
346
|
-
decision: 'rejected_input',
|
|
347
|
-
reasons: [],
|
|
348
|
-
failedCases: [],
|
|
349
|
-
forbiddenPatternViolations: [],
|
|
350
|
-
reason: `golden trace build failed: ${buildResult.reason}`,
|
|
351
|
-
nextAction: 'ensure the golden trace has at least 1 positive + 1 negative case',
|
|
352
|
-
};
|
|
353
|
-
emitResult(output, {
|
|
354
|
-
json,
|
|
355
|
-
formatText: (o) => `Error: ${o.reason}\n→ ${o.nextAction}`,
|
|
356
|
-
});
|
|
357
|
-
process.exitCode = 1;
|
|
358
|
-
return;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
// Run the sandbox replay via production gate deps.
|
|
362
|
-
const gateDeps = createProductionGateDeps();
|
|
363
|
-
const gateResult = evaluateRefinerRuleHostGate(
|
|
364
|
-
{ code: codeResult.code, goldenTrace: buildResult.trace },
|
|
365
|
-
gateDeps,
|
|
366
|
-
);
|
|
367
|
-
|
|
368
|
-
const output: RulecodeReplayOutput = {
|
|
369
|
-
status: gateResult.decision === 'accepted_shadow' ? 'ok' : 'failed',
|
|
370
|
-
decision: gateResult.decision,
|
|
371
|
-
reasons: gateResult.reasons,
|
|
372
|
-
failedCases: gateResult.sandboxResult.failedCases.map((c) => ({
|
|
373
|
-
caseId: c.caseId,
|
|
374
|
-
errorType: c.errorType,
|
|
375
|
-
message: c.message,
|
|
376
|
-
})),
|
|
377
|
-
forbiddenPatternViolations: gateResult.sandboxResult.forbiddenPatternViolations,
|
|
378
|
-
...(gateResult.failure ? { failure: gateResult.failure } : {}),
|
|
379
|
-
};
|
|
380
|
-
|
|
381
|
-
if (output.status === 'failed') {
|
|
382
|
-
output.reason = `sandbox replay rejected: ${gateResult.decision}`;
|
|
383
|
-
output.nextAction = gateResult.failure?.nextAction ?? 'fix the code or golden trace cases based on the failed cases above';
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
emitResult(output, {
|
|
387
|
-
json,
|
|
388
|
-
formatText: (o) => {
|
|
389
|
-
if (o.status === 'ok') return 'PASSED: all golden trace cases replayed successfully.';
|
|
390
|
-
const lines = [`FAILED: ${o.decision}`];
|
|
391
|
-
if (o.failure) lines.push(` - failureLayer: ${o.failure.layer} | reasonCode: ${o.failure.reasonCode}`);
|
|
392
|
-
for (const r of o.reasons) lines.push(` - ${r}`);
|
|
393
|
-
for (const c of o.failedCases) lines.push(` - caseId: ${c.caseId} | ${c.errorType}: ${c.message}`);
|
|
394
|
-
for (const p of o.forbiddenPatternViolations) lines.push(` - forbidden: ${p}`);
|
|
395
|
-
return lines.join('\n');
|
|
396
|
-
},
|
|
397
|
-
});
|
|
398
|
-
|
|
399
|
-
if (output.status === 'failed') {
|
|
400
|
-
process.exitCode = 1;
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
// ── Registration ─────────────────────────────────────────────────────────────
|
|
405
|
-
|
|
406
|
-
/**
|
|
407
|
-
* Register the `rulecode` parent command with 3 subcommands (spec, validate,
|
|
408
|
-
* replay). Returns the parent command for chaining.
|
|
409
|
-
*
|
|
410
|
-
* This is the single source of truth for flag registration — both index.ts
|
|
411
|
-
* and parser tests call this function (CLI gate rule 7).
|
|
412
|
-
*/
|
|
413
|
-
export function registerRulecodeCommand(parentCmd: Command): Command {
|
|
414
|
-
const rulecodeCmd = parentCmd
|
|
415
|
-
.command('rulecode', { hidden: true })
|
|
416
|
-
.description('RuleCode dialect spec, static validation, and sandbox replay (read-only)');
|
|
417
|
-
|
|
418
|
-
// spec — no code input needed
|
|
419
|
-
rulecodeCmd
|
|
420
|
-
.command('spec')
|
|
421
|
-
.description('Print the RuleCode dialect spec text (canonical form, forbidden patterns, return shape)')
|
|
422
|
-
.option('-w, --workspace <path>', 'Workspace directory')
|
|
423
|
-
.option('--json', 'Output raw JSON')
|
|
424
|
-
.action(async (opts) => {
|
|
425
|
-
await handleRulecodeSpec({ workspace: opts.workspace, json: opts.json });
|
|
426
|
-
});
|
|
427
|
-
|
|
428
|
-
// validate — static validation only
|
|
429
|
-
rulecodeCmd
|
|
430
|
-
.command('validate')
|
|
431
|
-
.description('Run static validation on rule implementation code (forbidden patterns + return shape)')
|
|
432
|
-
.option('--code <string>', 'Rule implementation source code (inline)')
|
|
433
|
-
.option('--code-file <path>', 'Read rule implementation code from file')
|
|
434
|
-
.option('-w, --workspace <path>', 'Workspace directory')
|
|
435
|
-
.option('--json', 'Output raw JSON')
|
|
436
|
-
.action(async (opts) => {
|
|
437
|
-
await handleRulecodeValidate({
|
|
438
|
-
code: opts.code,
|
|
439
|
-
codeFile: opts.codeFile,
|
|
440
|
-
workspace: opts.workspace,
|
|
441
|
-
json: opts.json,
|
|
442
|
-
});
|
|
443
|
-
});
|
|
444
|
-
|
|
445
|
-
// replay — sandbox replay against a golden trace
|
|
446
|
-
rulecodeCmd
|
|
447
|
-
.command('replay')
|
|
448
|
-
.description('Run sandbox replay of rule code against a golden trace JSON file')
|
|
449
|
-
.option('--code <string>', 'Rule implementation source code (inline)')
|
|
450
|
-
.option('--code-file <path>', 'Read rule implementation code from file')
|
|
451
|
-
.requiredOption('--golden-trace <path>', 'JSON file containing golden trace cases array')
|
|
452
|
-
.option('-w, --workspace <path>', 'Workspace directory')
|
|
453
|
-
.option('--json', 'Output raw JSON')
|
|
454
|
-
.action(async (opts) => {
|
|
455
|
-
await handleRulecodeReplay({
|
|
456
|
-
code: opts.code,
|
|
457
|
-
codeFile: opts.codeFile,
|
|
458
|
-
goldenTrace: opts.goldenTrace,
|
|
459
|
-
workspace: opts.workspace,
|
|
460
|
-
json: opts.json,
|
|
461
|
-
});
|
|
462
|
-
});
|
|
463
|
-
|
|
464
|
-
return rulecodeCmd;
|
|
465
|
-
}
|
package/src/commands/run.ts
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pd run list/show commands — Runtime v2 run inspection.
|
|
3
|
-
*
|
|
4
|
-
* Usage:
|
|
5
|
-
* pd run list <taskId>
|
|
6
|
-
* pd run show <runId>
|
|
7
|
-
*/
|
|
8
|
-
import { RuntimeStateManager } from '@principles/core';
|
|
9
|
-
import { resolveWorkspaceDir } from '../resolve-workspace.js';
|
|
10
|
-
|
|
11
|
-
interface RunListOptions {
|
|
12
|
-
taskId: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export async function handleRunList(opts: RunListOptions): Promise<void> {
|
|
16
|
-
const workspaceDir = resolveWorkspaceDir();
|
|
17
|
-
const stateManager = new RuntimeStateManager({ workspaceDir });
|
|
18
|
-
await stateManager.initialize();
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
-
const runs = await stateManager.getRunsByTask(opts.taskId);
|
|
22
|
-
|
|
23
|
-
if (runs.length === 0) {
|
|
24
|
-
console.log(`No runs found for task: ${opts.taskId}`);
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
console.log(`\nRuns for ${opts.taskId} (${runs.length}):\n`);
|
|
29
|
-
console.log(' %-22s %-12s %-20s %-6s %s', 'RUN_ID', 'STATUS', 'STARTED', 'ATT', 'ENDED');
|
|
30
|
-
console.log(' ' + '-'.repeat(80));
|
|
31
|
-
|
|
32
|
-
for (const run of runs) {
|
|
33
|
-
console.log(
|
|
34
|
-
' %-22s %-12s %-20s %-6s %s',
|
|
35
|
-
run.runId.substring(0, 22),
|
|
36
|
-
run.executionStatus,
|
|
37
|
-
new Date(run.startedAt).toLocaleString(),
|
|
38
|
-
run.attemptNumber,
|
|
39
|
-
run.endedAt ? new Date(run.endedAt).toLocaleString() : '-',
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
console.log('');
|
|
43
|
-
} finally {
|
|
44
|
-
await stateManager.close();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
interface RunShowOptions {
|
|
49
|
-
id: string;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export async function handleRunShow(opts: RunShowOptions): Promise<void> {
|
|
53
|
-
const workspaceDir = resolveWorkspaceDir();
|
|
54
|
-
const stateManager = new RuntimeStateManager({ workspaceDir });
|
|
55
|
-
await stateManager.initialize();
|
|
56
|
-
|
|
57
|
-
try {
|
|
58
|
-
const run = await stateManager.getRun(opts.id);
|
|
59
|
-
|
|
60
|
-
if (!run) {
|
|
61
|
-
console.error(`Run not found: ${opts.id}`);
|
|
62
|
-
process.exit(1);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
console.log(`\nRun: ${run.runId}\n`);
|
|
66
|
-
console.log(` Task ID: ${run.taskId}`);
|
|
67
|
-
console.log(` Runtime Kind: ${run.runtimeKind}`);
|
|
68
|
-
console.log(` Status: ${run.executionStatus}`);
|
|
69
|
-
console.log(` Attempt: ${run.attemptNumber}`);
|
|
70
|
-
console.log(` Started: ${new Date(run.startedAt).toLocaleString()}`);
|
|
71
|
-
if (run.endedAt) {
|
|
72
|
-
console.log(` Ended: ${new Date(run.endedAt).toLocaleString()}`);
|
|
73
|
-
const duration = new Date(run.endedAt).getTime() - new Date(run.startedAt).getTime();
|
|
74
|
-
console.log(` Duration: ${(duration / 1000).toFixed(1)}s`);
|
|
75
|
-
}
|
|
76
|
-
if (run.reason) {
|
|
77
|
-
console.log(` Reason: ${run.reason}`);
|
|
78
|
-
}
|
|
79
|
-
if (run.errorCategory) {
|
|
80
|
-
console.log(` Error Category:${run.errorCategory}`);
|
|
81
|
-
}
|
|
82
|
-
if (run.outputRef) {
|
|
83
|
-
console.log(` Output Ref: ${run.outputRef}`);
|
|
84
|
-
}
|
|
85
|
-
console.log('');
|
|
86
|
-
} finally {
|
|
87
|
-
await stateManager.close();
|
|
88
|
-
}
|
|
89
|
-
}
|