@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,115 +0,0 @@
|
|
|
1
|
-
import * as path from 'path';
|
|
2
|
-
import * as os from 'os';
|
|
3
|
-
import * as fs from 'fs';
|
|
4
|
-
import { runProvenChannelBaseline } from '../services/proven-channel-baseline-runner.js';
|
|
5
|
-
import { parseChannels, type ProvenChannelBaselineSummary, type MvpChannel } from '@principles/core/runtime-v2';
|
|
6
|
-
|
|
7
|
-
interface ProvenChannelBaselineCliOptions {
|
|
8
|
-
workspace?: string;
|
|
9
|
-
json?: boolean;
|
|
10
|
-
channels?: string;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function formatChannelResult(ch: { channel: string; status: string; failureReason?: string; nextAction?: string; evidence: Record<string, unknown> }): string {
|
|
14
|
-
const icon = ch.status === 'passed' ? 'ā' : ch.status === 'degraded' ? 'ā ' : 'ā';
|
|
15
|
-
const lines: string[] = [];
|
|
16
|
-
lines.push(` ${icon} ${ch.channel}: ${ch.status}`);
|
|
17
|
-
if (ch.failureReason) {
|
|
18
|
-
lines.push(` reason: ${ch.failureReason}`);
|
|
19
|
-
}
|
|
20
|
-
if (ch.nextAction) {
|
|
21
|
-
lines.push(` nextAction: ${ch.nextAction}`);
|
|
22
|
-
}
|
|
23
|
-
return lines.join('\n');
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function formatTextOutput(summary: ProvenChannelBaselineSummary): string {
|
|
27
|
-
const lines: string[] = [];
|
|
28
|
-
const icon = summary.status === 'passed' ? 'ā' : summary.status === 'degraded' ? 'ā ' : 'ā';
|
|
29
|
-
|
|
30
|
-
lines.push('PD Proven Channel Baseline (PRI-240)');
|
|
31
|
-
lines.push(`generatedAt: ${summary.generatedAt}`);
|
|
32
|
-
lines.push(`workspaceMode: ${summary.workspaceMode}`);
|
|
33
|
-
lines.push(`OVERALL: ${icon} ${summary.status.toUpperCase()}`);
|
|
34
|
-
lines.push('');
|
|
35
|
-
|
|
36
|
-
if (summary.inputValidationFailure) {
|
|
37
|
-
const ivf = summary.inputValidationFailure;
|
|
38
|
-
lines.push('Input Validation Failure:');
|
|
39
|
-
lines.push(` reason: ${ivf.reason}`);
|
|
40
|
-
lines.push(` message: ${ivf.message}`);
|
|
41
|
-
lines.push(` nextAction: ${ivf.nextAction}`);
|
|
42
|
-
lines.push('');
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
lines.push('Channel Results:');
|
|
46
|
-
for (const ch of summary.channels) {
|
|
47
|
-
lines.push(formatChannelResult(ch));
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
lines.push('');
|
|
51
|
-
lines.push('Continuity Matrix:');
|
|
52
|
-
for (const entry of summary.continuityMatrix) {
|
|
53
|
-
lines.push(` ${entry.channel}:`);
|
|
54
|
-
lines.push(` entryPoint: ${entry.entryPoint}`);
|
|
55
|
-
lines.push(` expected: ${entry.expectedObservable}`);
|
|
56
|
-
lines.push(` dependsOnPluginDiscovery: ${entry.dependsOnPluginDiscovery}`);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (summary.recommendedNextIssue) {
|
|
60
|
-
lines.push('');
|
|
61
|
-
lines.push(`Recommended next issue: ${summary.recommendedNextIssue}`);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return lines.join('\n');
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export function cleanupTempWorkspace(workspaceDir: string, rmSyncImpl: (dir: string, opts: { recursive: boolean; force: boolean }) => void = fs.rmSync.bind(fs)): void {
|
|
68
|
-
try {
|
|
69
|
-
rmSyncImpl(workspaceDir, { recursive: true, force: true });
|
|
70
|
-
} catch (cleanupErr) {
|
|
71
|
-
const cleanupMsg = cleanupErr instanceof Error ? cleanupErr.message : String(cleanupErr);
|
|
72
|
-
console.error(`[pd-cli] cleanup warning: failed to remove temp workspace ${workspaceDir}: ${cleanupMsg}`);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export async function handleProvenChannelBaseline(opts: ProvenChannelBaselineCliOptions): Promise<void> {
|
|
77
|
-
const workspaceDir = opts.workspace
|
|
78
|
-
? path.resolve(opts.workspace)
|
|
79
|
-
: fs.mkdtempSync(path.join(os.tmpdir(), 'pd-proven-channel-'));
|
|
80
|
-
const workspaceMode: 'temp' | 'explicit_workspace' = opts.workspace ? 'explicit_workspace' : 'temp';
|
|
81
|
-
|
|
82
|
-
const parsed = opts.channels ? parseChannels(opts.channels) : null;
|
|
83
|
-
const userSpecifiedChannels = opts.channels !== undefined;
|
|
84
|
-
const channels: MvpChannel[] | undefined = parsed && parsed.channels.length > 0 ? parsed.channels : undefined;
|
|
85
|
-
const unknownChannels: string[] = parsed ? parsed.unknowns : [];
|
|
86
|
-
const emptyChannelInput = userSpecifiedChannels && channels === undefined && unknownChannels.length === 0;
|
|
87
|
-
|
|
88
|
-
try {
|
|
89
|
-
const summary = await runProvenChannelBaseline({
|
|
90
|
-
workspaceDir,
|
|
91
|
-
workspaceMode,
|
|
92
|
-
channels,
|
|
93
|
-
unknownChannels,
|
|
94
|
-
emptyChannelInput,
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
if (opts.json) {
|
|
98
|
-
console.log(JSON.stringify(summary, null, 2));
|
|
99
|
-
} else {
|
|
100
|
-
console.log(formatTextOutput(summary));
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (summary.status !== 'passed') {
|
|
104
|
-
if (!opts.json) {
|
|
105
|
-
console.error('');
|
|
106
|
-
console.error(`FAIL: status=${summary.status}`);
|
|
107
|
-
}
|
|
108
|
-
process.exitCode = 1;
|
|
109
|
-
}
|
|
110
|
-
} finally {
|
|
111
|
-
if (workspaceMode === 'temp') {
|
|
112
|
-
cleanupTempWorkspace(workspaceDir);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pd quality scorecard ā CLI command (PRI-361)
|
|
3
|
-
*
|
|
4
|
-
* JSON contract: --json mode outputs EXACTLY one JSON object to stdout.
|
|
5
|
-
* All progress/diagnostic output goes to stderr.
|
|
6
|
-
* Errors produce structured JSON: { ok: false, error, nextAction }.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { mkdirSync, writeFileSync } from 'fs';
|
|
10
|
-
import { dirname } from 'path';
|
|
11
|
-
import type {
|
|
12
|
-
EpisodeEvaluation,
|
|
13
|
-
QualityScorecardReport,
|
|
14
|
-
StrongModelAdjudication,
|
|
15
|
-
} from '@principles/core/quality-scorecard';
|
|
16
|
-
import {
|
|
17
|
-
validateCliOptions,
|
|
18
|
-
needsAdjudication,
|
|
19
|
-
generateMarkdownReport,
|
|
20
|
-
generateHtmlReport,
|
|
21
|
-
generateJsonReport,
|
|
22
|
-
} from '@principles/core/quality-scorecard';
|
|
23
|
-
import { extractEpisodes, extractLogStats } from '../services/quality-scorecard/data-extractor.js';
|
|
24
|
-
import { evaluateWithLocalModel, checkLmStudioAvailable } from '../services/quality-scorecard/local-evaluator.js';
|
|
25
|
-
import { adjudicate, skippedAdjudication, determineFinalLabel } from '../services/quality-scorecard/strong-model-gate.js';
|
|
26
|
-
|
|
27
|
-
// āā Logging: stderr only, silent in JSON mode āāāāāāāāāāāāāāāāāāāāāā
|
|
28
|
-
|
|
29
|
-
let jsonMode = false;
|
|
30
|
-
|
|
31
|
-
function log(msg: string): void {
|
|
32
|
-
if (!jsonMode) {
|
|
33
|
-
process.stderr.write(msg + '\n');
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// āā Structured JSON output helpers āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
38
|
-
|
|
39
|
-
function writeJsonOutput(data: unknown): void {
|
|
40
|
-
process.stdout.write(JSON.stringify(data, null, 2) + '\n');
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function writeJsonError(error: string, nextAction: string): void {
|
|
44
|
-
writeJsonOutput({ ok: false, error, nextAction });
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// āā Summary computation āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
48
|
-
|
|
49
|
-
function computeSummary(evaluations: EpisodeEvaluation[]) {
|
|
50
|
-
const totalEpisodes = evaluations.length;
|
|
51
|
-
// localPassCount/localFailCount: based strictly on local model's own conclusion
|
|
52
|
-
// (localEval.mvpMet + totalScore), NOT finalLabel which may incorporate strong-model adjudication.
|
|
53
|
-
const localPassCount = evaluations.filter(e => e.localEvaluation.mvpMet && e.localEvaluation.totalScore >= 12).length;
|
|
54
|
-
const localFailCount = evaluations.filter(e => e.localEvaluation.totalScore <= 6).length;
|
|
55
|
-
const strongModelReviewedCount = evaluations.filter(e =>
|
|
56
|
-
e.strongModelAdjudication && e.strongModelAdjudication.adjudicationStatus !== 'skipped'
|
|
57
|
-
).length;
|
|
58
|
-
const finalPassCount = evaluations.filter(e => e.finalLabel === 'pass').length;
|
|
59
|
-
const finalFailCount = evaluations.filter(e => e.finalLabel === 'fail').length;
|
|
60
|
-
const needsReviewCount = evaluations.filter(e => e.finalLabel === 'needs-review').length;
|
|
61
|
-
const localOnlyCount = evaluations.filter(e => e.finalLabel === 'local-pass' || e.finalLabel === 'local-fail').length;
|
|
62
|
-
const averageLocalScore = totalEpisodes > 0
|
|
63
|
-
? evaluations.reduce((s, e) => s + e.localEvaluation.totalScore, 0) / totalEpisodes
|
|
64
|
-
: 0;
|
|
65
|
-
const mvpThresholdMetCount = evaluations.filter(e => e.localEvaluation.mvpMet).length;
|
|
66
|
-
|
|
67
|
-
return {
|
|
68
|
-
totalEpisodes, localPassCount, localFailCount, strongModelReviewedCount,
|
|
69
|
-
finalPassCount, finalFailCount, needsReviewCount, localOnlyCount,
|
|
70
|
-
averageLocalScore, mvpThresholdMetCount,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// āā Main handler āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
75
|
-
|
|
76
|
-
export async function handleQualityScorecard(opts: Record<string, unknown>): Promise<void> {
|
|
77
|
-
const isJson = Boolean(opts.json);
|
|
78
|
-
jsonMode = isJson;
|
|
79
|
-
|
|
80
|
-
// Resolve workspace paths
|
|
81
|
-
const { resolveWorkspaceDir } = await import('../resolve-workspace.js');
|
|
82
|
-
const { join } = await import('path');
|
|
83
|
-
const { existsSync } = await import('fs');
|
|
84
|
-
const workspace = resolveWorkspaceDir(opts.workspace as string | undefined);
|
|
85
|
-
const dbPath = join(workspace, '.state', 'trajectory.db');
|
|
86
|
-
const logsDir = join(workspace, '.state', 'logs');
|
|
87
|
-
|
|
88
|
-
// 1. Validate CLI options
|
|
89
|
-
const { options, errors } = validateCliOptions({
|
|
90
|
-
dbPath,
|
|
91
|
-
logsDir,
|
|
92
|
-
localModelBaseUrl: opts.localUrl ?? 'http://localhost:12341/v1',
|
|
93
|
-
localModelId: opts.localModel ?? 'qwen3.6-27b-mtp',
|
|
94
|
-
strongModelId: opts.strongModel ?? null,
|
|
95
|
-
limit: opts.limit ?? '0',
|
|
96
|
-
format: isJson ? 'json' : (opts.format ?? 'markdown'),
|
|
97
|
-
output: opts.output,
|
|
98
|
-
minPainScore: opts.minScore ?? '50',
|
|
99
|
-
skipStrongModel: opts.skipStrongModel ?? false,
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
if (errors.length > 0) {
|
|
103
|
-
const msg = errors.map(e => `${e.field}: ${e.message}`).join('; ');
|
|
104
|
-
if (isJson) {
|
|
105
|
-
writeJsonError(msg, 'Fix the invalid options and retry');
|
|
106
|
-
} else {
|
|
107
|
-
process.stderr.write(`ā Invalid options:\n${errors.map(e => ` - ${e.field}: ${e.message}`).join('\n')}\n`);
|
|
108
|
-
}
|
|
109
|
-
process.exitCode = 1;
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// 2. Check files exist
|
|
114
|
-
if (!existsSync(options.dbPath)) {
|
|
115
|
-
const msg = `trajectory.db not found at: ${options.dbPath}`;
|
|
116
|
-
if (isJson) {
|
|
117
|
-
writeJsonError(msg, 'Ensure the workspace has PD data (run PD first to generate trajectory.db)');
|
|
118
|
-
} else {
|
|
119
|
-
process.stderr.write(`ā ${msg}\n`);
|
|
120
|
-
}
|
|
121
|
-
process.exitCode = 1;
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// 3. Ensure output directory exists
|
|
126
|
-
const outputDir = dirname(options.output);
|
|
127
|
-
if (outputDir && !existsSync(outputDir)) {
|
|
128
|
-
try {
|
|
129
|
-
mkdirSync(outputDir, { recursive: true });
|
|
130
|
-
log(`Created output directory: ${outputDir}`);
|
|
131
|
-
} catch (err: unknown) {
|
|
132
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
133
|
-
if (isJson) {
|
|
134
|
-
writeJsonError(`Cannot create output directory: ${msg}`, 'Ensure the output path is writable');
|
|
135
|
-
} else {
|
|
136
|
-
process.stderr.write(`ā Cannot create output directory: ${msg}\n`);
|
|
137
|
-
}
|
|
138
|
-
process.exitCode = 1;
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// 4. Check LM Studio
|
|
144
|
-
log('š PD Quality Scorecard ā Starting...');
|
|
145
|
-
log(` DB: ${options.dbPath}`);
|
|
146
|
-
log(` Local Model: ${options.localModelId} @ ${options.localModelBaseUrl}`);
|
|
147
|
-
log(` Strong Model: ${options.strongModelId ?? 'skipped'}`);
|
|
148
|
-
|
|
149
|
-
const lmStatus = await checkLmStudioAvailable(options.localModelBaseUrl);
|
|
150
|
-
if (!lmStatus.available) {
|
|
151
|
-
if (isJson) {
|
|
152
|
-
writeJsonError(`LM Studio not available: ${lmStatus.error}`, 'Start LM Studio or check --local-url');
|
|
153
|
-
} else {
|
|
154
|
-
process.stderr.write(`ā LM Studio not available at ${options.localModelBaseUrl}: ${lmStatus.error}\n`);
|
|
155
|
-
}
|
|
156
|
-
process.exitCode = 1;
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
if (!lmStatus.models.includes(options.localModelId)) {
|
|
161
|
-
if (isJson) {
|
|
162
|
-
writeJsonError(`Model "${options.localModelId}" not found. Available: ${lmStatus.models.join(', ')}`, 'Use --local-model with an available model');
|
|
163
|
-
} else {
|
|
164
|
-
process.stderr.write(`ā Model "${options.localModelId}" not found. Available: ${lmStatus.models.join(', ')}\n`);
|
|
165
|
-
}
|
|
166
|
-
process.exitCode = 1;
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// 5. Extract data
|
|
171
|
-
log('\nš Extracting dogfood data...');
|
|
172
|
-
const { episodes, stats: extractStats } = await extractEpisodes(options.dbPath, {
|
|
173
|
-
minScore: options.minPainScore,
|
|
174
|
-
limit: options.limit,
|
|
175
|
-
});
|
|
176
|
-
log(` Found ${episodes.length} unique episodes (total pain events: ${extractStats.total})`);
|
|
177
|
-
|
|
178
|
-
const logStats = extractLogStats(options.logsDir);
|
|
179
|
-
log(` Event logs: ${logStats.totalEvents} events (${logStats.painSignalCount} pain signals)`);
|
|
180
|
-
|
|
181
|
-
// 6. Evaluate each episode
|
|
182
|
-
log('\nš¤ Running local model evaluation...');
|
|
183
|
-
const evaluations: EpisodeEvaluation[] = [];
|
|
184
|
-
|
|
185
|
-
for (let i = 0; i < episodes.length; i++) {
|
|
186
|
-
const ep = episodes[i];
|
|
187
|
-
if (!ep) continue;
|
|
188
|
-
log(` [${i + 1}/${episodes.length}] ${ep.episodeId} (score=${ep.score})...`);
|
|
189
|
-
|
|
190
|
-
const localEval = await evaluateWithLocalModel(ep, {
|
|
191
|
-
baseUrl: options.localModelBaseUrl,
|
|
192
|
-
model: options.localModelId,
|
|
193
|
-
}, (msg: string) => log(` ${msg}`));
|
|
194
|
-
log(` Local: ${localEval.totalScore}/14 MVP=${localEval.mvpMet} flags=[${localEval.flags.join(',')}]`);
|
|
195
|
-
|
|
196
|
-
// 7. Strong model adjudication
|
|
197
|
-
let adjudication: StrongModelAdjudication;
|
|
198
|
-
if (options.skipStrongModel || !options.strongModelId) {
|
|
199
|
-
adjudication = skippedAdjudication(
|
|
200
|
-
options.skipStrongModel
|
|
201
|
-
? 'Strong model skipped by --skip-strong-model flag'
|
|
202
|
-
: 'No strong model configured'
|
|
203
|
-
);
|
|
204
|
-
} else {
|
|
205
|
-
const decision = needsAdjudication(ep, localEval);
|
|
206
|
-
if (decision.shouldAdjudicate) {
|
|
207
|
-
log(` Adjudicating (${decision.priority}: ${decision.reason})...`);
|
|
208
|
-
adjudication = await adjudicate(ep, localEval, { modelId: options.strongModelId, log: (msg: string) => log(` ${msg}`) });
|
|
209
|
-
log(` Adjudication: ${adjudication.adjudicationStatus}`);
|
|
210
|
-
} else {
|
|
211
|
-
adjudication = skippedAdjudication(decision.reason);
|
|
212
|
-
log(` Adjudication skipped: ${decision.reason}`);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
const finalLabel = determineFinalLabel(localEval, adjudication);
|
|
217
|
-
evaluations.push({ episode: ep, localEvaluation: localEval, strongModelAdjudication: adjudication, finalLabel });
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// 8. Build and write report
|
|
221
|
-
log('\nš Generating report...');
|
|
222
|
-
const summary = computeSummary(evaluations);
|
|
223
|
-
const report: QualityScorecardReport = {
|
|
224
|
-
generatedAt: new Date().toISOString(),
|
|
225
|
-
dataSource: {
|
|
226
|
-
painEventCount: extractStats.total,
|
|
227
|
-
evolutionTaskCount: 0,
|
|
228
|
-
principleEventCount: 0,
|
|
229
|
-
gateBlockCount: 0,
|
|
230
|
-
dateRange: extractStats.dateRange,
|
|
231
|
-
},
|
|
232
|
-
localEvaluatorConfig: {
|
|
233
|
-
model: options.localModelId,
|
|
234
|
-
baseUrl: options.localModelBaseUrl.replace(/\/v\d+$/, '/...'),
|
|
235
|
-
apiKeyStatus: 'not-required',
|
|
236
|
-
},
|
|
237
|
-
strongModelConfig: {
|
|
238
|
-
model: options.strongModelId,
|
|
239
|
-
status: options.skipStrongModel || !options.strongModelId ? 'skipped' : 'configured',
|
|
240
|
-
},
|
|
241
|
-
evaluations,
|
|
242
|
-
summary,
|
|
243
|
-
knownLimitations: [
|
|
244
|
-
'Local model scores are advisory only ā not final quality conclusions.',
|
|
245
|
-
'Without strong-model adjudication, samples are marked local-pass/local-fail/needs-review.',
|
|
246
|
-
'Deduplication is based on reason text similarity ā may miss distinct episodes.',
|
|
247
|
-
'Local model output is non-deterministic despite temperature=0.1.',
|
|
248
|
-
],
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
let content: string;
|
|
252
|
-
switch (options.format) {
|
|
253
|
-
case 'html': content = generateHtmlReport(report); break;
|
|
254
|
-
case 'json': content = generateJsonReport(report); break;
|
|
255
|
-
case 'markdown':
|
|
256
|
-
default: content = generateMarkdownReport(report); break;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
writeFileSync(options.output, content, 'utf-8');
|
|
260
|
-
|
|
261
|
-
log(`\nā
Report written to: ${options.output}`);
|
|
262
|
-
log(` Format: ${options.format}`);
|
|
263
|
-
log(` Episodes: ${summary.totalEpisodes}`);
|
|
264
|
-
log(` Local Pass: ${summary.localPassCount} | Local Fail: ${summary.localFailCount}`);
|
|
265
|
-
log(` Strong Model Reviewed: ${summary.strongModelReviewedCount}`);
|
|
266
|
-
log(` Final Pass: ${summary.finalPassCount} | Final Fail: ${summary.finalFailCount} | Needs Review: ${summary.needsReviewCount}`);
|
|
267
|
-
|
|
268
|
-
// JSON mode: output exactly one JSON object to stdout
|
|
269
|
-
if (isJson) {
|
|
270
|
-
writeJsonOutput({ ok: true, report });
|
|
271
|
-
}
|
|
272
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
export type RemediationMode = 'dry_run' | 'confirm';
|
|
2
|
-
export type RemediationStatus = 'would_change' | 'changed' | 'no_op' | 'refused' | 'error';
|
|
3
|
-
|
|
4
|
-
export interface RemediationAction {
|
|
5
|
-
action: string;
|
|
6
|
-
targetId: string;
|
|
7
|
-
previousState?: string;
|
|
8
|
-
nextState?: string;
|
|
9
|
-
reason: string;
|
|
10
|
-
taskId?: string;
|
|
11
|
-
type?: string;
|
|
12
|
-
severity?: 'error' | 'warning';
|
|
13
|
-
previousStatus?: string;
|
|
14
|
-
newStatus?: string;
|
|
15
|
-
recommendedAction?: string;
|
|
16
|
-
successorTaskId?: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface RemediationResult {
|
|
20
|
-
mode: RemediationMode;
|
|
21
|
-
status: RemediationStatus;
|
|
22
|
-
safeToConfirm: boolean;
|
|
23
|
-
repairedCount: number;
|
|
24
|
-
skippedCount: number;
|
|
25
|
-
actions: RemediationAction[];
|
|
26
|
-
warnings: string[];
|
|
27
|
-
generatedAt?: string;
|
|
28
|
-
dryRun?: boolean;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function createRemediationResult(input: {
|
|
32
|
-
mode: RemediationMode;
|
|
33
|
-
repairedCount?: number;
|
|
34
|
-
skippedCount?: number;
|
|
35
|
-
actions?: RemediationAction[];
|
|
36
|
-
warnings?: string[];
|
|
37
|
-
status?: RemediationStatus;
|
|
38
|
-
safeToConfirm?: boolean;
|
|
39
|
-
generatedAt?: string;
|
|
40
|
-
includeLegacyDryRun?: boolean;
|
|
41
|
-
}): RemediationResult {
|
|
42
|
-
const actions = input.actions ?? [];
|
|
43
|
-
const warnings = input.warnings ?? [];
|
|
44
|
-
const repairedCount = input.repairedCount ?? 0;
|
|
45
|
-
const status = input.status ?? (input.mode === 'dry_run'
|
|
46
|
-
? (actions.length > 0 ? 'would_change' : 'no_op')
|
|
47
|
-
: (repairedCount > 0 ? 'changed' : 'no_op'));
|
|
48
|
-
|
|
49
|
-
return {
|
|
50
|
-
mode: input.mode,
|
|
51
|
-
status,
|
|
52
|
-
safeToConfirm: input.safeToConfirm ?? (
|
|
53
|
-
input.mode === 'dry_run' && status === 'would_change' && warnings.length === 0
|
|
54
|
-
),
|
|
55
|
-
repairedCount,
|
|
56
|
-
skippedCount: input.skippedCount ?? 0,
|
|
57
|
-
actions,
|
|
58
|
-
warnings,
|
|
59
|
-
...(input.generatedAt ? { generatedAt: input.generatedAt } : {}),
|
|
60
|
-
...(input.includeLegacyDryRun ? { dryRun: input.mode === 'dry_run' } : {}),
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export function remediationAction(input: RemediationAction): RemediationAction {
|
|
65
|
-
return input;
|
|
66
|
-
}
|