@variantree/watcher 0.1.0
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/__tests__/git-snapshot.test.d.ts +2 -0
- package/dist/__tests__/git-snapshot.test.d.ts.map +1 -0
- package/dist/__tests__/git-snapshot.test.js +437 -0
- package/dist/__tests__/git-snapshot.test.js.map +1 -0
- package/dist/__tests__/integration.test.d.ts +10 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.js +316 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/__tests__/watcher.test.d.ts +2 -0
- package/dist/__tests__/watcher.test.d.ts.map +1 -0
- package/dist/__tests__/watcher.test.js +375 -0
- package/dist/__tests__/watcher.test.js.map +1 -0
- package/dist/adapters/aider.d.ts +21 -0
- package/dist/adapters/aider.d.ts.map +1 -0
- package/dist/adapters/aider.js +42 -0
- package/dist/adapters/aider.js.map +1 -0
- package/dist/adapters/base.d.ts +3 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +2 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude-code.d.ts +17 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +58 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/opencode.d.ts +3 -0
- package/dist/adapters/opencode.d.ts.map +1 -0
- package/dist/adapters/opencode.js +3 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/agents-md.d.ts +18 -0
- package/dist/agents-md.d.ts.map +1 -0
- package/dist/agents-md.js +93 -0
- package/dist/agents-md.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +511 -0
- package/dist/cli.js.map +1 -0
- package/dist/differ.d.ts +18 -0
- package/dist/differ.d.ts.map +1 -0
- package/dist/differ.js +23 -0
- package/dist/differ.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/node/blob-store.d.ts +16 -0
- package/dist/node/blob-store.d.ts.map +1 -0
- package/dist/node/blob-store.js +47 -0
- package/dist/node/blob-store.js.map +1 -0
- package/dist/node/fs-adapter.d.ts +17 -0
- package/dist/node/fs-adapter.d.ts.map +1 -0
- package/dist/node/fs-adapter.js +110 -0
- package/dist/node/fs-adapter.js.map +1 -0
- package/dist/node/git-snapshot.d.ts +46 -0
- package/dist/node/git-snapshot.d.ts.map +1 -0
- package/dist/node/git-snapshot.js +282 -0
- package/dist/node/git-snapshot.js.map +1 -0
- package/dist/node/session-launcher.d.ts +14 -0
- package/dist/node/session-launcher.d.ts.map +1 -0
- package/dist/node/session-launcher.js +28 -0
- package/dist/node/session-launcher.js.map +1 -0
- package/dist/node/storage.d.ts +17 -0
- package/dist/node/storage.d.ts.map +1 -0
- package/dist/node/storage.js +56 -0
- package/dist/node/storage.js.map +1 -0
- package/dist/sync.d.ts +16 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +58 -0
- package/dist/sync.js.map +1 -0
- package/dist/tools/base.d.ts +52 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +10 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/claudecode/adapter.d.ts +26 -0
- package/dist/tools/claudecode/adapter.d.ts.map +1 -0
- package/dist/tools/claudecode/adapter.js +111 -0
- package/dist/tools/claudecode/adapter.js.map +1 -0
- package/dist/tools/claudecode/config.d.ts +8 -0
- package/dist/tools/claudecode/config.d.ts.map +1 -0
- package/dist/tools/claudecode/config.js +34 -0
- package/dist/tools/claudecode/config.js.map +1 -0
- package/dist/tools/claudecode/index.d.ts +9 -0
- package/dist/tools/claudecode/index.d.ts.map +1 -0
- package/dist/tools/claudecode/index.js +16 -0
- package/dist/tools/claudecode/index.js.map +1 -0
- package/dist/tools/claudecode/instructions.d.ts +7 -0
- package/dist/tools/claudecode/instructions.d.ts.map +1 -0
- package/dist/tools/claudecode/instructions.js +21 -0
- package/dist/tools/claudecode/instructions.js.map +1 -0
- package/dist/tools/index.d.ts +24 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +42 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/instructions.d.ts +19 -0
- package/dist/tools/instructions.d.ts.map +1 -0
- package/dist/tools/instructions.js +93 -0
- package/dist/tools/instructions.js.map +1 -0
- package/dist/tools/opencode/adapter.d.ts +46 -0
- package/dist/tools/opencode/adapter.d.ts.map +1 -0
- package/dist/tools/opencode/adapter.js +166 -0
- package/dist/tools/opencode/adapter.js.map +1 -0
- package/dist/tools/opencode/config.d.ts +8 -0
- package/dist/tools/opencode/config.d.ts.map +1 -0
- package/dist/tools/opencode/config.js +37 -0
- package/dist/tools/opencode/config.js.map +1 -0
- package/dist/tools/opencode/index.d.ts +9 -0
- package/dist/tools/opencode/index.d.ts.map +1 -0
- package/dist/tools/opencode/index.js +16 -0
- package/dist/tools/opencode/index.js.map +1 -0
- package/dist/tools/opencode/instructions.d.ts +10 -0
- package/dist/tools/opencode/instructions.d.ts.map +1 -0
- package/dist/tools/opencode/instructions.js +26 -0
- package/dist/tools/opencode/instructions.js.map +1 -0
- package/dist/watcher.d.ts +40 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +87 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration test — full Variantree pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Exercises: workspace → messages → checkpoints → snapshots → branch →
|
|
5
|
+
* switch → restore → context resolution → unsaved guard.
|
|
6
|
+
*
|
|
7
|
+
* Uses a real temp directory with GitSnapshotProvider (real git commands).
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
10
|
+
import fs from 'node:fs/promises';
|
|
11
|
+
import fsSync from 'node:fs';
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
import os from 'node:os';
|
|
14
|
+
import { VariantTree } from '@variantree/core';
|
|
15
|
+
import { NodeStorage } from '../node/storage.js';
|
|
16
|
+
import { GitSnapshotProvider } from '../node/git-snapshot.js';
|
|
17
|
+
import { mergeAgentsMd } from '../tools/opencode/instructions.js';
|
|
18
|
+
const WORKSPACE_ID = 'test';
|
|
19
|
+
let tmpDir;
|
|
20
|
+
let engine;
|
|
21
|
+
let storage;
|
|
22
|
+
let snapshotProvider;
|
|
23
|
+
function writeFile(name, content) {
|
|
24
|
+
fsSync.writeFileSync(path.join(tmpDir, name), content, 'utf8');
|
|
25
|
+
}
|
|
26
|
+
function readFile(name) {
|
|
27
|
+
return fsSync.readFileSync(path.join(tmpDir, name), 'utf8');
|
|
28
|
+
}
|
|
29
|
+
function fileExists(name) {
|
|
30
|
+
return fsSync.existsSync(path.join(tmpDir, name));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Count messages on the active branch after the last checkpoint.
|
|
34
|
+
* Mirrors the logic in cli.ts and server.ts.
|
|
35
|
+
*/
|
|
36
|
+
function countUnsavedMessages() {
|
|
37
|
+
const branch = engine.getActiveBranch();
|
|
38
|
+
const branchCheckpoints = engine
|
|
39
|
+
.getCheckpointsForBranch(branch.id)
|
|
40
|
+
.sort((a, b) => a.createdAt - b.createdAt);
|
|
41
|
+
if (branchCheckpoints.length === 0)
|
|
42
|
+
return branch.messages.length;
|
|
43
|
+
const lastCp = branchCheckpoints[branchCheckpoints.length - 1];
|
|
44
|
+
return Math.max(0, branch.messages.length - 1 - lastCp.messageIndex);
|
|
45
|
+
}
|
|
46
|
+
async function setup() {
|
|
47
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'variantree-test-'));
|
|
48
|
+
storage = new NodeStorage(tmpDir);
|
|
49
|
+
snapshotProvider = new GitSnapshotProvider(tmpDir);
|
|
50
|
+
engine = new VariantTree({ storage, snapshotProvider });
|
|
51
|
+
const ws = await engine.createWorkspace('Integration Test');
|
|
52
|
+
ws.id = WORKSPACE_ID;
|
|
53
|
+
await storage.save(WORKSPACE_ID, ws);
|
|
54
|
+
await engine.loadWorkspace(WORKSPACE_ID);
|
|
55
|
+
}
|
|
56
|
+
async function teardown() {
|
|
57
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
58
|
+
}
|
|
59
|
+
// ─── Full pipeline ───────────────────────────────────────────────────────
|
|
60
|
+
describe('Full pipeline: code + conversation', () => {
|
|
61
|
+
beforeEach(setup);
|
|
62
|
+
afterEach(teardown);
|
|
63
|
+
it('checkpoint captures code + messages, restore brings them back', async () => {
|
|
64
|
+
// Simulate: user asks to write add.py
|
|
65
|
+
await engine.addMessage('user', 'Write a python script to add 2 numbers');
|
|
66
|
+
await engine.addMessage('assistant', 'Here is add.py');
|
|
67
|
+
writeFile('add.py', 'def add(a, b):\n return a + b\n\nprint(add(2, 3))\n');
|
|
68
|
+
// Checkpoint v1
|
|
69
|
+
const cp1 = await engine.createCheckpoint('v1-add', { workspacePath: tmpDir });
|
|
70
|
+
expect(cp1.snapshotRef).toBeDefined();
|
|
71
|
+
expect(cp1.messageIndex).toBe(1);
|
|
72
|
+
// Verify code exists
|
|
73
|
+
expect(readFile('add.py')).toContain('def add');
|
|
74
|
+
// Simulate: user asks to modify the file
|
|
75
|
+
await engine.addMessage('user', 'Add a subtract function');
|
|
76
|
+
await engine.addMessage('assistant', 'Done, added subtract');
|
|
77
|
+
writeFile('add.py', 'def add(a, b):\n return a + b\n\ndef subtract(a, b):\n return a - b\n\nprint(add(2, 3))\nprint(subtract(5, 2))\n');
|
|
78
|
+
// Checkpoint v2
|
|
79
|
+
const cp2 = await engine.createCheckpoint('v2-subtract', { workspacePath: tmpDir });
|
|
80
|
+
expect(cp2.messageIndex).toBe(3);
|
|
81
|
+
// Code now has subtract
|
|
82
|
+
expect(readFile('add.py')).toContain('def subtract');
|
|
83
|
+
// Restore to v1 — subtract should vanish
|
|
84
|
+
const summary = await engine.restoreCheckpoint(cp1.id, tmpDir);
|
|
85
|
+
expect(summary).not.toBeNull();
|
|
86
|
+
expect(summary.written.length).toBeGreaterThan(0);
|
|
87
|
+
const restored = readFile('add.py');
|
|
88
|
+
expect(restored).toContain('def add');
|
|
89
|
+
expect(restored).not.toContain('def subtract');
|
|
90
|
+
});
|
|
91
|
+
it('branch creates isolated code + context, switch restores the other', async () => {
|
|
92
|
+
// Main: write add.py
|
|
93
|
+
await engine.addMessage('user', 'Write add.py');
|
|
94
|
+
await engine.addMessage('assistant', 'Done');
|
|
95
|
+
writeFile('add.py', 'print(2 + 3)\n');
|
|
96
|
+
const cpMain = await engine.createCheckpoint('main-v1', { workspacePath: tmpDir });
|
|
97
|
+
const mainBranchId = engine.getActiveBranch().id;
|
|
98
|
+
// Branch: try a different approach
|
|
99
|
+
const branch = await engine.branch('class-based', cpMain.id);
|
|
100
|
+
await engine.addMessage('user', 'Rewrite using a class');
|
|
101
|
+
await engine.addMessage('assistant', 'Here is the class version');
|
|
102
|
+
writeFile('add.py', 'class Calculator:\n def add(self, a, b):\n return a + b\n');
|
|
103
|
+
const cpBranch = await engine.createCheckpoint('class-v1', { workspacePath: tmpDir });
|
|
104
|
+
// Verify: on branch, code is class-based
|
|
105
|
+
expect(readFile('add.py')).toContain('class Calculator');
|
|
106
|
+
// Context on branch should include main messages + branch messages
|
|
107
|
+
const branchContext = engine.getContext();
|
|
108
|
+
expect(branchContext).toHaveLength(4);
|
|
109
|
+
expect(branchContext[0].content).toBe('Write add.py');
|
|
110
|
+
expect(branchContext[2].content).toBe('Rewrite using a class');
|
|
111
|
+
// Switch back to main
|
|
112
|
+
await engine.switchBranch(mainBranchId);
|
|
113
|
+
const mainSummary = await engine.restoreCheckpoint(cpMain.id, tmpDir);
|
|
114
|
+
// Code should be the simple version again
|
|
115
|
+
expect(readFile('add.py')).toBe('print(2 + 3)\n');
|
|
116
|
+
expect(readFile('add.py')).not.toContain('class Calculator');
|
|
117
|
+
// Context on main should only have main messages
|
|
118
|
+
const mainContext = engine.getContext();
|
|
119
|
+
expect(mainContext).toHaveLength(2);
|
|
120
|
+
expect(mainContext[0].content).toBe('Write add.py');
|
|
121
|
+
// Switch back to branch — class code returns
|
|
122
|
+
await engine.switchBranch(branch.id);
|
|
123
|
+
await engine.restoreCheckpoint(cpBranch.id, tmpDir);
|
|
124
|
+
expect(readFile('add.py')).toContain('class Calculator');
|
|
125
|
+
});
|
|
126
|
+
it('new files are captured and deleted files are restored correctly', async () => {
|
|
127
|
+
await engine.addMessage('user', 'Create two files');
|
|
128
|
+
await engine.addMessage('assistant', 'Done');
|
|
129
|
+
writeFile('file_a.py', 'print("a")\n');
|
|
130
|
+
writeFile('file_b.py', 'print("b")\n');
|
|
131
|
+
const cp1 = await engine.createCheckpoint('two-files', { workspacePath: tmpDir });
|
|
132
|
+
// Delete file_a, add file_c
|
|
133
|
+
await fs.unlink(path.join(tmpDir, 'file_a.py'));
|
|
134
|
+
writeFile('file_c.py', 'print("c")\n');
|
|
135
|
+
await engine.addMessage('user', 'Deleted a, added c');
|
|
136
|
+
const cp2 = await engine.createCheckpoint('one-deleted', { workspacePath: tmpDir });
|
|
137
|
+
expect(fileExists('file_a.py')).toBe(false);
|
|
138
|
+
expect(fileExists('file_c.py')).toBe(true);
|
|
139
|
+
// Restore to cp1 — file_a should come back, file_c should go away
|
|
140
|
+
const summary = await engine.restoreCheckpoint(cp1.id, tmpDir);
|
|
141
|
+
expect(summary).not.toBeNull();
|
|
142
|
+
expect(fileExists('file_a.py')).toBe(true);
|
|
143
|
+
expect(fileExists('file_c.py')).toBe(false);
|
|
144
|
+
expect(readFile('file_a.py')).toBe('print("a")\n');
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
// ─── Unsaved guard ───────────────────────────────────────────────────────
|
|
148
|
+
describe('Unsaved messages guard', () => {
|
|
149
|
+
beforeEach(setup);
|
|
150
|
+
afterEach(teardown);
|
|
151
|
+
it('returns 0 when all messages are checkpointed', async () => {
|
|
152
|
+
await engine.addMessage('user', 'Hello');
|
|
153
|
+
await engine.addMessage('assistant', 'Hi');
|
|
154
|
+
await engine.createCheckpoint('all-saved', { workspacePath: tmpDir });
|
|
155
|
+
expect(countUnsavedMessages()).toBe(0);
|
|
156
|
+
});
|
|
157
|
+
it('returns count of messages after last checkpoint', async () => {
|
|
158
|
+
await engine.addMessage('user', 'Hello');
|
|
159
|
+
await engine.addMessage('assistant', 'Hi');
|
|
160
|
+
await engine.createCheckpoint('first', { workspacePath: tmpDir });
|
|
161
|
+
await engine.addMessage('user', 'More work');
|
|
162
|
+
await engine.addMessage('assistant', 'Done');
|
|
163
|
+
await engine.addMessage('user', 'Even more');
|
|
164
|
+
expect(countUnsavedMessages()).toBe(3);
|
|
165
|
+
});
|
|
166
|
+
it('returns all messages when no checkpoints exist', async () => {
|
|
167
|
+
await engine.addMessage('user', 'Hello');
|
|
168
|
+
await engine.addMessage('assistant', 'Hi');
|
|
169
|
+
expect(countUnsavedMessages()).toBe(2);
|
|
170
|
+
});
|
|
171
|
+
it('only counts checkpoints on the active branch', async () => {
|
|
172
|
+
// Main: 2 messages + checkpoint
|
|
173
|
+
await engine.addMessage('user', 'm1');
|
|
174
|
+
await engine.addMessage('assistant', 'm2');
|
|
175
|
+
const cpMain = await engine.createCheckpoint('main-cp', { workspacePath: tmpDir });
|
|
176
|
+
writeFile('add.py', 'print(1)\n');
|
|
177
|
+
// Branch: 2 new messages, NO checkpoint
|
|
178
|
+
await engine.branch('feature', cpMain.id);
|
|
179
|
+
await engine.addMessage('user', 'f1');
|
|
180
|
+
await engine.addMessage('assistant', 'f2');
|
|
181
|
+
// Active branch is "feature" with 0 checkpoints → all 2 messages are unsaved
|
|
182
|
+
expect(countUnsavedMessages()).toBe(2);
|
|
183
|
+
// Main's checkpoint should NOT make this 0
|
|
184
|
+
const mainCheckpoints = engine.getCheckpointsForBranch(engine.getBranches().find(b => b.name === 'main').id);
|
|
185
|
+
expect(mainCheckpoints).toHaveLength(1);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
// ─── AGENTS.md merge ─────────────────────────────────────────────────────
|
|
189
|
+
describe('AGENTS.md merge logic', () => {
|
|
190
|
+
it('creates new file when none exists', () => {
|
|
191
|
+
const result = mergeAgentsMd(null);
|
|
192
|
+
expect(result).toContain('# AGENTS');
|
|
193
|
+
expect(result).toContain('<!-- variantree:instructions -->');
|
|
194
|
+
expect(result).toContain('When to checkpoint');
|
|
195
|
+
expect(result).toContain('Presenting results to the user');
|
|
196
|
+
});
|
|
197
|
+
it('appends to existing file without variantree section', () => {
|
|
198
|
+
const existing = '# My Project\n\nSome existing rules.\n';
|
|
199
|
+
const result = mergeAgentsMd(existing);
|
|
200
|
+
expect(result).toContain('# My Project');
|
|
201
|
+
expect(result).toContain('Some existing rules.');
|
|
202
|
+
expect(result).toContain('<!-- variantree:instructions -->');
|
|
203
|
+
});
|
|
204
|
+
it('replaces existing variantree section', () => {
|
|
205
|
+
const existing = '# My Project\n\n<!-- variantree:instructions -->\nOLD CONTENT\n<!-- variantree:instructions -->\n\nOther stuff.\n';
|
|
206
|
+
const result = mergeAgentsMd(existing);
|
|
207
|
+
expect(result).not.toContain('OLD CONTENT');
|
|
208
|
+
expect(result).toContain('When to checkpoint');
|
|
209
|
+
expect(result).toContain('Other stuff.');
|
|
210
|
+
});
|
|
211
|
+
it('does not duplicate markers', () => {
|
|
212
|
+
const result = mergeAgentsMd(null);
|
|
213
|
+
const markerCount = (result.match(/<!-- variantree:instructions -->/g) || []).length;
|
|
214
|
+
expect(markerCount).toBe(2);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
// ─── Session-aware sync ───────────────────────────────────────────────────
|
|
218
|
+
describe('Session-aware sync', () => {
|
|
219
|
+
beforeEach(setup);
|
|
220
|
+
afterEach(teardown);
|
|
221
|
+
it('workspace starts with no openCodeSessionId', async () => {
|
|
222
|
+
const ws = engine.getWorkspace();
|
|
223
|
+
expect(ws.openCodeSessionId).toBeUndefined();
|
|
224
|
+
});
|
|
225
|
+
it('setOpenCodeSessionId persists the session ID to storage', async () => {
|
|
226
|
+
await engine.setOpenCodeSessionId('session-abc-123');
|
|
227
|
+
const ws = engine.getWorkspace();
|
|
228
|
+
expect(ws.openCodeSessionId).toBe('session-abc-123');
|
|
229
|
+
// Reload from storage to verify persistence
|
|
230
|
+
const storage2 = new NodeStorage(tmpDir);
|
|
231
|
+
const engine2 = new VariantTree({ storage: storage2 });
|
|
232
|
+
await engine2.loadWorkspace(WORKSPACE_ID);
|
|
233
|
+
expect(engine2.getWorkspace().openCodeSessionId).toBe('session-abc-123');
|
|
234
|
+
});
|
|
235
|
+
it('setOpenCodeSessionId can be updated (e.g. user started a new OpenCode session)', async () => {
|
|
236
|
+
await engine.setOpenCodeSessionId('session-v1');
|
|
237
|
+
expect(engine.getWorkspace().openCodeSessionId).toBe('session-v1');
|
|
238
|
+
await engine.setOpenCodeSessionId('session-v2');
|
|
239
|
+
expect(engine.getWorkspace().openCodeSessionId).toBe('session-v2');
|
|
240
|
+
});
|
|
241
|
+
it('workspace.createdAt is a stable floor for future timestamp comparisons', async () => {
|
|
242
|
+
const ws = engine.getWorkspace();
|
|
243
|
+
const floor = ws.createdAt;
|
|
244
|
+
// createdAt is a valid millisecond timestamp
|
|
245
|
+
expect(floor).toBeGreaterThan(0);
|
|
246
|
+
expect(floor).toBeLessThanOrEqual(Date.now());
|
|
247
|
+
});
|
|
248
|
+
it('workspace.createdAt is earlier than messages added after workspace creation', async () => {
|
|
249
|
+
const ws = engine.getWorkspace();
|
|
250
|
+
const floorMs = ws.createdAt;
|
|
251
|
+
// Small sleep to ensure addMessage timestamp > workspace.createdAt
|
|
252
|
+
await new Promise(r => setTimeout(r, 5));
|
|
253
|
+
await engine.addMessage('user', 'Post-creation message');
|
|
254
|
+
const branch = engine.getActiveBranch();
|
|
255
|
+
const msg = branch.messages[0];
|
|
256
|
+
expect(msg.timestamp).toBeGreaterThanOrEqual(floorMs);
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
// ─── Context resolution across branches ──────────────────────────────────
|
|
260
|
+
describe('Context resolution integrity', () => {
|
|
261
|
+
beforeEach(setup);
|
|
262
|
+
afterEach(teardown);
|
|
263
|
+
it('deep nesting: grandchild branch has full ancestry context', async () => {
|
|
264
|
+
// main: m1, m2
|
|
265
|
+
await engine.addMessage('user', 'Write add.py');
|
|
266
|
+
await engine.addMessage('assistant', 'Done');
|
|
267
|
+
const cp1 = await engine.createCheckpoint('cp1', { workspacePath: tmpDir });
|
|
268
|
+
// branch-a: m3, m4
|
|
269
|
+
await engine.branch('branch-a', cp1.id);
|
|
270
|
+
await engine.addMessage('user', 'Add subtract');
|
|
271
|
+
await engine.addMessage('assistant', 'Added');
|
|
272
|
+
const cp2 = await engine.createCheckpoint('cp2', { workspacePath: tmpDir });
|
|
273
|
+
// branch-b (from branch-a): m5, m6
|
|
274
|
+
await engine.branch('branch-b', cp2.id);
|
|
275
|
+
await engine.addMessage('user', 'Add multiply');
|
|
276
|
+
await engine.addMessage('assistant', 'Added');
|
|
277
|
+
const context = engine.getContext();
|
|
278
|
+
expect(context).toHaveLength(6);
|
|
279
|
+
expect(context.map(m => m.content)).toEqual([
|
|
280
|
+
'Write add.py', 'Done',
|
|
281
|
+
'Add subtract', 'Added',
|
|
282
|
+
'Add multiply', 'Added',
|
|
283
|
+
]);
|
|
284
|
+
// Ancestry chain: main → branch-a → branch-b
|
|
285
|
+
const ancestry = engine.getAncestry();
|
|
286
|
+
expect(ancestry).toHaveLength(3);
|
|
287
|
+
});
|
|
288
|
+
it('sibling branches have independent contexts', async () => {
|
|
289
|
+
await engine.addMessage('user', 'Write add.py');
|
|
290
|
+
await engine.addMessage('assistant', 'Done');
|
|
291
|
+
writeFile('add.py', 'print(2+3)\n');
|
|
292
|
+
const cp = await engine.createCheckpoint('base', { workspacePath: tmpDir });
|
|
293
|
+
const mainId = engine.getActiveBranch().id;
|
|
294
|
+
// Branch A
|
|
295
|
+
const branchA = await engine.branch('approach-a', cp.id);
|
|
296
|
+
await engine.addMessage('user', 'Use functions');
|
|
297
|
+
await engine.addMessage('assistant', 'Here are functions');
|
|
298
|
+
// Switch back to main, create branch B
|
|
299
|
+
await engine.switchBranch(mainId);
|
|
300
|
+
const branchB = await engine.branch('approach-b', cp.id);
|
|
301
|
+
await engine.addMessage('user', 'Use classes');
|
|
302
|
+
await engine.addMessage('assistant', 'Here are classes');
|
|
303
|
+
// Branch A context: main(2) + branchA(2) = 4
|
|
304
|
+
const ctxA = engine.getContext(branchA.id);
|
|
305
|
+
expect(ctxA).toHaveLength(4);
|
|
306
|
+
expect(ctxA[2].content).toBe('Use functions');
|
|
307
|
+
// Branch B context: main(2) + branchB(2) = 4
|
|
308
|
+
const ctxB = engine.getContext(branchB.id);
|
|
309
|
+
expect(ctxB).toHaveLength(4);
|
|
310
|
+
expect(ctxB[2].content).toBe('Use classes');
|
|
311
|
+
// They share the first 2 messages but diverge after
|
|
312
|
+
expect(ctxA[0].content).toBe(ctxB[0].content);
|
|
313
|
+
expect(ctxA[2].content).not.toBe(ctxB[2].content);
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
//# sourceMappingURL=integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../src/__tests__/integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/watcher.test.ts"],"names":[],"mappings":""}
|