@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,27 @@
|
|
|
1
|
+
# Directory Purpose
|
|
2
|
+
|
|
3
|
+
The `frontend` directory provides framework-specific guidelines, best practices, and architectural standards for client-side applications (web, mobile, and desktop).
|
|
4
|
+
|
|
5
|
+
# Key Concepts
|
|
6
|
+
|
|
7
|
+
- Framework-specific state management and rendering
|
|
8
|
+
- Organizing client-side codebases
|
|
9
|
+
- Native vs cross-platform development paradigms
|
|
10
|
+
|
|
11
|
+
# File Map
|
|
12
|
+
|
|
13
|
+
- `index.md` — semantic map of the frontend directory
|
|
14
|
+
- `angular.md` — RxJS, modules, and Angular CLI standards
|
|
15
|
+
- `desktop-electron.md` — IPC communication, security, and main/renderer processes
|
|
16
|
+
- `flutter.md` — widget trees, BLoC/Provider, and performance
|
|
17
|
+
- `native-android.md` — Kotlin, Jetpack Compose, and Android SDK guidelines
|
|
18
|
+
- `native-ios.md` — Swift, SwiftUI, and iOS SDK guidelines
|
|
19
|
+
- `react-native.md` — TypeScript architecture, Expo, state management, navigation, performance, EAS
|
|
20
|
+
- `react.md` — hooks, context, Next.js, and functional components
|
|
21
|
+
- `vue.md` — Composition API, Pinia, and Nuxt.js guidelines
|
|
22
|
+
|
|
23
|
+
# Reading Guide
|
|
24
|
+
|
|
25
|
+
If building a web app → read `react.md`, `vue.md`, or `angular.md`
|
|
26
|
+
If building a mobile app → read `flutter.md`, `native-ios.md`, `native-android.md`, or `react-native.md`
|
|
27
|
+
If building a desktop app → read `desktop-electron.md`
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
# Native Android -- Expertise Module
|
|
2
|
+
|
|
3
|
+
> A Native Android specialist designs, builds, and maintains Android applications using Kotlin and Jetpack Compose,
|
|
4
|
+
> applying modern architecture patterns (MVVM/MVI + Clean Architecture), optimizing for performance across diverse
|
|
5
|
+
> device configurations, and shipping through the Google Play ecosystem with robust CI/CD and quality tooling.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Core Patterns & Conventions
|
|
10
|
+
|
|
11
|
+
### Project Structure (Multi-Module with Convention Plugins)
|
|
12
|
+
|
|
13
|
+
Follow the modularization strategy from Google's Now in Android reference app. Organize by feature and layer, using a `build-logic` composite build for convention plugins.
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
project-root/
|
|
17
|
+
build-logic/convention/ # Shared Gradle convention plugins
|
|
18
|
+
gradle/libs.versions.toml # Single version catalog
|
|
19
|
+
app/ # Application module (thin shell)
|
|
20
|
+
core/
|
|
21
|
+
common/ | data/ | database/ | datastore/ | domain/ | model/ | network/ | ui/ | testing/
|
|
22
|
+
feature/
|
|
23
|
+
home/ | settings/ | profile/ # Feature modules: UI + ViewModel
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Convention plugins replace 43+ lines of module config with a 3-line plugin application. Always use `build-logic/` composite build (not `buildSrc`) for better build cache performance.
|
|
27
|
+
|
|
28
|
+
**Current versions (early 2026):** Kotlin 2.1.x, AGP 8.7+ (9.0 alpha), Compose BOM 2025.01+, Gradle 8.6+ Kotlin DSL, Target SDK 35 (required by Play Store since Aug 2025).
|
|
29
|
+
|
|
30
|
+
### Naming Conventions & Code Style
|
|
31
|
+
|
|
32
|
+
- Follow [Kotlin coding conventions](https://kotlinlang.org/docs/coding-conventions.html).
|
|
33
|
+
- Composable functions emitting UI: `PascalCase` (`UserProfile`). Returning a value: `camelCase` (`rememberScrollState`).
|
|
34
|
+
- State holders: `*UiState`. ViewModels: `*ViewModel`. Use cases: verb-noun (`GetUserProfileUseCase`).
|
|
35
|
+
- Repository interfaces in `domain/`, implementations in `data/` suffixed `Impl` or prefixed `Offline`/`Network`.
|
|
36
|
+
- Test classes mirror source: `HomeViewModelTest`, `UserRepositoryTest`.
|
|
37
|
+
|
|
38
|
+
### Architecture Patterns
|
|
39
|
+
|
|
40
|
+
**MVVM with UDF** (Google-recommended default): View (Compose) observes `UiState` via `StateFlow` from ViewModel, which delegates to Use Cases and exposes immutable state.
|
|
41
|
+
|
|
42
|
+
**MVI** for complex screens: single sealed `UiEvent` type flows into ViewModel; reducer produces new immutable state; side effects via `Channel`/`SharedFlow`.
|
|
43
|
+
|
|
44
|
+
**Clean Architecture layers:** Presentation (`:feature:*`) -> Domain (`:core:domain`, pure Kotlin) <- Data (`:core:data/network/database`). Dependencies point inward.
|
|
45
|
+
|
|
46
|
+
### Jetpack Compose UI Patterns
|
|
47
|
+
|
|
48
|
+
- **State hoisting:** Stateless composables receive state as params, emit events via lambdas. Hoist to lowest common ancestor. Never pass `ViewModel` or `MutableState` down.
|
|
49
|
+
- **Slots API:** Use `@Composable` content lambdas for flexible layouts. Components handle decoration/interaction, not content.
|
|
50
|
+
- **Previews:** Every UI composable needs `@Preview`. Use `@PreviewParameter` for variants.
|
|
51
|
+
|
|
52
|
+
### State Management
|
|
53
|
+
|
|
54
|
+
```kotlin
|
|
55
|
+
sealed interface HomeUiState {
|
|
56
|
+
data object Loading : HomeUiState
|
|
57
|
+
data class Success(val items: List<Item>) : HomeUiState
|
|
58
|
+
data class Error(val message: String) : HomeUiState
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
class HomeViewModel(private val getItemsUseCase: GetItemsUseCase) : ViewModel() {
|
|
62
|
+
val uiState: StateFlow<HomeUiState> = getItemsUseCase()
|
|
63
|
+
.map<List<Item>, HomeUiState> { HomeUiState.Success(it) }
|
|
64
|
+
.catch { emit(HomeUiState.Error(it.message ?: "Unknown error")) }
|
|
65
|
+
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), HomeUiState.Loading)
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
- `StateFlow` for UI state, `SharedFlow` for one-time events. Collect with `collectAsStateWithLifecycle()`.
|
|
70
|
+
|
|
71
|
+
### Navigation (Type-Safe Routes, Navigation 2.8+)
|
|
72
|
+
|
|
73
|
+
```kotlin
|
|
74
|
+
@Serializable data object Home
|
|
75
|
+
@Serializable data class Detail(val id: String)
|
|
76
|
+
|
|
77
|
+
NavHost(navController, startDestination = Home) {
|
|
78
|
+
composable<Home> { HomeScreen(onItemClick = { navController.navigate(Detail(it.id)) }) }
|
|
79
|
+
composable<Detail> { it.toRoute<Detail>().let { route -> DetailScreen(id = route.id) } }
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Replace all string-based routes with `@Serializable` types for compile-time safety. Extract in ViewModels via `SavedStateHandle.toRoute<T>()`.
|
|
84
|
+
|
|
85
|
+
### Data Flow, Error Handling, Logging
|
|
86
|
+
|
|
87
|
+
- **Repository pattern:** Interface in domain, implementation combines network + local cache. Returns `Flow<T>` for observable, `suspend fun` for one-shot. Offline-first: emit cached, then refresh.
|
|
88
|
+
- **Use Cases:** Single `operator fun invoke()`. Compose repositories or apply business rules.
|
|
89
|
+
- **Errors:** `kotlin.Result` for simple cases; sealed classes (`DataError.Network`, `DataError.NoConnection`) for domain errors. Never catch `CancellationException`. Map exceptions at the repository boundary.
|
|
90
|
+
- **Logging:** Timber (auto-tags, no-op in release). `StrictMode` in debug. Crashlytics tree for production error forwarding.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Anti-Patterns & Pitfalls
|
|
95
|
+
|
|
96
|
+
### 1. Catching CancellationException in Coroutines
|
|
97
|
+
Creates zombie coroutines that break structured concurrency. Use `ensureActive()` or re-throw explicitly.
|
|
98
|
+
|
|
99
|
+
### 2. Overloading the ViewModel
|
|
100
|
+
ViewModels handling API calls, validation, analytics, permissions, and navigation become untestable monoliths. Delegate to Use Cases and Repositories.
|
|
101
|
+
|
|
102
|
+
### 3. Performing Side Effects in Composition
|
|
103
|
+
Composables recompose unpredictably. Side effects in composition cause duplicate API calls and analytics events. Use `LaunchedEffect` / `SideEffect`.
|
|
104
|
+
|
|
105
|
+
### 4. Modeling One-Time Events as State
|
|
106
|
+
A snackbar stored in `UiState` re-fires on config changes. Use `Channel` or `SharedFlow` for events.
|
|
107
|
+
|
|
108
|
+
### 5. Skipping `remember` / `derivedStateOf`
|
|
109
|
+
Expensive computations re-run on every recomposition. Cache with `remember`; throttle with `derivedStateOf`.
|
|
110
|
+
|
|
111
|
+
### 6. Passing Mutable Types Down Compose Tree
|
|
112
|
+
`MutableState`, `MutableList`, or `ViewModel` in child composables breaks UDF, prevents reuse, kills previews. Pass immutable state down, lambdas up.
|
|
113
|
+
|
|
114
|
+
### 7. Using GlobalScope for Background Work
|
|
115
|
+
Leaks coroutines beyond lifecycle. Use `viewModelScope`, `lifecycleScope`, or lifecycle-bound custom scopes.
|
|
116
|
+
|
|
117
|
+
### 8. Ignoring Compose Stability
|
|
118
|
+
Unstable parameters (stdlib `List`, `var` fields) force recomposition. Use `@Immutable`/`@Stable` or enable strong skipping mode (default since Compose compiler 1.5.4+).
|
|
119
|
+
|
|
120
|
+
### 9. Blocking the Main Thread
|
|
121
|
+
Synchronous I/O causes ANRs. Use `withContext(Dispatchers.IO)` for all network, DB, and file operations.
|
|
122
|
+
|
|
123
|
+
### 10. Hardcoding Secrets in Source Code
|
|
124
|
+
API keys in source are extractable from APKs. Use `local.properties` (gitignored), CI-injected BuildConfig, or Keystore.
|
|
125
|
+
|
|
126
|
+
### 11. Not Handling Process Death
|
|
127
|
+
Android kills background apps. Use `SavedStateHandle`, `rememberSaveable`, and persistent storage (Room/DataStore).
|
|
128
|
+
|
|
129
|
+
### 12. Leaking Activity Context
|
|
130
|
+
Static/long-lived references to Activity prevent GC. Use `applicationContext` for singletons and long-lived operations.
|
|
131
|
+
|
|
132
|
+
### 13. Skipping R8 Configuration
|
|
133
|
+
Missing keep rules cause runtime crashes when reflection-based libraries are stripped. Test release builds early.
|
|
134
|
+
|
|
135
|
+
### 14. Testing Flows Without Turbine
|
|
136
|
+
Raw `collect` in tests is timing-dependent and flaky. Turbine provides deterministic `awaitItem()` and timeout control.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Testing Strategy
|
|
141
|
+
|
|
142
|
+
### Unit Testing (JUnit 5 + MockK + Turbine)
|
|
143
|
+
|
|
144
|
+
```kotlin
|
|
145
|
+
@ExtendWith(MainDispatcherExtension::class)
|
|
146
|
+
class HomeViewModelTest {
|
|
147
|
+
private val getItemsUseCase = mockk<GetItemsUseCase>()
|
|
148
|
+
|
|
149
|
+
@Test
|
|
150
|
+
fun `emits success state when items load`() = runTest {
|
|
151
|
+
every { getItemsUseCase() } returns flowOf(listOf(testItem))
|
|
152
|
+
val viewModel = HomeViewModel(getItemsUseCase)
|
|
153
|
+
viewModel.uiState.test {
|
|
154
|
+
assertIs<HomeUiState.Loading>(awaitItem())
|
|
155
|
+
assertIs<HomeUiState.Success>(awaitItem())
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
- **JUnit 5** (`@ExtendWith`, `@Nested`, `@ParameterizedTest`), **MockK** (`mockk`, `coEvery`, `verify`), **Turbine** 1.1+ for Flow testing, **kotlinx-coroutines-test** (`runTest`, `StandardTestDispatcher`).
|
|
162
|
+
|
|
163
|
+
### UI Testing (Compose Testing)
|
|
164
|
+
|
|
165
|
+
- `createComposeRule()` for pure Compose tests. Add `testTag` to interactive elements.
|
|
166
|
+
- Prefer semantic matchers (`onNodeWithText`) over test tags. Use `performScrollToNode` for lazy layouts.
|
|
167
|
+
|
|
168
|
+
### Integration & Screenshot Testing
|
|
169
|
+
|
|
170
|
+
- **Hilt**: `@HiltAndroidTest` + `@TestInstallIn` for module replacement. **Room**: in-memory DB. **Network**: `MockWebServer`.
|
|
171
|
+
- **Paparazzi** (JVM-only, no emulator) or **Roborazzi** (Robolectric-based) for screenshot tests. Test light/dark, font scales, screen sizes. Run on every PR.
|
|
172
|
+
|
|
173
|
+
### Test Organization
|
|
174
|
+
|
|
175
|
+
- Test pyramid: many unit, fewer integration, fewest UI/E2E.
|
|
176
|
+
- Shared fixtures in `:core:testing`. `test/` for JVM tests, `androidTest/` for instrumented.
|
|
177
|
+
- CI: unit tests on every commit, screenshot tests on PR, instrumented tests nightly.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Performance Considerations
|
|
182
|
+
|
|
183
|
+
### Compose Performance
|
|
184
|
+
- **Stability:** `@Immutable`/`@Stable` annotations. Strong skipping mode (default 1.5.4+). Provide stable `key` to lazy layout items; use `contentType` for heterogeneous lists.
|
|
185
|
+
- **Defer reads:** Pass lambda `() -> State` to defer to draw phase. Use `derivedStateOf` for rapidly changing state.
|
|
186
|
+
- **Avoid allocations in composition:** No object creation or list mapping in composable bodies. Use `remember`.
|
|
187
|
+
|
|
188
|
+
### App Startup
|
|
189
|
+
- **Baseline Profiles:** Ship with APK/AAB for AOT compilation. Meta reports up to 40% improvement. Generate via `benchmark-macro-junit4`.
|
|
190
|
+
- **App Startup library** (`androidx.startup`) for ordered initialization. Minimize `Application.onCreate()`. Defer non-critical init.
|
|
191
|
+
|
|
192
|
+
### Memory & Battery
|
|
193
|
+
- **LeakCanary** (debug): auto-detects leaks. Use `LeakAssertions.assertNoLeaks()` in UI tests.
|
|
194
|
+
- `collectAsStateWithLifecycle()` stops collection when UI not visible. Unregister callbacks in lifecycle methods.
|
|
195
|
+
- **WorkManager** for deferrable work (respects Doze). Batch network requests. **Coil/Glide** with caching.
|
|
196
|
+
|
|
197
|
+
### R8 Optimization
|
|
198
|
+
- `isMinifyEnabled = true` + `isShrinkResources = true` for release. Use `proguard-android-optimize.txt` (non-optimizing deprecated from AGP 9.0).
|
|
199
|
+
- `-repackageclasses` saves DEX space. R8 full mode for deep whole-program optimization. Test release builds early; use mapping files for deobfuscation.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Security Considerations
|
|
204
|
+
|
|
205
|
+
### Keystore & Encrypted Storage
|
|
206
|
+
- **Android Keystore**: hardware-backed, keys non-extractable even on rooted devices. **EncryptedSharedPreferences** or DataStore with encryption for sensitive data. `MasterKey.Builder` with `AES256_GCM`.
|
|
207
|
+
|
|
208
|
+
### Network Security
|
|
209
|
+
- `network_security_config.xml`: disable cleartext (`cleartextTrafficPermitted="false"`), pin certificates with backup pins, debug-only CAs for proxy tools.
|
|
210
|
+
- OkHttp `CertificatePinner` for programmatic pinning. Enforce TLS 1.2+.
|
|
211
|
+
|
|
212
|
+
### Biometric Authentication
|
|
213
|
+
- **BiometricPrompt API** with `CryptoObject` for crypto-bound biometric auth (not just UI gating). Check `BiometricManager.canAuthenticate()`. Handle fallback to device credential.
|
|
214
|
+
|
|
215
|
+
### Obfuscation & Provider Security
|
|
216
|
+
- R8 obfuscation + `-allowaccessmodification`. Google Play Integrity API for tamper detection.
|
|
217
|
+
- `android:exported="false"` on ContentProviders. Sanitize all provider inputs (SQL injection). Prefer `FileProvider` for file sharing.
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Integration Patterns
|
|
222
|
+
|
|
223
|
+
### Networking: Retrofit + OkHttp (or Ktor for KMP)
|
|
224
|
+
|
|
225
|
+
```kotlin
|
|
226
|
+
interface UserApi {
|
|
227
|
+
@GET("users/{id}") suspend fun getUser(@Path("id") id: String): UserDto
|
|
228
|
+
@POST("users") suspend fun createUser(@Body user: CreateUserRequest): UserDto
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
val okHttpClient = OkHttpClient.Builder()
|
|
232
|
+
.addInterceptor(AuthInterceptor(tokenProvider))
|
|
233
|
+
.addInterceptor(HttpLoggingInterceptor().apply {
|
|
234
|
+
level = if (BuildConfig.DEBUG) Level.BODY else Level.NONE
|
|
235
|
+
}).build()
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Use **kotlinx.serialization** over Gson/Moshi (no reflection). **Ktor Client** for KMP projects.
|
|
239
|
+
|
|
240
|
+
### Dependency Injection: Hilt (or Koin)
|
|
241
|
+
|
|
242
|
+
```kotlin
|
|
243
|
+
@Module @InstallIn(SingletonComponent::class)
|
|
244
|
+
object NetworkModule {
|
|
245
|
+
@Provides @Singleton
|
|
246
|
+
fun provideUserApi(client: OkHttpClient): UserApi = Retrofit.Builder()
|
|
247
|
+
.baseUrl(BuildConfig.API_BASE_URL).client(client)
|
|
248
|
+
.addConverterFactory(Json.asConverterFactory("application/json".toMediaType()))
|
|
249
|
+
.build().create()
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Hilt for production apps (compile-time, scoped, testable). Koin for small projects or KMP.
|
|
254
|
+
|
|
255
|
+
### Room, WorkManager, Firebase
|
|
256
|
+
|
|
257
|
+
- **Room** with KSP (not KAPT). Return `Flow<T>` from DAOs. Encapsulate in `:core:database`. Migration tests with `MigrationTestHelper`.
|
|
258
|
+
- **WorkManager** for deferrable guaranteed work. `CoroutineWorker` + `@HiltWorker`. Constraints (network, battery). Not for immediate tasks.
|
|
259
|
+
- **Firebase:** Crashlytics (upload mapping files), Analytics, Remote Config, App Distribution, FCM. Use Firebase BOM.
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## DevOps & Deployment
|
|
264
|
+
|
|
265
|
+
### Build System
|
|
266
|
+
|
|
267
|
+
```toml
|
|
268
|
+
# gradle/libs.versions.toml
|
|
269
|
+
[versions]
|
|
270
|
+
kotlin = "2.1.21"
|
|
271
|
+
agp = "8.7.3"
|
|
272
|
+
compose-bom = "2025.01.01"
|
|
273
|
+
[plugins]
|
|
274
|
+
android-application = { id = "com.android.application", version.ref = "agp" }
|
|
275
|
+
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
Gradle Kotlin DSL exclusively. Version catalogs + convention plugins in `build-logic/`. Enable Gradle configuration cache and build cache.
|
|
279
|
+
|
|
280
|
+
### CI/CD & Deployment
|
|
281
|
+
|
|
282
|
+
- **GitHub Actions**: cache Gradle, run `./gradlew check`, assemble, deploy to Firebase App Distribution (service account credentials; token auth deprecated).
|
|
283
|
+
- **Build variants**: `debug` (`.debug` suffix), `release` (minified), `benchmark` (baseline profiles). Product flavors for environment (dev/staging/prod).
|
|
284
|
+
- **Play Store**: publish AAB (not APK). Use Play-managed signing. Staged rollouts: 1% -> 5% -> 20% -> 100%.
|
|
285
|
+
- **Monitoring**: Crashlytics + mapping files, Firebase Performance, Android Vitals. Target 99.5%+ crash-free rate.
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## Decision Trees
|
|
290
|
+
|
|
291
|
+
### Compose vs XML Views
|
|
292
|
+
|
|
293
|
+
```
|
|
294
|
+
New project or feature?
|
|
295
|
+
YES -> Jetpack Compose (XML is in maintenance mode; Compose is Google's recommended toolkit)
|
|
296
|
+
NO (brownfield with XML) -> Adopt incrementally via ComposeView; migrate screen by screen
|
|
297
|
+
Key: Compose reduces boilerplate ~50%. Team skill is the main blocker, not technical merit.
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Hilt vs Koin
|
|
301
|
+
|
|
302
|
+
```
|
|
303
|
+
Large / enterprise (50+ modules, multiple teams)?
|
|
304
|
+
-> Hilt (compile-time validation, 15-20% faster startup, official testing APIs)
|
|
305
|
+
KMP requirement?
|
|
306
|
+
-> Koin (KMP-compatible, no Android-specific codegen)
|
|
307
|
+
Small project / prototype?
|
|
308
|
+
-> Koin (5-min setup) or either
|
|
309
|
+
Key: Hilt catches errors at compile time; Koin crashes at runtime.
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Which Architecture Pattern?
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
Simple CRUD? -> MVVM + UDF (Google default, StateFlow + sealed UiState)
|
|
316
|
+
Complex interactions? -> MVI (single Intent type, Reducer, predictable state transitions)
|
|
317
|
+
Cross-platform logic? -> Clean Architecture + MVVM/MVI (pure Kotlin domain layer)
|
|
318
|
+
Key: Start simple. Add domain layer or MVI when complexity warrants it.
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## Code Examples
|
|
324
|
+
|
|
325
|
+
### Example 1: Complete Screen (ViewModel + Compose)
|
|
326
|
+
|
|
327
|
+
```kotlin
|
|
328
|
+
@HiltViewModel
|
|
329
|
+
class ProfileViewModel @Inject constructor(
|
|
330
|
+
private val getUserUseCase: GetUserUseCase, savedStateHandle: SavedStateHandle
|
|
331
|
+
) : ViewModel() {
|
|
332
|
+
private val userId: String = savedStateHandle.toRoute<ProfileRoute>().userId
|
|
333
|
+
val uiState: StateFlow<ProfileUiState> = getUserUseCase(userId)
|
|
334
|
+
.map<User, ProfileUiState> { ProfileUiState.Success(it) }
|
|
335
|
+
.catch { emit(ProfileUiState.Error(it.message ?: "Failed to load")) }
|
|
336
|
+
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), ProfileUiState.Loading)
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
@Composable
|
|
340
|
+
fun ProfileScreen(viewModel: ProfileViewModel = hiltViewModel()) {
|
|
341
|
+
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
|
|
342
|
+
when (uiState) {
|
|
343
|
+
is ProfileUiState.Loading -> CircularProgressIndicator(Modifier.testTag("loading"))
|
|
344
|
+
is ProfileUiState.Success -> Column(Modifier.padding(16.dp)) {
|
|
345
|
+
Text((uiState as ProfileUiState.Success).user.name, style = MaterialTheme.typography.headlineMedium)
|
|
346
|
+
}
|
|
347
|
+
is ProfileUiState.Error -> Text((uiState as ProfileUiState.Error).message, color = MaterialTheme.colorScheme.error)
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### Example 2: Offline-First Repository
|
|
353
|
+
|
|
354
|
+
```kotlin
|
|
355
|
+
class UserRepositoryImpl @Inject constructor(
|
|
356
|
+
private val api: UserApi, private val dao: UserDao, private val io: CoroutineDispatcher
|
|
357
|
+
) : UserRepository {
|
|
358
|
+
override fun getUser(id: String): Flow<User> = dao.observeUser(id)
|
|
359
|
+
.map { it.toDomain() }
|
|
360
|
+
.onStart { runCatching { dao.upsert(api.getUser(id).toEntity()) }
|
|
361
|
+
.onFailure { if (it is CancellationException) throw it; Timber.w(it) } }
|
|
362
|
+
.flowOn(io)
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### Example 3: Convention Plugin
|
|
367
|
+
|
|
368
|
+
```kotlin
|
|
369
|
+
// build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt
|
|
370
|
+
class AndroidFeatureConventionPlugin : Plugin<Project> {
|
|
371
|
+
override fun apply(target: Project) = with(target) {
|
|
372
|
+
pluginManager.apply { apply("com.android.library"); apply("org.jetbrains.kotlin.android")
|
|
373
|
+
apply("org.jetbrains.kotlin.plugin.compose"); apply("com.google.dagger.hilt.android") }
|
|
374
|
+
extensions.configure<LibraryExtension> { defaultConfig.targetSdk = 35 }
|
|
375
|
+
dependencies { add("implementation", project(":core:ui")); add("implementation", project(":core:domain")) }
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
// Usage: plugins { id("myapp.android.feature") }
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### Example 4: Room DAO with Flow
|
|
382
|
+
|
|
383
|
+
```kotlin
|
|
384
|
+
@Dao
|
|
385
|
+
interface UserDao {
|
|
386
|
+
@Query("SELECT * FROM users WHERE id = :id") fun observeUser(id: String): Flow<UserEntity>
|
|
387
|
+
@Upsert suspend fun upsert(user: UserEntity)
|
|
388
|
+
@Transaction @Query("SELECT * FROM users INNER JOIN teams ON users.team_id = teams.id WHERE teams.name = :teamName")
|
|
389
|
+
fun getUsersWithTeam(teamName: String): Flow<List<UserWithTeam>>
|
|
390
|
+
}
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### Example 5: WorkManager with Hilt
|
|
394
|
+
|
|
395
|
+
```kotlin
|
|
396
|
+
@HiltWorker
|
|
397
|
+
class SyncWorker @AssistedInject constructor(
|
|
398
|
+
@Assisted context: Context, @Assisted params: WorkerParameters,
|
|
399
|
+
private val syncRepository: SyncRepository
|
|
400
|
+
) : CoroutineWorker(context, params) {
|
|
401
|
+
override suspend fun doWork(): Result = try {
|
|
402
|
+
syncRepository.syncAll(); Result.success()
|
|
403
|
+
} catch (e: Exception) { if (runAttemptCount < 3) Result.retry() else Result.failure() }
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
*Researched: 2026-03-07 | Sources: [Android Developers - Compose](https://developer.android.com/compose), [Android Architecture Guide](https://developer.android.com/topic/architecture), [Now in Android (GitHub)](https://github.com/android/nowinandroid), [Compose Performance](https://developer.android.com/develop/ui/compose/performance), [Compose Stability](https://developer.android.com/develop/ui/compose/performance/stability), [Navigation Type Safety](https://developer.android.com/guide/navigation/design/type-safety), [Baseline Profiles](https://developer.android.com/topic/performance/baselineprofiles/overview), [R8 Shrinking](https://developer.android.com/build/shrink-code), [Meta Baseline Profiles](https://engineering.fb.com/2025/10/01/android/accelerating-our-android-apps-with-baseline-profiles/), [Hilt vs Koin (droidcon)](https://www.droidcon.com/2025/11/26/hilt-vs-koin-the-hidden-cost-of-runtime-injection-and-why-compile-time-di-wins/), [Room Database](https://developer.android.com/training/data-storage/room), [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager), [LeakCanary](https://square.github.io/leakcanary/), [Kotlin 2.1.20](https://kotlinlang.org/docs/whatsnew2120.html), [Android Security 2025](https://medium.com/@hiren6997/5-modern-android-security-practices-you-cant-ignore-in-2025-6560558be99e), [Android Networking 2025](https://medium.com/@hiren6997/the-state-of-android-networking-in-2025-retrofit-ktor-and-beyond-7a5a5317802c), [Gradle Version Catalogs](https://docs.gradle.org/current/userguide/version_catalogs.html), [Modularization Patterns](https://developer.android.com/topic/modularization/patterns), [Compose API Guidelines](https://developer.android.com/develop/ui/compose/api-guidelines)*
|