@mmerterden/multi-agent-pipeline 20.34.0 → 20.35.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 (321) hide show
  1. package/CHANGELOG.md +55 -1
  2. package/README.md +1 -0
  3. package/docs/facts.json +2 -2
  4. package/install/catalog-history.json +1 -1
  5. package/install/claude.mjs +16 -1
  6. package/install/templates/claude-hooks.json +23 -1
  7. package/manifest.json +324 -293
  8. package/package.json +1 -1
  9. package/pipeline/agents/bulk-reader.md +3 -0
  10. package/pipeline/commands/multi-agent/channels/SKILL.md +1 -1
  11. package/pipeline/commands/multi-agent/office-on/SKILL.md +7 -3
  12. package/pipeline/commands/multi-agent/office-status/SKILL.md +3 -2
  13. package/pipeline/contract/CHANGELOG.md +9 -0
  14. package/pipeline/contract/README.md +1 -0
  15. package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
  16. package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
  17. package/pipeline/contract/fixtures/error-unsigned.json +1 -1
  18. package/pipeline/contract/manifest.json +14 -1
  19. package/pipeline/contract/types/index.d.ts +24 -2
  20. package/pipeline/lib/json-file-lock.mjs +61 -15
  21. package/pipeline/lib/office-remote.mjs +228 -0
  22. package/pipeline/lib/qr-code.mjs +360 -0
  23. package/pipeline/lib/repo-hygiene.sh +1 -0
  24. package/pipeline/lib/run-completion.mjs +17 -0
  25. package/pipeline/multi-agent-refs/channels/issue-comment.md +1 -1
  26. package/pipeline/multi-agent-refs/features/office-remote-protocol.md +166 -0
  27. package/pipeline/multi-agent-refs/features/office-threat-model.md +1 -1
  28. package/pipeline/multi-agent-refs/features/scope-check.md +16 -1
  29. package/pipeline/multi-agent-refs/features/verify-by-test.md +10 -0
  30. package/pipeline/multi-agent-refs/keychain.md +7 -0
  31. package/pipeline/multi-agent-refs/phases/phase-0-init.md +6 -2
  32. package/pipeline/multi-agent-refs/phases/phase-1-plan.md +4 -6
  33. package/pipeline/multi-agent-refs/phases/phase-2-dev.md +9 -12
  34. package/pipeline/multi-agent-refs/phases/phase-3-review.md +9 -8
  35. package/pipeline/multi-agent-refs/phases/phase-4-commit.md +1 -4
  36. package/pipeline/multi-agent-refs/rules.md +3 -2
  37. package/pipeline/multi-agent-refs/tracker-contract.md +1 -1
  38. package/pipeline/office/NOTICE.md +4 -1
  39. package/pipeline/office/assets/char_12.png +0 -0
  40. package/pipeline/office/assets/char_13.png +0 -0
  41. package/pipeline/office/assets/char_14.png +0 -0
  42. package/pipeline/office/assets/char_15.png +0 -0
  43. package/pipeline/office/assets/char_16.png +0 -0
  44. package/pipeline/office/assets/char_17.png +0 -0
  45. package/pipeline/office/assets/char_18.png +0 -0
  46. package/pipeline/office/assets/char_19.png +0 -0
  47. package/pipeline/office/assets/char_20.png +0 -0
  48. package/pipeline/office/assets/char_21.png +0 -0
  49. package/pipeline/office/assets/char_22.png +0 -0
  50. package/pipeline/office/assets/char_23.png +0 -0
  51. package/pipeline/office/assets/char_24.png +0 -0
  52. package/pipeline/office/assets/char_25.png +0 -0
  53. package/pipeline/office/assets/char_26.png +0 -0
  54. package/pipeline/office/assets/char_27.png +0 -0
  55. package/pipeline/office/assets/char_28.png +0 -0
  56. package/pipeline/office/assets/char_29.png +0 -0
  57. package/pipeline/office/assets/char_30.png +0 -0
  58. package/pipeline/office/index.html +293 -49
  59. package/pipeline/schemas/agent-state.schema.json +18 -0
  60. package/pipeline/schemas/planning-output.schema.json +18 -0
  61. package/pipeline/schemas/pr-reach.schema.json +55 -0
  62. package/pipeline/schemas/prefs.schema.json +13 -7
  63. package/pipeline/schemas/triage-output.schema.json +12 -1
  64. package/pipeline/schemas/unattended-policy.json +2 -1
  65. package/pipeline/scripts/_guard_rules.py +449 -1
  66. package/pipeline/scripts/_test-gaming.mjs +36 -0
  67. package/pipeline/scripts/agent-guard.py +79 -19
  68. package/pipeline/scripts/anonymize-findings.mjs +99 -0
  69. package/pipeline/scripts/answer-check.mjs +113 -0
  70. package/pipeline/scripts/answer-check.sh +20 -0
  71. package/pipeline/scripts/autopilot-publish.mjs +9 -2
  72. package/pipeline/scripts/contract-server.mjs +35 -1
  73. package/pipeline/scripts/gate-ledger.mjs +144 -21
  74. package/pipeline/scripts/office-build.mjs +276 -5
  75. package/pipeline/scripts/office-control.mjs +70 -10
  76. package/pipeline/scripts/office-pair.mjs +407 -0
  77. package/pipeline/scripts/office-remote-client.mjs +463 -0
  78. package/pipeline/scripts/phase-tracker.sh +8 -0
  79. package/pipeline/scripts/phase0-exit-gate.mjs +40 -37
  80. package/pipeline/scripts/phone-devices.mjs +9 -1
  81. package/pipeline/scripts/pre-commit-check.sh +28 -2
  82. package/pipeline/scripts/pre-push-check.sh +6 -12
  83. package/pipeline/scripts/rework-base.mjs +87 -0
  84. package/pipeline/scripts/run-commit-check.mjs +104 -0
  85. package/pipeline/scripts/run-scope-guard.mjs +58 -3
  86. package/pipeline/scripts/run-scope-guard.sh +13 -1
  87. package/pipeline/scripts/scope-check-gate.mjs +70 -6
  88. package/pipeline/scripts/task-mirror.mjs +106 -15
  89. package/pipeline/scripts/task-mirror.sh +3 -2
  90. package/pipeline/scripts/test-stability-gate.mjs +112 -0
  91. package/pipeline/scripts/update-check.sh +7 -1
  92. package/pipeline/scripts/update-issue-progress.sh +73 -8
  93. package/pipeline/scripts/validate-planning.mjs +105 -1
  94. package/pipeline/scripts/validate-triage.mjs +42 -2
  95. package/pipeline/scripts/work-items.mjs +119 -1
  96. package/pipeline/scripts/worktree-prepare-all.mjs +200 -0
  97. package/pipeline/scripts/worktree-prepare.sh +40 -4
  98. package/pipeline/scripts/write-state.mjs +67 -24
  99. package/pipeline/skills/.skill-manifest.json +5 -5
  100. package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +5 -5
  101. package/pipeline/skills/shared/core/google-play-compliance/references/rules.yml +1 -1
  102. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +1 -1
  103. package/pipeline/skills/shared/core/multi-agent-office-status/SKILL.md +2 -2
  104. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +14 -0
  105. package/pipeline/skills/shared/external/android-architecture/references/patterns.md +6 -0
  106. package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +10 -0
  107. package/pipeline/skills/shared/external/android-datastore/references/patterns.md +11 -0
  108. package/pipeline/skills/shared/external/android-design-tokens-codegen/references/patterns.md +8 -0
  109. package/pipeline/skills/shared/external/android-jetpack-compose-expert/references/patterns.md +6 -0
  110. package/pipeline/skills/shared/external/android-mvi-viewmodel/references/patterns.md +10 -0
  111. package/pipeline/skills/shared/external/android-performance/references/patterns.md +13 -0
  112. package/pipeline/skills/shared/external/android-security/references/patterns.md +16 -0
  113. package/pipeline/skills/shared/external/api-patterns/references/contract-details.md +9 -0
  114. package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md +12 -0
  115. package/pipeline/skills/shared/external/api-security-best-practices/references/identity-and-access.md +13 -0
  116. package/pipeline/skills/shared/external/api-security-best-practices/references/request-handling.md +12 -0
  117. package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +9 -0
  118. package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +8 -0
  119. package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +10 -0
  120. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +21 -0
  121. package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +9 -0
  122. package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +7 -0
  123. package/pipeline/skills/shared/external/app-store-review/SKILL.md +2 -2
  124. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +10 -0
  125. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +10 -1
  126. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +22 -0
  127. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +17 -0
  128. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +22 -0
  129. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +17 -0
  130. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +9 -0
  131. package/pipeline/skills/shared/external/authentication/references/passkeys.md +11 -0
  132. package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +13 -0
  133. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +9 -0
  134. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +10 -0
  135. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +15 -0
  136. package/pipeline/skills/shared/external/compose-components/references/patterns.md +7 -0
  137. package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +7 -0
  138. package/pipeline/skills/shared/external/compose-testing/references/patterns.md +15 -0
  139. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +9 -0
  140. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +11 -0
  141. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +10 -0
  142. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +13 -0
  143. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +20 -0
  144. package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +16 -0
  145. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +16 -0
  146. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +14 -0
  147. package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +13 -0
  148. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +10 -0
  149. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +10 -0
  150. package/pipeline/skills/shared/external/fastapi-pro/references/app-structure.md +10 -0
  151. package/pipeline/skills/shared/external/gradle-kotlin-dsl/references/patterns.md +17 -0
  152. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +12 -0
  153. package/pipeline/skills/shared/external/hig-app-icons/references/icon-workflow.md +10 -0
  154. package/pipeline/skills/shared/external/hig-components-content/references/content-views.md +10 -0
  155. package/pipeline/skills/shared/external/hig-components-layout/references/bars-and-tabs.md +11 -0
  156. package/pipeline/skills/shared/external/hig-foundations/references/foundations-detail.md +13 -0
  157. package/pipeline/skills/shared/external/hig-foundations/references/type-color-spacing.md +13 -0
  158. package/pipeline/skills/shared/external/hig-patterns/references/onboarding-and-states.md +11 -0
  159. package/pipeline/skills/shared/external/hig-platforms/references/ipad-layout.md +12 -0
  160. package/pipeline/skills/shared/external/hig-technologies/references/technologies.md +16 -0
  161. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +9 -0
  162. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +18 -0
  163. package/pipeline/skills/shared/external/ios-accessibility/references/large-content-and-appearance.md +9 -0
  164. package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +9 -0
  165. package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +7 -0
  166. package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +13 -0
  167. package/pipeline/skills/shared/external/ios-design-review/references/appearance-matrix.md +9 -0
  168. package/pipeline/skills/shared/external/ios-design-review/references/checklist.md +15 -0
  169. package/pipeline/skills/shared/external/ios-haptics/references/core-haptics.md +11 -0
  170. package/pipeline/skills/shared/external/ios-iphone-duo/references/api-map.md +11 -0
  171. package/pipeline/skills/shared/external/ios-iphone-duo/references/fixed-assumptions.md +15 -0
  172. package/pipeline/skills/shared/external/ios-iphone-duo/references/poses-and-panes.md +11 -0
  173. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +18 -0
  174. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +19 -0
  175. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +15 -0
  176. package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +7 -0
  177. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +8 -0
  178. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +12 -0
  179. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +17 -0
  180. package/pipeline/skills/shared/external/ios-security/references/app-review-guidelines.md +8 -0
  181. package/pipeline/skills/shared/external/ios-security/references/cryptokit-advanced.md +14 -0
  182. package/pipeline/skills/shared/external/ios-security/references/file-storage-patterns.md +8 -0
  183. package/pipeline/skills/shared/external/ios-security/references/privacy-manifest.md +9 -0
  184. package/pipeline/skills/shared/external/ios-sf-symbols/references/effects-and-custom-symbols.md +9 -0
  185. package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +13 -0
  186. package/pipeline/skills/shared/external/kotlin-coroutines-expert/references/patterns.md +8 -0
  187. package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +21 -0
  188. package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +9 -0
  189. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +12 -0
  190. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +16 -0
  191. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +21 -0
  192. package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +10 -0
  193. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +9 -0
  194. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +12 -0
  195. package/pipeline/skills/shared/external/nodejs-backend-patterns/references/runtime-patterns.md +11 -0
  196. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +11 -0
  197. package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +18 -0
  198. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +11 -0
  199. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +11 -0
  200. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +15 -0
  201. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +14 -0
  202. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +14 -0
  203. package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +14 -0
  204. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +14 -0
  205. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +10 -0
  206. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +12 -0
  207. package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +14 -0
  208. package/pipeline/skills/shared/external/room-database/references/patterns.md +16 -0
  209. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +10 -0
  210. package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +10 -0
  211. package/pipeline/skills/shared/external/spm-build-analysis/references/build-optimization-sources.md +14 -0
  212. package/pipeline/skills/shared/external/spm-build-analysis/references/spm-analysis-checks.md +19 -0
  213. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +13 -0
  214. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +31 -0
  215. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +8 -0
  216. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +9 -0
  217. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +10 -0
  218. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +8 -0
  219. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +24 -0
  220. package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +8 -0
  221. package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +14 -0
  222. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +12 -0
  223. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +10 -0
  224. package/pipeline/skills/shared/external/swift-concurrency-expert/references/swift-6-2-concurrency.md +8 -0
  225. package/pipeline/skills/shared/external/swift-concurrency-pro/references/actors.md +10 -0
  226. package/pipeline/skills/shared/external/swift-concurrency-pro/references/cancellation.md +7 -0
  227. package/pipeline/skills/shared/external/swift-concurrency-pro/references/interop.md +10 -0
  228. package/pipeline/skills/shared/external/swift-concurrency-pro/references/new-features.md +11 -0
  229. package/pipeline/skills/shared/external/swift-concurrency-pro/references/structured.md +9 -0
  230. package/pipeline/skills/shared/external/swift-concurrency-pro/references/testing.md +13 -0
  231. package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +7 -0
  232. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +14 -0
  233. package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +16 -0
  234. package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +17 -0
  235. package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +19 -0
  236. package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +16 -0
  237. package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +19 -0
  238. package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +18 -0
  239. package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +16 -0
  240. package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +17 -0
  241. package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +17 -0
  242. package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +17 -0
  243. package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +18 -0
  244. package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +21 -0
  245. package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +16 -0
  246. package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +16 -0
  247. package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +9 -0
  248. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +24 -0
  249. package/pipeline/skills/shared/external/swift-testing-pro/references/async-tests.md +9 -0
  250. package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +11 -0
  251. package/pipeline/skills/shared/external/swift-testing-pro/references/writing-better-tests.md +13 -0
  252. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +8 -0
  253. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +17 -0
  254. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +12 -0
  255. package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +11 -0
  256. package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +7 -0
  257. package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +13 -0
  258. package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +24 -0
  259. package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +12 -0
  260. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +15 -0
  261. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +15 -0
  262. package/pipeline/skills/shared/external/swiftui-animation/references/scroll-effects.md +12 -0
  263. package/pipeline/skills/shared/external/swiftui-expert-skill/references/accessibility-patterns.md +11 -0
  264. package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-advanced.md +7 -0
  265. package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-basics.md +13 -0
  266. package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-transitions.md +9 -0
  267. package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts-accessibility.md +9 -0
  268. package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts.md +17 -0
  269. package/pipeline/skills/shared/external/swiftui-expert-skill/references/image-optimization.md +9 -0
  270. package/pipeline/skills/shared/external/swiftui-expert-skill/references/latest-apis.md +10 -0
  271. package/pipeline/skills/shared/external/swiftui-expert-skill/references/layout-best-practices.md +12 -0
  272. package/pipeline/skills/shared/external/swiftui-expert-skill/references/list-patterns.md +12 -0
  273. package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-scenes.md +13 -0
  274. package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-views.md +12 -0
  275. package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-window-styling.md +12 -0
  276. package/pipeline/skills/shared/external/swiftui-expert-skill/references/performance-patterns.md +7 -0
  277. package/pipeline/skills/shared/external/swiftui-expert-skill/references/scroll-patterns.md +9 -0
  278. package/pipeline/skills/shared/external/swiftui-expert-skill/references/sheet-navigation-patterns.md +10 -0
  279. package/pipeline/skills/shared/external/swiftui-expert-skill/references/state-management.md +18 -0
  280. package/pipeline/skills/shared/external/swiftui-expert-skill/references/view-structure.md +16 -0
  281. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +11 -0
  282. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +8 -0
  283. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +14 -0
  284. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +9 -0
  285. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +22 -0
  286. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/uikit-glass.md +14 -0
  287. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +10 -0
  288. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +10 -0
  289. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +13 -0
  290. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +10 -0
  291. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +14 -0
  292. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +30 -0
  293. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +16 -0
  294. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +11 -0
  295. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +11 -0
  296. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +10 -0
  297. package/pipeline/skills/shared/external/swiftui-performance-audit/references/code-smells.md +8 -0
  298. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/app-wiring.md +12 -0
  299. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/menu-bar.md +10 -0
  300. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/navigationstack.md +11 -0
  301. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/scroll-reveal.md +12 -0
  302. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/sheets.md +14 -0
  303. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/tabview.md +10 -0
  304. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +10 -0
  305. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +13 -0
  306. package/pipeline/skills/shared/external/swiftui-view-refactor/references/mv-patterns.md +12 -0
  307. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +8 -0
  308. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +8 -0
  309. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +14 -0
  310. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +17 -0
  311. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +11 -0
  312. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +11 -0
  313. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +27 -0
  314. package/pipeline/skills/shared/external/xcode-build-fixer/references/build-settings-best-practices.md +9 -0
  315. package/pipeline/skills/shared/external/xcode-build-fixer/references/fix-patterns.md +7 -0
  316. package/pipeline/skills/shared/external/xcode-build-orchestrator/references/build-settings-best-practices.md +9 -0
  317. package/pipeline/skills/shared/external/xcode-compilation-analyzer/references/build-optimization-sources.md +14 -0
  318. package/pipeline/skills/shared/external/xcode-compilation-analyzer/references/code-compilation-checks.md +8 -0
  319. package/pipeline/skills/shared/external/xcode-project-analyzer/references/build-optimization-sources.md +14 -0
  320. package/pipeline/skills/shared/external/xcode-project-analyzer/references/build-settings-best-practices.md +9 -0
  321. package/pipeline/skills/shared/external/xcode-project-analyzer/references/project-audit-checks.md +13 -0
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-10-26T11:41:43Z",
3
+ "generatedAt": "2026-10-27T13:35:46Z",
4
4
  "skillCount": 237,
5
5
  "entries": [
6
6
  {
@@ -9,7 +9,7 @@
9
9
  },
10
10
  {
11
11
  "path": "shared/core/google-play-compliance/SKILL.md",
12
- "sha256": "3089e8c5f99c1ec7c1358394c398335ccb5ebc20ca05d60d870127da4592de34"
12
+ "sha256": "34e87f1e6fde51dd19c9ccff00e21cd7cee74f487b5dec54deec2268ff831b3b"
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",
@@ -137,7 +137,7 @@
137
137
  },
138
138
  {
139
139
  "path": "shared/core/multi-agent-office-status/SKILL.md",
140
- "sha256": "fba0513f8941c026172ea0ce76cbc76d88a5e813fd713d68a1377eb5a4204c86"
140
+ "sha256": "fbe2f99e789facebe89f10655389ea1988dd5a6db03b054487a9c4a8e6d43f2f"
141
141
  },
142
142
  {
143
143
  "path": "shared/core/multi-agent-postmortem/SKILL.md",
@@ -361,7 +361,7 @@
361
361
  },
362
362
  {
363
363
  "path": "shared/external/app-store-review/SKILL.md",
364
- "sha256": "073d99485665497229750b5f040c3a196c1e5de2bbcff281b8aec7e53817d3f4"
364
+ "sha256": "32e8b9de2894010fd584e6e4aada7270b85756be8608d7593127255fd6737a6e"
365
365
  },
366
366
  {
367
367
  "path": "shared/external/apple-on-device-ai/SKILL.md",
@@ -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:
@@ -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 `office-pair.mjs` 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.
@@ -1,5 +1,19 @@
1
1
  # AlarmKit patterns
2
2
 
3
+ <!-- toc -->
4
+ - [Contents](#contents)
5
+ - [Full alarm flow with intents](#full-alarm-flow-with-intents)
6
+ - [Full timer flow](#full-timer-flow)
7
+ - [Authorization manager](#authorization-manager)
8
+ - [State store with async sequences](#state-store-with-async-sequences)
9
+ - [Widget extension for countdown and paused UI](#widget-extension-for-countdown-and-paused-ui)
10
+ - [Recurrence](#recurrence)
11
+ - [Snooze and custom secondary actions](#snooze-and-custom-secondary-actions)
12
+ - [Info.plist](#infoplist)
13
+ - [Error handling](#error-handling)
14
+ - [Apple documentation](#apple-documentation)
15
+ <!-- /toc -->
16
+
3
17
  Longer, end-to-end examples. Everything here targets iOS 26 and iPadOS 26 with
4
18
  Swift 6.3. Code that uses the stopButton-free
5
19
  `AlarmPresentation.Alert(title:secondaryButton:secondaryButtonBehavior:)`
@@ -1,5 +1,11 @@
1
1
  # Android Clean Architecture -- Reference Patterns
2
2
 
3
+ <!-- toc -->
4
+ - [Contents](#contents)
5
+ - [Feature api/impl Split](#feature-apiimpl-split)
6
+ - [Cross-Module Navigation Graph Aggregation](#cross-module-navigation-graph-aggregation)
7
+ <!-- /toc -->
8
+
3
9
  Full code for the patterns summarized in `SKILL.md`. Load the section you need
4
10
  when implementing that specific structure.
5
11
 
@@ -1,5 +1,15 @@
1
1
  # Android Build Quality Gates - Patterns
2
2
 
3
+ <!-- toc -->
4
+ - [Contents](#contents)
5
+ - [Layer-dependency gate](#layer-dependency-gate)
6
+ - [Coverage floor with Kover](#coverage-floor-with-kover)
7
+ - [Compose-stability gate](#compose-stability-gate)
8
+ - [Lint on diff](#lint-on-diff)
9
+ - [Screenshot validation task](#screenshot-validation-task)
10
+ - [Wiring gates into check](#wiring-gates-into-check)
11
+ <!-- /toc -->
12
+
3
13
  Full, copy-ready code for the gates summarized in
4
14
  [../SKILL.md](../SKILL.md). Each section mirrors a heading there. Adapt names to
5
15
  the project's module conventions; nothing here hardcodes a product.
@@ -1,5 +1,16 @@
1
1
  # Android DataStore Patterns
2
2
 
3
+ <!-- toc -->
4
+ - [Contents](#contents)
5
+ - [Preferences DataStore](#preferences-datastore)
6
+ - [Typed DataStore with a Serializer](#typed-datastore-with-a-serializer)
7
+ - [Encrypted Typed DataStore](#encrypted-typed-datastore)
8
+ - [Migrating from SharedPreferences](#migrating-from-sharedpreferences)
9
+ - [Versioned Data Migrations](#versioned-data-migrations)
10
+ - [Reading and Writing as Flow](#reading-and-writing-as-flow)
11
+ - [Testing](#testing)
12
+ <!-- /toc -->
13
+
3
14
  Full code examples backing the guidance in `SKILL.md`. Headings mirror the
4
15
  SKILL.md sections. Package, class, and key names are placeholders; adapt them.
5
16
 
@@ -1,5 +1,13 @@
1
1
  # Android Design Tokens Codegen - Patterns
2
2
 
3
+ <!-- toc -->
4
+ - [Task wrapper](#task-wrapper)
5
+ - [preBuild wiring](#prebuild-wiring)
6
+ - [Check mode](#check-mode)
7
+ - [Caching](#caching)
8
+ - [Generated shapes](#generated-shapes)
9
+ <!-- /toc -->
10
+
3
11
  Copy-ready Gradle and Kotlin for the schema-to-typed-code pipeline. Each heading
4
12
  mirrors a section in `SKILL.md`. All input is a local JSON schema; all output is
5
13
  generated Kotlin under the build directory. Names are illustrative and generic.
@@ -1,5 +1,11 @@
1
1
  # Compose runtime patterns
2
2
 
3
+ <!-- toc -->
4
+ - [Who owns a piece of state](#who-owns-a-piece-of-state)
5
+ - [Side effects](#side-effects)
6
+ - [Modifiers](#modifiers)
7
+ <!-- /toc -->
8
+
3
9
  Loaded on demand from `../SKILL.md`.
4
10
 
5
11
  ## Who owns a piece of state
@@ -1,5 +1,15 @@
1
1
  # Android MVI BaseViewModel Patterns
2
2
 
3
+ <!-- toc -->
4
+ - [Contents](#contents)
5
+ - [Assembled BaseViewModel](#assembled-baseviewmodel)
6
+ - [MVI contracts for a screen](#mvi-contracts-for-a-screen)
7
+ - [A concrete ViewModel](#a-concrete-viewmodel)
8
+ - [Lifecycle-aware event collector](#lifecycle-aware-event-collector)
9
+ - [Stateless screen composable](#stateless-screen-composable)
10
+ - [Testing the ViewModel](#testing-the-viewmodel)
11
+ <!-- /toc -->
12
+
3
13
  Full code examples backing the guidance in `SKILL.md`. Load this file when you
4
14
  need a complete implementation to adapt. Headings mirror the SKILL.md sections.
5
15
 
@@ -1,5 +1,18 @@
1
1
  # Android Performance Patterns
2
2
 
3
+ <!-- toc -->
4
+ - [Contents](#contents)
5
+ - [Baseline Profiles](#baseline-profiles)
6
+ - [Compose Stability](#compose-stability)
7
+ - [Recomposition Debugging](#recomposition-debugging)
8
+ - [Lazy Layout Performance](#lazy-layout-performance)
9
+ - [R8 Optimization](#r8-optimization)
10
+ - [Memory Leak Detection](#memory-leak-detection)
11
+ - [Startup Optimization](#startup-optimization)
12
+ - [Image Loading with Coil](#image-loading-with-coil)
13
+ - [General Performance Patterns](#general-performance-patterns)
14
+ <!-- /toc -->
15
+
3
16
  Full code examples for the Android Performance skill. Each section mirrors a
4
17
  heading in `SKILL.md`. Load the section named in the guide when implementing or
5
18
  reviewing that area.
@@ -1,5 +1,21 @@
1
1
  # Android Security -- Reference Patterns
2
2
 
3
+ <!-- toc -->
4
+ - [Contents](#contents)
5
+ - [Secure Data Storage](#secure-data-storage)
6
+ - [Encrypted DataStore](#encrypted-datastore)
7
+ - [Database Key Hierarchy](#database-key-hierarchy)
8
+ - [Build-Type Security Gating](#build-type-security-gating)
9
+ - [Biometric Authentication](#biometric-authentication)
10
+ - [Certificate Pinning](#certificate-pinning)
11
+ - [API Key Protection](#api-key-protection)
12
+ - [R8 Obfuscation](#r8-obfuscation)
13
+ - [Play Integrity API](#play-integrity-api)
14
+ - [Root Detection](#root-detection)
15
+ - [Secure Network Communication](#secure-network-communication)
16
+ - [Secure Coding Patterns](#secure-coding-patterns)
17
+ <!-- /toc -->
18
+
3
19
  Full code for the patterns summarized in `SKILL.md`. Load the section you need
4
20
  when implementing that specific security feature.
5
21