@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
package/dist/watcher.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @variantree/watcher — VariantreeWatcher
|
|
3
|
+
*
|
|
4
|
+
* Watches an AI tool's session for new messages using chokidar.
|
|
5
|
+
* On every change event:
|
|
6
|
+
* 1. Reads messages via the adapter's readMessagesAsync
|
|
7
|
+
* 2. Diffs to find new messages
|
|
8
|
+
* 3. Adds new messages to the active Variantree branch
|
|
9
|
+
*/
|
|
10
|
+
import chokidar from 'chokidar';
|
|
11
|
+
import fs from 'node:fs';
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
import os from 'node:os';
|
|
14
|
+
import { MessageDiffer } from './differ.js';
|
|
15
|
+
export class VariantreeWatcher {
|
|
16
|
+
watcher = null;
|
|
17
|
+
differ = new MessageDiffer();
|
|
18
|
+
opts;
|
|
19
|
+
sessionId = null;
|
|
20
|
+
constructor(opts) {
|
|
21
|
+
this.opts = opts;
|
|
22
|
+
}
|
|
23
|
+
async start() {
|
|
24
|
+
const { workspacePath, adapter, engine, onSync, onError } = this.opts;
|
|
25
|
+
this.sessionId = await adapter.getCurrentSessionId(workspacePath);
|
|
26
|
+
if (!this.sessionId) {
|
|
27
|
+
console.warn(`[variantree] No ${adapter.name} session found for ${workspacePath}`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// For OpenCode: watch the WAL file (changes on every DB write)
|
|
31
|
+
// For Claude Code: watch the JSONL session file directly
|
|
32
|
+
const watchTarget = this.resolveWatchTarget(workspacePath);
|
|
33
|
+
console.log(`[variantree] Watching ${adapter.name} session for ${workspacePath}`);
|
|
34
|
+
const sync = async () => {
|
|
35
|
+
try {
|
|
36
|
+
// Re-discover session on each tick in case a new session started
|
|
37
|
+
const currentId = await adapter.getCurrentSessionId(workspacePath);
|
|
38
|
+
if (currentId && currentId !== this.sessionId) {
|
|
39
|
+
this.sessionId = currentId;
|
|
40
|
+
this.differ.reset();
|
|
41
|
+
}
|
|
42
|
+
if (!this.sessionId)
|
|
43
|
+
return;
|
|
44
|
+
const allMessages = await adapter.readMessagesAsync(workspacePath, this.sessionId);
|
|
45
|
+
const newMessages = this.differ.diff(allMessages);
|
|
46
|
+
for (const msg of newMessages) {
|
|
47
|
+
await engine.addMessage(msg.role, msg.content, { source: adapter.name });
|
|
48
|
+
}
|
|
49
|
+
if (newMessages.length > 0)
|
|
50
|
+
onSync?.(newMessages.length);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
onError?.(err instanceof Error ? err : new Error(String(err)));
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
this.watcher = chokidar.watch(watchTarget, {
|
|
57
|
+
persistent: true,
|
|
58
|
+
usePolling: false,
|
|
59
|
+
interval: 2000,
|
|
60
|
+
awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 50 },
|
|
61
|
+
});
|
|
62
|
+
this.watcher.on('change', sync);
|
|
63
|
+
this.watcher.on('error', (err) => onError?.(err instanceof Error ? err : new Error(String(err))));
|
|
64
|
+
await sync();
|
|
65
|
+
}
|
|
66
|
+
async stop() {
|
|
67
|
+
await this.watcher?.close();
|
|
68
|
+
this.watcher = null;
|
|
69
|
+
this.differ.reset();
|
|
70
|
+
console.log('[variantree] Watcher stopped');
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Pick the best file to watch for changes.
|
|
74
|
+
* OpenCode: the WAL file changes on every DB write.
|
|
75
|
+
* Claude Code: the session JSONL file itself.
|
|
76
|
+
* Fallback: poll the workspace directory.
|
|
77
|
+
*/
|
|
78
|
+
resolveWatchTarget(workspacePath) {
|
|
79
|
+
const ocWal = path.join(process.env.XDG_DATA_HOME ?? path.join(os.homedir(), '.local', 'share'), 'opencode', 'opencode.db-wal');
|
|
80
|
+
if (fs.existsSync(ocWal))
|
|
81
|
+
return ocWal;
|
|
82
|
+
if (this.sessionId && fs.existsSync(this.sessionId))
|
|
83
|
+
return this.sessionId;
|
|
84
|
+
return workspacePath;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@variantree/watcher",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Passive session file watcher and CLI for Variantree",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"variantree": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "tsc --watch",
|
|
17
|
+
"test": "vitest run",
|
|
18
|
+
"test:watch": "vitest",
|
|
19
|
+
"postinstall": "node scripts/postinstall.js"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"ai",
|
|
23
|
+
"conversation",
|
|
24
|
+
"version-control",
|
|
25
|
+
"watcher",
|
|
26
|
+
"opencode",
|
|
27
|
+
"claude-code"
|
|
28
|
+
],
|
|
29
|
+
"license": "PolyForm-Noncommercial-1.0.0",
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@variantree/core": "^0.1.0",
|
|
35
|
+
"better-sqlite3": "^12.9.0",
|
|
36
|
+
"chalk": "^5.6.2",
|
|
37
|
+
"chokidar": "^4.0.3",
|
|
38
|
+
"commander": "^12.1.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
42
|
+
"@types/node": "^22.0.0",
|
|
43
|
+
"typescript": "^5.7.0",
|
|
44
|
+
"vitest": "^3.0.0"
|
|
45
|
+
}
|
|
46
|
+
}
|