@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,321 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PRI-466: pd intent — handler-level tests.
|
|
3
|
-
*
|
|
4
|
-
* Tests real handler behavior using temporary workspaces with .pd/config.yaml
|
|
5
|
-
* to control the intent_engineering flag. No mocks on resolveWorkspaceDir or
|
|
6
|
-
* loadPdConfig — full integration through the real code paths.
|
|
7
|
-
*
|
|
8
|
-
* ERR refs:
|
|
9
|
-
* - ERR-002: all degraded paths include reason + nextAction
|
|
10
|
-
* - ERR-009: missing file / flag-off surfaced explicitly
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
14
|
-
import * as fs from 'node:fs';
|
|
15
|
-
import * as path from 'node:path';
|
|
16
|
-
import * as os from 'node:os';
|
|
17
|
-
import * as yaml from 'js-yaml';
|
|
18
|
-
import { handleIntentInit, handleIntentShow } from '../../src/commands/intent.js';
|
|
19
|
-
|
|
20
|
-
let workspaceDir: string;
|
|
21
|
-
let tmpDir: string;
|
|
22
|
-
|
|
23
|
-
beforeEach(() => {
|
|
24
|
-
vi.clearAllMocks();
|
|
25
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-intent-cli-test-'));
|
|
26
|
-
workspaceDir = path.join(tmpDir, 'workspace');
|
|
27
|
-
fs.mkdirSync(workspaceDir, { recursive: true });
|
|
28
|
-
fs.mkdirSync(path.join(workspaceDir, '.pd'), { recursive: true });
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
afterEach(() => {
|
|
32
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
function writeConfig(intentEnabled: boolean): void {
|
|
36
|
-
const config = {
|
|
37
|
-
version: 1,
|
|
38
|
-
features: {
|
|
39
|
-
intent_engineering: { category: 'quiet', enabled: intentEnabled },
|
|
40
|
-
},
|
|
41
|
-
runtimeProfiles: {
|
|
42
|
-
'openclaw.default': { type: 'openclaw', source: 'default' },
|
|
43
|
-
},
|
|
44
|
-
internalAgents: {
|
|
45
|
-
defaultRuntime: 'openclaw.default',
|
|
46
|
-
agents: {
|
|
47
|
-
diagnostician: { enabled: true, runtimeProfile: 'openclaw.default' },
|
|
48
|
-
dreamer: { enabled: true },
|
|
49
|
-
scribe: { enabled: true },
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
ui: { diagnostics: { mode: 'simple' } },
|
|
53
|
-
};
|
|
54
|
-
fs.writeFileSync(
|
|
55
|
-
path.join(workspaceDir, '.pd', 'config.yaml'),
|
|
56
|
-
yaml.dump(config),
|
|
57
|
-
'utf8',
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function getIntentPath(): string {
|
|
62
|
-
return path.join(workspaceDir, '.principles', 'INTENT.zh-CN.md');
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const VALID_INTENT = `# INTENT.md
|
|
66
|
-
|
|
67
|
-
## 1. Why
|
|
68
|
-
|
|
69
|
-
This project validates pain from repeatedly correcting Agents.
|
|
70
|
-
|
|
71
|
-
## 2. Desired Outcome
|
|
72
|
-
|
|
73
|
-
A new user understands PD within five minutes.
|
|
74
|
-
|
|
75
|
-
## 3. Non-negotiables
|
|
76
|
-
|
|
77
|
-
- Do not make PD a heavy Agent platform.
|
|
78
|
-
- Do not increase Owner attention burden.
|
|
79
|
-
|
|
80
|
-
## 4. Stop / Escalation
|
|
81
|
-
|
|
82
|
-
If a change expands PD into orchestration, stop and ask Owner.
|
|
83
|
-
|
|
84
|
-
## 5. Current Strategic Focus
|
|
85
|
-
|
|
86
|
-
Validate the smallest loop: Pain to Principle to Delta.
|
|
87
|
-
`;
|
|
88
|
-
|
|
89
|
-
// ── handleIntentInit ─────────────────────────────────────────────────────────
|
|
90
|
-
|
|
91
|
-
describe('handleIntentInit', () => {
|
|
92
|
-
it('creates INTENT.md from template with --confirm', async () => {
|
|
93
|
-
await handleIntentInit({ workspace: workspaceDir, confirm: true, json: false });
|
|
94
|
-
|
|
95
|
-
const intentPath = getIntentPath();
|
|
96
|
-
expect(fs.existsSync(intentPath)).toBe(true);
|
|
97
|
-
const content = fs.readFileSync(intentPath, 'utf8');
|
|
98
|
-
expect(content).toContain('# INTENT.md');
|
|
99
|
-
expect(content).toContain('## 1. Why');
|
|
100
|
-
expect(content).toContain('## 5. Current Strategic Focus');
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('defaults to dry-run (does not write) when no --confirm', async () => {
|
|
104
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
105
|
-
await handleIntentInit({ workspace: workspaceDir, json: true });
|
|
106
|
-
|
|
107
|
-
expect(logSpy).toHaveBeenCalled();
|
|
108
|
-
const jsonOutput = JSON.parse(logSpy.mock.calls[0][0] as string);
|
|
109
|
-
expect(jsonOutput.status).toBe('dry_run');
|
|
110
|
-
expect(jsonOutput.path).toContain('INTENT.zh-CN.md');
|
|
111
|
-
expect(jsonOutput.reason).toBe('dry_run');
|
|
112
|
-
expect(jsonOutput.nextAction).toContain('--confirm');
|
|
113
|
-
|
|
114
|
-
// File must NOT be created
|
|
115
|
-
expect(fs.existsSync(getIntentPath())).toBe(false);
|
|
116
|
-
|
|
117
|
-
logSpy.mockRestore();
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it('dry-run with --dry-run flag produces same dry-run output', async () => {
|
|
121
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
122
|
-
await handleIntentInit({ workspace: workspaceDir, dryRun: true, json: true });
|
|
123
|
-
|
|
124
|
-
const jsonOutput = JSON.parse(logSpy.mock.calls[0][0] as string);
|
|
125
|
-
expect(jsonOutput.status).toBe('dry_run');
|
|
126
|
-
|
|
127
|
-
expect(fs.existsSync(getIntentPath())).toBe(false);
|
|
128
|
-
logSpy.mockRestore();
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
it('rejects --dry-run and --confirm together (CLI Gate rule 4)', async () => {
|
|
132
|
-
const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => undefined as never);
|
|
133
|
-
await handleIntentInit({ workspace: workspaceDir, dryRun: true, confirm: true, json: true });
|
|
134
|
-
|
|
135
|
-
expect(exitSpy).not.toHaveBeenCalled();
|
|
136
|
-
expect(process.exitCode).toBe(1);
|
|
137
|
-
// File must NOT be created
|
|
138
|
-
expect(fs.existsSync(getIntentPath())).toBe(false);
|
|
139
|
-
|
|
140
|
-
process.exitCode = undefined;
|
|
141
|
-
exitSpy.mockRestore();
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
it('skips when file exists and --force is not set', async () => {
|
|
145
|
-
// Pre-create the file
|
|
146
|
-
fs.mkdirSync(path.dirname(getIntentPath()), { recursive: true });
|
|
147
|
-
fs.writeFileSync(getIntentPath(), 'existing content', 'utf8');
|
|
148
|
-
|
|
149
|
-
const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => undefined as never);
|
|
150
|
-
await handleIntentInit({ workspace: workspaceDir, force: false, confirm: true, json: false });
|
|
151
|
-
expect(exitSpy).not.toHaveBeenCalled();
|
|
152
|
-
expect(process.exitCode).toBe(1);
|
|
153
|
-
|
|
154
|
-
// File should NOT be overwritten
|
|
155
|
-
const content = fs.readFileSync(getIntentPath(), 'utf8');
|
|
156
|
-
expect(content).toBe('existing content');
|
|
157
|
-
|
|
158
|
-
process.exitCode = undefined;
|
|
159
|
-
exitSpy.mockRestore();
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
it('overwrites when --force and --confirm are set', async () => {
|
|
163
|
-
fs.mkdirSync(path.dirname(getIntentPath()), { recursive: true });
|
|
164
|
-
fs.writeFileSync(getIntentPath(), 'existing content', 'utf8');
|
|
165
|
-
|
|
166
|
-
await handleIntentInit({ workspace: workspaceDir, force: true, confirm: true, json: false });
|
|
167
|
-
|
|
168
|
-
const content = fs.readFileSync(getIntentPath(), 'utf8');
|
|
169
|
-
expect(content).toContain('# INTENT.md');
|
|
170
|
-
expect(content).not.toContain('existing content');
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it('outputs JSON when --json is set with --confirm', async () => {
|
|
174
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
175
|
-
await handleIntentInit({ workspace: workspaceDir, confirm: true, json: true });
|
|
176
|
-
|
|
177
|
-
expect(logSpy).toHaveBeenCalled();
|
|
178
|
-
const jsonOutput = JSON.parse(logSpy.mock.calls[0][0] as string);
|
|
179
|
-
expect(jsonOutput.status).toBe('ok');
|
|
180
|
-
expect(jsonOutput.path).toContain('INTENT.zh-CN.md');
|
|
181
|
-
expect(jsonOutput.overwritten).toBe(false);
|
|
182
|
-
|
|
183
|
-
logSpy.mockRestore();
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
it('creates .principles directory if it does not exist', async () => {
|
|
187
|
-
await handleIntentInit({ workspace: workspaceDir, confirm: true, json: false });
|
|
188
|
-
|
|
189
|
-
const dir = path.join(workspaceDir, '.principles');
|
|
190
|
-
expect(fs.existsSync(dir)).toBe(true);
|
|
191
|
-
expect(fs.existsSync(getIntentPath())).toBe(true);
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
it('emits structured read_error JSON when workspace path is invalid (CLI Gate rule 6)', async () => {
|
|
195
|
-
// resolveWorkspaceDir throws on paths with null bytes or other invalid chars.
|
|
196
|
-
// The error must be caught and emitted as a structured IntentInitOutput,
|
|
197
|
-
// not an uncaught stack trace.
|
|
198
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
199
|
-
process.exitCode = undefined;
|
|
200
|
-
await handleIntentInit({ workspace: 'invalid\0path', confirm: true, json: true });
|
|
201
|
-
|
|
202
|
-
expect(process.exitCode).toBe(1);
|
|
203
|
-
const jsonOutput = JSON.parse(logSpy.mock.calls[0][0] as string) as Record<string, unknown>;
|
|
204
|
-
expect(jsonOutput.status).toBe('read_error');
|
|
205
|
-
expect(jsonOutput.reason).toBeDefined();
|
|
206
|
-
expect(jsonOutput.nextAction).toBeDefined();
|
|
207
|
-
// Must NOT include the ad-hoc `ok` field that the old code emitted
|
|
208
|
-
expect(jsonOutput.ok).toBeUndefined();
|
|
209
|
-
|
|
210
|
-
process.exitCode = undefined;
|
|
211
|
-
logSpy.mockRestore();
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
// ── handleIntentShow ─────────────────────────────────────────────────────────
|
|
216
|
-
|
|
217
|
-
describe('handleIntentShow', () => {
|
|
218
|
-
it('returns flag_disabled when intent_engineering is off', async () => {
|
|
219
|
-
writeConfig(false);
|
|
220
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
221
|
-
|
|
222
|
-
await handleIntentShow({ workspace: workspaceDir, json: true });
|
|
223
|
-
|
|
224
|
-
const jsonOutput = JSON.parse(logSpy.mock.calls[0][0] as string);
|
|
225
|
-
expect(jsonOutput.status).toBe('flag_disabled');
|
|
226
|
-
expect(jsonOutput.flagEnabled).toBe(false);
|
|
227
|
-
expect(jsonOutput.reason).toBe('flag_disabled');
|
|
228
|
-
expect(jsonOutput.nextAction).toBeDefined();
|
|
229
|
-
|
|
230
|
-
logSpy.mockRestore();
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
it('returns not_found when INTENT.md does not exist', async () => {
|
|
234
|
-
writeConfig(true);
|
|
235
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
236
|
-
|
|
237
|
-
await handleIntentShow({ workspace: workspaceDir, json: true });
|
|
238
|
-
|
|
239
|
-
const jsonOutput = JSON.parse(logSpy.mock.calls[0][0] as string);
|
|
240
|
-
expect(jsonOutput.status).toBe('not_found');
|
|
241
|
-
expect(jsonOutput.found).toBe(false);
|
|
242
|
-
expect(jsonOutput.nextAction).toContain('pd intent init');
|
|
243
|
-
|
|
244
|
-
logSpy.mockRestore();
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
it('returns ok with sections and hash for valid INTENT.md', async () => {
|
|
248
|
-
writeConfig(true);
|
|
249
|
-
fs.mkdirSync(path.dirname(getIntentPath()), { recursive: true });
|
|
250
|
-
fs.writeFileSync(getIntentPath(), VALID_INTENT, 'utf8');
|
|
251
|
-
|
|
252
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
253
|
-
|
|
254
|
-
await handleIntentShow({ workspace: workspaceDir, json: true });
|
|
255
|
-
|
|
256
|
-
const jsonOutput = JSON.parse(logSpy.mock.calls[0][0] as string);
|
|
257
|
-
expect(jsonOutput.status).toBe('ok');
|
|
258
|
-
expect(jsonOutput.found).toBe(true);
|
|
259
|
-
expect(jsonOutput.flagEnabled).toBe(true);
|
|
260
|
-
expect(jsonOutput.contentHash).toMatch(/^sha256:/);
|
|
261
|
-
expect(jsonOutput.lastEditedAt).toBeDefined();
|
|
262
|
-
expect(jsonOutput.sections).toBeDefined();
|
|
263
|
-
expect(jsonOutput.sections.why).toContain('correcting Agents');
|
|
264
|
-
expect(jsonOutput.warnings).toEqual([]);
|
|
265
|
-
|
|
266
|
-
logSpy.mockRestore();
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
it('returns oversized for file > 32KB', async () => {
|
|
270
|
-
writeConfig(true);
|
|
271
|
-
fs.mkdirSync(path.dirname(getIntentPath()), { recursive: true });
|
|
272
|
-
const big = '# INTENT.md\n\n## 1. Why\n\n' + 'x'.repeat(33 * 1024) + '\n';
|
|
273
|
-
fs.writeFileSync(getIntentPath(), big, 'utf8');
|
|
274
|
-
|
|
275
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
276
|
-
|
|
277
|
-
await handleIntentShow({ workspace: workspaceDir, json: true });
|
|
278
|
-
|
|
279
|
-
const jsonOutput = JSON.parse(logSpy.mock.calls[0][0] as string);
|
|
280
|
-
expect(jsonOutput.status).toBe('oversized');
|
|
281
|
-
expect(jsonOutput.found).toBe(true);
|
|
282
|
-
expect(jsonOutput.nextAction).toContain('bytes');
|
|
283
|
-
|
|
284
|
-
logSpy.mockRestore();
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
it('emits warnings for partial INTENT.md', async () => {
|
|
288
|
-
writeConfig(true);
|
|
289
|
-
fs.mkdirSync(path.dirname(getIntentPath()), { recursive: true });
|
|
290
|
-
fs.writeFileSync(getIntentPath(), '# INTENT.md\n\n## 1. Why\n\nJust the why section.\n', 'utf8');
|
|
291
|
-
|
|
292
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
293
|
-
|
|
294
|
-
await handleIntentShow({ workspace: workspaceDir, json: true });
|
|
295
|
-
|
|
296
|
-
const jsonOutput = JSON.parse(logSpy.mock.calls[0][0] as string);
|
|
297
|
-
expect(jsonOutput.status).toBe('ok');
|
|
298
|
-
expect(jsonOutput.warnings.length).toBe(4);
|
|
299
|
-
expect(jsonOutput.warnings.every((w: { code: string }) => w.code === 'missing_section')).toBe(true);
|
|
300
|
-
|
|
301
|
-
logSpy.mockRestore();
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
it('outputs text when --json is not set', async () => {
|
|
305
|
-
writeConfig(true);
|
|
306
|
-
fs.mkdirSync(path.dirname(getIntentPath()), { recursive: true });
|
|
307
|
-
fs.writeFileSync(getIntentPath(), VALID_INTENT, 'utf8');
|
|
308
|
-
|
|
309
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
310
|
-
|
|
311
|
-
await handleIntentShow({ workspace: workspaceDir, json: false });
|
|
312
|
-
|
|
313
|
-
const textOutput = logSpy.mock.calls[0][0] as string;
|
|
314
|
-
expect(textOutput).toContain('INTENT.zh-CN.md');
|
|
315
|
-
expect(textOutput).toContain('Content hash:');
|
|
316
|
-
expect(textOutput).toContain('Last edited:');
|
|
317
|
-
expect(textOutput).toContain('## 1. Why');
|
|
318
|
-
|
|
319
|
-
logSpy.mockRestore();
|
|
320
|
-
});
|
|
321
|
-
});
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for pd legacy cleanup command.
|
|
3
|
-
*
|
|
4
|
-
* Covers:
|
|
5
|
-
* - Relative workspace root works (regression: canonical containment)
|
|
6
|
-
* - Traversal escape rejected
|
|
7
|
-
* - Filesystem root rejected
|
|
8
|
-
* - Dry-run default with no artifacts found
|
|
9
|
-
* - Apply mode with legacy targets
|
|
10
|
-
* - V1 artifact identification
|
|
11
|
-
*/
|
|
12
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
13
|
-
import * as fs from 'fs';
|
|
14
|
-
import * as path from 'path';
|
|
15
|
-
import os from 'os';
|
|
16
|
-
import {
|
|
17
|
-
handleLegacyCleanup,
|
|
18
|
-
isV1ArtificerArtifact,
|
|
19
|
-
} from '../../src/commands/legacy-cleanup.js';
|
|
20
|
-
|
|
21
|
-
// ── Pure logic: V1 artifact identification ─────────────────────────────────
|
|
22
|
-
|
|
23
|
-
describe('isV1ArtificerArtifact', () => {
|
|
24
|
-
it('returns false for V2 artifact (non-empty implementationCode)', () => {
|
|
25
|
-
const v2 = JSON.stringify({ id: 'a', implementationCode: 'code here', plan: 'plan' });
|
|
26
|
-
expect(isV1ArtificerArtifact(v2)).toBe(false);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('returns true for V1 artifact (plan-only, no implementationCode)', () => {
|
|
30
|
-
const v1 = JSON.stringify({ id: 'b', plan: 'plan only', implementationCode: '' });
|
|
31
|
-
expect(isV1ArtificerArtifact(v1)).toBe(true);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('returns false for invalid JSON', () => {
|
|
35
|
-
expect(isV1ArtificerArtifact('{not json')).toBe(false);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('returns false for non-object JSON', () => {
|
|
39
|
-
expect(isV1ArtificerArtifact('"string"')).toBe(false);
|
|
40
|
-
expect(isV1ArtificerArtifact('42')).toBe(false);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('returns false for null JSON', () => {
|
|
44
|
-
expect(isV1ArtificerArtifact('null')).toBe(false);
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// ── Integration: relative workspace + boundary validation ─────────────────
|
|
49
|
-
|
|
50
|
-
describe('legacy cleanup workspace boundary', () => {
|
|
51
|
-
it('accepts a relative workspace root (regression: canonical containment)', async () => {
|
|
52
|
-
// A relative workspace must canonicalize consistently so cleanup scans
|
|
53
|
-
// inside it, without the old startsWith-on-relative-root failure.
|
|
54
|
-
const relTmp = fs.mkdtempSync(path.join(process.cwd(), '.tmp-rel-cleanup-'));
|
|
55
|
-
try {
|
|
56
|
-
// Create a legacy artifact the scanner looks for
|
|
57
|
-
const stateDir = path.join(relTmp, '.state');
|
|
58
|
-
fs.mkdirSync(stateDir, { recursive: true });
|
|
59
|
-
const legacyDb = path.join(stateDir, 'sessions.db');
|
|
60
|
-
fs.writeFileSync(legacyDb, 'not a real db', 'utf8');
|
|
61
|
-
|
|
62
|
-
const relWorkspace = path.relative(process.cwd(), relTmp);
|
|
63
|
-
expect(path.isAbsolute(relWorkspace)).toBe(false);
|
|
64
|
-
|
|
65
|
-
const result = await handleLegacyCleanup({
|
|
66
|
-
workspacePath: relWorkspace,
|
|
67
|
-
dryRun: true,
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
expect(result.status).toBe('ok');
|
|
71
|
-
expect(result.mode).toBe('dry-run');
|
|
72
|
-
} finally {
|
|
73
|
-
fs.rmSync(relTmp, { recursive: true, force: true });
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('rejects parent traversal escape', async () => {
|
|
78
|
-
await expect(
|
|
79
|
-
handleLegacyCleanup({ workspacePath: '../evil', dryRun: true }),
|
|
80
|
-
).rejects.toThrow(/parent traversal/);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it('rejects empty workspace', async () => {
|
|
84
|
-
await expect(
|
|
85
|
-
handleLegacyCleanup({ workspacePath: '', dryRun: true }),
|
|
86
|
-
).rejects.toThrow(/path is empty/);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it('rejects filesystem root', async () => {
|
|
90
|
-
await expect(
|
|
91
|
-
handleLegacyCleanup({ workspacePath: path.parse(process.cwd()).root, dryRun: true }),
|
|
92
|
-
).rejects.toThrow(/filesystem root/);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
// ── Integration: normal cleanup flow ───────────────────────────────────────
|
|
97
|
-
|
|
98
|
-
describe('legacy cleanup flow', () => {
|
|
99
|
-
let tmpDir: string;
|
|
100
|
-
|
|
101
|
-
beforeEach(() => {
|
|
102
|
-
// mkdtempSync: CodeQL-safe random directory under os.tmpdir
|
|
103
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-test-cleanup-'));
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
afterEach(() => {
|
|
107
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it('dry-run with no artifacts returns ok with zero targets', async () => {
|
|
111
|
-
const result = await handleLegacyCleanup({ workspacePath: tmpDir, dryRun: true });
|
|
112
|
-
expect(result.status).toBe('ok');
|
|
113
|
-
expect(result.mode).toBe('dry-run');
|
|
114
|
-
expect(result.fileTargets).toEqual([]);
|
|
115
|
-
expect(result.errors).toEqual([]);
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
it('scans legacy session files under .state/sessions', async () => {
|
|
119
|
-
const sessionsDir = path.join(tmpDir, '.state', 'sessions');
|
|
120
|
-
fs.mkdirSync(sessionsDir, { recursive: true });
|
|
121
|
-
fs.writeFileSync(
|
|
122
|
-
path.join(sessionsDir, 'old-session.json'),
|
|
123
|
-
JSON.stringify({ sessionKey: 'cron:pd-empathy-optimizer-abc' }),
|
|
124
|
-
'utf8',
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
const result = await handleLegacyCleanup({ workspacePath: tmpDir, dryRun: true });
|
|
128
|
-
expect(result.status).toBe('ok');
|
|
129
|
-
expect(result.fileTargets.length).toBeGreaterThanOrEqual(1);
|
|
130
|
-
expect(result.fileTargets.some((t) => t.path.endsWith('old-session.json'))).toBe(true);
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it('apply mode deletes legacy session files', async () => {
|
|
134
|
-
const sessionsDir = path.join(tmpDir, '.state', 'sessions');
|
|
135
|
-
fs.mkdirSync(sessionsDir, { recursive: true });
|
|
136
|
-
const legacyFile = path.join(sessionsDir, 'old-session.json');
|
|
137
|
-
fs.writeFileSync(
|
|
138
|
-
legacyFile,
|
|
139
|
-
JSON.stringify({ sessionKey: 'cron:pd-empathy-optimizer-abc' }),
|
|
140
|
-
'utf8',
|
|
141
|
-
);
|
|
142
|
-
|
|
143
|
-
const result = await handleLegacyCleanup({ workspacePath: tmpDir, apply: true });
|
|
144
|
-
expect(result.status).toBe('ok');
|
|
145
|
-
expect(result.mode).toBe('apply');
|
|
146
|
-
expect(fs.existsSync(legacyFile)).toBe(false);
|
|
147
|
-
});
|
|
148
|
-
});
|