@mycompbox/compbox-cli 1.18.0 → 1.20.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 (49) hide show
  1. package/.tsbuildinfo +1 -1
  2. package/commands/configure.d.ts.map +1 -1
  3. package/commands/configure.js +31 -11
  4. package/commands/configure.js.map +1 -1
  5. package/commands/doctor.d.ts.map +1 -1
  6. package/commands/doctor.js +1 -1
  7. package/commands/doctor.js.map +1 -1
  8. package/commands/login.d.ts +2 -0
  9. package/commands/login.d.ts.map +1 -1
  10. package/commands/login.js +28 -6
  11. package/commands/login.js.map +1 -1
  12. package/commands/run.d.ts +12 -1
  13. package/commands/run.d.ts.map +1 -1
  14. package/commands/run.js +110 -30
  15. package/commands/run.js.map +1 -1
  16. package/index.js +1264 -540
  17. package/package.json +1 -1
  18. package/utils/agent-invoker.d.ts +59 -101
  19. package/utils/agent-invoker.d.ts.map +1 -1
  20. package/utils/agent-invoker.js +183 -508
  21. package/utils/agent-invoker.js.map +1 -1
  22. package/utils/autostart.d.ts +41 -0
  23. package/utils/autostart.d.ts.map +1 -0
  24. package/utils/autostart.js +122 -0
  25. package/utils/autostart.js.map +1 -0
  26. package/utils/key-run.d.ts +32 -0
  27. package/utils/key-run.d.ts.map +1 -0
  28. package/utils/key-run.js +77 -0
  29. package/utils/key-run.js.map +1 -0
  30. package/utils/loopback.d.ts +3 -3
  31. package/utils/loopback.d.ts.map +1 -1
  32. package/utils/loopback.js +3 -3
  33. package/utils/loopback.js.map +1 -1
  34. package/utils/mailbox-client.d.ts +31 -1
  35. package/utils/mailbox-client.d.ts.map +1 -1
  36. package/utils/mailbox-client.js +60 -2
  37. package/utils/mailbox-client.js.map +1 -1
  38. package/utils/mcp-config-writer.d.ts +2 -0
  39. package/utils/mcp-config-writer.d.ts.map +1 -1
  40. package/utils/mcp-config-writer.js +9 -1
  41. package/utils/mcp-config-writer.js.map +1 -1
  42. package/utils/repo-setup.d.ts +44 -0
  43. package/utils/repo-setup.d.ts.map +1 -0
  44. package/utils/repo-setup.js +178 -0
  45. package/utils/repo-setup.js.map +1 -0
  46. package/utils/run-workspace.d.ts +120 -0
  47. package/utils/run-workspace.d.ts.map +1 -0
  48. package/utils/run-workspace.js +298 -0
  49. package/utils/run-workspace.js.map +1 -0
@@ -0,0 +1,298 @@
1
+ /**
2
+ * Run workspaces: every headless orchestrator run gets its own branch and its
3
+ * own git worktree, and finishes with a pull request.
4
+ *
5
+ * Before this, the orchestrator ran directly in the configured project folder,
6
+ * on whatever branch happened to be checked out — so a run could leave its
7
+ * work uncommitted on `main`, mixed with the person's own edits. Now:
8
+ *
9
+ * Several runs can go at once (the daemon runs up to COMPBOX_MAX_JOBS); git
10
+ * steps that write to the shared repository take turns via withRepoLock.
11
+ *
12
+ * prepare: fetch → new branch `compbox/epic-<id>-<stamp>` from the remote's
13
+ * default branch → `git worktree add` under ~/.compbox/runs →
14
+ * copy local-only config (.mcp.json, .env files, …) → install deps.
15
+ * finish: commit anything left uncommitted → if the branch has commits,
16
+ * push it and open a pull request (draft when the run stopped
17
+ * early) with `gh`, or report a compare link when `gh` is missing →
18
+ * remove the worktree (the branch stays).
19
+ *
20
+ * The person's own checkout is never switched, committed to or pushed.
21
+ * Every git/gh/install call goes through an injectable runner so tests never
22
+ * touch a real repository.
23
+ */
24
+ import { spawn } from 'node:child_process';
25
+ import { copyFileSync, existsSync, mkdirSync } from 'node:fs';
26
+ import { basename, dirname, join } from 'node:path';
27
+ import { claudeChildEnvPath } from './claude-runtime.js';
28
+ import { getConfigDir } from './config-store.js';
29
+ /** Set to "0" to keep finished runs local: no push, no pull request. */
30
+ export const RUN_PUSH_ENV = 'COMPBOX_RUN_PUSH';
31
+ /** Install deps can take a while on a cold cache. */
32
+ const INSTALL_TIMEOUT_MS = 20 * 60 * 1_000;
33
+ const GIT_TIMEOUT_MS = 5 * 60 * 1_000;
34
+ export const defaultCommandRunner = (command, args, cwd) => new Promise((resolve) => {
35
+ let stdout = '';
36
+ let stderr = '';
37
+ let settled = false;
38
+ const done = (result) => {
39
+ if (settled)
40
+ return;
41
+ settled = true;
42
+ clearTimeout(timer);
43
+ resolve(result);
44
+ };
45
+ const child = spawn(command, args, {
46
+ cwd,
47
+ stdio: ['ignore', 'pipe', 'pipe'],
48
+ env: { ...process.env, PATH: claudeChildEnvPath(process.env.PATH), GIT_TERMINAL_PROMPT: '0' },
49
+ });
50
+ const timer = setTimeout(() => {
51
+ child.kill('SIGKILL');
52
+ done({ status: 1, stdout, stderr: `${command} timed out` });
53
+ }, command === 'git' || command === 'gh' ? GIT_TIMEOUT_MS : INSTALL_TIMEOUT_MS);
54
+ child.stdout.on('data', (chunk) => {
55
+ stdout += chunk.toString('utf-8');
56
+ });
57
+ child.stderr.on('data', (chunk) => {
58
+ stderr += chunk.toString('utf-8');
59
+ });
60
+ child.on('error', (error) => {
61
+ done({ status: 1, stdout, stderr: error.message });
62
+ });
63
+ child.on('close', (code) => {
64
+ done({ status: code ?? 1, stdout, stderr });
65
+ });
66
+ });
67
+ /** Local-only files a run needs that git doesn't carry into a new worktree. */
68
+ export function isLocalConfigFile(path) {
69
+ if (path.split('/').includes('node_modules'))
70
+ return false;
71
+ const name = basename(path);
72
+ return (name === '.mcp.json' ||
73
+ name === 'CLAUDE.local.md' ||
74
+ path === '.claude/settings.local.json' ||
75
+ name === '.env' ||
76
+ (name.startsWith('.env.') && !name.endsWith('.example') && !name.endsWith('.sample')));
77
+ }
78
+ /** `ENG-E12` → `ENG-E12`; anything unusual becomes dashes. */
79
+ export function slugForBranch(value) {
80
+ return value.replace(/[^A-Za-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 40) || 'run';
81
+ }
82
+ function stamp(now) {
83
+ const pad = (n) => String(n).padStart(2, '0');
84
+ return `${String(now.getFullYear())}${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;
85
+ }
86
+ function firstLine(text) {
87
+ return text.trim().split('\n')[0] ?? '';
88
+ }
89
+ /** Picks the install command for the repo's lockfile, or null when there is none. */
90
+ export function installCommand(dir, exists = existsSync) {
91
+ if (exists(join(dir, 'pnpm-lock.yaml')))
92
+ return ['pnpm', ['install', '--frozen-lockfile', '--prefer-offline']];
93
+ if (exists(join(dir, 'package-lock.json')))
94
+ return ['npm', ['ci', '--prefer-offline']];
95
+ if (exists(join(dir, 'yarn.lock')))
96
+ return ['yarn', ['install', '--frozen-lockfile']];
97
+ return null;
98
+ }
99
+ /**
100
+ * GitHub "compare" link for a remote URL, so the person can open the pull
101
+ * request in one click when `gh` isn't available. Null for non-GitHub remotes.
102
+ * Any credentials embedded in the URL are dropped.
103
+ */
104
+ export function githubCompareUrl(remoteUrl, baseBranch, branch) {
105
+ const m = /^https?:\/\/(?:[^@/]+@)?github\.com\/([^/]+)\/(.+?)(?:\.git)?\/?$/.exec(remoteUrl.trim()) ??
106
+ /^(?:ssh:\/\/)?git@github\.com[:/]([^/]+)\/(.+?)(?:\.git)?\/?$/.exec(remoteUrl.trim());
107
+ if (!m)
108
+ return null;
109
+ return `https://github.com/${m[1] ?? ''}/${m[2] ?? ''}/compare/${encodeURIComponent(baseBranch)}...${encodeURIComponent(branch)}?expand=1`;
110
+ }
111
+ /**
112
+ * Git commands that write to the same repository (fetch, worktree add/remove,
113
+ * push, branch -D) take turns, so builds running at the same time don't trip
114
+ * over git's lock files. Only these short steps are serialized; the builds
115
+ * themselves run side by side, each in its own worktree.
116
+ */
117
+ const repoQueues = new Map();
118
+ export function withRepoLock(projectDir, task) {
119
+ const previous = repoQueues.get(projectDir) ?? Promise.resolve();
120
+ const result = previous.catch(() => undefined).then(task);
121
+ const tail = result.catch(() => undefined);
122
+ repoQueues.set(projectDir, tail);
123
+ void tail.then(() => {
124
+ if (repoQueues.get(projectDir) === tail)
125
+ repoQueues.delete(projectDir);
126
+ });
127
+ return result;
128
+ }
129
+ export class RunWorkspaceManager {
130
+ run;
131
+ now;
132
+ runsRoot;
133
+ exists;
134
+ copyFile;
135
+ env;
136
+ constructor(deps = {}) {
137
+ this.run = deps.run ?? defaultCommandRunner;
138
+ this.now = deps.now ?? (() => new Date());
139
+ this.runsRoot = deps.runsRoot ?? join(getConfigDir(), 'runs');
140
+ this.exists = deps.exists ?? existsSync;
141
+ this.copyFile =
142
+ deps.copyFile ??
143
+ ((from, to) => {
144
+ mkdirSync(dirname(to), { recursive: true });
145
+ copyFileSync(from, to);
146
+ });
147
+ this.env = deps.env ?? process.env;
148
+ }
149
+ git(args, cwd) {
150
+ return this.run('git', args, cwd);
151
+ }
152
+ /** Creates the branch + worktree for a run. Never touches the person's checkout. */
153
+ async prepare(projectDir, epicId) {
154
+ const created = await withRepoLock(projectDir, () => this.createWorktree(projectDir, epicId));
155
+ if (!created.ok)
156
+ return created;
157
+ const { workspace, notes } = created;
158
+ const { dir, branch } = workspace;
159
+ const install = installCommand(dir, this.exists);
160
+ if (install) {
161
+ const [command, args] = install;
162
+ const res = await this.run(command, args, dir);
163
+ if (res.status !== 0) {
164
+ await withRepoLock(projectDir, async () => {
165
+ await this.git(['worktree', 'remove', '--force', dir], projectDir);
166
+ await this.git(['branch', '-D', branch], projectDir);
167
+ });
168
+ return {
169
+ ok: false,
170
+ error: [
171
+ `Installing the project's dependencies failed (${command} ${args.join(' ')}): ${firstLine(res.stderr) || firstLine(res.stdout) || 'unknown error'}`,
172
+ 'The run was not started. Check that the same command works in your project folder.',
173
+ ].join('\n'),
174
+ };
175
+ }
176
+ }
177
+ return { ok: true, workspace, notes };
178
+ }
179
+ async createWorktree(projectDir, epicId) {
180
+ const notes = [];
181
+ const remotes = (await this.git(['remote'], projectDir)).stdout.split('\n').map((r) => r.trim()).filter(Boolean);
182
+ const remote = remotes.includes('origin') ? 'origin' : (remotes[0] ?? null);
183
+ let baseBranch = '';
184
+ let baseRef = 'HEAD';
185
+ if (remote) {
186
+ if ((await this.git(['fetch', remote, '--quiet'], projectDir)).status !== 0) {
187
+ notes.push(`Couldn't fetch from ${remote}, so the run starts from the last fetched copy.`);
188
+ }
189
+ const head = await this.git(['symbolic-ref', '--quiet', '--short', `refs/remotes/${remote}/HEAD`], projectDir);
190
+ if (head.status === 0 && head.stdout.trim().startsWith(`${remote}/`)) {
191
+ baseBranch = head.stdout.trim().slice(remote.length + 1);
192
+ }
193
+ else {
194
+ for (const candidate of ['main', 'master']) {
195
+ if ((await this.git(['rev-parse', '--verify', '--quiet', `${remote}/${candidate}`], projectDir)).status === 0) {
196
+ baseBranch = candidate;
197
+ break;
198
+ }
199
+ }
200
+ }
201
+ if (baseBranch)
202
+ baseRef = `${remote}/${baseBranch}`;
203
+ }
204
+ if (!baseBranch) {
205
+ baseBranch = (await this.git(['rev-parse', '--abbrev-ref', 'HEAD'], projectDir)).stdout.trim() || 'main';
206
+ baseRef = 'HEAD';
207
+ }
208
+ const when = stamp(this.now());
209
+ const branch = `compbox/epic-${slugForBranch(epicId)}-${when}`;
210
+ const dir = join(this.runsRoot, `${slugForBranch(basename(projectDir))}-${slugForBranch(epicId)}-${when}`);
211
+ mkdirSync(this.runsRoot, { recursive: true });
212
+ const add = await this.git(['worktree', 'add', '-b', branch, dir, baseRef], projectDir);
213
+ if (add.status !== 0) {
214
+ return {
215
+ ok: false,
216
+ error: [
217
+ `Couldn't create a separate workspace for this run (git worktree add failed): ${firstLine(add.stderr) || 'unknown error'}`,
218
+ 'The run was not started, and your project folder was not changed.',
219
+ ].join('\n'),
220
+ };
221
+ }
222
+ // Local-only config the agents need (.mcp.json for CompBox tools, .env files for tests).
223
+ const ignored = await this.git(['ls-files', '--others', '--ignored', '--exclude-standard', '--directory'], projectDir);
224
+ const untracked = await this.git(['ls-files', '--others', '--exclude-standard'], projectDir);
225
+ const candidates = new Set(`${ignored.stdout}\n${untracked.stdout}`.split('\n').map((p) => p.trim()).filter((p) => p && !p.endsWith('/')));
226
+ for (const path of candidates) {
227
+ if (!isLocalConfigFile(path))
228
+ continue;
229
+ try {
230
+ this.copyFile(join(projectDir, path), join(dir, path));
231
+ }
232
+ catch {
233
+ notes.push(`Couldn't copy ${path} into the run workspace.`);
234
+ }
235
+ }
236
+ return { ok: true, workspace: { dir, projectDir, branch, baseRef, baseBranch, remote }, notes };
237
+ }
238
+ /** Commits, pushes and opens the pull request; then cleans up the worktree. */
239
+ finish(input) {
240
+ return withRepoLock(input.workspace.projectDir, () => this.finishLocked(input));
241
+ }
242
+ async finishLocked(input) {
243
+ const { workspace: ws } = input;
244
+ const notes = [];
245
+ if ((await this.git(['status', '--porcelain'], ws.dir)).stdout.trim()) {
246
+ await this.git(['add', '-A'], ws.dir);
247
+ const commit = await this.git(['commit', '-m', `chore(compbox): save work left uncommitted by the orchestrator (epic ${input.epicId})`], ws.dir);
248
+ if (commit.status !== 0) {
249
+ notes.push(`Couldn't commit the remaining changes: ${firstLine(commit.stderr) || firstLine(commit.stdout)}`);
250
+ }
251
+ }
252
+ const commits = Number.parseInt((await this.git(['rev-list', '--count', `${ws.baseRef}..HEAD`], ws.dir)).stdout.trim(), 10) || 0;
253
+ const base = { branch: ws.branch, commits, pushed: false, notes };
254
+ if (commits === 0) {
255
+ await this.git(['worktree', 'remove', '--force', ws.dir], ws.projectDir);
256
+ await this.git(['branch', '-D', ws.branch], ws.projectDir);
257
+ notes.push('The run made no code changes, so there is nothing to review.');
258
+ return base;
259
+ }
260
+ if (!ws.remote || this.env[RUN_PUSH_ENV] === '0') {
261
+ await this.git(['worktree', 'remove', '--force', ws.dir], ws.projectDir);
262
+ notes.push(ws.remote
263
+ ? `Pushing is turned off (${RUN_PUSH_ENV}=0). The work is on the local branch ${ws.branch}.`
264
+ : `The repository has no remote, so the work is on the local branch ${ws.branch}.`);
265
+ return base;
266
+ }
267
+ const push = await this.git(['push', '--set-upstream', ws.remote, ws.branch], ws.dir);
268
+ if (push.status !== 0) {
269
+ notes.push(`Couldn't push the branch to ${ws.remote}: ${firstLine(push.stderr) || 'unknown error'}. The work is safe in ${ws.dir} on branch ${ws.branch}.`);
270
+ return { ...base, keptWorktree: ws.dir };
271
+ }
272
+ const title = `CompBox: epic ${input.epicId}${input.completed ? '' : ' (stopped early, needs review)'}`;
273
+ const body = [
274
+ `Code written by the CompBox orchestrator for epic **${input.epicId}** (job \`${input.jobId}\`).`,
275
+ '',
276
+ input.completed
277
+ ? 'The orchestrator finished every phase. Review the changes, check that CI passes, then merge.'
278
+ : `The orchestrator stopped before finishing${input.stopReason ? `: ${input.stopReason}` : '.'} This is a draft so the partial work can be reviewed.`,
279
+ '',
280
+ `${String(commits)} commit${commits === 1 ? '' : 's'} on \`${ws.branch}\`, based on \`${ws.baseBranch}\`.`,
281
+ ].join('\n');
282
+ const prArgs = ['pr', 'create', '--base', ws.baseBranch, '--head', ws.branch, '--title', title, '--body', body];
283
+ if (!input.completed)
284
+ prArgs.push('--draft');
285
+ const pr = await this.run('gh', prArgs, ws.dir);
286
+ const prUrl = pr.status === 0 ? /https:\/\/\S+/.exec(pr.stdout)?.[0] : undefined;
287
+ let compareUrl;
288
+ if (!prUrl) {
289
+ const remoteUrl = (await this.git(['remote', 'get-url', ws.remote], ws.dir)).stdout.trim();
290
+ compareUrl = githubCompareUrl(remoteUrl, ws.baseBranch, ws.branch) ?? undefined;
291
+ notes.push(`The branch was pushed, but the pull request couldn't be opened automatically${firstLine(pr.stderr) ? ` (${firstLine(pr.stderr)})` : ''}.` +
292
+ (compareUrl ? ' Use the link to open it.' : ` Open a pull request for ${ws.branch} on your git host.`));
293
+ }
294
+ await this.git(['worktree', 'remove', '--force', ws.dir], ws.projectDir);
295
+ return { ...base, pushed: true, ...(prUrl ? { prUrl } : {}), ...(compareUrl ? { compareUrl } : {}) };
296
+ }
297
+ }
298
+ //# sourceMappingURL=run-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-workspace.js","sourceRoot":"","sources":["../../src/utils/run-workspace.ts"],"names":[],"mappings":"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"}