@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,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workspace Tool Semantics Resolution tests — PRI-634-F R2 (review P1-2)
|
|
3
|
-
*
|
|
4
|
-
* The CLI must resolve the host registry from DURABLE workspace provenance
|
|
5
|
-
* and refuse (never guess, never silently skip) when unavailable.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { describe, expect, it, beforeEach, afterEach } from 'vitest';
|
|
9
|
-
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'node:fs';
|
|
10
|
-
import { tmpdir } from 'node:os';
|
|
11
|
-
import path from 'node:path';
|
|
12
|
-
import { resolveWorkspaceToolSemantics } from '../../src/services/workspace-tool-semantics.js';
|
|
13
|
-
|
|
14
|
-
let ws: string;
|
|
15
|
-
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
ws = mkdtempSync(path.join(tmpdir(), 'pd-wts-'));
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
afterEach(() => {
|
|
21
|
-
rmSync(ws, { recursive: true, force: true });
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
function writeDeclaration(payload: unknown, hostKind = 'openclaw'): void {
|
|
25
|
-
// R3: per-host partition — <ws>/.pd/host-tool-semantics/<hostKind>.json
|
|
26
|
-
mkdirSync(path.join(ws, '.pd', 'host-tool-semantics'), { recursive: true });
|
|
27
|
-
writeFileSync(path.join(ws, '.pd', 'host-tool-semantics', `${hostKind}.json`), JSON.stringify(payload), 'utf8');
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
describe('resolveWorkspaceToolSemantics', () => {
|
|
31
|
-
it('resolves a valid persisted host declaration into a host-layered registry', () => {
|
|
32
|
-
writeDeclaration({
|
|
33
|
-
version: 1,
|
|
34
|
-
hostKind: 'openclaw',
|
|
35
|
-
mappings: [
|
|
36
|
-
{ rawToolName: 'shell', canonicalKind: 'execute' },
|
|
37
|
-
{ rawToolName: 'write_file', canonicalKind: 'write' },
|
|
38
|
-
],
|
|
39
|
-
declaredAt: '2026-09-04T00:00:00.000Z',
|
|
40
|
-
});
|
|
41
|
-
const result = resolveWorkspaceToolSemantics(ws);
|
|
42
|
-
expect(result.ok).toBe(true);
|
|
43
|
-
if (!result.ok) return;
|
|
44
|
-
expect(result.hostKind).toBe('openclaw');
|
|
45
|
-
expect(result.registry.hasHostTool('shell')).toBe(true);
|
|
46
|
-
// Core baseline names still classify, but are NOT host-declared here.
|
|
47
|
-
expect(result.registry.hasHostTool('execute_command')).toBe(false);
|
|
48
|
-
expect(result.registry.hasHostTool('read_file')).toBe(false);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('missing declaration → structured failure with actionable nextAction (no guessing)', () => {
|
|
52
|
-
const result = resolveWorkspaceToolSemantics(ws);
|
|
53
|
-
expect(result.ok).toBe(false);
|
|
54
|
-
if (result.ok) return;
|
|
55
|
-
expect(result.reason).toBe('host_tool_declaration_missing');
|
|
56
|
-
expect(result.nextAction).toContain('host');
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('malformed declaration → host_tool_declaration_invalid, never baseline fallback', () => {
|
|
60
|
-
writeDeclaration({ version: 1, hostKind: 'x', mappings: [{ rawToolName: 'bad', canonicalKind: 'nope' }], declaredAt: 't' });
|
|
61
|
-
const result = resolveWorkspaceToolSemantics(ws);
|
|
62
|
-
expect(result.ok).toBe(false);
|
|
63
|
-
if (result.ok) return;
|
|
64
|
-
expect(result.reason).toContain('host_tool_declaration_invalid');
|
|
65
|
-
expect(result.reason).toContain('openclaw');
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('not JSON at all → host_tool_declaration_invalid (per-host file)', () => {
|
|
69
|
-
mkdirSync(path.join(ws, '.pd', 'host-tool-semantics'), { recursive: true });
|
|
70
|
-
writeFileSync(path.join(ws, '.pd', 'host-tool-semantics', 'openclaw.json'), '{not json', 'utf8');
|
|
71
|
-
const result = resolveWorkspaceToolSemantics(ws);
|
|
72
|
-
expect(result.ok).toBe(false);
|
|
73
|
-
if (result.ok) return;
|
|
74
|
-
expect(result.reason).toBe('host_tool_declaration_invalid (openclaw: not valid JSON)');
|
|
75
|
-
});
|
|
76
|
-
});
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for path-security primitives (isPathInside, assertSafeDirectoryRoot, canonicalPath).
|
|
3
|
-
*
|
|
4
|
-
* Covers:
|
|
5
|
-
* - Relative workspace containment (regression: startsWith on relative root)
|
|
6
|
-
* - Absolute path containment
|
|
7
|
-
* - Sibling-prefix attack (/work/foo vs /work/foobar)
|
|
8
|
-
* - Traversal escape rejection
|
|
9
|
-
* - Filesystem root rejection
|
|
10
|
-
* - Empty path rejection
|
|
11
|
-
* - Windows path cross-platform semantics
|
|
12
|
-
* - POSIX path cross-platform semantics
|
|
13
|
-
*/
|
|
14
|
-
import { describe, it, expect } from 'vitest';
|
|
15
|
-
import * as path from 'node:path';
|
|
16
|
-
import { isPathInside, assertSafeDirectoryRoot, canonicalPath } from '../../src/utils/path-security.js';
|
|
17
|
-
|
|
18
|
-
// ── canonicalPath ───────────────────────────────────────────────────────────
|
|
19
|
-
|
|
20
|
-
describe('canonicalPath', () => {
|
|
21
|
-
it('resolves relative paths to absolute', () => {
|
|
22
|
-
const result = canonicalPath('./relative/path');
|
|
23
|
-
expect(path.isAbsolute(result)).toBe(true);
|
|
24
|
-
expect(result).toContain('relative');
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('keeps absolute paths unchanged in effect', () => {
|
|
28
|
-
const result = canonicalPath('/tmp/workspace');
|
|
29
|
-
expect(path.isAbsolute(result)).toBe(true);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('collapses parent traversal', () => {
|
|
33
|
-
const result = canonicalPath('/tmp/a/../b');
|
|
34
|
-
// After resolve, /tmp/a/../b = /tmp/b
|
|
35
|
-
expect(result).toBe(path.resolve('/tmp/b'));
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('handles empty string as cwd', () => {
|
|
39
|
-
const result = canonicalPath('');
|
|
40
|
-
expect(result).toBe(path.resolve(''));
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
// ── isPathInside ────────────────────────────────────────────────────────────
|
|
45
|
-
|
|
46
|
-
describe('isPathInside', () => {
|
|
47
|
-
it('returns true for a file inside parent (relative parent)', () => {
|
|
48
|
-
// Regression: relative parent, absolute child
|
|
49
|
-
const parent = './relative-workspace';
|
|
50
|
-
const child = path.resolve('./relative-workspace/memory/logs/SYSTEM_2026-06-08.log');
|
|
51
|
-
expect(isPathInside(parent, child)).toBe(true);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('returns true for a file inside parent (absolute parent)', () => {
|
|
55
|
-
const parent = '/tmp/workspace';
|
|
56
|
-
const child = '/tmp/workspace/memory/logs/X.log';
|
|
57
|
-
expect(isPathInside(parent, child)).toBe(true);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it('returns true for a nested subdirectory', () => {
|
|
61
|
-
const parent = '/tmp/workspace';
|
|
62
|
-
const child = '/tmp/workspace/sub/dir/file.txt';
|
|
63
|
-
expect(isPathInside(parent, child)).toBe(true);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('returns false when candidate === parent (strict containment)', () => {
|
|
67
|
-
const parent = '/tmp/workspace';
|
|
68
|
-
const child = parent;
|
|
69
|
-
expect(isPathInside(parent, child)).toBe(false);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('returns false for sibling-prefix attack', () => {
|
|
73
|
-
// /work/foo should NOT contain /work/foobar
|
|
74
|
-
const parent = '/tmp/work/foo';
|
|
75
|
-
const child = '/tmp/work/foobar/evil.txt';
|
|
76
|
-
expect(isPathInside(parent, child)).toBe(false);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it('returns false for upward traversal', () => {
|
|
80
|
-
const parent = '/tmp/workspace';
|
|
81
|
-
const child = '/tmp/workspace/../../etc/passwd';
|
|
82
|
-
expect(isPathInside(parent, child)).toBe(false);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it('returns false for paths outside parent', () => {
|
|
86
|
-
const parent = '/tmp/workspace';
|
|
87
|
-
const child = '/tmp/other/file.txt';
|
|
88
|
-
expect(isPathInside(parent, child)).toBe(false);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('returns false for sibling in parallel directory', () => {
|
|
92
|
-
const parent = '/tmp/workspace/a';
|
|
93
|
-
const child = '/tmp/workspace/b/file.txt';
|
|
94
|
-
expect(isPathInside(parent, child)).toBe(false);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('handles Windows-style paths (cross-platform, resolve-based)', () => {
|
|
98
|
-
// On Windows, path.resolve('C:\\workspace') works; on POSIX it's a relative path.
|
|
99
|
-
// Either way, the comparison is canonical-vs-canonical.
|
|
100
|
-
const parent = 'C:\\workspace';
|
|
101
|
-
const child = path.resolve('C:\\workspace\\memory\\logs\\X.log');
|
|
102
|
-
// On POSIX, both resolve to cwd-based paths; the containment should still
|
|
103
|
-
// be consistent: child must be inside parent after canonicalization.
|
|
104
|
-
// This test verifies no crash and consistent behavior.
|
|
105
|
-
expect(() => isPathInside(parent, child)).not.toThrow();
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('requires parent to be a path prefix of child (not reverse)', () => {
|
|
109
|
-
const parent = '/tmp/workspace/sub';
|
|
110
|
-
const child = '/tmp/workspace';
|
|
111
|
-
expect(isPathInside(parent, child)).toBe(false);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it('handles dot as current directory', () => {
|
|
115
|
-
const parent = '.';
|
|
116
|
-
const child = path.resolve('./some-file.txt');
|
|
117
|
-
expect(isPathInside(parent, child)).toBe(true);
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
// ── assertSafeDirectoryRoot ─────────────────────────────────────────────────
|
|
122
|
-
|
|
123
|
-
describe('assertSafeDirectoryRoot', () => {
|
|
124
|
-
it('returns canonical path for a valid relative root', () => {
|
|
125
|
-
const result = assertSafeDirectoryRoot('./relative-workspace', 'test');
|
|
126
|
-
expect(path.isAbsolute(result)).toBe(true);
|
|
127
|
-
expect(result).toContain('relative-workspace');
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
it('returns canonical path for a valid absolute root', () => {
|
|
131
|
-
const result = assertSafeDirectoryRoot('/tmp/workspace', 'test');
|
|
132
|
-
expect(path.isAbsolute(result)).toBe(true);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it('throws for empty path', () => {
|
|
136
|
-
expect(() => assertSafeDirectoryRoot('', 'test')).toThrow('path is empty');
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it('throws for whitespace-only path', () => {
|
|
140
|
-
expect(() => assertSafeDirectoryRoot(' ', 'test')).toThrow('path is empty');
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it('throws for parent traversal', () => {
|
|
144
|
-
expect(() => assertSafeDirectoryRoot('../etc/passwd', 'test')).toThrow('parent traversal');
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
it('throws for deep parent traversal', () => {
|
|
148
|
-
expect(() => assertSafeDirectoryRoot('a/../../b', 'test')).toThrow('parent traversal');
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it('throws for filesystem root (POSIX)', () => {
|
|
152
|
-
// Skip on Windows where this is a drive letter
|
|
153
|
-
expect(() => assertSafeDirectoryRoot('/', 'test')).toThrow('filesystem root');
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
it('throws for filesystem root (Windows drive)', () => {
|
|
157
|
-
// On Windows, 'C:\\' is a root; on POSIX, it resolves to cwd/C:\ which is not root.
|
|
158
|
-
// The test validates no crash and consistent behavior.
|
|
159
|
-
expect(() => {
|
|
160
|
-
try {
|
|
161
|
-
assertSafeDirectoryRoot('C:\\', 'test');
|
|
162
|
-
// On some platforms C:\ might resolve to a non-root path, so no throw
|
|
163
|
-
} catch (e) {
|
|
164
|
-
expect((e as Error).message).toMatch(/root|traversal/i);
|
|
165
|
-
}
|
|
166
|
-
}).not.toThrow();
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
it('allows sibling-level paths (not traversal)', () => {
|
|
170
|
-
// a/../b becomes 'b' after normalize (foldable), then resolves to cwd/b
|
|
171
|
-
// This is safe because it resolves inside cwd, no traversal.
|
|
172
|
-
const result = assertSafeDirectoryRoot('a/../b', 'test');
|
|
173
|
-
expect(path.isAbsolute(result)).toBe(true);
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
it('allows a workspace path with dots in name', () => {
|
|
177
|
-
const result = assertSafeDirectoryRoot('./my.project/v1', 'test');
|
|
178
|
-
expect(result).toContain('my.project');
|
|
179
|
-
});
|
|
180
|
-
});
|
package/tsconfig.json
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "NodeNext",
|
|
5
|
-
"moduleResolution": "NodeNext",
|
|
6
|
-
"lib": ["ES2022"],
|
|
7
|
-
"rootDir": "./src",
|
|
8
|
-
"outDir": "./dist",
|
|
9
|
-
"declaration": true,
|
|
10
|
-
"declarationMap": true,
|
|
11
|
-
"sourceMap": true,
|
|
12
|
-
"strict": true,
|
|
13
|
-
"noImplicitOverride": true,
|
|
14
|
-
"noUncheckedIndexedAccess": true,
|
|
15
|
-
"esModuleInterop": true,
|
|
16
|
-
"skipLibCheck": true,
|
|
17
|
-
"forceConsistentCasingInFileNames": true,
|
|
18
|
-
"resolveJsonModule": true,
|
|
19
|
-
"types": ["node"],
|
|
20
|
-
"paths": {
|
|
21
|
-
"@principles/core/runtime-v2/*": ["../principles-core/dist/runtime-v2/*"]
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
"include": ["src/**/*"],
|
|
25
|
-
"exclude": ["node_modules", "dist"]
|
|
26
|
-
}
|
package/vitest.config.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from 'vitest/config';
|
|
2
|
-
|
|
3
|
-
export default defineConfig({
|
|
4
|
-
test: {
|
|
5
|
-
environment: 'node',
|
|
6
|
-
globalSetup: ['../../scripts/test/temp-lifecycle.mjs'],
|
|
7
|
-
include: ['tests/bdd/**/*.{test,steps}.ts', 'tests/**/*.test.ts', 'src/**/*.test.ts'],
|
|
8
|
-
exclude: ['**/node_modules/**', '**/dist/**'],
|
|
9
|
-
},
|
|
10
|
-
});
|