oh-my-agent-commandcode 0.0.0-stage → 20.38.4
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/README.md +35 -2
- package/filter-test-output.sh +52 -0
- package/mods/oma.ts +347 -0
- package/package.json +30 -4
- package/skills/_shared/conditional/experiment-ledger.md +28 -0
- package/skills/_shared/conditional/exploration-loop.md +22 -0
- package/skills/_shared/conditional/quality-score.md +33 -0
- package/skills/_shared/core/anti-ai-prose.md +191 -0
- package/skills/_shared/core/api-contracts/README.md +28 -0
- package/skills/_shared/core/api-contracts/template.md +90 -0
- package/skills/_shared/core/clarification-protocol.md +23 -0
- package/skills/_shared/core/code-intelligence.md +46 -0
- package/skills/_shared/core/collaboration-policy.md +28 -0
- package/skills/_shared/core/common-checklist.md +28 -0
- package/skills/_shared/core/context-budget.md +22 -0
- package/skills/_shared/core/context-loading.md +34 -0
- package/skills/_shared/core/difficulty-guide.md +26 -0
- package/skills/_shared/core/execution-policy.md +31 -0
- package/skills/_shared/core/lessons-learned.md +33 -0
- package/skills/_shared/core/prompt-structure.md +18 -0
- package/skills/_shared/core/quality-principles.md +11 -0
- package/skills/_shared/core/session-metrics.md +35 -0
- package/skills/_shared/core/skill-routing.md +39 -0
- package/skills/_shared/core/test-approach.md +54 -0
- package/skills/_shared/core/vendor-detection.md +52 -0
- package/skills/_shared/runtime/memory-protocol.md +118 -0
- package/skills/_shared/runtime/result-contract.md +64 -0
- package/skills/_shared/ui-interaction-quality.md +133 -0
- package/skills/oma-academic-writing/SKILL.md +181 -0
- package/skills/oma-academic-writing/resources/abstract-guide.md +51 -0
- package/skills/oma-academic-writing/resources/academic-verb-tiers.md +42 -0
- package/skills/oma-academic-writing/resources/anti-ai-checklist.md +52 -0
- package/skills/oma-academic-writing/resources/hedging-guide.md +132 -0
- package/skills/oma-academic-writing/resources/sentence-structure-reference.md +151 -0
- package/skills/oma-architecture/SKILL.md +203 -0
- package/skills/oma-architecture/resources/api-evolution.md +41 -0
- package/skills/oma-architecture/resources/checklist.md +42 -0
- package/skills/oma-architecture/resources/execution-protocol.md +115 -0
- package/skills/oma-architecture/resources/methodology-selection.md +92 -0
- package/skills/oma-architecture/resources/migration-patterns.md +28 -0
- package/skills/oma-architecture/resources/output-templates.md +111 -0
- package/skills/oma-architecture/resources/stakeholder-synthesis.md +80 -0
- package/skills/oma-backend/SKILL.md +202 -0
- package/skills/oma-backend/resources/checklist.md +45 -0
- package/skills/oma-backend/resources/error-playbook.md +97 -0
- package/skills/oma-backend/resources/execution-protocol.md +39 -0
- package/skills/oma-backend/resources/orm-reference.md +61 -0
- package/skills/oma-backend/variants/node/api-template.ts +315 -0
- package/skills/oma-backend/variants/node/snippets.md +475 -0
- package/skills/oma-backend/variants/node/stack.yaml +21 -0
- package/skills/oma-backend/variants/node/tech-stack.md +33 -0
- package/skills/oma-backend/variants/python/api-template.py +378 -0
- package/skills/oma-backend/variants/python/snippets.md +199 -0
- package/skills/oma-backend/variants/python/stack.yaml +18 -0
- package/skills/oma-backend/variants/python/tech-stack.md +45 -0
- package/skills/oma-backend/variants/rust/api-template.rs +635 -0
- package/skills/oma-backend/variants/rust/snippets.md +471 -0
- package/skills/oma-backend/variants/rust/stack.yaml +20 -0
- package/skills/oma-backend/variants/rust/tech-stack.md +36 -0
- package/skills/oma-backend/variants/stack.schema.json +73 -0
- package/skills/oma-brainstorm/SKILL.md +166 -0
- package/skills/oma-brainstorm/resources/triz-lite.md +117 -0
- package/skills/oma-coordination/SKILL.md +171 -0
- package/skills/oma-db/SKILL.md +201 -0
- package/skills/oma-db/resources/anti-patterns.md +177 -0
- package/skills/oma-db/resources/checklist.md +67 -0
- package/skills/oma-db/resources/document-templates.md +107 -0
- package/skills/oma-db/resources/error-playbook.md +50 -0
- package/skills/oma-db/resources/examples.md +170 -0
- package/skills/oma-db/resources/execution-protocol.md +127 -0
- package/skills/oma-db/resources/iso-controls.md +98 -0
- package/skills/oma-db/resources/migration-playbook.md +93 -0
- package/skills/oma-db/resources/query-tuning.md +57 -0
- package/skills/oma-db/resources/vector-db.md +159 -0
- package/skills/oma-debug/SKILL.md +146 -0
- package/skills/oma-debug/resources/bug-report-template.md +327 -0
- package/skills/oma-debug/resources/checklist.md +31 -0
- package/skills/oma-debug/resources/common-patterns.md +734 -0
- package/skills/oma-debug/resources/debugging-checklist.md +364 -0
- package/skills/oma-debug/resources/error-playbook.md +94 -0
- package/skills/oma-debug/resources/execution-protocol.md +40 -0
- package/skills/oma-design/SKILL.md +135 -0
- package/skills/oma-design/resources/asset-strategy.md +34 -0
- package/skills/oma-design/resources/checklist.md +63 -0
- package/skills/oma-design/resources/data-grid.md +48 -0
- package/skills/oma-design/resources/design-md-spec.md +107 -0
- package/skills/oma-design/resources/design-tokens.md +53 -0
- package/skills/oma-design/resources/error-playbook.md +18 -0
- package/skills/oma-design/resources/execution-protocol.md +95 -0
- package/skills/oma-design/resources/external-design-skills.md +130 -0
- package/skills/oma-design/resources/getdesign-fetcher.md +104 -0
- package/skills/oma-design/resources/product-interface-review.md +59 -0
- package/skills/oma-design/resources/redesign-protocol.md +52 -0
- package/skills/oma-design/resources/stitch-integration.md +244 -0
- package/skills/oma-dev-workflow/SKILL.md +375 -0
- package/skills/oma-dev-workflow/resources/affected-checks.py +58 -0
- package/skills/oma-dev-workflow/resources/api-workflows.md +58 -0
- package/skills/oma-dev-workflow/resources/database-patterns.md +107 -0
- package/skills/oma-dev-workflow/resources/i18n-patterns.md +63 -0
- package/skills/oma-dev-workflow/resources/release-coordination.md +240 -0
- package/skills/oma-dev-workflow/resources/tooling-profiles.md +217 -0
- package/skills/oma-dev-workflow/resources/troubleshooting.md +78 -0
- package/skills/oma-dev-workflow/resources/validation-pipeline.md +246 -0
- package/skills/oma-docs/SKILL.md +77 -0
- package/skills/oma-docs/resources/commands.md +76 -0
- package/skills/oma-explanation/SKILL.md +212 -0
- package/skills/oma-explanation/resources/document-structure.md +115 -0
- package/skills/oma-explanation/resources/draft-format.md +199 -0
- package/skills/oma-explanation/resources/html-contract.md +102 -0
- package/skills/oma-frontend/SKILL.md +227 -0
- package/skills/oma-frontend/resources/angular-rules.md +110 -0
- package/skills/oma-frontend/resources/checklist.md +76 -0
- package/skills/oma-frontend/resources/error-playbook.md +125 -0
- package/skills/oma-frontend/resources/execution-protocol.md +46 -0
- package/skills/oma-frontend/resources/snippets.md +354 -0
- package/skills/oma-frontend/resources/specialized-visual-implementation.md +193 -0
- package/skills/oma-frontend/resources/tailwind-rules.md +83 -0
- package/skills/oma-frontend/resources/tech-stack.md +156 -0
- package/skills/oma-hwp/SKILL.md +166 -0
- package/skills/oma-hwp/config/hwp-config.yaml +35 -0
- package/skills/oma-hwp/resources/balanced-tables.ts +39 -0
- package/skills/oma-hwp/resources/execution-protocol.md +145 -0
- package/skills/oma-hwp/resources/flatten-tables.ts +101 -0
- package/skills/oma-hwp/resources/package.json +13 -0
- package/skills/oma-hwp/resources/troubleshooting.md +70 -0
- package/skills/oma-hwp/resources/tsconfig.json +10 -0
- package/skills/oma-hwp/resources/turndown-plugin-gfm.d.ts +9 -0
- package/skills/oma-image/SKILL.md +142 -0
- package/skills/oma-image/config/image-config.yaml +70 -0
- package/skills/oma-image/resources/checklist.md +18 -0
- package/skills/oma-image/resources/execution-protocol.md +117 -0
- package/skills/oma-image/resources/invocation.md +105 -0
- package/skills/oma-image/resources/prompt-tips.md +71 -0
- package/skills/oma-image/resources/vendor-matrix.md +90 -0
- package/skills/oma-market/SKILL.md +142 -0
- package/skills/oma-market/resources/checklist.md +12 -0
- package/skills/oma-market/resources/error-playbook.md +12 -0
- package/skills/oma-market/resources/execution-protocol.md +60 -0
- package/skills/oma-market/resources/frameworks/pestel.md +101 -0
- package/skills/oma-market/resources/frameworks/porters-5f.md +90 -0
- package/skills/oma-market/resources/frameworks/swot.md +61 -0
- package/skills/oma-market/resources/intent-rules.md +35 -0
- package/skills/oma-market/resources/output-laws.md +53 -0
- package/skills/oma-mobile/SKILL.md +168 -0
- package/skills/oma-mobile/resources/checklist.md +77 -0
- package/skills/oma-mobile/resources/error-playbook.md +198 -0
- package/skills/oma-mobile/resources/execution-protocol.md +47 -0
- package/skills/oma-mobile/resources/screen-template.dart +331 -0
- package/skills/oma-mobile/resources/screen-template.swift +239 -0
- package/skills/oma-mobile/resources/screen-template.tsx +179 -0
- package/skills/oma-mobile/resources/tech-stack.md +69 -0
- package/skills/oma-mobile/variants/README.md +45 -0
- package/skills/oma-mobile/variants/flutter/api-template.dart +461 -0
- package/skills/oma-mobile/variants/flutter/snippets.md +1353 -0
- package/skills/oma-mobile/variants/flutter/stack.yaml +21 -0
- package/skills/oma-mobile/variants/flutter/tech-stack.md +201 -0
- package/skills/oma-mobile/variants/kotlin-android/api-template.kt +182 -0
- package/skills/oma-mobile/variants/kotlin-android/snippets.md +871 -0
- package/skills/oma-mobile/variants/kotlin-android/stack.yaml +32 -0
- package/skills/oma-mobile/variants/kotlin-android/tech-stack.md +159 -0
- package/skills/oma-mobile/variants/react-native/api-template.ts +531 -0
- package/skills/oma-mobile/variants/react-native/snippets.md +1014 -0
- package/skills/oma-mobile/variants/react-native/stack.yaml +22 -0
- package/skills/oma-mobile/variants/react-native/tech-stack.md +192 -0
- package/skills/oma-mobile/variants/stack.schema.json +68 -0
- package/skills/oma-mobile/variants/swift-ios/api-template.swift +165 -0
- package/skills/oma-mobile/variants/swift-ios/snippets.md +1028 -0
- package/skills/oma-mobile/variants/swift-ios/stack.yaml +25 -0
- package/skills/oma-mobile/variants/swift-ios/tech-stack.md +174 -0
- package/skills/oma-observability/SKILL.md +225 -0
- package/skills/oma-observability/resources/anti-patterns.md +555 -0
- package/skills/oma-observability/resources/boundaries/cross-application.md +348 -0
- package/skills/oma-observability/resources/boundaries/multi-tenant.md +290 -0
- package/skills/oma-observability/resources/boundaries/release.md +372 -0
- package/skills/oma-observability/resources/boundaries/slo.md +225 -0
- package/skills/oma-observability/resources/checklist.md +123 -0
- package/skills/oma-observability/resources/examples.md +448 -0
- package/skills/oma-observability/resources/execution-protocol.md +166 -0
- package/skills/oma-observability/resources/incident-forensics.md +348 -0
- package/skills/oma-observability/resources/intent-rules.md +307 -0
- package/skills/oma-observability/resources/layers/L3-network.md +281 -0
- package/skills/oma-observability/resources/layers/L4-transport.md +299 -0
- package/skills/oma-observability/resources/layers/L7-application/crash-analytics.md +359 -0
- package/skills/oma-observability/resources/layers/L7-application/mobile-rum.md +278 -0
- package/skills/oma-observability/resources/layers/L7-application/waf.md +246 -0
- package/skills/oma-observability/resources/layers/L7-application/web-rum.md +350 -0
- package/skills/oma-observability/resources/layers/mesh.md +368 -0
- package/skills/oma-observability/resources/matrix.md +177 -0
- package/skills/oma-observability/resources/meta-observability.md +605 -0
- package/skills/oma-observability/resources/observability-as-code.md +666 -0
- package/skills/oma-observability/resources/signals/audit.md +310 -0
- package/skills/oma-observability/resources/signals/cost.md +303 -0
- package/skills/oma-observability/resources/signals/logs.md +263 -0
- package/skills/oma-observability/resources/signals/metrics.md +478 -0
- package/skills/oma-observability/resources/signals/privacy.md +351 -0
- package/skills/oma-observability/resources/signals/profiles.md +245 -0
- package/skills/oma-observability/resources/signals/traces.md +360 -0
- package/skills/oma-observability/resources/standards.md +214 -0
- package/skills/oma-observability/resources/transport/collector-topology.md +308 -0
- package/skills/oma-observability/resources/transport/otlp-grpc-vs-http.md +256 -0
- package/skills/oma-observability/resources/transport/sampling-recipes.md +297 -0
- package/skills/oma-observability/resources/transport/udp-statsd-mtu.md +167 -0
- package/skills/oma-observability/resources/vendor-categories.md +352 -0
- package/skills/oma-orchestration/SKILL.md +302 -0
- package/skills/oma-orchestration/config/cli-config.yaml +92 -0
- package/skills/oma-orchestration/resources/memory-schema.md +232 -0
- package/skills/oma-orchestration/resources/subagent-prompt-template.md +30 -0
- package/skills/oma-orchestration/scripts/parallel-run.sh +6 -0
- package/skills/oma-orchestration/scripts/spawn-agent.sh +5 -0
- package/skills/oma-orchestration/scripts/verify.sh +20 -0
- package/skills/oma-orchestration/templates/backend-task.md +19 -0
- package/skills/oma-orchestration/templates/debug-task.md +16 -0
- package/skills/oma-orchestration/templates/frontend-task.md +18 -0
- package/skills/oma-orchestration/templates/mobile-task.md +18 -0
- package/skills/oma-orchestration/templates/qa-task.md +16 -0
- package/skills/oma-orchestration/templates/tasks-example.yaml +15 -0
- package/skills/oma-pdf/SKILL.md +162 -0
- package/skills/oma-pdf/config/pdf-config.yaml +27 -0
- package/skills/oma-pdf/resources/execution-protocol.md +127 -0
- package/skills/oma-pm/SKILL.md +157 -0
- package/skills/oma-pm/resources/error-playbook.md +75 -0
- package/skills/oma-pm/resources/examples.md +439 -0
- package/skills/oma-pm/resources/execution-protocol.md +62 -0
- package/skills/oma-pm/resources/iso-planning.md +110 -0
- package/skills/oma-pm/resources/plan-phase-protocol.md +66 -0
- package/skills/oma-pm/resources/task-template.json +86 -0
- package/skills/oma-qa/SKILL.md +141 -0
- package/skills/oma-qa/resources/checklist.md +339 -0
- package/skills/oma-qa/resources/error-playbook.md +98 -0
- package/skills/oma-qa/resources/execution-protocol.md +169 -0
- package/skills/oma-qa/resources/iso-quality.md +82 -0
- package/skills/oma-qa/resources/verify-ship-protocol.md +116 -0
- package/skills/oma-recap/SKILL.md +245 -0
- package/skills/oma-recap/resources/output-formats.md +83 -0
- package/skills/oma-refactor/SKILL.md +184 -0
- package/skills/oma-refactor/resources/definition.md +108 -0
- package/skills/oma-refactor/resources/governance.md +33 -0
- package/skills/oma-refactor/resources/hotspots.py +44 -0
- package/skills/oma-refactor/resources/measurement.md +93 -0
- package/skills/oma-scholar/SKILL.md +276 -0
- package/skills/oma-scholar/config/scholar-config.yaml +79 -0
- package/skills/oma-scholar/resources/api-endpoints.md +174 -0
- package/skills/oma-scholar/resources/checklist.md +92 -0
- package/skills/oma-scholar/resources/execution-protocol.md +224 -0
- package/skills/oma-scholar/resources/fallback-providers.md +143 -0
- package/skills/oma-scholar/resources/setup-openalex.md +85 -0
- package/skills/oma-scholar/resources/sidecar-spec.md +341 -0
- package/skills/oma-scholar/resources/upstream-spec-cache.md +972 -0
- package/skills/oma-scm/SKILL.md +103 -0
- package/skills/oma-scm/resources/cm-operations.md +56 -0
- package/skills/oma-scm/resources/codeowners-playbook.md +45 -0
- package/skills/oma-scm/resources/conventional-commits.md +108 -0
- package/skills/oma-scm/resources/merge-risk.md +76 -0
- package/skills/oma-scm/resources/onboarding-risk-signals.md +71 -0
- package/skills/oma-search/SKILL.md +125 -0
- package/skills/oma-search/resources/checklist.md +36 -0
- package/skills/oma-search/resources/error-playbook.md +66 -0
- package/skills/oma-search/resources/examples.md +80 -0
- package/skills/oma-search/resources/execution-protocol.md +86 -0
- package/skills/oma-search/resources/intent-rules.md +47 -0
- package/skills/oma-search/resources/trust-registry.md +53 -0
- package/skills/oma-security/SKILL.md +172 -0
- package/skills/oma-security/resources/artex.md +108 -0
- package/skills/oma-security/resources/ci.md +134 -0
- package/skills/oma-security/resources/cisco-source.md +108 -0
- package/skills/oma-security/resources/deepsec-config.md +45 -0
- package/skills/oma-security/resources/deepsec-matchers.md +35 -0
- package/skills/oma-security/resources/deepsec-scanning.md +45 -0
- package/skills/oma-security/resources/deepsec-setup.md +41 -0
- package/skills/oma-security/resources/findings-contract.md +408 -0
- package/skills/oma-security/resources/mcp-scanning.md +122 -0
- package/skills/oma-security/resources/skill-scanning.md +106 -0
- package/skills/oma-security/resources/validation.md +71 -0
- package/skills/oma-skill-creation/SKILL.md +84 -0
- package/skills/oma-skill-creation/resources/prompt-evaluation.md +36 -0
- package/skills/oma-skill-creation/resources/ssl-lite-template.md +108 -0
- package/skills/oma-skill-creation/resources/validation-checklist.md +101 -0
- package/skills/oma-slide/SKILL.md +277 -0
- package/skills/oma-slide/resources/animation-patterns.md +245 -0
- package/skills/oma-slide/resources/assets/deck-stage.js +514 -0
- package/skills/oma-slide/resources/assets/viewport-base.css +257 -0
- package/skills/oma-slide/resources/canva-integration.md +203 -0
- package/skills/oma-slide/resources/checklist.md +46 -0
- package/skills/oma-slide/resources/design-doctrine.md +260 -0
- package/skills/oma-slide/resources/fixed-stage.md +232 -0
- package/skills/oma-slide/resources/generation-protocol.md +393 -0
- package/skills/oma-slide/resources/native-pptx.md +84 -0
- package/skills/oma-slide/resources/selection-index.json +461 -0
- package/skills/oma-slide/resources/style-presets.LICENSE +10 -0
- package/skills/oma-slide/resources/style-presets.md +520 -0
- package/skills/oma-tf-infra/SKILL.md +201 -0
- package/skills/oma-tf-infra/resources/checklist.md +53 -0
- package/skills/oma-tf-infra/resources/cost-optimization.md +574 -0
- package/skills/oma-tf-infra/resources/error-playbook.md +68 -0
- package/skills/oma-tf-infra/resources/examples.md +38 -0
- package/skills/oma-tf-infra/resources/execution-protocol.md +129 -0
- package/skills/oma-tf-infra/resources/iso-42001-infra.md +229 -0
- package/skills/oma-tf-infra/resources/multi-cloud-examples.md +241 -0
- package/skills/oma-tf-infra/resources/policy-testing-examples.md +332 -0
- package/skills/oma-translation/SKILL.md +229 -0
- package/skills/oma-translation/resources/anti-ai-patterns.md +104 -0
- package/skills/oma-translation/resources/lang/_template.md +73 -0
- package/skills/oma-translation/resources/lang/en.md +123 -0
- package/skills/oma-translation/resources/lang/ja.md +274 -0
- package/skills/oma-translation/resources/lang/ko.md +228 -0
- package/skills/oma-translation/resources/lang/zh.md +285 -0
- package/skills/oma-translation/resources/style-skills.md +104 -0
- package/skills/oma-translation/resources/translation-rubric.md +126 -0
- package/skills/oma-video/SKILL.md +229 -0
- package/skills/oma-video/config/video-config.yaml +60 -0
- package/skills/oma-video/resources/checklist.md +26 -0
- package/skills/oma-video/resources/execution-protocol.md +122 -0
- package/skills/oma-video/resources/existing-media.md +185 -0
- package/skills/oma-video/resources/hyperframes-authoring/README.md +44 -0
- package/skills/oma-video/resources/hyperframes-authoring/demo.md +31 -0
- package/skills/oma-video/resources/hyperframes-authoring/explainer.md +10 -0
- package/skills/oma-video/resources/hyperframes-authoring/shorts.md +10 -0
- package/skills/oma-video/resources/motion-principles.md +81 -0
- package/skills/oma-video/resources/mpt/driver.py +301 -0
- package/skills/oma-video/resources/prompt-tips.md +75 -0
- package/skills/oma-video/resources/script-schema.md +81 -0
- package/skills/oma-video/resources/sound-design.md +127 -0
- package/skills/oma-video/resources/strudel/package.json +11 -0
- package/skills/oma-video/resources/strudel/page.html +87 -0
- package/skills/oma-video/resources/strudel/render.mjs +295 -0
- package/skills/oma-video/resources/vendor-matrix.md +124 -0
- package/skills/oma-voice/SKILL.md +249 -0
- package/skills/oma-voice/config/voice-config.yaml +30 -0
- package/skills/oma-voice/resources/audio-processing.md +119 -0
- package/skills/oma-voice/resources/checklist.md +47 -0
- package/skills/oma-voice/resources/execution-protocol.md +215 -0
- package/skills/oma-voice/resources/prompt-tips.md +43 -0
- package/skills/oma-voice/resources/voice-matrix.md +51 -0
- package/skills/oma-voice/resources/voicestudio.md +87 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Screen Template for Mobile Agent (React Native)
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates best practices for React Native screens:
|
|
5
|
+
* - Typed navigation props (React Navigation v7 native-stack)
|
|
6
|
+
* - Consumes TanStack Query hooks (useTodosQuery + mutations) — NEVER axios directly
|
|
7
|
+
* - Explicit isPending / error-with-retry / empty / data states via the shared
|
|
8
|
+
* LoadingView / ErrorView / EmptyStateView components (snippets.md §12)
|
|
9
|
+
* - FlatList with a stable keyExtractor and item-level accessibility roles
|
|
10
|
+
* - RefreshControl wired to the query's refetch (pull-to-refresh)
|
|
11
|
+
* - StyleSheet at the bottom; no inline style objects in render
|
|
12
|
+
*
|
|
13
|
+
* Layout: src/features/todos/ui/ExampleScreen.tsx
|
|
14
|
+
* The hooks (useTodosQuery, useToggleTodo, useDeleteTodo) live in
|
|
15
|
+
* src/features/todos/{queries.ts,mutations.ts}; the screen only composes them.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import React, { useCallback } from 'react';
|
|
19
|
+
import {
|
|
20
|
+
View,
|
|
21
|
+
Text,
|
|
22
|
+
FlatList,
|
|
23
|
+
TouchableOpacity,
|
|
24
|
+
RefreshControl,
|
|
25
|
+
StyleSheet,
|
|
26
|
+
type ListRenderItem,
|
|
27
|
+
} from 'react-native';
|
|
28
|
+
import type { NativeStackScreenProps } from '@react-navigation/native-stack';
|
|
29
|
+
import type { RootStackParamList } from '@navigation/types';
|
|
30
|
+
import { LoadingView } from '@shared/components/LoadingView';
|
|
31
|
+
import { ErrorView } from '@shared/components/ErrorView';
|
|
32
|
+
import { EmptyStateView } from '@shared/components/EmptyStateView';
|
|
33
|
+
import { useTodosQuery } from '../queries';
|
|
34
|
+
import { useToggleTodo, useDeleteTodo } from '../mutations';
|
|
35
|
+
import type { Todo } from '@api/todos';
|
|
36
|
+
|
|
37
|
+
// Typed screen props: navigation.navigate is compile-time checked against the
|
|
38
|
+
// RootStackParamList, so passing the wrong params to 'TodoDetail' is a type error.
|
|
39
|
+
type Props = NativeStackScreenProps<RootStackParamList, 'TodoList'>;
|
|
40
|
+
|
|
41
|
+
export function ExampleScreen({ navigation }: Props) {
|
|
42
|
+
// Read hook — returns cached data instantly and revalidates in the background.
|
|
43
|
+
const { data: todos, isPending, isError, error, refetch, isRefetching } =
|
|
44
|
+
useTodosQuery();
|
|
45
|
+
|
|
46
|
+
// Write hooks — the screen fires intents; the hooks own optimistic updates,
|
|
47
|
+
// rollback, and cache invalidation. The screen never touches the query cache.
|
|
48
|
+
const toggleMutation = useToggleTodo();
|
|
49
|
+
const deleteMutation = useDeleteTodo();
|
|
50
|
+
|
|
51
|
+
// --- Intents -------------------------------------------------------------
|
|
52
|
+
|
|
53
|
+
const handleToggle = useCallback(
|
|
54
|
+
(id: string) => toggleMutation.mutate(id),
|
|
55
|
+
[toggleMutation],
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
const handleDelete = useCallback(
|
|
59
|
+
(id: string) => deleteMutation.mutate(id),
|
|
60
|
+
[deleteMutation],
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
const handleOpenDetail = useCallback(
|
|
64
|
+
(id: string) => navigation.navigate('TodoDetail', { id }),
|
|
65
|
+
[navigation],
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
// renderItem is defined once (stable identity) so FlatList rows don't churn.
|
|
69
|
+
const renderItem: ListRenderItem<Todo> = useCallback(
|
|
70
|
+
({ item }) => (
|
|
71
|
+
<View style={styles.row}>
|
|
72
|
+
<TouchableOpacity
|
|
73
|
+
style={styles.checkbox}
|
|
74
|
+
onPress={() => handleToggle(item.id)}
|
|
75
|
+
accessibilityRole="checkbox"
|
|
76
|
+
accessibilityState={{ checked: item.completed }}
|
|
77
|
+
testID={`todo-checkbox-${item.id}`}
|
|
78
|
+
accessibilityLabel={`Toggle ${item.title}`}
|
|
79
|
+
>
|
|
80
|
+
<Text style={styles.checkboxGlyph}>{item.completed ? '☑' : '☐'}</Text>
|
|
81
|
+
</TouchableOpacity>
|
|
82
|
+
|
|
83
|
+
<TouchableOpacity
|
|
84
|
+
style={styles.titleContainer}
|
|
85
|
+
onPress={() => handleOpenDetail(item.id)}
|
|
86
|
+
accessibilityRole="button"
|
|
87
|
+
>
|
|
88
|
+
<Text style={[styles.title, item.completed && styles.completed]}>
|
|
89
|
+
{item.title}
|
|
90
|
+
</Text>
|
|
91
|
+
</TouchableOpacity>
|
|
92
|
+
|
|
93
|
+
<TouchableOpacity
|
|
94
|
+
onPress={() => handleDelete(item.id)}
|
|
95
|
+
accessibilityRole="button"
|
|
96
|
+
testID={`todo-delete-${item.id}`}
|
|
97
|
+
accessibilityLabel={`Delete ${item.title}`}
|
|
98
|
+
>
|
|
99
|
+
<Text style={styles.deleteIcon}>✕</Text>
|
|
100
|
+
</TouchableOpacity>
|
|
101
|
+
</View>
|
|
102
|
+
),
|
|
103
|
+
[handleToggle, handleDelete, handleOpenDetail],
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
// --- State switch --------------------------------------------------------
|
|
107
|
+
// Order matters: pending (first load, no cached data) → error → empty → data.
|
|
108
|
+
// Each non-data state delegates to a shared component so every screen renders
|
|
109
|
+
// them identically. isPending is the v5 first-load flag; isRefetching drives
|
|
110
|
+
// the pull-to-refresh spinner without hiding already-cached rows.
|
|
111
|
+
|
|
112
|
+
if (isPending) {
|
|
113
|
+
return <LoadingView label="Loading todos" />;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (isError) {
|
|
117
|
+
return <ErrorView error={error} onRetry={refetch} />;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (todos.length === 0) {
|
|
121
|
+
return <EmptyStateView message="No todos yet. Add your first one!" />;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// --- Data state ----------------------------------------------------------
|
|
125
|
+
|
|
126
|
+
return (
|
|
127
|
+
<FlatList
|
|
128
|
+
data={todos}
|
|
129
|
+
keyExtractor={(item) => item.id}
|
|
130
|
+
renderItem={renderItem}
|
|
131
|
+
contentContainerStyle={styles.listContent}
|
|
132
|
+
refreshControl={
|
|
133
|
+
<RefreshControl refreshing={isRefetching} onRefresh={refetch} />
|
|
134
|
+
}
|
|
135
|
+
// Keep the empty branch above authoritative; this is a defensive fallback.
|
|
136
|
+
ListEmptyComponent={
|
|
137
|
+
<EmptyStateView message="No todos yet. Add your first one!" />
|
|
138
|
+
}
|
|
139
|
+
/>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// StyleSheet at the bottom — StyleSheet.create freezes the objects and lets RN
|
|
144
|
+
// pass style IDs across the bridge instead of fresh objects on every render.
|
|
145
|
+
const styles = StyleSheet.create({
|
|
146
|
+
listContent: {
|
|
147
|
+
flexGrow: 1,
|
|
148
|
+
},
|
|
149
|
+
row: {
|
|
150
|
+
flexDirection: 'row',
|
|
151
|
+
alignItems: 'center',
|
|
152
|
+
paddingHorizontal: 16,
|
|
153
|
+
paddingVertical: 12,
|
|
154
|
+
borderBottomWidth: StyleSheet.hairlineWidth,
|
|
155
|
+
borderBottomColor: '#e0e0e0',
|
|
156
|
+
},
|
|
157
|
+
checkbox: {
|
|
158
|
+
marginRight: 12,
|
|
159
|
+
},
|
|
160
|
+
checkboxGlyph: {
|
|
161
|
+
fontSize: 18,
|
|
162
|
+
},
|
|
163
|
+
titleContainer: {
|
|
164
|
+
flex: 1,
|
|
165
|
+
},
|
|
166
|
+
title: {
|
|
167
|
+
fontSize: 16,
|
|
168
|
+
color: '#212121',
|
|
169
|
+
},
|
|
170
|
+
completed: {
|
|
171
|
+
textDecorationLine: 'line-through',
|
|
172
|
+
color: '#9e9e9e',
|
|
173
|
+
},
|
|
174
|
+
deleteIcon: {
|
|
175
|
+
color: '#9e9e9e',
|
|
176
|
+
fontSize: 16,
|
|
177
|
+
paddingLeft: 12,
|
|
178
|
+
},
|
|
179
|
+
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Mobile Agent - Tech Stack Index
|
|
2
|
+
|
|
3
|
+
Per-platform tech stacks live under `variants/{platform}/`, mirroring
|
|
4
|
+
`oma-backend/variants/`. Each variant owns its own `stack.yaml` (SSOT),
|
|
5
|
+
`tech-stack.md`, `snippets.md`, and API template. This file holds only the
|
|
6
|
+
**cross-platform guidance** shared by every variant plus a pointer index.
|
|
7
|
+
|
|
8
|
+
## Platform Variants
|
|
9
|
+
|
|
10
|
+
| Platform | Stack manifest | Tech stack | Snippets | API template |
|
|
11
|
+
|----------|----------------|-----------|----------|--------------|
|
|
12
|
+
| Swift (iOS native) | `../variants/swift-ios/stack.yaml` | `../variants/swift-ios/tech-stack.md` | `../variants/swift-ios/snippets.md` | `../variants/swift-ios/api-template.swift` |
|
|
13
|
+
| Kotlin (Android native) | `../variants/kotlin-android/stack.yaml` | `../variants/kotlin-android/tech-stack.md` | `../variants/kotlin-android/snippets.md` | `../variants/kotlin-android/api-template.kt` |
|
|
14
|
+
| Flutter | `../variants/flutter/stack.yaml` | `../variants/flutter/tech-stack.md` | `../variants/flutter/snippets.md` | `../variants/flutter/api-template.dart` |
|
|
15
|
+
| React Native | `../variants/react-native/stack.yaml` | `../variants/react-native/tech-stack.md` | `../variants/react-native/snippets.md` | `../variants/react-native/api-template.ts` |
|
|
16
|
+
|
|
17
|
+
Stack selection: detect from project files (`Package.swift` / `settings.gradle.kts` +
|
|
18
|
+
`com.android.application` / `pubspec.yaml` / `package.json` + `react-native`), or run `/stack-set` to generate a
|
|
19
|
+
project-specific `stack/` from the matching variant baseline. The variant
|
|
20
|
+
`stack.yaml` is the default; `/stack-set` may override any field per project.
|
|
21
|
+
|
|
22
|
+
## Stack at a glance
|
|
23
|
+
|
|
24
|
+
| | Swift iOS | Kotlin Android | Flutter | React Native |
|
|
25
|
+
|---|---|---|---|---|
|
|
26
|
+
| Language | Swift 6+ | Kotlin 2.1+ | Dart 3.10+ | TypeScript (strict) |
|
|
27
|
+
| UI | SwiftUI | Jetpack Compose / Material 3 | Flutter / Material 3 | React Native |
|
|
28
|
+
| State | Observation (`@MainActor @Observable`) | `ViewModel` + `StateFlow` (Hilt) | Riverpod 3 | Zustand 5 (client) + TanStack Query 5 (server) |
|
|
29
|
+
| Navigation | NavigationStack | Navigation Compose (type-safe routes) | GoRouter 17 | React Navigation v7 |
|
|
30
|
+
| HTTP transport | URLSession | Ktor Client (OkHttp engine; MockEngine in tests) | Dio | Axios |
|
|
31
|
+
| API/data layer | swift-openapi-generator | openapi-generator `kotlin`/`jvm-ktor` | Repository (Dio) | TanStack Query + `api/` |
|
|
32
|
+
| Response cache (when required) | hyperoslo/Cache | Room repository | Drift offline-first repo | TanStack Query |
|
|
33
|
+
| Durable storage | SwiftData / Keychain | Room / DataStore / EncryptedSharedPreferences | Drift / flutter_secure_storage | MMKV / secure-store |
|
|
34
|
+
| Unit test | XCTest / Swift Testing | JUnit + coroutines-test + ktor-client-mock | flutter_test + mocktail | jest + RNTL (matchers built in ≥12.4) |
|
|
35
|
+
| E2E | XCUITest | Maestro | Maestro | Maestro |
|
|
36
|
+
|
|
37
|
+
## Repository-layer response cache when required
|
|
38
|
+
|
|
39
|
+
When offline behavior, latency, or repeated reads justify caching, use the selected variant's Repository / data-layer cache — the
|
|
40
|
+
same philosophy across platforms, different idiomatic tooling:
|
|
41
|
+
|
|
42
|
+
- Cache **decoded domain models**, never raw transport bytes / `HTTPBody` /
|
|
43
|
+
raw HTTP responses.
|
|
44
|
+
- **Stale-while-revalidate** on reads: serve cached immediately, revalidate in
|
|
45
|
+
the background, update state.
|
|
46
|
+
- **Invalidate on write**: every create/update/delete drops the affected cache
|
|
47
|
+
keys so the next read repopulates.
|
|
48
|
+
- Cache key = operation + params (never URLs); explicit TTL (never infinite).
|
|
49
|
+
- The cache is for transient, server-owned data only. Durable user-owned data
|
|
50
|
+
and secrets stay in the platform's durable store / secure store.
|
|
51
|
+
|
|
52
|
+
See each variant's `tech-stack.md` "Response Cache" section and `snippets.md`
|
|
53
|
+
for the platform-specific implementation.
|
|
54
|
+
|
|
55
|
+
## Cross-platform guidelines (shared)
|
|
56
|
+
|
|
57
|
+
- **Clean Architecture**: domain → data → presentation (App/Core/Features/Shared
|
|
58
|
+
on Swift; `app/{ui,data,di}` + `api-client` on Kotlin). Business logic never
|
|
59
|
+
lives in UI widgets/views/composables.
|
|
60
|
+
- **Platform design**: Material Design 3 on Android, iOS Human Interface
|
|
61
|
+
Guidelines on iOS. Use platform checks for platform-specific behavior.
|
|
62
|
+
- **State management**: no raw `setState`/ad-hoc state for complex logic — use
|
|
63
|
+
the variant's state solution.
|
|
64
|
+
- **Networking**: transport-layer interceptors handle auth/retry/logging only;
|
|
65
|
+
domain-model caching is a repository concern (see above). Handle offline
|
|
66
|
+
gracefully.
|
|
67
|
+
- **Lifecycle**: dispose controllers / cancel tasks to prevent leaks.
|
|
68
|
+
- **Performance**: 60fps target; test on both platforms.
|
|
69
|
+
- **E2E**: Maestro for critical user flows.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# variants/ — Mobile Platform Variants
|
|
2
|
+
|
|
3
|
+
The `variants/` directory is the home for **all** mobile platform stacks,
|
|
4
|
+
mirroring the layout used by `oma-backend/variants/`. Every supported platform
|
|
5
|
+
is represented here, each as a self-contained variant.
|
|
6
|
+
|
|
7
|
+
| Variant | `stack.yaml` `language` | Files |
|
|
8
|
+
|---------|------------------------|-------|
|
|
9
|
+
| `swift-ios/` | `swift` | `stack.yaml`, `tech-stack.md`, `snippets.md`, `api-template.swift` |
|
|
10
|
+
| `kotlin-android/` | `kotlin` | `stack.yaml`, `tech-stack.md`, `snippets.md`, `api-template.kt` |
|
|
11
|
+
| `flutter/` | `flutter` | `stack.yaml`, `tech-stack.md`, `snippets.md`, `api-template.dart` |
|
|
12
|
+
| `react-native/` | `react-native` | `stack.yaml`, `tech-stack.md`, `snippets.md`, `api-template.ts` |
|
|
13
|
+
|
|
14
|
+
## Layout contract
|
|
15
|
+
|
|
16
|
+
Each `variants/{platform}/` directory contains:
|
|
17
|
+
|
|
18
|
+
- **`stack.yaml`** — the stack SSOT, validated against `stack.schema.json`.
|
|
19
|
+
Declares `language`, `framework`, `state`, `navigation`, `http_client`,
|
|
20
|
+
`local_storage`, `response_cache`, `structure`, `source`, and a `verify:`
|
|
21
|
+
block consumed by `oma verify agent mobile`.
|
|
22
|
+
- **`tech-stack.md`** — human-readable narrative reference (`stack.yaml` wins on
|
|
23
|
+
conflict).
|
|
24
|
+
- **`snippets.md`** — copy-paste-ready, numbered code patterns.
|
|
25
|
+
- **`api-template.{swift,kt,dart,ts}`** — the canonical data/repository template,
|
|
26
|
+
including the repository-layer response cache when required.
|
|
27
|
+
|
|
28
|
+
`stack.schema.json` is the shared schema for all variants.
|
|
29
|
+
|
|
30
|
+
## resources/ is shared meta only
|
|
31
|
+
|
|
32
|
+
The sibling `resources/` directory holds **only** cross-platform, protocol, and
|
|
33
|
+
meta documents shared by every variant: `execution-protocol.md`,
|
|
34
|
+
`checklist.md`, `error-playbook.md`, `tech-stack.md` (the variant index +
|
|
35
|
+
cross-platform guidance), and the screen templates. Platform-specific stack
|
|
36
|
+
narrative and snippets belong in the variant, not in `resources/`.
|
|
37
|
+
|
|
38
|
+
## Stack selection
|
|
39
|
+
|
|
40
|
+
A project's stack is detected from its manifest (`Package.swift`, `settings.gradle.kts`
|
|
41
|
+
+ `com.android.application`, `pubspec.yaml`, `package.json` + `react-native`) or
|
|
42
|
+
chosen via `/stack-set`, which seeds a
|
|
43
|
+
project-specific `stack/` from the matching variant baseline (adapt, never
|
|
44
|
+
blind-copy). The variant `stack.yaml` is the default; any field may be overridden
|
|
45
|
+
per project.
|