@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,118 @@
1
+ ---
2
+ name: rust-patterns
3
+ description: Idiomatic Rust design guide covering ownership and borrowing choices, Result-based errors with thiserror in libraries and anyhow in binaries, traits and generics, iterator chains, async with tokio, rules for unsafe, cargo workspaces and clippy settings. Use when writing new Rust code, shaping a crate's public API, choosing between owned and borrowed types, or setting up a Cargo workspace and lint policy.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs a Rust toolchain (cargo, rustc, clippy, rustfmt) to check the code it writes.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: coding
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "cargo"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Rust patterns
15
+
16
+ Write Rust that compiles on the first honest try, says what it owns, and fails with typed errors instead of panics.
17
+
18
+ ## 0. Before you write
19
+
20
+ 1. Read `Cargo.toml` (and the workspace root's, if any): edition, `rust-version`, features, existing error crate, async runtime. Match them; never add a second error crate or runtime.
21
+ 2. Read `clippy.toml`, `rustfmt.toml` and any `[lints]` table. They are the house rules.
22
+ 3. Find a neighbouring module that does something similar and copy its shape (error type, constructor style, module layout).
23
+ 4. If the task needs a new dependency, **stop and ask the user** before adding it, and name the crate and why.
24
+
25
+ ## 1. Ownership and borrowing
26
+
27
+ Decide per parameter, in this order:
28
+
29
+ | Need | Take |
30
+ |---|---|
31
+ | Only read it | `&T`, `&str`, `&[T]`, `&Path` (not `&String`, `&Vec<T>`, `&PathBuf`) |
32
+ | Mutate the caller's value | `&mut T` |
33
+ | Store it or move it to another thread | `T` by value (`String`, `Vec<T>`) |
34
+ | Accept owned or borrowed, store it | `impl Into<String>` / `impl Into<PathBuf>` |
35
+ | Return borrowed-or-owned | `Cow<'_, str>` |
36
+
37
+ - Return owned values from constructors and builders; return references only from accessors (`fn name(&self) -> &str`).
38
+ - When the borrow checker objects, restructure first: shorten the borrow with a block, split the struct into fields borrowed separately, or collect indices before mutating. Use `.clone()` only when the data is small or the copy is the real intent, never just to silence an error.
39
+ - Shared ownership: `Rc<T>` single-threaded, `Arc<T>` across threads. Interior mutability: `Cell`/`RefCell` single-threaded, `Mutex`/`RwLock` or atomics across threads. Reaching for `Rc<RefCell<T>>` everywhere usually means the ownership tree needs redesign; say so.
40
+ - Add explicit lifetimes only when elision can't express the relationship. A struct holding references (`struct Parser<'a>`) is fine for short-lived views; long-lived structs should own their data.
41
+
42
+ ## 2. Errors
43
+
44
+ - Library crates: one error enum per crate or module with `thiserror`. Wrap sources with `#[from]` or `#[source]` so the chain survives.
45
+ - Binaries and app glue: `anyhow::Result<T>`, adding context at each boundary with `.context("reading config")` / `.with_context(|| format!("opening {path:?}"))`.
46
+ - Propagate with `?`. Convert at module boundaries, not at every call.
47
+ - `unwrap()` and `expect()` belong in tests, examples and provably-impossible cases. For the last, use `expect("reason this cannot fail")`, never bare `unwrap()`.
48
+ - Never return `Result<T, String>` or `Box<dyn Error>` from a public library API; callers can't match on them.
49
+ - `panic!` is for broken invariants (bugs), not for bad input, missing files or network failures.
50
+
51
+ Patterns and full examples: `references/errors-and-traits.md`.
52
+
53
+ ## 3. Traits and generics
54
+
55
+ - Prefer generics (`fn f<R: Read>(r: R)` or `impl Read`) for hot paths and when the caller picks one type. Use `dyn Trait` for heterogeneous collections, plugin points and to cut compile time or binary size.
56
+ - Keep trait bounds on `impl` blocks and functions, not on struct definitions.
57
+ - Implement standard traits instead of ad hoc methods: `From`/`TryFrom` for conversions, `Display` for user-facing text, `Default`, `FromStr`, `Iterator`, `AsRef`.
58
+ - Derive `Debug` on every public type. Derive `Clone`, `PartialEq`, `Eq`, `Hash` only when they make sense for the type.
59
+ - Newtypes (`struct UserId(u64)`) for values that must not be mixed up. Enums instead of boolean flags or stringly-typed states.
60
+ - Don't implement `Deref` to fake inheritance.
61
+
62
+ ## 4. Iterators and collections
63
+
64
+ - Chain `iter()`, `map`, `filter`, `filter_map`, `flat_map`, then `collect()`; collect into `Result<Vec<_>, _>` to stop at the first error.
65
+ - Use a plain `for` loop when the body has side effects, early `return`, or `?` that would make the chain unreadable.
66
+ - Pre-size with `Vec::with_capacity` when the length is known. Use the `entry` API on maps instead of a lookup followed by an insert.
67
+ - Don't `collect()` just to iterate again; pass the iterator on (`impl Iterator<Item = T>`).
68
+
69
+ ## 5. Async with tokio
70
+
71
+ 1. One runtime, created once with `#[tokio::main]` in the binary. Libraries take no runtime dependency they can avoid and never create their own runtime.
72
+ 2. Never block inside async code: no `std::thread::sleep`, `std::fs` on hot paths, blocking HTTP clients, or long CPU loops. Use `tokio::time::sleep`, `tokio::fs`, or move the work into `tokio::task::spawn_blocking`.
73
+ 3. Never hold a `std::sync::Mutex` guard across `.await`. Drop it before awaiting, or use `tokio::sync::Mutex` when the lock must span an await.
74
+ 4. Every `tokio::spawn` gets an owner: keep the `JoinHandle` (or use a `JoinSet`) and handle its result, or the task's panic and error vanish.
75
+ 5. Bound concurrency and channels: `tokio::sync::Semaphore`, bounded `mpsc::channel(n)`. Unbounded channels need a written reason.
76
+ 6. Add timeouts to network I/O with `tokio::time::timeout`, and support shutdown with a cancellation signal checked in `tokio::select!`.
77
+ 7. Spawned futures must be `Send + 'static`: move owned data (or an `Arc`) into them, don't borrow.
78
+
79
+ ## 6. Unsafe
80
+
81
+ - Don't write `unsafe` unless the task cannot be done in safe Rust (FFI, a measured hot path, a primitive the standard library lacks). If you think you need it, **stop and tell the user why** before writing it.
82
+ - Every `unsafe` block gets a `// SAFETY:` comment naming the invariant that makes it sound, and every `unsafe fn` gets a `# Safety` doc section stating what callers must uphold.
83
+ - Keep the block as small as possible and wrap it in a safe API that enforces the invariant.
84
+ - Run the tests under Miri (`cargo +nightly miri test`) when unsafe code touches pointers or memory layout, if Miri is available.
85
+
86
+ ## 7. Cargo workspaces
87
+
88
+ - Root `Cargo.toml` with `[workspace]`, `members`, and shared versions in `[workspace.dependencies]`; members use `serde = { workspace = true }`.
89
+ - Put shared lint settings in `[workspace.lints]` and `[lints] workspace = true` in each member.
90
+ - Features are additive: a feature must never remove an API or change behaviour incompatibly. Gate optional dependencies with `dep:name`.
91
+ - Commit `Cargo.lock`. Cargo's current guidance is to commit it for libraries too; follow the project if it has a documented reason not to.
92
+ - Layout and a starter manifest: `references/cargo-and-clippy.md`.
93
+
94
+ ## 8. Finish: format, lint, test
95
+
96
+ Run, and fix everything before you report:
97
+
98
+ ```sh
99
+ cargo fmt --all
100
+ cargo clippy --all-targets --all-features -- -D warnings
101
+ cargo test --all-features
102
+ ```
103
+
104
+ If the project has mutually exclusive features, `--all-features` fails by design: use the feature flags CI uses instead.
105
+
106
+ - Fix clippy warnings in the code. Suppress only on the smallest item, with a reason: `#[expect(clippy::lint_name, reason = "...")]` when the project's `rust-version` is 1.81 or newer (it warns once the lint stops firing), otherwise `#[allow(clippy::lint_name)]` plus a comment.
107
+ - If a check fails for reasons outside your change, report it instead of fixing unrelated code.
108
+
109
+ ## Never
110
+
111
+ - Never add `unwrap()` on user input, I/O, parsing or network results in non-test code.
112
+ - Never silence the borrow checker with `clone()`, `Rc<RefCell<_>>` or `unsafe` without saying why.
113
+ - Never use `std::mem::transmute` to convert between types that have safe conversions.
114
+ - Never add a dependency, a feature flag or `#![allow(...)]` at crate level without asking.
115
+
116
+ ## Report back
117
+
118
+ End with: files changed, the three commands above and their results, any `unsafe`, `allow` or new dependency introduced and why, and anything left undone.
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Should this Rust function take a String or a &str? It just looks up a key in a map",
4
+ "Set up a thiserror error enum for my parser crate and use anyhow in the CLI binary",
5
+ "Split my Rust project into a cargo workspace with a core library and a cli crate",
6
+ "Write an async tokio worker that pulls jobs from a channel and processes them with bounded concurrency",
7
+ "What's the idiomatic way to design a trait for pluggable storage backends in Rust?"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Add proptest property tests for my Rust base64 encoder",
11
+ "Review this Rust pull request for unwraps and unsafe blocks before I merge it",
12
+ "cargo build fails with E0502 cannot borrow as mutable because it is also borrowed as immutable",
13
+ "Write idiomatic Go error handling with wrapped errors for this HTTP handler",
14
+ "Design a REST API for the orders service with pagination and versioning"
15
+ ]
16
+ }
@@ -0,0 +1,105 @@
1
+ # Cargo workspaces and clippy policy
2
+
3
+ Read this when creating or restructuring a workspace, or setting lint policy.
4
+
5
+ ## Layout
6
+
7
+ ```
8
+ my-project/
9
+ ├── Cargo.toml # workspace root, no [package] unless it is also a crate
10
+ ├── Cargo.lock
11
+ ├── crates/
12
+ │ ├── app-core/ # domain types and logic, no I/O
13
+ │ ├── store/ # persistence, depends on app-core
14
+ │ └── cli/ # binary, depends on app-core and store
15
+ └── clippy.toml # optional
16
+ ```
17
+
18
+ Keep the dependency graph acyclic and pointing inwards: binaries depend on libraries, never the reverse.
19
+
20
+ ## Root manifest
21
+
22
+ ```toml
23
+ [workspace]
24
+ resolver = "3" # edition 2024 default; use "2" on edition 2021
25
+ members = ["crates/*"]
26
+
27
+ [workspace.package]
28
+ edition = "2024"
29
+ license = "MIT"
30
+
31
+ [workspace.dependencies]
32
+ anyhow = "1"
33
+ thiserror = "2"
34
+ serde = { version = "1", features = ["derive"] }
35
+ tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
36
+
37
+ [workspace.lints.rust]
38
+ unsafe_code = "forbid"
39
+
40
+ [workspace.lints.clippy]
41
+ unwrap_used = "warn"
42
+ expect_used = "warn"
43
+ dbg_macro = "warn"
44
+ todo = "warn"
45
+ ```
46
+
47
+ Match the edition, resolver and dependency major versions already used by the project rather than copying the numbers above; they are placeholders.
48
+
49
+ `unsafe_code = "forbid"` is a sensible default for crates with no FFI. Relax it per crate (`deny`, then `#[allow(unsafe_code)]` on the one module) only where unsafe is justified.
50
+
51
+ ## Member manifest
52
+
53
+ ```toml
54
+ [package]
55
+ name = "store"
56
+ version = "0.1.0"
57
+ edition.workspace = true
58
+ license.workspace = true
59
+
60
+ [dependencies]
61
+ app-core = { path = "../app-core" } # don't name a crate `core` or `std`: it shadows the built-in crate
62
+ serde = { workspace = true }
63
+ thiserror = { workspace = true }
64
+ sqlx = { version = "0.8", optional = true }
65
+
66
+ [features]
67
+ default = []
68
+ postgres = ["dep:sqlx"]
69
+
70
+ [lints]
71
+ workspace = true
72
+ ```
73
+
74
+ ## Useful cargo commands
75
+
76
+ | Task | Command |
77
+ |---|---|
78
+ | Check fast without codegen | `cargo check --workspace --all-targets` |
79
+ | Build one member | `cargo build -p store` |
80
+ | Why is this crate here? | `cargo tree -i <crate>` |
81
+ | Duplicate versions in the graph | `cargo tree -d` |
82
+ | Features enabled on a crate | `cargo tree -e features -i <crate>` |
83
+ | Update one dependency | `cargo update -p <crate>` |
84
+ | Check every feature combination | `cargo hack check --feature-powerset` (needs `cargo-hack`) |
85
+
86
+ ## Clippy
87
+
88
+ Baseline for CI:
89
+
90
+ ```sh
91
+ cargo clippy --workspace --all-targets --all-features -- -D warnings
92
+ ```
93
+
94
+ - `clippy::all` (the default groups) is on already. `clippy::pedantic` is opt-in and noisy; enable it only if the project already does, or the user asks.
95
+ - `unwrap_used` and `expect_used` are restriction lints. Allow them in tests with `#[cfg_attr(test, allow(clippy::unwrap_used, clippy::expect_used))]` at the crate root, or in `clippy.toml` with `allow-unwrap-in-tests = true` and `allow-expect-in-tests = true`.
96
+ - Suppress a lint on the smallest item, with a reason:
97
+
98
+ ```rust
99
+ #[expect(clippy::too_many_arguments, reason = "mirrors the C API one-to-one")] // Rust 1.81+
100
+ fn ffi_call(/* ... */) {}
101
+ ```
102
+
103
+ On an older `rust-version`, use `#[allow(...)]` with a trailing comment instead.
104
+
105
+ - Don't use `cargo clippy --fix` on a dirty tree without reviewing the diff it produces.
@@ -0,0 +1,97 @@
1
+ # Errors and traits: worked patterns
2
+
3
+ Read this when designing a crate's error type or a public trait.
4
+
5
+ ## Library error with thiserror
6
+
7
+ ```rust
8
+ use std::path::PathBuf;
9
+
10
+ #[derive(Debug, thiserror::Error)]
11
+ pub enum ConfigError {
12
+ #[error("could not read config file {path:?}")]
13
+ Read {
14
+ path: PathBuf,
15
+ #[source]
16
+ source: std::io::Error,
17
+ },
18
+ #[error("invalid config")]
19
+ Parse(#[from] toml::de::Error),
20
+ #[error("missing required key `{0}`")]
21
+ MissingKey(&'static str),
22
+ }
23
+
24
+ pub fn load(path: &std::path::Path) -> Result<Config, ConfigError> {
25
+ let text = std::fs::read_to_string(path).map_err(|source| ConfigError::Read {
26
+ path: path.to_owned(),
27
+ source,
28
+ })?;
29
+ let config: Config = toml::from_str(&text)?; // From<toml::de::Error>
30
+ Ok(config)
31
+ }
32
+ ```
33
+
34
+ Rules:
35
+
36
+ - The `#[error]` message describes this layer only. Don't repeat the source's message in it; reporters walk `source()` and print the chain.
37
+ - Use `#[from]` only when the conversion is unambiguous. If two call sites produce the same source type with different meaning, use explicit variants with `#[source]` and `map_err`.
38
+ - Mark public error enums `#[non_exhaustive]` if you expect to add variants without a major version bump.
39
+
40
+ ## Application errors with anyhow
41
+
42
+ ```rust
43
+ use anyhow::{bail, Context, Result};
44
+
45
+ fn main() -> Result<()> {
46
+ let path = std::env::args().nth(1).context("usage: tool <config>")?;
47
+ let config = mylib::load(path.as_ref())
48
+ .with_context(|| format!("loading config from {path}"))?;
49
+ if config.workers == 0 {
50
+ bail!("workers must be at least 1");
51
+ }
52
+ Ok(())
53
+ }
54
+ ```
55
+
56
+ - Returning `anyhow::Result<()>` from `main` prints the error chain on failure and exits non-zero.
57
+ - Use `anyhow::Error::downcast_ref::<T>()` only at the top level, when you must branch on a specific cause.
58
+
59
+ ## Option and Result helpers
60
+
61
+ | Want | Use |
62
+ |---|---|
63
+ | Option to Result | `opt.ok_or(Error::Missing)?` / `opt.ok_or_else(\|\| ...)?` |
64
+ | Default on None | `opt.unwrap_or_default()` / `unwrap_or_else(\|\| ...)` |
65
+ | Transform the success value | `res.map(...)` |
66
+ | Chain fallible steps | `res.and_then(...)` |
67
+ | Log and drop an error deliberately | `if let Err(e) = res { tracing::warn!(error = %e, "..."); }` |
68
+
69
+ Never use `let _ = fallible();` for a `Result` whose failure matters; handle or log it.
70
+
71
+ ## Trait design
72
+
73
+ ```rust
74
+ pub trait Store {
75
+ fn get(&self, key: &str) -> Result<Option<Vec<u8>>, StoreError>;
76
+ fn put(&self, key: &str, value: &[u8]) -> Result<(), StoreError>;
77
+ }
78
+
79
+ pub struct Cache<S: Store> { inner: S } // avoid: bound on the struct
80
+ pub struct Cache<S> { inner: S } // prefer
81
+ impl<S: Store> Cache<S> { /* ... */ } // bound where it is needed
82
+ ```
83
+
84
+ - Take `&self` in trait methods unless mutation is the point; implementations can use interior mutability.
85
+ - Keep traits small and focused. A trait with ten methods usually wants splitting.
86
+ - To make a trait usable as `dyn Trait`, avoid generic methods and `Self` return types (or gate them with `where Self: Sized`).
87
+ - Sealed traits (a private supertrait) stop downstream crates from implementing a trait you need to extend later.
88
+
89
+ ## Async traits
90
+
91
+ `async fn` in traits works on stable Rust for static dispatch. For `dyn` use, or when callers need the returned future to be `Send`, check the project's current approach (the `async-trait` crate, or a method returning `Pin<Box<dyn Future<Output = T> + Send + '_>>`) and follow it rather than mixing styles.
92
+
93
+ ## Conversions
94
+
95
+ - `impl From<A> for B` gives you `Into` for free. Never implement `Into` directly.
96
+ - `TryFrom` for conversions that can fail; its `Error` type should be a real error, not `()` or `String`.
97
+ - `AsRef<str>` / `AsRef<Path>` for functions that only need to look at the data.
@@ -0,0 +1,148 @@
1
+ ---
2
+ name: rust-testing
3
+ description: Writing and organising tests for Rust crates with cargo test, covering #[cfg(test)] unit modules, integration tests under tests/, doc tests, trait-based fakes and mockall, property tests with proptest, #[tokio::test] for async code, and the cargo test flags for filtering and output. Use when adding or fixing Rust tests, deciding where a test belongs in a crate, testing async or I/O-bound Rust code, or getting a flaky cargo test run under control.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs a Rust toolchain with cargo. proptest, mockall and tokio are used only if the project already depends on them or the user agrees to add them.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: testing
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "cargo"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Rust testing
15
+
16
+ Put each test where it can see exactly what it needs, keep it deterministic, and prove it with a `cargo test` run.
17
+
18
+ ## 0. Before you write a test
19
+
20
+ 1. Read `Cargo.toml` `[dev-dependencies]`: which of `proptest`, `mockall`, `tokio` (with which features), `tempfile`, `insta`, `rstest` are already there. Use those. **Ask the user** before adding a new dev-dependency.
21
+ 2. Check how CI runs tests (`.github/workflows/`, `Makefile`, `justfile`): plain `cargo test`, `cargo nextest run`, feature flags, `--workspace`. Use the same command.
22
+ 3. Run the existing suite once and record the result. If it already fails, **stop and tell the user** which tests fail before you change anything.
23
+
24
+ ## 1. Choose where the test goes
25
+
26
+ | Testing | Put it in | Can see |
27
+ |---|---|---|
28
+ | One function or private helper | `#[cfg(test)] mod tests` at the bottom of the same file | Private items via `use super::*;` |
29
+ | The crate's public API, as a user would call it | `tests/<feature>.rs` (each file is its own crate) | Only `pub` items |
30
+ | A usage example in the docs | A fenced code block in the item's `///` doc comment | Only `pub` items |
31
+ | A binary's behaviour end to end | `tests/cli.rs`, running the binary (for example with `assert_cmd` if present) | Process output |
32
+
33
+ - Binary crates: integration tests can't import `main.rs`. Move logic into `src/lib.rs` and keep `main.rs` thin.
34
+ - Shared integration helpers go in `tests/common/mod.rs` (not `tests/common.rs`, which cargo would run as its own test crate), pulled in with `mod common;`.
35
+
36
+ ## 2. Unit tests
37
+
38
+ ```rust
39
+ #[cfg(test)]
40
+ mod tests {
41
+ use super::*;
42
+
43
+ #[test]
44
+ fn parses_port_from_host_string() {
45
+ assert_eq!(parse_port("localhost:8080"), Ok(8080));
46
+ }
47
+
48
+ #[test]
49
+ fn rejects_missing_port() {
50
+ let err = parse_port("localhost").unwrap_err();
51
+ assert!(matches!(err, ParseError::MissingPort));
52
+ }
53
+
54
+ #[test]
55
+ fn reads_port_from_config_text() -> Result<(), Box<dyn std::error::Error>> {
56
+ let config: Config = "port = 8080".parse()?;
57
+ assert_eq!(config.port, 8080);
58
+ Ok(())
59
+ }
60
+
61
+ #[test]
62
+ #[should_panic(expected = "capacity must be non-zero")]
63
+ fn zero_capacity_panics() {
64
+ RingBuffer::<u8>::new(0);
65
+ }
66
+ }
67
+ ```
68
+
69
+ - Name tests after the behaviour (`rejects_missing_port`), not `test1`.
70
+ - Assert on the specific error variant with `matches!` instead of comparing `Debug` strings.
71
+ - Use `#[should_panic(expected = "...")]` only for documented panics; give the expected text so an unrelated panic doesn't pass.
72
+ - Tests may return `Result<(), E>` to use `?`; in tests, `unwrap()` and `expect()` are fine.
73
+
74
+ ## 3. Doc tests
75
+
76
+ - Every public function with a non-obvious use gets an example. Doc tests compile and run with `cargo test` (`cargo test --doc` for only these).
77
+ - Use `?` in examples by ending with `# Ok::<(), Box<dyn std::error::Error>>(())`; lines starting with `# ` are hidden from the rendered docs.
78
+ - Mark examples `no_run` when they need network or files, `compile_fail` to prove misuse doesn't compile, `ignore` only with a written reason.
79
+ - Doc tests run only for library targets. `cargo nextest` does not run doc tests, so CI that uses nextest needs a separate `cargo test --doc` step.
80
+
81
+ ## 4. Fakes and mocks via traits
82
+
83
+ Rust has no runtime monkey-patching. Make the boundary a trait and inject it.
84
+
85
+ 1. Define a small trait for the external dependency (clock, HTTP client, repository).
86
+ 2. Make the code under test generic over it (`struct Service<R: Repo>`) or take `&dyn Repo` / `Arc<dyn Repo>`.
87
+ 3. In tests, prefer a hand-written fake (an in-memory `HashMap` store) for state; use `mockall` (`#[cfg_attr(test, mockall::automock)]` on the trait) when you must assert on calls.
88
+ 4. Never mock the type under test, and never mock pure functions you could just call.
89
+
90
+ Examples for fakes, mockall expectations and time control: `references/fakes-proptest-async.md`.
91
+
92
+ ## 5. Property tests with proptest
93
+
94
+ Use them for parsers, encoders, data structures and anything with an invariant ("decode(encode(x)) == x", "sorted output is a permutation of input").
95
+
96
+ ```rust
97
+ use proptest::prelude::*;
98
+
99
+ proptest! {
100
+ #[test]
101
+ fn round_trips(s in "\\PC*") {
102
+ prop_assert_eq!(decode(&encode(&s)).unwrap(), s);
103
+ }
104
+ }
105
+ ```
106
+
107
+ - Use `prop_assert!` / `prop_assert_eq!` inside `proptest!` so failures shrink.
108
+ - Commit the `proptest-regressions/` files it writes; they replay past failures.
109
+
110
+ ## 6. Async tests
111
+
112
+ - `#[tokio::test]` runs on a current-thread runtime. Use `#[tokio::test(flavor = "multi_thread", worker_threads = 2)]` only when the code needs real parallelism (for example it calls `block_in_place`).
113
+ - `#[tokio::test]` needs tokio's `macros` and `rt` features for the test target (`[dev-dependencies] tokio = { ..., features = ["macros", "rt"] }`); the `multi_thread` flavor also needs `rt-multi-thread`.
114
+ - Don't sleep for real. With the `test-util` feature, `#[tokio::test(start_paused = true)]` and `tokio::time::advance` make timers instant and deterministic.
115
+ - Wrap anything that could hang in `tokio::time::timeout` so a bug fails the test instead of stalling CI.
116
+
117
+ ## 7. Running tests
118
+
119
+ | Goal | Command |
120
+ |---|---|
121
+ | Everything in a workspace | `cargo test --workspace --all-features` |
122
+ | Tests whose name contains a string | `cargo test parse_port` |
123
+ | One integration test file | `cargo test --test cli` |
124
+ | Only unit tests in the library | `cargo test --lib` |
125
+ | Only doc tests | `cargo test --doc` |
126
+ | Exact name match (full module path) | `cargo test -- --exact parser::tests::parses_port_from_host_string` |
127
+ | Show `println!` output | `cargo test -- --nocapture` |
128
+ | Run serially (shared global state) | `cargo test -- --test-threads=1` |
129
+ | Run ignored (slow) tests | `cargo test -- --ignored` or `-- --include-ignored` |
130
+ | Keep going after a failing test crate | `cargo test --no-fail-fast` |
131
+
132
+ Flags before `--` go to cargo; flags after `--` go to the test binary.
133
+
134
+ ## 8. Flaky tests
135
+
136
+ 1. Run the test alone and in a loop to reproduce: `for i in $(seq 50); do cargo test name -- --exact || break; done`.
137
+ 2. Common causes: tests sharing a file path, port, env var or global (run in parallel threads); real time; `HashMap` iteration order; unseeded randomness.
138
+ 3. Fix the cause: `tempfile::tempdir()` per test, bind port `0`, pass config instead of reading env vars, sort before asserting. `--test-threads=1` is a diagnostic, not a fix.
139
+
140
+ ## Never
141
+
142
+ - Never delete, `#[ignore]` or weaken an existing test to make the suite pass without the user's agreement.
143
+ - Never let tests touch the real network, the user's home directory or shared databases.
144
+ - Never assert on `format!("{:?}", ...)` output when a structured comparison is possible.
145
+
146
+ ## Report back
147
+
148
+ End with: tests added or changed (names and files), the exact command you ran, pass/fail counts, and anything not covered.
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Add unit tests for the tokenizer module in my Rust crate",
4
+ "How do I mock the HTTP client trait in Rust so my service tests don't hit the network?",
5
+ "My #[tokio::test] hangs forever when the retry backoff sleeps, how do I test it without waiting?",
6
+ "Where should integration tests go in a Rust library and how do I share helpers between them?",
7
+ "Write a proptest that checks my Rust serializer round-trips arbitrary input"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Refactor this Rust module to return thiserror errors instead of String",
11
+ "My Rust tests don't compile anymore after bumping tokio, error E0277 future is not Send",
12
+ "Review my Rust diff for blocking calls inside async functions",
13
+ "Write pytest fixtures for the Django user model",
14
+ "Set up Playwright end-to-end tests for the checkout flow"
15
+ ]
16
+ }
@@ -0,0 +1,113 @@
1
+ # Fakes, mockall, proptest strategies and async time
2
+
3
+ Read this when a test needs a test double, a custom proptest strategy, or control over time.
4
+
5
+ ## Hand-written fake
6
+
7
+ ```rust
8
+ pub trait Repo {
9
+ fn get(&self, id: u64) -> Result<Option<User>, RepoError>;
10
+ fn save(&self, user: &User) -> Result<(), RepoError>;
11
+ }
12
+
13
+ #[cfg(test)]
14
+ #[derive(Default)]
15
+ struct FakeRepo {
16
+ users: std::sync::Mutex<std::collections::HashMap<u64, User>>,
17
+ }
18
+
19
+ #[cfg(test)]
20
+ impl Repo for FakeRepo {
21
+ fn get(&self, id: u64) -> Result<Option<User>, RepoError> {
22
+ Ok(self.users.lock().unwrap().get(&id).cloned())
23
+ }
24
+ fn save(&self, user: &User) -> Result<(), RepoError> {
25
+ self.users.lock().unwrap().insert(user.id, user.clone());
26
+ Ok(())
27
+ }
28
+ }
29
+ ```
30
+
31
+ A fake keeps real behaviour (what you save, you can read back), so tests check outcomes instead of call sequences. Prefer it over a mock whenever state is involved.
32
+
33
+ ## mockall
34
+
35
+ ```rust
36
+ #[cfg_attr(test, mockall::automock)]
37
+ pub trait Mailer {
38
+ fn send(&self, to: &str, body: &str) -> Result<(), MailError>;
39
+ }
40
+
41
+ #[test]
42
+ fn sends_welcome_mail_once() {
43
+ let mut mailer = MockMailer::new();
44
+ mailer
45
+ .expect_send()
46
+ .withf(|to, _| to == "ama@example.com")
47
+ .times(1)
48
+ .returning(|_, _| Ok(()));
49
+
50
+ signup(&mailer, "ama@example.com").unwrap();
51
+ }
52
+ ```
53
+
54
+ - Expectations are checked when the mock is dropped; an unmet `times(1)` fails the test.
55
+ - Keep `mockall` in `[dev-dependencies]` and gate `automock` with `cfg_attr(test, ...)` so it never reaches release builds.
56
+ - If a mock needs more than three expectations, the unit is probably doing too much; consider a fake or a smaller seam.
57
+
58
+ ## Injecting time
59
+
60
+ ```rust
61
+ pub trait Clock { fn now(&self) -> std::time::SystemTime; }
62
+
63
+ struct FixedClock(std::time::SystemTime);
64
+ impl Clock for FixedClock { fn now(&self) -> std::time::SystemTime { self.0 } }
65
+ ```
66
+
67
+ Pass the clock into the code under test rather than calling `SystemTime::now()` inside it.
68
+
69
+ ## proptest strategies
70
+
71
+ ```rust
72
+ use proptest::prelude::*;
73
+
74
+ fn order() -> impl Strategy<Value = Order> {
75
+ (1u32..1000, prop::collection::vec("[a-z]{1,8}", 0..10))
76
+ .prop_map(|(qty, tags)| Order { qty, tags })
77
+ }
78
+
79
+ proptest! {
80
+ #![proptest_config(ProptestConfig::with_cases(512))]
81
+
82
+ #[test]
83
+ fn order_round_trips_through_text(o in order()) {
84
+ prop_assert_eq!(o.to_string().parse::<Order>().unwrap(), o);
85
+ }
86
+ }
87
+ ```
88
+
89
+ - Derive strategies for your own types with `prop_map` or, if the project uses it, `#[derive(Arbitrary)]` from `proptest-derive`.
90
+ - Use `prop_assume!` sparingly; filtering too many cases makes proptest give up.
91
+
92
+ ## Async time control (tokio `test-util` feature)
93
+
94
+ ```rust
95
+ #[tokio::test(start_paused = true)]
96
+ async fn retries_after_backoff() {
97
+ let handle = tokio::spawn(fetch_with_retry());
98
+ tokio::time::advance(std::time::Duration::from_secs(5)).await;
99
+ assert!(handle.await.unwrap().is_ok());
100
+ }
101
+ ```
102
+
103
+ With time paused, the runtime auto-advances to the next timer when every task is idle, so `sleep`-based code completes instantly and deterministically.
104
+
105
+ ## Temporary files
106
+
107
+ ```rust
108
+ let dir = tempfile::tempdir()?; // removed when `dir` is dropped
109
+ let path = dir.path().join("config.toml");
110
+ std::fs::write(&path, "port = 8080")?;
111
+ ```
112
+
113
+ Never write test files into the repository tree or a fixed path in `/tmp`.