@ketecode/loom 0.0.0-stage → 0.2.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 (851) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +616 -2
  3. package/agents/accessibility-reviewer/AGENT.md +70 -0
  4. package/agents/accessibility-reviewer/evals/triggers.json +15 -0
  5. package/agents/agent-evaluator/AGENT.md +74 -0
  6. package/agents/agent-evaluator/evals/triggers.json +15 -0
  7. package/agents/architect/AGENT.md +82 -0
  8. package/agents/architect/evals/triggers.json +17 -0
  9. package/agents/billing-reviewer/AGENT.md +68 -0
  10. package/agents/billing-reviewer/evals/triggers.json +16 -0
  11. package/agents/code-reviewer/AGENT.md +51 -0
  12. package/agents/code-reviewer/evals/behavior.json +60 -0
  13. package/agents/code-reviewer/evals/triggers.json +14 -0
  14. package/agents/code-simplifier/AGENT.md +74 -0
  15. package/agents/code-simplifier/evals/triggers.json +15 -0
  16. package/agents/cpp-build-resolver/AGENT.md +73 -0
  17. package/agents/cpp-build-resolver/evals/triggers.json +16 -0
  18. package/agents/cpp-reviewer/AGENT.md +59 -0
  19. package/agents/cpp-reviewer/evals/triggers.json +16 -0
  20. package/agents/csharp-build-resolver/AGENT.md +84 -0
  21. package/agents/csharp-build-resolver/evals/triggers.json +17 -0
  22. package/agents/csharp-reviewer/AGENT.md +88 -0
  23. package/agents/csharp-reviewer/evals/triggers.json +17 -0
  24. package/agents/dart-build-resolver/AGENT.md +80 -0
  25. package/agents/dart-build-resolver/evals/triggers.json +17 -0
  26. package/agents/dart-reviewer/AGENT.md +66 -0
  27. package/agents/dart-reviewer/evals/triggers.json +17 -0
  28. package/agents/database-reviewer/AGENT.md +72 -0
  29. package/agents/database-reviewer/evals/triggers.json +16 -0
  30. package/agents/django-reviewer/AGENT.md +61 -0
  31. package/agents/django-reviewer/evals/triggers.json +15 -0
  32. package/agents/doc-updater/AGENT.md +92 -0
  33. package/agents/doc-updater/evals/triggers.json +14 -0
  34. package/agents/e2e-runner/AGENT.md +88 -0
  35. package/agents/e2e-runner/evals/triggers.json +16 -0
  36. package/agents/fastapi-reviewer/AGENT.md +63 -0
  37. package/agents/fastapi-reviewer/evals/triggers.json +15 -0
  38. package/agents/flutter-reviewer/AGENT.md +70 -0
  39. package/agents/flutter-reviewer/evals/triggers.json +15 -0
  40. package/agents/fsharp-build-resolver/AGENT.md +81 -0
  41. package/agents/fsharp-build-resolver/evals/triggers.json +15 -0
  42. package/agents/fsharp-reviewer/AGENT.md +77 -0
  43. package/agents/fsharp-reviewer/evals/triggers.json +15 -0
  44. package/agents/go-build-resolver/AGENT.md +85 -0
  45. package/agents/go-build-resolver/evals/triggers.json +16 -0
  46. package/agents/go-reviewer/AGENT.md +66 -0
  47. package/agents/go-reviewer/evals/triggers.json +16 -0
  48. package/agents/healthcare-reviewer/AGENT.md +65 -0
  49. package/agents/healthcare-reviewer/evals/triggers.json +16 -0
  50. package/agents/i18n-reviewer/AGENT.md +64 -0
  51. package/agents/i18n-reviewer/evals/triggers.json +16 -0
  52. package/agents/inbox-triager/AGENT.md +98 -0
  53. package/agents/inbox-triager/evals/triggers.json +16 -0
  54. package/agents/infra-reviewer/AGENT.md +93 -0
  55. package/agents/infra-reviewer/evals/triggers.json +15 -0
  56. package/agents/java-build-resolver/AGENT.md +82 -0
  57. package/agents/java-build-resolver/evals/triggers.json +16 -0
  58. package/agents/java-reviewer/AGENT.md +64 -0
  59. package/agents/java-reviewer/evals/triggers.json +16 -0
  60. package/agents/kotlin-build-resolver/AGENT.md +89 -0
  61. package/agents/kotlin-build-resolver/evals/triggers.json +16 -0
  62. package/agents/kotlin-reviewer/AGENT.md +75 -0
  63. package/agents/kotlin-reviewer/evals/triggers.json +16 -0
  64. package/agents/mle-reviewer/AGENT.md +68 -0
  65. package/agents/mle-reviewer/evals/triggers.json +16 -0
  66. package/agents/network-config-reviewer/AGENT.md +68 -0
  67. package/agents/network-config-reviewer/evals/triggers.json +17 -0
  68. package/agents/payments-reviewer/AGENT.md +64 -0
  69. package/agents/payments-reviewer/evals/triggers.json +16 -0
  70. package/agents/performance-optimizer/AGENT.md +86 -0
  71. package/agents/performance-optimizer/evals/triggers.json +16 -0
  72. package/agents/perl-build-resolver/AGENT.md +84 -0
  73. package/agents/perl-build-resolver/evals/triggers.json +15 -0
  74. package/agents/perl-reviewer/AGENT.md +77 -0
  75. package/agents/perl-reviewer/evals/triggers.json +15 -0
  76. package/agents/php-build-resolver/AGENT.md +88 -0
  77. package/agents/php-build-resolver/evals/triggers.json +16 -0
  78. package/agents/php-reviewer/AGENT.md +61 -0
  79. package/agents/php-reviewer/evals/triggers.json +15 -0
  80. package/agents/planner/AGENT.md +75 -0
  81. package/agents/planner/evals/triggers.json +17 -0
  82. package/agents/pr-test-analyzer/AGENT.md +82 -0
  83. package/agents/pr-test-analyzer/evals/triggers.json +16 -0
  84. package/agents/python-build-resolver/AGENT.md +87 -0
  85. package/agents/python-build-resolver/evals/triggers.json +16 -0
  86. package/agents/python-reviewer/AGENT.md +63 -0
  87. package/agents/python-reviewer/evals/triggers.json +15 -0
  88. package/agents/rag-reviewer/AGENT.md +71 -0
  89. package/agents/rag-reviewer/evals/triggers.json +16 -0
  90. package/agents/react-reviewer/AGENT.md +70 -0
  91. package/agents/react-reviewer/evals/triggers.json +16 -0
  92. package/agents/refactor-cleaner/AGENT.md +82 -0
  93. package/agents/refactor-cleaner/evals/triggers.json +16 -0
  94. package/agents/ruby-build-resolver/AGENT.md +93 -0
  95. package/agents/ruby-build-resolver/evals/triggers.json +16 -0
  96. package/agents/ruby-reviewer/AGENT.md +62 -0
  97. package/agents/ruby-reviewer/evals/triggers.json +16 -0
  98. package/agents/rust-build-resolver/AGENT.md +98 -0
  99. package/agents/rust-build-resolver/evals/triggers.json +16 -0
  100. package/agents/rust-reviewer/AGENT.md +78 -0
  101. package/agents/rust-reviewer/evals/triggers.json +15 -0
  102. package/agents/security-reviewer/AGENT.md +84 -0
  103. package/agents/security-reviewer/evals/triggers.json +16 -0
  104. package/agents/silent-failure-hunter/AGENT.md +66 -0
  105. package/agents/silent-failure-hunter/evals/triggers.json +16 -0
  106. package/agents/solidity-reviewer/AGENT.md +70 -0
  107. package/agents/solidity-reviewer/evals/triggers.json +16 -0
  108. package/agents/spec-reviewer/AGENT.md +95 -0
  109. package/agents/spec-reviewer/evals/behavior.json +57 -0
  110. package/agents/spec-reviewer/evals/triggers.json +16 -0
  111. package/agents/swift-build-resolver/AGENT.md +85 -0
  112. package/agents/swift-build-resolver/evals/triggers.json +15 -0
  113. package/agents/swift-reviewer/AGENT.md +75 -0
  114. package/agents/swift-reviewer/evals/triggers.json +15 -0
  115. package/agents/task-implementer/AGENT.md +89 -0
  116. package/agents/task-implementer/evals/behavior.json +47 -0
  117. package/agents/task-implementer/evals/triggers.json +16 -0
  118. package/agents/typescript-build-resolver/AGENT.md +76 -0
  119. package/agents/typescript-build-resolver/evals/triggers.json +15 -0
  120. package/agents/typescript-reviewer/AGENT.md +76 -0
  121. package/agents/typescript-reviewer/evals/triggers.json +15 -0
  122. package/agents/vue-reviewer/AGENT.md +75 -0
  123. package/agents/vue-reviewer/evals/triggers.json +15 -0
  124. package/bin/kete-loom.js +723 -0
  125. package/commands/aside.md +19 -0
  126. package/commands/brainstorm.md +25 -0
  127. package/commands/build-fix.md +26 -0
  128. package/commands/campaign.md +19 -0
  129. package/commands/changelog.md +36 -0
  130. package/commands/checkpoint.md +26 -0
  131. package/commands/codemap.md +25 -0
  132. package/commands/commit.md +26 -0
  133. package/commands/debug.md +27 -0
  134. package/commands/deps-audit.md +32 -0
  135. package/commands/dual-review.md +34 -0
  136. package/commands/epic-decompose.md +21 -0
  137. package/commands/explain.md +37 -0
  138. package/commands/feature-dev.md +23 -0
  139. package/commands/finish-branch.md +26 -0
  140. package/commands/fix-bug.md +38 -0
  141. package/commands/hookify.md +23 -0
  142. package/commands/i18n-check.md +39 -0
  143. package/commands/issue-sync.md +22 -0
  144. package/commands/jira.md +19 -0
  145. package/commands/learn.md +23 -0
  146. package/commands/loom.md +21 -0
  147. package/commands/loop.md +20 -0
  148. package/commands/model-route.md +27 -0
  149. package/commands/onboard.md +35 -0
  150. package/commands/orchestrate.md +21 -0
  151. package/commands/plan-feature.md +36 -0
  152. package/commands/postmortem.md +42 -0
  153. package/commands/pr-describe.md +39 -0
  154. package/commands/pr.md +22 -0
  155. package/commands/prd.md +41 -0
  156. package/commands/production-readiness.md +45 -0
  157. package/commands/project-init.md +21 -0
  158. package/commands/refactor-clean.md +24 -0
  159. package/commands/resume-session.md +22 -0
  160. package/commands/review.md +35 -0
  161. package/commands/save-session.md +37 -0
  162. package/commands/security-scan.md +32 -0
  163. package/commands/sessions.md +21 -0
  164. package/commands/skill-create.md +21 -0
  165. package/commands/tdd.md +36 -0
  166. package/commands/test-coverage.md +24 -0
  167. package/commands/threat-model.md +36 -0
  168. package/commands/update-docs.md +25 -0
  169. package/commands/usage-report.md +43 -0
  170. package/commands/verify.md +21 -0
  171. package/hooks/block-dangerous-commands/HOOK.md +30 -0
  172. package/hooks/block-dangerous-commands/cases.json +50 -0
  173. package/hooks/block-dangerous-commands/hook.js +75 -0
  174. package/hooks/block-foreground-servers/HOOK.md +34 -0
  175. package/hooks/block-foreground-servers/cases.json +31 -0
  176. package/hooks/block-foreground-servers/hook.js +41 -0
  177. package/hooks/block-no-verify/HOOK.md +25 -0
  178. package/hooks/block-no-verify/cases.json +30 -0
  179. package/hooks/block-no-verify/hook.js +43 -0
  180. package/hooks/capture-lessons/HOOK.md +24 -0
  181. package/hooks/capture-lessons/hook.js +48 -0
  182. package/hooks/format-on-edit/HOOK.md +24 -0
  183. package/hooks/format-on-edit/hook.js +89 -0
  184. package/hooks/guard-secrets/HOOK.md +19 -0
  185. package/hooks/guard-secrets/cases.json +110 -0
  186. package/hooks/guard-secrets/hook.js +44 -0
  187. package/hooks/load-session-context/HOOK.md +20 -0
  188. package/hooks/load-session-context/hook.js +56 -0
  189. package/hooks/notify-on-stop/HOOK.md +25 -0
  190. package/hooks/notify-on-stop/hook.js +27 -0
  191. package/hooks/protect-files/HOOK.md +24 -0
  192. package/hooks/protect-files/cases.json +27 -0
  193. package/hooks/protect-files/hook.js +39 -0
  194. package/hooks/protect-lint-config/HOOK.md +29 -0
  195. package/hooks/protect-lint-config/cases.json +18 -0
  196. package/hooks/protect-lint-config/fixtures/.eslintrc.json +1 -0
  197. package/hooks/protect-lint-config/fixtures/.golangci.yml +1 -0
  198. package/hooks/protect-lint-config/fixtures/.prettierrc +1 -0
  199. package/hooks/protect-lint-config/fixtures/.rubocop.yml +1 -0
  200. package/hooks/protect-lint-config/fixtures/biome.json +1 -0
  201. package/hooks/protect-lint-config/fixtures/eslint.config.mjs +1 -0
  202. package/hooks/protect-lint-config/fixtures/ruff.toml +1 -0
  203. package/hooks/protect-lint-config/hook.js +25 -0
  204. package/hooks/read-before-edit/HOOK.md +26 -0
  205. package/hooks/read-before-edit/cases.json +15 -0
  206. package/hooks/read-before-edit/hook.js +50 -0
  207. package/hooks/run.js +148 -0
  208. package/hooks/verify-before-stop/HOOK.md +32 -0
  209. package/hooks/verify-before-stop/hook.js +70 -0
  210. package/mcp/atlassian.json +11 -0
  211. package/mcp/chrome-devtools.json +18 -0
  212. package/mcp/clickhouse.json +11 -0
  213. package/mcp/cloudflare.json +11 -0
  214. package/mcp/context7.json +11 -0
  215. package/mcp/exa.json +11 -0
  216. package/mcp/fetch.json +17 -0
  217. package/mcp/figma.json +11 -0
  218. package/mcp/firecrawl.json +11 -0
  219. package/mcp/git.json +17 -0
  220. package/mcp/github.json +11 -0
  221. package/mcp/linear.json +11 -0
  222. package/mcp/memory.json +18 -0
  223. package/mcp/notion.json +11 -0
  224. package/mcp/playwright.json +18 -0
  225. package/mcp/sentry.json +11 -0
  226. package/mcp/stripe.json +11 -0
  227. package/mcp/supabase.json +11 -0
  228. package/mcp/time.json +17 -0
  229. package/mcp/vercel.json +11 -0
  230. package/package.json +61 -4
  231. package/profiles.json +214 -0
  232. package/rules/common.md +21 -0
  233. package/rules/cpp.md +29 -0
  234. package/rules/csharp.md +25 -0
  235. package/rules/dart.md +29 -0
  236. package/rules/fsharp.md +28 -0
  237. package/rules/git.md +26 -0
  238. package/rules/go.md +29 -0
  239. package/rules/java.md +29 -0
  240. package/rules/kotlin.md +27 -0
  241. package/rules/perl.md +26 -0
  242. package/rules/php.md +28 -0
  243. package/rules/python.md +30 -0
  244. package/rules/ruby.md +27 -0
  245. package/rules/rust.md +26 -0
  246. package/rules/security.md +29 -0
  247. package/rules/swift.md +28 -0
  248. package/rules/testing.md +25 -0
  249. package/rules/typescript.md +29 -0
  250. package/rules/use-skills.md +23 -0
  251. package/schemas/skill-frontmatter.schema.json +52 -0
  252. package/scripts/lib/audit.js +96 -0
  253. package/scripts/lib/behavior.js +52 -0
  254. package/scripts/lib/frontmatter.js +65 -0
  255. package/scripts/lib/hooks-install.js +294 -0
  256. package/scripts/lib/i18n.js +51 -0
  257. package/scripts/lib/inventory.js +85 -0
  258. package/scripts/lib/lint.js +180 -0
  259. package/scripts/lib/mcp-install.js +288 -0
  260. package/scripts/lib/profiles.js +128 -0
  261. package/scripts/lib/render.js +92 -0
  262. package/scripts/lib/rules-install.js +118 -0
  263. package/scripts/lib/skills.js +87 -0
  264. package/scripts/lib/targets.js +123 -0
  265. package/skills/accounting-api-integration/SKILL.md +81 -0
  266. package/skills/accounting-api-integration/evals/triggers.json +17 -0
  267. package/skills/accounting-api-integration/references/quickbooks.md +48 -0
  268. package/skills/accounting-api-integration/references/xero.md +45 -0
  269. package/skills/agent-failure-debugging/SKILL.md +92 -0
  270. package/skills/agent-failure-debugging/evals/triggers.json +16 -0
  271. package/skills/agent-harness-design/SKILL.md +125 -0
  272. package/skills/agent-harness-design/evals/triggers.json +21 -0
  273. package/skills/agent-outbound-messaging/SKILL.md +92 -0
  274. package/skills/agent-outbound-messaging/evals/triggers.json +16 -0
  275. package/skills/agent-security/SKILL.md +117 -0
  276. package/skills/agent-security/evals/triggers.json +16 -0
  277. package/skills/agent-security/references/host-configs.md +37 -0
  278. package/skills/ai-media-generation/SKILL.md +89 -0
  279. package/skills/ai-media-generation/evals/triggers.json +16 -0
  280. package/skills/ai-media-generation/references/job-pipeline.md +76 -0
  281. package/skills/angular-patterns/SKILL.md +122 -0
  282. package/skills/angular-patterns/evals/triggers.json +16 -0
  283. package/skills/api-client-integration/SKILL.md +86 -0
  284. package/skills/api-client-integration/evals/triggers.json +16 -0
  285. package/skills/api-client-integration/references/resilience.md +57 -0
  286. package/skills/api-design/SKILL.md +96 -0
  287. package/skills/api-design/evals/triggers.json +18 -0
  288. package/skills/api-design/references/conventions.md +133 -0
  289. package/skills/architecture-decision-records/SKILL.md +98 -0
  290. package/skills/architecture-decision-records/evals/triggers.json +17 -0
  291. package/skills/article-writing/SKILL.md +108 -0
  292. package/skills/article-writing/evals/triggers.json +16 -0
  293. package/skills/aspnet-core-patterns/SKILL.md +149 -0
  294. package/skills/aspnet-core-patterns/evals/triggers.json +16 -0
  295. package/skills/auth-patterns/SKILL.md +104 -0
  296. package/skills/auth-patterns/evals/triggers.json +17 -0
  297. package/skills/auth-patterns/references/oauth-oidc.md +64 -0
  298. package/skills/autonomous-loops/SKILL.md +99 -0
  299. package/skills/autonomous-loops/evals/triggers.json +14 -0
  300. package/skills/aws-patterns/SKILL.md +91 -0
  301. package/skills/aws-patterns/evals/triggers.json +16 -0
  302. package/skills/azure-patterns/SKILL.md +86 -0
  303. package/skills/azure-patterns/evals/triggers.json +16 -0
  304. package/skills/benchmark-methodology/SKILL.md +88 -0
  305. package/skills/benchmark-methodology/evals/triggers.json +16 -0
  306. package/skills/benchmark-methodology/references/language-harnesses.md +130 -0
  307. package/skills/bgp-diagnostics/SKILL.md +84 -0
  308. package/skills/bgp-diagnostics/evals/triggers.json +18 -0
  309. package/skills/bgp-diagnostics/references/bgp-reference.md +81 -0
  310. package/skills/bioinformatics-workflows/SKILL.md +108 -0
  311. package/skills/bioinformatics-workflows/evals/triggers.json +16 -0
  312. package/skills/bioinformatics-workflows/references/commands.md +71 -0
  313. package/skills/bioinformatics-workflows/references/formats.md +24 -0
  314. package/skills/bioinformatics-workflows/references/workflow-managers.md +107 -0
  315. package/skills/blender-automation/SKILL.md +100 -0
  316. package/skills/blender-automation/evals/triggers.json +16 -0
  317. package/skills/blender-automation/references/batch-and-render.md +77 -0
  318. package/skills/blender-automation/references/bpy-inspection.md +91 -0
  319. package/skills/blender-automation/references/rig-and-retarget-checks.md +23 -0
  320. package/skills/brand-strategy/SKILL.md +83 -0
  321. package/skills/brand-strategy/evals/triggers.json +16 -0
  322. package/skills/brand-voice/SKILL.md +112 -0
  323. package/skills/brand-voice/evals/triggers.json +16 -0
  324. package/skills/browser-qa/SKILL.md +99 -0
  325. package/skills/browser-qa/evals/triggers.json +16 -0
  326. package/skills/bun-runtime/SKILL.md +93 -0
  327. package/skills/bun-runtime/evals/triggers.json +16 -0
  328. package/skills/change-impact-analysis/SKILL.md +89 -0
  329. package/skills/change-impact-analysis/evals/triggers.json +16 -0
  330. package/skills/change-impact-analysis/references/graph-commands.md +28 -0
  331. package/skills/cisco-ios-config/SKILL.md +101 -0
  332. package/skills/cisco-ios-config/evals/triggers.json +18 -0
  333. package/skills/cisco-ios-config/references/verification.md +63 -0
  334. package/skills/clickhouse-patterns/SKILL.md +101 -0
  335. package/skills/clickhouse-patterns/evals/triggers.json +18 -0
  336. package/skills/clickhouse-patterns/references/engines-and-views.md +138 -0
  337. package/skills/clinical-decision-support/SKILL.md +90 -0
  338. package/skills/clinical-decision-support/evals/triggers.json +16 -0
  339. package/skills/clinical-decision-support/references/cds-hooks.md +76 -0
  340. package/skills/clinical-decision-support/references/regulatory-boundaries.md +37 -0
  341. package/skills/code-tour/SKILL.md +97 -0
  342. package/skills/code-tour/evals/triggers.json +14 -0
  343. package/skills/codebase-onboarding/SKILL.md +112 -0
  344. package/skills/codebase-onboarding/evals/triggers.json +14 -0
  345. package/skills/cold-outreach-sequences/SKILL.md +90 -0
  346. package/skills/cold-outreach-sequences/evals/triggers.json +16 -0
  347. package/skills/content-repurposing/SKILL.md +82 -0
  348. package/skills/content-repurposing/evals/triggers.json +16 -0
  349. package/skills/context-budget/SKILL.md +84 -0
  350. package/skills/context-budget/evals/triggers.json +14 -0
  351. package/skills/contract-drafting/SKILL.md +96 -0
  352. package/skills/contract-drafting/evals/triggers.json +16 -0
  353. package/skills/contract-drafting/references/term-sheets.md +68 -0
  354. package/skills/contract-first-development/SKILL.md +86 -0
  355. package/skills/contract-first-development/evals/triggers.json +16 -0
  356. package/skills/contract-first-development/references/tooling.md +46 -0
  357. package/skills/conventional-commits/SKILL.md +144 -0
  358. package/skills/conventional-commits/evals/triggers.json +16 -0
  359. package/skills/cpp-patterns/SKILL.md +129 -0
  360. package/skills/cpp-patterns/evals/triggers.json +16 -0
  361. package/skills/cpp-patterns/references/cmake-and-tooling.md +88 -0
  362. package/skills/cpp-patterns/references/undefined-behaviour.md +75 -0
  363. package/skills/cpp-testing/SKILL.md +131 -0
  364. package/skills/cpp-testing/evals/triggers.json +16 -0
  365. package/skills/csharp-patterns/SKILL.md +110 -0
  366. package/skills/csharp-patterns/evals/triggers.json +17 -0
  367. package/skills/csharp-patterns/references/analyzers.md +59 -0
  368. package/skills/csharp-testing/SKILL.md +85 -0
  369. package/skills/csharp-testing/evals/triggers.json +17 -0
  370. package/skills/csharp-testing/references/integration-tests.md +77 -0
  371. package/skills/css-architecture/SKILL.md +143 -0
  372. package/skills/css-architecture/evals/triggers.json +16 -0
  373. package/skills/customs-trade-compliance/SKILL.md +95 -0
  374. package/skills/customs-trade-compliance/evals/triggers.json +16 -0
  375. package/skills/customs-trade-compliance/references/incoterms-2020.md +42 -0
  376. package/skills/dart-patterns/SKILL.md +157 -0
  377. package/skills/dart-patterns/evals/triggers.json +18 -0
  378. package/skills/dart-testing/SKILL.md +164 -0
  379. package/skills/dart-testing/evals/triggers.json +18 -0
  380. package/skills/data-analysis-notebooks/SKILL.md +113 -0
  381. package/skills/data-analysis-notebooks/evals/triggers.json +16 -0
  382. package/skills/data-analysis-notebooks/references/dataframe-pitfalls.md +49 -0
  383. package/skills/data-analysis-notebooks/references/statistics-pitfalls.md +24 -0
  384. package/skills/data-pipelines/SKILL.md +90 -0
  385. package/skills/data-pipelines/evals/triggers.json +16 -0
  386. package/skills/data-pipelines/references/orchestrators.md +64 -0
  387. package/skills/database-migrations/SKILL.md +102 -0
  388. package/skills/database-migrations/evals/triggers.json +16 -0
  389. package/skills/database-migrations/references/recipes.md +98 -0
  390. package/skills/database-migrations/references/tools.md +21 -0
  391. package/skills/dbt-patterns/SKILL.md +96 -0
  392. package/skills/dbt-patterns/evals/triggers.json +16 -0
  393. package/skills/dbt-patterns/references/yaml-examples.md +114 -0
  394. package/skills/decision-council/SKILL.md +98 -0
  395. package/skills/decision-council/evals/triggers.json +16 -0
  396. package/skills/deep-research/SKILL.md +107 -0
  397. package/skills/deep-research/evals/triggers.json +14 -0
  398. package/skills/dependency-audit/SKILL.md +103 -0
  399. package/skills/dependency-audit/evals/triggers.json +16 -0
  400. package/skills/dependency-audit/references/tools.md +124 -0
  401. package/skills/deployment-strategies/SKILL.md +108 -0
  402. package/skills/deployment-strategies/evals/triggers.json +16 -0
  403. package/skills/design-brainstorming/SKILL.md +132 -0
  404. package/skills/design-brainstorming/evals/behavior.json +55 -0
  405. package/skills/design-brainstorming/evals/triggers.json +16 -0
  406. package/skills/design-brainstorming/references/visual-mockups.md +34 -0
  407. package/skills/desktop-app-testing/SKILL.md +104 -0
  408. package/skills/desktop-app-testing/evals/triggers.json +16 -0
  409. package/skills/desktop-app-testing/references/drivers.md +81 -0
  410. package/skills/django-patterns/SKILL.md +123 -0
  411. package/skills/django-patterns/evals/triggers.json +16 -0
  412. package/skills/docker-patterns/SKILL.md +132 -0
  413. package/skills/docker-patterns/evals/triggers.json +16 -0
  414. package/skills/docker-patterns/references/dockerfiles.md +105 -0
  415. package/skills/document-processing/SKILL.md +100 -0
  416. package/skills/document-processing/evals/triggers.json +17 -0
  417. package/skills/document-processing/references/extraction-and-ocr.md +71 -0
  418. package/skills/document-processing/references/forms-and-conversion.md +69 -0
  419. package/skills/document-processing/references/redaction.md +61 -0
  420. package/skills/e2e-testing-playwright/SKILL.md +94 -0
  421. package/skills/e2e-testing-playwright/evals/triggers.json +16 -0
  422. package/skills/e2e-testing-playwright/references/config-and-ci.md +129 -0
  423. package/skills/ef-core-patterns/SKILL.md +117 -0
  424. package/skills/ef-core-patterns/evals/triggers.json +16 -0
  425. package/skills/email-deliverability/SKILL.md +99 -0
  426. package/skills/email-deliverability/evals/triggers.json +17 -0
  427. package/skills/email-deliverability/references/dns-records.md +85 -0
  428. package/skills/energy-procurement/SKILL.md +106 -0
  429. package/skills/energy-procurement/evals/triggers.json +16 -0
  430. package/skills/error-handling-patterns/SKILL.md +112 -0
  431. package/skills/error-handling-patterns/evals/triggers.json +18 -0
  432. package/skills/error-handling-patterns/references/language-idioms.md +49 -0
  433. package/skills/estimation-and-scoping/SKILL.md +97 -0
  434. package/skills/estimation-and-scoping/evals/triggers.json +14 -0
  435. package/skills/evm-dapp-integration/SKILL.md +73 -0
  436. package/skills/evm-dapp-integration/evals/triggers.json +16 -0
  437. package/skills/fastapi-patterns/SKILL.md +127 -0
  438. package/skills/fastapi-patterns/evals/triggers.json +16 -0
  439. package/skills/ffmpeg-media-processing/SKILL.md +94 -0
  440. package/skills/ffmpeg-media-processing/evals/triggers.json +16 -0
  441. package/skills/ffmpeg-media-processing/references/recipes.md +112 -0
  442. package/skills/fhir-integration/SKILL.md +81 -0
  443. package/skills/fhir-integration/evals/triggers.json +16 -0
  444. package/skills/fhir-integration/references/search-and-bundles.md +73 -0
  445. package/skills/fhir-integration/references/smart-on-fhir.md +50 -0
  446. package/skills/finishing-a-branch/SKILL.md +127 -0
  447. package/skills/finishing-a-branch/evals/behavior.json +49 -0
  448. package/skills/finishing-a-branch/evals/triggers.json +16 -0
  449. package/skills/flask-patterns/SKILL.md +132 -0
  450. package/skills/flask-patterns/evals/triggers.json +16 -0
  451. package/skills/flutter-patterns/SKILL.md +99 -0
  452. package/skills/flutter-patterns/evals/triggers.json +16 -0
  453. package/skills/flutterwave-integration/SKILL.md +75 -0
  454. package/skills/flutterwave-integration/evals/triggers.json +16 -0
  455. package/skills/flutterwave-integration/references/api.md +73 -0
  456. package/skills/flutterwave-integration/references/webhooks.md +49 -0
  457. package/skills/freight-carrier-management/SKILL.md +107 -0
  458. package/skills/freight-carrier-management/evals/triggers.json +16 -0
  459. package/skills/fsharp-patterns/SKILL.md +133 -0
  460. package/skills/fsharp-patterns/evals/triggers.json +16 -0
  461. package/skills/fsharp-testing/SKILL.md +136 -0
  462. package/skills/fsharp-testing/evals/triggers.json +16 -0
  463. package/skills/gcp-patterns/SKILL.md +86 -0
  464. package/skills/gcp-patterns/evals/triggers.json +16 -0
  465. package/skills/git-workflow/SKILL.md +114 -0
  466. package/skills/git-workflow/evals/triggers.json +16 -0
  467. package/skills/git-worktrees/SKILL.md +130 -0
  468. package/skills/git-worktrees/evals/behavior.json +56 -0
  469. package/skills/git-worktrees/evals/triggers.json +16 -0
  470. package/skills/github-actions-ci/SKILL.md +117 -0
  471. package/skills/github-actions-ci/evals/triggers.json +16 -0
  472. package/skills/github-api-automation/SKILL.md +101 -0
  473. package/skills/github-api-automation/evals/triggers.json +17 -0
  474. package/skills/go-patterns/SKILL.md +118 -0
  475. package/skills/go-patterns/evals/triggers.json +17 -0
  476. package/skills/go-patterns/references/concurrency.md +162 -0
  477. package/skills/go-testing/SKILL.md +154 -0
  478. package/skills/go-testing/evals/triggers.json +17 -0
  479. package/skills/google-workspace-integration/SKILL.md +65 -0
  480. package/skills/google-workspace-integration/evals/triggers.json +17 -0
  481. package/skills/google-workspace-integration/references/api.md +121 -0
  482. package/skills/harmonyos-arkts/SKILL.md +117 -0
  483. package/skills/harmonyos-arkts/evals/triggers.json +16 -0
  484. package/skills/harmonyos-arkts/references/build-errors.md +42 -0
  485. package/skills/hexagonal-architecture/SKILL.md +89 -0
  486. package/skills/hexagonal-architecture/evals/triggers.json +17 -0
  487. package/skills/hipaa-compliance/SKILL.md +91 -0
  488. package/skills/hipaa-compliance/evals/triggers.json +18 -0
  489. package/skills/hipaa-compliance/references/safeguards.md +68 -0
  490. package/skills/hl7v2-integration/SKILL.md +69 -0
  491. package/skills/hl7v2-integration/evals/triggers.json +16 -0
  492. package/skills/hl7v2-integration/references/messages-and-ack.md +78 -0
  493. package/skills/homelab-network-setup/SKILL.md +125 -0
  494. package/skills/homelab-network-setup/evals/triggers.json +18 -0
  495. package/skills/homelab-network-setup/references/firewall-and-dns.md +45 -0
  496. package/skills/homelab-network-setup/references/wireguard.md +72 -0
  497. package/skills/hubtel-integration/SKILL.md +77 -0
  498. package/skills/hubtel-integration/evals/triggers.json +16 -0
  499. package/skills/hubtel-integration/references/api.md +92 -0
  500. package/skills/i18n-localization/SKILL.md +114 -0
  501. package/skills/i18n-localization/evals/triggers.json +16 -0
  502. package/skills/i18n-localization/references/libraries.md +52 -0
  503. package/skills/implementation-plans/SKILL.md +117 -0
  504. package/skills/implementation-plans/evals/behavior.json +54 -0
  505. package/skills/implementation-plans/evals/triggers.json +16 -0
  506. package/skills/incident-postmortem/SKILL.md +118 -0
  507. package/skills/incident-postmortem/evals/triggers.json +14 -0
  508. package/skills/inventory-demand-planning/SKILL.md +89 -0
  509. package/skills/inventory-demand-planning/evals/triggers.json +16 -0
  510. package/skills/inventory-demand-planning/references/formulas.md +62 -0
  511. package/skills/investor-materials/SKILL.md +127 -0
  512. package/skills/investor-materials/evals/triggers.json +16 -0
  513. package/skills/investor-materials/references/templates.md +74 -0
  514. package/skills/invoicing-and-tax/SKILL.md +84 -0
  515. package/skills/invoicing-and-tax/evals/triggers.json +17 -0
  516. package/skills/invoicing-and-tax/references/e-invoicing.md +24 -0
  517. package/skills/invoicing-and-tax/references/invoice-fields.md +38 -0
  518. package/skills/invoicing-and-tax/references/rounding.md +26 -0
  519. package/skills/ios-platform-features/SKILL.md +99 -0
  520. package/skills/ios-platform-features/evals/triggers.json +16 -0
  521. package/skills/ios-platform-features/references/foundation-models.md +90 -0
  522. package/skills/java-patterns/SKILL.md +141 -0
  523. package/skills/java-patterns/evals/triggers.json +17 -0
  524. package/skills/java-testing/SKILL.md +142 -0
  525. package/skills/java-testing/evals/triggers.json +16 -0
  526. package/skills/jetpack-compose-patterns/SKILL.md +88 -0
  527. package/skills/jetpack-compose-patterns/evals/triggers.json +16 -0
  528. package/skills/jira-integration/SKILL.md +92 -0
  529. package/skills/jira-integration/evals/triggers.json +17 -0
  530. package/skills/jpa-hibernate/SKILL.md +92 -0
  531. package/skills/jpa-hibernate/evals/triggers.json +18 -0
  532. package/skills/jpa-hibernate/references/mapping.md +99 -0
  533. package/skills/jvm-sql-mappers/SKILL.md +98 -0
  534. package/skills/jvm-sql-mappers/evals/triggers.json +16 -0
  535. package/skills/jvm-sql-mappers/references/examples.md +129 -0
  536. package/skills/kotlin-multiplatform/SKILL.md +97 -0
  537. package/skills/kotlin-multiplatform/evals/triggers.json +16 -0
  538. package/skills/kotlin-patterns/SKILL.md +128 -0
  539. package/skills/kotlin-patterns/evals/triggers.json +16 -0
  540. package/skills/kotlin-testing/SKILL.md +117 -0
  541. package/skills/kotlin-testing/evals/triggers.json +16 -0
  542. package/skills/ktor-patterns/SKILL.md +135 -0
  543. package/skills/ktor-patterns/evals/triggers.json +18 -0
  544. package/skills/kubernetes-patterns/SKILL.md +106 -0
  545. package/skills/kubernetes-patterns/evals/triggers.json +16 -0
  546. package/skills/kubernetes-patterns/references/manifests.md +115 -0
  547. package/skills/laravel-patterns/SKILL.md +136 -0
  548. package/skills/laravel-patterns/evals/triggers.json +16 -0
  549. package/skills/linear-integration/SKILL.md +98 -0
  550. package/skills/linear-integration/evals/triggers.json +17 -0
  551. package/skills/literature-review/SKILL.md +109 -0
  552. package/skills/literature-review/evals/triggers.json +16 -0
  553. package/skills/literature-review/references/appraisal.md +41 -0
  554. package/skills/literature-review/references/search-sources.md +39 -0
  555. package/skills/llm-app-patterns/SKILL.md +97 -0
  556. package/skills/llm-app-patterns/evals/triggers.json +17 -0
  557. package/skills/llm-evals/SKILL.md +98 -0
  558. package/skills/llm-evals/evals/triggers.json +16 -0
  559. package/skills/llm-evals/references/graders.md +66 -0
  560. package/skills/logistics-exception-management/SKILL.md +90 -0
  561. package/skills/logistics-exception-management/evals/triggers.json +16 -0
  562. package/skills/manim-animations/SKILL.md +106 -0
  563. package/skills/manim-animations/evals/triggers.json +16 -0
  564. package/skills/market-research/SKILL.md +117 -0
  565. package/skills/market-research/evals/triggers.json +16 -0
  566. package/skills/marketing-campaign/SKILL.md +111 -0
  567. package/skills/marketing-campaign/evals/triggers.json +16 -0
  568. package/skills/mcp-server-patterns/SKILL.md +127 -0
  569. package/skills/mcp-server-patterns/evals/triggers.json +18 -0
  570. package/skills/mcp-server-patterns/references/protocol-notes.md +68 -0
  571. package/skills/metrics-dashboards/SKILL.md +113 -0
  572. package/skills/metrics-dashboards/evals/triggers.json +16 -0
  573. package/skills/ml-experiment-workflow/SKILL.md +125 -0
  574. package/skills/ml-experiment-workflow/evals/triggers.json +16 -0
  575. package/skills/mobile-accessibility/SKILL.md +94 -0
  576. package/skills/mobile-accessibility/evals/triggers.json +16 -0
  577. package/skills/mongodb-patterns/SKILL.md +115 -0
  578. package/skills/mongodb-patterns/evals/triggers.json +18 -0
  579. package/skills/mongodb-patterns/references/indexes-and-aggregation.md +94 -0
  580. package/skills/mpesa-daraja-integration/SKILL.md +70 -0
  581. package/skills/mpesa-daraja-integration/evals/triggers.json +16 -0
  582. package/skills/mpesa-daraja-integration/references/api.md +103 -0
  583. package/skills/mpesa-daraja-integration/references/callbacks.md +74 -0
  584. package/skills/mtn-momo-integration/SKILL.md +66 -0
  585. package/skills/mtn-momo-integration/evals/triggers.json +16 -0
  586. package/skills/mtn-momo-integration/references/api.md +153 -0
  587. package/skills/mtn-momo-integration/references/callbacks.md +92 -0
  588. package/skills/mtn-momo-integration/references/sandbox-and-go-live.md +51 -0
  589. package/skills/mtn-momo-integration/scripts/sandbox-setup.js +79 -0
  590. package/skills/mysql-patterns/SKILL.md +96 -0
  591. package/skills/mysql-patterns/evals/triggers.json +16 -0
  592. package/skills/mysql-patterns/references/explain.md +34 -0
  593. package/skills/mysql-patterns/references/online-ddl.md +41 -0
  594. package/skills/nestjs-patterns/SKILL.md +114 -0
  595. package/skills/nestjs-patterns/evals/triggers.json +16 -0
  596. package/skills/nestjs-patterns/references/testing.md +68 -0
  597. package/skills/network-automation/SKILL.md +107 -0
  598. package/skills/network-automation/evals/triggers.json +18 -0
  599. package/skills/network-automation/references/tool-snippets.md +153 -0
  600. package/skills/network-design/SKILL.md +98 -0
  601. package/skills/network-design/evals/triggers.json +16 -0
  602. package/skills/network-troubleshooting/SKILL.md +152 -0
  603. package/skills/network-troubleshooting/evals/triggers.json +18 -0
  604. package/skills/network-troubleshooting/references/commands.md +33 -0
  605. package/skills/nextjs-patterns/SKILL.md +150 -0
  606. package/skills/nextjs-patterns/evals/triggers.json +18 -0
  607. package/skills/nextjs-patterns/references/caching.md +87 -0
  608. package/skills/node-backend-patterns/SKILL.md +103 -0
  609. package/skills/node-backend-patterns/evals/triggers.json +16 -0
  610. package/skills/node-backend-patterns/references/templates.md +122 -0
  611. package/skills/nuxt-patterns/SKILL.md +103 -0
  612. package/skills/nuxt-patterns/evals/triggers.json +16 -0
  613. package/skills/observability/SKILL.md +125 -0
  614. package/skills/observability/evals/triggers.json +17 -0
  615. package/skills/observability/references/otel-setup.md +87 -0
  616. package/skills/observability/references/slo-alerts.md +70 -0
  617. package/skills/open-source-release/SKILL.md +107 -0
  618. package/skills/open-source-release/evals/triggers.json +15 -0
  619. package/skills/open-source-release/references/history-scrub.md +65 -0
  620. package/skills/parallel-agent-orchestration/SKILL.md +106 -0
  621. package/skills/parallel-agent-orchestration/evals/triggers.json +14 -0
  622. package/skills/patent-research/SKILL.md +94 -0
  623. package/skills/patent-research/evals/triggers.json +16 -0
  624. package/skills/patent-research/references/databases-and-queries.md +52 -0
  625. package/skills/paystack-integration/SKILL.md +59 -0
  626. package/skills/paystack-integration/evals/triggers.json +14 -0
  627. package/skills/paystack-integration/references/api.md +73 -0
  628. package/skills/paystack-integration/references/mobile-money.md +50 -0
  629. package/skills/paystack-integration/references/webhooks.md +80 -0
  630. package/skills/pci-dss-scope/SKILL.md +103 -0
  631. package/skills/pci-dss-scope/evals/triggers.json +18 -0
  632. package/skills/pci-dss-scope/references/saq-and-data.md +36 -0
  633. package/skills/perl-patterns/SKILL.md +135 -0
  634. package/skills/perl-patterns/evals/triggers.json +18 -0
  635. package/skills/perl-testing/SKILL.md +126 -0
  636. package/skills/perl-testing/evals/triggers.json +17 -0
  637. package/skills/php-patterns/SKILL.md +116 -0
  638. package/skills/php-patterns/evals/triggers.json +16 -0
  639. package/skills/php-testing/SKILL.md +123 -0
  640. package/skills/php-testing/evals/triggers.json +16 -0
  641. package/skills/postgres-patterns/SKILL.md +103 -0
  642. package/skills/postgres-patterns/evals/triggers.json +17 -0
  643. package/skills/postgres-patterns/references/explain.md +59 -0
  644. package/skills/postgres-patterns/references/locks.md +53 -0
  645. package/skills/prd-writing/SKILL.md +124 -0
  646. package/skills/prd-writing/evals/triggers.json +15 -0
  647. package/skills/prisma-patterns/SKILL.md +83 -0
  648. package/skills/prisma-patterns/evals/triggers.json +18 -0
  649. package/skills/prisma-patterns/references/prisma-8.md +46 -0
  650. package/skills/prisma-patterns/references/workflow.md +50 -0
  651. package/skills/privacy-compliance/SKILL.md +121 -0
  652. package/skills/privacy-compliance/evals/triggers.json +18 -0
  653. package/skills/privacy-compliance/references/jurisdictions.md +51 -0
  654. package/skills/production-scheduling/SKILL.md +98 -0
  655. package/skills/production-scheduling/evals/triggers.json +16 -0
  656. package/skills/prompt-engineering/SKILL.md +92 -0
  657. package/skills/prompt-engineering/evals/triggers.json +16 -0
  658. package/skills/prospect-research/SKILL.md +87 -0
  659. package/skills/prospect-research/evals/triggers.json +16 -0
  660. package/skills/python-app-distribution/SKILL.md +107 -0
  661. package/skills/python-app-distribution/evals/triggers.json +16 -0
  662. package/skills/python-app-distribution/references/pypi-trusted-publishing.md +55 -0
  663. package/skills/python-app-distribution/references/windows-macos-signing.md +70 -0
  664. package/skills/python-patterns/SKILL.md +107 -0
  665. package/skills/python-patterns/evals/triggers.json +16 -0
  666. package/skills/python-patterns/references/tooling.md +101 -0
  667. package/skills/python-testing/SKILL.md +126 -0
  668. package/skills/python-testing/evals/triggers.json +16 -0
  669. package/skills/python-testing/references/mocking.md +71 -0
  670. package/skills/pytorch-patterns/SKILL.md +139 -0
  671. package/skills/pytorch-patterns/evals/triggers.json +16 -0
  672. package/skills/pytorch-patterns/references/debugging.md +39 -0
  673. package/skills/quality-nonconformance/SKILL.md +107 -0
  674. package/skills/quality-nonconformance/evals/triggers.json +16 -0
  675. package/skills/quality-nonconformance/references/8d-and-capa.md +46 -0
  676. package/skills/quarkus-patterns/SKILL.md +93 -0
  677. package/skills/quarkus-patterns/evals/triggers.json +18 -0
  678. package/skills/rag-pipeline-patterns/SKILL.md +117 -0
  679. package/skills/rag-pipeline-patterns/evals/triggers.json +18 -0
  680. package/skills/rag-pipeline-patterns/references/evaluation.md +37 -0
  681. package/skills/rag-pipeline-patterns/references/retrieval-recipes.md +78 -0
  682. package/skills/rails-patterns/SKILL.md +132 -0
  683. package/skills/rails-patterns/evals/triggers.json +16 -0
  684. package/skills/react-native-patterns/SKILL.md +101 -0
  685. package/skills/react-native-patterns/evals/triggers.json +16 -0
  686. package/skills/react-patterns/SKILL.md +140 -0
  687. package/skills/react-patterns/evals/triggers.json +18 -0
  688. package/skills/react-performance/SKILL.md +107 -0
  689. package/skills/react-performance/evals/triggers.json +18 -0
  690. package/skills/react-testing/SKILL.md +121 -0
  691. package/skills/react-testing/evals/triggers.json +18 -0
  692. package/skills/react-testing/references/msw.md +64 -0
  693. package/skills/react-testing/references/queries.md +41 -0
  694. package/skills/react-testing/references/setup.md +74 -0
  695. package/skills/recommender-systems/SKILL.md +119 -0
  696. package/skills/recommender-systems/evals/triggers.json +16 -0
  697. package/skills/recommender-systems/references/evaluation.md +39 -0
  698. package/skills/redis-patterns/SKILL.md +109 -0
  699. package/skills/redis-patterns/evals/triggers.json +18 -0
  700. package/skills/redis-patterns/references/operations.md +61 -0
  701. package/skills/refactoring-safely/SKILL.md +107 -0
  702. package/skills/refactoring-safely/evals/behavior.json +57 -0
  703. package/skills/refactoring-safely/evals/triggers.json +17 -0
  704. package/skills/release-management/SKILL.md +141 -0
  705. package/skills/release-management/evals/triggers.json +16 -0
  706. package/skills/remotion-video/SKILL.md +91 -0
  707. package/skills/remotion-video/evals/triggers.json +16 -0
  708. package/skills/remotion-video/references/lambda.md +66 -0
  709. package/skills/reproducible-dev-environments/SKILL.md +132 -0
  710. package/skills/reproducible-dev-environments/evals/triggers.json +16 -0
  711. package/skills/responding-to-code-review/SKILL.md +124 -0
  712. package/skills/responding-to-code-review/evals/behavior.json +54 -0
  713. package/skills/responding-to-code-review/evals/triggers.json +16 -0
  714. package/skills/returns-reverse-logistics/SKILL.md +97 -0
  715. package/skills/returns-reverse-logistics/evals/triggers.json +16 -0
  716. package/skills/ruby-patterns/SKILL.md +127 -0
  717. package/skills/ruby-patterns/evals/triggers.json +18 -0
  718. package/skills/ruby-testing/SKILL.md +113 -0
  719. package/skills/ruby-testing/evals/triggers.json +18 -0
  720. package/skills/runbook-writing/SKILL.md +101 -0
  721. package/skills/runbook-writing/evals/triggers.json +14 -0
  722. package/skills/rust-patterns/SKILL.md +118 -0
  723. package/skills/rust-patterns/evals/triggers.json +16 -0
  724. package/skills/rust-patterns/references/cargo-and-clippy.md +105 -0
  725. package/skills/rust-patterns/references/errors-and-traits.md +97 -0
  726. package/skills/rust-testing/SKILL.md +148 -0
  727. package/skills/rust-testing/evals/triggers.json +16 -0
  728. package/skills/rust-testing/references/fakes-proptest-async.md +113 -0
  729. package/skills/search-first/SKILL.md +73 -0
  730. package/skills/search-first/evals/triggers.json +14 -0
  731. package/skills/security-review/SKILL.md +58 -0
  732. package/skills/security-review/evals/behavior.json +56 -0
  733. package/skills/security-review/evals/triggers.json +14 -0
  734. package/skills/security-review/references/checklist.md +54 -0
  735. package/skills/security-review/scripts/scan-secrets.js +79 -0
  736. package/skills/seo-audit/SKILL.md +111 -0
  737. package/skills/seo-audit/evals/triggers.json +16 -0
  738. package/skills/seo-audit/references/checks.md +65 -0
  739. package/skills/session-handoff/SKILL.md +101 -0
  740. package/skills/session-handoff/evals/behavior.json +55 -0
  741. package/skills/session-handoff/evals/triggers.json +14 -0
  742. package/skills/skill-authoring/SKILL.md +98 -0
  743. package/skills/skill-authoring/evals/triggers.json +15 -0
  744. package/skills/skill-authoring/references/frontmatter.md +40 -0
  745. package/skills/skill-authoring/references/pressure-testing.md +87 -0
  746. package/skills/slack-app-integration/SKILL.md +108 -0
  747. package/skills/slack-app-integration/evals/triggers.json +17 -0
  748. package/skills/slide-decks/SKILL.md +107 -0
  749. package/skills/slide-decks/evals/triggers.json +18 -0
  750. package/skills/slide-decks/references/html-decks.md +86 -0
  751. package/skills/slide-decks/references/layouts.md +45 -0
  752. package/skills/slide-decks/references/pptx.md +87 -0
  753. package/skills/smart-contract-security/SKILL.md +110 -0
  754. package/skills/smart-contract-security/evals/triggers.json +16 -0
  755. package/skills/smart-contract-security/references/vulnerability-checklist.md +79 -0
  756. package/skills/social-media-publishing/SKILL.md +84 -0
  757. package/skills/social-media-publishing/evals/triggers.json +17 -0
  758. package/skills/social-media-publishing/references/platform-apis.md +116 -0
  759. package/skills/solidity-patterns/SKILL.md +95 -0
  760. package/skills/solidity-patterns/evals/triggers.json +16 -0
  761. package/skills/spring-boot-patterns/SKILL.md +128 -0
  762. package/skills/spring-boot-patterns/evals/triggers.json +18 -0
  763. package/skills/spring-boot-patterns/references/testing.md +72 -0
  764. package/skills/stripe-integration/SKILL.md +69 -0
  765. package/skills/stripe-integration/evals/triggers.json +16 -0
  766. package/skills/stripe-integration/references/api.md +71 -0
  767. package/skills/stripe-integration/references/billing.md +58 -0
  768. package/skills/stripe-integration/references/webhooks.md +76 -0
  769. package/skills/subagent-driven-development/SKILL.md +109 -0
  770. package/skills/subagent-driven-development/evals/behavior.json +53 -0
  771. package/skills/subagent-driven-development/evals/triggers.json +15 -0
  772. package/skills/subagent-driven-development/references/implementer-brief.md +60 -0
  773. package/skills/subagent-driven-development/references/reviewer-briefs.md +52 -0
  774. package/skills/subscription-billing-ops/SKILL.md +118 -0
  775. package/skills/subscription-billing-ops/evals/triggers.json +17 -0
  776. package/skills/subscription-billing-ops/references/proration.md +47 -0
  777. package/skills/subscription-billing-ops/references/revenue-metrics.md +38 -0
  778. package/skills/svelte-patterns/SKILL.md +122 -0
  779. package/skills/svelte-patterns/evals/triggers.json +16 -0
  780. package/skills/swift-patterns/SKILL.md +113 -0
  781. package/skills/swift-patterns/evals/triggers.json +16 -0
  782. package/skills/swift-patterns/references/concurrency-migration.md +40 -0
  783. package/skills/swift-testing/SKILL.md +121 -0
  784. package/skills/swift-testing/evals/triggers.json +16 -0
  785. package/skills/swift-testing/references/swift-testing-cheatsheet.md +81 -0
  786. package/skills/swiftui-patterns/SKILL.md +102 -0
  787. package/skills/swiftui-patterns/evals/triggers.json +16 -0
  788. package/skills/systematic-debugging/SKILL.md +92 -0
  789. package/skills/systematic-debugging/evals/behavior.json +59 -0
  790. package/skills/systematic-debugging/evals/triggers.json +16 -0
  791. package/skills/systematic-debugging/references/condition-waiting.md +52 -0
  792. package/skills/systematic-debugging/references/root-cause-tracing.md +49 -0
  793. package/skills/systematic-debugging/references/test-pollution.md +46 -0
  794. package/skills/tdd-workflow/SKILL.md +69 -0
  795. package/skills/tdd-workflow/evals/behavior.json +55 -0
  796. package/skills/tdd-workflow/evals/triggers.json +15 -0
  797. package/skills/tdd-workflow/references/testing-anti-patterns.md +87 -0
  798. package/skills/technical-writing/SKILL.md +95 -0
  799. package/skills/technical-writing/evals/triggers.json +14 -0
  800. package/skills/terraform-patterns/SKILL.md +122 -0
  801. package/skills/terraform-patterns/evals/triggers.json +16 -0
  802. package/skills/terraform-patterns/references/backends.md +67 -0
  803. package/skills/test-coverage-improvement/SKILL.md +107 -0
  804. package/skills/test-coverage-improvement/evals/triggers.json +16 -0
  805. package/skills/threat-modeling/SKILL.md +113 -0
  806. package/skills/threat-modeling/evals/triggers.json +16 -0
  807. package/skills/transactional-email/SKILL.md +68 -0
  808. package/skills/transactional-email/evals/triggers.json +17 -0
  809. package/skills/transactional-email/references/providers.md +63 -0
  810. package/skills/typescript-patterns/SKILL.md +122 -0
  811. package/skills/typescript-patterns/evals/triggers.json +16 -0
  812. package/skills/typescript-testing/SKILL.md +101 -0
  813. package/skills/typescript-testing/evals/triggers.json +16 -0
  814. package/skills/ui-demo-recording/SKILL.md +93 -0
  815. package/skills/ui-demo-recording/evals/triggers.json +16 -0
  816. package/skills/ui-demo-recording/references/cursor-and-captions.md +48 -0
  817. package/skills/ui-demo-recording/references/playwright-recording.md +63 -0
  818. package/skills/ui-demo-recording/references/post-processing.md +57 -0
  819. package/skills/ui-design-polish/SKILL.md +113 -0
  820. package/skills/ui-design-polish/evals/triggers.json +18 -0
  821. package/skills/ui-design-polish/references/detail-checklist.md +45 -0
  822. package/skills/ui-design-polish/references/tokens.md +68 -0
  823. package/skills/ui-flow-audit/SKILL.md +112 -0
  824. package/skills/ui-flow-audit/evals/triggers.json +17 -0
  825. package/skills/ui-motion/SKILL.md +103 -0
  826. package/skills/ui-motion/evals/triggers.json +18 -0
  827. package/skills/ui-motion/references/patterns.md +138 -0
  828. package/skills/ui-motion/references/tokens.md +52 -0
  829. package/skills/unicode-text-processing/SKILL.md +103 -0
  830. package/skills/unicode-text-processing/evals/triggers.json +17 -0
  831. package/skills/unicode-text-processing/references/apis.md +89 -0
  832. package/skills/unicode-text-processing/references/script-notes.md +50 -0
  833. package/skills/verification-loop/SKILL.md +70 -0
  834. package/skills/verification-loop/evals/behavior.json +52 -0
  835. package/skills/verification-loop/evals/triggers.json +14 -0
  836. package/skills/verification-loop/scripts/detect-checks.js +102 -0
  837. package/skills/video-editing/SKILL.md +111 -0
  838. package/skills/video-editing/evals/triggers.json +16 -0
  839. package/skills/video-editing/references/edl-and-logging.md +44 -0
  840. package/skills/video-editing/references/ffmpeg-edit-recipes.md +92 -0
  841. package/skills/video-editing/references/resolve-scripting.md +53 -0
  842. package/skills/vite-patterns/SKILL.md +117 -0
  843. package/skills/vite-patterns/evals/triggers.json +16 -0
  844. package/skills/vue-patterns/SKILL.md +104 -0
  845. package/skills/vue-patterns/evals/triggers.json +16 -0
  846. package/skills/web-accessibility/SKILL.md +119 -0
  847. package/skills/web-accessibility/evals/triggers.json +16 -0
  848. package/skills/web-performance/SKILL.md +107 -0
  849. package/skills/web-performance/evals/triggers.json +16 -0
  850. package/skills/web-scraping/SKILL.md +80 -0
  851. package/skills/web-scraping/evals/triggers.json +16 -0
@@ -0,0 +1,140 @@
1
+ ---
2
+ name: react-patterns
3
+ description: React component design rules for function components and hooks, covering where state should live, the Rules of Hooks, effects used only to synchronise with external systems, data fetching without race conditions, controlled and uncontrolled forms with React 19 actions, error boundaries, choosing context versus a state library, and accessible markup. Use when building or restructuring React components, deciding where a piece of state belongs, writing or removing a useEffect, wiring up a form, or picking between context, Zustand, Redux or a query cache.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Applies to React 18 and 19 with any bundler or framework (Vite, Next.js, Remix, React Router). Needs Node.js and the project's package manager to run lint and tests.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: coding
9
+ kete-loom/risk: writes-files
10
+ kete-loom/requires: "node"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # React patterns
15
+
16
+ Write components that are pure during render, keep state as small and as local as possible, and treat effects as an escape hatch. For Next.js server/client concerns use the `nextjs-patterns` skill; for render speed use `react-performance`.
17
+
18
+ ## 0. Before you change anything
19
+
20
+ 1. Check the React version in `package.json` (`react`, `react-dom`). React 19 APIs (`useActionState`, `useOptimistic`, `use`, form `action` props, `ref` as a prop) don't exist in 18.
21
+ 2. Check what the project already uses for server state (TanStack Query, SWR, RTK Query, Apollo, framework loaders) and client state (context, Zustand, Redux, Jotai). Follow it. Don't add a second library for the same job.
22
+ 3. Check lint config for `eslint-plugin-react-hooks` (`rules-of-hooks`, `exhaustive-deps`). If it's missing, tell the user; don't silently add it.
23
+
24
+ ## 1. Where state lives
25
+
26
+ Decide in this order and stop at the first that fits:
27
+
28
+ 1. **Derive it.** If a value can be computed from props or other state, compute it during render. Never mirror props into state (`useState(props.x)` plus an effect to sync it).
29
+ 2. **Local `useState`/`useReducer`** in the lowest component that needs it. Use `useReducer` when several fields change together or the next state depends on an action type.
30
+ 3. **Lift** to the closest common parent when two siblings need it.
31
+ 4. **URL** (search params, path) for anything that should survive reload or be shareable: filters, tabs, pagination, selected item.
32
+ 5. **Server-state cache** (the project's query library or framework loader) for data owned by the backend. Never copy fetched data into a global store by hand.
33
+ 6. **Context** for values many distant components read and that change rarely: theme, locale, current user, a feature-flag client.
34
+ 7. **A state library** only when client state is large, updated from many places, and context would re-render too much.
35
+
36
+ Rules:
37
+ - Store the minimum: an `id`, not a copy of the selected object.
38
+ - Reset state with a `key` (`<Profile key={userId} />`), not with an effect.
39
+ - Put the state setter and value in separate contexts if consumers only need one, or memoise the context value object.
40
+
41
+ ## 2. Rules of Hooks
42
+
43
+ - Call hooks only at the top level of a component or a custom hook. No hooks inside conditions, loops, nested functions, `try` blocks or after an early `return`.
44
+ - Custom hooks start with `use` and may call other hooks. A function that calls no hooks is not a hook; don't prefix it.
45
+ - Never call a component as a function (`Row()`); render it (`<Row />`).
46
+ - Never define a component inside another component's body. It remounts every render and loses state.
47
+ - Render must be pure: no mutation of props, state or module variables, no `Math.random()`/`Date.now()` driving output without a stable source, no reading or writing `ref.current` during render (except lazy init).
48
+
49
+ ## 3. Effects: synchronisation only
50
+
51
+ An effect is for keeping React in sync with something outside React: a subscription, a browser API, a non-React widget, a websocket. Before writing `useEffect`, check whether you need it:
52
+
53
+ | You want to... | Do this instead |
54
+ |---|---|
55
+ | Compute a value from props/state | Compute during render (memoise only if measured slow) |
56
+ | Respond to a click or submit | Put the logic in the event handler |
57
+ | Reset state when a prop changes | Change the `key` |
58
+ | Adjust part of state when a prop changes | Derive it, or store the previous prop and compare during render |
59
+ | Notify a parent of a change | Call the parent's callback in the same handler that changed state |
60
+ | Fetch data | Use the project's data library or framework loader (section 4) |
61
+
62
+ When you do write one:
63
+ 1. List every reactive value it reads in the dependency array. Never suppress `exhaustive-deps`; restructure instead (move the function inside the effect, use an updater `setX(x => x + 1)`, or move non-reactive logic to `useEffectEvent` on React 19.2+).
64
+ 2. Return a cleanup that undoes the setup: unsubscribe, `clearInterval`, `controller.abort()`, `disconnect()`.
65
+ 3. Expect it to run twice in development under `<StrictMode>`. If that breaks something, the cleanup is wrong; don't remove StrictMode.
66
+ 4. Don't call `setState` synchronously in the effect body just to derive state; that is section 1, rule 1.
67
+
68
+ ## 4. Data fetching
69
+
70
+ Prefer, in order: the framework's loader or a Server Component (Next.js, Remix, React Router), then the project's query library, then a hand-rolled effect.
71
+
72
+ If you must fetch in an effect, guard against races and unmounts:
73
+
74
+ ```tsx
75
+ useEffect(() => {
76
+ const controller = new AbortController();
77
+ setStatus("loading");
78
+ fetch(`/api/users/${id}`, { signal: controller.signal })
79
+ .then((r) => { if (!r.ok) throw new Error(`HTTP ${r.status}`); return r.json(); })
80
+ .then((data) => { setUser(data); setStatus("done"); })
81
+ .catch((e) => { if (e.name !== "AbortError") { setError(e); setStatus("error"); } });
82
+ return () => controller.abort();
83
+ }, [id]);
84
+ ```
85
+
86
+ - Model loading, error and empty states explicitly; never render `data.items.map` before data exists.
87
+ - Start independent requests in parallel (`Promise.all`, or sibling components each with their own query), not one after another.
88
+ - With `use(promise)` on React 19, create the promise outside render (in a loader, a Server Component or a cache) and wrap the reader in `<Suspense>`. A promise created during render is recreated every render.
89
+
90
+ ## 5. Forms
91
+
92
+ - **Uncontrolled + `FormData`** is the default for submit-only forms: `<form action={fn}>` on React 19, or `onSubmit` with `new FormData(e.currentTarget)` on 18.
93
+ - **Controlled inputs** (`value` + `onChange`) only when you need the value on every keystroke: live validation, formatting, dependent fields.
94
+ - Never switch an input between controlled and uncontrolled; initialise with `""`, not `undefined`.
95
+ - React 19: `useActionState(action, initialState)` returns `[state, formAction, isPending]` for results and errors; `useFormStatus()` (from `react-dom`) reads pending state inside a child of the `<form>`; `useOptimistic` shows the expected result while the action runs.
96
+ - For large forms the project may use React Hook Form or similar; follow it.
97
+ - Validate on the server too. Client validation is UX, not security.
98
+ - Every input has a `<label htmlFor>` (or wraps the input); errors are linked with `aria-describedby` and announced (`role="alert"` or `aria-live="polite"`).
99
+ - Disable the submit button while pending, and keep it focusable.
100
+
101
+ ## 6. Error boundaries
102
+
103
+ - Error boundaries catch errors thrown during render, in lifecycle methods and in constructors below them. They do **not** catch errors in event handlers, async code (timers, promises after an `await`), or the boundary itself.
104
+ - There is no hook equivalent: write a class with `static getDerivedStateFromError` and `componentDidCatch`, or use the project's `react-error-boundary` if it's installed. Frameworks may provide their own (`error.tsx` in Next.js).
105
+ - Place boundaries around independent regions (a widget, a route segment), not just once at the root. Give each a fallback with a retry that resets it (`resetKeys` or a changed `key`).
106
+ - Handle event-handler and async errors with `try/catch` and state; to route them into a boundary, set state and rethrow during render.
107
+ - Report the error in `componentDidCatch` (or the root's `onCaughtError`/`onUncaughtError` on React 19) to the project's logger.
108
+
109
+ ## 7. Context vs state libraries
110
+
111
+ - Context is a dependency-injection mechanism, not a store: every consumer re-renders when the value identity changes.
112
+ - Split contexts by update frequency. Never put fast-changing values (mouse position, form text) in a widely consumed context.
113
+ - Server data belongs in a query cache, not context or Redux.
114
+ - Pick a store (Zustand, Redux Toolkit, Jotai) only for shared, frequently updated client state, and use selectors so components subscribe to slices.
115
+
116
+ ## 8. Accessibility basics
117
+
118
+ - Use the right element: `<button>` for actions, `<a href>` for navigation, `<label>` for inputs, headings in order. A `<div onClick>` is not a button.
119
+ - Every image has `alt` (`alt=""` if decorative). Icon-only buttons have `aria-label`.
120
+ - Keyboard: everything clickable is reachable with Tab and works with Enter/Space; focus is visible; dialogs trap focus and return it on close (prefer `<dialog>` or the project's headless UI library).
121
+ - After route changes or async updates, move focus or announce the change.
122
+ - Lists use stable, unique `key`s from the data (an id), never the array index when items can be reordered, inserted or removed.
123
+ - For full audits use the `web-accessibility` skill.
124
+
125
+ ## Never
126
+
127
+ - Never mutate state or props in place (`arr.push`, `obj.x = 1`); create new values.
128
+ - Never suppress `react-hooks` lint rules to make a warning go away.
129
+ - Never put secrets or tokens in client code or `localStorage` because "it's only the frontend".
130
+ - Never use `dangerouslySetInnerHTML` with unsanitised input.
131
+
132
+ ## Stop and ask the user
133
+
134
+ - Before adding a new state, data or form library.
135
+ - Before converting many components between controlled and uncontrolled, or between class and function components, beyond the task.
136
+ - When the expected behaviour on error, empty or loading states isn't specified.
137
+
138
+ ## Report back
139
+
140
+ End with: components changed, where each new piece of state lives and why, effects added or removed, the lint and test commands you ran with results, and anything not checked (for example "did not test with a screen reader").
@@ -0,0 +1,18 @@
1
+ {
2
+ "should_trigger": [
3
+ "Should this filter state live in the parent component, the URL, or a context?",
4
+ "I have a useEffect that copies props into state and it keeps getting out of sync, how should I restructure it?",
5
+ "Build a signup form component in React with validation errors shown under each field",
6
+ "Our dashboard crashes completely when one widget throws, add error boundaries properly",
7
+ "Is it worth adding Zustand or should I just use React context for the cart state?",
8
+ "Write a custom hook that subscribes to window resize and cleans up correctly"
9
+ ],
10
+ "should_not_trigger": [
11
+ "The product list re-renders 200 times when I type in the search box, profile it and speed it up",
12
+ "Should this Next.js page be a server component or a client component?",
13
+ "Review this React pull request for stale closures and hook violations",
14
+ "Set up revalidateTag caching for the blog posts in my App Router app",
15
+ "Write Playwright end-to-end tests for the checkout flow",
16
+ "Make my React Native FlatList scroll smoothly on Android"
17
+ ]
18
+ }
@@ -0,0 +1,107 @@
1
+ ---
2
+ name: react-performance
3
+ description: Measure-first workflow for slow React UIs - profile renders with React DevTools and the Profiler API, cut wasted re-renders with memo, useMemo and useCallback only where the profile shows a win (or let React Compiler do it), virtualise long lists, split code with lazy and Suspense, remove request waterfalls, and shrink the JavaScript bundle. Use when a React or Next.js screen feels laggy, typing or scrolling stutters, a component re-renders too often, Interaction to Next Paint is poor, or the client bundle has grown too big.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Applies to React 18 and 19 in any framework. Needs Node.js, the project's package manager and a browser with React DevTools for profiling.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: coding
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "node"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # React performance
15
+
16
+ No optimisation without a measurement before and after. Most React slowness comes from a few causes: rendering too much, rendering too often, loading too much JavaScript, or waiting on requests one after another. Component design rules live in `react-patterns`; Next.js caching and server/client splits in `nextjs-patterns`; Core Web Vitals and non-React page speed in `web-performance`.
17
+
18
+ ## 1. Define the problem
19
+
20
+ 1. Get a concrete symptom from the user: which screen, which interaction (typing, scrolling, opening a panel, first load), on what device. If it's vague, ask.
21
+ 2. Classify it:
22
+ - **Interaction is slow** (input lag, janky scroll): render cost. Go to 2.
23
+ - **First load is slow** (blank screen, late content): bundle or waterfalls. Go to 5 and 6.
24
+ 3. Measure in a production build (`npm run build` then the project's preview/start command). Development mode and StrictMode double-render and are several times slower; never judge speed there.
25
+
26
+ ## 2. Measure renders
27
+
28
+ 1. React DevTools → Profiler: record the slow interaction, then read the flame graph and ranked chart. Note the slowest commits, which components rendered, and "Why did this render?" (enable "Record why each component rendered while profiling" in settings).
29
+ 2. Turn on "Highlight updates when components render" to see what re-renders while you interact.
30
+ 3. Use the browser Performance panel with CPU throttling (4x or 6x) for long tasks over 50 ms and layout/paint cost that DevTools won't show.
31
+ 4. For numbers you can compare in code or CI, wrap the subtree in `<Profiler id="Grid" onRender={(id, phase, actualDuration, baseDuration) => ...}>`. `actualDuration` is time spent rendering this commit; `baseDuration` estimates a full re-render without memoisation. Profiling a production build needs the profiling build of `react-dom` (see the React docs for your bundler); `<Profiler>` adds overhead, so remove it or gate it after measuring.
32
+ 5. Write down the baseline: commit duration and count for the interaction, or long-task total. You'll compare against it.
33
+
34
+ ## 3. Fix rendering cost, cheapest first
35
+
36
+ Work down this list and re-measure after each change:
37
+
38
+ 1. **Move state down.** If typing in one input re-renders the whole page, the state is too high. Move it into the component that uses it.
39
+ 2. **Lift content up (children as props).** A parent with fast-changing state that renders `{children}` doesn't re-render those children.
40
+ 3. **Split contexts.** One context with a frequently changing value re-renders every consumer. Split by update rate, or move fast state to a store with selectors.
41
+ 4. **Stop recreating expensive work.** `useMemo` for a computation the profile shows is slow (rule of thumb: over ~1 ms per render) or for an object/array passed to a memoised child or an effect dependency.
42
+ 5. **Skip unchanged subtrees.** `React.memo(Component)` on a component that renders often with the same props and is costly to render. It only helps if every prop is stable: wrap callbacks in `useCallback`, objects in `useMemo`, or pass primitives.
43
+ 6. **Defer non-urgent updates.** `useDeferredValue(query)` for a slow results list behind a fast input; `startTransition(() => setFilter(x))` for updates that can be interrupted.
44
+ 7. **Virtualise long lists** (section 4).
45
+
46
+ Memoisation rules:
47
+ - Don't wrap everything. `memo`/`useMemo`/`useCallback` cost memory and comparisons; unprofiled memoisation is noise.
48
+ - A memoised child receiving `onClick={() => ...}` or `style={{...}}` inline never skips; fix the prop, not the child.
49
+ - Keys: stable ids, never `Math.random()` or array index for lists that change. A changing key remounts the subtree, which is far slower than a re-render.
50
+ - If the project has React Compiler enabled (`babel-plugin-react-compiler`, or `reactCompiler: true` in Next.js 16, `experimental.reactCompiler` in 15), it memoises automatically. Don't add manual `useMemo`/`useCallback` to compiled code unless a profile shows it's still needed; do keep components pure so the compiler doesn't skip them (the `react-hooks` lint compiler rules report why).
51
+ - Don't enable the compiler as a side effect of a perf fix; ask first.
52
+
53
+ ## 4. Long lists and big tables
54
+
55
+ - Over a few hundred rows, or rows that are expensive, render only what's visible. Use the library already in the project; otherwise `@tanstack/react-virtual` or `react-window`.
56
+ - Give rows a fixed or measured height; variable heights need the library's measurement API.
57
+ - Keep row components memoised with stable props, and keep scroll position, focus and keyboard navigation working. Check that Ctrl+F and screen readers are acceptable for the use case, or paginate instead.
58
+ - For simple long pages, CSS `content-visibility: auto` with `contain-intrinsic-size` can be enough without a library.
59
+
60
+ ## 5. Waterfalls
61
+
62
+ A waterfall is request B starting only after request A finishes when it didn't need A.
63
+
64
+ 1. Open the Network panel (throttled to "Fast 4G") and look for staircase-shaped requests.
65
+ 2. Common causes and fixes:
66
+ - Parent fetches, renders child, child fetches: hoist both fetches to the route loader or Server Component and start them together (`Promise.all`), or prefetch.
67
+ - Sequential `await`s in one function for independent data: start promises first, await later.
68
+ - `React.lazy` component that then fetches its data: start the data request in parallel with loading the code (route loader, prefetch on hover/intent).
69
+ - A `<Suspense>` boundary around each sibling that each suspends in turn: put siblings that load together under one boundary, separate ones under their own.
70
+ 3. In Next.js, fetch on the server and stream with `<Suspense>`; see `nextjs-patterns`.
71
+
72
+ ## 6. Bundle size and code splitting
73
+
74
+ 1. Measure what ships:
75
+ - Vite/Rollup: `rollup-plugin-visualizer`.
76
+ - webpack: `webpack-bundle-analyzer`.
77
+ - Next.js with Turbopack (16.1+): `npx next analyze` (`--output` writes to `.next/diagnostics/analyze` for before/after diffs). Next.js on webpack: `@next/bundle-analyzer` wrapped in `next.config` with `enabled: process.env.ANALYZE === "true"`, then `ANALYZE=true npm run build`.
78
+ - Any build with source maps: `source-map-explorer`.
79
+ 2. Look for: a large dependency used for one function (date, lodash, icon or chart libraries), duplicates of the same package at two versions, server-only or test code in the client bundle, and polyfills you don't need.
80
+ 3. Fix, in order: import only what you use (`import debounce from "lodash/debounce"`, per-icon imports); replace heavy libraries with platform APIs (`Intl.DateTimeFormat`, `structuredClone`) or lighter ones (ask before swapping); dedupe versions.
81
+ 4. Split by route first, then by heavy, rarely used components (editors, charts, maps, modals): `const Chart = lazy(() => import("./Chart"))` inside `<Suspense fallback>`; in Next.js use `next/dynamic` or keep the component on the server.
82
+ 5. Don't split tiny components; each chunk costs a request.
83
+ 6. Re-run the analyser and record the size change (gzip/brotli).
84
+
85
+ ## Never
86
+
87
+ - Never claim a speed-up without before/after numbers from the same build type and device profile.
88
+ - Never measure in development mode.
89
+ - Never suppress `exhaustive-deps` to "stop an effect re-running"; fix the unstable dependency.
90
+ - Never add a virtualisation, state or memo library when moving state or fixing a prop solves it.
91
+
92
+ ## Stop and ask the user
93
+
94
+ - When the symptom or target (for example "INP under 200 ms on a mid-range Android") isn't stated.
95
+ - Before replacing a dependency, enabling React Compiler, or changing list UX (virtualising, paginating).
96
+ - When the fix needs a design change (removing a feature from a screen, changing data shape on the API).
97
+
98
+ ## Report back
99
+
100
+ ```
101
+ Symptom: <screen + interaction>
102
+ Baseline: <metric, build type, device/throttle>
103
+ Cause: <what the profile showed>
104
+ Change: <files and what changed>
105
+ After: <same metric, same conditions>
106
+ Not checked: <e.g. low-end mobile, Safari>
107
+ ```
@@ -0,0 +1,18 @@
1
+ {
2
+ "should_trigger": [
3
+ "Typing in the search box lags badly because the whole results table re-renders on every keystroke",
4
+ "Use the React Profiler to find out why my dashboard is slow when I toggle the sidebar",
5
+ "Our main JS chunk is 1.8 MB, help me code split the React app and find what's bloating it",
6
+ "Rendering 10,000 rows in this React table freezes the browser, should I virtualise it?",
7
+ "Is wrapping every component in React.memo and useCallback actually helping or hurting?",
8
+ "The page loads data in a staircase: user, then orders, then items. Fix the waterfall in our React app"
9
+ ],
10
+ "should_not_trigger": [
11
+ "Should the shopping cart state live in context or in Zustand?",
12
+ "How do I write a server action that updates a profile in Next.js App Router?",
13
+ "Benchmark these two sorting functions in Node and tell me which is faster",
14
+ "Improve the Lighthouse SEO score and meta tags on our marketing site",
15
+ "Review this React PR for hook rule violations and missing keys",
16
+ "Our Postgres queries are slow, add the right indexes"
17
+ ]
18
+ }
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: react-testing
3
+ description: React Testing Library tests for components and custom hooks under Vitest or Jest, written the way a user drives the UI - userEvent.setup() interactions, getByRole and accessible-name queries, findBy and waitFor for async updates, MSW request handlers instead of mocked fetch, render wrappers for providers, routers and query clients, and renderHook for hooks. Use when writing or fixing tests for a React component or hook, replacing Enzyme or snapshot-heavy tests, a test fails with "not wrapped in act(...)" or cannot find an element, or tests break whenever a component is refactored.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs Node 18+ (Node 22+ with MSW 3), the project's test runner (Vitest or Jest) with a DOM environment (jsdom or happy-dom), @testing-library/react, @testing-library/user-event and @testing-library/jest-dom; MSW for network mocks.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: testing
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "node"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # React testing
15
+
16
+ Test a React component the way a person uses it: find things by role and label, act with a real-ish user, wait for what appears on screen, and fake only the network. A test that survives a refactor of the component's internals is the goal.
17
+
18
+ For runner setup, module mocks and fake timers in general, see `typescript-testing`. For full-browser journeys, see `e2e-testing-playwright`. This skill is the component and hook layer.
19
+
20
+ ## 0. Before you start
21
+
22
+ 1. Find the runner and environment: `vitest.config.*` / `vite.config.*` `test` block (`environment: 'jsdom'`, `setupFiles`), or `jest.config.*` (`testEnvironment: 'jsdom'`, `setupFilesAfterEnv`). Note the test command in `package.json`.
23
+ 2. Check the setup file imports jest-dom matchers: `import '@testing-library/jest-dom/vitest'` for Vitest, `import '@testing-library/jest-dom'` for Jest. If there is no setup file, add one (setup in `references/setup.md`).
24
+ 3. Look for an existing custom `render` (often `test/utils.tsx` or `test-utils.tsx`). Reuse it. If providers are wrapped by hand in every test, propose one.
25
+ 4. Run the existing suite once. If it is already red, **stop and tell the user** which tests fail before writing new ones.
26
+
27
+ ## 1. Pick what to test
28
+
29
+ - One behaviour per test, named for what the user sees: `shows an error when the email is invalid`.
30
+ - Cover: initial render, each interaction that changes the screen, loading, empty and error states, and the callback or request the component is responsible for.
31
+ - Do not test: state variable values, which hook was called, CSS class names, child component props, or the number of renders. Those are implementation details.
32
+
33
+ ## 2. Query priority
34
+
35
+ Use the first that works (full table and pitfalls in `references/queries.md`):
36
+
37
+ 1. `getByRole('button', { name: /save/i })` - almost everything.
38
+ 2. `getByLabelText` - form fields.
39
+ 3. `getByPlaceholderText`, `getByText`, `getByDisplayValue`.
40
+ 4. `getByAltText`, `getByTitle`.
41
+ 5. `getByTestId` - only when nothing user-visible identifies it.
42
+
43
+ Decision rules:
44
+
45
+ - `getBy*` when it must be there now; `queryBy*` only to assert absence (`expect(queryByRole('alert')).not.toBeInTheDocument()`); `findBy*` when it appears after an async update.
46
+ - If `getByRole` cannot find a control, the markup is probably inaccessible (a clickable `div`). Say so and suggest the fix rather than switching to a test ID.
47
+ - Use `screen` rather than destructuring from `render`.
48
+ - Use `within(row)` to scope queries inside a list item, dialog or table row.
49
+
50
+ ## 3. Interact with user-event
51
+
52
+ ```ts
53
+ const user = userEvent.setup();
54
+ render(<LoginForm onSubmit={onSubmit} />);
55
+ await user.type(screen.getByLabelText(/email/i), 'ada@example.com');
56
+ await user.click(screen.getByRole('button', { name: /sign in/i }));
57
+ expect(onSubmit).toHaveBeenCalledWith({ email: 'ada@example.com' });
58
+ ```
59
+
60
+ - Call `userEvent.setup()` once per test, before `render`, and `await` every action.
61
+ - Prefer user-event over `fireEvent`; it fires the full event sequence (pointer, focus, keydown, input). Use `fireEvent` only for events user-event does not model (for example `scroll`).
62
+ - With fake timers, pass `userEvent.setup({ advanceTimers: vi.advanceTimersByTime })` (or `jest.advanceTimersByTime`), or actions hang.
63
+
64
+ ## 4. Async updates
65
+
66
+ - `await screen.findByRole(...)` for something that appears.
67
+ - `await waitFor(() => expect(...))` for an assertion that becomes true; one assertion per `waitFor`, and no side effects inside it.
68
+ - `await waitForElementToBeRemoved(() => screen.queryByText(/loading/i))` for spinners.
69
+ - "Not wrapped in act(...)" means an update happened after the test stopped waiting. Fix it by awaiting the thing that causes the update (a `findBy`, the user action), not by wrapping code in `act` by hand. RTL's `render` and user-event already wrap in `act`.
70
+
71
+ ## 5. Network: MSW, not mocked fetch
72
+
73
+ Mock at the network boundary so the component's real fetch code, query library and error handling run. Handlers, server lifecycle and per-test overrides are in `references/msw.md`.
74
+
75
+ - One shared `server` with happy-path handlers; override per test with `server.use(...)` for errors and empty results.
76
+ - Make unhandled requests fail the test (`onUnhandledRequest: 'error'` in MSW 2, `onUnhandledFrame: 'error'` in MSW 3), so a typo in a URL is not a silent pass.
77
+ - Assert on what the user sees after the response. Assert on the request body only when sending it is the component's job.
78
+ - Create a fresh `QueryClient` per test with `retry: false`, or error tests wait through retries.
79
+
80
+ ## 6. Providers, routers and context
81
+
82
+ - Wrap with a custom `render` that accepts options (initial route, user, theme) and returns `render(ui, { wrapper })`. Example in `references/setup.md`.
83
+ - Router: render inside `MemoryRouter` with `initialEntries`, or the framework's test helper. Assert navigation by what the new screen shows.
84
+ - Context: render with the real provider and real initial value. Only mock a context whose provider talks to the outside world (auth SDK, feature flags).
85
+ - Next.js: mock `next/navigation` hooks only when the component calls them; async Server Components cannot be rendered by RTL, test their output with e2e tests or test the data function directly.
86
+
87
+ ## 7. Hooks
88
+
89
+ - Prefer testing a hook through a small component that uses it, if the hook only exists for one component.
90
+ - For a shared hook, `renderHook(() => useCounter(), { wrapper })` from `@testing-library/react`; read `result.current` after each update, and wrap direct state changes in `act(() => result.current.increment())`.
91
+ - Change props with `rerender(newProps)` and check cleanup with `unmount()`.
92
+
93
+ ## 8. Run and finish
94
+
95
+ 1. Run only the new test file, then the full suite.
96
+ 2. Check each new test fails when you break the behaviour it covers (comment out the handler line, change the text). A test that cannot fail is removed or rewritten.
97
+ 3. Run the suite twice; a test that passes once and fails once has a missing await or shared state.
98
+
99
+ ## Never
100
+
101
+ - Never snapshot a whole component as the only assertion.
102
+ - Never assert on `container.querySelector('.btn-primary')` or component internals.
103
+ - Never use `waitFor` with an empty callback or arbitrary `setTimeout` sleeps.
104
+ - Never mock the component under test, its child components to "isolate" it, or `fetch` itself when MSW is available.
105
+ - Never delete or `.skip` a failing test to get green without telling the user why.
106
+
107
+ ## Migrating from Enzyme or implementation tests
108
+
109
+ Rewrite, do not translate: list the behaviours the old test protected, delete `shallow`/`instance()`/`state()` calls, and write one RTL test per behaviour. Stop and ask before deleting a test whose behaviour you cannot identify.
110
+
111
+ ## Report back
112
+
113
+ ```
114
+ ## React tests: <component or hook>
115
+ Added: <test names>
116
+ Changed: <test names and why>
117
+ Command: <exact command> Result: <passed>/<total>
118
+ Mutation check: <which behaviour you broke and which test caught it>
119
+ Not covered: <states or flows left untested and why>
120
+ Accessibility notes: <controls that had no role or label>
121
+ ```
@@ -0,0 +1,18 @@
1
+ {
2
+ "should_trigger": [
3
+ "Write React Testing Library tests for the LoginForm component, typing into the fields with user-event",
4
+ "My component test keeps warning 'An update to TodoList inside a test was not wrapped in act(...)', how do I fix it?",
5
+ "Replace the Enzyme shallow tests for the CartDrawer with tests that don't break on every refactor",
6
+ "Mock the /api/orders call with MSW so the OrdersTable test can cover the empty and error states",
7
+ "How do I test my useDebouncedSearch hook that needs the QueryClientProvider?",
8
+ "getByText can't find the Save button in my Vitest component test even though it renders"
9
+ ],
10
+ "should_not_trigger": [
11
+ "Write Vitest unit tests for the date formatting utilities in src/lib",
12
+ "Write Playwright tests that log in and complete checkout in a real browser",
13
+ "Review this React pull request for hook dependency bugs before I merge it",
14
+ "Should the selected-tab state live in the URL or in component state?",
15
+ "Click through the staging site and file bugs for anything broken before the demo",
16
+ "The settings page re-renders on every keystroke, profile it and fix it"
17
+ ]
18
+ }
@@ -0,0 +1,64 @@
1
+ # MSW network mocks for component tests
2
+
3
+ MSW 2.x and 3.x syntax (handlers below are the same in both). Check the installed major in `package.json`; MSW 1 used `rest.get` and `res(ctx.json())`. MSW 3 is ESM-only and needs Node 22+; on a CommonJS Jest setup stay on MSW 2 unless the user agrees to migrate.
4
+
5
+ ## Handlers and server
6
+
7
+ ```ts
8
+ // src/test/handlers.ts
9
+ import { http, HttpResponse } from 'msw';
10
+
11
+ export const handlers = [
12
+ http.get('/api/users/:id', ({ params }) =>
13
+ HttpResponse.json({ id: params.id, name: 'Ada Lovelace' })),
14
+ http.post('/api/todos', async ({ request }) => {
15
+ const body = await request.json();
16
+ return HttpResponse.json({ id: 't1', ...body }, { status: 201 });
17
+ }),
18
+ ];
19
+ ```
20
+
21
+ ```ts
22
+ // src/test/server.ts
23
+ import { setupServer } from 'msw/node';
24
+ import { handlers } from './handlers';
25
+
26
+ export const server = setupServer(...handlers);
27
+ ```
28
+
29
+ Lifecycle (in the setup file): `server.listen({ onUnhandledRequest: 'error' })` before all, `server.resetHandlers()` after each, `server.close()` after all. MSW 3 renamed the option: `server.listen({ onUnhandledFrame: 'error' })`. MSW 2 uses `onUnhandledRequest`.
30
+
31
+ ## Per-test overrides
32
+
33
+ ```ts
34
+ it('shows an error when the profile cannot load', async () => {
35
+ server.use(
36
+ http.get('/api/users/:id', () => HttpResponse.json({ message: 'nope' }, { status: 500 })),
37
+ );
38
+ renderWithProviders(<Profile id="1" />);
39
+ expect(await screen.findByRole('alert')).toHaveTextContent(/could not load/i);
40
+ });
41
+ ```
42
+
43
+ - Network failure: `http.get(url, () => HttpResponse.error())`.
44
+ - Slow response to test a spinner: `import { delay } from 'msw'` (MSW 3 also exports it from `msw/utils`) then `await delay(200)` inside the resolver; or keep it pending with `await delay('infinite')`.
45
+ - One-off: `http.get(url, resolver, { once: true })`.
46
+ - Fake timers: MSW 3 no longer patches `setTimeout`, so with fake timers a `delay()` response only resolves after you advance the timers.
47
+
48
+ ## Asserting the request
49
+
50
+ Only when sending the right data is the component's job:
51
+
52
+ ```ts
53
+ let sent: unknown;
54
+ server.use(http.post('/api/todos', async ({ request }) => {
55
+ sent = await request.json();
56
+ return HttpResponse.json({ id: 't1' }, { status: 201 });
57
+ }));
58
+ // ...interact...
59
+ await waitFor(() => expect(sent).toEqual({ title: 'Buy milk' }));
60
+ ```
61
+
62
+ ## Absolute vs relative URLs
63
+
64
+ jsdom resolves relative `fetch('/api/...')` against its `location` (default `http://localhost/` in Vitest and Jest). If the app uses an `API_URL` env variable, write handlers with the same base, or use a wildcard (`*/api/users/:id`).
@@ -0,0 +1,41 @@
1
+ # Queries and matchers
2
+
3
+ ## Variants
4
+
5
+ | Prefix | 0 matches | 1 match | >1 match | Async |
6
+ |---|---|---|---|---|
7
+ | `getBy` | throws | returns | throws | no |
8
+ | `queryBy` | `null` | returns | throws | no |
9
+ | `findBy` | rejects | resolves | rejects | yes (default 1000 ms) |
10
+ | `getAllBy` / `queryAllBy` / `findAllBy` | throw / `[]` / reject | array | array | as above |
11
+
12
+ ## Role queries that trip people up
13
+
14
+ | Element | Role |
15
+ |---|---|
16
+ | `<a href>` | `link` (no `href` means no role) |
17
+ | `<input type="text">`, `<textarea>` | `textbox` |
18
+ | `<input type="search">` | `searchbox` |
19
+ | `<input type="checkbox">` | `checkbox` |
20
+ | `<input type="number">` | `spinbutton` |
21
+ | `<select>` | `combobox` (single) or `listbox` (multiple / size > 1) |
22
+ | `<h1>`-`<h6>` | `heading`, filter with `{ level: 2 }` |
23
+ | `<ul>`, `<li>` | `list`, `listitem` |
24
+ | `<table>` rows | `row`, `cell`, `columnheader` |
25
+ | `<dialog open>` or `role="dialog"` | `dialog` |
26
+ | `<img alt="">` | `presentation` (not `img`) |
27
+
28
+ Useful options: `name` (accessible name, string or regex), `hidden: true` (include `aria-hidden`), `selected`, `checked`, `pressed`, `expanded`, `level`.
29
+
30
+ `screen.logTestingPlaygroundURL()` and `screen.debug()` help find the right query; delete them before committing.
31
+
32
+ ## jest-dom matchers worth using
33
+
34
+ `toBeInTheDocument`, `toBeVisible`, `toBeDisabled` / `toBeEnabled`, `toHaveValue`, `toBeChecked`, `toHaveAccessibleName`, `toHaveAccessibleDescription`, `toHaveAttribute`, `toHaveTextContent`, `toHaveFocus`, `toHaveAccessibleErrorMessage` (check the installed jest-dom version supports it).
35
+
36
+ ## Common mistakes
37
+
38
+ - `expect(screen.getByText('x')).toBeInTheDocument()` is fine; `expect(screen.queryByText('x')).toBeInTheDocument()` hides the better error message `getBy` gives.
39
+ - `await waitFor(() => screen.getByText('x'))` should be `await screen.findByText('x')`.
40
+ - Text split across elements (`<b>3</b> items`) does not match `getByText('3 items')`; query the container by role or use a function matcher.
41
+ - `userEvent.type` into a field that already has a value appends; call `user.clear(field)` first.
@@ -0,0 +1,74 @@
1
+ # Setup and custom render
2
+
3
+ ## Vitest
4
+
5
+ ```ts
6
+ // vitest.config.ts (or the `test` block of vite.config.ts)
7
+ import { defineConfig } from 'vitest/config';
8
+ import react from '@vitejs/plugin-react';
9
+
10
+ export default defineConfig({
11
+ plugins: [react()],
12
+ test: {
13
+ environment: 'jsdom', // or 'happy-dom'
14
+ setupFiles: ['./src/test/setup.ts'],
15
+ globals: false, // keep explicit imports unless the repo already uses globals
16
+ },
17
+ });
18
+ ```
19
+
20
+ ```ts
21
+ // src/test/setup.ts
22
+ import '@testing-library/jest-dom/vitest';
23
+ import { afterAll, afterEach, beforeAll } from 'vitest';
24
+ import { cleanup } from '@testing-library/react';
25
+ import { server } from './server';
26
+
27
+ beforeAll(() => server.listen({ onUnhandledRequest: 'error' })); // MSW 3: onUnhandledFrame
28
+ afterEach(() => { server.resetHandlers(); cleanup(); });
29
+ afterAll(() => server.close());
30
+ ```
31
+
32
+ `cleanup` runs automatically when the runner exposes a global `afterEach` (Jest, or Vitest with `globals: true`). With Vitest and `globals: false`, call it yourself as above.
33
+
34
+ Install: `npm i -D vitest jsdom @testing-library/react @testing-library/dom @testing-library/user-event @testing-library/jest-dom msw` (React Testing Library 16 lists `@testing-library/dom` as a peer dependency).
35
+
36
+ ## Jest
37
+
38
+ ```js
39
+ // jest.config.js
40
+ module.exports = {
41
+ testEnvironment: 'jsdom', // needs the jest-environment-jsdom package from Jest 28
42
+ setupFilesAfterEnv: ['<rootDir>/src/test/setup.ts'],
43
+ };
44
+ ```
45
+
46
+ In the setup file use `import '@testing-library/jest-dom';` and the same MSW lifecycle with Jest globals.
47
+
48
+ MSW 2 under Jest + jsdom may need the Fetch API globals (`Request`, `Response`, `TextEncoder`) supplied; MSW's docs recommend `jest-fixed-jsdom` as the environment for this. Vitest does not need it.
49
+
50
+ ## Custom render
51
+
52
+ ```tsx
53
+ // src/test/utils.tsx
54
+ import { render, type RenderOptions } from '@testing-library/react';
55
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
56
+ import { MemoryRouter } from 'react-router-dom';
57
+ import type { ReactElement, ReactNode } from 'react';
58
+
59
+ type Options = RenderOptions & { route?: string };
60
+
61
+ export function renderWithProviders(ui: ReactElement, { route = '/', ...options }: Options = {}) {
62
+ const client = new QueryClient({ defaultOptions: { queries: { retry: false } } });
63
+ const Wrapper = ({ children }: { children: ReactNode }) => (
64
+ <QueryClientProvider client={client}>
65
+ <MemoryRouter initialEntries={[route]}>{children}</MemoryRouter>
66
+ </QueryClientProvider>
67
+ );
68
+ return { client, ...render(ui, { wrapper: Wrapper, ...options }) };
69
+ }
70
+
71
+ export * from '@testing-library/react';
72
+ ```
73
+
74
+ Keep only the providers the app actually uses. A new `QueryClient` per call stops cached data leaking between tests.