@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.
- package/CHANGELOG.md +33 -2
- package/README.md +20 -4
- package/docs/adr/0001-three-model-triage.md +2 -2
- package/docs/adr/0007-multi-tool-adapter-framework.md +1 -1
- package/docs/adr/README.md +2 -2
- package/docs/architecture.md +14 -14
- package/docs/features.md +22 -21
- package/docs/performance.md +3 -3
- package/index.js +3 -7
- package/install/templates/copilot-instructions.md +2 -2
- package/package.json +2 -5
- package/pipeline/agents/dev-critic.md +1 -1
- package/pipeline/agents/task-clarifier.md +1 -3
- package/pipeline/claude-md-template.md +1 -1
- package/pipeline/commands/multi-agent/dev-autopilot.md +1 -1
- package/pipeline/commands/multi-agent/finish.md +2 -2
- package/pipeline/commands/multi-agent/help.md +12 -12
- package/pipeline/commands/multi-agent/local.md +1 -1
- package/pipeline/commands/multi-agent/refs/features/dev-critic.md +1 -1
- package/pipeline/commands/multi-agent/refs/features/model-fallback.md +7 -3
- package/pipeline/commands/multi-agent/refs/features/shadow-git.md +1 -1
- package/pipeline/commands/multi-agent/refs/knowledge.md +1 -1
- package/pipeline/commands/multi-agent/refs/phases/log-format.md +1 -1
- package/pipeline/commands/multi-agent/refs/phases/modes.md +1 -1
- package/pipeline/commands/multi-agent/refs/phases/phase-0-init.md +1 -1
- package/pipeline/commands/multi-agent/refs/phases/phase-1-analysis.md +2 -2
- package/pipeline/commands/multi-agent/refs/phases/phase-2-planning.md +3 -3
- package/pipeline/commands/multi-agent/refs/phases/phase-3-dev.md +2 -2
- package/pipeline/commands/multi-agent/refs/phases/phase-4-review.md +18 -18
- package/pipeline/commands/multi-agent/refs/progress-contract.md +1 -1
- package/pipeline/commands/multi-agent/refs/tracker-contract.md +1 -3
- package/pipeline/commands/multi-agent/review.md +8 -8
- package/pipeline/commands/multi-agent/sync.md +3 -3
- package/pipeline/commands/multi-agent.md +7 -7
- package/pipeline/lib/plan-todos.sh +2 -5
- package/pipeline/lib/post-pr-review.sh +2 -2
- package/pipeline/lib/review-watch.sh +2 -6
- package/pipeline/lib/shadow-git.sh +3 -5
- package/pipeline/schemas/agent-state.schema.json +1 -1
- package/pipeline/schemas/clarify-output.schema.json +1 -1
- package/pipeline/schemas/plan-todos.schema.json +1 -1
- package/pipeline/schemas/prefs.schema.json +8 -8
- package/pipeline/schemas/reviewer-output.schema.json +1 -1
- package/pipeline/schemas/triage-output.schema.json +2 -2
- package/pipeline/scripts/README.md +1 -2
- package/pipeline/scripts/cost-budget-check.mjs +1 -1
- package/pipeline/scripts/cost-table.json +7 -0
- package/pipeline/scripts/fixtures/install-layout.tsv +5 -5
- package/pipeline/scripts/smoke-review-watch.sh +2 -2
- package/pipeline/scripts/smoke-shadow-git.sh +1 -1
- package/pipeline/scripts/uninstall.mjs +53 -57
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +11 -11
- package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +8 -8
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +5 -5
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +7 -5
- 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:
|
|
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
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
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
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
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
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
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 (
|
|
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-
|
|
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-
|
|
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 →
|
|
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
|
|
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-
|
|
435
|
-
- **Copilot CLI** (3 reviewers): `gpt-5.4` (edge cases, different perspective) + `claude-opus-4
|
|
436
|
-
- Triage (
|
|
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,
|
|
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 +
|
|
879
|
-
• Claude Code →
|
|
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
|
|
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 +
|
|
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 (
|
|
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 +
|
|
66
|
-
(Claude Code:
|
|
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 +
|
|
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ı (
|
|
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 +
|
|
201
|
-
(Claude Code:
|
|
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 +
|
|
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 (
|
|
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-
|
|
31
|
-
- Agent 2: `claude-sonnet-4
|
|
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
|
|
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
|
|
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 +
|
|
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
|
-
**
|
|
161
|
+
**35 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
|
|
162
162
|
|
|
163
163
|
```
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|