buildanything 1.7.1 → 2.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/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +9 -3
- package/CHANGELOG.md +112 -0
- package/README.md +2 -2
- package/agents/a11y-architect.md +166 -0
- package/agents/business-model.md +80 -29
- package/agents/code-architect.md +75 -0
- package/agents/code-reviewer.md +255 -0
- package/agents/code-simplifier.md +64 -0
- package/agents/design-brand-guardian.md +293 -53
- package/agents/design-critic.md +139 -0
- package/agents/design-inclusive-visuals-specialist.md +6 -19
- package/agents/design-ui-designer.md +335 -56
- package/agents/design-ux-architect.md +403 -55
- package/agents/design-ux-researcher.md +264 -49
- package/agents/engineering-ai-engineer.md +26 -36
- package/agents/engineering-backend-architect.md +185 -36
- package/agents/engineering-data-engineer.md +225 -43
- package/agents/engineering-devops-automator.md +227 -74
- package/agents/engineering-frontend-developer.md +210 -34
- package/agents/engineering-mobile-app-builder.md +6 -1
- package/agents/engineering-rapid-prototyper.md +30 -9
- package/agents/engineering-security-engineer.md +263 -61
- package/agents/engineering-senior-developer.md +128 -19
- package/agents/engineering-sre.md +84 -0
- package/agents/engineering-technical-writer.md +285 -41
- package/agents/feature-intel.md +110 -0
- package/agents/ios-app-review-guardian.md +66 -0
- package/agents/ios-foundation-models-specialist.md +64 -0
- package/agents/ios-storekit-specialist.md +59 -0
- package/agents/ios-swift-architect.md +129 -0
- package/agents/ios-swift-search.md +137 -0
- package/agents/ios-swift-ui-design.md +136 -0
- package/agents/marketing-app-store-optimizer.md +246 -64
- package/agents/planner.md +216 -0
- package/agents/pr-test-analyzer.md +63 -0
- package/agents/product-feedback-synthesizer.md +8 -2
- package/agents/refactor-cleaner.md +102 -0
- package/agents/security-reviewer.md +128 -0
- package/agents/silent-failure-hunter.md +54 -0
- package/agents/swift-build-resolver.md +119 -0
- package/agents/swift-reviewer.md +112 -0
- package/agents/tech-feasibility.md +21 -1
- package/agents/testing-api-tester.md +236 -59
- package/agents/testing-evidence-collector.md +26 -1
- package/agents/testing-performance-benchmarker.md +21 -1
- package/agents/testing-reality-checker.md +6 -1
- package/agents/visual-research.md +116 -0
- package/bin/adapters/cycle-counter-tool.ts +155 -0
- package/bin/adapters/scribe-tool.ts +71 -0
- package/bin/adapters/state-save-tool.ts +130 -0
- package/bin/adapters/write-lease-tool.ts +127 -0
- package/bin/buildanything-runtime.js +15 -0
- package/bin/buildanything-runtime.ts +328 -0
- package/bin/setup.js +83 -8
- package/commands/add-feature.md +2 -0
- package/commands/build.md +752 -332
- package/commands/fix.md +65 -0
- package/commands/self-check.md +121 -0
- package/commands/setup.md +114 -0
- package/commands/ux-review.md +63 -0
- package/commands/verify.md +69 -0
- package/docs/migration/agents.yaml +729 -0
- package/docs/migration/phase-graph.yaml +1088 -0
- package/docs/migration/sdk-host-compat.md +18 -0
- package/hooks/compile-writer-owner-cache.ts +171 -0
- package/hooks/hooks.json +36 -0
- package/hooks/pre-tool-use +19 -0
- package/hooks/pre-tool-use.ts +776 -0
- package/hooks/record-mode-transitions.ts +178 -0
- package/hooks/session-start +89 -2
- package/hooks/subagent-start +17 -0
- package/hooks/subagent-start.ts +471 -0
- package/hooks/subagent-stop +17 -0
- package/hooks/subagent-stop.ts +153 -0
- package/package.json +28 -5
- package/protocols/architecture-schema.md +171 -0
- package/protocols/build-fix.md +52 -0
- package/protocols/cleanup.md +54 -0
- package/protocols/decision-log.md +131 -0
- package/protocols/eval-harness.md +61 -0
- package/protocols/fake-data-detector.md +64 -0
- package/protocols/ios-context.md +234 -0
- package/protocols/ios-frameworks-map.md +323 -0
- package/protocols/ios-phase-branches.md +337 -0
- package/protocols/ios-preflight.md +27 -0
- package/protocols/launch-readiness.md +258 -0
- package/protocols/metric-loop.md +153 -0
- package/protocols/smoke-test.md +118 -0
- package/protocols/state-schema.json +388 -0
- package/protocols/state-schema.md +172 -0
- package/protocols/verify.md +127 -0
- package/protocols/visual-dna.md +185 -0
- package/protocols/web-phase-branches.md +351 -0
- package/skills/ios/_VENDORED.md +62 -0
- package/skills/ios/activitykit/LICENSE +131 -0
- package/skills/ios/activitykit/SKILL.md +505 -0
- package/skills/ios/activitykit/references/activitykit-patterns.md +868 -0
- package/skills/ios/app-intents/LICENSE +131 -0
- package/skills/ios/app-intents/SKILL.md +494 -0
- package/skills/ios/app-intents/references/appintents-advanced.md +1076 -0
- package/skills/ios/app-store-connect-metadata/SKILL.md +148 -0
- package/skills/ios/apple-on-device-ai/LICENSE +131 -0
- package/skills/ios/apple-on-device-ai/SKILL.md +505 -0
- package/skills/ios/apple-on-device-ai/references/coreml-conversion.md +425 -0
- package/skills/ios/apple-on-device-ai/references/coreml-optimization.md +344 -0
- package/skills/ios/apple-on-device-ai/references/foundation-models.md +508 -0
- package/skills/ios/apple-on-device-ai/references/mlx-swift.md +285 -0
- package/skills/ios/asc-privacy-manifest/SKILL.md +350 -0
- package/skills/ios/hig-components-content/SKILL.md +86 -0
- package/skills/ios/hig-components-content/references/activity-views.md +79 -0
- package/skills/ios/hig-components-content/references/charts.md +180 -0
- package/skills/ios/hig-components-content/references/collections.md +48 -0
- package/skills/ios/hig-components-content/references/color-wells.md +42 -0
- package/skills/ios/hig-components-content/references/image-views.md +82 -0
- package/skills/ios/hig-components-content/references/image-wells.md +34 -0
- package/skills/ios/hig-components-content/references/lockups.md +78 -0
- package/skills/ios/hig-components-content/references/web-views.md +36 -0
- package/skills/ios/hig-components-controls/SKILL.md +88 -0
- package/skills/ios/hig-components-controls/references/combo-boxes.md +40 -0
- package/skills/ios/hig-components-controls/references/controls.md +112 -0
- package/skills/ios/hig-components-controls/references/gauges.md +74 -0
- package/skills/ios/hig-components-controls/references/labels.md +92 -0
- package/skills/ios/hig-components-controls/references/pickers.md +128 -0
- package/skills/ios/hig-components-controls/references/rating-indicators.md +38 -0
- package/skills/ios/hig-components-controls/references/segmented-controls.md +94 -0
- package/skills/ios/hig-components-controls/references/sliders.md +92 -0
- package/skills/ios/hig-components-controls/references/steppers.md +40 -0
- package/skills/ios/hig-components-controls/references/text-fields.md +88 -0
- package/skills/ios/hig-components-controls/references/text-views.md +56 -0
- package/skills/ios/hig-components-controls/references/toggles.md +127 -0
- package/skills/ios/hig-components-controls/references/token-fields.md +48 -0
- package/skills/ios/hig-components-controls/references/virtual-keyboards.md +156 -0
- package/skills/ios/hig-components-dialogs/SKILL.md +76 -0
- package/skills/ios/hig-components-dialogs/references/action-sheets.md +74 -0
- package/skills/ios/hig-components-dialogs/references/alerts.md +158 -0
- package/skills/ios/hig-components-dialogs/references/digit-entry-views.md +32 -0
- package/skills/ios/hig-components-dialogs/references/popovers.md +81 -0
- package/skills/ios/hig-components-dialogs/references/sheets.md +157 -0
- package/skills/ios/hig-components-layout/SKILL.md +99 -0
- package/skills/ios/hig-components-layout/references/boxes.md +48 -0
- package/skills/ios/hig-components-layout/references/column-views.md +44 -0
- package/skills/ios/hig-components-layout/references/lists-and-tables.md +99 -0
- package/skills/ios/hig-components-layout/references/ornaments.md +56 -0
- package/skills/ios/hig-components-layout/references/outline-views.md +64 -0
- package/skills/ios/hig-components-layout/references/panels.md +75 -0
- package/skills/ios/hig-components-layout/references/scroll-views.md +123 -0
- package/skills/ios/hig-components-layout/references/sidebars.md +109 -0
- package/skills/ios/hig-components-layout/references/split-views.md +110 -0
- package/skills/ios/hig-components-layout/references/tab-bars.md +173 -0
- package/skills/ios/hig-components-layout/references/tab-views.md +68 -0
- package/skills/ios/hig-components-layout/references/windows.md +188 -0
- package/skills/ios/hig-components-menus/SKILL.md +81 -0
- package/skills/ios/hig-components-menus/references/action-button.md +61 -0
- package/skills/ios/hig-components-menus/references/buttons.md +261 -0
- package/skills/ios/hig-components-menus/references/context-menus.md +105 -0
- package/skills/ios/hig-components-menus/references/disclosure-controls.md +84 -0
- package/skills/ios/hig-components-menus/references/dock-menus.md +40 -0
- package/skills/ios/hig-components-menus/references/edit-menus.md +88 -0
- package/skills/ios/hig-components-menus/references/menus.md +171 -0
- package/skills/ios/hig-components-menus/references/pop-up-buttons.md +70 -0
- package/skills/ios/hig-components-menus/references/pull-down-buttons.md +77 -0
- package/skills/ios/hig-components-menus/references/the-menu-bar.md +303 -0
- package/skills/ios/hig-components-menus/references/toolbars.md +256 -0
- package/skills/ios/hig-components-search/SKILL.md +68 -0
- package/skills/ios/hig-components-search/references/page-controls.md +120 -0
- package/skills/ios/hig-components-search/references/path-controls.md +40 -0
- package/skills/ios/hig-components-search/references/search-fields.md +189 -0
- package/skills/ios/hig-components-status/SKILL.md +80 -0
- package/skills/ios/hig-components-status/references/activity-rings.md +105 -0
- package/skills/ios/hig-components-status/references/progress-indicators.md +116 -0
- package/skills/ios/hig-components-status/references/status-bars.md +38 -0
- package/skills/ios/hig-components-system/SKILL.md +88 -0
- package/skills/ios/hig-components-system/references/app-clips.md +387 -0
- package/skills/ios/hig-components-system/references/app-shortcuts.md +114 -0
- package/skills/ios/hig-components-system/references/complications.md +425 -0
- package/skills/ios/hig-components-system/references/home-screen-quick-actions.md +42 -0
- package/skills/ios/hig-components-system/references/live-activities.md +442 -0
- package/skills/ios/hig-components-system/references/notifications.md +153 -0
- package/skills/ios/hig-components-system/references/top-shelf.md +135 -0
- package/skills/ios/hig-components-system/references/watch-faces.md +40 -0
- package/skills/ios/hig-components-system/references/widgets.md +517 -0
- package/skills/ios/hig-foundations/SKILL.md +98 -0
- package/skills/ios/hig-foundations/references/accessibility.md +291 -0
- package/skills/ios/hig-foundations/references/app-icons.md +210 -0
- package/skills/ios/hig-foundations/references/branding.md +44 -0
- package/skills/ios/hig-foundations/references/color.md +274 -0
- package/skills/ios/hig-foundations/references/dark-mode.md +116 -0
- package/skills/ios/hig-foundations/references/icons.md +263 -0
- package/skills/ios/hig-foundations/references/images.md +176 -0
- package/skills/ios/hig-foundations/references/immersive-experiences.md +174 -0
- package/skills/ios/hig-foundations/references/inclusion.md +189 -0
- package/skills/ios/hig-foundations/references/layout.md +425 -0
- package/skills/ios/hig-foundations/references/materials.md +238 -0
- package/skills/ios/hig-foundations/references/motion.md +103 -0
- package/skills/ios/hig-foundations/references/privacy.md +231 -0
- package/skills/ios/hig-foundations/references/right-to-left.md +206 -0
- package/skills/ios/hig-foundations/references/sf-symbols.md +310 -0
- package/skills/ios/hig-foundations/references/spatial-layout.md +142 -0
- package/skills/ios/hig-foundations/references/typography.md +1146 -0
- package/skills/ios/hig-foundations/references/writing.md +91 -0
- package/skills/ios/hig-inputs/SKILL.md +94 -0
- package/skills/ios/hig-inputs/references/apple-pencil-and-scribble.md +148 -0
- package/skills/ios/hig-inputs/references/camera-control.md +107 -0
- package/skills/ios/hig-inputs/references/digital-crown.md +83 -0
- package/skills/ios/hig-inputs/references/eyes.md +120 -0
- package/skills/ios/hig-inputs/references/focus-and-selection.md +120 -0
- package/skills/ios/hig-inputs/references/game-controls.md +156 -0
- package/skills/ios/hig-inputs/references/gestures.md +208 -0
- package/skills/ios/hig-inputs/references/gyro-and-accelerometer.md +40 -0
- package/skills/ios/hig-inputs/references/keyboards.md +234 -0
- package/skills/ios/hig-inputs/references/nearby-interactions.md +70 -0
- package/skills/ios/hig-inputs/references/pointing-devices.md +237 -0
- package/skills/ios/hig-inputs/references/remotes.md +67 -0
- package/skills/ios/hig-inputs/references/spatial-interactions.md +70 -0
- package/skills/ios/hig-patterns/SKILL.md +104 -0
- package/skills/ios/hig-patterns/references/charting-data.md +81 -0
- package/skills/ios/hig-patterns/references/collaboration-and-sharing.md +86 -0
- package/skills/ios/hig-patterns/references/drag-and-drop.md +134 -0
- package/skills/ios/hig-patterns/references/entering-data.md +69 -0
- package/skills/ios/hig-patterns/references/feedback.md +67 -0
- package/skills/ios/hig-patterns/references/file-management.md +135 -0
- package/skills/ios/hig-patterns/references/going-full-screen.md +79 -0
- package/skills/ios/hig-patterns/references/launching.md +81 -0
- package/skills/ios/hig-patterns/references/live-viewing-apps.md +79 -0
- package/skills/ios/hig-patterns/references/loading.md +59 -0
- package/skills/ios/hig-patterns/references/managing-accounts.md +107 -0
- package/skills/ios/hig-patterns/references/managing-notifications.md +99 -0
- package/skills/ios/hig-patterns/references/modality.md +82 -0
- package/skills/ios/hig-patterns/references/multitasking.md +131 -0
- package/skills/ios/hig-patterns/references/offering-help.md +117 -0
- package/skills/ios/hig-patterns/references/onboarding.md +69 -0
- package/skills/ios/hig-patterns/references/playing-audio.md +124 -0
- package/skills/ios/hig-patterns/references/playing-haptics.md +280 -0
- package/skills/ios/hig-patterns/references/playing-video.md +180 -0
- package/skills/ios/hig-patterns/references/printing.md +50 -0
- package/skills/ios/hig-patterns/references/ratings-and-reviews.md +48 -0
- package/skills/ios/hig-patterns/references/searching.md +70 -0
- package/skills/ios/hig-patterns/references/settings.md +84 -0
- package/skills/ios/hig-patterns/references/undo-and-redo.md +58 -0
- package/skills/ios/hig-patterns/references/workouts.md +76 -0
- package/skills/ios/hig-platforms/SKILL.md +84 -0
- package/skills/ios/hig-platforms/references/designing-for-games.md +159 -0
- package/skills/ios/hig-platforms/references/designing-for-ios.md +66 -0
- package/skills/ios/hig-platforms/references/designing-for-ipados.md +64 -0
- package/skills/ios/hig-platforms/references/designing-for-macos.md +70 -0
- package/skills/ios/hig-platforms/references/designing-for-tvos.md +68 -0
- package/skills/ios/hig-platforms/references/designing-for-visionos.md +85 -0
- package/skills/ios/hig-platforms/references/designing-for-watchos.md +74 -0
- package/skills/ios/hig-project-context/SKILL.md +133 -0
- package/skills/ios/hig-technologies/SKILL.md +107 -0
- package/skills/ios/hig-technologies/references/airplay.md +125 -0
- package/skills/ios/hig-technologies/references/always-on.md +62 -0
- package/skills/ios/hig-technologies/references/apple-pay.md +441 -0
- package/skills/ios/hig-technologies/references/augmented-reality.md +247 -0
- package/skills/ios/hig-technologies/references/carekit.md +224 -0
- package/skills/ios/hig-technologies/references/carplay.md +119 -0
- package/skills/ios/hig-technologies/references/game-center.md +343 -0
- package/skills/ios/hig-technologies/references/generative-ai.md +110 -0
- package/skills/ios/hig-technologies/references/healthkit.md +120 -0
- package/skills/ios/hig-technologies/references/homekit.md +343 -0
- package/skills/ios/hig-technologies/references/icloud.md +52 -0
- package/skills/ios/hig-technologies/references/id-verifier.md +73 -0
- package/skills/ios/hig-technologies/references/imessage-apps-and-stickers.md +105 -0
- package/skills/ios/hig-technologies/references/in-app-purchase.md +263 -0
- package/skills/ios/hig-technologies/references/live-photos.md +54 -0
- package/skills/ios/hig-technologies/references/mac-catalyst.md +216 -0
- package/skills/ios/hig-technologies/references/machine-learning.md +394 -0
- package/skills/ios/hig-technologies/references/maps.md +221 -0
- package/skills/ios/hig-technologies/references/nfc.md +51 -0
- package/skills/ios/hig-technologies/references/photo-editing.md +40 -0
- package/skills/ios/hig-technologies/references/researchkit.md +134 -0
- package/skills/ios/hig-technologies/references/shareplay.md +142 -0
- package/skills/ios/hig-technologies/references/shazamkit.md +47 -0
- package/skills/ios/hig-technologies/references/sign-in-with-apple.md +288 -0
- package/skills/ios/hig-technologies/references/siri.md +523 -0
- package/skills/ios/hig-technologies/references/tap-to-pay-on-iphone.md +208 -0
- package/skills/ios/hig-technologies/references/voiceover.md +90 -0
- package/skills/ios/hig-technologies/references/wallet.md +420 -0
- package/skills/ios/ios-26-platform/SKILL.md +53 -0
- package/skills/ios/ios-26-platform/references/automatic-adoption.md +161 -0
- package/skills/ios/ios-26-platform/references/backward-compat.md +238 -0
- package/skills/ios/ios-26-platform/references/liquid-glass.md +255 -0
- package/skills/ios/ios-26-platform/references/swiftui-apis.md +277 -0
- package/skills/ios/ios-26-platform/references/toolbar-navigation.md +250 -0
- package/skills/ios/ios-bootstrap/SKILL.md +107 -0
- package/skills/ios/ios-bootstrap/references/apple-docs-mcp-config.md +28 -0
- package/skills/ios/ios-bootstrap/references/new-project-dialog.md +41 -0
- package/skills/ios/ios-bootstrap/references/xcode-mcp-config.md +29 -0
- package/skills/ios/ios-debugger-agent/LICENSE +21 -0
- package/skills/ios/ios-debugger-agent/SKILL.md +58 -0
- package/skills/ios/ios-debugger-agent/agents/openai.yaml +4 -0
- package/skills/ios/ios-entitlements-generator/SKILL.md +47 -0
- package/skills/ios/ios-info-plist-hardening/SKILL.md +130 -0
- package/skills/ios/ios-maestro-flow-author/SKILL.md +68 -0
- package/skills/ios/ios-maestro-flow-author/references/input-and-scroll.yaml +17 -0
- package/skills/ios/ios-maestro-flow-author/references/modal-and-dismiss.yaml +14 -0
- package/skills/ios/ios-maestro-flow-author/references/onboarding-flow.yaml +16 -0
- package/skills/ios/ios-maestro-flow-author/references/tab-navigation.yaml +13 -0
- package/skills/ios/ios-maestro-flow-author/references/tap-and-assert.yaml +9 -0
- package/skills/ios/swift-accessibility/LICENSE +21 -0
- package/skills/ios/swift-accessibility/SKILL.md +371 -0
- package/skills/ios/swift-accessibility/examples/before-after-appkit.md +446 -0
- package/skills/ios/swift-accessibility/examples/before-after-swiftui.md +441 -0
- package/skills/ios/swift-accessibility/examples/before-after-uikit.md +464 -0
- package/skills/ios/swift-accessibility/references/assistive-access.md +441 -0
- package/skills/ios/swift-accessibility/references/display-settings.md +491 -0
- package/skills/ios/swift-accessibility/references/dynamic-type.md +420 -0
- package/skills/ios/swift-accessibility/references/media-accessibility.md +421 -0
- package/skills/ios/swift-accessibility/references/motor-input.md +393 -0
- package/skills/ios/swift-accessibility/references/nutrition-labels.md +362 -0
- package/skills/ios/swift-accessibility/references/platform-specifics.md +515 -0
- package/skills/ios/swift-accessibility/references/semantic-structure.md +585 -0
- package/skills/ios/swift-accessibility/references/testing-auditing.md +507 -0
- package/skills/ios/swift-accessibility/references/voice-control.md +317 -0
- package/skills/ios/swift-accessibility/references/voiceover-swiftui.md +584 -0
- package/skills/ios/swift-accessibility/references/voiceover-uikit.md +519 -0
- package/skills/ios/swift-accessibility/references/wcag-mapping.md +167 -0
- package/skills/ios/swift-accessibility/resources/audit-template.swift +128 -0
- package/skills/ios/swift-accessibility/resources/qa-checklist.md +258 -0
- package/skills/ios/swift-actor-persistence/SKILL.md +143 -0
- package/skills/ios/swift-concurrency/LICENSE +21 -0
- package/skills/ios/swift-concurrency/SKILL.md +171 -0
- package/skills/ios/swift-concurrency/references/_index.md +50 -0
- package/skills/ios/swift-concurrency/references/actors.md +660 -0
- package/skills/ios/swift-concurrency/references/async-algorithms.md +847 -0
- package/skills/ios/swift-concurrency/references/async-await-basics.md +266 -0
- package/skills/ios/swift-concurrency/references/async-sequences.md +710 -0
- package/skills/ios/swift-concurrency/references/core-data.md +560 -0
- package/skills/ios/swift-concurrency/references/glossary.md +135 -0
- package/skills/ios/swift-concurrency/references/linting.md +155 -0
- package/skills/ios/swift-concurrency/references/memory-management.md +569 -0
- package/skills/ios/swift-concurrency/references/migration.md +1104 -0
- package/skills/ios/swift-concurrency/references/performance.md +593 -0
- package/skills/ios/swift-concurrency/references/sendable.md +598 -0
- package/skills/ios/swift-concurrency/references/tasks.md +636 -0
- package/skills/ios/swift-concurrency/references/testing.md +592 -0
- package/skills/ios/swift-concurrency/references/threading.md +495 -0
- package/skills/ios/swift-concurrency-6-2/SKILL.md +216 -0
- package/skills/ios/swift-protocol-di-testing/SKILL.md +190 -0
- package/skills/ios/swift-security-expert/LICENSE +21 -0
- package/skills/ios/swift-security-expert/SKILL.md +470 -0
- package/skills/ios/swift-security-expert/references/biometric-authentication.md +565 -0
- package/skills/ios/swift-security-expert/references/certificate-trust.md +592 -0
- package/skills/ios/swift-security-expert/references/common-anti-patterns.md +690 -0
- package/skills/ios/swift-security-expert/references/compliance-owasp-mapping.md +537 -0
- package/skills/ios/swift-security-expert/references/credential-storage-patterns.md +721 -0
- package/skills/ios/swift-security-expert/references/cryptokit-public-key.md +505 -0
- package/skills/ios/swift-security-expert/references/cryptokit-symmetric.md +497 -0
- package/skills/ios/swift-security-expert/references/keychain-access-control.md +508 -0
- package/skills/ios/swift-security-expert/references/keychain-fundamentals.md +596 -0
- package/skills/ios/swift-security-expert/references/keychain-item-classes.md +476 -0
- package/skills/ios/swift-security-expert/references/keychain-sharing.md +458 -0
- package/skills/ios/swift-security-expert/references/migration-legacy-stores.md +727 -0
- package/skills/ios/swift-security-expert/references/secure-enclave.md +539 -0
- package/skills/ios/swift-security-expert/references/testing-security-code.md +781 -0
- package/skills/ios/swift-testing-expert/LICENSE +21 -0
- package/skills/ios/swift-testing-expert/SKILL.md +79 -0
- package/skills/ios/swift-testing-expert/references/_index.md +12 -0
- package/skills/ios/swift-testing-expert/references/async-testing-and-waiting.md +127 -0
- package/skills/ios/swift-testing-expert/references/expectations.md +145 -0
- package/skills/ios/swift-testing-expert/references/fundamentals.md +141 -0
- package/skills/ios/swift-testing-expert/references/migration-from-xctest.md +127 -0
- package/skills/ios/swift-testing-expert/references/parallelization-and-isolation.md +95 -0
- package/skills/ios/swift-testing-expert/references/parameterized-testing.md +284 -0
- package/skills/ios/swift-testing-expert/references/performance-and-best-practices.md +187 -0
- package/skills/ios/swift-testing-expert/references/traits-and-tags.md +114 -0
- package/skills/ios/swift-testing-expert/references/xcode-workflows.md +70 -0
- package/skills/ios/swiftdata-pro/LICENSE +21 -0
- package/skills/ios/swiftdata-pro/SKILL.md +102 -0
- package/skills/ios/swiftdata-pro/agents/openai.yaml +10 -0
- package/skills/ios/swiftdata-pro/assets/swiftdata-pro-icon.png +0 -0
- package/skills/ios/swiftdata-pro/assets/swiftdata-pro-icon.svg +29 -0
- package/skills/ios/swiftdata-pro/references/class-inheritance.md +104 -0
- package/skills/ios/swiftdata-pro/references/cloudkit.md +10 -0
- package/skills/ios/swiftdata-pro/references/core-rules.md +20 -0
- package/skills/ios/swiftdata-pro/references/indexing.md +27 -0
- package/skills/ios/swiftdata-pro/references/predicates.md +73 -0
- package/skills/ios/swiftui-design-principles/AGENTS.md +21 -0
- package/skills/ios/swiftui-design-principles/LICENSE +21 -0
- package/skills/ios/swiftui-design-principles/README.md +41 -0
- package/skills/ios/swiftui-design-principles/SKILL.md +605 -0
- package/skills/ios/swiftui-design-principles/metadata.json +10 -0
- package/skills/ios/swiftui-design-tokens/SKILL.md +475 -0
- package/skills/ios/swiftui-liquid-glass/LICENSE +21 -0
- package/skills/ios/swiftui-liquid-glass/SKILL.md +95 -0
- package/skills/ios/swiftui-liquid-glass/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-liquid-glass/references/liquid-glass.md +280 -0
- package/skills/ios/swiftui-performance-audit/LICENSE +21 -0
- package/skills/ios/swiftui-performance-audit/SKILL.md +111 -0
- package/skills/ios/swiftui-performance-audit/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-performance-audit/references/code-smells.md +150 -0
- package/skills/ios/swiftui-performance-audit/references/demystify-swiftui-performance-wwdc23.md +46 -0
- package/skills/ios/swiftui-performance-audit/references/optimizing-swiftui-performance-instruments.md +29 -0
- package/skills/ios/swiftui-performance-audit/references/profiling-intake.md +44 -0
- package/skills/ios/swiftui-performance-audit/references/report-template.md +47 -0
- package/skills/ios/swiftui-performance-audit/references/understanding-hangs-in-your-app.md +33 -0
- package/skills/ios/swiftui-performance-audit/references/understanding-improving-swiftui-performance.md +52 -0
- package/skills/ios/swiftui-pro/LICENSE +21 -0
- package/skills/ios/swiftui-pro/SKILL.md +108 -0
- package/skills/ios/swiftui-pro/agents/openai.yaml +10 -0
- package/skills/ios/swiftui-pro/assets/swiftui-pro-icon.png +0 -0
- package/skills/ios/swiftui-pro/assets/swiftui-pro-icon.svg +29 -0
- package/skills/ios/swiftui-pro/references/accessibility.md +13 -0
- package/skills/ios/swiftui-pro/references/api.md +39 -0
- package/skills/ios/swiftui-pro/references/data.md +43 -0
- package/skills/ios/swiftui-pro/references/design.md +31 -0
- package/skills/ios/swiftui-pro/references/hygiene.md +9 -0
- package/skills/ios/swiftui-pro/references/navigation.md +14 -0
- package/skills/ios/swiftui-pro/references/performance.md +46 -0
- package/skills/ios/swiftui-pro/references/swift.md +56 -0
- package/skills/ios/swiftui-pro/references/views.md +35 -0
- package/skills/ios/swiftui-ui-patterns/LICENSE +21 -0
- package/skills/ios/swiftui-ui-patterns/SKILL.md +100 -0
- package/skills/ios/swiftui-ui-patterns/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-ui-patterns/references/app-wiring.md +201 -0
- package/skills/ios/swiftui-ui-patterns/references/async-state.md +96 -0
- package/skills/ios/swiftui-ui-patterns/references/components-index.md +50 -0
- package/skills/ios/swiftui-ui-patterns/references/controls.md +57 -0
- package/skills/ios/swiftui-ui-patterns/references/deeplinks.md +66 -0
- package/skills/ios/swiftui-ui-patterns/references/focus.md +90 -0
- package/skills/ios/swiftui-ui-patterns/references/form.md +97 -0
- package/skills/ios/swiftui-ui-patterns/references/grids.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/haptics.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/input-toolbar.md +51 -0
- package/skills/ios/swiftui-ui-patterns/references/lightweight-clients.md +93 -0
- package/skills/ios/swiftui-ui-patterns/references/list.md +86 -0
- package/skills/ios/swiftui-ui-patterns/references/loading-placeholders.md +38 -0
- package/skills/ios/swiftui-ui-patterns/references/macos-settings.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/matched-transitions.md +59 -0
- package/skills/ios/swiftui-ui-patterns/references/media.md +73 -0
- package/skills/ios/swiftui-ui-patterns/references/menu-bar.md +101 -0
- package/skills/ios/swiftui-ui-patterns/references/navigationstack.md +159 -0
- package/skills/ios/swiftui-ui-patterns/references/overlay.md +45 -0
- package/skills/ios/swiftui-ui-patterns/references/performance.md +62 -0
- package/skills/ios/swiftui-ui-patterns/references/previews.md +48 -0
- package/skills/ios/swiftui-ui-patterns/references/scroll-reveal.md +133 -0
- package/skills/ios/swiftui-ui-patterns/references/scrollview.md +87 -0
- package/skills/ios/swiftui-ui-patterns/references/searchable.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/sheets.md +155 -0
- package/skills/ios/swiftui-ui-patterns/references/split-views.md +72 -0
- package/skills/ios/swiftui-ui-patterns/references/tabview.md +114 -0
- package/skills/ios/swiftui-ui-patterns/references/theming.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/title-menus.md +93 -0
- package/skills/ios/swiftui-ui-patterns/references/top-bar.md +49 -0
- package/skills/ios/swiftui-view-refactor/LICENSE +21 -0
- package/skills/ios/swiftui-view-refactor/SKILL.md +207 -0
- package/skills/ios/swiftui-view-refactor/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-view-refactor/references/mv-patterns.md +161 -0
- package/skills/ios/widgetkit/LICENSE +131 -0
- package/skills/ios/widgetkit/SKILL.md +502 -0
- package/skills/ios/widgetkit/references/widgetkit-advanced.md +871 -0
- package/skills/ios/writing-for-interfaces/SKILL.md +75 -0
- package/skills/web/accessibility/SKILL.md +146 -0
- package/skills/web/aceternity-ui/SKILL.md +719 -0
- package/skills/web/aceternity-ui/metadata.json +10 -0
- package/skills/web/api-design/SKILL.md +523 -0
- package/skills/web/chart-accessibility/SKILL.md +332 -0
- package/skills/web/composition-patterns/AGENTS.md +946 -0
- package/skills/web/composition-patterns/README.md +60 -0
- package/skills/web/composition-patterns/SKILL.md +89 -0
- package/skills/web/composition-patterns/metadata.json +11 -0
- package/skills/web/composition-patterns/rules/_sections.md +29 -0
- package/skills/web/composition-patterns/rules/_template.md +24 -0
- package/skills/web/composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/skills/web/composition-patterns/rules/architecture-compound-components.md +112 -0
- package/skills/web/composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/skills/web/composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/skills/web/composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/skills/web/composition-patterns/rules/state-context-interface.md +191 -0
- package/skills/web/composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/skills/web/composition-patterns/rules/state-lift-state.md +125 -0
- package/skills/web/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/skills/web/database-migrations/SKILL.md +429 -0
- package/skills/web/deployment-patterns/SKILL.md +427 -0
- package/skills/web/docker-patterns/SKILL.md +364 -0
- package/skills/web/e2e-testing/SKILL.md +326 -0
- package/skills/web/lighthouse-ci/SKILL.md +361 -0
- package/skills/web/mcp-server-patterns/SKILL.md +69 -0
- package/skills/web/next-best-practices/SKILL.md +153 -0
- package/skills/web/next-best-practices/async-patterns.md +87 -0
- package/skills/web/next-best-practices/bundling.md +180 -0
- package/skills/web/next-best-practices/data-patterns.md +297 -0
- package/skills/web/next-best-practices/debug-tricks.md +105 -0
- package/skills/web/next-best-practices/directives.md +73 -0
- package/skills/web/next-best-practices/error-handling.md +227 -0
- package/skills/web/next-best-practices/file-conventions.md +140 -0
- package/skills/web/next-best-practices/font.md +245 -0
- package/skills/web/next-best-practices/functions.md +108 -0
- package/skills/web/next-best-practices/hydration-error.md +91 -0
- package/skills/web/next-best-practices/image.md +173 -0
- package/skills/web/next-best-practices/metadata.md +301 -0
- package/skills/web/next-best-practices/parallel-routes.md +287 -0
- package/skills/web/next-best-practices/route-handlers.md +146 -0
- package/skills/web/next-best-practices/rsc-boundaries.md +159 -0
- package/skills/web/next-best-practices/runtime-selection.md +39 -0
- package/skills/web/next-best-practices/scripts.md +141 -0
- package/skills/web/next-best-practices/self-hosting.md +371 -0
- package/skills/web/next-best-practices/suspense-boundaries.md +67 -0
- package/skills/web/next-cache-components/SKILL.md +411 -0
- package/skills/web/postgres-best-practices/SKILL.md +14 -0
- package/skills/web/postgres-best-practices/references/schema-design.md +9 -0
- package/skills/web/react-best-practices/AGENTS.md +3810 -0
- package/skills/web/react-best-practices/README.md +123 -0
- package/skills/web/react-best-practices/SKILL.md +149 -0
- package/skills/web/react-best-practices/metadata.json +15 -0
- package/skills/web/react-best-practices/rules/_sections.md +46 -0
- package/skills/web/react-best-practices/rules/_template.md +28 -0
- package/skills/web/react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/skills/web/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/skills/web/react-best-practices/rules/advanced-init-once.md +42 -0
- package/skills/web/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/skills/web/react-best-practices/rules/async-api-routes.md +38 -0
- package/skills/web/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/skills/web/react-best-practices/rules/async-defer-await.md +82 -0
- package/skills/web/react-best-practices/rules/async-dependencies.md +51 -0
- package/skills/web/react-best-practices/rules/async-parallel.md +28 -0
- package/skills/web/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/skills/web/react-best-practices/rules/bundle-analyzable-paths.md +63 -0
- package/skills/web/react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/skills/web/react-best-practices/rules/bundle-conditional.md +31 -0
- package/skills/web/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/skills/web/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/skills/web/react-best-practices/rules/bundle-preload.md +50 -0
- package/skills/web/react-best-practices/rules/client-event-listeners.md +74 -0
- package/skills/web/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/skills/web/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/skills/web/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/skills/web/react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/skills/web/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/skills/web/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/skills/web/react-best-practices/rules/js-cache-storage.md +70 -0
- package/skills/web/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/skills/web/react-best-practices/rules/js-early-exit.md +50 -0
- package/skills/web/react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/skills/web/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/skills/web/react-best-practices/rules/js-index-maps.md +37 -0
- package/skills/web/react-best-practices/rules/js-length-check-first.md +49 -0
- package/skills/web/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/skills/web/react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/skills/web/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/skills/web/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/skills/web/react-best-practices/rules/rendering-activity.md +26 -0
- package/skills/web/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/skills/web/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/skills/web/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/skills/web/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/skills/web/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/skills/web/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/skills/web/react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/skills/web/react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/skills/web/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/skills/web/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/skills/web/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/skills/web/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/skills/web/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/skills/web/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/skills/web/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/skills/web/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/skills/web/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/skills/web/react-best-practices/rules/rerender-memo.md +44 -0
- package/skills/web/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/skills/web/react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/skills/web/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/skills/web/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/skills/web/react-best-practices/rules/rerender-transitions.md +40 -0
- package/skills/web/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/skills/web/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/skills/web/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/skills/web/react-best-practices/rules/server-auth-actions.md +96 -0
- package/skills/web/react-best-practices/rules/server-cache-lru.md +41 -0
- package/skills/web/react-best-practices/rules/server-cache-react.md +76 -0
- package/skills/web/react-best-practices/rules/server-dedup-props.md +65 -0
- package/skills/web/react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/skills/web/react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/skills/web/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/skills/web/react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/skills/web/react-best-practices/rules/server-serialization.md +38 -0
- package/skills/web/seo/SKILL.md +154 -0
- package/skills/web/web-design-guidelines/SKILL.md +39 -0
- package/skills/web/zap-scan-config/SKILL.md +444 -0
- package/skills/web/zap-scan-config/assets/.gitkeep +9 -0
- package/skills/web/zap-scan-config/assets/github_action.yml +207 -0
- package/skills/web/zap-scan-config/assets/gitlab_ci.yml +226 -0
- package/skills/web/zap-scan-config/assets/zap_automation.yaml +196 -0
- package/skills/web/zap-scan-config/assets/zap_context.xml +192 -0
- package/skills/web/zap-scan-config/references/EXAMPLE.md +40 -0
- package/skills/web/zap-scan-config/references/api_testing_guide.md +475 -0
- package/skills/web/zap-scan-config/references/authentication_guide.md +431 -0
- package/skills/web/zap-scan-config/references/false_positive_handling.md +427 -0
- package/skills/web/zap-scan-config/references/owasp_mapping.md +255 -0
- package/src/lrr/aggregator.ts +80 -0
- package/src/orchestrator/hooks/context-header.ts +95 -0
- package/src/orchestrator/hooks/token-accounting-emitter.ts +77 -0
- package/src/orchestrator/hooks/token-accounting.ts +101 -0
- package/src/orchestrator/mcp/cycle-counter.ts +129 -0
- package/src/orchestrator/mcp/scribe.ts +283 -0
- package/src/orchestrator/mcp/state-save.ts +149 -0
- package/src/orchestrator/mcp/write-lease.ts +167 -0
- package/src/orchestrator/phase4-shared-context.ts +41 -0
- package/src/orchestrator/schemas/backward-edge.ts +46 -0
- package/agents/agentic-identity-trust.md +0 -121
- package/agents/data-consolidation-agent.md +0 -39
- package/agents/design-image-prompt-engineer.md +0 -105
- package/agents/design-visual-storyteller.md +0 -147
- package/agents/design-whimsy-injector.md +0 -89
- package/agents/engineering-autonomous-optimization-architect.md +0 -105
- package/agents/market-intel.md +0 -35
- package/agents/marketing-instagram-curator.md +0 -111
- package/agents/marketing-reddit-community-builder.md +0 -121
- package/agents/marketing-social-media-strategist.md +0 -74
- package/agents/marketing-tiktok-strategist.md +0 -123
- package/agents/marketing-twitter-engager.md +0 -124
- package/agents/marketing-wechat-official-account.md +0 -143
- package/agents/marketing-xiaohongshu-specialist.md +0 -136
- package/agents/marketing-zhihu-strategist.md +0 -160
- package/agents/product-behavioral-nudge-engine.md +0 -78
- package/agents/project-management-experiment-tracker.md +0 -102
- package/agents/report-distribution-agent.md +0 -43
- package/agents/risk-analysis.md +0 -45
- package/agents/sales-data-extraction-agent.md +0 -46
- package/agents/specialized-cultural-intelligence-strategist.md +0 -65
- package/agents/specialized-developer-advocate.md +0 -146
- package/agents/support-analytics-reporter.md +0 -133
- package/agents/support-executive-summary-generator.md +0 -64
- package/agents/support-finance-tracker.md +0 -145
- package/agents/support-legal-compliance-checker.md +0 -129
- package/agents/support-support-responder.md +0 -91
- package/agents/testing-accessibility-auditor.md +0 -110
- package/agents/testing-test-results-analyzer.md +0 -97
- package/agents/testing-tool-evaluator.md +0 -76
- package/agents/testing-workflow-optimizer.md +0 -99
- package/agents/user-research.md +0 -40
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Antoine van der Lee
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swift-testing-expert
|
|
3
|
+
description: 'Expert guidance for Swift Testing: test structure, #expect/#require macros, traits and tags, parameterized tests, test plans, parallel execution, async waiting patterns, and XCTest migration. Use when writing new Swift tests, modernizing XCTest suites, debugging flaky tests, or improving test quality and maintainability in Apple-platform or Swift server projects.'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Swift Testing
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Use this skill to write, review, migrate, and debug Swift tests with modern Swift Testing APIs. Prioritize readable tests, robust parallel execution, clear diagnostics, and incremental migration from XCTest where needed.
|
|
11
|
+
|
|
12
|
+
## Agent behavior contract (follow these rules)
|
|
13
|
+
|
|
14
|
+
1. Prefer Swift Testing for Swift unit and integration tests, but keep XCTest for UI automation (`XCUIApplication`), performance metrics (`XCTMetric`), and Objective-C-only test code.
|
|
15
|
+
2. Treat `#expect` as the default assertion and use `#require` when subsequent lines depend on a prerequisite value.
|
|
16
|
+
3. Default to parallel-safe guidance. If tests are not isolated, first propose fixing shared state before applying `.serialized`.
|
|
17
|
+
4. Prefer traits for behavior and metadata (`.enabled`, `.disabled`, `.timeLimit`, `.bug`, tags) over naming conventions or ad-hoc comments.
|
|
18
|
+
5. Recommend parameterized tests when multiple tests share logic and differ only in input values.
|
|
19
|
+
6. Use `@available` on test functions for OS-gated behavior instead of runtime `#available` checks inside test bodies; never annotate suite types with `@available`.
|
|
20
|
+
7. Keep migration advice incremental: convert assertions first, then organize suites, then introduce parameterization/traits.
|
|
21
|
+
8. Only import `Testing` in test targets, never in app/library/binary targets.
|
|
22
|
+
|
|
23
|
+
## First 60 seconds (triage template)
|
|
24
|
+
|
|
25
|
+
- Clarify the goal: new tests, migration, flaky failures, performance, CI filtering, or async waiting.
|
|
26
|
+
- Collect minimal facts:
|
|
27
|
+
- Xcode/Swift version and platform targets
|
|
28
|
+
- Whether tests currently use XCTest, Swift Testing, or both
|
|
29
|
+
- Whether failures are deterministic or flaky
|
|
30
|
+
- Whether tests access shared resources (database, files, network, global state)
|
|
31
|
+
- Branch quickly:
|
|
32
|
+
- repetitive tests -> parameterized tests
|
|
33
|
+
- noisy or flaky failures -> known issue handling and test isolation
|
|
34
|
+
- migration questions -> XCTest mapping and coexistence strategy
|
|
35
|
+
- async callback complexity -> continuation/await patterns
|
|
36
|
+
|
|
37
|
+
## Routing map (read the right reference fast)
|
|
38
|
+
|
|
39
|
+
- Test building blocks and suite organization -> `references/fundamentals.md`
|
|
40
|
+
- `#expect`, `#require`, and throw expectations -> `references/expectations.md`
|
|
41
|
+
- Traits, tags, and Xcode test-plan filtering -> `references/traits-and-tags.md`
|
|
42
|
+
- Parameterized test design and combinatorics -> `references/parameterized-testing.md`
|
|
43
|
+
- Default parallel execution, `.serialized`, isolation strategy -> `references/parallelization-and-isolation.md`
|
|
44
|
+
- Test speed, determinism, and flakiness prevention -> `references/performance-and-best-practices.md`
|
|
45
|
+
- Async waiting and callback bridging -> `references/async-testing-and-waiting.md`
|
|
46
|
+
- XCTest coexistence and migration workflow -> `references/migration-from-xctest.md`
|
|
47
|
+
- Test navigator/report workflows and diagnostics -> `references/xcode-workflows.md`
|
|
48
|
+
- Index and quick navigation -> `references/_index.md`
|
|
49
|
+
|
|
50
|
+
## Common pitfalls -> next best move
|
|
51
|
+
|
|
52
|
+
- Repetitive `testFooCaseA/testFooCaseB/...` methods -> replace with one parameterized `@Test(arguments:)`.
|
|
53
|
+
- Failing optional preconditions hidden in later assertions -> `try #require(...)` then assert on unwrapped value.
|
|
54
|
+
- Flaky integration tests on shared database -> isolate dependencies or in-memory repositories; use `.serialized` only as a transition step.
|
|
55
|
+
- Disabled tests that silently rot -> prefer `withKnownIssue` for temporary known failures to preserve signal.
|
|
56
|
+
- Unclear failure values for complex types -> conform type to `CustomTestStringConvertible` for focused test diagnostics.
|
|
57
|
+
- Test-plan include/exclude by names -> use tags and tag-based filters instead.
|
|
58
|
+
|
|
59
|
+
## Verification checklist
|
|
60
|
+
|
|
61
|
+
- Confirm each test has a single clear behavior and expressive display name when needed.
|
|
62
|
+
- Confirm prerequisites use `#require` where failure should stop the test.
|
|
63
|
+
- Confirm repeated logic is parameterized instead of duplicated.
|
|
64
|
+
- Confirm tests are parallel-safe or intentionally serialized with rationale.
|
|
65
|
+
- Confirm async code is awaited and callback APIs are bridged safely.
|
|
66
|
+
- Confirm migration keeps unsupported XCTest-only scenarios on XCTest.
|
|
67
|
+
|
|
68
|
+
## References
|
|
69
|
+
|
|
70
|
+
- `references/_index.md`
|
|
71
|
+
- `references/fundamentals.md`
|
|
72
|
+
- `references/expectations.md`
|
|
73
|
+
- `references/traits-and-tags.md`
|
|
74
|
+
- `references/parameterized-testing.md`
|
|
75
|
+
- `references/parallelization-and-isolation.md`
|
|
76
|
+
- `references/performance-and-best-practices.md`
|
|
77
|
+
- `references/async-testing-and-waiting.md`
|
|
78
|
+
- `references/migration-from-xctest.md`
|
|
79
|
+
- `references/xcode-workflows.md`
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Swift Testing Reference Index
|
|
2
|
+
|
|
3
|
+
- `fundamentals.md` - `@Test`, suites, structure, naming, and baseline patterns
|
|
4
|
+
- `expectations.md` - `#expect`, `#require`, throw validation, and failure readability
|
|
5
|
+
- `traits-and-tags.md` - traits, tags, bug linking, conditions, and test-plan filtering
|
|
6
|
+
- `parameterized-testing.md` - single/multi-argument parameterization, `zip`, and scaling strategy
|
|
7
|
+
- `parallelization-and-isolation.md` - default parallel execution, random order, `.serialized`, and isolation patterns
|
|
8
|
+
- `performance-and-best-practices.md` - test speed, determinism, flaky-test prevention, and parallel-safe defaults
|
|
9
|
+
- `async-testing-and-waiting.md` - async/await in tests, callback bridging, and event-stream verification
|
|
10
|
+
- `migration-from-xctest.md` - pragmatic XCTest -> Swift Testing migration workflow
|
|
11
|
+
- `xcode-workflows.md` - navigator/report workflows, insights, and diagnostics quality
|
|
12
|
+
- `README.md` resources section - Apple documentation links for defining, organizing, and migrating tests
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Async Testing and Waiting
|
|
2
|
+
|
|
3
|
+
## When to use this reference
|
|
4
|
+
|
|
5
|
+
Use this file when tests involve async/await functions, completion handlers, streams/events, or timing-related flakiness.
|
|
6
|
+
|
|
7
|
+
## Preferred approach
|
|
8
|
+
|
|
9
|
+
- Use async test functions and `await` naturally.
|
|
10
|
+
- Keep async test code close to production async patterns.
|
|
11
|
+
- Prefer structured concurrency patterns over ad-hoc synchronization.
|
|
12
|
+
- Prefer confirmations for async event-style tests that are not naturally awaitable.
|
|
13
|
+
|
|
14
|
+
### Async function test example
|
|
15
|
+
|
|
16
|
+
```swift
|
|
17
|
+
import Testing
|
|
18
|
+
|
|
19
|
+
struct APIClient {
|
|
20
|
+
func fetchName() async throws -> String { "Antoine" }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@Test func fetchNameReturnsValue() async throws {
|
|
24
|
+
let client = APIClient()
|
|
25
|
+
let value = try await client.fetchName()
|
|
26
|
+
#expect(value == "Antoine")
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Callback bridging
|
|
31
|
+
|
|
32
|
+
- For completion-handler APIs without async overloads, bridge with:
|
|
33
|
+
- `withCheckedContinuation`
|
|
34
|
+
- `withCheckedThrowingContinuation`
|
|
35
|
+
- Keep continuation wrappers minimal and test-focused.
|
|
36
|
+
|
|
37
|
+
### Completion-handler to async bridge
|
|
38
|
+
|
|
39
|
+
```swift
|
|
40
|
+
import Testing
|
|
41
|
+
|
|
42
|
+
func legacyLoad(_ completion: @escaping (Result<Int, Error>) -> Void) {
|
|
43
|
+
completion(.success(42))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@Test func legacyAPI() async throws {
|
|
47
|
+
let value = try await withCheckedThrowingContinuation { continuation in
|
|
48
|
+
legacyLoad { result in
|
|
49
|
+
continuation.resume(with: result)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
#expect(value == 42)
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Confirmations for asynchronous events
|
|
57
|
+
|
|
58
|
+
- Use confirmations when validating event delivery/count semantics that do not map cleanly to direct `await`.
|
|
59
|
+
- Set expected counts explicitly:
|
|
60
|
+
- exact count for strict validation
|
|
61
|
+
- lower-bounded range for at-least semantics
|
|
62
|
+
- Keep confirmation scope small and ensure confirmations happen before the confirmation block returns.
|
|
63
|
+
|
|
64
|
+
### Confirmation example
|
|
65
|
+
|
|
66
|
+
```swift
|
|
67
|
+
import Testing
|
|
68
|
+
|
|
69
|
+
@Test func eventIsPublishedTwice() async {
|
|
70
|
+
await confirmation("Publishes two events", expectedCount: 2) { confirm in
|
|
71
|
+
confirm()
|
|
72
|
+
confirm()
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Event handlers and multi-fire callbacks
|
|
78
|
+
|
|
79
|
+
- Avoid unsafe mutable shared counters from callback closures in strict concurrency mode.
|
|
80
|
+
- Use isolation-safe patterns (actor state, AsyncSequence wrappers, or thread-safe containers).
|
|
81
|
+
- Verify callback counts and ordering explicitly when behavior depends on it.
|
|
82
|
+
|
|
83
|
+
### Actor-isolated counting pattern
|
|
84
|
+
|
|
85
|
+
```swift
|
|
86
|
+
import Testing
|
|
87
|
+
|
|
88
|
+
actor EventCounter {
|
|
89
|
+
private(set) var count = 0
|
|
90
|
+
func increment() { count += 1 }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@Test func countEventsSafely() async {
|
|
94
|
+
let counter = EventCounter()
|
|
95
|
+
await counter.increment()
|
|
96
|
+
await counter.increment()
|
|
97
|
+
#expect(await counter.count == 2)
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Avoid legacy waiting anti-patterns
|
|
102
|
+
|
|
103
|
+
- Do not return from test before async callback work completes.
|
|
104
|
+
- Avoid sleeping/time-based waits as primary synchronization.
|
|
105
|
+
- Replace brittle waiting with awaitable conditions and deterministic synchronization points.
|
|
106
|
+
|
|
107
|
+
```swift
|
|
108
|
+
// Avoid this pattern:
|
|
109
|
+
// try await Task.sleep(nanoseconds: 500_000_000)
|
|
110
|
+
// #expect(flag == true)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Actor isolation in tests
|
|
114
|
+
|
|
115
|
+
- Isolate tests to a global actor (e.g. `@MainActor`) only when behavior truly requires it.
|
|
116
|
+
- Keep non-UI tests off main actor to preserve realistic concurrency behavior.
|
|
117
|
+
|
|
118
|
+
### Main-actor test only when required
|
|
119
|
+
|
|
120
|
+
```swift
|
|
121
|
+
import Testing
|
|
122
|
+
|
|
123
|
+
@MainActor
|
|
124
|
+
@Test func uiModelMutation() {
|
|
125
|
+
#expect(true)
|
|
126
|
+
}
|
|
127
|
+
```
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Expectations
|
|
2
|
+
|
|
3
|
+
## When to use this reference
|
|
4
|
+
|
|
5
|
+
Use this file when writing assertions, migrating from `XCTAssert*`, testing thrown errors, or documenting known failures.
|
|
6
|
+
|
|
7
|
+
## `#expect` as the default
|
|
8
|
+
|
|
9
|
+
- Use `#expect` for most assertions.
|
|
10
|
+
- Pass natural Swift expressions (`==`, `>`, `.contains`, `.isEmpty`, etc.).
|
|
11
|
+
- Rely on captured sub-expression values for rich diagnostics in Xcode.
|
|
12
|
+
- Avoid old XCTest assertion families in Swift Testing tests.
|
|
13
|
+
|
|
14
|
+
### Example: expressive assertions
|
|
15
|
+
|
|
16
|
+
```swift
|
|
17
|
+
import Testing
|
|
18
|
+
|
|
19
|
+
@Test func pricingRules() {
|
|
20
|
+
let subtotal = 25
|
|
21
|
+
let discount = 5
|
|
22
|
+
let total = subtotal - discount
|
|
23
|
+
|
|
24
|
+
#expect(total == 20)
|
|
25
|
+
#expect(total > 0)
|
|
26
|
+
#expect([10, 20, 30].contains(total))
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## `#require` for prerequisites
|
|
31
|
+
|
|
32
|
+
- Use `try #require(...)` when later assertions depend on this condition.
|
|
33
|
+
- Treat `#require` as "guard + fail test early".
|
|
34
|
+
- Use return value to unwrap optionals safely and reduce noisy optional chaining.
|
|
35
|
+
- Prefer this pattern over manual optional checks when failure should halt test flow.
|
|
36
|
+
|
|
37
|
+
### Example: optional precondition + unwrapped usage
|
|
38
|
+
|
|
39
|
+
```swift
|
|
40
|
+
import Testing
|
|
41
|
+
|
|
42
|
+
@Test func parsedURLHasHTTPS() throws {
|
|
43
|
+
let value = "https://www.avanderlee.com"
|
|
44
|
+
let url = try #require(URL(string: value), "URL should parse")
|
|
45
|
+
#expect(url.scheme == "https")
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Throwing behavior checks
|
|
50
|
+
|
|
51
|
+
- For success-path calls to throwing functions, call directly and assert returned value.
|
|
52
|
+
- For expected failure, use throw-aware expectations to verify:
|
|
53
|
+
- any throw
|
|
54
|
+
- specific error type
|
|
55
|
+
- specific error case/value
|
|
56
|
+
- Avoid verbose hand-written `do/catch` unless custom branching is truly needed.
|
|
57
|
+
|
|
58
|
+
### Example: expected throw and no-throw
|
|
59
|
+
|
|
60
|
+
```swift
|
|
61
|
+
import Testing
|
|
62
|
+
|
|
63
|
+
enum BrewError: Error, Equatable {
|
|
64
|
+
case missingBeans
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
func brew(_ hasBeans: Bool) throws -> String {
|
|
68
|
+
guard hasBeans else { throw BrewError.missingBeans }
|
|
69
|
+
return "coffee"
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@Test func expectedThrows() {
|
|
73
|
+
#expect(throws: BrewError.self) {
|
|
74
|
+
try brew(false)
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@Test func expectedNoThrow() {
|
|
79
|
+
#expect(throws: Never.self) {
|
|
80
|
+
try brew(true)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Known issue handling
|
|
86
|
+
|
|
87
|
+
- Use `withKnownIssue` for temporary expected failures you still want to compile/run.
|
|
88
|
+
- Prefer `withKnownIssue` over blanket disabling when you need ongoing visibility.
|
|
89
|
+
- Remove known-issue wrappers once failure condition is fixed.
|
|
90
|
+
|
|
91
|
+
### Example: scope only failing section
|
|
92
|
+
|
|
93
|
+
```swift
|
|
94
|
+
import Testing
|
|
95
|
+
|
|
96
|
+
@Test func checkoutFlow() {
|
|
97
|
+
#expect(true) // still validated
|
|
98
|
+
|
|
99
|
+
withKnownIssue("Checkout backend intermittently returns 503", isIntermittent: true) {
|
|
100
|
+
Issue.record("Known upstream issue")
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
#expect(2 + 2 == 4) // rest of test still executes
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Readability upgrade
|
|
108
|
+
|
|
109
|
+
- Conform complex domain types to `CustomTestStringConvertible` for concise test output.
|
|
110
|
+
- Keep production `CustomStringConvertible` separate from test-specific descriptions when needed.
|
|
111
|
+
|
|
112
|
+
### Example: clean diagnostic descriptions
|
|
113
|
+
|
|
114
|
+
```swift
|
|
115
|
+
import Testing
|
|
116
|
+
|
|
117
|
+
struct Receipt: CustomTestStringConvertible {
|
|
118
|
+
let id: UUID
|
|
119
|
+
let total: Decimal
|
|
120
|
+
|
|
121
|
+
var testDescription: String {
|
|
122
|
+
"Receipt(total: \(total))"
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## XCTest mapping quick examples
|
|
128
|
+
|
|
129
|
+
```swift
|
|
130
|
+
// XCTAssertEqual(total, 20)
|
|
131
|
+
#expect(total == 20)
|
|
132
|
+
|
|
133
|
+
// try XCTUnwrap(user)
|
|
134
|
+
let user = try #require(user)
|
|
135
|
+
|
|
136
|
+
// XCTFail("Unreachable")
|
|
137
|
+
Issue.record("Unreachable")
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Do / Don't
|
|
141
|
+
|
|
142
|
+
- Do use `#require` when later checks depend on a value.
|
|
143
|
+
- Do keep `withKnownIssue` scopes narrow.
|
|
144
|
+
- Don't use XCTest assertions in Swift Testing tests.
|
|
145
|
+
- Don't hide prerequisite failures inside later optional chaining.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Fundamentals
|
|
2
|
+
|
|
3
|
+
## When to use this reference
|
|
4
|
+
|
|
5
|
+
Use this file when creating new Swift Testing suites or refactoring test structure before deeper topics like traits, parameterization, or migration.
|
|
6
|
+
|
|
7
|
+
## Building blocks
|
|
8
|
+
|
|
9
|
+
- Import `Testing` only in test targets.
|
|
10
|
+
- Use `@Test` to declare tests explicitly (global function or type method).
|
|
11
|
+
- Use suites (`struct`, `actor`, or `class`) to group related tests.
|
|
12
|
+
- Prefer `struct` suites for value semantics and accidental-state-sharing prevention.
|
|
13
|
+
- Use `@Suite` when adding suite-level traits or display names.
|
|
14
|
+
- Use nested suites to reflect feature grouping and improve discoverability.
|
|
15
|
+
|
|
16
|
+
## Core examples
|
|
17
|
+
|
|
18
|
+
### Global test function
|
|
19
|
+
|
|
20
|
+
```swift
|
|
21
|
+
import Testing
|
|
22
|
+
@testable import FoodTruck
|
|
23
|
+
|
|
24
|
+
@Test("Food truck has a valid default name")
|
|
25
|
+
func defaultName() {
|
|
26
|
+
let truck = FoodTruck()
|
|
27
|
+
#expect(truck.name.isEmpty == false)
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Suite with instance tests
|
|
32
|
+
|
|
33
|
+
```swift
|
|
34
|
+
import Testing
|
|
35
|
+
@testable import FoodTruck
|
|
36
|
+
|
|
37
|
+
@Suite("Menu tests")
|
|
38
|
+
struct MenuTests {
|
|
39
|
+
@Test("Returns no duplicates")
|
|
40
|
+
func uniqueItems() {
|
|
41
|
+
let items = Menu.default.items
|
|
42
|
+
#expect(Set(items).count == items.count)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Nested suites for feature grouping
|
|
48
|
+
|
|
49
|
+
```swift
|
|
50
|
+
import Testing
|
|
51
|
+
@testable import FoodTruck
|
|
52
|
+
|
|
53
|
+
struct CheckoutTests {
|
|
54
|
+
struct Taxes {
|
|
55
|
+
@Test func taxIsRoundedToTwoDigits() {
|
|
56
|
+
let total = Checkout.total(subtotal: 10.00, taxRate: 0.0825)
|
|
57
|
+
#expect(total == 10.83)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
struct Discounts {
|
|
62
|
+
@Test func promoCodeAppliesFixedAmount() {
|
|
63
|
+
let total = Checkout.total(subtotal: 20.00, discount: .fixed(5))
|
|
64
|
+
#expect(total == 15.00)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Recommended defaults
|
|
71
|
+
|
|
72
|
+
- Keep tests small and behavior-focused.
|
|
73
|
+
- Prefer descriptive names over boilerplate `test...` prefixes.
|
|
74
|
+
- Use display names where human-readable output helps triage.
|
|
75
|
+
- Keep setup local, or centralize in suite init when shared across tests.
|
|
76
|
+
- Avoid hidden global mutable state.
|
|
77
|
+
- Use `@MainActor` only when code under test requires main-thread isolation.
|
|
78
|
+
- Use `@available` on test functions when needed for platform/language gating.
|
|
79
|
+
|
|
80
|
+
## Organization guidance
|
|
81
|
+
|
|
82
|
+
- Group by feature behavior, not by implementation class only.
|
|
83
|
+
- Promote shared traits (e.g. tags) to suite level when all tests inherit them.
|
|
84
|
+
- Use tags for cross-cutting grouping across files/targets.
|
|
85
|
+
- Keep unrelated tests in separate suites to preserve clear ownership.
|
|
86
|
+
|
|
87
|
+
## Suite constraints to enforce
|
|
88
|
+
|
|
89
|
+
- If a suite has instance test methods, it must have a callable zero-argument initializer (implicit or explicit, sync/async, throwing or non-throwing).
|
|
90
|
+
- If initialization requirements cannot be met, convert tests to static/global functions or refactor suite state.
|
|
91
|
+
- Suite types (and containing types) must always be available; do not apply `@available` to suite declarations.
|
|
92
|
+
|
|
93
|
+
### Zero-argument initializer requirement example
|
|
94
|
+
|
|
95
|
+
```swift
|
|
96
|
+
import Testing
|
|
97
|
+
|
|
98
|
+
@Suite
|
|
99
|
+
struct SessionTests {
|
|
100
|
+
let config: URLSessionConfiguration
|
|
101
|
+
|
|
102
|
+
// Valid: callable with zero args due to default value.
|
|
103
|
+
init(config: URLSessionConfiguration = .ephemeral) {
|
|
104
|
+
self.config = config
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
@Test func usesEphemeralByDefault() {
|
|
108
|
+
#expect(config == .ephemeral)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Invalid availability placement
|
|
114
|
+
|
|
115
|
+
```swift
|
|
116
|
+
import Testing
|
|
117
|
+
|
|
118
|
+
// Do not do this on suite types:
|
|
119
|
+
// @available(iOS 18, *)
|
|
120
|
+
@Suite
|
|
121
|
+
struct PushTests {
|
|
122
|
+
@available(iOS 18, *)
|
|
123
|
+
@Test func supportsNewPushFormat() {
|
|
124
|
+
#expect(true)
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Do / Don't
|
|
130
|
+
|
|
131
|
+
- Do keep each test focused on one behavior.
|
|
132
|
+
- Do use display names where they improve failure readability.
|
|
133
|
+
- Don't rely on test execution order.
|
|
134
|
+
- Don't annotate suites with `@available`; annotate test functions instead.
|
|
135
|
+
|
|
136
|
+
## Review checklist
|
|
137
|
+
|
|
138
|
+
- Test target imports `Testing`, app targets do not.
|
|
139
|
+
- Suite choice (`struct`/`actor`/`class`) matches setup and teardown needs.
|
|
140
|
+
- Instance tests have a callable zero-argument init path.
|
|
141
|
+
- Availability is applied to test functions, not suite types.
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Migration from XCTest
|
|
2
|
+
|
|
3
|
+
## When to use this reference
|
|
4
|
+
|
|
5
|
+
Use this file for incremental migration of existing XCTest code to Swift Testing while preserving safety and CI signal.
|
|
6
|
+
|
|
7
|
+
## Coexistence strategy
|
|
8
|
+
|
|
9
|
+
- Swift Testing and XCTest can coexist in the same target.
|
|
10
|
+
- Migrate incrementally; do not block migration on full rewrite.
|
|
11
|
+
- A single source file can import both `XCTest` and `Testing` during migration.
|
|
12
|
+
- Keep XCTest where Swift Testing does not apply:
|
|
13
|
+
- UI automation (`XCUIApplication`)
|
|
14
|
+
- performance APIs (`XCTMetric`)
|
|
15
|
+
- Objective-C-only tests
|
|
16
|
+
|
|
17
|
+
### Mixed import file example
|
|
18
|
+
|
|
19
|
+
```swift
|
|
20
|
+
import XCTest
|
|
21
|
+
import Testing
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Practical migration order
|
|
25
|
+
|
|
26
|
+
1. Convert assertions to `#expect` / `#require`.
|
|
27
|
+
2. Replace `test...` naming constraints with explicit `@Test`.
|
|
28
|
+
3. Reorganize classes into suites where helpful.
|
|
29
|
+
4. Collapse repetitive methods into parameterized tests.
|
|
30
|
+
5. Add traits/tags for control and test-plan filtering.
|
|
31
|
+
|
|
32
|
+
## Example conversion: class method -> Swift Testing function
|
|
33
|
+
|
|
34
|
+
```swift
|
|
35
|
+
// Before (XCTest)
|
|
36
|
+
final class PriceTests: XCTestCase {
|
|
37
|
+
func testDiscountedTotal() {
|
|
38
|
+
XCTAssertEqual(Price.total(subtotal: 20, discount: 5), 15)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// After (Swift Testing)
|
|
43
|
+
import Testing
|
|
44
|
+
|
|
45
|
+
@Test func discountedTotal() {
|
|
46
|
+
#expect(Price.total(subtotal: 20, discount: 5) == 15)
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Assertion mapping highlights
|
|
51
|
+
|
|
52
|
+
- Most `XCTAssert*` variants -> `#expect(...)`.
|
|
53
|
+
- Optional unwrap checks -> `try #require(optionalValue)`.
|
|
54
|
+
- Early-stop semantics -> `#require` instead of global `continueAfterFailure = false`.
|
|
55
|
+
- `XCTFail("...")` -> `Issue.record("...")`.
|
|
56
|
+
|
|
57
|
+
### Table-style quick mappings
|
|
58
|
+
|
|
59
|
+
```swift
|
|
60
|
+
// XCTAssertTrue(isEnabled)
|
|
61
|
+
#expect(isEnabled)
|
|
62
|
+
|
|
63
|
+
// XCTAssertNil(error)
|
|
64
|
+
#expect(error == nil)
|
|
65
|
+
|
|
66
|
+
// XCTAssertThrowsError(try run())
|
|
67
|
+
#expect(throws: (any Error).self) { try run() }
|
|
68
|
+
|
|
69
|
+
// try XCTUnwrap(user)
|
|
70
|
+
let user = try #require(user)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Suite model differences
|
|
74
|
+
|
|
75
|
+
- XCTest: class + `XCTestCase`.
|
|
76
|
+
- Swift Testing: struct/actor/class suites, explicit attributes, value-semantics-friendly defaults.
|
|
77
|
+
- Setup can move from `setUp` patterns to suite init when appropriate.
|
|
78
|
+
- Teardown can move to `deinit` when using class/actor suites.
|
|
79
|
+
- XCTest sync tests default to main actor behavior; Swift Testing runs tests on arbitrary tasks unless explicitly isolated (e.g. `@MainActor`).
|
|
80
|
+
|
|
81
|
+
### Setup migration example
|
|
82
|
+
|
|
83
|
+
```swift
|
|
84
|
+
import Testing
|
|
85
|
+
|
|
86
|
+
struct SessionTests {
|
|
87
|
+
let session: Session
|
|
88
|
+
|
|
89
|
+
init() {
|
|
90
|
+
self.session = Session(environment: .test)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@Test func startsDisconnected() {
|
|
94
|
+
#expect(session.isConnected == false)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Async migration specifics
|
|
100
|
+
|
|
101
|
+
- Prefer `await` directly for async APIs.
|
|
102
|
+
- Convert completion-handler APIs with `withCheckedContinuation`/`withCheckedThrowingContinuation`.
|
|
103
|
+
- Replace `XCTestExpectation` patterns with confirmations when testing asynchronous event streams.
|
|
104
|
+
|
|
105
|
+
### Expectation-style flow -> confirmation
|
|
106
|
+
|
|
107
|
+
```swift
|
|
108
|
+
import Testing
|
|
109
|
+
|
|
110
|
+
@Test func receivesAtLeastOneEvent() async {
|
|
111
|
+
await confirmation("Receives event", expectedCount: 1...) { confirm in
|
|
112
|
+
confirm()
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Migration hygiene
|
|
118
|
+
|
|
119
|
+
- Prefer mechanical, reviewable commits.
|
|
120
|
+
- Use editor pattern-replace to accelerate common assertion conversions.
|
|
121
|
+
- Avoid mixing XCTest assertions in Swift Testing tests (and vice versa).
|
|
122
|
+
|
|
123
|
+
## Common pitfalls
|
|
124
|
+
|
|
125
|
+
- Migrating all files at once instead of phased migration.
|
|
126
|
+
- Keeping `continueAfterFailure` patterns instead of targeted `#require`.
|
|
127
|
+
- Marking every migrated test `@MainActor` unnecessarily.
|