fanout-cli 0.9.0 → 0.9.2

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/dist/view.html CHANGED
@@ -327,6 +327,11 @@
327
327
  .waiting .who {
328
328
  color: var(--fg);
329
329
  }
330
+ /* The other project's name, said quietly: it is context, not the subject of the row. */
331
+ .from {
332
+ color: var(--fg-faint);
333
+ font-size: var(--text-xs);
334
+ }
330
335
  .waiting .what {
331
336
  color: var(--fg-dim);
332
337
  }
@@ -615,7 +620,7 @@
615
620
  * of it; a page that worked out its own answer would eventually tell someone a run was ready while the
616
621
  * merge tool refused it.
617
622
  */
618
- function waitingSection(waiting) {
623
+ function waitingSection(waiting, here) {
619
624
  const section = el("section");
620
625
  const head = el("h2");
621
626
  head.append(document.createTextNode("Waiting on you"));
@@ -639,6 +644,15 @@
639
644
  // The work, not the run id — the id is for the tools, and is on the row for anyone who needs it.
640
645
  row.title = item.runId;
641
646
  row.append(el("span", "who", item.task ?? item.runId));
647
+ /*
648
+ * Where it came from, when it did not come from here. One daemon serves the whole machine, so a row
649
+ * with no repository asks somebody to review work they may never have seen the project for.
650
+ */
651
+ if (item.repo && item.repo !== here) {
652
+ const from = el("span", "from", item.repo.split("/").pop());
653
+ from.title = item.repo;
654
+ row.append(from);
655
+ }
642
656
  row.append(
643
657
  el(
644
658
  "span",
@@ -801,7 +815,12 @@
801
815
  main.append(crew);
802
816
 
803
817
  // Above the runs: it is the only thing on this page that asks something of whoever is reading it.
804
- main.append(waitingSection(snapshot.waiting ?? []));
818
+ /*
819
+ * The repository this page is about: the one the mission on screen belongs to. Rows from anywhere else
820
+ * are labelled, because one daemon serves the whole machine and an unlabelled row is a request to review
821
+ * work from a project the reader may not even have open.
822
+ */
823
+ main.append(waitingSection(snapshot.waiting ?? [], mission?.repo?.root));
805
824
 
806
825
  const runs = el("section");
807
826
  const runsHead = el("h2");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fanout-cli",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
4
4
  "description": "Let Claude Code lead the other coding-agent CLIs you already pay for.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -27,22 +27,24 @@
27
27
  "README.md",
28
28
  "LICENSE"
29
29
  ],
30
+ "scripts": {
31
+ "typecheck": "tsc -p tsconfig.json",
32
+ "build": "node ../../scripts/bundle-cli.mjs",
33
+ "prepack": "node ../../scripts/bundle-cli.mjs",
34
+ "prepublishOnly": "node ../../scripts/check-publish.mjs"
35
+ },
30
36
  "dependencies": {
31
37
  "@modelcontextprotocol/sdk": "1.30.0",
32
38
  "ws": "8.21.3",
33
39
  "zod": "4.6.2"
34
40
  },
35
41
  "devDependencies": {
36
- "fanout-adapter-claude": "0.9.0",
37
- "fanout-adapter-codex": "0.9.0",
38
- "fanout-core": "0.9.0",
39
- "fanout-adapter-grok": "0.9.0",
40
- "fanout-adapter-fake": "0.9.0",
41
- "fanout-daemon": "0.9.0",
42
- "fanout-mcp": "0.9.0"
43
- },
44
- "scripts": {
45
- "typecheck": "tsc -p tsconfig.json",
46
- "build": "node ../../scripts/bundle-cli.mjs"
42
+ "fanout-adapter-claude": "workspace:*",
43
+ "fanout-adapter-codex": "workspace:*",
44
+ "fanout-adapter-fake": "workspace:*",
45
+ "fanout-adapter-grok": "workspace:*",
46
+ "fanout-core": "workspace:*",
47
+ "fanout-daemon": "workspace:*",
48
+ "fanout-mcp": "workspace:*"
47
49
  }
48
- }
50
+ }
@@ -1,12 +1,19 @@
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.6.0",
4
+ "version": "0.9.2",
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": ["agents", "orchestration", "codex", "grok", "worktrees", "local-first"]
11
+ "keywords": [
12
+ "agents",
13
+ "orchestration",
14
+ "codex",
15
+ "grok",
16
+ "worktrees",
17
+ "local-first"
18
+ ]
12
19
  }
package/plugin/bin/fanout CHANGED
File without changes
@@ -7,24 +7,30 @@ The user wants this done by the crew: **$ARGUMENTS**
7
7
 
8
8
  You are the lead. Work in this order, and do not skip the parts that keep it safe.
9
9
 
10
- 1. **Look before planning.** Call `repo_overview` and `seats`. If no seat is ready, say so and stop: there is no
10
+ 1. **Say back what you heard, before anything else.** Restate the goal in one line `Planning: <goal>` in the
11
+ words you received it in. A prompt pasted into a terminal can arrive with characters missing, silently: a real
12
+ paste turned "fails on the old code" into "fails on the olcode" and nothing reported it. A goal that lost a
13
+ word still produces a confident plan, and every step after that looks reasonable, so this line is the only
14
+ place the input itself is ever visible. If it reads as truncated, contradictory or half a sentence, ask
15
+ instead of guessing.
16
+ 2. **Look before planning.** Call `repo_overview` and `seats`. If no seat is ready, say so and stop: there is no
11
17
  crew to lead.
12
- 2. **Split the work honestly.** One line per piece that can stand alone, each with:
18
+ 3. **Split the work honestly.** One line per piece that can stand alone, each with:
13
19
  - a **write scope** narrow enough that no two lines that run at once can touch the same file;
14
20
  - a **prompt** that names the exact files, the expected behaviour with an example, the project's check commands,
15
21
  and "do not commit";
16
22
  - a **seat**: give the risky or subtle piece to the strongest seat, the mechanical piece to the cheapest, and
17
23
  read-only work to an auditor. Claude is opt-in; prefer the other subscriptions.
18
24
  Dependent work goes in `dependsOn` rather than in one big line.
19
- 3. **Check before launching.** Call `plan_check`. Fix what it blocks; do not argue with it. Show the user the plan
25
+ 4. **Check before launching.** Call `plan_check`. Fix what it blocks; do not argue with it. Show the user the plan
20
26
  as a short list (line, seat, scope) and the dry run if they ask.
21
- 4. **Launch** with `launch`, then tell the user the mission id and what each line is doing.
22
- 5. **Watch** with `mission_status`. While runs are going, do not start unrelated work in this session: you are the
27
+ 5. **Launch** with `launch`, then tell the user the mission id and what each line is doing.
28
+ 6. **Watch** with `mission_status`. While runs are going, do not start unrelated work in this session: you are the
23
29
  lead, and reviewing is your job.
24
- 6. **Review each finished run** with `run_diff`. Read the risky lines yourself. Anything written outside its scope
30
+ 7. **Review each finished run** with `run_diff`. Read the risky lines yourself. Anything written outside its scope
25
31
  is the first thing you look at. Then tell the user, per run: what it changed, what you would keep, what you would
26
32
  not, and what you could not verify.
27
- 7. **Merging is the user's call, and it is not automatic.** Apply a diff yourself only when they say so, run the
33
+ 8. **Merging is the user's call, and it is not automatic.** Apply a diff yourself only when they say so, run the
28
34
  project's real checks afterwards, and never present an agent's "tests pass" as your own verification.
29
35
 
30
36
  If something fails, say which line, why, and what you propose — never "it didn't work".