@mmerterden/multi-agent-pipeline 20.29.0 → 20.33.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 (227) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +50 -5
  3. package/README.tr.md +64 -5
  4. package/docs/architecture.md +3 -3
  5. package/docs/ecosystem.md +5 -5
  6. package/docs/facts.json +9 -9
  7. package/install/_unattended-profile.mjs +61 -0
  8. package/install/catalog-history.json +1 -1
  9. package/install/claude.mjs +19 -3
  10. package/install/codex.mjs +2 -0
  11. package/install/copilot.mjs +13 -0
  12. package/install/index.mjs +10 -1
  13. package/install/templates/claude-hooks.json +12 -1
  14. package/manifest.json +230 -88
  15. package/package.json +3 -1
  16. package/pipeline/commands/multi-agent/analysis/SKILL.md +4 -4
  17. package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +13 -15
  18. package/pipeline/commands/multi-agent/office-off/SKILL.md +27 -0
  19. package/pipeline/commands/multi-agent/office-on/SKILL.md +51 -0
  20. package/pipeline/commands/multi-agent/office-status/SKILL.md +29 -0
  21. package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -1
  22. package/pipeline/commands/multi-agent/review/SKILL.md +4 -3
  23. package/pipeline/commands/multi-agent/scenario-audit/SKILL.md +4 -2
  24. package/pipeline/commands/multi-agent/serve/SKILL.md +4 -2
  25. package/pipeline/commands/multi-agent/stack/SKILL.md +15 -8
  26. package/pipeline/commands/multi-agent/steer/SKILL.md +10 -9
  27. package/pipeline/commands/multi-agent/sync/SKILL.md +15 -3
  28. package/pipeline/commands/multi-agent/test-gen/SKILL.md +29 -3
  29. package/pipeline/contract/CHANGELOG.md +108 -0
  30. package/pipeline/contract/README.md +72 -12
  31. package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
  32. package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
  33. package/pipeline/contract/fixtures/error-unsigned.json +1 -1
  34. package/pipeline/contract/fixtures/launch-plan.json +1 -1
  35. package/pipeline/contract/fixtures/runs-awaiting-question.json +6 -1
  36. package/pipeline/contract/fixtures/runs-empty.json +1 -1
  37. package/pipeline/contract/fixtures/runs-failed.json +6 -1
  38. package/pipeline/contract/fixtures/runs-old-schema.json +6 -1
  39. package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +5 -1
  40. package/pipeline/contract/fixtures/runs-pr-opened.json +6 -1
  41. package/pipeline/contract/fixtures/runs-running.json +6 -1
  42. package/pipeline/contract/manifest.json +506 -27
  43. package/pipeline/contract/types/index.d.ts +829 -4
  44. package/pipeline/lib/bg-launch.mjs +106 -0
  45. package/pipeline/lib/code-digest.mjs +49 -0
  46. package/pipeline/lib/credential-resolve.mjs +42 -2
  47. package/pipeline/multi-agent-refs/cross-cli-contract.md +5 -4
  48. package/pipeline/multi-agent-refs/features/office-threat-model.md +109 -0
  49. package/pipeline/multi-agent-refs/features/unattended-security.md +1 -1
  50. package/pipeline/multi-agent-refs/help/en.md +3 -0
  51. package/pipeline/multi-agent-refs/help/tr.md +3 -0
  52. package/pipeline/multi-agent-refs/phases/modes.md +7 -7
  53. package/pipeline/multi-agent-refs/phases/phase-5-report.md +16 -10
  54. package/pipeline/multi-agent-refs/review-standalone-tracker.md +37 -0
  55. package/pipeline/multi-agent-refs/tracker-contract.md +8 -3
  56. package/pipeline/office/NOTICE.md +45 -0
  57. package/pipeline/office/assets/ARCHIVE_BOXES.png +0 -0
  58. package/pipeline/office/assets/BIN.png +0 -0
  59. package/pipeline/office/assets/BOOKSHELF.png +0 -0
  60. package/pipeline/office/assets/CACTUS.png +0 -0
  61. package/pipeline/office/assets/CLOCK.png +0 -0
  62. package/pipeline/office/assets/COFFEE.png +0 -0
  63. package/pipeline/office/assets/COFFEE_MACHINE.png +0 -0
  64. package/pipeline/office/assets/COFFEE_TABLE.png +0 -0
  65. package/pipeline/office/assets/COUNTER_SINK.png +0 -0
  66. package/pipeline/office/assets/CUSHIONED_BENCH.png +0 -0
  67. package/pipeline/office/assets/CUSHIONED_CHAIR_BACK.png +0 -0
  68. package/pipeline/office/assets/CUSHIONED_CHAIR_FRONT.png +0 -0
  69. package/pipeline/office/assets/CUSHIONED_CHAIR_SIDE.png +0 -0
  70. package/pipeline/office/assets/DESK_FRONT.png +0 -0
  71. package/pipeline/office/assets/DESK_SIDE.png +0 -0
  72. package/pipeline/office/assets/DEVICE_STAND.png +0 -0
  73. package/pipeline/office/assets/DOUBLE_BOOKSHELF.png +0 -0
  74. package/pipeline/office/assets/FILING_CABINET.png +0 -0
  75. package/pipeline/office/assets/FRIDGE.png +0 -0
  76. package/pipeline/office/assets/HANGING_PLANT.png +0 -0
  77. package/pipeline/office/assets/LARGE_PAINTING.png +0 -0
  78. package/pipeline/office/assets/LARGE_PLANT.png +0 -0
  79. package/pipeline/office/assets/MAILBOX.png +0 -0
  80. package/pipeline/office/assets/MOP_BUCKET.png +0 -0
  81. package/pipeline/office/assets/PC_BACK.png +0 -0
  82. package/pipeline/office/assets/PC_FRONT_OFF.png +0 -0
  83. package/pipeline/office/assets/PC_FRONT_ON_1.png +0 -0
  84. package/pipeline/office/assets/PC_FRONT_ON_2.png +0 -0
  85. package/pipeline/office/assets/PC_FRONT_ON_3.png +0 -0
  86. package/pipeline/office/assets/PC_SIDE.png +0 -0
  87. package/pipeline/office/assets/PLANT.png +0 -0
  88. package/pipeline/office/assets/PLANT_2.png +0 -0
  89. package/pipeline/office/assets/POT.png +0 -0
  90. package/pipeline/office/assets/PRINTER.png +0 -0
  91. package/pipeline/office/assets/RECEPTION_DESK.png +0 -0
  92. package/pipeline/office/assets/SERVER_RACK.png +0 -0
  93. package/pipeline/office/assets/SERVER_RACK_2.png +0 -0
  94. package/pipeline/office/assets/SMALL_PAINTING.png +0 -0
  95. package/pipeline/office/assets/SMALL_PAINTING_2.png +0 -0
  96. package/pipeline/office/assets/SMALL_TABLE_FRONT.png +0 -0
  97. package/pipeline/office/assets/SMALL_TABLE_SIDE.png +0 -0
  98. package/pipeline/office/assets/SOFA_BACK.png +0 -0
  99. package/pipeline/office/assets/SOFA_FRONT.png +0 -0
  100. package/pipeline/office/assets/SOFA_SIDE.png +0 -0
  101. package/pipeline/office/assets/TABLE_FRONT.png +0 -0
  102. package/pipeline/office/assets/TOILET_STALL.png +0 -0
  103. package/pipeline/office/assets/VENDING.png +0 -0
  104. package/pipeline/office/assets/WASHBASIN.png +0 -0
  105. package/pipeline/office/assets/WATER_COOLER.png +0 -0
  106. package/pipeline/office/assets/WHITEBOARD.png +0 -0
  107. package/pipeline/office/assets/WOODEN_BENCH.png +0 -0
  108. package/pipeline/office/assets/WOODEN_CHAIR_BACK.png +0 -0
  109. package/pipeline/office/assets/WOODEN_CHAIR_FRONT.png +0 -0
  110. package/pipeline/office/assets/WOODEN_CHAIR_SIDE.png +0 -0
  111. package/pipeline/office/assets/char_0.png +0 -0
  112. package/pipeline/office/assets/char_1.png +0 -0
  113. package/pipeline/office/assets/char_2.png +0 -0
  114. package/pipeline/office/assets/char_3.png +0 -0
  115. package/pipeline/office/assets/char_4.png +0 -0
  116. package/pipeline/office/assets/char_5.png +0 -0
  117. package/pipeline/office/assets/floor_0.png +0 -0
  118. package/pipeline/office/assets/floor_1.png +0 -0
  119. package/pipeline/office/assets/floor_2.png +0 -0
  120. package/pipeline/office/assets/floor_3.png +0 -0
  121. package/pipeline/office/assets/floor_4.png +0 -0
  122. package/pipeline/office/assets/floor_5.png +0 -0
  123. package/pipeline/office/assets/floor_6.png +0 -0
  124. package/pipeline/office/assets/floor_7.png +0 -0
  125. package/pipeline/office/assets/floor_8.png +0 -0
  126. package/pipeline/office/assets/wall_0.png +0 -0
  127. package/pipeline/office/index.html +8431 -0
  128. package/pipeline/office/toolkit.json +3 -0
  129. package/pipeline/schemas/activity-chat.schema.json +78 -0
  130. package/pipeline/schemas/activity-roles.json +48 -0
  131. package/pipeline/schemas/activity-roles.schema.json +49 -0
  132. package/pipeline/schemas/activity.schema.json +613 -0
  133. package/pipeline/schemas/agent-state.schema.json +493 -115
  134. package/pipeline/schemas/autopilot-on-request.schema.json +33 -0
  135. package/pipeline/schemas/autopilot-on.schema.json +111 -0
  136. package/pipeline/schemas/contract-error.schema.json +45 -4
  137. package/pipeline/schemas/issue-maturity.schema.json +68 -0
  138. package/pipeline/schemas/job-change.schema.json +72 -0
  139. package/pipeline/schemas/job-request.schema.json +38 -0
  140. package/pipeline/schemas/launch.json +4 -4
  141. package/pipeline/schemas/ledger.schema.json +202 -0
  142. package/pipeline/schemas/office-credentials.schema.json +71 -0
  143. package/pipeline/schemas/office-jobs.json +253 -0
  144. package/pipeline/schemas/office-jobs.schema.json +62 -0
  145. package/pipeline/schemas/office-memory.schema.json +105 -0
  146. package/pipeline/schemas/office-settings-request.schema.json +30 -0
  147. package/pipeline/schemas/office-settings.schema.json +67 -0
  148. package/pipeline/schemas/permissions.schema.json +47 -0
  149. package/pipeline/schemas/phases.json +10 -2
  150. package/pipeline/schemas/phases.schema.json +86 -19
  151. package/pipeline/schemas/prefs.schema.json +19 -0
  152. package/pipeline/schemas/prs.schema.json +78 -0
  153. package/pipeline/schemas/prune-logs-request.schema.json +26 -0
  154. package/pipeline/schemas/prune-logs.schema.json +52 -0
  155. package/pipeline/schemas/repo-change.schema.json +54 -0
  156. package/pipeline/schemas/repo-request.schema.json +29 -0
  157. package/pipeline/schemas/repos.schema.json +49 -1
  158. package/pipeline/schemas/review-verdict-request.schema.json +20 -0
  159. package/pipeline/schemas/review-verdict.schema.json +62 -0
  160. package/pipeline/schemas/routine-delete.schema.json +59 -0
  161. package/pipeline/schemas/routines.schema.json +38 -0
  162. package/pipeline/schemas/run-evidence.schema.json +29 -0
  163. package/pipeline/schemas/run-results.schema.json +218 -0
  164. package/pipeline/schemas/runs-index.schema.json +257 -46
  165. package/pipeline/schemas/service-read.schema.json +58 -0
  166. package/pipeline/schemas/stack-change.schema.json +82 -0
  167. package/pipeline/schemas/stack-request.schema.json +33 -0
  168. package/pipeline/schemas/stack.schema.json +59 -0
  169. package/pipeline/schemas/steer-request.schema.json +25 -0
  170. package/pipeline/schemas/steer.schema.json +59 -0
  171. package/pipeline/schemas/system-status.schema.json +111 -0
  172. package/pipeline/schemas/tool-call-request.schema.json +19 -0
  173. package/pipeline/schemas/tool-call.schema.json +47 -0
  174. package/pipeline/schemas/tools.schema.json +65 -0
  175. package/pipeline/schemas/unattended-profile.json +7 -2
  176. package/pipeline/scripts/_active-run.mjs +2 -1
  177. package/pipeline/scripts/_cost.mjs +66 -1
  178. package/pipeline/scripts/_office-smoke-lib.sh +115 -0
  179. package/pipeline/scripts/_spawn-async.mjs +77 -0
  180. package/pipeline/scripts/_transcript-tail.mjs +274 -0
  181. package/pipeline/scripts/activity-snapshot.mjs +1223 -0
  182. package/pipeline/scripts/autopilot-control.mjs +214 -9
  183. package/pipeline/scripts/autopilot-runner.mjs +7 -5
  184. package/pipeline/scripts/contract-server.mjs +1853 -197
  185. package/pipeline/scripts/cost-analyze.mjs +2 -53
  186. package/pipeline/scripts/cost-table.json +1 -0
  187. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -1
  188. package/pipeline/scripts/job-launch.mjs +477 -0
  189. package/pipeline/scripts/launch-request.mjs +94 -9
  190. package/pipeline/scripts/office-build.mjs +226 -0
  191. package/pipeline/scripts/office-control.mjs +410 -0
  192. package/pipeline/scripts/office-credentials.mjs +106 -0
  193. package/pipeline/scripts/office-ledger.mjs +409 -0
  194. package/pipeline/scripts/office-memory.mjs +200 -0
  195. package/pipeline/scripts/office-prune.mjs +125 -0
  196. package/pipeline/scripts/office-settings.mjs +145 -0
  197. package/pipeline/scripts/phase-tracker.sh +12 -5
  198. package/pipeline/scripts/prune-logs.sh +53 -2
  199. package/pipeline/scripts/routine-registry.mjs +42 -6
  200. package/pipeline/scripts/run-results.mjs +373 -0
  201. package/pipeline/scripts/runs-index.mjs +62 -2
  202. package/pipeline/scripts/service-read.mjs +244 -0
  203. package/pipeline/scripts/stack-toggle.mjs +285 -0
  204. package/pipeline/scripts/steer-run.mjs +97 -0
  205. package/pipeline/scripts/system-status.mjs +196 -0
  206. package/pipeline/scripts/task-mirror.mjs +150 -0
  207. package/pipeline/scripts/task-mirror.sh +20 -0
  208. package/pipeline/scripts/toolkit-tools.mjs +625 -0
  209. package/pipeline/scripts/transcript-index.mjs +4 -1
  210. package/pipeline/scripts/uninstall.mjs +3 -0
  211. package/pipeline/scripts/work-items.mjs +473 -0
  212. package/pipeline/skills/.skill-manifest.json +23 -11
  213. package/pipeline/skills/.skills-index.json +34 -1
  214. package/pipeline/skills/shared/README.md +6 -3
  215. package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +13 -15
  216. package/pipeline/skills/shared/core/multi-agent-office-off/SKILL.md +16 -0
  217. package/pipeline/skills/shared/core/multi-agent-office-on/SKILL.md +21 -0
  218. package/pipeline/skills/shared/core/multi-agent-office-status/SKILL.md +17 -0
  219. package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +4 -1
  220. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +19 -0
  221. package/pipeline/skills/shared/core/multi-agent-scenario-audit/SKILL.md +4 -2
  222. package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +4 -2
  223. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +14 -6
  224. package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +10 -9
  225. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +3 -3
  226. package/pipeline/skills/shared/core/multi-agent-test-gen/SKILL.md +26 -3
  227. package/pipeline/skills/skills-index.md +4 -1
package/CHANGELOG.md CHANGED
@@ -16,6 +16,92 @@ Internal file-layout changes that don't affect the slash-command surface are sti
16
16
 
17
17
  ## [Unreleased]
18
18
 
19
+ ## [20.33.0] - 2026-10-25
20
+
21
+ ### Added
22
+
23
+ - Office: pipelines run step by step. Agents wait at the open office and walk over to take their seat in a run's room. The table sign counts phases from 1 over the run's own phases, fills the current phase as its tasks finish and names the task in progress; the run window shows each phase's checklist and a seat shows its own tasks and recent MCP calls. A finished run stays two minutes.
24
+ - `task-mirror.sh`, a PostToolUse hook on `TaskCreate` / `TaskUpdate`: the native task list of the session driving a run lands in that run's tracker under the phase in progress, so the office and the terminal show the same list. Phase tiles are skipped, nothing is written outside a run bound to the session, and the hook never prints.
25
+ - The analysis mode has its own phase names in `schemas/phases.json` (Intake, Evidence, Synthesis, Review, Publish, Report); `/multi-agent:test-gen` and a standalone `/multi-agent:review` register tracker runs with their own steps, on Claude Code and Copilot CLI alike.
26
+ - Office rooms per repository are typed: Development rooms (`/multi-agent`) and Analysis rooms (`/multi-agent:analysis`), each floor keeping a free Analysis room; a run that touches more repositories opens an annex desk on theirs. Labels go through one layout pass and never overlap; a thought cloud over a working agent says what it is doing and opens its detail.
27
+ - Office reception has two new-run desks (development and analysis) that list Jira and GitHub issues and take free text.
28
+ - Office mail room: pull requests on every GitHub account `gh` is logged in to, each asked with its own token, and on the configured Bitbucket Server.
29
+ - Office server room: the key cabinet (`GET /v1/credentials`, names and probe verdicts from `credential-inventory.sh`, never a value, local-only) and the system panel (`GET /v1/system`: CPU, memory, disk and the pipeline's own processes, numbers only). The library holds per-repository memory (`GET /v1/memory`: code graph age, learnings, findings and session notes, redacted). The restroom previews and prunes old run logs through `prune-logs.sh` (`POST /v1/prune-logs`, two steps, 7, 30 or 90 days, local-only).
30
+ - Office orientation room: a trainer next to reception opens a guide built from the floor that is drawn, listing every room with the windows it opens, how both pipelines run, what is a job, a window or terminal-only, the security model and the signs. Each visit points at it in the feed; the page keeps nothing in browser storage.
31
+ - Five read-only office jobs: doctor, route status, scan, scenario audit and analysis review (19 jobs in all). Commands that stay in the terminal say why instead of offering a copy button.
32
+ - Office tables seat a run's whole crew from the start, one seat per role each phase uses (planner and plan critic, developer and dev critic, three reviewers, committer, reporter; an analysis run its own): whoever's phase runs works, later ones wait for their turn, finished ones stay seated.
33
+ - The table sign names where the work came from (the Jira key, the GitHub issue as `repo#N`, both when an issue got a Jira, or free text), what a waiting run waits for (a local test, the report channels, an answer here, or a question in the terminal) and, once finished, the pull request it opened. `runs-index` carries `source`, `prNumber`, `mode`, `channels` and the local-only `channelUrls` (runs surface 1.3.0). The client contract is 1.6.0: the six new routes, and the activity and pull-request surfaces at 1.1.0. A run with no tracker still lists every phase of its mode.
34
+ - A question a session asks in its own terminal counts as waiting for you: the table glows, the HUD counts it, the feed says so and the tab title shows the number; the drawer says to answer it in the terminal. The HUD reads agents working, runs and sessions.
35
+ - Office settings screen in the manager's office (`GET/POST /v1/settings`, local-only, two steps, one change at a time): output language, the fable rung and model routing, each through the script its terminal command runs (`office-settings.mjs`). Route on keeps the saved strategy and scope; rules, free providers and prompt language stay in the terminal.
36
+ - Phase 5 records each report channel's outcome in `state.channelResults`; the run window lists where the report went, with the addresses (https only) from the run record, which drops them from a redacted answer.
37
+ - The memory shelf offers a code graph build or refresh for each repository, through the graph job.
38
+ - Office characters come in twelve looks: six sheets and a recoloured second set, so every role at a run's table looks different. The team window shows every character with its portrait, the office staff and the agent pool apart, and the chat drawer shows the character actually at the seat.
39
+ - README and README.tr gain an office section with screenshots; README.tr gains the hooks-per-host table README has.
40
+ - Office rooms carry more of a real office: pictures, a clock and hanging plants on free wall, and a plant in each free corner, never behind a tall piece, under a room's sign or in anyone's way.
41
+ - The autopilot window is one switch that says the state and flips it, the three numbers that matter, and the repository selection; stop buttons appear only while it runs, and with no repository it says how one is added.
42
+
43
+ ### Changed
44
+
45
+ - Office roles on the floor and in the feed are translated, and phase events count from 1 like the table sign.
46
+ - `/multi-agent:office-on` describes the panel as it is; the help catalog says the server runs until `office-off`.
47
+ - `prune-logs.sh` spares a run that can still be resumed (an `agent-state.json` status that is not finished, abandoned or cancelled) unless `--task` names it; `--only-from=FILE` limits a prune to a confirmed list. The office prunes only the folders its preview listed, passing them through `--only-from`, and refuses with `changed` when the set moved.
48
+ - `phase-tracker.sh task <N> <id> deleted` takes a mirrored task off the list, as a native `TaskUpdate` with status `deleted` does. A task id used again in a later phase updates that phase's task.
49
+ - Text cut to fit a field (`transcript-index` excerpts) counts its ` ...` ending toward the limit.
50
+ - An MCP call a turn left without a result is closed as failed, so no desk stands at the server rack forever. A task created between two phases is mirrored under the phase about to start.
51
+ - The key cabinet shows every verdict `credential-inventory.sh --probe` gives (malformed, no credential, probe error, server error, tier ready, needs a grant) and calls one it does not know unknown instead of not checked.
52
+ - The Bitbucket pull request list authenticates the way the credential inventory does: Basic with a stored `bitbucket_user`, else the token as a bearer. On a `gh` without `auth token --user`, the active account answers alone.
53
+ - The system panel counts only a node, npx or npm process as the toolkit server, and on macOS reports used memory from `vm_stat` (reclaimable pages count as free).
54
+ - A memory store line that is not a JSON object is skipped, a shelf that cannot be read is left out instead of failing the answer, and a graph dated in the future reads as zero days old.
55
+ - The room sign names only commands that exist; an autopilot job reads `/multi-agent autopilot` as its run does. Prunes run one at a time. A language change the preferences file could not take, or whose command descriptions were not switched, is reported as failed.
56
+ - The office translates numbered roles in the run window and chat drawer, the HUD counts sessions apart from solo jobs, the job form names the scenario audit's CSV field, and a run's head and crew stay at the table until it leaves.
57
+ - A run that just finished keeps only the session that ran it, so a session that starts the next run within two minutes sits at the new table.
58
+ - Office wall-station labels sit inside their room instead of above the top wall, and `smoke-office-runtime.sh` checks that no two labels overlap at any zoom step. A floor station's label sits above its tallest piece, hotbar labels fit under their icons, and room signs never cover a picture or board; the runtime smoke checks all three.
59
+ - `schemas/phases.schema.json` allows a mode's own phase `names`.
60
+
61
+ ### Security
62
+
63
+ - `GET /v1/system` measures with child processes off the event loop; requests that arrive while one measures share its answer, and the log folder size is reused for a minute. `GET /v1/memory` reads its stores asynchronously, parses only their last megabyte, and skips a store that is a FIFO, a symlink or anything but a regular file.
64
+ - Turning routing on from the office names, in its confirmation, the saved free provider chain it brings back and whether that chain allows training.
65
+ - `/multi-agent:scenario-audit` writes its verdicts in a folder of the run's own instead of a fixed name under `/tmp`.
66
+ - The Bitbucket token is read from the credential store with a deadline and sent only over https (a loopback host excepted); redirects are not followed. A redacted pull request list carries no URL or login.
67
+ - `resolveToken` gives the credential store a deadline. A GitHub Enterprise Server account's token reaches `gh` as `GH_ENTERPRISE_TOKEN` as well.
68
+ - Office threat model rows T19 to T24 cover the new routes, the PR listing, the task mirror hook, the settings screen and report links.
69
+
70
+ ## [20.32.0] - 2026-10-25
71
+
72
+ ### Added
73
+
74
+ - Office: a repository can be added from any window that picks one. Checkouts earlier runs worked in are suggested, a path can be typed, and a registered entry whose folder is gone can be taken off the list; each is a two-step write (`POST /v1/repos`, `DELETE /v1/repos/{id}`), and only a git checkout is accepted. `GET /v1/repos?all=1` (`launch-request.mjs repos --all`) lists the suggested and the missing entries by id, never by path to a page.
75
+ - Office keeps itself current: the open page shows a reload banner when a newer page is installed and reloads onto it through a fresh one-time code (`GET /office/version`, `POST /office/reload`); `office-on` replaces a running server whose code changed on disk. A server that has stopped is said so on the page.
76
+ - The office ships the toolkit version the release was checked against (`office/toolkit.json`, written by `office-build.mjs` from `docs/facts.json` and held by `--check`), so the Tools window starts an exact version with no manual step and every pipeline update moves it forward. `MA_TOOLKIT_VERSION` and `prefs.global.office.toolkitVersion` still override it. The Tools window shows the version; nothing writes the preferences file.
77
+ - Office: hand a job to someone. Clicking a person or a station opens the jobs that role does (`schemas/office-jobs.json`: 14 jobs, each parameter typed by kind, no free text); the confirmation names the exact prompt, the repository and what the job writes outside this machine, and the second step starts `claude --bg` with the unattended profile and no shell (`GET/POST /v1/jobs`, two steps). A team job meets in its repository's room and is refused while another run is live there (`room-busy`); a solo job sits at a desk under its role. Every start is recorded under `logs/multi-agent/office/jobs/` (0600). The autopilot runner and the office start sessions through one launcher, `pipeline/lib/bg-launch.mjs`.
78
+ - Office is a company building: a hall with the lobby, the open office and the kitchen on top, then the manager's office, library, server room, test lab, analysis room, archive, mail room and restroom, with each repository's meeting rooms below. Thirteen staff work in their rooms; the hotbar moves the camera to a room, and each room's window holds its commands (the cleanup in the restroom previews `/v1/gc` before it runs). Copy buttons are gone: the New run flow, PR review and the command cards start real jobs.
79
+ - Office furniture drawn for this project: 16 sprites kept as pixel grids in `pipeline/office-art` and rendered into PNGs by `office-build.mjs` with a dependency-free encoder; `--check` holds the PNGs to their sources.
80
+ - `smoke-office-ui.sh`: the signed-in panel driven by Playwright (adding a repository, the refusal of a folder that is not a checkout, command cards, the reload banner, a stopped server).
81
+
82
+ ### Security
83
+
84
+ - The unattended profile denies reading `~/.claude/logs/multi-agent/contract-server/` (a `Read` deny, a sandbox `denyRead`, and in `MCP_TOOLKIT_INDEX_DENY` together with the office state directory), where the local server keeps its bearer token, so a session the office or the autopilot starts cannot pick it up. Every install adds the deny rules and index-deny directories a newer release ships to an existing `multi-agent-unattended.settings.json` without changing what it allows (`tightenUnattendedProfile`), so the autopilot's profile check keeps passing after an update.
85
+ - `POST /v1/jobs` starts nothing unless agent-guard.sh is registered for every tool (`guard-missing`), re-checks at the confirmation that the repository is still allowed, and keeps claude's own error output off the page.
86
+
87
+ ### Changed
88
+
89
+ - Office: the panel's server runs until `/multi-agent:office-off`; it no longer stops after an idle time or after 8 hours. `contract-server.mjs` takes `--idle-minutes 0` and `--max-hours 0` for that, and keeps its 15 minute and 8 hour defaults when started on its own. The open page checks in once a minute, also in a background tab, and says so when the server has stopped.
90
+ - Office: command cards keep their button on the title row; long names are cut with the full name on hover.
91
+ - `/multi-agent:sync` checks the office instead of copying it: the committed page matches its sources, the installed copies match the page, and the recorded toolkit version is reported (Step 3e).
92
+
93
+ ## [20.31.0] - 2026-10-25
94
+
95
+ ### Changed
96
+
97
+ - Office: every run meets in its own walled room inside its repository's room. The orchestrator sits at the head of a long table with a computer, the agents face each other along it, and the table grows with the team from two to six chairs a side. Agent labels sit above the near row and below the far one; on a narrow floor the chairs are packed and labels show on hover. Free meeting rooms finish the row, a hall on the left leads in, and the floor reaches the bottom of the stage. The corridor label of a run over several repositories now sits beside the room name.
98
+
99
+ ## [20.30.0] - 2026-10-25
100
+
101
+ ### Added
102
+
103
+ - `/multi-agent:office-on`, `office-off`, `office-status`: a local browser panel over the contract server (127.0.0.1 only). The office is a pixel floor: a lobby whose furniture opens each feature (new run, quest board, PR desk, ledger, autopilot desk with its bot, routines, skills, toolkit, services, commands), one room per repository with one table per run, agents walking in to their chairs, typing or reading by the tool they use, a phase bar over every table, the paper handed on at each phase change, a lamp and a bubble when a run waits for you, finished agents moving to the lounge, and dashed corridors for runs over several repositories. A text list shows the same office. A demo office plays a scripted run when nothing is at work and never sends a write. Text follows `outputLanguage` (English or Turkish). Sprites come from pixel-agents (MIT) with MetroCity characters (CC0), installed in `office/assets/` and served at `/office/assets/` under a fixed file-name pattern; the page is built by `office-build.mjs` from `pipeline/office-src`; attribution in `office/NOTICE.md`. It shows their chats, a cost ledger with the source of every amount, run results, autopilot, routines, stacks, read-only toolkit tools and service reads, and starts runs through the existing launch route. The page installs to `~/.claude/office/` (and the Copilot and Codex trees); `GET /office` serves it, with `MA_OFFICE_PAGE` or `prefs.global.office.page` as overrides. The token reaches the page through a one-time 10 second code, never a URL; the server exits after its idle time and after 8 hours in any case. Remote access is not part of the pipeline; `office-status` reports "not available in this installation" unless a separately installed remote layer is present. Threat model: `multi-agent-refs/features/office-threat-model.md`. The description-surface ceiling rises from 94500 to 95000 bytes for the three commands and their core skills, after their descriptions were trimmed to 812 bytes for all six.
104
+
19
105
  ## [20.29.0] - 2026-10-24
20
106
 
21
107
  ### Added
package/README.md CHANGED
@@ -158,7 +158,7 @@ The discipline behind all of this - bounded loops, evidence gates, token-budgete
158
158
 
159
159
  ## Commands
160
160
 
161
- `/multi-agent` plus 66 sub-commands. `/multi-agent:help` renders the same catalog in your terminal, in your `outputLanguage`.
161
+ `/multi-agent` plus 69 sub-commands. `/multi-agent:help` renders the same catalog in your terminal, in your `outputLanguage`.
162
162
 
163
163
  ### Pipeline entries
164
164
 
@@ -353,6 +353,50 @@ Continuous mode therefore needs the `claude` binary on `PATH` everywhere. The
353
353
  queue and the repo selection live in `~/.claude/autopilot/` on every host, on
354
354
  purpose - two CLIs on one machine must read one queue, not two.
355
355
 
356
+ ## The office
357
+
358
+ A local web page that shows the pipeline as a pixel office and lets you drive
359
+ it. `/multi-agent:office-on` starts the contract server on 127.0.0.1 and opens
360
+ the page with a one-time code; the server runs until `/multi-agent:office-off`.
361
+
362
+ ![The company floor: reception, orientation, the open office, kitchen, accounting and the restroom](.github/office/floor.png)
363
+
364
+ - **Runs come alive.** Agents wait at their desks in the open office and walk
365
+ to a run's room when the run calls their role. Each repository has its own
366
+ floor of Development rooms (`/multi-agent`) and Analysis rooms
367
+ (`/multi-agent:analysis`); a run that touches more repositories opens an
368
+ annex desk on theirs.
369
+ - **The native task widget, on the table.** The table sign shows the phase
370
+ (`Phase 3/6 Dev`), a bar that fills as that phase's tasks finish and the
371
+ task in progress. A PostToolUse hook copies `TaskCreate` / `TaskUpdate` into
372
+ the run's tracker, so the office and the terminal show the same list. A
373
+ thought cloud over a working agent says what it is doing.
374
+ - **The rest of the ecosystem has a room.** Reception starts a run from a Jira
375
+ or GitHub issue or free text. The mail room lists pull requests on every
376
+ GitHub account `gh` is logged in to and on Bitbucket Server. The server room
377
+ holds the toolkit MCP tools, the services, the key cabinet (names and probe
378
+ verdicts, never a value) and the machine's CPU, memory and disk. The library
379
+ holds stacks, commands and what the pipeline learned per repository. The
380
+ restroom clears worktrees, abandoned runs and old run logs after a preview.
381
+ Accounting shows tokens and cost, the manager's office holds autopilot,
382
+ routines and the settings (output language, the fable rung, model routing),
383
+ and the orientation room explains the building.
384
+ - **People take jobs.** Click one, pick a job, confirm. Writes that change the
385
+ machine are local-only and take two requests. Work that is interactive or
386
+ changes the installation stays in the terminal, and the commands window says
387
+ why for each command.
388
+
389
+ ![Repository floors with Development and Analysis rooms, a live analysis and an annex desk](.github/office/rooms.png)
390
+
391
+ | Command | What it does |
392
+ | ---------------------------- | --------------------------------------------------------------- |
393
+ | `/multi-agent:office-on` | Start or reuse the server and open the page |
394
+ | `/multi-agent:office-status` | Whether it runs, its URL (never the token) and its last actions |
395
+ | `/multi-agent:office-off` | Stop the server; it runs until you do |
396
+
397
+ Security model: [office threat model](pipeline/multi-agent-refs/features/office-threat-model.md).
398
+ Phone access is not part of this installation.
399
+
356
400
  ## Which model answers
357
401
 
358
402
  The ladder is `fable -> opus -> sonnet -> haiku`, and a run walks it on failure.
@@ -408,17 +452,17 @@ This enables the matching plugin (+ the shared `ai-common` plugin) in the repo's
408
452
 
409
453
  ## Tool support
410
454
 
411
- The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same 66 commands.
455
+ The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same 69 commands.
412
456
 
413
457
  | Tool | Flag | What it installs |
414
458
  | ----------- | -------------------- | ------------------------------------------------------------------------------------------------------ |
415
459
  | Claude Code | `--claude` (default) | slash commands + skills + agents + the enforcement hooks (secret scan, agent-guard, read-size gate, run-scope guard, run-stop guard) |
416
- | Copilot CLI | `--copilot` | instructions + 66 sub-command skills + scripts |
417
- | Codex CLI | `--codex` | one router skill + 66 specs as refs + 11 agent TOML + `AGENTS.md` block + `codex mcp add` |
460
+ | Copilot CLI | `--copilot` | instructions + 69 sub-command skills + scripts |
461
+ | Codex CLI | `--codex` | one router skill + 69 specs as refs + 11 agent TOML + `AGENTS.md` block + `codex mcp add` |
418
462
 
419
463
  Filter skills by stack with `--platform=ios\|android\|all`.
420
464
 
421
- **Why Codex gets one skill and not 66.** Codex assembles every discovered skill's name
465
+ **Why Codex gets one skill and not 69.** Codex assembles every discovered skill's name
422
466
  and description into a single prompt block and drops entries when it overflows, with no
423
467
  error. Measured on 0.145: installing one plugin that declares 142 skills surfaced only
424
468
  75 of them and evicted an unrelated user skill. So on Codex the pipeline ships a single
@@ -458,6 +502,7 @@ The **secret scan** runs as a `PreToolUse` hook on Claude Code (hard-blocks a co
458
502
  | `agent-guard.sh` (attribution, force-push, skipped git hooks, argv secrets, closure confirmations, read-only repos, unattended policy) | PreToolUse `Bash`, file edits, fetch and toolkit tools | none | none |
459
503
  | `run-scope-guard.sh` (Figma phase rule, worktree boundary warning) | PreToolUse Figma tools, file edits | none: the phase records its own MCP calls | none |
460
504
  | `run-stop-guard.sh` (no silent stop mid-run) | Stop | none: halts stay the phase's own write | none |
505
+ | `task-mirror.sh` (native task list into the run tracker, so the office shows it) | PostToolUse `TaskCreate`/`TaskUpdate` | none: the phase calls `phase-tracker.sh task` itself | none: the phase calls `phase-tracker.sh task` itself |
461
506
  | `edit-syntax-gate.sh` | PostToolUse file edits | PostToolUse `apply_patch` | none: Copilot discards postToolUse output |
462
507
  | `check-read-size.sh`, capture hooks | registered | none | none |
463
508
 
package/README.tr.md CHANGED
@@ -157,7 +157,7 @@ Koşunun kendisinde ayarlanabilen tek şey autopilot; geri kalan her şey kendi
157
157
 
158
158
  ## Komutlar
159
159
 
160
- `/multi-agent` ve 66 alt komut. `/multi-agent:help` aynı katalogu terminalde, `outputLanguage` ayarına göre gösterir.
160
+ `/multi-agent` ve 69 alt komut. `/multi-agent:help` aynı katalogu terminalde, `outputLanguage` ayarına göre gösterir.
161
161
 
162
162
  ### Pipeline girişleri
163
163
 
@@ -352,6 +352,51 @@ Dolayısıyla sürekli mod her hostta `claude` binary'sinin `PATH`'te olmasını
352
352
  istiyor. Kuyruk ve repo seçimi her hostta `~/.claude/autopilot/` altında durur;
353
353
  bu bilinçli - bir makinedeki iki CLI tek kuyruk okumalı, iki değil.
354
354
 
355
+ ## Ofis
356
+
357
+ Pipeline'ı piksel bir ofis olarak gösteren ve oradan yönetmeni sağlayan yerel
358
+ bir web sayfası. `/multi-agent:office-on` sözleşme sunucusunu 127.0.0.1'de
359
+ başlatır ve sayfayı tek kullanımlık bir kodla açar; sunucu
360
+ `/multi-agent:office-off` ile durdurulana kadar çalışır.
361
+
362
+ ![Şirket katı: resepsiyon, oryantasyon, açık ofis, mutfak, muhasebe ve tuvalet](.github/office/floor-tr.png)
363
+
364
+ - **Koşular canlanır.** Ajanlar açık ofiste masalarında bekler. Bir koşu
365
+ rollerini çağırınca koşunun odasına yürürler. Her reponun kendi katı var:
366
+ Geliştirme odaları (`/multi-agent`) ve Analiz odaları
367
+ (`/multi-agent:analysis`). Birden fazla repoya dokunan koşu, diğer repoların
368
+ katında şube masası açar.
369
+ - **Terminaldeki görev listesi masada.** Masa tabelası fazı (`Faz 3/6 Dev`),
370
+ fazın görevleri bittikçe dolan çubuğu ve sürmekte olan görevi gösterir. Bir
371
+ PostToolUse hook'u `TaskCreate` / `TaskUpdate` çağrılarını koşunun
372
+ takipçisine yazar; ofis ile terminal aynı listeyi gösterir. Çalışan ajanın
373
+ üstündeki bulut ne yaptığını söyler.
374
+ - **Ekosistemin geri kalanının da odası var.** Resepsiyon, Jira ya da GitHub
375
+ issue'sundan veya serbest metinden koşu başlatır. Posta odası, `gh`'nin
376
+ oturum açtığı tüm GitHub hesaplarındaki ve Bitbucket Server'daki PR'ları
377
+ listeler. Sunucu odasında toolkit MCP araçları, servisler, anahtar dolabı
378
+ (ad ve canlı kontrol sonucu, asla değer) ve makinenin CPU, bellek ve disk durumu
379
+ var. Kütüphane stack'leri, komutları ve pipeline'ın repo başına öğrendiklerini
380
+ tutar. Tuvalet, önizleme gösterdikten sonra worktree'leri, yarım kalan
381
+ koşuları ve eski koşu loglarını temizler. Muhasebe token ve maliyeti
382
+ gösterir. Yönetici odasında otopilot, rutinler ve ayarlar (çıktı dili,
383
+ Fable basamağı, model yönlendirmesi) var. Oryantasyon odası binayı anlatır.
384
+ - **Kişiler iş alır.** Birine tıkla, iş seç, onayla. Makineyi değiştiren
385
+ yazmalar yalnızca yereldir ve iki istek ister. Etkileşimli ya da kurulumu
386
+ değiştiren işler terminalde kalır; komutlar penceresi her komut için sebebini
387
+ yazar.
388
+
389
+ ![Geliştirme ve Analiz odalarıyla repo katları, süren bir analiz ve bir şube masası](.github/office/rooms-tr.png)
390
+
391
+ | Komut | Ne yapar |
392
+ | ---------------------------- | -------------------------------------------------------- |
393
+ | `/multi-agent:office-on` | Sunucuyu başlatır ya da var olanı kullanır, sayfayı açar |
394
+ | `/multi-agent:office-status` | Çalışıyor mu, adresi (token asla) ve son işlemleri |
395
+ | `/multi-agent:office-off` | Sunucuyu durdurur; sen durdurana kadar çalışır |
396
+
397
+ Güvenlik modeli: [ofis tehdit modeli](pipeline/multi-agent-refs/features/office-threat-model.md).
398
+ Telefondan erişim bu kurulumun parçası değil.
399
+
355
400
  ## Hangi model cevaplıyor
356
401
 
357
402
  Merdiven `fable -> opus -> sonnet -> haiku`; koşu başarısızlıkta merdiveni iner.
@@ -407,17 +452,17 @@ Bu, ilgili plugin'i (+ ortak `ai-common` plugin'ini) repo'nun `.claude/settings.
407
452
 
408
453
  ## Araç desteği
409
454
 
410
- Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çalışır - üçü de aynı `pipeline/` kaynağından kurulur ve aynı 66 komutu alır.
455
+ Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çalışır - üçü de aynı `pipeline/` kaynağından kurulur ve aynı 69 komutu alır.
411
456
 
412
457
  | Araç | Bayrak | Ne kurar |
413
458
  | ----------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------- |
414
459
  | Claude Code | `--claude` (varsayılan) | slash komutları + skill'ler + agent'lar + üç `PreToolUse` hook'u (secret scan, agent-guard, okuma-boyutu geçidi) |
415
- | Copilot CLI | `--copilot` | talimatlar + 66 alt-komut skill'i + script'ler |
416
- | Codex CLI | `--codex` | bir router skill + ref olarak 66 spec + 11 agent TOML + `AGENTS.md` bloğu + `codex mcp add` |
460
+ | Copilot CLI | `--copilot` | talimatlar + 69 alt-komut skill'i + script'ler |
461
+ | Codex CLI | `--codex` | bir router skill + ref olarak 69 spec + 11 agent TOML + `AGENTS.md` bloğu + `codex mcp add` |
417
462
 
418
463
  Skill'leri stack'e göre filtrele: `--platform=ios\|android\|all`.
419
464
 
420
- **Codex neden 66 değil de tek bir skill alıyor.** Codex, keşfettiği her skill'in adını
465
+ **Codex neden 69 değil de tek bir skill alıyor.** Codex, keşfettiği her skill'in adını
421
466
  ve açıklamasını tek bir prompt bloğuna toplar ve blok taştığında girdileri hatasızca
422
467
  düşürür. 0.145 üzerinde ölçüldü: 142 skill deklare eden bir plugin kurulduğunda sadece
423
468
  75'i yüzeye çıktı ve alakasız bir kullanıcı skill'i tahliye edildi. Bu yüzden Codex'te
@@ -450,6 +495,20 @@ triage notu bunu belirtir.
450
495
 
451
496
  **Secret scan**, Claude Code'da bir `PreToolUse` hook'u olarak (bulgu halinde commit'i sert-engeller) ve diğer yerlerde bir pre-push kontrolü olarak çalışır.
452
497
 
498
+ **Host başına hook'lar.** Zorlayan hook'lar Claude Code'a ait; `install` bunları kaydeder, `/multi-agent:doctor` (`hook-reachability`) ayarlarında hangisinin eksik olduğunu söyler.
499
+
500
+ | Hook | Claude Code | Codex CLI | Copilot CLI |
501
+ | --- | --- | --- | --- |
502
+ | `pre-commit-check.sh` (secret taraması, sahipli yollar, attended build/test kanıtı, unattended defteri) | PreToolUse `Bash` | yok: pre-push kontrolü | yok: pre-push kontrolü |
503
+ | `agent-guard.sh` (atıf, force-push, atlanan git hook'ları, argv'de secret, kapanış onayları, salt okunur repolar, unattended politikası) | PreToolUse `Bash`, dosya düzenlemeleri, fetch ve toolkit araçları | yok | yok |
504
+ | `run-scope-guard.sh` (Figma faz kuralı, worktree sınırı uyarısı) | PreToolUse Figma araçları, dosya düzenlemeleri | yok: faz kendi MCP çağrılarını kaydeder | yok |
505
+ | `run-stop-guard.sh` (koşu ortasında sessizce durmaz) | Stop | yok: duraklama fazın kendi yazımı olarak kalır | yok |
506
+ | `task-mirror.sh` (terminaldeki görev listesini koşunun takipçisine yazar, ofis de onu gösterir) | PostToolUse `TaskCreate`/`TaskUpdate` | yok: faz `phase-tracker.sh task`'ı kendisi çağırır | yok: faz `phase-tracker.sh task`'ı kendisi çağırır |
507
+ | `edit-syntax-gate.sh` | PostToolUse dosya düzenlemeleri | PostToolUse `apply_patch` | yok: Copilot postToolUse çıktısını atar |
508
+ | `check-read-size.sh`, capture hook'ları | kayıtlı | yok | yok |
509
+
510
+ Bir host'ta eşdeğer hook yoksa kural yine faz dokümanlarında durur; orada zorlama değil, bir istektir.
511
+
453
512
  ## Pipeline koşusu dışında
454
513
 
455
514
  Pipeline'ı kurmak yalnız onu çalıştırdığında işe yaramıyor. Sıradan bir oturum açtığında aynı üç şey elinin altında; her sohbette yüklenen `rules/outside-the-pipeline.md` bunları duyuruyor:
@@ -113,7 +113,7 @@ graph TB
113
113
  end
114
114
 
115
115
  subgraph "Pipeline Specs"
116
- CMD[commands/<br/>66 command files]
116
+ CMD[commands/<br/>69 command files]
117
117
  AGT[agents/<br/>11 agent personas]
118
118
  RUL[rules/<br/>13 domain rules]
119
119
  PHS[multi-agent-refs/phases/<br/>phase specs + contracts]
@@ -204,8 +204,8 @@ repo and the website, plus the two independently shipped repos
204
204
  ```mermaid
205
205
  graph TD
206
206
  CC["Claude Code<br/>(source of truth)"]
207
- COP["Copilot CLI<br/>(instructions + 66 sub-command skills)"]
208
- COD["Codex CLI<br/>(1 router skill + 66 refs)"]
207
+ COP["Copilot CLI<br/>(instructions + 69 sub-command skills)"]
208
+ COD["Codex CLI<br/>(1 router skill + 69 refs)"]
209
209
  REPO["Pipeline Repo<br/>(npm package)"]
210
210
  WEB["Website"]
211
211
  PLUGREPO["multi-agent-plugins<br/>(6 plugins, own repo)"]
package/docs/ecosystem.md CHANGED
@@ -5,7 +5,7 @@ separately, wired together at install time and at run time:
5
5
 
6
6
  | Repo | What it owns | Ships as |
7
7
  |---|---|---|
8
- | **`multi-agent-pipeline`** (this repo) | Orchestration: the 6-phase flow, the 66 slash commands, quality gates, review/triage, cross-CLI parity | npm package (`@mmerterden/multi-agent-pipeline`), installs itself onto Claude Code / Copilot CLI / Codex CLI |
8
+ | **`multi-agent-pipeline`** (this repo) | Orchestration: the 6-phase flow, the 69 slash commands, quality gates, review/triage, cross-CLI parity | npm package (`@mmerterden/multi-agent-pipeline`), installs itself onto Claude Code / Copilot CLI / Codex CLI |
9
9
  | **`multi-agent-plugins`** | Stack knowledge: per-platform component/lifecycle skills (iOS, Android, Frontend, Backend) + shared knowledge | Claude Code marketplace, 6 independently-versioned plugins |
10
10
  | **`multi-agent-toolkit-mcp`** | The pipeline's hands on devices and browsers: 197 MCP tools across 21 categories (simulator/emulator control, end-to-end locators and assertions, memory, crash diagnostics, accessibility audit, store compliance, web automation and scraping, Figma-vs-mock design audit, code intelligence, wallet passes, an agent-DSL batch runner, a full-text context index with text-to-image rendering, provider-backed research, verified hand-off of simple text tasks to free models, video key frames, offline security scoring, read-only access to related repositories at their latest branch, travel document fixtures, a voice channel, App Store Connect and Play Console APIs, virtual iPhones) | npm package, registered as a standard stdio MCP server on every host |
11
11
 
@@ -18,7 +18,7 @@ Either can be swapped or removed without touching the other two's source.
18
18
  graph LR
19
19
  subgraph PIPE ["multi-agent-pipeline (orchestrator)"]
20
20
  direction TB
21
- PHASES["6 phases · 66 commands"]
21
+ PHASES["6 phases · 69 commands"]
22
22
  GATES["deterministic gates + review triage"]
23
23
  end
24
24
 
@@ -68,8 +68,8 @@ only those:
68
68
  graph TD
69
69
  CC["Claude Code<br/>~/.claude/commands/multi-agent/<br/>(source of truth)"]
70
70
 
71
- CC -->|"Step 2: copy + reformat<br/>66 sub-command skills"| COP["Copilot CLI<br/>~/.copilot/skills/"]
72
- CC -->|"Step 2b: transform<br/>(install.js --codex)"| COD["Codex CLI<br/>1 router skill + 66 refs<br/>+ 11 agent TOML"]
71
+ CC -->|"Step 2: copy + reformat<br/>69 sub-command skills"| COP["Copilot CLI<br/>~/.copilot/skills/"]
72
+ CC -->|"Step 2b: transform<br/>(install.js --codex)"| COD["Codex CLI<br/>1 router skill + 69 refs<br/>+ 11 agent TOML"]
73
73
  CC -->|"Step 3: genericize<br/>(strip personal data)"| REPO["multi-agent-pipeline repo<br/>pipeline/"]
74
74
  CC -->|"Step 4: version + feature sync"| WEB["Website<br/>projects.ts / i18n.tsx"]
75
75
 
@@ -161,7 +161,7 @@ measurements behind this table):
161
161
 
162
162
  | | Claude Code | Copilot CLI | Codex CLI |
163
163
  |---|---|---|---|
164
- | **Pipeline commands** | 66 slash-command skills, native | 66 sub-command skills, `multi-agent-{cmd}` naming, copied in | 1 router skill (`multi-agent`) + 66 command specs as reference files - Codex silently truncates its skills block past a few dozen entries, so sub-commands are not peer skills here |
164
+ | **Pipeline commands** | 69 slash-command skills, native | 69 sub-command skills, `multi-agent-{cmd}` naming, copied in | 1 router skill (`multi-agent`) + 69 command specs as reference files - Codex silently truncates its skills block past a few dozen entries, so sub-commands are not peer skills here |
165
165
  | **Stack plugins** | Marketplace plugin, loaded natively, resolved by `.claude/settings.json` enabled-list | Enabled plugin's authored skills copied flat into `~/.copilot/skills/`; `knowledge/` **not** re-copied (already delivered via `shared/external`) | Copied as reference files under `~/.codex/multi-agent-refs/skills/`, plugin-prefixed on name clash (e.g. `architecture` → `ai-ios-toolkit-architecture`) |
166
166
  | **Component dispatch (Phase 3)** | Marketplace plugin's `create-component`/`create-screen` skill via the Skill tool | No plugin loader - the enabled stack plugin's authored skills (incl. `create-component`) are copied flat into `~/.copilot/skills/` at install time (the old frozen `figma-*` copies are pruned, they were never a fallback) | Not part of the enforced parity axis; classification + state-shape must match, skill *inventory* does not |
167
167
  | **multi-agent-toolkit-mcp** | `claude mcp add multi-agent-toolkit -- npx -y @mmerterden/multi-agent-toolkit-mcp` | `copilot mcp add multi-agent-toolkit -- npx -y @mmerterden/multi-agent-toolkit-mcp` | `codex mcp add multi-agent-toolkit -- npx -y @mmerterden/multi-agent-toolkit-mcp` (skipped with a warning if `codex` isn't on `PATH`) |
package/docs/facts.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$comment": "Generated by pipeline/scripts/gen-facts.mjs. Do not hand-edit: the site reads this, and a number edited here instead of at its source is the drift this file removes.",
3
- "generatedAt": "2026-10-24",
4
- "version": "20.29.0",
3
+ "generatedAt": "2026-10-25",
4
+ "version": "20.33.0",
5
5
  "phaseSchema": 2,
6
6
  "phases": [
7
7
  {
@@ -33,24 +33,25 @@
33
33
  "modes": {
34
34
  "full": [0, 1, 2, 3, 4, 5],
35
35
  "autopilot": [0, 1, 2, 3, 4, 5],
36
- "analysis": [0, 1, 3, 4, 5]
36
+ "analysis": [0, 1, 2, 3, 4, 5]
37
37
  },
38
- "commandCount": 66,
38
+ "commandCount": 69,
39
39
  "skillCount": 165,
40
- "skillCountAll": 234,
40
+ "skillCountAll": 237,
41
41
  "agentCount": 11,
42
42
  "hosts": ["Claude Code", "Codex CLI", "Copilot CLI"],
43
- "toolCount": 204,
43
+ "toolCount": 208,
44
44
  "toolCategories": {
45
45
  "ios": 42,
46
46
  "web": 38,
47
- "android": 33,
47
+ "android": 34,
48
48
  "store": 30,
49
49
  "vphone": 10,
50
50
  "code": 8,
51
51
  "design": 7,
52
52
  "repo": 6,
53
53
  "voice": 6,
54
+ "ui": 5,
54
55
  "context": 4,
55
56
  "pass": 4,
56
57
  "document": 3,
@@ -58,11 +59,10 @@
58
59
  "llm": 2,
59
60
  "research": 2,
60
61
  "security": 2,
61
- "ui": 2,
62
62
  "coverage": 1,
63
63
  "media": 1,
64
64
  "test": 1
65
65
  },
66
66
  "pluginSkillCount": 261,
67
- "toolkitVersion": "3.25.0"
67
+ "toolkitVersion": "3.26.0"
68
68
  }
@@ -316,6 +316,67 @@ export function buildUnattendedProfile(current = {}, opts = {}) {
316
316
  return next;
317
317
  }
318
318
 
319
+ /**
320
+ * Bring an existing profile up to the shipped deny rules without touching
321
+ * anything else: only permissions.deny and the sandbox's denyRead and
322
+ * denyWrite grow, so a release that adds a deny reaches every installed
323
+ * profile on the next install, and nothing it allows changes. No profile file,
324
+ * or one that does not parse, is left alone.
325
+ *
326
+ * @param {{home:string, dryRun?:boolean}} opts
327
+ * @returns {{path:string, added:string[], written:boolean}}
328
+ */
329
+ export function tightenUnattendedProfile({ home, dryRun = false }) {
330
+ const path = unattendedSettingsPath(home);
331
+ if (!existsSync(path)) return { path, added: [], written: false };
332
+ let current;
333
+ try {
334
+ current = JSON.parse(readFileSync(path, "utf-8"));
335
+ } catch {
336
+ return { path, added: [], written: false };
337
+ }
338
+ if (!current || typeof current !== "object" || Array.isArray(current))
339
+ return { path, added: [], written: false };
340
+ const added = [];
341
+ const perms = { ...(current.permissions || {}) };
342
+ const deny = Array.isArray(perms.deny) ? [...perms.deny] : [];
343
+ for (const [rule] of PROFILE.deny) {
344
+ if (hasRule(deny, rule)) continue;
345
+ deny.push(rule);
346
+ added.push(`deny:${rule}`);
347
+ }
348
+ const next = { ...current, permissions: { ...perms, deny } };
349
+ // Directories the toolkit's index refuses: a list, so it only grows too.
350
+ for (const [key, value] of PROFILE.env) {
351
+ if (key !== "MCP_TOOLKIT_INDEX_DENY") continue;
352
+ const env = current.env && typeof current.env === "object" ? current.env : {};
353
+ const have = String(env[key] ?? "")
354
+ .split(",")
355
+ .map((x) => x.trim())
356
+ .filter(Boolean);
357
+ const missing = value.split(",").filter((x) => !have.includes(x));
358
+ if (!missing.length) continue;
359
+ next.env = { ...env, [key]: [...have, ...missing].join(",") };
360
+ added.push(...missing.map((x) => `env.${key}:${x}`));
361
+ }
362
+ const sb = current.sandbox;
363
+ if (sb && typeof sb === "object" && !Array.isArray(sb)) {
364
+ const fs = sb.filesystem && typeof sb.filesystem === "object" ? sb.filesystem : {};
365
+ const nextFs = { ...fs };
366
+ for (const key of ["denyRead", "denyWrite"]) {
367
+ const have = Array.isArray(fs[key]) ? fs[key].map(String) : [];
368
+ const missing = PROFILE.sandbox.filesystem[key].filter((p) => !have.includes(p));
369
+ if (!missing.length) continue;
370
+ nextFs[key] = [...have, ...missing];
371
+ added.push(...missing.map((p) => `sandbox.${key}:${p}`));
372
+ }
373
+ next.sandbox = { ...sb, filesystem: nextFs };
374
+ }
375
+ if (!added.length || dryRun) return { path, added, written: false };
376
+ writeFileSync(path, `${JSON.stringify(next, null, 2)}\n`, { mode: 0o600 });
377
+ return { path, added, written: true };
378
+ }
379
+
319
380
  /**
320
381
  * Write the profile into its own settings file. Idempotent: running it twice
321
382
  * changes nothing the second time.