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.
Files changed (75) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +352 -0
  3. package/dist/broker.d.ts +110 -0
  4. package/dist/broker.d.ts.map +1 -0
  5. package/dist/broker.js +1023 -0
  6. package/dist/broker.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +558 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/config.d.ts +19 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +312 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/errors.d.ts +16 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +36 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/git.d.ts +46 -0
  20. package/dist/git.d.ts.map +1 -0
  21. package/dist/git.js +195 -0
  22. package/dist/git.js.map +1 -0
  23. package/dist/hooks.d.ts +22 -0
  24. package/dist/hooks.d.ts.map +1 -0
  25. package/dist/hooks.js +110 -0
  26. package/dist/hooks.js.map +1 -0
  27. package/dist/index.d.ts +11 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +10 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/patterns.d.ts +9 -0
  32. package/dist/patterns.d.ts.map +1 -0
  33. package/dist/patterns.js +66 -0
  34. package/dist/patterns.js.map +1 -0
  35. package/dist/process.d.ts +30 -0
  36. package/dist/process.d.ts.map +1 -0
  37. package/dist/process.js +91 -0
  38. package/dist/process.js.map +1 -0
  39. package/dist/provenance.d.ts +10 -0
  40. package/dist/provenance.d.ts.map +1 -0
  41. package/dist/provenance.js +36 -0
  42. package/dist/provenance.js.map +1 -0
  43. package/dist/publisher.d.ts +37 -0
  44. package/dist/publisher.d.ts.map +1 -0
  45. package/dist/publisher.js +144 -0
  46. package/dist/publisher.js.map +1 -0
  47. package/dist/scheduler.d.ts +6 -0
  48. package/dist/scheduler.d.ts.map +1 -0
  49. package/dist/scheduler.js +96 -0
  50. package/dist/scheduler.js.map +1 -0
  51. package/dist/store.d.ts +73 -0
  52. package/dist/store.d.ts.map +1 -0
  53. package/dist/store.js +323 -0
  54. package/dist/store.js.map +1 -0
  55. package/dist/types.d.ts +219 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +3 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/validation.d.ts +13 -0
  60. package/dist/validation.d.ts.map +1 -0
  61. package/dist/validation.js +75 -0
  62. package/dist/validation.js.map +1 -0
  63. package/dist/verify.d.ts +40 -0
  64. package/dist/verify.d.ts.map +1 -0
  65. package/dist/verify.js +177 -0
  66. package/dist/verify.js.map +1 -0
  67. package/docs/ARCHITECTURE.md +144 -0
  68. package/docs/PROTOCOL.md +127 -0
  69. package/docs/RELEASING.md +23 -0
  70. package/docs/SECURITY.md +57 -0
  71. package/package.json +68 -0
  72. package/schemas/config.schema.json +149 -0
  73. package/schemas/provenance.schema.json +56 -0
  74. package/schemas/receipt.schema.json +39 -0
  75. 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -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"}