@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.
Files changed (42) hide show
  1. package/CHANGELOG.md +179 -0
  2. package/README.md +24 -7
  3. package/index.js +5 -2
  4. package/install/_codex-agents.mjs +211 -0
  5. package/install/_codex-instructions.mjs +33 -0
  6. package/install/_managed-block.mjs +99 -0
  7. package/install/codex.mjs +478 -0
  8. package/install/copilot.mjs +34 -80
  9. package/install/index.mjs +25 -9
  10. package/install/templates/codex-instructions.md +45 -0
  11. package/package.json +5 -3
  12. package/pipeline/claude-md-template.md +1 -0
  13. package/pipeline/commands/multi-agent/SKILL.md +1 -1
  14. package/pipeline/commands/multi-agent/dev/SKILL.md +31 -6
  15. package/pipeline/commands/multi-agent/finish/SKILL.md +1 -1
  16. package/pipeline/commands/multi-agent/language/SKILL.md +2 -2
  17. package/pipeline/commands/multi-agent/setup/SKILL.md +69 -2
  18. package/pipeline/commands/multi-agent/sync/SKILL.md +128 -5
  19. package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +219 -0
  20. package/pipeline/commands/multi-agent/update/SKILL.md +7 -4
  21. package/pipeline/multi-agent-refs/_input-parser.md +1 -1
  22. package/pipeline/multi-agent-refs/cross-cli-contract.md +51 -17
  23. package/pipeline/multi-agent-refs/features/model-fallback.md +29 -0
  24. package/pipeline/multi-agent-refs/features/review-multi-repo.md +1 -1
  25. package/pipeline/multi-agent-refs/phases/log-format.md +1 -1
  26. package/pipeline/multi-agent-refs/phases/phase-0-init.md +14 -2
  27. package/pipeline/multi-agent-refs/phases/phase-4-review.md +36 -5
  28. package/pipeline/multi-agent-refs/progress-contract.md +1 -1
  29. package/pipeline/multi-agent-refs/tracker-contract.md +17 -1
  30. package/pipeline/schemas/prefs.schema.json +296 -62
  31. package/pipeline/schemas/reviewer-output.schema.json +1 -1
  32. package/pipeline/schemas/triage-output.schema.json +1 -1
  33. package/pipeline/scripts/cost-table.json +15 -1
  34. package/pipeline/scripts/output-quality-check.sh +34 -0
  35. package/pipeline/scripts/phase-tracker.sh +79 -1
  36. package/pipeline/scripts/smoke-cross-cli-behavior.sh +25 -10
  37. package/pipeline/scripts/uninstall.mjs +105 -9
  38. package/pipeline/scripts/update-check.sh +2 -1
  39. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -2
  40. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +48 -1
  41. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +87 -6
  42. 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.