@principles/pd-cli 1.152.11 → 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/dist/commands/candidate.d.ts +3 -3
- package/dist/commands/candidate.d.ts.map +1 -1
- package/dist/commands/candidate.js +9 -21
- package/dist/commands/candidate.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/services/rulehost-pipeline-runner.d.ts.map +1 -1
- package/dist/services/rulehost-pipeline-runner.js +4 -17
- package/dist/services/rulehost-pipeline-runner.js.map +1 -1
- package/package.json +13 -7
- 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 -1260
- 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 -1216
- 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 -565
- 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 -1175
- 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 -9
|
@@ -1,420 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* runtime-init tests — pd runtime init command (unit tests with mocked DB layer).
|
|
3
|
-
*
|
|
4
|
-
* Covers:
|
|
5
|
-
* - INIT-01: --dry-run (default) reports 2 DBs as 'skipped', no real writes
|
|
6
|
-
* - INIT-02: --confirm calls all init functions, output shows 'initialized'
|
|
7
|
-
* - INIT-03: --json outputs single parseable JSON object (cli-1)
|
|
8
|
-
* - INIT-04: --dry-run + --confirm mutually exclusive (cli-4)
|
|
9
|
-
* - INIT-05: --confirm failure sets exitCode=1 with reason + nextAction (cli-6)
|
|
10
|
-
* - INIT-06: missing --workspace falls back to resolveWorkspaceDir()
|
|
11
|
-
*
|
|
12
|
-
* ERR refs:
|
|
13
|
-
* - ERR-001/ERR-005: no `as` casts in test code; uses typeof guards
|
|
14
|
-
* - ERR-009: flag conflict fails loud (cli-4)
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
18
|
-
import * as path from 'node:path';
|
|
19
|
-
import * as os from 'node:os';
|
|
20
|
-
import * as fs from 'node:fs';
|
|
21
|
-
|
|
22
|
-
// ── Hoisted mocks ───────────────────────────────────────────────────────────
|
|
23
|
-
|
|
24
|
-
const mockState = vi.hoisted(() => {
|
|
25
|
-
return {
|
|
26
|
-
initTrajectorySchema: vi.fn(),
|
|
27
|
-
sqliteConnectionCtor: vi.fn(),
|
|
28
|
-
sqliteConnectionGetDb: vi.fn(),
|
|
29
|
-
sqliteConnectionGetWarnings: vi.fn(),
|
|
30
|
-
sqliteConnectionClose: vi.fn(),
|
|
31
|
-
schemaConformanceCtor: vi.fn(),
|
|
32
|
-
schemaConformanceCheck: vi.fn(),
|
|
33
|
-
resolveWorkspaceDir: vi.fn(),
|
|
34
|
-
};
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
vi.mock('principles-disciple', () => ({
|
|
38
|
-
initTrajectorySchema: mockState.initTrajectorySchema,
|
|
39
|
-
}));
|
|
40
|
-
|
|
41
|
-
vi.mock('@principles/core/runtime-v2', async () => {
|
|
42
|
-
const actual = await vi.importActual<typeof import('@principles/core/runtime-v2')>('@principles/core/runtime-v2');
|
|
43
|
-
return {
|
|
44
|
-
...actual,
|
|
45
|
-
SqliteConnection: mockState.sqliteConnectionCtor,
|
|
46
|
-
SchemaConformanceReadModel: mockState.schemaConformanceCtor,
|
|
47
|
-
};
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
vi.mock('../../src/resolve-workspace.js', () => ({
|
|
51
|
-
resolveWorkspaceDir: mockState.resolveWorkspaceDir,
|
|
52
|
-
}));
|
|
53
|
-
|
|
54
|
-
// Import after mocks are set up
|
|
55
|
-
import { buildRuntimeInitOutput, handleRuntimeInit } from '../../src/commands/runtime-init.js';
|
|
56
|
-
|
|
57
|
-
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
58
|
-
|
|
59
|
-
function mkTmpDir(): string {
|
|
60
|
-
return fs.mkdtempSync(path.join(os.tmpdir(), 'pd-runtime-init-test-'));
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function rmTmpDir(dir: string): void {
|
|
64
|
-
try { fs.rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function setupDefaultConfirmMocks(): void {
|
|
68
|
-
// SqliteConnection mock: constructor returns instance with getDb/getSchemaInitWarnings/close
|
|
69
|
-
// NOTE: Must use `function` (not arrow function) because vitest 4.x requires
|
|
70
|
-
// function/class implementations for mocks called with `new`.
|
|
71
|
-
mockState.sqliteConnectionCtor.mockImplementation(function () {
|
|
72
|
-
return {
|
|
73
|
-
getDb: mockState.sqliteConnectionGetDb,
|
|
74
|
-
getSchemaInitWarnings: mockState.sqliteConnectionGetWarnings,
|
|
75
|
-
close: mockState.sqliteConnectionClose,
|
|
76
|
-
};
|
|
77
|
-
});
|
|
78
|
-
mockState.sqliteConnectionGetDb.mockReturnValue({});
|
|
79
|
-
mockState.sqliteConnectionGetWarnings.mockReturnValue([]);
|
|
80
|
-
mockState.sqliteConnectionClose.mockReturnValue(undefined);
|
|
81
|
-
|
|
82
|
-
// initTrajectorySchema mock
|
|
83
|
-
mockState.initTrajectorySchema.mockReturnValue({
|
|
84
|
-
tables: ['schema_version', 'sessions', 'pain_events', 'evolution_tasks'],
|
|
85
|
-
warnings: [],
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
// SchemaConformanceReadModel mock
|
|
89
|
-
mockState.schemaConformanceCtor.mockImplementation(function () {
|
|
90
|
-
return {
|
|
91
|
-
check: mockState.schemaConformanceCheck,
|
|
92
|
-
};
|
|
93
|
-
});
|
|
94
|
-
mockState.schemaConformanceCheck.mockReturnValue({ overallStatus: 'ok' });
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// ── Tests ───────────────────────────────────────────────────────────────────
|
|
98
|
-
|
|
99
|
-
describe('pd runtime init', () => {
|
|
100
|
-
beforeEach(() => {
|
|
101
|
-
vi.clearAllMocks();
|
|
102
|
-
setupDefaultConfirmMocks();
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
// ── INIT-01: dry-run (default) ─────────────────────────────────────────────
|
|
106
|
-
|
|
107
|
-
describe('INIT-01: dry-run (default)', () => {
|
|
108
|
-
it('reports 2 DBs as skipped without calling init functions', () => {
|
|
109
|
-
const tmp = mkTmpDir();
|
|
110
|
-
try {
|
|
111
|
-
const output = buildRuntimeInitOutput(tmp, false);
|
|
112
|
-
expect(output.ok).toBe(true);
|
|
113
|
-
expect(output.mode).toBe('dry-run');
|
|
114
|
-
expect(output.databases).toHaveLength(2);
|
|
115
|
-
for (const db of output.databases) {
|
|
116
|
-
expect(db.status).toBe('skipped');
|
|
117
|
-
}
|
|
118
|
-
// No init functions should be called in dry-run mode
|
|
119
|
-
expect(mockState.initTrajectorySchema).not.toHaveBeenCalled();
|
|
120
|
-
expect(mockState.sqliteConnectionCtor).not.toHaveBeenCalled();
|
|
121
|
-
} finally { rmTmpDir(tmp); }
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it('includes expected table names in dry-run output for each DB', () => {
|
|
125
|
-
const tmp = mkTmpDir();
|
|
126
|
-
try {
|
|
127
|
-
const output = buildRuntimeInitOutput(tmp, false);
|
|
128
|
-
const stateDb = output.databases.find(d => d.name === 'state.db');
|
|
129
|
-
const trajDb = output.databases.find(d => d.name === 'trajectory.db');
|
|
130
|
-
expect(stateDb?.tables).toContain('tasks');
|
|
131
|
-
expect(stateDb?.tables).toContain('runs');
|
|
132
|
-
expect(trajDb?.tables).toContain('pain_events');
|
|
133
|
-
expect(trajDb?.tables).toContain('sessions');
|
|
134
|
-
} finally { rmTmpDir(tmp); }
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
// ── INIT-02: --confirm ─────────────────────────────────────────────────────
|
|
139
|
-
|
|
140
|
-
describe('INIT-02: --confirm', () => {
|
|
141
|
-
it('calls all init functions and reports initialized status', () => {
|
|
142
|
-
const tmp = mkTmpDir();
|
|
143
|
-
try {
|
|
144
|
-
const output = buildRuntimeInitOutput(tmp, true);
|
|
145
|
-
expect(output.ok).toBe(true);
|
|
146
|
-
expect(output.mode).toBe('confirm');
|
|
147
|
-
expect(output.databases).toHaveLength(2);
|
|
148
|
-
for (const db of output.databases) {
|
|
149
|
-
expect(db.status).toBe('initialized');
|
|
150
|
-
}
|
|
151
|
-
expect(mockState.sqliteConnectionCtor).toHaveBeenCalledTimes(1);
|
|
152
|
-
expect(mockState.sqliteConnectionGetDb).toHaveBeenCalledTimes(1);
|
|
153
|
-
expect(mockState.initTrajectorySchema).toHaveBeenCalledWith(tmp);
|
|
154
|
-
} finally { rmTmpDir(tmp); }
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it('runs schema conformance check after initialization', () => {
|
|
158
|
-
const tmp = mkTmpDir();
|
|
159
|
-
try {
|
|
160
|
-
buildRuntimeInitOutput(tmp, true);
|
|
161
|
-
expect(mockState.schemaConformanceCtor).toHaveBeenCalledTimes(1);
|
|
162
|
-
expect(mockState.schemaConformanceCheck).toHaveBeenCalledTimes(1);
|
|
163
|
-
} finally { rmTmpDir(tmp); }
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
// ── INIT-03: --json output (cli-1) ─────────────────────────────────────────
|
|
168
|
-
|
|
169
|
-
describe('INIT-03: --json output (cli-1)', () => {
|
|
170
|
-
let stdoutSpy: ReturnType<typeof vi.spyOn>;
|
|
171
|
-
let originalExitCode: number | undefined;
|
|
172
|
-
|
|
173
|
-
beforeEach(() => {
|
|
174
|
-
stdoutSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
175
|
-
originalExitCode = process.exitCode;
|
|
176
|
-
process.exitCode = undefined;
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
afterEach(() => {
|
|
180
|
-
stdoutSpy.mockRestore();
|
|
181
|
-
process.exitCode = originalExitCode;
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it('outputs exactly one parseable JSON object to stdout', async () => {
|
|
185
|
-
const tmp = mkTmpDir();
|
|
186
|
-
try {
|
|
187
|
-
await handleRuntimeInit({ workspace: tmp, json: true });
|
|
188
|
-
expect(stdoutSpy).toHaveBeenCalledTimes(1);
|
|
189
|
-
const output = stdoutSpy.mock.calls[0][0] as string;
|
|
190
|
-
const parsed = JSON.parse(output);
|
|
191
|
-
expect(typeof parsed).toBe('object');
|
|
192
|
-
expect(parsed).not.toBeNull();
|
|
193
|
-
expect(Array.isArray(parsed)).toBe(false);
|
|
194
|
-
expect(parsed).toHaveProperty('ok');
|
|
195
|
-
expect(parsed).toHaveProperty('mode');
|
|
196
|
-
expect(parsed).toHaveProperty('databases');
|
|
197
|
-
} finally { rmTmpDir(tmp); }
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
it('does not set exitCode=1 on successful dry-run', async () => {
|
|
201
|
-
const tmp = mkTmpDir();
|
|
202
|
-
try {
|
|
203
|
-
await handleRuntimeInit({ workspace: tmp, json: true });
|
|
204
|
-
expect(process.exitCode).toBeUndefined();
|
|
205
|
-
} finally { rmTmpDir(tmp); }
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
// ── INIT-04: --dry-run + --confirm mutex (cli-4) ───────────────────────────
|
|
210
|
-
|
|
211
|
-
describe('INIT-04: --dry-run + --confirm mutex (cli-4)', () => {
|
|
212
|
-
let stdoutSpy: ReturnType<typeof vi.spyOn>;
|
|
213
|
-
let stderrSpy: ReturnType<typeof vi.spyOn>;
|
|
214
|
-
let originalExitCode: number | undefined;
|
|
215
|
-
|
|
216
|
-
beforeEach(() => {
|
|
217
|
-
stdoutSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
218
|
-
stderrSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
219
|
-
originalExitCode = process.exitCode;
|
|
220
|
-
process.exitCode = undefined;
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
afterEach(() => {
|
|
224
|
-
stdoutSpy.mockRestore();
|
|
225
|
-
stderrSpy.mockRestore();
|
|
226
|
-
process.exitCode = originalExitCode;
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
it('sets exitCode=1 when both --dry-run and --confirm are specified', async () => {
|
|
230
|
-
await handleRuntimeInit({ dryRun: true, confirm: true, json: true });
|
|
231
|
-
expect(process.exitCode).toBe(1);
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
it('emits flag conflict JSON with reason and nextAction', async () => {
|
|
235
|
-
await handleRuntimeInit({ dryRun: true, confirm: true, json: true });
|
|
236
|
-
expect(stdoutSpy).toHaveBeenCalledTimes(1);
|
|
237
|
-
const output = stdoutSpy.mock.calls[0][0] as string;
|
|
238
|
-
const parsed = JSON.parse(output);
|
|
239
|
-
expect(parsed.ok).toBe(false);
|
|
240
|
-
expect(parsed.reason).toBeTruthy();
|
|
241
|
-
expect(parsed.nextAction).toBeTruthy();
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
it('does not call any init functions on flag conflict', async () => {
|
|
245
|
-
await handleRuntimeInit({ dryRun: true, confirm: true, json: true });
|
|
246
|
-
expect(mockState.initTrajectorySchema).not.toHaveBeenCalled();
|
|
247
|
-
expect(mockState.sqliteConnectionCtor).not.toHaveBeenCalled();
|
|
248
|
-
});
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
// ── INIT-05: --confirm failure (cli-6) ─────────────────────────────────────
|
|
252
|
-
|
|
253
|
-
describe('INIT-05: --confirm failure (cli-6)', () => {
|
|
254
|
-
let stdoutSpy: ReturnType<typeof vi.spyOn>;
|
|
255
|
-
let originalExitCode: number | undefined;
|
|
256
|
-
|
|
257
|
-
beforeEach(() => {
|
|
258
|
-
stdoutSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
259
|
-
originalExitCode = process.exitCode;
|
|
260
|
-
process.exitCode = undefined;
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
afterEach(() => {
|
|
264
|
-
stdoutSpy.mockRestore();
|
|
265
|
-
process.exitCode = originalExitCode;
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
it('sets exitCode=1 and includes reason + nextAction when state.db fails', () => {
|
|
269
|
-
const tmp = mkTmpDir();
|
|
270
|
-
try {
|
|
271
|
-
mockState.sqliteConnectionGetDb.mockImplementation(() => {
|
|
272
|
-
throw new Error('disk full');
|
|
273
|
-
});
|
|
274
|
-
const output = buildRuntimeInitOutput(tmp, true);
|
|
275
|
-
expect(output.ok).toBe(false);
|
|
276
|
-
expect(output.reason).toContain('state.db');
|
|
277
|
-
expect(output.reason).toContain('disk full');
|
|
278
|
-
expect(output.nextAction).toBeTruthy();
|
|
279
|
-
} finally { rmTmpDir(tmp); }
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
it('sets exitCode=1 and includes reason when trajectory.db fails', () => {
|
|
283
|
-
const tmp = mkTmpDir();
|
|
284
|
-
try {
|
|
285
|
-
mockState.initTrajectorySchema.mockImplementation(() => {
|
|
286
|
-
throw new Error('permission denied');
|
|
287
|
-
});
|
|
288
|
-
const output = buildRuntimeInitOutput(tmp, true);
|
|
289
|
-
expect(output.ok).toBe(false);
|
|
290
|
-
expect(output.reason).toContain('trajectory.db');
|
|
291
|
-
expect(output.reason).toContain('permission denied');
|
|
292
|
-
} finally { rmTmpDir(tmp); }
|
|
293
|
-
});
|
|
294
|
-
|
|
295
|
-
it('handler sets process.exitCode=1 on failure with --json', async () => {
|
|
296
|
-
const tmp = mkTmpDir();
|
|
297
|
-
try {
|
|
298
|
-
mockState.sqliteConnectionGetDb.mockImplementation(() => {
|
|
299
|
-
throw new Error('init failed');
|
|
300
|
-
});
|
|
301
|
-
await handleRuntimeInit({ workspace: tmp, confirm: true, json: true });
|
|
302
|
-
expect(process.exitCode).toBe(1);
|
|
303
|
-
const output = stdoutSpy.mock.calls[0][0] as string;
|
|
304
|
-
const parsed = JSON.parse(output);
|
|
305
|
-
expect(parsed.ok).toBe(false);
|
|
306
|
-
expect(parsed.reason).toBeTruthy();
|
|
307
|
-
expect(parsed.nextAction).toBeTruthy();
|
|
308
|
-
} finally { rmTmpDir(tmp); }
|
|
309
|
-
});
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
// ── INIT-06: missing --workspace ───────────────────────────────────────────
|
|
313
|
-
|
|
314
|
-
describe('INIT-06: missing --workspace', () => {
|
|
315
|
-
it('falls back to resolveWorkspaceDir() when workspace is not specified', async () => {
|
|
316
|
-
const tmp = mkTmpDir();
|
|
317
|
-
mockState.resolveWorkspaceDir.mockReturnValue(tmp);
|
|
318
|
-
try {
|
|
319
|
-
await handleRuntimeInit({ json: true });
|
|
320
|
-
expect(mockState.resolveWorkspaceDir).toHaveBeenCalledTimes(1);
|
|
321
|
-
} finally { rmTmpDir(tmp); }
|
|
322
|
-
});
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
// ── INIT-07: config.yaml scaffolding (P0: runtime discovery) ───────────────
|
|
326
|
-
|
|
327
|
-
describe('INIT-07: config.yaml scaffolding', () => {
|
|
328
|
-
it('dry-run reports config.yaml as skipped without writing the file', () => {
|
|
329
|
-
const tmp = mkTmpDir();
|
|
330
|
-
try {
|
|
331
|
-
const output = buildRuntimeInitOutput(tmp, false);
|
|
332
|
-
expect(output.config).toBeDefined();
|
|
333
|
-
expect(output.config?.status).toBe('skipped');
|
|
334
|
-
expect(fs.existsSync(path.join(tmp, '.pd', 'config.yaml'))).toBe(false);
|
|
335
|
-
} finally { rmTmpDir(tmp); }
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
it('--confirm writes a valid config.yaml with version and workspace.default', async () => {
|
|
339
|
-
const tmp = mkTmpDir();
|
|
340
|
-
try {
|
|
341
|
-
const output = buildRuntimeInitOutput(tmp, true);
|
|
342
|
-
expect(output.config?.status).toBe('initialized');
|
|
343
|
-
const configPath = path.join(tmp, '.pd', 'config.yaml');
|
|
344
|
-
expect(fs.existsSync(configPath)).toBe(true);
|
|
345
|
-
// js-yaml 5 is ESM-only: no default export — use the namespace.
|
|
346
|
-
const yaml = await import('js-yaml');
|
|
347
|
-
const raw = fs.readFileSync(configPath, 'utf8');
|
|
348
|
-
const parsed = yaml.load(raw, { schema: yaml.JSON_SCHEMA });
|
|
349
|
-
expect(typeof parsed).toBe('object');
|
|
350
|
-
const obj = parsed as { version?: unknown; workspace?: { default?: unknown }; features?: unknown };
|
|
351
|
-
expect(obj.version).toBe(1);
|
|
352
|
-
expect(obj.workspace?.default).toBe(path.resolve(tmp));
|
|
353
|
-
// PRI-645: the section must EXIST but stay a sparse empty map —
|
|
354
|
-
// registry defaults are never materialized into a fresh config.
|
|
355
|
-
expect(obj.features).toEqual({});
|
|
356
|
-
} finally { rmTmpDir(tmp); }
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
it('round-trip: generated config passes validatePdConfig', async () => {
|
|
360
|
-
const tmp = mkTmpDir();
|
|
361
|
-
try {
|
|
362
|
-
buildRuntimeInitOutput(tmp, true);
|
|
363
|
-
const configPath = path.join(tmp, '.pd', 'config.yaml');
|
|
364
|
-
// js-yaml 5 is ESM-only: no default export — use the namespace.
|
|
365
|
-
const yaml = await import('js-yaml');
|
|
366
|
-
const { validatePdConfig } = await import('@principles/core/runtime-v2');
|
|
367
|
-
const parsed: unknown = yaml.load(fs.readFileSync(configPath, 'utf8'), { schema: yaml.JSON_SCHEMA });
|
|
368
|
-
const result = validatePdConfig(parsed);
|
|
369
|
-
expect(result.ok).toBe(true);
|
|
370
|
-
} finally { rmTmpDir(tmp); }
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
it('--confirm writes a sparse features map; effective flags equal registry defaults (PRI-645)', async () => {
|
|
374
|
-
const tmp = mkTmpDir();
|
|
375
|
-
try {
|
|
376
|
-
buildRuntimeInitOutput(tmp, true);
|
|
377
|
-
const configPath = path.join(tmp, '.pd', 'config.yaml');
|
|
378
|
-
// js-yaml 5 is ESM-only: no default export — use the namespace.
|
|
379
|
-
const yaml = await import('js-yaml');
|
|
380
|
-
const { computeEffectivePdConfig, validatePdConfig } = await import('@principles/core/runtime-v2');
|
|
381
|
-
const parsed: unknown = yaml.load(fs.readFileSync(configPath, 'utf8'), { schema: yaml.JSON_SCHEMA });
|
|
382
|
-
const parsedFeatures = (parsed as { features?: unknown }).features;
|
|
383
|
-
// Raw invariant: zero default-equivalent snapshot entries (was: full
|
|
384
|
-
// 46-entry registry snapshot with source: 'system' before PRI-645).
|
|
385
|
-
expect(parsedFeatures).toEqual({});
|
|
386
|
-
// Effective invariant: every registered flag resolves to its registry
|
|
387
|
-
// default — the sparse raw representation changes nothing. The pure-
|
|
388
|
-
// defaults effective config is the registry-derived baseline.
|
|
389
|
-
const validation = validatePdConfig(parsed);
|
|
390
|
-
expect(validation.ok).toBe(true);
|
|
391
|
-
if (validation.ok) {
|
|
392
|
-
const effective = computeEffectivePdConfig(validation.value);
|
|
393
|
-
const pureDefaults = computeEffectivePdConfig(null);
|
|
394
|
-
expect(Object.keys(effective.config.features)).toHaveLength(Object.keys(pureDefaults.config.features).length);
|
|
395
|
-
for (const [id, def] of Object.entries(pureDefaults.config.features)) {
|
|
396
|
-
expect(effective.config.features[id]).toEqual(def);
|
|
397
|
-
}
|
|
398
|
-
expect(effective.featuresChangedFromDefault).toEqual([]);
|
|
399
|
-
}
|
|
400
|
-
} finally { rmTmpDir(tmp); }
|
|
401
|
-
});
|
|
402
|
-
|
|
403
|
-
it('--confirm skips when config.yaml already exists (preserves user file)', () => {
|
|
404
|
-
const tmp = mkTmpDir();
|
|
405
|
-
try {
|
|
406
|
-
// Pre-create a user-modified config.yaml
|
|
407
|
-
const configDir = path.join(tmp, '.pd');
|
|
408
|
-
fs.mkdirSync(configDir, { recursive: true });
|
|
409
|
-
const userConfig = '# user config\nversion: 1\n';
|
|
410
|
-
fs.writeFileSync(path.join(configDir, 'config.yaml'), userConfig, 'utf8');
|
|
411
|
-
|
|
412
|
-
const output = buildRuntimeInitOutput(tmp, true);
|
|
413
|
-
expect(output.config?.status).toBe('skipped');
|
|
414
|
-
expect(output.config?.warnings.some(w => w.includes('already exists'))).toBe(true);
|
|
415
|
-
// Content must be preserved
|
|
416
|
-
expect(fs.readFileSync(path.join(configDir, 'config.yaml'), 'utf8')).toBe(userConfig);
|
|
417
|
-
} finally { rmTmpDir(tmp); }
|
|
418
|
-
});
|
|
419
|
-
});
|
|
420
|
-
});
|