opencode-agent-kit 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.
Files changed (361) hide show
  1. package/README.md +796 -0
  2. package/bin/commands/init.mjs +221 -0
  3. package/bin/init.mjs +21 -0
  4. package/package.json +22 -0
  5. package/template/.opencode/agent-docs/backend/README.md +0 -0
  6. package/template/.opencode/agent-docs/backend/node/BACKEND_PATTERNS.md +82 -0
  7. package/template/.opencode/agent-docs/backend/node/BACKEND_QUICK_START.md +49 -0
  8. package/template/.opencode/agent-docs/frontend/next/README.md +0 -0
  9. package/template/.opencode/agent-docs/frontend/nuxt/API_PATTERNS.md +807 -0
  10. package/template/.opencode/agent-docs/frontend/nuxt/CHEATSHEET.md +676 -0
  11. package/template/.opencode/agent-docs/frontend/nuxt/COMPLETION_REPORT.md +613 -0
  12. package/template/.opencode/agent-docs/frontend/nuxt/EXAMPLES.md +956 -0
  13. package/template/.opencode/agent-docs/frontend/nuxt/INDEX.md +596 -0
  14. package/template/.opencode/agent-docs/frontend/nuxt/MCP_GUIDE.md +881 -0
  15. package/template/.opencode/agent-docs/frontend/nuxt/MENTOR_CURRICULUM_30_DAYS.md +256 -0
  16. package/template/.opencode/agent-docs/frontend/nuxt/MENTOR_CURRICULUM_CHECKLIST.md +156 -0
  17. package/template/.opencode/agent-docs/frontend/nuxt/MENTOR_WEEKLY_ASSIGNMENTS.md +191 -0
  18. package/template/.opencode/agent-docs/frontend/nuxt/QUICK_START.md +509 -0
  19. package/template/.opencode/agent-docs/frontend/nuxt/README.md +506 -0
  20. package/template/.opencode/agent-docs/frontend/nuxt/README_AGENTS.md +140 -0
  21. package/template/.opencode/agent-docs/frontend/nuxt/README_DOCS.md +65 -0
  22. package/template/.opencode/agent-docs/frontend/nuxt/SUMMARY.md +474 -0
  23. package/template/.opencode/agent-docs/frontend/nuxt/TEAM_OPERATING_GUIDE.md +54 -0
  24. package/template/.opencode/agent-docs/frontend/nuxt/TESTING_GUIDE.md +904 -0
  25. package/template/.opencode/agent-docs/frontend/nuxt/WORKFLOWS.md +758 -0
  26. package/template/.opencode/agent-docs/frontend/react/API_PATTERNS.md +187 -0
  27. package/template/.opencode/agent-docs/frontend/react/CHEATSHEET.md +87 -0
  28. package/template/.opencode/agent-docs/frontend/react/INDEX.md +45 -0
  29. package/template/.opencode/agent-docs/frontend/react/QUICK_START.md +43 -0
  30. package/template/.opencode/agent-docs/frontend/react/README.md +159 -0
  31. package/template/.opencode/agent-docs/frontend/vue/README.md +0 -0
  32. package/template/.opencode/agent-docs/mobile/android/README.md +45 -0
  33. package/template/.opencode/agent-docs/mobile/flutter/README.md +44 -0
  34. package/template/.opencode/agents/android-developer.md +418 -0
  35. package/template/.opencode/agents/code-igniter-3-fullstack.md +345 -0
  36. package/template/.opencode/agents/code-reviewer.md +517 -0
  37. package/template/.opencode/agents/database-specialist.md +455 -0
  38. package/template/.opencode/agents/devops-specialist.md +562 -0
  39. package/template/.opencode/agents/flutter-developer.md +556 -0
  40. package/template/.opencode/agents/it-leader.md +911 -0
  41. package/template/.opencode/agents/laravel-advanced.md +691 -0
  42. package/template/.opencode/agents/node-backend-developer.md +343 -0
  43. package/template/.opencode/agents/nuxt-frontend-developer-mentor.md +402 -0
  44. package/template/.opencode/agents/nuxt-frontend-developer.md +1573 -0
  45. package/template/.opencode/agents/react-frontend-developer.md +1017 -0
  46. package/template/.opencode/agents/seo-specialist.md +681 -0
  47. package/template/.opencode/agents/ui-ux-designer.md +783 -0
  48. package/template/.opencode/commands/android-build/command.md +25 -0
  49. package/template/.opencode/commands/android-test/command.md +23 -0
  50. package/template/.opencode/commands/build-fix.md +29 -0
  51. package/template/.opencode/commands/checkpoint.md +74 -0
  52. package/template/.opencode/commands/code-review.md +40 -0
  53. package/template/.opencode/commands/e2e.md +363 -0
  54. package/template/.opencode/commands/eval.md +120 -0
  55. package/template/.opencode/commands/evolve.md +193 -0
  56. package/template/.opencode/commands/flutter-build/command.md +25 -0
  57. package/template/.opencode/commands/flutter-test/command.md +24 -0
  58. package/template/.opencode/commands/go-build.md +183 -0
  59. package/template/.opencode/commands/go-review.md +148 -0
  60. package/template/.opencode/commands/go-test.md +268 -0
  61. package/template/.opencode/commands/gpc-release/command.md +30 -0
  62. package/template/.opencode/commands/instinct-export.md +91 -0
  63. package/template/.opencode/commands/instinct-import.md +142 -0
  64. package/template/.opencode/commands/instinct-status.md +86 -0
  65. package/template/.opencode/commands/learn.md +70 -0
  66. package/template/.opencode/commands/multi-backend.md +158 -0
  67. package/template/.opencode/commands/multi-execute.md +310 -0
  68. package/template/.opencode/commands/multi-frontend.md +158 -0
  69. package/template/.opencode/commands/multi-plan.md +261 -0
  70. package/template/.opencode/commands/multi-workflow.md +183 -0
  71. package/template/.opencode/commands/orchestrate.md +172 -0
  72. package/template/.opencode/commands/plan.md +113 -0
  73. package/template/.opencode/commands/pm2.md +271 -0
  74. package/template/.opencode/commands/python-review.md +297 -0
  75. package/template/.opencode/commands/refactor-clean.md +28 -0
  76. package/template/.opencode/commands/sessions.md +305 -0
  77. package/template/.opencode/commands/setup-pm.md +80 -0
  78. package/template/.opencode/commands/skill-create.md +174 -0
  79. package/template/.opencode/commands/tdd.md +326 -0
  80. package/template/.opencode/commands/test-coverage.md +27 -0
  81. package/template/.opencode/commands/update-codemaps.md +17 -0
  82. package/template/.opencode/commands/update-docs.md +31 -0
  83. package/template/.opencode/commands/verify.md +59 -0
  84. package/template/.opencode/config.example.json +309 -0
  85. package/template/.opencode/config.json +341 -0
  86. package/template/.opencode/contexts/dev.md +20 -0
  87. package/template/.opencode/contexts/research.md +26 -0
  88. package/template/.opencode/contexts/review.md +22 -0
  89. package/template/.opencode/hooks/hooks.json +169 -0
  90. package/template/.opencode/instructions/INSTRUCTIONS.md +388 -0
  91. package/template/.opencode/package.json +5 -0
  92. package/template/.opencode/rules/README.md +82 -0
  93. package/template/.opencode/rules/android/gradle.md +62 -0
  94. package/template/.opencode/rules/android/testing.md +27 -0
  95. package/template/.opencode/rules/common/agents.md +49 -0
  96. package/template/.opencode/rules/common/coding-style.md +48 -0
  97. package/template/.opencode/rules/common/git-workflow.md +45 -0
  98. package/template/.opencode/rules/common/hooks.md +30 -0
  99. package/template/.opencode/rules/common/patterns.md +31 -0
  100. package/template/.opencode/rules/common/performance.md +55 -0
  101. package/template/.opencode/rules/common/security.md +29 -0
  102. package/template/.opencode/rules/common/testing.md +29 -0
  103. package/template/.opencode/rules/flutter/state-management.md +57 -0
  104. package/template/.opencode/rules/flutter/testing.md +42 -0
  105. package/template/.opencode/rules/golang/coding-style.md +26 -0
  106. package/template/.opencode/rules/golang/hooks.md +11 -0
  107. package/template/.opencode/rules/golang/patterns.md +39 -0
  108. package/template/.opencode/rules/golang/security.md +28 -0
  109. package/template/.opencode/rules/golang/testing.md +25 -0
  110. package/template/.opencode/rules/mobile/performance.md +36 -0
  111. package/template/.opencode/rules/python/coding-style.md +37 -0
  112. package/template/.opencode/rules/python/hooks.md +14 -0
  113. package/template/.opencode/rules/python/patterns.md +34 -0
  114. package/template/.opencode/rules/python/security.md +25 -0
  115. package/template/.opencode/rules/python/testing.md +33 -0
  116. package/template/.opencode/rules/typescript/coding-style.md +58 -0
  117. package/template/.opencode/rules/typescript/hooks.md +15 -0
  118. package/template/.opencode/rules/typescript/patterns.md +45 -0
  119. package/template/.opencode/rules/typescript/security.md +21 -0
  120. package/template/.opencode/rules/typescript/testing.md +11 -0
  121. package/template/.opencode/skills/api-documentation/SKILL.md +188 -0
  122. package/template/.opencode/skills/backend-patterns/SKILL.md +587 -0
  123. package/template/.opencode/skills/building-components/SKILL.md +37 -0
  124. package/template/.opencode/skills/building-components/references/accessibility.mdx +819 -0
  125. package/template/.opencode/skills/building-components/references/as-child.mdx +324 -0
  126. package/template/.opencode/skills/building-components/references/composition.mdx +239 -0
  127. package/template/.opencode/skills/building-components/references/data-attributes.mdx +413 -0
  128. package/template/.opencode/skills/building-components/references/definitions.mdx +258 -0
  129. package/template/.opencode/skills/building-components/references/design-tokens.mdx +57 -0
  130. package/template/.opencode/skills/building-components/references/docs.mdx +155 -0
  131. package/template/.opencode/skills/building-components/references/marketplaces.mdx +144 -0
  132. package/template/.opencode/skills/building-components/references/npm.mdx +166 -0
  133. package/template/.opencode/skills/building-components/references/polymorphism.mdx +583 -0
  134. package/template/.opencode/skills/building-components/references/principles.mdx +61 -0
  135. package/template/.opencode/skills/building-components/references/registry.mdx +169 -0
  136. package/template/.opencode/skills/building-components/references/state.mdx +99 -0
  137. package/template/.opencode/skills/building-components/references/styling.mdx +286 -0
  138. package/template/.opencode/skills/building-components/references/types.mdx +191 -0
  139. package/template/.opencode/skills/clickhouse-io/SKILL.md +429 -0
  140. package/template/.opencode/skills/coding-standards/SKILL.md +520 -0
  141. package/template/.opencode/skills/configure-ecc/SKILL.md +298 -0
  142. package/template/.opencode/skills/continuous-learning/SKILL.md +110 -0
  143. package/template/.opencode/skills/continuous-learning/config.json +18 -0
  144. package/template/.opencode/skills/continuous-learning/evaluate-session.sh +60 -0
  145. package/template/.opencode/skills/continuous-learning-v2/SKILL.md +284 -0
  146. package/template/.opencode/skills/continuous-learning-v2/agents/observer.md +137 -0
  147. package/template/.opencode/skills/continuous-learning-v2/agents/start-observer.sh +134 -0
  148. package/template/.opencode/skills/continuous-learning-v2/config.json +41 -0
  149. package/template/.opencode/skills/continuous-learning-v2/hooks/observe.sh +153 -0
  150. package/template/.opencode/skills/continuous-learning-v2/scripts/instinct-cli.py +489 -0
  151. package/template/.opencode/skills/continuous-learning-v2/scripts/test_parse_instinct.py +82 -0
  152. package/template/.opencode/skills/dart-add-unit-test/SKILL.md +122 -0
  153. package/template/.opencode/skills/dart-build-cli-app/SKILL.md +185 -0
  154. package/template/.opencode/skills/dart-collect-coverage/SKILL.md +141 -0
  155. package/template/.opencode/skills/dart-fix-runtime-errors/SKILL.md +166 -0
  156. package/template/.opencode/skills/dart-generate-test-mocks/SKILL.md +155 -0
  157. package/template/.opencode/skills/dart-migrate-to-checks-package/SKILL.md +126 -0
  158. package/template/.opencode/skills/dart-resolve-package-conflicts/SKILL.md +116 -0
  159. package/template/.opencode/skills/dart-run-static-analysis/SKILL.md +104 -0
  160. package/template/.opencode/skills/dart-use-pattern-matching/SKILL.md +146 -0
  161. package/template/.opencode/skills/django-patterns/SKILL.md +733 -0
  162. package/template/.opencode/skills/django-security/SKILL.md +592 -0
  163. package/template/.opencode/skills/django-tdd/SKILL.md +728 -0
  164. package/template/.opencode/skills/django-verification/SKILL.md +460 -0
  165. package/template/.opencode/skills/eval-harness/SKILL.md +227 -0
  166. package/template/.opencode/skills/firebase-basics/SKILL.md +103 -0
  167. package/template/.opencode/skills/firebase-basics/references/additional-skills.md +113 -0
  168. package/template/.opencode/skills/firebase-basics/references/cli-usage.md +31 -0
  169. package/template/.opencode/skills/firebase-basics/references/client-library-usage.md +45 -0
  170. package/template/.opencode/skills/firebase-basics/references/core-concepts.md +61 -0
  171. package/template/.opencode/skills/firebase-basics/references/iac-usage.md +40 -0
  172. package/template/.opencode/skills/firebase-basics/references/iam-security.md +74 -0
  173. package/template/.opencode/skills/firebase-basics/references/mcp-usage.md +63 -0
  174. package/template/.opencode/skills/flutter/SKILL.md +292 -0
  175. package/template/.opencode/skills/flutter-add-integration-test/SKILL.md +163 -0
  176. package/template/.opencode/skills/flutter-add-widget-preview/SKILL.md +145 -0
  177. package/template/.opencode/skills/flutter-add-widget-test/SKILL.md +154 -0
  178. package/template/.opencode/skills/flutter-apply-architecture-best-practices/SKILL.md +162 -0
  179. package/template/.opencode/skills/flutter-build-responsive-layout/SKILL.md +139 -0
  180. package/template/.opencode/skills/flutter-fix-layout-issues/SKILL.md +130 -0
  181. package/template/.opencode/skills/flutter-implement-json-serialization/SKILL.md +153 -0
  182. package/template/.opencode/skills/flutter-setup-declarative-routing/SKILL.md +255 -0
  183. package/template/.opencode/skills/flutter-setup-localization/SKILL.md +210 -0
  184. package/template/.opencode/skills/flutter-use-http-package/SKILL.md +174 -0
  185. package/template/.opencode/skills/frontend-design/SKILL.md +89 -0
  186. package/template/.opencode/skills/frontend-patterns/SKILL.md +631 -0
  187. package/template/.opencode/skills/golang-patterns/SKILL.md +673 -0
  188. package/template/.opencode/skills/golang-testing/SKILL.md +719 -0
  189. package/template/.opencode/skills/impeccable/SKILL.md +165 -0
  190. package/template/.opencode/skills/impeccable/agents/impeccable-asset-producer.md +101 -0
  191. package/template/.opencode/skills/impeccable/reference/adapt.md +190 -0
  192. package/template/.opencode/skills/impeccable/reference/animate.md +175 -0
  193. package/template/.opencode/skills/impeccable/reference/audit.md +133 -0
  194. package/template/.opencode/skills/impeccable/reference/bolder.md +113 -0
  195. package/template/.opencode/skills/impeccable/reference/brand.md +118 -0
  196. package/template/.opencode/skills/impeccable/reference/clarify.md +174 -0
  197. package/template/.opencode/skills/impeccable/reference/codex.md +105 -0
  198. package/template/.opencode/skills/impeccable/reference/cognitive-load.md +106 -0
  199. package/template/.opencode/skills/impeccable/reference/color-and-contrast.md +105 -0
  200. package/template/.opencode/skills/impeccable/reference/colorize.md +154 -0
  201. package/template/.opencode/skills/impeccable/reference/craft.md +123 -0
  202. package/template/.opencode/skills/impeccable/reference/critique.md +273 -0
  203. package/template/.opencode/skills/impeccable/reference/delight.md +302 -0
  204. package/template/.opencode/skills/impeccable/reference/distill.md +111 -0
  205. package/template/.opencode/skills/impeccable/reference/document.md +427 -0
  206. package/template/.opencode/skills/impeccable/reference/extract.md +69 -0
  207. package/template/.opencode/skills/impeccable/reference/harden.md +347 -0
  208. package/template/.opencode/skills/impeccable/reference/heuristics-scoring.md +234 -0
  209. package/template/.opencode/skills/impeccable/reference/interaction-design.md +195 -0
  210. package/template/.opencode/skills/impeccable/reference/layout.md +141 -0
  211. package/template/.opencode/skills/impeccable/reference/live.md +622 -0
  212. package/template/.opencode/skills/impeccable/reference/motion-design.md +109 -0
  213. package/template/.opencode/skills/impeccable/reference/onboard.md +234 -0
  214. package/template/.opencode/skills/impeccable/reference/optimize.md +258 -0
  215. package/template/.opencode/skills/impeccable/reference/overdrive.md +130 -0
  216. package/template/.opencode/skills/impeccable/reference/personas.md +179 -0
  217. package/template/.opencode/skills/impeccable/reference/polish.md +242 -0
  218. package/template/.opencode/skills/impeccable/reference/product.md +62 -0
  219. package/template/.opencode/skills/impeccable/reference/quieter.md +99 -0
  220. package/template/.opencode/skills/impeccable/reference/responsive-design.md +114 -0
  221. package/template/.opencode/skills/impeccable/reference/shape.md +165 -0
  222. package/template/.opencode/skills/impeccable/reference/spatial-design.md +100 -0
  223. package/template/.opencode/skills/impeccable/reference/teach.md +156 -0
  224. package/template/.opencode/skills/impeccable/reference/typeset.md +124 -0
  225. package/template/.opencode/skills/impeccable/reference/typography.md +159 -0
  226. package/template/.opencode/skills/impeccable/reference/ux-writing.md +107 -0
  227. package/template/.opencode/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
  228. package/template/.opencode/skills/impeccable/scripts/command-metadata.json +94 -0
  229. package/template/.opencode/skills/impeccable/scripts/critique-storage.mjs +242 -0
  230. package/template/.opencode/skills/impeccable/scripts/design-parser.mjs +820 -0
  231. package/template/.opencode/skills/impeccable/scripts/detect-csp.mjs +198 -0
  232. package/template/.opencode/skills/impeccable/scripts/detect.mjs +21 -0
  233. package/template/.opencode/skills/impeccable/scripts/impeccable-paths.mjs +110 -0
  234. package/template/.opencode/skills/impeccable/scripts/is-generated.mjs +69 -0
  235. package/template/.opencode/skills/impeccable/scripts/live-accept.mjs +595 -0
  236. package/template/.opencode/skills/impeccable/scripts/live-browser-session.js +123 -0
  237. package/template/.opencode/skills/impeccable/scripts/live-browser.js +4860 -0
  238. package/template/.opencode/skills/impeccable/scripts/live-complete.mjs +75 -0
  239. package/template/.opencode/skills/impeccable/scripts/live-completion.mjs +18 -0
  240. package/template/.opencode/skills/impeccable/scripts/live-inject.mjs +446 -0
  241. package/template/.opencode/skills/impeccable/scripts/live-poll.mjs +200 -0
  242. package/template/.opencode/skills/impeccable/scripts/live-resume.mjs +48 -0
  243. package/template/.opencode/skills/impeccable/scripts/live-server.mjs +838 -0
  244. package/template/.opencode/skills/impeccable/scripts/live-session-store.mjs +254 -0
  245. package/template/.opencode/skills/impeccable/scripts/live-status.mjs +47 -0
  246. package/template/.opencode/skills/impeccable/scripts/live-wrap.mjs +632 -0
  247. package/template/.opencode/skills/impeccable/scripts/live.mjs +247 -0
  248. package/template/.opencode/skills/impeccable/scripts/load-context.mjs +141 -0
  249. package/template/.opencode/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  250. package/template/.opencode/skills/impeccable/scripts/pin.mjs +214 -0
  251. package/template/.opencode/skills/iterative-retrieval/SKILL.md +202 -0
  252. package/template/.opencode/skills/java-coding-standards/SKILL.md +138 -0
  253. package/template/.opencode/skills/jetpack-compose/.skillfish.json +10 -0
  254. package/template/.opencode/skills/jetpack-compose/SKILL.md +420 -0
  255. package/template/.opencode/skills/jpa-patterns/SKILL.md +141 -0
  256. package/template/.opencode/skills/nutrient-document-processing/SKILL.md +165 -0
  257. package/template/.opencode/skills/nuxt-ui/SKILL.md +334 -0
  258. package/template/.opencode/skills/nuxt-ui/references/components.md +377 -0
  259. package/template/.opencode/skills/nuxt-ui/references/composables.md +127 -0
  260. package/template/.opencode/skills/nuxt-ui/references/layouts/chat.md +266 -0
  261. package/template/.opencode/skills/nuxt-ui/references/layouts/dashboard.md +220 -0
  262. package/template/.opencode/skills/nuxt-ui/references/layouts/docs.md +141 -0
  263. package/template/.opencode/skills/nuxt-ui/references/layouts/editor.md +168 -0
  264. package/template/.opencode/skills/nuxt-ui/references/layouts/page.md +260 -0
  265. package/template/.opencode/skills/nuxt-ui/references/theming.md +427 -0
  266. package/template/.opencode/skills/postgres-patterns/SKILL.md +146 -0
  267. package/template/.opencode/skills/project-guidelines-example/SKILL.md +345 -0
  268. package/template/.opencode/skills/python-patterns/SKILL.md +749 -0
  269. package/template/.opencode/skills/python-testing/SKILL.md +815 -0
  270. package/template/.opencode/skills/security-review/SKILL.md +494 -0
  271. package/template/.opencode/skills/security-review/cloud-infrastructure-security.md +361 -0
  272. package/template/.opencode/skills/shadcn-ui/README.md +248 -0
  273. package/template/.opencode/skills/shadcn-ui/SKILL.md +326 -0
  274. package/template/.opencode/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
  275. package/template/.opencode/skills/shadcn-ui/examples/data-table.tsx +313 -0
  276. package/template/.opencode/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
  277. package/template/.opencode/skills/shadcn-ui/resources/component-catalog.md +481 -0
  278. package/template/.opencode/skills/shadcn-ui/resources/customization-guide.md +516 -0
  279. package/template/.opencode/skills/shadcn-ui/resources/migration-guide.md +463 -0
  280. package/template/.opencode/skills/shadcn-ui/resources/setup-guide.md +412 -0
  281. package/template/.opencode/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
  282. package/template/.opencode/skills/springboot-patterns/SKILL.md +304 -0
  283. package/template/.opencode/skills/springboot-security/SKILL.md +119 -0
  284. package/template/.opencode/skills/springboot-tdd/SKILL.md +157 -0
  285. package/template/.opencode/skills/springboot-verification/SKILL.md +100 -0
  286. package/template/.opencode/skills/strategic-compact/SKILL.md +63 -0
  287. package/template/.opencode/skills/strategic-compact/suggest-compact.sh +52 -0
  288. package/template/.opencode/skills/tdd-workflow/SKILL.md +409 -0
  289. package/template/.opencode/skills/vercel-composition-patterns/AGENTS.md +946 -0
  290. package/template/.opencode/skills/vercel-composition-patterns/SKILL.md +89 -0
  291. package/template/.opencode/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  292. package/template/.opencode/skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
  293. package/template/.opencode/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  294. package/template/.opencode/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  295. package/template/.opencode/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  296. package/template/.opencode/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  297. package/template/.opencode/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
  298. package/template/.opencode/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  299. package/template/.opencode/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  300. package/template/.opencode/skills/vercel-react-best-practices/SKILL.md +136 -0
  301. package/template/.opencode/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  302. package/template/.opencode/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  303. package/template/.opencode/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  304. package/template/.opencode/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  305. package/template/.opencode/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  306. package/template/.opencode/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  307. package/template/.opencode/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  308. package/template/.opencode/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  309. package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  310. package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  311. package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  312. package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  313. package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  314. package/template/.opencode/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  315. package/template/.opencode/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  316. package/template/.opencode/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  317. package/template/.opencode/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  318. package/template/.opencode/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  319. package/template/.opencode/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  320. package/template/.opencode/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  321. package/template/.opencode/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  322. package/template/.opencode/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  323. package/template/.opencode/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  324. package/template/.opencode/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  325. package/template/.opencode/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  326. package/template/.opencode/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  327. package/template/.opencode/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  328. package/template/.opencode/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  329. package/template/.opencode/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  330. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  331. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  332. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  333. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  334. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  335. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  336. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  337. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  338. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  339. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  340. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  341. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  342. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  343. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  344. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  345. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  346. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  347. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  348. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  349. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  350. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  351. package/template/.opencode/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  352. package/template/.opencode/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  353. package/template/.opencode/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  354. package/template/.opencode/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  355. package/template/.opencode/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  356. package/template/.opencode/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  357. package/template/.opencode/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  358. package/template/.opencode/skills/verification-loop/SKILL.md +120 -0
  359. package/template/.opencode/skills/web-design-guidelines/SKILL.md +39 -0
  360. package/template/AGENTS.md +32 -0
  361. package/template/opencode.json +354 -0
@@ -0,0 +1,153 @@
1
+ ---
2
+ name: flutter-implement-json-serialization
3
+ description: Create model classes with `fromJson` and `toJson` methods using `dart:convert`. Use when manually mapping JSON keys to class properties for simple data structures.
4
+ metadata:
5
+ model: models/gemini-3.1-pro-preview
6
+ last_modified: Tue, 21 Apr 2026 21:44:50 GMT
7
+ ---
8
+ # Serializing JSON Manually in Flutter
9
+
10
+ ## Contents
11
+ - [Core Guidelines](#core-guidelines)
12
+ - [Workflow: Implementing a Serializable Model](#workflow-implementing-a-serializable-model)
13
+ - [Workflow: Fetching and Parsing JSON](#workflow-fetching-and-parsing-json)
14
+ - [Examples](#examples)
15
+
16
+ ## Core Guidelines
17
+
18
+ - **Import `dart:convert`**: Utilize Flutter's built-in `dart:convert` library for manual JSON encoding (`jsonEncode`) and decoding (`jsonDecode`).
19
+ - **Enforce Type Safety**: Always cast the `dynamic` result of `jsonDecode()` to the expected type, typically `Map<String, dynamic>` for objects or `List<dynamic>` for arrays.
20
+ - **Encapsulate Serialization Logic**: Define plain model classes containing properties corresponding to the JSON structure. Implement a `fromJson` factory constructor and a `toJson` method within the model.
21
+ - **Handle Background Parsing**: If parsing large JSON documents (execution time > 16ms), offload the parsing logic to a separate isolate using Flutter's `compute()` function to prevent UI jank.
22
+ - **Throw Exceptions on Failure**: When handling HTTP responses, throw an exception if the status code is not successful (e.g., not 200 OK or 201 Created). Do not return `null`.
23
+
24
+ ## Workflow: Implementing a Serializable Model
25
+
26
+ Use this checklist to implement manual JSON serialization for a data model.
27
+
28
+ **Task Progress:**
29
+ - [ ] Define the plain model class with `final` properties.
30
+ - [ ] Implement the `factory Model.fromJson(Map<String, dynamic> json)` constructor.
31
+ - [ ] Implement the `Map<String, dynamic> toJson()` method.
32
+ - [ ] Write unit tests for both serialization methods.
33
+ - [ ] Run validator -> review type mismatch errors -> fix casting logic.
34
+
35
+ 1. **Define the Model**: Create a class with properties matching the JSON keys.
36
+ 2. **Implement `fromJson`**: Extract values from the `Map` and cast them to the appropriate Dart types. Use pattern matching or explicit casting.
37
+ 3. **Implement `toJson`**: Return a `Map<String, dynamic>` mapping the class properties back to their JSON string keys.
38
+ 4. **Validate**: Execute unit tests to ensure type safety, autocompletion, and compile-time exception handling function correctly.
39
+
40
+ ## Workflow: Fetching and Parsing JSON
41
+
42
+ Use this conditional workflow when retrieving and parsing JSON from a network request.
43
+
44
+ **Task Progress:**
45
+ - [ ] Execute the HTTP request.
46
+ - [ ] Validate the response status code.
47
+ - [ ] Determine parsing strategy (Synchronous vs. Isolate).
48
+ - [ ] Decode and map the JSON to the model.
49
+
50
+ 1. **Execute Request**: Use the `http` package to perform the network call.
51
+ 2. **Validate Response**:
52
+ - If `response.statusCode == 200` (or 201 for POST), proceed to parsing.
53
+ - If the status code indicates failure, throw an `Exception`.
54
+ 3. **Determine Parsing Strategy**:
55
+ - If parsing a **small payload** (e.g., a single object), parse synchronously on the main thread.
56
+ - If parsing a **large payload** (e.g., an array of thousands of objects), use `compute(parseFunction, response.body)` to parse in a background isolate.
57
+ 4. **Decode and Map**: Pass the decoded JSON to your model's `fromJson` constructor.
58
+
59
+ ## Examples
60
+
61
+ ### High-Fidelity Model Implementation
62
+
63
+ ```dart
64
+ import 'dart:convert';
65
+
66
+ class User {
67
+ final int id;
68
+ final String name;
69
+ final String email;
70
+
71
+ const User({
72
+ required this.id,
73
+ required this.name,
74
+ required this.email,
75
+ });
76
+
77
+ // Factory constructor for deserialization
78
+ factory User.fromJson(Map<String, dynamic> json) {
79
+ return switch (json) {
80
+ {
81
+ 'id': int id,
82
+ 'name': String name,
83
+ 'email': String email,
84
+ } =>
85
+ User(
86
+ id: id,
87
+ name: name,
88
+ email: email,
89
+ ),
90
+ _ => throw const FormatException('Failed to load User.'),
91
+ };
92
+ }
93
+
94
+ // Method for serialization
95
+ Map<String, dynamic> toJson() {
96
+ return {
97
+ 'id': id,
98
+ 'name': name,
99
+ 'email': email,
100
+ };
101
+ }
102
+ }
103
+ ```
104
+
105
+ ### Synchronous Parsing (Small Payload)
106
+
107
+ ```dart
108
+ import 'dart:convert';
109
+ import 'package:http/http.dart' as http;
110
+
111
+ Future<User> fetchUser(http.Client client, int userId) async {
112
+ final response = await client.get(
113
+ Uri.parse('https://api.example.com/users/$userId'),
114
+ headers: {'Accept': 'application/json'},
115
+ );
116
+
117
+ if (response.statusCode == 200) {
118
+ // Decode returns dynamic, cast to Map<String, dynamic>
119
+ final Map<String, dynamic> jsonMap = jsonDecode(response.body) as Map<String, dynamic>;
120
+ return User.fromJson(jsonMap);
121
+ } else {
122
+ throw Exception('Failed to load user');
123
+ }
124
+ }
125
+ ```
126
+
127
+ ### Background Parsing (Large Payload)
128
+
129
+ ```dart
130
+ import 'dart:convert';
131
+ import 'package:flutter/foundation.dart';
132
+ import 'package:http/http.dart' as http;
133
+
134
+ // Top-level function required for compute()
135
+ List<User> parseUsers(String responseBody) {
136
+ final parsed = (jsonDecode(responseBody) as List<dynamic>).cast<Map<String, dynamic>>();
137
+ return parsed.map<User>((json) => User.fromJson(json)).toList();
138
+ }
139
+
140
+ Future<List<User>> fetchUsers(http.Client client) async {
141
+ final response = await client.get(
142
+ Uri.parse('https://api.example.com/users'),
143
+ headers: {'Accept': 'application/json'},
144
+ );
145
+
146
+ if (response.statusCode == 200) {
147
+ // Offload expensive parsing to a background isolate
148
+ return compute(parseUsers, response.body);
149
+ } else {
150
+ throw Exception('Failed to load users');
151
+ }
152
+ }
153
+ ```
@@ -0,0 +1,255 @@
1
+ ---
2
+ name: flutter-setup-declarative-routing
3
+ description: Configure `MaterialApp.router` using a package like `go_router` for advanced URL-based navigation. Use when developing web applications or mobile apps that require specific deep linking and browser history support.
4
+ metadata:
5
+ model: models/gemini-3.1-pro-preview
6
+ last_modified: Tue, 21 Apr 2026 21:08:03 GMT
7
+ ---
8
+ # Implementing Routing and Deep Linking
9
+
10
+ ## Contents
11
+ - [Core Concepts](#core-concepts)
12
+ - [Workflow: Initializing the Application and Router](#workflow-initializing-the-application-and-router)
13
+ - [Workflow: Configuring Platform Deep Linking](#workflow-configuring-platform-deep-linking)
14
+ - [Workflow: Implementing Nested Navigation](#workflow-implementing-nested-navigation)
15
+ - [Examples](#examples)
16
+
17
+ ## Core Concepts
18
+
19
+ Use the `go_router` package for declarative routing in Flutter. It provides a robust API for complex routing scenarios, deep linking, and nested navigation.
20
+
21
+ - **GoRouter**: The central configuration object defining the application's route tree.
22
+ - **GoRoute**: A standard route mapping a URL path to a Flutter screen.
23
+ - **ShellRoute / StatefulShellRoute**: Wraps child routes in a persistent UI shell (e.g., a `BottomNavigationBar`). `StatefulShellRoute` maintains the state of parallel navigation branches.
24
+ - **Path URL Strategy**: Removes the default `#` fragment from web URLs, essential for clean deep linking across platforms.
25
+
26
+ ## Workflow: Initializing the Application and Router
27
+
28
+ Follow this workflow to bootstrap a new Flutter application with `go_router` and configure the root routing mechanism.
29
+
30
+ ### Task Progress
31
+ - [ ] Create the Flutter application.
32
+ - [ ] Add the `go_router` dependency.
33
+ - [ ] Configure the URL strategy for web/deep linking.
34
+ - [ ] Implement the `GoRouter` configuration.
35
+ - [ ] Bind the router to `MaterialApp.router`.
36
+
37
+ ### 1. Scaffold the Application
38
+ Run the following commands to create the app and add the required routing package:
39
+ ```bash
40
+ flutter create <app-name>
41
+ cd <app-name>
42
+ flutter pub add go_router
43
+ ```
44
+
45
+ ### 2. Configure the Router
46
+ Define a top-level `GoRouter` instance. Handle authentication or state-based routing using the `redirect` parameter.
47
+
48
+ ```dart
49
+ import 'package:flutter/material.dart';
50
+ import 'package:go_router/go_router.dart';
51
+ import 'package:flutter_web_plugins/url_strategy.dart';
52
+
53
+ void main() {
54
+ // Use path URL strategy to remove the '#' from web URLs
55
+ usePathUrlStrategy();
56
+ runApp(const MyApp());
57
+ }
58
+
59
+ final GoRouter _router = GoRouter(
60
+ initialLocation: '/',
61
+ routes: [
62
+ GoRoute(
63
+ path: '/',
64
+ builder: (context, state) => const HomeScreen(),
65
+ routes: [
66
+ GoRoute(
67
+ path: 'details/:id',
68
+ builder: (context, state) => DetailsScreen(id: state.pathParameters['id']!),
69
+ ),
70
+ ],
71
+ ),
72
+ ],
73
+ errorBuilder: (context, state) => ErrorScreen(error: state.error),
74
+ );
75
+
76
+ class MyApp extends StatelessWidget {
77
+ const MyApp({super.key});
78
+
79
+ @override
80
+ Widget build(BuildContext context) {
81
+ return MaterialApp.router(
82
+ routerConfig: _router,
83
+ title: 'Routing App',
84
+ );
85
+ }
86
+ }
87
+ ```
88
+
89
+ ## Workflow: Configuring Platform Deep Linking
90
+
91
+ Configure the native platforms to intercept specific URLs and route them into the Flutter application.
92
+
93
+ ### Task Progress
94
+ - [ ] Determine target platforms (iOS, Android, or both).
95
+ - [ ] Apply conditional configuration for Android (Manifest + Asset Links).
96
+ - [ ] Apply conditional configuration for iOS (Plist + Entitlements + AASA).
97
+ - [ ] Run validator -> review errors -> fix.
98
+
99
+ ### If configuring for Android:
100
+ 1. **Modify `AndroidManifest.xml`**: Add the intent filter inside the `<activity>` tag for `.MainActivity`.
101
+ ```xml
102
+ <intent-filter android:autoVerify="true">
103
+ <action android:name="android.intent.action.VIEW" />
104
+ <category android:name="android.intent.category.DEFAULT" />
105
+ <category android:name="android.intent.category.BROWSABLE" />
106
+ <data android:scheme="http" android:host="yourdomain.com" />
107
+ <data android:scheme="https" />
108
+ </intent-filter>
109
+ ```
110
+ 2. **Host `assetlinks.json`**: Serve the following JSON at `https://yourdomain.com/.well-known/assetlinks.json`.
111
+ ```json
112
+ [{
113
+ "relation": ["delegate_permission/common.handle_all_urls"],
114
+ "target": {
115
+ "namespace": "android_app",
116
+ "package_name": "com.yourcompany.yourapp",
117
+ "sha256_cert_fingerprints": ["YOUR_SHA256_FINGERPRINT"]
118
+ }
119
+ }]
120
+ ```
121
+
122
+ ### If configuring for iOS:
123
+ 1. **Modify `Info.plist`**: Opt-in to Flutter's default deep link handler.
124
+ *Note: If using a third-party deep linking plugin (e.g., `app_links`), set this to `NO` to prevent conflicts.*
125
+ ```xml
126
+ <key>FlutterDeepLinkingEnabled</key>
127
+ <true/>
128
+ ```
129
+ 2. **Modify `Runner.entitlements`**: Add the associated domain.
130
+ ```xml
131
+ <key>com.apple.developer.associated-domains</key>
132
+ <array>
133
+ <string>applinks:yourdomain.com</string>
134
+ </array>
135
+ ```
136
+ 3. **Host `apple-app-site-association`**: Serve the following JSON (without a `.json` extension) at `https://yourdomain.com/.well-known/apple-app-site-association`.
137
+ ```json
138
+ {
139
+ "applinks": {
140
+ "apps": [],
141
+ "details": [{
142
+ "appIDs": ["TEAM_ID.com.yourcompany.yourapp"],
143
+ "paths": ["*"],
144
+ "components": [{"/": "/*"}]
145
+ }]
146
+ }
147
+ }
148
+ ```
149
+
150
+ ### Validation Loop
151
+ Run validator -> review errors -> fix.
152
+ - **Android**: Test using ADB.
153
+ ```bash
154
+ adb shell 'am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "https://yourdomain.com/details/123"' com.yourcompany.yourapp
155
+ ```
156
+ - **iOS**: Test using `xcrun` on a booted simulator.
157
+ ```bash
158
+ xcrun simctl openurl booted https://yourdomain.com/details/123
159
+ ```
160
+
161
+ ## Workflow: Implementing Nested Navigation
162
+
163
+ Use `StatefulShellRoute` to implement persistent UI shells (like a bottom navigation bar) that maintain the state of their child routes.
164
+
165
+ ### Task Progress
166
+ - [ ] Define `StatefulShellRoute.indexedStack` in the `GoRouter` configuration.
167
+ - [ ] Create `StatefulShellBranch` instances for each navigation tab.
168
+ - [ ] Implement the shell widget using `StatefulNavigationShell`.
169
+
170
+ ```dart
171
+ final GoRouter _router = GoRouter(
172
+ initialLocation: '/home',
173
+ routes: [
174
+ StatefulShellRoute.indexedStack(
175
+ builder: (context, state, navigationShell) {
176
+ return ScaffoldWithNavBar(navigationShell: navigationShell);
177
+ },
178
+ branches: [
179
+ StatefulShellBranch(
180
+ routes: [
181
+ GoRoute(
182
+ path: '/home',
183
+ builder: (context, state) => const HomeScreen(),
184
+ ),
185
+ ],
186
+ ),
187
+ StatefulShellBranch(
188
+ routes: [
189
+ GoRoute(
190
+ path: '/settings',
191
+ builder: (context, state) => const SettingsScreen(),
192
+ ),
193
+ ],
194
+ ),
195
+ ],
196
+ ),
197
+ ],
198
+ );
199
+ ```
200
+
201
+ ## Examples
202
+
203
+ ### High-Fidelity Shell Widget Implementation
204
+ Implement the UI shell that consumes the `StatefulNavigationShell` to handle branch switching.
205
+
206
+ ```dart
207
+ class ScaffoldWithNavBar extends StatelessWidget {
208
+ const ScaffoldWithNavBar({
209
+ required this.navigationShell,
210
+ super.key,
211
+ });
212
+
213
+ final StatefulNavigationShell navigationShell;
214
+
215
+ void _goBranch(int index) {
216
+ navigationShell.goBranch(
217
+ index,
218
+ // Support navigating to the initial location when tapping the active tab.
219
+ initialLocation: index == navigationShell.currentIndex,
220
+ );
221
+ }
222
+
223
+ @override
224
+ Widget build(BuildContext context) {
225
+ return Scaffold(
226
+ body: navigationShell,
227
+ bottomNavigationBar: NavigationBar(
228
+ selectedIndex: navigationShell.currentIndex,
229
+ onDestinationSelected: _goBranch,
230
+ destinations: const [
231
+ NavigationDestination(icon: Icon(Icons.home), label: 'Home'),
232
+ NavigationDestination(icon: Icon(Icons.settings), label: 'Settings'),
233
+ ],
234
+ ),
235
+ );
236
+ }
237
+ }
238
+ ```
239
+
240
+ ### Programmatic Navigation
241
+ Use the `context.go()` and `context.push()` extension methods provided by `go_router`.
242
+
243
+ ```dart
244
+ // Replaces the current route stack with the target route (Declarative)
245
+ context.go('/details/123');
246
+
247
+ // Pushes the target route onto the existing stack (Imperative)
248
+ context.push('/details/123');
249
+
250
+ // Navigates using a named route and path parameters
251
+ context.goNamed('details', pathParameters: {'id': '123'});
252
+
253
+ // Pops the current route
254
+ context.pop();
255
+ ```
@@ -0,0 +1,210 @@
1
+ ---
2
+ name: flutter-setup-localization
3
+ description: Add `flutter_localizations` and `intl` dependencies, enable "generate true" in `pubspec.yaml`, and create an `l10n.yaml` configuration file. Use when initializing localization support for a new Flutter project.
4
+ metadata:
5
+ model: models/gemini-3.1-pro-preview
6
+ last_modified: Tue, 21 Apr 2026 21:27:35 GMT
7
+ ---
8
+ # Internationalizing Flutter Applications
9
+
10
+ ## Contents
11
+ - [Core Concepts](#core-concepts)
12
+ - [Setup Workflow](#setup-workflow)
13
+ - [Implementation Workflow](#implementation-workflow)
14
+ - [Advanced Formatting](#advanced-formatting)
15
+ - [Examples](#examples)
16
+
17
+ ## Core Concepts
18
+ Flutter handles internationalization (i18n) and localization (l10n) via the `flutter_localizations` and `intl` packages. The standard approach uses App Resource Bundle (`.arb`) files to define localized strings, which are then compiled into a generated `AppLocalizations` class for type-safe access within the widget tree.
19
+
20
+ ## Setup Workflow
21
+
22
+ Copy and track this checklist when initializing internationalization in a Flutter project:
23
+
24
+ - [ ] **Task Progress**
25
+ - [ ] 1. Add dependencies to `pubspec.yaml`.
26
+ - [ ] 2. Enable the `generate` flag.
27
+ - [ ] 3. Create the `l10n.yaml` configuration file.
28
+ - [ ] 4. Configure `MaterialApp` or `CupertinoApp`.
29
+
30
+ ### 1. Add Dependencies
31
+ Add the required localization packages to the project. Execute the following commands in the terminal:
32
+ ```bash
33
+ flutter pub add flutter_localizations --sdk=flutter
34
+ flutter pub add intl:any
35
+ ```
36
+
37
+ Verify your `pubspec.yaml` includes the following under `dependencies`:
38
+ ```yaml
39
+ dependencies:
40
+ flutter:
41
+ sdk: flutter
42
+ flutter_localizations:
43
+ sdk: flutter
44
+ intl: any
45
+ ```
46
+
47
+ ### 2. Enable Code Generation
48
+ Open `pubspec.yaml` and enable the `generate` flag within the `flutter` section to automate localization tasks:
49
+ ```yaml
50
+ flutter:
51
+ generate: true
52
+ ```
53
+
54
+ ### 3. Create Configuration File
55
+ Create a new file named `l10n.yaml` in the root directory of the Flutter project. Define the input directory, template file, and output file:
56
+ ```yaml
57
+ arb-dir: lib/l10n
58
+ template-arb-file: app_en.arb
59
+ output-localization-file: app_localizations.dart
60
+ synthetic-package: true
61
+ ```
62
+
63
+ ### 4. Configure the App Entry Point
64
+ Import the generated localizations and the `flutter_localizations` library in your `main.dart`. Inject the delegates and supported locales into your `MaterialApp` or `CupertinoApp`.
65
+
66
+ ```dart
67
+ import 'package:flutter_localizations/flutter_localizations.dart';
68
+ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; // Adjust path if synthetic-package is false
69
+
70
+ // ... inside build method
71
+ return MaterialApp(
72
+ localizationsDelegates: const [
73
+ AppLocalizations.delegate,
74
+ GlobalMaterialLocalizations.delegate,
75
+ GlobalWidgetsLocalizations.delegate,
76
+ GlobalCupertinoLocalizations.delegate,
77
+ ],
78
+ supportedLocales: const [
79
+ Locale('en'), // English
80
+ Locale('es'), // Spanish
81
+ ],
82
+ home: const MyHomePage(),
83
+ );
84
+ ```
85
+
86
+ ## Implementation Workflow
87
+
88
+ Follow this workflow when adding or modifying localized content.
89
+
90
+ ### 1. Define ARB Files
91
+ * **If creating NEW content:** Add the base string to the template file (`lib/l10n/app_en.arb`). Include a description for context.
92
+ * **If EDITING existing content:** Locate the key in all supported `.arb` files and update the values.
93
+
94
+ ```json
95
+ {
96
+ "helloWorld": "Hello World!",
97
+ "@helloWorld": {
98
+ "description": "The conventional newborn programmer greeting"
99
+ }
100
+ }
101
+ ```
102
+
103
+ Create corresponding files for other locales (e.g., `app_es.arb`):
104
+ ```json
105
+ {
106
+ "helloWorld": "¡Hola Mundo!"
107
+ }
108
+ ```
109
+
110
+ ### 2. Generate Localization Classes
111
+ Run the following command to trigger code generation:
112
+ ```bash
113
+ flutter pub get
114
+ ```
115
+ *Feedback Loop:* Run validator -> review terminal output for ARB syntax errors -> fix missing commas or mismatched placeholders -> re-run `flutter pub get`.
116
+
117
+ ### 3. Consume Localized Strings
118
+ Access the localized strings in your widget tree using `AppLocalizations.of(context)`. Ensure the widget calling this is a descendant of `MaterialApp`.
119
+
120
+ ```dart
121
+ Text(AppLocalizations.of(context)!.helloWorld)
122
+ ```
123
+
124
+ ## Advanced Formatting
125
+
126
+ Use placeholders for dynamic data, plurals, and conditional selects.
127
+
128
+ ### Placeholders
129
+ Define parameters within curly braces and specify their type in the metadata object.
130
+ ```json
131
+ "hello": "Hello {userName}",
132
+ "@hello": {
133
+ "description": "A message with a single parameter",
134
+ "placeholders": {
135
+ "userName": {
136
+ "type": "String",
137
+ "example": "Bob"
138
+ }
139
+ }
140
+ }
141
+ ```
142
+
143
+ ### Plurals
144
+ Use the `plural` syntax to handle quantity-based string variations. The `other` case is mandatory.
145
+ ```json
146
+ "nWombats": "{count, plural, =0{no wombats} =1{1 wombat} other{{count} wombats}}",
147
+ "@nWombats": {
148
+ "description": "A plural message",
149
+ "placeholders": {
150
+ "count": {
151
+ "type": "num",
152
+ "format": "compact"
153
+ }
154
+ }
155
+ }
156
+ ```
157
+
158
+ ### Selects
159
+ Use the `select` syntax for conditional strings, such as gendered text.
160
+ ```json
161
+ "pronoun": "{gender, select, male{he} female{she} other{they}}",
162
+ "@pronoun": {
163
+ "description": "A gendered message",
164
+ "placeholders": {
165
+ "gender": {
166
+ "type": "String"
167
+ }
168
+ }
169
+ }
170
+ ```
171
+
172
+ ## Examples
173
+
174
+ ### Complete `l10n.yaml`
175
+ ```yaml
176
+ arb-dir: lib/l10n
177
+ template-arb-file: app_en.arb
178
+ output-localization-file: app_localizations.dart
179
+ synthetic-package: true
180
+ use-escaping: true
181
+ ```
182
+
183
+ ### Complete Widget Implementation
184
+ ```dart
185
+ import 'package:flutter/material.dart';
186
+ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
187
+
188
+ class GreetingWidget extends StatelessWidget {
189
+ final String userName;
190
+ final int notificationCount;
191
+
192
+ const GreetingWidget({
193
+ super.key,
194
+ required this.userName,
195
+ required this.notificationCount,
196
+ });
197
+
198
+ @override
199
+ Widget build(BuildContext context) {
200
+ final l10n = AppLocalizations.of(context)!;
201
+
202
+ return Column(
203
+ children: [
204
+ Text(l10n.hello(userName)),
205
+ Text(l10n.nWombats(notificationCount)),
206
+ ],
207
+ );
208
+ }
209
+ }
210
+ ```