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,214 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Pin/unpin sub-commands as standalone skill shortcuts.
4
+ *
5
+ * Usage:
6
+ * node <scripts_path>/pin.mjs pin <command>
7
+ * node <scripts_path>/pin.mjs unpin <command>
8
+ *
9
+ * `pin audit` creates a lightweight /audit skill that redirects to /impeccable audit.
10
+ * `unpin audit` removes that shortcut.
11
+ *
12
+ * The script discovers harness directories (.claude/skills, .cursor/skills, etc.)
13
+ * in the project root and creates/removes the pin in all of them.
14
+ */
15
+
16
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, readdirSync } from 'node:fs';
17
+ import { join, resolve, dirname } from 'node:path';
18
+ import { fileURLToPath } from 'node:url';
19
+
20
+ const __dirname = dirname(fileURLToPath(import.meta.url));
21
+
22
+ // All known harness directories
23
+ const HARNESS_DIRS = [
24
+ '.claude', '.cursor', '.gemini', '.codex', '.agents',
25
+ '.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
26
+ ];
27
+
28
+ // Valid sub-command names
29
+ const VALID_COMMANDS = [
30
+ 'craft', 'teach', 'extract', 'document', 'shape',
31
+ 'critique', 'audit',
32
+ 'polish', 'bolder', 'quieter', 'distill', 'harden', 'onboard', 'live',
33
+ 'animate', 'colorize', 'typeset', 'layout', 'delight', 'overdrive',
34
+ 'clarify', 'adapt', 'optimize',
35
+ ];
36
+
37
+ // Marker to identify pinned skills (so unpin doesn't delete user skills)
38
+ const PIN_MARKER = '<!-- impeccable-pinned-skill -->';
39
+
40
+ /**
41
+ * Walk up from startDir to find a project root.
42
+ */
43
+ function findProjectRoot(startDir = process.cwd()) {
44
+ let dir = resolve(startDir);
45
+ while (dir !== '/') {
46
+ if (
47
+ existsSync(join(dir, 'package.json')) ||
48
+ existsSync(join(dir, '.git')) ||
49
+ existsSync(join(dir, 'skills-lock.json'))
50
+ ) {
51
+ return dir;
52
+ }
53
+ const parent = resolve(dir, '..');
54
+ if (parent === dir) break;
55
+ dir = parent;
56
+ }
57
+ return resolve(startDir);
58
+ }
59
+
60
+ /**
61
+ * Find harness skill directories that have an impeccable skill installed.
62
+ */
63
+ function findHarnessDirs(projectRoot) {
64
+ const dirs = [];
65
+ for (const harness of HARNESS_DIRS) {
66
+ const skillsDir = join(projectRoot, harness, 'skills');
67
+ // Only pin in harness dirs that already have impeccable installed
68
+ const impeccableDir = join(skillsDir, 'impeccable');
69
+ if (existsSync(impeccableDir) || existsSync(join(skillsDir, 'i-impeccable'))) {
70
+ dirs.push(skillsDir);
71
+ }
72
+ }
73
+ return dirs;
74
+ }
75
+
76
+ /**
77
+ * Load command metadata (descriptions for pinned skills).
78
+ */
79
+ function loadCommandMetadata() {
80
+ const metadataPath = join(__dirname, 'command-metadata.json');
81
+ if (existsSync(metadataPath)) {
82
+ return JSON.parse(readFileSync(metadataPath, 'utf-8'));
83
+ }
84
+ return {};
85
+ }
86
+
87
+ /**
88
+ * Generate a pinned skill's SKILL.md content.
89
+ */
90
+ function generatePinnedSkill(command, metadata) {
91
+ const desc = metadata[command]?.description || `Shortcut for /impeccable ${command}.`;
92
+ const hint = metadata[command]?.argumentHint || '[target]';
93
+
94
+ return `---
95
+ name: ${command}
96
+ description: "${desc}"
97
+ argument-hint: "${hint}"
98
+ user-invocable: true
99
+ ---
100
+
101
+ ${PIN_MARKER}
102
+
103
+ This is a pinned shortcut for \`{{command_prefix}}impeccable ${command}\`.
104
+
105
+ Invoke {{command_prefix}}impeccable ${command}, passing along any arguments provided here, and follow its instructions.
106
+ `;
107
+ }
108
+
109
+ /**
110
+ * Pin a command: create shortcut skill in all harness dirs.
111
+ */
112
+ function pin(command, projectRoot) {
113
+ const metadata = loadCommandMetadata();
114
+ const harnessDirs = findHarnessDirs(projectRoot);
115
+
116
+ if (harnessDirs.length === 0) {
117
+ console.log('No harness directories with impeccable installed found.');
118
+ return false;
119
+ }
120
+
121
+ const content = generatePinnedSkill(command, metadata);
122
+ let created = 0;
123
+
124
+ for (const skillsDir of harnessDirs) {
125
+ // Check if skill already exists (and isn't a pin)
126
+ const skillDir = join(skillsDir, command);
127
+ if (existsSync(skillDir)) {
128
+ const existingMd = join(skillDir, 'SKILL.md');
129
+ if (existsSync(existingMd)) {
130
+ const existing = readFileSync(existingMd, 'utf-8');
131
+ if (!existing.includes(PIN_MARKER)) {
132
+ console.log(` SKIP: ${skillDir} (non-pinned skill already exists)`);
133
+ continue;
134
+ }
135
+ }
136
+ }
137
+
138
+ mkdirSync(skillDir, { recursive: true });
139
+ writeFileSync(join(skillDir, 'SKILL.md'), content, 'utf-8');
140
+ console.log(` + ${skillDir}`);
141
+ created++;
142
+ }
143
+
144
+ if (created > 0) {
145
+ console.log(`\nPinned '${command}' as a standalone shortcut in ${created} location(s).`);
146
+ console.log(`You can now use /${command} directly.`);
147
+ }
148
+
149
+ return created > 0;
150
+ }
151
+
152
+ /**
153
+ * Unpin a command: remove shortcut skill from all harness dirs.
154
+ */
155
+ function unpin(command, projectRoot) {
156
+ const harnessDirs = findHarnessDirs(projectRoot);
157
+ let removed = 0;
158
+
159
+ for (const skillsDir of harnessDirs) {
160
+ const skillDir = join(skillsDir, command);
161
+ if (!existsSync(skillDir)) continue;
162
+
163
+ const skillMd = join(skillDir, 'SKILL.md');
164
+ if (!existsSync(skillMd)) continue;
165
+
166
+ // Safety: only remove if it's a pinned skill
167
+ const content = readFileSync(skillMd, 'utf-8');
168
+ if (!content.includes(PIN_MARKER)) {
169
+ console.log(` SKIP: ${skillDir} (not a pinned skill)`);
170
+ continue;
171
+ }
172
+
173
+ rmSync(skillDir, { recursive: true, force: true });
174
+ console.log(` - ${skillDir}`);
175
+ removed++;
176
+ }
177
+
178
+ if (removed > 0) {
179
+ console.log(`\nUnpinned '${command}' from ${removed} location(s).`);
180
+ console.log(`Use /impeccable ${command} to access it.`);
181
+ } else {
182
+ console.log(`No pinned '${command}' shortcut found.`);
183
+ }
184
+
185
+ return removed > 0;
186
+ }
187
+
188
+ // --- CLI ---
189
+ const [,, action, command] = process.argv;
190
+
191
+ if (!action || !command) {
192
+ console.log('Usage: node pin.mjs <pin|unpin> <command>');
193
+ console.log(`\nAvailable commands: ${VALID_COMMANDS.join(', ')}`);
194
+ process.exit(1);
195
+ }
196
+
197
+ if (action !== 'pin' && action !== 'unpin') {
198
+ console.error(`Unknown action: ${action}. Use 'pin' or 'unpin'.`);
199
+ process.exit(1);
200
+ }
201
+
202
+ if (!VALID_COMMANDS.includes(command)) {
203
+ console.error(`Unknown command: ${command}`);
204
+ console.error(`Available commands: ${VALID_COMMANDS.join(', ')}`);
205
+ process.exit(1);
206
+ }
207
+
208
+ const root = findProjectRoot();
209
+
210
+ if (action === 'pin') {
211
+ pin(command, root);
212
+ } else {
213
+ unpin(command, root);
214
+ }
@@ -0,0 +1,202 @@
1
+ ---
2
+ name: iterative-retrieval
3
+ description: Pattern for progressively refining context retrieval to solve the subagent context problem
4
+ ---
5
+
6
+ # Iterative Retrieval Pattern
7
+
8
+ Solves the "context problem" in multi-agent workflows where subagents don't know what context they need until they start working.
9
+
10
+ ## The Problem
11
+
12
+ Subagents are spawned with limited context. They don't know:
13
+ - Which files contain relevant code
14
+ - What patterns exist in the codebase
15
+ - What terminology the project uses
16
+
17
+ Standard approaches fail:
18
+ - **Send everything**: Exceeds context limits
19
+ - **Send nothing**: Agent lacks critical information
20
+ - **Guess what's needed**: Often wrong
21
+
22
+ ## The Solution: Iterative Retrieval
23
+
24
+ A 4-phase loop that progressively refines context:
25
+
26
+ ```
27
+ ┌─────────────────────────────────────────────┐
28
+ │ │
29
+ │ ┌──────────┐ ┌──────────┐ │
30
+ │ │ DISPATCH │─────▶│ EVALUATE │ │
31
+ │ └──────────┘ └──────────┘ │
32
+ │ ▲ │ │
33
+ │ │ ▼ │
34
+ │ ┌──────────┐ ┌──────────┐ │
35
+ │ │ LOOP │◀─────│ REFINE │ │
36
+ │ └──────────┘ └──────────┘ │
37
+ │ │
38
+ │ Max 3 cycles, then proceed │
39
+ └─────────────────────────────────────────────┘
40
+ ```
41
+
42
+ ### Phase 1: DISPATCH
43
+
44
+ Initial broad query to gather candidate files:
45
+
46
+ ```javascript
47
+ // Start with high-level intent
48
+ const initialQuery = {
49
+ patterns: ['src/**/*.ts', 'lib/**/*.ts'],
50
+ keywords: ['authentication', 'user', 'session'],
51
+ excludes: ['*.test.ts', '*.spec.ts']
52
+ };
53
+
54
+ // Dispatch to retrieval agent
55
+ const candidates = await retrieveFiles(initialQuery);
56
+ ```
57
+
58
+ ### Phase 2: EVALUATE
59
+
60
+ Assess retrieved content for relevance:
61
+
62
+ ```javascript
63
+ function evaluateRelevance(files, task) {
64
+ return files.map(file => ({
65
+ path: file.path,
66
+ relevance: scoreRelevance(file.content, task),
67
+ reason: explainRelevance(file.content, task),
68
+ missingContext: identifyGaps(file.content, task)
69
+ }));
70
+ }
71
+ ```
72
+
73
+ Scoring criteria:
74
+ - **High (0.8-1.0)**: Directly implements target functionality
75
+ - **Medium (0.5-0.7)**: Contains related patterns or types
76
+ - **Low (0.2-0.4)**: Tangentially related
77
+ - **None (0-0.2)**: Not relevant, exclude
78
+
79
+ ### Phase 3: REFINE
80
+
81
+ Update search criteria based on evaluation:
82
+
83
+ ```javascript
84
+ function refineQuery(evaluation, previousQuery) {
85
+ return {
86
+ // Add new patterns discovered in high-relevance files
87
+ patterns: [...previousQuery.patterns, ...extractPatterns(evaluation)],
88
+
89
+ // Add terminology found in codebase
90
+ keywords: [...previousQuery.keywords, ...extractKeywords(evaluation)],
91
+
92
+ // Exclude confirmed irrelevant paths
93
+ excludes: [...previousQuery.excludes, ...evaluation
94
+ .filter(e => e.relevance < 0.2)
95
+ .map(e => e.path)
96
+ ],
97
+
98
+ // Target specific gaps
99
+ focusAreas: evaluation
100
+ .flatMap(e => e.missingContext)
101
+ .filter(unique)
102
+ };
103
+ }
104
+ ```
105
+
106
+ ### Phase 4: LOOP
107
+
108
+ Repeat with refined criteria (max 3 cycles):
109
+
110
+ ```javascript
111
+ async function iterativeRetrieve(task, maxCycles = 3) {
112
+ let query = createInitialQuery(task);
113
+ let bestContext = [];
114
+
115
+ for (let cycle = 0; cycle < maxCycles; cycle++) {
116
+ const candidates = await retrieveFiles(query);
117
+ const evaluation = evaluateRelevance(candidates, task);
118
+
119
+ // Check if we have sufficient context
120
+ const highRelevance = evaluation.filter(e => e.relevance >= 0.7);
121
+ if (highRelevance.length >= 3 && !hasCriticalGaps(evaluation)) {
122
+ return highRelevance;
123
+ }
124
+
125
+ // Refine and continue
126
+ query = refineQuery(evaluation, query);
127
+ bestContext = mergeContext(bestContext, highRelevance);
128
+ }
129
+
130
+ return bestContext;
131
+ }
132
+ ```
133
+
134
+ ## Practical Examples
135
+
136
+ ### Example 1: Bug Fix Context
137
+
138
+ ```
139
+ Task: "Fix the authentication token expiry bug"
140
+
141
+ Cycle 1:
142
+ DISPATCH: Search for "token", "auth", "expiry" in src/**
143
+ EVALUATE: Found auth.ts (0.9), tokens.ts (0.8), user.ts (0.3)
144
+ REFINE: Add "refresh", "jwt" keywords; exclude user.ts
145
+
146
+ Cycle 2:
147
+ DISPATCH: Search refined terms
148
+ EVALUATE: Found session-manager.ts (0.95), jwt-utils.ts (0.85)
149
+ REFINE: Sufficient context (2 high-relevance files)
150
+
151
+ Result: auth.ts, tokens.ts, session-manager.ts, jwt-utils.ts
152
+ ```
153
+
154
+ ### Example 2: Feature Implementation
155
+
156
+ ```
157
+ Task: "Add rate limiting to API endpoints"
158
+
159
+ Cycle 1:
160
+ DISPATCH: Search "rate", "limit", "api" in routes/**
161
+ EVALUATE: No matches - codebase uses "throttle" terminology
162
+ REFINE: Add "throttle", "middleware" keywords
163
+
164
+ Cycle 2:
165
+ DISPATCH: Search refined terms
166
+ EVALUATE: Found throttle.ts (0.9), middleware/index.ts (0.7)
167
+ REFINE: Need router patterns
168
+
169
+ Cycle 3:
170
+ DISPATCH: Search "router", "express" patterns
171
+ EVALUATE: Found router-setup.ts (0.8)
172
+ REFINE: Sufficient context
173
+
174
+ Result: throttle.ts, middleware/index.ts, router-setup.ts
175
+ ```
176
+
177
+ ## Integration with Agents
178
+
179
+ Use in agent prompts:
180
+
181
+ ```markdown
182
+ When retrieving context for this task:
183
+ 1. Start with broad keyword search
184
+ 2. Evaluate each file's relevance (0-1 scale)
185
+ 3. Identify what context is still missing
186
+ 4. Refine search criteria and repeat (max 3 cycles)
187
+ 5. Return files with relevance >= 0.7
188
+ ```
189
+
190
+ ## Best Practices
191
+
192
+ 1. **Start broad, narrow progressively** - Don't over-specify initial queries
193
+ 2. **Learn codebase terminology** - First cycle often reveals naming conventions
194
+ 3. **Track what's missing** - Explicit gap identification drives refinement
195
+ 4. **Stop at "good enough"** - 3 high-relevance files beats 10 mediocre ones
196
+ 5. **Exclude confidently** - Low-relevance files won't become relevant
197
+
198
+ ## Related
199
+
200
+ - [The Longform Guide](https://x.com/affaanmustafa/status/2014040193557471352) - Subagent orchestration section
201
+ - `continuous-learning` skill - For patterns that improve over time
202
+ - Agent definitions in `~/.claude/agents/`
@@ -0,0 +1,138 @@
1
+ ---
2
+ name: java-coding-standards
3
+ description: Java coding standards for Spring Boot services: naming, immutability, Optional usage, streams, exceptions, generics, and project layout.
4
+ ---
5
+
6
+ # Java Coding Standards
7
+
8
+ Standards for readable, maintainable Java (17+) code in Spring Boot services.
9
+
10
+ ## Core Principles
11
+
12
+ - Prefer clarity over cleverness
13
+ - Immutable by default; minimize shared mutable state
14
+ - Fail fast with meaningful exceptions
15
+ - Consistent naming and package structure
16
+
17
+ ## Naming
18
+
19
+ ```java
20
+ // ✅ Classes/Records: PascalCase
21
+ public class MarketService {}
22
+ public record Money(BigDecimal amount, Currency currency) {}
23
+
24
+ // ✅ Methods/fields: camelCase
25
+ private final MarketRepository marketRepository;
26
+ public Market findBySlug(String slug) {}
27
+
28
+ // ✅ Constants: UPPER_SNAKE_CASE
29
+ private static final int MAX_PAGE_SIZE = 100;
30
+ ```
31
+
32
+ ## Immutability
33
+
34
+ ```java
35
+ // ✅ Favor records and final fields
36
+ public record MarketDto(Long id, String name, MarketStatus status) {}
37
+
38
+ public class Market {
39
+ private final Long id;
40
+ private final String name;
41
+ // getters only, no setters
42
+ }
43
+ ```
44
+
45
+ ## Optional Usage
46
+
47
+ ```java
48
+ // ✅ Return Optional from find* methods
49
+ Optional<Market> market = marketRepository.findBySlug(slug);
50
+
51
+ // ✅ Map/flatMap instead of get()
52
+ return market
53
+ .map(MarketResponse::from)
54
+ .orElseThrow(() -> new EntityNotFoundException("Market not found"));
55
+ ```
56
+
57
+ ## Streams Best Practices
58
+
59
+ ```java
60
+ // ✅ Use streams for transformations, keep pipelines short
61
+ List<String> names = markets.stream()
62
+ .map(Market::name)
63
+ .filter(Objects::nonNull)
64
+ .toList();
65
+
66
+ // ❌ Avoid complex nested streams; prefer loops for clarity
67
+ ```
68
+
69
+ ## Exceptions
70
+
71
+ - Use unchecked exceptions for domain errors; wrap technical exceptions with context
72
+ - Create domain-specific exceptions (e.g., `MarketNotFoundException`)
73
+ - Avoid broad `catch (Exception ex)` unless rethrowing/logging centrally
74
+
75
+ ```java
76
+ throw new MarketNotFoundException(slug);
77
+ ```
78
+
79
+ ## Generics and Type Safety
80
+
81
+ - Avoid raw types; declare generic parameters
82
+ - Prefer bounded generics for reusable utilities
83
+
84
+ ```java
85
+ public <T extends Identifiable> Map<Long, T> indexById(Collection<T> items) { ... }
86
+ ```
87
+
88
+ ## Project Structure (Maven/Gradle)
89
+
90
+ ```
91
+ src/main/java/com/example/app/
92
+ config/
93
+ controller/
94
+ service/
95
+ repository/
96
+ domain/
97
+ dto/
98
+ util/
99
+ src/main/resources/
100
+ application.yml
101
+ src/test/java/... (mirrors main)
102
+ ```
103
+
104
+ ## Formatting and Style
105
+
106
+ - Use 2 or 4 spaces consistently (project standard)
107
+ - One public top-level type per file
108
+ - Keep methods short and focused; extract helpers
109
+ - Order members: constants, fields, constructors, public methods, protected, private
110
+
111
+ ## Code Smells to Avoid
112
+
113
+ - Long parameter lists → use DTO/builders
114
+ - Deep nesting → early returns
115
+ - Magic numbers → named constants
116
+ - Static mutable state → prefer dependency injection
117
+ - Silent catch blocks → log and act or rethrow
118
+
119
+ ## Logging
120
+
121
+ ```java
122
+ private static final Logger log = LoggerFactory.getLogger(MarketService.class);
123
+ log.info("fetch_market slug={}", slug);
124
+ log.error("failed_fetch_market slug={}", slug, ex);
125
+ ```
126
+
127
+ ## Null Handling
128
+
129
+ - Accept `@Nullable` only when unavoidable; otherwise use `@NonNull`
130
+ - Use Bean Validation (`@NotNull`, `@NotBlank`) on inputs
131
+
132
+ ## Testing Expectations
133
+
134
+ - JUnit 5 + AssertJ for fluent assertions
135
+ - Mockito for mocking; avoid partial mocks where possible
136
+ - Favor deterministic tests; no hidden sleeps
137
+
138
+ **Remember**: Keep code intentional, typed, and observable. Optimize for maintainability over micro-optimizations unless proven necessary.
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 2,
3
+ "name": "jetpack-compose",
4
+ "owner": "thebushidocollective",
5
+ "repo": "han",
6
+ "path": "plugins/specialized/android/skills/jetpack-compose",
7
+ "branch": "main",
8
+ "sha": "45811b8c857bdb6562eff2927580f16088cdfdc1",
9
+ "source": "manual"
10
+ }