@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.
- 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
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PRI-642 Scope A — real-Commander integration for `pd pain record --session`.
|
|
3
|
-
*
|
|
4
|
-
* Spawns the BUILT pd CLI (dist/index.js) against a real temp workspace with a
|
|
5
|
-
* real trajectory.db, exercising the actual commander registration and the
|
|
6
|
-
* real typed acquisition path — not the in-process handler with mocks
|
|
7
|
-
* (cli-7-test-wiring; SPEC §13 "Real Commander parser/registration tests for
|
|
8
|
-
* --session and --json").
|
|
9
|
-
*/
|
|
10
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
11
|
-
import { promisify } from 'node:util';
|
|
12
|
-
import Database from 'better-sqlite3';
|
|
13
|
-
import * as fs from 'node:fs';
|
|
14
|
-
import * as path from 'node:path';
|
|
15
|
-
import * as os from 'node:os';
|
|
16
|
-
import { acquireTrajectoryEvidenceFromDb } from '../../src/commands/build-trajectory-evidence.js';
|
|
17
|
-
|
|
18
|
-
let tmpDir: string;
|
|
19
|
-
|
|
20
|
-
function createWorkspace(): void {
|
|
21
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-pain-record-parser-'));
|
|
22
|
-
const stateDir = path.join(tmpDir, '.state');
|
|
23
|
-
fs.mkdirSync(stateDir, { recursive: true });
|
|
24
|
-
|
|
25
|
-
const db = new Database(path.join(stateDir, 'trajectory.db'));
|
|
26
|
-
db.exec("CREATE TABLE IF NOT EXISTS sessions (session_id TEXT PRIMARY KEY, started_at TEXT, updated_at TEXT)");
|
|
27
|
-
db.exec("CREATE TABLE IF NOT EXISTS assistant_turns (id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, sanitized_text TEXT, stop_reason TEXT, created_at TEXT NOT NULL)");
|
|
28
|
-
// PRI-783 lesson recorded on the fixture: user_turns MUST carry
|
|
29
|
-
// correction_cue — collectEvidenceFromDb SELECTs it, and a missing column
|
|
30
|
-
// silently degraded the user-turns read into evidence_read_failed, so this
|
|
31
|
-
// file's 'accepts --session' case never actually exercised a real evidence
|
|
32
|
-
// read (it vacuously asserted on a refusal).
|
|
33
|
-
db.exec("CREATE TABLE IF NOT EXISTS user_turns (id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, raw_excerpt TEXT, correction_detected INTEGER NOT NULL DEFAULT 0, correction_cue TEXT, created_at TEXT NOT NULL)");
|
|
34
|
-
db.exec("CREATE TABLE IF NOT EXISTS tool_calls (id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, tool_name TEXT NOT NULL, outcome TEXT NOT NULL, error_type TEXT, exit_code INTEGER, params_json TEXT NOT NULL DEFAULT '{}', result_preview TEXT, created_at TEXT NOT NULL)");
|
|
35
|
-
db.prepare('INSERT INTO sessions (session_id, started_at, updated_at) VALUES (?, ?, ?)')
|
|
36
|
-
.run('real-session-1', '2026-01-01T09:00:00Z', '2026-01-01T09:00:00Z');
|
|
37
|
-
db.prepare('INSERT INTO user_turns (session_id, raw_excerpt, correction_detected, created_at) VALUES (?, ?, ?, ?)')
|
|
38
|
-
.run('real-session-1', 'Please fix the output format', 1, '2026-01-01T09:59:00Z');
|
|
39
|
-
db.close();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
interface CliRunResult {
|
|
43
|
-
status: number | null;
|
|
44
|
-
stdout: string;
|
|
45
|
-
stderr: string;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/** Resolves and boundary-validates the built pd CLI entry before spawning it. */
|
|
49
|
-
async function resolveBuiltCliEntry(): Promise<string> {
|
|
50
|
-
const packageRoot = path.resolve(process.cwd());
|
|
51
|
-
const entry = path.resolve(packageRoot, 'dist', 'index.js');
|
|
52
|
-
if (!entry.startsWith(`${packageRoot}${path.sep}`) || !fs.statSync(entry).isFile()) {
|
|
53
|
-
throw new Error(`built pd CLI entry not found or outside the package: ${entry}`);
|
|
54
|
-
}
|
|
55
|
-
return entry;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async function runBuiltCli(literalArgv: readonly string[]): Promise<CliRunResult> {
|
|
59
|
-
const { execFile } = await import('node:child_process');
|
|
60
|
-
const execFileAsync = promisify(execFile);
|
|
61
|
-
const entry = await resolveBuiltCliEntry();
|
|
62
|
-
try {
|
|
63
|
-
const { stdout } = await execFileAsync(process.execPath, [entry, ...literalArgv], {
|
|
64
|
-
cwd: tmpDir,
|
|
65
|
-
timeout: 30000,
|
|
66
|
-
encoding: 'utf8',
|
|
67
|
-
env: { ...process.env, PD_WORKSPACE_DIR: tmpDir },
|
|
68
|
-
});
|
|
69
|
-
return { status: 0, stdout, stderr: '' };
|
|
70
|
-
} catch (err) {
|
|
71
|
-
const e = err as { code?: number; stdout?: string; stderr?: string };
|
|
72
|
-
return { status: e.code ?? -1, stdout: e.stdout ?? '', stderr: e.stderr ?? '' };
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
describe('pd pain record --session (real Commander + real trajectory.db)', () => {
|
|
77
|
-
beforeEach(() => {
|
|
78
|
-
createWorkspace();
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
afterEach(() => {
|
|
82
|
-
try {
|
|
83
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
84
|
-
} catch {
|
|
85
|
-
// ignore cleanup errors
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it('--help registers and documents --session', async () => {
|
|
90
|
-
const result = await runBuiltCli(['pain', 'record', '--help']);
|
|
91
|
-
expect(result.status).toBe(0);
|
|
92
|
-
expect(result.stdout).toContain('--session');
|
|
93
|
-
}, 15_000);
|
|
94
|
-
|
|
95
|
-
it('PRI-743: --help registers --host with the openclaw|codex contract', async () => {
|
|
96
|
-
const result = await runBuiltCli(['pain', 'record', '--help']);
|
|
97
|
-
expect(result.status).toBe(0);
|
|
98
|
-
expect(result.stdout).toContain('--host <kind>');
|
|
99
|
-
// Commander wraps help text; normalize whitespace before asserting content.
|
|
100
|
-
const normalized = result.stdout.replace(/\s+/g, ' ');
|
|
101
|
-
expect(normalized).toContain('openclaw | codex');
|
|
102
|
-
expect(normalized).toContain('codex requires the real Codex lineage');
|
|
103
|
-
}, 15_000);
|
|
104
|
-
|
|
105
|
-
it('PRI-743: --help registers the Codex lineage flags used by --host codex', async () => {
|
|
106
|
-
const result = await runBuiltCli(['pain', 'record', '--help']);
|
|
107
|
-
expect(result.status).toBe(0);
|
|
108
|
-
expect(result.stdout).toContain('--rollout-id <id>');
|
|
109
|
-
expect(result.stdout).toContain('--host-turn-id <id>');
|
|
110
|
-
expect(result.stdout).toContain('--logical-key <key>');
|
|
111
|
-
}, 15_000);
|
|
112
|
-
|
|
113
|
-
it('PRI-743: --host codex without lineage exits non-zero with codex_lineage_required', async () => {
|
|
114
|
-
const result = await runBuiltCli([
|
|
115
|
-
'pain', 'record',
|
|
116
|
-
'--reason', 'parser test pain',
|
|
117
|
-
'--host', 'codex',
|
|
118
|
-
'--workspace', tmpDir,
|
|
119
|
-
'--json',
|
|
120
|
-
]);
|
|
121
|
-
|
|
122
|
-
expect(result.status).not.toBe(0);
|
|
123
|
-
const parsed = JSON.parse(result.stdout.trim()) as Record<string, unknown>;
|
|
124
|
-
expect(parsed.status).toBe('failed');
|
|
125
|
-
expect(parsed.reason).toBe('codex_lineage_required');
|
|
126
|
-
expect(typeof parsed.nextAction).toBe('string');
|
|
127
|
-
}, 15_000);
|
|
128
|
-
|
|
129
|
-
it('PRI-743: an invalid --host value exits non-zero with a single structured JSON object', async () => {
|
|
130
|
-
const result = await runBuiltCli([
|
|
131
|
-
'pain', 'record',
|
|
132
|
-
'--reason', 'parser test pain',
|
|
133
|
-
'--host', 'claude',
|
|
134
|
-
'--workspace', tmpDir,
|
|
135
|
-
'--json',
|
|
136
|
-
]);
|
|
137
|
-
|
|
138
|
-
expect(result.status).not.toBe(0);
|
|
139
|
-
const trimmed = result.stdout.trim();
|
|
140
|
-
const parsed = JSON.parse(trimmed) as Record<string, unknown>;
|
|
141
|
-
expect(parsed.status).toBe('failed');
|
|
142
|
-
expect(parsed.reason).toBe('invalid_host_kind');
|
|
143
|
-
expect(typeof parsed.nextAction).toBe('string');
|
|
144
|
-
}, 15_000);
|
|
145
|
-
|
|
146
|
-
it('fails with a single JSON object and reason session_not_found for a nonexistent session (SPEC 12.1.4)', async () => {
|
|
147
|
-
const result = await runBuiltCli([
|
|
148
|
-
'pain', 'record',
|
|
149
|
-
'--reason', 'parser test pain',
|
|
150
|
-
'--session', 'no-such-session',
|
|
151
|
-
'--workspace', tmpDir,
|
|
152
|
-
'--json',
|
|
153
|
-
]);
|
|
154
|
-
|
|
155
|
-
// Failed validation exits non-zero.
|
|
156
|
-
expect(result.status).not.toBe(0);
|
|
157
|
-
// cli-1: stdout is exactly one JSON object.
|
|
158
|
-
const trimmed = result.stdout.trim();
|
|
159
|
-
expect(trimmed.length).toBeGreaterThan(0);
|
|
160
|
-
const parsed = JSON.parse(trimmed) as Record<string, unknown>;
|
|
161
|
-
expect(parsed.status).toBe('failed');
|
|
162
|
-
expect(parsed.reason).toBe('session_not_found');
|
|
163
|
-
expect(typeof parsed.nextAction).toBe('string');
|
|
164
|
-
}, 15_000);
|
|
165
|
-
|
|
166
|
-
it('accepts --session for a session that exists in the trajectory (real acquisition returns available evidence)', async () => {
|
|
167
|
-
// The spawned-CLI route is used above for the refusal contracts. The
|
|
168
|
-
// acceptance route ends in the diagnostician pipeline (out of this file's
|
|
169
|
-
// scope — the service has its own suite), so the acceptance boundary is
|
|
170
|
-
// asserted against the REAL acquisition function the CLI delegates to,
|
|
171
|
-
// over this file's real trajectory.db fixture (cli-7: real parser wiring
|
|
172
|
-
// is covered by the refusal spawns; real DB semantics here — PRI-783).
|
|
173
|
-
const stateDir = path.join(tmpDir, '.state');
|
|
174
|
-
const acquisition = acquireTrajectoryEvidenceFromDb(stateDir, 'real-session-1', tmpDir);
|
|
175
|
-
|
|
176
|
-
expect(acquisition.status).toBe('available');
|
|
177
|
-
if (acquisition.status !== 'available') return;
|
|
178
|
-
expect(acquisition.entries.length).toBeGreaterThanOrEqual(1);
|
|
179
|
-
expect(acquisition.entries.some(e => e.sourceRef.startsWith('owner_message:'))).toBe(true);
|
|
180
|
-
}, 15_000);
|
|
181
|
-
|
|
182
|
-
// ── PRI-783 review P1: unverified bindings must refuse, never persist ──────
|
|
183
|
-
|
|
184
|
-
it('locks the review P1: --session with a missing trajectory.db refuses and NEVER creates a db containing the fake id', async () => {
|
|
185
|
-
// Remove the fixture db so the id cannot be verified at all (the shared
|
|
186
|
-
// createWorkspace always seeds one). The run must fail loud
|
|
187
|
-
// (trajectory_unavailable) BEFORE any mutation — the observability writer
|
|
188
|
-
// must not create a trajectory.db and upsert the unverified id into
|
|
189
|
-
// sessions (self-proving loop).
|
|
190
|
-
fs.rmSync(path.join(tmpDir, '.state', 'trajectory.db'), { force: true });
|
|
191
|
-
const result = await runBuiltCli([
|
|
192
|
-
'pain', 'record',
|
|
193
|
-
'--reason', 'PRI-783 review P1 lock',
|
|
194
|
-
'--session', 'fake-unverified-id',
|
|
195
|
-
'--workspace', tmpDir,
|
|
196
|
-
'--json',
|
|
197
|
-
]);
|
|
198
|
-
|
|
199
|
-
expect(result.status).not.toBe(0);
|
|
200
|
-
const parsed = JSON.parse(result.stdout.trim()) as Record<string, unknown>;
|
|
201
|
-
expect(parsed.status).toBe('failed');
|
|
202
|
-
expect(parsed.reason).toBe('trajectory_unavailable');
|
|
203
|
-
expect(parsed.nextAction).not.toMatch(/pd pain record --session/);
|
|
204
|
-
// The lock: no trajectory.db was created by this run — the fake id can
|
|
205
|
-
// never appear in a sessions table.
|
|
206
|
-
expect(fs.existsSync(path.join(tmpDir, '.state', 'trajectory.db'))).toBe(false);
|
|
207
|
-
}, 15_000);
|
|
208
|
-
|
|
209
|
-
it('real empty session reports empty_trajectory with a VERIFIED binding (the degrade precondition)', async () => {
|
|
210
|
-
// Gate the degrade path on the real acquisition semantics: a session
|
|
211
|
-
// row that exists with zero evidence rows is the only unavailable shape
|
|
212
|
-
// allowed to degrade to a bound submission.
|
|
213
|
-
const stateDir = path.join(tmpDir, '.state');
|
|
214
|
-
const db = new Database(path.join(stateDir, 'trajectory.db'));
|
|
215
|
-
db.prepare('INSERT INTO sessions (session_id, started_at, updated_at) VALUES (?, ?, ?)')
|
|
216
|
-
.run('real-empty-session', '2026-01-01T08:00:00Z', '2026-01-01T08:00:00Z');
|
|
217
|
-
db.prepare('INSERT INTO user_turns (session_id, raw_excerpt, correction_detected, correction_cue, created_at) VALUES (?, ?, ?, ?, ?)')
|
|
218
|
-
.run('real-empty-session', 'ordinary message, not a correction', 0, null, '2026-01-01T08:01:00Z');
|
|
219
|
-
db.close();
|
|
220
|
-
|
|
221
|
-
const acquisition = acquireTrajectoryEvidenceFromDb(stateDir, 'real-empty-session', tmpDir);
|
|
222
|
-
|
|
223
|
-
expect(acquisition.status).toBe('unavailable');
|
|
224
|
-
if (acquisition.status !== 'unavailable') return;
|
|
225
|
-
expect(acquisition.reasonCode).toBe('empty_trajectory');
|
|
226
|
-
expect(acquisition.binding).toBe('verified');
|
|
227
|
-
}, 15_000);
|
|
228
|
-
});
|