@mmerterden/multi-agent-pipeline 14.1.0 → 14.2.1
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 +177 -1
- package/README.md +4 -4
- package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +1 -1
- package/package.json +1 -1
- package/pipeline/commands/deploy.md +4 -1
- package/pipeline/commands/multi-agent/SKILL.md +6 -3
- package/pipeline/commands/multi-agent/dev/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/help/SKILL.md +49 -11
- package/pipeline/commands/multi-agent/setup/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +340 -0
- package/pipeline/commands/multi-agent/sync/SKILL.md +11 -5
- package/pipeline/commands/multi-agent/test/SKILL.md +18 -8
- package/pipeline/commands/multi-agent/test-accessibility/SKILL.md +33 -0
- package/pipeline/commands/multi-agent/test-dark-mode/SKILL.md +33 -0
- package/pipeline/commands/multi-agent/test-dynamic-type/SKILL.md +33 -0
- package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +41 -0
- package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +28 -201
- package/pipeline/commands/sim-test.md +45 -36
- package/pipeline/multi-agent-refs/cross-cli-contract.md +3 -2
- package/pipeline/multi-agent-refs/knowledge.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +7 -4
- package/pipeline/schemas/prefs.schema.json +1 -1
- package/pipeline/schemas/token-budget.json +2 -2
- package/pipeline/scripts/build-stack-plugins.mjs +21 -0
- package/pipeline/scripts/migrate-prefs.mjs +30 -0
- package/pipeline/skills/.skills-index.json +57 -12
- package/pipeline/skills/shared/README.md +11 -6
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +13 -17
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +50 -12
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +18 -3
- package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +50 -0
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +18 -8
- package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +37 -0
- package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +37 -0
- package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +37 -0
- package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +44 -0
- package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +29 -101
- package/pipeline/skills/shared/external/firebase/SKILL.md +1 -1
- package/pipeline/skills/skills-index.md +9 -4
package/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,182 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
16
16
|
|
|
17
17
|
## [Unreleased]
|
|
18
18
|
|
|
19
|
+
## [14.2.1] - 2026-07-30
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- **`testflight-validation` merged into a new `/multi-agent:store-ready`, and the
|
|
24
|
+
Android side brought to parity.** The iOS archive audit existed twice with
|
|
25
|
+
identical arguments - `ios_app_store_audit({archive_path, rules: "all"})` in the
|
|
26
|
+
command's Gate 1 and again inside `sim-test.md`'s `store-ready` scenario. Two
|
|
27
|
+
copies of one call is how the second door grew with no Gate 2, no Gate 3 and no
|
|
28
|
+
Android equivalent. There is now one implementation.
|
|
29
|
+
Gates are symmetric per platform, because the failure modes are: a malformed
|
|
30
|
+
package, a package the store itself refuses, and a policy a human enforces.
|
|
31
|
+
|
|
32
|
+
| Gate | iOS | Android |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| 1 Static | `ios_app_store_audit`, 18 rules | `android_apk_audit` + `google-play-compliance`, 21 rules |
|
|
35
|
+
| 2 Authoritative | `altool --validate-app` | `SKIPPED` |
|
|
36
|
+
| 3 Policy | `app-store-review` vs source | `play-store-review` vs source |
|
|
37
|
+
|
|
38
|
+
Gate 2's asymmetry is reported as an asymmetry rather than smoothed over: Play's
|
|
39
|
+
authoritative check exists only server-side, through a Publishing API draft edit,
|
|
40
|
+
and the pipeline ships no client for it. An Android run therefore clears at most
|
|
41
|
+
2 of 3 and never prints `passed`. `bundletool validate` is Gate 1 and is not
|
|
42
|
+
promoted to fill the hole.
|
|
43
|
+
The running-app sweep became Step A rather than a separate errand - a build can
|
|
44
|
+
be structurally perfect and still ship an unreadable screen - and it degrades to
|
|
45
|
+
`SKIPPED (no booted device)` instead of halting the package validation.
|
|
46
|
+
|
|
47
|
+
Nothing was removed. `testflight-validation` is a thin iOS-pinned alias (removing
|
|
48
|
+
a command is a breaking change to the slash-command surface), and
|
|
49
|
+
`test "store-ready"` still resolves, now as a hand-off. `sim-test.md` keeps only
|
|
50
|
+
the pointer, so a dark-mode run no longer loads altool and credential-tier prose
|
|
51
|
+
it never needs.
|
|
52
|
+
|
|
53
|
+
### Added
|
|
54
|
+
|
|
55
|
+
- **Four fixed-scenario `test-*` commands.** `/multi-agent:test-dark-mode`,
|
|
56
|
+
`:test-accessibility`, `:test-dynamic-type` and `:test-screenshots [locale]` pin a
|
|
57
|
+
scenario the quoted-tag form made you remember and quote. Typing `test-` now
|
|
58
|
+
autocompletes the matrix list instead of returning a single entry whose tags live
|
|
59
|
+
only in the help text. The scenario-tag form is unchanged and not deprecated -
|
|
60
|
+
each command is an alias for it, delegating to the same `sim-test.md`, so there is
|
|
61
|
+
one implementation and no forked logic. Same pattern the mode aliases already use
|
|
62
|
+
(`:dev-autopilot` = `--dev autopilot`).
|
|
63
|
+
`screenshot <lang>` became `test-screenshots [locale]` rather than
|
|
64
|
+
`test-screenshot-tr`: the locale is a parameter, and freezing one language into a
|
|
65
|
+
command name buys one command per language. `store-ready` deliberately got no
|
|
66
|
+
alias - it takes an optional archive path, and its 18-rule audit is the same one
|
|
67
|
+
`/multi-agent:testflight-validation` runs as its first gate, so the alias would
|
|
68
|
+
have advertised a second door onto a duplicate.
|
|
69
|
+
|
|
70
|
+
### Fixed
|
|
71
|
+
|
|
72
|
+
- **Copilot's `purge` could not see a single worktree.** It discovered them with
|
|
73
|
+
`find {repo}/.worktrees/ -name "agent-state.json"`, and no worktree carries that
|
|
74
|
+
file: Phase 0 writes state to `$HOME/.claude/logs/multi-agent/{project}/{task-id}/`.
|
|
75
|
+
Verified on a repo with two live task worktrees - the marker scan returns zero
|
|
76
|
+
while `purge.sh`'s own directory enumeration finds both. So the skill reported
|
|
77
|
+
"nothing to purge" as success with real worktrees on disk. The Claude Code command
|
|
78
|
+
had already been fixed by delegating to `purge.sh`; the Copilot mirror never
|
|
79
|
+
received that fix, which is the second time a repaired Claude-side surface left its
|
|
80
|
+
Copilot counterpart behind in this release.
|
|
81
|
+
It now delegates to the script and explicitly forbids re-introducing a
|
|
82
|
+
marker-file scan.
|
|
83
|
+
- **The stale log location survived in four more places** after `clear-logs` was
|
|
84
|
+
redirected. `shared/core/multi-agent` told Phase 0 to create `agent-log.md` and
|
|
85
|
+
`agent-state.json` inside `.worktrees/PROJ-{id}/`, told `:resume` to look for state
|
|
86
|
+
there, and printed that path as the report location; `phase-0-init` said "create log
|
|
87
|
+
dir" without naming one, 49 lines above the line that does. All four now name
|
|
88
|
+
`$HOME/.claude/logs/multi-agent/{project}/{task-id}/`, the path the tracker,
|
|
89
|
+
`prune-logs.sh` and `:resume` actually read.
|
|
90
|
+
`status` and `log` keep their worktree scan as a legacy fallback: it finds nothing
|
|
91
|
+
on a current tree, but it is harmless and would still serve an old one.
|
|
92
|
+
|
|
93
|
+
- **`clear-logs` scanned a path nothing writes to, and help advertised it as a
|
|
94
|
+
slash command that does not exist.** It looked for
|
|
95
|
+
`.worktrees/PROJ-*/agent-log.md` and `agent-state.json`; Phase 0 has written both
|
|
96
|
+
to `$HOME/.claude/logs/multi-agent/{project}/{task-id}/` since the layout moved.
|
|
97
|
+
Against the current tree the scan matches zero files, so the op reported "logs
|
|
98
|
+
cleared, deleted 0" as success while every real log stayed on disk - worse than a
|
|
99
|
+
missing command, because it reads as done. There was also no `clear-logs` command
|
|
100
|
+
directory, so the `/multi-agent:clear-logs` entry in the Copilot help pointed at a
|
|
101
|
+
slash command that was never installed.
|
|
102
|
+
The name is kept as a redirect to `prune-logs` rather than deleted, so an existing
|
|
103
|
+
invocation lands somewhere correct. `prune-logs` and `garbage-collect` now appear
|
|
104
|
+
in the Copilot help, matching the Claude Code side. This is the `finish` → `ship`
|
|
105
|
+
class of drift the inventory gate's own comment describes, in the files that gate
|
|
106
|
+
does not parse.
|
|
107
|
+
- **`sim-test.md` advertised two scenarios it never implemented.** `"biometric"` and
|
|
108
|
+
`"performance"` sat in the activation block with no implementation section, so
|
|
109
|
+
reaching either fell through to the general sweep and was reported as the scenario
|
|
110
|
+
asked for. Neither can be built symmetrically today: biometric has `ios_biometric`
|
|
111
|
+
and no Android counterpart, launch timing has `android_launch_time` and no iOS
|
|
112
|
+
counterpart, and the file auto-detects platform - so each would work on one
|
|
113
|
+
platform and silently do nothing on the other. Both rows are withdrawn with the
|
|
114
|
+
reason recorded in place, rather than shipped as half-features or left advertised.
|
|
115
|
+
Advertised scenarios and implemented sections now match one to one.
|
|
116
|
+
- **`help` never documented two shipped commands.** `testflight-validation` and
|
|
117
|
+
`ios-coding-standard` existed in the tree, installed correctly, and appeared in no
|
|
118
|
+
block of `help/SKILL.md` in either language - `ios-coding-standard` was reachable
|
|
119
|
+
only because it also sat in `prefs.global.routines`, i.e. it read as a personal
|
|
120
|
+
routine rather than a first-party command. Both are now in the EN and TR Post-Hoc
|
|
121
|
+
sections. A command absent from help is a command nobody runs.
|
|
122
|
+
- **Rule count drifted between the two language blocks.** The TR block advertised a
|
|
123
|
+
17-rule iOS store audit against the EN block's 18 and `ios_app_store_audit`'s
|
|
124
|
+
actual 18. The TR reader was being given a number no code produces.
|
|
125
|
+
|
|
126
|
+
### Changed
|
|
127
|
+
|
|
128
|
+
- **`DESC_CEILING` 78000 -> 81000**, with the paired pin in
|
|
129
|
+
`test/context-budget-gate.test.mjs` moved in the same commit, as that test
|
|
130
|
+
requires. Not a bump to silence a red gate: at 78000 the surface had **16 bytes**
|
|
131
|
+
of headroom, so any new command failed regardless of how tersely it was described,
|
|
132
|
+
while the gate's own average check sat at 320 against its 420 ceiling - the signal
|
|
133
|
+
that the tree grew rather than that descriptions are padded. The alternative was
|
|
134
|
+
shaving routing text off eight unrelated `shared/external` skills to fund four
|
|
135
|
+
commands, which trades a real capability for a cosmetic number. Both the gate and
|
|
136
|
+
the test now carry the ceiling's history inline so the next raise has to argue for
|
|
137
|
+
itself. Cost is honest: ~470 always-on tokens per run.
|
|
138
|
+
|
|
139
|
+
## [14.1.1] - 2026-07-30
|
|
140
|
+
|
|
141
|
+
Three defects that all shared one shape: a name written in one place and read in
|
|
142
|
+
another, so the mechanism looked implemented, ran without error, and did nothing.
|
|
143
|
+
|
|
144
|
+
- **Phase 0 wrote the base-ref field its own exit gate does not read.** `/multi-agent:dev`
|
|
145
|
+
recorded `"baseRefFreshness"` while `phase0-exit-gate.mjs` requires `baseFetchStatus`
|
|
146
|
+
with one of `fresh | cached-stale | local-branch | aborted`. The value vocabulary was
|
|
147
|
+
already correct - only the field name differed - so every dev-mode run failed its own
|
|
148
|
+
exit gate with `baseFetchStatus="<unset>"` even when all four Phase 0 pickers had
|
|
149
|
+
actually run. A gate that always fails is as useless as one that never fails. The
|
|
150
|
+
canonical name appeared in five places and the wrong one in exactly one: the dev
|
|
151
|
+
command's own doc. `smoke-phase-0-multi-repo.sh` now asserts that the name the exit
|
|
152
|
+
gate reads equals the name the phase doc documents, and that no shipped file names an
|
|
153
|
+
alternative, with a planted-line probe proving the detector can fire.
|
|
154
|
+
- **Branch memory never populated.** Phase 0 Step 3 read
|
|
155
|
+
`prefs.global.recentBranches[{projectKey}]` while its own step 7 wrote the legacy
|
|
156
|
+
`prefs.projects[].branches`, which `prefs.schema.json` marks pre-v2.1.0. Both spots
|
|
157
|
+
also described a `{name, lastUsed}` entry the schema rejects (`branch` is required and
|
|
158
|
+
`additionalProperties` is false), so a literal implementation would have failed prefs
|
|
159
|
+
validation and the dedup - which keys on `branch` - would have accumulated a duplicate
|
|
160
|
+
every run. The "reused from last run" picker option could therefore never appear.
|
|
161
|
+
`migrate-prefs.mjs` carries stranded legacy entries into the canonical LRU, stamped
|
|
162
|
+
with the migration time because the legacy field never recorded a real one and an epoch
|
|
163
|
+
stamp would be pruned by the TTL on first read; `count: 0` marks them seeded rather
|
|
164
|
+
than observed.
|
|
165
|
+
- **The sync skill hardcoded the author's git identity.** `git config user.name`,
|
|
166
|
+
`user.email` and `gh auth switch --user` carried literal values in the plugin-publish
|
|
167
|
+
block, while the same file's other two publish blocks used `{identity.name}` and
|
|
168
|
+
`{owner}`. Since the file ships to every installation, a downstream user's
|
|
169
|
+
plugins-repo commits would have been attributed to someone else and their `gh` account
|
|
170
|
+
switched under them - and it contradicted the pipeline's own rule that the git author
|
|
171
|
+
is always the user's identity.
|
|
172
|
+
|
|
173
|
+
Leak-gate coverage, which is why the third defect had gone unnoticed:
|
|
174
|
+
|
|
175
|
+
- `smoke-personal-data.sh` only ever scanned `pipeline/`, but the package also publishes
|
|
176
|
+
`install/`, `docs/`, `index.js`, `install.js`, `README.md` and `CHANGELOG.md`, and every
|
|
177
|
+
tracked file is public regardless of what npm ships. `CHANGELOG.md` was additionally in
|
|
178
|
+
the `--exclude` list. A second pass now scans every tracked file outside `pipeline/`,
|
|
179
|
+
driven by `git ls-files` so the covered set stays exactly "what is public" with no
|
|
180
|
+
second list to maintain. `LICENSE`, `package.json` and `CODE_OF_CONDUCT.md` are exempt,
|
|
181
|
+
because a package must name its author and a code of conduct must give a real contact.
|
|
182
|
+
- Added patterns for the author's own name, personal email and `gh auth switch` account -
|
|
183
|
+
none were checked before, which is precisely how a literal identity survived in a
|
|
184
|
+
shipped command - plus the employer's abbreviation where it is used as a symbol or
|
|
185
|
+
workspace prefix, bounded so ordinary words that merely contain those letters
|
|
186
|
+
(`HEALTHY`, `RHYTHM`) do not match.
|
|
187
|
+
- `--exclude-dir` for `.git`, `node_modules`, `.worktrees`, `.next` and `DerivedData`.
|
|
188
|
+
Without it, `--root` mode scanned `.git/logs`, so auditing any checkout was guaranteed
|
|
189
|
+
to "fail" on commit metadata no consumer receives, burying the real findings.
|
|
190
|
+
- Five leaks removed from public files: a real corporate email in `CHANGELOG-archive.md`,
|
|
191
|
+
a corporate toolkit name in both changelogs, the author's website in `docs/adr/0008`
|
|
192
|
+
and `docs/internal/`, and corporate symbol/repo/task literals in `docs/internal/`.
|
|
193
|
+
These are gone from HEAD; git history still contains them.
|
|
194
|
+
|
|
19
195
|
## [14.1.0] - 2026-07-29
|
|
20
196
|
|
|
21
197
|
Two things the pipeline was supposed to do and did not: use the skills a project's
|
|
@@ -2650,7 +2826,7 @@ Analysis open-question resolver + repo hygiene hardening.
|
|
|
2650
2826
|
blockquotes), humanizer punctuation policy, no Figma access (Locked 30 - design-gap
|
|
2651
2827
|
rows get only Defer + a re-run recommendation), no auto-commit. Command inventory
|
|
2652
2828
|
33 -> 34; `/multi-agent:analysis` Phase 5 report now suggests the resolver when
|
|
2653
|
-
Section 20 has open rows. Pattern ported from
|
|
2829
|
+
Section 20 has open rows. Pattern ported from a private stack toolkit's resolver skills.
|
|
2654
2830
|
- **Dead references removed.** `analysis.md` Reusable refs no longer points at a
|
|
2655
2831
|
non-existent `fetch-wiki.sh` (the wiki fetch chain is inline: clone -> gh api ->
|
|
2656
2832
|
WebFetch); `refs/features/external-context-injection.md` figma row routed to the real
|
package/README.md
CHANGED
|
@@ -62,11 +62,11 @@ The discipline behind all of this - bounded loops, evidence gates, token-budgete
|
|
|
62
62
|
| Autopilot | `/multi-agent:autopilot "task"` | All 8 phases, no confirmations |
|
|
63
63
|
| Dev | `/multi-agent:dev "task"` | Init → Dev → Review → Test → Commit → Report |
|
|
64
64
|
| Local | `/multi-agent:local "task"` | Full pipeline, current branch (no worktree) |
|
|
65
|
-
|
|
|
65
|
+
| Ship | `/multi-agent:ship` | Run the review→test→commit→report tail over local work |
|
|
66
66
|
| Audit | `/multi-agent:design-check` | Mock-mode vs Figma conformance, local-only |
|
|
67
67
|
| Audit | `/multi-agent:testflight-validation` | Pre-submission gates for a TestFlight build: static archive audit → Apple's `altool --validate-app` → Review-Guidelines check. Validates only, never uploads |
|
|
68
68
|
|
|
69
|
-
Helpers: `setup`, `status`, `resume #N`, `review`, `test`, `channels`, `stack`, `update`, `sync`, `refactor`, `jira`, `issue`, `analysis`, `create-jira`, `save`, `routines`, `forget`.
|
|
69
|
+
Helpers: `setup`, `status`, `resume #N`, `review`, `test`, `channels`, `stack`, `update`, `sync`, `refactor`, `jira`, `issue`, `analysis`, `create-jira`, `save`, `routines`, `forget`. 44 commands in all - full list: `/multi-agent:help`.
|
|
70
70
|
|
|
71
71
|
## Stacks
|
|
72
72
|
|
|
@@ -80,12 +80,12 @@ This enables the matching plugin (+ the shared `ai-common` plugin) in the repo's
|
|
|
80
80
|
|
|
81
81
|
## Tool support
|
|
82
82
|
|
|
83
|
-
The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same
|
|
83
|
+
The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same 44 commands.
|
|
84
84
|
|
|
85
85
|
| Tool | Flag | What it installs |
|
|
86
86
|
|---|---|---|
|
|
87
87
|
| Claude Code | `--claude` (default) | slash commands + skills + agents + `PreToolUse` secret-scan hook |
|
|
88
|
-
| Copilot CLI | `--copilot` | instructions +
|
|
88
|
+
| Copilot CLI | `--copilot` | instructions + 44 sub-command skills + scripts |
|
|
89
89
|
| Codex CLI | `--codex` | one router skill + 43 specs as refs + 8 agent TOML + `AGENTS.md` block + `codex mcp add` |
|
|
90
90
|
|
|
91
91
|
Filter skills by stack with `--platform=ios\|android\|all`.
|
|
@@ -10,7 +10,7 @@ Two pressures collided during the v7.x line:
|
|
|
10
10
|
|
|
11
11
|
1. **Installer monolith.** `install.js` reached 1246 LOC by v7.9.1. It mixed flag parsing, three platform installers (Claude / Copilot / six third-party adapters), telemetry, a dev-only file exclusion list, and a 200-line static generator for `copilot-instructions.md`. Reasoning about install behaviour required holding the whole file in your head; reviewers asked for documentation we could not produce because every change touched untyped, intertwined sections.
|
|
12
12
|
|
|
13
|
-
2. **Secret leaks at deploy time.** During the v7.9.1 production deploy of
|
|
13
|
+
2. **Secret leaks at deploy time.** During the v7.9.1 production deploy of the project website, a `vercel deploy --token=vcp_...` invocation failed. The Vercel CLI printed the failed argv verbatim in its retry hint. That leaked the deploy token into the conversation transcript and forced a token rotation. A second incident in the same release window - `git -c user.email=...` overriding the repo-local config - pushed seven commits with the wrong author identity, which Vercel's contributor gate then blocked. Both classes of failure share a root cause: privileged values flowed through argv when the codebase had no audited boundary between provider tools and the orchestration layer.
|
|
14
14
|
|
|
15
15
|
We needed an architectural answer that prevented both classes of failure from recurring without expanding scope into "rewrite everything as TypeScript" - the project's zero-dependency philosophy (ADR-4) is a hard constraint.
|
|
16
16
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "14.1
|
|
3
|
+
"version": "14.2.1",
|
|
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",
|
|
@@ -43,7 +43,10 @@ Run through the iOS deployment checklist before App Store submission.
|
|
|
43
43
|
### 6. Archive & Upload
|
|
44
44
|
|
|
45
45
|
- [ ] Archive with Release configuration
|
|
46
|
-
- [ ] Run
|
|
46
|
+
- [ ] Run pre-submission validation: `/multi-agent:store-ready --archive=<archive>` - three gates
|
|
47
|
+
(static audit, Apple's own `altool --validate-app`, guideline review vs source).
|
|
48
|
+
`/archive-guard <archive>` is the quick single-gate form when only the static
|
|
49
|
+
audit is wanted.
|
|
47
50
|
- [ ] Upload via Xcode Organizer or `xcrun altool`
|
|
48
51
|
- [ ] Verify in App Store Connect
|
|
49
52
|
|
|
@@ -72,7 +72,7 @@ Lib scripts (`~/.claude/lib/`):
|
|
|
72
72
|
| `log [id]` | Show task log |
|
|
73
73
|
| `resume [id]` | Resume paused task |
|
|
74
74
|
| `kill [id]` | Delete worktree (logs preserved). Confirm first |
|
|
75
|
-
| `clear-logs` |
|
|
75
|
+
| `clear-logs` | **Superseded - redirect, do not run.** Say so and route to `prune-logs`. It targeted `.worktrees/PROJ-*/agent-log.md`, a path nothing has written to since logs moved to `$HOME/.claude/logs/multi-agent/{project}/{task-id}/`; running it would report deleting nothing as success. |
|
|
76
76
|
| `purge` | Worktree + logs + counter - full reset (double confirm) |
|
|
77
77
|
| `review [#N\|repo#N\|PR-url\|branch]` | Parallel review of a PR or branch diff; with no input (interactive) lists open GitHub + Bitbucket PRs to multi-select. Posts per-finding inline comments + approve/needs-work on PRs. No worktree. |
|
|
78
78
|
| `review-jira [KEY\|url]` | Grade a Jira issue's readiness for the pipeline (scope / AC / repro / design / API / stack), then post the gaps as a Jira comment. Read-only on code. |
|
|
@@ -82,6 +82,8 @@ Lib scripts (`~/.claude/lib/`):
|
|
|
82
82
|
| `channels [PR-url\|#N\|Jira-url\|Jira-id] [--channels pr,jira,confluence,wiki] [--content normal,test,auto-diff,note] [--message "..."]` | Post task report to multi-select channels (PR description, Jira comment, Confluence page, Wiki pages) with multi-select content sources. Humanizer pass per-channel. Bitbucket PR updates use reviewer-preserving PUT. Phase 7 delegates to this command; also invocable post-hoc for fixes made outside the pipeline. No worktree. |
|
|
83
83
|
| `create-jira ["desc"] [figma-url] [swagger-url]` | Create a standards-compliant Jira issue: asks the type (**Task** / **Bug** / **Story**), mines the project's recent same-type issues for conventions (summary format, labels, priority, test-scenario style), detects the active sprint, drafts from a standard template with auto-sizing sections (Design Reference / API Contract / Screenshots appear only when their source is given), asks about unknown fields, then full draft preview + explicit approval before create. No worktree, no commits. |
|
|
84
84
|
| `test` or `test [args]` | UI Bug Hunter - screenshot + tap + analyze on booted simulator via MCP (read `$HOME/.claude/commands/sim-test.md`). `/multi-agent:test` also resolves here via the `commands/multi-agent/test/SKILL.md` delegate. |
|
|
85
|
+
| `test-dark-mode` · `test-accessibility` · `test-dynamic-type` · `test-screenshots [locale]` | Fixed-scenario aliases for the four parameterless / single-parameter `test` scenarios, so the tag autocompletes instead of having to be quoted. Each delegates to the same `sim-test.md` with its scenario pinned; behaviour is identical to the quoted form, which is not deprecated. |
|
|
86
|
+
| `store-ready [repo] [--archive=\|--ipa=\|--aab=\|--apk=] [--skip-sweep]` | Pre-submission store readiness for a built **package**, iOS and Android, local-only. Three symmetric gates per platform - static package audit, the store's own validator, policy review vs repo source - plus the running-app sweep as Step A. A skipped gate is never folded into the pass count, and an Android run clears at most 2 of 3 because Play's authoritative check is server-side only. Validates only, never uploads. `testflight-validation` is the iOS-pinned alias; `test "store-ready"` hands off here. |
|
|
85
87
|
| `manual-test [#id]` | Phase 5 standalone Manual Test - checks out the task branch, prints Xcode / SourceTree hints, waits for user verdict (`ok` / `fix: ...`). |
|
|
86
88
|
| `design-check [scope]` | Mock-mode vs Figma design audit (iOS / Android, local-only). Pick repo + module → mock-support feasibility gate (halts if unsupported) → **scenario inventory** (every launch arg / scenario case / scenario code / fixture / deep link becomes a countable target with file+line evidence) → scope resolve (empty = module, screen, `screen@variant`, target id, Figma URLs, `--resume`) → worktree Debug build + mock launch → drive EACH target by its own driver, capturing tap-reachable sub-states with it → per-variant pixel + px-spacing + typography + color compare → report (side-by-side + annotated overlay + stacked findings + fix prompt) exported to `~/DesignChecks/` as HTML + PDF (+ Confluence if enabled). **Coverage gate**: a target is audited or skipped with a concrete reason, else the run is reported INCOMPLETE with the missing ids. No commits, no CI. |
|
|
87
89
|
| `stack [ios\|android\|backend\|mobile\|all]` | Swap skills for next conversation. No arg = show current stack. |
|
|
@@ -113,7 +115,7 @@ This command uses lazy loading for token efficiency. Read the relevant sub-file
|
|
|
113
115
|
| `help` | `$HOME/.claude/commands/multi-agent/help/SKILL.md` |
|
|
114
116
|
| `channels` | `$HOME/.claude/commands/multi-agent/channels/SKILL.md` |
|
|
115
117
|
| `sync` | `$HOME/.claude/commands/multi-agent/sync/SKILL.md` |
|
|
116
|
-
| `clear-logs` | Handled inline -
|
|
118
|
+
| `clear-logs` | Handled inline - redirect to `prune-logs`, see the routing note |
|
|
117
119
|
| `review` | `$HOME/.claude/commands/multi-agent/review/SKILL.md` |
|
|
118
120
|
| `review-jira` | `$HOME/.claude/commands/multi-agent/review-jira/SKILL.md` (loads `$HOME/.claude/multi-agent-refs/readiness-review.md`) |
|
|
119
121
|
| `review-issue` | `$HOME/.claude/commands/multi-agent/review-issue/SKILL.md` (loads `$HOME/.claude/multi-agent-refs/readiness-review.md`) |
|
|
@@ -136,10 +138,11 @@ This command uses lazy loading for token efficiency. Read the relevant sub-file
|
|
|
136
138
|
| Token lookup needed | `$HOME/.claude/multi-agent-refs/keychain.md` |
|
|
137
139
|
| Audit tools (Phase 5/6) | `$HOME/.claude/multi-agent-refs/audit-guide.md` |
|
|
138
140
|
| `test` | `$HOME/.claude/commands/sim-test.md` (colon-form `/multi-agent:test` uses the delegate at `commands/multi-agent/test/SKILL.md`) |
|
|
141
|
+
| `test-dark-mode` · `test-accessibility` · `test-dynamic-type` · `test-screenshots` | `$HOME/.claude/commands/sim-test.md`, scenario pinned by the command name (delegates at `commands/multi-agent/test-*/SKILL.md`) |
|
|
139
142
|
| `manual-test` | `$HOME/.claude/commands/multi-agent/manual-test/SKILL.md` |
|
|
140
143
|
| `design-check` | `$HOME/.claude/commands/multi-agent/design-check/SKILL.md` |
|
|
141
144
|
|
|
142
|
-
**Modifier flags** (`--dev`, `--local`, `autopilot`) and **ops** (`status`, `log`, `resume`, `kill`, `
|
|
145
|
+
**Modifier flags** (`--dev`, `--local`, `autopilot`) and **ops** (`status`, `log`, `resume`, `kill`, `purge`, `review`) are parsed inline by this file - no separate spec files, they compose with the pipeline or do one-shot work.
|
|
143
146
|
|
|
144
147
|
**How**: After routing, `Read` the relevant file and follow its instructions. Only load what the current action needs.
|
|
145
148
|
|
|
@@ -91,9 +91,13 @@ The agent CANNOT make these Phase 0 decisions automatically; it suggests, then w
|
|
|
91
91
|
3. Cancel
|
|
92
92
|
Confirm? [1/2/3]
|
|
93
93
|
```
|
|
94
|
-
- User picks `2` → log warning + record `"
|
|
94
|
+
- User picks `2` → log warning + record `"baseFetchStatus": "cached-stale"` in
|
|
95
95
|
`agent-state.json`, proceed from local ref. Phase 6 push needs network anyway,
|
|
96
96
|
so re-prompt there if still unreachable.
|
|
97
|
+
- Option `1` (fetch succeeded) records `"fresh"`; a local-branch base records
|
|
98
|
+
`"local-branch"`; option `3` records `"aborted"`. The field name and this
|
|
99
|
+
four-value vocabulary are what `phase0-exit-gate.mjs` reads, so a run that writes
|
|
100
|
+
anything else cannot close Phase 0.
|
|
97
101
|
|
|
98
102
|
Always show what was **observed** next to what was **classified**. The previous
|
|
99
103
|
wording asserted `Detected: <host> unreachable (VPN/DNS)` for every failure mode,
|
|
@@ -119,6 +119,14 @@ Post-Hoc & Side-Channel:
|
|
|
119
119
|
/multi-agent:search Cross-task log search with smart ranking; --semantic queries triage corpus
|
|
120
120
|
/multi-agent:scan Skill security scan against tiered pattern catalog
|
|
121
121
|
/multi-agent:refactor Adapted best-practices + bug hunt + upstream-drift + dev-toolkit MCP research -> one plan, approval, dev + sync
|
|
122
|
+
/multi-agent:store-ready [repo] [--archive=|--ipa=|--aab=|--apk=] [--skip-sweep] Pre-submission store readiness,
|
|
123
|
+
iOS + Android, local-only. Three symmetric gates per platform: static package audit,
|
|
124
|
+
the store's own validator, policy review vs repo source. Plus the running-app sweep.
|
|
125
|
+
A skipped gate is never counted as a pass. Validates only, never uploads.
|
|
126
|
+
/multi-agent:testflight-validation [repo] [--ipa=|--archive=] iOS-pinned alias of :store-ready, kept because it is
|
|
127
|
+
the name you reach for when the target is TestFlight. Same three gates, one implementation.
|
|
128
|
+
/multi-agent:ios-coding-standard [module] Audit an iOS module against the 99-rule coding-standard registry -> remediation
|
|
129
|
+
plan + one-page onboarding summary -> hand off to dev / dev-local. Read-only, never edits source.
|
|
122
130
|
|
|
123
131
|
Setup & Maintenance:
|
|
124
132
|
|
|
@@ -156,11 +164,22 @@ Interactive Launchers:
|
|
|
156
164
|
UI Testing (standalone - not part of pipeline phases):
|
|
157
165
|
|
|
158
166
|
/multi-agent:test Full simulator test (screenshot all screens)
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
/multi-agent:test
|
|
163
|
-
/multi-agent:test
|
|
167
|
+
|
|
168
|
+
Fixed-scenario commands - no quoting, and they autocomplete off `test-`:
|
|
169
|
+
|
|
170
|
+
/multi-agent:test-dark-mode Dark mode bug test
|
|
171
|
+
/multi-agent:test-accessibility Accessibility audit (labels, tap targets, contrast)
|
|
172
|
+
/multi-agent:test-dynamic-type Large text size test
|
|
173
|
+
/multi-agent:test-screenshots [tr] App Store screenshot set in a locale (default tr)
|
|
174
|
+
|
|
175
|
+
The scenario-tag form still works and is not deprecated - each command above is
|
|
176
|
+
an alias for it.
|
|
177
|
+
|
|
178
|
+
/multi-agent:test "dark mode" | "accessibility" | "dynamic type" | "screenshot <lang>"
|
|
179
|
+
|
|
180
|
+
`store-ready` is NOT a UI test: it validates a built package, on iOS and Android,
|
|
181
|
+
through three gates per platform, and lives at /multi-agent:store-ready. The old
|
|
182
|
+
/multi-agent:test "store-ready" [path] tag still works and hands off there.
|
|
164
183
|
|
|
165
184
|
Uses xcrun simctl / adb (native, no external app needed).
|
|
166
185
|
Booted simulator/emulator required. Auto-detects bundle ID from project.
|
|
@@ -362,6 +381,14 @@ Post-Hoc & Side-Channel:
|
|
|
362
381
|
/multi-agent:search Task log'larında akıllı arama; --semantic triage corpus'unu sorgular
|
|
363
382
|
/multi-agent:scan Skill güvenlik taraması (tiered pattern catalog)
|
|
364
383
|
/multi-agent:refactor Uyarlanmış best-practice + bug avı + upstream-drift + dev-toolkit MCP araştırması -> tek plan, onay, dev + sync
|
|
384
|
+
/multi-agent:store-ready [repo] [--archive=|--ipa=|--aab=|--apk=] [--skip-sweep] Yükleme öncesi store hazırlığı,
|
|
385
|
+
iOS + Android, yalnızca lokal. Platform başına 3 simetrik kapı: statik paket denetimi,
|
|
386
|
+
store'un kendi doğrulayıcısı, kaynağa karşı politika incelemesi. Artı çalışan-app sweep'i.
|
|
387
|
+
Atlanan kapı asla pass sayılmaz. Sadece doğrular, asla yüklemez.
|
|
388
|
+
/multi-agent:testflight-validation [repo] [--ipa=|--archive=] :store-ready'nin iOS'a sabitlenmiş alias'ı; hedef
|
|
389
|
+
TestFlight olduğunda akla gelen isim olduğu için korunuyor. Aynı 3 kapı, tek implementasyon.
|
|
390
|
+
/multi-agent:ios-coding-standard [modül] Bir iOS modülünü 99 kurallık kodlama-standardı registry'sine göre denetler -> düzeltme
|
|
391
|
+
planı + tek sayfalık onboarding özeti -> dev / dev-local'e devreder. Read-only, kaynağı hiç düzenlemez.
|
|
365
392
|
|
|
366
393
|
Setup & Maintenance:
|
|
367
394
|
|
|
@@ -399,11 +426,22 @@ Rutinler (kendi tekrar eden işlerin):
|
|
|
399
426
|
UI Testing (standalone - pipeline fazlarından bağımsız):
|
|
400
427
|
|
|
401
428
|
/multi-agent:test Tam simulator testi (tüm ekran screenshot'ları)
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
/multi-agent:test
|
|
406
|
-
/multi-agent:test
|
|
429
|
+
|
|
430
|
+
Sabit-senaryo komutları - tırnak gerekmez, `test-` ile autocomplete'e düşer:
|
|
431
|
+
|
|
432
|
+
/multi-agent:test-dark-mode Dark mode bug testi
|
|
433
|
+
/multi-agent:test-accessibility Erişilebilirlik denetimi (label/tap-target/kontrast)
|
|
434
|
+
/multi-agent:test-dynamic-type Büyük metin boyutu testi
|
|
435
|
+
/multi-agent:test-screenshots [tr] Belirtilen dilde App Store screenshot seti (default tr)
|
|
436
|
+
|
|
437
|
+
Senaryo etiketli form çalışmaya devam eder, kaldırılmadı - yukarıdaki komutların
|
|
438
|
+
her biri onun alias'ı.
|
|
439
|
+
|
|
440
|
+
/multi-agent:test "dark mode" | "accessibility" | "dynamic type" | "screenshot <dil>"
|
|
441
|
+
|
|
442
|
+
`store-ready` bir UI testi DEĞİL: üretilmiş paketi platform başına üç kapıdan
|
|
443
|
+
geçirerek doğrular, iOS + Android, ve /multi-agent:store-ready altında. Eski
|
|
444
|
+
/multi-agent:test "store-ready" [path] etiketi çalışır ve oraya devreder.
|
|
407
445
|
|
|
408
446
|
xcrun simctl / adb kullanır (harici app gerekmez).
|
|
409
447
|
Booted simulator/emulator şart. Bundle ID proje'den otomatik algılanır.
|
|
@@ -458,7 +496,7 @@ Temel Özellikler:
|
|
|
458
496
|
Multi-Repo Repo başına worktree, repo başına identity, commit öncesi entegrasyon build'i
|
|
459
497
|
Identity Routing Repo origin URL'sinden git kimliği seçimi (kurumsal vs kişisel)
|
|
460
498
|
Issue Safety Issue'lar asla auto-close edilmez (GitHub + Jira için 4 onay gerekir)
|
|
461
|
-
Store Compliance /multi-agent:test "store-ready" - iOS için
|
|
499
|
+
Store Compliance /multi-agent:test "store-ready" - iOS için 18 kurallık audit (ITMS / Privacy Manifest /
|
|
462
500
|
code signing / debug-tool leak / IPv6 / SDK list / vb.) + Android için 21 kurallık audit
|
|
463
501
|
Bilingual EN + TR - outputLanguage assistant açıklamasını değiştirir; promptLanguage en kilitli
|
|
464
502
|
|
|
@@ -116,7 +116,7 @@ These are the RECOMMENDED key names. When creating NEW keys, use these. But exis
|
|
|
116
116
|
|
|
117
117
|
> Multi-agent setup onboards **both** Figma tokens because the pipeline's 3-tier Figma access chain (see `$HOME/.claude/rules/figma-pipeline.md`) uses them in priority order: Tier 1 = MCP (`figma_mcp`), Tier 2 = REST PAT (`figma`), Tier 3 = user screenshot fallback. Missing either token forces a downshift; missing both leaves Tier 3 as the only path. The Tier 2 logical key is `figma`, not `figma_pat`: `figma_pat` is the pre-v13.6 name that `migrate-prefs.mjs` consolidates away, and writing a new mapping under it means the next migration deletes it.
|
|
118
118
|
|
|
119
|
-
> The four App Store Connect entries are **iOS-only and optional**: skip them all and the pipeline still works, it just reports Gate 2 of `/multi-agent:
|
|
119
|
+
> The four App Store Connect entries are **iOS-only and optional**: skip them all and the pipeline still works, it just reports Gate 2 of `/multi-agent:store-ready` as `SKIPPED` (never as a pass). They mirror the Figma 3-tier shape - Tier 1 = API key (`appstore_connect_key_id` + `appstore_connect_issuer_id`), Tier 2 = Apple ID + app-specific password (`appstore_connect_apple_id` + `appstore_connect_password_item`), Tier 3 = nothing configured. **Offer Tier 2 first when the user says they cannot create an API key**: creating one needs an Admin or App Manager role in App Store Connect, while an app-specific password is generated by the account holder at `appleid.apple.com` with no team permission at all. Two of these hold identifiers rather than secrets (key id, issuer id) and one holds a keychain ITEM NAME, not a password - they still go through the mapping layer so every credential is read the same way. Onboarding mechanics in Step 3b.
|
|
120
120
|
|
|
121
121
|
**1c. Resolution logic (per service):**
|
|
122
122
|
|