@ketecode/loom 0.0.0-stage → 0.1.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 (656) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +516 -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/triggers.json +14 -0
  13. package/agents/code-simplifier/AGENT.md +74 -0
  14. package/agents/code-simplifier/evals/triggers.json +15 -0
  15. package/agents/cpp-build-resolver/AGENT.md +73 -0
  16. package/agents/cpp-build-resolver/evals/triggers.json +16 -0
  17. package/agents/cpp-reviewer/AGENT.md +59 -0
  18. package/agents/cpp-reviewer/evals/triggers.json +16 -0
  19. package/agents/csharp-build-resolver/AGENT.md +84 -0
  20. package/agents/csharp-build-resolver/evals/triggers.json +17 -0
  21. package/agents/csharp-reviewer/AGENT.md +88 -0
  22. package/agents/csharp-reviewer/evals/triggers.json +17 -0
  23. package/agents/dart-build-resolver/AGENT.md +80 -0
  24. package/agents/dart-build-resolver/evals/triggers.json +17 -0
  25. package/agents/dart-reviewer/AGENT.md +66 -0
  26. package/agents/dart-reviewer/evals/triggers.json +17 -0
  27. package/agents/database-reviewer/AGENT.md +72 -0
  28. package/agents/database-reviewer/evals/triggers.json +16 -0
  29. package/agents/django-reviewer/AGENT.md +61 -0
  30. package/agents/django-reviewer/evals/triggers.json +15 -0
  31. package/agents/doc-updater/AGENT.md +92 -0
  32. package/agents/doc-updater/evals/triggers.json +14 -0
  33. package/agents/e2e-runner/AGENT.md +88 -0
  34. package/agents/e2e-runner/evals/triggers.json +16 -0
  35. package/agents/fastapi-reviewer/AGENT.md +63 -0
  36. package/agents/fastapi-reviewer/evals/triggers.json +15 -0
  37. package/agents/flutter-reviewer/AGENT.md +70 -0
  38. package/agents/flutter-reviewer/evals/triggers.json +15 -0
  39. package/agents/fsharp-build-resolver/AGENT.md +81 -0
  40. package/agents/fsharp-build-resolver/evals/triggers.json +15 -0
  41. package/agents/fsharp-reviewer/AGENT.md +77 -0
  42. package/agents/fsharp-reviewer/evals/triggers.json +15 -0
  43. package/agents/go-build-resolver/AGENT.md +85 -0
  44. package/agents/go-build-resolver/evals/triggers.json +16 -0
  45. package/agents/go-reviewer/AGENT.md +66 -0
  46. package/agents/go-reviewer/evals/triggers.json +16 -0
  47. package/agents/healthcare-reviewer/AGENT.md +65 -0
  48. package/agents/healthcare-reviewer/evals/triggers.json +16 -0
  49. package/agents/i18n-reviewer/AGENT.md +64 -0
  50. package/agents/i18n-reviewer/evals/triggers.json +16 -0
  51. package/agents/infra-reviewer/AGENT.md +93 -0
  52. package/agents/infra-reviewer/evals/triggers.json +15 -0
  53. package/agents/java-build-resolver/AGENT.md +82 -0
  54. package/agents/java-build-resolver/evals/triggers.json +16 -0
  55. package/agents/java-reviewer/AGENT.md +64 -0
  56. package/agents/java-reviewer/evals/triggers.json +16 -0
  57. package/agents/kotlin-build-resolver/AGENT.md +89 -0
  58. package/agents/kotlin-build-resolver/evals/triggers.json +16 -0
  59. package/agents/kotlin-reviewer/AGENT.md +75 -0
  60. package/agents/kotlin-reviewer/evals/triggers.json +16 -0
  61. package/agents/mle-reviewer/AGENT.md +68 -0
  62. package/agents/mle-reviewer/evals/triggers.json +16 -0
  63. package/agents/network-config-reviewer/AGENT.md +68 -0
  64. package/agents/network-config-reviewer/evals/triggers.json +17 -0
  65. package/agents/payments-reviewer/AGENT.md +64 -0
  66. package/agents/payments-reviewer/evals/triggers.json +16 -0
  67. package/agents/performance-optimizer/AGENT.md +86 -0
  68. package/agents/performance-optimizer/evals/triggers.json +16 -0
  69. package/agents/perl-build-resolver/AGENT.md +84 -0
  70. package/agents/perl-build-resolver/evals/triggers.json +15 -0
  71. package/agents/perl-reviewer/AGENT.md +77 -0
  72. package/agents/perl-reviewer/evals/triggers.json +15 -0
  73. package/agents/php-build-resolver/AGENT.md +88 -0
  74. package/agents/php-build-resolver/evals/triggers.json +16 -0
  75. package/agents/php-reviewer/AGENT.md +61 -0
  76. package/agents/php-reviewer/evals/triggers.json +15 -0
  77. package/agents/planner/AGENT.md +75 -0
  78. package/agents/planner/evals/triggers.json +17 -0
  79. package/agents/pr-test-analyzer/AGENT.md +82 -0
  80. package/agents/pr-test-analyzer/evals/triggers.json +16 -0
  81. package/agents/python-build-resolver/AGENT.md +87 -0
  82. package/agents/python-build-resolver/evals/triggers.json +16 -0
  83. package/agents/python-reviewer/AGENT.md +63 -0
  84. package/agents/python-reviewer/evals/triggers.json +15 -0
  85. package/agents/rag-reviewer/AGENT.md +71 -0
  86. package/agents/rag-reviewer/evals/triggers.json +16 -0
  87. package/agents/react-reviewer/AGENT.md +70 -0
  88. package/agents/react-reviewer/evals/triggers.json +16 -0
  89. package/agents/refactor-cleaner/AGENT.md +82 -0
  90. package/agents/refactor-cleaner/evals/triggers.json +16 -0
  91. package/agents/ruby-build-resolver/AGENT.md +93 -0
  92. package/agents/ruby-build-resolver/evals/triggers.json +16 -0
  93. package/agents/ruby-reviewer/AGENT.md +62 -0
  94. package/agents/ruby-reviewer/evals/triggers.json +16 -0
  95. package/agents/rust-build-resolver/AGENT.md +98 -0
  96. package/agents/rust-build-resolver/evals/triggers.json +16 -0
  97. package/agents/rust-reviewer/AGENT.md +78 -0
  98. package/agents/rust-reviewer/evals/triggers.json +15 -0
  99. package/agents/security-reviewer/AGENT.md +84 -0
  100. package/agents/security-reviewer/evals/triggers.json +16 -0
  101. package/agents/silent-failure-hunter/AGENT.md +66 -0
  102. package/agents/silent-failure-hunter/evals/triggers.json +16 -0
  103. package/agents/solidity-reviewer/AGENT.md +70 -0
  104. package/agents/solidity-reviewer/evals/triggers.json +16 -0
  105. package/agents/swift-build-resolver/AGENT.md +85 -0
  106. package/agents/swift-build-resolver/evals/triggers.json +15 -0
  107. package/agents/swift-reviewer/AGENT.md +75 -0
  108. package/agents/swift-reviewer/evals/triggers.json +15 -0
  109. package/agents/typescript-build-resolver/AGENT.md +76 -0
  110. package/agents/typescript-build-resolver/evals/triggers.json +15 -0
  111. package/agents/typescript-reviewer/AGENT.md +76 -0
  112. package/agents/typescript-reviewer/evals/triggers.json +15 -0
  113. package/agents/vue-reviewer/AGENT.md +75 -0
  114. package/agents/vue-reviewer/evals/triggers.json +15 -0
  115. package/bin/kete-loom.js +683 -0
  116. package/commands/aside.md +19 -0
  117. package/commands/build-fix.md +26 -0
  118. package/commands/campaign.md +19 -0
  119. package/commands/changelog.md +36 -0
  120. package/commands/checkpoint.md +26 -0
  121. package/commands/codemap.md +25 -0
  122. package/commands/commit.md +26 -0
  123. package/commands/deps-audit.md +32 -0
  124. package/commands/epic-decompose.md +21 -0
  125. package/commands/explain.md +37 -0
  126. package/commands/feature-dev.md +22 -0
  127. package/commands/hookify.md +23 -0
  128. package/commands/i18n-check.md +39 -0
  129. package/commands/issue-sync.md +22 -0
  130. package/commands/jira.md +19 -0
  131. package/commands/learn.md +23 -0
  132. package/commands/loom.md +21 -0
  133. package/commands/loop.md +20 -0
  134. package/commands/model-route.md +27 -0
  135. package/commands/onboard.md +35 -0
  136. package/commands/orchestrate.md +21 -0
  137. package/commands/plan-feature.md +36 -0
  138. package/commands/postmortem.md +42 -0
  139. package/commands/pr-describe.md +39 -0
  140. package/commands/pr.md +22 -0
  141. package/commands/prd.md +41 -0
  142. package/commands/project-init.md +21 -0
  143. package/commands/refactor-clean.md +24 -0
  144. package/commands/resume-session.md +22 -0
  145. package/commands/review.md +35 -0
  146. package/commands/save-session.md +37 -0
  147. package/commands/security-scan.md +32 -0
  148. package/commands/sessions.md +21 -0
  149. package/commands/skill-create.md +21 -0
  150. package/commands/tdd.md +36 -0
  151. package/commands/test-coverage.md +24 -0
  152. package/commands/threat-model.md +36 -0
  153. package/commands/update-docs.md +25 -0
  154. package/commands/verify.md +21 -0
  155. package/hooks/block-dangerous-commands/HOOK.md +30 -0
  156. package/hooks/block-dangerous-commands/cases.json +50 -0
  157. package/hooks/block-dangerous-commands/hook.js +75 -0
  158. package/hooks/block-no-verify/HOOK.md +25 -0
  159. package/hooks/block-no-verify/cases.json +30 -0
  160. package/hooks/block-no-verify/hook.js +43 -0
  161. package/hooks/format-on-edit/HOOK.md +24 -0
  162. package/hooks/format-on-edit/hook.js +89 -0
  163. package/hooks/guard-secrets/HOOK.md +19 -0
  164. package/hooks/guard-secrets/cases.json +110 -0
  165. package/hooks/guard-secrets/hook.js +44 -0
  166. package/hooks/load-session-context/HOOK.md +20 -0
  167. package/hooks/load-session-context/hook.js +56 -0
  168. package/hooks/protect-files/HOOK.md +24 -0
  169. package/hooks/protect-files/cases.json +27 -0
  170. package/hooks/protect-files/hook.js +39 -0
  171. package/hooks/run.js +132 -0
  172. package/mcp/atlassian.json +11 -0
  173. package/mcp/chrome-devtools.json +18 -0
  174. package/mcp/cloudflare.json +11 -0
  175. package/mcp/context7.json +11 -0
  176. package/mcp/fetch.json +17 -0
  177. package/mcp/figma.json +11 -0
  178. package/mcp/git.json +17 -0
  179. package/mcp/github.json +11 -0
  180. package/mcp/linear.json +11 -0
  181. package/mcp/memory.json +18 -0
  182. package/mcp/notion.json +11 -0
  183. package/mcp/playwright.json +18 -0
  184. package/mcp/sentry.json +11 -0
  185. package/mcp/stripe.json +11 -0
  186. package/mcp/supabase.json +11 -0
  187. package/mcp/time.json +17 -0
  188. package/package.json +59 -4
  189. package/profiles.json +165 -0
  190. package/rules/common.md +21 -0
  191. package/rules/cpp.md +29 -0
  192. package/rules/csharp.md +25 -0
  193. package/rules/dart.md +29 -0
  194. package/rules/fsharp.md +28 -0
  195. package/rules/git.md +26 -0
  196. package/rules/go.md +29 -0
  197. package/rules/java.md +29 -0
  198. package/rules/kotlin.md +27 -0
  199. package/rules/perl.md +26 -0
  200. package/rules/php.md +28 -0
  201. package/rules/python.md +30 -0
  202. package/rules/ruby.md +27 -0
  203. package/rules/rust.md +26 -0
  204. package/rules/security.md +29 -0
  205. package/rules/swift.md +28 -0
  206. package/rules/testing.md +25 -0
  207. package/rules/typescript.md +29 -0
  208. package/schemas/skill-frontmatter.schema.json +52 -0
  209. package/scripts/lib/audit.js +96 -0
  210. package/scripts/lib/frontmatter.js +65 -0
  211. package/scripts/lib/hooks-install.js +292 -0
  212. package/scripts/lib/i18n.js +51 -0
  213. package/scripts/lib/inventory.js +85 -0
  214. package/scripts/lib/lint.js +158 -0
  215. package/scripts/lib/mcp-install.js +284 -0
  216. package/scripts/lib/profiles.js +128 -0
  217. package/scripts/lib/render.js +86 -0
  218. package/scripts/lib/rules-install.js +118 -0
  219. package/scripts/lib/skills.js +86 -0
  220. package/scripts/lib/targets.js +113 -0
  221. package/skills/accounting-api-integration/SKILL.md +81 -0
  222. package/skills/accounting-api-integration/evals/triggers.json +17 -0
  223. package/skills/accounting-api-integration/references/quickbooks.md +48 -0
  224. package/skills/accounting-api-integration/references/xero.md +45 -0
  225. package/skills/agent-harness-design/SKILL.md +125 -0
  226. package/skills/agent-harness-design/evals/triggers.json +21 -0
  227. package/skills/ai-media-generation/SKILL.md +89 -0
  228. package/skills/ai-media-generation/evals/triggers.json +16 -0
  229. package/skills/ai-media-generation/references/job-pipeline.md +76 -0
  230. package/skills/angular-patterns/SKILL.md +122 -0
  231. package/skills/angular-patterns/evals/triggers.json +16 -0
  232. package/skills/api-design/SKILL.md +96 -0
  233. package/skills/api-design/evals/triggers.json +18 -0
  234. package/skills/api-design/references/conventions.md +133 -0
  235. package/skills/architecture-decision-records/SKILL.md +98 -0
  236. package/skills/architecture-decision-records/evals/triggers.json +17 -0
  237. package/skills/article-writing/SKILL.md +108 -0
  238. package/skills/article-writing/evals/triggers.json +16 -0
  239. package/skills/aspnet-core-patterns/SKILL.md +149 -0
  240. package/skills/aspnet-core-patterns/evals/triggers.json +16 -0
  241. package/skills/auth-patterns/SKILL.md +104 -0
  242. package/skills/auth-patterns/evals/triggers.json +17 -0
  243. package/skills/auth-patterns/references/oauth-oidc.md +64 -0
  244. package/skills/autonomous-loops/SKILL.md +99 -0
  245. package/skills/autonomous-loops/evals/triggers.json +14 -0
  246. package/skills/aws-patterns/SKILL.md +91 -0
  247. package/skills/aws-patterns/evals/triggers.json +16 -0
  248. package/skills/azure-patterns/SKILL.md +86 -0
  249. package/skills/azure-patterns/evals/triggers.json +16 -0
  250. package/skills/benchmark-methodology/SKILL.md +88 -0
  251. package/skills/benchmark-methodology/evals/triggers.json +16 -0
  252. package/skills/benchmark-methodology/references/language-harnesses.md +130 -0
  253. package/skills/bgp-diagnostics/SKILL.md +84 -0
  254. package/skills/bgp-diagnostics/evals/triggers.json +18 -0
  255. package/skills/bgp-diagnostics/references/bgp-reference.md +81 -0
  256. package/skills/bioinformatics-workflows/SKILL.md +108 -0
  257. package/skills/bioinformatics-workflows/evals/triggers.json +16 -0
  258. package/skills/bioinformatics-workflows/references/commands.md +71 -0
  259. package/skills/bioinformatics-workflows/references/formats.md +24 -0
  260. package/skills/bioinformatics-workflows/references/workflow-managers.md +107 -0
  261. package/skills/brand-voice/SKILL.md +112 -0
  262. package/skills/brand-voice/evals/triggers.json +16 -0
  263. package/skills/browser-qa/SKILL.md +99 -0
  264. package/skills/browser-qa/evals/triggers.json +16 -0
  265. package/skills/bun-runtime/SKILL.md +93 -0
  266. package/skills/bun-runtime/evals/triggers.json +16 -0
  267. package/skills/cisco-ios-config/SKILL.md +101 -0
  268. package/skills/cisco-ios-config/evals/triggers.json +18 -0
  269. package/skills/cisco-ios-config/references/verification.md +63 -0
  270. package/skills/clickhouse-patterns/SKILL.md +101 -0
  271. package/skills/clickhouse-patterns/evals/triggers.json +18 -0
  272. package/skills/clickhouse-patterns/references/engines-and-views.md +138 -0
  273. package/skills/clinical-decision-support/SKILL.md +90 -0
  274. package/skills/clinical-decision-support/evals/triggers.json +16 -0
  275. package/skills/clinical-decision-support/references/cds-hooks.md +76 -0
  276. package/skills/clinical-decision-support/references/regulatory-boundaries.md +37 -0
  277. package/skills/code-tour/SKILL.md +97 -0
  278. package/skills/code-tour/evals/triggers.json +14 -0
  279. package/skills/codebase-onboarding/SKILL.md +112 -0
  280. package/skills/codebase-onboarding/evals/triggers.json +14 -0
  281. package/skills/cold-outreach-sequences/SKILL.md +90 -0
  282. package/skills/cold-outreach-sequences/evals/triggers.json +16 -0
  283. package/skills/content-repurposing/SKILL.md +82 -0
  284. package/skills/content-repurposing/evals/triggers.json +16 -0
  285. package/skills/context-budget/SKILL.md +84 -0
  286. package/skills/context-budget/evals/triggers.json +14 -0
  287. package/skills/conventional-commits/SKILL.md +144 -0
  288. package/skills/conventional-commits/evals/triggers.json +16 -0
  289. package/skills/cpp-patterns/SKILL.md +129 -0
  290. package/skills/cpp-patterns/evals/triggers.json +16 -0
  291. package/skills/cpp-patterns/references/cmake-and-tooling.md +88 -0
  292. package/skills/cpp-patterns/references/undefined-behaviour.md +75 -0
  293. package/skills/cpp-testing/SKILL.md +131 -0
  294. package/skills/cpp-testing/evals/triggers.json +16 -0
  295. package/skills/csharp-patterns/SKILL.md +110 -0
  296. package/skills/csharp-patterns/evals/triggers.json +17 -0
  297. package/skills/csharp-patterns/references/analyzers.md +59 -0
  298. package/skills/csharp-testing/SKILL.md +85 -0
  299. package/skills/csharp-testing/evals/triggers.json +17 -0
  300. package/skills/csharp-testing/references/integration-tests.md +77 -0
  301. package/skills/css-architecture/SKILL.md +143 -0
  302. package/skills/css-architecture/evals/triggers.json +16 -0
  303. package/skills/customs-trade-compliance/SKILL.md +95 -0
  304. package/skills/customs-trade-compliance/evals/triggers.json +16 -0
  305. package/skills/customs-trade-compliance/references/incoterms-2020.md +42 -0
  306. package/skills/dart-patterns/SKILL.md +157 -0
  307. package/skills/dart-patterns/evals/triggers.json +18 -0
  308. package/skills/dart-testing/SKILL.md +164 -0
  309. package/skills/dart-testing/evals/triggers.json +18 -0
  310. package/skills/data-analysis-notebooks/SKILL.md +113 -0
  311. package/skills/data-analysis-notebooks/evals/triggers.json +16 -0
  312. package/skills/data-analysis-notebooks/references/dataframe-pitfalls.md +49 -0
  313. package/skills/data-analysis-notebooks/references/statistics-pitfalls.md +24 -0
  314. package/skills/data-pipelines/SKILL.md +90 -0
  315. package/skills/data-pipelines/evals/triggers.json +16 -0
  316. package/skills/data-pipelines/references/orchestrators.md +64 -0
  317. package/skills/database-migrations/SKILL.md +102 -0
  318. package/skills/database-migrations/evals/triggers.json +16 -0
  319. package/skills/database-migrations/references/recipes.md +98 -0
  320. package/skills/database-migrations/references/tools.md +21 -0
  321. package/skills/dbt-patterns/SKILL.md +96 -0
  322. package/skills/dbt-patterns/evals/triggers.json +16 -0
  323. package/skills/dbt-patterns/references/yaml-examples.md +114 -0
  324. package/skills/deep-research/SKILL.md +107 -0
  325. package/skills/deep-research/evals/triggers.json +14 -0
  326. package/skills/dependency-audit/SKILL.md +103 -0
  327. package/skills/dependency-audit/evals/triggers.json +16 -0
  328. package/skills/dependency-audit/references/tools.md +124 -0
  329. package/skills/deployment-strategies/SKILL.md +108 -0
  330. package/skills/deployment-strategies/evals/triggers.json +16 -0
  331. package/skills/django-patterns/SKILL.md +123 -0
  332. package/skills/django-patterns/evals/triggers.json +16 -0
  333. package/skills/docker-patterns/SKILL.md +132 -0
  334. package/skills/docker-patterns/evals/triggers.json +16 -0
  335. package/skills/docker-patterns/references/dockerfiles.md +105 -0
  336. package/skills/e2e-testing-playwright/SKILL.md +94 -0
  337. package/skills/e2e-testing-playwright/evals/triggers.json +16 -0
  338. package/skills/e2e-testing-playwright/references/config-and-ci.md +129 -0
  339. package/skills/ef-core-patterns/SKILL.md +117 -0
  340. package/skills/ef-core-patterns/evals/triggers.json +16 -0
  341. package/skills/email-deliverability/SKILL.md +99 -0
  342. package/skills/email-deliverability/evals/triggers.json +17 -0
  343. package/skills/email-deliverability/references/dns-records.md +85 -0
  344. package/skills/error-handling-patterns/SKILL.md +112 -0
  345. package/skills/error-handling-patterns/evals/triggers.json +18 -0
  346. package/skills/error-handling-patterns/references/language-idioms.md +49 -0
  347. package/skills/estimation-and-scoping/SKILL.md +97 -0
  348. package/skills/estimation-and-scoping/evals/triggers.json +14 -0
  349. package/skills/evm-dapp-integration/SKILL.md +73 -0
  350. package/skills/evm-dapp-integration/evals/triggers.json +16 -0
  351. package/skills/fastapi-patterns/SKILL.md +127 -0
  352. package/skills/fastapi-patterns/evals/triggers.json +16 -0
  353. package/skills/ffmpeg-media-processing/SKILL.md +94 -0
  354. package/skills/ffmpeg-media-processing/evals/triggers.json +16 -0
  355. package/skills/ffmpeg-media-processing/references/recipes.md +112 -0
  356. package/skills/fhir-integration/SKILL.md +81 -0
  357. package/skills/fhir-integration/evals/triggers.json +16 -0
  358. package/skills/fhir-integration/references/search-and-bundles.md +73 -0
  359. package/skills/fhir-integration/references/smart-on-fhir.md +50 -0
  360. package/skills/flask-patterns/SKILL.md +132 -0
  361. package/skills/flask-patterns/evals/triggers.json +16 -0
  362. package/skills/flutter-patterns/SKILL.md +99 -0
  363. package/skills/flutter-patterns/evals/triggers.json +16 -0
  364. package/skills/flutterwave-integration/SKILL.md +75 -0
  365. package/skills/flutterwave-integration/evals/triggers.json +16 -0
  366. package/skills/flutterwave-integration/references/api.md +73 -0
  367. package/skills/flutterwave-integration/references/webhooks.md +49 -0
  368. package/skills/fsharp-patterns/SKILL.md +133 -0
  369. package/skills/fsharp-patterns/evals/triggers.json +16 -0
  370. package/skills/fsharp-testing/SKILL.md +136 -0
  371. package/skills/fsharp-testing/evals/triggers.json +16 -0
  372. package/skills/gcp-patterns/SKILL.md +86 -0
  373. package/skills/gcp-patterns/evals/triggers.json +16 -0
  374. package/skills/git-workflow/SKILL.md +114 -0
  375. package/skills/git-workflow/evals/triggers.json +16 -0
  376. package/skills/github-actions-ci/SKILL.md +117 -0
  377. package/skills/github-actions-ci/evals/triggers.json +16 -0
  378. package/skills/github-api-automation/SKILL.md +101 -0
  379. package/skills/github-api-automation/evals/triggers.json +17 -0
  380. package/skills/go-patterns/SKILL.md +118 -0
  381. package/skills/go-patterns/evals/triggers.json +17 -0
  382. package/skills/go-patterns/references/concurrency.md +162 -0
  383. package/skills/go-testing/SKILL.md +154 -0
  384. package/skills/go-testing/evals/triggers.json +17 -0
  385. package/skills/hexagonal-architecture/SKILL.md +89 -0
  386. package/skills/hexagonal-architecture/evals/triggers.json +17 -0
  387. package/skills/hipaa-compliance/SKILL.md +91 -0
  388. package/skills/hipaa-compliance/evals/triggers.json +18 -0
  389. package/skills/hipaa-compliance/references/safeguards.md +68 -0
  390. package/skills/hl7v2-integration/SKILL.md +69 -0
  391. package/skills/hl7v2-integration/evals/triggers.json +16 -0
  392. package/skills/hl7v2-integration/references/messages-and-ack.md +78 -0
  393. package/skills/homelab-network-setup/SKILL.md +125 -0
  394. package/skills/homelab-network-setup/evals/triggers.json +18 -0
  395. package/skills/homelab-network-setup/references/firewall-and-dns.md +45 -0
  396. package/skills/homelab-network-setup/references/wireguard.md +72 -0
  397. package/skills/hubtel-integration/SKILL.md +77 -0
  398. package/skills/hubtel-integration/evals/triggers.json +16 -0
  399. package/skills/hubtel-integration/references/api.md +92 -0
  400. package/skills/i18n-localization/SKILL.md +114 -0
  401. package/skills/i18n-localization/evals/triggers.json +16 -0
  402. package/skills/i18n-localization/references/libraries.md +52 -0
  403. package/skills/incident-postmortem/SKILL.md +118 -0
  404. package/skills/incident-postmortem/evals/triggers.json +14 -0
  405. package/skills/inventory-demand-planning/SKILL.md +89 -0
  406. package/skills/inventory-demand-planning/evals/triggers.json +16 -0
  407. package/skills/inventory-demand-planning/references/formulas.md +62 -0
  408. package/skills/investor-materials/SKILL.md +127 -0
  409. package/skills/investor-materials/evals/triggers.json +16 -0
  410. package/skills/investor-materials/references/templates.md +74 -0
  411. package/skills/invoicing-and-tax/SKILL.md +84 -0
  412. package/skills/invoicing-and-tax/evals/triggers.json +17 -0
  413. package/skills/invoicing-and-tax/references/e-invoicing.md +24 -0
  414. package/skills/invoicing-and-tax/references/invoice-fields.md +38 -0
  415. package/skills/invoicing-and-tax/references/rounding.md +26 -0
  416. package/skills/java-patterns/SKILL.md +141 -0
  417. package/skills/java-patterns/evals/triggers.json +17 -0
  418. package/skills/java-testing/SKILL.md +142 -0
  419. package/skills/java-testing/evals/triggers.json +16 -0
  420. package/skills/jetpack-compose-patterns/SKILL.md +88 -0
  421. package/skills/jetpack-compose-patterns/evals/triggers.json +16 -0
  422. package/skills/jira-integration/SKILL.md +92 -0
  423. package/skills/jira-integration/evals/triggers.json +17 -0
  424. package/skills/jpa-hibernate/SKILL.md +92 -0
  425. package/skills/jpa-hibernate/evals/triggers.json +18 -0
  426. package/skills/jpa-hibernate/references/mapping.md +99 -0
  427. package/skills/kotlin-multiplatform/SKILL.md +97 -0
  428. package/skills/kotlin-multiplatform/evals/triggers.json +16 -0
  429. package/skills/kotlin-patterns/SKILL.md +128 -0
  430. package/skills/kotlin-patterns/evals/triggers.json +16 -0
  431. package/skills/kotlin-testing/SKILL.md +117 -0
  432. package/skills/kotlin-testing/evals/triggers.json +16 -0
  433. package/skills/ktor-patterns/SKILL.md +135 -0
  434. package/skills/ktor-patterns/evals/triggers.json +18 -0
  435. package/skills/kubernetes-patterns/SKILL.md +106 -0
  436. package/skills/kubernetes-patterns/evals/triggers.json +16 -0
  437. package/skills/kubernetes-patterns/references/manifests.md +115 -0
  438. package/skills/laravel-patterns/SKILL.md +136 -0
  439. package/skills/laravel-patterns/evals/triggers.json +16 -0
  440. package/skills/linear-integration/SKILL.md +98 -0
  441. package/skills/linear-integration/evals/triggers.json +17 -0
  442. package/skills/literature-review/SKILL.md +109 -0
  443. package/skills/literature-review/evals/triggers.json +16 -0
  444. package/skills/literature-review/references/appraisal.md +41 -0
  445. package/skills/literature-review/references/search-sources.md +39 -0
  446. package/skills/llm-app-patterns/SKILL.md +97 -0
  447. package/skills/llm-app-patterns/evals/triggers.json +17 -0
  448. package/skills/llm-evals/SKILL.md +98 -0
  449. package/skills/llm-evals/evals/triggers.json +16 -0
  450. package/skills/llm-evals/references/graders.md +66 -0
  451. package/skills/logistics-exception-management/SKILL.md +90 -0
  452. package/skills/logistics-exception-management/evals/triggers.json +16 -0
  453. package/skills/manim-animations/SKILL.md +106 -0
  454. package/skills/manim-animations/evals/triggers.json +16 -0
  455. package/skills/market-research/SKILL.md +117 -0
  456. package/skills/market-research/evals/triggers.json +16 -0
  457. package/skills/marketing-campaign/SKILL.md +111 -0
  458. package/skills/marketing-campaign/evals/triggers.json +16 -0
  459. package/skills/mcp-server-patterns/SKILL.md +127 -0
  460. package/skills/mcp-server-patterns/evals/triggers.json +18 -0
  461. package/skills/mcp-server-patterns/references/protocol-notes.md +68 -0
  462. package/skills/metrics-dashboards/SKILL.md +113 -0
  463. package/skills/metrics-dashboards/evals/triggers.json +16 -0
  464. package/skills/ml-experiment-workflow/SKILL.md +125 -0
  465. package/skills/ml-experiment-workflow/evals/triggers.json +16 -0
  466. package/skills/mongodb-patterns/SKILL.md +115 -0
  467. package/skills/mongodb-patterns/evals/triggers.json +18 -0
  468. package/skills/mongodb-patterns/references/indexes-and-aggregation.md +94 -0
  469. package/skills/mpesa-daraja-integration/SKILL.md +70 -0
  470. package/skills/mpesa-daraja-integration/evals/triggers.json +16 -0
  471. package/skills/mpesa-daraja-integration/references/api.md +103 -0
  472. package/skills/mpesa-daraja-integration/references/callbacks.md +74 -0
  473. package/skills/mtn-momo-integration/SKILL.md +66 -0
  474. package/skills/mtn-momo-integration/evals/triggers.json +16 -0
  475. package/skills/mtn-momo-integration/references/api.md +153 -0
  476. package/skills/mtn-momo-integration/references/callbacks.md +92 -0
  477. package/skills/mtn-momo-integration/references/sandbox-and-go-live.md +51 -0
  478. package/skills/mtn-momo-integration/scripts/sandbox-setup.js +79 -0
  479. package/skills/mysql-patterns/SKILL.md +96 -0
  480. package/skills/mysql-patterns/evals/triggers.json +16 -0
  481. package/skills/mysql-patterns/references/explain.md +34 -0
  482. package/skills/mysql-patterns/references/online-ddl.md +41 -0
  483. package/skills/nestjs-patterns/SKILL.md +114 -0
  484. package/skills/nestjs-patterns/evals/triggers.json +16 -0
  485. package/skills/nestjs-patterns/references/testing.md +68 -0
  486. package/skills/network-automation/SKILL.md +107 -0
  487. package/skills/network-automation/evals/triggers.json +18 -0
  488. package/skills/network-automation/references/tool-snippets.md +153 -0
  489. package/skills/network-troubleshooting/SKILL.md +152 -0
  490. package/skills/network-troubleshooting/evals/triggers.json +18 -0
  491. package/skills/network-troubleshooting/references/commands.md +33 -0
  492. package/skills/nextjs-patterns/SKILL.md +150 -0
  493. package/skills/nextjs-patterns/evals/triggers.json +18 -0
  494. package/skills/nextjs-patterns/references/caching.md +87 -0
  495. package/skills/node-backend-patterns/SKILL.md +103 -0
  496. package/skills/node-backend-patterns/evals/triggers.json +16 -0
  497. package/skills/node-backend-patterns/references/templates.md +122 -0
  498. package/skills/nuxt-patterns/SKILL.md +103 -0
  499. package/skills/nuxt-patterns/evals/triggers.json +16 -0
  500. package/skills/parallel-agent-orchestration/SKILL.md +106 -0
  501. package/skills/parallel-agent-orchestration/evals/triggers.json +14 -0
  502. package/skills/paystack-integration/SKILL.md +59 -0
  503. package/skills/paystack-integration/evals/triggers.json +14 -0
  504. package/skills/paystack-integration/references/api.md +73 -0
  505. package/skills/paystack-integration/references/mobile-money.md +50 -0
  506. package/skills/paystack-integration/references/webhooks.md +80 -0
  507. package/skills/pci-dss-scope/SKILL.md +103 -0
  508. package/skills/pci-dss-scope/evals/triggers.json +18 -0
  509. package/skills/pci-dss-scope/references/saq-and-data.md +36 -0
  510. package/skills/perl-patterns/SKILL.md +135 -0
  511. package/skills/perl-patterns/evals/triggers.json +18 -0
  512. package/skills/perl-testing/SKILL.md +126 -0
  513. package/skills/perl-testing/evals/triggers.json +17 -0
  514. package/skills/php-patterns/SKILL.md +116 -0
  515. package/skills/php-patterns/evals/triggers.json +16 -0
  516. package/skills/php-testing/SKILL.md +123 -0
  517. package/skills/php-testing/evals/triggers.json +16 -0
  518. package/skills/postgres-patterns/SKILL.md +103 -0
  519. package/skills/postgres-patterns/evals/triggers.json +17 -0
  520. package/skills/postgres-patterns/references/explain.md +59 -0
  521. package/skills/postgres-patterns/references/locks.md +53 -0
  522. package/skills/prd-writing/SKILL.md +124 -0
  523. package/skills/prd-writing/evals/triggers.json +15 -0
  524. package/skills/prisma-patterns/SKILL.md +83 -0
  525. package/skills/prisma-patterns/evals/triggers.json +18 -0
  526. package/skills/prisma-patterns/references/prisma-8.md +46 -0
  527. package/skills/prisma-patterns/references/workflow.md +50 -0
  528. package/skills/privacy-compliance/SKILL.md +121 -0
  529. package/skills/privacy-compliance/evals/triggers.json +18 -0
  530. package/skills/privacy-compliance/references/jurisdictions.md +51 -0
  531. package/skills/production-scheduling/SKILL.md +98 -0
  532. package/skills/production-scheduling/evals/triggers.json +16 -0
  533. package/skills/prompt-engineering/SKILL.md +92 -0
  534. package/skills/prompt-engineering/evals/triggers.json +16 -0
  535. package/skills/python-patterns/SKILL.md +107 -0
  536. package/skills/python-patterns/evals/triggers.json +16 -0
  537. package/skills/python-patterns/references/tooling.md +101 -0
  538. package/skills/python-testing/SKILL.md +126 -0
  539. package/skills/python-testing/evals/triggers.json +16 -0
  540. package/skills/python-testing/references/mocking.md +71 -0
  541. package/skills/pytorch-patterns/SKILL.md +139 -0
  542. package/skills/pytorch-patterns/evals/triggers.json +16 -0
  543. package/skills/pytorch-patterns/references/debugging.md +39 -0
  544. package/skills/quarkus-patterns/SKILL.md +93 -0
  545. package/skills/quarkus-patterns/evals/triggers.json +18 -0
  546. package/skills/rag-pipeline-patterns/SKILL.md +117 -0
  547. package/skills/rag-pipeline-patterns/evals/triggers.json +18 -0
  548. package/skills/rag-pipeline-patterns/references/evaluation.md +37 -0
  549. package/skills/rag-pipeline-patterns/references/retrieval-recipes.md +78 -0
  550. package/skills/rails-patterns/SKILL.md +132 -0
  551. package/skills/rails-patterns/evals/triggers.json +16 -0
  552. package/skills/react-native-patterns/SKILL.md +101 -0
  553. package/skills/react-native-patterns/evals/triggers.json +16 -0
  554. package/skills/react-patterns/SKILL.md +140 -0
  555. package/skills/react-patterns/evals/triggers.json +18 -0
  556. package/skills/react-performance/SKILL.md +107 -0
  557. package/skills/react-performance/evals/triggers.json +18 -0
  558. package/skills/redis-patterns/SKILL.md +109 -0
  559. package/skills/redis-patterns/evals/triggers.json +18 -0
  560. package/skills/redis-patterns/references/operations.md +61 -0
  561. package/skills/refactoring-safely/SKILL.md +107 -0
  562. package/skills/refactoring-safely/evals/triggers.json +17 -0
  563. package/skills/release-management/SKILL.md +141 -0
  564. package/skills/release-management/evals/triggers.json +16 -0
  565. package/skills/remotion-video/SKILL.md +91 -0
  566. package/skills/remotion-video/evals/triggers.json +16 -0
  567. package/skills/remotion-video/references/lambda.md +66 -0
  568. package/skills/returns-reverse-logistics/SKILL.md +97 -0
  569. package/skills/returns-reverse-logistics/evals/triggers.json +16 -0
  570. package/skills/ruby-patterns/SKILL.md +127 -0
  571. package/skills/ruby-patterns/evals/triggers.json +18 -0
  572. package/skills/ruby-testing/SKILL.md +113 -0
  573. package/skills/ruby-testing/evals/triggers.json +18 -0
  574. package/skills/runbook-writing/SKILL.md +101 -0
  575. package/skills/runbook-writing/evals/triggers.json +14 -0
  576. package/skills/rust-patterns/SKILL.md +118 -0
  577. package/skills/rust-patterns/evals/triggers.json +16 -0
  578. package/skills/rust-patterns/references/cargo-and-clippy.md +105 -0
  579. package/skills/rust-patterns/references/errors-and-traits.md +97 -0
  580. package/skills/rust-testing/SKILL.md +148 -0
  581. package/skills/rust-testing/evals/triggers.json +16 -0
  582. package/skills/rust-testing/references/fakes-proptest-async.md +113 -0
  583. package/skills/search-first/SKILL.md +73 -0
  584. package/skills/search-first/evals/triggers.json +14 -0
  585. package/skills/security-review/SKILL.md +58 -0
  586. package/skills/security-review/evals/triggers.json +14 -0
  587. package/skills/security-review/references/checklist.md +54 -0
  588. package/skills/security-review/scripts/scan-secrets.js +79 -0
  589. package/skills/seo-audit/SKILL.md +111 -0
  590. package/skills/seo-audit/evals/triggers.json +16 -0
  591. package/skills/seo-audit/references/checks.md +65 -0
  592. package/skills/session-handoff/SKILL.md +101 -0
  593. package/skills/session-handoff/evals/triggers.json +14 -0
  594. package/skills/skill-authoring/SKILL.md +87 -0
  595. package/skills/skill-authoring/evals/triggers.json +14 -0
  596. package/skills/skill-authoring/references/frontmatter.md +40 -0
  597. package/skills/slack-app-integration/SKILL.md +108 -0
  598. package/skills/slack-app-integration/evals/triggers.json +17 -0
  599. package/skills/smart-contract-security/SKILL.md +110 -0
  600. package/skills/smart-contract-security/evals/triggers.json +16 -0
  601. package/skills/smart-contract-security/references/vulnerability-checklist.md +79 -0
  602. package/skills/social-media-publishing/SKILL.md +84 -0
  603. package/skills/social-media-publishing/evals/triggers.json +17 -0
  604. package/skills/social-media-publishing/references/platform-apis.md +116 -0
  605. package/skills/solidity-patterns/SKILL.md +95 -0
  606. package/skills/solidity-patterns/evals/triggers.json +16 -0
  607. package/skills/spring-boot-patterns/SKILL.md +128 -0
  608. package/skills/spring-boot-patterns/evals/triggers.json +18 -0
  609. package/skills/spring-boot-patterns/references/testing.md +72 -0
  610. package/skills/stripe-integration/SKILL.md +69 -0
  611. package/skills/stripe-integration/evals/triggers.json +16 -0
  612. package/skills/stripe-integration/references/api.md +71 -0
  613. package/skills/stripe-integration/references/billing.md +58 -0
  614. package/skills/stripe-integration/references/webhooks.md +76 -0
  615. package/skills/subscription-billing-ops/SKILL.md +118 -0
  616. package/skills/subscription-billing-ops/evals/triggers.json +17 -0
  617. package/skills/subscription-billing-ops/references/proration.md +47 -0
  618. package/skills/subscription-billing-ops/references/revenue-metrics.md +38 -0
  619. package/skills/svelte-patterns/SKILL.md +122 -0
  620. package/skills/svelte-patterns/evals/triggers.json +16 -0
  621. package/skills/swift-patterns/SKILL.md +113 -0
  622. package/skills/swift-patterns/evals/triggers.json +16 -0
  623. package/skills/swift-patterns/references/concurrency-migration.md +40 -0
  624. package/skills/swift-testing/SKILL.md +121 -0
  625. package/skills/swift-testing/evals/triggers.json +16 -0
  626. package/skills/swift-testing/references/swift-testing-cheatsheet.md +81 -0
  627. package/skills/swiftui-patterns/SKILL.md +102 -0
  628. package/skills/swiftui-patterns/evals/triggers.json +16 -0
  629. package/skills/tdd-workflow/SKILL.md +67 -0
  630. package/skills/tdd-workflow/evals/triggers.json +14 -0
  631. package/skills/technical-writing/SKILL.md +95 -0
  632. package/skills/technical-writing/evals/triggers.json +14 -0
  633. package/skills/terraform-patterns/SKILL.md +122 -0
  634. package/skills/terraform-patterns/evals/triggers.json +16 -0
  635. package/skills/terraform-patterns/references/backends.md +67 -0
  636. package/skills/test-coverage-improvement/SKILL.md +107 -0
  637. package/skills/test-coverage-improvement/evals/triggers.json +16 -0
  638. package/skills/threat-modeling/SKILL.md +113 -0
  639. package/skills/threat-modeling/evals/triggers.json +16 -0
  640. package/skills/typescript-patterns/SKILL.md +122 -0
  641. package/skills/typescript-patterns/evals/triggers.json +16 -0
  642. package/skills/typescript-testing/SKILL.md +101 -0
  643. package/skills/typescript-testing/evals/triggers.json +16 -0
  644. package/skills/verification-loop/SKILL.md +70 -0
  645. package/skills/verification-loop/evals/triggers.json +14 -0
  646. package/skills/verification-loop/scripts/detect-checks.js +102 -0
  647. package/skills/vite-patterns/SKILL.md +117 -0
  648. package/skills/vite-patterns/evals/triggers.json +16 -0
  649. package/skills/vue-patterns/SKILL.md +104 -0
  650. package/skills/vue-patterns/evals/triggers.json +16 -0
  651. package/skills/web-accessibility/SKILL.md +119 -0
  652. package/skills/web-accessibility/evals/triggers.json +16 -0
  653. package/skills/web-performance/SKILL.md +107 -0
  654. package/skills/web-performance/evals/triggers.json +16 -0
  655. package/skills/web-scraping/SKILL.md +80 -0
  656. package/skills/web-scraping/evals/triggers.json +16 -0
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Should this config object be a dataclass or a pydantic model? It's loaded from a YAML file users edit.",
4
+ "Set up a new Python package with pyproject.toml, uv, ruff and mypy strict",
5
+ "Modernise this Python 3.7-era module: add type hints, replace the dict soup with proper types",
6
+ "My asyncio service freezes whenever it calls the old requests-based client, how should I restructure it?",
7
+ "Design an exception hierarchy for our Python billing library so callers can catch the right errors"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Write pytest tests with fixtures and parametrize for the invoice module",
11
+ "Review this Python pull request for bugs before I merge it",
12
+ "mypy says 'Cannot find implementation or library stub for module named yaml', fix it",
13
+ "Add a FastAPI endpoint that creates a user and returns 201",
14
+ "Write idiomatic Go error handling for this HTTP handler"
15
+ ]
16
+ }
@@ -0,0 +1,101 @@
1
+ # Python tooling reference
2
+
3
+ Read this when setting up a new project or adding tooling to one that has none. If the project already configures a tool, keep its settings.
4
+
5
+ ## Package managers
6
+
7
+ | Task | uv | poetry | pip + venv |
8
+ |---|---|---|---|
9
+ | Create env | `uv venv` (or implicit on `uv sync`) | `poetry install` | `python -m venv .venv` then activate |
10
+ | Install from lock | `uv sync` | `poetry install` | `pip install -e ".[dev]"` or `pip install -r requirements.txt` |
11
+ | Install exactly the lock, fail if stale (CI) | `uv sync --locked` | `poetry check --lock && poetry install` | `pip install -r requirements.txt` (pinned via pip-tools) |
12
+ | Add runtime dep | `uv add httpx` | `poetry add httpx` | edit `[project.dependencies]`, reinstall |
13
+ | Add dev dep | `uv add --dev pytest` | `poetry add --group dev pytest` | edit `[dependency-groups]` (install with `pip install --group dev` on a pip that supports it) or `[project.optional-dependencies].dev` / a requirements file |
14
+ | Update lock | `uv lock` / `uv lock --upgrade-package httpx` | `poetry lock` / `poetry update httpx` | `pip-compile` (pip-tools) |
15
+ | Run a tool | `uv run pytest` | `poetry run pytest` | activate `.venv`, then `pytest` |
16
+
17
+ uv notes:
18
+ - `uv sync` is exact by default: it removes packages not in the lockfile.
19
+ - `--locked` errors if `uv.lock` is out of date; `--frozen` uses the lockfile without checking it.
20
+ - Dev dependencies live in `[dependency-groups]` and the `dev` group is synced by default; skip it with `--no-dev`.
21
+
22
+ ## Minimal pyproject.toml
23
+
24
+ ```toml
25
+ [project]
26
+ name = "acme-billing"
27
+ version = "0.1.0"
28
+ requires-python = ">=3.11"
29
+ dependencies = ["httpx>=0.27"]
30
+
31
+ [project.scripts]
32
+ acme-billing = "acme_billing.cli:main"
33
+
34
+ [dependency-groups]
35
+ dev = ["pytest", "ruff", "mypy"]
36
+
37
+ [build-system]
38
+ requires = ["hatchling"]
39
+ build-backend = "hatchling.build"
40
+ ```
41
+
42
+ Use a `src/` layout (`src/acme_billing/__init__.py`) so tests import the installed package, not the working directory.
43
+
44
+ ## ruff
45
+
46
+ ```toml
47
+ [tool.ruff]
48
+ line-length = 100
49
+ target-version = "py311"
50
+
51
+ [tool.ruff.lint]
52
+ select = ["E", "F", "W", "I", "B", "UP", "SIM", "S", "RUF"]
53
+ ```
54
+
55
+ - `ruff check .` lints, `ruff check --fix .` applies safe fixes, `ruff format .` formats (replaces black). `ruff format` does not sort imports; with `I` selected, `ruff check --fix` does that (replaces isort).
56
+ - `B` (bugbear) catches mutable defaults and loop-variable capture; `S` (bandit) catches `shell=True`, `eval` and hard-coded secrets; `UP` rewrites old syntax for `target-version`.
57
+ - Rule selectors live under `[tool.ruff.lint]`, not top-level `[tool.ruff]`.
58
+
59
+ ## mypy
60
+
61
+ ```toml
62
+ [tool.mypy]
63
+ python_version = "3.11"
64
+ strict = true
65
+ warn_unreachable = true
66
+
67
+ [[tool.mypy.overrides]]
68
+ module = ["legacy.*"]
69
+ ignore_errors = true
70
+ ```
71
+
72
+ - Turn on `strict` for new code; on an existing codebase enable it per package with `overrides` instead of all at once.
73
+ - Missing stubs: install `types-<pkg>` (for example `types-requests`), or set `ignore_missing_imports = true` in an override for that one module.
74
+ - `mypy --install-types` can fetch missing stub packages, but review what it adds.
75
+
76
+ ## pyright
77
+
78
+ ```toml
79
+ [tool.pyright]
80
+ pythonVersion = "3.11"
81
+ typeCheckingMode = "strict"
82
+ venvPath = "."
83
+ venv = ".venv"
84
+ ```
85
+
86
+ - `typeCheckingMode` is `off`, `basic`, `standard` or `strict`.
87
+ - If pyright can't resolve imports, it is almost always looking at the wrong interpreter: set `venvPath`/`venv` or run it inside the environment.
88
+
89
+ ## pre-commit
90
+
91
+ ```yaml
92
+ repos:
93
+ - repo: https://github.com/astral-sh/ruff-pre-commit
94
+ rev: <pin a release tag>
95
+ hooks:
96
+ - id: ruff-check # older ruff-pre-commit releases call it `ruff` (kept as a legacy alias)
97
+ args: [--fix]
98
+ - id: ruff-format
99
+ ```
100
+
101
+ Pin `rev` to a real tag; check the ruff-pre-commit releases page for the current one.
@@ -0,0 +1,126 @@
1
+ ---
2
+ name: python-testing
3
+ description: Writes and repairs pytest suites for Python code using fixtures and conftest.py, parametrize, monkeypatch and unittest.mock, tmp_path, pytest-asyncio for coroutines, coverage with pytest-cov, and a procedure for diagnosing flaky or order-dependent tests. Use when adding tests to a Python project, converting unittest-style tests to pytest, mocking an external call in a Python test, or chasing a pytest test that passes locally but fails in CI.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs python and pytest; async tests need pytest-asyncio (or anyio's pytest plugin), coverage needs pytest-cov.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: testing
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "python"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Python testing with pytest
15
+
16
+ Tests that are fast, deterministic and fail for one clear reason.
17
+
18
+ ## 0. Find the setup
19
+
20
+ 1. Find the test command: `[tool.pytest.ini_options]` in `pyproject.toml`, `pytest.ini`, `tox.ini`, `noxfile.py`, `Makefile`, CI config. Run through the env manager (`uv run pytest`, `poetry run pytest`, or an activated venv).
21
+ 2. Read the nearest `conftest.py` files. Reuse existing fixtures before writing new ones.
22
+ 3. Run the suite once and record the result. If it already fails, **stop and tell the user** which tests fail before you change anything.
23
+ 4. Note plugins in use (`pytest-asyncio`, `anyio`, `pytest-mock`, `pytest-django`, `pytest-xdist`, `hypothesis`). Follow their conventions; don't add a new plugin without asking.
24
+
25
+ ## 1. Writing a test
26
+
27
+ - File `tests/test_<module>.py`, function `test_<behaviour>_<condition>`, e.g. `test_total_rejects_negative_quantity`.
28
+ - One behaviour per test. Arrange, act, assert. Plain `assert`; pytest rewrites it to show values.
29
+ - Test through the public API. Don't assert on private helpers or call counts unless the call is the behaviour.
30
+ - Errors: `with pytest.raises(ValueError, match="negative"):`. Keep the `with` block to the single call that should raise.
31
+ - Floats: `assert x == pytest.approx(0.3)`.
32
+ - Warnings: `with pytest.warns(DeprecationWarning):`.
33
+
34
+ ## 2. Fixtures
35
+
36
+ - A fixture provides one thing. Name it for what it gives (`user`, `db_session`), not what it does.
37
+ - Cleanup goes after `yield` in the fixture:
38
+
39
+ ```python
40
+ @pytest.fixture
41
+ def client():
42
+ c = make_client()
43
+ yield c
44
+ c.close()
45
+ ```
46
+
47
+ - Scope: default `function`. Widen to `module` or `session` only for expensive, read-only resources; a shared mutable fixture causes order-dependent failures.
48
+ - Share fixtures through `conftest.py` in the closest directory that needs them, not one giant root file.
49
+ - Factories: when tests need several variants, return a function (`make_user(role="admin")`) rather than writing ten fixtures.
50
+ - Avoid `autouse=True` except for true global guards (blocking network, resetting a singleton).
51
+
52
+ ## 3. Parametrize
53
+
54
+ ```python
55
+ @pytest.mark.parametrize(
56
+ ("raw", "expected"),
57
+ [("1h", 3600), ("90s", 90), ("0m", 0)],
58
+ ids=["hours", "seconds", "zero"],
59
+ )
60
+ def test_parse_duration(raw, expected):
61
+ assert parse_duration(raw) == expected
62
+ ```
63
+
64
+ - Use it for the same behaviour over many inputs; use separate tests when the assertions differ.
65
+ - Give `ids` when values are long or unreadable.
66
+ - Mark one known case with `pytest.param(..., marks=pytest.mark.xfail(reason="#123"))` rather than deleting it.
67
+
68
+ ## 4. Patching and mocking
69
+
70
+ Decision rule: patch only boundaries you don't own or can't run fast (network, clock, randomness, subprocess, third-party SDKs). Never mock the unit under test.
71
+
72
+ - Environment and attributes: `monkeypatch.setenv("API_URL", "http://test")`, `monkeypatch.setattr(module, "fetch", fake)`, `monkeypatch.delenv(..., raising=False)`. Undone automatically.
73
+ - **Patch where the name is looked up, not where it is defined.** If `app/billing.py` does `from app.http import post`, patch `app.billing.post`.
74
+ - Use `unittest.mock.create_autospec(Real)` or `patch(..., autospec=True)` so the mock fails on wrong signatures.
75
+ - Coroutines: `AsyncMock` (used automatically by `patch` when the target is `async def`).
76
+ - Prefer a small fake class or an in-memory implementation over a deep chain of `MagicMock().a.b.return_value`.
77
+ - HTTP: use the project's existing tool (`respx` for httpx, `responses` for requests) instead of patching internals.
78
+ - Time: inject a clock, or use the project's freezer (`time-machine`, `freezegun`). Never `sleep` in a test to wait for time to pass.
79
+
80
+ More mocking patterns and pitfalls: `references/mocking.md`.
81
+
82
+ ## 5. Files and output
83
+
84
+ - `tmp_path` gives a fresh `pathlib.Path` per test; `tmp_path_factory` for session scope. Never write into the repo or `/tmp` directly.
85
+ - `capsys` / `capfd` for stdout and stderr, `caplog` for log records (`caplog.set_level(logging.INFO)` first).
86
+ - `monkeypatch.chdir(tmp_path)` when code uses relative paths.
87
+
88
+ ## 6. Async code
89
+
90
+ - pytest-asyncio: mark tests `@pytest.mark.asyncio`, or set `asyncio_mode = "auto"` in `[tool.pytest.ini_options]` so every `async def` test runs. The default mode is `strict`; in strict mode async fixtures need `@pytest_asyncio.fixture`. An unmarked `async def` test never runs: older pytest skips it with a warning, pytest 8.4+ fails it.
91
+ - If the project uses anyio (common with FastAPI/Starlette/httpx), use `@pytest.mark.anyio` and its `anyio_backend` fixture instead. Don't install both styles in one suite.
92
+ - Await everything. A test that calls a coroutine without `await` passes without running it; pytest emits a "coroutine was never awaited" warning. Treat that warning as a failure.
93
+ - Bound waits with `asyncio.timeout(...)` / `asyncio.wait_for(...)` so a hung test fails rather than blocks CI.
94
+ - Check the installed pytest-asyncio version's docs for event-loop scope options before changing loop scope; the API changed across releases.
95
+
96
+ ## 7. Coverage
97
+
98
+ - `pytest --cov=<package> --cov-report=term-missing` (pytest-cov). Use `--cov-branch` to see untaken branches.
99
+ - Read the missing lines; add tests for behaviour that matters (error paths, boundaries), not to hit a number.
100
+ - Respect `fail_under` in `[tool.coverage.report]` if set. Never lower it without asking.
101
+
102
+ ## 8. Flaky tests
103
+
104
+ Work through in order, and stop at the first cause you can prove:
105
+
106
+ 1. Reproduce: rerun the single test many times (`pytest path::test -x --count 50` with pytest-repeat if installed, or a shell loop).
107
+ 2. Order dependence: run it alone, then with the full file, then with pytest-randomly's seed from the failing run (`--randomly-seed=<seed>`), or disable shuffling with `-p no:randomly` to compare. Passing alone but failing in the suite means shared state: a module-level cache, a wide-scope mutable fixture, an unreset singleton, leaked env vars.
108
+ 3. Parallelism: compare with and without `-n auto` (pytest-xdist). Shared files, ports or DB rows break under xdist; use `tmp_path` and per-worker names (`worker_id` fixture).
109
+ 4. Time and randomness: dates near midnight or month end, timezones, unseeded `random`, set or dict ordering assumptions.
110
+ 5. Async and threads: missing `await`, sleeps used as synchronisation, tasks still running after the test ends.
111
+ 6. Real network or external services.
112
+
113
+ Fix the cause. Never "fix" flakiness by adding retries, `sleep`, or `@pytest.mark.skip` without the user agreeing; if you must quarantine, use `xfail(strict=False, reason=...)` with an issue link.
114
+
115
+ ## Rules
116
+
117
+ - Never delete, skip or weaken an existing test to get green. Explain to the user if you think a test is wrong.
118
+ - No real network, no real clock dependence, no shared state between tests.
119
+ - Run the single new test first, then its file, then the whole suite.
120
+ - After three focused attempts at a failing test, stop and report what you tried.
121
+
122
+ For test-first workflow (red, green, refactor), use the `tdd-workflow` skill. For browser-level tests, use `e2e-testing-playwright`.
123
+
124
+ ## Report back
125
+
126
+ Tests added or changed (names), the exact command run, pass/fail counts, coverage change if measured, and for flaky tests the proven root cause.
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Write pytest tests for the parse_invoice function, use parametrize for the edge cases",
4
+ "How do I mock the httpx call inside my service when testing it with pytest?",
5
+ "test_sync_orders passes on my machine but fails randomly in CI with pytest-xdist",
6
+ "Add tests for this async def fetch_rates coroutine, we use pytest-asyncio",
7
+ "Convert these unittest.TestCase classes to plain pytest functions with fixtures"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Should I use a dataclass or pydantic for this Python settings object?",
11
+ "Review my Python diff for mutable default arguments and swallowed exceptions",
12
+ "pip install fails with ResolutionImpossible on our Python project, sort it out",
13
+ "Write Jest tests for this TypeScript reducer",
14
+ "Write a Playwright end-to-end test for the login page"
15
+ ]
16
+ }
@@ -0,0 +1,71 @@
1
+ # Mocking and patching in pytest
2
+
3
+ Read this when a test needs to replace a dependency and the short rules in `SKILL.md` aren't enough.
4
+
5
+ ## Where to patch
6
+
7
+ ```python
8
+ # app/http.py
9
+ def post(url, data): ...
10
+
11
+ # app/billing.py
12
+ from app.http import post
13
+ def charge(amount): return post("/charge", {"amount": amount})
14
+ ```
15
+
16
+ - `patch("app.billing.post")` works: `charge` looks up `post` in `app.billing`.
17
+ - `patch("app.http.post")` does nothing for `charge`, because `app.billing` already holds its own reference.
18
+ - If the module does `import app.http` and calls `app.http.post(...)`, then patch `app.http.post`.
19
+
20
+ ## monkeypatch vs unittest.mock
21
+
22
+ | Need | Use |
23
+ |---|---|
24
+ | Set or remove an env var | `monkeypatch.setenv` / `monkeypatch.delenv` |
25
+ | Replace a function with a simple fake | `monkeypatch.setattr("app.billing.post", fake_post)` |
26
+ | Assert how a boundary was called | `mocker.patch(...)` (pytest-mock) or `unittest.mock.patch(...)` |
27
+ | Fake an object with a real class's signature | `create_autospec(RealClass, instance=True)` |
28
+ | Fake an `async def` | `AsyncMock`, or `patch(..., autospec=True)` on the coroutine function |
29
+
30
+ Both monkeypatch and `patch` used as a context manager or decorator undo themselves. A `patch(...).start()` without `.stop()` leaks into later tests; use `mocker` (pytest-mock) or a fixture with `yield` instead.
31
+
32
+ ## Asserting calls
33
+
34
+ ```python
35
+ from unittest.mock import patch
36
+
37
+ def test_charge_posts_amount():
38
+ with patch("app.billing.post", autospec=True) as post:
39
+ post.return_value = {"ok": True}
40
+ charge(500)
41
+ post.assert_called_once_with("/charge", {"amount": 500})
42
+ ```
43
+
44
+ - A plain `Mock` raises `AttributeError` for misspelled names starting with `assert` / `assret` / `asert` / `aseert` / `assrt`. On Python before 3.12, `post.called_once_with(...)` (no `assert_`) just creates a child mock and the test passes without checking anything; 3.12 also rejects that. Autospecced mocks reject unknown attributes on every version, so prefer `autospec=True`.
45
+ - `side_effect=Exception("boom")` to test error paths; `side_effect=[1, 2, StopIteration]` for sequences.
46
+
47
+ ## Fakes over mocks
48
+
49
+ For repositories, caches and queues, an in-memory fake is clearer than a mock:
50
+
51
+ ```python
52
+ class FakeUserRepo:
53
+ def __init__(self): self.users = {}
54
+ def get(self, uid): return self.users.get(uid)
55
+ def save(self, user): self.users[user.id] = user
56
+ ```
57
+
58
+ Inject it through the constructor or a fixture. The test then asserts on state (`repo.users`) instead of call sequences.
59
+
60
+ ## HTTP
61
+
62
+ - httpx: `respx` (`respx.mock` fixture or decorator) or `httpx.MockTransport`.
63
+ - requests: `responses` (`@responses.activate`) or `requests-mock`.
64
+ - Block accidental real calls in CI: the project's choice, for example pytest-socket's `--disable-socket`.
65
+
66
+ ## Common pitfalls
67
+
68
+ - Patching `datetime.datetime.now` directly fails (built-in type). Inject a clock or use `time-machine` / `freezegun`.
69
+ - `MagicMock` is truthy and returns more mocks for any attribute, so code under test can "succeed" on nonsense. Autospec, or use a fake.
70
+ - Mocks in a `session`-scoped fixture are shared by every test; keep mocks `function`-scoped.
71
+ - Over-mocking: if a test patches more than two or three things, test a smaller unit or use a fake.
@@ -0,0 +1,139 @@
1
+ ---
2
+ name: pytorch-patterns
3
+ description: Writes and fixes PyTorch training code, covering nn.Module and training loop structure, device and dtype placement, DataLoader setup, torch.amp mixed precision, checkpoint save and resume, seeding for reproducibility, and tracking down NaN losses and tensor shape errors. Use when building or debugging a PyTorch model, a training or evaluation loop, or a checkpoint that will not load.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs Python and PyTorch 2.x; GPU sections assume CUDA but the rules hold for CPU and MPS.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: ai
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "python"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # PyTorch patterns
15
+
16
+ Write training code that runs the same way twice, fails loudly on bad shapes, and can resume after a crash. For how to design the experiment itself (splits, baselines, metrics), use the `ml-experiment-workflow` skill instead.
17
+
18
+ ## 0. Before you write code
19
+
20
+ 1. Find the PyTorch version (`python -c "import torch; print(torch.__version__)"`) and the target device. Write for that version.
21
+ 2. Find the existing training entry point, config and data code. Extend them; do not start a second training script.
22
+ 3. **Stop and ask the user** if the target device, the metric being optimised, or the expected input shape is unclear.
23
+
24
+ ## 1. Structure
25
+
26
+ - One `nn.Module` per model. `__init__` builds layers; `forward` only computes. No data loading, logging or `.to(device)` inside `forward`.
27
+ - Keep three separate functions: `train_one_epoch(model, loader, optimizer, ...)`, `evaluate(model, loader)`, and a `main()` that wires config, data, model and checkpoints.
28
+ - Put hyperparameters in one config object (dataclass, YAML, argparse). Save it next to every checkpoint.
29
+ - Register non-trainable tensors with `self.register_buffer(...)` so they move with `.to()` and land in `state_dict`. Store sub-modules in `nn.ModuleList`/`nn.ModuleDict`, never a plain list or dict, or their parameters are invisible to the optimizer.
30
+
31
+ ## 2. The training step
32
+
33
+ ```python
34
+ use_amp = device.type == "cuda"
35
+ scaler = torch.amp.GradScaler("cuda", enabled=use_amp and amp_dtype == torch.float16)
36
+ model.train()
37
+ for x, y in loader:
38
+ x, y = x.to(device, non_blocking=True), y.to(device, non_blocking=True)
39
+ optimizer.zero_grad(set_to_none=True)
40
+ with torch.amp.autocast(device_type=device.type, dtype=amp_dtype, enabled=use_amp):
41
+ loss = criterion(model(x), y)
42
+ scaler.scale(loss).backward()
43
+ scaler.unscale_(optimizer) # only if clipping
44
+ torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm)
45
+ scaler.step(optimizer)
46
+ scaler.update()
47
+ scheduler.step() # per-step schedulers only
48
+ ```
49
+
50
+ Evaluation:
51
+
52
+ ```python
53
+ model.eval()
54
+ with torch.inference_mode():
55
+ for x, y in loader: ...
56
+ ```
57
+
58
+ Rules:
59
+
60
+ - Always pair `model.train()` / `model.eval()`. Forgetting `eval()` leaves dropout on and batch norm updating running stats.
61
+ - Log `loss.item()` (or `.detach()`) not `loss`, or you keep the whole graph alive and leak memory.
62
+ - Call `scheduler.step()` after `optimizer.step()`. Decide once whether the scheduler steps per batch or per epoch and match the schedule's length to that.
63
+ - For gradient accumulation, divide the loss by the number of accumulation steps and only step/zero the optimizer every N batches.
64
+
65
+ ## 3. Device and dtype
66
+
67
+ - Pick the device once: `device = torch.device("cuda" if torch.cuda.is_available() else "cpu")` (add `"mps"` if the project targets Apple silicon). Pass it down; do not call `.cuda()` in scattered places.
68
+ - Move the model to the device **before** creating the optimizer.
69
+ - Create new tensors on the right device and dtype: `torch.zeros(n, device=x.device, dtype=x.dtype)`, not `torch.zeros(n).to(...)` later.
70
+ - Classification targets for `CrossEntropyLoss` are `long` class indices of shape `(N,)` (or probabilities of shape `(N, C)`); logits are raw, no softmax first. `BCEWithLogitsLoss` takes float targets the same shape as the logits.
71
+
72
+ ## 4. Data loading
73
+
74
+ - `Dataset.__getitem__` returns one sample; batching is the `DataLoader`'s job.
75
+ - Training loader: `shuffle=True`, `num_workers>0`, `pin_memory=True` on CUDA, `persistent_workers=True` when `num_workers>0`, `drop_last=True` if batch norm sees tiny last batches.
76
+ - Eval loader: `shuffle=False`, `drop_last=False`, so every sample is scored once.
77
+ - Fit normalisation statistics, vocabularies and tokenizers on the training split only.
78
+ - First debug step for a slow loop: time an epoch with the model step removed. If the loader alone is slow, fix the loader before touching the model.
79
+
80
+ ## 5. Mixed precision
81
+
82
+ - Use the device-generic API: `torch.amp.autocast("cuda", dtype=...)` and `torch.amp.GradScaler("cuda")`. `torch.cuda.amp.*` is deprecated.
83
+ - `float16` needs a `GradScaler`. `bfloat16` (Ampere-class GPUs and newer, and CPU) has float32's range and is normally run without one; pass `enabled=False` to the scaler so the loop stays the same.
84
+ - Wrap only the forward pass and loss in `autocast`. Run `backward()` outside it.
85
+ - Use built-in ops for precision-sensitive maths (`log_softmax`, `cross_entropy`, `mse_loss`, `binary_cross_entropy_with_logits`): autocast runs these in float32. Hand-written `exp`/`log`/sum chains get no such protection.
86
+
87
+ ## 6. Checkpoints
88
+
89
+ Save everything needed to resume, not just the weights:
90
+
91
+ ```python
92
+ torch.save({
93
+ "model": model.state_dict(), "optimizer": optimizer.state_dict(),
94
+ "scheduler": scheduler.state_dict(), "scaler": scaler.state_dict(),
95
+ "epoch": epoch, "step": step, "config": asdict(cfg),
96
+ "rng": {"torch": torch.get_rng_state(), "cuda": torch.cuda.get_rng_state_all()},
97
+ }, tmp_path)
98
+ os.replace(tmp_path, path) # atomic: a crash never leaves a half-written file
99
+ ```
100
+
101
+ - Load with `torch.load(path, map_location=device)`. Since PyTorch 2.6 the default is `weights_only=True`, so a checkpoint holding custom objects fails to load. Store plain types (dicts, lists, tensors, numbers) instead, or allowlist the class with `torch.serialization.add_safe_globals([...])`. Only pass `weights_only=False` for files you created yourself.
102
+ - If the model was wrapped (`DistributedDataParallel`, `torch.compile`), save the unwrapped module's `state_dict` (`model.module` or `model._orig_mod`) so keys have no `module.` / `_orig_mod.` prefix.
103
+ - Keep the best checkpoint (by validation metric) separate from the latest one.
104
+
105
+ ## 7. Reproducibility
106
+
107
+ ```python
108
+ def seed_everything(seed: int):
109
+ random.seed(seed); np.random.seed(seed); torch.manual_seed(seed) # seeds all devices
110
+ ```
111
+
112
+ - DataLoader workers: pass `generator=torch.Generator().manual_seed(seed)` and a `worker_init_fn` that seeds NumPy and `random` from `torch.initial_seed() % 2**32`.
113
+ - For bit-exact runs: `torch.use_deterministic_algorithms(True)`, `torch.backends.cudnn.benchmark = False`, and set the environment variable `CUBLAS_WORKSPACE_CONFIG=:4096:8` before CUDA starts. This costs speed; turn it on for debugging and comparisons, not by default.
114
+ - Log the seed, the git commit and the library versions with each run.
115
+
116
+ ## 8. Debugging
117
+
118
+ Read `references/debugging.md` for the full NaN and shape checklists. The short version:
119
+
120
+ - **Shape errors**: print `x.shape` at each layer boundary for one batch, or assert expected shapes (`assert x.shape[1:] == (3, 224, 224), x.shape`). Watch for silent broadcasting: `(N,)` minus `(N, 1)` gives `(N, N)` without an error.
121
+ - **NaN or inf loss**: check the input batch first (`torch.isfinite(x).all()`), then the learning rate, then the loss (log of zero, division by zero), then fp16 overflow. Turn on `torch.autograd.set_detect_anomaly(True)` for one short run to find the op that produced it; it is slow, never leave it on.
122
+ - **Loss does not go down**: overfit a single batch of 2 to 32 samples. If the model can't drive loss near zero on one batch, the bug is in the model, loss or labels, not in the hyperparameters.
123
+
124
+ ## Never
125
+
126
+ - Never call `model(x)` for evaluation without `model.eval()` and `inference_mode()`/`no_grad()`.
127
+ - Never apply softmax before `CrossEntropyLoss` or sigmoid before `BCEWithLogitsLoss`.
128
+ - Never `torch.load` an untrusted file with `weights_only=False`.
129
+ - Never compare runs that used different seeds, data splits or eval code without saying so.
130
+
131
+ ## Report
132
+
133
+ When you change training code, end with:
134
+
135
+ ```
136
+ Changed: <files and what changed>
137
+ Verified: <command run, e.g. one-batch overfit or 1-epoch smoke run, and its result>
138
+ Not checked: <e.g. multi-GPU, full-length run>
139
+ ```
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "My PyTorch training loss turns into NaN after about 300 steps, help me find out why",
4
+ "Add bf16 mixed precision and gradient clipping to this torch training loop",
5
+ "RuntimeError: mat1 and mat2 shapes cannot be multiplied (64x2048 and 512x10) in my nn.Module",
6
+ "Make my PyTorch checkpoints resumable, including optimizer and scheduler state",
7
+ "Two runs of the same torch script with seed 42 give different accuracy, make it deterministic"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Set up a proper train/validation/test split and a baseline before we try the transformer",
11
+ "Review this training notebook for data leakage and wrong metrics before we publish the results",
12
+ "Write pytest unit tests for the Python utility module that parses CSV files",
13
+ "Build a retrieval pipeline that chunks our docs and stores embeddings in pgvector",
14
+ "Write an eval harness that scores our chatbot's answers against a golden set"
15
+ ]
16
+ }
@@ -0,0 +1,39 @@
1
+ # PyTorch debugging checklists
2
+
3
+ Read this when a run produces NaN/inf, a shape error, or a loss that will not move.
4
+
5
+ ## NaN or inf loss
6
+
7
+ Work top to bottom and stop at the first thing that is wrong.
8
+
9
+ 1. **Inputs.** For the failing batch: `torch.isfinite(x).all()`, `x.min()`, `x.max()`. Missing values in tabular data, empty images and divide-by-zero in preprocessing are the most common cause.
10
+ 2. **Labels.** Class indices must be in `[0, num_classes)`. An out-of-range label on CUDA often shows as a device-side assert; rerun on CPU, or with `CUDA_LAUNCH_BLOCKING=1`, to get a readable traceback.
11
+ 3. **Learning rate.** Drop it by 10x. If the NaN disappears, add warmup or gradient clipping (`clip_grad_norm_`) rather than keeping the smaller rate blindly.
12
+ 4. **Loss maths.** Replace hand-written `log(softmax(x))` with `log_softmax` or the built-in loss; add `eps` to denominators and to `sqrt`/`log` arguments.
13
+ 5. **Mixed precision.** Rerun with autocast disabled. If fp32 is stable, switch to bfloat16 or check that the `GradScaler` is used and that its scale is not collapsing (`scaler.get_scale()`).
14
+ 6. **Find the op.** Wrap one short run in `torch.autograd.set_detect_anomaly(True)`; the error names the backward op that produced the NaN. Or register forward hooks that assert `torch.isfinite(output).all()` per module.
15
+
16
+ ## Shape errors
17
+
18
+ 1. Print the shapes at the error line, and the shapes of the inputs to the module that raised it.
19
+ 2. Check the layer's expected layout: `Conv2d` wants `(N, C, H, W)`, `nn.Linear` acts on the last dimension, `nn.LSTM`/`nn.MultiheadAttention` default to `batch_first=False` (`(T, N, E)`).
20
+ 3. A `Linear` input-size mismatch after a conv stack: compute it from a dummy forward (`model.features(torch.zeros(1, *input_shape)).shape`) or use `nn.LazyLinear`.
21
+ 4. **Silent broadcasting.** These run without error and give wrong numbers:
22
+ - `pred` of shape `(N, 1)` with `target` of shape `(N,)` in `MSELoss` or arithmetic: result is `(N, N)`. PyTorch warns for `MSELoss`; it does not warn for plain arithmetic.
23
+ - `x.sum()` or `x.mean()` without `dim=` collapsing the batch.
24
+ - `view` after `permute`/`transpose` on a non-contiguous tensor raises; `reshape` silently copies. Neither is wrong, but a `view(N, -1)` over the wrong axis order scrambles data. Check with a small hand-made tensor.
25
+ 5. Add shape asserts at module boundaries in the fixed code, so the next regression fails loudly.
26
+
27
+ ## Loss does not decrease
28
+
29
+ 1. Overfit one small batch for a few hundred steps. Failure means a bug, not tuning.
30
+ 2. Check the optimizer sees the parameters: `sum(p.numel() for g in optimizer.param_groups for p in g["params"])` equals the model's trainable count.
31
+ 3. Check gradients flow: after `backward()`, every trainable parameter has a non-None, non-zero `.grad`. A `None` grad usually means a `.detach()`, `.item()`, `torch.no_grad()` or a NumPy round-trip broke the graph.
32
+ 4. Check `optimizer.zero_grad()` is called each step, and that `requires_grad` is not off on layers you meant to train.
33
+ 5. Check the labels line up with the inputs (shuffle applied to one but not the other, off-by-one in a sequence target).
34
+
35
+ ## Out of memory
36
+
37
+ 1. Log `torch.cuda.max_memory_allocated()` per step.
38
+ 2. Look for tensors kept across steps: accumulating `loss` instead of `loss.item()`, appending outputs to a list during training.
39
+ 3. Then reduce batch size with gradient accumulation, enable mixed precision, or use activation checkpointing (`torch.utils.checkpoint.checkpoint`).
@@ -0,0 +1,93 @@
1
+ ---
2
+ name: quarkus-patterns
3
+ description: Quarkus service conventions for ArC CDI beans, Quarkus REST (formerly RESTEasy Reactive) endpoints, Hibernate ORM with Panache, @ConfigMapping and %dev/%test/%prod profiles, Dev Services containers, GraalVM native-image limits, and @QuarkusTest or @QuarkusIntegrationTest suites. Use when writing or debugging a Quarkus application, choosing blocking versus reactive endpoints, configuring a Quarkus extension, or getting a Quarkus build to work as a native executable.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs a JDK and the project's Maven or Gradle wrapper (or the Quarkus CLI). Dev Services and container tests need Docker or Podman. Native builds need GraalVM/Mandrel or a container runtime. Written for Quarkus 3.x.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: coding
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "java"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Quarkus patterns
15
+
16
+ Quarkus moves work to build time. Most surprises come from forgetting that: beans, config and reflection are resolved when the app is built, not when it starts. Write code that the build can see.
17
+
18
+ ## 0. Before you start
19
+
20
+ 1. Read the Quarkus version and extensions from `pom.xml` (`quarkus-bom`) or `build.gradle(.kts)`. Note whether the project uses `quarkus-rest` (Quarkus REST) or the legacy `quarkus-resteasy` (Classic). **Never mix** `quarkus-rest*` and `quarkus-resteasy*` extensions; that causes duplicate-implementation startup errors.
21
+ 2. Find the build and test command: `./mvnw verify`, `./gradlew build`, or `quarkus build`. Run tests once and record the result; stop and tell the user if they already fail.
22
+ 3. Add extensions with `./mvnw quarkus:add-extension -Dextensions="..."` or `quarkus ext add ...`, not by guessing artifact ids.
23
+
24
+ ## 1. CDI (ArC)
25
+
26
+ - Default to `@ApplicationScoped` for services. Use `@Singleton` only when you need no client proxy, and `@RequestScoped` for per-request state.
27
+ - Use constructor injection; a single constructor needs no `@Inject`. Package-private field injection also works without reflection, but private field injection forces reflection; avoid it.
28
+ - ArC discovers beans at build time. A class in a dependency jar without a Jandex index is invisible; add the index (`jandex-maven-plugin`) or `quarkus.index-dependency.*` config.
29
+ - Unused beans are removed at build time. If a bean is only looked up programmatically, mark it `@Unremovable`.
30
+ - Produce third-party objects with `@Produces` methods in an `@ApplicationScoped` class.
31
+ - Use `@Startup` or `void onStart(@Observes StartupEvent ev)` for startup work; keep it fast.
32
+
33
+ ## 2. REST endpoints (Quarkus REST)
34
+
35
+ - Resources use Jakarta REST annotations: `@Path`, `@GET`, `@POST`, `@Produces`, `@Consumes`. Add `quarkus-rest-jackson` (or `-jsonb`) for JSON.
36
+ - **Threading rule**: a method returning a plain type or `Response` runs on a worker thread and may block. A method returning `Uni` or `Multi` runs on the event loop and **must never block** (no JDBC, no `Thread.sleep`, no blocking HTTP). Use `@Blocking` or `@NonBlocking` to override when needed. Blocking on the event loop logs a "blocked thread" warning; treat it as a bug.
37
+ - Pick one model per service. Hibernate ORM (blocking) with plain return types is the simple default; use Hibernate Reactive with `Uni` only when the project already does.
38
+ - Return DTO records, not entities. Validate input with `quarkus-hibernate-validator` and `@Valid`.
39
+ - Map exceptions to responses with `@ServerExceptionMapper` methods (or an `ExceptionMapper`). Never leak stack traces.
40
+ - Call other services with the REST client: an interface annotated `@RegisterRestClient(configKey = "orders-api")`, injected with `@RestClient`, base URL in `quarkus.rest-client.orders-api.url`.
41
+
42
+ ## 3. Panache
43
+
44
+ - Choose one style per project and keep it:
45
+ - **Active record**: `class Order extends PanacheEntity` (gives a `Long id`), static finders like `Order.find("status", s).list()`.
46
+ - **Repository**: `class OrderRepository implements PanacheRepository<Order>`, injected into services. Easier to mock.
47
+ - Panache entities use public fields; Quarkus rewrites access into getters and setters at build time.
48
+ - Writes need a transaction: annotate the service or resource method with `@Transactional` (`jakarta.transaction`). Reads outside a transaction work but lazy loading after the method returns fails.
49
+ - Page large queries: `find(...).page(Page.of(index, size))`. Never `listAll()` on a table that grows.
50
+ - The fetch, N+1 and locking rules in the `jpa-hibernate` skill apply here too.
51
+
52
+ ## 4. Configuration and profiles
53
+
54
+ - Group related settings in an interface with `@ConfigMapping(prefix = "payments")`; use `@ConfigProperty(name = "...")` only for one-off values. Missing required values fail startup, which is what you want.
55
+ - Profiles prefix keys: `%dev.`, `%test.`, `%prod.` in `application.properties`, or `application-{profile}.properties`. A custom profile is set with `quarkus.profile`.
56
+ - Know the two kinds of config: **build-time** properties (marked with a lock in the config reference, such as `quarkus.datasource.db-kind`) are fixed when you build and can't be changed by environment at runtime. Runtime properties can be set by env vars (`QUARKUS_DATASOURCE_JDBC_URL`).
57
+ - Secrets come from environment variables or a config source like Vault or Kubernetes secrets, never committed properties.
58
+
59
+ ## 5. Dev Services
60
+
61
+ - With an extension such as `quarkus-jdbc-postgresql` and **no** URL configured, dev and test mode start a container automatically. Don't configure `%dev`/`%test` datasource URLs unless you want to opt out.
62
+ - Set `quarkus.datasource.devservices.image-name` to match the production database version.
63
+ - Dev Services never runs in prod. Production config must set real URLs and credentials.
64
+ - Use `quarkus dev` (or `./mvnw quarkus:dev`) for live reload and the Dev UI at `/q/dev-ui`.
65
+
66
+ ## 6. Native image constraints
67
+
68
+ Build with `./mvnw install -Dnative`, `./gradlew build -Dquarkus.native.enabled=true`, or `quarkus build --native`. Add `-Dquarkus.native.container-build=true` when no local GraalVM is installed. Native code is closed-world:
69
+
70
+ - Reflection, dynamic proxies and resources must be known at build time. Register classes used only reflectively (for example DTOs serialised by a library Quarkus doesn't know) with `@RegisterForReflection`; include resource files with `quarkus.native.resources.includes`.
71
+ - Static initialisers run at build time by default. Code that reads the clock, randomness, env vars or opens connections in a static block must be moved to runtime init.
72
+ - Prefer Quarkus extensions over plain libraries; extensions carry the native configuration.
73
+ - Run `@QuarkusIntegrationTest` against the native build. Passing JVM tests prove nothing about native.
74
+ - **Stop and ask the user** before switching a project to native: builds are slow and memory-hungry, and some libraries won't work.
75
+
76
+ ## 7. Testing
77
+
78
+ - `@QuarkusTest` starts the app once per test run in JVM mode, with Dev Services, on the `test` profile. Use REST Assured (`given().when().get("/orders/1").then().statusCode(200)`).
79
+ - `@QuarkusIntegrationTest` runs the packaged artifact (jar, native binary or container) as a black box; it can't inject beans.
80
+ - Mock beans with `@InjectMock` (needs `quarkus-junit5-mockito`); it works for normal-scoped beans like `@ApplicationScoped`; a `@Singleton` bean can only be mocked with `@MockitoConfig(convertScopes = true)`, which changes its scope in the test, so prefer making the bean `@ApplicationScoped`. Beans used during startup are not mocked. Use `@TestProfile` for different config; each profile restarts the app, so use few.
81
+ - Use `@TestTransaction` to roll back database changes after each test.
82
+ - Use a test resource (`@QuarkusTestResource`, or `@WithTestResource` to group tests by resource) only for dependencies Dev Services can't provide.
83
+
84
+ ## Never
85
+
86
+ - Blocking calls inside a `Uni`/`Multi` method or on the event loop.
87
+ - `quarkus-rest` and `quarkus-resteasy` in the same build.
88
+ - Private field injection or reflection-heavy libraries in a native build without registering them.
89
+ - Hard-coded datasource URLs in `%dev`/`%test` that disable Dev Services by accident.
90
+
91
+ ## Before you finish
92
+
93
+ Run the tests (and `-Dnative` integration tests if the project ships native). Report: extensions added, config keys and which profile they apply to, threading model of new endpoints, tests added, and the final test counts.
@@ -0,0 +1,18 @@
1
+ {
2
+ "should_trigger": [
3
+ "Build a Quarkus REST endpoint backed by Panache and make it compile to a native image",
4
+ "Quarkus logs 'You have attempted to perform a blocking operation on an IO thread' in my Uni endpoint",
5
+ "How do Dev Services in Quarkus start Postgres for tests, and why did it stop after I set a JDBC url?",
6
+ "Set up %dev and %prod profiles with @ConfigMapping in our Quarkus microservice",
7
+ "My Quarkus native executable fails at runtime with a ClassNotFoundException for a Jackson DTO",
8
+ "Use @InjectMock in a @QuarkusTest to replace the payment client bean"
9
+ ],
10
+ "should_not_trigger": [
11
+ "Add a new REST endpoint to our Spring Boot order service with request validation and proper 404 responses",
12
+ "Write a Ktor route for uploading files with coroutines",
13
+ "Add a Flyway migration that adds a NOT NULL column to the orders table without downtime",
14
+ "Write the Dockerfile and Kubernetes deployment for our Java service",
15
+ "Explain idiomatic Java records and sealed interfaces for our domain model",
16
+ "Our Gradle build fails with a dependency resolution conflict in the Java module"
17
+ ]
18
+ }