@wazir-dev/cli 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/AGENTS.md +111 -0
- package/CHANGELOG.md +14 -0
- package/CONTRIBUTING.md +101 -0
- package/LICENSE +21 -0
- package/README.md +314 -0
- package/assets/composition-engine.mmd +34 -0
- package/assets/demo-script.sh +17 -0
- package/assets/logo-dark.svg +14 -0
- package/assets/logo.svg +14 -0
- package/assets/pipeline.mmd +39 -0
- package/assets/record-demo.sh +51 -0
- package/docs/README.md +51 -0
- package/docs/adapters/context-mode.md +60 -0
- package/docs/concepts/architecture.md +87 -0
- package/docs/concepts/artifact-model.md +60 -0
- package/docs/concepts/composition-engine.md +36 -0
- package/docs/concepts/indexing-and-recall.md +160 -0
- package/docs/concepts/observability.md +41 -0
- package/docs/concepts/roles-and-workflows.md +59 -0
- package/docs/concepts/terminology-policy.md +27 -0
- package/docs/getting-started/01-installation.md +78 -0
- package/docs/getting-started/02-first-run.md +102 -0
- package/docs/getting-started/03-adding-to-project.md +15 -0
- package/docs/getting-started/04-host-setup.md +15 -0
- package/docs/guides/ci-integration.md +15 -0
- package/docs/guides/creating-skills.md +15 -0
- package/docs/guides/expertise-module-authoring.md +15 -0
- package/docs/guides/hook-development.md +15 -0
- package/docs/guides/memory-and-learnings.md +34 -0
- package/docs/guides/multi-host-export.md +15 -0
- package/docs/guides/troubleshooting.md +101 -0
- package/docs/guides/writing-custom-roles.md +15 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
- package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
- package/docs/readmes/INDEX.md +99 -0
- package/docs/readmes/features/expertise/README.md +171 -0
- package/docs/readmes/features/exports/README.md +222 -0
- package/docs/readmes/features/hooks/README.md +103 -0
- package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
- package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
- package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
- package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
- package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
- package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
- package/docs/readmes/features/hooks/session-start.md +119 -0
- package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
- package/docs/readmes/features/roles/README.md +157 -0
- package/docs/readmes/features/roles/clarifier.md +152 -0
- package/docs/readmes/features/roles/content-author.md +190 -0
- package/docs/readmes/features/roles/designer.md +193 -0
- package/docs/readmes/features/roles/executor.md +184 -0
- package/docs/readmes/features/roles/learner.md +210 -0
- package/docs/readmes/features/roles/planner.md +182 -0
- package/docs/readmes/features/roles/researcher.md +164 -0
- package/docs/readmes/features/roles/reviewer.md +184 -0
- package/docs/readmes/features/roles/specifier.md +162 -0
- package/docs/readmes/features/roles/verifier.md +215 -0
- package/docs/readmes/features/schemas/README.md +178 -0
- package/docs/readmes/features/skills/README.md +63 -0
- package/docs/readmes/features/skills/brainstorming.md +96 -0
- package/docs/readmes/features/skills/debugging.md +148 -0
- package/docs/readmes/features/skills/design.md +120 -0
- package/docs/readmes/features/skills/prepare-next.md +109 -0
- package/docs/readmes/features/skills/run-audit.md +159 -0
- package/docs/readmes/features/skills/scan-project.md +109 -0
- package/docs/readmes/features/skills/self-audit.md +176 -0
- package/docs/readmes/features/skills/tdd.md +137 -0
- package/docs/readmes/features/skills/using-skills.md +92 -0
- package/docs/readmes/features/skills/verification.md +120 -0
- package/docs/readmes/features/skills/writing-plans.md +104 -0
- package/docs/readmes/features/tooling/README.md +320 -0
- package/docs/readmes/features/workflows/README.md +186 -0
- package/docs/readmes/features/workflows/author.md +181 -0
- package/docs/readmes/features/workflows/clarify.md +154 -0
- package/docs/readmes/features/workflows/design-review.md +171 -0
- package/docs/readmes/features/workflows/design.md +169 -0
- package/docs/readmes/features/workflows/discover.md +162 -0
- package/docs/readmes/features/workflows/execute.md +173 -0
- package/docs/readmes/features/workflows/learn.md +167 -0
- package/docs/readmes/features/workflows/plan-review.md +165 -0
- package/docs/readmes/features/workflows/plan.md +170 -0
- package/docs/readmes/features/workflows/prepare-next.md +167 -0
- package/docs/readmes/features/workflows/review.md +169 -0
- package/docs/readmes/features/workflows/run-audit.md +191 -0
- package/docs/readmes/features/workflows/spec-challenge.md +159 -0
- package/docs/readmes/features/workflows/specify.md +160 -0
- package/docs/readmes/features/workflows/verify.md +177 -0
- package/docs/readmes/packages/README.md +50 -0
- package/docs/readmes/packages/ajv.md +117 -0
- package/docs/readmes/packages/context-mode.md +118 -0
- package/docs/readmes/packages/gray-matter.md +116 -0
- package/docs/readmes/packages/node-test.md +137 -0
- package/docs/readmes/packages/yaml.md +112 -0
- package/docs/reference/configuration-reference.md +159 -0
- package/docs/reference/expertise-index.md +52 -0
- package/docs/reference/git-flow.md +43 -0
- package/docs/reference/hooks.md +87 -0
- package/docs/reference/host-exports.md +50 -0
- package/docs/reference/launch-checklist.md +172 -0
- package/docs/reference/marketplace-listings.md +76 -0
- package/docs/reference/release-process.md +34 -0
- package/docs/reference/roles-reference.md +77 -0
- package/docs/reference/skills.md +33 -0
- package/docs/reference/templates.md +29 -0
- package/docs/reference/tooling-cli.md +94 -0
- package/docs/truth-claims.yaml +222 -0
- package/expertise/PROGRESS.md +63 -0
- package/expertise/README.md +18 -0
- package/expertise/antipatterns/PROGRESS.md +56 -0
- package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
- package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
- package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
- package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
- package/expertise/antipatterns/backend/index.md +24 -0
- package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
- package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
- package/expertise/antipatterns/code/async-antipatterns.md +622 -0
- package/expertise/antipatterns/code/code-smells.md +1186 -0
- package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
- package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
- package/expertise/antipatterns/code/index.md +27 -0
- package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
- package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
- package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
- package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
- package/expertise/antipatterns/design/dark-patterns.md +1121 -0
- package/expertise/antipatterns/design/index.md +22 -0
- package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
- package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
- package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
- package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
- package/expertise/antipatterns/frontend/index.md +23 -0
- package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
- package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
- package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
- package/expertise/antipatterns/index.md +31 -0
- package/expertise/antipatterns/performance/index.md +20 -0
- package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
- package/expertise/antipatterns/performance/premature-optimization.md +623 -0
- package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
- package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
- package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
- package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
- package/expertise/antipatterns/process/index.md +23 -0
- package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
- package/expertise/antipatterns/security/index.md +20 -0
- package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
- package/expertise/antipatterns/security/security-theater.md +843 -0
- package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
- package/expertise/architecture/PROGRESS.md +70 -0
- package/expertise/architecture/data/caching-architecture.md +671 -0
- package/expertise/architecture/data/data-consistency.md +574 -0
- package/expertise/architecture/data/data-modeling.md +536 -0
- package/expertise/architecture/data/event-streams-and-queues.md +634 -0
- package/expertise/architecture/data/index.md +25 -0
- package/expertise/architecture/data/search-architecture.md +663 -0
- package/expertise/architecture/data/sql-vs-nosql.md +708 -0
- package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
- package/expertise/architecture/decisions/build-vs-buy.md +616 -0
- package/expertise/architecture/decisions/index.md +23 -0
- package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
- package/expertise/architecture/decisions/technology-selection.md +616 -0
- package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
- package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
- package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
- package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
- package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
- package/expertise/architecture/distributed/index.md +25 -0
- package/expertise/architecture/distributed/saga-pattern.md +797 -0
- package/expertise/architecture/foundations/architectural-thinking.md +460 -0
- package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
- package/expertise/architecture/foundations/design-principles-solid.md +649 -0
- package/expertise/architecture/foundations/domain-driven-design.md +719 -0
- package/expertise/architecture/foundations/index.md +25 -0
- package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
- package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
- package/expertise/architecture/index.md +34 -0
- package/expertise/architecture/integration/api-design-graphql.md +638 -0
- package/expertise/architecture/integration/api-design-grpc.md +804 -0
- package/expertise/architecture/integration/api-design-rest.md +892 -0
- package/expertise/architecture/integration/index.md +25 -0
- package/expertise/architecture/integration/third-party-integration.md +795 -0
- package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
- package/expertise/architecture/integration/websockets-realtime.md +791 -0
- package/expertise/architecture/mobile-architecture/index.md +22 -0
- package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
- package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
- package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
- package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
- package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
- package/expertise/architecture/patterns/event-driven.md +797 -0
- package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
- package/expertise/architecture/patterns/index.md +27 -0
- package/expertise/architecture/patterns/layered-architecture.md +736 -0
- package/expertise/architecture/patterns/microservices.md +753 -0
- package/expertise/architecture/patterns/modular-monolith.md +692 -0
- package/expertise/architecture/patterns/monolith.md +626 -0
- package/expertise/architecture/patterns/plugin-architecture.md +735 -0
- package/expertise/architecture/patterns/serverless.md +780 -0
- package/expertise/architecture/scaling/database-scaling.md +615 -0
- package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
- package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
- package/expertise/architecture/scaling/index.md +24 -0
- package/expertise/architecture/scaling/multi-tenancy.md +800 -0
- package/expertise/architecture/scaling/stateless-design.md +787 -0
- package/expertise/backend/embedded-firmware.md +625 -0
- package/expertise/backend/go.md +853 -0
- package/expertise/backend/index.md +24 -0
- package/expertise/backend/java-spring.md +448 -0
- package/expertise/backend/node-typescript.md +625 -0
- package/expertise/backend/python-fastapi.md +724 -0
- package/expertise/backend/rust.md +458 -0
- package/expertise/backend/solidity.md +711 -0
- package/expertise/composition-map.yaml +443 -0
- package/expertise/content/foundations/content-modeling.md +395 -0
- package/expertise/content/foundations/editorial-standards.md +449 -0
- package/expertise/content/foundations/index.md +24 -0
- package/expertise/content/foundations/microcopy.md +455 -0
- package/expertise/content/foundations/terminology-governance.md +509 -0
- package/expertise/content/index.md +34 -0
- package/expertise/content/patterns/accessibility-copy.md +518 -0
- package/expertise/content/patterns/index.md +24 -0
- package/expertise/content/patterns/notification-content.md +433 -0
- package/expertise/content/patterns/sample-content.md +486 -0
- package/expertise/content/patterns/state-copy.md +439 -0
- package/expertise/design/PROGRESS.md +58 -0
- package/expertise/design/disciplines/dark-mode-theming.md +577 -0
- package/expertise/design/disciplines/design-systems.md +595 -0
- package/expertise/design/disciplines/index.md +25 -0
- package/expertise/design/disciplines/information-architecture.md +800 -0
- package/expertise/design/disciplines/interaction-design.md +788 -0
- package/expertise/design/disciplines/responsive-design.md +552 -0
- package/expertise/design/disciplines/usability-testing.md +516 -0
- package/expertise/design/disciplines/user-research.md +792 -0
- package/expertise/design/foundations/accessibility-design.md +796 -0
- package/expertise/design/foundations/color-theory.md +797 -0
- package/expertise/design/foundations/iconography.md +795 -0
- package/expertise/design/foundations/index.md +26 -0
- package/expertise/design/foundations/motion-and-animation.md +653 -0
- package/expertise/design/foundations/rtl-design.md +585 -0
- package/expertise/design/foundations/spacing-and-layout.md +607 -0
- package/expertise/design/foundations/typography.md +800 -0
- package/expertise/design/foundations/visual-hierarchy.md +761 -0
- package/expertise/design/index.md +32 -0
- package/expertise/design/patterns/authentication-flows.md +474 -0
- package/expertise/design/patterns/content-consumption.md +789 -0
- package/expertise/design/patterns/data-display.md +618 -0
- package/expertise/design/patterns/e-commerce.md +1494 -0
- package/expertise/design/patterns/feedback-and-states.md +642 -0
- package/expertise/design/patterns/forms-and-input.md +819 -0
- package/expertise/design/patterns/gamification.md +801 -0
- package/expertise/design/patterns/index.md +31 -0
- package/expertise/design/patterns/microinteractions.md +449 -0
- package/expertise/design/patterns/navigation.md +800 -0
- package/expertise/design/patterns/notifications.md +705 -0
- package/expertise/design/patterns/onboarding.md +700 -0
- package/expertise/design/patterns/search-and-filter.md +601 -0
- package/expertise/design/patterns/settings-and-preferences.md +768 -0
- package/expertise/design/patterns/social-and-community.md +748 -0
- package/expertise/design/platforms/desktop-native.md +612 -0
- package/expertise/design/platforms/index.md +25 -0
- package/expertise/design/platforms/mobile-android.md +825 -0
- package/expertise/design/platforms/mobile-cross-platform.md +983 -0
- package/expertise/design/platforms/mobile-ios.md +699 -0
- package/expertise/design/platforms/tablet.md +794 -0
- package/expertise/design/platforms/web-dashboard.md +790 -0
- package/expertise/design/platforms/web-responsive.md +550 -0
- package/expertise/design/psychology/behavioral-nudges.md +449 -0
- package/expertise/design/psychology/cognitive-load.md +1191 -0
- package/expertise/design/psychology/error-psychology.md +778 -0
- package/expertise/design/psychology/index.md +22 -0
- package/expertise/design/psychology/persuasive-design.md +736 -0
- package/expertise/design/psychology/user-mental-models.md +623 -0
- package/expertise/design/tooling/open-pencil.md +266 -0
- package/expertise/frontend/angular.md +1073 -0
- package/expertise/frontend/desktop-electron.md +546 -0
- package/expertise/frontend/flutter.md +782 -0
- package/expertise/frontend/index.md +27 -0
- package/expertise/frontend/native-android.md +409 -0
- package/expertise/frontend/native-ios.md +490 -0
- package/expertise/frontend/react-native.md +1160 -0
- package/expertise/frontend/react.md +808 -0
- package/expertise/frontend/vue.md +1089 -0
- package/expertise/humanize/domain-rules-code.md +79 -0
- package/expertise/humanize/domain-rules-content.md +67 -0
- package/expertise/humanize/domain-rules-technical-docs.md +56 -0
- package/expertise/humanize/index.md +35 -0
- package/expertise/humanize/self-audit-checklist.md +87 -0
- package/expertise/humanize/sentence-patterns.md +218 -0
- package/expertise/humanize/vocabulary-blacklist.md +105 -0
- package/expertise/i18n/PROGRESS.md +65 -0
- package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
- package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
- package/expertise/i18n/advanced/complex-scripts.md +30 -0
- package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
- package/expertise/i18n/advanced/testing-i18n.md +28 -0
- package/expertise/i18n/content/content-adaptation.md +23 -0
- package/expertise/i18n/content/locale-specific-formatting.md +23 -0
- package/expertise/i18n/content/machine-translation-integration.md +28 -0
- package/expertise/i18n/content/translation-management.md +29 -0
- package/expertise/i18n/foundations/date-time-calendars.md +67 -0
- package/expertise/i18n/foundations/i18n-architecture.md +272 -0
- package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
- package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
- package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
- package/expertise/i18n/foundations/string-externalization.md +236 -0
- package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
- package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
- package/expertise/i18n/index.md +38 -0
- package/expertise/i18n/platform/backend-i18n.md +31 -0
- package/expertise/i18n/platform/flutter-i18n.md +148 -0
- package/expertise/i18n/platform/native-android-i18n.md +36 -0
- package/expertise/i18n/platform/native-ios-i18n.md +36 -0
- package/expertise/i18n/platform/react-i18n.md +103 -0
- package/expertise/i18n/platform/web-css-i18n.md +81 -0
- package/expertise/i18n/rtl/arabic-specific.md +175 -0
- package/expertise/i18n/rtl/hebrew-specific.md +149 -0
- package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
- package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
- package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
- package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
- package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
- package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
- package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
- package/expertise/i18n/rtl/rtl-typography.md +160 -0
- package/expertise/index.md +113 -0
- package/expertise/index.yaml +216 -0
- package/expertise/infrastructure/cloud-aws.md +597 -0
- package/expertise/infrastructure/cloud-gcp.md +599 -0
- package/expertise/infrastructure/cybersecurity.md +816 -0
- package/expertise/infrastructure/database-mongodb.md +447 -0
- package/expertise/infrastructure/database-postgres.md +400 -0
- package/expertise/infrastructure/devops-cicd.md +787 -0
- package/expertise/infrastructure/index.md +27 -0
- package/expertise/performance/PROGRESS.md +50 -0
- package/expertise/performance/backend/api-latency.md +1204 -0
- package/expertise/performance/backend/background-jobs.md +506 -0
- package/expertise/performance/backend/connection-pooling.md +1209 -0
- package/expertise/performance/backend/database-query-optimization.md +515 -0
- package/expertise/performance/backend/index.md +23 -0
- package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
- package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
- package/expertise/performance/foundations/caching-strategies.md +489 -0
- package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
- package/expertise/performance/foundations/index.md +24 -0
- package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
- package/expertise/performance/foundations/memory-management.md +964 -0
- package/expertise/performance/foundations/performance-budgets.md +1314 -0
- package/expertise/performance/index.md +31 -0
- package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
- package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
- package/expertise/performance/infrastructure/index.md +22 -0
- package/expertise/performance/infrastructure/load-balancing.md +1081 -0
- package/expertise/performance/infrastructure/observability.md +1079 -0
- package/expertise/performance/mobile/index.md +23 -0
- package/expertise/performance/mobile/mobile-animations.md +544 -0
- package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
- package/expertise/performance/mobile/mobile-network.md +452 -0
- package/expertise/performance/mobile/mobile-rendering.md +599 -0
- package/expertise/performance/mobile/mobile-startup-time.md +505 -0
- package/expertise/performance/platform-specific/flutter-performance.md +647 -0
- package/expertise/performance/platform-specific/index.md +22 -0
- package/expertise/performance/platform-specific/node-performance.md +1307 -0
- package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
- package/expertise/performance/platform-specific/react-performance.md +1403 -0
- package/expertise/performance/web/bundle-optimization.md +1239 -0
- package/expertise/performance/web/image-and-media.md +636 -0
- package/expertise/performance/web/index.md +24 -0
- package/expertise/performance/web/network-optimization.md +1133 -0
- package/expertise/performance/web/rendering-performance.md +1098 -0
- package/expertise/performance/web/ssr-and-hydration.md +918 -0
- package/expertise/performance/web/web-vitals.md +1374 -0
- package/expertise/quality/accessibility.md +985 -0
- package/expertise/quality/evidence-based-verification.md +499 -0
- package/expertise/quality/index.md +24 -0
- package/expertise/quality/ml-model-audit.md +614 -0
- package/expertise/quality/performance.md +600 -0
- package/expertise/quality/testing-api.md +891 -0
- package/expertise/quality/testing-mobile.md +496 -0
- package/expertise/quality/testing-web.md +849 -0
- package/expertise/security/PROGRESS.md +54 -0
- package/expertise/security/agentic-identity.md +540 -0
- package/expertise/security/compliance-frameworks.md +601 -0
- package/expertise/security/data/data-encryption.md +364 -0
- package/expertise/security/data/data-privacy-gdpr.md +692 -0
- package/expertise/security/data/database-security.md +1171 -0
- package/expertise/security/data/index.md +22 -0
- package/expertise/security/data/pii-handling.md +531 -0
- package/expertise/security/foundations/authentication.md +1041 -0
- package/expertise/security/foundations/authorization.md +603 -0
- package/expertise/security/foundations/cryptography.md +1001 -0
- package/expertise/security/foundations/index.md +25 -0
- package/expertise/security/foundations/owasp-top-10.md +1354 -0
- package/expertise/security/foundations/secrets-management.md +1217 -0
- package/expertise/security/foundations/secure-sdlc.md +700 -0
- package/expertise/security/foundations/supply-chain-security.md +698 -0
- package/expertise/security/index.md +31 -0
- package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
- package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
- package/expertise/security/infrastructure/container-security.md +721 -0
- package/expertise/security/infrastructure/incident-response.md +1295 -0
- package/expertise/security/infrastructure/index.md +24 -0
- package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
- package/expertise/security/infrastructure/network-security.md +1337 -0
- package/expertise/security/mobile/index.md +23 -0
- package/expertise/security/mobile/mobile-android-security.md +1218 -0
- package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
- package/expertise/security/mobile/mobile-data-storage.md +1265 -0
- package/expertise/security/mobile/mobile-ios-security.md +1401 -0
- package/expertise/security/mobile/mobile-network-security.md +1520 -0
- package/expertise/security/smart-contract-security.md +594 -0
- package/expertise/security/testing/index.md +22 -0
- package/expertise/security/testing/penetration-testing.md +1258 -0
- package/expertise/security/testing/security-code-review.md +1765 -0
- package/expertise/security/testing/threat-modeling.md +1074 -0
- package/expertise/security/testing/vulnerability-scanning.md +1062 -0
- package/expertise/security/web/api-security.md +586 -0
- package/expertise/security/web/cors-and-headers.md +433 -0
- package/expertise/security/web/csrf.md +562 -0
- package/expertise/security/web/file-upload.md +1477 -0
- package/expertise/security/web/index.md +25 -0
- package/expertise/security/web/injection.md +1375 -0
- package/expertise/security/web/session-management.md +1101 -0
- package/expertise/security/web/xss.md +1158 -0
- package/exports/README.md +17 -0
- package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
- package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
- package/exports/hosts/claude/.claude/agents/designer.md +55 -0
- package/exports/hosts/claude/.claude/agents/executor.md +55 -0
- package/exports/hosts/claude/.claude/agents/learner.md +51 -0
- package/exports/hosts/claude/.claude/agents/planner.md +53 -0
- package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
- package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
- package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
- package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
- package/exports/hosts/claude/.claude/commands/author.md +42 -0
- package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
- package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
- package/exports/hosts/claude/.claude/commands/design.md +44 -0
- package/exports/hosts/claude/.claude/commands/discover.md +37 -0
- package/exports/hosts/claude/.claude/commands/execute.md +48 -0
- package/exports/hosts/claude/.claude/commands/learn.md +38 -0
- package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
- package/exports/hosts/claude/.claude/commands/plan.md +39 -0
- package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
- package/exports/hosts/claude/.claude/commands/review.md +40 -0
- package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
- package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
- package/exports/hosts/claude/.claude/commands/specify.md +38 -0
- package/exports/hosts/claude/.claude/commands/verify.md +37 -0
- package/exports/hosts/claude/.claude/settings.json +34 -0
- package/exports/hosts/claude/CLAUDE.md +19 -0
- package/exports/hosts/claude/export.manifest.json +38 -0
- package/exports/hosts/claude/host-package.json +67 -0
- package/exports/hosts/codex/AGENTS.md +19 -0
- package/exports/hosts/codex/export.manifest.json +38 -0
- package/exports/hosts/codex/host-package.json +41 -0
- package/exports/hosts/cursor/.cursor/hooks.json +16 -0
- package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
- package/exports/hosts/cursor/export.manifest.json +38 -0
- package/exports/hosts/cursor/host-package.json +42 -0
- package/exports/hosts/gemini/GEMINI.md +19 -0
- package/exports/hosts/gemini/export.manifest.json +38 -0
- package/exports/hosts/gemini/host-package.json +41 -0
- package/hooks/README.md +18 -0
- package/hooks/definitions/loop_cap_guard.yaml +21 -0
- package/hooks/definitions/post_tool_capture.yaml +24 -0
- package/hooks/definitions/pre_compact_summary.yaml +19 -0
- package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
- package/hooks/definitions/protected_path_write_guard.yaml +19 -0
- package/hooks/definitions/session_start.yaml +19 -0
- package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
- package/hooks/loop-cap-guard +17 -0
- package/hooks/post-tool-lint +36 -0
- package/hooks/protected-path-write-guard +17 -0
- package/hooks/session-start +41 -0
- package/llms-full.txt +2355 -0
- package/llms.txt +43 -0
- package/package.json +79 -0
- package/roles/README.md +20 -0
- package/roles/clarifier.md +42 -0
- package/roles/content-author.md +63 -0
- package/roles/designer.md +55 -0
- package/roles/executor.md +55 -0
- package/roles/learner.md +51 -0
- package/roles/planner.md +53 -0
- package/roles/researcher.md +43 -0
- package/roles/reviewer.md +54 -0
- package/roles/specifier.md +47 -0
- package/roles/verifier.md +71 -0
- package/schemas/README.md +24 -0
- package/schemas/accepted-learning.schema.json +20 -0
- package/schemas/author-artifact.schema.json +156 -0
- package/schemas/clarification.schema.json +19 -0
- package/schemas/design-artifact.schema.json +80 -0
- package/schemas/docs-claim.schema.json +18 -0
- package/schemas/export-manifest.schema.json +20 -0
- package/schemas/hook.schema.json +67 -0
- package/schemas/host-export-package.schema.json +18 -0
- package/schemas/implementation-plan.schema.json +19 -0
- package/schemas/proposed-learning.schema.json +19 -0
- package/schemas/research.schema.json +18 -0
- package/schemas/review.schema.json +29 -0
- package/schemas/run-manifest.schema.json +18 -0
- package/schemas/spec-challenge.schema.json +18 -0
- package/schemas/spec.schema.json +20 -0
- package/schemas/usage.schema.json +102 -0
- package/schemas/verification-proof.schema.json +29 -0
- package/schemas/wazir-manifest.schema.json +173 -0
- package/skills/README.md +40 -0
- package/skills/brainstorming/SKILL.md +77 -0
- package/skills/debugging/SKILL.md +50 -0
- package/skills/design/SKILL.md +61 -0
- package/skills/dispatching-parallel-agents/SKILL.md +128 -0
- package/skills/executing-plans/SKILL.md +70 -0
- package/skills/finishing-a-development-branch/SKILL.md +169 -0
- package/skills/humanize/SKILL.md +123 -0
- package/skills/init-pipeline/SKILL.md +124 -0
- package/skills/prepare-next/SKILL.md +20 -0
- package/skills/receiving-code-review/SKILL.md +123 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +108 -0
- package/skills/run-audit/SKILL.md +197 -0
- package/skills/scan-project/SKILL.md +41 -0
- package/skills/self-audit/SKILL.md +153 -0
- package/skills/subagent-driven-development/SKILL.md +154 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +102 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/tdd/SKILL.md +23 -0
- package/skills/using-git-worktrees/SKILL.md +163 -0
- package/skills/using-skills/SKILL.md +95 -0
- package/skills/verification/SKILL.md +22 -0
- package/skills/wazir/SKILL.md +463 -0
- package/skills/writing-plans/SKILL.md +30 -0
- package/skills/writing-skills/SKILL.md +157 -0
- package/skills/writing-skills/anthropic-best-practices.md +122 -0
- package/skills/writing-skills/persuasion-principles.md +50 -0
- package/templates/README.md +20 -0
- package/templates/artifacts/README.md +10 -0
- package/templates/artifacts/accepted-learning.md +19 -0
- package/templates/artifacts/accepted-learning.template.json +12 -0
- package/templates/artifacts/author.md +74 -0
- package/templates/artifacts/author.template.json +19 -0
- package/templates/artifacts/clarification.md +21 -0
- package/templates/artifacts/clarification.template.json +12 -0
- package/templates/artifacts/execute-notes.md +19 -0
- package/templates/artifacts/implementation-plan.md +21 -0
- package/templates/artifacts/implementation-plan.template.json +11 -0
- package/templates/artifacts/learning-proposal.md +19 -0
- package/templates/artifacts/next-run-handoff.md +21 -0
- package/templates/artifacts/plan-review.md +19 -0
- package/templates/artifacts/proposed-learning.template.json +12 -0
- package/templates/artifacts/research.md +21 -0
- package/templates/artifacts/research.template.json +12 -0
- package/templates/artifacts/review-findings.md +19 -0
- package/templates/artifacts/review.template.json +11 -0
- package/templates/artifacts/run-manifest.template.json +8 -0
- package/templates/artifacts/spec-challenge.md +19 -0
- package/templates/artifacts/spec-challenge.template.json +11 -0
- package/templates/artifacts/spec.md +21 -0
- package/templates/artifacts/spec.template.json +12 -0
- package/templates/artifacts/verification-proof.md +19 -0
- package/templates/artifacts/verification-proof.template.json +11 -0
- package/templates/examples/accepted-learning.example.json +14 -0
- package/templates/examples/author.example.json +152 -0
- package/templates/examples/clarification.example.json +15 -0
- package/templates/examples/docs-claim.example.json +8 -0
- package/templates/examples/export-manifest.example.json +7 -0
- package/templates/examples/host-export-package.example.json +11 -0
- package/templates/examples/implementation-plan.example.json +17 -0
- package/templates/examples/proposed-learning.example.json +13 -0
- package/templates/examples/research.example.json +15 -0
- package/templates/examples/research.example.md +6 -0
- package/templates/examples/review.example.json +17 -0
- package/templates/examples/run-manifest.example.json +9 -0
- package/templates/examples/spec-challenge.example.json +14 -0
- package/templates/examples/spec.example.json +21 -0
- package/templates/examples/verification-proof.example.json +21 -0
- package/templates/examples/wazir-manifest.example.yaml +65 -0
- package/templates/task-definition-schema.md +99 -0
- package/tooling/README.md +20 -0
- package/tooling/src/adapters/context-mode.js +50 -0
- package/tooling/src/capture/command.js +376 -0
- package/tooling/src/capture/store.js +99 -0
- package/tooling/src/capture/usage.js +270 -0
- package/tooling/src/checks/branches.js +50 -0
- package/tooling/src/checks/brand-truth.js +110 -0
- package/tooling/src/checks/changelog.js +231 -0
- package/tooling/src/checks/command-registry.js +36 -0
- package/tooling/src/checks/commits.js +102 -0
- package/tooling/src/checks/docs-drift.js +103 -0
- package/tooling/src/checks/docs-truth.js +201 -0
- package/tooling/src/checks/runtime-surface.js +156 -0
- package/tooling/src/cli.js +116 -0
- package/tooling/src/command-options.js +56 -0
- package/tooling/src/commands/validate.js +320 -0
- package/tooling/src/doctor/command.js +91 -0
- package/tooling/src/export/command.js +77 -0
- package/tooling/src/export/compiler.js +498 -0
- package/tooling/src/guards/loop-cap-guard.js +52 -0
- package/tooling/src/guards/protected-path-write-guard.js +67 -0
- package/tooling/src/index/command.js +152 -0
- package/tooling/src/index/storage.js +1061 -0
- package/tooling/src/index/summarizers.js +261 -0
- package/tooling/src/loaders.js +18 -0
- package/tooling/src/project-root.js +22 -0
- package/tooling/src/recall/command.js +225 -0
- package/tooling/src/schema-validator.js +30 -0
- package/tooling/src/state-root.js +40 -0
- package/tooling/src/status/command.js +71 -0
- package/wazir.manifest.yaml +135 -0
- package/workflows/README.md +19 -0
- package/workflows/author.md +42 -0
- package/workflows/clarify.md +38 -0
- package/workflows/design-review.md +46 -0
- package/workflows/design.md +44 -0
- package/workflows/discover.md +37 -0
- package/workflows/execute.md +48 -0
- package/workflows/learn.md +38 -0
- package/workflows/plan-review.md +42 -0
- package/workflows/plan.md +39 -0
- package/workflows/prepare-next.md +37 -0
- package/workflows/review.md +40 -0
- package/workflows/run-audit.md +41 -0
- package/workflows/spec-challenge.md +41 -0
- package/workflows/specify.md +38 -0
- package/workflows/verify.md +37 -0
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
# Native iOS — Expertise Module
|
|
2
|
+
|
|
3
|
+
> A Native iOS specialist designs, builds, and ships applications for Apple's iOS platform using Swift and Apple frameworks (SwiftUI, UIKit). The role spans UI implementation, data management, platform API integration, performance tuning, accessibility, and App Store delivery. Scope includes iPhone, iPad, Apple Watch, and platform extensions (widgets, intents, share extensions).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Core Patterns & Conventions
|
|
8
|
+
|
|
9
|
+
### Project Structure
|
|
10
|
+
|
|
11
|
+
Modern iOS projects (2025-2026) use modular architecture with SPM local packages, optionally managed by Tuist (v4+) or XcodeGen for `.xcodeproj` generation.
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
MyApp/
|
|
15
|
+
App/ # App target (@main entry point)
|
|
16
|
+
Packages/
|
|
17
|
+
Core/ # Shared utilities, extensions, logging
|
|
18
|
+
Networking/ # API client, DTOs, endpoint definitions
|
|
19
|
+
DesignSystem/ # Reusable UI components, tokens, colors
|
|
20
|
+
FeatureHome/ # Feature module (one per feature)
|
|
21
|
+
FeatureSettings/
|
|
22
|
+
Tests/ # Mirror of Packages/ with test targets
|
|
23
|
+
UITests/
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
- Each feature module is a local SPM package with its own `Package.swift`.
|
|
27
|
+
- Feature modules depend on `Core` and `DesignSystem` but never on each other.
|
|
28
|
+
- Tuist/XcodeGen generates `.xcodeproj` from declarative manifests, eliminating merge conflicts.
|
|
29
|
+
- Minimum deployment: iOS 17 for new projects (unlocks SwiftData, `@Observable`). iOS 16 if broad coverage required.
|
|
30
|
+
|
|
31
|
+
### Naming Conventions (Swift API Design Guidelines)
|
|
32
|
+
|
|
33
|
+
- **Types**: `UpperCamelCase` -- `UserProfileView`, `NetworkClient`.
|
|
34
|
+
- **Functions/properties**: `lowerCamelCase` -- `fetchUserProfile()`, `isAuthenticated`.
|
|
35
|
+
- **Protocols**: capabilities use `-able`/`-ible` (`Sendable`); descriptions use nouns (`DataStore`).
|
|
36
|
+
- **Booleans**: read as assertions -- `isEmpty`, `hasUnsavedChanges`.
|
|
37
|
+
- **Factory methods**: prefix with `make` -- `makeURLRequest()`.
|
|
38
|
+
- **File naming**: one primary type per file, filename matches type.
|
|
39
|
+
|
|
40
|
+
### Architecture Patterns
|
|
41
|
+
|
|
42
|
+
**MVVM (Recommended Default)** -- aligns naturally with SwiftUI's declarative model. View observes ViewModel via `@Observable`; ViewModel mediates between View and Service layers.
|
|
43
|
+
|
|
44
|
+
**TCA (The Composable Architecture)** -- unidirectional data flow (State -> Action -> Reducer -> Effect -> State). Best for complex state-heavy apps. Built-in DI via `@Dependency`, exhaustive testability via `TestStore`. Steep learning curve; use when >20 screens with complex state interactions.
|
|
45
|
+
|
|
46
|
+
**VIPER** -- legacy enterprise pattern. High ceremony. Largely superseded by MVVM+Coordinator or TCA for SwiftUI projects. Consider only for existing UIKit codebases.
|
|
47
|
+
|
|
48
|
+
### SwiftUI Patterns
|
|
49
|
+
|
|
50
|
+
- Break views into small subviews (each `body` < 50 lines) -- smaller invalidation scope.
|
|
51
|
+
- Use `ViewModifier` for cross-cutting styling; `View` extensions for convenience wrappers.
|
|
52
|
+
- `@Observable` (iOS 17+): SwiftUI tracks property access per-view -- only read properties trigger re-renders (unlike `ObservableObject` which fires on any `@Published` change).
|
|
53
|
+
- Use `@Entry` on `EnvironmentValues` for custom environment keys.
|
|
54
|
+
|
|
55
|
+
### State Management
|
|
56
|
+
|
|
57
|
+
| Scope | Tool | When to Use |
|
|
58
|
+
|-------|------|-------------|
|
|
59
|
+
| View-local | `@State` | Toggle, text field, sheet presentation |
|
|
60
|
+
| Shared reference | `@Observable` class | ViewModel, shared state across views |
|
|
61
|
+
| Global / app-wide | `@Observable` + `.environment()` | Auth state, theme, feature flags |
|
|
62
|
+
| Complex / deterministic | TCA `Store` | Exhaustive testing, time-travel debugging |
|
|
63
|
+
| Legacy | `ObservableObject` + `@Published` | Pre-iOS 17 codebases only |
|
|
64
|
+
|
|
65
|
+
### Navigation (NavigationStack + NavigationPath, iOS 16+)
|
|
66
|
+
|
|
67
|
+
- Use `@Observable` Router class holding a `NavigationPath`.
|
|
68
|
+
- Define destinations as `Hashable` enums; use `.navigationDestination(for:)` for type-safe routing.
|
|
69
|
+
- Each `TabView` tab gets its own `NavigationStack` and `Router`.
|
|
70
|
+
- Never mutate path during a view update -- trigger changes from actions, `onAppear`, or `.task`.
|
|
71
|
+
- Deep links: append destinations to path in `onOpenURL`.
|
|
72
|
+
|
|
73
|
+
### Data Flow & Concurrency (Swift 6 / 6.2)
|
|
74
|
+
|
|
75
|
+
- Prefer `async/await` over Combine for new async work; use `TaskGroup` for parallel work.
|
|
76
|
+
- Mark all UI-bound `@Observable` classes with `@MainActor`.
|
|
77
|
+
- Swift 6 enforces `Sendable` at compile time -- value types and actors are inherently `Sendable`.
|
|
78
|
+
- Swift 6.2 (WWDC 2025): `@concurrent` attribute for explicit concurrent execution opt-in.
|
|
79
|
+
- **Combine** remains valid for reactive streams (`NotificationCenter`, KVO bridging). Avoid mixing Combine and async/await in the same pipeline.
|
|
80
|
+
|
|
81
|
+
### Error Handling (Typed Throws, Swift 6)
|
|
82
|
+
|
|
83
|
+
```swift
|
|
84
|
+
enum NetworkError: Error, LocalizedError {
|
|
85
|
+
case unauthorized, notFound
|
|
86
|
+
case serverError(statusCode: Int)
|
|
87
|
+
case decodingFailed(underlying: Error)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
func fetchUser(id: String) async throws(NetworkError) -> User { ... }
|
|
91
|
+
// Callers know exactly which errors to handle
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Logging (os.Logger)
|
|
95
|
+
|
|
96
|
+
```swift
|
|
97
|
+
extension Logger {
|
|
98
|
+
static let networking = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "Networking")
|
|
99
|
+
}
|
|
100
|
+
Logger.networking.info("Fetching user \(userId, privacy: .private)")
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Use `.private` for PII (redacted in production). Prefer `Logger` over `print()` -- zero cost when not collected.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Anti-Patterns & Pitfalls
|
|
108
|
+
|
|
109
|
+
**1. Force unwrapping everywhere** -- `!` crashes on nil. Use `guard let`, `if let`, `??`. Reserve `!` for IBOutlets and compile-time-guaranteed literals.
|
|
110
|
+
|
|
111
|
+
**2. Massive View / Massive ViewModel** -- a 500-line `body` re-evaluates entirely on any state change. Break into subviews for localized invalidation.
|
|
112
|
+
|
|
113
|
+
**3. Using @State for shared state** -- `@State` is view-local. Sharing via bindings creates fragile coupling. Use `@Observable` classes with `.environment()`.
|
|
114
|
+
|
|
115
|
+
**4. Using ObservableObject when @Observable is available** -- `ObservableObject`+`@Published` fires updates for any property change. `@Observable` tracks per-property access, rendering only what changed.
|
|
116
|
+
|
|
117
|
+
**5. Blocking main thread** -- work >16ms causes dropped frames. Network, parsing, image processing must use async/await or background queues.
|
|
118
|
+
|
|
119
|
+
**6. Retain cycles in closures** -- closures capture `self` strongly by default. Use `[weak self]` in escaping closures. Async/await's structured concurrency eliminates most closure-based cycles.
|
|
120
|
+
|
|
121
|
+
**7. Ignoring Sendable/actor isolation (Swift 6)** -- disabling strict concurrency masks data races. Fix by making types `Sendable`, using actors, or restructuring data flow.
|
|
122
|
+
|
|
123
|
+
**8. Eager stacks for large lists** -- `VStack`/`HStack` instantiate all children. Use `LazyVStack`/`LazyHStack`/`List` for >20 items.
|
|
124
|
+
|
|
125
|
+
**9. Secrets in UserDefaults** -- UserDefaults is an unencrypted plist. Tokens, passwords, API keys belong in Keychain.
|
|
126
|
+
|
|
127
|
+
**10. Ignoring memory leaks** -- leaked VCs and VMs accumulate until OS kills the app. Use Instruments Leaks + Xcode Memory Graph Debugger during development.
|
|
128
|
+
|
|
129
|
+
**11. `DispatchQueue.main.async` in SwiftUI** -- causes double renders. Use `@MainActor` on ViewModels instead.
|
|
130
|
+
|
|
131
|
+
**12. Overusing singletons** -- hidden global state, untestable. Use dependency injection (initializer or `@Environment`).
|
|
132
|
+
|
|
133
|
+
**13. Unstable ForEach identifiers** -- index or `\.self` on non-unique values causes animation glitches and state corruption. Conform models to `Identifiable` with stable IDs.
|
|
134
|
+
|
|
135
|
+
**14. Disabling ATS globally** -- `NSAllowsArbitraryLoads = true` exposes all traffic. Add per-domain exceptions only.
|
|
136
|
+
|
|
137
|
+
**15. Skipping accessibility** -- ~15-20% of users rely on VoiceOver. Add `.accessibilityLabel()`, `.accessibilityHint()`. Apple rejects apps with major a11y issues.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Testing Strategy
|
|
142
|
+
|
|
143
|
+
### Unit Testing (Swift Testing Framework, Xcode 16+)
|
|
144
|
+
|
|
145
|
+
```swift
|
|
146
|
+
import Testing
|
|
147
|
+
|
|
148
|
+
@Suite("UserProfileViewModel Tests")
|
|
149
|
+
struct UserProfileViewModelTests {
|
|
150
|
+
@Test("loads user successfully")
|
|
151
|
+
func loadUser() async throws {
|
|
152
|
+
let vm = UserProfileViewModel(userService: MockUserService(result: .success(.stub)))
|
|
153
|
+
await vm.loadUser(id: "123")
|
|
154
|
+
#expect(vm.user?.name == "Jane Doe")
|
|
155
|
+
#expect(vm.errorMessage == nil)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
@Test("throws on server error", arguments: [500, 502, 503])
|
|
159
|
+
func serverError(statusCode: Int) async { ... }
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
XCTest remains valid for existing suites and UI tests. Both coexist in the same target.
|
|
164
|
+
|
|
165
|
+
### UI Testing (XCUITest)
|
|
166
|
+
|
|
167
|
+
- Use `.accessibilityIdentifier("loginButton")` as stable anchors (not text).
|
|
168
|
+
- Focus on critical flows (login, purchase, onboarding) -- UI tests are slow.
|
|
169
|
+
- Page Object pattern encapsulates screen interactions for reuse.
|
|
170
|
+
|
|
171
|
+
### Snapshot Testing (swift-snapshot-testing by Point-Free)
|
|
172
|
+
|
|
173
|
+
- `assertSnapshot(of: view, as: .image(layout: .device(config: .iPhone13)))`.
|
|
174
|
+
- Pin to a single simulator to avoid pixel differences. Store reference images in repo.
|
|
175
|
+
|
|
176
|
+
### Mock Patterns
|
|
177
|
+
|
|
178
|
+
Protocol-based mocking preferred. Define protocol (`UserServiceProtocol`), create lightweight `MockUserService` conforming to it. For DI frameworks: `swift-dependencies` (`@Dependency`) or Factory (`@Injected`).
|
|
179
|
+
|
|
180
|
+
### Test Plans
|
|
181
|
+
|
|
182
|
+
Separate plans for Unit, Integration, UI. CI runs unit on every PR; UI on merge to main. Target: ~70% unit, ~20% integration, ~10% UI/E2E.
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Performance Considerations
|
|
187
|
+
|
|
188
|
+
### SwiftUI Performance
|
|
189
|
+
|
|
190
|
+
- **Lazy stacks**: `LazyVStack`/`LazyHStack` for scrollable content >20 items.
|
|
191
|
+
- **Small views**: each subview = own invalidation scope. Extract components.
|
|
192
|
+
- **Stable IDs**: `Identifiable` with persistent IDs in `ForEach`.
|
|
193
|
+
- **Equatable views**: conform to `Equatable` + `.equatable()` modifier to skip unnecessary body evaluations.
|
|
194
|
+
- **Instruments 26**: new SwiftUI instrument traces body evaluations and slow state updates.
|
|
195
|
+
|
|
196
|
+
### App Launch Optimization
|
|
197
|
+
|
|
198
|
+
- Minimize work in `@main` App `init()`. Defer analytics/remote config to `.task {}`.
|
|
199
|
+
- Consolidate SPM packages to reduce dynamic library loads. Measure with `DYLD_PRINT_STATISTICS=1`.
|
|
200
|
+
|
|
201
|
+
### Memory Management (ARC)
|
|
202
|
+
|
|
203
|
+
- **Strong** (default): keeps object alive. **Weak** (`weak var`): nils on dealloc. **Unowned**: crashes on access after dealloc.
|
|
204
|
+
- Common cycle: `self` captured in closure stored on `self`. Fix: `[weak self]`.
|
|
205
|
+
- Tools: Xcode Memory Graph Debugger, Instruments Leaks/Allocations.
|
|
206
|
+
|
|
207
|
+
### Instruments Profiling
|
|
208
|
+
|
|
209
|
+
| Instrument | Finds |
|
|
210
|
+
|------------|-------|
|
|
211
|
+
| Time Profiler | Main-thread hangs, slow functions |
|
|
212
|
+
| Allocations | Memory growth, abandoned memory |
|
|
213
|
+
| Leaks | Retain cycles |
|
|
214
|
+
| Network | Redundant/slow API calls |
|
|
215
|
+
| Core Animation | Off-screen rendering, blending |
|
|
216
|
+
| SwiftUI (Instruments 26) | Excessive body evaluations |
|
|
217
|
+
|
|
218
|
+
### SwiftData / Core Data Performance
|
|
219
|
+
|
|
220
|
+
- Use `@Query` with `#Predicate` and `fetchLimit`. Batch inserts, single `save()`.
|
|
221
|
+
- For Core Data: `NSFetchedResultsController` for incremental UI updates.
|
|
222
|
+
- Core Data outperforms SwiftData for >10,000 rows (as of 2025).
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Security Considerations
|
|
227
|
+
|
|
228
|
+
### Keychain Services
|
|
229
|
+
|
|
230
|
+
Use `SecItemAdd`/`SecItemCopyMatching` with `kSecAttrAccessibleWhenUnlockedThisDeviceOnly`. Never store secrets in UserDefaults. Use a wrapper (KeychainAccess) for ergonomic API.
|
|
231
|
+
|
|
232
|
+
### App Transport Security (ATS)
|
|
233
|
+
|
|
234
|
+
ATS enforces HTTPS by default. Do not disable globally. Per-domain exceptions only. Use certificate pinning for banking/healthcare apps.
|
|
235
|
+
|
|
236
|
+
### Biometric Authentication (Face ID / Touch ID)
|
|
237
|
+
|
|
238
|
+
Use `LAContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics)`. Add `NSFaceIDUsageDescription` to Info.plist. Always provide fallback (passcode/password). Combine with Keychain access controls (`.biometryCurrentSet`).
|
|
239
|
+
|
|
240
|
+
### Code Signing & Entitlements
|
|
241
|
+
|
|
242
|
+
Automatic signing for dev; Fastlane Match or Xcode Cloud for CI. Never commit `.p12` or profiles to source control. Entitlements define capabilities (push, Keychain sharing, App Groups).
|
|
243
|
+
|
|
244
|
+
### Data Protection Classes
|
|
245
|
+
|
|
246
|
+
| Class | Accessible | Use Case |
|
|
247
|
+
|-------|-----------|----------|
|
|
248
|
+
| `completeProtection` | Only when unlocked | Most sensitive data |
|
|
249
|
+
| `completeUnlessOpen` | Until first lock | Background downloads |
|
|
250
|
+
| `afterFirstUnlock` | After first unlock | Background fetch |
|
|
251
|
+
| `none` | Always | Non-sensitive cache |
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## Integration Patterns
|
|
256
|
+
|
|
257
|
+
### Networking
|
|
258
|
+
|
|
259
|
+
Prefer `URLSession` with async/await over Alamofire for new projects. Define `Endpoint` structs for URL/method/headers/body. Implement retry with exponential backoff. Use `URLCache` for HTTP caching.
|
|
260
|
+
|
|
261
|
+
```swift
|
|
262
|
+
protocol APIClient: Sendable {
|
|
263
|
+
func request<T: Decodable>(_ endpoint: Endpoint) async throws -> T
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Persistence
|
|
268
|
+
|
|
269
|
+
| Solution | Best For | Min iOS |
|
|
270
|
+
|----------|----------|---------|
|
|
271
|
+
| **SwiftData** | New SwiftUI apps, simple-moderate models | iOS 17 |
|
|
272
|
+
| **Core Data** | Complex queries, large datasets, migrations | iOS 13 |
|
|
273
|
+
| **Realm** | Cross-platform, real-time sync | iOS 13 |
|
|
274
|
+
| **UserDefaults** | Small preferences, feature flags | Any |
|
|
275
|
+
| **Keychain** | Secrets, tokens, passwords | Any |
|
|
276
|
+
|
|
277
|
+
### Dependency Injection
|
|
278
|
+
|
|
279
|
+
- **Initializer injection** (default): pass dependencies through `init()`.
|
|
280
|
+
- **Factory** (container-based): compile-time safe, `@Injected(\.userService)` property wrapper.
|
|
281
|
+
- **swift-dependencies** (TCA): `@Dependency(\.userService)`, test/preview/live values.
|
|
282
|
+
|
|
283
|
+
### Push Notifications (APNs)
|
|
284
|
+
|
|
285
|
+
Use token-based auth (`.p8` key, no expiry) over certificates. Handle in `UNUserNotificationCenterDelegate`. Use `apns-priority: 5` for non-urgent. Live Activities: `liveactivity` push type with `ActivityKit`.
|
|
286
|
+
|
|
287
|
+
### WidgetKit & App Intents
|
|
288
|
+
|
|
289
|
+
Widgets use `TimelineProvider`. Share data via App Groups. App Intents (iOS 16+) for Siri, Shortcuts, interactive widget buttons. Widget refresh budgets are limited -- use push-based updates for real-time data.
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## DevOps & Deployment
|
|
294
|
+
|
|
295
|
+
### CI/CD Options
|
|
296
|
+
|
|
297
|
+
| Tool | Pros | Cons |
|
|
298
|
+
|------|------|------|
|
|
299
|
+
| **Xcode Cloud** | Zero-config signing, Apple-native, free tier | Limited customization |
|
|
300
|
+
| **GitHub Actions + Fastlane** | Flexible, community plugins | macOS runners expensive |
|
|
301
|
+
| **Bitrise / Codemagic** | iOS-first, managed VMs | Cost scales with team |
|
|
302
|
+
|
|
303
|
+
### Code Signing Automation
|
|
304
|
+
|
|
305
|
+
- **Fastlane Match**: certs/profiles in private Git repo, shared across CI and devs.
|
|
306
|
+
- **Xcode Cloud**: automatic signing, no manual cert management.
|
|
307
|
+
- Never commit `.p12` or provisioning profiles to main repo.
|
|
308
|
+
|
|
309
|
+
### TestFlight Distribution
|
|
310
|
+
|
|
311
|
+
Upload via Fastlane `upload_to_testflight` or `xcrun altool`. Segment testers into groups. External testing requires App Store Review (~24h). Include `What to Test` notes.
|
|
312
|
+
|
|
313
|
+
### Crash Reporting
|
|
314
|
+
|
|
315
|
+
- **Crashlytics**: free, real-time, breadcrumbs. **Sentry**: richer context, paid tiers.
|
|
316
|
+
- **Xcode Organizer**: free App Store crash logs (24-48h delay).
|
|
317
|
+
- Upload dSYM files on every release for symbolicated stack traces.
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## Decision Trees
|
|
322
|
+
|
|
323
|
+
### SwiftUI vs UIKit?
|
|
324
|
+
|
|
325
|
+
```
|
|
326
|
+
New project targeting iOS 16+?
|
|
327
|
+
Yes --> SwiftUI primary + UIKit via UIViewRepresentable where needed
|
|
328
|
+
No --> UIKit primary + SwiftUI for new screens via UIHostingController
|
|
329
|
+
|
|
330
|
+
Existing UIKit app?
|
|
331
|
+
--> Keep UIKit for existing screens, add new features in SwiftUI, migrate incrementally
|
|
332
|
+
|
|
333
|
+
UIKit still required for:
|
|
334
|
+
- Custom compositional layouts, complex TextKit 2, AVFoundation camera UI
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Which Architecture?
|
|
338
|
+
|
|
339
|
+
```
|
|
340
|
+
Solo/small team, simple-medium app --> MVVM with @Observable
|
|
341
|
+
Medium team, complex state, high test coverage --> TCA (Composable Architecture)
|
|
342
|
+
Large enterprise, UIKit-heavy, strict boundaries --> VIPER or Clean Architecture
|
|
343
|
+
Middle ground --> MVVM + Coordinator (centralized navigation, MVVM simplicity)
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### Which Persistence?
|
|
347
|
+
|
|
348
|
+
```
|
|
349
|
+
New app, iOS 17+, simple-moderate model --> SwiftData
|
|
350
|
+
New app, complex migrations/large datasets --> Core Data
|
|
351
|
+
Cross-platform (iOS + Android) --> Realm or SQLite (GRDB.swift)
|
|
352
|
+
Existing Core Data app --> Keep Core Data; evaluate SwiftData when raising min to iOS 17
|
|
353
|
+
Performance-critical (>50k records) --> Core Data or Realm (SwiftData still maturing)
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Code Examples
|
|
359
|
+
|
|
360
|
+
### 1. Async Data Loading with State Enum
|
|
361
|
+
|
|
362
|
+
```swift
|
|
363
|
+
@Observable @MainActor
|
|
364
|
+
final class BookListViewModel {
|
|
365
|
+
private(set) var books: [Book] = []
|
|
366
|
+
private(set) var state: ViewState = .idle
|
|
367
|
+
enum ViewState: Equatable { case idle, loading, loaded, error(String) }
|
|
368
|
+
private let api: APIClient
|
|
369
|
+
init(api: APIClient) { self.api = api }
|
|
370
|
+
|
|
371
|
+
func loadBooks() async {
|
|
372
|
+
state = .loading
|
|
373
|
+
do { books = try await api.request(.books); state = .loaded }
|
|
374
|
+
catch { state = .error(error.localizedDescription) }
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
struct BookListView: View {
|
|
379
|
+
@State private var viewModel: BookListViewModel
|
|
380
|
+
init(api: APIClient) { _viewModel = State(initialValue: BookListViewModel(api: api)) }
|
|
381
|
+
|
|
382
|
+
var body: some View {
|
|
383
|
+
Group {
|
|
384
|
+
switch viewModel.state {
|
|
385
|
+
case .idle, .loading: ProgressView()
|
|
386
|
+
case .loaded: List(viewModel.books) { BookRow(book: $0) }
|
|
387
|
+
case .error(let msg): ContentUnavailableView("Failed", systemImage: "exclamationmark.triangle", description: Text(msg))
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
.task { await viewModel.loadBooks() }
|
|
391
|
+
.refreshable { await viewModel.loadBooks() }
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### 2. NavigationStack Router
|
|
397
|
+
|
|
398
|
+
```swift
|
|
399
|
+
@Observable
|
|
400
|
+
final class Router {
|
|
401
|
+
var path = NavigationPath()
|
|
402
|
+
func navigate(to dest: AppDestination) { path.append(dest) }
|
|
403
|
+
func popToRoot() { path = NavigationPath() }
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
enum AppDestination: Hashable {
|
|
407
|
+
case userProfile(userId: String), settings, orderDetail(orderId: String)
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
struct RootView: View {
|
|
411
|
+
@State private var router = Router()
|
|
412
|
+
var body: some View {
|
|
413
|
+
NavigationStack(path: $router.path) {
|
|
414
|
+
HomeView()
|
|
415
|
+
.navigationDestination(for: AppDestination.self) { dest in
|
|
416
|
+
switch dest {
|
|
417
|
+
case .userProfile(let id): UserProfileView(userId: id)
|
|
418
|
+
case .settings: SettingsView()
|
|
419
|
+
case .orderDetail(let id): OrderDetailView(orderId: id)
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
.environment(router)
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### 3. Parallel Fetching with async let
|
|
429
|
+
|
|
430
|
+
```swift
|
|
431
|
+
func loadDashboard() async throws -> Dashboard {
|
|
432
|
+
async let profile = api.request(.userProfile) as UserProfile
|
|
433
|
+
async let orders = api.request(.recentOrders) as [Order]
|
|
434
|
+
async let notifs = api.request(.notifications) as [AppNotification]
|
|
435
|
+
return try await Dashboard(profile: profile, orders: orders, notifications: notifs)
|
|
436
|
+
}
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
### 4. SwiftData Model with Relationships
|
|
440
|
+
|
|
441
|
+
```swift
|
|
442
|
+
import SwiftData
|
|
443
|
+
|
|
444
|
+
@Model final class Recipe {
|
|
445
|
+
var title: String
|
|
446
|
+
var prepTimeMinutes: Int
|
|
447
|
+
@Relationship(deleteRule: .cascade) var ingredients: [Ingredient]
|
|
448
|
+
init(title: String, prepTimeMinutes: Int) {
|
|
449
|
+
self.title = title; self.prepTimeMinutes = prepTimeMinutes; self.ingredients = []
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
struct RecipeListView: View {
|
|
454
|
+
@Query(sort: \Recipe.createdAt, order: .reverse) private var recipes: [Recipe]
|
|
455
|
+
var body: some View {
|
|
456
|
+
List(recipes) { recipe in
|
|
457
|
+
Text(recipe.title)
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
### 5. Swift Testing with Parameterized Arguments
|
|
464
|
+
|
|
465
|
+
```swift
|
|
466
|
+
import Testing
|
|
467
|
+
@testable import MyApp
|
|
468
|
+
|
|
469
|
+
@Suite("NetworkClient")
|
|
470
|
+
struct NetworkClientTests {
|
|
471
|
+
@Test("decodes valid response")
|
|
472
|
+
func decode() async throws {
|
|
473
|
+
let client = LiveAPIClient(session: MockURLSession(data: validJSON, statusCode: 200))
|
|
474
|
+
let user: User = try await client.request(.userProfile(id: "1"))
|
|
475
|
+
#expect(user.name == "Test User")
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
@Test("throws on server error", arguments: [500, 502, 503])
|
|
479
|
+
func serverError(code: Int) async {
|
|
480
|
+
let client = LiveAPIClient(session: MockURLSession(data: Data(), statusCode: code))
|
|
481
|
+
await #expect(throws: NetworkError.self) {
|
|
482
|
+
let _: User = try await client.request(.userProfile(id: "1"))
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
---
|
|
489
|
+
|
|
490
|
+
*Researched: 2026-03-07 | Sources: [Swift API Design Guidelines](https://www.swift.org/documentation/api-design-guidelines/), [Apple SwiftUI Performance Docs](https://developer.apple.com/documentation/Xcode/understanding-and-improving-swiftui-performance), [MVVM vs VIPER vs TCA](https://medium.com/@rashadsh/mvvm-vs-viper-vs-tca-best-architecture-for-your-next-app-159e11e333e9), [Modern iOS Architecture 2025](https://medium.com/@csmax/the-ultimate-guide-to-modern-ios-architecture-in-2025-9f0d5fdc892f), [SwiftData vs Core Data vs Realm](https://hackernoon.com/swift-data-vs-core-data-vs-realm-ios-data-persistence-overview-and-analysis), [swift-snapshot-testing](https://github.com/pointfreeco/swift-snapshot-testing), [Factory DI](https://github.com/hmlongco/Factory), [Fastlane Match](https://docs.fastlane.tools/actions/sync_code_signing/), [iOS Security Checklist 2025](https://mobisoftinfotech.com/resources/blog/app-security/ios-app-security-checklist-best-practices), [NavigationStack Patterns](https://buczel.com/blog/swift-navigation-stack-patterns/), [Swift 6.2 Concurrency](https://www.avanderlee.com/concurrency/approachable-concurrency-in-swift-6-2-a-clear-guide/), [Tuist for Xcode](https://www.runway.team/blog/getting-started-with-tuist-for-xcode-project-generation-and-modularization-on-ios), [Modern iOS Architecture 2026](https://7span.com/blog/mvvm-vs-clean-architecture-vs-tca), [DI Patterns in Swift](https://michalcichon.github.io/software-development/2025/11/25/dependency-injection-patterns-in-swift.html)*
|