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