@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,241 @@
|
|
|
1
|
+
# Text Direction and Bidirectional Text — i18n/RTL Expertise Module
|
|
2
|
+
|
|
3
|
+
> How text direction works: logical vs visual order, the Unicode BiDi algorithm, and when to use markup vs control characters. Essential for any interface that mixes Arabic, Hebrew, or other RTL scripts with LTR content.
|
|
4
|
+
|
|
5
|
+
> **Category:** Foundation
|
|
6
|
+
> **Applies to:** All (Mobile, Web, Backend)
|
|
7
|
+
> **Key standards:** Unicode UAX #9 (BiDi Algorithm), W3C HTML BiDi
|
|
8
|
+
> **RTL impact:** Critical — this is the foundation of all RTL support
|
|
9
|
+
|
|
10
|
+
## 1. Core Concepts
|
|
11
|
+
|
|
12
|
+
### What This Area Covers
|
|
13
|
+
|
|
14
|
+
Text direction determines how characters are laid out horizontally: left-to-right (LTR) for English, Latin, Cyrillic, etc., and right-to-left (RTL) for Arabic, Hebrew, Persian, Urdu. Bidirectional (BiDi) text mixes both in a single line—e.g., "Hello العربية world"—and requires the Unicode Bidirectional Algorithm to resolve display order.
|
|
15
|
+
|
|
16
|
+
### Logical vs Visual Order
|
|
17
|
+
|
|
18
|
+
| Concept | Definition | Example |
|
|
19
|
+
|---------|------------|---------|
|
|
20
|
+
| **Logical order** | Sequence in which text is typed, pronounced, and stored in memory | "english ARABIC text" |
|
|
21
|
+
| **Visual order** | Sequence in which text appears on screen | "english CIBARA text" (Arabic reversed) |
|
|
22
|
+
|
|
23
|
+
**Always use logical order in markup and data.** The BiDi algorithm converts logical → visual at display time. Storing visual order breaks copy-paste, search, and maintenance.
|
|
24
|
+
|
|
25
|
+
### Base Direction
|
|
26
|
+
|
|
27
|
+
The base direction is the default for a block of text when the BiDi algorithm runs. It affects:
|
|
28
|
+
- Order of neutral characters (spaces, punctuation)
|
|
29
|
+
- Alignment (start vs end)
|
|
30
|
+
- How mixed-direction runs are resolved
|
|
31
|
+
|
|
32
|
+
Set via `dir="ltr"`, `dir="rtl"`, or `dir="auto"` (first strong character wins).
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 2. Unicode Bidirectional Algorithm (UAX #9)
|
|
37
|
+
|
|
38
|
+
### How It Works
|
|
39
|
+
|
|
40
|
+
1. **Character classification** — Each character has a directional type: L (strong LTR), R (strong RTL), AL (Arabic letter), EN (European number), AN (Arabic number), NSM (non-spacing mark), etc.
|
|
41
|
+
2. **Resolving levels** — The algorithm assigns embedding levels (0 = LTR, 1 = RTL, etc.) based on base direction and character types.
|
|
42
|
+
3. **Reordering** — Characters are reordered for display according to their levels.
|
|
43
|
+
|
|
44
|
+
### When the Algorithm Needs Help
|
|
45
|
+
|
|
46
|
+
- **Neutral characters** — Spaces, punctuation between opposite-direction runs can be misassigned
|
|
47
|
+
- **Numbers** — European (0123) vs Arabic (٠١٢٣) numerals; numbers can "stick" to wrong runs
|
|
48
|
+
- **Spillover** — An RTL phrase followed by a number in LTR context: the number may join the RTL run incorrectly
|
|
49
|
+
|
|
50
|
+
### Directional Formatting Characters
|
|
51
|
+
|
|
52
|
+
**Prefer isolate pairs (Unicode 6.3+):** They prevent spillover.
|
|
53
|
+
|
|
54
|
+
| Character | Name | Code | Use |
|
|
55
|
+
|-----------|------|------|-----|
|
|
56
|
+
| LRI | LEFT-TO-RIGHT ISOLATE | U+2066 | Wrap LTR text in RTL context |
|
|
57
|
+
| RLI | RIGHT-TO-LEFT ISOLATE | U+2067 | Wrap RTL text in LTR context |
|
|
58
|
+
| FSI | FIRST-STRONG ISOLATE | U+2068 | `dir="auto"` equivalent |
|
|
59
|
+
| PDI | POP DIRECTIONAL ISOLATE | U+2069 | Closes LRI, RLI, or FSI |
|
|
60
|
+
|
|
61
|
+
**Legacy (avoid for new content):** Can cause spillover.
|
|
62
|
+
|
|
63
|
+
| Character | Name | Code | Use |
|
|
64
|
+
|-----------|------|------|-----|
|
|
65
|
+
| LRE | LEFT-TO-RIGHT EMBEDDING | U+202A | LTR embedding |
|
|
66
|
+
| RLE | RIGHT-TO-LEFT EMBEDDING | U+202B | RTL embedding |
|
|
67
|
+
| PDF | POP DIRECTIONAL FORMATTING | U+202C | Closes LRE/RLE |
|
|
68
|
+
| LRO | LEFT-TO-RIGHT OVERRIDE | U+202D | Force LTR display order |
|
|
69
|
+
| RLO | RIGHT-TO-LEFT OVERRIDE | U+202E | Force RTL display order |
|
|
70
|
+
|
|
71
|
+
**Single-character marks:**
|
|
72
|
+
|
|
73
|
+
| Character | Name | Code | Use |
|
|
74
|
+
|-----------|------|------|-----|
|
|
75
|
+
| LRM | LEFT-TO-RIGHT MARK | U+200E | Break link between number and RTL text; extend LTR run |
|
|
76
|
+
| RLM | RIGHT-TO-LEFT MARK | U+200F | Extend RTL run to include punctuation |
|
|
77
|
+
|
|
78
|
+
### When to Use Control Characters vs Markup
|
|
79
|
+
|
|
80
|
+
- **HTML/CSS available** — Use `dir` attribute or `<bdi>`. Prefer markup.
|
|
81
|
+
- **Plain text only** — Use Unicode controls (e.g., `title` attribute, WebVTT, CSV, filenames).
|
|
82
|
+
- **User-generated content** — `dir="auto"` or FSI when direction is unknown.
|
|
83
|
+
|
|
84
|
+
### Example: Fixing Spillover
|
|
85
|
+
|
|
86
|
+
**Problem:** "We found the phrase 'نشاط التدويل' 5 times" — the "5" incorrectly joins the Arabic.
|
|
87
|
+
|
|
88
|
+
**Solution with RLI/PDI:**
|
|
89
|
+
```
|
|
90
|
+
We find the phrase '\u2067نشاط التدويل\u2069' 5 times
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Solution with LRM** (if you only need to break the link):
|
|
94
|
+
```
|
|
95
|
+
We find the phrase 'نشاط التدويل'\u200E 5 times
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 3. HTML and Markup
|
|
101
|
+
|
|
102
|
+
### Document-Level Direction
|
|
103
|
+
|
|
104
|
+
```html
|
|
105
|
+
<html lang="ar" dir="rtl">
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Block-Level Direction
|
|
109
|
+
|
|
110
|
+
```html
|
|
111
|
+
<div dir="rtl">محتوى عربي</div>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Inline Mixed Content
|
|
115
|
+
|
|
116
|
+
Wrap opposite-direction phrases tightly:
|
|
117
|
+
|
|
118
|
+
```html
|
|
119
|
+
<p>The title is <span dir="rtl">مدخل إلى C++</span> in Arabic.</p>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### `dir="auto"`
|
|
123
|
+
|
|
124
|
+
Detects direction from first strong directional character. Use for user-supplied or unknown content.
|
|
125
|
+
|
|
126
|
+
```html
|
|
127
|
+
<span dir="auto">{{userInput}}</span>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### `<bdi>` (Bidirectional Isolate)
|
|
131
|
+
|
|
132
|
+
Isolates content from surrounding BiDi context. Use when direction is unknown and you want the algorithm to determine it independently.
|
|
133
|
+
|
|
134
|
+
```html
|
|
135
|
+
<bdi>{{username}}</bdi> commented
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 4. Platform Implementation
|
|
141
|
+
|
|
142
|
+
### Web (HTML/CSS)
|
|
143
|
+
|
|
144
|
+
- Set `dir` on `<html>` for document; override on specific elements
|
|
145
|
+
- Use `dir="auto"` for dynamic content
|
|
146
|
+
- CSS: `direction`, `unicode-bidi` (rarely needed if markup is correct)
|
|
147
|
+
|
|
148
|
+
### Flutter
|
|
149
|
+
|
|
150
|
+
```dart
|
|
151
|
+
Directionality(
|
|
152
|
+
textDirection: TextDirection.rtl,
|
|
153
|
+
child: child,
|
|
154
|
+
)
|
|
155
|
+
// Or: Directionality.of(context)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### React
|
|
159
|
+
|
|
160
|
+
```tsx
|
|
161
|
+
<div dir="rtl" lang="ar">{content}</div>
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### iOS
|
|
165
|
+
|
|
166
|
+
```swift
|
|
167
|
+
// UIView.semanticContentAttribute = .forceRightToLeft
|
|
168
|
+
// Or per view
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Android
|
|
172
|
+
|
|
173
|
+
```xml
|
|
174
|
+
android:layoutDirection="rtl"
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 5. Mixed Content Handling
|
|
180
|
+
|
|
181
|
+
### LTR in RTL Context
|
|
182
|
+
|
|
183
|
+
- English brand names, URLs, code snippets, email addresses
|
|
184
|
+
- Wrap in `dir="ltr"` or LRI/PDI when in plain text
|
|
185
|
+
|
|
186
|
+
### Numbers
|
|
187
|
+
|
|
188
|
+
- European numerals (0123) are weakly directional; they can "stick" to RTL
|
|
189
|
+
- Insert LRM before a number in LTR context if it incorrectly joins RTL
|
|
190
|
+
- Arabic numerals (٠١٢٣) are RTL; use when displaying in Arabic UI
|
|
191
|
+
|
|
192
|
+
### URLs and Email
|
|
193
|
+
|
|
194
|
+
- Always LTR; wrap in `dir="ltr"` if displayed in RTL paragraph
|
|
195
|
+
|
|
196
|
+
### Punctuation
|
|
197
|
+
|
|
198
|
+
- Punctuation at the end of an RTL phrase may be assigned to the wrong run
|
|
199
|
+
- Add RLM after the punctuation to extend the RTL run, or wrap in RLI/PDI
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## 6. Anti-Patterns
|
|
204
|
+
|
|
205
|
+
1. **Storing visual order** — Store logical order; let the algorithm handle display.
|
|
206
|
+
2. **Using LRE/RLE instead of LRI/RLI** — Causes spillover; prefer isolates.
|
|
207
|
+
3. **Ignoring neutral characters** — Commas, spaces between RTL phrases can misalign.
|
|
208
|
+
4. **No base direction for user content** — Use `dir="auto"` or detect.
|
|
209
|
+
5. **Assuming `dir` is inherited** — Explicitly set on root and overrides.
|
|
210
|
+
6. **Mixing `direction` CSS with `dir`** — Prefer `dir` for semantics.
|
|
211
|
+
7. **Forgetting `lang`** — `dir` and `lang` should be set together.
|
|
212
|
+
8. **Not wrapping opposite-direction phrases** — Loose wrapping causes wrong display.
|
|
213
|
+
9. **Using override (LRO/RLO) for isolation** — Override forces display order; use isolate instead.
|
|
214
|
+
10. **Skipping BiDi for "English-only" apps** — User names, search results, and API data can be any script.
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## 7. Testing Approach
|
|
219
|
+
|
|
220
|
+
- Test with real Arabic (العربية) and Hebrew (עברית) — not placeholder text
|
|
221
|
+
- Test mixed content: "Hello العربية 123"
|
|
222
|
+
- Test spillover case: RTL phrase + number
|
|
223
|
+
- Test lists of opposite-direction items (e.g., country names in Arabic in LTR list)
|
|
224
|
+
- Verify copy-paste preserves logical order
|
|
225
|
+
- Check `dir` and `lang` on root and key containers
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## Quick Reference Checklist
|
|
230
|
+
|
|
231
|
+
- [ ] Store and transmit text in logical order
|
|
232
|
+
- [ ] Set `dir` and `lang` on document root
|
|
233
|
+
- [ ] Use RLI/LRI/PDI (not RLE/LRE) for plain-text BiDi
|
|
234
|
+
- [ ] Wrap opposite-direction phrases tightly
|
|
235
|
+
- [ ] Use `dir="auto"` for unknown user content
|
|
236
|
+
- [ ] Add LRM/RLM when needed to fix spillover
|
|
237
|
+
- [ ] Test with real Arabic and Hebrew strings
|
|
238
|
+
- [ ] Verify numbers and punctuation display correctly
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
*Researched: 2026-03-08 | Sources: Unicode UAX #9, W3C BiDi controls, W3C visual vs logical, MDN dir/bdi*
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Unicode and Encoding — i18n/RTL Expertise Module
|
|
2
|
+
|
|
3
|
+
> Character encoding is the foundation: UTF-8 everywhere, normalization for comparison, and understanding code points vs grapheme clusters. Wrong encoding causes mojibake, broken emoji, and lost characters.
|
|
4
|
+
|
|
5
|
+
> **Category:** Foundation
|
|
6
|
+
> **Applies to:** All
|
|
7
|
+
> **Key standards:** Unicode, UTF-8 (RFC 3629)
|
|
8
|
+
> **RTL impact:** Low — encoding enables all scripts; RTL is layout
|
|
9
|
+
|
|
10
|
+
## 1. Core Concepts
|
|
11
|
+
|
|
12
|
+
### UTF-8 as Standard
|
|
13
|
+
|
|
14
|
+
- **99% of web** uses UTF-8
|
|
15
|
+
- Variable-width: 1–4 bytes per character
|
|
16
|
+
- ASCII-compatible (bytes 0–127 identical)
|
|
17
|
+
- Supports all 1.1M+ Unicode code points
|
|
18
|
+
|
|
19
|
+
### Code Points vs Characters
|
|
20
|
+
|
|
21
|
+
- **Code point:** U+0000 to U+10FFFF (e.g., U+0041 = 'A')
|
|
22
|
+
- **Grapheme cluster:** What users perceive as one character (e.g., "é" = e + combining acute, or precomposed U+00E9)
|
|
23
|
+
- **Surrogate pairs:** UTF-16 uses two 16-bit units for code points > U+FFFF; common bug source in JS (string length, indexing)
|
|
24
|
+
|
|
25
|
+
### Unicode Normalization
|
|
26
|
+
|
|
27
|
+
- **NFC** (Canonical Composition): Preferred for web; precomposed where possible
|
|
28
|
+
- **NFD** (Canonical Decomposition): Decomposed; used in some systems
|
|
29
|
+
- **NFKC/NFKD:** Compatibility forms; use for search/collation, not display
|
|
30
|
+
- Use NFC for storage and comparison to avoid duplicate representations
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. Declaration and Configuration
|
|
35
|
+
|
|
36
|
+
| Layer | How to Set UTF-8 |
|
|
37
|
+
|-------|------------------|
|
|
38
|
+
| HTML5 | `<meta charset="UTF-8">` |
|
|
39
|
+
| HTTP | `Content-Type: text/html; charset=UTF-8` |
|
|
40
|
+
| JSON API | `Content-Type: application/json; charset=UTF-8` |
|
|
41
|
+
| MySQL | `utf8mb4` (not `utf8` — that's 3-byte only; emoji need 4) |
|
|
42
|
+
| PostgreSQL | `UTF8` encoding |
|
|
43
|
+
| Node/JS | Default UTF-8 in modern runtimes |
|
|
44
|
+
| Python | `# -*- coding: utf-8 -*-` or default in Python 3 |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 3. Locale Variations
|
|
49
|
+
|
|
50
|
+
- **Arabic:** Requires UTF-8; no special encoding
|
|
51
|
+
- **Hebrew:** Same
|
|
52
|
+
- **CJK:** Multi-byte sequences; ensure no truncation at byte boundaries
|
|
53
|
+
- **Emoji:** 4-byte sequences in UTF-8; `utf8mb4` in MySQL
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 4. Anti-Patterns
|
|
58
|
+
|
|
59
|
+
1. **Assuming 1 byte = 1 character** — UTF-8 is variable-width
|
|
60
|
+
2. **Truncating by byte count** — Can split multi-byte sequences; truncate by grapheme or code point
|
|
61
|
+
3. **Using `utf8` in MySQL** — Use `utf8mb4` for full Unicode
|
|
62
|
+
4. **No charset in HTTP/HTML** — Browsers guess; can cause mojibake
|
|
63
|
+
5. **Double-encoding** — Encoding already-UTF-8 bytes again
|
|
64
|
+
6. **String length for limits** — `"é".length` is 2 in JS (UTF-16); use grapheme segmentation for display limits
|
|
65
|
+
7. **Case conversion without locale** — Turkish dotted i; use `toLocaleLowerCase('tr-TR')`
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 5. Testing
|
|
70
|
+
|
|
71
|
+
- Test with: العربية, 日本語, emoji (👋), combining characters (é)
|
|
72
|
+
- Verify no mojibake when submitting forms
|
|
73
|
+
- Check DB storage and retrieval
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Quick Reference Checklist
|
|
78
|
+
|
|
79
|
+
- [ ] UTF-8 declared in HTML, HTTP, DB
|
|
80
|
+
- [ ] MySQL: `utf8mb4`
|
|
81
|
+
- [ ] NFC normalization for comparison
|
|
82
|
+
- [ ] No byte-based truncation of strings
|
|
83
|
+
- [ ] Test with Arabic, CJK, emoji
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
*Researched: 2026-03-08 | Sources: Unicode FAQ, W3C forms UTF-8, Better i18n encoding*
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# i18n/RTL Expertise — Knowledge Base
|
|
2
|
+
|
|
3
|
+
Comprehensive internationalization, localization, and RTL expertise for AI agents. Used during **Clarifier** (architecture) and **Dev** (implementation) to bake i18n in from day one.
|
|
4
|
+
|
|
5
|
+
## Directory Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
expertise/i18n/
|
|
9
|
+
foundations/ — Core concepts, standards, patterns
|
|
10
|
+
rtl/ — RTL-specific rules, Arabic, Hebrew
|
|
11
|
+
platform/ — Flutter, React, iOS, Android, Web, Backend
|
|
12
|
+
content/ — Translation, MT, adaptation
|
|
13
|
+
advanced/ — BiDi algorithm, complex scripts, a11y, performance
|
|
14
|
+
PROGRESS.md — Research status
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Navigation
|
|
18
|
+
|
|
19
|
+
| Need | Read |
|
|
20
|
+
|------|------|
|
|
21
|
+
| Architecture decisions | foundations/i18n-architecture.md |
|
|
22
|
+
| String extraction | foundations/string-externalization.md |
|
|
23
|
+
| RTL layout rules | rtl/rtl-fundamentals.md, rtl/rtl-layout-mirroring.md |
|
|
24
|
+
| Arabic specifics | rtl/arabic-specific.md |
|
|
25
|
+
| Hebrew specifics | rtl/hebrew-specific.md |
|
|
26
|
+
| Flutter i18n | platform/flutter-i18n.md |
|
|
27
|
+
| React i18n | platform/react-i18n.md |
|
|
28
|
+
| Web CSS RTL | platform/web-css-i18n.md |
|
|
29
|
+
| BiDi text | foundations/text-direction-bidi.md |
|
|
30
|
+
| Testing RTL | rtl/rtl-testing-and-qa.md |
|
|
31
|
+
|
|
32
|
+
## Key Principles
|
|
33
|
+
|
|
34
|
+
1. **Physical vs logical** — Use start/end, inline-start/end; never left/right for layout
|
|
35
|
+
2. **Arabic ≠ Hebrew** — Different script, numerals, calendar, plurals
|
|
36
|
+
3. **ICU for plurals** — Never `count === 1 ? 'item' : 'items'`
|
|
37
|
+
4. **Intl for formats** — Never hardcode date/number formats
|
|
38
|
+
5. **Real text for testing** — العربية، עברית — not placeholder
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Backend i18n — i18n/RTL Expertise Module
|
|
2
|
+
|
|
3
|
+
> Backend i18n: Accept-Language, locale parameter, message catalogs, and formatting. APIs return locale-aware content; never assume server locale.
|
|
4
|
+
|
|
5
|
+
> **Category:** Platform
|
|
6
|
+
> **Applies to:** Backend
|
|
7
|
+
> **Key standards:** HTTP Accept-Language, BCP 47
|
|
8
|
+
> **RTL impact:** Low — backend returns data; client handles layout
|
|
9
|
+
|
|
10
|
+
## 1. Core Concepts
|
|
11
|
+
|
|
12
|
+
- **Locale resolution:** Accept-Language header or ?locale= query param
|
|
13
|
+
- **Message catalogs:** gettext, ICU, or JSON per locale
|
|
14
|
+
- **Formatting:** Use ICU/Intl for dates, numbers, currency server-side
|
|
15
|
+
- **Storage:** Store user locale preference; pass to formatting
|
|
16
|
+
|
|
17
|
+
## 2. Implementation
|
|
18
|
+
|
|
19
|
+
- Parse Accept-Language; resolve to supported locale
|
|
20
|
+
- Load message catalog for locale
|
|
21
|
+
- Format dates/numbers with locale
|
|
22
|
+
- Return Content-Language in response
|
|
23
|
+
|
|
24
|
+
## 3. Anti-Patterns
|
|
25
|
+
|
|
26
|
+
- Assuming server locale
|
|
27
|
+
- Hardcoded formats
|
|
28
|
+
- No locale in API
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
*Researched: 2026-03-08 | Sources: HTTP i18n*
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Flutter i18n — i18n/RTL Expertise Module
|
|
2
|
+
|
|
3
|
+
> Flutter's built-in i18n: ARB files, `flutter gen-l10n`, `AppLocalizations`, and RTL via `Directionality`. The `intl` package and `flutter_localizations` provide the foundation.
|
|
4
|
+
|
|
5
|
+
> **Category:** Platform
|
|
6
|
+
> **Applies to:** Mobile (Flutter)
|
|
7
|
+
> **Key standards:** ARB, ICU MessageFormat
|
|
8
|
+
> **RTL impact:** High — Directionality, EdgeInsetsDirectional, AlignmentDirectional
|
|
9
|
+
|
|
10
|
+
## 1. Platform i18n System
|
|
11
|
+
|
|
12
|
+
### Built-in Framework
|
|
13
|
+
|
|
14
|
+
- **ARB** (Application Resource Bundle): JSON-based locale files
|
|
15
|
+
- **Code generation:** `flutter gen-l10n` produces `AppLocalizations`
|
|
16
|
+
- **Delegates:** `AppLocalizations.localizationsDelegates`
|
|
17
|
+
- **Supported locales:** `AppLocalizations.supportedLocales`
|
|
18
|
+
|
|
19
|
+
### RTL at System Level
|
|
20
|
+
|
|
21
|
+
- `Directionality` widget; `TextDirection.rtl` for RTL
|
|
22
|
+
- `MaterialApp` uses `locale` to set `Directionality` when supported locale is RTL (ar, he, etc.)
|
|
23
|
+
- `EdgeInsetsDirectional`, `AlignmentDirectional`, `AlignmentDirectional` for layout
|
|
24
|
+
|
|
25
|
+
### Locale Resolution
|
|
26
|
+
|
|
27
|
+
- `MaterialApp.locale` or `supportedLocales` with `localeResolutionCallback`
|
|
28
|
+
- Fallback: first `supportedLocales` when no match
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2. Setup Guide
|
|
33
|
+
|
|
34
|
+
### pubspec.yaml
|
|
35
|
+
|
|
36
|
+
```yaml
|
|
37
|
+
dependencies:
|
|
38
|
+
flutter_localizations:
|
|
39
|
+
sdk: flutter
|
|
40
|
+
intl: ^0.19.0
|
|
41
|
+
|
|
42
|
+
flutter:
|
|
43
|
+
generate: true
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### l10n.yaml
|
|
47
|
+
|
|
48
|
+
```yaml
|
|
49
|
+
arb-dir: lib/l10n
|
|
50
|
+
template-arb-file: app_en.arb
|
|
51
|
+
output-localization-file: app_localizations.dart
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Folder Structure
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
lib/
|
|
58
|
+
l10n/
|
|
59
|
+
app_en.arb
|
|
60
|
+
app_ar.arb
|
|
61
|
+
app_he.arb
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### MaterialApp
|
|
65
|
+
|
|
66
|
+
```dart
|
|
67
|
+
MaterialApp(
|
|
68
|
+
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
|
69
|
+
supportedLocales: AppLocalizations.supportedLocales,
|
|
70
|
+
home: Home(),
|
|
71
|
+
)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 3. Key APIs and Patterns
|
|
77
|
+
|
|
78
|
+
### String Localization
|
|
79
|
+
|
|
80
|
+
```dart
|
|
81
|
+
AppLocalizations.of(context)!.greeting('أحمد')
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### ARB with Placeholders
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"greeting": "Hello, {name}!",
|
|
89
|
+
"@greeting": {
|
|
90
|
+
"placeholders": { "name": { "type": "String" } }
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Plural (ICU)
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"itemCount": "{count, plural, =0{No items} one{1 item} other{# items}}",
|
|
100
|
+
"@itemCount": { "placeholders": { "count": { "type": "int" } } }
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Date/Number Formatting
|
|
105
|
+
|
|
106
|
+
```dart
|
|
107
|
+
DateFormat.yMd(locale).format(date)
|
|
108
|
+
intl.NumberFormat.decimalPattern(locale).format(number)
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### RTL
|
|
112
|
+
|
|
113
|
+
```dart
|
|
114
|
+
Directionality.of(context) == TextDirection.rtl
|
|
115
|
+
EdgeInsetsDirectional.only(start: 16, end: 8)
|
|
116
|
+
AlignmentDirectional.centerStart
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 4. RTL Support
|
|
122
|
+
|
|
123
|
+
- Add `ar`, `he`, `fa`, `ur` to `supportedLocales`
|
|
124
|
+
- Use `EdgeInsetsDirectional`, `AlignmentDirectional`, `Positioned.directional`
|
|
125
|
+
- Icons: many auto-mirror; use `Transform` for custom
|
|
126
|
+
- `TextDirection.rtl` for RTL text
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 5. Anti-Patterns
|
|
131
|
+
|
|
132
|
+
1. **EdgeInsets.only(left: 16)** — Use `EdgeInsetsDirectional.only(start: 16)`
|
|
133
|
+
2. **Alignment.centerLeft** — Use `AlignmentDirectional.centerStart`
|
|
134
|
+
3. **Missing RTL locales** — Add ar, he to supportedLocales
|
|
135
|
+
4. **Hardcoded strings** — Always use AppLocalizations
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Quick Reference Checklist
|
|
140
|
+
|
|
141
|
+
- [ ] flutter_localizations + intl
|
|
142
|
+
- [ ] l10n.yaml + ARB files
|
|
143
|
+
- [ ] supportedLocales includes ar, he
|
|
144
|
+
- [ ] EdgeInsetsDirectional, AlignmentDirectional
|
|
145
|
+
- [ ] Run flutter gen-l10n
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
*Researched: 2026-03-08 | Sources: Flutter docs, IntlPull Flutter guide*
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Native Android i18n — i18n/RTL Expertise Module
|
|
2
|
+
|
|
3
|
+
> Android i18n: strings.xml, plurals, getString(), and RTL via layoutDirection, start/end attributes, and AutoMirrored drawables.
|
|
4
|
+
|
|
5
|
+
> **Category:** Platform
|
|
6
|
+
> **Applies to:** Mobile (Android)
|
|
7
|
+
> **Key standards:** Android Resources
|
|
8
|
+
> **RTL impact:** High — layoutDirection, start/end
|
|
9
|
+
|
|
10
|
+
## 1. Platform i18n System
|
|
11
|
+
|
|
12
|
+
- **Strings:** res/values/strings.xml, res/values-ar/strings.xml
|
|
13
|
+
- **Plurals:** plurals resource with quantity
|
|
14
|
+
- **API:** getString(R.string.key), getQuantityString()
|
|
15
|
+
- **RTL:** android:layoutDirection="locale", layout_marginStart/End
|
|
16
|
+
|
|
17
|
+
## 2. Setup
|
|
18
|
+
|
|
19
|
+
- Create values-ar, values-he for RTL
|
|
20
|
+
- Use start/end in XML (not left/right)
|
|
21
|
+
- Icons.AutoMirrored for directional icons
|
|
22
|
+
|
|
23
|
+
## 3. RTL
|
|
24
|
+
|
|
25
|
+
- layoutDirection="rtl" or "locale"
|
|
26
|
+
- layout_marginStart, paddingStart
|
|
27
|
+
- getLayoutDirectionFromLocale()
|
|
28
|
+
|
|
29
|
+
## 4. Anti-Patterns
|
|
30
|
+
|
|
31
|
+
- layout_marginLeft/Right
|
|
32
|
+
- Hardcoded strings
|
|
33
|
+
- No RTL resource directories
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
*Researched: 2026-03-08 | Sources: Android docs*
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Native iOS i18n — i18n/RTL Expertise Module
|
|
2
|
+
|
|
3
|
+
> iOS i18n: Localizable.strings, .stringsdict for plurals, NSLocalizedString, and RTL via leading/trailing constraints and semanticContentAttribute.
|
|
4
|
+
|
|
5
|
+
> **Category:** Platform
|
|
6
|
+
> **Applies to:** Mobile (iOS)
|
|
7
|
+
> **Key standards:** Apple Localization
|
|
8
|
+
> **RTL impact:** High — leading/trailing, semanticContentAttribute
|
|
9
|
+
|
|
10
|
+
## 1. Platform i18n System
|
|
11
|
+
|
|
12
|
+
- **Strings:** Localizable.strings (`"key" = "value";`)
|
|
13
|
+
- **Plurals:** .stringsdict
|
|
14
|
+
- **API:** NSLocalizedString, String(localized:)
|
|
15
|
+
- **RTL:** leading/trailing in Auto Layout; UIView.semanticContentAttribute
|
|
16
|
+
|
|
17
|
+
## 2. Setup
|
|
18
|
+
|
|
19
|
+
- Add languages in Project → Info → Localizations
|
|
20
|
+
- Create Localizable.strings per locale
|
|
21
|
+
- Use NSLocalizedString("key", comment: "")
|
|
22
|
+
|
|
23
|
+
## 3. RTL
|
|
24
|
+
|
|
25
|
+
- Use leadingAnchor, trailingAnchor (not left/right)
|
|
26
|
+
- semanticContentAttribute = .forceRightToLeft for RTL
|
|
27
|
+
- SF Symbols auto-mirror many directional icons
|
|
28
|
+
|
|
29
|
+
## 4. Anti-Patterns
|
|
30
|
+
|
|
31
|
+
- left/right constraints
|
|
32
|
+
- Hardcoded strings
|
|
33
|
+
- No RTL testing
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
*Researched: 2026-03-08 | Sources: Apple HIG, Developer docs*
|