multi-agent-workbench 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,12 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ruhul Amin
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files, to deal in the Software
7
+ without restriction, including without limitation the rights to use, copy,
8
+ modify, merge, publish, distribute, sublicense, and/or sell copies of the Software.
9
+
10
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
11
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
package/README.md CHANGED
@@ -1,3 +1,25 @@
1
- # Temporary Holding Version
1
+ # Multi-Agent Workbench
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Run multiple coding-agent CLIs in parallel with isolated worktrees, micro-task queues, handoff history, and live status.
4
+
5
+ ## Quick start
6
+
7
+ Create `tasks.json` in your project:
8
+
9
+ ```json
10
+ [
11
+ {"id":"L1","owner":"claude","worktree":"../project-claude","task":"API task","prompt":"Implement the API task and commit it."},
12
+ {"id":"C1","owner":"codex","worktree":"../project-codex","task":"Frontend task","prompt":"Implement the frontend task and commit it."}
13
+ ]
14
+ ```
15
+
16
+ Install and run:
17
+
18
+ ```bash
19
+ npm install -g multi-agent-workbench
20
+ multi-agent-workbench
21
+ # or without installing
22
+ npx multi-agent-workbench
23
+ ```
24
+
25
+ The supervisor reads `tasks.json` from the current project and writes `.agent-workbench/status.json` and `.agent-workbench/supervisor.log`. Review each commit before merging or deploying.
package/bin/maw.mjs ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import process from "node:process";
4
+ import { fileURLToPath } from "node:url";
5
+ import { dirname, resolve } from "node:path";
6
+
7
+ const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
8
+ const supervisor = resolve(packageRoot, "multi-agent-workbench/scripts/supervisor.mjs");
9
+ const child = spawn(process.execPath, [supervisor, ...process.argv.slice(2)], {
10
+ cwd: process.cwd(),
11
+ stdio: "inherit",
12
+ env: process.env,
13
+ });
14
+ child.on("exit", (code, signal) => process.exit(signal ? 1 : (code ?? 1)));
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: multi-agent-workbench
3
+ description: Orchestrate multiple local coding-agent CLIs in isolated worktrees with micro-task queues, handoffs, live status, review gates, and optional deployment triggers.
4
+ ---
5
+
6
+ # Multi-agent workbench
7
+
8
+ Use this skill when a software task benefits from multiple coding-agent CLIs working in parallel.
9
+
10
+ - Split work into bounded micro-tasks with owners, dependencies, and acceptance checks.
11
+ - Give each agent its own Git worktree and branch.
12
+ - Assign frontend/integration tasks to Codex and backend/data tasks to Claude when requested.
13
+ - Capture commit, tests, changed files, output, and risks after every task.
14
+ - Review and cherry-pick centrally; never auto-merge unreviewed work.
15
+ - Keep production tests/builds on the VPS when the repository uses a server-side deployment workflow.
16
+ - Expose current state, task, commit, output, and completed history in a live status file/dashboard.
17
+
18
+ See `references/task-schema.md` for handoff records and `scripts/supervisor.mjs` for the Node.js supervisor.
@@ -0,0 +1,3 @@
1
+ interface:
2
+ display_name: "Multi Agent Workbench"
3
+ short_description: "Help with Multi Agent Workbench tasks"
@@ -0,0 +1,3 @@
1
+ # Task and handoff schema
2
+
3
+ Each task records an id, owner, worktree, prompt, dependencies, acceptance checks, state, commit, tests, and risks. Completed tasks must include the worker output and commit hash.
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ import { mkdir, readFile, writeFile, appendFile } from "node:fs/promises";
3
+ import { spawn } from "node:child_process";
4
+ import process from "node:process";
5
+
6
+ const root = process.env.WORKBENCH_ROOT || process.cwd();
7
+ const dir = `${root}/.agent-workbench`;
8
+ await mkdir(dir, { recursive: true });
9
+ const tasks = JSON.parse(await readFile(process.env.WORKBENCH_TASKS || `${root}/tasks.json`, "utf8"));
10
+ const statePath = `${dir}/status.json`, logPath = `${dir}/supervisor.log`;
11
+ const state = { agents: {}, history: [], recent: [] };
12
+ const save = () => writeFile(statePath, JSON.stringify({ ...state, updated_at: new Date().toISOString() }, null, 2));
13
+ const log = async (line) => { const s = `[${new Date().toISOString()}] ${line}`; state.recent = [...state.recent, s].slice(-40); await appendFile(logPath, s + "\n"); await save(); };
14
+ function run(cmd, args, cwd) { return new Promise(resolve => { const p = spawn(cmd, args, { cwd, stdio: ["ignore", "pipe", "pipe"] }); let out = ""; p.stdout.on("data", x => { out += x; process.stdout.write(x); }); p.stderr.on("data", x => { out += x; process.stderr.write(x); }); p.on("close", code => resolve({ code: code ?? 1, out })); }); }
15
+ async function execute(task) {
16
+ state.agents[task.owner] = { state: "working", task: task.task, commit: null, output: [] }; await log(`${task.owner} start ${task.id}`);
17
+ const args = task.owner === "claude" ? ["--model", process.env.CLAUDE_MODEL || "haiku", "--effort", "low", "-p", task.prompt, "--dangerously-skip-permissions"] : ["exec", "-m", process.env.CODEX_MODEL || "gpt-6.1-sol", "-s", "danger-full-access", "--dangerously-bypass-approvals-and-sandbox", task.prompt];
18
+ const r = await run(task.owner === "claude" ? "claude" : "codex", args, task.worktree);
19
+ const commit = (r.out.match(/\b[0-9a-f]{7,40}\b/g) || []).at(-1) || null;
20
+ state.agents[task.owner] = { state: r.code === 0 ? "done" : "blocked", task: task.task, commit, output: r.out.split("\n").slice(-30) };
21
+ state.history = [...state.history, { id: task.id, owner: task.owner, task: task.task, commit, state: state.agents[task.owner].state, output: state.agents[task.owner].output, finished_at: new Date().toISOString() }].slice(-40);
22
+ await log(`${task.owner} ${state.agents[task.owner].state} ${task.id} ${commit || "—"}`); return r.code === 0;
23
+ }
24
+ await Promise.all(Object.entries(Object.groupBy(tasks, t => t.owner)).map(async ([, queue]) => { for (const task of queue) if (!await execute(task)) break; }));
package/package.json CHANGED
@@ -1,6 +1,21 @@
1
1
  {
2
2
  "name": "multi-agent-workbench",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Run multiple coding-agent CLIs in parallel with task queues, isolated worktrees, handoffs, and live status.",
5
+ "type": "module",
6
+ "bin": {
7
+ "multi-agent-workbench": "bin/maw.mjs",
8
+ "maw": "bin/maw.mjs"
9
+ },
10
+ "files": ["bin", "multi-agent-workbench", "README.md", "LICENSE"],
11
+ "scripts": {
12
+ "start": "node bin/maw.mjs",
13
+ "check": "node --check bin/maw.mjs && node --check multi-agent-workbench/scripts/supervisor.mjs",
14
+ "pack:check": "npm pack --dry-run"
15
+ },
16
+ "engines": {"node": ">=20"},
17
+ "license": "MIT",
18
+ "repository": {"type": "git", "url": "https://github.com/ruhul0/multi-agent-workbench.git"},
19
+ "bugs": {"url": "https://github.com/ruhul0/multi-agent-workbench/issues"},
20
+ "homepage": "https://github.com/ruhul0/multi-agent-workbench#readme"
21
+ }