@mmerterden/multi-agent-pipeline 20.34.0 → 20.36.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 (335) hide show
  1. package/CHANGELOG.md +69 -1
  2. package/README.md +7 -5
  3. package/README.tr.md +6 -5
  4. package/docs/architecture.md +3 -3
  5. package/docs/ecosystem.md +5 -5
  6. package/docs/facts.json +4 -4
  7. package/install/catalog-history.json +1 -1
  8. package/install/claude.mjs +16 -1
  9. package/install/templates/claude-hooks.json +23 -1
  10. package/manifest.json +338 -305
  11. package/package.json +5 -1
  12. package/pipeline/agents/bulk-reader.md +3 -0
  13. package/pipeline/commands/multi-agent/channels/SKILL.md +1 -1
  14. package/pipeline/commands/multi-agent/office-on/SKILL.md +7 -3
  15. package/pipeline/commands/multi-agent/office-pair/SKILL.md +66 -0
  16. package/pipeline/commands/multi-agent/office-status/SKILL.md +3 -2
  17. package/pipeline/commands/multi-agent/sync/SKILL.md +3 -3
  18. package/pipeline/contract/CHANGELOG.md +9 -0
  19. package/pipeline/contract/README.md +1 -0
  20. package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
  21. package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
  22. package/pipeline/contract/fixtures/error-unsigned.json +1 -1
  23. package/pipeline/contract/manifest.json +14 -1
  24. package/pipeline/contract/types/index.d.ts +24 -2
  25. package/pipeline/lib/json-file-lock.mjs +61 -15
  26. package/pipeline/lib/office-remote.mjs +228 -0
  27. package/pipeline/lib/qr-code.mjs +386 -0
  28. package/pipeline/lib/repo-hygiene.sh +1 -0
  29. package/pipeline/lib/run-completion.mjs +17 -0
  30. package/pipeline/multi-agent-refs/channels/issue-comment.md +1 -1
  31. package/pipeline/multi-agent-refs/cross-cli-contract.md +4 -4
  32. package/pipeline/multi-agent-refs/features/office-remote-protocol.md +166 -0
  33. package/pipeline/multi-agent-refs/features/office-threat-model.md +1 -1
  34. package/pipeline/multi-agent-refs/features/scope-check.md +16 -1
  35. package/pipeline/multi-agent-refs/features/verify-by-test.md +10 -0
  36. package/pipeline/multi-agent-refs/help/en.md +1 -0
  37. package/pipeline/multi-agent-refs/help/tr.md +1 -0
  38. package/pipeline/multi-agent-refs/keychain.md +7 -0
  39. package/pipeline/multi-agent-refs/phases/phase-0-init.md +6 -2
  40. package/pipeline/multi-agent-refs/phases/phase-1-plan.md +4 -6
  41. package/pipeline/multi-agent-refs/phases/phase-2-dev.md +9 -12
  42. package/pipeline/multi-agent-refs/phases/phase-3-review.md +9 -8
  43. package/pipeline/multi-agent-refs/phases/phase-4-commit.md +1 -4
  44. package/pipeline/multi-agent-refs/rules.md +3 -2
  45. package/pipeline/multi-agent-refs/tracker-contract.md +1 -1
  46. package/pipeline/office/NOTICE.md +4 -1
  47. package/pipeline/office/assets/char_12.png +0 -0
  48. package/pipeline/office/assets/char_13.png +0 -0
  49. package/pipeline/office/assets/char_14.png +0 -0
  50. package/pipeline/office/assets/char_15.png +0 -0
  51. package/pipeline/office/assets/char_16.png +0 -0
  52. package/pipeline/office/assets/char_17.png +0 -0
  53. package/pipeline/office/assets/char_18.png +0 -0
  54. package/pipeline/office/assets/char_19.png +0 -0
  55. package/pipeline/office/assets/char_20.png +0 -0
  56. package/pipeline/office/assets/char_21.png +0 -0
  57. package/pipeline/office/assets/char_22.png +0 -0
  58. package/pipeline/office/assets/char_23.png +0 -0
  59. package/pipeline/office/assets/char_24.png +0 -0
  60. package/pipeline/office/assets/char_25.png +0 -0
  61. package/pipeline/office/assets/char_26.png +0 -0
  62. package/pipeline/office/assets/char_27.png +0 -0
  63. package/pipeline/office/assets/char_28.png +0 -0
  64. package/pipeline/office/assets/char_29.png +0 -0
  65. package/pipeline/office/assets/char_30.png +0 -0
  66. package/pipeline/office/index.html +293 -49
  67. package/pipeline/schemas/agent-state.schema.json +18 -0
  68. package/pipeline/schemas/planning-output.schema.json +18 -0
  69. package/pipeline/schemas/pr-reach.schema.json +55 -0
  70. package/pipeline/schemas/prefs.schema.json +13 -7
  71. package/pipeline/schemas/triage-output.schema.json +12 -1
  72. package/pipeline/schemas/unattended-policy.json +2 -1
  73. package/pipeline/scripts/_guard_rules.py +449 -1
  74. package/pipeline/scripts/_test-gaming.mjs +36 -0
  75. package/pipeline/scripts/agent-guard.py +79 -19
  76. package/pipeline/scripts/anonymize-findings.mjs +99 -0
  77. package/pipeline/scripts/answer-check.mjs +113 -0
  78. package/pipeline/scripts/answer-check.sh +20 -0
  79. package/pipeline/scripts/autopilot-publish.mjs +9 -2
  80. package/pipeline/scripts/contract-server.mjs +35 -1
  81. package/pipeline/scripts/gate-ledger.mjs +144 -21
  82. package/pipeline/scripts/office-build.mjs +276 -5
  83. package/pipeline/scripts/office-control.mjs +70 -10
  84. package/pipeline/scripts/office-pair.mjs +438 -0
  85. package/pipeline/scripts/office-remote-client.mjs +463 -0
  86. package/pipeline/scripts/phase-tracker.sh +8 -0
  87. package/pipeline/scripts/phase0-exit-gate.mjs +40 -37
  88. package/pipeline/scripts/phone-devices.mjs +9 -1
  89. package/pipeline/scripts/pre-commit-check.sh +28 -2
  90. package/pipeline/scripts/pre-push-check.sh +6 -12
  91. package/pipeline/scripts/rework-base.mjs +87 -0
  92. package/pipeline/scripts/run-commit-check.mjs +104 -0
  93. package/pipeline/scripts/run-scope-guard.mjs +58 -3
  94. package/pipeline/scripts/run-scope-guard.sh +13 -1
  95. package/pipeline/scripts/scope-check-gate.mjs +70 -6
  96. package/pipeline/scripts/task-mirror.mjs +106 -15
  97. package/pipeline/scripts/task-mirror.sh +3 -2
  98. package/pipeline/scripts/test-stability-gate.mjs +112 -0
  99. package/pipeline/scripts/update-check.sh +7 -1
  100. package/pipeline/scripts/update-issue-progress.sh +73 -8
  101. package/pipeline/scripts/validate-planning.mjs +105 -1
  102. package/pipeline/scripts/validate-triage.mjs +42 -2
  103. package/pipeline/scripts/work-items.mjs +119 -1
  104. package/pipeline/scripts/worktree-prepare-all.mjs +200 -0
  105. package/pipeline/scripts/worktree-prepare.sh +40 -4
  106. package/pipeline/scripts/write-state.mjs +67 -24
  107. package/pipeline/skills/.skill-manifest.json +12 -8
  108. package/pipeline/skills/.skills-index.json +15 -4
  109. package/pipeline/skills/shared/README.md +4 -3
  110. package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +1 -1
  111. package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +6 -6
  112. package/pipeline/skills/shared/core/google-play-compliance/references/rules.yml +1 -1
  113. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +1 -1
  114. package/pipeline/skills/shared/core/multi-agent-office-pair/SKILL.md +19 -0
  115. package/pipeline/skills/shared/core/multi-agent-office-status/SKILL.md +2 -2
  116. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +3 -3
  117. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +14 -0
  118. package/pipeline/skills/shared/external/android-architecture/references/patterns.md +6 -0
  119. package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +10 -0
  120. package/pipeline/skills/shared/external/android-datastore/references/patterns.md +11 -0
  121. package/pipeline/skills/shared/external/android-design-tokens-codegen/references/patterns.md +8 -0
  122. package/pipeline/skills/shared/external/android-jetpack-compose-expert/references/patterns.md +6 -0
  123. package/pipeline/skills/shared/external/android-mvi-viewmodel/references/patterns.md +10 -0
  124. package/pipeline/skills/shared/external/android-performance/references/patterns.md +13 -0
  125. package/pipeline/skills/shared/external/android-security/references/patterns.md +16 -0
  126. package/pipeline/skills/shared/external/api-patterns/references/contract-details.md +9 -0
  127. package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md +12 -0
  128. package/pipeline/skills/shared/external/api-security-best-practices/references/identity-and-access.md +13 -0
  129. package/pipeline/skills/shared/external/api-security-best-practices/references/request-handling.md +12 -0
  130. package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +9 -0
  131. package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +8 -0
  132. package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +10 -0
  133. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +21 -0
  134. package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +9 -0
  135. package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +7 -0
  136. package/pipeline/skills/shared/external/app-store-review/SKILL.md +2 -2
  137. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +10 -0
  138. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +10 -1
  139. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +22 -0
  140. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +17 -0
  141. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +22 -0
  142. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +17 -0
  143. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +9 -0
  144. package/pipeline/skills/shared/external/authentication/references/passkeys.md +11 -0
  145. package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +13 -0
  146. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +9 -0
  147. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +10 -0
  148. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +15 -0
  149. package/pipeline/skills/shared/external/compose-components/references/patterns.md +7 -0
  150. package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +7 -0
  151. package/pipeline/skills/shared/external/compose-testing/references/patterns.md +15 -0
  152. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +9 -0
  153. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +11 -0
  154. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +10 -0
  155. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +13 -0
  156. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +20 -0
  157. package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +16 -0
  158. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +16 -0
  159. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +14 -0
  160. package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +13 -0
  161. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +10 -0
  162. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +10 -0
  163. package/pipeline/skills/shared/external/fastapi-pro/references/app-structure.md +10 -0
  164. package/pipeline/skills/shared/external/gradle-kotlin-dsl/references/patterns.md +17 -0
  165. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +12 -0
  166. package/pipeline/skills/shared/external/hig-app-icons/references/icon-workflow.md +10 -0
  167. package/pipeline/skills/shared/external/hig-components-content/references/content-views.md +10 -0
  168. package/pipeline/skills/shared/external/hig-components-layout/references/bars-and-tabs.md +11 -0
  169. package/pipeline/skills/shared/external/hig-foundations/references/foundations-detail.md +13 -0
  170. package/pipeline/skills/shared/external/hig-foundations/references/type-color-spacing.md +13 -0
  171. package/pipeline/skills/shared/external/hig-patterns/references/onboarding-and-states.md +11 -0
  172. package/pipeline/skills/shared/external/hig-platforms/references/ipad-layout.md +12 -0
  173. package/pipeline/skills/shared/external/hig-technologies/references/technologies.md +16 -0
  174. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +9 -0
  175. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +18 -0
  176. package/pipeline/skills/shared/external/ios-accessibility/references/large-content-and-appearance.md +9 -0
  177. package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +9 -0
  178. package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +7 -0
  179. package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +13 -0
  180. package/pipeline/skills/shared/external/ios-design-review/references/appearance-matrix.md +9 -0
  181. package/pipeline/skills/shared/external/ios-design-review/references/checklist.md +15 -0
  182. package/pipeline/skills/shared/external/ios-haptics/references/core-haptics.md +11 -0
  183. package/pipeline/skills/shared/external/ios-iphone-duo/references/api-map.md +11 -0
  184. package/pipeline/skills/shared/external/ios-iphone-duo/references/fixed-assumptions.md +15 -0
  185. package/pipeline/skills/shared/external/ios-iphone-duo/references/poses-and-panes.md +11 -0
  186. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +18 -0
  187. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +19 -0
  188. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +15 -0
  189. package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +7 -0
  190. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +8 -0
  191. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +12 -0
  192. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +17 -0
  193. package/pipeline/skills/shared/external/ios-security/references/app-review-guidelines.md +8 -0
  194. package/pipeline/skills/shared/external/ios-security/references/cryptokit-advanced.md +14 -0
  195. package/pipeline/skills/shared/external/ios-security/references/file-storage-patterns.md +8 -0
  196. package/pipeline/skills/shared/external/ios-security/references/privacy-manifest.md +9 -0
  197. package/pipeline/skills/shared/external/ios-sf-symbols/references/effects-and-custom-symbols.md +9 -0
  198. package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +13 -0
  199. package/pipeline/skills/shared/external/kotlin-coroutines-expert/references/patterns.md +8 -0
  200. package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +21 -0
  201. package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +9 -0
  202. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +12 -0
  203. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +16 -0
  204. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +21 -0
  205. package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +10 -0
  206. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +9 -0
  207. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +12 -0
  208. package/pipeline/skills/shared/external/nodejs-backend-patterns/references/runtime-patterns.md +11 -0
  209. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +11 -0
  210. package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +18 -0
  211. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +11 -0
  212. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +11 -0
  213. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +15 -0
  214. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +14 -0
  215. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +14 -0
  216. package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +14 -0
  217. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +14 -0
  218. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +10 -0
  219. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +12 -0
  220. package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +14 -0
  221. package/pipeline/skills/shared/external/room-database/references/patterns.md +16 -0
  222. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +10 -0
  223. package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +10 -0
  224. package/pipeline/skills/shared/external/spm-build-analysis/references/build-optimization-sources.md +14 -0
  225. package/pipeline/skills/shared/external/spm-build-analysis/references/spm-analysis-checks.md +19 -0
  226. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +13 -0
  227. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +31 -0
  228. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +8 -0
  229. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +9 -0
  230. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +10 -0
  231. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +8 -0
  232. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +24 -0
  233. package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +8 -0
  234. package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +14 -0
  235. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +12 -0
  236. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +10 -0
  237. package/pipeline/skills/shared/external/swift-concurrency-expert/references/swift-6-2-concurrency.md +8 -0
  238. package/pipeline/skills/shared/external/swift-concurrency-pro/references/actors.md +10 -0
  239. package/pipeline/skills/shared/external/swift-concurrency-pro/references/cancellation.md +7 -0
  240. package/pipeline/skills/shared/external/swift-concurrency-pro/references/interop.md +10 -0
  241. package/pipeline/skills/shared/external/swift-concurrency-pro/references/new-features.md +11 -0
  242. package/pipeline/skills/shared/external/swift-concurrency-pro/references/structured.md +9 -0
  243. package/pipeline/skills/shared/external/swift-concurrency-pro/references/testing.md +13 -0
  244. package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +7 -0
  245. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +14 -0
  246. package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +16 -0
  247. package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +17 -0
  248. package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +19 -0
  249. package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +16 -0
  250. package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +19 -0
  251. package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +18 -0
  252. package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +16 -0
  253. package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +17 -0
  254. package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +17 -0
  255. package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +17 -0
  256. package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +18 -0
  257. package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +21 -0
  258. package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +16 -0
  259. package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +16 -0
  260. package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +9 -0
  261. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +24 -0
  262. package/pipeline/skills/shared/external/swift-testing-pro/references/async-tests.md +9 -0
  263. package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +11 -0
  264. package/pipeline/skills/shared/external/swift-testing-pro/references/writing-better-tests.md +13 -0
  265. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +8 -0
  266. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +17 -0
  267. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +12 -0
  268. package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +11 -0
  269. package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +7 -0
  270. package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +13 -0
  271. package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +24 -0
  272. package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +12 -0
  273. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +15 -0
  274. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +15 -0
  275. package/pipeline/skills/shared/external/swiftui-animation/references/scroll-effects.md +12 -0
  276. package/pipeline/skills/shared/external/swiftui-expert-skill/references/accessibility-patterns.md +11 -0
  277. package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-advanced.md +7 -0
  278. package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-basics.md +13 -0
  279. package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-transitions.md +9 -0
  280. package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts-accessibility.md +9 -0
  281. package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts.md +17 -0
  282. package/pipeline/skills/shared/external/swiftui-expert-skill/references/image-optimization.md +9 -0
  283. package/pipeline/skills/shared/external/swiftui-expert-skill/references/latest-apis.md +10 -0
  284. package/pipeline/skills/shared/external/swiftui-expert-skill/references/layout-best-practices.md +12 -0
  285. package/pipeline/skills/shared/external/swiftui-expert-skill/references/list-patterns.md +12 -0
  286. package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-scenes.md +13 -0
  287. package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-views.md +12 -0
  288. package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-window-styling.md +12 -0
  289. package/pipeline/skills/shared/external/swiftui-expert-skill/references/performance-patterns.md +7 -0
  290. package/pipeline/skills/shared/external/swiftui-expert-skill/references/scroll-patterns.md +9 -0
  291. package/pipeline/skills/shared/external/swiftui-expert-skill/references/sheet-navigation-patterns.md +10 -0
  292. package/pipeline/skills/shared/external/swiftui-expert-skill/references/state-management.md +18 -0
  293. package/pipeline/skills/shared/external/swiftui-expert-skill/references/view-structure.md +16 -0
  294. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +11 -0
  295. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +8 -0
  296. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +14 -0
  297. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +9 -0
  298. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +22 -0
  299. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/uikit-glass.md +14 -0
  300. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +10 -0
  301. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +10 -0
  302. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +13 -0
  303. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +10 -0
  304. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +14 -0
  305. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +30 -0
  306. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +16 -0
  307. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +11 -0
  308. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +11 -0
  309. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +10 -0
  310. package/pipeline/skills/shared/external/swiftui-performance-audit/references/code-smells.md +8 -0
  311. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/app-wiring.md +12 -0
  312. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/menu-bar.md +10 -0
  313. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/navigationstack.md +11 -0
  314. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/scroll-reveal.md +12 -0
  315. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/sheets.md +14 -0
  316. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/tabview.md +10 -0
  317. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +10 -0
  318. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +13 -0
  319. package/pipeline/skills/shared/external/swiftui-view-refactor/references/mv-patterns.md +12 -0
  320. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +8 -0
  321. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +8 -0
  322. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +14 -0
  323. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +17 -0
  324. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +11 -0
  325. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +11 -0
  326. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +27 -0
  327. package/pipeline/skills/shared/external/xcode-build-fixer/references/build-settings-best-practices.md +9 -0
  328. package/pipeline/skills/shared/external/xcode-build-fixer/references/fix-patterns.md +7 -0
  329. package/pipeline/skills/shared/external/xcode-build-orchestrator/references/build-settings-best-practices.md +9 -0
  330. package/pipeline/skills/shared/external/xcode-compilation-analyzer/references/build-optimization-sources.md +14 -0
  331. package/pipeline/skills/shared/external/xcode-compilation-analyzer/references/code-compilation-checks.md +8 -0
  332. package/pipeline/skills/shared/external/xcode-project-analyzer/references/build-optimization-sources.md +14 -0
  333. package/pipeline/skills/shared/external/xcode-project-analyzer/references/build-settings-best-practices.md +9 -0
  334. package/pipeline/skills/shared/external/xcode-project-analyzer/references/project-audit-checks.md +13 -0
  335. package/pipeline/skills/skills-index.md +2 -1
@@ -0,0 +1,200 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @file worktree-prepare-all.mjs - the multi-repo worktree setup as one
4
+ * step: every repo gets its worktree, or none keeps one this step created.
5
+ *
6
+ * Phase 0 creates one worktree per repo of a multi-repo task. When the third
7
+ * repo's add fails, the first two must not stay behind on a half-made task.
8
+ * This runs worktree-prepare.sh serially in the given order and, on the first
9
+ * failure, rolls back what this call created, newest first:
10
+ *
11
+ * - the worktree is removed without --force, so a worktree holding changes
12
+ * is kept and reported instead of discarded;
13
+ * - the branch is deleted only when worktree-prepare created it here
14
+ * (newBranch) and it still points at origin/<base>, so a branch that
15
+ * existed before, or gained a commit, is never deleted.
16
+ *
17
+ * A worktree that was reused (it existed before the call) is never touched.
18
+ *
19
+ * Usage:
20
+ * worktree-prepare-all.mjs --repos <repos.json>
21
+ * repos.json: [{project, path, branch, base, name?, email?}, ...]
22
+ *
23
+ * Output (stdout, JSON): {ok, results[], failed, rolledBack[], kept[]}
24
+ * results each repo's worktree-prepare.sh output, in order, up to the failure
25
+ * failed the failing repo's output, or null
26
+ * rolledBack [{project, worktreePath, branchDeleted}]
27
+ * kept [{project, worktreePath, reason}] what the rollback left in place
28
+ *
29
+ * Exit: 0 every repo ready, 1 a repo failed (rollback done; see kept[]),
30
+ * 2 usage or a repos file that does not parse.
31
+ */
32
+
33
+ import { execFileSync, spawnSync } from "node:child_process";
34
+ import { readFileSync } from "node:fs";
35
+ import { dirname, join } from "node:path";
36
+ import { fileURLToPath } from "node:url";
37
+
38
+ import { invokedDirectly } from "../lib/invoked-directly.mjs";
39
+
40
+ const HERE = dirname(fileURLToPath(import.meta.url));
41
+ const PREPARE = join(HERE, "worktree-prepare.sh");
42
+
43
+ const git = (cwd, ...args) =>
44
+ execFileSync("git", ["-C", cwd, ...args], {
45
+ encoding: "utf8",
46
+ stdio: ["ignore", "pipe", "pipe"],
47
+ timeout: 60_000,
48
+ }).trim();
49
+
50
+ function prepareOne(repo, prepare) {
51
+ try {
52
+ return prepareOnce(repo, prepare);
53
+ } catch (err) {
54
+ return {
55
+ ok: false,
56
+ out: {
57
+ project: repo.project,
58
+ worktreePath: repo.path,
59
+ branch: repo.branch,
60
+ baseBranch: repo.base,
61
+ action: "failed",
62
+ error: String(err?.message || err).slice(0, 500),
63
+ },
64
+ };
65
+ }
66
+ }
67
+
68
+ function prepareOnce(repo, prepare) {
69
+ const args = [
70
+ prepare,
71
+ "--project",
72
+ repo.project,
73
+ "--path",
74
+ repo.path,
75
+ "--branch",
76
+ repo.branch,
77
+ "--base",
78
+ repo.base,
79
+ ];
80
+ if (repo.name) args.push("--name", repo.name);
81
+ if (repo.email) args.push("--email", repo.email);
82
+ const r = spawnSync("bash", args, { encoding: "utf8", timeout: 300_000 });
83
+ let out;
84
+ try {
85
+ out = JSON.parse(r.stdout);
86
+ } catch {
87
+ out = null;
88
+ }
89
+ if (r.status === 0 && out && (out.action === "created" || out.action === "reused"))
90
+ return { ok: true, out };
91
+ return {
92
+ ok: false,
93
+ out: out ?? {
94
+ project: repo.project,
95
+ worktreePath: repo.path,
96
+ branch: repo.branch,
97
+ baseBranch: repo.base,
98
+ action: "failed",
99
+ error: (r.stderr || r.error?.message || `exit ${r.status}`).trim().slice(0, 500),
100
+ },
101
+ };
102
+ }
103
+
104
+ /** Undo one worktree this call created. Returns a rolledBack or kept record. */
105
+ export function rollbackOne(res) {
106
+ const where = { project: res.project, worktreePath: res.worktreePath };
107
+ try {
108
+ git(res.project, "worktree", "remove", res.worktreePath);
109
+ } catch (err) {
110
+ return {
111
+ kept: {
112
+ ...where,
113
+ reason: `worktree not removed: ${String(err.stderr || err.message)
114
+ .trim()
115
+ .slice(0, 200)}`,
116
+ },
117
+ };
118
+ }
119
+ let branchDeleted = false;
120
+ if (res.newBranch === true) {
121
+ try {
122
+ const tip = git(res.project, "rev-parse", "--verify", `refs/heads/${res.branch}`);
123
+ const base = git(
124
+ res.project,
125
+ "rev-parse",
126
+ "--verify",
127
+ `refs/remotes/origin/${res.baseBranch}`,
128
+ );
129
+ if (tip === base) {
130
+ git(res.project, "branch", "-D", "--", res.branch);
131
+ branchDeleted = true;
132
+ }
133
+ } catch {
134
+ branchDeleted = false;
135
+ }
136
+ }
137
+ return { rolledBack: { ...where, branchDeleted } };
138
+ }
139
+
140
+ export function prepareAll(repos, { prepare = PREPARE } = {}) {
141
+ const results = [];
142
+ for (const repo of repos) {
143
+ const r = prepareOne(repo, prepare);
144
+ if (r.ok) {
145
+ results.push(r.out);
146
+ continue;
147
+ }
148
+ const rolledBack = [];
149
+ const kept = [];
150
+ for (const done of [...results].reverse()) {
151
+ if (done.action !== "created") continue;
152
+ const u = rollbackOne(done);
153
+ if (u.rolledBack) rolledBack.push(u.rolledBack);
154
+ else kept.push(u.kept);
155
+ }
156
+ return { ok: false, results, failed: r.out, rolledBack, kept };
157
+ }
158
+ return { ok: true, results, failed: null, rolledBack: [], kept: [] };
159
+ }
160
+
161
+ const FIELD = /^[^\0\n]+$/;
162
+
163
+ export function readRepos(text) {
164
+ const list = JSON.parse(text);
165
+ if (!Array.isArray(list) || !list.length) throw new Error("repos must be a non-empty array");
166
+ for (const r of list) {
167
+ for (const k of ["project", "path", "branch", "base"]) {
168
+ if (typeof r?.[k] !== "string" || !FIELD.test(r[k]))
169
+ throw new Error(`each repo needs a string ${k}`);
170
+ }
171
+ for (const k of ["branch", "base"])
172
+ if (r[k].startsWith("-")) throw new Error(`${k} must not start with -`);
173
+ for (const k of ["name", "email"]) {
174
+ if (r[k] !== undefined && (typeof r[k] !== "string" || !FIELD.test(r[k]))) {
175
+ throw new Error(`${k} must be a string when given`);
176
+ }
177
+ }
178
+ }
179
+ return list;
180
+ }
181
+
182
+ function main() {
183
+ const i = process.argv.indexOf("--repos");
184
+ if (i < 0 || !process.argv[i + 1] || process.argv.length !== 4) {
185
+ console.error("usage: worktree-prepare-all.mjs --repos <repos.json>");
186
+ return 2;
187
+ }
188
+ let repos;
189
+ try {
190
+ repos = readRepos(readFileSync(process.argv[i + 1], "utf8"));
191
+ } catch (err) {
192
+ console.error(`worktree-prepare-all: ${err.message}`);
193
+ return 2;
194
+ }
195
+ const out = prepareAll(repos);
196
+ process.stdout.write(JSON.stringify(out, null, 2) + "\n");
197
+ return out.ok ? 0 : 1;
198
+ }
199
+
200
+ if (invokedDirectly(import.meta.url)) process.exit(main());
@@ -27,10 +27,13 @@
27
27
  # [--email <git user.email>]
28
28
  #
29
29
  # Output (stdout, JSON): {project, worktreePath, branch, baseBranch,
30
- # action: created|reused|failed, pulled: true|false|null, error}
30
+ # action: created|reused|failed, pulled: true|false|null, newBranch, error}
31
+ # newBranch is true only when this call created the branch from origin/<base>,
32
+ # which is what tells worktree-prepare-all.mjs a rollback may delete it.
31
33
  #
32
34
  # Exit: 0 ready, 1 the add failed (nothing was created; the caller runs its
33
- # rollback / collision flow), 2 usage.
35
+ # rollback / collision flow), 2 usage, a path outside <project>/.worktrees/,
36
+ # or a new branch outside the naming convention.
34
37
  set -uo pipefail
35
38
 
36
39
  HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
@@ -59,11 +62,43 @@ git -C "$PROJECT" rev-parse --git-dir >/dev/null 2>&1 || {
59
62
  exit 2
60
63
  }
61
64
 
65
+ # The worktree lives in the project's own .worktrees/ directory, compared on
66
+ # physical paths so a symlink cannot place it elsewhere.
67
+ physical() { # nearest existing ancestor resolved, the rest appended
68
+ local p="$1" tail=""
69
+ while [ ! -e "$p" ] && [ "$p" != "/" ] && [ "$p" != "." ]; do
70
+ tail="/$(basename "$p")$tail"
71
+ p="$(dirname "$p")"
72
+ done
73
+ printf '%s%s' "$(cd "$p" 2>/dev/null && pwd -P)" "$tail"
74
+ }
75
+ WT_ROOT="$(physical "$PROJECT")/.worktrees/"
76
+ case "$(physical "$WT")/" in
77
+ "$WT_ROOT"?*/) ;;
78
+ *)
79
+ echo "worktree-prepare: --path must be inside $PROJECT/.worktrees/ (got $WT)" >&2
80
+ exit 2
81
+ ;;
82
+ esac
83
+ # A branch this call creates follows the naming convention; an existing one
84
+ # is re-entered as it is.
85
+ if ! git -C "$PROJECT" show-ref --verify --quiet "refs/heads/$BRANCH" &&
86
+ ! git -C "$PROJECT" show-ref --verify --quiet "refs/remotes/origin/$BRANCH"; then
87
+ case "$BRANCH" in
88
+ feature/?* | bugfix/?* | hotfix/?* | release/?*) ;;
89
+ *)
90
+ echo "worktree-prepare: a new branch is named feature/<key>-<desc>, bugfix/<key>-<desc>, hotfix/<desc> or release/<version> (got $BRANCH)" >&2
91
+ exit 2
92
+ ;;
93
+ esac
94
+ fi
95
+ NEW_BRANCH=false
62
96
  report() { # $1 action, $2 pulled (true|false|null), $3 error
63
97
  jq -n --arg project "$PROJECT" --arg wt "$WT" --arg branch "$BRANCH" --arg base "$BASE" \
64
- --arg action "$1" --argjson pulled "$2" --arg error "$3" \
98
+ --arg action "$1" --argjson pulled "$2" --argjson newBranch "$NEW_BRANCH" --arg error "$3" \
65
99
  '{project: $project, worktreePath: $wt, branch: $branch, baseBranch: $base,
66
- action: $action, pulled: $pulled, error: (if $error == "" then null else $error end)}'
100
+ action: $action, pulled: $pulled, newBranch: $newBranch,
101
+ error: (if $error == "" then null else $error end)}'
67
102
  }
68
103
 
69
104
  # Physical path of $1, for comparing paths that may go through a symlink.
@@ -122,5 +157,6 @@ if ! err=$(git -C "$PROJECT" worktree add -q "${add_args[@]}" 2>&1); then
122
157
  report failed null "$err"
123
158
  exit 1
124
159
  fi
160
+ [ "${add_args[1]}" = "-b" ] && NEW_BRANCH=true
125
161
  set_identity
126
162
  report created null ""
@@ -69,8 +69,9 @@ import {
69
69
  import { dirname, basename } from "path";
70
70
  import { Buffer } from "node:buffer";
71
71
  import { runMain } from "../lib/fatal.mjs";
72
+ import { readLockOwner, reapLock } from "../lib/json-file-lock.mjs";
72
73
  import { invokedDirectly } from "../lib/invoked-directly.mjs";
73
- import { completionGaps } from "../lib/run-completion.mjs";
74
+ import { completionGaps, modeOf } from "../lib/run-completion.mjs";
74
75
 
75
76
  /**
76
77
  * @typedef {{ replace: boolean, path: string, ifRev: number|null }} ParsedArgs
@@ -156,15 +157,7 @@ async function acquireLock(
156
157
  // file that is there.
157
158
  const stale = lockIdentityIfStale(lockPath, staleMs);
158
159
  if (stale) {
159
- try {
160
- const now = statSync(lockPath);
161
- if (now.ino === stale.ino && now.mtimeMs === stale.mtimeMs) {
162
- unlinkSync(lockPath);
163
- }
164
- // Changed under us: somebody else's live lock. Leave it and retry.
165
- } catch {
166
- /* vanished on its own - fall through and retry */
167
- }
160
+ reapLock(lockPath, stale);
168
161
  continue;
169
162
  }
170
163
  await new Promise((r) => setTimeout(r, 50));
@@ -205,19 +198,11 @@ async function acquireLock(
205
198
  * @returns {{ino: number, mtimeMs: number} | null}
206
199
  */
207
200
  function lockIdentityIfStale(lockPath, staleMs) {
208
- let pid;
209
- let mtimeMs;
210
- let ino;
211
- try {
212
- pid = parseInt(readFileSync(lockPath, "utf-8").trim(), 10);
213
- const st = statSync(lockPath);
214
- mtimeMs = st.mtimeMs;
215
- ino = st.ino;
216
- } catch {
217
- // Lock vanished between EEXIST and our read - let the retry re-open it.
218
- return null;
219
- }
220
- const identity = { ino, mtimeMs };
201
+ // Lock vanished between EEXIST and our read: let the retry re-open it.
202
+ const owner = readLockOwner(lockPath);
203
+ if (!owner) return null;
204
+ const { pid, mtimeMs } = owner;
205
+ const identity = { ino: owner.ino, mtimeMs };
221
206
  const abandonMs = Number(process.env.WRITE_STATE_LOCK_ABANDON_MS) || staleMs * 10;
222
207
  const age = Date.now() - mtimeMs;
223
208
 
@@ -397,6 +382,62 @@ export function completionRefusal(next, payload, replace, diskStatus) {
397
382
  return `write-state: refusing status "${next.status}": ${gaps.join("; ")}. Nothing was written. Finish the missing step, or record a halt (status "paused" with a haltReason).`;
398
383
  }
399
384
 
385
+ /**
386
+ * The refusal message for a phase move the run has not earned, or null.
387
+ *
388
+ * - Phase 1 to a later phase in an attended full run needs the plan approval
389
+ * the Phase 1 gate writes (`phases["1"].planApprovedAt`). Autopilot and
390
+ * background launches approve nothing by design, and in analysis mode
391
+ * Phase 1 is not a plan, so neither is asked.
392
+ * - A `sessionId` already set is the run's identity for resume; a write that
393
+ * changes it detaches the run from the session that started it.
394
+ * - Phase 2 to a later phase in an attended run with a tracked issue (jiraId
395
+ * or githubIssue) needs `phases["2"].trackerStatus` verified, declined or
396
+ * not-tracked: the issue moves to In Progress before any code, and a failed
397
+ * move stops the phase. Unattended runs leave tracker writes to the runner.
398
+ *
399
+ * @param {object} next the document as it would be written
400
+ * @param {unknown} payload the patch as sent
401
+ * @param {object} current the document on disk
402
+ * @returns {string|null}
403
+ */
404
+ export function transitionRefusal(next, payload, current) {
405
+ const patch = payload && typeof payload === "object" ? payload : {};
406
+ const was = current && typeof current === "object" ? current : {};
407
+ if (
408
+ typeof was.sessionId === "string" &&
409
+ was.sessionId &&
410
+ Object.hasOwn(patch, "sessionId") &&
411
+ next.sessionId !== was.sessionId
412
+ ) {
413
+ return `write-state: refusing to change sessionId from "${was.sessionId}". It identifies the run for resume; nothing was written.`;
414
+ }
415
+ const unattended =
416
+ next.autopilot === true || ["autopilot", "background"].includes(next.launchRequest?.mode);
417
+ if (
418
+ modeOf(next) === "full" &&
419
+ !unattended &&
420
+ Number(was.currentPhase) === 1 &&
421
+ Number(next.currentPhase) > 1 &&
422
+ !next.phases?.["1"]?.planApprovedAt
423
+ ) {
424
+ return 'write-state: refusing to leave Phase 1: the plan has no approval (phases["1"].planApprovedAt). Nothing was written. Record the approval when the user approves the plan, or a halt.';
425
+ }
426
+ const tracked = Boolean(next.jiraId) || Boolean(next.githubIssue?.number);
427
+ const tracker = next.phases?.["2"]?.trackerStatus?.status;
428
+ if (
429
+ ["full", "dev"].includes(modeOf(next)) &&
430
+ !unattended &&
431
+ tracked &&
432
+ Number(was.currentPhase) === 2 &&
433
+ Number(next.currentPhase) > 2 &&
434
+ !["verified", "declined", "not-tracked"].includes(tracker)
435
+ ) {
436
+ return `write-state: refusing to leave Phase 2: the issue's move to In Progress is ${tracker ? `"${tracker}"` : "not recorded"} (phases["2"].trackerStatus). Nothing was written. Move the issue and re-read it, record "declined" if the user refused the write, or record a halt.`;
437
+ }
438
+ return null;
439
+ }
440
+
400
441
  /**
401
442
  * Bind the run to the host session that drives it.
402
443
  *
@@ -554,7 +595,9 @@ async function main() {
554
595
  }
555
596
  }
556
597
 
557
- const refusal = completionRefusal(next, payload, replace, diskStatus);
598
+ const refusal =
599
+ completionRefusal(next, payload, replace, diskStatus) ||
600
+ transitionRefusal(next, payload, current);
558
601
  if (refusal) {
559
602
  console.error(refusal);
560
603
  releaseLock(path);
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-10-26T11:41:43Z",
4
- "skillCount": 237,
3
+ "generatedAt": "2026-10-31T07:29:16Z",
4
+ "skillCount": 238,
5
5
  "entries": [
6
6
  {
7
7
  "path": "shared/core/apple-archive-compliance/SKILL.md",
8
- "sha256": "08d5277e4a6c246c613bd3bea27646f580f1bdc1937cb4acbbd93a156e15b24e"
8
+ "sha256": "2bffd220fd3e3b59160f5b6834633c3ad144c89b192556f01b9405da706b221b"
9
9
  },
10
10
  {
11
11
  "path": "shared/core/google-play-compliance/SKILL.md",
12
- "sha256": "3089e8c5f99c1ec7c1358394c398335ccb5ebc20ca05d60d870127da4592de34"
12
+ "sha256": "5da8befd481459823fd5945d11215e70d751bad14b71b6050417a550282a4f03"
13
13
  },
14
14
  {
15
15
  "path": "shared/core/multi-agent-analysis-jira/SKILL.md",
@@ -49,7 +49,7 @@
49
49
  },
50
50
  {
51
51
  "path": "shared/core/multi-agent-channels/SKILL.md",
52
- "sha256": "b55e8461a1bcdc1b4b88c42e086f599fccda2a89d7f56a29ac11e5ebc12a3623"
52
+ "sha256": "74008ae717bb9662ac6ab8838e3659a5006859fc6129f655094780bc97b90423"
53
53
  },
54
54
  {
55
55
  "path": "shared/core/multi-agent-complaint-analysis/SKILL.md",
@@ -135,9 +135,13 @@
135
135
  "path": "shared/core/multi-agent-office-on/SKILL.md",
136
136
  "sha256": "b46a2f79beeee65ae7ad6cbfc58b4631c5146a7761e91a99b8a056d6f49c690d"
137
137
  },
138
+ {
139
+ "path": "shared/core/multi-agent-office-pair/SKILL.md",
140
+ "sha256": "6693c2453922bf87e22d5acd203f201c56b3389c831e297145b99186bb466ae5"
141
+ },
138
142
  {
139
143
  "path": "shared/core/multi-agent-office-status/SKILL.md",
140
- "sha256": "fba0513f8941c026172ea0ce76cbc76d88a5e813fd713d68a1377eb5a4204c86"
144
+ "sha256": "a34e42dc79bfe9bc8ca87456558baf1601b49168e94c7b28fb6cd3e853bf3d2e"
141
145
  },
142
146
  {
143
147
  "path": "shared/core/multi-agent-postmortem/SKILL.md",
@@ -249,7 +253,7 @@
249
253
  },
250
254
  {
251
255
  "path": "shared/core/multi-agent-sync/SKILL.md",
252
- "sha256": "17f734fa2b84d9a4c757f9745be8ff40d3097f5de89caf55124b48439a737093"
256
+ "sha256": "e4d247d7b4708cb0984d81b6584851bea0a2cdee97ebcfad8498adcd194b7675"
253
257
  },
254
258
  {
255
259
  "path": "shared/core/multi-agent-test-accessibility/SKILL.md",
@@ -361,7 +365,7 @@
361
365
  },
362
366
  {
363
367
  "path": "shared/external/app-store-review/SKILL.md",
364
- "sha256": "073d99485665497229750b5f040c3a196c1e5de2bbcff281b8aec7e53817d3f4"
368
+ "sha256": "32e8b9de2894010fd584e6e4aada7270b85756be8608d7593127255fd6737a6e"
365
369
  },
366
370
  {
367
371
  "path": "shared/external/apple-on-device-ai/SKILL.md",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "skillCount": 237,
3
+ "skillCount": 238,
4
4
  "entries": [
5
5
  {
6
6
  "name": "accessibility-compliance-accessibility-audit",
@@ -202,7 +202,7 @@
202
202
  },
203
203
  {
204
204
  "name": "apple-archive-compliance",
205
- "description": "Apple App Store Review compliance - wraps the multi-agent-toolkit-mcp `ios_app_store_audit` tool (18-rule deep scan) with ITMS error code mapping + EN/TR humanizer templates. Consumed by: /multi-agent:test 'store-ready' (primary dispatch), Phase 3 Security Auditor (catalog cross-ref on Info.plist ",
205
+ "description": "Apple App Store Review compliance - wraps the multi-agent-toolkit-mcp `ios_app_store_audit` tool (18-rule deep scan) with ITMS error code mapping + EN/TR humanizer templates. Used by /multi-agent:test store-ready, the Phase 3 security auditor, /multi-agent:review and /multi-agent:channels. Use whe",
206
206
  "platform": null,
207
207
  "group": "core",
208
208
  "plugin": null,
@@ -620,7 +620,7 @@
620
620
  },
621
621
  {
622
622
  "name": "google-play-compliance",
623
- "description": "Google Play Store publication compliance - bundletool + aapt2 + apksigner orchestration + 21-rule policy catalog with Play Console error codes + humanizer templates. Consumed by: /multi-agent:test 'store-ready' (primary dispatch), Phase 3 Security Auditor (catalog cross-ref on AndroidManifest / bu",
623
+ "description": "Google Play Store publication compliance - bundletool + aapt2 + apksigner orchestration + 21-rule policy catalog with Play Console error codes + humanizer templates. Used by /multi-agent:test store-ready, the Phase 3 security auditor, /multi-agent:review and /multi-agent:channels. Use when an .aab",
624
624
  "platform": null,
625
625
  "group": "core",
626
626
  "plugin": null,
@@ -1137,7 +1137,7 @@
1137
1137
  },
1138
1138
  {
1139
1139
  "name": "multi-agent-channels",
1140
- "description": "Multi-channel reporter - Jira/Confluence/Wiki/PR description. Multi-select channels + content, humanizer pass, reviewer-preserving Bitbucket PR PUT. Phase 5 delegates to this skill; users can invoke post-hoc by Jira ID / PR URL / branch.",
1140
+ "description": "Multi-channel reporter - Jira/Confluence/Wiki/PR description. Multi-select channels + content, humanizer pass, reviewer-preserving Bitbucket PR PUT. Use to post or redo a run's report; Phase 5 delegates here, or invoke by Jira ID / PR URL / branch.",
1141
1141
  "platform": null,
1142
1142
  "group": "core",
1143
1143
  "plugin": null,
@@ -1377,6 +1377,17 @@
1377
1377
  "triggerPaths": [],
1378
1378
  "relativePath": "shared/core/multi-agent-office-on/SKILL.md"
1379
1379
  },
1380
+ {
1381
+ "name": "multi-agent-office-pair",
1382
+ "description": "Pair a phone with the office: QR, wait, compare the code with the user, enrol. Use when the office should be reachable from a phone.",
1383
+ "platform": null,
1384
+ "group": "core",
1385
+ "plugin": null,
1386
+ "invokeAs": "multi-agent-office-pair",
1387
+ "triggerKeywords": [],
1388
+ "triggerPaths": [],
1389
+ "relativePath": "shared/core/multi-agent-office-pair/SKILL.md"
1390
+ },
1380
1391
  {
1381
1392
  "name": "multi-agent-office-status",
1382
1393
  "description": "Whether the office panel is running, its URL (never the token) and its last actions. Use when unsure if the panel is open.",
@@ -2,11 +2,11 @@
2
2
 
3
3
  Single source of truth for skills delivered to both Claude Code (`~/.claude/skills/`) and Copilot CLI (`~/.copilot/skills/`) by the installer.
4
4
 
5
- **Total:** 237 skills (72 core + 165 external). Auto-generated by `scripts/gen-skills-index.mjs` - do not edit by hand.
5
+ **Total:** 238 skills (73 core + 165 external). Auto-generated by `scripts/gen-skills-index.mjs` - do not edit by hand.
6
6
 
7
7
  ## Directory layout
8
8
 
9
- - **`core/`** - 72 `multi-agent*` orchestration skills that are pipeline-critical. Edits here are core-code changes.
9
+ - **`core/`** - 73 `multi-agent*` orchestration skills that are pipeline-critical. Edits here are core-code changes.
10
10
  - **`external/`** - 165 iOS / Android / generic skills that ship into the stack plugins. Each names its origin in `metadata.source`: `multi-agent-pipeline` when written here, or the upstream and license a `NOTICE-*.md` in this directory covers.
11
11
  - Install destinations (ADR-0009): Claude Code gets NO local copy of `external/` - it loads those skills from the `multi-agent-plugins` marketplace, namespaced (`ai-<stack>-toolkit:<name>`); only the two compliance catalogs from `core/` land in `~/.claude/skills/`. Copilot CLI and Codex CLI receive a flat copy filtered to the enabled stacks. `external/` remains the single authoring source that `build-stack-plugins.mjs` publishes from.
12
12
 
@@ -14,7 +14,7 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
14
14
 
15
15
  ## Categories
16
16
 
17
- - [Pipeline Orchestration](#pipeline-orchestration) - 72
17
+ - [Pipeline Orchestration](#pipeline-orchestration) - 73
18
18
  - [iOS / Apple Ecosystem](#ios-apple-ecosystem) - 94
19
19
  - [Android / Kotlin](#android-kotlin) - 16
20
20
  - [Web](#web) - 10
@@ -59,6 +59,7 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
59
59
  | [`multi-agent-model`](./core/multi-agent-model/) | `core` | Turn the top model rung on or off and keep the cost ledger's pricing in step with it. Use when asked to enable or disable Fable, or which mo |
60
60
  | [`multi-agent-office-off`](./core/multi-agent-office-off/) | `core` | Close the office panel and stop its local server. Use when done with the panel. |
61
61
  | [`multi-agent-office-on`](./core/multi-agent-office-on/) | `core` | Open the office: a local browser page that shows runs and agents live and drives the ecosystem (new runs, jobs, PRs, keys, memory, system, c |
62
+ | [`multi-agent-office-pair`](./core/multi-agent-office-pair/) | `core` | Pair a phone with the office: QR, wait, compare the code with the user, enrol. Use when the office should be reachable from a phone. |
62
63
  | [`multi-agent-office-status`](./core/multi-agent-office-status/) | `core` | Whether the office panel is running, its URL (never the token) and its last actions. Use when unsure if the panel is open. |
63
64
  | [`multi-agent-postmortem`](./core/multi-agent-postmortem/) | `core` | Post-mortem of a run from its session transcripts: loops, stalls, root-cause hypotheses on file:line, fixes. Read-only, redacted. Use when a |
64
65
  | [`multi-agent-prune-logs`](./core/multi-agent-prune-logs/) | `core` | Delete per-task project logs under ~/.claude/logs/multi-agent (filter by age/project/task). Audit trail + metrics are preserved. Dry-run fir |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: apple-archive-compliance
3
- description: "Apple App Store Review compliance - wraps the multi-agent-toolkit-mcp `ios_app_store_audit` tool (18-rule deep scan) with ITMS error code mapping + EN/TR humanizer templates. Consumed by: /multi-agent:test 'store-ready' (primary dispatch), Phase 3 Security Auditor (catalog cross-ref on Info.plist / PrivacyInfo / entitlements diffs), /multi-agent:review (PR citation), /multi-agent:channels (PR body auto-augmentation). Wiring enforced by smoke-compliance-skills.sh. Use when an .xcarchive needs an App Store review check before submission, or a rejection has to be diagnosed."
3
+ description: "Apple App Store Review compliance - wraps the multi-agent-toolkit-mcp `ios_app_store_audit` tool (18-rule deep scan) with ITMS error code mapping + EN/TR humanizer templates. Used by /multi-agent:test store-ready, the Phase 3 security auditor, /multi-agent:review and /multi-agent:channels. Use when an .xcarchive needs an App Store review check before submission, or a rejection has to be diagnosed."
4
4
  user-invocable: true
5
5
  argument-hint: '[archive-path] [--threshold=error|warning|info] [--format=markdown|json] [--lang=en|tr] - no-arg: picks most recent .xcarchive from ~/Library/Developer/Xcode/Archives/'
6
6
  metadata:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: google-play-compliance
3
- description: "Google Play Store publication compliance - bundletool + aapt2 + apksigner orchestration + 21-rule policy catalog with Play Console error codes + humanizer templates. Consumed by: /multi-agent:test 'store-ready' (primary dispatch), Phase 3 Security Auditor (catalog cross-ref on AndroidManifest / build.gradle / proguard / signing diffs), /multi-agent:review (PR citation), /multi-agent:channels (PR body auto-augmentation). Wiring enforced by smoke-compliance-skills.sh. Use when an .aab or .apk needs a Play policy check before upload, or a Play rejection has to be diagnosed."
3
+ description: "Google Play Store publication compliance - bundletool + aapt2 + apksigner orchestration + 21-rule policy catalog with Play Console error codes + humanizer templates. Used by /multi-agent:test store-ready, the Phase 3 security auditor, /multi-agent:review and /multi-agent:channels. Use when an .aab or .apk needs a Play policy check before upload, or a Play rejection has to be diagnosed."
4
4
  user-invocable: true
5
5
  argument-hint: '[bundle-path] [--threshold=error|warning|info] [--format=markdown|json] [--lang=en|tr] - no-arg: picks most recent .aab from app/build/outputs/bundle/release/'
6
6
  metadata:
@@ -10,7 +10,7 @@ metadata:
10
10
 
11
11
  # google-play-compliance - Google Play Store Publication Compliance Skill
12
12
 
13
- Pre-submission compliance check for Android App Bundle (`.aab`) and APK artifacts. Unlike the iOS side (single MCP-tool wrapper around `ios_app_store_audit`), Android has **no single official scanner** - this skill orchestrates Google's own tools (`bundletool`, `aapt2`, `apksigner`, `adb`) plus a curated policy catalog to produce an equivalent pre-flight report.
13
+ Pre-submission compliance check for Android App Bundle (`.aab`) and APK artifacts. Unlike the iOS side (single wrapper around the multi-agent-toolkit MCP server's `ios_app_store_audit`), Android has **no single official scanner** - this skill orchestrates Google's own tools (`bundletool`, `aapt2`, `apksigner`, `adb`) plus a curated policy catalog to produce an equivalent pre-flight report.
14
14
 
15
15
  **The catalog is the value.** The 21-rule knowledge base reflects current Google Play policies (target API requirements, 64-bit enforcement, data safety rules, permission policies). Tool invocations gather the evidence; this skill maps it against policy and humanizes.
16
16
 
@@ -118,7 +118,7 @@ Current Google Play policies + Play Console rejection codes. Sourced from `suppo
118
118
 
119
119
  | # | ruleID | Play ref | What it checks | Default severity |
120
120
  |---|---|---|---|---|
121
- | 1 | `target-api-level` | Policy - Target API | `android:targetSdkVersion` ≥ 34 for new apps (Aug 2024+), ≥ 34 for updates (Nov 2024+). Lower → rejected. | error |
121
+ | 1 | `target-api-level` | Policy - Target API | `android:targetSdkVersion` ≥ 36 for new apps and updates on phones and tablets (from 31 Aug 2026, extension to 1 Nov 2026), ≥ 35 on Wear OS and Automotive, ≥ 34 on TV and XR. Lower → rejected. | error |
122
122
  | 2 | `native-64bit` | Policy - 64-bit | Every native `.so` has an `arm64-v8a` counterpart. `armeabi-v7a`-only rejected since Aug 2019. | error |
123
123
  | 3 | `app-bundle-format` | Policy - AAB | New apps must ship `.aab`. `.apk` uploads rejected on new apps since Aug 2021. | error |
124
124
  | 4 | `base-module-size` | Platform limit | Base APK from bundle ≤ 150 MB (bundletool `--mode=universal` size). Beyond → rejected. | error |
@@ -331,7 +331,7 @@ The appended section is structured:
331
331
 
332
332
  ⚠️ 3 blocker(s), 2 warning(s) - run /multi-agent:test "store-ready" for the full report.
333
333
 
334
- - `target-api-level` - Policy - Target API: targetSdkVersion = 33 but Play Console requires ≥ 34 for updates
334
+ - `target-api-level` - Policy - Target API: targetSdkVersion = 35 but Play Console requires ≥ 36 for new apps and updates
335
335
  - `native-64bit` - Policy - 64-bit: lib/armeabi-v7a/libfoo.so has no arm64-v8a counterpart
336
336
  - `foreground-service-types` - Android 14: <service> missing android:foregroundServiceType
337
337
  + 2 more
@@ -339,9 +339,9 @@ The appended section is structured:
339
339
 
340
340
  ## Notes
341
341
 
342
- - **Policy thresholds change yearly.** Target API level (currently 34) advances each August for new apps / November for updates. When a new Android version ships, update Rule #1 `target-api-level` with the new threshold.
342
+ - **Policy thresholds change yearly.** The target API level in Rule #1 advances each August for new apps / November for updates. When a new Android version ships, update Rule #1 `target-api-level` with the new threshold.
343
343
  - **Not a substitute for Play Console pre-launch report.** This skill catches static issues (manifest, signing, size, debug tools). Dynamic issues (crashes, ANRs, security vulnerabilities) require Play Console's own pre-launch testing on real devices.
344
- - **Data Safety form audit is partial.** Rule #14 flags manifest permissions that commonly trigger form updates, but the declared answers live in Play Console and cannot be cross-checked from here. The Android Publisher API has no Data Safety read: its only operation, `applications.dataSafety`, writes the declaration. With `google_play` onboarded, `store_search` / `store_call` reach the rest of the Android Publisher and Play Developer Reporting APIs (tracks, bundles, vitals), but the gap for Data Safety stays.
344
+ - **Data Safety form audit is partial.** Rule #14 flags manifest permissions that commonly trigger form updates, but the declared answers live in Play Console and cannot be cross-checked from here. The Android Publisher API has no Data Safety read: its only operation, `applications.dataSafety`, writes the declaration. With `google_play` onboarded, the toolkit's `store_search` / `store_call` reach the rest of the Android Publisher and Play Developer Reporting APIs (tracks, bundles, vitals), but the gap for Data Safety stays.
345
345
 
346
346
  ## Version history
347
347
 
@@ -37,7 +37,7 @@ enforcement_kinds:
37
37
  rules:
38
38
  - id: target-api-level
39
39
  title: >
40
- `android:targetSdkVersion` ≥ 34 for new apps (Aug 2024+), ≥ 34 for updates (Nov 2024+). Lower → rejected.
40
+ `android:targetSdkVersion` ≥ 36 for new apps and updates on phones and tablets (from 31 Aug 2026, extension to 1 Nov 2026), ≥ 35 on Wear OS and Automotive, ≥ 34 on TV and XR. Lower → rejected.
41
41
  severity: blocking
42
42
  enforcement: scan
43
43
  policy_ref: Policy - Target API
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: multi-agent-channels
3
- description: "Multi-channel reporter - Jira/Confluence/Wiki/PR description. Multi-select channels + content, humanizer pass, reviewer-preserving Bitbucket PR PUT. Phase 5 delegates to this skill; users can invoke post-hoc by Jira ID / PR URL / branch."
3
+ description: "Multi-channel reporter - Jira/Confluence/Wiki/PR description. Multi-select channels + content, humanizer pass, reviewer-preserving Bitbucket PR PUT. Use to post or redo a run's report; Phase 5 delegates here, or invoke by Jira ID / PR URL / branch."
4
4
  user-invocable: true
5
5
  argument-hint: '<Jira-id | PR-url | #N | Jira-url> [--channels pr,jira,confluence,wiki] [--content normal,technical,test,auto-diff,note,test-run] [--flow-run <runId>[,<runId>...]] [--message "..."] [--message-file path] [--dry-run] [--append] [--ready]'
6
6
  metadata:
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: multi-agent-office-pair
3
+ description: "Pair a phone with the office: QR, wait, compare the code with the user, enrol. Use when the office should be reachable from a phone."
4
+ user-invocable: true
5
+ metadata:
6
+ language: en
7
+ ---
8
+
9
+ # multi-agent-office-pair
10
+
11
+ 1. `node "$HOME/.copilot/scripts/office-pair.mjs" start` (add `--relay <url>`
12
+ when prefs `global.office.remote.relayUrl` is unset). The QR opens as a
13
+ local page; never print it here, it carries the one-time secret. In a
14
+ terminal of their own the user can run `start --terminal` instead.
15
+ 2. Tell the user to scan it with the phone and finish the passkey step.
16
+ 3. `node "$HOME/.copilot/scripts/office-pair.mjs" wait` (blocks up to 10 minutes).
17
+ 4. Ask the user whether the phone shows the same `code`; never answer it yourself.
18
+ 5. Same: `office-pair.mjs confirm <code>` and report the device. Different:
19
+ `office-pair.mjs cancel`; nothing is enrolled.
@@ -10,8 +10,8 @@ metadata:
10
10
 
11
11
  1. `node "$HOME/.copilot/scripts/office-control.mjs" status --json`
12
12
  2. Report in `outputLanguage`: `running`, `url` and `idleMinutes`; the
13
- `remote` line as given ("not available in this installation" unless a
14
- separate remote layer is installed); `pairedDevices`; `recentActions`
13
+ `remote` line as given ("off" until `/multi-agent:office-pair` pairs a phone, then
14
+ "paired"); `pairedDevices`; `recentActions`
15
15
  (route, step, status, when; never a request body).
16
16
 
17
17
  Never print the token or read the token file.