agent-merge-broker 0.3.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/LICENSE +201 -0
- package/README.md +352 -0
- package/dist/broker.d.ts +110 -0
- package/dist/broker.d.ts.map +1 -0
- package/dist/broker.js +1023 -0
- package/dist/broker.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +558 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +312 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +36 -0
- package/dist/errors.js.map +1 -0
- package/dist/git.d.ts +46 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +195 -0
- package/dist/git.js.map +1 -0
- package/dist/hooks.d.ts +22 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +110 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/patterns.d.ts +9 -0
- package/dist/patterns.d.ts.map +1 -0
- package/dist/patterns.js +66 -0
- package/dist/patterns.js.map +1 -0
- package/dist/process.d.ts +30 -0
- package/dist/process.d.ts.map +1 -0
- package/dist/process.js +91 -0
- package/dist/process.js.map +1 -0
- package/dist/provenance.d.ts +10 -0
- package/dist/provenance.d.ts.map +1 -0
- package/dist/provenance.js +36 -0
- package/dist/provenance.js.map +1 -0
- package/dist/publisher.d.ts +37 -0
- package/dist/publisher.d.ts.map +1 -0
- package/dist/publisher.js +144 -0
- package/dist/publisher.js.map +1 -0
- package/dist/scheduler.d.ts +6 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +96 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/store.d.ts +73 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +323 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +219 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +13 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +75 -0
- package/dist/validation.js.map +1 -0
- package/dist/verify.d.ts +40 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +177 -0
- package/dist/verify.js.map +1 -0
- package/docs/ARCHITECTURE.md +144 -0
- package/docs/PROTOCOL.md +127 -0
- package/docs/RELEASING.md +23 -0
- package/docs/SECURITY.md +57 -0
- package/package.json +68 -0
- package/schemas/config.schema.json +149 -0
- package/schemas/provenance.schema.json +56 -0
- package/schemas/receipt.schema.json +39 -0
- package/templates/AGENTS.snippet.md +5 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { readFile } from "node:fs/promises";
|
|
5
|
+
import { createRequire } from "node:module";
|
|
6
|
+
import { Command, Option } from "commander";
|
|
7
|
+
import { BrokerError, CommandError } from "./errors.js";
|
|
8
|
+
import { MergeBroker } from "./broker.js";
|
|
9
|
+
import { GitRepository } from "./git.js";
|
|
10
|
+
import { policyFromBase, verifyProvenance } from "./verify.js";
|
|
11
|
+
const program = new Command();
|
|
12
|
+
const PACKAGE_VERSION = createRequire(import.meta.url)("../package.json").version;
|
|
13
|
+
function collect(value, previous) {
|
|
14
|
+
return [...previous, value];
|
|
15
|
+
}
|
|
16
|
+
function globalOptions() {
|
|
17
|
+
const options = program.opts();
|
|
18
|
+
return { cwd: options.cwd ?? process.cwd(), json: options.json ?? false };
|
|
19
|
+
}
|
|
20
|
+
function output(value, human) {
|
|
21
|
+
if (globalOptions().json || !human)
|
|
22
|
+
console.log(JSON.stringify(value, null, 2));
|
|
23
|
+
else
|
|
24
|
+
console.log(human);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Finds the lease token for a task: an explicit flag first, then an explicit file, then the
|
|
28
|
+
* environment, and finally the copy the broker kept when the task was claimed on this machine.
|
|
29
|
+
*/
|
|
30
|
+
async function findLeaseToken(broker, taskId, options) {
|
|
31
|
+
if (options.token)
|
|
32
|
+
return options.token;
|
|
33
|
+
if (options.tokenFile) {
|
|
34
|
+
const contents = (await readFile(path.resolve(options.tokenFile), "utf8")).trim();
|
|
35
|
+
if (!contents)
|
|
36
|
+
throw new BrokerError("LEASE_TOKEN", `No lease token in ${options.tokenFile}.`);
|
|
37
|
+
return contents;
|
|
38
|
+
}
|
|
39
|
+
if (process.env.MERGE_BROKER_TOKEN)
|
|
40
|
+
return process.env.MERGE_BROKER_TOKEN;
|
|
41
|
+
return await broker.store.readToken(taskId);
|
|
42
|
+
}
|
|
43
|
+
async function requireLeaseToken(broker, taskId, options) {
|
|
44
|
+
const token = await findLeaseToken(broker, taskId, options);
|
|
45
|
+
if (!token) {
|
|
46
|
+
throw new BrokerError("LEASE_TOKEN", `No lease token for ${taskId}. Pass --token or --token-file, set MERGE_BROKER_TOKEN, or claim the task on this machine so the broker holds it for you.`);
|
|
47
|
+
}
|
|
48
|
+
return token;
|
|
49
|
+
}
|
|
50
|
+
function defaultHolder() {
|
|
51
|
+
return process.env.MERGE_BROKER_AGENT ?? process.env.USER ?? `${os.hostname()}:${process.pid}`;
|
|
52
|
+
}
|
|
53
|
+
function taskSummary(task) {
|
|
54
|
+
return {
|
|
55
|
+
id: task.id,
|
|
56
|
+
status: task.status,
|
|
57
|
+
priority: task.priority,
|
|
58
|
+
agent: task.agent,
|
|
59
|
+
commits: task.commits.length,
|
|
60
|
+
paths: task.actualPaths.length > 0 ? task.actualPaths : task.expectedPaths,
|
|
61
|
+
dependencies: task.dependsOn,
|
|
62
|
+
leaseHolder: task.lease?.holder,
|
|
63
|
+
leaseExpiresAt: task.lease?.expiresAt,
|
|
64
|
+
batchId: task.batchId,
|
|
65
|
+
updatedAt: task.updatedAt,
|
|
66
|
+
warnings: task.warnings,
|
|
67
|
+
lastError: task.lastError,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function publicTask(task) {
|
|
71
|
+
const { lease, ...rest } = task;
|
|
72
|
+
if (!lease)
|
|
73
|
+
return rest;
|
|
74
|
+
const { tokenHash: _tokenHash, ...publicLease } = lease;
|
|
75
|
+
return { ...rest, lease: publicLease };
|
|
76
|
+
}
|
|
77
|
+
function publicState(state) {
|
|
78
|
+
return {
|
|
79
|
+
...state,
|
|
80
|
+
tasks: Object.fromEntries(Object.entries(state.tasks).map(([id, value]) => [id, publicTask(value)])),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function stateHuman(state) {
|
|
84
|
+
const tasks = Object.values(state.tasks).sort((a, b) => a.id.localeCompare(b.id));
|
|
85
|
+
if (tasks.length === 0)
|
|
86
|
+
return "No broker tasks.";
|
|
87
|
+
return tasks
|
|
88
|
+
.map((task) => `${task.id.padEnd(24)} ${task.status.padEnd(12)} commits=${String(task.commits.length).padEnd(3)} ${task.lease ? `lease=${task.lease.holder}` : ""}`)
|
|
89
|
+
.join("\n");
|
|
90
|
+
}
|
|
91
|
+
function planHuman(plan) {
|
|
92
|
+
const selected = plan.selected.map((task) => ` + ${task.id} (${task.commits.length} commit(s))`);
|
|
93
|
+
const rejected = plan.rejected.map((item) => ` - ${item.taskId}: ${item.reason}${item.conflictsWith ? ` with ${item.conflictsWith}` : ""}`);
|
|
94
|
+
return [
|
|
95
|
+
`Selected ${plan.selected.length} task(s), ${plan.totalCommits} commit(s):`,
|
|
96
|
+
...(selected.length > 0 ? selected : [" (none)"]),
|
|
97
|
+
...(rejected.length > 0 ? ["Deferred:", ...rejected] : []),
|
|
98
|
+
].join("\n");
|
|
99
|
+
}
|
|
100
|
+
function batchHuman(batch) {
|
|
101
|
+
return [
|
|
102
|
+
`Batch ${batch.id}: ${batch.status}`,
|
|
103
|
+
`Tasks: ${batch.taskIds.join(", ")}`,
|
|
104
|
+
`Base: ${batch.baseBranch} @ ${batch.baseSha}`,
|
|
105
|
+
batch.branchName ? `Branch: ${batch.branchName}` : undefined,
|
|
106
|
+
batch.headSha ? `Head: ${batch.headSha}` : undefined,
|
|
107
|
+
batch.pullRequestUrl ? `Pull request: ${batch.pullRequestUrl}` : undefined,
|
|
108
|
+
batch.autoMergeEnabled ? "Auto-merge: enabled" : undefined,
|
|
109
|
+
batch.error ? `Error: ${batch.error}` : undefined,
|
|
110
|
+
]
|
|
111
|
+
.filter(Boolean)
|
|
112
|
+
.join("\n");
|
|
113
|
+
}
|
|
114
|
+
async function openBroker() {
|
|
115
|
+
return await MergeBroker.open(globalOptions().cwd);
|
|
116
|
+
}
|
|
117
|
+
program
|
|
118
|
+
.name("merge-broker")
|
|
119
|
+
.description("Transaction coordinator for parallel code-producing agents and humans")
|
|
120
|
+
.version(PACKAGE_VERSION)
|
|
121
|
+
.option("-C, --cwd <directory>", "run as if started in this directory")
|
|
122
|
+
.option("--json", "emit machine-readable JSON");
|
|
123
|
+
program
|
|
124
|
+
.command("init")
|
|
125
|
+
.description("initialize Merge Broker in the current Git repository")
|
|
126
|
+
.option("--base <branch>", "base branch", "main")
|
|
127
|
+
.option("--base-ref <revision>", "Git revision used as the integration base")
|
|
128
|
+
.option("--remote <name>", "Git remote", "origin")
|
|
129
|
+
.option("--force", "replace the existing configuration")
|
|
130
|
+
.action(async (options) => {
|
|
131
|
+
const result = await MergeBroker.initialize(globalOptions().cwd, {
|
|
132
|
+
baseBranch: options.base,
|
|
133
|
+
...(options.baseRef ? { baseRef: options.baseRef } : {}),
|
|
134
|
+
remote: options.remote,
|
|
135
|
+
force: options.force ?? false,
|
|
136
|
+
});
|
|
137
|
+
output(result, `${result.created ? "Initialized" : "Already initialized"} Merge Broker at ${result.configPath}`);
|
|
138
|
+
});
|
|
139
|
+
program
|
|
140
|
+
.command("doctor")
|
|
141
|
+
.description("verify repository discovery, configuration, state, and base branch")
|
|
142
|
+
.action(async () => {
|
|
143
|
+
const result = await (await openBroker()).doctor();
|
|
144
|
+
const warnings = Array.isArray(result.warnings) ? result.warnings : [];
|
|
145
|
+
output(result, [
|
|
146
|
+
"Merge Broker is ready.",
|
|
147
|
+
`Repository: ${String(result.repository)}`,
|
|
148
|
+
`State: ${String(result.stateDirectory)}`,
|
|
149
|
+
...warnings.map((warning) => `Warning: ${warning}`),
|
|
150
|
+
].join("\n"));
|
|
151
|
+
});
|
|
152
|
+
const task = program.command("task").description("register, lease, and submit work");
|
|
153
|
+
task
|
|
154
|
+
.command("register <id>")
|
|
155
|
+
.description("register a task before an agent begins work")
|
|
156
|
+
.option("--title <title>")
|
|
157
|
+
.option("--agent <name>")
|
|
158
|
+
.option("--base <revision>")
|
|
159
|
+
.option("--path <pattern>", "expected path or glob; repeatable", collect, [])
|
|
160
|
+
.option("--depends-on <task>", "dependency task ID; repeatable", collect, [])
|
|
161
|
+
.option("--priority <number>", "higher values are scheduled first", "0")
|
|
162
|
+
.option("--worktree <path>")
|
|
163
|
+
.action(async (id, options) => {
|
|
164
|
+
const registered = await (await openBroker()).registerTask({
|
|
165
|
+
id,
|
|
166
|
+
...(options.title ? { title: options.title } : {}),
|
|
167
|
+
...(options.agent ? { agent: options.agent } : {}),
|
|
168
|
+
...(options.base ? { base: options.base } : {}),
|
|
169
|
+
expectedPaths: options.path,
|
|
170
|
+
dependsOn: options.dependsOn,
|
|
171
|
+
priority: Number(options.priority),
|
|
172
|
+
...(options.worktree ? { worktree: options.worktree } : {}),
|
|
173
|
+
});
|
|
174
|
+
output(publicTask(registered), `Registered task ${registered.id} at ${registered.baseSha}.`);
|
|
175
|
+
});
|
|
176
|
+
task
|
|
177
|
+
.command("claim <id>")
|
|
178
|
+
.description("acquire an expiring lease, registering the task if necessary")
|
|
179
|
+
.option("--holder <name>", "lease holder", defaultHolder())
|
|
180
|
+
.option("--title <title>")
|
|
181
|
+
.option("--agent <name>")
|
|
182
|
+
.option("--base <revision>")
|
|
183
|
+
.option("--path <pattern>", "expected path or glob; repeatable", collect, [])
|
|
184
|
+
.option("--depends-on <task>", "dependency task ID; repeatable", collect, [])
|
|
185
|
+
.option("--priority <number>", "higher values are scheduled first")
|
|
186
|
+
.option("--worktree <path>", "agent worktree")
|
|
187
|
+
.option("--token-file <path>", "write the lease token here instead of the broker state directory")
|
|
188
|
+
.option("--no-store-token", "do not persist the token; handle custody yourself")
|
|
189
|
+
.action(async (id, options) => {
|
|
190
|
+
const result = await (await openBroker()).claimTask({
|
|
191
|
+
id,
|
|
192
|
+
holder: options.holder,
|
|
193
|
+
...(options.title ? { title: options.title } : {}),
|
|
194
|
+
...(options.agent ? { agent: options.agent } : {}),
|
|
195
|
+
...(options.base ? { base: options.base } : {}),
|
|
196
|
+
...(options.path.length > 0 ? { expectedPaths: options.path } : {}),
|
|
197
|
+
...(options.dependsOn.length > 0 ? { dependsOn: options.dependsOn } : {}),
|
|
198
|
+
...(options.priority ? { priority: Number(options.priority) } : {}),
|
|
199
|
+
worktree: options.worktree ?? globalOptions().cwd,
|
|
200
|
+
...(options.tokenFile ? { tokenFile: options.tokenFile } : {}),
|
|
201
|
+
storeToken: options.storeToken,
|
|
202
|
+
});
|
|
203
|
+
output({ task: publicTask(result.task), token: result.token, tokenPath: result.tokenPath }, [
|
|
204
|
+
`Claimed task ${result.task.id} until ${result.task.lease?.expiresAt}.`,
|
|
205
|
+
...(result.tokenPath
|
|
206
|
+
? [
|
|
207
|
+
`Lease token stored at ${result.tokenPath} (readable only by you).`,
|
|
208
|
+
"Commands for this task on this machine will find it automatically.",
|
|
209
|
+
]
|
|
210
|
+
: [`Lease token: ${result.token}`, "Save this token; it is shown only once."]),
|
|
211
|
+
].join("\n"));
|
|
212
|
+
});
|
|
213
|
+
task
|
|
214
|
+
.command("extend <id>")
|
|
215
|
+
.description("extend an active task lease with additional expected paths")
|
|
216
|
+
.option("--path <pattern>", "expected path or glob; repeatable", collect, [])
|
|
217
|
+
.option("--token <token>")
|
|
218
|
+
.option("--token-file <path>", "read the lease token from this file")
|
|
219
|
+
.action(async (id, options) => {
|
|
220
|
+
const broker = await openBroker();
|
|
221
|
+
const result = await broker.extendTask(id, options.path, await requireLeaseToken(broker, id, options));
|
|
222
|
+
output(publicTask(result), `Extended task ${id} to ${result.expectedPaths.length} path pattern(s).`);
|
|
223
|
+
});
|
|
224
|
+
task
|
|
225
|
+
.command("retry <id>")
|
|
226
|
+
.description("return a failed task to the submitted queue")
|
|
227
|
+
.option("--token <token>")
|
|
228
|
+
.option("--token-file <path>", "read the lease token from this file")
|
|
229
|
+
.action(async (id, options) => {
|
|
230
|
+
const broker = await openBroker();
|
|
231
|
+
const result = await broker.retryTask(id, await findLeaseToken(broker, id, options));
|
|
232
|
+
output(publicTask(result), `Returned task ${id} to the integration queue.`);
|
|
233
|
+
});
|
|
234
|
+
task
|
|
235
|
+
.command("heartbeat <id>")
|
|
236
|
+
.description("extend an active task lease")
|
|
237
|
+
.option("--token <token>")
|
|
238
|
+
.option("--token-file <path>", "read the lease token from this file")
|
|
239
|
+
.action(async (id, options) => {
|
|
240
|
+
const broker = await openBroker();
|
|
241
|
+
const result = await broker.heartbeat(id, await requireLeaseToken(broker, id, options));
|
|
242
|
+
output(publicTask(result), `Lease for ${id} extended until ${result.lease?.expiresAt}.`);
|
|
243
|
+
});
|
|
244
|
+
task
|
|
245
|
+
.command("submit <id>")
|
|
246
|
+
.description("submit one or more immutable Git commits as a receipt")
|
|
247
|
+
.option("--commit <revision>", "commit to integrate; repeatable", collect, [])
|
|
248
|
+
.option("--since-base", "submit every linear commit made after the task's recorded base")
|
|
249
|
+
.option("--token <token>")
|
|
250
|
+
.option("--token-file <path>", "read the lease token from this file")
|
|
251
|
+
.action(async (id, options) => {
|
|
252
|
+
if (options.sinceBase && options.commit.length > 0) {
|
|
253
|
+
throw new BrokerError("INVALID_ARGUMENTS", "Use either --since-base or explicit --commit values, not both.");
|
|
254
|
+
}
|
|
255
|
+
const broker = await openBroker();
|
|
256
|
+
const commits = options.commit.length > 0 ? options.commit : ["HEAD"];
|
|
257
|
+
const result = await broker.submitTask(id, commits, await requireLeaseToken(broker, id, options), {
|
|
258
|
+
sinceBase: options.sinceBase ?? false,
|
|
259
|
+
});
|
|
260
|
+
output({ ...result, task: publicTask(result.task) }, `Submitted ${result.task.commits.length} commit(s) for ${id}.\nReceipt: ${result.receiptPath}`);
|
|
261
|
+
});
|
|
262
|
+
task
|
|
263
|
+
.command("release <id>")
|
|
264
|
+
.description("release a task lease")
|
|
265
|
+
.option("--token <token>")
|
|
266
|
+
.option("--token-file <path>", "read the lease token from this file")
|
|
267
|
+
.option("--force", "revoke the lease without its token, for a holder that is gone")
|
|
268
|
+
.action(async (id, options) => {
|
|
269
|
+
const broker = await openBroker();
|
|
270
|
+
const result = options.force
|
|
271
|
+
? await broker.releaseTask(id, undefined, { force: true })
|
|
272
|
+
: await broker.releaseTask(id, await requireLeaseToken(broker, id, options));
|
|
273
|
+
output(publicTask(result), `Released task ${id}.`);
|
|
274
|
+
});
|
|
275
|
+
task
|
|
276
|
+
.command("cancel <id>")
|
|
277
|
+
.description("cancel a task that has not been batched")
|
|
278
|
+
.option("--token <token>")
|
|
279
|
+
.option("--token-file <path>", "read the lease token from this file")
|
|
280
|
+
.option("--force", "cancel without a lease token, for a holder that is gone")
|
|
281
|
+
.action(async (id, options) => {
|
|
282
|
+
const broker = await openBroker();
|
|
283
|
+
const result = await broker.cancelTask(id, await findLeaseToken(broker, id, options), {
|
|
284
|
+
force: options.force ?? false,
|
|
285
|
+
});
|
|
286
|
+
output(publicTask(result), `Cancelled task ${id}.`);
|
|
287
|
+
});
|
|
288
|
+
task
|
|
289
|
+
.command("show <id>")
|
|
290
|
+
.description("show one task")
|
|
291
|
+
.action(async (id) => {
|
|
292
|
+
const result = await (await openBroker()).task(id);
|
|
293
|
+
output(publicTask(result), JSON.stringify(taskSummary(result), null, 2));
|
|
294
|
+
});
|
|
295
|
+
program
|
|
296
|
+
.command("status")
|
|
297
|
+
.description("show broker task and batch state")
|
|
298
|
+
.action(async () => {
|
|
299
|
+
const state = await (await openBroker()).state();
|
|
300
|
+
output(publicState(state), stateHuman(state));
|
|
301
|
+
});
|
|
302
|
+
program
|
|
303
|
+
.command("plan")
|
|
304
|
+
.description("show the next deterministic non-conflicting batch")
|
|
305
|
+
.option("--task <id>", "restrict planning to task ID; repeatable", collect, [])
|
|
306
|
+
.option("--max-tasks <number>")
|
|
307
|
+
.action(async (options) => {
|
|
308
|
+
const result = await (await openBroker()).plan({
|
|
309
|
+
...(options.task.length > 0 ? { taskIds: options.task } : {}),
|
|
310
|
+
...(options.maxTasks ? { maxTasks: Number(options.maxTasks) } : {}),
|
|
311
|
+
});
|
|
312
|
+
output(result, planHuman(result));
|
|
313
|
+
});
|
|
314
|
+
program
|
|
315
|
+
.command("integrate")
|
|
316
|
+
.description("transactionally cherry-pick and validate the next batch")
|
|
317
|
+
.option("--task <id>", "restrict integration to task ID; repeatable", collect, [])
|
|
318
|
+
.option("--max-tasks <number>")
|
|
319
|
+
.option("--dry-run", "verify without retaining an integration branch")
|
|
320
|
+
.option("--publish", "publish according to the configured publishing mode")
|
|
321
|
+
.action(async (options) => {
|
|
322
|
+
const result = await (await openBroker()).integrate({
|
|
323
|
+
...(options.task.length > 0 ? { taskIds: options.task } : {}),
|
|
324
|
+
...(options.maxTasks ? { maxTasks: Number(options.maxTasks) } : {}),
|
|
325
|
+
dryRun: options.dryRun ?? false,
|
|
326
|
+
publish: options.publish ?? false,
|
|
327
|
+
});
|
|
328
|
+
output(result, batchHuman(result.batch));
|
|
329
|
+
});
|
|
330
|
+
const batch = program.command("batch").description("inspect and advance integration batches");
|
|
331
|
+
batch
|
|
332
|
+
.command("list")
|
|
333
|
+
.description("list batches")
|
|
334
|
+
.action(async () => {
|
|
335
|
+
const batches = Object.values((await (await openBroker()).state()).batches).sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
336
|
+
output(batches, batches.length > 0
|
|
337
|
+
? batches.map((item) => `${item.id.padEnd(30)} ${item.status.padEnd(10)} ${item.taskIds.join(", ")}`).join("\n")
|
|
338
|
+
: "No batches.");
|
|
339
|
+
});
|
|
340
|
+
batch
|
|
341
|
+
.command("show <id>")
|
|
342
|
+
.description("show a batch")
|
|
343
|
+
.action(async (id) => {
|
|
344
|
+
const state = await (await openBroker()).state();
|
|
345
|
+
const result = Object.hasOwn(state.batches, id) ? state.batches[id] : undefined;
|
|
346
|
+
if (!result)
|
|
347
|
+
throw new BrokerError("UNKNOWN_BATCH", `Unknown batch: ${id}`);
|
|
348
|
+
output(result, batchHuman(result));
|
|
349
|
+
});
|
|
350
|
+
batch
|
|
351
|
+
.command("publish <id>")
|
|
352
|
+
.description("push a prepared batch and optionally open its pull request")
|
|
353
|
+
.action(async (id) => {
|
|
354
|
+
const result = await (await openBroker()).publishBatch(id);
|
|
355
|
+
output(result, batchHuman(result));
|
|
356
|
+
});
|
|
357
|
+
batch
|
|
358
|
+
.command("sync [id]")
|
|
359
|
+
.description("reconcile one or all published batches with GitHub or the remote base branch")
|
|
360
|
+
.option("--all", "sync every published batch")
|
|
361
|
+
.action(async (id, options) => {
|
|
362
|
+
const broker = await openBroker();
|
|
363
|
+
if (options.all || !id) {
|
|
364
|
+
const result = await broker.syncPublishedBatches();
|
|
365
|
+
output(result, `Merged: ${result.synced.length}; closed: ${result.closed.length}; unchanged: ${result.unchanged.length}; errors: ${result.errors.length}`);
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
const result = await broker.syncBatch(id);
|
|
369
|
+
output(result, batchHuman(result));
|
|
370
|
+
});
|
|
371
|
+
batch
|
|
372
|
+
.command("complete <id>")
|
|
373
|
+
.description("manually mark a prepared or published batch as merged")
|
|
374
|
+
.option("--merge-commit <sha>")
|
|
375
|
+
.action(async (id, options) => {
|
|
376
|
+
const result = await (await openBroker()).markBatchMerged(id, undefined, options.mergeCommit);
|
|
377
|
+
output(result, batchHuman(result));
|
|
378
|
+
});
|
|
379
|
+
program
|
|
380
|
+
.command("audit")
|
|
381
|
+
.description("audit Git worktrees, task registrations, and stale leases")
|
|
382
|
+
.action(async () => {
|
|
383
|
+
const result = await (await openBroker()).auditWorktrees();
|
|
384
|
+
const human = [
|
|
385
|
+
`Worktrees: ${result.worktrees.length}`,
|
|
386
|
+
`Stale leases: ${result.staleLeases.length > 0 ? result.staleLeases.join(", ") : "none"}`,
|
|
387
|
+
`Unregistered worktrees: ${result.unregisteredWorktrees.length > 0 ? result.unregisteredWorktrees.join(", ") : "none"}`,
|
|
388
|
+
].join("\n");
|
|
389
|
+
output(result, human);
|
|
390
|
+
});
|
|
391
|
+
program
|
|
392
|
+
.command("metrics")
|
|
393
|
+
.description("summarize local throughput, batch, and validation measurements")
|
|
394
|
+
.action(async () => {
|
|
395
|
+
const result = await (await openBroker()).metrics();
|
|
396
|
+
output(result, JSON.stringify(result, null, 2));
|
|
397
|
+
});
|
|
398
|
+
program
|
|
399
|
+
.command("install-hooks")
|
|
400
|
+
.description("install the pre-push guard that keeps implementation branches out of the forge")
|
|
401
|
+
.option("--force", "replace an existing hooks path, disabling the hooks it holds")
|
|
402
|
+
.option("--uninstall", "remove the guard and restore the previous hooks path")
|
|
403
|
+
.action(async (options) => {
|
|
404
|
+
const result = await (await openBroker()).installHooks({
|
|
405
|
+
force: options.force ?? false,
|
|
406
|
+
uninstall: options.uninstall ?? false,
|
|
407
|
+
});
|
|
408
|
+
output(result, result.installed
|
|
409
|
+
? [
|
|
410
|
+
`Installed the pre-push guard at ${result.hookFile}.`,
|
|
411
|
+
...(result.previousHooksPath ? [`Replaced core.hooksPath ${result.previousHooksPath}.`] : []),
|
|
412
|
+
"Commit .githooks/ so every clone of this repository is covered.",
|
|
413
|
+
].join("\n")
|
|
414
|
+
: "Removed the pre-push guard.");
|
|
415
|
+
});
|
|
416
|
+
program
|
|
417
|
+
.command("verify-provenance")
|
|
418
|
+
.description("prove a pull request head is an unaltered broker batch, before installing anything")
|
|
419
|
+
.requiredOption("--branch <ref>", "head branch of the pull request")
|
|
420
|
+
.requiredOption("--head <sha>", "head commit of the pull request")
|
|
421
|
+
.requiredOption("--base <sha>", "current tip of the target branch")
|
|
422
|
+
.option("--base-branch <name>", "expected target branch")
|
|
423
|
+
.option("--branch-prefix <prefix>", "integration branch prefix")
|
|
424
|
+
.option("--provenance-directory <path>", "directory holding batch manifests")
|
|
425
|
+
.action(async (options) => {
|
|
426
|
+
const repo = await GitRepository.discover(globalOptions().cwd);
|
|
427
|
+
// Policy comes from the base branch, never from the change being verified.
|
|
428
|
+
const policy = await policyFromBase(repo, options.base);
|
|
429
|
+
const result = await verifyProvenance({
|
|
430
|
+
repo,
|
|
431
|
+
branch: options.branch,
|
|
432
|
+
headSha: options.head,
|
|
433
|
+
baseSha: options.base,
|
|
434
|
+
baseBranch: options.baseBranch ?? policy.baseBranch ?? "main",
|
|
435
|
+
branchPrefix: options.branchPrefix ?? policy.branchPrefix ?? "merge-broker/",
|
|
436
|
+
provenanceDirectory: options.provenanceDirectory ?? policy.provenanceDirectory ?? ".merge-broker/attestations",
|
|
437
|
+
});
|
|
438
|
+
output(result, [
|
|
439
|
+
`Verified broker batch ${result.batchId}.`,
|
|
440
|
+
`Tasks: ${result.taskIds.join(", ")}`,
|
|
441
|
+
`Integrated head: ${result.parentSha}`,
|
|
442
|
+
`Validations recorded: ${result.manifest.validations.length}`,
|
|
443
|
+
].join("\n"));
|
|
444
|
+
});
|
|
445
|
+
program
|
|
446
|
+
.command("prune")
|
|
447
|
+
.description("retire completed tasks and batches from active state into the archive")
|
|
448
|
+
.option("--older-than <days>", "retire records completed at least this many days ago", "30")
|
|
449
|
+
.option("--dry-run", "report what would be retired without changing state")
|
|
450
|
+
.action(async (options) => {
|
|
451
|
+
const olderThanDays = Number(options.olderThan);
|
|
452
|
+
if (!Number.isFinite(olderThanDays) || olderThanDays < 0) {
|
|
453
|
+
throw new BrokerError("INVALID_LIMIT", "--older-than must be a non-negative number of days.");
|
|
454
|
+
}
|
|
455
|
+
const result = await (await openBroker()).prune({ olderThanDays, dryRun: options.dryRun ?? false });
|
|
456
|
+
output(result, [
|
|
457
|
+
`${result.dryRun ? "Would retire" : "Retired"} ${result.tasks.length} task(s) and ${result.batches.length} batch(es) completed before ${result.cutoff}.`,
|
|
458
|
+
...(result.retainedForDependencies.length > 0
|
|
459
|
+
? [`Kept as dependencies of active work: ${result.retainedForDependencies.join(", ")}`]
|
|
460
|
+
: []),
|
|
461
|
+
...(result.archivePath ? [`Archive: ${result.archivePath}`] : []),
|
|
462
|
+
].join("\n"));
|
|
463
|
+
});
|
|
464
|
+
program
|
|
465
|
+
.command("unlock [name]")
|
|
466
|
+
.description("release a stuck state or integration lock left by a crashed process")
|
|
467
|
+
.option("--force", "release even when the holder cannot be proven gone")
|
|
468
|
+
.action(async (name, options) => {
|
|
469
|
+
const broker = await openBroker();
|
|
470
|
+
if (!name) {
|
|
471
|
+
const locks = await broker.inspectLocks();
|
|
472
|
+
output(locks, locks
|
|
473
|
+
.map((lock) => lock.held
|
|
474
|
+
? `${lock.name}: held by ${lock.owner?.host ?? "unknown"} (pid ${lock.owner?.pid ?? "unknown"}), ${Math.round((lock.ageMs ?? 0) / 1_000)}s old${lock.abandoned ? ", owner process is gone" : ""}`
|
|
475
|
+
: `${lock.name}: free`)
|
|
476
|
+
.join("\n"));
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
const result = await broker.releaseLock(name, { force: options.force ?? false });
|
|
480
|
+
output(result, `Released the ${result.name} lock.`);
|
|
481
|
+
});
|
|
482
|
+
program
|
|
483
|
+
.command("events")
|
|
484
|
+
.description("show the append-only local audit trail")
|
|
485
|
+
.addOption(new Option("--limit <number>", "maximum events").default("100"))
|
|
486
|
+
.action(async (options) => {
|
|
487
|
+
const result = await (await openBroker()).store.readAudit(Number(options.limit));
|
|
488
|
+
output(result, result.map((event) => `${event.at} #${event.sequence} ${event.event} ${event.taskId ?? event.batchId ?? ""}`).join("\n"));
|
|
489
|
+
});
|
|
490
|
+
program
|
|
491
|
+
.command("serve")
|
|
492
|
+
.description("poll for ready batches and integrate them")
|
|
493
|
+
.option("--interval <seconds>", "poll interval", "15")
|
|
494
|
+
.option("--publish", "publish each successful batch")
|
|
495
|
+
.option("--eager", "integrate immediately instead of waiting for a full or aged batch")
|
|
496
|
+
.option("--once", "perform one polling cycle and exit")
|
|
497
|
+
.action(async (options) => {
|
|
498
|
+
let stopping = false;
|
|
499
|
+
process.once("SIGINT", () => {
|
|
500
|
+
stopping = true;
|
|
501
|
+
});
|
|
502
|
+
process.once("SIGTERM", () => {
|
|
503
|
+
stopping = true;
|
|
504
|
+
});
|
|
505
|
+
do {
|
|
506
|
+
const broker = await openBroker();
|
|
507
|
+
const reconciliation = await broker.syncPublishedBatches();
|
|
508
|
+
for (const failure of reconciliation.errors) {
|
|
509
|
+
console.error(`Could not sync batch ${failure.batchId}: ${failure.error}`);
|
|
510
|
+
}
|
|
511
|
+
for (const merged of reconciliation.synced) {
|
|
512
|
+
console.log(`Batch ${merged.id} merged.`);
|
|
513
|
+
}
|
|
514
|
+
for (const abandoned of reconciliation.closed) {
|
|
515
|
+
console.error(`Batch ${abandoned.id} was closed without merging; its tasks returned to the queue.`);
|
|
516
|
+
}
|
|
517
|
+
const plan = await broker.plan();
|
|
518
|
+
const oldest = plan.selected.reduce((minimum, item) => Math.min(minimum, item.submittedAt ? Date.parse(item.submittedAt) : Date.now()), Date.now());
|
|
519
|
+
const aged = Date.now() - oldest >= broker.config.scheduling.maxWaitSeconds * 1_000;
|
|
520
|
+
const full = plan.selected.length >= broker.config.scheduling.maxTasks;
|
|
521
|
+
if (plan.selected.length > 0 && (options.eager || options.once || aged || full)) {
|
|
522
|
+
try {
|
|
523
|
+
const result = await broker.integrate({ publish: options.publish ?? false });
|
|
524
|
+
output(result, batchHuman(result.batch));
|
|
525
|
+
}
|
|
526
|
+
catch (error) {
|
|
527
|
+
if (options.once)
|
|
528
|
+
throw error;
|
|
529
|
+
console.error(`Integration attempt failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
if (options.once || stopping)
|
|
533
|
+
break;
|
|
534
|
+
await new Promise((resolve) => setTimeout(resolve, Number(options.interval) * 1_000));
|
|
535
|
+
} while (!stopping);
|
|
536
|
+
});
|
|
537
|
+
program.parseAsync().catch((error) => {
|
|
538
|
+
const json = program.opts().json ?? false;
|
|
539
|
+
if (json) {
|
|
540
|
+
const value = error instanceof BrokerError
|
|
541
|
+
? { error: { code: error.code, message: error.message, details: error.details } }
|
|
542
|
+
: { error: { code: "UNEXPECTED", message: error instanceof Error ? error.message : String(error) } };
|
|
543
|
+
console.error(JSON.stringify(value, null, 2));
|
|
544
|
+
}
|
|
545
|
+
else if (error instanceof CommandError) {
|
|
546
|
+
console.error(`${error.message}${error.stderr ? `\n${error.stderr.trim()}` : ""}`);
|
|
547
|
+
}
|
|
548
|
+
else if (error instanceof BrokerError) {
|
|
549
|
+
console.error(`${error.code}: ${error.message}`);
|
|
550
|
+
if (process.env.MERGE_BROKER_DEBUG && error.details)
|
|
551
|
+
console.error(JSON.stringify(error.details, null, 2));
|
|
552
|
+
}
|
|
553
|
+
else {
|
|
554
|
+
console.error(error instanceof Error ? error.stack ?? error.message : String(error));
|
|
555
|
+
}
|
|
556
|
+
process.exitCode = 1;
|
|
557
|
+
});
|
|
558
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type BrokerConfig } from "./types.js";
|
|
2
|
+
export declare const CONFIG_DIRECTORY = ".merge-broker";
|
|
3
|
+
export declare const CONFIG_FILENAME = "config.json";
|
|
4
|
+
export declare const AGENT_INSTRUCTIONS_FILENAME = "agent-instructions.md";
|
|
5
|
+
export declare function defaultConfig(baseBranch?: string, remote?: string, baseRef?: string): BrokerConfig;
|
|
6
|
+
export declare function configPath(repoRoot: string): string;
|
|
7
|
+
export declare function initializeConfig(repoRoot: string, options?: {
|
|
8
|
+
baseBranch?: string;
|
|
9
|
+
baseRef?: string;
|
|
10
|
+
remote?: string;
|
|
11
|
+
force?: boolean;
|
|
12
|
+
}): Promise<{
|
|
13
|
+
path: string;
|
|
14
|
+
config: BrokerConfig;
|
|
15
|
+
created: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function validateConfig(value: unknown): BrokerConfig;
|
|
18
|
+
export declare function loadConfig(repoRoot: string): Promise<BrokerConfig>;
|
|
19
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAkB,KAAK,YAAY,EAAsC,MAAM,YAAY,CAAC;AAEnG,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAChD,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAC7C,eAAO,MAAM,2BAA2B,0BAA0B,CAAC;AAmBnE,wBAAgB,aAAa,CAAC,UAAU,SAAS,EAAE,MAAM,SAAW,EAAE,OAAO,SAAa,GAAG,YAAY,CAmDxG;AAWD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GACxF,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAanE;AAiDD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAqK3D;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAkBxE"}
|