fanout-cli 0.9.2 → 0.9.4

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.
@@ -1,19 +1,12 @@
1
1
  {
2
2
  "name": "fanout",
3
3
  "description": "Lead a crew of the coding-agent CLIs you already pay for: plan, fan out into isolated git worktrees, watch, and review before anything merges.",
4
- "version": "0.9.2",
4
+ "version": "0.9.4",
5
5
  "author": {
6
6
  "name": "elberacasa"
7
7
  },
8
8
  "homepage": "https://github.com/elberacasa/fanout",
9
9
  "repository": "https://github.com/elberacasa/fanout",
10
10
  "license": "MIT",
11
- "keywords": [
12
- "agents",
13
- "orchestration",
14
- "codex",
15
- "grok",
16
- "worktrees",
17
- "local-first"
18
- ]
11
+ "keywords": ["agents", "orchestration", "codex", "grok", "worktrees", "local-first"]
19
12
  }
package/README.md CHANGED
@@ -1,48 +1,44 @@
1
- # fanout-cli
1
+ # The Fanout plugin for Claude Code
2
2
 
3
- Let Claude Code lead the other coding-agent CLIs you already pay for.
3
+ Claude Code becomes the lead: it plans a mission, fans it out to the other agent CLIs on your machine, watches them
4
+ work in isolated git worktrees, and reviews every diff. Nothing merges without you.
4
5
 
5
- Fanout is a local daemon and a Claude Code plugin. Claude plans the work; the other agents you have installed and
6
- signed in — Codex, and Claude itself when you opt in — do pieces of it in parallel, each in its own git worktree.
7
- Nothing merges until it has been reviewed by someone who did not write it, passed your project's own checks, and
8
- been approved by you.
6
+ ## What you get
9
7
 
10
- ## See it without an account
8
+ | | |
9
+ |---|---|
10
+ | `/fanout <goal>` | Plan a mission, check it against the safety gate, launch it, and watch it |
11
+ | `/fanout:crew` | Which CLIs are installed, signed in, and ready |
12
+ | `/fanout:watch [mission]` | Subscribe to the live feed and review each run as it finishes |
13
+ | The `fanout` skill | The lead's judgment: when to fan out, how to write a prompt an agent can follow, how to review what comes back |
14
+ | Hooks | The crew at the start of a session; a warning if runs are still going when you stop |
15
+ | Seven MCP tools | `seats`, `repo_overview`, `plan_check`, `launch`, `mission_status`, `run_diff`, `cancel_mission` |
11
16
 
12
- ```sh
13
- npx fanout-cli demo
14
- ```
17
+ ## Installing
15
18
 
16
- Three simulated agents run a real mission on a throwaway repository, in real worktrees, through the real gate. No
17
- sign-in, no API key, no network. It prints a local URL — open it to watch.
19
+ The plugin runs `fanout mcp`, so the `fanout` command must be on your `PATH`.
18
20
 
19
- ## Use it for real
21
+ **From a clone**, while the package is not yet published:
20
22
 
21
23
  ```sh
22
- npm install -g fanout-cli
23
- fanout seat # what is installed on this machine, and what is signed in
24
- fanout demo # the offline walkthrough
25
- fanout help # everything else
24
+ git clone https://github.com/elberacasa/fanout.git && cd fanout
25
+ corepack enable && pnpm install
26
+ pnpm --filter fanout-cli link --global # puts `fanout` on your PATH
27
+ claude --plugin-dir "$PWD/plugin" # try it in one session
26
28
  ```
27
29
 
28
- Then add the plugin, which is what Claude Code drives:
30
+ Check it before you rely on it:
29
31
 
32
+ ```sh
33
+ fanout status # your crew
34
+ claude plugin validate plugin
30
35
  ```
31
- /plugin marketplace add elberacasa/fanout
32
- /plugin install fanout@fanout
33
- ```
34
-
35
- That gives you `/fanout <goal>` inside your session.
36
36
 
37
37
  ## What it will not do
38
38
 
39
- - **It never touches your credentials.** Each agent runs through its vendor's own documented non-interactive mode,
40
- on your machine, under your account. Fanout does not read, copy, store, proxy or reuse a session token, and does
41
- not work around anyone's rate limits.
42
- - **It never merges unreviewed work.** Review, your project's checks, and your approval must all have judged the
43
- same revision of the same diff. A bug fix additionally needs a test proven to fail on the old code.
44
- - **It never commits on your branch without you.** Agents work in isolated worktrees and cannot reach your files,
45
- your secrets, or anything git ignores.
46
- - **It sends nothing anywhere.** Your code, your prompts and the ledger stay on your machine. There is no telemetry.
47
-
48
- Requires Node 22.18 or newer. MIT licensed.
39
+ - **It will not merge.** It reads a run's diff from the workspace and hands you the decision. The merge gate, with
40
+ review, your project's checks and proof that a fix fails on the old code, is the next milestone.
41
+ - **It will not work around a usage limit.** A seat that is out of quota is out; the lead says so and uses another.
42
+ - **It will not hand an agent your secrets.** Workspaces exclude ignored and deny-listed files, and a run gets an
43
+ allowlisted environment only never your shell's.
44
+ - **It sends nothing anywhere.** The daemon listens on `127.0.0.1` with a token only you can read.
@@ -18,22 +18,26 @@ import { fileURLToPath } from "node:url";
18
18
  *
19
19
  * There are two real layouts and this script is the one place that knows the difference:
20
20
  *
21
- * published <package>/plugin/bin/fanout → <package>/dist/cli.js
22
- * checkout <repo>/plugin/bin/fanout → <repo>/packages/cli/src/cli.ts
21
+ * published <package>/bin/fanout → <package>/dist/cli.js
22
+ * checkout <repo>/plugin/bin/fanout → <repo>/packages/cli/src/cli.ts
23
+ *
24
+ * The published path lost a level when the plugin was flattened into the package root, which it had to be:
25
+ * Claude Code treats the installed package's own root as the plugin root, and a manifest one directory down is
26
+ * a plugin that installs, reports itself enabled, and loads nothing.
23
27
  *
24
28
  * Ordered with the published layout first: that is the one a stranger has, and the one nobody here would notice
25
29
  * was broken.
26
30
  */
27
31
 
28
32
  const here = new URL(".", import.meta.url);
29
- const candidates = ["../../dist/cli.js", "../../packages/cli/src/cli.ts"];
33
+ const candidates = ["../dist/cli.js", "../../packages/cli/src/cli.ts"];
30
34
 
31
35
  const cli = candidates.map((path) => fileURLToPath(new URL(path, here))).find((path) => existsSync(path));
32
36
 
33
37
  if (cli === undefined) {
34
38
  process.stderr.write(
35
39
  "fanout: this plugin cannot find the Fanout CLI beside it.\n" +
36
- " Looked for dist/cli.js and packages/cli/src/cli.ts next to the plugin directory.\n" +
40
+ " Looked for ../dist/cli.js and ../../packages/cli/src/cli.ts from this script.\n" +
37
41
  " If you installed from npm, reinstall fanout-cli; if this is a checkout, run pnpm install first.\n",
38
42
  );
39
43
  process.exit(69);
package/dist/cli.js CHANGED
Binary file