@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.
Files changed (117) hide show
  1. package/dist/__tests__/git-snapshot.test.d.ts +2 -0
  2. package/dist/__tests__/git-snapshot.test.d.ts.map +1 -0
  3. package/dist/__tests__/git-snapshot.test.js +437 -0
  4. package/dist/__tests__/git-snapshot.test.js.map +1 -0
  5. package/dist/__tests__/integration.test.d.ts +10 -0
  6. package/dist/__tests__/integration.test.d.ts.map +1 -0
  7. package/dist/__tests__/integration.test.js +316 -0
  8. package/dist/__tests__/integration.test.js.map +1 -0
  9. package/dist/__tests__/watcher.test.d.ts +2 -0
  10. package/dist/__tests__/watcher.test.d.ts.map +1 -0
  11. package/dist/__tests__/watcher.test.js +375 -0
  12. package/dist/__tests__/watcher.test.js.map +1 -0
  13. package/dist/adapters/aider.d.ts +21 -0
  14. package/dist/adapters/aider.d.ts.map +1 -0
  15. package/dist/adapters/aider.js +42 -0
  16. package/dist/adapters/aider.js.map +1 -0
  17. package/dist/adapters/base.d.ts +3 -0
  18. package/dist/adapters/base.d.ts.map +1 -0
  19. package/dist/adapters/base.js +2 -0
  20. package/dist/adapters/base.js.map +1 -0
  21. package/dist/adapters/claude-code.d.ts +17 -0
  22. package/dist/adapters/claude-code.d.ts.map +1 -0
  23. package/dist/adapters/claude-code.js +58 -0
  24. package/dist/adapters/claude-code.js.map +1 -0
  25. package/dist/adapters/opencode.d.ts +3 -0
  26. package/dist/adapters/opencode.d.ts.map +1 -0
  27. package/dist/adapters/opencode.js +3 -0
  28. package/dist/adapters/opencode.js.map +1 -0
  29. package/dist/agents-md.d.ts +18 -0
  30. package/dist/agents-md.d.ts.map +1 -0
  31. package/dist/agents-md.js +93 -0
  32. package/dist/agents-md.js.map +1 -0
  33. package/dist/cli.d.ts +9 -0
  34. package/dist/cli.d.ts.map +1 -0
  35. package/dist/cli.js +511 -0
  36. package/dist/cli.js.map +1 -0
  37. package/dist/differ.d.ts +18 -0
  38. package/dist/differ.d.ts.map +1 -0
  39. package/dist/differ.js +23 -0
  40. package/dist/differ.js.map +1 -0
  41. package/dist/index.d.ts +17 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +23 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/node/blob-store.d.ts +16 -0
  46. package/dist/node/blob-store.d.ts.map +1 -0
  47. package/dist/node/blob-store.js +47 -0
  48. package/dist/node/blob-store.js.map +1 -0
  49. package/dist/node/fs-adapter.d.ts +17 -0
  50. package/dist/node/fs-adapter.d.ts.map +1 -0
  51. package/dist/node/fs-adapter.js +110 -0
  52. package/dist/node/fs-adapter.js.map +1 -0
  53. package/dist/node/git-snapshot.d.ts +46 -0
  54. package/dist/node/git-snapshot.d.ts.map +1 -0
  55. package/dist/node/git-snapshot.js +282 -0
  56. package/dist/node/git-snapshot.js.map +1 -0
  57. package/dist/node/session-launcher.d.ts +14 -0
  58. package/dist/node/session-launcher.d.ts.map +1 -0
  59. package/dist/node/session-launcher.js +28 -0
  60. package/dist/node/session-launcher.js.map +1 -0
  61. package/dist/node/storage.d.ts +17 -0
  62. package/dist/node/storage.d.ts.map +1 -0
  63. package/dist/node/storage.js +56 -0
  64. package/dist/node/storage.js.map +1 -0
  65. package/dist/sync.d.ts +16 -0
  66. package/dist/sync.d.ts.map +1 -0
  67. package/dist/sync.js +58 -0
  68. package/dist/sync.js.map +1 -0
  69. package/dist/tools/base.d.ts +52 -0
  70. package/dist/tools/base.d.ts.map +1 -0
  71. package/dist/tools/base.js +10 -0
  72. package/dist/tools/base.js.map +1 -0
  73. package/dist/tools/claudecode/adapter.d.ts +26 -0
  74. package/dist/tools/claudecode/adapter.d.ts.map +1 -0
  75. package/dist/tools/claudecode/adapter.js +111 -0
  76. package/dist/tools/claudecode/adapter.js.map +1 -0
  77. package/dist/tools/claudecode/config.d.ts +8 -0
  78. package/dist/tools/claudecode/config.d.ts.map +1 -0
  79. package/dist/tools/claudecode/config.js +34 -0
  80. package/dist/tools/claudecode/config.js.map +1 -0
  81. package/dist/tools/claudecode/index.d.ts +9 -0
  82. package/dist/tools/claudecode/index.d.ts.map +1 -0
  83. package/dist/tools/claudecode/index.js +16 -0
  84. package/dist/tools/claudecode/index.js.map +1 -0
  85. package/dist/tools/claudecode/instructions.d.ts +7 -0
  86. package/dist/tools/claudecode/instructions.d.ts.map +1 -0
  87. package/dist/tools/claudecode/instructions.js +21 -0
  88. package/dist/tools/claudecode/instructions.js.map +1 -0
  89. package/dist/tools/index.d.ts +24 -0
  90. package/dist/tools/index.d.ts.map +1 -0
  91. package/dist/tools/index.js +42 -0
  92. package/dist/tools/index.js.map +1 -0
  93. package/dist/tools/instructions.d.ts +19 -0
  94. package/dist/tools/instructions.d.ts.map +1 -0
  95. package/dist/tools/instructions.js +93 -0
  96. package/dist/tools/instructions.js.map +1 -0
  97. package/dist/tools/opencode/adapter.d.ts +46 -0
  98. package/dist/tools/opencode/adapter.d.ts.map +1 -0
  99. package/dist/tools/opencode/adapter.js +166 -0
  100. package/dist/tools/opencode/adapter.js.map +1 -0
  101. package/dist/tools/opencode/config.d.ts +8 -0
  102. package/dist/tools/opencode/config.d.ts.map +1 -0
  103. package/dist/tools/opencode/config.js +37 -0
  104. package/dist/tools/opencode/config.js.map +1 -0
  105. package/dist/tools/opencode/index.d.ts +9 -0
  106. package/dist/tools/opencode/index.d.ts.map +1 -0
  107. package/dist/tools/opencode/index.js +16 -0
  108. package/dist/tools/opencode/index.js.map +1 -0
  109. package/dist/tools/opencode/instructions.d.ts +10 -0
  110. package/dist/tools/opencode/instructions.d.ts.map +1 -0
  111. package/dist/tools/opencode/instructions.js +26 -0
  112. package/dist/tools/opencode/instructions.js.map +1 -0
  113. package/dist/watcher.d.ts +40 -0
  114. package/dist/watcher.d.ts.map +1 -0
  115. package/dist/watcher.js +87 -0
  116. package/dist/watcher.js.map +1 -0
  117. package/package.json +46 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * @variantree/watcher — AGENTS.md content
3
+ *
4
+ * Standing instructions written to the project root so OpenCode (and
5
+ * compatible tools) know when and how to use Variantree proactively.
6
+ *
7
+ * Shared between `variantree init` (CLI) and the MCP server bootstrap.
8
+ */
9
+ const MARKER = '<!-- variantree:agents -->';
10
+ export const AGENTS_MD_SECTION = `${MARKER}
11
+ ## Variantree — AI Version Control
12
+
13
+ You have access to Variantree MCP tools for managing conversation context and
14
+ code snapshots. Use them **proactively** — don't wait for the user to ask.
15
+
16
+ ### On session start
17
+ - If \`.variantree/branch-context.md\` exists, read it immediately for context
18
+ on prior work done on this branch.
19
+
20
+ ### When to checkpoint
21
+ - After completing a distinct task or sub-task (e.g. "auth is working",
22
+ "tests pass", "refactor done").
23
+ - When the user says "done", "looks good", "ship it", or "let's move on".
24
+ - Before any branch, switch, or restore — the tools will warn you if you
25
+ forget, but it's better to checkpoint proactively.
26
+
27
+ ### When to branch
28
+ - When the user wants to explore an alternative approach ("let's try X
29
+ instead", "what if we used Y").
30
+ - When the user asks to experiment without losing current progress.
31
+
32
+ ### When to switch / restore
33
+ - When the user wants to go back to a previous line of work or a known-good
34
+ state ("go back to main", "restore the working version").
35
+
36
+ ### Handling unsaved-message warnings
37
+ If a tool returns an unsaved-message warning (e.g. "4 messages will be lost"):
38
+ 1. **STOP** — do NOT silently pass \`force: true\`.
39
+ 2. Tell the user exactly how many messages will be lost.
40
+ 3. Ask: *"Should I checkpoint first to save them, or discard them and
41
+ proceed?"*
42
+ 4. Only use \`force: true\` after the user explicitly says to discard /
43
+ proceed without saving.
44
+
45
+ ### Presenting results to the user
46
+ **IMPORTANT:** Always relay the COMPLETE tool output to the user. Do not
47
+ summarise or omit details. Specifically:
48
+
49
+ - **checkpoint:** Show messages synced count, snapshot diff (files added,
50
+ modified, deleted), and total file count.
51
+ - **branch / switch / restore:** Show files written and deleted, then show
52
+ the full conversation context summary that was returned.
53
+ - **status:** Show ALL fields: active branch, message count, every branch
54
+ name, and every checkpoint label with snapshot indicator.
55
+ - **tree:** Show the FULL tree output exactly as returned — branches AND
56
+ checkpoints. Do not collapse or summarise it.
57
+ - **log:** Show the full conversation history returned by the tool.
58
+
59
+ ### Tool reference
60
+ | Tool | Purpose |
61
+ |-------------|----------------------------------------------|
62
+ | checkpoint | Sync conversation + snapshot code |
63
+ | branch | Create a new branch from a checkpoint |
64
+ | switch | Switch to an existing branch |
65
+ | restore | Restore code to a specific checkpoint |
66
+ | status | Show active branch, checkpoints |
67
+ | tree | ASCII tree of branches and checkpoints |
68
+ | log | Show conversation history for a branch |
69
+ ${MARKER}`;
70
+ /**
71
+ * Write or merge the Variantree section into an AGENTS.md file.
72
+ *
73
+ * - If the file doesn't exist, creates it.
74
+ * - If it exists but has no Variantree section, appends.
75
+ * - If it already has the section, replaces it (safe update).
76
+ */
77
+ export function mergeAgentsMd(existingContent) {
78
+ if (!existingContent) {
79
+ return `# AGENTS\n\n${AGENTS_MD_SECTION}\n`;
80
+ }
81
+ const markerStart = existingContent.indexOf(MARKER);
82
+ if (markerStart === -1) {
83
+ return existingContent.trimEnd() + '\n\n' + AGENTS_MD_SECTION + '\n';
84
+ }
85
+ const markerEnd = existingContent.indexOf(MARKER, markerStart + MARKER.length);
86
+ if (markerEnd === -1) {
87
+ return existingContent.trimEnd() + '\n\n' + AGENTS_MD_SECTION + '\n';
88
+ }
89
+ const before = existingContent.slice(0, markerStart);
90
+ const after = existingContent.slice(markerEnd + MARKER.length);
91
+ return before + AGENTS_MD_SECTION + after;
92
+ }
93
+ //# sourceMappingURL=agents-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md.js","sourceRoot":"","sources":["../src/agents-md.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,GAAG,4BAA4B,CAAC;AAE5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2DxC,MAAM,EAAE,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,eAA8B;IAC1D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,eAAe,iBAAiB,IAAI,CAAC;IAC9C,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;QACvB,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAAC;IACvE,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/E,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/D,OAAO,MAAM,GAAG,iBAAiB,GAAG,KAAK,CAAC;AAC5C,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @variantree/watcher — CLI
4
+ *
5
+ * On-demand mode: no background watcher needed.
6
+ * Every command reads the conversation from OpenCode's SQLite on demand.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
package/dist/cli.js ADDED
@@ -0,0 +1,511 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @variantree/watcher — CLI
4
+ *
5
+ * On-demand mode: no background watcher needed.
6
+ * Every command reads the conversation from OpenCode's SQLite on demand.
7
+ */
8
+ import { Command } from 'commander';
9
+ import chalk from 'chalk';
10
+ import path from 'node:path';
11
+ import fsSync from 'node:fs';
12
+ import readline from 'node:readline';
13
+ import { VariantTree } from '@variantree/core';
14
+ import { NodeStorage } from './node/storage.js';
15
+ import { GitSnapshotProvider } from './node/git-snapshot.js';
16
+ import { VariantreeWatcher } from './watcher.js';
17
+ import { launchOpenCodeSession } from './node/session-launcher.js';
18
+ import { ensureProjectInstructions, VARIANTREE_MARKER, ALL_TOOLS } from './tools/index.js';
19
+ import { syncConversation } from './sync.js';
20
+ // ─── Theme ────────────────────────────────────────────────────────────────
21
+ const WORKSPACE_ID = 'default';
22
+ const brand = chalk.hex('#A78BFA'); // purple
23
+ const accent = chalk.hex('#34D399'); // green
24
+ const dim = chalk.dim;
25
+ const warn = chalk.hex('#FBBF24'); // amber
26
+ const err = chalk.hex('#F87171'); // red
27
+ const info = chalk.hex('#60A5FA'); // blue
28
+ const LOGO = brand('◆ variantree');
29
+ const CHECK = accent('✓');
30
+ const CROSS = err('✗');
31
+ const DOT = dim('·');
32
+ const ARROW = dim('→');
33
+ const BRANCH_ICON = brand('⎇');
34
+ const SNAP = dim('◈');
35
+ const TREE_VERT = dim('│');
36
+ const TREE_FORK = dim('├──');
37
+ const TREE_END = dim('└──');
38
+ // ─── Helpers ──────────────────────────────────────────────────────────────
39
+ function header(text) {
40
+ console.log('');
41
+ console.log(` ${LOGO} ${dim('·')} ${text}`);
42
+ console.log('');
43
+ }
44
+ function success(text) {
45
+ console.log(` ${CHECK} ${text}`);
46
+ }
47
+ function detail(label, value) {
48
+ console.log(` ${dim(label.padEnd(14))} ${value}`);
49
+ }
50
+ function errorMsg(text) {
51
+ console.log(` ${CROSS} ${err(text)}`);
52
+ }
53
+ function hint(text) {
54
+ console.log(` ${dim(text)}`);
55
+ }
56
+ function divider() {
57
+ console.log('');
58
+ }
59
+ function nextSteps() {
60
+ console.log(` ${ARROW} ${chalk.white('Next steps:')}`);
61
+ console.log(` 1. Restart OpenCode ${dim('(quit and reopen)')}`);
62
+ console.log(` 2. Tell it: ${info('"Read .variantree/branch-context.md for context"')}`);
63
+ }
64
+ function printBranchNode(branch, allBranches, allCheckpoints, indent, isLast) {
65
+ const connector = indent === '' ? '' : (isLast ? TREE_END : TREE_FORK) + ' ';
66
+ const nameColor = branch.isActive ? accent : chalk.white;
67
+ const activeTag = branch.isActive ? accent(' ●') : '';
68
+ console.log(` ${dim(indent)}${connector}${nameColor.bold(branch.name)} ${dim(`(${branch.messageCount} msgs)`)}${activeTag}`);
69
+ const branchCps = allCheckpoints
70
+ .filter(cp => cp.branchId === branch.id)
71
+ .sort((a, b) => a.createdAt - b.createdAt);
72
+ const childIndent = indent === ''
73
+ ? ' '
74
+ : indent + (isLast ? ' ' : '│ ');
75
+ for (let i = 0; i < branchCps.length; i++) {
76
+ const cp = branchCps[i];
77
+ const childBranches = allBranches.filter(b => b.parentCheckpointId === cp.id);
78
+ const cpIsLast = i === branchCps.length - 1 && childBranches.length === 0;
79
+ const cpConnector = cpIsLast ? TREE_END : TREE_FORK;
80
+ const snap = cp.snapshotRef ? ` ${SNAP}` : '';
81
+ const time = dim(formatTime(cp.createdAt));
82
+ console.log(` ${dim(childIndent)}${cpConnector} ${warn(cp.label)}${snap} ${time}`);
83
+ const continuation = cpIsLast ? ' ' : '│ ';
84
+ for (let j = 0; j < childBranches.length; j++) {
85
+ printBranchNode(childBranches[j], allBranches, allCheckpoints, childIndent + continuation, j === childBranches.length - 1);
86
+ }
87
+ }
88
+ if (branchCps.length === 0) {
89
+ console.log(` ${dim(childIndent)}${TREE_END} ${dim('no checkpoints')}`);
90
+ }
91
+ }
92
+ /** Build a fully-configured engine. */
93
+ function createEngine(cwd) {
94
+ const storage = new NodeStorage(cwd);
95
+ const snapshotProvider = new GitSnapshotProvider(cwd);
96
+ const engine = new VariantTree({
97
+ storage,
98
+ snapshotProvider,
99
+ });
100
+ return { engine, storage, snapshotProvider };
101
+ }
102
+ /** Load or auto-initialise workspace. */
103
+ async function ensureWorkspace(cwd) {
104
+ const { engine, storage } = createEngine(cwd);
105
+ let ws = await engine.loadWorkspace(WORKSPACE_ID);
106
+ if (!ws) {
107
+ ws = await engine.createWorkspace('My Project');
108
+ ws.id = WORKSPACE_ID;
109
+ await storage.save(WORKSPACE_ID, ws);
110
+ await engine.loadWorkspace(WORKSPACE_ID);
111
+ console.log(` ${dim('workspace initialised')}`);
112
+ }
113
+ return { engine, storage };
114
+ }
115
+ /** Generate .variantree/branch-context.md */
116
+ function generateContextFile(cwd, branchName, messages) {
117
+ const contextDir = path.join(cwd, '.variantree');
118
+ if (!fsSync.existsSync(contextDir))
119
+ fsSync.mkdirSync(contextDir, { recursive: true });
120
+ const lines = [
121
+ `# Variantree Branch Context`,
122
+ ``,
123
+ `**Branch:** ${branchName}`,
124
+ `**Generated:** ${new Date().toISOString()}`,
125
+ ``,
126
+ `> This file was auto-generated by Variantree. It contains the conversation`,
127
+ `> history up to the point where this branch was created. Read this to`,
128
+ `> understand the context of what has been done so far.`,
129
+ ``,
130
+ `---`,
131
+ ``,
132
+ `## Conversation History`,
133
+ ``,
134
+ ];
135
+ if (messages.length === 0) {
136
+ lines.push('_No messages recorded at this checkpoint._');
137
+ }
138
+ else {
139
+ for (const msg of messages) {
140
+ const prefix = msg.role === 'user' ? '**User:**' : '**Assistant:**';
141
+ const content = msg.content.length > 500
142
+ ? msg.content.slice(0, 500) + '...'
143
+ : msg.content;
144
+ lines.push(`${prefix} ${content}`, '');
145
+ }
146
+ }
147
+ const filePath = path.join(contextDir, 'branch-context.md');
148
+ fsSync.writeFileSync(filePath, lines.join('\n'), 'utf8');
149
+ return filePath;
150
+ }
151
+ /** Prompt the user with a yes/no question. Defaults to yes (enter = Y). */
152
+ async function promptConfirm(question) {
153
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
154
+ return new Promise((resolve) => {
155
+ rl.question(question, (answer) => {
156
+ rl.close();
157
+ resolve(answer.trim().toLowerCase() !== 'n');
158
+ });
159
+ });
160
+ }
161
+ /**
162
+ * Count messages on the active branch that have been added since the last checkpoint.
163
+ * These would be lost if the user switches/branches without checkpointing first.
164
+ */
165
+ function countUnsavedMessages(engine) {
166
+ const branch = engine.getActiveBranch();
167
+ const branchCheckpoints = engine
168
+ .getCheckpointsForBranch(branch.id)
169
+ .sort((a, b) => a.createdAt - b.createdAt);
170
+ if (branchCheckpoints.length === 0)
171
+ return branch.messages.length;
172
+ const lastCp = branchCheckpoints[branchCheckpoints.length - 1];
173
+ return Math.max(0, branch.messages.length - 1 - lastCp.messageIndex);
174
+ }
175
+ function formatTime(ts) {
176
+ const d = new Date(ts);
177
+ const now = new Date();
178
+ const diff = now.getTime() - d.getTime();
179
+ if (diff < 60_000)
180
+ return 'just now';
181
+ if (diff < 3_600_000)
182
+ return `${Math.floor(diff / 60_000)}m ago`;
183
+ if (diff < 86_400_000)
184
+ return `${Math.floor(diff / 3_600_000)}h ago`;
185
+ return d.toLocaleDateString();
186
+ }
187
+ // ─── CLI ──────────────────────────────────────────────────────────────────
188
+ const program = new Command();
189
+ program
190
+ .name('variantree')
191
+ .description(brand('Version control for AI conversations'))
192
+ .version('0.1.0');
193
+ // ── init ──────────────────────────────────────────────────────────────────
194
+ program
195
+ .command('init')
196
+ .description('Initialise a Variantree workspace')
197
+ .option('-d, --dir <path>', 'workspace directory', process.cwd())
198
+ .action(async (opts) => {
199
+ const cwd = path.resolve(opts.dir);
200
+ header('init');
201
+ await ensureWorkspace(cwd);
202
+ success('Workspace ready');
203
+ const opencodePath = path.join(cwd, 'opencode.json');
204
+ try {
205
+ const devServerPath = path.join(cwd, 'packages', 'mcp', 'src', 'server.ts');
206
+ const isDev = fsSync.existsSync(devServerPath);
207
+ const command = isDev
208
+ ? ["npx", "tsx", "packages/mcp/src/server.ts"]
209
+ : ["npx", "-y", "@variantree/mcp"];
210
+ const mcpConfig = {
211
+ type: "local",
212
+ command,
213
+ environment: { VARIANTREE_DIR: "." }
214
+ };
215
+ if (fsSync.existsSync(opencodePath)) {
216
+ const existingInfo = JSON.parse(fsSync.readFileSync(opencodePath, 'utf8'));
217
+ if (!existingInfo.mcp)
218
+ existingInfo.mcp = {};
219
+ if (!existingInfo.mcp.variantree) {
220
+ existingInfo.mcp.variantree = mcpConfig;
221
+ fsSync.writeFileSync(opencodePath, JSON.stringify(existingInfo, null, 2), 'utf8');
222
+ success('OpenCode MCP server added to existing opencode.json');
223
+ }
224
+ else {
225
+ hint('OpenCode MCP configuration already exists');
226
+ }
227
+ }
228
+ else {
229
+ const newConfig = {
230
+ "$schema": "https://opencode.ai/config.json",
231
+ mcp: { variantree: mcpConfig }
232
+ };
233
+ fsSync.writeFileSync(opencodePath, JSON.stringify(newConfig, null, 2), 'utf8');
234
+ success('Created opencode.json with Variantree MCP server');
235
+ }
236
+ }
237
+ catch (err) {
238
+ hint('Could not auto-configure opencode.json. You may need to add the MCP server manually.');
239
+ }
240
+ // Write or merge AGENTS.md with Variantree standing instructions
241
+ try {
242
+ const agentsPath = path.join(cwd, 'AGENTS.md');
243
+ const existing = (() => { try {
244
+ return fsSync.readFileSync(agentsPath, 'utf8');
245
+ }
246
+ catch {
247
+ return null;
248
+ } })();
249
+ const alreadyDone = existing?.includes(VARIANTREE_MARKER);
250
+ ensureProjectInstructions(cwd);
251
+ if (alreadyDone) {
252
+ hint('Instruction files already up to date (AGENTS.md, CLAUDE.md)');
253
+ }
254
+ else {
255
+ success('Created instruction files: AGENTS.md, CLAUDE.md');
256
+ }
257
+ }
258
+ catch {
259
+ hint('Could not write instruction files.');
260
+ }
261
+ hint(`Run ${chalk.white('variantree checkpoint "label"')} after coding to save your progress`);
262
+ divider();
263
+ });
264
+ // ── checkpoint ────────────────────────────────────────────────────────────
265
+ program
266
+ .command('checkpoint <label>')
267
+ .description('Sync conversation from OpenCode + snapshot code')
268
+ .option('-d, --dir <path>', 'workspace directory', process.cwd())
269
+ .action(async (label, opts) => {
270
+ const cwd = path.resolve(opts.dir);
271
+ header('checkpoint');
272
+ const { engine } = await ensureWorkspace(cwd);
273
+ const synced = await syncConversation(engine, cwd);
274
+ await engine.createCheckpoint(label, { workspacePath: cwd });
275
+ success(`Checkpoint ${chalk.white.bold(`"${label}"`)} created`);
276
+ if (synced > 0) {
277
+ detail('synced', `${synced} message(s) from OpenCode`);
278
+ }
279
+ detail('snapshot', `code saved ${SNAP}`);
280
+ divider();
281
+ });
282
+ // ── branch ────────────────────────────────────────────────────────────────
283
+ program
284
+ .command('branch <name>')
285
+ .description('Create a branch, restore code, and generate context')
286
+ .option('-d, --dir <path>', 'workspace directory', process.cwd())
287
+ .option('-c, --checkpoint <label>', 'branch from a specific checkpoint (default: latest on active branch)')
288
+ .option('--force', 'skip the unsaved-work checkpoint prompt')
289
+ .option('--no-launch', 'skip auto-launching a new OpenCode session')
290
+ .action(async (name, opts) => {
291
+ const cwd = path.resolve(opts.dir);
292
+ header('branch');
293
+ const { engine } = await ensureWorkspace(cwd);
294
+ await syncConversation(engine, cwd);
295
+ // Guard: prompt if there are messages on this branch not yet captured in a checkpoint
296
+ if (!opts.force) {
297
+ const unsaved = countUnsavedMessages(engine);
298
+ if (unsaved > 0) {
299
+ const answer = await promptConfirm(` ${warn(`${unsaved} message(s) are not checkpointed and won't carry to the new branch.`)} Checkpoint now? ${dim('[Y/n]')} `);
300
+ if (answer) {
301
+ const autoLabel = `Auto: before branch "${name}"`;
302
+ await engine.createCheckpoint(autoLabel, { workspacePath: cwd });
303
+ success(`Checkpoint ${chalk.white.bold(`"${autoLabel}"`)} created`);
304
+ }
305
+ }
306
+ }
307
+ // Use checkpoints on the active branch only; fall back to engine auto-create if none exist
308
+ const allCheckpoints = engine.getCheckpoints();
309
+ const activeBranch = engine.getActiveBranch();
310
+ const branchCheckpoints = engine
311
+ .getCheckpointsForBranch(activeBranch.id)
312
+ .sort((a, b) => a.createdAt - b.createdAt);
313
+ let cpId;
314
+ let cpLabel = 'current position';
315
+ if (opts.checkpoint) {
316
+ const cp = allCheckpoints.find((c) => c.label === opts.checkpoint);
317
+ if (!cp) {
318
+ errorMsg(`Checkpoint "${opts.checkpoint}" not found.`);
319
+ process.exit(1);
320
+ }
321
+ cpId = cp.id;
322
+ cpLabel = cp.label;
323
+ }
324
+ else if (branchCheckpoints.length > 0) {
325
+ const lastCp = branchCheckpoints[branchCheckpoints.length - 1];
326
+ cpId = lastCp.id;
327
+ cpLabel = lastCp.label;
328
+ }
329
+ const newBranch = await engine.branch(name, cpId);
330
+ success(`Branch ${brand.bold(`"${name}"`)} created from ${dim(`"${cpLabel}"`)}`);
331
+ if (cpId) {
332
+ const summary = await engine.restoreCheckpoint(cpId, cwd);
333
+ // restoreCheckpoint switches to the checkpoint's parent branch as a side-effect — switch back
334
+ await engine.switchBranch(newBranch.id);
335
+ if (summary) {
336
+ detail('restored', `${summary.written.length} written, ${summary.deleted.length} deleted, ${summary.skipped.length} unchanged`);
337
+ }
338
+ }
339
+ const context = engine.getContext();
340
+ const contextPath = generateContextFile(cwd, name, context);
341
+ detail('context', path.relative(cwd, contextPath));
342
+ if (opts.launch !== false) {
343
+ divider();
344
+ const result = launchOpenCodeSession(cwd);
345
+ if (result.launched) {
346
+ console.log(` ${ARROW} Opening new OpenCode session...`);
347
+ }
348
+ else {
349
+ hint('Could not launch OpenCode automatically.');
350
+ nextSteps();
351
+ }
352
+ }
353
+ else {
354
+ divider();
355
+ nextSteps();
356
+ }
357
+ divider();
358
+ });
359
+ // ── restore ───────────────────────────────────────────────────────────────
360
+ program
361
+ .command('restore <label>')
362
+ .description('Restore code to a checkpoint + generate context')
363
+ .option('-d, --dir <path>', 'workspace directory', process.cwd())
364
+ .option('--force', 'skip the unsaved-work checkpoint prompt')
365
+ .option('--no-launch', 'skip auto-launching a new OpenCode session')
366
+ .action(async (label, opts) => {
367
+ const cwd = path.resolve(opts.dir);
368
+ header('restore');
369
+ const { engine } = await ensureWorkspace(cwd);
370
+ await syncConversation(engine, cwd);
371
+ // Guard: prompt if there are messages on this branch not yet captured in a checkpoint
372
+ if (!opts.force) {
373
+ const unsaved = countUnsavedMessages(engine);
374
+ if (unsaved > 0) {
375
+ const answer = await promptConfirm(` ${warn(`${unsaved} message(s) are not checkpointed and will be lost after restore.`)} Checkpoint now? ${dim('[Y/n]')} `);
376
+ if (answer) {
377
+ const autoLabel = `Auto: before restore to "${label}"`;
378
+ await engine.createCheckpoint(autoLabel, { workspacePath: cwd });
379
+ success(`Checkpoint ${chalk.white.bold(`"${autoLabel}"`)} created`);
380
+ }
381
+ }
382
+ }
383
+ const checkpoints = engine.getCheckpoints();
384
+ const cp = checkpoints.find((c) => c.label === label);
385
+ if (!cp) {
386
+ errorMsg(`Checkpoint "${label}" not found.`);
387
+ process.exit(1);
388
+ }
389
+ const summary = await engine.restoreCheckpoint(cp.id, cwd);
390
+ if (summary) {
391
+ success(`Restored to ${chalk.white.bold(`"${label}"`)}`);
392
+ detail('written', `${summary.written.length} file(s)`);
393
+ detail('deleted', `${summary.deleted.length} file(s)`);
394
+ detail('unchanged', `${summary.skipped.length} file(s)`);
395
+ }
396
+ else {
397
+ success(`Switched to ${chalk.white.bold(`"${label}"`)} ${dim('(no code snapshot)')}`);
398
+ }
399
+ const context = engine.getContext();
400
+ const branchName = engine.getActiveBranch().name;
401
+ const contextPath = generateContextFile(cwd, branchName, context);
402
+ detail('context', path.relative(cwd, contextPath));
403
+ if (opts.launch !== false) {
404
+ divider();
405
+ const result = launchOpenCodeSession(cwd);
406
+ if (result.launched) {
407
+ console.log(` ${ARROW} Opening new OpenCode session...`);
408
+ }
409
+ else {
410
+ hint('Could not launch OpenCode automatically.');
411
+ nextSteps();
412
+ }
413
+ }
414
+ else {
415
+ divider();
416
+ nextSteps();
417
+ }
418
+ divider();
419
+ });
420
+ // ── status ────────────────────────────────────────────────────────────────
421
+ program
422
+ .command('status')
423
+ .description('Show active branch, messages, and checkpoints')
424
+ .option('-d, --dir <path>', 'workspace directory', process.cwd())
425
+ .action(async (opts) => {
426
+ const cwd = path.resolve(opts.dir);
427
+ const { engine } = createEngine(cwd);
428
+ const ws = await engine.loadWorkspace(WORKSPACE_ID);
429
+ if (!ws) {
430
+ header('status');
431
+ hint('No workspace found.');
432
+ hint(`Run ${chalk.white('variantree init')} or ${chalk.white('variantree checkpoint "label"')} to get started.`);
433
+ divider();
434
+ return;
435
+ }
436
+ const branch = engine.getActiveBranch();
437
+ const context = engine.getContext();
438
+ const branches = engine.getBranches();
439
+ const checkpoints = engine.getCheckpoints();
440
+ header('status');
441
+ console.log(` ${BRANCH_ICON} ${chalk.white.bold(branch.name)} ${dim(`(${context.length} messages)`)}`);
442
+ divider();
443
+ // Hierarchical tree
444
+ const root = branches.find(b => !b.parentCheckpointId);
445
+ if (root) {
446
+ printBranchNode(root, branches, checkpoints, '', true);
447
+ }
448
+ divider();
449
+ const snapshotCount = checkpoints.filter(cp => cp.snapshotRef).length;
450
+ hint(`${branches.length} branch${branches.length !== 1 ? 'es' : ''} · ${checkpoints.length} checkpoint${checkpoints.length !== 1 ? 's' : ''}${snapshotCount > 0 ? ` (${snapshotCount} with snapshots)` : ''}`);
451
+ divider();
452
+ });
453
+ // ── tree ──────────────────────────────────────────────────────────────────
454
+ program
455
+ .command('tree')
456
+ .description('Visualise the branch tree')
457
+ .option('-d, --dir <path>', 'workspace directory', process.cwd())
458
+ .action(async (opts) => {
459
+ const cwd = path.resolve(opts.dir);
460
+ const { engine } = createEngine(cwd);
461
+ const ws = await engine.loadWorkspace(WORKSPACE_ID);
462
+ if (!ws) {
463
+ header('tree');
464
+ hint('No workspace found.');
465
+ divider();
466
+ return;
467
+ }
468
+ const branches = engine.getBranches();
469
+ const checkpoints = engine.getCheckpoints();
470
+ header('tree');
471
+ const root = branches.find(b => !b.parentCheckpointId);
472
+ if (root) {
473
+ printBranchNode(root, branches, checkpoints, '', true);
474
+ }
475
+ else {
476
+ hint('No branches found.');
477
+ }
478
+ divider();
479
+ });
480
+ // ── watch (optional) ──────────────────────────────────────────────────────
481
+ program
482
+ .command('watch')
483
+ .description('(Optional) Real-time watcher for web UI')
484
+ .option('-d, --dir <path>', 'workspace directory', process.cwd())
485
+ .action(async (opts) => {
486
+ const cwd = path.resolve(opts.dir);
487
+ header('watch');
488
+ const { engine } = await ensureWorkspace(cwd);
489
+ // Use the pinned adapter if one exists, otherwise fall back to the first registered adapter.
490
+ const adapters = ALL_TOOLS.flatMap(t => (t.adapter ? [t.adapter] : []));
491
+ const pinnedAdapter = adapters.find(a => engine.getSessionId(a.name) != null);
492
+ const adapter = pinnedAdapter ?? adapters[0];
493
+ const watcher = new VariantreeWatcher({
494
+ workspacePath: cwd,
495
+ adapter,
496
+ engine,
497
+ onSync: (count) => console.log(` ${CHECK} Synced ${accent(String(count))} message(s)`),
498
+ onError: (e) => console.error(` ${CROSS} ${e.message}`),
499
+ });
500
+ await watcher.start();
501
+ console.log(` ${dim('Watching for changes... Press')} ${chalk.white('Ctrl+C')} ${dim('to stop.')}`);
502
+ divider();
503
+ process.on('SIGINT', async () => {
504
+ await watcher.stop();
505
+ console.log(`\n ${dim('Watcher stopped.')}`);
506
+ divider();
507
+ process.exit(0);
508
+ });
509
+ });
510
+ program.parse();
511
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}