devflow-kit 1.8.2 → 2.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 (867) hide show
  1. package/CHANGELOG.md +191 -6
  2. package/LICENSE +1 -1
  3. package/README.md +139 -219
  4. package/dist/cli/agents-view/index.js +9 -0
  5. package/dist/cli/agents-view/render.js +310 -0
  6. package/dist/cli/agents-view/state.js +423 -0
  7. package/dist/cli/agents-view/terminal.js +179 -0
  8. package/dist/cli/commands/agents.js +585 -0
  9. package/dist/cli/commands/ambient.js +231 -0
  10. package/dist/cli/commands/capture.js +133 -0
  11. package/dist/cli/commands/compliance-prompts.js +174 -0
  12. package/dist/cli/commands/compliance.js +337 -0
  13. package/dist/cli/commands/context.js +66 -0
  14. package/dist/cli/commands/debug.js +122 -0
  15. package/dist/cli/commands/flags.js +119 -0
  16. package/dist/cli/commands/hud.js +229 -0
  17. package/dist/cli/commands/init-seed.js +226 -0
  18. package/dist/cli/commands/init.js +1786 -0
  19. package/dist/cli/commands/knowledge/index.js +25 -0
  20. package/dist/cli/commands/knowledge/list.js +115 -0
  21. package/dist/cli/commands/knowledge/toggle.js +84 -0
  22. package/dist/cli/commands/learning.js +311 -0
  23. package/dist/cli/commands/legacy-hooks.js +40 -0
  24. package/dist/cli/commands/memory.js +349 -0
  25. package/dist/cli/commands/proxy.js +1435 -0
  26. package/dist/cli/commands/rules.js +334 -0
  27. package/dist/cli/commands/safe-delete.js +140 -0
  28. package/dist/cli/commands/security.js +179 -0
  29. package/dist/cli/commands/skills.js +140 -0
  30. package/dist/cli/commands/uninstall.js +1214 -0
  31. package/dist/cli.js +35 -10
  32. package/dist/commands/bug-analysis.md +400 -0
  33. package/dist/commands/code-review.md +403 -0
  34. package/dist/commands/debug.md +282 -0
  35. package/dist/commands/dynamic-build.md +972 -0
  36. package/dist/commands/dynamic-plan.md +383 -0
  37. package/dist/commands/dynamic-profile.md +206 -0
  38. package/dist/commands/dynamic-tickets.md +583 -0
  39. package/dist/commands/explore.md +208 -0
  40. package/dist/commands/implement.md +590 -0
  41. package/dist/commands/plan.md +570 -0
  42. package/dist/commands/release.md +206 -0
  43. package/dist/commands/research.md +212 -0
  44. package/dist/commands/resolve.md +731 -0
  45. package/dist/commands/self-review.md +251 -0
  46. package/dist/core/agent-frontmatter.js +209 -0
  47. package/dist/core/agent-models.js +556 -0
  48. package/dist/core/agent-state.js +44 -0
  49. package/dist/core/assets.js +39 -0
  50. package/dist/core/cache.js +205 -0
  51. package/dist/core/codex-auth-inspect.js +128 -0
  52. package/dist/core/compliance-compose.js +458 -0
  53. package/dist/core/compliance.js +165 -0
  54. package/dist/core/external-models.js +76 -0
  55. package/dist/core/feature-config.js +125 -0
  56. package/dist/core/flags.js +309 -0
  57. package/dist/core/fs-atomic.js +74 -0
  58. package/dist/core/git.js +61 -0
  59. package/dist/core/learning-queue-cleanup.js +92 -0
  60. package/dist/core/learning-tuning-config.js +78 -0
  61. package/dist/core/manifest.js +171 -0
  62. package/dist/core/migrations.js +330 -0
  63. package/dist/core/model-discovery.js +655 -0
  64. package/dist/core/observation-io.js +50 -0
  65. package/dist/core/observations.js +109 -0
  66. package/dist/core/orphan-sweep.js +92 -0
  67. package/dist/core/paths.js +48 -0
  68. package/dist/core/plugins.js +525 -0
  69. package/dist/core/project-paths.js +159 -0
  70. package/dist/core/proxy-log.js +165 -0
  71. package/dist/core/proxy-state.js +305 -0
  72. package/dist/core/safe-delete-install.js +191 -0
  73. package/dist/core/teammate-mode-cleanup.js +33 -0
  74. package/dist/hud/colors.js +13 -2
  75. package/dist/hud/components/config-counts.js +2 -2
  76. package/dist/hud/components/context-usage.js +2 -2
  77. package/dist/hud/components/learning-counts.js +92 -0
  78. package/dist/hud/components/session-cost.js +10 -2
  79. package/dist/hud/components/usage-quota.js +43 -8
  80. package/dist/hud/components/version-badge.js +17 -7
  81. package/dist/hud/config.js +4 -2
  82. package/dist/hud/cost-history.js +281 -0
  83. package/dist/hud/git.js +112 -71
  84. package/dist/hud/index.js +47 -4
  85. package/dist/hud/render.js +8 -20
  86. package/dist/hud/transcript.js +5 -6
  87. package/dist/targets/claude-code/claude-paths.js +106 -0
  88. package/dist/targets/claude-code/compliance-install.js +305 -0
  89. package/dist/targets/claude-code/hooks.js +9 -0
  90. package/dist/targets/claude-code/installer.js +458 -0
  91. package/dist/targets/claude-code/legacy.js +239 -0
  92. package/dist/targets/claude-code/post-install.js +971 -0
  93. package/package.json +23 -17
  94. package/src/assets/agents/code.md +244 -0
  95. package/src/assets/agents/design.md +113 -0
  96. package/src/assets/agents/diagnose.md +210 -0
  97. package/src/assets/agents/evaluate.md +117 -0
  98. package/src/assets/agents/git.md +938 -0
  99. package/src/assets/agents/knowledge.md +89 -0
  100. package/src/assets/agents/learning.md +203 -0
  101. package/src/assets/agents/research.md +134 -0
  102. package/src/assets/agents/review.md +220 -0
  103. package/src/assets/agents/scrutinize.md +95 -0
  104. package/src/assets/agents/simplify.md +108 -0
  105. package/src/assets/agents/skim.md +136 -0
  106. package/src/assets/agents/synthesize.md +402 -0
  107. package/src/assets/agents/test.md +155 -0
  108. package/src/assets/agents/triage.md +141 -0
  109. package/src/assets/agents/validate.md +103 -0
  110. package/src/assets/commands/_partials/_compliance.mds +5 -0
  111. package/src/assets/commands/_partials/_decisions.mds +20 -0
  112. package/src/assets/commands/_partials/_engine.mds +244 -0
  113. package/src/assets/commands/_partials/_factory.mds +216 -0
  114. package/src/assets/commands/_partials/_knowledge.mds +95 -0
  115. package/src/assets/commands/_partials/_plan_contract.mds +51 -0
  116. package/src/assets/commands/_partials/_preamble.mds +82 -0
  117. package/src/assets/commands/_partials/_publication.mds +7 -0
  118. package/src/assets/commands/_partials/_roster.mds +31 -0
  119. package/src/assets/commands/_partials/_ticket_template.mds +59 -0
  120. package/src/assets/commands/_partials/_wave.mds +123 -0
  121. package/src/assets/commands/bug-analysis.mds +353 -0
  122. package/src/assets/commands/code-review.mds +355 -0
  123. package/src/assets/commands/debug.mds +224 -0
  124. package/src/assets/commands/dynamic-build.mds +534 -0
  125. package/src/assets/commands/dynamic-plan.mds +244 -0
  126. package/src/assets/commands/dynamic-profile.mds +132 -0
  127. package/src/assets/commands/dynamic-tickets.mds +226 -0
  128. package/src/assets/commands/explore.mds +150 -0
  129. package/src/assets/commands/implement.mds +496 -0
  130. package/src/assets/commands/plan.mds +523 -0
  131. package/src/assets/commands/release.md +206 -0
  132. package/src/assets/commands/research.mds +164 -0
  133. package/src/assets/commands/resolve.mds +636 -0
  134. package/src/assets/commands/self-review.mds +156 -0
  135. package/src/assets/rules/accessibility.md +11 -0
  136. package/src/assets/rules/compliance.md +15 -0
  137. package/src/assets/rules/engineering.md +13 -0
  138. package/src/assets/rules/go.md +12 -0
  139. package/src/assets/rules/java.md +12 -0
  140. package/src/assets/rules/python.md +12 -0
  141. package/src/assets/rules/quality.md +14 -0
  142. package/src/assets/rules/react.md +11 -0
  143. package/src/assets/rules/reliability.md +12 -0
  144. package/src/assets/rules/rust.md +12 -0
  145. package/src/assets/rules/security.md +12 -0
  146. package/src/assets/rules/typescript.md +12 -0
  147. package/src/assets/rules/ui-design.md +11 -0
  148. package/src/assets/scripts/hooks/assets/orchestrator-charter.md +21 -0
  149. package/src/assets/scripts/hooks/background-memory-update +460 -0
  150. package/src/assets/scripts/hooks/capture-prompt +87 -0
  151. package/src/assets/scripts/hooks/capture-question +153 -0
  152. package/src/assets/scripts/hooks/capture-turn +105 -0
  153. package/src/assets/scripts/hooks/debug-trace +75 -0
  154. package/src/assets/scripts/hooks/decisions-usage-scan.cjs +131 -0
  155. package/src/assets/scripts/hooks/ensure-devflow-init +39 -0
  156. package/src/assets/scripts/hooks/ensure-proxy +294 -0
  157. package/src/assets/scripts/hooks/ensure-root-gitignore +116 -0
  158. package/src/assets/scripts/hooks/get-mtime +23 -0
  159. package/src/assets/scripts/hooks/git-marker +16 -0
  160. package/src/assets/scripts/hooks/hook-bootstrap +25 -0
  161. package/src/assets/scripts/hooks/hook-log-init +41 -0
  162. package/src/assets/scripts/hooks/json-helper.cjs +725 -0
  163. package/src/assets/scripts/hooks/json-parse +243 -0
  164. package/src/assets/scripts/hooks/learning-lock +44 -0
  165. package/src/assets/scripts/hooks/lib/decisions-format.cjs +301 -0
  166. package/src/assets/scripts/hooks/lib/mkdir-lock.cjs +106 -0
  167. package/src/assets/scripts/hooks/lib/project-paths.cjs +230 -0
  168. package/src/assets/scripts/hooks/lib/render-decisions.cjs +398 -0
  169. package/src/assets/scripts/hooks/lib/safe-path.cjs +29 -0
  170. package/src/assets/scripts/hooks/log-paths +24 -0
  171. package/src/assets/scripts/hooks/memory-worker +101 -0
  172. package/src/assets/scripts/hooks/pre-compact-memory +126 -0
  173. package/src/assets/scripts/hooks/preamble +77 -0
  174. package/src/assets/scripts/hooks/queue-append +120 -0
  175. package/src/assets/scripts/hooks/resolve-project-root +37 -0
  176. package/src/assets/scripts/hooks/run-hook +31 -0
  177. package/src/assets/scripts/hooks/session-start-context +180 -0
  178. package/src/assets/scripts/hooks/session-start-memory +318 -0
  179. package/src/assets/scripts/hooks/session-start-orchestrator +54 -0
  180. package/src/assets/scripts/hud.sh +5 -0
  181. package/src/assets/scripts/redact-secrets.cjs +410 -0
  182. package/src/assets/skills/accessibility/SKILL.md +145 -0
  183. package/src/assets/skills/accessibility/references/patterns.md +398 -0
  184. package/src/assets/skills/accessibility/references/sources.md +26 -0
  185. package/src/assets/skills/accessibility/references/violations.md +358 -0
  186. package/src/assets/skills/apply-decisions/SKILL.md +100 -0
  187. package/src/assets/skills/apply-feature-knowledge/SKILL.md +69 -0
  188. package/src/assets/skills/architecture/SKILL.md +138 -0
  189. package/src/assets/skills/architecture/references/patterns.md +378 -0
  190. package/src/assets/skills/architecture/references/sources.md +41 -0
  191. package/src/assets/skills/architecture/references/violations.md +314 -0
  192. package/src/assets/skills/boundary-validation/SKILL.md +119 -0
  193. package/src/assets/skills/boundary-validation/references/detection.md +283 -0
  194. package/src/assets/skills/boundary-validation/references/patterns.md +283 -0
  195. package/src/assets/skills/boundary-validation/references/sources.md +41 -0
  196. package/src/assets/skills/boundary-validation/references/violations.md +211 -0
  197. package/src/assets/skills/complexity/SKILL.md +150 -0
  198. package/src/assets/skills/compliance/SKILL.md +121 -0
  199. package/src/assets/skills/compliance/frameworks/gdpr/fragment.md +11 -0
  200. package/src/assets/skills/compliance/frameworks/gdpr/reference.md +50 -0
  201. package/src/assets/skills/compliance/frameworks/hipaa/fragment.md +11 -0
  202. package/src/assets/skills/compliance/frameworks/hipaa/reference.md +44 -0
  203. package/src/assets/skills/compliance/frameworks/iso-27001/fragment.md +10 -0
  204. package/src/assets/skills/compliance/frameworks/iso-27001/reference.md +45 -0
  205. package/src/assets/skills/compliance/frameworks/pci-dss/fragment.md +11 -0
  206. package/src/assets/skills/compliance/frameworks/pci-dss/reference.md +55 -0
  207. package/src/assets/skills/compliance/frameworks/soc2/fragment.md +10 -0
  208. package/src/assets/skills/compliance/frameworks/soc2/reference.md +53 -0
  209. package/src/assets/skills/compliance/frameworks/sox/fragment.md +10 -0
  210. package/src/assets/skills/compliance/frameworks/sox/reference.md +67 -0
  211. package/src/assets/skills/compliance/references/detection.md +108 -0
  212. package/src/assets/skills/compliance/references/sources.md +28 -0
  213. package/src/assets/skills/consistency/SKILL.md +140 -0
  214. package/src/assets/skills/database/SKILL.md +134 -0
  215. package/src/assets/skills/dependencies/SKILL.md +141 -0
  216. package/src/assets/skills/dependency-research/SKILL.md +133 -0
  217. package/src/assets/skills/dependency-research/references/evaluation-criteria.md +101 -0
  218. package/src/assets/skills/design-review/SKILL.md +155 -0
  219. package/src/assets/skills/design-review/references/anti-patterns.md +207 -0
  220. package/src/assets/skills/docs-framework/SKILL.md +190 -0
  221. package/src/assets/skills/docs-framework/references/patterns.md +381 -0
  222. package/src/assets/skills/docs-framework/references/violations.md +221 -0
  223. package/src/assets/skills/documentation/SKILL.md +126 -0
  224. package/src/assets/skills/feature-knowledge/SKILL.md +341 -0
  225. package/src/assets/skills/gap-analysis/SKILL.md +151 -0
  226. package/src/assets/skills/gap-analysis/references/check-layers.md +125 -0
  227. package/src/assets/skills/git/SKILL.md +287 -0
  228. package/src/assets/skills/git/references/github-api.md +666 -0
  229. package/src/assets/skills/git/references/patterns.md +324 -0
  230. package/src/assets/skills/git/references/sources.md +16 -0
  231. package/src/assets/skills/git/references/violations.md +128 -0
  232. package/src/assets/skills/go/SKILL.md +147 -0
  233. package/src/assets/skills/go/references/concurrency.md +335 -0
  234. package/src/assets/skills/go/references/patterns.md +278 -0
  235. package/src/assets/skills/go/references/sources.md +41 -0
  236. package/src/assets/skills/go/references/violations.md +262 -0
  237. package/src/assets/skills/java/SKILL.md +148 -0
  238. package/src/assets/skills/java/references/modern-java.md +335 -0
  239. package/src/assets/skills/java/references/patterns.md +311 -0
  240. package/src/assets/skills/java/references/sources.md +44 -0
  241. package/src/assets/skills/java/references/violations.md +257 -0
  242. package/src/assets/skills/patterns/SKILL.md +162 -0
  243. package/src/assets/skills/performance/SKILL.md +135 -0
  244. package/src/assets/skills/performance/references/patterns.md +516 -0
  245. package/src/assets/skills/performance/references/sources.md +41 -0
  246. package/src/assets/skills/performance/references/violations.md +417 -0
  247. package/src/assets/skills/python/SKILL.md +156 -0
  248. package/src/assets/skills/python/references/async.md +255 -0
  249. package/src/assets/skills/python/references/patterns.md +280 -0
  250. package/src/assets/skills/python/references/sources.md +41 -0
  251. package/src/assets/skills/python/references/violations.md +272 -0
  252. package/src/assets/skills/qa/SKILL.md +136 -0
  253. package/src/assets/skills/qa/references/browser-testing.md +97 -0
  254. package/src/assets/skills/qa/references/patterns.md +118 -0
  255. package/src/assets/skills/qa/references/scenario-templates.md +102 -0
  256. package/src/assets/skills/qa/references/sources.md +30 -0
  257. package/src/assets/skills/qa/references/violations.md +98 -0
  258. package/src/assets/skills/quality-gates/SKILL.md +152 -0
  259. package/src/assets/skills/quality-gates/references/stub-detection.md +135 -0
  260. package/src/assets/skills/react/SKILL.md +143 -0
  261. package/src/assets/skills/react/references/error-handling.md +179 -0
  262. package/src/assets/skills/react/references/forms.md +214 -0
  263. package/src/assets/skills/react/references/hooks.md +193 -0
  264. package/src/assets/skills/react/references/patterns.md +1336 -0
  265. package/src/assets/skills/react/references/sources.md +35 -0
  266. package/src/assets/skills/react/references/violations.md +570 -0
  267. package/src/assets/skills/regression/SKILL.md +146 -0
  268. package/src/assets/skills/reliability/SKILL.md +153 -0
  269. package/src/assets/skills/reliability/references/detection.md +66 -0
  270. package/src/assets/skills/reliability/references/patterns.md +151 -0
  271. package/src/assets/skills/reliability/references/sources.md +27 -0
  272. package/src/assets/skills/reliability/references/violations.md +125 -0
  273. package/src/assets/skills/research-codebase/SKILL.md +135 -0
  274. package/src/assets/skills/research-competitor/SKILL.md +145 -0
  275. package/src/assets/skills/research-external/SKILL.md +141 -0
  276. package/src/assets/skills/research-market/SKILL.md +145 -0
  277. package/src/assets/skills/research-technology/SKILL.md +180 -0
  278. package/src/assets/skills/review-methodology/SKILL.md +121 -0
  279. package/src/assets/skills/review-methodology/references/patterns.md +186 -0
  280. package/src/assets/skills/review-methodology/references/report-template.md +142 -0
  281. package/src/assets/skills/review-methodology/references/violations.md +125 -0
  282. package/src/assets/skills/rust/SKILL.md +148 -0
  283. package/src/assets/skills/rust/references/ownership.md +278 -0
  284. package/src/assets/skills/rust/references/patterns.md +247 -0
  285. package/src/assets/skills/rust/references/sources.md +46 -0
  286. package/src/assets/skills/rust/references/violations.md +252 -0
  287. package/src/assets/skills/security/SKILL.md +121 -0
  288. package/src/assets/skills/security/references/patterns.md +271 -0
  289. package/src/assets/skills/security/references/sources.md +41 -0
  290. package/src/assets/skills/security/references/violations.md +241 -0
  291. package/src/assets/skills/software-design/SKILL.md +143 -0
  292. package/src/assets/skills/software-design/references/checklist.md +259 -0
  293. package/src/assets/skills/software-design/references/code-smell-violations.md +189 -0
  294. package/src/assets/skills/software-design/references/patterns.md +359 -0
  295. package/src/assets/skills/software-design/references/sources.md +41 -0
  296. package/src/assets/skills/software-design/references/violations.md +341 -0
  297. package/src/assets/skills/test-driven-development/SKILL.md +197 -0
  298. package/src/assets/skills/testing/SKILL.md +139 -0
  299. package/src/assets/skills/testing/references/patterns.md +346 -0
  300. package/src/assets/skills/testing/references/sources.md +53 -0
  301. package/src/assets/skills/testing/references/violations.md +322 -0
  302. package/src/assets/skills/typescript/SKILL.md +150 -0
  303. package/src/assets/skills/typescript/references/async.md +333 -0
  304. package/src/assets/skills/typescript/references/patterns.md +440 -0
  305. package/src/assets/skills/typescript/references/sources.md +41 -0
  306. package/src/assets/skills/typescript/references/type-guards.md +333 -0
  307. package/src/assets/skills/typescript/references/utility-types.md +255 -0
  308. package/src/assets/skills/typescript/references/violations.md +285 -0
  309. package/src/assets/skills/ui-design/SKILL.md +144 -0
  310. package/src/assets/skills/ui-design/references/patterns.md +341 -0
  311. package/src/assets/skills/ui-design/references/sources.md +41 -0
  312. package/src/assets/skills/ui-design/references/violations.md +312 -0
  313. package/src/assets/skills/worktree-support/SKILL.md +92 -0
  314. package/src/targets/claude-code/templates/claudeignore.template +188 -0
  315. package/src/targets/claude-code/templates/settings.json +86 -0
  316. package/dist/cli.d.ts +0 -3
  317. package/dist/commands/ambient.d.ts +0 -18
  318. package/dist/commands/ambient.js +0 -137
  319. package/dist/commands/hud.d.ts +0 -22
  320. package/dist/commands/hud.js +0 -180
  321. package/dist/commands/init.d.ts +0 -16
  322. package/dist/commands/init.js +0 -738
  323. package/dist/commands/list.d.ts +0 -24
  324. package/dist/commands/list.js +0 -89
  325. package/dist/commands/memory.d.ts +0 -22
  326. package/dist/commands/memory.js +0 -175
  327. package/dist/commands/skills.d.ts +0 -11
  328. package/dist/commands/skills.js +0 -116
  329. package/dist/commands/uninstall.d.ts +0 -22
  330. package/dist/commands/uninstall.js +0 -558
  331. package/dist/hud/cache.d.ts +0 -14
  332. package/dist/hud/cache.js +0 -54
  333. package/dist/hud/colors.d.ts +0 -23
  334. package/dist/hud/components/config-counts.d.ts +0 -8
  335. package/dist/hud/components/context-usage.d.ts +0 -8
  336. package/dist/hud/components/diff-stats.d.ts +0 -3
  337. package/dist/hud/components/directory.d.ts +0 -3
  338. package/dist/hud/components/git-ahead-behind.d.ts +0 -3
  339. package/dist/hud/components/git-branch.d.ts +0 -3
  340. package/dist/hud/components/model.d.ts +0 -3
  341. package/dist/hud/components/release-info.d.ts +0 -3
  342. package/dist/hud/components/session-cost.d.ts +0 -3
  343. package/dist/hud/components/session-duration.d.ts +0 -3
  344. package/dist/hud/components/todo-progress.d.ts +0 -3
  345. package/dist/hud/components/usage-quota.d.ts +0 -3
  346. package/dist/hud/components/version-badge.d.ts +0 -3
  347. package/dist/hud/components/worktree-count.d.ts +0 -3
  348. package/dist/hud/config.d.ts +0 -10
  349. package/dist/hud/credentials.d.ts +0 -17
  350. package/dist/hud/credentials.js +0 -99
  351. package/dist/hud/git.d.ts +0 -7
  352. package/dist/hud/index.d.ts +0 -2
  353. package/dist/hud/render.d.ts +0 -7
  354. package/dist/hud/stdin.d.ts +0 -6
  355. package/dist/hud/transcript.d.ts +0 -7
  356. package/dist/hud/types.d.ts +0 -116
  357. package/dist/hud/usage-api.d.ts +0 -7
  358. package/dist/hud/usage-api.js +0 -84
  359. package/dist/plugins.d.ts +0 -46
  360. package/dist/plugins.js +0 -233
  361. package/dist/utils/cli.d.ts +0 -5
  362. package/dist/utils/cli.js +0 -14
  363. package/dist/utils/git.d.ts +0 -11
  364. package/dist/utils/git.js +0 -36
  365. package/dist/utils/installer.d.ts +0 -41
  366. package/dist/utils/installer.js +0 -195
  367. package/dist/utils/manifest.d.ts +0 -46
  368. package/dist/utils/manifest.js +0 -100
  369. package/dist/utils/paths.d.ts +0 -42
  370. package/dist/utils/paths.js +0 -106
  371. package/dist/utils/post-install.d.ts +0 -87
  372. package/dist/utils/post-install.js +0 -546
  373. package/dist/utils/safe-delete-install.d.ts +0 -29
  374. package/dist/utils/safe-delete-install.js +0 -191
  375. package/dist/utils/safe-delete.d.ts +0 -12
  376. package/plugins/devflow-accessibility/.claude-plugin/plugin.json +0 -21
  377. package/plugins/devflow-accessibility/skills/accessibility/SKILL.md +0 -229
  378. package/plugins/devflow-accessibility/skills/accessibility/references/patterns.md +0 -670
  379. package/plugins/devflow-accessibility/skills/accessibility/references/violations.md +0 -419
  380. package/plugins/devflow-ambient/.claude-plugin/plugin.json +0 -33
  381. package/plugins/devflow-ambient/README.md +0 -68
  382. package/plugins/devflow-ambient/agents/coder.md +0 -135
  383. package/plugins/devflow-ambient/agents/reviewer.md +0 -165
  384. package/plugins/devflow-ambient/agents/scrutinizer.md +0 -82
  385. package/plugins/devflow-ambient/agents/shepherd.md +0 -108
  386. package/plugins/devflow-ambient/agents/simplifier.md +0 -102
  387. package/plugins/devflow-ambient/agents/skimmer.md +0 -143
  388. package/plugins/devflow-ambient/agents/validator.md +0 -86
  389. package/plugins/devflow-ambient/skills/ambient-router/SKILL.md +0 -145
  390. package/plugins/devflow-ambient/skills/ambient-router/references/skill-catalog.md +0 -74
  391. package/plugins/devflow-ambient/skills/debug-orchestration/SKILL.md +0 -69
  392. package/plugins/devflow-ambient/skills/implementation-orchestration/SKILL.md +0 -92
  393. package/plugins/devflow-ambient/skills/plan-orchestration/SKILL.md +0 -71
  394. package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +0 -19
  395. package/plugins/devflow-audit-claude/README.md +0 -46
  396. package/plugins/devflow-audit-claude/agents/claude-md-auditor.md +0 -134
  397. package/plugins/devflow-audit-claude/commands/audit-claude.md +0 -89
  398. package/plugins/devflow-code-review/.claude-plugin/plugin.json +0 -38
  399. package/plugins/devflow-code-review/README.md +0 -73
  400. package/plugins/devflow-code-review/agents/git.md +0 -277
  401. package/plugins/devflow-code-review/agents/reviewer.md +0 -165
  402. package/plugins/devflow-code-review/agents/synthesizer.md +0 -211
  403. package/plugins/devflow-code-review/commands/code-review-teams.md +0 -285
  404. package/plugins/devflow-code-review/commands/code-review.md +0 -163
  405. package/plugins/devflow-code-review/skills/agent-teams/SKILL.md +0 -124
  406. package/plugins/devflow-code-review/skills/agent-teams/references/cleanup.md +0 -104
  407. package/plugins/devflow-code-review/skills/agent-teams/references/communication.md +0 -122
  408. package/plugins/devflow-code-review/skills/agent-teams/references/team-patterns.md +0 -217
  409. package/plugins/devflow-code-review/skills/architecture-patterns/SKILL.md +0 -153
  410. package/plugins/devflow-code-review/skills/architecture-patterns/references/patterns.md +0 -873
  411. package/plugins/devflow-code-review/skills/architecture-patterns/references/violations.md +0 -575
  412. package/plugins/devflow-code-review/skills/complexity-patterns/SKILL.md +0 -143
  413. package/plugins/devflow-code-review/skills/consistency-patterns/SKILL.md +0 -140
  414. package/plugins/devflow-code-review/skills/database-patterns/SKILL.md +0 -134
  415. package/plugins/devflow-code-review/skills/dependencies-patterns/SKILL.md +0 -141
  416. package/plugins/devflow-code-review/skills/documentation-patterns/SKILL.md +0 -125
  417. package/plugins/devflow-code-review/skills/knowledge-persistence/SKILL.md +0 -128
  418. package/plugins/devflow-code-review/skills/knowledge-persistence/references/examples.md +0 -44
  419. package/plugins/devflow-code-review/skills/performance-patterns/SKILL.md +0 -154
  420. package/plugins/devflow-code-review/skills/performance-patterns/references/patterns.md +0 -503
  421. package/plugins/devflow-code-review/skills/performance-patterns/references/violations.md +0 -354
  422. package/plugins/devflow-code-review/skills/regression-patterns/SKILL.md +0 -146
  423. package/plugins/devflow-code-review/skills/review-methodology/SKILL.md +0 -119
  424. package/plugins/devflow-code-review/skills/review-methodology/references/patterns.md +0 -186
  425. package/plugins/devflow-code-review/skills/review-methodology/references/report-template.md +0 -142
  426. package/plugins/devflow-code-review/skills/review-methodology/references/violations.md +0 -125
  427. package/plugins/devflow-code-review/skills/security-patterns/SKILL.md +0 -156
  428. package/plugins/devflow-code-review/skills/security-patterns/references/patterns.md +0 -507
  429. package/plugins/devflow-code-review/skills/security-patterns/references/violations.md +0 -237
  430. package/plugins/devflow-code-review/skills/test-patterns/SKILL.md +0 -183
  431. package/plugins/devflow-code-review/skills/test-patterns/references/patterns.md +0 -220
  432. package/plugins/devflow-code-review/skills/test-patterns/references/violations.md +0 -221
  433. package/plugins/devflow-core-skills/.claude-plugin/plugin.json +0 -31
  434. package/plugins/devflow-core-skills/README.md +0 -50
  435. package/plugins/devflow-core-skills/skills/core-patterns/SKILL.md +0 -162
  436. package/plugins/devflow-core-skills/skills/core-patterns/references/checklist.md +0 -276
  437. package/plugins/devflow-core-skills/skills/core-patterns/references/code-smell-violations.md +0 -144
  438. package/plugins/devflow-core-skills/skills/core-patterns/references/patterns.md +0 -576
  439. package/plugins/devflow-core-skills/skills/core-patterns/references/violations.md +0 -369
  440. package/plugins/devflow-core-skills/skills/docs-framework/SKILL.md +0 -143
  441. package/plugins/devflow-core-skills/skills/docs-framework/references/patterns.md +0 -346
  442. package/plugins/devflow-core-skills/skills/docs-framework/references/violations.md +0 -221
  443. package/plugins/devflow-core-skills/skills/git-safety/SKILL.md +0 -122
  444. package/plugins/devflow-core-skills/skills/git-safety/references/patterns.md +0 -289
  445. package/plugins/devflow-core-skills/skills/git-safety/references/violations.md +0 -18
  446. package/plugins/devflow-core-skills/skills/git-workflow/SKILL.md +0 -158
  447. package/plugins/devflow-core-skills/skills/git-workflow/references/commit-patterns.md +0 -115
  448. package/plugins/devflow-core-skills/skills/git-workflow/references/commit-violations.md +0 -77
  449. package/plugins/devflow-core-skills/skills/git-workflow/references/pr-patterns.md +0 -127
  450. package/plugins/devflow-core-skills/skills/git-workflow/references/pr-violations.md +0 -96
  451. package/plugins/devflow-core-skills/skills/github-patterns/SKILL.md +0 -153
  452. package/plugins/devflow-core-skills/skills/github-patterns/references/patterns.md +0 -572
  453. package/plugins/devflow-core-skills/skills/github-patterns/references/violations.md +0 -298
  454. package/plugins/devflow-core-skills/skills/input-validation/SKILL.md +0 -148
  455. package/plugins/devflow-core-skills/skills/input-validation/references/detection.md +0 -283
  456. package/plugins/devflow-core-skills/skills/input-validation/references/patterns.md +0 -361
  457. package/plugins/devflow-core-skills/skills/input-validation/references/violations.md +0 -224
  458. package/plugins/devflow-core-skills/skills/search-first/SKILL.md +0 -133
  459. package/plugins/devflow-core-skills/skills/search-first/references/evaluation-criteria.md +0 -101
  460. package/plugins/devflow-core-skills/skills/test-driven-development/SKILL.md +0 -137
  461. package/plugins/devflow-core-skills/skills/test-patterns/SKILL.md +0 -183
  462. package/plugins/devflow-core-skills/skills/test-patterns/references/detection.md +0 -149
  463. package/plugins/devflow-core-skills/skills/test-patterns/references/patterns.md +0 -220
  464. package/plugins/devflow-core-skills/skills/test-patterns/references/report-template.md +0 -108
  465. package/plugins/devflow-core-skills/skills/test-patterns/references/violations.md +0 -221
  466. package/plugins/devflow-debug/.claude-plugin/plugin.json +0 -26
  467. package/plugins/devflow-debug/README.md +0 -65
  468. package/plugins/devflow-debug/agents/git.md +0 -277
  469. package/plugins/devflow-debug/agents/synthesizer.md +0 -211
  470. package/plugins/devflow-debug/commands/debug-teams.md +0 -245
  471. package/plugins/devflow-debug/commands/debug.md +0 -174
  472. package/plugins/devflow-debug/skills/agent-teams/SKILL.md +0 -124
  473. package/plugins/devflow-debug/skills/agent-teams/references/cleanup.md +0 -104
  474. package/plugins/devflow-debug/skills/agent-teams/references/communication.md +0 -122
  475. package/plugins/devflow-debug/skills/agent-teams/references/team-patterns.md +0 -217
  476. package/plugins/devflow-debug/skills/git-safety/SKILL.md +0 -122
  477. package/plugins/devflow-debug/skills/git-safety/references/detection.md +0 -290
  478. package/plugins/devflow-debug/skills/git-safety/references/patterns.md +0 -289
  479. package/plugins/devflow-debug/skills/git-safety/references/violations.md +0 -18
  480. package/plugins/devflow-debug/skills/knowledge-persistence/SKILL.md +0 -128
  481. package/plugins/devflow-debug/skills/knowledge-persistence/references/examples.md +0 -44
  482. package/plugins/devflow-frontend-design/.claude-plugin/plugin.json +0 -21
  483. package/plugins/devflow-frontend-design/skills/frontend-design/SKILL.md +0 -254
  484. package/plugins/devflow-frontend-design/skills/frontend-design/references/patterns.md +0 -511
  485. package/plugins/devflow-frontend-design/skills/frontend-design/references/violations.md +0 -453
  486. package/plugins/devflow-go/.claude-plugin/plugin.json +0 -21
  487. package/plugins/devflow-go/skills/go/SKILL.md +0 -187
  488. package/plugins/devflow-go/skills/go/references/concurrency.md +0 -312
  489. package/plugins/devflow-go/skills/go/references/patterns.md +0 -232
  490. package/plugins/devflow-go/skills/go/references/violations.md +0 -205
  491. package/plugins/devflow-implement/.claude-plugin/plugin.json +0 -35
  492. package/plugins/devflow-implement/README.md +0 -71
  493. package/plugins/devflow-implement/agents/coder.md +0 -135
  494. package/plugins/devflow-implement/agents/git.md +0 -277
  495. package/plugins/devflow-implement/agents/scrutinizer.md +0 -82
  496. package/plugins/devflow-implement/agents/shepherd.md +0 -108
  497. package/plugins/devflow-implement/agents/simplifier.md +0 -102
  498. package/plugins/devflow-implement/agents/skimmer.md +0 -143
  499. package/plugins/devflow-implement/agents/synthesizer.md +0 -211
  500. package/plugins/devflow-implement/agents/validator.md +0 -86
  501. package/plugins/devflow-implement/commands/implement-teams.md +0 -620
  502. package/plugins/devflow-implement/commands/implement.md +0 -430
  503. package/plugins/devflow-implement/skills/agent-teams/SKILL.md +0 -124
  504. package/plugins/devflow-implement/skills/agent-teams/references/cleanup.md +0 -104
  505. package/plugins/devflow-implement/skills/agent-teams/references/communication.md +0 -122
  506. package/plugins/devflow-implement/skills/agent-teams/references/team-patterns.md +0 -217
  507. package/plugins/devflow-implement/skills/implementation-patterns/SKILL.md +0 -162
  508. package/plugins/devflow-implement/skills/knowledge-persistence/SKILL.md +0 -128
  509. package/plugins/devflow-implement/skills/knowledge-persistence/references/examples.md +0 -44
  510. package/plugins/devflow-implement/skills/self-review/SKILL.md +0 -149
  511. package/plugins/devflow-implement/skills/self-review/references/stub-detection.md +0 -135
  512. package/plugins/devflow-java/.claude-plugin/plugin.json +0 -21
  513. package/plugins/devflow-java/skills/java/SKILL.md +0 -183
  514. package/plugins/devflow-java/skills/java/references/modern-java.md +0 -270
  515. package/plugins/devflow-java/skills/java/references/patterns.md +0 -235
  516. package/plugins/devflow-java/skills/java/references/violations.md +0 -213
  517. package/plugins/devflow-python/.claude-plugin/plugin.json +0 -21
  518. package/plugins/devflow-python/skills/python/SKILL.md +0 -188
  519. package/plugins/devflow-python/skills/python/references/async.md +0 -220
  520. package/plugins/devflow-python/skills/python/references/patterns.md +0 -226
  521. package/plugins/devflow-python/skills/python/references/violations.md +0 -204
  522. package/plugins/devflow-react/.claude-plugin/plugin.json +0 -21
  523. package/plugins/devflow-react/skills/react/SKILL.md +0 -276
  524. package/plugins/devflow-react/skills/react/references/patterns.md +0 -1331
  525. package/plugins/devflow-react/skills/react/references/violations.md +0 -565
  526. package/plugins/devflow-resolve/.claude-plugin/plugin.json +0 -29
  527. package/plugins/devflow-resolve/README.md +0 -65
  528. package/plugins/devflow-resolve/agents/git.md +0 -277
  529. package/plugins/devflow-resolve/agents/resolver.md +0 -131
  530. package/plugins/devflow-resolve/agents/simplifier.md +0 -102
  531. package/plugins/devflow-resolve/commands/resolve-teams.md +0 -307
  532. package/plugins/devflow-resolve/commands/resolve.md +0 -246
  533. package/plugins/devflow-resolve/skills/agent-teams/SKILL.md +0 -124
  534. package/plugins/devflow-resolve/skills/agent-teams/references/cleanup.md +0 -104
  535. package/plugins/devflow-resolve/skills/agent-teams/references/communication.md +0 -122
  536. package/plugins/devflow-resolve/skills/agent-teams/references/team-patterns.md +0 -217
  537. package/plugins/devflow-resolve/skills/implementation-patterns/SKILL.md +0 -162
  538. package/plugins/devflow-resolve/skills/implementation-patterns/references/patterns.md +0 -1063
  539. package/plugins/devflow-resolve/skills/implementation-patterns/references/violations.md +0 -483
  540. package/plugins/devflow-resolve/skills/knowledge-persistence/SKILL.md +0 -128
  541. package/plugins/devflow-resolve/skills/knowledge-persistence/references/examples.md +0 -44
  542. package/plugins/devflow-resolve/skills/security-patterns/SKILL.md +0 -156
  543. package/plugins/devflow-resolve/skills/security-patterns/references/detection.md +0 -287
  544. package/plugins/devflow-resolve/skills/security-patterns/references/patterns.md +0 -507
  545. package/plugins/devflow-resolve/skills/security-patterns/references/violations.md +0 -237
  546. package/plugins/devflow-rust/.claude-plugin/plugin.json +0 -21
  547. package/plugins/devflow-rust/skills/rust/SKILL.md +0 -193
  548. package/plugins/devflow-rust/skills/rust/references/ownership.md +0 -242
  549. package/plugins/devflow-rust/skills/rust/references/patterns.md +0 -210
  550. package/plugins/devflow-rust/skills/rust/references/violations.md +0 -191
  551. package/plugins/devflow-self-review/.claude-plugin/plugin.json +0 -26
  552. package/plugins/devflow-self-review/README.md +0 -38
  553. package/plugins/devflow-self-review/agents/scrutinizer.md +0 -82
  554. package/plugins/devflow-self-review/agents/simplifier.md +0 -102
  555. package/plugins/devflow-self-review/agents/validator.md +0 -86
  556. package/plugins/devflow-self-review/commands/self-review.md +0 -132
  557. package/plugins/devflow-self-review/skills/core-patterns/SKILL.md +0 -162
  558. package/plugins/devflow-self-review/skills/core-patterns/references/checklist.md +0 -276
  559. package/plugins/devflow-self-review/skills/core-patterns/references/code-smell-violations.md +0 -144
  560. package/plugins/devflow-self-review/skills/core-patterns/references/detection.md +0 -303
  561. package/plugins/devflow-self-review/skills/core-patterns/references/patterns.md +0 -576
  562. package/plugins/devflow-self-review/skills/core-patterns/references/violations.md +0 -369
  563. package/plugins/devflow-self-review/skills/self-review/SKILL.md +0 -149
  564. package/plugins/devflow-self-review/skills/self-review/references/patterns.md +0 -405
  565. package/plugins/devflow-self-review/skills/self-review/references/report-template.md +0 -253
  566. package/plugins/devflow-self-review/skills/self-review/references/stub-detection.md +0 -135
  567. package/plugins/devflow-self-review/skills/self-review/references/violations.md +0 -308
  568. package/plugins/devflow-specify/.claude-plugin/plugin.json +0 -25
  569. package/plugins/devflow-specify/README.md +0 -46
  570. package/plugins/devflow-specify/agents/skimmer.md +0 -143
  571. package/plugins/devflow-specify/agents/synthesizer.md +0 -211
  572. package/plugins/devflow-specify/commands/specify-teams.md +0 -321
  573. package/plugins/devflow-specify/commands/specify.md +0 -186
  574. package/plugins/devflow-specify/skills/agent-teams/SKILL.md +0 -124
  575. package/plugins/devflow-specify/skills/agent-teams/references/cleanup.md +0 -104
  576. package/plugins/devflow-specify/skills/agent-teams/references/communication.md +0 -122
  577. package/plugins/devflow-specify/skills/agent-teams/references/team-patterns.md +0 -217
  578. package/plugins/devflow-typescript/.claude-plugin/plugin.json +0 -21
  579. package/plugins/devflow-typescript/skills/typescript/SKILL.md +0 -176
  580. package/plugins/devflow-typescript/skills/typescript/references/patterns.md +0 -1105
  581. package/plugins/devflow-typescript/skills/typescript/references/violations.md +0 -433
  582. package/scripts/hooks/ambient-prompt +0 -50
  583. package/scripts/hooks/background-memory-update +0 -257
  584. package/scripts/hooks/ensure-memory-gitignore +0 -17
  585. package/scripts/hooks/pre-compact-memory +0 -87
  586. package/scripts/hooks/run-hook +0 -23
  587. package/scripts/hooks/session-start-memory +0 -165
  588. package/scripts/hooks/stop-update-memory +0 -85
  589. package/scripts/hud/cache.d.ts +0 -14
  590. package/scripts/hud/cache.d.ts.map +0 -1
  591. package/scripts/hud/cache.js +0 -54
  592. package/scripts/hud/cache.js.map +0 -1
  593. package/scripts/hud/colors.d.ts +0 -23
  594. package/scripts/hud/colors.d.ts.map +0 -1
  595. package/scripts/hud/colors.js +0 -62
  596. package/scripts/hud/colors.js.map +0 -1
  597. package/scripts/hud/components/config-counts.d.ts +0 -8
  598. package/scripts/hud/components/config-counts.d.ts.map +0 -1
  599. package/scripts/hud/components/config-counts.js +0 -91
  600. package/scripts/hud/components/config-counts.js.map +0 -1
  601. package/scripts/hud/components/context-usage.d.ts +0 -8
  602. package/scripts/hud/components/context-usage.d.ts.map +0 -1
  603. package/scripts/hud/components/context-usage.js +0 -49
  604. package/scripts/hud/components/context-usage.js.map +0 -1
  605. package/scripts/hud/components/diff-stats.d.ts +0 -3
  606. package/scripts/hud/components/diff-stats.d.ts.map +0 -1
  607. package/scripts/hud/components/diff-stats.js +0 -36
  608. package/scripts/hud/components/diff-stats.js.map +0 -1
  609. package/scripts/hud/components/directory.d.ts +0 -3
  610. package/scripts/hud/components/directory.d.ts.map +0 -1
  611. package/scripts/hud/components/directory.js +0 -10
  612. package/scripts/hud/components/directory.js.map +0 -1
  613. package/scripts/hud/components/git-ahead-behind.d.ts +0 -3
  614. package/scripts/hud/components/git-ahead-behind.d.ts.map +0 -1
  615. package/scripts/hud/components/git-ahead-behind.js +0 -16
  616. package/scripts/hud/components/git-ahead-behind.js.map +0 -1
  617. package/scripts/hud/components/git-branch.d.ts +0 -3
  618. package/scripts/hud/components/git-branch.d.ts.map +0 -1
  619. package/scripts/hud/components/git-branch.js +0 -14
  620. package/scripts/hud/components/git-branch.js.map +0 -1
  621. package/scripts/hud/components/model.d.ts +0 -3
  622. package/scripts/hud/components/model.d.ts.map +0 -1
  623. package/scripts/hud/components/model.js +0 -21
  624. package/scripts/hud/components/model.js.map +0 -1
  625. package/scripts/hud/components/release-info.d.ts +0 -3
  626. package/scripts/hud/components/release-info.d.ts.map +0 -1
  627. package/scripts/hud/components/release-info.js +0 -9
  628. package/scripts/hud/components/release-info.js.map +0 -1
  629. package/scripts/hud/components/session-cost.d.ts +0 -3
  630. package/scripts/hud/components/session-cost.d.ts.map +0 -1
  631. package/scripts/hud/components/session-cost.js +0 -9
  632. package/scripts/hud/components/session-cost.js.map +0 -1
  633. package/scripts/hud/components/session-duration.d.ts +0 -3
  634. package/scripts/hud/components/session-duration.d.ts.map +0 -1
  635. package/scripts/hud/components/session-duration.js +0 -18
  636. package/scripts/hud/components/session-duration.js.map +0 -1
  637. package/scripts/hud/components/todo-progress.d.ts +0 -3
  638. package/scripts/hud/components/todo-progress.d.ts.map +0 -1
  639. package/scripts/hud/components/todo-progress.js +0 -11
  640. package/scripts/hud/components/todo-progress.js.map +0 -1
  641. package/scripts/hud/components/usage-quota.d.ts +0 -3
  642. package/scripts/hud/components/usage-quota.d.ts.map +0 -1
  643. package/scripts/hud/components/usage-quota.js +0 -45
  644. package/scripts/hud/components/usage-quota.js.map +0 -1
  645. package/scripts/hud/components/version-badge.d.ts +0 -3
  646. package/scripts/hud/components/version-badge.d.ts.map +0 -1
  647. package/scripts/hud/components/version-badge.js +0 -80
  648. package/scripts/hud/components/version-badge.js.map +0 -1
  649. package/scripts/hud/components/worktree-count.d.ts +0 -3
  650. package/scripts/hud/components/worktree-count.d.ts.map +0 -1
  651. package/scripts/hud/components/worktree-count.js +0 -8
  652. package/scripts/hud/components/worktree-count.js.map +0 -1
  653. package/scripts/hud/config.d.ts +0 -10
  654. package/scripts/hud/config.d.ts.map +0 -1
  655. package/scripts/hud/config.js +0 -55
  656. package/scripts/hud/config.js.map +0 -1
  657. package/scripts/hud/credentials.d.ts +0 -17
  658. package/scripts/hud/credentials.d.ts.map +0 -1
  659. package/scripts/hud/credentials.js +0 -99
  660. package/scripts/hud/credentials.js.map +0 -1
  661. package/scripts/hud/git.d.ts +0 -7
  662. package/scripts/hud/git.d.ts.map +0 -1
  663. package/scripts/hud/git.js +0 -153
  664. package/scripts/hud/git.js.map +0 -1
  665. package/scripts/hud/index.d.ts +0 -2
  666. package/scripts/hud/index.d.ts.map +0 -1
  667. package/scripts/hud/index.js +0 -81
  668. package/scripts/hud/index.js.map +0 -1
  669. package/scripts/hud/render.d.ts +0 -7
  670. package/scripts/hud/render.d.ts.map +0 -1
  671. package/scripts/hud/render.js +0 -111
  672. package/scripts/hud/render.js.map +0 -1
  673. package/scripts/hud/stdin.d.ts +0 -6
  674. package/scripts/hud/stdin.d.ts.map +0 -1
  675. package/scripts/hud/stdin.js +0 -25
  676. package/scripts/hud/stdin.js.map +0 -1
  677. package/scripts/hud/transcript.d.ts +0 -7
  678. package/scripts/hud/transcript.d.ts.map +0 -1
  679. package/scripts/hud/transcript.js +0 -130
  680. package/scripts/hud/transcript.js.map +0 -1
  681. package/scripts/hud/types.d.ts +0 -116
  682. package/scripts/hud/types.d.ts.map +0 -1
  683. package/scripts/hud/types.js +0 -2
  684. package/scripts/hud/types.js.map +0 -1
  685. package/scripts/hud/usage-api.d.ts +0 -7
  686. package/scripts/hud/usage-api.d.ts.map +0 -1
  687. package/scripts/hud/usage-api.js +0 -84
  688. package/scripts/hud/usage-api.js.map +0 -1
  689. package/scripts/hud.sh +0 -5
  690. package/shared/agents/coder.md +0 -135
  691. package/shared/agents/git.md +0 -277
  692. package/shared/agents/resolver.md +0 -131
  693. package/shared/agents/reviewer.md +0 -165
  694. package/shared/agents/scrutinizer.md +0 -82
  695. package/shared/agents/shepherd.md +0 -108
  696. package/shared/agents/simplifier.md +0 -102
  697. package/shared/agents/skimmer.md +0 -143
  698. package/shared/agents/synthesizer.md +0 -211
  699. package/shared/agents/validator.md +0 -86
  700. package/shared/skills/accessibility/SKILL.md +0 -229
  701. package/shared/skills/accessibility/references/detection.md +0 -171
  702. package/shared/skills/accessibility/references/patterns.md +0 -670
  703. package/shared/skills/accessibility/references/violations.md +0 -419
  704. package/shared/skills/agent-teams/SKILL.md +0 -124
  705. package/shared/skills/agent-teams/references/cleanup.md +0 -104
  706. package/shared/skills/agent-teams/references/communication.md +0 -122
  707. package/shared/skills/agent-teams/references/team-patterns.md +0 -217
  708. package/shared/skills/ambient-router/SKILL.md +0 -145
  709. package/shared/skills/ambient-router/references/skill-catalog.md +0 -74
  710. package/shared/skills/architecture-patterns/SKILL.md +0 -153
  711. package/shared/skills/architecture-patterns/references/detection.md +0 -337
  712. package/shared/skills/architecture-patterns/references/patterns.md +0 -873
  713. package/shared/skills/architecture-patterns/references/violations.md +0 -575
  714. package/shared/skills/complexity-patterns/SKILL.md +0 -143
  715. package/shared/skills/complexity-patterns/references/detection.md +0 -264
  716. package/shared/skills/complexity-patterns/references/patterns.md +0 -487
  717. package/shared/skills/complexity-patterns/references/violations.md +0 -361
  718. package/shared/skills/consistency-patterns/SKILL.md +0 -140
  719. package/shared/skills/consistency-patterns/references/detection.md +0 -207
  720. package/shared/skills/consistency-patterns/references/patterns.md +0 -202
  721. package/shared/skills/consistency-patterns/references/violations.md +0 -213
  722. package/shared/skills/core-patterns/SKILL.md +0 -162
  723. package/shared/skills/core-patterns/references/checklist.md +0 -276
  724. package/shared/skills/core-patterns/references/code-smell-violations.md +0 -144
  725. package/shared/skills/core-patterns/references/detection.md +0 -303
  726. package/shared/skills/core-patterns/references/patterns.md +0 -576
  727. package/shared/skills/core-patterns/references/violations.md +0 -369
  728. package/shared/skills/database-patterns/SKILL.md +0 -134
  729. package/shared/skills/database-patterns/references/detection.md +0 -208
  730. package/shared/skills/database-patterns/references/patterns.md +0 -394
  731. package/shared/skills/database-patterns/references/violations.md +0 -332
  732. package/shared/skills/debug-orchestration/SKILL.md +0 -69
  733. package/shared/skills/dependencies-patterns/SKILL.md +0 -141
  734. package/shared/skills/dependencies-patterns/references/detection.md +0 -181
  735. package/shared/skills/dependencies-patterns/references/patterns.md +0 -225
  736. package/shared/skills/dependencies-patterns/references/violations.md +0 -247
  737. package/shared/skills/docs-framework/SKILL.md +0 -143
  738. package/shared/skills/docs-framework/references/patterns.md +0 -346
  739. package/shared/skills/docs-framework/references/violations.md +0 -221
  740. package/shared/skills/documentation-patterns/SKILL.md +0 -125
  741. package/shared/skills/documentation-patterns/references/detection.md +0 -190
  742. package/shared/skills/documentation-patterns/references/patterns.md +0 -189
  743. package/shared/skills/documentation-patterns/references/violations.md +0 -163
  744. package/shared/skills/frontend-design/SKILL.md +0 -254
  745. package/shared/skills/frontend-design/references/detection.md +0 -184
  746. package/shared/skills/frontend-design/references/patterns.md +0 -511
  747. package/shared/skills/frontend-design/references/violations.md +0 -453
  748. package/shared/skills/git-safety/SKILL.md +0 -122
  749. package/shared/skills/git-safety/references/detection.md +0 -290
  750. package/shared/skills/git-safety/references/patterns.md +0 -289
  751. package/shared/skills/git-safety/references/violations.md +0 -18
  752. package/shared/skills/git-workflow/SKILL.md +0 -158
  753. package/shared/skills/git-workflow/references/commit-patterns.md +0 -115
  754. package/shared/skills/git-workflow/references/commit-violations.md +0 -77
  755. package/shared/skills/git-workflow/references/pr-patterns.md +0 -127
  756. package/shared/skills/git-workflow/references/pr-violations.md +0 -96
  757. package/shared/skills/github-patterns/SKILL.md +0 -153
  758. package/shared/skills/github-patterns/references/patterns.md +0 -572
  759. package/shared/skills/github-patterns/references/violations.md +0 -298
  760. package/shared/skills/go/SKILL.md +0 -187
  761. package/shared/skills/go/references/concurrency.md +0 -312
  762. package/shared/skills/go/references/detection.md +0 -129
  763. package/shared/skills/go/references/patterns.md +0 -232
  764. package/shared/skills/go/references/violations.md +0 -205
  765. package/shared/skills/implementation-orchestration/SKILL.md +0 -92
  766. package/shared/skills/implementation-patterns/SKILL.md +0 -162
  767. package/shared/skills/implementation-patterns/references/patterns.md +0 -1063
  768. package/shared/skills/implementation-patterns/references/violations.md +0 -483
  769. package/shared/skills/input-validation/SKILL.md +0 -148
  770. package/shared/skills/input-validation/references/detection.md +0 -283
  771. package/shared/skills/input-validation/references/patterns.md +0 -361
  772. package/shared/skills/input-validation/references/violations.md +0 -224
  773. package/shared/skills/java/SKILL.md +0 -183
  774. package/shared/skills/java/references/detection.md +0 -120
  775. package/shared/skills/java/references/modern-java.md +0 -270
  776. package/shared/skills/java/references/patterns.md +0 -235
  777. package/shared/skills/java/references/violations.md +0 -213
  778. package/shared/skills/knowledge-persistence/SKILL.md +0 -128
  779. package/shared/skills/knowledge-persistence/references/examples.md +0 -44
  780. package/shared/skills/performance-patterns/SKILL.md +0 -154
  781. package/shared/skills/performance-patterns/references/detection.md +0 -351
  782. package/shared/skills/performance-patterns/references/patterns.md +0 -503
  783. package/shared/skills/performance-patterns/references/violations.md +0 -354
  784. package/shared/skills/plan-orchestration/SKILL.md +0 -71
  785. package/shared/skills/python/SKILL.md +0 -188
  786. package/shared/skills/python/references/async.md +0 -220
  787. package/shared/skills/python/references/detection.md +0 -128
  788. package/shared/skills/python/references/patterns.md +0 -226
  789. package/shared/skills/python/references/violations.md +0 -204
  790. package/shared/skills/react/SKILL.md +0 -276
  791. package/shared/skills/react/references/patterns.md +0 -1331
  792. package/shared/skills/react/references/violations.md +0 -565
  793. package/shared/skills/regression-patterns/SKILL.md +0 -146
  794. package/shared/skills/regression-patterns/references/detection.md +0 -237
  795. package/shared/skills/regression-patterns/references/patterns.md +0 -226
  796. package/shared/skills/regression-patterns/references/violations.md +0 -225
  797. package/shared/skills/review-methodology/SKILL.md +0 -119
  798. package/shared/skills/review-methodology/references/patterns.md +0 -186
  799. package/shared/skills/review-methodology/references/report-template.md +0 -142
  800. package/shared/skills/review-methodology/references/violations.md +0 -125
  801. package/shared/skills/rust/SKILL.md +0 -193
  802. package/shared/skills/rust/references/detection.md +0 -131
  803. package/shared/skills/rust/references/ownership.md +0 -242
  804. package/shared/skills/rust/references/patterns.md +0 -210
  805. package/shared/skills/rust/references/violations.md +0 -191
  806. package/shared/skills/search-first/SKILL.md +0 -133
  807. package/shared/skills/search-first/references/evaluation-criteria.md +0 -101
  808. package/shared/skills/security-patterns/SKILL.md +0 -156
  809. package/shared/skills/security-patterns/references/detection.md +0 -287
  810. package/shared/skills/security-patterns/references/patterns.md +0 -507
  811. package/shared/skills/security-patterns/references/violations.md +0 -237
  812. package/shared/skills/self-review/SKILL.md +0 -149
  813. package/shared/skills/self-review/references/patterns.md +0 -405
  814. package/shared/skills/self-review/references/report-template.md +0 -253
  815. package/shared/skills/self-review/references/stub-detection.md +0 -135
  816. package/shared/skills/self-review/references/violations.md +0 -308
  817. package/shared/skills/test-driven-development/SKILL.md +0 -137
  818. package/shared/skills/test-driven-development/references/rationalization-prevention.md +0 -111
  819. package/shared/skills/test-patterns/SKILL.md +0 -183
  820. package/shared/skills/test-patterns/references/detection.md +0 -149
  821. package/shared/skills/test-patterns/references/patterns.md +0 -220
  822. package/shared/skills/test-patterns/references/report-template.md +0 -108
  823. package/shared/skills/test-patterns/references/violations.md +0 -221
  824. package/shared/skills/typescript/SKILL.md +0 -176
  825. package/shared/skills/typescript/references/patterns.md +0 -1105
  826. package/shared/skills/typescript/references/violations.md +0 -433
  827. package/src/templates/claudeignore.template +0 -188
  828. package/src/templates/settings.json +0 -59
  829. /package/dist/{utils → core}/safe-delete.js +0 -0
  830. /package/{plugins/devflow-accessibility → src/assets}/skills/accessibility/references/detection.md +0 -0
  831. /package/{plugins/devflow-code-review/skills/architecture-patterns → src/assets/skills/architecture}/references/detection.md +0 -0
  832. /package/{plugins/devflow-code-review/skills/complexity-patterns → src/assets/skills/complexity}/references/detection.md +0 -0
  833. /package/{plugins/devflow-code-review/skills/complexity-patterns → src/assets/skills/complexity}/references/patterns.md +0 -0
  834. /package/{plugins/devflow-code-review/skills/complexity-patterns → src/assets/skills/complexity}/references/violations.md +0 -0
  835. /package/{plugins/devflow-code-review/skills/consistency-patterns → src/assets/skills/consistency}/references/detection.md +0 -0
  836. /package/{plugins/devflow-code-review/skills/consistency-patterns → src/assets/skills/consistency}/references/patterns.md +0 -0
  837. /package/{plugins/devflow-code-review/skills/consistency-patterns → src/assets/skills/consistency}/references/violations.md +0 -0
  838. /package/{plugins/devflow-code-review/skills/database-patterns → src/assets/skills/database}/references/detection.md +0 -0
  839. /package/{plugins/devflow-code-review/skills/database-patterns → src/assets/skills/database}/references/patterns.md +0 -0
  840. /package/{plugins/devflow-code-review/skills/database-patterns → src/assets/skills/database}/references/violations.md +0 -0
  841. /package/{plugins/devflow-code-review/skills/dependencies-patterns → src/assets/skills/dependencies}/references/detection.md +0 -0
  842. /package/{plugins/devflow-code-review/skills/dependencies-patterns → src/assets/skills/dependencies}/references/patterns.md +0 -0
  843. /package/{plugins/devflow-code-review/skills/dependencies-patterns → src/assets/skills/dependencies}/references/violations.md +0 -0
  844. /package/{plugins/devflow-code-review/skills/documentation-patterns → src/assets/skills/documentation}/references/detection.md +0 -0
  845. /package/{plugins/devflow-code-review/skills/documentation-patterns → src/assets/skills/documentation}/references/patterns.md +0 -0
  846. /package/{plugins/devflow-code-review/skills/documentation-patterns → src/assets/skills/documentation}/references/violations.md +0 -0
  847. /package/{plugins/devflow-core-skills/skills/git-safety → src/assets/skills/git}/references/detection.md +0 -0
  848. /package/{plugins/devflow-go → src/assets}/skills/go/references/detection.md +0 -0
  849. /package/{plugins/devflow-java → src/assets}/skills/java/references/detection.md +0 -0
  850. /package/{plugins/devflow-implement/skills/implementation-patterns → src/assets/skills/patterns}/references/patterns.md +0 -0
  851. /package/{plugins/devflow-implement/skills/implementation-patterns → src/assets/skills/patterns}/references/violations.md +0 -0
  852. /package/{plugins/devflow-code-review/skills/performance-patterns → src/assets/skills/performance}/references/detection.md +0 -0
  853. /package/{plugins/devflow-python → src/assets}/skills/python/references/detection.md +0 -0
  854. /package/{plugins/devflow-implement/skills/self-review → src/assets/skills/quality-gates}/references/patterns.md +0 -0
  855. /package/{plugins/devflow-implement/skills/self-review → src/assets/skills/quality-gates}/references/report-template.md +0 -0
  856. /package/{plugins/devflow-implement/skills/self-review → src/assets/skills/quality-gates}/references/violations.md +0 -0
  857. /package/{plugins/devflow-code-review/skills/regression-patterns → src/assets/skills/regression}/references/detection.md +0 -0
  858. /package/{plugins/devflow-code-review/skills/regression-patterns → src/assets/skills/regression}/references/patterns.md +0 -0
  859. /package/{plugins/devflow-code-review/skills/regression-patterns → src/assets/skills/regression}/references/violations.md +0 -0
  860. /package/{plugins/devflow-rust → src/assets}/skills/rust/references/detection.md +0 -0
  861. /package/{plugins/devflow-code-review/skills/security-patterns → src/assets/skills/security}/references/detection.md +0 -0
  862. /package/{plugins/devflow-core-skills/skills/core-patterns → src/assets/skills/software-design}/references/detection.md +0 -0
  863. /package/{plugins/devflow-core-skills → src/assets}/skills/test-driven-development/references/rationalization-prevention.md +0 -0
  864. /package/{plugins/devflow-code-review/skills/test-patterns → src/assets/skills/testing}/references/detection.md +0 -0
  865. /package/{plugins/devflow-code-review/skills/test-patterns → src/assets/skills/testing}/references/report-template.md +0 -0
  866. /package/{plugins/devflow-frontend-design/skills/frontend-design → src/assets/skills/ui-design}/references/detection.md +0 -0
  867. /package/src/{templates → targets/claude-code/templates}/managed-settings.json +0 -0
@@ -1,1331 +0,0 @@
1
- # React Correct Patterns
2
-
3
- Extended correct patterns for React development. Reference from main SKILL.md.
4
-
5
- ---
6
-
7
- ## Vercel Performance Patterns
8
-
9
- ### Async Parallelization
10
-
11
- ```tsx
12
- // CORRECT: Parallel independent fetches with named destructuring
13
- async function loadUserDashboard(userId: string) {
14
- const [
15
- { data: user },
16
- { data: orders },
17
- { data: notifications },
18
- { data: preferences },
19
- ] = await Promise.all([
20
- fetchUser(userId),
21
- fetchOrders(userId),
22
- fetchNotifications(userId),
23
- fetchPreferences(userId),
24
- ]);
25
-
26
- return {
27
- user,
28
- orders,
29
- notifications,
30
- preferences,
31
- };
32
- }
33
-
34
- // CORRECT: Partial parallelization when some deps exist
35
- async function loadOrderDetails(orderId: string) {
36
- // First: fetch order (needed for customer ID)
37
- const order = await fetchOrder(orderId);
38
-
39
- // Then: parallel fetch using order data
40
- const [customer, products, shipping] = await Promise.all([
41
- fetchCustomer(order.customerId),
42
- fetchProducts(order.productIds),
43
- fetchShippingStatus(order.trackingId),
44
- ]);
45
-
46
- return { order, customer, products, shipping };
47
- }
48
- ```
49
-
50
- ### Bundle Optimization
51
-
52
- ```tsx
53
- // CORRECT: Direct component imports (tree-shakable)
54
- import { Button } from '@/components/ui/Button';
55
- import { Input } from '@/components/ui/Input';
56
- import { Select } from '@/components/ui/Select';
57
-
58
- // CORRECT: Direct icon imports
59
- import { ChevronDown } from 'lucide-react/dist/esm/icons/chevron-down';
60
- import { Search } from 'lucide-react/dist/esm/icons/search';
61
-
62
- // CORRECT: Route-based code splitting
63
- const Dashboard = lazy(() => import('./pages/Dashboard'));
64
- const Settings = lazy(() => import('./pages/Settings'));
65
- const Analytics = lazy(() => import('./pages/Analytics'));
66
-
67
- function App() {
68
- return (
69
- <Suspense fallback={<PageSkeleton />}>
70
- <Routes>
71
- <Route path="/dashboard" element={<Dashboard />} />
72
- <Route path="/settings" element={<Settings />} />
73
- <Route path="/analytics" element={<Analytics />} />
74
- </Routes>
75
- </Suspense>
76
- );
77
- }
78
-
79
- // CORRECT: Conditional lazy loading
80
- function Editor({ showPreview }: { showPreview: boolean }) {
81
- const [Preview, setPreview] = useState<ComponentType | null>(null);
82
-
83
- useEffect(() => {
84
- if (showPreview && !Preview) {
85
- import('./Preview').then((mod) => setPreview(() => mod.default));
86
- }
87
- }, [showPreview, Preview]);
88
-
89
- return (
90
- <div>
91
- <EditorPane />
92
- {Preview && <Preview />}
93
- </div>
94
- );
95
- }
96
- ```
97
-
98
- ### Re-render Prevention
99
-
100
- ```tsx
101
- // CORRECT: Extract primitives from objects for deps
102
- function UserOrders({ user }: { user: User }) {
103
- const userId = user.id;
104
- const isActive = user.status === 'active';
105
-
106
- useEffect(() => {
107
- if (isActive) {
108
- fetchOrders(userId);
109
- }
110
- }, [userId, isActive]); // primitives = stable deps
111
- }
112
-
113
- // CORRECT: Stable callback references
114
- function DataTable({ items, onSelect }: Props) {
115
- const handleRowClick = useCallback((item: Item) => {
116
- onSelect(item.id);
117
- }, [onSelect]);
118
-
119
- return (
120
- <table>
121
- {items.map((item) => (
122
- <MemoizedRow
123
- key={item.id}
124
- item={item}
125
- onClick={handleRowClick}
126
- />
127
- ))}
128
- </table>
129
- );
130
- }
131
-
132
- const MemoizedRow = memo(function Row({
133
- item,
134
- onClick,
135
- }: {
136
- item: Item;
137
- onClick: (item: Item) => void;
138
- }) {
139
- return (
140
- <tr onClick={() => onClick(item)}>
141
- <td>{item.name}</td>
142
- </tr>
143
- );
144
- });
145
-
146
- // CORRECT: Memoize derived collections
147
- function FilteredList({ items, filter }: Props) {
148
- const filteredItems = useMemo(
149
- () => items.filter((item) => item.name.includes(filter)),
150
- [items, filter]
151
- );
152
-
153
- // Also memoize the Set for O(1) lookups
154
- const itemIds = useMemo(
155
- () => new Set(filteredItems.map((i) => i.id)),
156
- [filteredItems]
157
- );
158
-
159
- const isVisible = useCallback(
160
- (id: string) => itemIds.has(id),
161
- [itemIds]
162
- );
163
-
164
- return <List items={filteredItems} isVisible={isVisible} />;
165
- }
166
- ```
167
-
168
- ### Image Optimization
169
-
170
- ```tsx
171
- // CORRECT: Fully optimized image component
172
- interface OptimizedImageProps {
173
- src: string;
174
- alt: string;
175
- width: number;
176
- height: number;
177
- priority?: boolean;
178
- }
179
-
180
- function OptimizedImage({
181
- src,
182
- alt,
183
- width,
184
- height,
185
- priority = false,
186
- }: OptimizedImageProps) {
187
- return (
188
- <img
189
- src={src}
190
- alt={alt}
191
- width={width}
192
- height={height}
193
- loading={priority ? 'eager' : 'lazy'}
194
- decoding="async"
195
- style={{
196
- aspectRatio: `${width}/${height}`,
197
- objectFit: 'cover',
198
- }}
199
- />
200
- );
201
- }
202
-
203
- // CORRECT: Responsive images with srcset
204
- function ResponsiveImage({ src, alt }: { src: string; alt: string }) {
205
- return (
206
- <img
207
- src={`${src}?w=800`}
208
- srcSet={`
209
- ${src}?w=400 400w,
210
- ${src}?w=800 800w,
211
- ${src}?w=1200 1200w
212
- `}
213
- sizes="(max-width: 400px) 400px, (max-width: 800px) 800px, 1200px"
214
- alt={alt}
215
- loading="lazy"
216
- decoding="async"
217
- />
218
- );
219
- }
220
-
221
- // CORRECT: Image with blur placeholder
222
- function ImageWithPlaceholder({ src, alt, width, height }: Props) {
223
- const [loaded, setLoaded] = useState(false);
224
-
225
- return (
226
- <div
227
- style={{
228
- position: 'relative',
229
- width,
230
- height,
231
- backgroundColor: '#f0f0f0',
232
- }}
233
- >
234
- <img
235
- src={src}
236
- alt={alt}
237
- width={width}
238
- height={height}
239
- loading="lazy"
240
- decoding="async"
241
- onLoad={() => setLoaded(true)}
242
- style={{
243
- opacity: loaded ? 1 : 0,
244
- transition: 'opacity 0.3s',
245
- }}
246
- />
247
- </div>
248
- );
249
- }
250
- ```
251
-
252
- ### Data Structure Performance
253
-
254
- ```tsx
255
- // CORRECT: Map for complex key-value operations
256
- function useUsersMap(users: User[]) {
257
- return useMemo(() => {
258
- const byId = new Map<string, User>();
259
- const byEmail = new Map<string, User>();
260
-
261
- for (const user of users) {
262
- byId.set(user.id, user);
263
- byEmail.set(user.email.toLowerCase(), user);
264
- }
265
-
266
- return {
267
- getById: (id: string) => byId.get(id),
268
- getByEmail: (email: string) => byEmail.get(email.toLowerCase()),
269
- has: (id: string) => byId.has(id),
270
- };
271
- }, [users]);
272
- }
273
-
274
- // CORRECT: Set for selection state
275
- function useSelection<T extends string>() {
276
- const [selected, setSelected] = useState<Set<T>>(() => new Set());
277
-
278
- const toggle = useCallback((id: T) => {
279
- setSelected((prev) => {
280
- const next = new Set(prev);
281
- if (next.has(id)) {
282
- next.delete(id);
283
- } else {
284
- next.add(id);
285
- }
286
- return next;
287
- });
288
- }, []);
289
-
290
- const isSelected = useCallback(
291
- (id: T) => selected.has(id),
292
- [selected]
293
- );
294
-
295
- const selectAll = useCallback((ids: T[]) => {
296
- setSelected(new Set(ids));
297
- }, []);
298
-
299
- const clear = useCallback(() => {
300
- setSelected(new Set());
301
- }, []);
302
-
303
- return { selected, toggle, isSelected, selectAll, clear };
304
- }
305
-
306
- // CORRECT: Efficient list filtering with index
307
- function useFilteredList<T extends { id: string }>(
308
- items: T[],
309
- filterFn: (item: T) => boolean
310
- ) {
311
- return useMemo(() => {
312
- const filtered = items.filter(filterFn);
313
- const indexById = new Map(filtered.map((item, i) => [item.id, i]));
314
-
315
- return {
316
- items: filtered,
317
- count: filtered.length,
318
- indexOf: (id: string) => indexById.get(id) ?? -1,
319
- includes: (id: string) => indexById.has(id),
320
- };
321
- }, [items, filterFn]);
322
- }
323
- ```
324
-
325
- ---
326
-
327
- ## Component Patterns
328
-
329
- ### Composition with Compound Components
330
-
331
- ```tsx
332
- // CORRECT: Flexible composition through children
333
- function Card({ children }: { children: React.ReactNode }) {
334
- return <div className="card">{children}</div>;
335
- }
336
-
337
- Card.Header = function CardHeader({ children }: { children: React.ReactNode }) {
338
- return <div className="card-header">{children}</div>;
339
- };
340
-
341
- Card.Body = function CardBody({ children }: { children: React.ReactNode }) {
342
- return <div className="card-body">{children}</div>;
343
- };
344
-
345
- Card.Footer = function CardFooter({ children }: { children: React.ReactNode }) {
346
- return <div className="card-footer">{children}</div>;
347
- };
348
-
349
- // Usage - flexible, composable
350
- <Card>
351
- <Card.Header>
352
- <h2>Title</h2>
353
- <CloseButton onClick={onClose} />
354
- </Card.Header>
355
- <Card.Body>
356
- <p>Content goes here</p>
357
- </Card.Body>
358
- <Card.Footer>
359
- <Button>Save</Button>
360
- </Card.Footer>
361
- </Card>
362
- ```
363
-
364
- ### Render Props Pattern
365
-
366
- ```tsx
367
- // CORRECT: Share logic, customize rendering
368
- interface DataFetcherProps<T> {
369
- url: string;
370
- children: (data: T | null, loading: boolean, error: Error | null) => React.ReactNode;
371
- }
372
-
373
- function DataFetcher<T>({ url, children }: DataFetcherProps<T>) {
374
- const [data, setData] = useState<T | null>(null);
375
- const [loading, setLoading] = useState(true);
376
- const [error, setError] = useState<Error | null>(null);
377
-
378
- useEffect(() => {
379
- fetch(url)
380
- .then((res) => res.json())
381
- .then(setData)
382
- .catch(setError)
383
- .finally(() => setLoading(false));
384
- }, [url]);
385
-
386
- return <>{children(data, loading, error)}</>;
387
- }
388
-
389
- // Usage
390
- <DataFetcher<User> url="/api/user">
391
- {(user, loading, error) => {
392
- if (loading) return <Spinner />;
393
- if (error) return <ErrorMessage error={error} />;
394
- if (!user) return <NotFound />;
395
- return <UserProfile user={user} />;
396
- }}
397
- </DataFetcher>
398
- ```
399
-
400
- ### Context for Shared State
401
-
402
- ```tsx
403
- // CORRECT: Avoid prop drilling with context
404
- interface AuthContextValue {
405
- user: User | null;
406
- login: (credentials: Credentials) => Promise<void>;
407
- logout: () => void;
408
- isLoading: boolean;
409
- }
410
-
411
- const AuthContext = createContext<AuthContextValue | null>(null);
412
-
413
- export function AuthProvider({ children }: { children: React.ReactNode }) {
414
- const [user, setUser] = useState<User | null>(null);
415
- const [isLoading, setIsLoading] = useState(true);
416
-
417
- useEffect(() => {
418
- checkSession().then(setUser).finally(() => setIsLoading(false));
419
- }, []);
420
-
421
- const login = async (credentials: Credentials) => {
422
- const user = await authApi.login(credentials);
423
- setUser(user);
424
- };
425
-
426
- const logout = () => {
427
- authApi.logout();
428
- setUser(null);
429
- };
430
-
431
- return (
432
- <AuthContext value={{ user, login, logout, isLoading }}>
433
- {children}
434
- </AuthContext>
435
- );
436
- }
437
-
438
- export function useAuth(): AuthContextValue {
439
- const context = useContext(AuthContext);
440
- if (!context) {
441
- throw new Error('useAuth must be used within AuthProvider');
442
- }
443
- return context;
444
- }
445
- ```
446
-
447
- ### Virtualization for Long Lists
448
-
449
- ```tsx
450
- // CORRECT: Only render visible items
451
- import { FixedSizeList } from 'react-window';
452
-
453
- function VirtualizedList({ items }: { items: Item[] }) {
454
- return (
455
- <FixedSizeList
456
- height={400}
457
- width="100%"
458
- itemCount={items.length}
459
- itemSize={50}
460
- >
461
- {({ index, style }) => (
462
- <div style={style}>
463
- <ItemRow item={items[index]} />
464
- </div>
465
- )}
466
- </FixedSizeList>
467
- );
468
- }
469
- ```
470
-
471
- ### Lazy Loading Components
472
-
473
- ```tsx
474
- // CORRECT: Load heavy components on demand
475
- const HeavyComponent = lazy(() => import('./HeavyComponent'));
476
-
477
- function App() {
478
- return (
479
- <Suspense fallback={<Spinner />}>
480
- <HeavyComponent />
481
- </Suspense>
482
- );
483
- }
484
-
485
- // Lazy load on interaction
486
- function Dashboard() {
487
- const [showChart, setShowChart] = useState(false);
488
-
489
- return (
490
- <div>
491
- <button onClick={() => setShowChart(true)}>Show Chart</button>
492
- {showChart && (
493
- <Suspense fallback={<ChartSkeleton />}>
494
- <LazyChart />
495
- </Suspense>
496
- )}
497
- </div>
498
- );
499
- }
500
- ```
501
-
502
- ---
503
-
504
- ## Hooks Patterns
505
-
506
- ### Data Fetching Hook
507
-
508
- ```tsx
509
- // CORRECT: Reusable data fetching logic
510
- interface UseQueryResult<T> {
511
- data: T | undefined;
512
- isLoading: boolean;
513
- error: Error | undefined;
514
- refetch: () => void;
515
- }
516
-
517
- function useQuery<T>(url: string): UseQueryResult<T> {
518
- const [data, setData] = useState<T>();
519
- const [isLoading, setIsLoading] = useState(true);
520
- const [error, setError] = useState<Error>();
521
-
522
- const fetchData = useCallback(async () => {
523
- setIsLoading(true);
524
- setError(undefined);
525
- try {
526
- const response = await fetch(url);
527
- if (!response.ok) throw new Error('Failed to fetch');
528
- const json = await response.json();
529
- setData(json);
530
- } catch (e) {
531
- setError(e as Error);
532
- } finally {
533
- setIsLoading(false);
534
- }
535
- }, [url]);
536
-
537
- useEffect(() => {
538
- fetchData();
539
- }, [fetchData]);
540
-
541
- return { data, isLoading, error, refetch: fetchData };
542
- }
543
-
544
- // Usage
545
- function UserList() {
546
- const { data: users, isLoading, error, refetch } = useQuery<User[]>('/api/users');
547
-
548
- if (isLoading) return <Spinner />;
549
- if (error) return <Error message={error.message} onRetry={refetch} />;
550
-
551
- return <ul>{users?.map(user => <li key={user.id}>{user.name}</li>)}</ul>;
552
- }
553
- ```
554
-
555
- ### Debounced Value Hook
556
-
557
- ```tsx
558
- // CORRECT: Debounce rapid value changes
559
- function useDebouncedValue<T>(value: T, delayMs: number): T {
560
- const [debouncedValue, setDebouncedValue] = useState(value);
561
-
562
- useEffect(() => {
563
- const timer = setTimeout(() => {
564
- setDebouncedValue(value);
565
- }, delayMs);
566
-
567
- return () => clearTimeout(timer);
568
- }, [value, delayMs]);
569
-
570
- return debouncedValue;
571
- }
572
-
573
- // Usage
574
- function SearchInput() {
575
- const [query, setQuery] = useState('');
576
- const debouncedQuery = useDebouncedValue(query, 300);
577
-
578
- useEffect(() => {
579
- if (debouncedQuery) {
580
- searchApi(debouncedQuery);
581
- }
582
- }, [debouncedQuery]);
583
-
584
- return <input value={query} onChange={(e) => setQuery(e.target.value)} />;
585
- }
586
- ```
587
-
588
- ### Previous Value Hook
589
-
590
- ```tsx
591
- // CORRECT: Track previous value for comparisons
592
- function usePrevious<T>(value: T): T | undefined {
593
- const ref = useRef<T | undefined>(undefined);
594
-
595
- useEffect(() => {
596
- ref.current = value;
597
- }, [value]);
598
-
599
- return ref.current;
600
- }
601
-
602
- // Usage
603
- function Counter({ count }: { count: number }) {
604
- const prevCount = usePrevious(count);
605
-
606
- return (
607
- <div>
608
- Current: {count}, Previous: {prevCount ?? 'N/A'}
609
- </div>
610
- );
611
- }
612
- ```
613
-
614
- ### Toggle Hook
615
-
616
- ```tsx
617
- // CORRECT: Simple boolean state toggle
618
- function useToggle(initialValue = false): [boolean, () => void] {
619
- const [value, setValue] = useState(initialValue);
620
- const toggle = useCallback(() => setValue(v => !v), []);
621
- return [value, toggle];
622
- }
623
-
624
- // Usage
625
- function Modal() {
626
- const [isOpen, toggleOpen] = useToggle();
627
-
628
- return (
629
- <>
630
- <button onClick={toggleOpen}>Toggle Modal</button>
631
- {isOpen && <ModalContent onClose={toggleOpen} />}
632
- </>
633
- );
634
- }
635
- ```
636
-
637
- ### Media Query Hook
638
-
639
- ```tsx
640
- // CORRECT: Responsive component logic
641
- function useMediaQuery(query: string): boolean {
642
- const [matches, setMatches] = useState(
643
- () => window.matchMedia(query).matches
644
- );
645
-
646
- useEffect(() => {
647
- const mediaQuery = window.matchMedia(query);
648
- const handler = (event: MediaQueryListEvent) => setMatches(event.matches);
649
-
650
- mediaQuery.addEventListener('change', handler);
651
- return () => mediaQuery.removeEventListener('change', handler);
652
- }, [query]);
653
-
654
- return matches;
655
- }
656
-
657
- // Usage
658
- function ResponsiveComponent() {
659
- const isMobile = useMediaQuery('(max-width: 768px)');
660
-
661
- return isMobile ? <MobileLayout /> : <DesktopLayout />;
662
- }
663
- ```
664
-
665
- ### Click Outside Hook
666
-
667
- ```tsx
668
- // CORRECT: Detect clicks outside element
669
- function useClickOutside<T extends HTMLElement>(
670
- callback: () => void
671
- ): React.RefObject<T> {
672
- const ref = useRef<T>(null);
673
-
674
- useEffect(() => {
675
- const handleClick = (event: MouseEvent) => {
676
- if (ref.current && !ref.current.contains(event.target as Node)) {
677
- callback();
678
- }
679
- };
680
-
681
- document.addEventListener('mousedown', handleClick);
682
- return () => document.removeEventListener('mousedown', handleClick);
683
- }, [callback]);
684
-
685
- return ref;
686
- }
687
-
688
- // Usage
689
- function Dropdown() {
690
- const [isOpen, setIsOpen] = useState(false);
691
- const dropdownRef = useClickOutside<HTMLDivElement>(() => setIsOpen(false));
692
-
693
- return (
694
- <div ref={dropdownRef}>
695
- <button onClick={() => setIsOpen(true)}>Open</button>
696
- {isOpen && <DropdownMenu />}
697
- </div>
698
- );
699
- }
700
- ```
701
-
702
- ### Reducer for Complex State
703
-
704
- ```tsx
705
- // CORRECT: Manage complex state transitions
706
- interface FormState {
707
- values: Record<string, string>;
708
- errors: Record<string, string>;
709
- touched: Record<string, boolean>;
710
- isSubmitting: boolean;
711
- }
712
-
713
- type FormAction =
714
- | { type: 'SET_VALUE'; field: string; value: string }
715
- | { type: 'SET_ERROR'; field: string; error: string }
716
- | { type: 'SET_TOUCHED'; field: string }
717
- | { type: 'SUBMIT_START' }
718
- | { type: 'SUBMIT_END' }
719
- | { type: 'RESET' };
720
-
721
- function formReducer(state: FormState, action: FormAction): FormState {
722
- switch (action.type) {
723
- case 'SET_VALUE':
724
- return {
725
- ...state,
726
- values: { ...state.values, [action.field]: action.value },
727
- errors: { ...state.errors, [action.field]: '' },
728
- };
729
- case 'SET_ERROR':
730
- return {
731
- ...state,
732
- errors: { ...state.errors, [action.field]: action.error },
733
- };
734
- case 'SET_TOUCHED':
735
- return {
736
- ...state,
737
- touched: { ...state.touched, [action.field]: true },
738
- };
739
- case 'SUBMIT_START':
740
- return { ...state, isSubmitting: true };
741
- case 'SUBMIT_END':
742
- return { ...state, isSubmitting: false };
743
- case 'RESET':
744
- return initialFormState;
745
- default:
746
- return state;
747
- }
748
- }
749
-
750
- // Usage
751
- function useForm() {
752
- const [state, dispatch] = useReducer(formReducer, initialFormState);
753
-
754
- const setValue = (field: string, value: string) => {
755
- dispatch({ type: 'SET_VALUE', field, value });
756
- };
757
-
758
- const setTouched = (field: string) => {
759
- dispatch({ type: 'SET_TOUCHED', field });
760
- };
761
-
762
- return { ...state, setValue, setTouched };
763
- }
764
- ```
765
-
766
- ---
767
-
768
- ## Forms Patterns
769
-
770
- ### Controlled Form with Validation
771
-
772
- ```tsx
773
- // CORRECT: Full validation, accessibility, error display
774
- interface FormData {
775
- email: string;
776
- password: string;
777
- }
778
-
779
- function LoginForm({ onSubmit }: { onSubmit: (data: FormData) => void }) {
780
- const [formData, setFormData] = useState<FormData>({
781
- email: '',
782
- password: '',
783
- });
784
- const [errors, setErrors] = useState<Partial<FormData>>({});
785
-
786
- const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
787
- const { name, value } = e.target;
788
- setFormData((prev) => ({ ...prev, [name]: value }));
789
- setErrors((prev) => ({ ...prev, [name]: '' }));
790
- };
791
-
792
- const validate = (): boolean => {
793
- const newErrors: Partial<FormData> = {};
794
- if (!formData.email) newErrors.email = 'Email required';
795
- if (!formData.password) newErrors.password = 'Password required';
796
- setErrors(newErrors);
797
- return Object.keys(newErrors).length === 0;
798
- };
799
-
800
- const handleSubmit = (e: React.FormEvent) => {
801
- e.preventDefault();
802
- if (validate()) {
803
- onSubmit(formData);
804
- }
805
- };
806
-
807
- return (
808
- <form onSubmit={handleSubmit}>
809
- <div>
810
- <input
811
- name="email"
812
- type="email"
813
- value={formData.email}
814
- onChange={handleChange}
815
- aria-invalid={!!errors.email}
816
- />
817
- {errors.email && <span role="alert">{errors.email}</span>}
818
- </div>
819
- <div>
820
- <input
821
- name="password"
822
- type="password"
823
- value={formData.password}
824
- onChange={handleChange}
825
- aria-invalid={!!errors.password}
826
- />
827
- {errors.password && <span role="alert">{errors.password}</span>}
828
- </div>
829
- <button type="submit">Login</button>
830
- </form>
831
- );
832
- }
833
- ```
834
-
835
- ### Form with Validation Hook
836
-
837
- ```tsx
838
- // CORRECT: Reusable form handling logic
839
- interface UseFormOptions<T> {
840
- initialValues: T;
841
- validate: (values: T) => Partial<Record<keyof T, string>>;
842
- onSubmit: (values: T) => void | Promise<void>;
843
- }
844
-
845
- function useForm<T extends Record<string, unknown>>({
846
- initialValues,
847
- validate,
848
- onSubmit,
849
- }: UseFormOptions<T>) {
850
- const [values, setValues] = useState(initialValues);
851
- const [errors, setErrors] = useState<Partial<Record<keyof T, string>>>({});
852
- const [touched, setTouched] = useState<Partial<Record<keyof T, boolean>>>({});
853
- const [isSubmitting, setIsSubmitting] = useState(false);
854
-
855
- const handleChange = (name: keyof T) => (
856
- e: React.ChangeEvent<HTMLInputElement>
857
- ) => {
858
- setValues((prev) => ({ ...prev, [name]: e.target.value }));
859
- if (errors[name]) {
860
- setErrors((prev) => ({ ...prev, [name]: undefined }));
861
- }
862
- };
863
-
864
- const handleBlur = (name: keyof T) => () => {
865
- setTouched((prev) => ({ ...prev, [name]: true }));
866
- const fieldErrors = validate(values);
867
- if (fieldErrors[name]) {
868
- setErrors((prev) => ({ ...prev, [name]: fieldErrors[name] }));
869
- }
870
- };
871
-
872
- const handleSubmit = async (e: React.FormEvent) => {
873
- e.preventDefault();
874
- const validationErrors = validate(values);
875
- setErrors(validationErrors);
876
- setTouched(
877
- Object.keys(values).reduce(
878
- (acc, key) => ({ ...acc, [key]: true }),
879
- {} as Record<keyof T, boolean>
880
- )
881
- );
882
-
883
- if (Object.keys(validationErrors).length === 0) {
884
- setIsSubmitting(true);
885
- try {
886
- await onSubmit(values);
887
- } finally {
888
- setIsSubmitting(false);
889
- }
890
- }
891
- };
892
-
893
- const reset = () => {
894
- setValues(initialValues);
895
- setErrors({});
896
- setTouched({});
897
- };
898
-
899
- return {
900
- values,
901
- errors,
902
- touched,
903
- isSubmitting,
904
- handleChange,
905
- handleBlur,
906
- handleSubmit,
907
- reset,
908
- setValues,
909
- };
910
- }
911
-
912
- // Usage
913
- function SignupForm() {
914
- const form = useForm({
915
- initialValues: { name: '', email: '', password: '' },
916
- validate: (values) => {
917
- const errors: Partial<typeof values> = {};
918
- if (!values.name) errors.name = 'Name required';
919
- if (!values.email) errors.email = 'Email required';
920
- if (values.password.length < 8) errors.password = 'Min 8 characters';
921
- return errors;
922
- },
923
- onSubmit: async (values) => {
924
- await api.signup(values);
925
- },
926
- });
927
-
928
- return (
929
- <form onSubmit={form.handleSubmit}>
930
- <input
931
- value={form.values.name}
932
- onChange={form.handleChange('name')}
933
- onBlur={form.handleBlur('name')}
934
- />
935
- {form.touched.name && form.errors.name && (
936
- <span role="alert">{form.errors.name}</span>
937
- )}
938
- {/* ... other fields */}
939
- <button type="submit" disabled={form.isSubmitting}>
940
- {form.isSubmitting ? 'Submitting...' : 'Sign Up'}
941
- </button>
942
- </form>
943
- );
944
- }
945
- ```
946
-
947
- ### Multi-Step Form
948
-
949
- ```tsx
950
- // CORRECT: Manage state across form steps
951
- interface StepProps {
952
- next: () => void;
953
- prev: () => void;
954
- data: FormData;
955
- updateData: (updates: Partial<FormData>) => void;
956
- }
957
-
958
- function MultiStepForm() {
959
- const [step, setStep] = useState(0);
960
- const [data, setData] = useState<FormData>({
961
- name: '',
962
- email: '',
963
- address: '',
964
- payment: '',
965
- });
966
-
967
- const updateData = (updates: Partial<FormData>) => {
968
- setData((prev) => ({ ...prev, ...updates }));
969
- };
970
-
971
- const next = () => setStep((s) => Math.min(s + 1, steps.length - 1));
972
- const prev = () => setStep((s) => Math.max(s - 1, 0));
973
-
974
- const steps = [
975
- <PersonalInfo {...{ next, prev, data, updateData }} />,
976
- <AddressInfo {...{ next, prev, data, updateData }} />,
977
- <PaymentInfo {...{ next, prev, data, updateData }} />,
978
- <Confirmation {...{ next, prev, data, updateData }} />,
979
- ];
980
-
981
- return (
982
- <div>
983
- <StepIndicator current={step} total={steps.length} />
984
- {steps[step]}
985
- </div>
986
- );
987
- }
988
- ```
989
-
990
- ### Uncontrolled Form with FormData
991
-
992
- ```tsx
993
- // CORRECT: Use native FormData API
994
- function UncontrolledForm({ onSubmit }: { onSubmit: (data: FormData) => void }) {
995
- const formRef = useRef<HTMLFormElement>(null);
996
-
997
- const handleSubmit = (e: React.FormEvent) => {
998
- e.preventDefault();
999
- if (formRef.current) {
1000
- const formData = new FormData(formRef.current);
1001
- onSubmit(formData);
1002
- }
1003
- };
1004
-
1005
- return (
1006
- <form ref={formRef} onSubmit={handleSubmit}>
1007
- <input name="email" type="email" required />
1008
- <input name="password" type="password" required />
1009
- <button type="submit">Submit</button>
1010
- </form>
1011
- );
1012
- }
1013
- ```
1014
-
1015
- ---
1016
-
1017
- ## Error Handling Patterns
1018
-
1019
- ### Error Boundary Component
1020
-
1021
- ```tsx
1022
- // CORRECT: Catch render errors
1023
- interface ErrorBoundaryState {
1024
- hasError: boolean;
1025
- error: Error | null;
1026
- }
1027
-
1028
- class ErrorBoundary extends Component<
1029
- { children: React.ReactNode; fallback?: React.ReactNode },
1030
- ErrorBoundaryState
1031
- > {
1032
- state: ErrorBoundaryState = { hasError: false, error: null };
1033
-
1034
- static getDerivedStateFromError(error: Error): ErrorBoundaryState {
1035
- return { hasError: true, error };
1036
- }
1037
-
1038
- componentDidCatch(error: Error, info: ErrorInfo) {
1039
- console.error('Error caught:', error, info);
1040
- // Log to error reporting service
1041
- }
1042
-
1043
- render() {
1044
- if (this.state.hasError) {
1045
- return this.props.fallback ?? <DefaultErrorFallback error={this.state.error} />;
1046
- }
1047
- return this.props.children;
1048
- }
1049
- }
1050
-
1051
- // Usage
1052
- <ErrorBoundary fallback={<ErrorPage />}>
1053
- <App />
1054
- </ErrorBoundary>
1055
- ```
1056
-
1057
- ### Error Boundary with Reset
1058
-
1059
- ```tsx
1060
- // CORRECT: Allow recovery from errors
1061
- interface ErrorBoundaryProps {
1062
- children: React.ReactNode;
1063
- fallback?: (error: Error, reset: () => void) => React.ReactNode;
1064
- onError?: (error: Error, errorInfo: ErrorInfo) => void;
1065
- }
1066
-
1067
- class ResettableErrorBoundary extends Component<
1068
- ErrorBoundaryProps,
1069
- ErrorBoundaryState
1070
- > {
1071
- state: ErrorBoundaryState = { hasError: false, error: null };
1072
-
1073
- static getDerivedStateFromError(error: Error): ErrorBoundaryState {
1074
- return { hasError: true, error };
1075
- }
1076
-
1077
- componentDidCatch(error: Error, info: ErrorInfo) {
1078
- this.props.onError?.(error, info);
1079
- }
1080
-
1081
- reset = () => {
1082
- this.setState({ hasError: false, error: null });
1083
- };
1084
-
1085
- render() {
1086
- if (this.state.hasError && this.state.error) {
1087
- if (this.props.fallback) {
1088
- return this.props.fallback(this.state.error, this.reset);
1089
- }
1090
- return (
1091
- <div>
1092
- <h2>Something went wrong</h2>
1093
- <button onClick={this.reset}>Try again</button>
1094
- </div>
1095
- );
1096
- }
1097
- return this.props.children;
1098
- }
1099
- }
1100
-
1101
- // Usage
1102
- <ResettableErrorBoundary
1103
- fallback={(error, reset) => (
1104
- <div>
1105
- <h2>Error: {error.message}</h2>
1106
- <button onClick={reset}>Retry</button>
1107
- </div>
1108
- )}
1109
- onError={(error) => logErrorToService(error)}
1110
- >
1111
- <App />
1112
- </ResettableErrorBoundary>
1113
- ```
1114
-
1115
- ### Async Error Handling Hook
1116
-
1117
- ```tsx
1118
- // CORRECT: Handle async operation states
1119
- interface UseAsyncState<T> {
1120
- data: T | null;
1121
- error: Error | null;
1122
- isLoading: boolean;
1123
- }
1124
-
1125
- function useAsync<T>(
1126
- asyncFn: () => Promise<T>,
1127
- deps: unknown[] = []
1128
- ): UseAsyncState<T> & { execute: () => Promise<void> } {
1129
- const [state, setState] = useState<UseAsyncState<T>>({
1130
- data: null,
1131
- error: null,
1132
- isLoading: false,
1133
- });
1134
-
1135
- const execute = useCallback(async () => {
1136
- setState({ data: null, error: null, isLoading: true });
1137
- try {
1138
- const result = await asyncFn();
1139
- setState({ data: result, error: null, isLoading: false });
1140
- } catch (error) {
1141
- setState({ data: null, error: error as Error, isLoading: false });
1142
- }
1143
- }, deps);
1144
-
1145
- return { ...state, execute };
1146
- }
1147
-
1148
- // Usage
1149
- function DataComponent() {
1150
- const { data, error, isLoading, execute } = useAsync(
1151
- () => fetchData(),
1152
- []
1153
- );
1154
-
1155
- useEffect(() => {
1156
- execute();
1157
- }, [execute]);
1158
-
1159
- if (isLoading) return <Spinner />;
1160
- if (error) return <ErrorMessage error={error} onRetry={execute} />;
1161
- if (!data) return null;
1162
-
1163
- return <DataDisplay data={data} />;
1164
- }
1165
- ```
1166
-
1167
- ### Error Fallback Components
1168
-
1169
- ```tsx
1170
- // CORRECT: Reusable error display components
1171
- interface ErrorFallbackProps {
1172
- error: Error;
1173
- onRetry?: () => void;
1174
- }
1175
-
1176
- function ErrorFallback({ error, onRetry }: ErrorFallbackProps) {
1177
- return (
1178
- <div role="alert" className="error-fallback">
1179
- <h2>Something went wrong</h2>
1180
- <pre>{error.message}</pre>
1181
- {onRetry && (
1182
- <button onClick={onRetry}>Try again</button>
1183
- )}
1184
- </div>
1185
- );
1186
- }
1187
-
1188
- function NetworkErrorFallback({ error, onRetry }: ErrorFallbackProps) {
1189
- const isNetworkError = error.message.includes('network') ||
1190
- error.message.includes('fetch');
1191
-
1192
- return (
1193
- <div role="alert" className="network-error">
1194
- <h2>{isNetworkError ? 'Connection Error' : 'Error'}</h2>
1195
- <p>
1196
- {isNetworkError
1197
- ? 'Please check your internet connection'
1198
- : error.message}
1199
- </p>
1200
- {onRetry && (
1201
- <button onClick={onRetry}>Retry</button>
1202
- )}
1203
- </div>
1204
- );
1205
- }
1206
- ```
1207
-
1208
- ### Scoped Error Boundaries
1209
-
1210
- ```tsx
1211
- // CORRECT: Isolate failures to feature boundaries
1212
- function App() {
1213
- return (
1214
- <div>
1215
- <Header />
1216
- <main>
1217
- <ErrorBoundary fallback={<SidebarError />}>
1218
- <Sidebar />
1219
- </ErrorBoundary>
1220
- <ErrorBoundary fallback={<ContentError />}>
1221
- <MainContent />
1222
- </ErrorBoundary>
1223
- </main>
1224
- <Footer />
1225
- </div>
1226
- );
1227
- }
1228
- ```
1229
-
1230
- ---
1231
-
1232
- ## Performance Patterns
1233
-
1234
- ### Memoized Callbacks
1235
-
1236
- ```tsx
1237
- // CORRECT: Stable function references for child components
1238
- function UserList({ users, onSelect }: Props) {
1239
- const handleSelect = useCallback((userId: string) => {
1240
- onSelect(userId);
1241
- }, [onSelect]);
1242
-
1243
- return <List items={users} onSelect={handleSelect} />;
1244
- }
1245
- ```
1246
-
1247
- ### Memoized Computed Values
1248
-
1249
- ```tsx
1250
- // CORRECT: Cache expensive computations
1251
- function Dashboard({ data }: { data: DataPoint[] }) {
1252
- const stats = useMemo(() => computeExpensiveStats(data), [data]);
1253
- const chartData = useMemo(() => transformForChart(data), [data]);
1254
-
1255
- return (
1256
- <div>
1257
- <Stats data={stats} />
1258
- <Chart data={chartData} />
1259
- </div>
1260
- );
1261
- }
1262
- ```
1263
-
1264
- ### Component Memoization
1265
-
1266
- ```tsx
1267
- // CORRECT: Skip re-render when props unchanged
1268
- const UserCard = memo(function UserCard({ user }: { user: User }) {
1269
- return (
1270
- <div>
1271
- <h3>{user.name}</h3>
1272
- <p>{user.email}</p>
1273
- </div>
1274
- );
1275
- });
1276
- ```
1277
-
1278
- ### Derived State Instead of Effect
1279
-
1280
- ```tsx
1281
- // CORRECT: Compute during render, not in effect
1282
- function ProductList({ products, filter }: Props) {
1283
- const filteredProducts = useMemo(
1284
- () => products.filter(p => p.category === filter),
1285
- [products, filter]
1286
- );
1287
-
1288
- return <List items={filteredProducts} />;
1289
- }
1290
- ```
1291
-
1292
- ### Effect Cleanup
1293
-
1294
- ```tsx
1295
- // CORRECT: Always clean up subscriptions
1296
- function WindowSize() {
1297
- const [size, setSize] = useState({ width: 0, height: 0 });
1298
-
1299
- useEffect(() => {
1300
- const handleResize = () => {
1301
- setSize({ width: window.innerWidth, height: window.innerHeight });
1302
- };
1303
-
1304
- window.addEventListener('resize', handleResize);
1305
- return () => window.removeEventListener('resize', handleResize);
1306
- }, []);
1307
-
1308
- return <span>{size.width} x {size.height}</span>;
1309
- }
1310
- ```
1311
-
1312
- ### Debounced Search
1313
-
1314
- ```tsx
1315
- // CORRECT: Throttle expensive operations
1316
- function SearchInput({ onSearch }: { onSearch: (term: string) => void }) {
1317
- const [value, setValue] = useState('');
1318
-
1319
- const debouncedSearch = useMemo(
1320
- () => debounce((term: string) => onSearch(term), 300),
1321
- [onSearch]
1322
- );
1323
-
1324
- const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
1325
- setValue(e.target.value);
1326
- debouncedSearch(e.target.value);
1327
- };
1328
-
1329
- return <input value={value} onChange={handleChange} />;
1330
- }
1331
- ```