@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 @@
|
|
|
1
|
+
{"version":3,"file":"git-snapshot.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/git-snapshot.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { GitSnapshotProvider } from '../node/git-snapshot.js';
|
|
3
|
+
import fs from 'node:fs/promises';
|
|
4
|
+
import fsSync from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import os from 'node:os';
|
|
7
|
+
import { execFile } from 'node:child_process';
|
|
8
|
+
import { promisify } from 'node:util';
|
|
9
|
+
const exec = promisify(execFile);
|
|
10
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
11
|
+
let tmpDir;
|
|
12
|
+
async function createTmpDir() {
|
|
13
|
+
return fs.mkdtemp(path.join(os.tmpdir(), 'vt-git-snap-'));
|
|
14
|
+
}
|
|
15
|
+
async function writeFile(relativePath, content) {
|
|
16
|
+
const fullPath = path.join(tmpDir, relativePath);
|
|
17
|
+
await fs.mkdir(path.dirname(fullPath), { recursive: true });
|
|
18
|
+
await fs.writeFile(fullPath, content, 'utf8');
|
|
19
|
+
}
|
|
20
|
+
async function readFile(relativePath) {
|
|
21
|
+
return fs.readFile(path.join(tmpDir, relativePath), 'utf8');
|
|
22
|
+
}
|
|
23
|
+
async function fileExists(relativePath) {
|
|
24
|
+
try {
|
|
25
|
+
await fs.access(path.join(tmpDir, relativePath));
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function deleteFile(relativePath) {
|
|
33
|
+
try {
|
|
34
|
+
await fs.unlink(path.join(tmpDir, relativePath));
|
|
35
|
+
}
|
|
36
|
+
catch { }
|
|
37
|
+
}
|
|
38
|
+
async function listUserFiles() {
|
|
39
|
+
const results = [];
|
|
40
|
+
const walk = async (dir) => {
|
|
41
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
if (entry.name === '.git' || entry.name === '.variantree' || entry.name === 'node_modules')
|
|
44
|
+
continue;
|
|
45
|
+
const full = path.join(dir, entry.name);
|
|
46
|
+
if (entry.isDirectory())
|
|
47
|
+
await walk(full);
|
|
48
|
+
else
|
|
49
|
+
results.push(path.relative(tmpDir, full));
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
await walk(tmpDir);
|
|
53
|
+
return results.sort();
|
|
54
|
+
}
|
|
55
|
+
// ─── Tests: Existing Git Repo ────────────────────────────────────────────────
|
|
56
|
+
describe('GitSnapshotProvider (existing git repo)', () => {
|
|
57
|
+
let provider;
|
|
58
|
+
beforeEach(async () => {
|
|
59
|
+
tmpDir = await createTmpDir();
|
|
60
|
+
await exec('git', ['init', tmpDir]);
|
|
61
|
+
await exec('git', ['-C', tmpDir, 'config', 'user.email', 'test@test.com']);
|
|
62
|
+
await exec('git', ['-C', tmpDir, 'config', 'user.name', 'Test']);
|
|
63
|
+
// Need at least one commit for some git operations
|
|
64
|
+
await writeFile('.gitignore', '.variantree\nnode_modules\n');
|
|
65
|
+
await exec('git', ['-C', tmpDir, 'add', '-A']);
|
|
66
|
+
await exec('git', ['-C', tmpDir, 'commit', '-m', 'init', '--allow-empty']);
|
|
67
|
+
provider = new GitSnapshotProvider(tmpDir);
|
|
68
|
+
});
|
|
69
|
+
afterEach(async () => {
|
|
70
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
71
|
+
});
|
|
72
|
+
// ── capture ──────────────────────────────────────────────────
|
|
73
|
+
describe('capture', () => {
|
|
74
|
+
it('should return a valid git commit SHA', async () => {
|
|
75
|
+
await writeFile('auth.ts', 'export function auth() {}');
|
|
76
|
+
const ref = await provider.capture(tmpDir, 'test-checkpoint');
|
|
77
|
+
expect(ref).toMatch(/^[0-9a-f]{40}$/);
|
|
78
|
+
});
|
|
79
|
+
it('should capture all workspace files', async () => {
|
|
80
|
+
await writeFile('auth.ts', 'export function auth() {}');
|
|
81
|
+
await writeFile('server.ts', 'const app = express()');
|
|
82
|
+
await writeFile('src/config.ts', 'export default {}');
|
|
83
|
+
const ref = await provider.capture(tmpDir, 'three-files');
|
|
84
|
+
const count = await provider.getSnapshotFileCount(ref);
|
|
85
|
+
// .gitignore + 3 source files
|
|
86
|
+
expect(count).toBe(4);
|
|
87
|
+
});
|
|
88
|
+
it('should handle empty workspace (only .gitignore)', async () => {
|
|
89
|
+
const ref = await provider.capture(tmpDir, 'empty');
|
|
90
|
+
const count = await provider.getSnapshotFileCount(ref);
|
|
91
|
+
expect(count).toBe(1); // just .gitignore
|
|
92
|
+
});
|
|
93
|
+
it('should exclude .variantree directory', async () => {
|
|
94
|
+
await writeFile('app.ts', 'console.log("hi")');
|
|
95
|
+
await writeFile('.variantree/workspace.json', '{}');
|
|
96
|
+
const ref = await provider.capture(tmpDir, 'exclude-test');
|
|
97
|
+
const { stdout } = await exec('git', ['-C', tmpDir, 'ls-tree', '-r', '--name-only', ref]);
|
|
98
|
+
expect(stdout).toContain('app.ts');
|
|
99
|
+
expect(stdout).not.toContain('.variantree');
|
|
100
|
+
});
|
|
101
|
+
it('should not pollute git log', async () => {
|
|
102
|
+
await writeFile('app.ts', 'hello');
|
|
103
|
+
await provider.capture(tmpDir, 'hidden-checkpoint');
|
|
104
|
+
const { stdout } = await exec('git', ['-C', tmpDir, 'log', '--oneline']);
|
|
105
|
+
expect(stdout).not.toContain('variantree');
|
|
106
|
+
});
|
|
107
|
+
it('should not pollute git branch list', async () => {
|
|
108
|
+
await writeFile('app.ts', 'hello');
|
|
109
|
+
await provider.capture(tmpDir, 'hidden-checkpoint');
|
|
110
|
+
const { stdout } = await exec('git', ['-C', tmpDir, 'branch', '-a']);
|
|
111
|
+
expect(stdout).not.toContain('variantree');
|
|
112
|
+
});
|
|
113
|
+
it('should not modify the user staging area (index)', async () => {
|
|
114
|
+
await writeFile('staged.ts', 'staged content');
|
|
115
|
+
await exec('git', ['-C', tmpDir, 'add', 'staged.ts']);
|
|
116
|
+
// Unstaged file exists too
|
|
117
|
+
await writeFile('unstaged.ts', 'not staged');
|
|
118
|
+
// Capture should not change what's staged
|
|
119
|
+
await provider.capture(tmpDir, 'index-safe');
|
|
120
|
+
const { stdout } = await exec('git', ['-C', tmpDir, 'diff', '--cached', '--name-only']);
|
|
121
|
+
expect(stdout.trim()).toBe('staged.ts');
|
|
122
|
+
});
|
|
123
|
+
it('should create distinct refs for different snapshots', async () => {
|
|
124
|
+
await writeFile('file.ts', 'v1');
|
|
125
|
+
const ref1 = await provider.capture(tmpDir, 'first');
|
|
126
|
+
await writeFile('file.ts', 'v2');
|
|
127
|
+
const ref2 = await provider.capture(tmpDir, 'second');
|
|
128
|
+
expect(ref1).not.toBe(ref2);
|
|
129
|
+
});
|
|
130
|
+
it('should store snapshot under refs/variantree/', async () => {
|
|
131
|
+
await writeFile('app.ts', 'hello');
|
|
132
|
+
const ref = await provider.capture(tmpDir, 'ref-test');
|
|
133
|
+
const { stdout } = await exec('git', ['-C', tmpDir, 'show-ref']);
|
|
134
|
+
expect(stdout).toContain(`refs/variantree/${ref}`);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
// ── restore ──────────────────────────────────────────────────
|
|
138
|
+
describe('restore', () => {
|
|
139
|
+
it('should restore workspace to snapshot state', async () => {
|
|
140
|
+
await writeFile('auth.ts', 'v1');
|
|
141
|
+
await writeFile('server.ts', 'original');
|
|
142
|
+
const ref = await provider.capture(tmpDir, 'before-change');
|
|
143
|
+
// Modify workspace
|
|
144
|
+
await writeFile('auth.ts', 'v2-changed');
|
|
145
|
+
await writeFile('newfile.ts', 'should be deleted');
|
|
146
|
+
const summary = await provider.restore(tmpDir, ref);
|
|
147
|
+
expect(await readFile('auth.ts')).toBe('v1');
|
|
148
|
+
expect(await readFile('server.ts')).toBe('original');
|
|
149
|
+
expect(await fileExists('newfile.ts')).toBe(false);
|
|
150
|
+
expect(summary.written).toContain('auth.ts');
|
|
151
|
+
expect(summary.deleted).toContain('newfile.ts');
|
|
152
|
+
expect(summary.skipped).toContain('server.ts');
|
|
153
|
+
});
|
|
154
|
+
it('should restore deleted files', async () => {
|
|
155
|
+
await writeFile('important.ts', 'do not lose me');
|
|
156
|
+
const ref = await provider.capture(tmpDir, 'has-important');
|
|
157
|
+
await deleteFile('important.ts');
|
|
158
|
+
expect(await fileExists('important.ts')).toBe(false);
|
|
159
|
+
await provider.restore(tmpDir, ref);
|
|
160
|
+
expect(await fileExists('important.ts')).toBe(true);
|
|
161
|
+
expect(await readFile('important.ts')).toBe('do not lose me');
|
|
162
|
+
});
|
|
163
|
+
it('should delete files that did not exist at checkpoint', async () => {
|
|
164
|
+
await writeFile('original.ts', 'was here');
|
|
165
|
+
const ref = await provider.capture(tmpDir, 'original-only');
|
|
166
|
+
await writeFile('added-later.ts', 'new file');
|
|
167
|
+
await writeFile('also-new.ts', 'another');
|
|
168
|
+
const summary = await provider.restore(tmpDir, ref);
|
|
169
|
+
expect(await fileExists('added-later.ts')).toBe(false);
|
|
170
|
+
expect(await fileExists('also-new.ts')).toBe(false);
|
|
171
|
+
expect(summary.deleted).toContain('added-later.ts');
|
|
172
|
+
expect(summary.deleted).toContain('also-new.ts');
|
|
173
|
+
});
|
|
174
|
+
it('should skip unchanged files', async () => {
|
|
175
|
+
await writeFile('stable.ts', 'never changes');
|
|
176
|
+
await writeFile('changes.ts', 'v1');
|
|
177
|
+
const ref = await provider.capture(tmpDir, 'mixed');
|
|
178
|
+
await writeFile('changes.ts', 'v2');
|
|
179
|
+
const summary = await provider.restore(tmpDir, ref);
|
|
180
|
+
expect(summary.skipped).toContain('stable.ts');
|
|
181
|
+
expect(summary.written).toContain('changes.ts');
|
|
182
|
+
expect(await readFile('changes.ts')).toBe('v1');
|
|
183
|
+
});
|
|
184
|
+
it('should restore files in subdirectories', async () => {
|
|
185
|
+
await writeFile('src/auth/login.ts', 'login code');
|
|
186
|
+
await writeFile('src/auth/register.ts', 'register code');
|
|
187
|
+
await writeFile('src/index.ts', 'entry point');
|
|
188
|
+
const ref = await provider.capture(tmpDir, 'nested');
|
|
189
|
+
await writeFile('src/auth/login.ts', 'MODIFIED');
|
|
190
|
+
await deleteFile('src/auth/register.ts');
|
|
191
|
+
await provider.restore(tmpDir, ref);
|
|
192
|
+
expect(await readFile('src/auth/login.ts')).toBe('login code');
|
|
193
|
+
expect(await readFile('src/auth/register.ts')).toBe('register code');
|
|
194
|
+
});
|
|
195
|
+
it('should handle restoring to same state (no-op)', async () => {
|
|
196
|
+
await writeFile('app.ts', 'unchanged');
|
|
197
|
+
const ref = await provider.capture(tmpDir, 'same');
|
|
198
|
+
const summary = await provider.restore(tmpDir, ref);
|
|
199
|
+
expect(summary.written).toHaveLength(0);
|
|
200
|
+
expect(summary.deleted).toHaveLength(0);
|
|
201
|
+
expect(summary.skipped.length).toBeGreaterThan(0);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
// ── diff ─────────────────────────────────────────────────────
|
|
205
|
+
describe('diff', () => {
|
|
206
|
+
it('should detect added, modified, deleted, and unchanged files', async () => {
|
|
207
|
+
await writeFile('unchanged.ts', 'same');
|
|
208
|
+
await writeFile('will-modify.ts', 'v1');
|
|
209
|
+
await writeFile('will-delete.ts', 'going away');
|
|
210
|
+
const ref = await provider.capture(tmpDir, 'base');
|
|
211
|
+
await writeFile('will-modify.ts', 'v2');
|
|
212
|
+
await deleteFile('will-delete.ts');
|
|
213
|
+
await writeFile('brand-new.ts', 'just created');
|
|
214
|
+
const diff = await provider.diff(tmpDir, ref);
|
|
215
|
+
expect(diff.unchanged).toContain('unchanged.ts');
|
|
216
|
+
expect(diff.modified).toContain('will-modify.ts');
|
|
217
|
+
expect(diff.deleted).toContain('will-delete.ts');
|
|
218
|
+
expect(diff.added).toContain('brand-new.ts');
|
|
219
|
+
});
|
|
220
|
+
it('should report all unchanged when nothing changed', async () => {
|
|
221
|
+
await writeFile('a.ts', 'content-a');
|
|
222
|
+
await writeFile('b.ts', 'content-b');
|
|
223
|
+
const ref = await provider.capture(tmpDir, 'frozen');
|
|
224
|
+
const diff = await provider.diff(tmpDir, ref);
|
|
225
|
+
expect(diff.unchanged.length).toBeGreaterThanOrEqual(2);
|
|
226
|
+
expect(diff.added).toHaveLength(0);
|
|
227
|
+
expect(diff.modified).toHaveLength(0);
|
|
228
|
+
expect(diff.deleted).toHaveLength(0);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
// ── diffRefs ─────────────────────────────────────────────────
|
|
232
|
+
describe('diffRefs', () => {
|
|
233
|
+
it('should diff two snapshots without touching disk', async () => {
|
|
234
|
+
await writeFile('file.ts', 'version-1');
|
|
235
|
+
const refA = await provider.capture(tmpDir, 'v1');
|
|
236
|
+
await writeFile('file.ts', 'version-2');
|
|
237
|
+
await writeFile('new.ts', 'added');
|
|
238
|
+
const refB = await provider.capture(tmpDir, 'v2');
|
|
239
|
+
const diff = await provider.diffRefs(refA, refB);
|
|
240
|
+
expect(diff.modified).toContain('file.ts');
|
|
241
|
+
expect(diff.added).toContain('new.ts');
|
|
242
|
+
});
|
|
243
|
+
it('should detect deletion between refs', async () => {
|
|
244
|
+
await writeFile('doomed.ts', 'will be removed');
|
|
245
|
+
await writeFile('keeper.ts', 'stays');
|
|
246
|
+
const refA = await provider.capture(tmpDir, 'before-delete');
|
|
247
|
+
await deleteFile('doomed.ts');
|
|
248
|
+
const refB = await provider.capture(tmpDir, 'after-delete');
|
|
249
|
+
const diff = await provider.diffRefs(refA, refB);
|
|
250
|
+
expect(diff.deleted).toContain('doomed.ts');
|
|
251
|
+
expect(diff.unchanged).toContain('keeper.ts');
|
|
252
|
+
});
|
|
253
|
+
it('should return empty diff for identical refs', async () => {
|
|
254
|
+
await writeFile('app.ts', 'content');
|
|
255
|
+
const ref = await provider.capture(tmpDir, 'same');
|
|
256
|
+
const diff = await provider.diffRefs(ref, ref);
|
|
257
|
+
expect(diff.added).toHaveLength(0);
|
|
258
|
+
expect(diff.modified).toHaveLength(0);
|
|
259
|
+
expect(diff.deleted).toHaveLength(0);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
// ── drop ─────────────────────────────────────────────────────
|
|
263
|
+
describe('drop', () => {
|
|
264
|
+
it('should remove the ref from git', async () => {
|
|
265
|
+
await writeFile('app.ts', 'hello');
|
|
266
|
+
const ref = await provider.capture(tmpDir, 'to-drop');
|
|
267
|
+
const { stdout: before } = await exec('git', ['-C', tmpDir, 'show-ref']);
|
|
268
|
+
expect(before).toContain(`refs/variantree/${ref}`);
|
|
269
|
+
await provider.drop(ref);
|
|
270
|
+
const { stdout: after } = await exec('git', ['-C', tmpDir, 'show-ref']);
|
|
271
|
+
expect(after).not.toContain(`refs/variantree/${ref}`);
|
|
272
|
+
});
|
|
273
|
+
it('should not throw when dropping non-existent ref', async () => {
|
|
274
|
+
await expect(provider.drop('0000000000000000000000000000000000000000')).resolves.not.toThrow();
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
// ── getSnapshotFileCount ─────────────────────────────────────
|
|
278
|
+
describe('getSnapshotFileCount', () => {
|
|
279
|
+
it('should return correct file count', async () => {
|
|
280
|
+
await writeFile('a.ts', 'a');
|
|
281
|
+
await writeFile('b.ts', 'b');
|
|
282
|
+
await writeFile('src/c.ts', 'c');
|
|
283
|
+
const ref = await provider.capture(tmpDir, 'count');
|
|
284
|
+
// .gitignore + 3 source files
|
|
285
|
+
const count = await provider.getSnapshotFileCount(ref);
|
|
286
|
+
expect(count).toBe(4);
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
// ─── Tests: No Git Repo (internal repo) ──────────────────────────────────────
|
|
291
|
+
describe('GitSnapshotProvider (no existing git repo — internal repo)', () => {
|
|
292
|
+
let provider;
|
|
293
|
+
beforeEach(async () => {
|
|
294
|
+
tmpDir = await createTmpDir();
|
|
295
|
+
// NO git init — the provider should create its own repo
|
|
296
|
+
provider = new GitSnapshotProvider(tmpDir);
|
|
297
|
+
});
|
|
298
|
+
afterEach(async () => {
|
|
299
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
300
|
+
});
|
|
301
|
+
it('should auto-initialize an internal git repo', async () => {
|
|
302
|
+
await writeFile('app.ts', 'hello');
|
|
303
|
+
await provider.capture(tmpDir, 'auto-init');
|
|
304
|
+
const internalGit = path.join(tmpDir, '.variantree', 'git', '.git');
|
|
305
|
+
expect(fsSync.existsSync(path.join(internalGit, 'HEAD'))).toBe(true);
|
|
306
|
+
});
|
|
307
|
+
it('should capture and restore without user having git', async () => {
|
|
308
|
+
await writeFile('auth.ts', 'v1');
|
|
309
|
+
await writeFile('server.ts', 'original');
|
|
310
|
+
const ref = await provider.capture(tmpDir, 'no-git-test');
|
|
311
|
+
await writeFile('auth.ts', 'v2');
|
|
312
|
+
await writeFile('extra.ts', 'delete me');
|
|
313
|
+
const summary = await provider.restore(tmpDir, ref);
|
|
314
|
+
expect(await readFile('auth.ts')).toBe('v1');
|
|
315
|
+
expect(await readFile('server.ts')).toBe('original');
|
|
316
|
+
expect(await fileExists('extra.ts')).toBe(false);
|
|
317
|
+
expect(summary.written).toContain('auth.ts');
|
|
318
|
+
expect(summary.deleted).toContain('extra.ts');
|
|
319
|
+
});
|
|
320
|
+
it('should exclude .variantree from snapshots', async () => {
|
|
321
|
+
await writeFile('app.ts', 'code');
|
|
322
|
+
const ref = await provider.capture(tmpDir, 'exclude');
|
|
323
|
+
const internalGitDir = path.join(tmpDir, '.variantree', 'git', '.git');
|
|
324
|
+
const env = {
|
|
325
|
+
...process.env,
|
|
326
|
+
GIT_DIR: internalGitDir,
|
|
327
|
+
GIT_WORK_TREE: tmpDir,
|
|
328
|
+
};
|
|
329
|
+
const { stdout } = await exec('git', ['ls-tree', '-r', '--name-only', ref], { env });
|
|
330
|
+
expect(stdout).toContain('app.ts');
|
|
331
|
+
expect(stdout).not.toContain('.variantree');
|
|
332
|
+
});
|
|
333
|
+
it('should not create a .git in the workspace root', async () => {
|
|
334
|
+
await writeFile('app.ts', 'hello');
|
|
335
|
+
await provider.capture(tmpDir, 'no-root-git');
|
|
336
|
+
expect(fsSync.existsSync(path.join(tmpDir, '.git'))).toBe(false);
|
|
337
|
+
});
|
|
338
|
+
it('should diff between snapshots', async () => {
|
|
339
|
+
await writeFile('file.ts', 'v1');
|
|
340
|
+
const refA = await provider.capture(tmpDir, 'v1');
|
|
341
|
+
await writeFile('file.ts', 'v2');
|
|
342
|
+
await writeFile('new.ts', 'added');
|
|
343
|
+
const refB = await provider.capture(tmpDir, 'v2');
|
|
344
|
+
const diff = await provider.diffRefs(refA, refB);
|
|
345
|
+
expect(diff.modified).toContain('file.ts');
|
|
346
|
+
expect(diff.added).toContain('new.ts');
|
|
347
|
+
});
|
|
348
|
+
it('should reuse existing internal repo on subsequent instantiations', async () => {
|
|
349
|
+
await writeFile('app.ts', 'v1');
|
|
350
|
+
const ref1 = await provider.capture(tmpDir, 'first');
|
|
351
|
+
// Create a new provider instance pointing to the same dir
|
|
352
|
+
const provider2 = new GitSnapshotProvider(tmpDir);
|
|
353
|
+
await writeFile('app.ts', 'v2');
|
|
354
|
+
const ref2 = await provider2.capture(tmpDir, 'second');
|
|
355
|
+
expect(ref1).not.toBe(ref2);
|
|
356
|
+
// Restore using the new provider should work with old ref
|
|
357
|
+
await provider2.restore(tmpDir, ref1);
|
|
358
|
+
expect(await readFile('app.ts')).toBe('v1');
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
// ─── Tests: Integration with VariantTree engine ──────────────────────────────
|
|
362
|
+
describe('GitSnapshotProvider + VariantTree engine', () => {
|
|
363
|
+
let provider;
|
|
364
|
+
beforeEach(async () => {
|
|
365
|
+
tmpDir = await createTmpDir();
|
|
366
|
+
await exec('git', ['init', tmpDir]);
|
|
367
|
+
await exec('git', ['-C', tmpDir, 'config', 'user.email', 'test@test.com']);
|
|
368
|
+
await exec('git', ['-C', tmpDir, 'config', 'user.name', 'Test']);
|
|
369
|
+
await writeFile('.gitignore', '.variantree\n');
|
|
370
|
+
await exec('git', ['-C', tmpDir, 'add', '-A']);
|
|
371
|
+
await exec('git', ['-C', tmpDir, 'commit', '-m', 'init']);
|
|
372
|
+
provider = new GitSnapshotProvider(tmpDir);
|
|
373
|
+
});
|
|
374
|
+
afterEach(async () => {
|
|
375
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
376
|
+
});
|
|
377
|
+
it('should work end-to-end: capture → modify → branch → restore', async () => {
|
|
378
|
+
// Simulate: user builds auth, checkpoints, then branches to try a different approach
|
|
379
|
+
// Step 1: Initial code
|
|
380
|
+
await writeFile('src/auth.ts', 'export function auth() { return "jwt"; }');
|
|
381
|
+
await writeFile('src/server.ts', 'import { auth } from "./auth";');
|
|
382
|
+
const cpMain = await provider.capture(tmpDir, 'auth-working');
|
|
383
|
+
// Step 2: User modifies to try OAuth instead
|
|
384
|
+
await writeFile('src/auth.ts', 'export function auth() { return "oauth"; }');
|
|
385
|
+
await writeFile('src/oauth-client.ts', 'export class OAuthClient {}');
|
|
386
|
+
const cpOauth = await provider.capture(tmpDir, 'trying-oauth');
|
|
387
|
+
// Step 3: OAuth didn't work, restore to JWT checkpoint
|
|
388
|
+
const summary = await provider.restore(tmpDir, cpMain);
|
|
389
|
+
expect(await readFile('src/auth.ts')).toBe('export function auth() { return "jwt"; }');
|
|
390
|
+
expect(await readFile('src/server.ts')).toBe('import { auth } from "./auth";');
|
|
391
|
+
expect(await fileExists('src/oauth-client.ts')).toBe(false);
|
|
392
|
+
expect(summary.written).toContain('src/auth.ts');
|
|
393
|
+
expect(summary.deleted).toContain('src/oauth-client.ts');
|
|
394
|
+
// Step 4: Can still go back to OAuth if needed
|
|
395
|
+
await provider.restore(tmpDir, cpOauth);
|
|
396
|
+
expect(await readFile('src/auth.ts')).toBe('export function auth() { return "oauth"; }');
|
|
397
|
+
expect(await fileExists('src/oauth-client.ts')).toBe(true);
|
|
398
|
+
});
|
|
399
|
+
it('should handle multiple branches with independent snapshots', async () => {
|
|
400
|
+
// Main branch state
|
|
401
|
+
await writeFile('src/app.ts', 'base code');
|
|
402
|
+
const cpBase = await provider.capture(tmpDir, 'base');
|
|
403
|
+
// Branch A: add feature A
|
|
404
|
+
await writeFile('src/feature-a.ts', 'feature A code');
|
|
405
|
+
await writeFile('src/app.ts', 'base code + feature A');
|
|
406
|
+
const cpA = await provider.capture(tmpDir, 'feature-a');
|
|
407
|
+
// Go back to base, start branch B
|
|
408
|
+
await provider.restore(tmpDir, cpBase);
|
|
409
|
+
await writeFile('src/feature-b.ts', 'feature B code');
|
|
410
|
+
await writeFile('src/app.ts', 'base code + feature B');
|
|
411
|
+
const cpB = await provider.capture(tmpDir, 'feature-b');
|
|
412
|
+
// Verify branch B state
|
|
413
|
+
expect(await readFile('src/app.ts')).toBe('base code + feature B');
|
|
414
|
+
expect(await fileExists('src/feature-b.ts')).toBe(true);
|
|
415
|
+
expect(await fileExists('src/feature-a.ts')).toBe(false);
|
|
416
|
+
// Switch to branch A
|
|
417
|
+
await provider.restore(tmpDir, cpA);
|
|
418
|
+
expect(await readFile('src/app.ts')).toBe('base code + feature A');
|
|
419
|
+
expect(await fileExists('src/feature-a.ts')).toBe(true);
|
|
420
|
+
expect(await fileExists('src/feature-b.ts')).toBe(false);
|
|
421
|
+
// Diff between branches
|
|
422
|
+
const diff = await provider.diffRefs(cpA, cpB);
|
|
423
|
+
expect(diff.modified).toContain('src/app.ts');
|
|
424
|
+
expect(diff.added).toContain('src/feature-b.ts');
|
|
425
|
+
expect(diff.deleted).toContain('src/feature-a.ts');
|
|
426
|
+
});
|
|
427
|
+
it('should handle binary-ish content (non-UTF8)', async () => {
|
|
428
|
+
const binaryContent = Buffer.from([0x00, 0x01, 0xFF, 0xFE, 0x89, 0x50]);
|
|
429
|
+
await fs.writeFile(path.join(tmpDir, 'binary.bin'), binaryContent);
|
|
430
|
+
const ref = await provider.capture(tmpDir, 'with-binary');
|
|
431
|
+
await fs.writeFile(path.join(tmpDir, 'binary.bin'), Buffer.from([0xAA]));
|
|
432
|
+
await provider.restore(tmpDir, ref);
|
|
433
|
+
const restored = await fs.readFile(path.join(tmpDir, 'binary.bin'));
|
|
434
|
+
expect(Buffer.compare(restored, binaryContent)).toBe(0);
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
//# sourceMappingURL=git-snapshot.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-snapshot.test.js","sourceRoot":"","sources":["../../src/__tests__/git-snapshot.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
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
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=integration.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|