@mmerterden/multi-agent-pipeline 16.18.0 → 16.20.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.
- package/CHANGELOG.md +68 -0
- package/README.md +5 -5
- package/README.tr.md +2 -2
- package/docs/FIGMA_PIPELINE.md +1 -1
- package/docs/adr/0001-three-model-triage.md +4 -2
- package/docs/architecture.md +2 -2
- package/docs/ecosystem.md +13 -11
- package/docs/features.md +2 -2
- package/index.js +1 -1
- package/install/_codex-agents.mjs +2 -2
- package/install/_common.mjs +25 -1
- package/install/_dev-only-files.mjs +3 -2
- package/install/_mcp-register.mjs +4 -3
- package/install/_plugin-skills.mjs +1 -3
- package/install/copilot.mjs +18 -9
- package/install/index.mjs +2 -4
- package/install/templates/copilot-instructions.md +7 -7
- package/package.json +4 -3
- package/pipeline/agents/android-architect.md +1 -0
- package/pipeline/agents/backend-architect.md +1 -0
- package/pipeline/agents/code-reviewer.md +1 -0
- package/pipeline/agents/dev-critic.md +2 -1
- package/pipeline/agents/explorer.md +1 -0
- package/pipeline/agents/ios-architect.md +1 -0
- package/pipeline/agents/security-auditor.md +1 -0
- package/pipeline/agents/task-clarifier.md +1 -0
- package/pipeline/claude-md-template.md +2 -2
- package/pipeline/commands/multi-agent/SKILL.md +5 -5
- package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/design-check/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/help/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/manual-test/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/resume/SKILL.md +1 -0
- package/pipeline/commands/multi-agent/review/SKILL.md +27 -14
- package/pipeline/commands/multi-agent/review-analysis/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +24 -2
- package/pipeline/commands/multi-agent/sync/SKILL.md +2 -2
- package/pipeline/commands/sim-test.md +64 -20
- package/pipeline/lib/credential-inventory.sh +15 -2
- package/pipeline/lib/credential-store-resolver.sh +14 -4
- package/pipeline/lib/credential-store.sh +8 -2
- package/pipeline/lib/extract-conventions.sh +1 -14
- package/pipeline/lib/fetch-confluence.sh +12 -4
- package/pipeline/lib/fetch-crashlytics.sh +11 -8
- package/pipeline/lib/fetch-document.sh +1 -1
- package/pipeline/lib/fetch-figma-annotations.sh +7 -5
- package/pipeline/lib/fetch-fortify.sh +5 -3
- package/pipeline/lib/fetch-graylog.sh +5 -3
- package/pipeline/lib/figma-mcp-refresh.sh +1 -1
- package/pipeline/lib/figma-screenshot.sh +27 -24
- package/pipeline/lib/figma-token.sh +8 -4
- package/pipeline/lib/issue-fetcher.sh +0 -1
- package/pipeline/lib/jira-publish.sh +7 -5
- package/pipeline/lib/md2confluence-v3.py +13 -7
- package/pipeline/lib/multi-repo-pipeline.sh +18 -8
- package/pipeline/lib/plan-todos.sh +11 -0
- package/pipeline/lib/post-pr-review.sh +9 -2
- package/pipeline/lib/repo-cache.sh +18 -10
- package/pipeline/lib/review-watch.sh +60 -14
- package/pipeline/lib/shadow-git.sh +8 -4
- package/pipeline/lib/vercel-deploy.sh +2 -2
- package/pipeline/multi-agent-refs/_dev-context.md +5 -2
- package/pipeline/multi-agent-refs/analysis/locked.md +4 -4
- package/pipeline/multi-agent-refs/analysis/render.md +1 -1
- package/pipeline/multi-agent-refs/channels/pr.md +22 -4
- package/pipeline/multi-agent-refs/cross-cli-contract.md +1 -1
- package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +15 -2
- package/pipeline/multi-agent-refs/features/review-delta.md +89 -0
- package/pipeline/multi-agent-refs/features/scope-check.md +41 -0
- package/pipeline/multi-agent-refs/features/verify-by-test.md +6 -5
- package/pipeline/multi-agent-refs/features/worktree-finalize.md +1 -1
- package/pipeline/multi-agent-refs/outside-the-pipeline.md +6 -6
- package/pipeline/multi-agent-refs/payload-contracts.md +1 -1
- package/pipeline/multi-agent-refs/phases/log-format.md +1 -1
- package/pipeline/multi-agent-refs/phases/modes.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +4 -2
- package/pipeline/multi-agent-refs/phases/phase-1-analysis.md +3 -3
- package/pipeline/multi-agent-refs/phases/phase-2-planning.md +5 -5
- package/pipeline/multi-agent-refs/phases/phase-3-dev.md +17 -2
- package/pipeline/multi-agent-refs/phases/phase-4-review.md +67 -24
- package/pipeline/multi-agent-refs/phases/phase-5-test.md +10 -0
- package/pipeline/multi-agent-refs/phases/phase-6-commit.md +2 -0
- package/pipeline/multi-agent-refs/phases/phase-7-report.md +4 -2
- package/pipeline/multi-agent-refs/rules.md +2 -2
- package/pipeline/multi-agent-refs/tracker-contract.md +1 -1
- package/pipeline/rules/figma-pipeline.md +18 -72
- package/pipeline/rules/outside-the-pipeline.md +4 -3
- package/pipeline/schemas/agent-state.schema.json +130 -1
- package/pipeline/schemas/dev-critic-output.schema.json +5 -0
- package/pipeline/schemas/prefs.schema.json +47 -0
- package/pipeline/schemas/reviewer-output.schema.json +7 -2
- package/pipeline/schemas/scope-check.schema.json +55 -0
- package/pipeline/schemas/token-budget.json +3 -3
- package/pipeline/schemas/triage-output.schema.json +12 -2
- package/pipeline/scripts/README.md +3 -2
- package/pipeline/scripts/_fingerprint.mjs +173 -0
- package/pipeline/scripts/_stack-routing.mjs +1 -1
- package/pipeline/scripts/agent-guard.py +102 -21
- package/pipeline/scripts/anonymize-findings.mjs +7 -6
- package/pipeline/scripts/build-skills-index.mjs +14 -3
- package/pipeline/scripts/cost-budget-check.mjs +5 -3
- package/pipeline/scripts/cost-lib.sh +0 -15
- package/pipeline/scripts/diff-explain.mjs +22 -12
- package/pipeline/scripts/evidence-gate.mjs +73 -5
- package/pipeline/scripts/finding-fingerprint.mjs +101 -0
- package/pipeline/scripts/gc-refs.sh +6 -2
- package/pipeline/scripts/gc-tmp.sh +1 -1
- package/pipeline/scripts/gc-worktrees.sh +1 -1
- package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
- package/pipeline/scripts/github-ssh-setup.sh +7 -2
- package/pipeline/scripts/graph-build.mjs +2 -2
- package/pipeline/scripts/jira-wiki-escape.mjs +2 -1
- package/pipeline/scripts/keychain.py +12 -11
- package/pipeline/scripts/learning-curve.mjs +1 -1
- package/pipeline/scripts/migrate-prefs.mjs +1 -1
- package/pipeline/scripts/output-quality-check.sh +3 -1
- package/pipeline/scripts/phase-tracker.sh +1 -1
- package/pipeline/scripts/phase0-exit-gate.mjs +2 -1
- package/pipeline/scripts/plan-coverage-gate.mjs +2 -1
- package/pipeline/scripts/pre-commit-check.sh +23 -13
- package/pipeline/scripts/prune-logs.sh +1 -1
- package/pipeline/scripts/render-agent-log-cost.sh +3 -1
- package/pipeline/scripts/render-cost-summary.sh +4 -2
- package/pipeline/scripts/render-work-summary.sh +5 -3
- package/pipeline/scripts/repo-map.mjs +3 -2
- package/pipeline/scripts/review-delta.mjs +217 -0
- package/pipeline/scripts/run-metrics.mjs +20 -0
- package/pipeline/scripts/scan-skills.sh +6 -2
- package/pipeline/scripts/scope-check-gate.mjs +90 -0
- package/pipeline/scripts/search-logs.sh +8 -6
- package/pipeline/scripts/sign-skills.sh +3 -1
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +12 -5
- package/pipeline/scripts/triage-memory.mjs +25 -4
- package/pipeline/scripts/uninstall.mjs +20 -12
- package/pipeline/scripts/update-check.sh +2 -2
- package/pipeline/scripts/update-issue-progress.sh +6 -5
- package/pipeline/scripts/validate-analysis-doc.mjs +6 -6
- package/pipeline/scripts/validate-reviewer.mjs +6 -0
- package/pipeline/scripts/validate-triage.mjs +20 -0
- package/pipeline/scripts/verify-skills.sh +3 -1
- package/pipeline/scripts/worktree-finalize.sh +22 -10
- package/pipeline/skills/.skill-manifest.json +81 -57
- package/pipeline/skills/.skills-index.json +19 -19
- package/pipeline/skills/shared/README.md +8 -8
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +7 -7
- package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +23 -14
- package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +5 -0
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +2 -2
- package/pipeline/skills/shared/external/NOTICE-dimillian-skills.md +56 -0
- package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +0 -4
- package/pipeline/skills/shared/external/api-patterns/SKILL.md +12 -24
- package/pipeline/skills/shared/external/app-store-changelog/references/release-notes-guidelines.md +34 -0
- package/pipeline/skills/shared/external/app-store-changelog/scripts/collect_release_changes.sh +33 -0
- package/pipeline/skills/shared/external/architecture/SKILL.md +7 -9
- package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +0 -4
- package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +0 -1
- package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +0 -14
- package/pipeline/skills/shared/external/hig-components-content/SKILL.md +13 -13
- package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +16 -16
- package/pipeline/skills/shared/external/hig-components-status/SKILL.md +6 -6
- package/pipeline/skills/shared/external/hig-components-system/SKILL.md +13 -13
- package/pipeline/skills/shared/external/hig-foundations/SKILL.md +23 -23
- package/pipeline/skills/shared/external/hig-inputs/SKILL.md +18 -18
- package/pipeline/skills/shared/external/hig-patterns/SKILL.md +30 -30
- package/pipeline/skills/shared/external/hig-platforms/SKILL.md +11 -11
- package/pipeline/skills/shared/external/hig-technologies/SKILL.md +33 -33
- package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +52 -52
- package/pipeline/skills/shared/external/ios-coding-standard/references/lint-local.sh +1 -1
- package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +11 -11
- package/pipeline/skills/shared/external/ios-developer/SKILL.md +0 -1
- package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +7 -3
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +9 -15
- package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +0 -5
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/bootstrap/Package.swift +17 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/bootstrap/Sources/MyApp/Resources/.keep +0 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/bootstrap/Sources/MyApp/main.swift +11 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/bootstrap/version.env +2 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/build_icon.sh +49 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/compile_and_run.sh +63 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/launch.sh +28 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/make_appcast.sh +82 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/package_app.sh +206 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/setup_dev_signing.sh +52 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/sign-and-notarize.sh +52 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/version.env +2 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/references/packaging.md +17 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/references/release.md +32 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/references/scaffold.md +79 -0
- package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +0 -1
- package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +0 -4
- package/pipeline/skills/shared/external/swift-concurrency-expert/references/approachable-concurrency.md +63 -0
- package/pipeline/skills/shared/external/swift-concurrency-expert/references/swift-6-2-concurrency.md +272 -0
- package/pipeline/skills/shared/external/swift-concurrency-expert/references/swiftui-concurrency-tour-wwdc.md +33 -0
- package/pipeline/skills/shared/external/swiftui-performance-audit/references/code-smells.md +150 -0
- package/pipeline/skills/shared/external/swiftui-performance-audit/references/demystify-swiftui-performance-wwdc23.md +46 -0
- package/pipeline/skills/shared/external/swiftui-performance-audit/references/optimizing-swiftui-performance-instruments.md +29 -0
- package/pipeline/skills/shared/external/swiftui-performance-audit/references/profiling-intake.md +44 -0
- package/pipeline/skills/shared/external/swiftui-performance-audit/references/report-template.md +47 -0
- package/pipeline/skills/shared/external/swiftui-performance-audit/references/understanding-hangs-in-your-app.md +33 -0
- package/pipeline/skills/shared/external/swiftui-performance-audit/references/understanding-improving-swiftui-performance.md +52 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/app-wiring.md +201 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/async-state.md +96 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/components-index.md +46 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/controls.md +57 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/deeplinks.md +66 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/focus.md +90 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/form.md +97 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/grids.md +71 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/haptics.md +71 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/input-toolbar.md +51 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/lightweight-clients.md +93 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/list.md +86 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/loading-placeholders.md +38 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/macos-settings.md +71 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/matched-transitions.md +59 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/media.md +73 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/menu-bar.md +101 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/navigationstack.md +159 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/overlay.md +45 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/performance.md +62 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/previews.md +48 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/scroll-reveal.md +133 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/scrollview.md +87 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/searchable.md +71 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/sheets.md +155 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/split-views.md +72 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/tabview.md +114 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/theming.md +71 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/title-menus.md +93 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/top-bar.md +49 -0
- package/pipeline/skills/shared/external/swiftui-view-refactor/references/mv-patterns.md +161 -0
- package/pipeline/skills/skills-index.md +8 -8
- package/pipeline/skills/shared/external/help-skills/SKILL.md +0 -166
package/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,74 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
16
16
|
|
|
17
17
|
## [Unreleased]
|
|
18
18
|
|
|
19
|
+
## [16.20.0] - 2026-09-07
|
|
20
|
+
|
|
21
|
+
A comparison against `msitarzewski/agency-agents`, a 150k-star persona catalog, found nothing to copy wholesale and three things to fix: the personas were never registered, the circuit-breaker was prose, and a review finding had no identity from one round to the next. This release gives findings that identity and builds the loop controls, the handoff records and the evidence rules on top of it.
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- **A finding keeps its identity across review rounds.** `finding-fingerprint.mjs` stamps every reviewer, triage and dev-critic finding with `F:xxxxxxxx`, computed from the file and either the cited rule ID or the normalised issue text; the line, the severity and the fix text take no part, so a finding whose line moved after the fix is still the same finding. `review-delta.mjs` compares one round's triage with the previous one and reports `stillPresent`, `resolved`, `downgraded` and `new`, plus how many consecutive rework cycles each survivor has lasted. Phase 4 keeps one `.pipeline/triage-round-<N>.json` per round, injects the previous round's accepted findings into the shared reviewer prefix so reviewers echo instead of rediscover, and stores the delta in `state.reviewIterations[i].delta`. The Phase 3 reflection prompt puts the survivors first, marked `STILL PRESENT`.
|
|
26
|
+
- **The circuit-breaker has two triggers in code.** Trigger 2 (a blocking or important finding that survives `identicalFindingCycles` consecutive rework cycles, default 2) fires from `review-delta.mjs` exit 3 at Phase 4 Step 3.8; trigger 3 (the rework cap) is recorded by the Phase 3 re-entry. Both write `state.circuitBreaker` and halt visibly in autopilot; interactive modes show the survivors and ask. `prefs.global.autopilotCircuitBreaker` and `state.circuitBreaker` now exist in the schemas the feature doc had been naming, `resume` clears the trip, and `smoke-autopilot-circuit-breaker` asserts the schema fields, the scripts and the phase wiring instead of grepping the prose.
|
|
27
|
+
- **Dev states its scope before review reads it.** Phase 3 Step 3.7 writes `.pipeline/scope-check.json`: a reason per touched file, the changes deliberately not made, and the code-simplifier rationales that used to be discarded. `scope-check-gate.mjs` compares it with the real diff; Phase 4 renders it as `<scope-self-check>` so reviewers judge against the stated scope and do not re-propose what was rejected; Phase 6 builds the PR `Changes` bullets and a "Follow-ups not done in this PR" list from it.
|
|
28
|
+
- **PR bodies carry a risk section when the diff earns one.** `channels/pr.md` gains the conditional `## Risk and Security` section (auth flow touched, secret handling changed, data migration, rollback), required whenever `state.diffRisk.signals` carries a high-stakes signal. Phase 4 now persists the diff-risk totals to `state.diffRisk`, and `run-metrics.mjs` reports `diff.filesTouched`, `locAdded`, `locRemoved` and the cross-round delta.
|
|
29
|
+
- **Manual test results are evidence, not a chat reply.** Phase 5 writes `.pipeline/manual-test.json` with one row per acceptance criterion (the quoted spec, the observation, the verdict, the screenshot) and `evidence-gate.mjs --claim manual` refuses an "ok" whose criteria are missing, failed or untested without a reason. The simulator UI report pairs every bug with its spec quote and its before/after captures and ends with a production-readiness verdict that defaults to FAILED.
|
|
30
|
+
- **One green run is not proof.** Verify-by-test re-runs a passing repro test `verifyByTest.repeatCount` times (default 3) before it may downgrade a blocking finding; a run that disagrees makes the verdict `inconclusive` with a `flaky` note. Phase 3 runs every new or changed test `testStability.repeatCount` times (default 3) and records `test.flake_signal` when outcomes disagree: a test that passes only on retry is a flake signal, not a pass.
|
|
31
|
+
- **Persona files round-trip and store readiness asks about symbols and rollout.** `lint-personas.mjs` checks every persona's frontmatter, its `## Output Format` section, and that the Codex TOML rendered from it decodes back to the same description and body byte for byte; the renderer no longer appends a newline the source did not have. The smokes that hardcoded six persona names now derive the list from the directory. `store-ready` flags an archive without dSYMs (or a minified bundle without `mapping.txt`) as blocking, checks that a symbol upload step exists, and ends the report with the phased-rollout thresholds and the rollback owner a release needs written down.
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- **Token budgets: phase-4-review max 14750 -> 15150, total 58250 -> 60250.** The full contracts for the review delta and the scope self-check live in `multi-agent-refs/features/review-delta.md` and `features/scope-check.md`, outside the budget; the phase docs carry the call, the pref and the exit table, and were compressed twice before the numbers moved. `rules.md` was tightened by 150 bytes to keep the fixed per-run load under its 60000-byte ceiling. Reasoning in `schemas/token-budget.json`.
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
|
|
39
|
+
- **Phase 4 and Phase 7 disagreed on the triage file name.** Phase 4 wrote `.pipeline/triage.json`; Phase 7, `worktree-finalize.sh`, `render-work-summary.sh` and `diff-explain.mjs` read `triage-output.json`. The salvage step bridged it only when the worktree was removed, and everywhere else the triage corpus and the learnings ledger silently stopped being fed. Phase 4 now copies the latest round to `triage-output.json` itself.
|
|
40
|
+
- **The eight personas were never registered as subagents.** `pipeline/agents/*.md` carried `description`, `model`, `preferredModel` and `modelRationale` but no `name:`, and Claude Code drops a subagent file without one silently: no error, no agent. Every `subagent_type: "code-reviewer"`, `"ios-architect"`, `"security-auditor"`, `"dev-critic"` and `"task-clarifier"` dispatch in the phase docs named an agent the host did not have. Each persona now declares `name:` equal to its filename stem, and `smoke-agent-model-routing` fails when a persona lacks it, when the name differs from the stem, or when it is not lowercase kebab-case. Found while comparing the persona format against `msitarzewski/agency-agents`, whose linter treats `name` as a required field.
|
|
41
|
+
|
|
42
|
+
## [16.19.0] - 2026-09-02
|
|
43
|
+
|
|
44
|
+
A review of the three repositories together (pipeline, toolkit MCP, plugin marketplace) with every test suite green found the defects the suites could not see. This release fixes what was found in the pipeline; `@mmerterden/multi-agent-toolkit-mcp` 3.8.0 and the marketplace plugins carry their own halves.
|
|
45
|
+
|
|
46
|
+
### Added
|
|
47
|
+
|
|
48
|
+
- **The accessibility scenario audits, it does not only look.** `/multi-agent:test "accessibility"` promised "visual + MCP audit tool" and then inspected screenshots. It now calls `ios_accessibility_audit` / `android_accessibility_audit` on every screen, treats `measurable:false` as not audited rather than clean, and runs `ios_accessibility_audit_deep` when an XCUITest target exists. The full scenario ends with a crash sweep through `ios_list_crashes` / `android_list_crashes`. Nineteen of the toolkit's 87 tools had no pipeline caller; the ones the flows claim now have one.
|
|
49
|
+
- **The UI bug hunter reads before it looks.** `/multi-agent:test` took a full-resolution screenshot after every tap and sent it through the model: 2.9 MB of PNG per step, which is what made the loop feel slow. The flow now reads `ios_get_ui_tree` first (text, ~0.1 s) and picks tap targets from element frames, batches tap / wait / capture / tree sequences into one `agent_run_steps` round trip, writes bulk captures to files and looks only at the screens whose tree changed. Inline screenshots are compact by default in toolkit 3.9.0.
|
|
50
|
+
- **`lint-mcp-refs --strict-tools` probes the sibling checkout.** The tool-existence check only ran when a local path was registered; an `npx` registration meant it was skipped on every machine, including the maintainer's. It now also tries `$MULTI_AGENT_TOOLKIT_REPO` and `~/multi-agent-toolkit-mcp`, so the 73 referenced tools are verified against the live server.
|
|
51
|
+
- **`triage-memory --state` and `diff-explain --task-id` do what their usage said.** Both flags were documented and dead.
|
|
52
|
+
|
|
53
|
+
### Changed
|
|
54
|
+
|
|
55
|
+
- **Three reviewers on Claude Code, everywhere it is written down.** 16.12.0 added Opus as the third reviewer and left eight documents saying two: the orchestrator's own description, the standalone `review` command (which dispatched two agents under a "3 in parallel" heading), the triage prompt ("two reviewers returned findings"), the consensus rationale, `modes.md`, the architecture diagram, the README's "two-vendor host" claim and ADR-0001. Every host runs three; the Codex set is now in the standalone command too.
|
|
56
|
+
- **Phase 1 is Sonnet, Phase 2 is Fable, and the template, refs, help and telemetry tags all say so.** Four documents had three answers, and the cost ledger was attributing Phase 1 and 2 spend to opus.
|
|
57
|
+
- **Platform parity has one source order.** The schema and `_dev-context.md` said the check reads `state.siblings[]` "and nothing else"; the contract lists it fourth of four. A model following the schema skipped the step on every standalone review.
|
|
58
|
+
- **`rules/figma-pipeline.md` no longer ships a 31-command catalog of which 30 do not exist.** New installs received the retired list; the current skill surfaces replace it. Its CI claim for `smoke-no-mcp-in-dev-phases` now says where the gate actually runs.
|
|
59
|
+
- **Counts the tree can check.** 55 commands (not 51), 36 Locked decisions (not 35), "80+" toolkit tools where "83" was asserted, and the ecosystem table lists the eight tool categories that sum to 87. `package-lock.json` had stayed at 16.15.0 for three releases.
|
|
60
|
+
- **Phase-doc token budget 57850 -> 58250.** The three-reviewer roster, the worktree convention and the model corrections are real content; the total was sitting 18 tokens under its ceiling.
|
|
61
|
+
- **`install --target=` is refused instead of ignored.** No installer read it; it installed into `$HOME` and said nothing.
|
|
62
|
+
|
|
63
|
+
### Fixed
|
|
64
|
+
|
|
65
|
+
- **The secret gate could not block a commit.** `pre-commit-check.sh` exited 1 and printed to stdout; the PreToolUse contract blocks on exit 2. A staged token went through. It also resolved staged paths against the working directory, so from a subdirectory every file was skipped. Exit 2, stderr, repo-root paths.
|
|
66
|
+
- **The attribution guard never saw the pipeline's own commits.** `git -C <worktree> commit` did not match `git\s+commit`. The guard now tokenises git's global options, and force-push is also caught for `+refspec` and `refs/heads/<protected>` forms.
|
|
67
|
+
- **Three smokes were decorative.** `smoke-language-axis`, `smoke-no-token-prompt` and `smoke-worktree-path-convention` did `cd pipeline` and then grepped `pipeline/...`, a path that does not exist, and printed ok. Pointed at the tree they found three real violations, now fixed, and one undocumented convention (worktrees live at `{projectRoot}/.worktrees/{taskId}`, now in Phase 0 Step 6).
|
|
68
|
+
- **Garbage collection could delete a running task's scratch.** The fresh-item guard was `find | head -1 | grep -q` under pipefail; with many fresh files `find` died of SIGPIPE and the guard failed open. `-print -quit` instead, in `gc-tmp`, `gc-worktrees` and `prune-logs`.
|
|
69
|
+
- **`uninstall` with no flags deleted the project's own `AGENTS.md` prose** from the pipeline heading to the next H1, through a fallback written for marker-less host files. Legacy adapter cleanup is opt-in and the fallback applies only to host files.
|
|
70
|
+
- **Every install removed `$HOME/.multi-agent` unconditionally,** a path also used for live per-repo state. Only known legacy entries are removed.
|
|
71
|
+
- **`install --copilot --link` wrote generated files into the source checkout** through the skills symlink. The skills root is a real directory; only authored trees are linked.
|
|
72
|
+
- **Four scripts did nothing from a path with a space.** The main-guard compared `import.meta.url` with an unencoded `file://` string; two of them are dispatch gates. `pathToFileURL` now.
|
|
73
|
+
- **Option parsers that hung or lied.** `fetch-figma-annotations.sh` spun at 100% CPU when an option was the last argument; twenty parsers in `lib/` and `scripts/` now fail with their documented exit code and a message instead of `shift` failing silently.
|
|
74
|
+
- **`vercel-deploy.sh deploy --prod` failed under the only bash macOS ships** (3.2.57: empty array under `set -u`).
|
|
75
|
+
- **`worktree-finalize.sh` reported every worktree but the last as unregistered** (a `while read` loop writing into a closed pipe), salvaged the tracker from a directory nothing writes to, and nested `.pipeline/.pipeline/` on a re-run.
|
|
76
|
+
- **`keychain.py set` put the secret on `security`'s argv,** visible in `ps`, and `credential-store.sh` routed every macOS write through it. Both use `security -i` over stdin; keychain.py's exit codes 2 and 4 are propagated.
|
|
77
|
+
- **`review-watch.sh` marked pull requests reviewed without reviewing them.** It now runs `post-pr-review.sh` for a head with findings and stamps only on success. `post-pr-review.sh`'s Bitbucket verdict PUT checks the status code; a 401 was "approve posted".
|
|
78
|
+
- **`figma-screenshot.sh --discover-sections` answered "this file holds no design" on an expired token** (curl without `--fail`). It exits 2 with the auth message; its temp files have traps and its output dir comes from `mktemp`.
|
|
79
|
+
- **`fetch-crashlytics.sh` and `figma-mcp-refresh.sh` exited with raw child codes** under `set -e`, so a VPN drop was diagnosed as a missing credential. Mapped to the documented 3 and 2.
|
|
80
|
+
- **Sourced from zsh, `credential-store-resolver.sh` printed the store path to stdout** and `figma-token.sh` asked for a single key named `figma figma_pat`.
|
|
81
|
+
- **`validate-analysis-doc.mjs` crashed on a document without front matter,** failed the gate on a check it called a warning, listed the correct Turkish word `Onay` as a typo, and cited "Locked 37" in a list of 36.
|
|
82
|
+
- **`multi-repo-pipeline.sh` committed `git add -A`** while its header said staged changes, and ignored `state.identity`. `plan-todos.sh` returned 0 for an unknown id. `update-issue-progress.sh` failed on macOS `mktemp` on the second call.
|
|
83
|
+
- **Smoke hygiene.** Thirty-six smokes: five asserted against the installed `~/.claude` copy instead of the repo, one passed when `sha256sum` was missing (`"" = ""`), eleven used predictable `/tmp` paths, five wrote probe files into the repo tree, five wrote into the real `$HOME`, four turned errexit on halfway through, four had assertions that could not fail, and the `THY` personal-data pattern matched `thyme` under `grep -i`.
|
|
84
|
+
- **Smaller ones.** `build-skills-index.mjs` recorded `|` and `>-` as descriptions for five skills, so `match-skills` could never score them; `learning-curve` and `aggregate-metrics` computed "cache ratio" with different formulas; `graph-build` omitted Go; `repo-map --include` matched substrings while documented as globs; `eval-mine-corpus` read the corpus from a path the writer never used inside a worktree; `gen-mode-dispatch` defaulted to a mode removed in 16.0.0; `scorecard` claimed no network and ran `npm audit`; `_dev-only-files` misgrouped its regex; `render-cost-summary` selected 0/0 phases; `gc-refs` matched `pr-body-final.md`; `credential-inventory` reported every key missing with rc 0 when no backend existed; `repo-cache` and `issue-fetcher` split scan roots on whitespace; `md2confluence-v3.py` detected every document as Turkish and its residual-character warning could never fire; `github-ssh-setup.sh` wrote `UseKeychain` on Linux; dead functions and stale headers in `cost-lib`, `extract-conventions`, `shadow-git`, `fetch-document`, `benchmark-phase-0`, `sync-parity-check`, `_mcp-register`, `_plugin-skills`, `cost-budget-check`, `triage-memory`, `migrate-prefs`, `eval-golden-tasks`; dangling references to `figma-navigation`, `/multi-agent:fix-bug`, `ask_choice.sh`, `refs/frontend-guide.md` and a `-v610` anchor.
|
|
85
|
+
- **Vendored knowledge skills point at files that exist.** Twenty-six external skills linked 184 files that were never vendored; 58 were fetched from their upstream (Dimillian/Skills, MIT, provenance recorded), the rest de-linked. `help-skills` (Turkish, install-path catalog) is retired; `ios-module-structure` resolves its scripts relative to the skill; `ios-coding-standard` examples use a neutral domain.
|
|
86
|
+
|
|
19
87
|
## [16.18.0] - 2026-09-01
|
|
20
88
|
|
|
21
89
|
### Changed
|
package/README.md
CHANGED
|
@@ -219,7 +219,7 @@ The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI**
|
|
|
219
219
|
|
|
220
220
|
Filter skills by stack with `--platform=ios\|android\|all`.
|
|
221
221
|
|
|
222
|
-
**Why Codex gets one skill and not
|
|
222
|
+
**Why Codex gets one skill and not 55.** Codex assembles every discovered skill's name
|
|
223
223
|
and description into a single prompt block and drops entries when it overflows, with no
|
|
224
224
|
error. Measured on 0.145: installing one plugin that declares 142 skills surfaced only
|
|
225
225
|
75 of them and evicted an unrelated user skill. So on Codex the pipeline ships a single
|
|
@@ -228,9 +228,9 @@ nothing until read - same commands, same behaviour, a layout the host can actual
|
|
|
228
228
|
|
|
229
229
|
Reviewer sets differ because the available models do: Claude Code runs 3 reviewers
|
|
230
230
|
(Fable + Opus + Sonnet), Copilot CLI 3 (Opus + GPT-5.4 + Sonnet), Codex CLI 3 (gpt-5.6 at
|
|
231
|
-
xhigh, gpt-5.4, gpt-5.6 at medium). Codex
|
|
232
|
-
is weaker evidence than the same consensus on
|
|
233
|
-
says so.
|
|
231
|
+
xhigh, gpt-5.4, gpt-5.6 at medium). Claude Code and Codex are single-vendor panels, so
|
|
232
|
+
consensus among their three is weaker evidence than the same consensus on Copilot CLI,
|
|
233
|
+
the one host whose panel spans two vendors, and the triage note says so.
|
|
234
234
|
|
|
235
235
|
## Tokens & integrations
|
|
236
236
|
|
|
@@ -257,7 +257,7 @@ Installing the pipeline is not only useful when you run it. Open an ordinary ses
|
|
|
257
257
|
|
|
258
258
|
- **Services you already onboarded.** The token `setup` mapped is readable now - resolve the logical name through `credential-store.sh` and fetch the issue, the page, the log. **Reads are ordinary work; writes are not.** Posting a Jira comment, editing an issue or opening a PR goes through the pipeline commands, because the rules that make those safe (never auto-close, `Ref:` not `Closes:`, humanizer on outward prose) live there.
|
|
259
259
|
- **The stack skills `/multi-agent:stack` enabled for the repo.** Each toolkit's own `index` skill routes; the pipeline keeps no copy of that table.
|
|
260
|
-
- **The `multi-agent-toolkit` MCP.**
|
|
260
|
+
- **The `multi-agent-toolkit` MCP.** 80+ tools for a running app - screen state, crash logs, design comparison, store pre-submission.
|
|
261
261
|
|
|
262
262
|
Uninstall preserves this layer: the tokens, the reader that opens them, the mapping that names them, and the MCP registration. Removing the pipeline should not cost you the credentials you onboarded through it.
|
|
263
263
|
|
package/README.tr.md
CHANGED
|
@@ -219,7 +219,7 @@ Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çal
|
|
|
219
219
|
|
|
220
220
|
Skill'leri stack'e göre filtrele: `--platform=ios\|android\|all`.
|
|
221
221
|
|
|
222
|
-
**Codex neden
|
|
222
|
+
**Codex neden 55 değil de tek bir skill alıyor.** Codex, keşfettiği her skill'in adını
|
|
223
223
|
ve açıklamasını tek bir prompt bloğuna toplar ve blok taştığında girdileri hatasızca
|
|
224
224
|
düşürür. 0.145 üzerinde ölçüldü: 142 skill deklare eden bir plugin kurulduğunda sadece
|
|
225
225
|
75'i yüzeye çıktı ve alakasız bir kullanıcı skill'i tahliye edildi. Bu yüzden Codex'te
|
|
@@ -258,7 +258,7 @@ Pipeline'ı kurmak yalnız onu çalıştırdığında işe yaramıyor. Sıradan
|
|
|
258
258
|
|
|
259
259
|
- **Zaten onboard ettiğin servisler.** `setup`'ın eşlediği token okunabilir durumda - mantıksal adı `credential-store.sh` ile çöz, issue'yu, sayfayı, logu getir. **Okuma sıradan iş, yazma değil.** Jira yorumu, issue düzenleme ve PR açma pipeline komutlarından geçer, çünkü onları güvenli kılan kurallar (issue asla otomatik kapanmaz, `Closes:` değil `Ref:`, dışa dönük metinde humanizer) orada yaşıyor.
|
|
260
260
|
- **`/multi-agent:stack`'in bu repo için açtığı stack skilleri.** Yönlendirmeyi her toolkit'in kendi `index` skill'i yapar; pipeline o tablonun kopyasını tutmaz.
|
|
261
|
-
- **`multi-agent-toolkit` MCP.** Çalışan uygulama için
|
|
261
|
+
- **`multi-agent-toolkit` MCP.** Çalışan uygulama için 80+ araç - ekran durumu, crash logu, tasarım karşılaştırma, store ön-kontrolü.
|
|
262
262
|
|
|
263
263
|
Uninstall bu katmanı korur: token'lar, onları açan okuyucu, adlarını tutan eşleme ve MCP kaydı. Pipeline'ı kaldırmak, onun üzerinden onboard ettiğin credential'ları kaybetmek anlamına gelmemeli.
|
|
264
264
|
|
package/docs/FIGMA_PIPELINE.md
CHANGED
|
@@ -71,7 +71,7 @@ Minimum viable config:
|
|
|
71
71
|
|
|
72
72
|
Android projects swap the `build` section to `{ "gradleModule": ":components:button", "variant": "debug" }` and set `project.platform` to `"android"`.
|
|
73
73
|
|
|
74
|
-
**Optional `ui` block - UI interaction systems.** Consumed by the `
|
|
74
|
+
**Optional `ui` block - UI interaction systems.** Consumed by the enabled stack plugin's `navigation` / `overlays` / `bottom-sheets` skills (`ai-ios-toolkit:*` / `ai-android-toolkit:*`) and Phase 4 review. Omit it (or set `mode: "native"`) and the pipeline generates stock SwiftUI (`NavigationStack`, `.alert`/`.sheet(item:)`, `.sheet`+`presentationDetents`). Set `mode: "custom"` to route to a project-supplied system by type name:
|
|
75
75
|
|
|
76
76
|
```json
|
|
77
77
|
"ui": {
|
|
@@ -69,8 +69,10 @@ Negative / costs:
|
|
|
69
69
|
- Cross-provider (GPT) dependency on Copilot CLI - if the provider is down,
|
|
70
70
|
the pipeline continues with 2 reviewers (Opus + Sonnet) and a warning.
|
|
71
71
|
- Cross-CLI asymmetry: Copilot CLI catches a slice of failures (edge cases
|
|
72
|
-
via GPT diversity) that Claude Code's 2-model set
|
|
73
|
-
tradeoff against platform reachability.
|
|
72
|
+
via GPT diversity) that Claude Code's 2-model set missed. Accepted then as a
|
|
73
|
+
tradeoff against platform reachability; v16.12.0 closed the count gap (three
|
|
74
|
+
reviewers on every host, see the note at the top), while the vendor gap
|
|
75
|
+
remains: Claude Code's Fable + Opus + Sonnet panel is single-vendor.
|
|
74
76
|
|
|
75
77
|
## Alternatives Considered
|
|
76
78
|
|
package/docs/architecture.md
CHANGED
|
@@ -9,7 +9,7 @@ graph TD
|
|
|
9
9
|
P1["Phase 1: Analysis<br/>Codebase scan (parallel Explore agents)"]
|
|
10
10
|
P2["Phase 2: Planning<br/>Task breakdown, architecture review"]
|
|
11
11
|
P3["Phase 3: Dev<br/>TDD: RED → GREEN → REFACTOR"]
|
|
12
|
-
P4["Phase 4: Review<br/>Parallel + Fable triage<br/>(
|
|
12
|
+
P4["Phase 4: Review<br/>Parallel + Fable triage<br/>(3 reviewers per host: Claude Code Fable + Opus + Sonnet · Copilot GPT-5.4 + Opus + Sonnet)"]
|
|
13
13
|
P5["Phase 5: Test<br/>Optional manual testing"]
|
|
14
14
|
P6["Phase 6: Commit<br/>Git commit, PR creation"]
|
|
15
15
|
P7["Phase 7: Report<br/>Jira · Wiki+Figma · Confluence · Log · Knowledge"]
|
|
@@ -169,7 +169,7 @@ revisions of this diagram - Codex CLI and the two independently-shipped repos
|
|
|
169
169
|
```mermaid
|
|
170
170
|
graph TD
|
|
171
171
|
CC["Claude Code<br/>(source of truth)"]
|
|
172
|
-
COP["Copilot CLI<br/>(instructions +
|
|
172
|
+
COP["Copilot CLI<br/>(instructions + 55 skills)"]
|
|
173
173
|
COD["Codex CLI<br/>(1 router skill + 55 refs)"]
|
|
174
174
|
REPO["Pipeline Repo<br/>(npm package)"]
|
|
175
175
|
WEB["Website"]
|
package/docs/ecosystem.md
CHANGED
|
@@ -106,14 +106,14 @@ hand-authored *inside* `multi-agent-plugins` and are never touched by sync.
|
|
|
106
106
|
|
|
107
107
|
```mermaid
|
|
108
108
|
graph TD
|
|
109
|
-
EXT["pipeline/skills/shared/external/<br/>
|
|
109
|
+
EXT["pipeline/skills/shared/external/<br/>153 skills - single authoring source<br/>(the pipeline's own phases read these too)"]
|
|
110
110
|
|
|
111
|
-
EXT -->|"cross-stack skills"| COMMONP["ai-common-toolkit<br/>11 skills · v0.2.
|
|
112
|
-
EXT -->|"outside facts for analysis"| ANAP["ai-analyst-toolkit<br/>5 skills · v0.1.
|
|
113
|
-
EXT -->|"Apple/Xcode-only"| IOSP["ai-ios-toolkit<br/>
|
|
114
|
-
EXT -->|"Android/Kotlin-only"| ANDP["ai-android-toolkit<br/>30 skills · v0.1.
|
|
115
|
-
EXT -->|"backend-only"| BEP["ai-backend-toolkit<br/>33 skills · v0.1.
|
|
116
|
-
EXT -->|"web/frontend-only"| FEP["ai-frontend-toolkit<br/>25 skills · v0.1.
|
|
111
|
+
EXT -->|"cross-stack skills"| COMMONP["ai-common-toolkit<br/>11 skills · v0.2.10"]
|
|
112
|
+
EXT -->|"outside facts for analysis"| ANAP["ai-analyst-toolkit<br/>5 skills · v0.1.3"]
|
|
113
|
+
EXT -->|"Apple/Xcode-only"| IOSP["ai-ios-toolkit<br/>133 skills · v0.12.1"]
|
|
114
|
+
EXT -->|"Android/Kotlin-only"| ANDP["ai-android-toolkit<br/>30 skills · v0.1.5"]
|
|
115
|
+
EXT -->|"backend-only"| BEP["ai-backend-toolkit<br/>33 skills · v0.1.7"]
|
|
116
|
+
EXT -->|"web/frontend-only"| FEP["ai-frontend-toolkit<br/>25 skills · v0.1.5"]
|
|
117
117
|
|
|
118
118
|
COMMONP --> BUMP{"skill set<br/>changed?"}
|
|
119
119
|
ANAP --> BUMP
|
|
@@ -206,16 +206,18 @@ e.g. `apple-archive-compliance` requires `ios_app_store_audit` from
|
|
|
206
206
|
that drops or renames a tool a pipeline skill depends on is a **major** bump, by
|
|
207
207
|
that step's own contract).
|
|
208
208
|
|
|
209
|
-
### multi-agent-toolkit-mcp's
|
|
209
|
+
### multi-agent-toolkit-mcp's tools, by category (87 at the toolkit README's last count; the pipeline says "80+" elsewhere so the number does not go stale with every toolkit release)
|
|
210
210
|
|
|
211
211
|
| Category | Tools | Primary pipeline consumers |
|
|
212
212
|
|---|---|---|
|
|
213
|
-
| Device Control |
|
|
214
|
-
|
|
|
213
|
+
| Device Control | 59 | `/multi-agent:test`, `test-dark-mode`, `test-accessibility`, `test-dynamic-type`, `test-screenshots`, `manual-test`, `design-check` |
|
|
214
|
+
| Memory | 2 (`ios_leaks`, `android_meminfo`) | none yet; available outside the pipeline |
|
|
215
|
+
| Crash Diagnostics | 2 (`ios_list_crashes`, `android_list_crashes`) | `/multi-agent:test` full scenario (end-of-run crash sweep), outside-the-pipeline sessions |
|
|
216
|
+
| Accessibility Audit | 3 (`ios_accessibility_audit`, `android_accessibility_audit`, `ios_accessibility_audit_deep`) | `/multi-agent:test` accessibility scenario, `test-accessibility` |
|
|
215
217
|
| Store Compliance | 5 | `store-ready`, `testflight-validation`, `apple-archive-compliance` skill, Phase 4 Security Auditor |
|
|
216
218
|
| Web Automation | 8 | frontend-stack UI testing (via `test`) |
|
|
217
219
|
| Design Audit | 6 | `design-check` (mock-mode vs Figma conformance) |
|
|
218
|
-
| Autonomous Agent DSL |
|
|
220
|
+
| Autonomous Agent DSL | 2 (`agent_run_steps`, `agent_query_output`) | any skill that needs a scripted multi-step device flow in one round trip |
|
|
219
221
|
|
|
220
222
|
---
|
|
221
223
|
|
package/docs/features.md
CHANGED
|
@@ -36,7 +36,7 @@ The install is not only useful while `/multi-agent` is running. `rules/outside-t
|
|
|
36
36
|
|
|
37
37
|
- **Onboarded service credentials.** Resolve the logical name through `credential-store.sh` and read the issue, page or log. Writes route through the pipeline commands, which carry the rules that make them safe - issues are never auto-closed, PR bodies use `Ref:`, outward prose goes through the humanizer.
|
|
38
38
|
- **The stack skills enabled for this repo.** Each toolkit's own `index` skill routes. The pipeline reads the effective `enabledPlugins` rather than keeping a stack table, so a seventh toolkit needs no code change.
|
|
39
|
-
- **The `multi-agent-toolkit` MCP.**
|
|
39
|
+
- **The `multi-agent-toolkit` MCP.** 80+ tools for a running app.
|
|
40
40
|
|
|
41
41
|
Uninstall preserves the whole layer - tokens, the reader that opens them, the mapping that names them, the MCP registration. It is 1.5 kB of always-loaded text; the detail lives in a ref that loads on demand, and a gate keeps both under a ceiling because every byte there is paid by every session.
|
|
42
42
|
|
|
@@ -55,7 +55,7 @@ Measured on a 4,300-file Swift app against a grep-and-read baseline at the same
|
|
|
55
55
|
| iOS/Swift | `.xcodeproj`, `Package.swift` | `refs/swiftui-guide.md` |
|
|
56
56
|
| Android/Kotlin | `build.gradle[.kts]` | `refs/android-guide.md` |
|
|
57
57
|
| Backend | `requirements.txt`, `package.json`, `go.mod` | `refs/backend-guide.md` |
|
|
58
|
-
| Frontend | `package.json` + framework detection | `refs/
|
|
58
|
+
| Frontend | `package.json` + framework detection | `refs/web-guide.md` |
|
|
59
59
|
| Docker | `Dockerfile`, `docker-compose.yml` | `refs/backend-guide.md` |
|
|
60
60
|
|
|
61
61
|
Build commands, test runners, lint tools, and review focus areas all adapt to the detected stack.
|
package/index.js
CHANGED
|
@@ -73,7 +73,7 @@ if (command === "--version" || command === "-v" || command === "version") {
|
|
|
73
73
|
|
|
74
74
|
Options:
|
|
75
75
|
--no-color Disable colored output
|
|
76
|
-
--target=<path>
|
|
76
|
+
--target=<path> Uninstall only: project dir for the legacy adapter cleanup (--cursor / --copilot-chat / --antigravity; defaults to cwd). Install always targets $HOME.
|
|
77
77
|
--platform=ios|android|all Filter external skills by platform (default: all)
|
|
78
78
|
|
|
79
79
|
After installation:
|
|
@@ -94,10 +94,10 @@ export function tomlString(s) {
|
|
|
94
94
|
return JSON.stringify(s);
|
|
95
95
|
}
|
|
96
96
|
if (!s.includes("'''")) {
|
|
97
|
-
return `'''\n${s}
|
|
97
|
+
return `'''\n${s}'''`;
|
|
98
98
|
}
|
|
99
99
|
const escaped = s.replace(/\\/g, "\\\\").replace(/"""/g, '\\"\\"\\"');
|
|
100
|
-
return `"""\n${escaped}
|
|
100
|
+
return `"""\n${escaped}"""`;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
/**
|
package/install/_common.mjs
CHANGED
|
@@ -278,11 +278,29 @@ const ABANDONED_TREES = Object.freeze([
|
|
|
278
278
|
{
|
|
279
279
|
dir: ".multi-agent",
|
|
280
280
|
root: "home",
|
|
281
|
+
// `.multi-agent/` is also the live per-repo path memory-save.sh and the
|
|
282
|
+
// offload-ref writer use (memory/, refs/, .gitignore). If $HOME is itself a
|
|
283
|
+
// repo, or anything else put an unknown entry there, the tree is not ours.
|
|
284
|
+
knownEntries: ["scripts", "lib", "schemas", ".DS_Store"],
|
|
281
285
|
reason:
|
|
282
286
|
"shared runtime for the Cursor / Antigravity / Copilot Chat adapters, all deleted in v10.7.0",
|
|
283
287
|
},
|
|
284
288
|
]);
|
|
285
289
|
|
|
290
|
+
/**
|
|
291
|
+
* @param {string} target
|
|
292
|
+
* @param {ReadonlyArray<string>|undefined} knownEntries
|
|
293
|
+
* @returns {boolean} true when every top-level entry is one the abandoned tree is known to contain
|
|
294
|
+
*/
|
|
295
|
+
function isKnownLegacyTree(target, knownEntries) {
|
|
296
|
+
if (!knownEntries) return true;
|
|
297
|
+
try {
|
|
298
|
+
return readdirSync(target).every((name) => knownEntries.includes(name));
|
|
299
|
+
} catch {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
286
304
|
/**
|
|
287
305
|
* Registry of command renames. Command names are an interface: users type
|
|
288
306
|
* them, docs and saved routines reference them, and Copilot installs derive
|
|
@@ -311,10 +329,16 @@ export const COMMAND_RENAMES = Object.freeze({
|
|
|
311
329
|
*/
|
|
312
330
|
export function pruneAbandonedTrees(claudeDir, home = dirname(claudeDir)) {
|
|
313
331
|
let removed = 0;
|
|
314
|
-
for (const { dir, root, reason } of ABANDONED_TREES) {
|
|
332
|
+
for (const { dir, root, reason, knownEntries } of ABANDONED_TREES) {
|
|
315
333
|
const base = root === "home" ? home : claudeDir;
|
|
316
334
|
const target = join(base, dir);
|
|
317
335
|
if (!existsSync(target)) continue;
|
|
336
|
+
if (!isKnownLegacyTree(target, knownEntries)) {
|
|
337
|
+
console.log(
|
|
338
|
+
` kept ${target}: holds entries no abandoned install wrote, so it is not ours to remove`,
|
|
339
|
+
);
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
318
342
|
if (dryRun) {
|
|
319
343
|
console.log(` [dry-run] would remove abandoned tree ${target} (${reason})`);
|
|
320
344
|
removed++;
|
|
@@ -44,9 +44,9 @@ export const CONSUMER_SMOKES = Object.freeze([
|
|
|
44
44
|
* notices - the safe direction for reason 2 above.
|
|
45
45
|
*/
|
|
46
46
|
export const MAINTAINER_SMOKES = new RegExp(
|
|
47
|
-
`^smoke-(
|
|
47
|
+
`^smoke-(?!(?:${CONSUMER_SMOKES.map((n) => n.replace(/^smoke-/, "").replace(/\./g, "\\.")).join(
|
|
48
48
|
"|",
|
|
49
|
-
)}$)`,
|
|
49
|
+
)})$)`,
|
|
50
50
|
);
|
|
51
51
|
|
|
52
52
|
/**
|
|
@@ -59,6 +59,7 @@ const DEV_ONLY_TOOLING = Object.freeze([
|
|
|
59
59
|
"run-smokes.mjs",
|
|
60
60
|
"scorecard.mjs",
|
|
61
61
|
"lint-skills.mjs",
|
|
62
|
+
"lint-personas.mjs", // imports install/_codex-agents.mjs, which never ships to scripts/
|
|
62
63
|
"lint-mcp-refs.mjs",
|
|
63
64
|
"check-md-links.mjs",
|
|
64
65
|
"validate-schemas.mjs", // validates the repo's own schema files, needs ajv
|
|
@@ -154,9 +154,10 @@ function saysAlreadyExists(text) {
|
|
|
154
154
|
* "skipped MCP registration (Command failed)" would send the user to fix something that
|
|
155
155
|
* is already correct, and that is exactly what the first version of this did.
|
|
156
156
|
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
157
|
+
* An existing entry under the same name is removed and re-added so its spec follows
|
|
158
|
+
* the installed version (the entry is installer-owned; the reason is at the remove
|
|
159
|
+
* below). A user who points the toolkit at a local checkout registers it under a
|
|
160
|
+
* different name or re-applies the change after an update.
|
|
160
161
|
*
|
|
161
162
|
* Never fatal: a missing CLI or a failed write must not fail the install, because the
|
|
162
163
|
* rest of the tree is still correct and useful. It prints the manual command instead.
|
|
@@ -30,7 +30,7 @@ import { join } from "path";
|
|
|
30
30
|
/** Uninstall reads this to know exactly which delivered skill dirs are ours to remove. */
|
|
31
31
|
export const PLUGIN_SKILLS_MANIFEST = ".plugin-skills-manifest.json";
|
|
32
32
|
|
|
33
|
-
import { copyDir, countFiles, ensureDir,
|
|
33
|
+
import { copyDir, countFiles, ensureDir, isDryRun, wipeDir } from "./_common.mjs";
|
|
34
34
|
|
|
35
35
|
/** Subtrees a plugin authors itself. `knowledge/` is generated, so it is excluded. */
|
|
36
36
|
const AUTHORED_GROUPS = Object.freeze(["index", "reference", "workflow", "tools"]);
|
|
@@ -341,5 +341,3 @@ export function pipelineOwnedSkillNames(pipelineSrc) {
|
|
|
341
341
|
}
|
|
342
342
|
return owned;
|
|
343
343
|
}
|
|
344
|
-
|
|
345
|
-
export { ensureRealDir };
|
package/install/copilot.mjs
CHANGED
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
isDryRun,
|
|
23
23
|
pruneOrphanSkillFiles,
|
|
24
24
|
removePipelineAgentFiles,
|
|
25
|
+
symlinkDir,
|
|
25
26
|
wipeDir,
|
|
26
27
|
writeFile,
|
|
27
28
|
} from "./_common.mjs";
|
|
@@ -303,9 +304,12 @@ function installSkills(opts) {
|
|
|
303
304
|
const { home, pipelineSrc, dest, indexOnly, useSymlinks, platformFlag } = opts;
|
|
304
305
|
console.log(" [Copilot CLI] Installing skills...");
|
|
305
306
|
|
|
306
|
-
//
|
|
307
|
-
//
|
|
308
|
-
|
|
307
|
+
// The skills root is always a real directory, in --link mode too: the manifest,
|
|
308
|
+
// index and README written below are generated files, and an older --link
|
|
309
|
+
// install pointed the whole root at pipeline/skills/shared/core, so every one
|
|
310
|
+
// of those writes (and the external / plugin symlinks) landed in the checkout.
|
|
311
|
+
// Link mode now links each authored skill dir individually instead.
|
|
312
|
+
ensureRealDir(dest);
|
|
309
313
|
|
|
310
314
|
if (indexOnly) {
|
|
311
315
|
try {
|
|
@@ -334,7 +338,7 @@ function installSkills(opts) {
|
|
|
334
338
|
let pruned = 0;
|
|
335
339
|
for (const entry of readdirSync(dest, { withFileTypes: true })) {
|
|
336
340
|
if (
|
|
337
|
-
entry.isDirectory() &&
|
|
341
|
+
(entry.isDirectory() || entry.isSymbolicLink()) &&
|
|
338
342
|
entry.name.startsWith("multi-agent") &&
|
|
339
343
|
!sourceNames.has(entry.name)
|
|
340
344
|
) {
|
|
@@ -358,10 +362,15 @@ function installSkills(opts) {
|
|
|
358
362
|
|
|
359
363
|
if (existsSync(sharedCoreSrc)) {
|
|
360
364
|
if (useSymlinks) {
|
|
361
|
-
// --link (dev) mode points at the repo, so there is nothing
|
|
362
|
-
// and rewriting would mean editing the checkout.
|
|
363
|
-
|
|
364
|
-
|
|
365
|
+
// --link (dev) mode points each skill dir at the repo, so there is nothing
|
|
366
|
+
// to rewrite - and rewriting would mean editing the checkout.
|
|
367
|
+
ensureDir(dest);
|
|
368
|
+
for (const e of readdirSync(sharedCoreSrc, { withFileTypes: true })) {
|
|
369
|
+
if (!e.isDirectory()) continue;
|
|
370
|
+
wipeDir(join(dest, e.name));
|
|
371
|
+
symlinkDir(join(sharedCoreSrc, e.name), join(dest, e.name));
|
|
372
|
+
copilotSkillCount += countFiles(join(sharedCoreSrc, e.name));
|
|
373
|
+
}
|
|
365
374
|
} else {
|
|
366
375
|
// Wipe each pipeline-owned skill dir before refilling it. Copying only ADDS,
|
|
367
376
|
// so a subtree from an older layout survives inside a directory the installer
|
|
@@ -399,7 +408,7 @@ function installSkills(opts) {
|
|
|
399
408
|
for (const name of keep) {
|
|
400
409
|
const src = join(sharedExternalSrc, name);
|
|
401
410
|
const dst = join(dest, name);
|
|
402
|
-
|
|
411
|
+
wipeDir(dst);
|
|
403
412
|
copyDir(src, dst, { useSymlinks });
|
|
404
413
|
copilotSkillCount += countFiles(src);
|
|
405
414
|
}
|
package/install/index.mjs
CHANGED
|
@@ -54,7 +54,7 @@ export async function runInstall(argv) {
|
|
|
54
54
|
"--dry-run",
|
|
55
55
|
"--prune-external",
|
|
56
56
|
];
|
|
57
|
-
const KNOWN_PREFIXES = ["--
|
|
57
|
+
const KNOWN_PREFIXES = ["--platform="];
|
|
58
58
|
const unknown = flags.filter(
|
|
59
59
|
(f) =>
|
|
60
60
|
f.startsWith("--") &&
|
|
@@ -63,9 +63,7 @@ export async function runInstall(argv) {
|
|
|
63
63
|
);
|
|
64
64
|
if (unknown.length > 0) {
|
|
65
65
|
console.error(`Error: unknown flag(s): ${unknown.join(", ")}`);
|
|
66
|
-
console.error(
|
|
67
|
-
`Supported: ${[...KNOWN_FLAGS, "--target=<path>", "--platform=<ios|android|all>"].join(" ")}`,
|
|
68
|
-
);
|
|
66
|
+
console.error(`Supported: ${[...KNOWN_FLAGS, "--platform=<ios|android|all>"].join(" ")}`);
|
|
69
67
|
process.exit(1);
|
|
70
68
|
}
|
|
71
69
|
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
1. **Analysis** - Stack detection, codebase exploration
|
|
13
13
|
2. **Planning** - Task decomposition, architecture review, user approval
|
|
14
14
|
3. **Dev** - TDD cycle: test -> code -> build
|
|
15
|
-
4. **Review** - Deterministic gates + CLI-aware parallel review +
|
|
16
|
-
|
|
17
|
-
cross-provider diversity) + Opus (security + architecture) + Sonnet
|
|
18
|
-
correctness)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
4. **Review** - Deterministic gates + CLI-aware parallel review + triage.
|
|
16
|
+
Every host dispatches **3 reviewers in parallel**. Copilot CLI: GPT-5.4 (edge
|
|
17
|
+
cases + cross-provider diversity) + Opus (security + architecture) + Sonnet
|
|
18
|
+
(quality + correctness), followed by an Opus triage pass. Claude Code: Fable +
|
|
19
|
+
Opus + Sonnet, followed by a Fable triage pass (GPT-5.4 is not natively
|
|
20
|
+
reachable there - the only intentional cross-CLI asymmetry for Phase 4). Triage
|
|
21
|
+
filters false-positives and out-of-scope items before looping back to Phase 3.
|
|
22
22
|
5. **Test** - Optional manual testing + on-demand device audits
|
|
23
23
|
6. **Commit** - Secret scan · commit · push · PR creation
|
|
24
24
|
7. **Report** - Jira comment · Wiki + Figma screenshots · Confluence · log · knowledge + memory
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "16.
|
|
3
|
+
"version": "16.20.0",
|
|
4
4
|
"description": "8-phase AI development pipeline with full orchestration on Claude Code, Copilot CLI and Codex CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
},
|
|
15
15
|
"scripts": {
|
|
16
16
|
"start": "node index.js",
|
|
17
|
-
"test": "npm run format:check && node --test test/*.test.mjs && node pipeline/scripts/run-smokes.mjs && node pipeline/scripts/lint-skills.mjs && node pipeline/scripts/lint-mcp-refs.mjs && node pipeline/scripts/eval-triage.mjs && node pipeline/scripts/eval-golden-tasks.mjs && node pipeline/scripts/eval-intent.mjs && node pipeline/scripts/eval-recall.mjs && node pipeline/scripts/validate-schemas.mjs && node pipeline/scripts/validate-prefs.mjs && node pipeline/scripts/scorecard.mjs",
|
|
17
|
+
"test": "npm run format:check && node --test test/*.test.mjs && node pipeline/scripts/run-smokes.mjs && node pipeline/scripts/lint-skills.mjs && node pipeline/scripts/lint-personas.mjs && node pipeline/scripts/lint-mcp-refs.mjs && node pipeline/scripts/eval-triage.mjs && node pipeline/scripts/eval-golden-tasks.mjs && node pipeline/scripts/eval-intent.mjs && node pipeline/scripts/eval-recall.mjs && node pipeline/scripts/validate-schemas.mjs && node pipeline/scripts/validate-prefs.mjs && node pipeline/scripts/scorecard.mjs",
|
|
18
18
|
"test:unit": "node --test test/*.test.mjs",
|
|
19
19
|
"test:smoke": "node pipeline/scripts/run-smokes.mjs",
|
|
20
20
|
"lint:skills": "node pipeline/scripts/lint-skills.mjs",
|
|
21
|
-
"test:quick": "node --test test/*.test.mjs && node pipeline/scripts/lint-skills.mjs && node pipeline/scripts/lint-mcp-refs.mjs",
|
|
21
|
+
"test:quick": "node --test test/*.test.mjs && node pipeline/scripts/lint-skills.mjs && node pipeline/scripts/lint-personas.mjs && node pipeline/scripts/lint-mcp-refs.mjs",
|
|
22
22
|
"test:coverage": "c8 --clean --reporter=none node --test test/*.test.mjs && c8 --clean=false --check-coverage --reporter=text --reporter=lcov node pipeline/scripts/run-smokes.mjs",
|
|
23
23
|
"lint": "eslint .",
|
|
24
24
|
"lint:fix": "eslint . --fix",
|
|
@@ -85,6 +85,7 @@
|
|
|
85
85
|
"!pipeline/scripts/eval-*.mjs",
|
|
86
86
|
"!pipeline/scripts/scorecard.mjs",
|
|
87
87
|
"!pipeline/scripts/lint-skills.mjs",
|
|
88
|
+
"!pipeline/scripts/lint-personas.mjs",
|
|
88
89
|
"!pipeline/scripts/lint-mcp-refs.mjs",
|
|
89
90
|
"!pipeline/scripts/check-md-links.mjs",
|
|
90
91
|
"!pipeline/scripts/validate-schemas.mjs",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
+
name: code-reviewer
|
|
2
3
|
description: "Code reviewer for multi-agent Phase 4 - security, architecture, quality, performance. Default model is fable (opus is the first fallback); Phase 4 orchestrator overrides to sonnet for Reviewer 3."
|
|
3
4
|
model: fable
|
|
4
5
|
preferredModel: fable
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
+
name: dev-critic
|
|
2
3
|
description: "Phase 3.5 evaluator - runs after Dev's last edit, before Phase 4. Verifies build/test/checklist gates; returns pass | fix-list. Sonnet by default; Phase 3 orchestrator may override."
|
|
3
4
|
model: sonnet
|
|
4
5
|
preferredModel: sonnet
|
|
@@ -79,7 +80,7 @@ Apply the platform checklist verbatim. **Cite the rule file + line/section** so
|
|
|
79
80
|
- **Max 2 critic iterations.** Generator gets feedback, edits, you re-evaluate. If round 2 still fails gates, **escalate**: return `escalate: true` and let the orchestrator decide (pause user / abort / continue with known failures).
|
|
80
81
|
- Round 1 budget: full critic pass with all gates + checklist.
|
|
81
82
|
- Round 2 budget: ONLY re-check the items that failed round 1. Don't re-flag what the generator fixed.
|
|
82
|
-
- Never add new findings in round 2 that weren't in round 1's output - that's scope creep, not iteration.
|
|
83
|
+
- Never add new findings in round 2 that weren't in round 1's output - that's scope creep, not iteration. Round-2 findings carry the round-1 `fingerprint` (`finding-fingerprint.mjs annotate --kind dev-critic`); a round-2 finding with no round-1 fingerprint is the scope creep this rule forbids.
|
|
83
84
|
|
|
84
85
|
## Output Format
|
|
85
86
|
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
|
|
14
14
|
### Pipeline Phases
|
|
15
15
|
|
|
16
|
-
1. Analysis (
|
|
17
|
-
2. Planning (Opus) -> spec, task breakdown
|
|
16
|
+
1. Analysis (Sonnet, `explorer` persona) -> scope, impact analysis
|
|
17
|
+
2. Planning (Fable; Opus when the fallback ladder engages) -> spec, task breakdown
|
|
18
18
|
3. Development (Sonnet) -> TDD, code, build
|
|
19
19
|
4. Review -> deterministic gates + parallel review + Fable triage
|
|
20
20
|
- Claude Code: Fable + Opus + Sonnet (3 paralel)
|