@mmerterden/multi-agent-pipeline 20.24.0 → 20.25.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 (86) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +6 -5
  3. package/README.tr.md +6 -5
  4. package/docs/architecture.md +3 -3
  5. package/docs/ecosystem.md +5 -5
  6. package/docs/facts.json +7 -6
  7. package/docs/features.md +9 -4
  8. package/install/catalog-history.json +1 -1
  9. package/install/templates/claude-hooks.json +1 -1
  10. package/install/templates/codex-hooks.json +18 -0
  11. package/manifest.json +89 -82
  12. package/package.json +1 -1
  13. package/pipeline/agents/task-clarifier.md +1 -1
  14. package/pipeline/commands/multi-agent/deps/SKILL.md +61 -0
  15. package/pipeline/commands/multi-agent/model/SKILL.md +2 -2
  16. package/pipeline/commands/multi-agent/postmortem/SKILL.md +18 -6
  17. package/pipeline/commands/multi-agent/review/SKILL.md +5 -5
  18. package/pipeline/commands/multi-agent/route-on/SKILL.md +1 -1
  19. package/pipeline/commands/multi-agent/setup/SKILL.md +7 -5
  20. package/pipeline/commands/multi-agent/sync/SKILL.md +3 -3
  21. package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +2 -3
  22. package/pipeline/contract/fixtures/runs-failed.json +1 -1
  23. package/pipeline/contract/fixtures/runs-old-schema.json +1 -1
  24. package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +1 -1
  25. package/pipeline/contract/fixtures/runs-pr-opened.json +1 -1
  26. package/pipeline/contract/fixtures/runs-running.json +1 -1
  27. package/pipeline/lib/credential-inventory.sh +5 -5
  28. package/pipeline/lib/fetch-crashlytics.sh +6 -8
  29. package/pipeline/lib/model-rung.sh +1 -1
  30. package/pipeline/lib/plan-todos.sh +21 -4
  31. package/pipeline/lib/post-pr-review.sh +4 -6
  32. package/pipeline/lib/route-state.sh +1 -1
  33. package/pipeline/lib/shadow-git.sh +4 -5
  34. package/pipeline/multi-agent-refs/cross-cli-contract.md +8 -9
  35. package/pipeline/multi-agent-refs/features/cost-analysis.md +4 -0
  36. package/pipeline/multi-agent-refs/features/dep-bump.md +176 -0
  37. package/pipeline/multi-agent-refs/features/model-fallback.md +17 -12
  38. package/pipeline/multi-agent-refs/help/en.md +1 -0
  39. package/pipeline/multi-agent-refs/help/tr.md +1 -0
  40. package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -1
  41. package/pipeline/multi-agent-refs/phases/phase-2-dev.md +2 -0
  42. package/pipeline/multi-agent-refs/phases/phase-3-review.md +5 -5
  43. package/pipeline/multi-agent-refs/picker-contract.md +1 -1
  44. package/pipeline/multi-agent-refs/tracker-contract.md +6 -6
  45. package/pipeline/schemas/agent-state.schema.json +5 -0
  46. package/pipeline/schemas/phases.json +4 -0
  47. package/pipeline/schemas/plan-todos.schema.json +4 -4
  48. package/pipeline/schemas/prefs.schema.json +27 -4
  49. package/pipeline/scripts/_code-graph.mjs +2 -2
  50. package/pipeline/scripts/_transcript-hosts.mjs +406 -0
  51. package/pipeline/scripts/build-stack-plugins.mjs +3 -3
  52. package/pipeline/scripts/capture-flush.sh +7 -7
  53. package/pipeline/scripts/code-graph-rules/android.json +1 -1
  54. package/pipeline/scripts/cost-analyze.mjs +26 -19
  55. package/pipeline/scripts/cost-table.json +35 -19
  56. package/pipeline/scripts/dep-bump.mjs +1556 -0
  57. package/pipeline/scripts/edit-syntax-gate.mjs +151 -29
  58. package/pipeline/scripts/edit-syntax-gate.sh +9 -6
  59. package/pipeline/scripts/gc-abandoned.sh +2 -2
  60. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  61. package/pipeline/scripts/git-path.mjs +1 -2
  62. package/pipeline/scripts/host-hooks.mjs +265 -0
  63. package/pipeline/scripts/jira-attach.sh +1 -1
  64. package/pipeline/scripts/keychain.py +3 -3
  65. package/pipeline/scripts/output-quality-check.sh +1 -1
  66. package/pipeline/scripts/phase-tracker.sh +5 -6
  67. package/pipeline/scripts/phase0-exit-gate.mjs +3 -3
  68. package/pipeline/scripts/pre-push-check.sh +3 -6
  69. package/pipeline/scripts/transcript-index.mjs +423 -242
  70. package/pipeline/scripts/uninstall.mjs +90 -4
  71. package/pipeline/scripts/update-issue-progress.sh +4 -6
  72. package/pipeline/scripts/usage-report.mjs +2 -2
  73. package/pipeline/skills/.skill-manifest.json +14 -10
  74. package/pipeline/skills/.skills-index.json +12 -1
  75. package/pipeline/skills/shared/README.md +4 -3
  76. package/pipeline/skills/shared/core/multi-agent/SKILL.md +6 -6
  77. package/pipeline/skills/shared/core/multi-agent-deps/SKILL.md +60 -0
  78. package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +2 -2
  79. package/pipeline/skills/shared/core/multi-agent-postmortem/SKILL.md +10 -7
  80. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +5 -5
  81. package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +1 -1
  82. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +7 -5
  83. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +3 -3
  84. package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +2 -3
  85. package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +2 -2
  86. package/pipeline/skills/skills-index.md +2 -1
@@ -60,6 +60,7 @@ import {
60
60
  XCODE_SKILLS_MANIFEST,
61
61
  } from "../lib/xcode-plugin.mjs";
62
62
  import { createInterface } from "readline";
63
+ import { removeHooks, templateCommands } from "./host-hooks.mjs";
63
64
 
64
65
  const HOME = process.env.HOME;
65
66
 
@@ -104,6 +105,7 @@ export const PIPELINE_RETIRED_SKILL_DIRS = ["valven-rules"];
104
105
  */
105
106
  export const PIPELINE_TEMPLATE_FILES = [
106
107
  "claude-hooks.json",
108
+ "codex-hooks.json",
107
109
  "codex-instructions.md",
108
110
  "copilot-instructions.md",
109
111
  "multi-agent-autopilot-awake.plist.template",
@@ -781,11 +783,14 @@ function stripManagedBlock(filePath, { hostFile = false } = {}) {
781
783
  }
782
784
 
783
785
  /**
784
- * Remove the pipeline-added hooks + env from settings.json. Other hooks the
785
- * user added stay intact.
786
+ * Remove the pipeline-added hooks + env from settings.json: the gates
787
+ * install/claude.mjs registers, and every handler whose full command is one
788
+ * claude-hooks.json registers (setup Step 8 merges those). Other hooks the
789
+ * user added stay intact, including one inside a group the pipeline uses.
786
790
  * @param {string} settingsPath
791
+ * @param {Set<string>|null} templateCmds claude-hooks.json's commands
787
792
  */
788
- function cleanClaudeSettings(settingsPath) {
793
+ function cleanClaudeSettings(settingsPath, templateCmds) {
789
794
  if (!existsSync(settingsPath)) return;
790
795
  let settings;
791
796
  try {
@@ -831,6 +836,20 @@ function cleanClaudeSettings(settingsPath) {
831
836
  if (settings.hooks && Object.keys(settings.hooks).length === 0) delete settings.hooks;
832
837
  }
833
838
 
839
+ if (templateCmds && settings.hooks) {
840
+ try {
841
+ const { doc, removed } = removeHooks(settings, templateCmds);
842
+ if (removed) {
843
+ settings = doc;
844
+ touched = true;
845
+ }
846
+ } catch {
847
+ console.log(
848
+ ` skipped the hook template pass (hooks not in the expected shape): ${settingsPath}`,
849
+ );
850
+ }
851
+ }
852
+
834
853
  if (touched) {
835
854
  if (dryRun) {
836
855
  report("would update", settingsPath);
@@ -841,6 +860,63 @@ function cleanClaudeSettings(settingsPath) {
841
860
  }
842
861
  }
843
862
 
863
+ /**
864
+ * The commands a shipped hook template registers, read from the first copy
865
+ * found: the host's installed templates, the package this script runs from,
866
+ * or the templates directory beside an installed scripts/. Null when none is
867
+ * readable.
868
+ * @param {string} name template file name
869
+ * @param {string[]} dirs host template directories, searched first
870
+ */
871
+ export function shippedHookCommands(name, dirs = []) {
872
+ const here = import.meta.dirname;
873
+ const candidates = [
874
+ ...dirs.map((d) => join(d, name)),
875
+ join(here, "..", "..", "install", "templates", name),
876
+ join(here, "..", "templates", name),
877
+ ];
878
+ for (const path of candidates) {
879
+ if (!existsSync(path)) continue;
880
+ try {
881
+ const commands = templateCommands(JSON.parse(readFileSync(path, "utf-8")), HOME);
882
+ if (commands.size) return commands;
883
+ } catch {
884
+ // An unreadable copy: try the next one.
885
+ }
886
+ }
887
+ return null;
888
+ }
889
+
890
+ /**
891
+ * Take the pipeline's hook handlers out of Codex's hooks.json (host-hooks.mjs
892
+ * merged them in), matched by the template's full commands; the user's own
893
+ * hooks stay. Without a template the file is left as it is.
894
+ * @param {string} hooksPath
895
+ * @param {Set<string>|null} commands
896
+ */
897
+ function cleanCodexHooks(hooksPath, commands) {
898
+ if (!existsSync(hooksPath)) return;
899
+ if (!commands) {
900
+ console.log(` skipped (no codex-hooks.json template to match against): ${hooksPath}`);
901
+ return;
902
+ }
903
+ let doc;
904
+ try {
905
+ doc = JSON.parse(readFileSync(hooksPath, "utf-8"));
906
+ } catch {
907
+ console.log(` skipped (unparseable): ${hooksPath}`);
908
+ return;
909
+ }
910
+ const { doc: cleaned, removed } = removeHooks(doc, commands);
911
+ if (!removed) return;
912
+ if (dryRun) {
913
+ report("would update", hooksPath);
914
+ return;
915
+ }
916
+ atomicWrite(hooksPath, JSON.stringify(cleaned, null, 2) + "\n");
917
+ console.log(` removed ${removed} pipeline hook(s) from: ${hooksPath}`);
918
+ }
919
+
844
920
  async function confirm(question) {
845
921
  if (skipPrompt || dryRun) return true;
846
922
  return new Promise((resolve) => {
@@ -910,6 +986,9 @@ export async function main() {
910
986
  console.log(" [Claude Code] Removing...");
911
987
  deregisterClaudeMcpServer();
912
988
  const CLAUDE = join(HOME, ".claude");
989
+ const claudeHookCommands = shippedHookCommands("claude-hooks.json", [
990
+ join(CLAUDE, "templates"),
991
+ ]);
913
992
  unlinkClaudeXcodePlugin(HOME);
914
993
  rmCommandsPreservingLocalOnly(join(CLAUDE, "commands", "multi-agent"));
915
994
  rmIfExists(join(CLAUDE, "scripts"));
@@ -961,7 +1040,7 @@ export async function main() {
961
1040
  // Agent definitions are FILES; remove only the pipeline-shipped names so
962
1041
  // user-authored agents survive.
963
1042
  rmMatchingFiles(join(CLAUDE, "agents"), (name) => PIPELINE_AGENT_FILES.includes(name));
964
- cleanClaudeSettings(join(CLAUDE, "settings.json"));
1043
+ cleanClaudeSettings(join(CLAUDE, "settings.json"), claudeHookCommands);
965
1044
  }
966
1045
 
967
1046
  if (forCopilot && HOME) {
@@ -1071,6 +1150,13 @@ export async function main() {
1071
1150
  console.log(" [Codex CLI] Removing from ~/.codex...");
1072
1151
  const CODEX = join(HOME, ".codex");
1073
1152
 
1153
+ // Codex reads hooks from $CODEX_HOME when set, so host-hooks.mjs may have
1154
+ // registered there as well as in ~/.codex.
1155
+ const codexHooks = shippedHookCommands("codex-hooks.json", [join(CODEX, "templates")]);
1156
+ const hooksFiles = new Set([join(CODEX, "hooks.json")]);
1157
+ if (process.env.CODEX_HOME) hooksFiles.add(join(process.env.CODEX_HOME, "hooks.json"));
1158
+ for (const hooksFile of hooksFiles) cleanCodexHooks(hooksFile, codexHooks);
1159
+
1074
1160
  // Wholly pipeline-owned trees.
1075
1161
  rmIfExists(join(CODEX, "multi-agent-refs"));
1076
1162
  rmIfExists(join(CODEX, "scripts"));
@@ -135,12 +135,10 @@ if [ "$TASK_ID" = "--rewrite" ]; then
135
135
  fi
136
136
 
137
137
  # Resolve agent-state.json. multi-repo-pipeline.sh writes it under a
138
- # per-project directory ($HOME/.claude/logs/multi-agent/{project}/{taskId}/)
139
- # - not the ~/.claude/projects/*/state/ path this used to glob, which no
140
- # writer in the pipeline ever populates.
141
- # This globbed ONLY the nested layout. phase-tracker.sh and most Phase 0 paths
142
- # write flat, so on a real machine the majority of runs resolved to nothing and
143
- # this script reported "no agent-state.json" for a run whose state existed.
138
+ # per-project directory ($HOME/.claude/logs/multi-agent/{project}/{taskId}/),
139
+ # while phase-tracker.sh and most Phase 0 paths write it flat; no writer uses
140
+ # ~/.claude/projects/*/state/. ma_resolve_run_file checks both layouts, so a
141
+ # run whose state exists is always found.
144
142
  AGENT_STATE="$(ma_resolve_run_file "$TASK_ID" agent-state.json 2>/dev/null || true)"
145
143
 
146
144
  if [ -z "$AGENT_STATE" ]; then
@@ -235,8 +235,8 @@ function invokedCalls(state, { publicPlugins, manifestPath } = {}) {
235
235
  }
236
236
 
237
237
  // The package declares `os: ["darwin"]` and every entry point refuses a
238
- // non-darwin host, so the branches this used to carry were unreachable. The
239
- // function and the field stay: the panel groups by `os` and a row with the key
238
+ // non-darwin host, so no other platform gets a branch of its own. The
239
+ // function and the field exist because the panel groups by `os` and a row with the key
240
240
  // missing reads as "unknown host" rather than "macOS".
241
241
  function detectOs() {
242
242
  return platform() === "darwin" ? "macos" : platform();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-10-13T23:27:37Z",
4
- "skillCount": 229,
3
+ "generatedAt": "2026-10-14T08:53:17Z",
4
+ "skillCount": 230,
5
5
  "entries": [
6
6
  {
7
7
  "path": "shared/core/apple-archive-compliance/SKILL.md",
@@ -59,6 +59,10 @@
59
59
  "path": "shared/core/multi-agent-create-jira/SKILL.md",
60
60
  "sha256": "5aad0d841e9e5b7140bb441e07819209ca64c5b6fc209d6ad586b5fbb353e377"
61
61
  },
62
+ {
63
+ "path": "shared/core/multi-agent-deps/SKILL.md",
64
+ "sha256": "1c583a47a1c1d66f37a581f0436861e511d1272b5014e1bd15397a4b4d6a8553"
65
+ },
62
66
  {
63
67
  "path": "shared/core/multi-agent-design-check/SKILL.md",
64
68
  "sha256": "8888744fa52e935f53db9a1068e1b18c636b6c9d55b084dabfc19b9ae68bf6f8"
@@ -125,11 +129,11 @@
125
129
  },
126
130
  {
127
131
  "path": "shared/core/multi-agent-model/SKILL.md",
128
- "sha256": "88fe1d5676606058d505bee3273bd20a5027a874122ef5e4de21df9d27ac3c6a"
132
+ "sha256": "57ba710657d74176b0f19d4a97d3183df1f7b0c056eb1eef2792308914be836c"
129
133
  },
130
134
  {
131
135
  "path": "shared/core/multi-agent-postmortem/SKILL.md",
132
- "sha256": "5de52f7cca65656061029427232f95a2de4539564d666a4b8c2e129a92cb7bf8"
136
+ "sha256": "41edd907cbaae1523eab1cd716390c9e9cd889574141cb88c33966e221b0987d"
133
137
  },
134
138
  {
135
139
  "path": "shared/core/multi-agent-prune-logs/SKILL.md",
@@ -169,7 +173,7 @@
169
173
  },
170
174
  {
171
175
  "path": "shared/core/multi-agent-review/SKILL.md",
172
- "sha256": "1a22618e6d3d9d07b267bd61fc591bb33726e1d7ef8567285401f61bc7be0ad5"
176
+ "sha256": "e3a673e13b9b7a227334afe79e20e2be837c0900e16e88003b4692a1d74dea41"
173
177
  },
174
178
  {
175
179
  "path": "shared/core/multi-agent-route-off/SKILL.md",
@@ -177,7 +181,7 @@
177
181
  },
178
182
  {
179
183
  "path": "shared/core/multi-agent-route-on/SKILL.md",
180
- "sha256": "97c76d711454e6bc9edfd47344bbeab7f73cf72c116cca92cffacdcda7fe96b1"
184
+ "sha256": "0435bb53d8c55d20cfdb1bd5ddbd0544bace68041ab45929904d1a38d2f608c6"
181
185
  },
182
186
  {
183
187
  "path": "shared/core/multi-agent-route-status/SKILL.md",
@@ -217,7 +221,7 @@
217
221
  },
218
222
  {
219
223
  "path": "shared/core/multi-agent-setup/SKILL.md",
220
- "sha256": "7fa0771c2da6aae2579fe16f170a2af8c2e8dbd4702e11ac02583ce71bbb63c1"
224
+ "sha256": "28e80bacb521b3c41aac18859ca3921735970b0bf27f064bfc2b496db9f85016"
221
225
  },
222
226
  {
223
227
  "path": "shared/core/multi-agent-stack/SKILL.md",
@@ -237,7 +241,7 @@
237
241
  },
238
242
  {
239
243
  "path": "shared/core/multi-agent-sync/SKILL.md",
240
- "sha256": "1e418fe472a93cc7b4b5bc19ff9e9b8b9d89b545e45d343a643f17a492cb0624"
244
+ "sha256": "76e713bb107d0fa14db67ca3fc67f420a8e831f3c2db85b21fd59acb327f0017"
241
245
  },
242
246
  {
243
247
  "path": "shared/core/multi-agent-test-accessibility/SKILL.md",
@@ -261,7 +265,7 @@
261
265
  },
262
266
  {
263
267
  "path": "shared/core/multi-agent-testflight-validation/SKILL.md",
264
- "sha256": "6bfd1569117bfbacb485d831c0b7f262ebb3a2f9471f6177a646f5ce32c06a25"
268
+ "sha256": "b6c360c330ef0094cd7e7d9624e89624446b048951e43a180766bbe67d1b725c"
265
269
  },
266
270
  {
267
271
  "path": "shared/core/multi-agent-uninstall/SKILL.md",
@@ -273,7 +277,7 @@
273
277
  },
274
278
  {
275
279
  "path": "shared/core/multi-agent/SKILL.md",
276
- "sha256": "a39f712426638e7955db9171c950be720f11c861621884e628c81a0b6a49de5d"
280
+ "sha256": "b2435de3df518efb8ddf9ac89b3089449e46bf55f29220e07a3aa95dfc8cd083"
277
281
  },
278
282
  {
279
283
  "path": "shared/external/accessibility-compliance-accessibility-audit/SKILL.md",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "skillCount": 229,
3
+ "skillCount": 230,
4
4
  "entries": [
5
5
  {
6
6
  "name": "accessibility-compliance-accessibility-audit",
@@ -1146,6 +1146,17 @@
1146
1146
  "triggerPaths": [],
1147
1147
  "relativePath": "shared/core/multi-agent-create-jira/SKILL.md"
1148
1148
  },
1149
+ {
1150
+ "name": "multi-agent-deps",
1151
+ "description": "Bump one dependency, fix only what the bump broke, review, open a PR; rolls back past the fix round cap. SwiftPM, Gradle, npm, pip. Use when a library needs updating.",
1152
+ "platform": null,
1153
+ "group": "core",
1154
+ "plugin": null,
1155
+ "invokeAs": "multi-agent-deps",
1156
+ "triggerKeywords": [],
1157
+ "triggerPaths": [],
1158
+ "relativePath": "shared/core/multi-agent-deps/SKILL.md"
1159
+ },
1149
1160
  {
1150
1161
  "name": "multi-agent-design-check",
1151
1162
  "description": "Mock-mode vs Figma design audit (iOS / Android, local-only). Pick repo + module, gate on mock support, enumerate every state driver into a countable target set, build Debug in a worktree, launch in mock mode, fetch Figma variants, compare each pixel + px-spacing + typography + color, and export a si",
@@ -2,11 +2,11 @@
2
2
 
3
3
  Single source of truth for skills delivered to both Claude Code (`~/.claude/skills/`) and Copilot CLI (`~/.copilot/skills/`) by the installer.
4
4
 
5
- **Total:** 229 skills (68 core + 161 external). Auto-generated by `scripts/gen-skills-index.mjs` - do not edit by hand.
5
+ **Total:** 230 skills (69 core + 161 external). Auto-generated by `scripts/gen-skills-index.mjs` - do not edit by hand.
6
6
 
7
7
  ## Directory layout
8
8
 
9
- - **`core/`** - 68 `multi-agent*` orchestration skills that are pipeline-critical. Edits here are core-code changes.
9
+ - **`core/`** - 69 `multi-agent*` orchestration skills that are pipeline-critical. Edits here are core-code changes.
10
10
  - **`external/`** - 161 iOS / Android / generic skills that ship into the stack plugins. Each names its origin in `metadata.source`: `multi-agent-pipeline` when written here, or the upstream and license a `NOTICE-*.md` in this directory covers.
11
11
  - Install destinations (ADR-0009): Claude Code gets NO local copy of `external/` - it loads those skills from the `multi-agent-plugins` marketplace, namespaced (`ai-<stack>-toolkit:<name>`); only the two compliance catalogs from `core/` land in `~/.claude/skills/`. Copilot CLI and Codex CLI receive a flat copy filtered to the enabled stacks. `external/` remains the single authoring source that `build-stack-plugins.mjs` publishes from.
12
12
 
@@ -14,7 +14,7 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
14
14
 
15
15
  ## Categories
16
16
 
17
- - [Pipeline Orchestration](#pipeline-orchestration) - 68
17
+ - [Pipeline Orchestration](#pipeline-orchestration) - 69
18
18
  - [iOS / Apple Ecosystem](#ios-apple-ecosystem) - 94
19
19
  - [Android / Kotlin](#android-kotlin) - 16
20
20
  - [Web](#web) - 10
@@ -40,6 +40,7 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
40
40
  | [`multi-agent-channels`](./core/multi-agent-channels/) | `core` | Multi-channel reporter - Jira/Confluence/Wiki/PR description. Multi-select channels + content, humanizer pass, reviewer-preserving Bitbuck |
41
41
  | [`multi-agent-complaint-analysis`](./core/multi-agent-complaint-analysis/) | `core` | Customer-complaint triage. Ingests complaints (paste, csv/xlsx/txt/json file, Jira issue, Confluence URL), fetches Graylog evidence per trx/ |
42
42
  | [`multi-agent-create-jira`](./core/multi-agent-create-jira/) | `core` | Create a standards-compliant Jira issue (Task / Bug / Story): asks the type, mines project conventions, drafts from a standard template with |
43
+ | [`multi-agent-deps`](./core/multi-agent-deps/) | `core` | Bump one dependency, fix only what the bump broke, review, open a PR; rolls back past the fix round cap. SwiftPM, Gradle, npm, pip. Use when |
43
44
  | [`multi-agent-design-check`](./core/multi-agent-design-check/) | `core` | Mock-mode vs Figma design audit (iOS / Android, local-only). Pick repo + module, gate on mock support, enumerate every state driver into a c |
44
45
  | [`multi-agent-diff-explain`](./core/multi-agent-diff-explain/) | `core` | Map Phase 3 triage findings to branch diff lines. Read-only post-hoc command, used after review to answer 'which finding lines up with which |
45
46
  | [`multi-agent-doctor`](./core/multi-agent-doctor/) | `core` | Health check for the installed pipeline: layout, preferences, credentials, hooks and host capabilities, each with one actionable step. Exit |
@@ -206,12 +206,12 @@ Per-project input parsing (my-ios-app / my-figma-app / generic), worktree creati
206
206
  ### Phase 1: Plan
207
207
  Two halves, one phase, one approval gate.
208
208
 
209
- **1a - Analysis** (claude-sonnet-5, `explorer` persona)
209
+ **1a - Analysis** (claude-sonnet-5-5, `explorer` persona)
210
210
  1. Launch **explore agents** (parallel) to scan the codebase: related files, existing patterns and conventions, potential impact areas
211
211
  2. Summarize findings
212
212
  3. Log: `📊 Phase 1: Plan (analysis) - {N} files identified, {summary}`
213
213
 
214
- **1b - Planning** (claude-fable-5)
214
+ **1b - Planning** (claude-fable-5-1)
215
215
  1. Create task breakdown → todos with dependencies
216
216
  2. Launch **ios-architect** agent for architecture review (if structural changes)
217
217
  3. Determine development approach per todo (new file, modify, refactor)
@@ -221,7 +221,7 @@ Two halves, one phase, one approval gate.
221
221
  - **5b - Approval loop**: render plan → user: `onayla`/`iptal`/free-text. A free-text edit request → the planning model (Fable) revises the plan → show it again. No iteration cap; user controls exit via `onayla` or `iptal`.
222
222
  - Persist `clarificationRounds`, `clarificationQuestions`, `clarificationAnswers`, `planIterations`, `planApprovedAt`, `planEditRequests` to `state.phases["1"]`.
223
223
 
224
- ### Phase 2: Dev (claude-sonnet-5)
224
+ ### Phase 2: Dev (claude-sonnet-5-5)
225
225
  For each todo (respecting dependency order):
226
226
  1. Update todo status: `in_progress`
227
227
  2. **TDD cycle**: write failing test → verify RED; write minimal code → verify GREEN; refactor if needed
@@ -233,9 +233,9 @@ For each todo (respecting dependency order):
233
233
  ### Phase 3: Review (parallel + triage)
234
234
  0. **Diff Risk Scoring (advisory)** - before reviewer dispatch run `node $HOME/.claude/scripts/diff-risk-score.mjs --base "$BASE_BRANCH" --top 5` and inject the top-N risk-ranked files as a `${PRIORITY_FILES}` block into each reviewer's prompt. Heuristic, deterministic, sub-second, never gates the pipeline. Disabled when `prefs.global.diffRiskAdvisory = false`. Signals: security paths (×3), schema migrations (×4), public API surfaces (×2), no-test-change (×2.5), complexity delta (×1.5), UI-critical paths (×1.5), loc changed (×1).
235
235
  1. Launch **code-reviewer** agents in parallel. Reviewer set depends on which CLI is hosting the pipeline:
236
- - **Claude Code** (3 reviewers): `claude-fable-5` (deep security + architecture) + `claude-opus-5` (edge cases, different perspective) + `claude-sonnet-5` (quality + correctness)
237
- - **Copilot CLI** (3 reviewers): `gpt-5.4` (edge cases, different perspective) + `claude-opus-5` + `claude-sonnet-5` (Fable 5 is not offered on Copilot CLI)
238
- - Triage: single top-tier pass over merged findings (`claude-fable-5` on Claude Code, `claude-opus-5` on Copilot CLI)
236
+ - **Claude Code** (3 reviewers): `claude-fable-5-1` (deep security + architecture) + `claude-opus-5-5` (edge cases, different perspective) + `claude-sonnet-5-5` (quality + correctness)
237
+ - **Copilot CLI** (3 reviewers): `gpt-5.4` (edge cases, different perspective) + `claude-opus-4.7` + `claude-sonnet-4.6` (Fable is not offered on Copilot CLI)
238
+ - Triage: single top-tier pass over merged findings (`claude-fable-5-1` on Claude Code, `claude-opus-4.7` on Copilot CLI)
239
239
  2. Collect findings, classify:
240
240
  - 🔴 **Blocking** → must fix → back to Phase 2 (max 3 iterations)
241
241
  - 🟡 **Important** → fix and re-review
@@ -0,0 +1,60 @@
1
+ ---
2
+ name: multi-agent-deps
3
+ description: "Bump one dependency, fix only what the bump broke, review, open a PR; rolls back past the fix round cap. SwiftPM, Gradle, npm, pip. Use when a library needs updating."
4
+ user-invocable: true
5
+ argument-hint: "[package[@version]] [--major] - no package opens a picker over the outdated candidates; --major allows a breaking bump"
6
+ metadata:
7
+ language: en
8
+ ---
9
+
10
+ # multi-agent deps - bump one dependency and fix what it broke
11
+
12
+ > **Pickers follow** `$HOME/.claude/multi-agent-refs/picker-contract.md`: never a one-option call, and branch on the option selected, not on its text.
13
+
14
+ **Input**: $ARGUMENTS
15
+
16
+ > **Language (read FIRST)**: read `prefs.global.outputLanguage` and render every conversational line in it. `AskUserQuestion` renders `question`, option `label`s and `description`s in `outputLanguage`; only `header` stays English (<=12-char chip). Commit messages and branch names stay English. Full contract: `$HOME/.claude/multi-agent-refs/rules.md` "Language Application".
17
+
18
+ The normal pipeline with a fixed task. Read `$HOME/.claude/multi-agent-refs/features/dep-bump.md` first: it is the contract for every step below (run shape, scope rule, rollback). `dep-bump.mjs` does every deterministic step; never edit a version string or a lockfile by hand.
19
+
20
+ ## Steps
21
+
22
+ 1. **Repo and settings.** Resolve the repo as `/multi-agent` does for a free-text task (`_account-picker.md`, `_repo-picker.md`). Then:
23
+ ```bash
24
+ node "$HOME/.claude/scripts/dep-bump.mjs" config # depBump.maxFixRounds, depBump.queryRegistry
25
+ node "$HOME/.claude/scripts/dep-bump.mjs" detect --dir "$REPO"
26
+ ```
27
+ No ecosystem detected: say so and stop.
28
+
29
+ 2. **Candidates.**
30
+ ```bash
31
+ node "$HOME/.claude/scripts/dep-bump.mjs" list --dir "$REPO" [--registry] # --registry when queryRegistry is true
32
+ ```
33
+ Show `registry.note` and every per-package `note`: an offline listing is reported as offline, never as "nothing outdated".
34
+ - `package@version` given: use it. `package` alone: its `latestInMajor`, else `latest`. Not in the list: stop with the manifests that were read.
35
+ - No package: a single-select picker over the candidates with a newer version, non-breaking first, each option `name current -> target (risk)`. Two or more options per the picker contract; one candidate is confirmed with a yes/no, none means report "nothing newer found" with the registry note.
36
+
37
+ 3. **Major gate.** Risk `major` or `unknown`, or a prerelease target (`prerelease: true`), needs `--major` in the input or an explicit confirmation naming the versions (`Bump anyway` / `Take {latestInMajor} instead` when one exists / `Cancel`). An autopilot run without `--major` takes `latestInMajor` or stops.
38
+
39
+ 4. **Run the pipeline** with `state.mode = "deps"`, `state.taskType = "chore"`, the free-text task `chore(deps): bump {name} from {current} to {target}` and the branch `chore/deps-{name}-{target}` (kebab rules from Phase 0 Step 4). Phase 0 intake, worktree and tracker run as in `/multi-agent`. Then:
40
+ - **Phase 1**: the fixed plan from the feature doc, with the changelog excerpt as evidence:
41
+ ```bash
42
+ node "$HOME/.claude/scripts/dep-bump.mjs" notes --dir "$WORKTREE" --ecosystem E --name N --from A --to B
43
+ ```
44
+ - **Phase 2**: apply first, then the exit gate as written:
45
+ ```bash
46
+ node "$HOME/.claude/scripts/dep-bump.mjs" apply --dir "$WORKTREE" --ecosystem E --name N --to B [--allow-major]
47
+ ```
48
+ Exit 1: report `error` and `lock.output` (or `dirty`: the worktree had uncommitted changes), stop with nothing to commit. Persist the output to `state.depBump`. Green: no dev agent, on to Phase 3. Red: fix rounds, at most `depBump.maxFixRounds`, each dispatched with the failing log tail, `surface` output, the changelog excerpt and the scope rule (feature doc section 4); after each round:
49
+ ```bash
50
+ node "$HOME/.claude/scripts/dep-bump.mjs" scope --dir "$WORKTREE" --log "$GATE_LOG" # the round's build/test log
51
+ ```
52
+ Only the surface recorded by `apply` is in scope. A file listed in `newImporters` with `cited: null` started importing the dependency without an error line behind it: revert it before the next round.
53
+ - **Cap reached and still red** (or still out of scope): `dep-bump.mjs rollback --dir "$WORKTREE"` (restores the manifest, lockfile and fix files; anything under `kept` is reported, not discarded), set `state.depBump.rolledBack = true`, and end with the report from feature doc section 5. No commit, no push, no PR.
54
+ - **Phase 3**: standard review. Each `outOfScope` file without a cited error line, and each `newImporters` entry with `cited: null`, is a blocking finding.
55
+ - **Phase 4**: commit with `commitMessage` from `apply` (plus ` [{jiraId}]` when present). PR body per the feature doc; `Ref:` or `Related:`, never `Closes`, `Fixes` or `Resolves`, and never close an issue.
56
+ - **Phase 5**: channels as in every mode.
57
+
58
+ ## Report
59
+
60
+ In `outputLanguage`, at most 10 lines: the dependency, from and to, risk, lockfile command and result, rounds taken against the cap, files changed (in scope / justified), review verdict, and the PR URL or the rollback reason.
@@ -44,8 +44,8 @@ because it does not mean the same thing on all three:
44
44
 
45
45
  | Host | What `off` does | Why |
46
46
  |---|---|---|
47
- | Claude Code | every `preferredModel: fable` persona (architects, reviewer 1, triage) starts on `opus` | the only host where the rung is Fable 5 |
48
- | Copilot CLI | nothing | Fable 5 is not offered there; its personas never sat on this rung |
47
+ | Claude Code | every `preferredModel: fable` persona (architects, reviewer 1, triage) starts on `opus` | the only host where the rung is Fable 5.1 |
48
+ | Copilot CLI | nothing | Fable is not offered there; its personas never sat on this rung |
49
49
  | Codex CLI | nothing, deliberately | the `fable` rung there means `gpt-5.6 @ xhigh`, a different model on a different account - switching it from a knob named after an Anthropic model would surprise a Codex user |
50
50
 
51
51
  So on two of the three hosts this command is a **status report**, not a switch,
@@ -18,23 +18,26 @@ deterministic indexer; the model only interprets it.
18
18
  **Read-only.** Nothing is sent anywhere: no issue comment, no PR, no channel.
19
19
  The one write is the report itself, saved under the run's log directory.
20
20
 
21
- The indexer reads Claude Code session files (`~/.claude/projects/<dir>/<session>.jsonl`).
22
- On a host that writes none, a run id finds nothing (exit 3); say so and ask for
23
- a transcript path rather than reporting an empty run.
21
+ The indexer reads Claude Code session files (`~/.claude/projects/<dir>/<session>.jsonl`),
22
+ Copilot CLI session logs (`~/.copilot/session-state/<session>/events.jsonl`) and
23
+ Codex rollouts (`~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl`), detecting the
24
+ format per file. Copilot CLI reports tokens per session, so its totals come from
25
+ the shutdown record. When a run id finds nothing (exit 3), say so and ask for a
26
+ transcript path rather than reporting an empty run.
24
27
 
25
28
  ## Steps
26
29
 
27
30
  1. **Resolve the target.**
28
- - A path ending in `.jsonl`: index that file (subagent files beside it are
29
- included). There is no run directory, so nothing is saved unless the user
31
+ - A path ending in `.jsonl` (any of the three hosts): index that file
32
+ (Claude Code subagent files beside it are included). There is no run directory, so nothing is saved unless the user
30
33
  names one.
31
34
  - A task id or `#N`: locate the run and its transcripts:
32
35
  ```bash
33
36
  node "$HOME/.claude/scripts/transcript-index.mjs" --run "<id>" --locate
34
37
  ```
35
38
  `matchedBy: "session"` means the run recorded its session id and the match
36
- is exact. `"time-window"` means it did not, so the files are the sessions
37
- that ran in the run's worktree or checkout while it was active; say that
39
+ is exact. `"time-window"` means it did not, so the files are the sessions,
40
+ on any host, that ran in the run's worktree or checkout while it was active; say that
38
41
  this match is a heuristic. Exit 3 with a `reason`: report the reason, and
39
42
  offer to take a transcript path instead.
40
43
  - No argument: take the most recent run from
@@ -43,14 +43,14 @@ Skip Phase 0-3 and review a diff only. Input shapes: a PR (`#N`, `repo#N`, GitHu
43
43
 
44
44
  **Claude Code (3 in parallel while the fable rung is on, 2 while it is off).** Resolve the fable slots first; this command has no Phase 0:
45
45
  `REVIEW_RUNG=$(bash "$HOME/.claude/lib/model-dispatch.sh" subagent --persona reviewer --default fable)` and the same with `--persona triage` for `TRIAGE_RUNG`. Anything but `fable` drops Agent 1 and runs triage on `TRIAGE_RUNG`.
46
- - Agent 1: `claude-fable-5` → security + architecture (only when `REVIEW_RUNG` is `fable`)
47
- - Agent 2: `claude-opus-5` → edge cases, different perspective
48
- - Agent 3: `claude-sonnet-5` → general quality
46
+ - Agent 1: `claude-fable-5-1` → security + architecture (only when `REVIEW_RUNG` is `fable`)
47
+ - Agent 2: `claude-opus-5-5` → edge cases, different perspective
48
+ - Agent 3: `claude-sonnet-5-5` → general quality
49
49
 
50
50
  **Copilot CLI (3 in parallel):**
51
- - Agent 1: `claude-opus-5` → security + architecture (Fable 5 is not offered on Copilot CLI)
51
+ - Agent 1: `claude-opus-4.7` → security + architecture (Fable is not offered on Copilot CLI)
52
52
  - Agent 2: `gpt-5.4` → edge cases, different perspective
53
- - Agent 3: `claude-sonnet-5` → general quality
53
+ - Agent 3: `claude-sonnet-4.6` → general quality
54
54
 
55
55
  **Codex CLI (3 in parallel, single vendor):**
56
56
  - Agent 1: `gpt-5.6` @ `xhigh` → security + architecture
@@ -29,7 +29,7 @@ honoured only at `bulk-read` and `delegate` and only while `--free` is on.
29
29
 
30
30
  **Rung names are the contract; model ids are not.** `opus` is a rung here and a
31
31
  model id in `cost-table.json`, and the second can change without anyone editing
32
- a rule. Writing `claude-opus-5` into a rule pins a decision to a string that will
32
+ a rule. Writing `claude-opus-5-5` into a rule pins a decision to a string that will
33
33
  go stale.
34
34
 
35
35
  Set rules with:
@@ -322,14 +322,16 @@ On a new machine: (1) `npx @{npm-scope}/multi-agent-pipeline install`; (2) `/mul
322
322
 
323
323
  All tokens are optional in the sense that every service can be answered with Skip - but the ASKING is not optional: the Step 3 sequential loop still walks every missing service one by one (token → author → host). Phase 0 re-asks at runtime only for tokens the user skipped here.
324
324
 
325
- ### Step 8 - Enforcement hooks (optional, Claude Code)
325
+ ### Step 8 - Enforcement hooks (optional)
326
326
 
327
- Offer to merge `$HOME/.claude/templates/claude-hooks.json`: three `PreToolUse` gates that block on a non-zero exit (secret scan, agent-guard, read-size) plus four hooks that block nothing (`PreCompact`, `SessionEnd`, `SessionStart`, `PostToolUse`). What each does: `$HOME/.claude/multi-agent-refs/picker-contract.md`.
327
+ On Claude Code, offer to merge `$HOME/.claude/templates/claude-hooks.json`: three blocking `PreToolUse` gates (secret scan, agent-guard, read-size) plus four non-blocking hooks (`PreCompact`, `SessionEnd`, `SessionStart`, `PostToolUse`). What each does: `$HOME/.claude/multi-agent-refs/picker-contract.md`.
328
328
 
329
329
  - Ask (picker): "Install the pipeline's hooks into `~/.claude/settings.json`?" Default Yes.
330
- - On Yes, deep-merge EVERY event in the template's `hooks` object, not `PreToolUse` alone - merging one event silently drops the capture hooks. Preserve existing hooks; never duplicate a matcher already calling the same script.
331
- - Say what the merge does NOT cover: only the three gates need no run-specific arguments, so only they are hookable; the rest are phase-enforced.
332
- - Say what it does not turn on: the read-size gate is inert until `prefs.global.bulkRead.mode` is set. Recommend `observe` first. Why, and the Phase 3 exemption: `$HOME/.claude/multi-agent-refs/picker-contract.md`.
330
+ - On Yes, deep-merge EVERY event in the template's `hooks` object (merging `PreToolUse` alone drops the capture hooks); keep existing hooks, never duplicate a matcher calling the same script.
331
+ - Say only the three gates are hookable (no run-specific arguments); the rest are phase-enforced.
332
+ - Say the read-size gate stays inert until `prefs.global.bulkRead.mode` is set; recommend `observe` first (why, and the Phase 3 exemption: `picker-contract.md`).
333
+
334
+ Codex: offer only the syntax gate, then run `node "$HOME/.codex/scripts/host-hooks.mjs" install --host codex`. Copilot CLI: offer no hook (it discards `postToolUse` output as of 1.0.45).
333
335
 
334
336
  ### Step 9 - Default stack plugin enablement
335
337
 
@@ -33,7 +33,7 @@ Run all steps automatically:
33
33
  ```
34
34
  Step 0: DOCTOR node $HOME/.claude/scripts/doctor.mjs - exit 2 or 4 STOPS the sync
35
35
  Step 1: DETECT Compare timestamps, find stale targets
36
- Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 65 sub-command skills)
36
+ Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 66 sub-command skills)
37
37
  Step 2b: CODEX Claude Code -> Codex CLI (1 router skill + sub-command specs as refs + agent TOML)
38
38
  Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub)
39
39
  Step 3d: DEV-TOOLKIT Companion MCP server -> detect movement, ship gates, commit + publish
@@ -229,12 +229,12 @@ When invoked with the `release` argument:
229
229
  |-------------|-------------|
230
230
  | `~/.claude/commands/multi-agent/{cmd}/SKILL.md` | `~/.copilot/skills/multi-agent-{cmd}/SKILL.md` |
231
231
 
232
- **65 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
232
+ **66 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
233
233
 
234
234
  ```
235
235
  analysis, analysis-jira, analysis-resolve, autopilot, autopilot-off,
236
236
  autopilot-on, autopilot-status, bug-bash, build-optimize, channels, complaint-analysis,
237
- create-jira, design-check, diff-explain, doctor, estimate, feedback, forget,
237
+ create-jira, deps, design-check, diff-explain, doctor, estimate, feedback, forget,
238
238
  garbage-collect, graph, help, ios-coding-standard, issue, jira, kill,
239
239
  language, log, manual-test, model, postmortem, prune-logs,
240
240
  prune-prompts, purge, refactor, research, resume, review,
@@ -9,10 +9,9 @@ metadata:
9
9
 
10
10
  # multi-agent-testflight-validation - iOS alias for store-ready
11
11
 
12
- This skill is an alias. The implementation it used to carry was merged into
12
+ This skill is an alias. The implementation lives in
13
13
  `multi-agent-store-ready`, which runs the same three gates on iOS and adds the
14
- Android side, so there is one flow to maintain instead of two that had already
15
- started to drift.
14
+ Android side, so there is one flow to maintain instead of two that drift.
16
15
 
17
16
  The name is kept because it is the one people reach for when the target is
18
17
  TestFlight, and removing a surface is a breaking change.
@@ -704,7 +704,7 @@ rules:
704
704
  enforcement: judgement
705
705
  rationale: testability
706
706
  check: >
707
- Two things used to be one rule here, and conflating them pushed modules toward the wrong fix
707
+ Two concerns meet in this rule, and conflating them pushes modules toward the wrong fix
708
708
  in both directions. Separate them:
709
709
  **The failure vocabulary is module-scoped.** The set of ways a call can fail - offline,
710
710
  timeout, unauthorised, not-found, conflict, server, unknown - is one type the whole module
@@ -925,7 +925,7 @@ rules:
925
925
  check: >
926
926
  When the app ships a wrapper for a platform affordance - a sheet, a date picker, a toast -
927
927
  a feature module calls the wrapper, never the OS API underneath. The wrapper exists
928
- because the OS changed the affordance once already and will again: iOS 26 forced a
928
+ because the OS changes the affordance between releases: iOS 26 forced a
929
929
  Liquid-Glass inset onto partial-detent sheets with no opt-out, which put a gap down the
930
930
  side and bottom of every raw `.sheet` and swallowed a pushed picker's selection.
931
931
  The tell that this rule was skipped: one module's sheets look different from the rest of
@@ -3,7 +3,7 @@
3
3
  > Auto-generated by `pipeline/scripts/build-skills-index.mjs` - do not hand-edit.
4
4
  > Regenerate with `node pipeline/scripts/build-skills-index.mjs`.
5
5
 
6
- **229 skills** across 2 groups.
6
+ **230 skills** across 2 groups.
7
7
 
8
8
  | Group | Name | Platform | Description |
9
9
  |-------|------|----------|-------------|
@@ -111,6 +111,7 @@
111
111
  | core | `multi-agent-channels` | - | Multi-channel reporter - Jira/Confluence/Wiki/PR description. Multi-select channels + content, humanizer pass, reviewer-preserving Bitbuck |
112
112
  | core | `multi-agent-complaint-analysis` | - | Customer-complaint triage. Ingests complaints (paste, csv/xlsx/txt/json file, Jira issue, Confluence URL), fetches Graylog evidence per trx/ |
113
113
  | core | `multi-agent-create-jira` | - | Create a standards-compliant Jira issue (Task / Bug / Story): asks the type, mines project conventions, drafts from a standard template with |
114
+ | core | `multi-agent-deps` | - | Bump one dependency, fix only what the bump broke, review, open a PR; rolls back past the fix round cap. SwiftPM, Gradle, npm, pip. Use when |
114
115
  | core | `multi-agent-design-check` | - | Mock-mode vs Figma design audit (iOS / Android, local-only). Pick repo + module, gate on mock support, enumerate every state driver into a c |
115
116
  | core | `multi-agent-diff-explain` | - | Map Phase 3 triage findings to branch diff lines. Read-only post-hoc command, used after review to answer 'which finding lines up with which |
116
117
  | core | `multi-agent-doctor` | - | Health check for the installed pipeline: layout, preferences, credentials, hooks and host capabilities, each with one actionable step. Exit |