@mmerterden/multi-agent-pipeline 12.10.0 → 13.0.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 +179 -0
- package/README.md +24 -7
- package/index.js +5 -2
- package/install/_codex-agents.mjs +211 -0
- package/install/_codex-instructions.mjs +33 -0
- package/install/_managed-block.mjs +99 -0
- package/install/codex.mjs +478 -0
- package/install/copilot.mjs +34 -80
- package/install/index.mjs +25 -9
- package/install/templates/codex-instructions.md +45 -0
- package/package.json +5 -3
- package/pipeline/claude-md-template.md +1 -0
- package/pipeline/commands/multi-agent/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/dev/SKILL.md +31 -6
- package/pipeline/commands/multi-agent/finish/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/language/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/setup/SKILL.md +69 -2
- package/pipeline/commands/multi-agent/sync/SKILL.md +128 -5
- package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +219 -0
- package/pipeline/commands/multi-agent/update/SKILL.md +7 -4
- package/pipeline/multi-agent-refs/_input-parser.md +1 -1
- package/pipeline/multi-agent-refs/cross-cli-contract.md +51 -17
- package/pipeline/multi-agent-refs/features/model-fallback.md +29 -0
- package/pipeline/multi-agent-refs/features/review-multi-repo.md +1 -1
- package/pipeline/multi-agent-refs/phases/log-format.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +14 -2
- package/pipeline/multi-agent-refs/phases/phase-4-review.md +36 -5
- package/pipeline/multi-agent-refs/progress-contract.md +1 -1
- package/pipeline/multi-agent-refs/tracker-contract.md +17 -1
- package/pipeline/schemas/prefs.schema.json +296 -62
- package/pipeline/schemas/reviewer-output.schema.json +1 -1
- package/pipeline/schemas/triage-output.schema.json +1 -1
- package/pipeline/scripts/cost-table.json +15 -1
- package/pipeline/scripts/output-quality-check.sh +34 -0
- package/pipeline/scripts/phase-tracker.sh +79 -1
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +25 -10
- package/pipeline/scripts/uninstall.mjs +105 -9
- package/pipeline/scripts/update-check.sh +2 -1
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +48 -1
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +87 -6
- package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +120 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: multi-agent-testflight-validation
|
|
3
|
+
language: en
|
|
4
|
+
description: "Pre-submission validation for a TestFlight / App Store build (iOS, local-only). Three gates: static archive audit, Apple's own `altool --validate-app`, and a Review-Guidelines check. ITMS codes are mapped to the rule each implies. Validates only, never uploads. Use when a build is about to go to TestFlight, or a submission was rejected and you need why."
|
|
5
|
+
user-invocable: true
|
|
6
|
+
argument-hint: "[repo] - empty = pick from prefs; repo name or path; --ipa=<path>; --archive=<path>; --resume"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# multi-agent-testflight-validation - pre-submission validation
|
|
10
|
+
|
|
11
|
+
Catch, before you upload, what App Store Connect would send back after you do.
|
|
12
|
+
|
|
13
|
+
**Local-only**: no commits, no push, no PR, no channels. **It never uploads** - only
|
|
14
|
+
`--validate-app` is ever invoked, never `--upload-app`.
|
|
15
|
+
|
|
16
|
+
## Why three gates
|
|
17
|
+
|
|
18
|
+
Each sees something the others structurally cannot, so reporting one as "the check"
|
|
19
|
+
is how a build passes locally and gets rejected anyway.
|
|
20
|
+
|
|
21
|
+
| Gate | Runs | Needs | Sees | Blind to |
|
|
22
|
+
|---|---|---|---|---|
|
|
23
|
+
| **1. Static** | `ios_app_store_audit` (18 rules) | `.xcarchive` | privacy manifest, required-reason API, Info.plist, signing, entitlements, embedded SDK, IPv6, debug leak | anything account-dependent |
|
|
24
|
+
| **2. Authoritative** | `ios_testflight_validate` → `altool --validate-app` | `.ipa` + credentials | unregistered bundle ID, profile/app-record mismatch, **version+build already used**, entitlement not provisioned | the Review Guidelines |
|
|
25
|
+
| **3. Guideline** | `app-store-review` skill + repo evidence | repo checkout | ATT, privacy policy, account deletion, IAP, purpose-string wording | anything not in source |
|
|
26
|
+
|
|
27
|
+
Most "we passed validation and still got rejected" cases are Gate 3 findings:
|
|
28
|
+
Apple's validator does not read the Review Guidelines.
|
|
29
|
+
|
|
30
|
+
## Flow
|
|
31
|
+
|
|
32
|
+
**0. Input.** `(empty)` → ask · `my-ios-app`/path → that repo · `--ipa=<path>` →
|
|
33
|
+
Mode B without Gate 1 · `--archive=<path>` → Mode B with all gates · `--resume`.
|
|
34
|
+
State at `~/.claude/logs/multi-agent/<task_id>/agent-state.json`,
|
|
35
|
+
`taskId = TFV-<repo>-<yyyymmddHHMM>`. Register phases with
|
|
36
|
+
`bash ~/.copilot/scripts/phase-tracker.sh` and render with
|
|
37
|
+
`phase-tracker.sh render` at every boundary.
|
|
38
|
+
|
|
39
|
+
**1. Pickers.** Repo (iOS entries in `prefs.projects`; a single match auto-resolves,
|
|
40
|
+
and the breadcrumb says so) → branch → mode. Print
|
|
41
|
+
`Step <i>/<n>: <what this decides>` for each. On `git fetch` failure do **not**
|
|
42
|
+
silently use a cached ref, and **classify the failure before naming a cause**:
|
|
43
|
+
`could not read Password` / `Authentication failed` / `403` is a credential
|
|
44
|
+
problem, not a network one, and a VPN cannot fix it; `Could not resolve host` /
|
|
45
|
+
`Operation timed out` is the network. Show the stderr line verbatim next to your
|
|
46
|
+
classification, then offer the remedy that matches it. Only the network case gets
|
|
47
|
+
the continue-on-a-stale-ref option: for a credential failure, staleness is
|
|
48
|
+
unrelated to what broke.
|
|
49
|
+
|
|
50
|
+
**2. Pre-flight.** `xcrun --find altool` and `xcodebuild -version`; a missing
|
|
51
|
+
prerequisite halts. Resolve credentials and name the active tier in the report:
|
|
52
|
+
tier 1 ASC API key (key id + issuer id from the keychain via
|
|
53
|
+
`prefs.global.keychainMapping`, `.p8` at
|
|
54
|
+
`~/.appstoreconnect/private_keys/AuthKey_<keyId>.p8`), tier 2 Apple ID +
|
|
55
|
+
app-specific password by keychain reference, tier 3 none → **Gate 2 is `SKIPPED`
|
|
56
|
+
and the verdict line says so**. Credentials come from `/multi-agent:setup`; never
|
|
57
|
+
prompt for a secret value in chat. Tier 2 needs no elevated App Store Connect
|
|
58
|
+
role, which matters when API-key creation is not permitted on the account.
|
|
59
|
+
|
|
60
|
+
**3. Obtain the build.**
|
|
61
|
+
- Mode B `.xcarchive` → Gate 1 runs; export with `ios_export_ipa` to reach Gate 2.
|
|
62
|
+
- Mode B `.ipa` only → **Gate 1 `SKIPPED (needs .xcarchive)`**. The static audit
|
|
63
|
+
reads archive structure an `.ipa` does not carry. Do not present a two-gate run
|
|
64
|
+
as a full pass.
|
|
65
|
+
- Mode A → worktree at `{projectRoot}/{worktreeBasePath}/{taskId}` (**never under
|
|
66
|
+
`$HOME`**) → `ios_xcodebuild({action: "archive", configuration: "Release",
|
|
67
|
+
destination: "generic/platform=iOS"})` - the simulator default would produce a
|
|
68
|
+
non-distributable archive - then `ios_export_ipa({method:
|
|
69
|
+
"app-store-connect", team_id, ...})`. Leave `allow_provisioning_updates` off
|
|
70
|
+
unless asked: it lets xcodebuild create or modify profiles in the developer
|
|
71
|
+
account, which a validation run has no business doing.
|
|
72
|
+
|
|
73
|
+
**4. Gate 1.** `ios_app_store_audit({archive_path, rules: "all"})`. `error` blocks,
|
|
74
|
+
`warning` advises. Keep each ITMS code - Gate 2 may return the same one, and that
|
|
75
|
+
agreement tells the user it is real.
|
|
76
|
+
|
|
77
|
+
**5. Gate 2.** `ios_testflight_validate({ipa_path, platform: "ios", <creds>})`.
|
|
78
|
+
Render the verdict as returned: `PASS` / `FAIL` (each issue with ITMS code, mapped
|
|
79
|
+
guideline, hint) / `SKIPPED` (with the reason, **never as a pass**). This is the
|
|
80
|
+
only gate that catches an already-used build number - the most common wasted
|
|
81
|
+
upload - so when it fails on that, name the next free build number.
|
|
82
|
+
|
|
83
|
+
**6. Gate 3.** Load `app-store-review` and check, with an evidence path each:
|
|
84
|
+
purpose strings (present, specific, matching actual use) · `PrivacyInfo.xcprivacy`
|
|
85
|
+
(exists, declares required-reason APIs, matches linked SDKs) · ATT before any
|
|
86
|
+
tracking · in-app account deletion when accounts are created · privacy policy
|
|
87
|
+
reachable · IAP through StoreKit with no external purchase path · Sign in with
|
|
88
|
+
Apple alongside third-party social login. Mark `pass` / `fail` /
|
|
89
|
+
`not-applicable`, and `not-applicable` needs a reason - an unexamined area is not
|
|
90
|
+
a pass.
|
|
91
|
+
|
|
92
|
+
**7. Report.** `~/TestFlightChecks/<repo>-<branch>-<timestamp>/report.md` plus a
|
|
93
|
+
printed summary:
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
Verdict: <N> of 3 gates cleared[, <M> skipped]
|
|
97
|
+
Build: <path> · <bundle id> <version> (<build>)
|
|
98
|
+
Auth: tier <1|2|none> · <method>
|
|
99
|
+
|
|
100
|
+
Gate 1 static audit PASS | FAIL (<n> blocking, <n> advisory) | SKIPPED (<reason>)
|
|
101
|
+
Gate 2 Apple validation PASS | FAIL (<n> issues) | SKIPPED (<reason>)
|
|
102
|
+
Gate 3 guideline review PASS | FAIL (<n> findings) | <n> not-applicable
|
|
103
|
+
|
|
104
|
+
Blocking - fix before uploading
|
|
105
|
+
[ITMS-90683] Info.plist: NSCameraUsageDescription missing
|
|
106
|
+
guideline 5.1.1 Data Collection and Storage
|
|
107
|
+
<hint> · <file:line>
|
|
108
|
+
|
|
109
|
+
Not run
|
|
110
|
+
Gate 1: needs an .xcarchive; only an .ipa was supplied
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
A skipped gate is never folded into the pass count. Every blocking finding carries
|
|
114
|
+
a file path or an ITMS code. No AI or assistant attribution anywhere; real
|
|
115
|
+
newlines, no HTML entities.
|
|
116
|
+
|
|
117
|
+
**8. Offer, do not act.** Print the exact `xcrun altool --upload-app` command for
|
|
118
|
+
when the gates are clear (uploading stays an explicit human act), plus
|
|
119
|
+
`--resume` after fixes and `/multi-agent:fix-bug` for code-level Gate 3 findings.
|
|
120
|
+
Never upload, never bump the build number, never commit.
|