@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.
- package/CHANGELOG.md +55 -1
- package/README.md +1 -0
- package/docs/facts.json +2 -2
- package/install/catalog-history.json +1 -1
- package/install/claude.mjs +16 -1
- package/install/templates/claude-hooks.json +23 -1
- package/manifest.json +324 -293
- package/package.json +1 -1
- package/pipeline/agents/bulk-reader.md +3 -0
- package/pipeline/commands/multi-agent/channels/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/office-on/SKILL.md +7 -3
- package/pipeline/commands/multi-agent/office-status/SKILL.md +3 -2
- package/pipeline/contract/CHANGELOG.md +9 -0
- package/pipeline/contract/README.md +1 -0
- package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
- package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
- package/pipeline/contract/fixtures/error-unsigned.json +1 -1
- package/pipeline/contract/manifest.json +14 -1
- package/pipeline/contract/types/index.d.ts +24 -2
- package/pipeline/lib/json-file-lock.mjs +61 -15
- package/pipeline/lib/office-remote.mjs +228 -0
- package/pipeline/lib/qr-code.mjs +360 -0
- package/pipeline/lib/repo-hygiene.sh +1 -0
- package/pipeline/lib/run-completion.mjs +17 -0
- package/pipeline/multi-agent-refs/channels/issue-comment.md +1 -1
- package/pipeline/multi-agent-refs/features/office-remote-protocol.md +166 -0
- package/pipeline/multi-agent-refs/features/office-threat-model.md +1 -1
- package/pipeline/multi-agent-refs/features/scope-check.md +16 -1
- package/pipeline/multi-agent-refs/features/verify-by-test.md +10 -0
- package/pipeline/multi-agent-refs/keychain.md +7 -0
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +6 -2
- package/pipeline/multi-agent-refs/phases/phase-1-plan.md +4 -6
- package/pipeline/multi-agent-refs/phases/phase-2-dev.md +9 -12
- package/pipeline/multi-agent-refs/phases/phase-3-review.md +9 -8
- package/pipeline/multi-agent-refs/phases/phase-4-commit.md +1 -4
- package/pipeline/multi-agent-refs/rules.md +3 -2
- package/pipeline/multi-agent-refs/tracker-contract.md +1 -1
- package/pipeline/office/NOTICE.md +4 -1
- package/pipeline/office/assets/char_12.png +0 -0
- package/pipeline/office/assets/char_13.png +0 -0
- package/pipeline/office/assets/char_14.png +0 -0
- package/pipeline/office/assets/char_15.png +0 -0
- package/pipeline/office/assets/char_16.png +0 -0
- package/pipeline/office/assets/char_17.png +0 -0
- package/pipeline/office/assets/char_18.png +0 -0
- package/pipeline/office/assets/char_19.png +0 -0
- package/pipeline/office/assets/char_20.png +0 -0
- package/pipeline/office/assets/char_21.png +0 -0
- package/pipeline/office/assets/char_22.png +0 -0
- package/pipeline/office/assets/char_23.png +0 -0
- package/pipeline/office/assets/char_24.png +0 -0
- package/pipeline/office/assets/char_25.png +0 -0
- package/pipeline/office/assets/char_26.png +0 -0
- package/pipeline/office/assets/char_27.png +0 -0
- package/pipeline/office/assets/char_28.png +0 -0
- package/pipeline/office/assets/char_29.png +0 -0
- package/pipeline/office/assets/char_30.png +0 -0
- package/pipeline/office/index.html +293 -49
- package/pipeline/schemas/agent-state.schema.json +18 -0
- package/pipeline/schemas/planning-output.schema.json +18 -0
- package/pipeline/schemas/pr-reach.schema.json +55 -0
- package/pipeline/schemas/prefs.schema.json +13 -7
- package/pipeline/schemas/triage-output.schema.json +12 -1
- package/pipeline/schemas/unattended-policy.json +2 -1
- package/pipeline/scripts/_guard_rules.py +449 -1
- package/pipeline/scripts/_test-gaming.mjs +36 -0
- package/pipeline/scripts/agent-guard.py +79 -19
- package/pipeline/scripts/anonymize-findings.mjs +99 -0
- package/pipeline/scripts/answer-check.mjs +113 -0
- package/pipeline/scripts/answer-check.sh +20 -0
- package/pipeline/scripts/autopilot-publish.mjs +9 -2
- package/pipeline/scripts/contract-server.mjs +35 -1
- package/pipeline/scripts/gate-ledger.mjs +144 -21
- package/pipeline/scripts/office-build.mjs +276 -5
- package/pipeline/scripts/office-control.mjs +70 -10
- package/pipeline/scripts/office-pair.mjs +407 -0
- package/pipeline/scripts/office-remote-client.mjs +463 -0
- package/pipeline/scripts/phase-tracker.sh +8 -0
- package/pipeline/scripts/phase0-exit-gate.mjs +40 -37
- package/pipeline/scripts/phone-devices.mjs +9 -1
- package/pipeline/scripts/pre-commit-check.sh +28 -2
- package/pipeline/scripts/pre-push-check.sh +6 -12
- package/pipeline/scripts/rework-base.mjs +87 -0
- package/pipeline/scripts/run-commit-check.mjs +104 -0
- package/pipeline/scripts/run-scope-guard.mjs +58 -3
- package/pipeline/scripts/run-scope-guard.sh +13 -1
- package/pipeline/scripts/scope-check-gate.mjs +70 -6
- package/pipeline/scripts/task-mirror.mjs +106 -15
- package/pipeline/scripts/task-mirror.sh +3 -2
- package/pipeline/scripts/test-stability-gate.mjs +112 -0
- package/pipeline/scripts/update-check.sh +7 -1
- package/pipeline/scripts/update-issue-progress.sh +73 -8
- package/pipeline/scripts/validate-planning.mjs +105 -1
- package/pipeline/scripts/validate-triage.mjs +42 -2
- package/pipeline/scripts/work-items.mjs +119 -1
- package/pipeline/scripts/worktree-prepare-all.mjs +200 -0
- package/pipeline/scripts/worktree-prepare.sh +40 -4
- package/pipeline/scripts/write-state.mjs +67 -24
- package/pipeline/skills/.skill-manifest.json +5 -5
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +5 -5
- package/pipeline/skills/shared/core/google-play-compliance/references/rules.yml +1 -1
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-office-status/SKILL.md +2 -2
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +14 -0
- package/pipeline/skills/shared/external/android-architecture/references/patterns.md +6 -0
- package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +10 -0
- package/pipeline/skills/shared/external/android-datastore/references/patterns.md +11 -0
- package/pipeline/skills/shared/external/android-design-tokens-codegen/references/patterns.md +8 -0
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/references/patterns.md +6 -0
- package/pipeline/skills/shared/external/android-mvi-viewmodel/references/patterns.md +10 -0
- package/pipeline/skills/shared/external/android-performance/references/patterns.md +13 -0
- package/pipeline/skills/shared/external/android-security/references/patterns.md +16 -0
- package/pipeline/skills/shared/external/api-patterns/references/contract-details.md +9 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md +12 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/identity-and-access.md +13 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/request-handling.md +12 -0
- package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +9 -0
- package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +8 -0
- package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +10 -0
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +21 -0
- package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +9 -0
- package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +7 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +2 -2
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +10 -0
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +10 -1
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +22 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +17 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +22 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +17 -0
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +9 -0
- package/pipeline/skills/shared/external/authentication/references/passkeys.md +11 -0
- package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +13 -0
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +9 -0
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +10 -0
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +15 -0
- package/pipeline/skills/shared/external/compose-components/references/patterns.md +7 -0
- package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +7 -0
- package/pipeline/skills/shared/external/compose-testing/references/patterns.md +15 -0
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +9 -0
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +11 -0
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +10 -0
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +13 -0
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +20 -0
- package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +16 -0
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +16 -0
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +14 -0
- package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +13 -0
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +10 -0
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +10 -0
- package/pipeline/skills/shared/external/fastapi-pro/references/app-structure.md +10 -0
- package/pipeline/skills/shared/external/gradle-kotlin-dsl/references/patterns.md +17 -0
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +12 -0
- package/pipeline/skills/shared/external/hig-app-icons/references/icon-workflow.md +10 -0
- package/pipeline/skills/shared/external/hig-components-content/references/content-views.md +10 -0
- package/pipeline/skills/shared/external/hig-components-layout/references/bars-and-tabs.md +11 -0
- package/pipeline/skills/shared/external/hig-foundations/references/foundations-detail.md +13 -0
- package/pipeline/skills/shared/external/hig-foundations/references/type-color-spacing.md +13 -0
- package/pipeline/skills/shared/external/hig-patterns/references/onboarding-and-states.md +11 -0
- package/pipeline/skills/shared/external/hig-platforms/references/ipad-layout.md +12 -0
- package/pipeline/skills/shared/external/hig-technologies/references/technologies.md +16 -0
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +9 -0
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +18 -0
- package/pipeline/skills/shared/external/ios-accessibility/references/large-content-and-appearance.md +9 -0
- package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +9 -0
- package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +7 -0
- package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +13 -0
- package/pipeline/skills/shared/external/ios-design-review/references/appearance-matrix.md +9 -0
- package/pipeline/skills/shared/external/ios-design-review/references/checklist.md +15 -0
- package/pipeline/skills/shared/external/ios-haptics/references/core-haptics.md +11 -0
- package/pipeline/skills/shared/external/ios-iphone-duo/references/api-map.md +11 -0
- package/pipeline/skills/shared/external/ios-iphone-duo/references/fixed-assumptions.md +15 -0
- package/pipeline/skills/shared/external/ios-iphone-duo/references/poses-and-panes.md +11 -0
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +18 -0
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +19 -0
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +15 -0
- package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +7 -0
- package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +8 -0
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +12 -0
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +17 -0
- package/pipeline/skills/shared/external/ios-security/references/app-review-guidelines.md +8 -0
- package/pipeline/skills/shared/external/ios-security/references/cryptokit-advanced.md +14 -0
- package/pipeline/skills/shared/external/ios-security/references/file-storage-patterns.md +8 -0
- package/pipeline/skills/shared/external/ios-security/references/privacy-manifest.md +9 -0
- package/pipeline/skills/shared/external/ios-sf-symbols/references/effects-and-custom-symbols.md +9 -0
- package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +13 -0
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/references/patterns.md +8 -0
- package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +21 -0
- package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +9 -0
- package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +12 -0
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +16 -0
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +21 -0
- package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +10 -0
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +9 -0
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +12 -0
- package/pipeline/skills/shared/external/nodejs-backend-patterns/references/runtime-patterns.md +11 -0
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +11 -0
- package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +18 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +11 -0
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +11 -0
- package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +15 -0
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +14 -0
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +14 -0
- package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +14 -0
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +14 -0
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +10 -0
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +12 -0
- package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +14 -0
- package/pipeline/skills/shared/external/room-database/references/patterns.md +16 -0
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +10 -0
- package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +10 -0
- package/pipeline/skills/shared/external/spm-build-analysis/references/build-optimization-sources.md +14 -0
- package/pipeline/skills/shared/external/spm-build-analysis/references/spm-analysis-checks.md +19 -0
- package/pipeline/skills/shared/external/storekit/references/core-patterns.md +13 -0
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +31 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +8 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +9 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +10 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +8 -0
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +24 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +8 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +14 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +12 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +10 -0
- package/pipeline/skills/shared/external/swift-concurrency-expert/references/swift-6-2-concurrency.md +8 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/actors.md +10 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/cancellation.md +7 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/interop.md +10 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/new-features.md +11 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/structured.md +9 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/testing.md +13 -0
- package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +7 -0
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +14 -0
- package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +16 -0
- package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +17 -0
- package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +19 -0
- package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +16 -0
- package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +19 -0
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +18 -0
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +16 -0
- package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +17 -0
- package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +17 -0
- package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +17 -0
- package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +18 -0
- package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +21 -0
- package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +16 -0
- package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +16 -0
- package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +9 -0
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +24 -0
- package/pipeline/skills/shared/external/swift-testing-pro/references/async-tests.md +9 -0
- package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +11 -0
- package/pipeline/skills/shared/external/swift-testing-pro/references/writing-better-tests.md +13 -0
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +8 -0
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +17 -0
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +12 -0
- package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +11 -0
- package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +7 -0
- package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +13 -0
- package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +24 -0
- package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +12 -0
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +15 -0
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +15 -0
- package/pipeline/skills/shared/external/swiftui-animation/references/scroll-effects.md +12 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/accessibility-patterns.md +11 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-advanced.md +7 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-basics.md +13 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-transitions.md +9 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts-accessibility.md +9 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts.md +17 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/image-optimization.md +9 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/latest-apis.md +10 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/layout-best-practices.md +12 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/list-patterns.md +12 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-scenes.md +13 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-views.md +12 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-window-styling.md +12 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/performance-patterns.md +7 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/scroll-patterns.md +9 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/sheet-navigation-patterns.md +10 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/state-management.md +18 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/view-structure.md +16 -0
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +11 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +8 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +14 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +9 -0
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +22 -0
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/uikit-glass.md +14 -0
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +10 -0
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +10 -0
- package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +13 -0
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +10 -0
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +14 -0
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +30 -0
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +16 -0
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +11 -0
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +11 -0
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +10 -0
- package/pipeline/skills/shared/external/swiftui-performance-audit/references/code-smells.md +8 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/app-wiring.md +12 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/menu-bar.md +10 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/navigationstack.md +11 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/scroll-reveal.md +12 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/sheets.md +14 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/references/tabview.md +10 -0
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +10 -0
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +13 -0
- package/pipeline/skills/shared/external/swiftui-view-refactor/references/mv-patterns.md +12 -0
- package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +8 -0
- package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +8 -0
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +14 -0
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +17 -0
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +11 -0
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +11 -0
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +27 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/references/build-settings-best-practices.md +9 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/references/fix-patterns.md +7 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/references/build-settings-best-practices.md +9 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/references/build-optimization-sources.md +14 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/references/code-compilation-checks.md +8 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/references/build-optimization-sources.md +14 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/references/build-settings-best-practices.md +9 -0
- 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,
|
|
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
|
-
|
|
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
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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 =
|
|
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-
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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
|
|
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` ≥
|
|
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 =
|
|
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.**
|
|
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` ≥
|
|
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.
|
|
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 ("
|
|
14
|
-
|
|
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
|
|
package/pipeline/skills/shared/external/android-design-tokens-codegen/references/patterns.md
CHANGED
|
@@ -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,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
|
|