@devo-bmad-custom/agent-orchestration 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/bmad.js +36 -0
- package/lib/cli.js +137 -0
- package/lib/filter.js +73 -0
- package/lib/installer.js +787 -0
- package/package.json +30 -0
- package/src/.agents/skills/audit-website/README.md +20 -0
- package/src/.agents/skills/audit-website/SKILL.md +470 -0
- package/src/.agents/skills/audit-website/agents/openai.yaml +6 -0
- package/src/.agents/skills/audit-website/assets/icon-small.svg +41 -0
- package/src/.agents/skills/audit-website/references/OUTPUT-FORMAT.md +250 -0
- package/src/.agents/skills/clean-code-standards/SKILL.md +105 -0
- package/src/.agents/skills/excalidraw-dark-standard/SKILL.md +282 -0
- package/src/.agents/skills/excalidraw-diagram-generator/SKILL.md +613 -0
- package/src/.agents/skills/excalidraw-diagram-generator/references/element-types.md +497 -0
- package/src/.agents/skills/excalidraw-diagram-generator/references/excalidraw-schema.md +350 -0
- package/src/.agents/skills/excalidraw-diagram-generator/scripts/README.md +193 -0
- package/src/.agents/skills/excalidraw-diagram-generator/scripts/add-arrow.py +312 -0
- package/src/.agents/skills/excalidraw-diagram-generator/scripts/add-icon-to-diagram.py +404 -0
- package/src/.agents/skills/excalidraw-diagram-generator/scripts/split-excalidraw-library.py +183 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/business-flow-swimlane-template.excalidraw +334 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/class-diagram-template.excalidraw +558 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/data-flow-diagram-template.excalidraw +279 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/er-diagram-template.excalidraw +662 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/flowchart-template.excalidraw +179 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/mindmap-template.excalidraw +244 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/relationship-template.excalidraw +145 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/sequence-diagram-template.excalidraw +509 -0
- package/src/.agents/skills/frontend-responsive-design-standards/SKILL.md +434 -0
- package/src/.agents/skills/java-fundamentals/SKILL.md +116 -0
- package/src/.agents/skills/java-performance/SKILL.md +119 -0
- package/src/.agents/skills/next-best-practices/SKILL.md +153 -0
- package/src/.agents/skills/next-best-practices/async-patterns.md +87 -0
- package/src/.agents/skills/next-best-practices/bundling.md +180 -0
- package/src/.agents/skills/next-best-practices/data-patterns.md +297 -0
- package/src/.agents/skills/next-best-practices/debug-tricks.md +105 -0
- package/src/.agents/skills/next-best-practices/directives.md +73 -0
- package/src/.agents/skills/next-best-practices/error-handling.md +227 -0
- package/src/.agents/skills/next-best-practices/file-conventions.md +140 -0
- package/src/.agents/skills/next-best-practices/font.md +245 -0
- package/src/.agents/skills/next-best-practices/functions.md +108 -0
- package/src/.agents/skills/next-best-practices/hydration-error.md +91 -0
- package/src/.agents/skills/next-best-practices/image.md +173 -0
- package/src/.agents/skills/next-best-practices/metadata.md +301 -0
- package/src/.agents/skills/next-best-practices/parallel-routes.md +287 -0
- package/src/.agents/skills/next-best-practices/route-handlers.md +146 -0
- package/src/.agents/skills/next-best-practices/rsc-boundaries.md +159 -0
- package/src/.agents/skills/next-best-practices/runtime-selection.md +39 -0
- package/src/.agents/skills/next-best-practices/scripts.md +141 -0
- package/src/.agents/skills/next-best-practices/self-hosting.md +371 -0
- package/src/.agents/skills/next-best-practices/suspense-boundaries.md +67 -0
- package/src/.agents/skills/nextjs-app-router-patterns/SKILL.md +537 -0
- package/src/.agents/skills/postgresql-optimization/SKILL.md +404 -0
- package/src/.agents/skills/python-backend/SKILL.md +153 -0
- package/src/.agents/skills/python-fundamentals/SKILL.md +234 -0
- package/src/.agents/skills/python-performance/SKILL.md +404 -0
- package/src/.agents/skills/react-expert/SKILL.md +335 -0
- package/src/.agents/skills/redis-best-practices/SKILL.md +438 -0
- package/src/.agents/skills/security-best-practices/SKILL.md +288 -0
- package/src/.agents/skills/security-review/LICENSE +22 -0
- package/src/.agents/skills/security-review/SKILL.md +312 -0
- package/src/.agents/skills/security-review/infrastructure/docker.md +432 -0
- package/src/.agents/skills/security-review/languages/javascript.md +388 -0
- package/src/.agents/skills/security-review/languages/python.md +363 -0
- package/src/.agents/skills/security-review/references/api-security.md +519 -0
- package/src/.agents/skills/security-review/references/authentication.md +353 -0
- package/src/.agents/skills/security-review/references/authorization.md +372 -0
- package/src/.agents/skills/security-review/references/business-logic.md +443 -0
- package/src/.agents/skills/security-review/references/cryptography.md +329 -0
- package/src/.agents/skills/security-review/references/csrf.md +398 -0
- package/src/.agents/skills/security-review/references/data-protection.md +378 -0
- package/src/.agents/skills/security-review/references/deserialization.md +410 -0
- package/src/.agents/skills/security-review/references/error-handling.md +436 -0
- package/src/.agents/skills/security-review/references/file-security.md +457 -0
- package/src/.agents/skills/security-review/references/injection.md +259 -0
- package/src/.agents/skills/security-review/references/logging.md +433 -0
- package/src/.agents/skills/security-review/references/misconfiguration.md +435 -0
- package/src/.agents/skills/security-review/references/modern-threats.md +475 -0
- package/src/.agents/skills/security-review/references/ssrf.md +415 -0
- package/src/.agents/skills/security-review/references/supply-chain.md +405 -0
- package/src/.agents/skills/security-review/references/xss.md +336 -0
- package/src/.agents/skills/subagent-driven-development/SKILL.md +275 -0
- package/src/.agents/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/src/.agents/skills/subagent-driven-development/implementer-prompt.md +113 -0
- package/src/.agents/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/src/.agents/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/src/.agents/skills/systematic-debugging/SKILL.md +296 -0
- package/src/.agents/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/src/.agents/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/src/.agents/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/src/.agents/skills/systematic-debugging/find-polluter.sh +63 -0
- package/src/.agents/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/src/.agents/skills/systematic-debugging/test-academic.md +14 -0
- package/src/.agents/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/src/.agents/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/src/.agents/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/src/.agents/skills/typescript-best-practices/SKILL.md +373 -0
- package/src/.agents/skills/ui-ux-pro-custom/SKILL.md +348 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/charts.csv +26 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/colors.csv +97 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/icons.csv +101 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/SKILL.md +106 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/accessibility.md +475 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/animation.md +466 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/composition-locals.md +231 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/deprecated-patterns.md +323 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/lists-scrolling.md +400 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/modifiers.md +331 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/navigation.md +416 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/performance.md +446 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/side-effects.md +516 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/foundation-source.md +13327 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/material3-source.md +19097 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/navigation-source.md +2947 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/runtime-source.md +11316 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/ui-source.md +7896 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/state-management.md +377 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/styles-experimental.md +470 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/theming-material3.md +349 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/view-composition.md +595 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/landing.csv +31 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/mobile-ui-layout.md +654 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/products.csv +97 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/react-performance.csv +45 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/astro.csv +54 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/flutter.csv +53 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/html-tailwind.csv +56 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/jetpack-compose.csv +53 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/nextjs.csv +53 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/nuxt-ui.csv +51 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/nuxtjs.csv +59 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/react-native.csv +56 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/react.csv +54 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/shadcn.csv +61 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/svelte.csv +54 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/swiftui.csv +51 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/vue.csv +50 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/styles.csv +68 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/alarmkit/SKILL.md +438 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/alarmkit/references/alarmkit-patterns.md +584 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-clips/SKILL.md +436 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-intents/SKILL.md +489 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-intents/references/appintents-advanced.md +1076 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-store-review/SKILL.md +340 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-store-review/references/privacy-manifest.md +90 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-store-review/references/review-checklists.md +106 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/SKILL.md +500 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/coreml-conversion.md +425 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/coreml-optimization.md +344 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/foundation-models.md +508 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/mlx-swift.md +285 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/authentication/SKILL.md +496 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/authentication/references/keychain-biometric.md +211 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/background-processing/SKILL.md +499 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/background-processing/references/background-task-patterns.md +390 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/callkit-voip/SKILL.md +461 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/callkit-voip/references/callkit-patterns.md +425 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/cloudkit-sync/SKILL.md +492 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/cloudkit-sync/references/cloudkit-patterns.md +461 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/codable-patterns/SKILL.md +467 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/contacts-framework/SKILL.md +425 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/contacts-framework/references/contacts-patterns.md +409 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-bluetooth/SKILL.md +491 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-bluetooth/references/ble-patterns.md +435 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-motion/SKILL.md +388 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-motion/references/motion-patterns.md +405 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-nfc/SKILL.md +495 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-nfc/references/nfc-patterns.md +420 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/coreml/SKILL.md +459 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/coreml/references/coreml-swift-integration.md +765 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/debugging-instruments/SKILL.md +422 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/debugging-instruments/references/instruments-guide.md +387 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/debugging-instruments/references/lldb-patterns.md +298 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/device-integrity/SKILL.md +477 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/energykit/SKILL.md +460 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/energykit/references/energykit-patterns.md +541 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/eventkit-calendar/SKILL.md +483 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/eventkit-calendar/references/eventkit-patterns.md +326 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/healthkit/SKILL.md +498 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/healthkit/references/healthkit-patterns.md +602 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/homekit-matter/SKILL.md +496 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/homekit-matter/references/matter-commissioning.md +455 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-accessibility/SKILL.md +301 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-accessibility/references/a11y-patterns.md +140 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-localization/SKILL.md +418 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-localization/references/formatstyle-locale.md +627 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-localization/references/string-catalogs.md +462 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/SKILL.md +441 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/background-websocket.md +862 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/lightweight-clients.md +93 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/network-framework.md +563 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/urlsession-patterns.md +1116 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/SKILL.md +496 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/app-review-guidelines.md +174 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/cryptokit-advanced.md +297 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/file-storage-patterns.md +354 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/privacy-manifest.md +117 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/live-activities/SKILL.md +500 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/live-activities/references/live-activity-patterns.md +868 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/mapkit-location/SKILL.md +485 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/mapkit-location/references/corelocation-patterns.md +730 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/mapkit-location/references/mapkit-patterns.md +748 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/metrickit-diagnostics/SKILL.md +479 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/musickit-audio/SKILL.md +395 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/musickit-audio/references/musickit-patterns.md +363 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/natural-language/SKILL.md +412 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/natural-language/references/translation-patterns.md +311 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/passkit-wallet/SKILL.md +398 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/passkit-wallet/references/wallet-passes.md +254 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/pencilkit-drawing/SKILL.md +387 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/pencilkit-drawing/references/paperkit-integration.md +376 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/pencilkit-drawing/references/pencilkit-patterns.md +302 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/permissionkit/SKILL.md +446 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/permissionkit/references/permissionkit-patterns.md +435 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/SKILL.md +501 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/av-playback.md +701 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/camera-capture.md +774 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/image-loading-caching.md +869 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/photospicker-patterns.md +597 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/push-notifications/SKILL.md +501 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/push-notifications/references/notification-patterns.md +677 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/push-notifications/references/rich-notifications.md +745 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/realitykit-ar/SKILL.md +479 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/realitykit-ar/references/realitykit-patterns.md +480 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/shareplay-activities/SKILL.md +483 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/shareplay-activities/references/shareplay-patterns.md +544 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/speech-recognition/SKILL.md +485 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/storekit/SKILL.md +478 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/storekit/references/app-review-guidelines.md +58 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/storekit/references/storekit-advanced.md +755 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-charts/SKILL.md +487 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-charts/references/charts-patterns.md +895 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/SKILL.md +408 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/approachable-concurrency.md +80 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/swift-6-2-concurrency.md +233 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/swiftui-concurrency.md +187 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/synchronization-primitives.md +341 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-language/SKILL.md +498 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-language/references/swift-patterns-extended.md +505 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-testing/SKILL.md +467 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-testing/references/testing-patterns.md +504 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/SKILL.md +334 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/references/core-data-coexistence.md +504 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/references/swiftdata-advanced.md +975 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/references/swiftdata-queries.md +675 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-animation/SKILL.md +481 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-animation/references/animation-advanced.md +804 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-animation/references/core-animation-bridge.md +553 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-gestures/SKILL.md +450 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-gestures/references/gesture-patterns.md +425 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/SKILL.md +336 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/form.md +97 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/grids.md +69 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/list.md +99 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/scrollview.md +147 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-liquid-glass/SKILL.md +325 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-liquid-glass/references/liquid-glass.md +387 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/SKILL.md +262 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/deeplinks.md +207 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/navigationstack.md +177 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/sheets.md +169 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/tabview.md +178 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/SKILL.md +381 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/architecture-patterns.md +486 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/deprecated-migration.md +1097 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/design-polish.md +780 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/platform-and-sharing.md +696 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/SKILL.md +491 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +46 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +29 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/understanding-hangs-in-your-app.md +33 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/understanding-improving-swiftui-performance.md +52 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-uikit-interop/SKILL.md +428 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-uikit-interop/references/hosting-migration.md +534 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-uikit-interop/references/representable-recipes.md +1133 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/tipkit/SKILL.md +494 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/tipkit/references/tipkit-patterns.md +782 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/SKILL.md +475 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/references/vision-requests.md +736 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/references/visionkit-scanner.md +738 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/weatherkit/SKILL.md +410 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/weatherkit/references/weatherkit-patterns.md +567 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/widgetkit/SKILL.md +497 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/widgetkit/references/widgetkit-advanced.md +871 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/typography.csv +58 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/ui-reasoning.csv +101 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/ux-guidelines.csv +100 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/web-interface.csv +31 -0
- package/src/.agents/skills/ui-ux-pro-custom/scripts/core.py +253 -0
- package/src/.agents/skills/ui-ux-pro-custom/scripts/design_system.py +1067 -0
- package/src/.agents/skills/ui-ux-pro-custom/scripts/search.py +114 -0
- package/src/.agents/skills/ux-audit/SKILL.md +151 -0
- package/src/.agents/skills/websocket-engineer/SKILL.md +168 -0
- package/src/.agents/skills/websocket-engineer/references/alternatives.md +391 -0
- package/src/.agents/skills/websocket-engineer/references/patterns.md +400 -0
- package/src/.agents/skills/websocket-engineer/references/protocol.md +195 -0
- package/src/.agents/skills/websocket-engineer/references/scaling.md +333 -0
- package/src/.agents/skills/websocket-engineer/references/security.md +474 -0
- package/src/.agents/skills/writing-skills/SKILL.md +655 -0
- package/src/.agents/skills/writing-skills/anthropic-best-practices.md +1150 -0
- package/src/.agents/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/src/.agents/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/src/.agents/skills/writing-skills/persuasion-principles.md +187 -0
- package/src/.agents/skills/writing-skills/render-graphs.js +168 -0
- package/src/.agents/skills/writing-skills/testing-skills-with-subagents.md +384 -0
- package/src/.claude/commands/bmad-track-compact.md +19 -0
- package/src/.claude/commands/bmad-track-extended.md +19 -0
- package/src/.claude/commands/bmad-track-large.md +19 -0
- package/src/.claude/commands/bmad-track-medium.md +19 -0
- package/src/.claude/commands/bmad-track-nano.md +19 -0
- package/src/.claude/commands/bmad-track-rv.md +18 -0
- package/src/.claude/commands/bmad-track-small.md +19 -0
- package/src/_memory/config.yaml +11 -0
- package/src/_memory/master-orchestrator-sidecar/docs-index.md +3 -0
- package/src/_memory/master-orchestrator-sidecar/instructions.md +2566 -0
- package/src/_memory/master-orchestrator-sidecar/memories.md +8 -0
- package/src/_memory/master-orchestrator-sidecar/session-state.md +15 -0
- package/src/_memory/master-orchestrator-sidecar/triage-history.md +3 -0
- package/src/_memory/master-orchestrator-sidecar/workflows-overview.html +1230 -0
- package/src/_memory/skills/excalidraw/SKILL.md +78 -0
- package/src/_memory/skills/excalidraw/diagram-patterns.md +53 -0
- package/src/_memory/skills/nimbalyst-tracking/SKILL.md +103 -0
- package/src/_memory/skills/writing-skills/SKILL.md +655 -0
- package/src/bmb/agents/agent-builder.md +59 -0
- package/src/bmb/agents/module-builder.md +60 -0
- package/src/bmb/agents/workflow-builder.md +61 -0
- package/src/bmb/config.yaml +12 -0
- package/src/bmb/module-help.csv +13 -0
- package/src/bmb/workflows/agent/data/agent-architecture.md +258 -0
- package/src/bmb/workflows/agent/data/agent-compilation.md +185 -0
- package/src/bmb/workflows/agent/data/agent-menu-patterns.md +189 -0
- package/src/bmb/workflows/agent/data/agent-metadata.md +133 -0
- package/src/bmb/workflows/agent/data/agent-validation.md +111 -0
- package/src/bmb/workflows/agent/data/brainstorm-context.md +96 -0
- package/src/bmb/workflows/agent/data/communication-presets.csv +61 -0
- package/src/bmb/workflows/agent/data/critical-actions.md +75 -0
- package/src/bmb/workflows/agent/data/persona-properties.md +252 -0
- package/src/bmb/workflows/agent/data/principles-crafting.md +142 -0
- package/src/bmb/workflows/agent/data/reference/module-examples/architect.md +68 -0
- package/src/bmb/workflows/agent/data/reference/with-sidecar/journal-keeper/journal-keeper-sidecar/entries/yy-mm-dd-entry-template.md +17 -0
- package/src/bmb/workflows/agent/data/understanding-agent-types.md +126 -0
- package/src/bmb/workflows/agent/steps-c/step-01-brainstorm.md +129 -0
- package/src/bmb/workflows/agent/steps-c/step-02-discovery.md +170 -0
- package/src/bmb/workflows/agent/steps-c/step-03-sidecar-metadata.md +309 -0
- package/src/bmb/workflows/agent/steps-c/step-04-persona.md +213 -0
- package/src/bmb/workflows/agent/steps-c/step-05-commands-menu.md +179 -0
- package/src/bmb/workflows/agent/steps-c/step-06-activation.md +278 -0
- package/src/bmb/workflows/agent/steps-c/step-07-build-agent.md +316 -0
- package/src/bmb/workflows/agent/steps-c/step-08-celebrate.md +247 -0
- package/src/bmb/workflows/agent/steps-e/e-01-load-existing.md +221 -0
- package/src/bmb/workflows/agent/steps-e/e-02-discover-edits.md +195 -0
- package/src/bmb/workflows/agent/steps-e/e-03-placeholder.md +1 -0
- package/src/bmb/workflows/agent/steps-e/e-04-sidecar-metadata.md +126 -0
- package/src/bmb/workflows/agent/steps-e/e-05-persona.md +135 -0
- package/src/bmb/workflows/agent/steps-e/e-06-commands-menu.md +123 -0
- package/src/bmb/workflows/agent/steps-e/e-07-activation.md +124 -0
- package/src/bmb/workflows/agent/steps-e/e-08-edit-agent.md +197 -0
- package/src/bmb/workflows/agent/steps-e/e-09-celebrate.md +155 -0
- package/src/bmb/workflows/agent/steps-v/v-01-load-review.md +137 -0
- package/src/bmb/workflows/agent/steps-v/v-02a-validate-metadata.md +116 -0
- package/src/bmb/workflows/agent/steps-v/v-02b-validate-persona.md +124 -0
- package/src/bmb/workflows/agent/steps-v/v-02c-validate-menu.md +127 -0
- package/src/bmb/workflows/agent/steps-v/v-02d-validate-structure.md +134 -0
- package/src/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md +134 -0
- package/src/bmb/workflows/agent/steps-v/v-03-summary.md +104 -0
- package/src/bmb/workflows/agent/templates/agent-plan.template.md +5 -0
- package/src/bmb/workflows/agent/templates/agent-template.md +89 -0
- package/src/bmb/workflows/agent/workflow-create-agent.md +72 -0
- package/src/bmb/workflows/agent/workflow-edit-agent.md +75 -0
- package/src/bmb/workflows/agent/workflow-validate-agent.md +73 -0
- package/src/bmb/workflows/module/data/agent-architecture.md +179 -0
- package/src/bmb/workflows/module/data/agent-spec-template.md +79 -0
- package/src/bmb/workflows/module/data/module-standards.md +263 -0
- package/src/bmb/workflows/module/data/module-yaml-conventions.md +392 -0
- package/src/bmb/workflows/module/module-help-generate.md +254 -0
- package/src/bmb/workflows/module/steps-b/step-01-welcome.md +148 -0
- package/src/bmb/workflows/module/steps-b/step-02-spark.md +141 -0
- package/src/bmb/workflows/module/steps-b/step-03-module-type.md +149 -0
- package/src/bmb/workflows/module/steps-b/step-04-vision.md +83 -0
- package/src/bmb/workflows/module/steps-b/step-05-identity.md +97 -0
- package/src/bmb/workflows/module/steps-b/step-06-users.md +86 -0
- package/src/bmb/workflows/module/steps-b/step-07-value.md +76 -0
- package/src/bmb/workflows/module/steps-b/step-08-agents.md +97 -0
- package/src/bmb/workflows/module/steps-b/step-09-workflows.md +83 -0
- package/src/bmb/workflows/module/steps-b/step-10-tools.md +91 -0
- package/src/bmb/workflows/module/steps-b/step-11-scenarios.md +84 -0
- package/src/bmb/workflows/module/steps-b/step-12-creative.md +95 -0
- package/src/bmb/workflows/module/steps-b/step-13-review.md +105 -0
- package/src/bmb/workflows/module/steps-b/step-14-finalize.md +117 -0
- package/src/bmb/workflows/module/steps-c/step-01-load-brief.md +179 -0
- package/src/bmb/workflows/module/steps-c/step-01b-continue.md +82 -0
- package/src/bmb/workflows/module/steps-c/step-02-structure.md +105 -0
- package/src/bmb/workflows/module/steps-c/step-03-config.md +119 -0
- package/src/bmb/workflows/module/steps-c/step-04-agents.md +168 -0
- package/src/bmb/workflows/module/steps-c/step-05-workflows.md +184 -0
- package/src/bmb/workflows/module/steps-c/step-06-docs.md +401 -0
- package/src/bmb/workflows/module/steps-c/step-07-complete.md +152 -0
- package/src/bmb/workflows/module/steps-e/step-01-load-target.md +81 -0
- package/src/bmb/workflows/module/steps-e/step-02-select-edit.md +77 -0
- package/src/bmb/workflows/module/steps-e/step-03-apply-edit.md +77 -0
- package/src/bmb/workflows/module/steps-e/step-04-review.md +80 -0
- package/src/bmb/workflows/module/steps-e/step-05-confirm.md +75 -0
- package/src/bmb/workflows/module/steps-v/step-01-load-target.md +96 -0
- package/src/bmb/workflows/module/steps-v/step-02-file-structure.md +93 -0
- package/src/bmb/workflows/module/steps-v/step-03-module-yaml.md +99 -0
- package/src/bmb/workflows/module/steps-v/step-04-agent-specs.md +152 -0
- package/src/bmb/workflows/module/steps-v/step-05-workflow-specs.md +152 -0
- package/src/bmb/workflows/module/steps-v/step-06-documentation.md +143 -0
- package/src/bmb/workflows/module/steps-v/step-07-installation.md +102 -0
- package/src/bmb/workflows/module/steps-v/step-08-report.md +197 -0
- package/src/bmb/workflows/module/templates/brief-template.md +154 -0
- package/src/bmb/workflows/module/templates/workflow-spec-template.md +96 -0
- package/src/bmb/workflows/module/workflow-create-module-brief.md +71 -0
- package/src/bmb/workflows/module/workflow-create-module.md +86 -0
- package/src/bmb/workflows/module/workflow-edit-module.md +66 -0
- package/src/bmb/workflows/module/workflow-validate-module.md +66 -0
- package/src/bmb/workflows/workflow/data/architecture.md +150 -0
- package/src/bmb/workflows/workflow/data/common-workflow-tools.csv +19 -0
- package/src/bmb/workflows/workflow/data/csv-data-file-standards.md +53 -0
- package/src/bmb/workflows/workflow/data/frontmatter-standards.md +184 -0
- package/src/bmb/workflows/workflow/data/input-discovery-standards.md +191 -0
- package/src/bmb/workflows/workflow/data/intent-vs-prescriptive-spectrum.md +44 -0
- package/src/bmb/workflows/workflow/data/menu-handling-standards.md +133 -0
- package/src/bmb/workflows/workflow/data/output-format-standards.md +135 -0
- package/src/bmb/workflows/workflow/data/step-file-rules.md +235 -0
- package/src/bmb/workflows/workflow/data/step-type-patterns.md +257 -0
- package/src/bmb/workflows/workflow/data/subprocess-optimization-patterns.md +188 -0
- package/src/bmb/workflows/workflow/data/trimodal-workflow-structure.md +164 -0
- package/src/bmb/workflows/workflow/data/workflow-chaining-standards.md +222 -0
- package/src/bmb/workflows/workflow/data/workflow-examples.md +232 -0
- package/src/bmb/workflows/workflow/data/workflow-type-criteria.md +134 -0
- package/src/bmb/workflows/workflow/steps-c/step-00-conversion.md +263 -0
- package/src/bmb/workflows/workflow/steps-c/step-01-discovery.md +194 -0
- package/src/bmb/workflows/workflow/steps-c/step-01b-continuation.md +3 -0
- package/src/bmb/workflows/workflow/steps-c/step-02-classification.md +270 -0
- package/src/bmb/workflows/workflow/steps-c/step-03-requirements.md +283 -0
- package/src/bmb/workflows/workflow/steps-c/step-04-tools.md +282 -0
- package/src/bmb/workflows/workflow/steps-c/step-05-plan-review.md +243 -0
- package/src/bmb/workflows/workflow/steps-c/step-06-design.md +330 -0
- package/src/bmb/workflows/workflow/steps-c/step-07-foundation.md +239 -0
- package/src/bmb/workflows/workflow/steps-c/step-08-build-step-01.md +379 -0
- package/src/bmb/workflows/workflow/steps-c/step-09-build-next-step.md +350 -0
- package/src/bmb/workflows/workflow/steps-c/step-10-confirmation.md +322 -0
- package/src/bmb/workflows/workflow/steps-c/step-11-completion.md +191 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-01-assess-workflow.md +237 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-02-discover-edits.md +251 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-03-fix-validation.md +254 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-04-direct-edit.md +277 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-05-apply-edit.md +154 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-06-validate-after.md +190 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-07-complete.md +206 -0
- package/src/bmb/workflows/workflow/steps-v/step-01-validate-max-mode.md +109 -0
- package/src/bmb/workflows/workflow/steps-v/step-01-validate.md +221 -0
- package/src/bmb/workflows/workflow/steps-v/step-01b-structure.md +152 -0
- package/src/bmb/workflows/workflow/steps-v/step-02-frontmatter-validation.md +199 -0
- package/src/bmb/workflows/workflow/steps-v/step-02b-path-violations.md +265 -0
- package/src/bmb/workflows/workflow/steps-v/step-03-menu-validation.md +164 -0
- package/src/bmb/workflows/workflow/steps-v/step-04-step-type-validation.md +211 -0
- package/src/bmb/workflows/workflow/steps-v/step-05-output-format-validation.md +200 -0
- package/src/bmb/workflows/workflow/steps-v/step-06-validation-design-check.md +195 -0
- package/src/bmb/workflows/workflow/steps-v/step-07-instruction-style-check.md +209 -0
- package/src/bmb/workflows/workflow/steps-v/step-08-collaborative-experience-check.md +199 -0
- package/src/bmb/workflows/workflow/steps-v/step-08b-subprocess-optimization.md +179 -0
- package/src/bmb/workflows/workflow/steps-v/step-09-cohesive-review.md +186 -0
- package/src/bmb/workflows/workflow/steps-v/step-10-report-complete.md +154 -0
- package/src/bmb/workflows/workflow/steps-v/step-11-plan-validation.md +237 -0
- package/src/bmb/workflows/workflow/templates/minimal-output-template.md +11 -0
- package/src/bmb/workflows/workflow/templates/step-01-init-continuable-template.md +241 -0
- package/src/bmb/workflows/workflow/templates/step-1b-template.md +224 -0
- package/src/bmb/workflows/workflow/templates/step-template.md +294 -0
- package/src/bmb/workflows/workflow/templates/workflow-template.md +102 -0
- package/src/bmb/workflows/workflow/workflow-create-workflow.md +79 -0
- package/src/bmb/workflows/workflow/workflow-edit-workflow.md +65 -0
- package/src/bmb/workflows/workflow/workflow-rework-workflow.md +65 -0
- package/src/bmb/workflows/workflow/workflow-validate-max-parallel-workflow.md +66 -0
- package/src/bmb/workflows/workflow/workflow-validate-workflow.md +65 -0
- package/src/bmm/agents/analyst.md +104 -0
- package/src/bmm/agents/architect.md +85 -0
- package/src/bmm/agents/dev.md +100 -0
- package/src/bmm/agents/pm.md +98 -0
- package/src/bmm/agents/qa.md +90 -0
- package/src/bmm/agents/quick-flow-solo-dev.md +92 -0
- package/src/bmm/agents/review-agent.md +129 -0
- package/src/bmm/agents/sm.md +90 -0
- package/src/bmm/agents/tech-writer/tech-writer.md +94 -0
- package/src/bmm/agents/ux-designer.md +124 -0
- package/src/bmm/data/project-context-template.md +26 -0
- package/src/bmm/module-help.csv +31 -0
- package/src/bmm/teams/default-party.csv +20 -0
- package/src/bmm/teams/team-fullstack.yaml +12 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +115 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +107 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +141 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +144 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +147 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +161 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +99 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +57 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +87 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +156 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +165 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +140 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +152 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +345 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +92 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +164 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +174 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +184 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +105 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +360 -0
- package/src/bmm/workflows/1-analysis/research/research.template.md +29 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +87 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +165 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +174 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +141 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +159 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +387 -0
- package/src/bmm/workflows/1-analysis/research/workflow-domain-research.md +54 -0
- package/src/bmm/workflows/1-analysis/research/workflow-market-research.md +54 -0
- package/src/bmm/workflows/1-analysis/research/workflow-technical-research.md +54 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +15 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +11 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01-init.md +139 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +100 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +160 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +88 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +99 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +169 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +156 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +136 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +176 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +184 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +174 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +175 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +189 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +162 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +79 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +183 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +149 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +187 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +192 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +108 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +166 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +131 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +150 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +118 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +155 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +170 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +158 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +147 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +182 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +202 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +148 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +201 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +179 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +164 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/templates/prd-template.md +10 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md +65 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md +65 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +63 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +63 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +63 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +106 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +111 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +115 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +127 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +167 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +143 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +118 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +154 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +136 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +165 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +135 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +192 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +101 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +45 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +185 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +129 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +130 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +93 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +196 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +129 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +54 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +13 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +89 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +82 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +106 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +138 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +129 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +166 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +186 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +163 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +38 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +49 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +129 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +124 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +122 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +84 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -0
- package/src/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
- package/src/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
- package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +43 -0
- package/src/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
- package/src/bmm/workflows/4-implementation/correct-course/instructions.md +207 -0
- package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +53 -0
- package/src/bmm/workflows/4-implementation/create-story/checklist.md +159 -0
- package/src/bmm/workflows/4-implementation/create-story/instructions.xml +574 -0
- package/src/bmm/workflows/4-implementation/create-story/template.md +79 -0
- package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +52 -0
- package/src/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
- package/src/bmm/workflows/4-implementation/dev-story/instructions.xml +493 -0
- package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +20 -0
- package/src/bmm/workflows/4-implementation/retrospective/instructions.md +1444 -0
- package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +52 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/instructions.md +232 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +52 -0
- package/src/bmm/workflows/4-implementation/sprint-status/instructions.md +230 -0
- package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +25 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +158 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +122 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +93 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +93 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +87 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +146 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +204 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +152 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +123 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +201 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -0
- package/src/bmm/workflows/document-project/checklist.md +245 -0
- package/src/bmm/workflows/document-project/documentation-requirements.csv +12 -0
- package/src/bmm/workflows/document-project/instructions.md +130 -0
- package/src/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
- package/src/bmm/workflows/document-project/templates/index-template.md +169 -0
- package/src/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
- package/src/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
- package/src/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
- package/src/bmm/workflows/document-project/workflow.yaml +22 -0
- package/src/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
- package/src/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
- package/src/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
- package/src/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
- package/src/bmm/workflows/generate-project-context/project-context-template.md +21 -0
- package/src/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -0
- package/src/bmm/workflows/generate-project-context/steps/step-02-generate.md +322 -0
- package/src/bmm/workflows/generate-project-context/steps/step-03-complete.md +235 -0
- package/src/bmm/workflows/generate-project-context/workflow.md +49 -0
- package/src/bmm/workflows/qa/automate/workflow.yaml +233 -0
- package/src/bmm/workflows/qa-generate-e2e-tests/checklist.md +33 -0
- package/src/bmm/workflows/qa-generate-e2e-tests/instructions.md +110 -0
- package/src/bmm/workflows/qa-generate-e2e-tests/workflow.yaml +42 -0
- package/src/core/agents/bmad-master.md +56 -0
- package/src/core/agents/master-orchestrator.md +54 -0
- package/src/core/config.yaml +9 -0
- package/src/core/module-help.csv +10 -0
- package/src/core/scripts/generate-loop-report.py +72 -0
- package/src/core/skills/prepare-to-merge/SKILL.md +77 -0
- package/src/core/tasks/editorial-review-prose.xml +102 -0
- package/src/core/tasks/editorial-review-structure.xml +208 -0
- package/src/core/tasks/help.md +86 -0
- package/src/core/tasks/index-docs.xml +65 -0
- package/src/core/tasks/review-adversarial-general.xml +66 -0
- package/src/core/tasks/review-adversarial-loop.xml +46 -0
- package/src/core/tasks/review-edge-case-hunter.xml +63 -0
- package/src/core/tasks/review-party-loop.xml +46 -0
- package/src/core/tasks/shard-doc.xml +108 -0
- package/src/core/tasks/workflow.xml +236 -0
- package/src/core/templates/review-loop-report.html +88 -0
- package/src/core/templates/review-loop-report.md +5 -0
- package/src/core/workflows/advanced-elicitation/methods.csv +51 -0
- package/src/core/workflows/advanced-elicitation/workflow.xml +118 -0
- package/src/core/workflows/brainstorming/brain-methods.csv +62 -0
- package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +212 -0
- package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
- package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
- package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
- package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
- package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
- package/src/core/workflows/brainstorming/steps/step-02e-deep-dive.md +68 -0
- package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +403 -0
- package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
- package/src/core/workflows/brainstorming/template.md +15 -0
- package/src/core/workflows/brainstorming/workflow.md +60 -0
- package/src/core/workflows/extract-trackers/workflow.md +45 -0
- package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +142 -0
- package/src/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
- package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +168 -0
- package/src/core/workflows/party-mode/workflow.md +194 -0
- package/src/docs/dev/tmux/actions_popup.py +291 -0
- package/src/docs/dev/tmux/actions_popup.sh +110 -0
- package/src/docs/dev/tmux/claude_usage.sh +15 -0
- package/src/docs/dev/tmux/colors.conf +34 -0
- package/src/docs/dev/tmux/cpu_usage.sh +7 -0
- package/src/docs/dev/tmux/dispatch.sh +10 -0
- package/src/docs/dev/tmux/float_init.sh +13 -0
- package/src/docs/dev/tmux/float_term.sh +23 -0
- package/src/docs/dev/tmux/open_clip.sh +14 -0
- package/src/docs/dev/tmux/paste_clipboard.sh +13 -0
- package/src/docs/dev/tmux/paste_image_wrapper.sh +83 -0
- package/src/docs/dev/tmux/ram_usage.sh +3 -0
- package/src/docs/dev/tmux/title_sync.sh +54 -0
- package/src/docs/dev/tmux/tmux-setup.md +806 -0
- package/src/docs/dev/tmux/tmux.conf +127 -0
- package/src/docs/dev/tmux/xclip +18 -0
|
@@ -0,0 +1,755 @@
|
|
|
1
|
+
# StoreKit 2 Advanced Reference
|
|
2
|
+
|
|
3
|
+
Covers subscription control styles, offer management, testing, server-side
|
|
4
|
+
validation, and advanced subscription handling patterns for StoreKit 2.
|
|
5
|
+
|
|
6
|
+
## Contents
|
|
7
|
+
|
|
8
|
+
- [SubscriptionStoreView Control Styles](#subscriptionstoreview-control-styles)
|
|
9
|
+
- [Subscription Group Management](#subscription-group-management)
|
|
10
|
+
- [Introductory Offers](#introductory-offers)
|
|
11
|
+
- [Promotional Offers](#promotional-offers)
|
|
12
|
+
- [Win-Back Offers](#win-back-offers)
|
|
13
|
+
- [Offer Codes](#offer-codes)
|
|
14
|
+
- [Server-Side Validation](#server-side-validation)
|
|
15
|
+
- [StoreKit Testing in Xcode](#storekit-testing-in-xcode)
|
|
16
|
+
- [Subscription Renewal States](#subscription-renewal-states)
|
|
17
|
+
- [Grace Period and Billing Retry](#grace-period-and-billing-retry)
|
|
18
|
+
- [Refund Handling](#refund-handling)
|
|
19
|
+
- [Family Sharing](#family-sharing)
|
|
20
|
+
- [Ask to Buy Handling](#ask-to-buy-handling)
|
|
21
|
+
- [.currentEntitlementTask SwiftUI Modifier](#currententitlementtask-swiftui-modifier)
|
|
22
|
+
- [Subscription Status Listener](#subscription-status-listener)
|
|
23
|
+
- [Product Promotion Management](#product-promotion-management)
|
|
24
|
+
- [Price Increase Handling](#price-increase-handling)
|
|
25
|
+
- [Unfinished Transactions](#unfinished-transactions)
|
|
26
|
+
- [Common Advanced Mistakes](#common-advanced-mistakes)
|
|
27
|
+
|
|
28
|
+
## SubscriptionStoreView Control Styles
|
|
29
|
+
|
|
30
|
+
Apply control styles to change how subscription options render in
|
|
31
|
+
`SubscriptionStoreView`.
|
|
32
|
+
|
|
33
|
+
```swift
|
|
34
|
+
// Individual buttons for each subscription option
|
|
35
|
+
.subscriptionStoreControlStyle(.buttons)
|
|
36
|
+
|
|
37
|
+
// Inline picker for compact selection
|
|
38
|
+
.subscriptionStoreControlStyle(.picker)
|
|
39
|
+
|
|
40
|
+
// Picker with the selected option visually emphasized
|
|
41
|
+
.subscriptionStoreControlStyle(.prominentPicker)
|
|
42
|
+
|
|
43
|
+
// Full-page swipeable picker (one option per page)
|
|
44
|
+
.subscriptionStoreControlStyle(.pagedPicker)
|
|
45
|
+
|
|
46
|
+
// Paged picker with prominent selected option
|
|
47
|
+
.subscriptionStoreControlStyle(.pagedProminentPicker)
|
|
48
|
+
|
|
49
|
+
// Minimal inline picker for tight layouts
|
|
50
|
+
.subscriptionStoreControlStyle(.compactPicker)
|
|
51
|
+
|
|
52
|
+
// System decides based on context
|
|
53
|
+
.subscriptionStoreControlStyle(.automatic)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Control Placement
|
|
57
|
+
|
|
58
|
+
Specify where controls appear within the view:
|
|
59
|
+
|
|
60
|
+
```swift
|
|
61
|
+
.subscriptionStoreControlStyle(.picker, placement: .bottom)
|
|
62
|
+
// Placement options: .bottom, .leading, .trailing, .scrollView,
|
|
63
|
+
// .bottomBar, .buttonsInBottomBar
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Button Labels
|
|
67
|
+
|
|
68
|
+
Control what information subscription buttons display:
|
|
69
|
+
|
|
70
|
+
```swift
|
|
71
|
+
.subscriptionStoreButtonLabel(.multiline) // Full details (name, price, period)
|
|
72
|
+
.subscriptionStoreButtonLabel(.price) // Price only
|
|
73
|
+
.subscriptionStoreButtonLabel(.displayName) // Product name only
|
|
74
|
+
.subscriptionStoreButtonLabel(.action) // Action text ("Subscribe")
|
|
75
|
+
.subscriptionStoreButtonLabel(.singleLine) // Condensed single line
|
|
76
|
+
.subscriptionStoreButtonLabel(.automatic) // System default
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Container Backgrounds
|
|
80
|
+
|
|
81
|
+
```swift
|
|
82
|
+
.containerBackground(.blue.gradient, for: .subscriptionStore)
|
|
83
|
+
|
|
84
|
+
.containerBackground(for: .subscriptionStoreHeader) {
|
|
85
|
+
Image("premium-header").resizable().scaledToFill()
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.containerBackground(for: .subscriptionStoreFullHeight) {
|
|
89
|
+
LinearGradient(colors: [.blue, .purple], startPoint: .top, endPoint: .bottom)
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Subscription Store Buttons
|
|
94
|
+
|
|
95
|
+
```swift
|
|
96
|
+
.storeButton(.visible, for: .restorePurchases)
|
|
97
|
+
.storeButton(.visible, for: .redeemCode)
|
|
98
|
+
.storeButton(.visible, for: .cancellation)
|
|
99
|
+
.storeButton(.visible, for: .policies)
|
|
100
|
+
.storeButton(.hidden, for: .signIn)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Policy Destinations
|
|
104
|
+
|
|
105
|
+
```swift
|
|
106
|
+
// URL-based
|
|
107
|
+
.subscriptionStorePolicyDestination(url: termsURL, for: .termsOfService)
|
|
108
|
+
.subscriptionStorePolicyDestination(url: privacyURL, for: .privacyPolicy)
|
|
109
|
+
|
|
110
|
+
// Custom view
|
|
111
|
+
.subscriptionStorePolicyDestination(for: .termsOfService) {
|
|
112
|
+
TermsOfServiceView()
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Style policy link text
|
|
116
|
+
.subscriptionStorePolicyForegroundStyle(.white)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Decorative Icons per Option
|
|
120
|
+
|
|
121
|
+
```swift
|
|
122
|
+
.subscriptionStoreControlIcon { product, subscriptionInfo in
|
|
123
|
+
if subscriptionInfo.subscriptionPeriod.unit == .year {
|
|
124
|
+
Image(systemName: "star.fill")
|
|
125
|
+
} else {
|
|
126
|
+
Image(systemName: "star")
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Sign-In Action
|
|
132
|
+
|
|
133
|
+
```swift
|
|
134
|
+
.storeButton(.visible, for: .signIn)
|
|
135
|
+
.subscriptionStoreSignInAction {
|
|
136
|
+
showSignInSheet = true
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Subscription Group Management
|
|
141
|
+
|
|
142
|
+
### Hierarchical Layouts with SubscriptionOptionGroup
|
|
143
|
+
|
|
144
|
+
```swift
|
|
145
|
+
SubscriptionStoreView(groupID: "premium_group") {
|
|
146
|
+
SubscriptionOptionGroup("Monthly Plans") { product in
|
|
147
|
+
product.subscription?.subscriptionPeriod.unit == .month
|
|
148
|
+
}
|
|
149
|
+
SubscriptionOptionGroup("Annual Plans") { product in
|
|
150
|
+
product.subscription?.subscriptionPeriod.unit == .year
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Automatic Period Grouping
|
|
156
|
+
|
|
157
|
+
```swift
|
|
158
|
+
SubscriptionStoreView(groupID: "premium_group") {
|
|
159
|
+
SubscriptionPeriodGroupSet()
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Sections with Headers
|
|
164
|
+
|
|
165
|
+
```swift
|
|
166
|
+
SubscriptionStoreView(groupID: "premium_group") {
|
|
167
|
+
SubscriptionOptionSection("Standard", isIncluded: { product in
|
|
168
|
+
product.subscription?.groupLevel == 1
|
|
169
|
+
}) {
|
|
170
|
+
Text("Basic features included")
|
|
171
|
+
}
|
|
172
|
+
SubscriptionOptionSection("Pro", isIncluded: { product in
|
|
173
|
+
product.subscription?.groupLevel == 2
|
|
174
|
+
}) {
|
|
175
|
+
Text("All features included")
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Visible Relationships
|
|
181
|
+
|
|
182
|
+
Filter which subscription levels are shown relative to the current subscription:
|
|
183
|
+
|
|
184
|
+
```swift
|
|
185
|
+
// Show all options
|
|
186
|
+
SubscriptionStoreView(groupID: "group_id", visibleRelationships: .all)
|
|
187
|
+
|
|
188
|
+
// Show only upgrades from current subscription
|
|
189
|
+
SubscriptionStoreView(groupID: "group_id", visibleRelationships: .upgrade)
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Custom Subscription Store Controls
|
|
193
|
+
|
|
194
|
+
```swift
|
|
195
|
+
// Custom button for a specific subscription option
|
|
196
|
+
SubscriptionStoreButton(option)
|
|
197
|
+
|
|
198
|
+
// Custom picker with confirmation
|
|
199
|
+
SubscriptionStorePicker(pickerContent: { option in
|
|
200
|
+
Text(option.displayName)
|
|
201
|
+
}, confirmation: { selectedOption in
|
|
202
|
+
Text("Subscribe to \(selectedOption.displayName)")
|
|
203
|
+
})
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Introductory Offers
|
|
207
|
+
|
|
208
|
+
### Checking Eligibility
|
|
209
|
+
|
|
210
|
+
```swift
|
|
211
|
+
// Per-product eligibility
|
|
212
|
+
let isEligible = product.subscription?.isEligibleForIntroOffer ?? false
|
|
213
|
+
|
|
214
|
+
// Per-group eligibility
|
|
215
|
+
let groupEligible = await Product.SubscriptionInfo.isEligibleForIntroOffer(
|
|
216
|
+
for: groupID
|
|
217
|
+
)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Accessing Offer Details
|
|
221
|
+
|
|
222
|
+
```swift
|
|
223
|
+
if let introOffer = product.subscription?.introductoryOffer {
|
|
224
|
+
let price = introOffer.displayPrice // Localized price
|
|
225
|
+
let period = introOffer.period // SubscriptionPeriod
|
|
226
|
+
let count = introOffer.periodCount // Number of periods
|
|
227
|
+
let mode = introOffer.paymentMode // .freeTrial, .payAsYouGo, .payUpFront
|
|
228
|
+
|
|
229
|
+
switch introOffer.paymentMode {
|
|
230
|
+
case .freeTrial:
|
|
231
|
+
Text("Free for \(count) \(period.unit)")
|
|
232
|
+
case .payAsYouGo:
|
|
233
|
+
Text("\(price)/\(period.unit) for \(count) periods")
|
|
234
|
+
case .payUpFront:
|
|
235
|
+
Text("\(price) for \(count) \(period.unit)")
|
|
236
|
+
default:
|
|
237
|
+
EmptyView()
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Introductory offers apply automatically when eligible. No special purchase options needed.
|
|
243
|
+
|
|
244
|
+
## Promotional Offers
|
|
245
|
+
|
|
246
|
+
Promotional offers require server-side signature generation.
|
|
247
|
+
|
|
248
|
+
### Accessing Promotional Offers
|
|
249
|
+
|
|
250
|
+
```swift
|
|
251
|
+
let promoOffers = product.subscription?.promotionalOffers ?? []
|
|
252
|
+
for offer in promoOffers {
|
|
253
|
+
print("Offer: \(offer.id ?? "nil"), price: \(offer.displayPrice)")
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Purchasing with a Promotional Offer
|
|
258
|
+
|
|
259
|
+
```swift
|
|
260
|
+
// 1. Get signature from your server
|
|
261
|
+
let signature = Product.SubscriptionOffer.Signature(
|
|
262
|
+
keyID: serverKeyID,
|
|
263
|
+
nonce: serverNonce,
|
|
264
|
+
timestamp: serverTimestamp,
|
|
265
|
+
signature: serverSignatureData
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
// 2. Purchase with the offer
|
|
269
|
+
guard let offerID = offer.id else { throw StoreError.invalidOffer }
|
|
270
|
+
let result = try await product.purchase(options: [
|
|
271
|
+
.promotionalOffer(offerID: offerID, signature: signature)
|
|
272
|
+
])
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### SwiftUI Automatic Promotional Offer
|
|
276
|
+
|
|
277
|
+
```swift
|
|
278
|
+
.subscriptionPromotionalOffer(offer: promoOffer, signature: signature)
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Preferred Offer Selection
|
|
282
|
+
|
|
283
|
+
Let the system choose the best offer for each user:
|
|
284
|
+
|
|
285
|
+
```swift
|
|
286
|
+
.preferredSubscriptionOffer { product, subscription, eligibleOffers in
|
|
287
|
+
// Return the best offer, or nil for no offer
|
|
288
|
+
return eligibleOffers.first
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## Win-Back Offers
|
|
293
|
+
|
|
294
|
+
Target former subscribers who cancelled. Available since iOS 18.
|
|
295
|
+
|
|
296
|
+
### Accessing Win-Back Offers
|
|
297
|
+
|
|
298
|
+
```swift
|
|
299
|
+
let winBackOffers = product.subscription?.winBackOffers ?? []
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Checking Eligibility via Renewal Info
|
|
303
|
+
|
|
304
|
+
```swift
|
|
305
|
+
let statuses = try await Product.SubscriptionInfo.Status.status(for: groupID)
|
|
306
|
+
for status in statuses {
|
|
307
|
+
guard case .verified(let renewalInfo) = status.renewalInfo else { continue }
|
|
308
|
+
let eligibleIDs = renewalInfo.eligibleWinBackOfferIDs
|
|
309
|
+
// Display offers matching these IDs
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Purchasing with a Win-Back Offer
|
|
314
|
+
|
|
315
|
+
```swift
|
|
316
|
+
let result = try await product.purchase(options: [
|
|
317
|
+
.winBackOffer(winBackOffer)
|
|
318
|
+
])
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
## Offer Codes
|
|
322
|
+
|
|
323
|
+
### Redemption Sheet
|
|
324
|
+
|
|
325
|
+
```swift
|
|
326
|
+
@State private var showRedeemSheet = false
|
|
327
|
+
|
|
328
|
+
var body: some View {
|
|
329
|
+
Button("Redeem Code") { showRedeemSheet = true }
|
|
330
|
+
.offerCodeRedemption(isPresented: $showRedeemSheet) { result in
|
|
331
|
+
switch result {
|
|
332
|
+
case .success:
|
|
333
|
+
await storeManager.updateEntitlements()
|
|
334
|
+
case .failure(let error):
|
|
335
|
+
print("Redemption failed: \(error)")
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### Show Redeem Button on Subscription Store
|
|
342
|
+
|
|
343
|
+
```swift
|
|
344
|
+
.storeButton(.visible, for: .redeemCode)
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Verifying Applied Offers in Transactions
|
|
348
|
+
|
|
349
|
+
```swift
|
|
350
|
+
if let offerType = transaction.offerType {
|
|
351
|
+
switch offerType {
|
|
352
|
+
case .introductory: break // Introductory offer applied
|
|
353
|
+
case .promotional: break // Check transaction.offerID
|
|
354
|
+
case .code: break // Offer code redeemed
|
|
355
|
+
case .winBack: break // Win-back offer applied
|
|
356
|
+
default: break
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
## Server-Side Validation
|
|
362
|
+
|
|
363
|
+
### Sending JWS to Server
|
|
364
|
+
|
|
365
|
+
StoreKit 2 transactions are JWS (JSON Web Signature) tokens. Send the raw
|
|
366
|
+
JWS string to your server for validation.
|
|
367
|
+
|
|
368
|
+
```swift
|
|
369
|
+
case .success(let verification):
|
|
370
|
+
let transaction = try checkVerified(verification)
|
|
371
|
+
|
|
372
|
+
// Send to server for validation
|
|
373
|
+
let jwsString = verification.jwsRepresentation
|
|
374
|
+
try await sendToServer(jws: jwsString, productID: transaction.productID)
|
|
375
|
+
|
|
376
|
+
await transaction.finish()
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
### Server-Side Verification
|
|
380
|
+
|
|
381
|
+
On your server, use Apple's App Store Server Library:
|
|
382
|
+
- `verifyAndDecodeTransaction(signedTransaction:)` to validate and decode
|
|
383
|
+
- `verifyAndDecodeRenewalInfo(signedRenewalInfo:)` for subscription renewal info
|
|
384
|
+
- The JWS format matches `JWSTransaction` from the App Store Server API and
|
|
385
|
+
App Store Server Notifications V2
|
|
386
|
+
|
|
387
|
+
### Device Verification
|
|
388
|
+
|
|
389
|
+
Bind transactions to specific devices to prevent replay attacks:
|
|
390
|
+
|
|
391
|
+
```swift
|
|
392
|
+
let deviceVerification = transaction.deviceVerification
|
|
393
|
+
let nonce = transaction.deviceVerificationNonce
|
|
394
|
+
// Send both to server for additional validation
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
## StoreKit Testing in Xcode
|
|
398
|
+
|
|
399
|
+
### StoreKit Configuration Files
|
|
400
|
+
|
|
401
|
+
1. Create a StoreKit Configuration file in Xcode: File > New > File >
|
|
402
|
+
StoreKit Configuration File
|
|
403
|
+
2. Add products matching your App Store Connect configuration
|
|
404
|
+
3. Set the configuration in the scheme: Edit Scheme > Run > Options >
|
|
405
|
+
StoreKit Configuration
|
|
406
|
+
|
|
407
|
+
### Configuration File Contents
|
|
408
|
+
|
|
409
|
+
Define products with:
|
|
410
|
+
- Product ID, reference name, product type
|
|
411
|
+
- Price and locale
|
|
412
|
+
- Subscription group and level (for subscriptions)
|
|
413
|
+
- Introductory and promotional offers
|
|
414
|
+
- Family Sharing settings
|
|
415
|
+
|
|
416
|
+
### Testing Features
|
|
417
|
+
|
|
418
|
+
```swift
|
|
419
|
+
// Simulate Ask to Buy
|
|
420
|
+
try await product.purchase(options: [.simulatesAskToBuyInSandbox(true)])
|
|
421
|
+
|
|
422
|
+
// Test-only: set purchase date and renewal behavior
|
|
423
|
+
try await product.purchase(options: [
|
|
424
|
+
.purchaseDate(Date(), renewalBehavior: .default)
|
|
425
|
+
])
|
|
426
|
+
|
|
427
|
+
// Test-only: apply offer code by reference name
|
|
428
|
+
try await product.purchase(options: [.codeOffer(referenceName: "SUMMER2024")])
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### StoreKit Testing Capabilities
|
|
432
|
+
|
|
433
|
+
- Simulate failed transactions, interrupted purchases, refunds
|
|
434
|
+
- Speed up subscription renewals (renewals happen in minutes, not months)
|
|
435
|
+
- Test grace period and billing retry states
|
|
436
|
+
- Clear purchase history between test runs
|
|
437
|
+
- Test offer redemption flows
|
|
438
|
+
- Simulate subscription expiration and cancellation
|
|
439
|
+
|
|
440
|
+
### Transaction Manager in Xcode
|
|
441
|
+
|
|
442
|
+
Use Debug > StoreKit > Manage Transactions to:
|
|
443
|
+
- View all test transactions
|
|
444
|
+
- Delete transactions to reset state
|
|
445
|
+
- Request refunds
|
|
446
|
+
- Expire subscriptions
|
|
447
|
+
- Approve or decline Ask to Buy requests
|
|
448
|
+
|
|
449
|
+
## Subscription Renewal States
|
|
450
|
+
|
|
451
|
+
### Active States (grant access)
|
|
452
|
+
|
|
453
|
+
```swift
|
|
454
|
+
switch status.state {
|
|
455
|
+
case .subscribed:
|
|
456
|
+
// Active, auto-renewing subscription
|
|
457
|
+
grantAccess()
|
|
458
|
+
|
|
459
|
+
case .inGracePeriod:
|
|
460
|
+
// Payment failed but grace period active -- still grant access
|
|
461
|
+
// Show a gentle prompt to update payment method
|
|
462
|
+
grantAccess()
|
|
463
|
+
showPaymentUpdatePrompt()
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### Degraded States (consider limited or no access)
|
|
467
|
+
|
|
468
|
+
```swift
|
|
469
|
+
case .inBillingRetryPeriod:
|
|
470
|
+
// Payment failed, Apple is retrying -- access decision is yours
|
|
471
|
+
// Apple recommends granting limited access to encourage payment update
|
|
472
|
+
grantLimitedAccess()
|
|
473
|
+
showPaymentFailedBanner()
|
|
474
|
+
|
|
475
|
+
case .expired:
|
|
476
|
+
// Subscription ended -- check expirationReason
|
|
477
|
+
revokeAccess()
|
|
478
|
+
if let reason = renewalInfo.expirationReason {
|
|
479
|
+
switch reason {
|
|
480
|
+
case .autoRenewDisabled: showResubscribeOffer()
|
|
481
|
+
case .billingError: showUpdatePaymentMethod()
|
|
482
|
+
case .didNotConsentToPriceIncrease: showPriceInfo()
|
|
483
|
+
case .productUnavailable: break
|
|
484
|
+
default: break
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
case .revoked:
|
|
489
|
+
// Apple refunded -- must revoke access
|
|
490
|
+
revokeAccess()
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### Expiration Reasons
|
|
494
|
+
|
|
495
|
+
| Reason | Meaning |
|
|
496
|
+
|---|---|
|
|
497
|
+
| `.autoRenewDisabled` | User voluntarily cancelled |
|
|
498
|
+
| `.billingError` | Payment method failed |
|
|
499
|
+
| `.didNotConsentToPriceIncrease` | User did not agree to price increase |
|
|
500
|
+
| `.productUnavailable` | Product no longer available |
|
|
501
|
+
| `.unknown` | Unspecified reason |
|
|
502
|
+
|
|
503
|
+
## Grace Period and Billing Retry
|
|
504
|
+
|
|
505
|
+
### Grace Period
|
|
506
|
+
|
|
507
|
+
When enabled in App Store Connect, subscribers retain access for a short
|
|
508
|
+
period after a billing failure. Check `status.state == .inGracePeriod` and
|
|
509
|
+
the `gracePeriodExpirationDate` on renewal info.
|
|
510
|
+
|
|
511
|
+
```swift
|
|
512
|
+
if status.state == .inGracePeriod,
|
|
513
|
+
case .verified(let renewalInfo) = status.renewalInfo {
|
|
514
|
+
let expirationDate = renewalInfo.gracePeriodExpirationDate
|
|
515
|
+
// Grant access but prompt to update payment method
|
|
516
|
+
}
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
### Billing Retry
|
|
520
|
+
|
|
521
|
+
Apple automatically retries failed payments. During billing retry, the
|
|
522
|
+
subscription state is `.inBillingRetryPeriod`. Check `renewalInfo.isInBillingRetry`.
|
|
523
|
+
|
|
524
|
+
## Refund Handling
|
|
525
|
+
|
|
526
|
+
### Initiating Refund Requests
|
|
527
|
+
|
|
528
|
+
```swift
|
|
529
|
+
// From a transaction instance
|
|
530
|
+
let refundStatus = try await transaction.beginRefundRequest(in: windowScene)
|
|
531
|
+
|
|
532
|
+
// From a transaction ID
|
|
533
|
+
let refundStatus = try await Transaction.beginRefundRequest(
|
|
534
|
+
for: transactionID, in: windowScene
|
|
535
|
+
)
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### SwiftUI Refund Sheet
|
|
539
|
+
|
|
540
|
+
```swift
|
|
541
|
+
@State private var showRefund = false
|
|
542
|
+
|
|
543
|
+
Button("Request Refund") { showRefund = true }
|
|
544
|
+
.refundRequestSheet(for: transactionID, isPresented: $showRefund) { result in
|
|
545
|
+
// Handle refund request dismissal
|
|
546
|
+
}
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
### Detecting Refunds
|
|
550
|
+
|
|
551
|
+
Refunds appear via `Transaction.updates` with a non-nil `revocationDate`.
|
|
552
|
+
Always check `revocationDate` when evaluating entitlements.
|
|
553
|
+
|
|
554
|
+
```swift
|
|
555
|
+
if let revocationDate = transaction.revocationDate {
|
|
556
|
+
revokeAccess(for: transaction.productID)
|
|
557
|
+
// revocationPercentage indicates partial vs full refund
|
|
558
|
+
let percentage = transaction.revocationPercentage
|
|
559
|
+
}
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
## Family Sharing
|
|
563
|
+
|
|
564
|
+
### Checking Ownership Type
|
|
565
|
+
|
|
566
|
+
```swift
|
|
567
|
+
switch transaction.ownershipType {
|
|
568
|
+
case .purchased:
|
|
569
|
+
// User purchased directly
|
|
570
|
+
break
|
|
571
|
+
case .familyShared:
|
|
572
|
+
// Shared via Family Sharing -- may be revoked if sharer leaves
|
|
573
|
+
break
|
|
574
|
+
default:
|
|
575
|
+
break
|
|
576
|
+
}
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
### Family Shareable Products
|
|
580
|
+
|
|
581
|
+
Check `product.isFamilyShareable` to determine if a product supports
|
|
582
|
+
Family Sharing. Enable Family Sharing in App Store Connect per product.
|
|
583
|
+
|
|
584
|
+
Family Sharing changes arrive via `Transaction.updates`. When a family
|
|
585
|
+
member stops sharing, the transaction is revoked.
|
|
586
|
+
|
|
587
|
+
## Ask to Buy Handling
|
|
588
|
+
|
|
589
|
+
Ask to Buy applies to child accounts in Family Sharing. The purchase
|
|
590
|
+
returns `.pending` and must be approved by the family organizer.
|
|
591
|
+
|
|
592
|
+
```swift
|
|
593
|
+
case .pending:
|
|
594
|
+
// Show UI indicating purchase needs parental approval
|
|
595
|
+
showPendingApprovalState()
|
|
596
|
+
// When approved, the transaction arrives via Transaction.updates
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
### Testing Ask to Buy
|
|
600
|
+
|
|
601
|
+
```swift
|
|
602
|
+
try await product.purchase(options: [.simulatesAskToBuyInSandbox(true)])
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
Then approve or decline in Xcode's Transaction Manager.
|
|
606
|
+
|
|
607
|
+
## .currentEntitlementTask SwiftUI Modifier
|
|
608
|
+
|
|
609
|
+
### Basic Usage
|
|
610
|
+
|
|
611
|
+
```swift
|
|
612
|
+
.currentEntitlementTask(for: "com.app.premium") { state in
|
|
613
|
+
self.entitlementState = state
|
|
614
|
+
}
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
### EntitlementTaskState Pattern
|
|
618
|
+
|
|
619
|
+
```swift
|
|
620
|
+
enum EntitlementTaskState<Value> {
|
|
621
|
+
case loading
|
|
622
|
+
case success(Value) // Value is VerificationResult<Transaction>?
|
|
623
|
+
case failure(any Error)
|
|
624
|
+
}
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
Use `map` and `flatMap` for transformations:
|
|
628
|
+
|
|
629
|
+
```swift
|
|
630
|
+
.currentEntitlementTask(for: ProductID.premium) { state in
|
|
631
|
+
self.isPremium = state.map { $0 != nil } ?? false
|
|
632
|
+
}
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
### Related Task Modifiers
|
|
636
|
+
|
|
637
|
+
```swift
|
|
638
|
+
// Load a single product
|
|
639
|
+
.storeProductTask(for: "com.app.premium") { taskState in
|
|
640
|
+
// taskState: Product.TaskState (.loading, .success(Product), .unavailable, .failure)
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
// Load multiple products
|
|
644
|
+
.storeProductsTask(for: ["id1", "id2"]) { taskState in
|
|
645
|
+
// taskState: Product.CollectionTaskState (.loading, .success([Product], unavailable:), .failure)
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
// Monitor subscription status
|
|
649
|
+
.subscriptionStatusTask(for: "group_id") { taskState in
|
|
650
|
+
// Receive subscription status updates
|
|
651
|
+
}
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
## Subscription Status Listener
|
|
655
|
+
|
|
656
|
+
Listen for real-time subscription status changes:
|
|
657
|
+
|
|
658
|
+
```swift
|
|
659
|
+
func listenForStatusChanges() -> Task<Void, Never> {
|
|
660
|
+
Task {
|
|
661
|
+
for await (groupID, statuses) in Product.SubscriptionInfo.Status.all {
|
|
662
|
+
for status in statuses {
|
|
663
|
+
guard case .verified(let renewalInfo) = status.renewalInfo else { continue }
|
|
664
|
+
await handleStatusChange(state: status.state, renewalInfo: renewalInfo)
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
## Product Promotion Management
|
|
672
|
+
|
|
673
|
+
Control the order and visibility of promoted in-app purchases on the App Store
|
|
674
|
+
product page:
|
|
675
|
+
|
|
676
|
+
```swift
|
|
677
|
+
// Product.PromotionInfo provides device-level promotion customization
|
|
678
|
+
// Configure in App Store Connect and override per-device as needed
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
## Price Increase Handling
|
|
682
|
+
|
|
683
|
+
```swift
|
|
684
|
+
if case .verified(let renewalInfo) = status.renewalInfo {
|
|
685
|
+
switch renewalInfo.priceIncreaseStatus {
|
|
686
|
+
case .noIncreasePending: break
|
|
687
|
+
case .pending:
|
|
688
|
+
// User has not yet consented -- show price increase info
|
|
689
|
+
showPriceIncreaseConsent(newPrice: renewalInfo.renewalPrice,
|
|
690
|
+
currency: renewalInfo.currency)
|
|
691
|
+
case .agreed:
|
|
692
|
+
// User accepted the price increase
|
|
693
|
+
break
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
```
|
|
697
|
+
|
|
698
|
+
## Unfinished Transactions
|
|
699
|
+
|
|
700
|
+
Process transactions that were not finished in previous sessions:
|
|
701
|
+
|
|
702
|
+
```swift
|
|
703
|
+
func processUnfinishedTransactions() async {
|
|
704
|
+
for await result in Transaction.unfinished {
|
|
705
|
+
guard case .verified(let transaction) = result else { continue }
|
|
706
|
+
await deliverContent(for: transaction)
|
|
707
|
+
await transaction.finish()
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
```
|
|
711
|
+
|
|
712
|
+
Call this at app launch alongside the `Transaction.updates` listener to
|
|
713
|
+
ensure no purchases are lost.
|
|
714
|
+
|
|
715
|
+
## Common Advanced Mistakes
|
|
716
|
+
|
|
717
|
+
### Not processing unfinished transactions at launch
|
|
718
|
+
|
|
719
|
+
```swift
|
|
720
|
+
// WRONG: Only listen for updates, ignore pending deliveries
|
|
721
|
+
init() { transactionListener = listenForTransactions() }
|
|
722
|
+
|
|
723
|
+
// CORRECT: Process unfinished transactions AND listen for updates
|
|
724
|
+
init() {
|
|
725
|
+
transactionListener = listenForTransactions()
|
|
726
|
+
Task { await processUnfinishedTransactions() }
|
|
727
|
+
}
|
|
728
|
+
```
|
|
729
|
+
|
|
730
|
+
### Treating billing retry as expired
|
|
731
|
+
|
|
732
|
+
```swift
|
|
733
|
+
// WRONG: Revoking access during billing retry
|
|
734
|
+
case .inBillingRetryPeriod: revokeAccess()
|
|
735
|
+
|
|
736
|
+
// CORRECT: Grant limited access and prompt payment update
|
|
737
|
+
case .inBillingRetryPeriod:
|
|
738
|
+
grantLimitedAccess()
|
|
739
|
+
showUpdatePaymentPrompt()
|
|
740
|
+
```
|
|
741
|
+
|
|
742
|
+
### Not handling Family Sharing revocation
|
|
743
|
+
|
|
744
|
+
```swift
|
|
745
|
+
// WRONG: Assuming family-shared access is permanent
|
|
746
|
+
if transaction.ownershipType == .familyShared {
|
|
747
|
+
grantPermanentAccess()
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
// CORRECT: Check revocation status and listen for changes
|
|
751
|
+
if transaction.ownershipType == .familyShared,
|
|
752
|
+
transaction.revocationDate == nil {
|
|
753
|
+
grantAccess() // May be revoked later via Transaction.updates
|
|
754
|
+
}
|
|
755
|
+
```
|