@mmerterden/multi-agent-pipeline 16.18.0 → 16.19.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 (200) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +5 -5
  3. package/README.tr.md +2 -2
  4. package/docs/FIGMA_PIPELINE.md +1 -1
  5. package/docs/adr/0001-three-model-triage.md +4 -2
  6. package/docs/architecture.md +2 -2
  7. package/docs/ecosystem.md +13 -11
  8. package/docs/features.md +2 -2
  9. package/index.js +1 -1
  10. package/install/_common.mjs +25 -1
  11. package/install/_dev-only-files.mjs +2 -2
  12. package/install/_mcp-register.mjs +4 -3
  13. package/install/_plugin-skills.mjs +1 -3
  14. package/install/copilot.mjs +18 -9
  15. package/install/index.mjs +2 -4
  16. package/install/templates/copilot-instructions.md +7 -7
  17. package/package.json +1 -1
  18. package/pipeline/claude-md-template.md +2 -2
  19. package/pipeline/commands/multi-agent/SKILL.md +5 -5
  20. package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +1 -1
  21. package/pipeline/commands/multi-agent/design-check/SKILL.md +1 -1
  22. package/pipeline/commands/multi-agent/help/SKILL.md +2 -2
  23. package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +1 -1
  24. package/pipeline/commands/multi-agent/review/SKILL.md +27 -14
  25. package/pipeline/commands/multi-agent/review-analysis/SKILL.md +1 -1
  26. package/pipeline/commands/multi-agent/store-ready/SKILL.md +2 -2
  27. package/pipeline/commands/multi-agent/sync/SKILL.md +2 -2
  28. package/pipeline/commands/sim-test.md +54 -15
  29. package/pipeline/lib/credential-inventory.sh +15 -2
  30. package/pipeline/lib/credential-store-resolver.sh +14 -4
  31. package/pipeline/lib/credential-store.sh +8 -2
  32. package/pipeline/lib/extract-conventions.sh +1 -14
  33. package/pipeline/lib/fetch-confluence.sh +12 -4
  34. package/pipeline/lib/fetch-crashlytics.sh +11 -8
  35. package/pipeline/lib/fetch-document.sh +1 -1
  36. package/pipeline/lib/fetch-figma-annotations.sh +7 -5
  37. package/pipeline/lib/fetch-fortify.sh +5 -3
  38. package/pipeline/lib/fetch-graylog.sh +5 -3
  39. package/pipeline/lib/figma-mcp-refresh.sh +1 -1
  40. package/pipeline/lib/figma-screenshot.sh +27 -24
  41. package/pipeline/lib/figma-token.sh +8 -4
  42. package/pipeline/lib/issue-fetcher.sh +0 -1
  43. package/pipeline/lib/jira-publish.sh +7 -5
  44. package/pipeline/lib/md2confluence-v3.py +13 -7
  45. package/pipeline/lib/multi-repo-pipeline.sh +18 -8
  46. package/pipeline/lib/plan-todos.sh +11 -0
  47. package/pipeline/lib/post-pr-review.sh +9 -2
  48. package/pipeline/lib/repo-cache.sh +18 -10
  49. package/pipeline/lib/review-watch.sh +60 -14
  50. package/pipeline/lib/shadow-git.sh +8 -4
  51. package/pipeline/lib/vercel-deploy.sh +2 -2
  52. package/pipeline/multi-agent-refs/_dev-context.md +5 -2
  53. package/pipeline/multi-agent-refs/analysis/locked.md +4 -4
  54. package/pipeline/multi-agent-refs/analysis/render.md +1 -1
  55. package/pipeline/multi-agent-refs/cross-cli-contract.md +1 -1
  56. package/pipeline/multi-agent-refs/outside-the-pipeline.md +6 -6
  57. package/pipeline/multi-agent-refs/phases/log-format.md +1 -1
  58. package/pipeline/multi-agent-refs/phases/modes.md +1 -1
  59. package/pipeline/multi-agent-refs/phases/phase-0-init.md +4 -2
  60. package/pipeline/multi-agent-refs/phases/phase-1-analysis.md +3 -3
  61. package/pipeline/multi-agent-refs/phases/phase-2-planning.md +5 -5
  62. package/pipeline/multi-agent-refs/phases/phase-4-review.md +21 -16
  63. package/pipeline/multi-agent-refs/tracker-contract.md +1 -1
  64. package/pipeline/rules/figma-pipeline.md +18 -72
  65. package/pipeline/rules/outside-the-pipeline.md +4 -3
  66. package/pipeline/schemas/agent-state.schema.json +1 -1
  67. package/pipeline/schemas/token-budget.json +1 -1
  68. package/pipeline/scripts/_stack-routing.mjs +1 -1
  69. package/pipeline/scripts/agent-guard.py +102 -21
  70. package/pipeline/scripts/anonymize-findings.mjs +7 -6
  71. package/pipeline/scripts/build-skills-index.mjs +14 -3
  72. package/pipeline/scripts/cost-budget-check.mjs +5 -3
  73. package/pipeline/scripts/cost-lib.sh +0 -15
  74. package/pipeline/scripts/diff-explain.mjs +22 -12
  75. package/pipeline/scripts/gc-refs.sh +6 -2
  76. package/pipeline/scripts/gc-tmp.sh +1 -1
  77. package/pipeline/scripts/gc-worktrees.sh +1 -1
  78. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  79. package/pipeline/scripts/github-ssh-setup.sh +7 -2
  80. package/pipeline/scripts/graph-build.mjs +2 -2
  81. package/pipeline/scripts/jira-wiki-escape.mjs +2 -1
  82. package/pipeline/scripts/keychain.py +12 -11
  83. package/pipeline/scripts/learning-curve.mjs +1 -1
  84. package/pipeline/scripts/migrate-prefs.mjs +1 -1
  85. package/pipeline/scripts/output-quality-check.sh +3 -1
  86. package/pipeline/scripts/phase-tracker.sh +1 -1
  87. package/pipeline/scripts/phase0-exit-gate.mjs +2 -1
  88. package/pipeline/scripts/plan-coverage-gate.mjs +2 -1
  89. package/pipeline/scripts/pre-commit-check.sh +23 -13
  90. package/pipeline/scripts/prune-logs.sh +1 -1
  91. package/pipeline/scripts/render-agent-log-cost.sh +3 -1
  92. package/pipeline/scripts/render-cost-summary.sh +4 -2
  93. package/pipeline/scripts/render-work-summary.sh +5 -3
  94. package/pipeline/scripts/repo-map.mjs +3 -2
  95. package/pipeline/scripts/scan-skills.sh +6 -2
  96. package/pipeline/scripts/search-logs.sh +8 -6
  97. package/pipeline/scripts/sign-skills.sh +3 -1
  98. package/pipeline/scripts/smoke-cross-cli-behavior.sh +1 -1
  99. package/pipeline/scripts/triage-memory.mjs +25 -4
  100. package/pipeline/scripts/uninstall.mjs +20 -12
  101. package/pipeline/scripts/update-check.sh +2 -2
  102. package/pipeline/scripts/update-issue-progress.sh +6 -5
  103. package/pipeline/scripts/validate-analysis-doc.mjs +6 -6
  104. package/pipeline/scripts/verify-skills.sh +3 -1
  105. package/pipeline/scripts/worktree-finalize.sh +22 -10
  106. package/pipeline/skills/.skill-manifest.json +81 -57
  107. package/pipeline/skills/.skills-index.json +19 -19
  108. package/pipeline/skills/shared/README.md +8 -8
  109. package/pipeline/skills/shared/core/multi-agent/SKILL.md +7 -7
  110. package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +1 -1
  111. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -2
  112. package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +1 -1
  113. package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +2 -2
  114. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +23 -14
  115. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +2 -2
  116. package/pipeline/skills/shared/external/NOTICE-dimillian-skills.md +56 -0
  117. package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +0 -4
  118. package/pipeline/skills/shared/external/api-patterns/SKILL.md +12 -24
  119. package/pipeline/skills/shared/external/app-store-changelog/references/release-notes-guidelines.md +34 -0
  120. package/pipeline/skills/shared/external/app-store-changelog/scripts/collect_release_changes.sh +33 -0
  121. package/pipeline/skills/shared/external/architecture/SKILL.md +7 -9
  122. package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +0 -4
  123. package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +0 -1
  124. package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +0 -14
  125. package/pipeline/skills/shared/external/hig-components-content/SKILL.md +13 -13
  126. package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +16 -16
  127. package/pipeline/skills/shared/external/hig-components-status/SKILL.md +6 -6
  128. package/pipeline/skills/shared/external/hig-components-system/SKILL.md +13 -13
  129. package/pipeline/skills/shared/external/hig-foundations/SKILL.md +23 -23
  130. package/pipeline/skills/shared/external/hig-inputs/SKILL.md +18 -18
  131. package/pipeline/skills/shared/external/hig-patterns/SKILL.md +30 -30
  132. package/pipeline/skills/shared/external/hig-platforms/SKILL.md +11 -11
  133. package/pipeline/skills/shared/external/hig-technologies/SKILL.md +33 -33
  134. package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +52 -52
  135. package/pipeline/skills/shared/external/ios-coding-standard/references/lint-local.sh +1 -1
  136. package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +11 -11
  137. package/pipeline/skills/shared/external/ios-developer/SKILL.md +0 -1
  138. package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +7 -3
  139. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +9 -15
  140. package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +0 -5
  141. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/bootstrap/Package.swift +17 -0
  142. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/bootstrap/Sources/MyApp/Resources/.keep +0 -0
  143. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/bootstrap/Sources/MyApp/main.swift +11 -0
  144. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/bootstrap/version.env +2 -0
  145. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/build_icon.sh +49 -0
  146. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/compile_and_run.sh +63 -0
  147. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/launch.sh +28 -0
  148. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/make_appcast.sh +82 -0
  149. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/package_app.sh +206 -0
  150. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/setup_dev_signing.sh +52 -0
  151. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/sign-and-notarize.sh +52 -0
  152. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/version.env +2 -0
  153. package/pipeline/skills/shared/external/macos-spm-app-packaging/references/packaging.md +17 -0
  154. package/pipeline/skills/shared/external/macos-spm-app-packaging/references/release.md +32 -0
  155. package/pipeline/skills/shared/external/macos-spm-app-packaging/references/scaffold.md +79 -0
  156. package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +0 -1
  157. package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +0 -4
  158. package/pipeline/skills/shared/external/swift-concurrency-expert/references/approachable-concurrency.md +63 -0
  159. package/pipeline/skills/shared/external/swift-concurrency-expert/references/swift-6-2-concurrency.md +272 -0
  160. package/pipeline/skills/shared/external/swift-concurrency-expert/references/swiftui-concurrency-tour-wwdc.md +33 -0
  161. package/pipeline/skills/shared/external/swiftui-performance-audit/references/code-smells.md +150 -0
  162. package/pipeline/skills/shared/external/swiftui-performance-audit/references/demystify-swiftui-performance-wwdc23.md +46 -0
  163. package/pipeline/skills/shared/external/swiftui-performance-audit/references/optimizing-swiftui-performance-instruments.md +29 -0
  164. package/pipeline/skills/shared/external/swiftui-performance-audit/references/profiling-intake.md +44 -0
  165. package/pipeline/skills/shared/external/swiftui-performance-audit/references/report-template.md +47 -0
  166. package/pipeline/skills/shared/external/swiftui-performance-audit/references/understanding-hangs-in-your-app.md +33 -0
  167. package/pipeline/skills/shared/external/swiftui-performance-audit/references/understanding-improving-swiftui-performance.md +52 -0
  168. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/app-wiring.md +201 -0
  169. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/async-state.md +96 -0
  170. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/components-index.md +46 -0
  171. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/controls.md +57 -0
  172. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/deeplinks.md +66 -0
  173. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/focus.md +90 -0
  174. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/form.md +97 -0
  175. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/grids.md +71 -0
  176. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/haptics.md +71 -0
  177. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/input-toolbar.md +51 -0
  178. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/lightweight-clients.md +93 -0
  179. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/list.md +86 -0
  180. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/loading-placeholders.md +38 -0
  181. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/macos-settings.md +71 -0
  182. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/matched-transitions.md +59 -0
  183. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/media.md +73 -0
  184. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/menu-bar.md +101 -0
  185. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/navigationstack.md +159 -0
  186. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/overlay.md +45 -0
  187. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/performance.md +62 -0
  188. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/previews.md +48 -0
  189. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/scroll-reveal.md +133 -0
  190. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/scrollview.md +87 -0
  191. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/searchable.md +71 -0
  192. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/sheets.md +155 -0
  193. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/split-views.md +72 -0
  194. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/tabview.md +114 -0
  195. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/theming.md +71 -0
  196. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/title-menus.md +93 -0
  197. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/top-bar.md +49 -0
  198. package/pipeline/skills/shared/external/swiftui-view-refactor/references/mv-patterns.md +161 -0
  199. package/pipeline/skills/skills-index.md +8 -8
  200. package/pipeline/skills/shared/external/help-skills/SKILL.md +0 -166
package/CHANGELOG.md CHANGED
@@ -16,6 +16,51 @@ Internal file-layout changes that don't affect the slash-command surface are sti
16
16
 
17
17
  ## [Unreleased]
18
18
 
19
+ ## [16.19.0] - 2026-09-02
20
+
21
+ A review of the three repositories together (pipeline, toolkit MCP, plugin marketplace) with every test suite green found the defects the suites could not see. This release fixes what was found in the pipeline; `@mmerterden/multi-agent-toolkit-mcp` 3.8.0 and the marketplace plugins carry their own halves.
22
+
23
+ ### Added
24
+
25
+ - **The accessibility scenario audits, it does not only look.** `/multi-agent:test "accessibility"` promised "visual + MCP audit tool" and then inspected screenshots. It now calls `ios_accessibility_audit` / `android_accessibility_audit` on every screen, treats `measurable:false` as not audited rather than clean, and runs `ios_accessibility_audit_deep` when an XCUITest target exists. The full scenario ends with a crash sweep through `ios_list_crashes` / `android_list_crashes`. Nineteen of the toolkit's 87 tools had no pipeline caller; the ones the flows claim now have one.
26
+ - **The UI bug hunter reads before it looks.** `/multi-agent:test` took a full-resolution screenshot after every tap and sent it through the model: 2.9 MB of PNG per step, which is what made the loop feel slow. The flow now reads `ios_get_ui_tree` first (text, ~0.1 s) and picks tap targets from element frames, batches tap / wait / capture / tree sequences into one `agent_run_steps` round trip, writes bulk captures to files and looks only at the screens whose tree changed. Inline screenshots are compact by default in toolkit 3.9.0.
27
+ - **`lint-mcp-refs --strict-tools` probes the sibling checkout.** The tool-existence check only ran when a local path was registered; an `npx` registration meant it was skipped on every machine, including the maintainer's. It now also tries `$MULTI_AGENT_TOOLKIT_REPO` and `~/multi-agent-toolkit-mcp`, so the 73 referenced tools are verified against the live server.
28
+ - **`triage-memory --state` and `diff-explain --task-id` do what their usage said.** Both flags were documented and dead.
29
+
30
+ ### Changed
31
+
32
+ - **Three reviewers on Claude Code, everywhere it is written down.** 16.12.0 added Opus as the third reviewer and left eight documents saying two: the orchestrator's own description, the standalone `review` command (which dispatched two agents under a "3 in parallel" heading), the triage prompt ("two reviewers returned findings"), the consensus rationale, `modes.md`, the architecture diagram, the README's "two-vendor host" claim and ADR-0001. Every host runs three; the Codex set is now in the standalone command too.
33
+ - **Phase 1 is Sonnet, Phase 2 is Fable, and the template, refs, help and telemetry tags all say so.** Four documents had three answers, and the cost ledger was attributing Phase 1 and 2 spend to opus.
34
+ - **Platform parity has one source order.** The schema and `_dev-context.md` said the check reads `state.siblings[]` "and nothing else"; the contract lists it fourth of four. A model following the schema skipped the step on every standalone review.
35
+ - **`rules/figma-pipeline.md` no longer ships a 31-command catalog of which 30 do not exist.** New installs received the retired list; the current skill surfaces replace it. Its CI claim for `smoke-no-mcp-in-dev-phases` now says where the gate actually runs.
36
+ - **Counts the tree can check.** 55 commands (not 51), 36 Locked decisions (not 35), "80+" toolkit tools where "83" was asserted, and the ecosystem table lists the eight tool categories that sum to 87. `package-lock.json` had stayed at 16.15.0 for three releases.
37
+ - **Phase-doc token budget 57850 -> 58250.** The three-reviewer roster, the worktree convention and the model corrections are real content; the total was sitting 18 tokens under its ceiling.
38
+ - **`install --target=` is refused instead of ignored.** No installer read it; it installed into `$HOME` and said nothing.
39
+
40
+ ### Fixed
41
+
42
+ - **The secret gate could not block a commit.** `pre-commit-check.sh` exited 1 and printed to stdout; the PreToolUse contract blocks on exit 2. A staged token went through. It also resolved staged paths against the working directory, so from a subdirectory every file was skipped. Exit 2, stderr, repo-root paths.
43
+ - **The attribution guard never saw the pipeline's own commits.** `git -C <worktree> commit` did not match `git\s+commit`. The guard now tokenises git's global options, and force-push is also caught for `+refspec` and `refs/heads/<protected>` forms.
44
+ - **Three smokes were decorative.** `smoke-language-axis`, `smoke-no-token-prompt` and `smoke-worktree-path-convention` did `cd pipeline` and then grepped `pipeline/...`, a path that does not exist, and printed ok. Pointed at the tree they found three real violations, now fixed, and one undocumented convention (worktrees live at `{projectRoot}/.worktrees/{taskId}`, now in Phase 0 Step 6).
45
+ - **Garbage collection could delete a running task's scratch.** The fresh-item guard was `find | head -1 | grep -q` under pipefail; with many fresh files `find` died of SIGPIPE and the guard failed open. `-print -quit` instead, in `gc-tmp`, `gc-worktrees` and `prune-logs`.
46
+ - **`uninstall` with no flags deleted the project's own `AGENTS.md` prose** from the pipeline heading to the next H1, through a fallback written for marker-less host files. Legacy adapter cleanup is opt-in and the fallback applies only to host files.
47
+ - **Every install removed `$HOME/.multi-agent` unconditionally,** a path also used for live per-repo state. Only known legacy entries are removed.
48
+ - **`install --copilot --link` wrote generated files into the source checkout** through the skills symlink. The skills root is a real directory; only authored trees are linked.
49
+ - **Four scripts did nothing from a path with a space.** The main-guard compared `import.meta.url` with an unencoded `file://` string; two of them are dispatch gates. `pathToFileURL` now.
50
+ - **Option parsers that hung or lied.** `fetch-figma-annotations.sh` spun at 100% CPU when an option was the last argument; twenty parsers in `lib/` and `scripts/` now fail with their documented exit code and a message instead of `shift` failing silently.
51
+ - **`vercel-deploy.sh deploy --prod` failed under the only bash macOS ships** (3.2.57: empty array under `set -u`).
52
+ - **`worktree-finalize.sh` reported every worktree but the last as unregistered** (a `while read` loop writing into a closed pipe), salvaged the tracker from a directory nothing writes to, and nested `.pipeline/.pipeline/` on a re-run.
53
+ - **`keychain.py set` put the secret on `security`'s argv,** visible in `ps`, and `credential-store.sh` routed every macOS write through it. Both use `security -i` over stdin; keychain.py's exit codes 2 and 4 are propagated.
54
+ - **`review-watch.sh` marked pull requests reviewed without reviewing them.** It now runs `post-pr-review.sh` for a head with findings and stamps only on success. `post-pr-review.sh`'s Bitbucket verdict PUT checks the status code; a 401 was "approve posted".
55
+ - **`figma-screenshot.sh --discover-sections` answered "this file holds no design" on an expired token** (curl without `--fail`). It exits 2 with the auth message; its temp files have traps and its output dir comes from `mktemp`.
56
+ - **`fetch-crashlytics.sh` and `figma-mcp-refresh.sh` exited with raw child codes** under `set -e`, so a VPN drop was diagnosed as a missing credential. Mapped to the documented 3 and 2.
57
+ - **Sourced from zsh, `credential-store-resolver.sh` printed the store path to stdout** and `figma-token.sh` asked for a single key named `figma figma_pat`.
58
+ - **`validate-analysis-doc.mjs` crashed on a document without front matter,** failed the gate on a check it called a warning, listed the correct Turkish word `Onay` as a typo, and cited "Locked 37" in a list of 36.
59
+ - **`multi-repo-pipeline.sh` committed `git add -A`** while its header said staged changes, and ignored `state.identity`. `plan-todos.sh` returned 0 for an unknown id. `update-issue-progress.sh` failed on macOS `mktemp` on the second call.
60
+ - **Smoke hygiene.** Thirty-six smokes: five asserted against the installed `~/.claude` copy instead of the repo, one passed when `sha256sum` was missing (`"" = ""`), eleven used predictable `/tmp` paths, five wrote probe files into the repo tree, five wrote into the real `$HOME`, four turned errexit on halfway through, four had assertions that could not fail, and the `THY` personal-data pattern matched `thyme` under `grep -i`.
61
+ - **Smaller ones.** `build-skills-index.mjs` recorded `|` and `>-` as descriptions for five skills, so `match-skills` could never score them; `learning-curve` and `aggregate-metrics` computed "cache ratio" with different formulas; `graph-build` omitted Go; `repo-map --include` matched substrings while documented as globs; `eval-mine-corpus` read the corpus from a path the writer never used inside a worktree; `gen-mode-dispatch` defaulted to a mode removed in 16.0.0; `scorecard` claimed no network and ran `npm audit`; `_dev-only-files` misgrouped its regex; `render-cost-summary` selected 0/0 phases; `gc-refs` matched `pr-body-final.md`; `credential-inventory` reported every key missing with rc 0 when no backend existed; `repo-cache` and `issue-fetcher` split scan roots on whitespace; `md2confluence-v3.py` detected every document as Turkish and its residual-character warning could never fire; `github-ssh-setup.sh` wrote `UseKeychain` on Linux; dead functions and stale headers in `cost-lib`, `extract-conventions`, `shadow-git`, `fetch-document`, `benchmark-phase-0`, `sync-parity-check`, `_mcp-register`, `_plugin-skills`, `cost-budget-check`, `triage-memory`, `migrate-prefs`, `eval-golden-tasks`; dangling references to `figma-navigation`, `/multi-agent:fix-bug`, `ask_choice.sh`, `refs/frontend-guide.md` and a `-v610` anchor.
62
+ - **Vendored knowledge skills point at files that exist.** Twenty-six external skills linked 184 files that were never vendored; 58 were fetched from their upstream (Dimillian/Skills, MIT, provenance recorded), the rest de-linked. `help-skills` (Turkish, install-path catalog) is retired; `ios-module-structure` resolves its scripts relative to the skill; `ios-coding-standard` examples use a neutral domain.
63
+
19
64
  ## [16.18.0] - 2026-09-01
20
65
 
21
66
  ### Changed
package/README.md CHANGED
@@ -219,7 +219,7 @@ The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI**
219
219
 
220
220
  Filter skills by stack with `--platform=ios\|android\|all`.
221
221
 
222
- **Why Codex gets one skill and not 51.** Codex assembles every discovered skill's name
222
+ **Why Codex gets one skill and not 55.** Codex assembles every discovered skill's name
223
223
  and description into a single prompt block and drops entries when it overflows, with no
224
224
  error. Measured on 0.145: installing one plugin that declares 142 skills surfaced only
225
225
  75 of them and evicted an unrelated user skill. So on Codex the pipeline ships a single
@@ -228,9 +228,9 @@ nothing until read - same commands, same behaviour, a layout the host can actual
228
228
 
229
229
  Reviewer sets differ because the available models do: Claude Code runs 3 reviewers
230
230
  (Fable + Opus + Sonnet), Copilot CLI 3 (Opus + GPT-5.4 + Sonnet), Codex CLI 3 (gpt-5.6 at
231
- xhigh, gpt-5.4, gpt-5.6 at medium). Codex is single-vendor, so consensus among its three
232
- is weaker evidence than the same consensus on a two-vendor host, and the triage note
233
- says so.
231
+ xhigh, gpt-5.4, gpt-5.6 at medium). Claude Code and Codex are single-vendor panels, so
232
+ consensus among their three is weaker evidence than the same consensus on Copilot CLI,
233
+ the one host whose panel spans two vendors, and the triage note says so.
234
234
 
235
235
  ## Tokens & integrations
236
236
 
@@ -257,7 +257,7 @@ Installing the pipeline is not only useful when you run it. Open an ordinary ses
257
257
 
258
258
  - **Services you already onboarded.** The token `setup` mapped is readable now - resolve the logical name through `credential-store.sh` and fetch the issue, the page, the log. **Reads are ordinary work; writes are not.** Posting a Jira comment, editing an issue or opening a PR goes through the pipeline commands, because the rules that make those safe (never auto-close, `Ref:` not `Closes:`, humanizer on outward prose) live there.
259
259
  - **The stack skills `/multi-agent:stack` enabled for the repo.** Each toolkit's own `index` skill routes; the pipeline keeps no copy of that table.
260
- - **The `multi-agent-toolkit` MCP.** 83 tools for a running app - screen state, crash logs, design comparison, store pre-submission.
260
+ - **The `multi-agent-toolkit` MCP.** 80+ tools for a running app - screen state, crash logs, design comparison, store pre-submission.
261
261
 
262
262
  Uninstall preserves this layer: the tokens, the reader that opens them, the mapping that names them, and the MCP registration. Removing the pipeline should not cost you the credentials you onboarded through it.
263
263
 
package/README.tr.md CHANGED
@@ -219,7 +219,7 @@ Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çal
219
219
 
220
220
  Skill'leri stack'e göre filtrele: `--platform=ios\|android\|all`.
221
221
 
222
- **Codex neden 51 değil de tek bir skill alıyor.** Codex, keşfettiği her skill'in adını
222
+ **Codex neden 55 değil de tek bir skill alıyor.** Codex, keşfettiği her skill'in adını
223
223
  ve açıklamasını tek bir prompt bloğuna toplar ve blok taştığında girdileri hatasızca
224
224
  düşürür. 0.145 üzerinde ölçüldü: 142 skill deklare eden bir plugin kurulduğunda sadece
225
225
  75'i yüzeye çıktı ve alakasız bir kullanıcı skill'i tahliye edildi. Bu yüzden Codex'te
@@ -258,7 +258,7 @@ Pipeline'ı kurmak yalnız onu çalıştırdığında işe yaramıyor. Sıradan
258
258
 
259
259
  - **Zaten onboard ettiğin servisler.** `setup`'ın eşlediği token okunabilir durumda - mantıksal adı `credential-store.sh` ile çöz, issue'yu, sayfayı, logu getir. **Okuma sıradan iş, yazma değil.** Jira yorumu, issue düzenleme ve PR açma pipeline komutlarından geçer, çünkü onları güvenli kılan kurallar (issue asla otomatik kapanmaz, `Closes:` değil `Ref:`, dışa dönük metinde humanizer) orada yaşıyor.
260
260
  - **`/multi-agent:stack`'in bu repo için açtığı stack skilleri.** Yönlendirmeyi her toolkit'in kendi `index` skill'i yapar; pipeline o tablonun kopyasını tutmaz.
261
- - **`multi-agent-toolkit` MCP.** Çalışan uygulama için 83 araç - ekran durumu, crash logu, tasarım karşılaştırma, store ön-kontrolü.
261
+ - **`multi-agent-toolkit` MCP.** Çalışan uygulama için 80+ araç - ekran durumu, crash logu, tasarım karşılaştırma, store ön-kontrolü.
262
262
 
263
263
  Uninstall bu katmanı korur: token'lar, onları açan okuyucu, adlarını tutan eşleme ve MCP kaydı. Pipeline'ı kaldırmak, onun üzerinden onboard ettiğin credential'ları kaybetmek anlamına gelmemeli.
264
264
 
@@ -71,7 +71,7 @@ Minimum viable config:
71
71
 
72
72
  Android projects swap the `build` section to `{ "gradleModule": ":components:button", "variant": "debug" }` and set `project.platform` to `"android"`.
73
73
 
74
- **Optional `ui` block - UI interaction systems.** Consumed by the `figma-navigation` / `figma-overlays` / `figma-bottom-sheets` skills and Phase 4 review. Omit it (or set `mode: "native"`) and the pipeline generates stock SwiftUI (`NavigationStack`, `.alert`/`.sheet(item:)`, `.sheet`+`presentationDetents`). Set `mode: "custom"` to route to a project-supplied system by type name:
74
+ **Optional `ui` block - UI interaction systems.** Consumed by the enabled stack plugin's `navigation` / `overlays` / `bottom-sheets` skills (`ai-ios-toolkit:*` / `ai-android-toolkit:*`) and Phase 4 review. Omit it (or set `mode: "native"`) and the pipeline generates stock SwiftUI (`NavigationStack`, `.alert`/`.sheet(item:)`, `.sheet`+`presentationDetents`). Set `mode: "custom"` to route to a project-supplied system by type name:
75
75
 
76
76
  ```json
77
77
  "ui": {
@@ -69,8 +69,10 @@ Negative / costs:
69
69
  - Cross-provider (GPT) dependency on Copilot CLI - if the provider is down,
70
70
  the pipeline continues with 2 reviewers (Opus + Sonnet) and a warning.
71
71
  - Cross-CLI asymmetry: Copilot CLI catches a slice of failures (edge cases
72
- via GPT diversity) that Claude Code's 2-model set misses. Accepted as a
73
- tradeoff against platform reachability.
72
+ via GPT diversity) that Claude Code's 2-model set missed. Accepted then as a
73
+ tradeoff against platform reachability; v16.12.0 closed the count gap (three
74
+ reviewers on every host, see the note at the top), while the vendor gap
75
+ remains: Claude Code's Fable + Opus + Sonnet panel is single-vendor.
74
76
 
75
77
  ## Alternatives Considered
76
78
 
@@ -9,7 +9,7 @@ graph TD
9
9
  P1["Phase 1: Analysis<br/>Codebase scan (parallel Explore agents)"]
10
10
  P2["Phase 2: Planning<br/>Task breakdown, architecture review"]
11
11
  P3["Phase 3: Dev<br/>TDD: RED → GREEN → REFACTOR"]
12
- P4["Phase 4: Review<br/>Parallel + Fable triage<br/>(Claude: 2-model · Copilot: 3-model)"]
12
+ P4["Phase 4: Review<br/>Parallel + Fable triage<br/>(3 reviewers per host: Claude Code Fable + Opus + Sonnet · Copilot GPT-5.4 + Opus + Sonnet)"]
13
13
  P5["Phase 5: Test<br/>Optional manual testing"]
14
14
  P6["Phase 6: Commit<br/>Git commit, PR creation"]
15
15
  P7["Phase 7: Report<br/>Jira · Wiki+Figma · Confluence · Log · Knowledge"]
@@ -169,7 +169,7 @@ revisions of this diagram - Codex CLI and the two independently-shipped repos
169
169
  ```mermaid
170
170
  graph TD
171
171
  CC["Claude Code<br/>(source of truth)"]
172
- COP["Copilot CLI<br/>(instructions + 51 skills)"]
172
+ COP["Copilot CLI<br/>(instructions + 55 skills)"]
173
173
  COD["Codex CLI<br/>(1 router skill + 55 refs)"]
174
174
  REPO["Pipeline Repo<br/>(npm package)"]
175
175
  WEB["Website"]
package/docs/ecosystem.md CHANGED
@@ -106,14 +106,14 @@ hand-authored *inside* `multi-agent-plugins` and are never touched by sync.
106
106
 
107
107
  ```mermaid
108
108
  graph TD
109
- EXT["pipeline/skills/shared/external/<br/>154 skills - single authoring source<br/>(the pipeline's own phases read these too)"]
109
+ EXT["pipeline/skills/shared/external/<br/>153 skills - single authoring source<br/>(the pipeline's own phases read these too)"]
110
110
 
111
- EXT -->|"cross-stack skills"| COMMONP["ai-common-toolkit<br/>11 skills · v0.2.7"]
112
- EXT -->|"outside facts for analysis"| ANAP["ai-analyst-toolkit<br/>5 skills · v0.1.1"]
113
- EXT -->|"Apple/Xcode-only"| IOSP["ai-ios-toolkit<br/>148 skills · v0.10.0"]
114
- EXT -->|"Android/Kotlin-only"| ANDP["ai-android-toolkit<br/>30 skills · v0.1.4"]
115
- EXT -->|"backend-only"| BEP["ai-backend-toolkit<br/>33 skills · v0.1.5"]
116
- EXT -->|"web/frontend-only"| FEP["ai-frontend-toolkit<br/>25 skills · v0.1.4"]
111
+ EXT -->|"cross-stack skills"| COMMONP["ai-common-toolkit<br/>11 skills · v0.2.10"]
112
+ EXT -->|"outside facts for analysis"| ANAP["ai-analyst-toolkit<br/>5 skills · v0.1.3"]
113
+ EXT -->|"Apple/Xcode-only"| IOSP["ai-ios-toolkit<br/>133 skills · v0.12.1"]
114
+ EXT -->|"Android/Kotlin-only"| ANDP["ai-android-toolkit<br/>30 skills · v0.1.5"]
115
+ EXT -->|"backend-only"| BEP["ai-backend-toolkit<br/>33 skills · v0.1.7"]
116
+ EXT -->|"web/frontend-only"| FEP["ai-frontend-toolkit<br/>25 skills · v0.1.5"]
117
117
 
118
118
  COMMONP --> BUMP{"skill set<br/>changed?"}
119
119
  ANAP --> BUMP
@@ -206,16 +206,18 @@ e.g. `apple-archive-compliance` requires `ios_app_store_audit` from
206
206
  that drops or renames a tool a pipeline skill depends on is a **major** bump, by
207
207
  that step's own contract).
208
208
 
209
- ### multi-agent-toolkit-mcp's 83 tools, by category
209
+ ### multi-agent-toolkit-mcp's tools, by category (87 at the toolkit README's last count; the pipeline says "80+" elsewhere so the number does not go stale with every toolkit release)
210
210
 
211
211
  | Category | Tools | Primary pipeline consumers |
212
212
  |---|---|---|
213
- | Device Control | 58 | `/multi-agent:test`, `test-dark-mode`, `test-accessibility`, `test-dynamic-type`, `test-screenshots`, `manual-test`, `design-check` |
214
- | Accessibility Audit | 2 | `test-accessibility` |
213
+ | Device Control | 59 | `/multi-agent:test`, `test-dark-mode`, `test-accessibility`, `test-dynamic-type`, `test-screenshots`, `manual-test`, `design-check` |
214
+ | Memory | 2 (`ios_leaks`, `android_meminfo`) | none yet; available outside the pipeline |
215
+ | Crash Diagnostics | 2 (`ios_list_crashes`, `android_list_crashes`) | `/multi-agent:test` full scenario (end-of-run crash sweep), outside-the-pipeline sessions |
216
+ | Accessibility Audit | 3 (`ios_accessibility_audit`, `android_accessibility_audit`, `ios_accessibility_audit_deep`) | `/multi-agent:test` accessibility scenario, `test-accessibility` |
215
217
  | Store Compliance | 5 | `store-ready`, `testflight-validation`, `apple-archive-compliance` skill, Phase 4 Security Auditor |
216
218
  | Web Automation | 8 | frontend-stack UI testing (via `test`) |
217
219
  | Design Audit | 6 | `design-check` (mock-mode vs Figma conformance) |
218
- | Autonomous Agent DSL | 1 | any skill that needs a scripted multi-step device flow in one round trip |
220
+ | Autonomous Agent DSL | 2 (`agent_run_steps`, `agent_query_output`) | any skill that needs a scripted multi-step device flow in one round trip |
219
221
 
220
222
  ---
221
223
 
package/docs/features.md CHANGED
@@ -36,7 +36,7 @@ The install is not only useful while `/multi-agent` is running. `rules/outside-t
36
36
 
37
37
  - **Onboarded service credentials.** Resolve the logical name through `credential-store.sh` and read the issue, page or log. Writes route through the pipeline commands, which carry the rules that make them safe - issues are never auto-closed, PR bodies use `Ref:`, outward prose goes through the humanizer.
38
38
  - **The stack skills enabled for this repo.** Each toolkit's own `index` skill routes. The pipeline reads the effective `enabledPlugins` rather than keeping a stack table, so a seventh toolkit needs no code change.
39
- - **The `multi-agent-toolkit` MCP.** 83 tools for a running app.
39
+ - **The `multi-agent-toolkit` MCP.** 80+ tools for a running app.
40
40
 
41
41
  Uninstall preserves the whole layer - tokens, the reader that opens them, the mapping that names them, the MCP registration. It is 1.5 kB of always-loaded text; the detail lives in a ref that loads on demand, and a gate keeps both under a ceiling because every byte there is paid by every session.
42
42
 
@@ -55,7 +55,7 @@ Measured on a 4,300-file Swift app against a grep-and-read baseline at the same
55
55
  | iOS/Swift | `.xcodeproj`, `Package.swift` | `refs/swiftui-guide.md` |
56
56
  | Android/Kotlin | `build.gradle[.kts]` | `refs/android-guide.md` |
57
57
  | Backend | `requirements.txt`, `package.json`, `go.mod` | `refs/backend-guide.md` |
58
- | Frontend | `package.json` + framework detection | `refs/frontend-guide.md` |
58
+ | Frontend | `package.json` + framework detection | `refs/web-guide.md` |
59
59
  | Docker | `Dockerfile`, `docker-compose.yml` | `refs/backend-guide.md` |
60
60
 
61
61
  Build commands, test runners, lint tools, and review focus areas all adapt to the detected stack.
package/index.js CHANGED
@@ -73,7 +73,7 @@ if (command === "--version" || command === "-v" || command === "version") {
73
73
 
74
74
  Options:
75
75
  --no-color Disable colored output
76
- --target=<path> Target dir override (install and legacy-adapter cleanup on uninstall; defaults to cwd)
76
+ --target=<path> Uninstall only: project dir for the legacy adapter cleanup (--cursor / --copilot-chat / --antigravity; defaults to cwd). Install always targets $HOME.
77
77
  --platform=ios|android|all Filter external skills by platform (default: all)
78
78
 
79
79
  After installation:
@@ -278,11 +278,29 @@ const ABANDONED_TREES = Object.freeze([
278
278
  {
279
279
  dir: ".multi-agent",
280
280
  root: "home",
281
+ // `.multi-agent/` is also the live per-repo path memory-save.sh and the
282
+ // offload-ref writer use (memory/, refs/, .gitignore). If $HOME is itself a
283
+ // repo, or anything else put an unknown entry there, the tree is not ours.
284
+ knownEntries: ["scripts", "lib", "schemas", ".DS_Store"],
281
285
  reason:
282
286
  "shared runtime for the Cursor / Antigravity / Copilot Chat adapters, all deleted in v10.7.0",
283
287
  },
284
288
  ]);
285
289
 
290
+ /**
291
+ * @param {string} target
292
+ * @param {ReadonlyArray<string>|undefined} knownEntries
293
+ * @returns {boolean} true when every top-level entry is one the abandoned tree is known to contain
294
+ */
295
+ function isKnownLegacyTree(target, knownEntries) {
296
+ if (!knownEntries) return true;
297
+ try {
298
+ return readdirSync(target).every((name) => knownEntries.includes(name));
299
+ } catch {
300
+ return false;
301
+ }
302
+ }
303
+
286
304
  /**
287
305
  * Registry of command renames. Command names are an interface: users type
288
306
  * them, docs and saved routines reference them, and Copilot installs derive
@@ -311,10 +329,16 @@ export const COMMAND_RENAMES = Object.freeze({
311
329
  */
312
330
  export function pruneAbandonedTrees(claudeDir, home = dirname(claudeDir)) {
313
331
  let removed = 0;
314
- for (const { dir, root, reason } of ABANDONED_TREES) {
332
+ for (const { dir, root, reason, knownEntries } of ABANDONED_TREES) {
315
333
  const base = root === "home" ? home : claudeDir;
316
334
  const target = join(base, dir);
317
335
  if (!existsSync(target)) continue;
336
+ if (!isKnownLegacyTree(target, knownEntries)) {
337
+ console.log(
338
+ ` kept ${target}: holds entries no abandoned install wrote, so it is not ours to remove`,
339
+ );
340
+ continue;
341
+ }
318
342
  if (dryRun) {
319
343
  console.log(` [dry-run] would remove abandoned tree ${target} (${reason})`);
320
344
  removed++;
@@ -44,9 +44,9 @@ export const CONSUMER_SMOKES = Object.freeze([
44
44
  * notices - the safe direction for reason 2 above.
45
45
  */
46
46
  export const MAINTAINER_SMOKES = new RegExp(
47
- `^smoke-(?!${CONSUMER_SMOKES.map((n) => n.replace(/^smoke-/, "").replace(/\./g, "\\.")).join(
47
+ `^smoke-(?!(?:${CONSUMER_SMOKES.map((n) => n.replace(/^smoke-/, "").replace(/\./g, "\\.")).join(
48
48
  "|",
49
- )}$)`,
49
+ )})$)`,
50
50
  );
51
51
 
52
52
  /**
@@ -154,9 +154,10 @@ function saysAlreadyExists(text) {
154
154
  * "skipped MCP registration (Command failed)" would send the user to fix something that
155
155
  * is already correct, and that is exactly what the first version of this did.
156
156
  *
157
- * The existing entry is left alone rather than removed and re-added: a user may have
158
- * added env vars or switched the command to a local checkout, and an installer has no
159
- * business discarding that.
157
+ * An existing entry under the same name is removed and re-added so its spec follows
158
+ * the installed version (the entry is installer-owned; the reason is at the remove
159
+ * below). A user who points the toolkit at a local checkout registers it under a
160
+ * different name or re-applies the change after an update.
160
161
  *
161
162
  * Never fatal: a missing CLI or a failed write must not fail the install, because the
162
163
  * rest of the tree is still correct and useful. It prints the manual command instead.
@@ -30,7 +30,7 @@ import { join } from "path";
30
30
  /** Uninstall reads this to know exactly which delivered skill dirs are ours to remove. */
31
31
  export const PLUGIN_SKILLS_MANIFEST = ".plugin-skills-manifest.json";
32
32
 
33
- import { copyDir, countFiles, ensureDir, ensureRealDir, isDryRun, wipeDir } from "./_common.mjs";
33
+ import { copyDir, countFiles, ensureDir, isDryRun, wipeDir } from "./_common.mjs";
34
34
 
35
35
  /** Subtrees a plugin authors itself. `knowledge/` is generated, so it is excluded. */
36
36
  const AUTHORED_GROUPS = Object.freeze(["index", "reference", "workflow", "tools"]);
@@ -341,5 +341,3 @@ export function pipelineOwnedSkillNames(pipelineSrc) {
341
341
  }
342
342
  return owned;
343
343
  }
344
-
345
- export { ensureRealDir };
@@ -22,6 +22,7 @@ import {
22
22
  isDryRun,
23
23
  pruneOrphanSkillFiles,
24
24
  removePipelineAgentFiles,
25
+ symlinkDir,
25
26
  wipeDir,
26
27
  writeFile,
27
28
  } from "./_common.mjs";
@@ -303,9 +304,12 @@ function installSkills(opts) {
303
304
  const { home, pipelineSrc, dest, indexOnly, useSymlinks, platformFlag } = opts;
304
305
  console.log(" [Copilot CLI] Installing skills...");
305
306
 
306
- // Same symlink guard as the other owned trees: never prune or copy through
307
- // a --link-era symlink into the repo checkout.
308
- if (!useSymlinks) ensureRealDir(dest);
307
+ // The skills root is always a real directory, in --link mode too: the manifest,
308
+ // index and README written below are generated files, and an older --link
309
+ // install pointed the whole root at pipeline/skills/shared/core, so every one
310
+ // of those writes (and the external / plugin symlinks) landed in the checkout.
311
+ // Link mode now links each authored skill dir individually instead.
312
+ ensureRealDir(dest);
309
313
 
310
314
  if (indexOnly) {
311
315
  try {
@@ -334,7 +338,7 @@ function installSkills(opts) {
334
338
  let pruned = 0;
335
339
  for (const entry of readdirSync(dest, { withFileTypes: true })) {
336
340
  if (
337
- entry.isDirectory() &&
341
+ (entry.isDirectory() || entry.isSymbolicLink()) &&
338
342
  entry.name.startsWith("multi-agent") &&
339
343
  !sourceNames.has(entry.name)
340
344
  ) {
@@ -358,10 +362,15 @@ function installSkills(opts) {
358
362
 
359
363
  if (existsSync(sharedCoreSrc)) {
360
364
  if (useSymlinks) {
361
- // --link (dev) mode points at the repo, so there is nothing to rewrite -
362
- // and rewriting would mean editing the checkout.
363
- copyDir(sharedCoreSrc, dest, { useSymlinks });
364
- copilotSkillCount += countFiles(sharedCoreSrc);
365
+ // --link (dev) mode points each skill dir at the repo, so there is nothing
366
+ // to rewrite - and rewriting would mean editing the checkout.
367
+ ensureDir(dest);
368
+ for (const e of readdirSync(sharedCoreSrc, { withFileTypes: true })) {
369
+ if (!e.isDirectory()) continue;
370
+ wipeDir(join(dest, e.name));
371
+ symlinkDir(join(sharedCoreSrc, e.name), join(dest, e.name));
372
+ copilotSkillCount += countFiles(join(sharedCoreSrc, e.name));
373
+ }
365
374
  } else {
366
375
  // Wipe each pipeline-owned skill dir before refilling it. Copying only ADDS,
367
376
  // so a subtree from an older layout survives inside a directory the installer
@@ -399,7 +408,7 @@ function installSkills(opts) {
399
408
  for (const name of keep) {
400
409
  const src = join(sharedExternalSrc, name);
401
410
  const dst = join(dest, name);
402
- if (!useSymlinks) wipeDir(dst);
411
+ wipeDir(dst);
403
412
  copyDir(src, dst, { useSymlinks });
404
413
  copilotSkillCount += countFiles(src);
405
414
  }
package/install/index.mjs CHANGED
@@ -54,7 +54,7 @@ export async function runInstall(argv) {
54
54
  "--dry-run",
55
55
  "--prune-external",
56
56
  ];
57
- const KNOWN_PREFIXES = ["--target=", "--platform="];
57
+ const KNOWN_PREFIXES = ["--platform="];
58
58
  const unknown = flags.filter(
59
59
  (f) =>
60
60
  f.startsWith("--") &&
@@ -63,9 +63,7 @@ export async function runInstall(argv) {
63
63
  );
64
64
  if (unknown.length > 0) {
65
65
  console.error(`Error: unknown flag(s): ${unknown.join(", ")}`);
66
- console.error(
67
- `Supported: ${[...KNOWN_FLAGS, "--target=<path>", "--platform=<ios|android|all>"].join(" ")}`,
68
- );
66
+ console.error(`Supported: ${[...KNOWN_FLAGS, "--platform=<ios|android|all>"].join(" ")}`);
69
67
  process.exit(1);
70
68
  }
71
69
 
@@ -12,13 +12,13 @@
12
12
  1. **Analysis** - Stack detection, codebase exploration
13
13
  2. **Planning** - Task decomposition, architecture review, user approval
14
14
  3. **Dev** - TDD cycle: test -> code -> build
15
- 4. **Review** - Deterministic gates + CLI-aware parallel review + Opus triage.
16
- Copilot CLI dispatches **3 reviewers in parallel**: GPT-5.4 (edge cases +
17
- cross-provider diversity) + Opus (security + architecture) + Sonnet (quality +
18
- correctness). Findings flow into an Opus triage pass that filters false-positives
19
- and out-of-scope items before looping back to Phase 3. Claude Code drops GPT-5.4
20
- (not natively reachable there) and runs a 2-model set - this is the only
21
- intentional cross-CLI asymmetry for Phase 4.
15
+ 4. **Review** - Deterministic gates + CLI-aware parallel review + triage.
16
+ Every host dispatches **3 reviewers in parallel**. Copilot CLI: GPT-5.4 (edge
17
+ cases + cross-provider diversity) + Opus (security + architecture) + Sonnet
18
+ (quality + correctness), followed by an Opus triage pass. Claude Code: Fable +
19
+ Opus + Sonnet, followed by a Fable triage pass (GPT-5.4 is not natively
20
+ reachable there - the only intentional cross-CLI asymmetry for Phase 4). Triage
21
+ filters false-positives and out-of-scope items before looping back to Phase 3.
22
22
  5. **Test** - Optional manual testing + on-demand device audits
23
23
  6. **Commit** - Secret scan · commit · push · PR creation
24
24
  7. **Report** - Jira comment · Wiki + Figma screenshots · Confluence · log · knowledge + memory
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmerterden/multi-agent-pipeline",
3
- "version": "16.18.0",
3
+ "version": "16.19.0",
4
4
  "description": "8-phase AI development pipeline with full orchestration on Claude Code, Copilot CLI and Codex CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -13,8 +13,8 @@
13
13
 
14
14
  ### Pipeline Phases
15
15
 
16
- 1. Analysis (Opus) -> scope, impact analysis
17
- 2. Planning (Opus) -> spec, task breakdown
16
+ 1. Analysis (Sonnet, `explorer` persona) -> scope, impact analysis
17
+ 2. Planning (Fable; Opus when the fallback ladder engages) -> spec, task breakdown
18
18
  3. Development (Sonnet) -> TDD, code, build
19
19
  4. Review -> deterministic gates + parallel review + Fable triage
20
20
  - Claude Code: Fable + Opus + Sonnet (3 paralel)
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Task orchestrator - full pipeline via Jira ID + branch or GitHub Issue URL: analysis, plan, TDD development, parallel review + Fable triage (CLI-aware: 2-model on Claude Code, 3-model on Copilot CLI), commit, log. Use when given a Jira ID, a GitHub issue or a free-text task and the whole pipeline should run."
2
+ description: "Task orchestrator - full pipeline via Jira ID + branch or GitHub Issue URL: analysis, plan, TDD development, parallel review + Fable triage (3 reviewers per host: Fable + Opus + Sonnet on Claude Code, GPT-5.4 + Opus + Sonnet on Copilot CLI), commit, log. Use when given a Jira ID, a GitHub issue or a free-text task and the whole pipeline should run."
3
3
  description-tr: "Görev orkestratörü - Jira ID + branch veya GitHub Issue URL ile tam pipeline: analiz, plan, TDD geliştirme, paralel review + Fable triyajı (CLI'ya göre: Claude Code'da 3, Copilot CLI'da 3 model), commit, log"
4
4
  allowed-tools: Agent, Bash, Read, Write, Edit, Glob, Grep, TaskCreate, TaskUpdate, TaskList, TaskGet, AskUserQuestion, WebFetch, WebSearch, NotebookEdit, Skill
5
5
  ---
@@ -48,7 +48,7 @@ Classification schema lives in `$HOME/.claude/multi-agent-refs/_input-parser.md`
48
48
  | 7 | `issue` | full picker | account → repo (multi) → issue → maturity → dev-context |
49
49
  | 8 | Free-text | `freetext` | account → repo (single) → dev-context (maturity skip) |
50
50
 
51
- **Rule**: Whatever the type, **account is always asked** (autopilot picks a default). After issue fetch, **maturity check is mandatory** - blockers halt the pipeline. Picker `label` + `header` render in English (`promptLanguage` is locked to `en`); the `question` and each option's `description` render in `outputLanguage`, per the canonical matrix in `multi-agent-refs/rules.md`.
51
+ **Rule**: Whatever the type, **account is always asked** (autopilot picks a default). After issue fetch, **maturity check is mandatory** - blockers halt the pipeline. Picker `header` renders in English (the 12-char chip); the `question`, each option's `label` and each option's `description` render in `outputLanguage`, per the canonical matrix in `multi-agent-refs/rules.md`.
52
52
 
53
53
  Lib scripts (`~/.claude/lib/`):
54
54
  - `account-resolver.sh` - keychain account inventory
@@ -102,8 +102,8 @@ Lib scripts (`~/.claude/lib/`):
102
102
  This command uses lazy loading for token efficiency. Read the relevant sub-file based on the routed action:
103
103
 
104
104
  **File layout:**
105
- - `commands/multi-agent/*.md` → **invocable actions** (each gets its own `/multi-agent:<name>` slash command)
106
- - `$HOME/.claude/multi-agent-refs/**` → **internal references**, read by the main command, never invoked directly (surface as `/multi-agent:refs:...` in autocomplete - the prefix signals "not an action")
105
+ - `commands/multi-agent/{cmd}/SKILL.md` → **invocable actions** (each gets its own `/multi-agent:<name>` slash command)
106
+ - `$HOME/.claude/multi-agent-refs/**` → **internal references**, read by the main command, never invoked directly. They live outside `commands/` precisely so they never appear in slash-command autocomplete.
107
107
 
108
108
  | Route | File to Read |
109
109
  |-------|-------------|
@@ -262,7 +262,7 @@ When called with `review`:
262
262
  1. Detect current branch and project from cwd (or ask)
263
263
  2. Get diff: `git diff HEAD` (unstaged + staged)
264
264
  3. If no diff, get diff against base branch: `git diff origin/{baseBranch}...HEAD`
265
- 4. Launch Phase 4 review (parallel + Fable triage - 2-model on Claude Code, 3-model on Copilot CLI) on the diff
265
+ 4. Launch Phase 4 review (parallel + Fable triage - 3 reviewers on every host: Fable + Opus + Sonnet on Claude Code, GPT-5.4 + Opus + Sonnet on Copilot CLI) on the diff
266
266
  5. No worktree, no state file - lightweight one-shot review
267
267
  6. Print findings to terminal
268
268
 
@@ -127,7 +127,7 @@ Set `phase: "drafting"`.
127
127
  ### Phase 4 - Draft, humanize, buffer
128
128
 
129
129
  1. Render the report per `$HOME/.claude/multi-agent-refs/complaint-analysis-template.md` (8 fixed sections; single-language body in `outputLanguage`; verdict tokens English per Locked 9) to `/tmp/complaint-analysis-<run-slug>-<UTC-iso8601>/report.md`. Store `outputs.draftDir`.
130
- 2. **Humanizer pass (MANDATORY: actually invoke the `ai-common-toolkit:humanizer` skill; the punctuation grep alone does NOT satisfy this)** with `language: <tr|en>`, `tone: technical-explanatory`, `stripFancyPunctuation: true`. Diacritics preserved (Locked 8).
130
+ 2. **Humanizer pass (required: actually invoke the `ai-common-toolkit:humanizer` skill; the punctuation grep alone does NOT satisfy this)** with `language: <tr|en>`, `tone: technical-explanatory`, `stripFancyPunctuation: true`. Diacritics preserved (Locked 8).
131
131
  3. Punctuation gate: `node $HOME/.claude/scripts/validate-complaint-doc.mjs <draft>` reports no banned-punctuation error. It checks the policy in Node, so the same result holds on macOS, Linux and Windows; `grep -P` is absent from BSD grep and would never run there.
132
132
  4. Show the draft path + size to the user. Set `phase: "awaiting_output_decision"`.
133
133
 
@@ -133,7 +133,7 @@ for l in sys.stdin:
133
133
  Print the resolved set grouped by screen **with its relaunch cost**: `<n> targets · <relaunchCount> relaunches`. Read the cost from `plan`, not from the target count - one relaunch serves every in-app target on that screen, so a 50-target module is typically a dozen relaunches, not fifty. **Whole-module is the intended default**; only ask for confirmation when `relaunchCount` exceeds `config coverage.confirmAbove` (default 25), and phrase it as a cost estimate, not as an invitation to shrink the audit. Never propose a smaller scope as the easy path - a scoped run is for resuming or for a focused re-check, not for avoiding work.
134
134
  7. **`--resume`** - read the most recent `~/DesignChecks/{repo}__{module}/*/run-state.json`; the scope becomes that run's targets minus its `covered` and minus its `skipped` entries. Skips carry a reason and are honoured, so a resume covers the genuinely unaudited remainder. No previous run → tell the user and fall back to whole-module scope after confirmation.
135
135
  8. **Report dir** - create `~/DesignChecks/{repo}__{module}/{UTC-timestamp}/` (and `assets/` inside it) now, and persist it as `state.designCheck.reportDir`. Phase 3 writes captures, comparison images, and `run-state.json` into it, so it must exist before driving starts - not at export time. This is report output, not a worktree; $HOME is intended here.
136
- 9. **Worktree** - build the Debug app in an isolated worktree so the user's tree is untouched. Follow `phase-0-init.md` Step 8 convention exactly: `{projectRoot}/{worktreeBasePath}/{taskId}` (default `.worktrees/DC-<shortId>`), **never under $HOME** (`feedback_worktree_path_convention`). Stale-lock heal (`git worktree prune`) + residue guard (`.worktrees/` in `.git/info/exclude`) first. Local mode is not offered - the audit always uses a worktree checkout of the current branch's HEAD (no fetch/push).
136
+ 9. **Worktree** - build the Debug app in an isolated worktree so the user's tree is untouched. Follow the `phase-0-init.md` Step 6 worktree location convention exactly: `{projectRoot}/.worktrees/{taskId}` with `taskId` = `DC-<shortId>`, **never under $HOME** (the `.worktrees` segment is fixed, not a preference). Stale-lock heal (`git worktree prune`) + residue guard (`.worktrees/` in `.git/info/exclude`) first. Local mode is not offered - the audit always uses a worktree checkout of the current branch's HEAD (no fetch/push).
137
137
 
138
138
  Persist `agent-state.json` with `taskId`, `mode: "design-check"`, `platform`, `projectRoot`, `worktreePath`, `module`, `designCheck`.
139
139
 
@@ -53,7 +53,7 @@ How It Works (Phase 0 - Interactive Flow):
53
53
  Pipeline (after Phase 0) - shown as visual cards in terminal:
54
54
 
55
55
  Phase 0: Init -> The 8 steps above
56
- Phase 1: Analysis -> Stack detection + codebase scan (Fable)
56
+ Phase 1: Analysis -> Stack detection + codebase scan (Sonnet)
57
57
  Phase 2: Planning -> Task breakdown + architecture review + Plan Approval Gate
58
58
  (clarification max 2 rounds + approval loop - Full + interactive
59
59
  only; a Short run has no plan, autopilot may not ask)
@@ -331,7 +331,7 @@ Nasıl Çalışır (Phase 0 - İnteraktif Akış):
331
331
  Pipeline (Phase 0'dan sonra) - terminalde görsel kart olarak görünür:
332
332
 
333
333
  Phase 0: Init -> Yukarıdaki 8 adım
334
- Phase 1: Analysis -> Stack tespiti + codebase taraması (Fable)
334
+ Phase 1: Analysis -> Stack tespiti + codebase taraması (Sonnet)
335
335
  Phase 2: Planning -> Task kırılımı + mimari inceleme + Plan Onay Kapısı
336
336
  (clarification max 2 tur + onay döngüsü - sadece Tam +
337
337
  etkileşimli; Kısa'da plan yok, autopilot soru soramaz)
@@ -67,7 +67,7 @@ Depth is a separate axis, asked at Phase 0 Step 7.5 rather than encoded in the c
67
67
 
68
68
  ## Delegation
69
69
 
70
- Orchestrator routing: the routing table in `$HOME/.claude/commands/multi-agent/SKILL.md` resolves `local-autopilot` as the union of the `dev-local` + `autopilot` mode mixins. Contract details: `$HOME/.claude/multi-agent-refs/phases/phase-0-init.md` Step 8 (local branch) + `$HOME/.claude/multi-agent-refs/phases/phase-2-planning.md` Step 5 (autopilot gate skip + safety classifier).
70
+ Orchestrator routing: the routing table in `$HOME/.claude/commands/multi-agent/SKILL.md` resolves `local-autopilot` as the union of the `dev-local` + `autopilot` mode mixins. Contract details: `$HOME/.claude/multi-agent-refs/phases/phase-0-init.md` Step 6 (local branch) + `$HOME/.claude/multi-agent-refs/phases/phase-2-planning.md` Step 5 (autopilot gate skip + safety classifier).
71
71
  ## Required: outward-facing payload contracts
72
72
 
73
73
  Before writing anything outward-facing - PR body, Jira comment, Confluence page, closing report - load `$HOME/.claude/multi-agent-refs/payload-contracts.md`. It names the canonical section set for each payload, the markup dialect per surface (PR body is Markdown, Jira is wiki markup - mixing them is a defect), and the token/duration numbers the closing report must carry. Improvising a payload shape from memory is the most common failure of the short modes.