@mmerterden/multi-agent-pipeline 20.30.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 (120) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +45 -0
  3. package/README.tr.md +59 -0
  4. package/docs/facts.json +3 -3
  5. package/install/_unattended-profile.mjs +61 -0
  6. package/install/catalog-history.json +1 -1
  7. package/install/claude.mjs +9 -2
  8. package/install/index.mjs +10 -1
  9. package/install/templates/claude-hooks.json +12 -1
  10. package/manifest.json +123 -82
  11. package/package.json +2 -1
  12. package/pipeline/commands/multi-agent/analysis/SKILL.md +4 -4
  13. package/pipeline/commands/multi-agent/office-on/SKILL.md +8 -7
  14. package/pipeline/commands/multi-agent/office-status/SKILL.md +1 -1
  15. package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -1
  16. package/pipeline/commands/multi-agent/review/SKILL.md +4 -3
  17. package/pipeline/commands/multi-agent/scenario-audit/SKILL.md +4 -2
  18. package/pipeline/commands/multi-agent/sync/SKILL.md +12 -0
  19. package/pipeline/commands/multi-agent/test-gen/SKILL.md +29 -3
  20. package/pipeline/contract/CHANGELOG.md +46 -0
  21. package/pipeline/contract/README.md +22 -8
  22. package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
  23. package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
  24. package/pipeline/contract/fixtures/error-unsigned.json +1 -1
  25. package/pipeline/contract/fixtures/launch-plan.json +1 -1
  26. package/pipeline/contract/fixtures/runs-awaiting-question.json +6 -1
  27. package/pipeline/contract/fixtures/runs-empty.json +1 -1
  28. package/pipeline/contract/fixtures/runs-failed.json +6 -1
  29. package/pipeline/contract/fixtures/runs-old-schema.json +6 -1
  30. package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +5 -1
  31. package/pipeline/contract/fixtures/runs-pr-opened.json +6 -1
  32. package/pipeline/contract/fixtures/runs-running.json +6 -1
  33. package/pipeline/contract/manifest.json +153 -19
  34. package/pipeline/contract/types/index.d.ts +304 -6
  35. package/pipeline/lib/bg-launch.mjs +106 -0
  36. package/pipeline/lib/code-digest.mjs +49 -0
  37. package/pipeline/lib/credential-resolve.mjs +42 -2
  38. package/pipeline/multi-agent-refs/features/office-threat-model.md +24 -6
  39. package/pipeline/multi-agent-refs/features/unattended-security.md +1 -1
  40. package/pipeline/multi-agent-refs/help/en.md +2 -2
  41. package/pipeline/multi-agent-refs/help/tr.md +2 -2
  42. package/pipeline/multi-agent-refs/phases/modes.md +7 -7
  43. package/pipeline/multi-agent-refs/phases/phase-5-report.md +16 -10
  44. package/pipeline/multi-agent-refs/review-standalone-tracker.md +37 -0
  45. package/pipeline/multi-agent-refs/tracker-contract.md +8 -3
  46. package/pipeline/office/NOTICE.md +4 -1
  47. package/pipeline/office/assets/ARCHIVE_BOXES.png +0 -0
  48. package/pipeline/office/assets/COFFEE_MACHINE.png +0 -0
  49. package/pipeline/office/assets/COUNTER_SINK.png +0 -0
  50. package/pipeline/office/assets/DEVICE_STAND.png +0 -0
  51. package/pipeline/office/assets/FILING_CABINET.png +0 -0
  52. package/pipeline/office/assets/FRIDGE.png +0 -0
  53. package/pipeline/office/assets/MAILBOX.png +0 -0
  54. package/pipeline/office/assets/MOP_BUCKET.png +0 -0
  55. package/pipeline/office/assets/PRINTER.png +0 -0
  56. package/pipeline/office/assets/RECEPTION_DESK.png +0 -0
  57. package/pipeline/office/assets/SERVER_RACK.png +0 -0
  58. package/pipeline/office/assets/SERVER_RACK_2.png +0 -0
  59. package/pipeline/office/assets/TOILET_STALL.png +0 -0
  60. package/pipeline/office/assets/VENDING.png +0 -0
  61. package/pipeline/office/assets/WASHBASIN.png +0 -0
  62. package/pipeline/office/assets/WATER_COOLER.png +0 -0
  63. package/pipeline/office/index.html +3996 -884
  64. package/pipeline/office/toolkit.json +3 -0
  65. package/pipeline/schemas/activity.schema.json +188 -4
  66. package/pipeline/schemas/agent-state.schema.json +493 -115
  67. package/pipeline/schemas/contract-error.schema.json +12 -1
  68. package/pipeline/schemas/job-change.schema.json +72 -0
  69. package/pipeline/schemas/job-request.schema.json +38 -0
  70. package/pipeline/schemas/launch.json +4 -4
  71. package/pipeline/schemas/office-credentials.schema.json +71 -0
  72. package/pipeline/schemas/office-jobs.json +253 -0
  73. package/pipeline/schemas/office-jobs.schema.json +62 -0
  74. package/pipeline/schemas/office-memory.schema.json +105 -0
  75. package/pipeline/schemas/office-settings-request.schema.json +30 -0
  76. package/pipeline/schemas/office-settings.schema.json +67 -0
  77. package/pipeline/schemas/phases.json +10 -2
  78. package/pipeline/schemas/phases.schema.json +86 -19
  79. package/pipeline/schemas/prs.schema.json +5 -0
  80. package/pipeline/schemas/prune-logs-request.schema.json +26 -0
  81. package/pipeline/schemas/prune-logs.schema.json +52 -0
  82. package/pipeline/schemas/repo-change.schema.json +54 -0
  83. package/pipeline/schemas/repo-request.schema.json +29 -0
  84. package/pipeline/schemas/repos.schema.json +49 -1
  85. package/pipeline/schemas/runs-index.schema.json +257 -46
  86. package/pipeline/schemas/system-status.schema.json +111 -0
  87. package/pipeline/schemas/tools.schema.json +5 -0
  88. package/pipeline/schemas/unattended-profile.json +7 -2
  89. package/pipeline/scripts/_active-run.mjs +2 -1
  90. package/pipeline/scripts/_spawn-async.mjs +9 -5
  91. package/pipeline/scripts/activity-snapshot.mjs +219 -23
  92. package/pipeline/scripts/autopilot-runner.mjs +7 -5
  93. package/pipeline/scripts/contract-server.mjs +551 -25
  94. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -1
  95. package/pipeline/scripts/job-launch.mjs +477 -0
  96. package/pipeline/scripts/launch-request.mjs +94 -9
  97. package/pipeline/scripts/office-build.mjs +148 -11
  98. package/pipeline/scripts/office-control.mjs +34 -7
  99. package/pipeline/scripts/office-credentials.mjs +106 -0
  100. package/pipeline/scripts/office-memory.mjs +200 -0
  101. package/pipeline/scripts/office-prune.mjs +125 -0
  102. package/pipeline/scripts/office-settings.mjs +145 -0
  103. package/pipeline/scripts/phase-tracker.sh +12 -5
  104. package/pipeline/scripts/prune-logs.sh +53 -2
  105. package/pipeline/scripts/runs-index.mjs +62 -2
  106. package/pipeline/scripts/system-status.mjs +196 -0
  107. package/pipeline/scripts/task-mirror.mjs +150 -0
  108. package/pipeline/scripts/task-mirror.sh +20 -0
  109. package/pipeline/scripts/toolkit-tools.mjs +33 -7
  110. package/pipeline/scripts/transcript-index.mjs +4 -1
  111. package/pipeline/scripts/work-items.mjs +191 -22
  112. package/pipeline/skills/.skill-manifest.json +6 -6
  113. package/pipeline/skills/.skills-index.json +1 -1
  114. package/pipeline/skills/shared/README.md +1 -1
  115. package/pipeline/skills/shared/core/multi-agent-office-on/SKILL.md +3 -4
  116. package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +4 -1
  117. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +19 -0
  118. package/pipeline/skills/shared/core/multi-agent-scenario-audit/SKILL.md +4 -2
  119. package/pipeline/skills/shared/core/multi-agent-test-gen/SKILL.md +26 -3
  120. package/pipeline/skills/skills-index.md +1 -1
package/CHANGELOG.md CHANGED
@@ -16,6 +16,86 @@ 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
+
19
99
  ## [20.30.0] - 2026-10-25
20
100
 
21
101
  ### Added
package/README.md CHANGED
@@ -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.
@@ -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
@@ -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.
@@ -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:
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.30.0",
3
+ "generatedAt": "2026-10-25",
4
+ "version": "20.33.0",
5
5
  "phaseSchema": 2,
6
6
  "phases": [
7
7
  {
@@ -33,7 +33,7 @@
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
38
  "commandCount": 69,
39
39
  "skillCount": 165,
@@ -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.