@mmerterden/multi-agent-pipeline 20.34.0 → 20.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +69 -1
- package/README.md +7 -5
- package/README.tr.md +6 -5
- package/docs/architecture.md +3 -3
- package/docs/ecosystem.md +5 -5
- package/docs/facts.json +4 -4
- package/install/catalog-history.json +1 -1
- package/install/claude.mjs +16 -1
- package/install/templates/claude-hooks.json +23 -1
- package/manifest.json +338 -305
- package/package.json +5 -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-pair/SKILL.md +66 -0
- package/pipeline/commands/multi-agent/office-status/SKILL.md +3 -2
- package/pipeline/commands/multi-agent/sync/SKILL.md +3 -3
- 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 +386 -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/cross-cli-contract.md +4 -4
- 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/help/en.md +1 -0
- package/pipeline/multi-agent-refs/help/tr.md +1 -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 +438 -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 +12 -8
- package/pipeline/skills/.skills-index.json +15 -4
- package/pipeline/skills/shared/README.md +4 -3
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +1 -1
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +6 -6
- 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-pair/SKILL.md +19 -0
- package/pipeline/skills/shared/core/multi-agent-office-status/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +3 -3
- 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
- package/pipeline/skills/skills-index.md +2 -1
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @file worktree-prepare-all.mjs - the multi-repo worktree setup as one
|
|
4
|
+
* step: every repo gets its worktree, or none keeps one this step created.
|
|
5
|
+
*
|
|
6
|
+
* Phase 0 creates one worktree per repo of a multi-repo task. When the third
|
|
7
|
+
* repo's add fails, the first two must not stay behind on a half-made task.
|
|
8
|
+
* This runs worktree-prepare.sh serially in the given order and, on the first
|
|
9
|
+
* failure, rolls back what this call created, newest first:
|
|
10
|
+
*
|
|
11
|
+
* - the worktree is removed without --force, so a worktree holding changes
|
|
12
|
+
* is kept and reported instead of discarded;
|
|
13
|
+
* - the branch is deleted only when worktree-prepare created it here
|
|
14
|
+
* (newBranch) and it still points at origin/<base>, so a branch that
|
|
15
|
+
* existed before, or gained a commit, is never deleted.
|
|
16
|
+
*
|
|
17
|
+
* A worktree that was reused (it existed before the call) is never touched.
|
|
18
|
+
*
|
|
19
|
+
* Usage:
|
|
20
|
+
* worktree-prepare-all.mjs --repos <repos.json>
|
|
21
|
+
* repos.json: [{project, path, branch, base, name?, email?}, ...]
|
|
22
|
+
*
|
|
23
|
+
* Output (stdout, JSON): {ok, results[], failed, rolledBack[], kept[]}
|
|
24
|
+
* results each repo's worktree-prepare.sh output, in order, up to the failure
|
|
25
|
+
* failed the failing repo's output, or null
|
|
26
|
+
* rolledBack [{project, worktreePath, branchDeleted}]
|
|
27
|
+
* kept [{project, worktreePath, reason}] what the rollback left in place
|
|
28
|
+
*
|
|
29
|
+
* Exit: 0 every repo ready, 1 a repo failed (rollback done; see kept[]),
|
|
30
|
+
* 2 usage or a repos file that does not parse.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
34
|
+
import { readFileSync } from "node:fs";
|
|
35
|
+
import { dirname, join } from "node:path";
|
|
36
|
+
import { fileURLToPath } from "node:url";
|
|
37
|
+
|
|
38
|
+
import { invokedDirectly } from "../lib/invoked-directly.mjs";
|
|
39
|
+
|
|
40
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
41
|
+
const PREPARE = join(HERE, "worktree-prepare.sh");
|
|
42
|
+
|
|
43
|
+
const git = (cwd, ...args) =>
|
|
44
|
+
execFileSync("git", ["-C", cwd, ...args], {
|
|
45
|
+
encoding: "utf8",
|
|
46
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
47
|
+
timeout: 60_000,
|
|
48
|
+
}).trim();
|
|
49
|
+
|
|
50
|
+
function prepareOne(repo, prepare) {
|
|
51
|
+
try {
|
|
52
|
+
return prepareOnce(repo, prepare);
|
|
53
|
+
} catch (err) {
|
|
54
|
+
return {
|
|
55
|
+
ok: false,
|
|
56
|
+
out: {
|
|
57
|
+
project: repo.project,
|
|
58
|
+
worktreePath: repo.path,
|
|
59
|
+
branch: repo.branch,
|
|
60
|
+
baseBranch: repo.base,
|
|
61
|
+
action: "failed",
|
|
62
|
+
error: String(err?.message || err).slice(0, 500),
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function prepareOnce(repo, prepare) {
|
|
69
|
+
const args = [
|
|
70
|
+
prepare,
|
|
71
|
+
"--project",
|
|
72
|
+
repo.project,
|
|
73
|
+
"--path",
|
|
74
|
+
repo.path,
|
|
75
|
+
"--branch",
|
|
76
|
+
repo.branch,
|
|
77
|
+
"--base",
|
|
78
|
+
repo.base,
|
|
79
|
+
];
|
|
80
|
+
if (repo.name) args.push("--name", repo.name);
|
|
81
|
+
if (repo.email) args.push("--email", repo.email);
|
|
82
|
+
const r = spawnSync("bash", args, { encoding: "utf8", timeout: 300_000 });
|
|
83
|
+
let out;
|
|
84
|
+
try {
|
|
85
|
+
out = JSON.parse(r.stdout);
|
|
86
|
+
} catch {
|
|
87
|
+
out = null;
|
|
88
|
+
}
|
|
89
|
+
if (r.status === 0 && out && (out.action === "created" || out.action === "reused"))
|
|
90
|
+
return { ok: true, out };
|
|
91
|
+
return {
|
|
92
|
+
ok: false,
|
|
93
|
+
out: out ?? {
|
|
94
|
+
project: repo.project,
|
|
95
|
+
worktreePath: repo.path,
|
|
96
|
+
branch: repo.branch,
|
|
97
|
+
baseBranch: repo.base,
|
|
98
|
+
action: "failed",
|
|
99
|
+
error: (r.stderr || r.error?.message || `exit ${r.status}`).trim().slice(0, 500),
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Undo one worktree this call created. Returns a rolledBack or kept record. */
|
|
105
|
+
export function rollbackOne(res) {
|
|
106
|
+
const where = { project: res.project, worktreePath: res.worktreePath };
|
|
107
|
+
try {
|
|
108
|
+
git(res.project, "worktree", "remove", res.worktreePath);
|
|
109
|
+
} catch (err) {
|
|
110
|
+
return {
|
|
111
|
+
kept: {
|
|
112
|
+
...where,
|
|
113
|
+
reason: `worktree not removed: ${String(err.stderr || err.message)
|
|
114
|
+
.trim()
|
|
115
|
+
.slice(0, 200)}`,
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
let branchDeleted = false;
|
|
120
|
+
if (res.newBranch === true) {
|
|
121
|
+
try {
|
|
122
|
+
const tip = git(res.project, "rev-parse", "--verify", `refs/heads/${res.branch}`);
|
|
123
|
+
const base = git(
|
|
124
|
+
res.project,
|
|
125
|
+
"rev-parse",
|
|
126
|
+
"--verify",
|
|
127
|
+
`refs/remotes/origin/${res.baseBranch}`,
|
|
128
|
+
);
|
|
129
|
+
if (tip === base) {
|
|
130
|
+
git(res.project, "branch", "-D", "--", res.branch);
|
|
131
|
+
branchDeleted = true;
|
|
132
|
+
}
|
|
133
|
+
} catch {
|
|
134
|
+
branchDeleted = false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return { rolledBack: { ...where, branchDeleted } };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export function prepareAll(repos, { prepare = PREPARE } = {}) {
|
|
141
|
+
const results = [];
|
|
142
|
+
for (const repo of repos) {
|
|
143
|
+
const r = prepareOne(repo, prepare);
|
|
144
|
+
if (r.ok) {
|
|
145
|
+
results.push(r.out);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const rolledBack = [];
|
|
149
|
+
const kept = [];
|
|
150
|
+
for (const done of [...results].reverse()) {
|
|
151
|
+
if (done.action !== "created") continue;
|
|
152
|
+
const u = rollbackOne(done);
|
|
153
|
+
if (u.rolledBack) rolledBack.push(u.rolledBack);
|
|
154
|
+
else kept.push(u.kept);
|
|
155
|
+
}
|
|
156
|
+
return { ok: false, results, failed: r.out, rolledBack, kept };
|
|
157
|
+
}
|
|
158
|
+
return { ok: true, results, failed: null, rolledBack: [], kept: [] };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const FIELD = /^[^\0\n]+$/;
|
|
162
|
+
|
|
163
|
+
export function readRepos(text) {
|
|
164
|
+
const list = JSON.parse(text);
|
|
165
|
+
if (!Array.isArray(list) || !list.length) throw new Error("repos must be a non-empty array");
|
|
166
|
+
for (const r of list) {
|
|
167
|
+
for (const k of ["project", "path", "branch", "base"]) {
|
|
168
|
+
if (typeof r?.[k] !== "string" || !FIELD.test(r[k]))
|
|
169
|
+
throw new Error(`each repo needs a string ${k}`);
|
|
170
|
+
}
|
|
171
|
+
for (const k of ["branch", "base"])
|
|
172
|
+
if (r[k].startsWith("-")) throw new Error(`${k} must not start with -`);
|
|
173
|
+
for (const k of ["name", "email"]) {
|
|
174
|
+
if (r[k] !== undefined && (typeof r[k] !== "string" || !FIELD.test(r[k]))) {
|
|
175
|
+
throw new Error(`${k} must be a string when given`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return list;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function main() {
|
|
183
|
+
const i = process.argv.indexOf("--repos");
|
|
184
|
+
if (i < 0 || !process.argv[i + 1] || process.argv.length !== 4) {
|
|
185
|
+
console.error("usage: worktree-prepare-all.mjs --repos <repos.json>");
|
|
186
|
+
return 2;
|
|
187
|
+
}
|
|
188
|
+
let repos;
|
|
189
|
+
try {
|
|
190
|
+
repos = readRepos(readFileSync(process.argv[i + 1], "utf8"));
|
|
191
|
+
} catch (err) {
|
|
192
|
+
console.error(`worktree-prepare-all: ${err.message}`);
|
|
193
|
+
return 2;
|
|
194
|
+
}
|
|
195
|
+
const out = prepareAll(repos);
|
|
196
|
+
process.stdout.write(JSON.stringify(out, null, 2) + "\n");
|
|
197
|
+
return out.ok ? 0 : 1;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (invokedDirectly(import.meta.url)) process.exit(main());
|
|
@@ -27,10 +27,13 @@
|
|
|
27
27
|
# [--email <git user.email>]
|
|
28
28
|
#
|
|
29
29
|
# Output (stdout, JSON): {project, worktreePath, branch, baseBranch,
|
|
30
|
-
# action: created|reused|failed, pulled: true|false|null, error}
|
|
30
|
+
# action: created|reused|failed, pulled: true|false|null, newBranch, error}
|
|
31
|
+
# newBranch is true only when this call created the branch from origin/<base>,
|
|
32
|
+
# which is what tells worktree-prepare-all.mjs a rollback may delete it.
|
|
31
33
|
#
|
|
32
34
|
# Exit: 0 ready, 1 the add failed (nothing was created; the caller runs its
|
|
33
|
-
# rollback / collision flow), 2 usage
|
|
35
|
+
# rollback / collision flow), 2 usage, a path outside <project>/.worktrees/,
|
|
36
|
+
# or a new branch outside the naming convention.
|
|
34
37
|
set -uo pipefail
|
|
35
38
|
|
|
36
39
|
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
@@ -59,11 +62,43 @@ git -C "$PROJECT" rev-parse --git-dir >/dev/null 2>&1 || {
|
|
|
59
62
|
exit 2
|
|
60
63
|
}
|
|
61
64
|
|
|
65
|
+
# The worktree lives in the project's own .worktrees/ directory, compared on
|
|
66
|
+
# physical paths so a symlink cannot place it elsewhere.
|
|
67
|
+
physical() { # nearest existing ancestor resolved, the rest appended
|
|
68
|
+
local p="$1" tail=""
|
|
69
|
+
while [ ! -e "$p" ] && [ "$p" != "/" ] && [ "$p" != "." ]; do
|
|
70
|
+
tail="/$(basename "$p")$tail"
|
|
71
|
+
p="$(dirname "$p")"
|
|
72
|
+
done
|
|
73
|
+
printf '%s%s' "$(cd "$p" 2>/dev/null && pwd -P)" "$tail"
|
|
74
|
+
}
|
|
75
|
+
WT_ROOT="$(physical "$PROJECT")/.worktrees/"
|
|
76
|
+
case "$(physical "$WT")/" in
|
|
77
|
+
"$WT_ROOT"?*/) ;;
|
|
78
|
+
*)
|
|
79
|
+
echo "worktree-prepare: --path must be inside $PROJECT/.worktrees/ (got $WT)" >&2
|
|
80
|
+
exit 2
|
|
81
|
+
;;
|
|
82
|
+
esac
|
|
83
|
+
# A branch this call creates follows the naming convention; an existing one
|
|
84
|
+
# is re-entered as it is.
|
|
85
|
+
if ! git -C "$PROJECT" show-ref --verify --quiet "refs/heads/$BRANCH" &&
|
|
86
|
+
! git -C "$PROJECT" show-ref --verify --quiet "refs/remotes/origin/$BRANCH"; then
|
|
87
|
+
case "$BRANCH" in
|
|
88
|
+
feature/?* | bugfix/?* | hotfix/?* | release/?*) ;;
|
|
89
|
+
*)
|
|
90
|
+
echo "worktree-prepare: a new branch is named feature/<key>-<desc>, bugfix/<key>-<desc>, hotfix/<desc> or release/<version> (got $BRANCH)" >&2
|
|
91
|
+
exit 2
|
|
92
|
+
;;
|
|
93
|
+
esac
|
|
94
|
+
fi
|
|
95
|
+
NEW_BRANCH=false
|
|
62
96
|
report() { # $1 action, $2 pulled (true|false|null), $3 error
|
|
63
97
|
jq -n --arg project "$PROJECT" --arg wt "$WT" --arg branch "$BRANCH" --arg base "$BASE" \
|
|
64
|
-
--arg action "$1" --argjson pulled "$2" --arg error "$3" \
|
|
98
|
+
--arg action "$1" --argjson pulled "$2" --argjson newBranch "$NEW_BRANCH" --arg error "$3" \
|
|
65
99
|
'{project: $project, worktreePath: $wt, branch: $branch, baseBranch: $base,
|
|
66
|
-
action: $action, pulled: $pulled,
|
|
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,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-10-
|
|
4
|
-
"skillCount":
|
|
3
|
+
"generatedAt": "2026-10-31T07:29:16Z",
|
|
4
|
+
"skillCount": 238,
|
|
5
5
|
"entries": [
|
|
6
6
|
{
|
|
7
7
|
"path": "shared/core/apple-archive-compliance/SKILL.md",
|
|
8
|
-
"sha256": "
|
|
8
|
+
"sha256": "2bffd220fd3e3b59160f5b6834633c3ad144c89b192556f01b9405da706b221b"
|
|
9
9
|
},
|
|
10
10
|
{
|
|
11
11
|
"path": "shared/core/google-play-compliance/SKILL.md",
|
|
12
|
-
"sha256": "
|
|
12
|
+
"sha256": "5da8befd481459823fd5945d11215e70d751bad14b71b6050417a550282a4f03"
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
"path": "shared/core/multi-agent-analysis-jira/SKILL.md",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
"path": "shared/core/multi-agent-channels/SKILL.md",
|
|
52
|
-
"sha256": "
|
|
52
|
+
"sha256": "74008ae717bb9662ac6ab8838e3659a5006859fc6129f655094780bc97b90423"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
"path": "shared/core/multi-agent-complaint-analysis/SKILL.md",
|
|
@@ -135,9 +135,13 @@
|
|
|
135
135
|
"path": "shared/core/multi-agent-office-on/SKILL.md",
|
|
136
136
|
"sha256": "b46a2f79beeee65ae7ad6cbfc58b4631c5146a7761e91a99b8a056d6f49c690d"
|
|
137
137
|
},
|
|
138
|
+
{
|
|
139
|
+
"path": "shared/core/multi-agent-office-pair/SKILL.md",
|
|
140
|
+
"sha256": "6693c2453922bf87e22d5acd203f201c56b3389c831e297145b99186bb466ae5"
|
|
141
|
+
},
|
|
138
142
|
{
|
|
139
143
|
"path": "shared/core/multi-agent-office-status/SKILL.md",
|
|
140
|
-
"sha256": "
|
|
144
|
+
"sha256": "a34e42dc79bfe9bc8ca87456558baf1601b49168e94c7b28fb6cd3e853bf3d2e"
|
|
141
145
|
},
|
|
142
146
|
{
|
|
143
147
|
"path": "shared/core/multi-agent-postmortem/SKILL.md",
|
|
@@ -249,7 +253,7 @@
|
|
|
249
253
|
},
|
|
250
254
|
{
|
|
251
255
|
"path": "shared/core/multi-agent-sync/SKILL.md",
|
|
252
|
-
"sha256": "
|
|
256
|
+
"sha256": "e4d247d7b4708cb0984d81b6584851bea0a2cdee97ebcfad8498adcd194b7675"
|
|
253
257
|
},
|
|
254
258
|
{
|
|
255
259
|
"path": "shared/core/multi-agent-test-accessibility/SKILL.md",
|
|
@@ -361,7 +365,7 @@
|
|
|
361
365
|
},
|
|
362
366
|
{
|
|
363
367
|
"path": "shared/external/app-store-review/SKILL.md",
|
|
364
|
-
"sha256": "
|
|
368
|
+
"sha256": "32e8b9de2894010fd584e6e4aada7270b85756be8608d7593127255fd6737a6e"
|
|
365
369
|
},
|
|
366
370
|
{
|
|
367
371
|
"path": "shared/external/apple-on-device-ai/SKILL.md",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"skillCount":
|
|
3
|
+
"skillCount": 238,
|
|
4
4
|
"entries": [
|
|
5
5
|
{
|
|
6
6
|
"name": "accessibility-compliance-accessibility-audit",
|
|
@@ -202,7 +202,7 @@
|
|
|
202
202
|
},
|
|
203
203
|
{
|
|
204
204
|
"name": "apple-archive-compliance",
|
|
205
|
-
"description": "Apple App Store Review compliance - wraps the multi-agent-toolkit-mcp `ios_app_store_audit` tool (18-rule deep scan) with ITMS error code mapping + EN/TR humanizer templates.
|
|
205
|
+
"description": "Apple App Store Review compliance - wraps the multi-agent-toolkit-mcp `ios_app_store_audit` tool (18-rule deep scan) with ITMS error code mapping + EN/TR humanizer templates. Used by /multi-agent:test store-ready, the Phase 3 security auditor, /multi-agent:review and /multi-agent:channels. Use whe",
|
|
206
206
|
"platform": null,
|
|
207
207
|
"group": "core",
|
|
208
208
|
"plugin": null,
|
|
@@ -620,7 +620,7 @@
|
|
|
620
620
|
},
|
|
621
621
|
{
|
|
622
622
|
"name": "google-play-compliance",
|
|
623
|
-
"description": "Google Play Store publication compliance - bundletool + aapt2 + apksigner orchestration + 21-rule policy catalog with Play Console error codes + humanizer templates.
|
|
623
|
+
"description": "Google Play Store publication compliance - bundletool + aapt2 + apksigner orchestration + 21-rule policy catalog with Play Console error codes + humanizer templates. Used by /multi-agent:test store-ready, the Phase 3 security auditor, /multi-agent:review and /multi-agent:channels. Use when an .aab",
|
|
624
624
|
"platform": null,
|
|
625
625
|
"group": "core",
|
|
626
626
|
"plugin": null,
|
|
@@ -1137,7 +1137,7 @@
|
|
|
1137
1137
|
},
|
|
1138
1138
|
{
|
|
1139
1139
|
"name": "multi-agent-channels",
|
|
1140
|
-
"description": "Multi-channel reporter - Jira/Confluence/Wiki/PR description. Multi-select channels + content, humanizer pass, reviewer-preserving Bitbucket PR PUT.
|
|
1140
|
+
"description": "Multi-channel reporter - Jira/Confluence/Wiki/PR description. Multi-select channels + content, humanizer pass, reviewer-preserving Bitbucket PR PUT. Use to post or redo a run's report; Phase 5 delegates here, or invoke by Jira ID / PR URL / branch.",
|
|
1141
1141
|
"platform": null,
|
|
1142
1142
|
"group": "core",
|
|
1143
1143
|
"plugin": null,
|
|
@@ -1377,6 +1377,17 @@
|
|
|
1377
1377
|
"triggerPaths": [],
|
|
1378
1378
|
"relativePath": "shared/core/multi-agent-office-on/SKILL.md"
|
|
1379
1379
|
},
|
|
1380
|
+
{
|
|
1381
|
+
"name": "multi-agent-office-pair",
|
|
1382
|
+
"description": "Pair a phone with the office: QR, wait, compare the code with the user, enrol. Use when the office should be reachable from a phone.",
|
|
1383
|
+
"platform": null,
|
|
1384
|
+
"group": "core",
|
|
1385
|
+
"plugin": null,
|
|
1386
|
+
"invokeAs": "multi-agent-office-pair",
|
|
1387
|
+
"triggerKeywords": [],
|
|
1388
|
+
"triggerPaths": [],
|
|
1389
|
+
"relativePath": "shared/core/multi-agent-office-pair/SKILL.md"
|
|
1390
|
+
},
|
|
1380
1391
|
{
|
|
1381
1392
|
"name": "multi-agent-office-status",
|
|
1382
1393
|
"description": "Whether the office panel is running, its URL (never the token) and its last actions. Use when unsure if the panel is open.",
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Single source of truth for skills delivered to both Claude Code (`~/.claude/skills/`) and Copilot CLI (`~/.copilot/skills/`) by the installer.
|
|
4
4
|
|
|
5
|
-
**Total:**
|
|
5
|
+
**Total:** 238 skills (73 core + 165 external). Auto-generated by `scripts/gen-skills-index.mjs` - do not edit by hand.
|
|
6
6
|
|
|
7
7
|
## Directory layout
|
|
8
8
|
|
|
9
|
-
- **`core/`** -
|
|
9
|
+
- **`core/`** - 73 `multi-agent*` orchestration skills that are pipeline-critical. Edits here are core-code changes.
|
|
10
10
|
- **`external/`** - 165 iOS / Android / generic skills that ship into the stack plugins. Each names its origin in `metadata.source`: `multi-agent-pipeline` when written here, or the upstream and license a `NOTICE-*.md` in this directory covers.
|
|
11
11
|
- Install destinations (ADR-0009): Claude Code gets NO local copy of `external/` - it loads those skills from the `multi-agent-plugins` marketplace, namespaced (`ai-<stack>-toolkit:<name>`); only the two compliance catalogs from `core/` land in `~/.claude/skills/`. Copilot CLI and Codex CLI receive a flat copy filtered to the enabled stacks. `external/` remains the single authoring source that `build-stack-plugins.mjs` publishes from.
|
|
12
12
|
|
|
@@ -14,7 +14,7 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
|
|
|
14
14
|
|
|
15
15
|
## Categories
|
|
16
16
|
|
|
17
|
-
- [Pipeline Orchestration](#pipeline-orchestration) -
|
|
17
|
+
- [Pipeline Orchestration](#pipeline-orchestration) - 73
|
|
18
18
|
- [iOS / Apple Ecosystem](#ios-apple-ecosystem) - 94
|
|
19
19
|
- [Android / Kotlin](#android-kotlin) - 16
|
|
20
20
|
- [Web](#web) - 10
|
|
@@ -59,6 +59,7 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
|
|
|
59
59
|
| [`multi-agent-model`](./core/multi-agent-model/) | `core` | Turn the top model rung on or off and keep the cost ledger's pricing in step with it. Use when asked to enable or disable Fable, or which mo |
|
|
60
60
|
| [`multi-agent-office-off`](./core/multi-agent-office-off/) | `core` | Close the office panel and stop its local server. Use when done with the panel. |
|
|
61
61
|
| [`multi-agent-office-on`](./core/multi-agent-office-on/) | `core` | Open the office: a local browser page that shows runs and agents live and drives the ecosystem (new runs, jobs, PRs, keys, memory, system, c |
|
|
62
|
+
| [`multi-agent-office-pair`](./core/multi-agent-office-pair/) | `core` | Pair a phone with the office: QR, wait, compare the code with the user, enrol. Use when the office should be reachable from a phone. |
|
|
62
63
|
| [`multi-agent-office-status`](./core/multi-agent-office-status/) | `core` | Whether the office panel is running, its URL (never the token) and its last actions. Use when unsure if the panel is open. |
|
|
63
64
|
| [`multi-agent-postmortem`](./core/multi-agent-postmortem/) | `core` | Post-mortem of a run from its session transcripts: loops, stalls, root-cause hypotheses on file:line, fixes. Read-only, redacted. Use when a |
|
|
64
65
|
| [`multi-agent-prune-logs`](./core/multi-agent-prune-logs/) | `core` | Delete per-task project logs under ~/.claude/logs/multi-agent (filter by age/project/task). Audit trail + metrics are preserved. Dry-run fir |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: apple-archive-compliance
|
|
3
|
-
description: "Apple App Store Review compliance - wraps the multi-agent-toolkit-mcp `ios_app_store_audit` tool (18-rule deep scan) with ITMS error code mapping + EN/TR humanizer templates.
|
|
3
|
+
description: "Apple App Store Review compliance - wraps the multi-agent-toolkit-mcp `ios_app_store_audit` tool (18-rule deep scan) with ITMS error code mapping + EN/TR humanizer templates. Used by /multi-agent:test store-ready, the Phase 3 security auditor, /multi-agent:review and /multi-agent:channels. Use when an .xcarchive needs an App Store review check before submission, or a rejection has to be diagnosed."
|
|
4
4
|
user-invocable: true
|
|
5
5
|
argument-hint: '[archive-path] [--threshold=error|warning|info] [--format=markdown|json] [--lang=en|tr] - no-arg: picks most recent .xcarchive from ~/Library/Developer/Xcode/Archives/'
|
|
6
6
|
metadata:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: google-play-compliance
|
|
3
|
-
description: "Google Play Store publication compliance - bundletool + aapt2 + apksigner orchestration + 21-rule policy catalog with Play Console error codes + humanizer templates.
|
|
3
|
+
description: "Google Play Store publication compliance - bundletool + aapt2 + apksigner orchestration + 21-rule policy catalog with Play Console error codes + humanizer templates. Used by /multi-agent:test store-ready, the Phase 3 security auditor, /multi-agent:review and /multi-agent:channels. Use when an .aab or .apk needs a Play policy check before upload, or a Play rejection has to be diagnosed."
|
|
4
4
|
user-invocable: true
|
|
5
5
|
argument-hint: '[bundle-path] [--threshold=error|warning|info] [--format=markdown|json] [--lang=en|tr] - no-arg: picks most recent .aab from app/build/outputs/bundle/release/'
|
|
6
6
|
metadata:
|
|
@@ -10,7 +10,7 @@ metadata:
|
|
|
10
10
|
|
|
11
11
|
# google-play-compliance - Google Play Store Publication Compliance Skill
|
|
12
12
|
|
|
13
|
-
Pre-submission compliance check for Android App Bundle (`.aab`) and APK artifacts. Unlike the iOS side (single
|
|
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:
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: multi-agent-office-pair
|
|
3
|
+
description: "Pair a phone with the office: QR, wait, compare the code with the user, enrol. Use when the office should be reachable from a phone."
|
|
4
|
+
user-invocable: true
|
|
5
|
+
metadata:
|
|
6
|
+
language: en
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# multi-agent-office-pair
|
|
10
|
+
|
|
11
|
+
1. `node "$HOME/.copilot/scripts/office-pair.mjs" start` (add `--relay <url>`
|
|
12
|
+
when prefs `global.office.remote.relayUrl` is unset). The QR opens as a
|
|
13
|
+
local page; never print it here, it carries the one-time secret. In a
|
|
14
|
+
terminal of their own the user can run `start --terminal` instead.
|
|
15
|
+
2. Tell the user to scan it with the phone and finish the passkey step.
|
|
16
|
+
3. `node "$HOME/.copilot/scripts/office-pair.mjs" wait` (blocks up to 10 minutes).
|
|
17
|
+
4. Ask the user whether the phone shows the same `code`; never answer it yourself.
|
|
18
|
+
5. Same: `office-pair.mjs confirm <code>` and report the device. Different:
|
|
19
|
+
`office-pair.mjs cancel`; nothing is enrolled.
|
|
@@ -10,8 +10,8 @@ metadata:
|
|
|
10
10
|
|
|
11
11
|
1. `node "$HOME/.copilot/scripts/office-control.mjs" status --json`
|
|
12
12
|
2. Report in `outputLanguage`: `running`, `url` and `idleMinutes`; the
|
|
13
|
-
`remote` line as given ("
|
|
14
|
-
|
|
13
|
+
`remote` line as given ("off" until `/multi-agent:office-pair` pairs a phone, then
|
|
14
|
+
"paired"); `pairedDevices`; `recentActions`
|
|
15
15
|
(route, step, status, when; never a request body).
|
|
16
16
|
|
|
17
17
|
Never print the token or read the token file.
|