@mmerterden/multi-agent-pipeline 10.7.2 → 10.7.4

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 (58) hide show
  1. package/CHANGELOG.md +33 -2
  2. package/README.md +20 -4
  3. package/docs/adr/0001-three-model-triage.md +2 -2
  4. package/docs/adr/0007-multi-tool-adapter-framework.md +1 -1
  5. package/docs/adr/README.md +2 -2
  6. package/docs/architecture.md +14 -14
  7. package/docs/features.md +22 -21
  8. package/docs/performance.md +3 -3
  9. package/index.js +3 -7
  10. package/install/templates/copilot-instructions.md +2 -2
  11. package/package.json +2 -5
  12. package/pipeline/agents/dev-critic.md +1 -1
  13. package/pipeline/agents/task-clarifier.md +1 -3
  14. package/pipeline/claude-md-template.md +1 -1
  15. package/pipeline/commands/multi-agent/dev-autopilot.md +1 -1
  16. package/pipeline/commands/multi-agent/finish.md +2 -2
  17. package/pipeline/commands/multi-agent/help.md +12 -12
  18. package/pipeline/commands/multi-agent/local.md +1 -1
  19. package/pipeline/commands/multi-agent/refs/features/dev-critic.md +1 -1
  20. package/pipeline/commands/multi-agent/refs/features/model-fallback.md +7 -3
  21. package/pipeline/commands/multi-agent/refs/features/shadow-git.md +1 -1
  22. package/pipeline/commands/multi-agent/refs/knowledge.md +1 -1
  23. package/pipeline/commands/multi-agent/refs/phases/log-format.md +1 -1
  24. package/pipeline/commands/multi-agent/refs/phases/modes.md +1 -1
  25. package/pipeline/commands/multi-agent/refs/phases/phase-0-init.md +1 -1
  26. package/pipeline/commands/multi-agent/refs/phases/phase-1-analysis.md +2 -2
  27. package/pipeline/commands/multi-agent/refs/phases/phase-2-planning.md +3 -3
  28. package/pipeline/commands/multi-agent/refs/phases/phase-3-dev.md +2 -2
  29. package/pipeline/commands/multi-agent/refs/phases/phase-4-review.md +18 -18
  30. package/pipeline/commands/multi-agent/refs/progress-contract.md +1 -1
  31. package/pipeline/commands/multi-agent/refs/tracker-contract.md +1 -3
  32. package/pipeline/commands/multi-agent/review.md +8 -8
  33. package/pipeline/commands/multi-agent/sync.md +3 -3
  34. package/pipeline/commands/multi-agent.md +7 -7
  35. package/pipeline/lib/plan-todos.sh +2 -5
  36. package/pipeline/lib/post-pr-review.sh +2 -2
  37. package/pipeline/lib/review-watch.sh +2 -6
  38. package/pipeline/lib/shadow-git.sh +3 -5
  39. package/pipeline/schemas/agent-state.schema.json +1 -1
  40. package/pipeline/schemas/clarify-output.schema.json +1 -1
  41. package/pipeline/schemas/plan-todos.schema.json +1 -1
  42. package/pipeline/schemas/prefs.schema.json +8 -8
  43. package/pipeline/schemas/reviewer-output.schema.json +1 -1
  44. package/pipeline/schemas/triage-output.schema.json +2 -2
  45. package/pipeline/scripts/README.md +1 -2
  46. package/pipeline/scripts/cost-budget-check.mjs +1 -1
  47. package/pipeline/scripts/cost-table.json +7 -0
  48. package/pipeline/scripts/fixtures/install-layout.tsv +5 -5
  49. package/pipeline/scripts/smoke-review-watch.sh +2 -2
  50. package/pipeline/scripts/smoke-shadow-git.sh +1 -1
  51. package/pipeline/scripts/uninstall.mjs +53 -57
  52. package/pipeline/skills/shared/core/multi-agent/SKILL.md +11 -11
  53. package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +1 -1
  54. package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
  55. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +8 -8
  56. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +5 -5
  57. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +7 -5
  58. package/pipeline/scripts/smoke-readme-counts.sh +0 -120
@@ -32,7 +32,7 @@ failures=()
32
32
  record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
33
33
  record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
34
34
 
35
- printf '→ smoke-shadow-git: Cline-style per-tool-call checkpoint contract\n'
35
+ printf '→ smoke-shadow-git: per-tool-call checkpoint contract\n'
36
36
 
37
37
  # 1. Script exists + parses
38
38
  if [ ! -f "$SG" ]; then
@@ -2,15 +2,17 @@
2
2
 
3
3
  /**
4
4
  * @file Token-preserving uninstaller - removes the multi-agent-pipeline
5
- * footprint from Claude Code, Copilot CLI, Cursor, Antigravity, and VS Code
6
- * Copilot Chat without touching personal access tokens stored in the OS credential store
7
- * (macOS Keychain / Windows Credential Manager / Linux libsecret).
5
+ * footprint from Claude Code and Copilot CLI without touching personal access
6
+ * tokens stored in the OS credential store (macOS Keychain / Windows
7
+ * Credential Manager / Linux libsecret). The legacy adapter flags
8
+ * (--cursor / --copilot-chat / --antigravity / --codex) clean up files left
9
+ * behind by pre-v10.7.0 adapter installs; the adapters themselves are gone.
8
10
  *
9
11
  * Invocation:
10
12
  * node uninstall.mjs # interactive, removes from all installed targets
11
13
  * node uninstall.mjs --yes # skip prompts, remove from all
12
14
  * node uninstall.mjs --claude # only Claude Code
13
- * node uninstall.mjs --cursor --target=/path/to/repo
15
+ * node uninstall.mjs --cursor --target=/path/to/repo # legacy adapter-file cleanup
14
16
  * node uninstall.mjs --dry-run # report what would be removed, change nothing
15
17
  *
16
18
  * Targeted by:
@@ -29,12 +31,9 @@
29
31
  */
30
32
 
31
33
  import { existsSync, readdirSync, readFileSync, rmSync, writeFileSync } from "fs";
32
- import { join, dirname } from "path";
33
- import { fileURLToPath } from "url";
34
+ import { join } from "path";
34
35
  import { createInterface } from "readline";
35
36
 
36
- const __dirname = dirname(fileURLToPath(import.meta.url));
37
- const PIPELINE_ROOT = join(__dirname, "..");
38
37
  const HOME = process.env.HOME || process.env.USERPROFILE;
39
38
 
40
39
  const flags = process.argv.slice(2).filter((a) => a !== "uninstall");
@@ -106,6 +105,23 @@ function rmMatchingDirs(parent, predicate) {
106
105
  return count;
107
106
  }
108
107
 
108
+ /**
109
+ * Remove every plain file under `parent` whose name matches a predicate.
110
+ * Used by the legacy adapter cleanup (pre-v10.7.0 generated files).
111
+ * @param {string} parent
112
+ * @param {(name: string) => boolean} predicate
113
+ */
114
+ function rmMatchingFiles(parent, predicate) {
115
+ if (!existsSync(parent)) return 0;
116
+ let count = 0;
117
+ for (const entry of readdirSync(parent, { withFileTypes: true })) {
118
+ if (!entry.isFile()) continue;
119
+ if (!predicate(entry.name)) continue;
120
+ if (rmIfExists(join(parent, entry.name))) count++;
121
+ }
122
+ return count;
123
+ }
124
+
109
125
  /**
110
126
  * Strip a marker-wrapped `<!-- multi-agent-pipeline:begin/end -->` block from
111
127
  * a user-owned file. Preserves everything outside the markers. Deletes the
@@ -287,68 +303,48 @@ async function main() {
287
303
  stripManagedBlock(join(COP, "copilot-instructions.md"));
288
304
  }
289
305
 
306
+ // Legacy adapter-file cleanup (adapters removed in v10.7.0). These blocks
307
+ // delete files a pre-v10.7.0 install generated; they never touch user files
308
+ // outside the multi-agent-* namespace / managed markers.
290
309
  if (forCursor) {
291
310
  console.log("");
292
- console.log(` [Cursor] Removing from ${adapterTarget}...`);
293
- if (!dryRun) {
294
- try {
295
- const adapter = (await import(join(PIPELINE_ROOT, "adapters", "cursor.mjs"))).default;
296
- const result = adapter.uninstall({ target: adapterTarget });
297
- console.log(` removed: ${result.removed} file(s)`);
298
- } catch (e) {
299
- console.log(` skipped (adapter unavailable): ${e.message}`);
300
- }
301
- } else {
302
- report("would invoke", "cursor adapter uninstall");
303
- }
311
+ console.log(` [Cursor - legacy cleanup] Removing from ${adapterTarget}...`);
312
+ const isOurs = (name) => name.startsWith("multi-agent-") || name.startsWith("multi-agent.");
313
+ const n = rmMatchingFiles(join(adapterTarget, ".cursor", "rules"), isOurs);
314
+ if (n > 0) console.log(` removed ${n} rule file(s)`);
315
+ stripManagedBlock(join(adapterTarget, ".cursorrules"));
304
316
  }
305
317
 
306
318
  if (forCopilotChat) {
307
319
  console.log("");
308
- console.log(` [GitHub Copilot Chat] Removing from ${adapterTarget}...`);
309
- if (!dryRun) {
310
- try {
311
- const adapter = (await import(join(PIPELINE_ROOT, "adapters", "copilot-chat.mjs"))).default;
312
- const result = adapter.uninstall({ target: adapterTarget });
313
- console.log(` main: ${result.mainStatus} · per-skill removed: ${result.perSkillRemoved}`);
314
- } catch (e) {
315
- console.log(` skipped (adapter unavailable): ${e.message}`);
316
- }
317
- } else {
318
- report("would invoke", "copilot-chat adapter uninstall");
319
- }
320
+ console.log(` [GitHub Copilot Chat - legacy cleanup] Removing from ${adapterTarget}...`);
321
+ stripManagedBlock(join(adapterTarget, ".github", "copilot-instructions.md"));
322
+ const n = rmMatchingFiles(join(adapterTarget, ".github", "instructions"), (name) =>
323
+ name.startsWith("multi-agent-"),
324
+ );
325
+ if (n > 0) console.log(` removed ${n} instruction file(s)`);
320
326
  }
321
327
 
322
328
  if (forAntigravity) {
323
329
  console.log("");
324
- console.log(` [Antigravity] Removing from ${adapterTarget}...`);
325
- if (!dryRun) {
326
- try {
327
- const adapter = (await import(join(PIPELINE_ROOT, "adapters", "antigravity.mjs"))).default;
328
- const result = adapter.uninstall({ target: adapterTarget });
329
- console.log(` .agent + AGENTS.md artifacts removed: ${result.removed}`);
330
- } catch (e) {
331
- console.log(` skipped (adapter unavailable): ${e.message}`);
332
- }
333
- } else {
334
- report("would invoke", "antigravity adapter uninstall");
335
- }
330
+ console.log(` [Antigravity - legacy cleanup] Removing from ${adapterTarget}...`);
331
+ const isOurs = (name) => name.startsWith("multi-agent-") || name.startsWith("multi-agent.");
332
+ let n = rmMatchingFiles(join(adapterTarget, ".agent", "rules"), isOurs);
333
+ n += rmMatchingFiles(join(adapterTarget, ".agent", "workflows"), isOurs);
334
+ if (n > 0) console.log(` removed ${n} .agent file(s)`);
335
+ stripManagedBlock(join(adapterTarget, "AGENTS.md"));
336
+ if (existsSync(join(adapterTarget, ".agent", "mcp_config.json")))
337
+ console.log(" note: .agent/mcp_config.json left untouched (may hold user servers) - remove pipeline entries manually if present");
336
338
  }
337
339
 
338
- if (forCodex) {
340
+ if (forCodex && HOME) {
339
341
  console.log("");
340
- console.log(" [OpenAI Codex CLI] Removing from ~/.codex...");
341
- if (!dryRun) {
342
- try {
343
- const adapter = (await import(join(PIPELINE_ROOT, "adapters", "codex.mjs"))).default;
344
- const result = adapter.uninstall();
345
- console.log(` ~/.codex artifacts removed: ${result.removed}`);
346
- } catch (e) {
347
- console.log(` skipped (adapter unavailable): ${e.message}`);
348
- }
349
- } else {
350
- report("would invoke", "codex adapter uninstall");
351
- }
342
+ console.log(" [OpenAI Codex CLI - legacy cleanup] Removing from ~/.codex...");
343
+ const CODEX = join(HOME, ".codex");
344
+ rmIfExists(join(CODEX, "prompts", "multi-agent.md"));
345
+ stripManagedBlock(join(CODEX, "AGENTS.md"));
346
+ if (existsSync(join(CODEX, "config.toml")))
347
+ console.log(" note: ~/.codex/config.toml left untouched (may hold user MCP servers) - remove pipeline entries manually if present");
352
348
  }
353
349
 
354
350
  console.log("");
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: multi-agent
3
3
  language: en
4
- description: "Task orchestrator: runs the full pipeline from a Jira ID or GitHub Issue URL - analysis → plan → TDD development → parallel review (Opus + Sonnet on Claude Code, GPT + Opus + Sonnet on Copilot CLI) → commit → log. Every step is written to agent-log.md."
4
+ description: "Task orchestrator: runs the full pipeline from a Jira ID or GitHub Issue URL - analysis → plan → TDD development → parallel review (Fable + Sonnet on Claude Code, GPT + Opus + Sonnet on Copilot CLI) → commit → log. Every step is written to agent-log.md."
5
5
  user-invocable: true
6
6
  argument-hint: '"PROJ-12345" "feature/PROJ-12345-flight-filter" | "https://github.com/.../issues/316" | status | log #1 | resume #1 | kill #1 | clear-logs | purge | review'
7
7
  ---
@@ -397,7 +397,7 @@ Full contract: `refs/tracker-contract.md` section "TaskCreate ordering (strict)"
397
397
 
398
398
  **IMPORTANT**: Update `agent-state.json` at EVERY phase transition. This file is the resume source of truth.
399
399
 
400
- ### Phase 1: Analysis (claude-opus-4.6)
400
+ ### Phase 1: Analysis (claude-fable-5)
401
401
  1. Launch **explore agents** (parallel) to scan codebase:
402
402
  - Related files to the task
403
403
  - Existing patterns and conventions
@@ -406,17 +406,17 @@ Full contract: `refs/tracker-contract.md` section "TaskCreate ordering (strict)"
406
406
  3. Summarize findings
407
407
  4. Log: `📊 Phase 1: Analysis - {N} files identified, {summary}`
408
408
 
409
- ### Phase 2: Planning (claude-opus-4.6)
409
+ ### Phase 2: Planning (claude-fable-5)
410
410
  1. Create task breakdown → todos with dependencies
411
411
  2. Launch **ios-architect** agent for architecture review (if structural changes)
412
412
  3. Determine development approach per todo (new file, modify, refactor)
413
413
  4. Log: `🧠 Phase 2: Plan - {N} todos created`
414
414
  5. **Plan Approval Gate** (normal mode only - skipped for `--dev`, `autopilot`, `--dev autopilot`). Full flow in `refs/phases/phase-2-planning.md` Step 5:
415
415
  - **5a - Clarification** (conditional, max 2 rounds): if the Jira/issue description is ambiguous (vague acceptance, UI task without Figma, API task without endpoint contract, `ambiguityScore >= 2`, parent-story scope drift), ask structured questions before rendering the plan. User answers → plan regenerated. If it is still unclear after the 2nd round, render the plan with a "best-effort" banner.
416
- - **5b - Approval loop**: render plan → user: `onayla`/`iptal`/free-text. A free-text edit request → Opus revises the plan → show it again. No iteration cap; user controls exit via `onayla` or `iptal`.
416
+ - **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`.
417
417
  - Persist `clarificationRounds`, `clarificationQuestions`, `clarificationAnswers`, `planIterations`, `planApprovedAt`, `planEditRequests` to `state.phases["2"]`.
418
418
 
419
- ### Phase 3: Dev (claude-sonnet-4.6)
419
+ ### Phase 3: Dev (claude-sonnet-4-6)
420
420
  For each todo (respecting dependency order):
421
421
  1. Update todo status: `in_progress`
422
422
  2. **TDD cycle**:
@@ -431,9 +431,9 @@ For each todo (respecting dependency order):
431
431
  ### Phase 4: Review (parallel + triage)
432
432
  0. **Diff Risk Scoring (advisory, v8.3+)** - before reviewer dispatch run `node pipeline/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).
433
433
  1. Launch **code-reviewer** agents in parallel. Reviewer set depends on which CLI is hosting the pipeline:
434
- - **Claude Code** (2 reviewers): `claude-opus-4.6` (deep security + architecture) + `claude-sonnet-4.6` (quality + correctness)
435
- - **Copilot CLI** (3 reviewers): `gpt-5.4` (edge cases, different perspective) + `claude-opus-4.6` + `claude-sonnet-4.6`
436
- - Triage (both CLIs): single `claude-opus-4.6` pass over merged findings
434
+ - **Claude Code** (2 reviewers): `claude-fable-5` (deep security + architecture) + `claude-sonnet-4-6` (quality + correctness)
435
+ - **Copilot CLI** (3 reviewers): `gpt-5.4` (edge cases, different perspective) + `claude-opus-4-8` + `claude-sonnet-4-6` (Fable 5 is not offered on Copilot CLI)
436
+ - Triage: single top-tier pass over merged findings (`claude-fable-5` on Claude Code, `claude-opus-4-8` on Copilot CLI)
437
437
  2. Collect findings, classify:
438
438
  - 🔴 **Blocking** → must fix → back to Phase 3 (max 3 iterations)
439
439
  - 🟡 **Important** → fix and re-review
@@ -872,11 +872,11 @@ First show how it works:
872
872
  ```
873
873
  🤖 How it works (8 phases):
874
874
  0. Init - Project detection, worktree creation, state file
875
- 1. Analysis - Codebase scan (parallel explore agents, Opus)
875
+ 1. Analysis - Codebase scan (parallel explore agents, Fable)
876
876
  2. Planning - Task breakdown, architecture review, user approval
877
877
  3. Dev - TDD loop: write test → write code → build (Sonnet)
878
- 4. Review - Parallel review + Opus triage. Reviewer set by CLI:
879
- • Claude Code → Opus + Sonnet (2 parallel)
878
+ 4. Review - Parallel review + Fable triage. Reviewer set by CLI:
879
+ • Claude Code → Fable + Sonnet (2 parallel)
880
880
  • Copilot CLI → GPT-5.4 + Opus + Sonnet (3 parallel)
881
881
  5. Test - Optional: switch to the branch, manual test in Xcode
882
882
  6. Commit - Commit + push + PR + issue body update (PR links + progress flags)
@@ -35,7 +35,7 @@ Phase 7: Report → Short terminal summary
35
35
 
36
36
  1. **Parse the input** - Normal multi-agent formats (Issue URL, Jira ID, free-text)
37
37
  2. **Phase 0: Init** - `"mode": "dev", "autopilot": true` in `agent-state.json`
38
- 3. **Phase 3: Dev** - Write code + build directly with `claude-opus-4.6`
38
+ 3. **Phase 3: Dev** - Write code + build directly with `claude-opus-4-8`
39
39
  4. **Phase 6: Commit** - Create automatic commit + push + PR
40
40
  5. **Phase 7: Report** - Terminal summary
41
41
 
@@ -13,7 +13,7 @@ You already wrote (and maybe hand-tested) the change on the current branch - o
13
13
 
14
14
  ```
15
15
  Phase 0: Init → project/branch detect, resolve base + diff (work already done), Jira id, state (NO worktree)
16
- Phase 4: Review → deterministic gates + parallel review + Opus triage
16
+ Phase 4: Review → deterministic gates + parallel review + Fable triage
17
17
  Phase 5: Build+Test → stack-aware build + run existing tests; SUCCESS required (automated gate, not the interactive user-test)
18
18
  Phase 6: Commit → commit remaining changes + push + open PR if none exists
19
19
  Phase 7: Report → technical analysis + Jira comment with test scenarios (channels: Jira / PR / Confluence / Wiki)
@@ -59,11 +59,11 @@ How It Works (Phase 0 - Interactive Flow):
59
59
  Pipeline (after Phase 0):
60
60
 
61
61
  Phase 0: Init -> The 8 steps above
62
- Phase 1: Analysis -> Stack detection + codebase scan (Opus)
62
+ Phase 1: Analysis -> Stack detection + codebase scan (Fable)
63
63
  Phase 2: Planning -> Task breakdown + architecture review + Plan Approval Gate
64
64
  Phase 3: Dev -> TDD: test -> code -> build (Sonnet) + build queue
65
- Phase 4: Review -> Deterministic gates + parallel AI review + Opus triage
66
- (Claude Code: Opus + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
65
+ Phase 4: Review -> Deterministic gates + parallel AI review + Fable triage
66
+ (Claude Code: Fable + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
67
67
  Phase 5: Test -> Optional: switch to branch, test in Xcode
68
68
  Phase 6: Commit -> Commit -> push -> PR + issue body update (never auto-closes)
69
69
  Phase 7: Report -> Channels dispatcher (PR · Jira · Confluence · Wiki, multi-select)
@@ -75,7 +75,7 @@ Pipeline (after Phase 0):
75
75
 
76
76
  Modes:
77
77
 
78
- (normal) Full 8 phases, parallel review + Opus triage
78
+ (normal) Full 8 phases, parallel review + Fable triage
79
79
  --dev Fast: Init -> Dev(Opus) -> Commit -> Report (no plan gate)
80
80
  --local No worktree - works directly on local branch
81
81
  autopilot Skip all confirmations (EXCEPT Phase 7 channels menu)
@@ -194,11 +194,11 @@ Nasıl Çalışır (Phase 0 - İnteraktif Akış):
194
194
  Pipeline (Phase 0'dan sonra):
195
195
 
196
196
  Phase 0: Init -> Yukarıdaki 8 adım
197
- Phase 1: Analysis -> Stack tespiti + codebase taraması (Opus)
197
+ Phase 1: Analysis -> Stack tespiti + codebase taraması (Fable)
198
198
  Phase 2: Planning -> Task kırılımı + mimari inceleme + Plan Onay Kapısı
199
199
  Phase 3: Dev -> TDD: test -> kod -> build (Sonnet) + build queue
200
- Phase 4: Review -> Deterministik kapılar + paralel AI review + Opus triage
201
- (Claude Code: Opus + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
200
+ Phase 4: Review -> Deterministik kapılar + paralel AI review + Fable triage
201
+ (Claude Code: Fable + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
202
202
  Phase 5: Test -> Opsiyonel: branch'e geç, Xcode'da test
203
203
  Phase 6: Commit -> Commit -> push -> PR + issue body güncelleme (hiç auto-close yok)
204
204
  Phase 7: Report -> Channels dispatcher (PR · Jira · Confluence · Wiki, multi-select)
@@ -210,7 +210,7 @@ Pipeline (Phase 0'dan sonra):
210
210
 
211
211
  Modlar:
212
212
 
213
- (normal) Tam 8 faz, paralel review + Opus triage
213
+ (normal) Tam 8 faz, paralel review + Fable triage
214
214
  --dev Hızlı: Init -> Dev(Opus) -> Commit -> Report (plan gate yok)
215
215
  --local Worktree yok - doğrudan local branch'te çalışır
216
216
  autopilot Tüm onayları atla (İSTİSNA: Phase 7 channels menüsü)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: multi-agent-review
3
3
  language: en
4
- description: "Run parallel review on the current branch's diff: 2 models on Claude Code (Opus + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). Review-only slice of the pipeline."
4
+ description: "Run parallel review on the current branch's diff: 2 models on Claude Code (Fable + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). Review-only slice of the pipeline."
5
5
  user-invocable: true
6
6
  argument-hint: "[branch] - optional: branch to review. If omitted, the current branch is used."
7
7
  ---
@@ -27,13 +27,13 @@ Skip Phase 0-3 and review the current diff only.
27
27
  3. **Start parallel reviewers** - reviewer set depends on the host CLI:
28
28
 
29
29
  **Claude Code (2 in parallel):**
30
- - Agent 1: `claude-opus-4.6` → security + architecture
31
- - Agent 2: `claude-sonnet-4.6` → general quality
30
+ - Agent 1: `claude-fable-5` → security + architecture
31
+ - Agent 2: `claude-sonnet-4-6` → general quality
32
32
 
33
33
  **Copilot CLI (3 in parallel):**
34
- - Agent 1: `claude-opus-4.6` → security + architecture
34
+ - Agent 1: `claude-opus-4-8` → security + architecture (Fable 5 is not offered on Copilot CLI)
35
35
  - Agent 2: `gpt-5.4` → edge cases, different perspective
36
- - Agent 3: `claude-sonnet-4.6` → general quality
36
+ - Agent 3: `claude-sonnet-4-6` → general quality
37
37
 
38
38
  4. **Store-compliance cross-reference** - if iOS/Android release-relevant files changed, the matching catalog is loaded:
39
39
 
@@ -33,7 +33,7 @@ Run all steps automatically:
33
33
  Step 0: FIGMA_SYNC (opt-in) pipeline/scripts/sync-figma-source.sh
34
34
  -- incremental pull from upstream if figmaSource.path is set
35
35
  Step 1: DETECT Compare timestamps, find stale targets
36
- Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 26 sub-command skills)
36
+ Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 35 sub-command skills)
37
37
  Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub)
38
38
  Step 4: WEBSITE Version + phase/model counts -> {website-host} (i18n + projects.ts)
39
39
  Step 5: REMOTE Pipeline references -> remote-control README
@@ -158,12 +158,14 @@ When invoked with the `release` argument:
158
158
  |-------------|-------------|
159
159
  | `~/.claude/commands/multi-agent/{cmd}.md` | `~/.copilot/skills/multi-agent-{cmd}/SKILL.md` |
160
160
 
161
- **26 commands are synced** (v7.0.0+ canonical inventory - must match `cross-cli-contract.md` section1, drift = contract violation):
161
+ **35 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
162
162
 
163
163
  ```
164
- autopilot, channels, dev, dev-autopilot, dev-local, dev-local-autopilot,
165
- help, issue, jira, kill, local, local-autopilot, log, manual-test, purge,
166
- refactor, resume, review, scan, search, setup, stack, status, sync, test, update
164
+ analysis, analysis-resolve, autopilot, build-optimize, channels, delete, dev,
165
+ dev-autopilot, dev-local, dev-local-autopilot, diff-explain, finish, garbage-collect,
166
+ help, issue, jira, kill, language, local, local-autopilot, log, manual-test,
167
+ prune-logs, purge, refactor, resume, review, scan, search, setup, stack, status,
168
+ sync, test, update
167
169
  ```
168
170
 
169
171
  **NOT synced**: `refs/*` - Lazy-load references, Claude Code specific
@@ -1,120 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-readme-counts.sh - fail when README "Current at-a-glance" counts drift
3
- # from the actual filesystem. The table is hand-edited; without this gate it
4
- # silently goes stale every time a smoke / skill / schema is added or removed.
5
- #
6
- # Each row is checked independently. Compute the live value, parse the README
7
- # value, fail if they differ. Output the exact table line so the fix is a
8
- # one-line edit.
9
- #
10
- # Exit 0 = every count matches reality, 1 = at least one row drifted.
11
-
12
- set -uo pipefail
13
-
14
- ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
15
- README="$ROOT/README.md"
16
-
17
- pass=0
18
- fail=0
19
- failures=()
20
- record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
21
- record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
22
-
23
- printf '→ smoke-readme-counts: README "at-a-glance" table matches filesystem\n'
24
-
25
- [ -f "$README" ] || { record_fail "README.md missing"; exit 1; }
26
-
27
- # Helper: extract the integer at the end of a markdown table row whose first
28
- # cell starts with the given prefix. Examples of expected rows:
29
- # "| Smoke suites | 73 |"
30
- # "| Total `SKILL.md` files across all groups | 195 |"
31
- parse_count() {
32
- local prefix_pattern="$1"
33
- # Use grep -E for the line match (more predictable than awk's match()),
34
- # then strip everything that isn't the trailing integer cell.
35
- local row
36
- row=$(grep -E "$prefix_pattern" "$README" | head -1)
37
- [ -z "$row" ] && { echo "PARSE_ERROR"; return; }
38
- # The integer is the last `| <digits> |` cell on the row.
39
- echo "$row" | grep -oE '\| *[0-9]+ *\|' | tail -1 | grep -oE '[0-9]+'
40
- }
41
-
42
- check_count() {
43
- local label="$1" actual="$2" prefix_pattern="$3"
44
- local declared
45
- declared=$(parse_count "$prefix_pattern")
46
- if [ -z "$declared" ] || [ "$declared" = "PARSE_ERROR" ]; then
47
- record_fail "$label: README row missing or unparseable (pattern: $prefix_pattern)"
48
- return
49
- fi
50
- if [ "$declared" = "$actual" ]; then
51
- record_pass "$label: README $declared matches actual $actual"
52
- else
53
- record_fail "$label: README claims $declared but actual is $actual"
54
- fi
55
- }
56
-
57
- # --- Compute live counts -----------------------------------------------------
58
-
59
- # Slash commands: every .md in commands/multi-agent/ that is NOT an internal
60
- # `_`-prefixed picker fragment.
61
- SLASH=$(ls "$ROOT"/pipeline/commands/multi-agent/*.md 2>/dev/null \
62
- | xargs -n1 basename | grep -v '^_' | wc -l | tr -d ' ')
63
-
64
- # Copilot skills: skill dirs whose SKILL.md frontmatter is `name: multi-agent-*`
65
- # AND `user-invocable: true`. Mirrors the Claude Code slash-command surface.
66
- COPILOT=$(grep -lE '^name: multi-agent-' "$ROOT"/pipeline/skills/shared/core/*/SKILL.md 2>/dev/null \
67
- | xargs grep -l '^user-invocable: true' 2>/dev/null | wc -l | tr -d ' ')
68
-
69
- # Figma skills: SKILL.md count under figma-{common,ios,android}.
70
- FIGMA=$(find "$ROOT"/pipeline/skills/figma-common "$ROOT"/pipeline/skills/figma-ios "$ROOT"/pipeline/skills/figma-android \
71
- -name SKILL.md 2>/dev/null | wc -l | tr -d ' ')
72
-
73
- # External skill catalog: subdirectories of shared/external/.
74
- EXTERNAL=$(ls -d "$ROOT"/pipeline/skills/shared/external/*/ 2>/dev/null | wc -l | tr -d ' ')
75
-
76
- # Total SKILL.md files: every SKILL.md anywhere under pipeline/skills/.
77
- TOTAL_SKILLS=$(find "$ROOT"/pipeline/skills -name SKILL.md 2>/dev/null | wc -l | tr -d ' ')
78
-
79
- # Smoke suites: every smoke-*.sh in pipeline/scripts/.
80
- SMOKES=$(ls "$ROOT"/pipeline/scripts/smoke-*.sh 2>/dev/null | wc -l | tr -d ' ')
81
-
82
- # Eval-triage fixtures: subdirs in pipeline/eval/triage/ whose names start with
83
- # a digit (the numbered fixture pattern, e.g. `01-empty-findings`).
84
- EVAL_TRIAGE=$(ls -d "$ROOT"/pipeline/eval/triage/[0-9]* 2>/dev/null | wc -l | tr -d ' ')
85
-
86
- # JSON schemas (excluding token-budget.json which is a config, not a schema).
87
- SCHEMAS=$(ls "$ROOT"/pipeline/schemas/*.schema.json 2>/dev/null | wc -l | tr -d ' ')
88
-
89
- # Agent personas: every .md under pipeline/agents/.
90
- AGENTS=$(find "$ROOT"/pipeline/agents -name '*.md' 2>/dev/null | wc -l | tr -d ' ')
91
-
92
- # Store-compliance skills (apple-archive-compliance + google-play-compliance).
93
- COMPLIANCE=$(ls -d "$ROOT"/pipeline/skills/shared/core/apple-archive-compliance "$ROOT"/pipeline/skills/shared/core/google-play-compliance 2>/dev/null | wc -l | tr -d ' ')
94
-
95
- # Golden-task fixtures.
96
- GOLDEN=$(ls -d "$ROOT"/pipeline/eval/golden-tasks/[0-9]* 2>/dev/null | wc -l | tr -d ' ')
97
-
98
- # --- Verify each row ---------------------------------------------------------
99
-
100
- check_count "slash commands" "$SLASH" '^\| Slash commands \(colon-form'
101
- check_count "Copilot skills" "$COPILOT" '^\| Copilot skills \(dash-form'
102
- check_count "store-compliance" "$COMPLIANCE" '^\| Store-compliance skills'
103
- check_count "figma skills" "$FIGMA" '^\| Figma skills'
104
- check_count "external catalog" "$EXTERNAL" '^\| External skill catalog'
105
- check_count "total SKILL.md" "$TOTAL_SKILLS" '^\| Total `SKILL\.md`'
106
- check_count "smoke suites" "$SMOKES" '^\| Smoke suites'
107
- check_count "golden-task fixtures" "$GOLDEN" '^\| Golden-task fixtures'
108
- check_count "eval-triage fixtures" "$EVAL_TRIAGE" '^\| Eval-triage fixtures'
109
- check_count "JSON schemas" "$SCHEMAS" '^\| JSON schemas'
110
- check_count "agent personas" "$AGENTS" '^\| Agent personas'
111
-
112
- # --- Summary -----------------------------------------------------------------
113
- total=$((pass + fail))
114
- printf '\n→ smoke-readme-counts: %d/%d passed\n' "$pass" "$total"
115
- if [ "$fail" -ne 0 ]; then
116
- printf '\nFailures (one-line README fix per row):\n'
117
- for f in "${failures[@]}"; do printf ' - %s\n' "$f"; done
118
- exit 1
119
- fi
120
- exit 0