@productbrain/cli 0.1.0-beta.11282 → 0.1.0-beta.11288
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/README.md +3 -2
- package/dist/__tests__/cli-error-once.test.d.ts +2 -0
- package/dist/__tests__/cli-error-once.test.d.ts.map +1 -0
- package/dist/__tests__/cli-error-once.test.js +51 -0
- package/dist/__tests__/cli-error-once.test.js.map +1 -0
- package/dist/__tests__/init.test.d.ts +2 -1
- package/dist/__tests__/init.test.d.ts.map +1 -1
- package/dist/__tests__/init.test.js +110 -8
- package/dist/__tests__/init.test.js.map +1 -1
- package/dist/__tests__/removed-commands.test.js +31 -2
- package/dist/__tests__/removed-commands.test.js.map +1 -1
- package/dist/commands/connect-integration.test.js +1 -5
- package/dist/commands/connect-integration.test.js.map +1 -1
- package/dist/commands/connect-legacy-migration.test.js +0 -1
- package/dist/commands/connect-legacy-migration.test.js.map +1 -1
- package/dist/commands/connect-screens.d.ts +9 -13
- package/dist/commands/connect-screens.d.ts.map +1 -1
- package/dist/commands/connect-screens.js +16 -78
- package/dist/commands/connect-screens.js.map +1 -1
- package/dist/commands/connect-screens.test.d.ts +2 -0
- package/dist/commands/connect-screens.test.d.ts.map +1 -0
- package/dist/commands/connect-screens.test.js +18 -0
- package/dist/commands/connect-screens.test.js.map +1 -0
- package/dist/commands/connect.js +5 -5
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connect.test.js +0 -4
- package/dist/commands/connect.test.js.map +1 -1
- package/dist/commands/init.d.ts +14 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +90 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/handleCliError.d.ts +17 -0
- package/dist/handleCliError.d.ts.map +1 -1
- package/dist/handleCliError.js +14 -3
- package/dist/handleCliError.js.map +1 -1
- package/dist/index.js +7 -29
- package/dist/index.js.map +1 -1
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +1 -2
- package/dist/lib/client.js.map +1 -1
- package/package.json +1 -2
- package/dist/__tests__/handshake-augment.test.d.ts +0 -2
- package/dist/__tests__/handshake-augment.test.d.ts.map +0 -1
- package/dist/__tests__/handshake-augment.test.js +0 -407
- package/dist/__tests__/handshake-augment.test.js.map +0 -1
- package/dist/__tests__/handshake-dormancy.test.d.ts +0 -2
- package/dist/__tests__/handshake-dormancy.test.d.ts.map +0 -1
- package/dist/__tests__/handshake-dormancy.test.js +0 -24
- package/dist/__tests__/handshake-dormancy.test.js.map +0 -1
- package/dist/__tests__/handshake-formatter.test.d.ts +0 -2
- package/dist/__tests__/handshake-formatter.test.d.ts.map +0 -1
- package/dist/__tests__/handshake-formatter.test.js +0 -111
- package/dist/__tests__/handshake-formatter.test.js.map +0 -1
- package/dist/__tests__/handshake-preview.test.d.ts +0 -2
- package/dist/__tests__/handshake-preview.test.d.ts.map +0 -1
- package/dist/__tests__/handshake-preview.test.js +0 -500
- package/dist/__tests__/handshake-preview.test.js.map +0 -1
- package/dist/__tests__/handshake-session-threading.test.d.ts +0 -2
- package/dist/__tests__/handshake-session-threading.test.d.ts.map +0 -1
- package/dist/__tests__/handshake-session-threading.test.js +0 -185
- package/dist/__tests__/handshake-session-threading.test.js.map +0 -1
- package/dist/__tests__/handshake.e2e.test.d.ts +0 -2
- package/dist/__tests__/handshake.e2e.test.d.ts.map +0 -1
- package/dist/__tests__/handshake.e2e.test.js +0 -226
- package/dist/__tests__/handshake.e2e.test.js.map +0 -1
- package/dist/__tests__/handshake.test.d.ts +0 -2
- package/dist/__tests__/handshake.test.d.ts.map +0 -1
- package/dist/__tests__/handshake.test.js +0 -1040
- package/dist/__tests__/handshake.test.js.map +0 -1
- package/dist/__tests__/method-registry.integration.test.d.ts +0 -6
- package/dist/__tests__/method-registry.integration.test.d.ts.map +0 -1
- package/dist/__tests__/method-registry.integration.test.js +0 -17
- package/dist/__tests__/method-registry.integration.test.js.map +0 -1
- package/dist/__tests__/method-registry.test.d.ts +0 -12
- package/dist/__tests__/method-registry.test.d.ts.map +0 -1
- package/dist/__tests__/method-registry.test.js +0 -86
- package/dist/__tests__/method-registry.test.js.map +0 -1
- package/dist/commands/connect-context.d.ts +0 -55
- package/dist/commands/connect-context.d.ts.map +0 -1
- package/dist/commands/connect-context.js +0 -78
- package/dist/commands/connect-context.js.map +0 -1
- package/dist/commands/connect-context.test.d.ts +0 -2
- package/dist/commands/connect-context.test.d.ts.map +0 -1
- package/dist/commands/connect-context.test.js +0 -148
- package/dist/commands/connect-context.test.js.map +0 -1
- package/dist/commands/handshake.d.ts +0 -78
- package/dist/commands/handshake.d.ts.map +0 -1
- package/dist/commands/handshake.js +0 -1359
- package/dist/commands/handshake.js.map +0 -1
- package/dist/lib/method-registry.d.ts +0 -37
- package/dist/lib/method-registry.d.ts.map +0 -1
- package/dist/lib/method-registry.js +0 -41
- package/dist/lib/method-registry.js.map +0 -1
- package/templates/general/code-integrity.md +0 -11
- package/templates/general/getting-started.md +0 -12
- package/templates/method-registry.json +0 -16
- package/templates/node-ts/code-integrity.md +0 -13
- package/templates/node-ts/testing.md +0 -12
- package/templates/python/code-integrity.md +0 -13
- package/templates/python/testing.md +0 -12
|
@@ -1,407 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TEN-2155 — loop-level integration tests for the handshake region-augmentation feature.
|
|
3
|
-
*
|
|
4
|
-
* Drives `runHandshake({ apply: true })` against real temp dirs (real fs, real symlinks,
|
|
5
|
-
* real realpathSync) and asserts on-disk bytes + the returned report.
|
|
6
|
-
*
|
|
7
|
-
* Harness approach: mirrors the WP-426 E3 round-trip block in handshake.e2e.test.ts.
|
|
8
|
-
* vi.doMock() chains stub every kernel/network/generator call; `../generators/region.js`
|
|
9
|
-
* and `../generators/region-projections.js` are intentionally NOT mocked so the real
|
|
10
|
-
* augment mechanism is exercised. `runHandshake` is imported dynamically AFTER the mocks.
|
|
11
|
-
*/
|
|
12
|
-
import { mkdtempSync, writeFileSync, readFileSync, existsSync, rmSync, mkdirSync, symlinkSync, } from 'fs';
|
|
13
|
-
import { tmpdir } from 'os';
|
|
14
|
-
import { join } from 'path';
|
|
15
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
16
|
-
import { REGION_START, REGION_END, REGION_OPT_OUT } from '../generators/region.js';
|
|
17
|
-
// ── Shared mock wiring (replicates WP-426 E3 beforeEach block exactly) ────────
|
|
18
|
-
let augE2eRoot;
|
|
19
|
-
let augCwdSpy;
|
|
20
|
-
/** Set up a fresh tempdir + all kernel/generator stubs, then point cwd there. */
|
|
21
|
-
async function setupAugmentMocks(manifestYaml) {
|
|
22
|
-
vi.resetModules();
|
|
23
|
-
augE2eRoot = mkdtempSync(join(tmpdir(), 'pb-ten2155-augment-'));
|
|
24
|
-
mkdirSync(join(augE2eRoot, '.productbrain'), { recursive: true });
|
|
25
|
-
writeFileSync(join(augE2eRoot, '.productbrain', 'manifest.yaml'), manifestYaml);
|
|
26
|
-
augCwdSpy = vi.spyOn(process, 'cwd').mockReturnValue(augE2eRoot);
|
|
27
|
-
// Silence stdout/stderr — the full handshake writes formatting noise we don't care about.
|
|
28
|
-
vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
29
|
-
vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
30
|
-
// ── Kernel: no active/dormant assets; just enough to let the loop complete ──
|
|
31
|
-
vi.doMock('../lib/client.js', () => ({
|
|
32
|
-
kernelCall: vi.fn().mockImplementation(async (tool) => {
|
|
33
|
-
if (tool === 'chain.workspaceReadiness')
|
|
34
|
-
return null;
|
|
35
|
-
if (tool === 'chain.getOrientView')
|
|
36
|
-
return null;
|
|
37
|
-
if (tool === 'chain.searchEntries')
|
|
38
|
-
return [];
|
|
39
|
-
if (tool === 'setup.listAssetsForUser') {
|
|
40
|
-
return { activeAssets: [], dormantAssets: [], hasAnyReceipt: true };
|
|
41
|
-
}
|
|
42
|
-
if (tool === 'setup.updateLastProjectedHash')
|
|
43
|
-
return { ok: true };
|
|
44
|
-
if (tool === 'setup.getCurrentSetupState')
|
|
45
|
-
return { effectiveMode: 'project' };
|
|
46
|
-
if (tool === 'setup.materializeSetup')
|
|
47
|
-
return { ok: true, assetCount: 0, receiptWritten: true };
|
|
48
|
-
return null;
|
|
49
|
-
}),
|
|
50
|
-
kernelCallWithSession: vi.fn().mockResolvedValue(null),
|
|
51
|
-
}));
|
|
52
|
-
vi.doMock('../lib/config.js', () => ({
|
|
53
|
-
getConfigOrGuide: vi.fn().mockResolvedValue({
|
|
54
|
-
apiKey: 'pb_sk_augment_test',
|
|
55
|
-
siteUrl: 'https://test.convex.site',
|
|
56
|
-
}),
|
|
57
|
-
}));
|
|
58
|
-
vi.doMock('../lib/repo-detect.js', () => ({
|
|
59
|
-
detectRepo: vi.fn().mockReturnValue({ name: 'augment-test-repo', detectedStack: [], repoSlug: null }),
|
|
60
|
-
extractWorkspaceProfile: vi.fn().mockReturnValue(null),
|
|
61
|
-
}));
|
|
62
|
-
// ── Adapter generators: ABSENT file falls through to this whole-file content.
|
|
63
|
-
// Contains MARKER so a future classifyAdapterFile call sees 'pb-managed'.
|
|
64
|
-
// Case (b) regression guard: the string must contain 'auto-generated by pb handshake'.
|
|
65
|
-
vi.doMock('../generators/adapters.js', () => ({
|
|
66
|
-
MARKER: 'auto-generated by pb handshake',
|
|
67
|
-
CLAUDE_BRIEFING_POINTER: 'Your workspace briefing is served by `pb session start`.',
|
|
68
|
-
generateAgentsMd: vi.fn().mockReturnValue('<!-- auto-generated by pb handshake -->\nagents'),
|
|
69
|
-
generateClaudeMd: vi.fn().mockReturnValue('<!-- auto-generated by pb handshake -->\nclaude'),
|
|
70
|
-
generateCursorMdc: vi.fn().mockReturnValue('<!-- auto-generated by pb handshake -->\ncursor'),
|
|
71
|
-
generateCopilotMd: vi.fn().mockReturnValue('<!-- auto-generated by pb handshake -->\ncopilot'),
|
|
72
|
-
generateCopilotInstructionFiles: vi.fn().mockReturnValue([]),
|
|
73
|
-
}));
|
|
74
|
-
vi.doMock('../generators/portable-knowledge.js', () => ({
|
|
75
|
-
readCanonicalSkills: vi.fn().mockReturnValue([]),
|
|
76
|
-
readCanonicalRules: vi.fn().mockReturnValue([]),
|
|
77
|
-
readPersonalLayer: vi.fn().mockReturnValue([]),
|
|
78
|
-
readPersonalSkillsLayer: vi.fn().mockReturnValue([]),
|
|
79
|
-
generateCursorSkill: vi.fn().mockReturnValue(''),
|
|
80
|
-
generateCursorRule: vi.fn().mockReturnValue(''),
|
|
81
|
-
generateCodexSkill: vi.fn().mockReturnValue(''),
|
|
82
|
-
generateCodexSkillIndex: vi.fn().mockReturnValue(''),
|
|
83
|
-
shouldEmitToTarget: vi.fn().mockReturnValue(false),
|
|
84
|
-
filterByLevel: vi.fn().mockImplementation((items) => items),
|
|
85
|
-
evaluateConditions: vi.fn().mockReturnValue({ included: true, reasons: [] }),
|
|
86
|
-
validateCodexSkills: vi.fn().mockReturnValue([]),
|
|
87
|
-
}));
|
|
88
|
-
vi.doMock('../generators/briefing-md.js', () => ({
|
|
89
|
-
generateBriefingMd: vi.fn().mockReturnValue('briefing content'),
|
|
90
|
-
}));
|
|
91
|
-
vi.doMock('../generators/context-md.js', () => ({
|
|
92
|
-
generateContextMd: vi.fn().mockReturnValue('context content'),
|
|
93
|
-
}));
|
|
94
|
-
vi.doMock('../generators/everyone-rules-md.js', () => ({
|
|
95
|
-
generateEveryoneRulesMd: vi.fn().mockReturnValue('everyone rules content'),
|
|
96
|
-
}));
|
|
97
|
-
vi.doMock('../generators/surface-profiles.js', () => ({
|
|
98
|
-
resolveSurfaceProfile: vi.fn().mockReturnValue({ level: 'intermediate' }),
|
|
99
|
-
}));
|
|
100
|
-
vi.doMock('../generators/boundary-manifest.js', () => ({
|
|
101
|
-
generateBoundaryManifest: vi.fn().mockReturnValue(null),
|
|
102
|
-
getBoundaryEnforcementMode: vi.fn().mockReturnValue('advisory'),
|
|
103
|
-
}));
|
|
104
|
-
vi.doMock('../formatters/handshake.js', () => ({
|
|
105
|
-
formatHandshakeReport: vi.fn().mockReturnValue(''),
|
|
106
|
-
}));
|
|
107
|
-
vi.doMock('../lib/hook-intents.js', () => ({
|
|
108
|
-
composeHooksFromIntents: vi.fn().mockReturnValue({}),
|
|
109
|
-
getHookStatusForSurface: vi.fn().mockReturnValue([]),
|
|
110
|
-
}));
|
|
111
|
-
vi.doMock('../lib/method-registry.js', () => ({
|
|
112
|
-
loadMethodRegistry: vi.fn().mockResolvedValue({ methods: [], source: 'bundled', stale: false }),
|
|
113
|
-
}));
|
|
114
|
-
vi.doMock('../lib/workspaceVocabCache.js', () => ({
|
|
115
|
-
getOrFetchVocabCtx: vi.fn().mockResolvedValue(null),
|
|
116
|
-
}));
|
|
117
|
-
vi.doMock('../lib/telemetry.js', () => ({
|
|
118
|
-
trackEvent: vi.fn(),
|
|
119
|
-
}));
|
|
120
|
-
vi.doMock('../lib/session.js', () => ({
|
|
121
|
-
readSession: vi.fn().mockReturnValue(null),
|
|
122
|
-
}));
|
|
123
|
-
// replaceVocabTokens as identity — region content passes through intact.
|
|
124
|
-
vi.doMock('../lib/canonicalRefs.js', () => ({
|
|
125
|
-
parseSemanticRefs: vi.fn().mockReturnValue([]),
|
|
126
|
-
replaceVocabTokens: vi.fn().mockImplementation((content) => content),
|
|
127
|
-
}));
|
|
128
|
-
vi.doMock('../surfaces/telemetry.js', () => ({
|
|
129
|
-
getReverseMapFallbackMessage: vi.fn().mockReturnValue(''),
|
|
130
|
-
reportReverseMapMissing: vi.fn(),
|
|
131
|
-
}));
|
|
132
|
-
}
|
|
133
|
-
/** Manifest for materialize: project + both claude + codex surfaces. */
|
|
134
|
-
const PROJECT_MANIFEST = [
|
|
135
|
-
'version: "0.1"',
|
|
136
|
-
'materialize: project',
|
|
137
|
-
'surfaces:',
|
|
138
|
-
' - .claude',
|
|
139
|
-
' - .codex',
|
|
140
|
-
' - .cursor',
|
|
141
|
-
'',
|
|
142
|
-
].join('\n');
|
|
143
|
-
/** Manifest without materialize (defaults to observe) + both claude + codex surfaces. */
|
|
144
|
-
const OBSERVE_MANIFEST = [
|
|
145
|
-
'version: "0.1"',
|
|
146
|
-
'surfaces:',
|
|
147
|
-
' - .claude',
|
|
148
|
-
' - .codex',
|
|
149
|
-
' - .cursor',
|
|
150
|
-
'',
|
|
151
|
-
].join('\n');
|
|
152
|
-
/** Manifest for materialize: project + codex only (no claude surface). */
|
|
153
|
-
const CODEX_ONLY_MANIFEST = [
|
|
154
|
-
'version: "0.1"',
|
|
155
|
-
'materialize: project',
|
|
156
|
-
'surfaces:',
|
|
157
|
-
' - .codex',
|
|
158
|
-
' - .cursor',
|
|
159
|
-
'',
|
|
160
|
-
].join('\n');
|
|
161
|
-
/** Manifest for materialize: project + claude only (no codex surface). */
|
|
162
|
-
const CLAUDE_ONLY_MANIFEST = [
|
|
163
|
-
'version: "0.1"',
|
|
164
|
-
'materialize: project',
|
|
165
|
-
'surfaces:',
|
|
166
|
-
' - .claude',
|
|
167
|
-
' - .cursor',
|
|
168
|
-
'',
|
|
169
|
-
].join('\n');
|
|
170
|
-
/** Drive a single runHandshake call after all mocks are set. Always applies. */
|
|
171
|
-
async function run(opts = {}) {
|
|
172
|
-
const { runHandshake } = await import('../commands/handshake.js');
|
|
173
|
-
return runHandshake({ apply: true, noPrompt: true, ...opts });
|
|
174
|
-
}
|
|
175
|
-
// ── Test suite ────────────────────────────────────────────────────────────────
|
|
176
|
-
describe('TEN-2155: region augmentation integration matrix', () => {
|
|
177
|
-
// Each test gets its own tempdir + fresh mocks.
|
|
178
|
-
beforeEach(() => {
|
|
179
|
-
// Intentionally empty — setupAugmentMocks() is called inside each test
|
|
180
|
-
// because the manifest content varies per test.
|
|
181
|
-
});
|
|
182
|
-
afterEach(() => {
|
|
183
|
-
augCwdSpy?.mockRestore();
|
|
184
|
-
if (augE2eRoot && existsSync(augE2eRoot)) {
|
|
185
|
-
rmSync(augE2eRoot, { recursive: true, force: true });
|
|
186
|
-
}
|
|
187
|
-
vi.restoreAllMocks();
|
|
188
|
-
});
|
|
189
|
-
// ── (a) user-owned CLAUDE.md → region appended, user bytes preserved ────────
|
|
190
|
-
it('(a) user-owned CLAUDE.md → region appended, user bytes preserved', async () => {
|
|
191
|
-
await setupAugmentMocks(PROJECT_MANIFEST);
|
|
192
|
-
const claudePath = join(augE2eRoot, 'CLAUDE.md');
|
|
193
|
-
const userBody = '# Acme rules\n\nUse pnpm. Validate with zod.\n';
|
|
194
|
-
writeFileSync(claudePath, userBody);
|
|
195
|
-
await run();
|
|
196
|
-
const after = readFileSync(claudePath, 'utf8');
|
|
197
|
-
expect(after.startsWith(userBody), 'user bytes must be at the start').toBe(true);
|
|
198
|
-
expect(after.includes(REGION_START), 'must contain REGION_START').toBe(true);
|
|
199
|
-
expect(after.includes(REGION_END), 'must contain REGION_END').toBe(true);
|
|
200
|
-
});
|
|
201
|
-
// ── (a) re-run idempotent ───────────────────────────────────────────────────
|
|
202
|
-
it('(a) re-run idempotent — second apply is byte-identical to first', async () => {
|
|
203
|
-
await setupAugmentMocks(PROJECT_MANIFEST);
|
|
204
|
-
const claudePath = join(augE2eRoot, 'CLAUDE.md');
|
|
205
|
-
writeFileSync(claudePath, '# mine\n');
|
|
206
|
-
// First apply
|
|
207
|
-
await run();
|
|
208
|
-
const firstRead = readFileSync(claudePath, 'utf8');
|
|
209
|
-
// Reset modules + mocks for the second apply to simulate a fresh CLI invocation.
|
|
210
|
-
vi.restoreAllMocks();
|
|
211
|
-
augCwdSpy?.mockRestore();
|
|
212
|
-
await setupAugmentMocks(PROJECT_MANIFEST);
|
|
213
|
-
// Second apply
|
|
214
|
-
await run();
|
|
215
|
-
const secondRead = readFileSync(claudePath, 'utf8');
|
|
216
|
-
expect(secondRead, 'second apply must be byte-identical to first').toBe(firstRead);
|
|
217
|
-
});
|
|
218
|
-
// ── (b) absent file → whole-file PB-owned (regression guard) ───────────────
|
|
219
|
-
it('(b) absent CLAUDE.md → whole-file PB-owned content, no REGION_START', async () => {
|
|
220
|
-
await setupAugmentMocks(PROJECT_MANIFEST);
|
|
221
|
-
const claudePath = join(augE2eRoot, 'CLAUDE.md');
|
|
222
|
-
expect(existsSync(claudePath), 'CLAUDE.md must not exist before run').toBe(false);
|
|
223
|
-
await run();
|
|
224
|
-
expect(existsSync(claudePath), 'CLAUDE.md must be created').toBe(true);
|
|
225
|
-
const content = readFileSync(claudePath, 'utf8');
|
|
226
|
-
expect(content.includes('auto-generated by pb handshake'), 'must contain whole-file MARKER').toBe(true);
|
|
227
|
-
expect(content.includes(REGION_START), 'REGION_START must NOT be present in whole-file PB-owned write').toBe(false);
|
|
228
|
-
});
|
|
229
|
-
// ── user edit OUTSIDE region survives a re-run ─────────────────────────────
|
|
230
|
-
it('user edit OUTSIDE region survives a re-run', async () => {
|
|
231
|
-
await setupAugmentMocks(PROJECT_MANIFEST);
|
|
232
|
-
const claudePath = join(augE2eRoot, 'CLAUDE.md');
|
|
233
|
-
writeFileSync(claudePath, '# mine\n');
|
|
234
|
-
// First apply
|
|
235
|
-
await run();
|
|
236
|
-
const afterFirst = readFileSync(claudePath, 'utf8');
|
|
237
|
-
// Insert a user line above the region (i.e. before REGION_START)
|
|
238
|
-
const regionStartIdx = afterFirst.indexOf(REGION_START);
|
|
239
|
-
const withUserEdit = afterFirst.slice(0, regionStartIdx) +
|
|
240
|
-
'## User added section\n\nDo not delete this.\n\n' +
|
|
241
|
-
afterFirst.slice(regionStartIdx);
|
|
242
|
-
writeFileSync(claudePath, withUserEdit);
|
|
243
|
-
// Reset modules + mocks for the second apply
|
|
244
|
-
vi.restoreAllMocks();
|
|
245
|
-
augCwdSpy?.mockRestore();
|
|
246
|
-
await setupAugmentMocks(PROJECT_MANIFEST);
|
|
247
|
-
// Second apply
|
|
248
|
-
await run();
|
|
249
|
-
const afterSecond = readFileSync(claudePath, 'utf8');
|
|
250
|
-
expect(afterSecond.includes('User added section'), 'user edit outside region must survive').toBe(true);
|
|
251
|
-
expect(afterSecond.includes('Do not delete this.'), 'user content must survive').toBe(true);
|
|
252
|
-
});
|
|
253
|
-
// ── malformed region → file untouched + headless apply refuses ──────────────
|
|
254
|
-
it('malformed region → file untouched + headless apply throws /malformed/i', async () => {
|
|
255
|
-
await setupAugmentMocks(PROJECT_MANIFEST);
|
|
256
|
-
const claudePath = join(augE2eRoot, 'CLAUDE.md');
|
|
257
|
-
// Start sentinel without matching end sentinel → malformed
|
|
258
|
-
const malformedContent = `# mine\n${REGION_START}\n(no end sentinel)\n`;
|
|
259
|
-
writeFileSync(claudePath, malformedContent);
|
|
260
|
-
await expect(run()).rejects.toThrow(/malformed/i);
|
|
261
|
-
// File must be completely untouched
|
|
262
|
-
const afterContent = readFileSync(claudePath, 'utf8');
|
|
263
|
-
expect(afterContent, 'malformed file must not be touched').toBe(malformedContent);
|
|
264
|
-
});
|
|
265
|
-
// ── opt-out sentinel → declines augmentation, left untouched ───────────────
|
|
266
|
-
// Governance regression guard (TEN-2155): a file carrying pb:no-augment (e.g. this repo's own
|
|
267
|
-
// committed CLAUDE.md/AGENTS.md constitution) must NEVER be spliced — pre-fix it classified
|
|
268
|
-
// 'augmentable' and got a region. Routes to the legacy user-owned skip instead.
|
|
269
|
-
it('pb:no-augment file → not augmented, left byte-identical, reported user-owned', async () => {
|
|
270
|
-
await setupAugmentMocks(PROJECT_MANIFEST);
|
|
271
|
-
const claudePath = join(augE2eRoot, 'CLAUDE.md');
|
|
272
|
-
const optOutBody = `${REGION_OPT_OUT}\n# Acme constitution\n\nHand-maintained. Do not touch.\n`;
|
|
273
|
-
writeFileSync(claudePath, optOutBody);
|
|
274
|
-
const report = await run();
|
|
275
|
-
const after = readFileSync(claudePath, 'utf8');
|
|
276
|
-
expect(after, 'opt-out file must be byte-identical').toBe(optOutBody);
|
|
277
|
-
expect(after.includes(REGION_START), 'no PB region may be spliced into an opt-out file').toBe(false);
|
|
278
|
-
// Reported as user-owned (left untouched), never written.
|
|
279
|
-
expect(report?.filesWritten ?? [], 'filesWritten must not include CLAUDE.md').not.toContain('CLAUDE.md');
|
|
280
|
-
const claudeSkip = (report?.filesSkipped ?? []).find((s) => s.path === 'CLAUDE.md');
|
|
281
|
-
expect(claudeSkip?.reason, 'skip reason must mark it user-owned').toMatch(/user-owned/);
|
|
282
|
-
});
|
|
283
|
-
// ── opt-out file in preview mode → still left untouched, never planned to augment ──
|
|
284
|
-
it('pb:no-augment file in preview mode → byte-identical, no region planned', async () => {
|
|
285
|
-
await setupAugmentMocks(PROJECT_MANIFEST);
|
|
286
|
-
const claudePath = join(augE2eRoot, 'CLAUDE.md');
|
|
287
|
-
const optOutBody = `${REGION_OPT_OUT}\n# Acme constitution\n`;
|
|
288
|
-
writeFileSync(claudePath, optOutBody);
|
|
289
|
-
// apply:false → preview = true (no writes at all).
|
|
290
|
-
await run({ apply: false });
|
|
291
|
-
const after = readFileSync(claudePath, 'utf8');
|
|
292
|
-
expect(after, 'opt-out file must be byte-identical in preview').toBe(optOutBody);
|
|
293
|
-
expect(after.includes(REGION_START), 'no PB region may be added to an opt-out file in preview').toBe(false);
|
|
294
|
-
});
|
|
295
|
-
// ── observe + malformed + headless apply → STILL refuses (refusal is applyMode-gated) ──
|
|
296
|
-
// Regression guard for the writeMode→applyMode fix (TEN-2155): a malformed region is a user-file
|
|
297
|
-
// integrity fault. Under materialize: observe the augment branch won't WRITE, but the headless
|
|
298
|
-
// refusal must still fire (STD-263 invariant vi — "headless → non-zero refusal", unqualified).
|
|
299
|
-
// Pre-fix the writeMode guard suppressed this throw under observe/off and exited 0.
|
|
300
|
-
it('observe mode + malformed region + headless apply → still refuses (authority does not suppress it)', async () => {
|
|
301
|
-
await setupAugmentMocks(OBSERVE_MANIFEST);
|
|
302
|
-
const claudePath = join(augE2eRoot, 'CLAUDE.md');
|
|
303
|
-
const malformedContent = `# mine\n${REGION_START}\n(no end sentinel)\n`;
|
|
304
|
-
writeFileSync(claudePath, malformedContent);
|
|
305
|
-
await expect(run()).rejects.toThrow(/malformed/i);
|
|
306
|
-
const afterContent = readFileSync(claudePath, 'utf8');
|
|
307
|
-
expect(afterContent, 'malformed file must remain untouched in observe mode too').toBe(malformedContent);
|
|
308
|
-
});
|
|
309
|
-
// ── materialize observe → NO write + reported preview-only ─────────────────
|
|
310
|
-
it('materialize observe → no write AND filesSkipped contains CLAUDE.md with preview-only reason', async () => {
|
|
311
|
-
await setupAugmentMocks(OBSERVE_MANIFEST);
|
|
312
|
-
const claudePath = join(augE2eRoot, 'CLAUDE.md');
|
|
313
|
-
const userContent = '# mine\n';
|
|
314
|
-
writeFileSync(claudePath, userContent);
|
|
315
|
-
const report = await run();
|
|
316
|
-
expect(report).toBeDefined();
|
|
317
|
-
// File must not have been modified
|
|
318
|
-
const after = readFileSync(claudePath, 'utf8');
|
|
319
|
-
expect(after, 'CLAUDE.md must be unchanged in observe mode').toBe(userContent);
|
|
320
|
-
// Report must NOT list CLAUDE.md as written
|
|
321
|
-
expect(report?.filesWritten ?? [], 'filesWritten must not include CLAUDE.md').not.toContain('CLAUDE.md');
|
|
322
|
-
// Report must list a CLAUDE.md skip with a preview-only reason
|
|
323
|
-
const claudeSkip = (report?.filesSkipped ?? []).find((s) => s.path === 'CLAUDE.md');
|
|
324
|
-
expect(claudeSkip, 'filesSkipped must have a CLAUDE.md entry').toBeDefined();
|
|
325
|
-
expect(claudeSkip?.reason, 'skip reason must match /preview-only/').toMatch(/preview-only/);
|
|
326
|
-
});
|
|
327
|
-
// ── symlinked CLAUDE.md → AGENTS.md → augmented exactly once ───────────────
|
|
328
|
-
it('symlinked CLAUDE.md→AGENTS.md → resolved file augmented exactly once', async () => {
|
|
329
|
-
await setupAugmentMocks(PROJECT_MANIFEST);
|
|
330
|
-
const agentsPath = join(augE2eRoot, 'AGENTS.md');
|
|
331
|
-
const claudePath = join(augE2eRoot, 'CLAUDE.md');
|
|
332
|
-
writeFileSync(agentsPath, '# shared\n');
|
|
333
|
-
symlinkSync(agentsPath, claudePath);
|
|
334
|
-
const report = await run();
|
|
335
|
-
const body = readFileSync(agentsPath, 'utf8');
|
|
336
|
-
const regionCount = body.split(REGION_START).length - 1;
|
|
337
|
-
expect(regionCount, 'REGION_START must appear exactly once in the symlinked file').toBe(1);
|
|
338
|
-
expect(report.filesSkipped.some((s) => s.path === 'CLAUDE.md' && /symlinked to another augment target/.test(s.reason)), 'CLAUDE.md must be reported as skipped with symlink reason').toBe(true);
|
|
339
|
-
});
|
|
340
|
-
// ── non-augmentTarget .cursor/rules/*.mdc → legacy skip, never augmented ───
|
|
341
|
-
it('non-augmentTarget .cursor/rules/*.mdc → byte-identical, no REGION_START', async () => {
|
|
342
|
-
await setupAugmentMocks(PROJECT_MANIFEST);
|
|
343
|
-
const cursorDir = join(augE2eRoot, '.cursor', 'rules');
|
|
344
|
-
mkdirSync(cursorDir, { recursive: true });
|
|
345
|
-
const mdcPath = join(cursorDir, 'mine.mdc');
|
|
346
|
-
const originalContent = '# my cursor rule\n\nSome user content here.\n';
|
|
347
|
-
writeFileSync(mdcPath, originalContent);
|
|
348
|
-
await run();
|
|
349
|
-
const after = readFileSync(mdcPath, 'utf8');
|
|
350
|
-
expect(after, '.cursor/rules/mine.mdc must be byte-identical').toBe(originalContent);
|
|
351
|
-
expect(after.includes(REGION_START), 'REGION_START must NOT appear in .mdc file').toBe(false);
|
|
352
|
-
});
|
|
353
|
-
// ── CLAUDE.md present but claude NOT in surfaces → filtered, no augment ─────
|
|
354
|
-
it('claude not in surfaces → CLAUDE.md unchanged, no REGION_START, no throw', async () => {
|
|
355
|
-
await setupAugmentMocks(CODEX_ONLY_MANIFEST);
|
|
356
|
-
const claudePath = join(augE2eRoot, 'CLAUDE.md');
|
|
357
|
-
const userContent = '# mine\n';
|
|
358
|
-
writeFileSync(claudePath, userContent);
|
|
359
|
-
// Must resolve (not throw) even though CLAUDE.md exists
|
|
360
|
-
await expect(run()).resolves.toBeDefined();
|
|
361
|
-
const after = readFileSync(claudePath, 'utf8');
|
|
362
|
-
expect(after, 'CLAUDE.md must be unchanged when claude not in surfaces').toBe(userContent);
|
|
363
|
-
expect(after.includes(REGION_START), 'REGION_START must not appear').toBe(false);
|
|
364
|
-
});
|
|
365
|
-
// ── symlinked CLAUDE.md→AGENTS.md with single-surface scope (Fix 1 regression) ──
|
|
366
|
-
it('symlinked CLAUDE.md→AGENTS.md with single-surface scope → selected surface still augmented', async () => {
|
|
367
|
-
// Fix 1 regression test (TEN-2155):
|
|
368
|
-
// CLAUDE.md is a symlink to AGENTS.md; run scoped to claude only (codex filtered out).
|
|
369
|
-
// Before the fix: the dedupe pre-pass iterated ALL writes including the filtered-out
|
|
370
|
-
// AGENTS.md (codex), which claimed the shared inode first — so CLAUDE.md was then
|
|
371
|
-
// skipped as a duplicate → neither file got augmented.
|
|
372
|
-
// After the fix: only surfaces that will actually be processed participate in dedupe,
|
|
373
|
-
// so CLAUDE.md (the first surface-included target) claims the inode and is augmented.
|
|
374
|
-
await setupAugmentMocks(CLAUDE_ONLY_MANIFEST);
|
|
375
|
-
const agentsPath = join(augE2eRoot, 'AGENTS.md');
|
|
376
|
-
const claudePath = join(augE2eRoot, 'CLAUDE.md');
|
|
377
|
-
// Write the shared backing file; symlink CLAUDE.md → AGENTS.md.
|
|
378
|
-
writeFileSync(agentsPath, '# shared rules\n');
|
|
379
|
-
symlinkSync(agentsPath, claudePath);
|
|
380
|
-
await run();
|
|
381
|
-
// The resolved file (AGENTS.md, which CLAUDE.md points to) must contain exactly one
|
|
382
|
-
// REGION_START — proving CLAUDE.md was augmented (not skipped as a false duplicate).
|
|
383
|
-
const body = readFileSync(agentsPath, 'utf8');
|
|
384
|
-
const regionCount = body.split(REGION_START).length - 1;
|
|
385
|
-
expect(regionCount, 'REGION_START must appear exactly once — CLAUDE.md was augmented').toBe(1);
|
|
386
|
-
});
|
|
387
|
-
// ── CRLF user file → region rendered CRLF; re-run byte-identical ───────────
|
|
388
|
-
it('CRLF user file → region rendered CRLF; re-run byte-identical; user CRLF preserved', async () => {
|
|
389
|
-
await setupAugmentMocks(PROJECT_MANIFEST);
|
|
390
|
-
const claudePath = join(augE2eRoot, 'CLAUDE.md');
|
|
391
|
-
const userBody = '# mine\r\nuse pnpm\r\n';
|
|
392
|
-
writeFileSync(claudePath, userBody);
|
|
393
|
-
// First apply
|
|
394
|
-
await run();
|
|
395
|
-
const first = readFileSync(claudePath, 'utf8');
|
|
396
|
-
expect(first.startsWith(userBody), 'user CRLF bytes must be preserved').toBe(true);
|
|
397
|
-
expect(first.includes(REGION_START + '\r\n'), 'REGION_START must be followed by CRLF').toBe(true);
|
|
398
|
-
// Reset mocks + second apply
|
|
399
|
-
vi.restoreAllMocks();
|
|
400
|
-
augCwdSpy?.mockRestore();
|
|
401
|
-
await setupAugmentMocks(PROJECT_MANIFEST);
|
|
402
|
-
await run();
|
|
403
|
-
const second = readFileSync(claudePath, 'utf8');
|
|
404
|
-
expect(second, 'second apply must be byte-identical to first (CRLF idempotent)').toBe(first);
|
|
405
|
-
});
|
|
406
|
-
});
|
|
407
|
-
//# sourceMappingURL=handshake-augment.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handshake-augment.test.js","sourceRoot":"","sources":["../../src/__tests__/handshake-augment.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handshake-dormancy.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/handshake-dormancy.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from 'vitest';
|
|
2
|
-
import { relative, sep } from 'path';
|
|
3
|
-
// WP-776 S3d/S3f: the setupAuthoringPath precedence/traversal-rejection describe blocks that
|
|
4
|
-
// used to live here are deleted along with the setup-authoring sync machinery and its
|
|
5
|
-
// __test.setupAuthoringPath export (handshake.ts). What remains below is general — the
|
|
6
|
-
// perimeter guard's .dormant handling — and survives that deletion.
|
|
7
|
-
test('WP-426 E3 relative authoringPath is POSIX under .productbrain/, never absolute', () => {
|
|
8
|
-
expect(relative('/repo/.productbrain', '/repo/.productbrain/skills/foo.md').split(sep).join('/')).toBe('skills/foo.md');
|
|
9
|
-
});
|
|
10
|
-
// WP-426 doneWhen #10: perimeter is containment-based (writePerimeter.ts),
|
|
11
|
-
// not extension-gated — lock that .dormant targets pass under a surface dir.
|
|
12
|
-
// DEC-1690 retired the handshake's own on-disk rename/restore machinery, but a
|
|
13
|
-
// leftover .dormant sibling from an older binary can still reach this guard via
|
|
14
|
-
// the general materialization scan (handshake.ts), so the perimeter must still
|
|
15
|
-
// accept it.
|
|
16
|
-
describe('WP-426 E4 perimeter accepts .dormant', () => {
|
|
17
|
-
test('.md.dormant / .mdc.dormant under a surface dir do not throw', async () => {
|
|
18
|
-
const { assertSetupWritePath } = await import('../lib/writePerimeter.js');
|
|
19
|
-
const manifest = { surfaces: ['.codex', '.cursor', '.claude'] };
|
|
20
|
-
expect(() => assertSetupWritePath('/repo/.cursor/rules/Foo.mdc.dormant', manifest, { cwd: '/repo' })).not.toThrow();
|
|
21
|
-
expect(() => assertSetupWritePath('/repo/.codex/skills/Foo.md.dormant', manifest, { cwd: '/repo' })).not.toThrow();
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
//# sourceMappingURL=handshake-dormancy.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handshake-dormancy.test.js","sourceRoot":"","sources":["../../src/__tests__/handshake-dormancy.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAErC,6FAA6F;AAC7F,sFAAsF;AACtF,uFAAuF;AACvF,oEAAoE;AAEpE,IAAI,CAAC,gFAAgF,EAAE,GAAG,EAAE;IAC1F,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,mCAAmC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC1H,CAAC,CAAC,CAAC;AAEH,2EAA2E;AAC3E,6EAA6E;AAC7E,+EAA+E;AAC/E,gFAAgF;AAChF,+EAA+E;AAC/E,aAAa;AACb,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,EAAS,CAAC;QACvE,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,qCAAqC,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACpH,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,oCAAoC,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACrH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handshake-formatter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/handshake-formatter.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* formatHandshakeReport — user-owned files are NOT drift (TEN-2150).
|
|
3
|
-
*
|
|
4
|
-
* A marker-less file at an adapter path is the user's own file. handshake leaves
|
|
5
|
-
* it untouched and lists it under "Skipped:" benignly. The report must NOT render
|
|
6
|
-
* it as a "forked adapter blocked sync" warning, must NOT claim a draft TEN was
|
|
7
|
-
* logged, and must NOT count it as user-owned drift.
|
|
8
|
-
*
|
|
9
|
-
* These tests feed the report the legacy drift shape (the data that USED to fire
|
|
10
|
-
* the warning) so they fail RED against the old formatter and stand as regression
|
|
11
|
-
* guards after the fix removes that code path.
|
|
12
|
-
*/
|
|
13
|
-
import { describe, expect, it } from 'vitest';
|
|
14
|
-
import { formatHandshakeReport } from '../formatters/handshake.js';
|
|
15
|
-
function baseReport(overrides = {}) {
|
|
16
|
-
return {
|
|
17
|
-
filesWritten: ['AGENTS.md'],
|
|
18
|
-
filesSkipped: [
|
|
19
|
-
{ path: 'CLAUDE.md', reason: 'user-owned — left untouched (pb won\'t overwrite your file)' },
|
|
20
|
-
],
|
|
21
|
-
matchedEntries: [],
|
|
22
|
-
searchQueries: [],
|
|
23
|
-
repo: { name: 'test-repo', detectedStack: [], repoSlug: null },
|
|
24
|
-
...overrides,
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
describe('formatHandshakeReport — user-owned files are not drift (TEN-2150)', () => {
|
|
28
|
-
it('never renders a "forked adapter blocked sync" warning for user-owned files', () => {
|
|
29
|
-
// `driftConflicts` is the pre-fix shape that triggered the warning. Post-fix
|
|
30
|
-
// there is no code path that can emit it.
|
|
31
|
-
const out = formatHandshakeReport(baseReport({ driftConflicts: ['CLAUDE.md'] }));
|
|
32
|
-
expect(out).not.toContain('forked adapter');
|
|
33
|
-
expect(out).not.toContain('blocked sync');
|
|
34
|
-
expect(out).not.toContain('logged as draft TEN');
|
|
35
|
-
// Case-insensitive: the old warning emitted capital-U "Use --force to overwrite".
|
|
36
|
-
expect(out.toLowerCase()).not.toContain('--force to overwrite');
|
|
37
|
-
});
|
|
38
|
-
it('omits the user-owned bucket from the drift report entirely (TEN-2150)', () => {
|
|
39
|
-
// Force the drift report to render (it only shows when a PB-managed bucket is
|
|
40
|
-
// non-zero) while also listing user-owned skips. The report must show only the
|
|
41
|
-
// two PB-managed buckets — no user-owned row, regardless of how many are skipped.
|
|
42
|
-
const out = formatHandshakeReport(baseReport({ managedCleanCount: 2, userOwnedSkipped: ['CLAUDE.md', 'AGENTS.md'] }));
|
|
43
|
-
expect(out).toContain('Drift report (2 buckets):');
|
|
44
|
-
expect(out).toContain('PB-managed-clean:');
|
|
45
|
-
expect(out).not.toMatch(/user-owned:/);
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
describe('formatHandshakeReport — leftover files (report-only, coordinator ruling PR #912 round 10)', () => {
|
|
49
|
-
it('renders a "Leftover files:" section with path and reason, one line each', () => {
|
|
50
|
-
const out = formatHandshakeReport(baseReport({
|
|
51
|
-
leftoverFiles: [
|
|
52
|
-
{ path: '.cursor/rules/old-orphaned-rule.mdc', reason: 'orphan — no canonical asset matches this name' },
|
|
53
|
-
{ path: '.claude/skills/setup.md.dormant', reason: 'leftover .dormant file from an older binary version' },
|
|
54
|
-
],
|
|
55
|
-
}));
|
|
56
|
-
expect(out).toContain('Leftover files:');
|
|
57
|
-
expect(out).toContain('.cursor/rules/old-orphaned-rule.mdc — orphan — no canonical asset matches this name');
|
|
58
|
-
expect(out).toContain('.claude/skills/setup.md.dormant — leftover .dormant file from an older binary version');
|
|
59
|
-
});
|
|
60
|
-
it('omits the "Leftover files:" section entirely when there are none', () => {
|
|
61
|
-
const out = formatHandshakeReport(baseReport({ leftoverFiles: [] }));
|
|
62
|
-
expect(out).not.toContain('Leftover files:');
|
|
63
|
-
});
|
|
64
|
-
it('PR #912 round 14/15 (Codex P2): reversibly escapes control chars/escape sequences/newlines in a filesystem-derived leftover path before rendering, without losing filename identity', () => {
|
|
65
|
-
// Unix filenames may contain raw control chars/ANSI escapes/newlines — readdirSync returns
|
|
66
|
-
// them verbatim. A malicious or corrupted filename must never inject terminal controls or
|
|
67
|
-
// forged extra lines into the report. Round 15: a lossy sanitizer (collapse/delete) can point
|
|
68
|
-
// the user — who is told to go remove this path — at the wrong file or lose it entirely, so
|
|
69
|
-
// this must escape reversibly instead.
|
|
70
|
-
const out = formatHandshakeReport(baseReport({
|
|
71
|
-
leftoverFiles: [
|
|
72
|
-
{ path: '.cursor/rules/evil\x1b[31mFAKE ERROR\x1b[0m\nrm -rf /.mdc', reason: 'orphan\r\nFAKE LINE' },
|
|
73
|
-
],
|
|
74
|
-
}));
|
|
75
|
-
// eslint-disable-next-line no-control-regex
|
|
76
|
-
expect(out).not.toMatch(/[\x00-\x08\x0b-\x1f\x7f]/);
|
|
77
|
-
expect(out).not.toContain('\x1b[31m');
|
|
78
|
-
// The raw ESC byte and newline are gone, but every character survives as a visible,
|
|
79
|
-
// reversible escape — nothing is deleted or collapsed away.
|
|
80
|
-
expect(out).toContain('.cursor/rules/evil\\x1b[31mFAKE ERROR\\x1b[0m\\nrm -rf /.mdc');
|
|
81
|
-
expect(out).toContain('orphan\\r\\nFAKE LINE');
|
|
82
|
-
});
|
|
83
|
-
it('PR #912 round 15 (Codex P2): a leftover path/reason with only ordinary whitespace renders unchanged — the reversible escaper never collapses spaces', () => {
|
|
84
|
-
const out = formatHandshakeReport(baseReport({
|
|
85
|
-
leftoverFiles: [
|
|
86
|
-
{ path: '.claude/rules/safe name.mdc', reason: 'orphan' },
|
|
87
|
-
],
|
|
88
|
-
}));
|
|
89
|
-
expect(out).toContain('.claude/rules/safe name.mdc — orphan');
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
describe('formatHandshakeReport — preview statuses would-augment + needs-attention (TEN-2155)', () => {
|
|
93
|
-
it('renders would-augment and needs-attention statuses', () => {
|
|
94
|
-
const out = formatHandshakeReport({
|
|
95
|
-
filesWritten: [], filesSkipped: [], matchedEntries: [], searchQueries: [],
|
|
96
|
-
repo: { name: 'r', detectedStack: [] },
|
|
97
|
-
preview: true,
|
|
98
|
-
previewPlan: [
|
|
99
|
-
{ path: 'CLAUDE.md', status: 'would-augment' },
|
|
100
|
-
{ path: 'AGENTS.md', status: 'needs-attention' },
|
|
101
|
-
],
|
|
102
|
-
});
|
|
103
|
-
expect(out).toContain('CLAUDE.md');
|
|
104
|
-
expect(out).toMatch(/would augment/i);
|
|
105
|
-
expect(out).toMatch(/malformed PB region/);
|
|
106
|
-
expect(out).toMatch(/1 would augment/);
|
|
107
|
-
expect(out).toContain('✚'); // would-augment symbol
|
|
108
|
-
expect(out).toMatch(/1 need attention/);
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
//# sourceMappingURL=handshake-formatter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handshake-formatter.test.js","sourceRoot":"","sources":["../../src/__tests__/handshake-formatter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handshake-preview.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/handshake-preview.test.ts"],"names":[],"mappings":""}
|