@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,107 @@
1
+ ---
2
+ name: python-app-distribution
3
+ description: Ships a Python application to people who do not have Python, by freezing it with PyInstaller or compiling it with Nuitka per target OS, wrapping Windows builds in an Inno Setup or MSIX installer with Authenticode signing, signing macOS app bundles with a Developer ID under the hardened runtime and notarizing them with notarytool, and publishing wheels and an sdist to PyPI through GitHub trusted publishing. Use when turning a Python script, CLI or Qt/Tk GUI into a downloadable .exe, .app or .dmg, an installer, or a pip-installable release, or when a frozen build misses data files, gets flagged by SmartScreen or Gatekeeper, or a PyPI upload needs to drop API tokens.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Builds must run on each target OS (no cross-compiling); macOS signing needs Xcode command line tools and an Apple Developer account, Windows signing needs a code-signing certificate or signing service.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: devops
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "python"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Python app distribution
15
+
16
+ Ship a build the user can double-click or `pip install` without warnings, missing files or a second Python install, built the same way every time in CI.
17
+
18
+ Project layout, `pyproject.toml` tooling and code style belong to `python-patterns`. Version numbers and changelogs belong to `release-management`. This skill covers turning a working app into artifacts and getting them signed and published.
19
+
20
+ ## 0. Decide the channel
21
+
22
+ Ask, or infer from the project:
23
+
24
+ | Users | Ship |
25
+ |---|---|
26
+ | Developers who have Python | Wheel + sdist on PyPI (`pip install`, `pipx install`, `uv tool install`) |
27
+ | End users on Windows | Frozen app inside an installer (Inno Setup `.exe`, or MSIX) |
28
+ | End users on macOS | Signed, notarized `.app`, usually inside a `.dmg` |
29
+ | End users on Linux | Frozen folder in a tarball, or AppImage/Flatpak (check the project's preference) |
30
+
31
+ If both developers and end users are targets, do both. If signing credentials do not exist yet, **stop and ask**: who owns the Apple Developer account and the Windows certificate, and where CI may read them.
32
+
33
+ ## 1. Make the app freezable
34
+
35
+ 1. One entry point (`src/app/__main__.py` or a `[project.scripts]` function).
36
+ 2. Read bundled data through `importlib.resources`, or through a helper that checks `getattr(sys, "frozen", False)` and `sys._MEIPASS` for PyInstaller. Never rely on the current working directory.
37
+ 3. Write user data to the platform's user directory (`platformdirs`), never next to the executable; `Program Files` and signed `.app` bundles are read-only.
38
+ 4. Pin dependencies with a lockfile so builds are repeatable.
39
+
40
+ ## 2. Freeze
41
+
42
+ ### PyInstaller
43
+
44
+ 1. `pyinstaller --name MyApp --windowed --onedir src/app/__main__.py` once, then commit the generated `MyApp.spec` and build from it: `pyinstaller MyApp.spec --clean --noconfirm`.
45
+ 2. Declare data files and hidden imports in the spec (`datas`, `hiddenimports`), not by copying files after the build.
46
+ 3. Prefer `--onedir` for GUI apps inside an installer or `.app`: faster start, fewer antivirus false positives. Use `--onefile` only for a single-file CLI download.
47
+ 4. Build on each OS and architecture you ship (Windows x64, macOS arm64 and x86_64 or universal2, Linux on the oldest glibc you support). PyInstaller does not cross-compile.
48
+
49
+ ### Nuitka
50
+
51
+ `python -m nuitka --mode=standalone --include-data-dir=src/app/assets=assets src/app/__main__.py` (or `--mode=onefile`, `--mode=app` on macOS). Test standalone first; data-file problems are easier to see there. Expect longer builds and a C compiler requirement; Nuitka's benefit is speed and harder-to-unpack code, not secrecy.
52
+
53
+ ### Smoke test the frozen build
54
+
55
+ Run the built executable on a clean machine or VM without Python, exercise the main path, and check its log for `ModuleNotFoundError` or missing files.
56
+
57
+ ## 3. Windows: installer and signing
58
+
59
+ 1. Installer: Inno Setup script (`installer.iss`) compiled with `iscc installer.iss`, or MSIX packaged with `makeappx pack` (MSIX gives clean uninstall and Store distribution; it needs a manifest and signing with a matching publisher). Details in `references/windows-macos-signing.md`.
60
+ 2. Sign the app executable first, then the installer: `signtool sign /fd SHA256 /tr <timestamp URL> /td SHA256 ...`. Always timestamp so signatures outlive the certificate.
61
+ 3. Code-signing keys now live in hardware or a cloud signing service (for example Azure Artifact Signing, formerly Trusted Signing, or a CA's cloud HSM); plan CI around that, not around a `.pfx` in a secret.
62
+ 4. A new certificate still builds SmartScreen reputation gradually; tell the user to expect warnings on the first downloads.
63
+
64
+ ## 4. macOS: sign, notarize, staple
65
+
66
+ 1. Sign every binary inside the bundle, inside out, with the hardened runtime and a secure timestamp: `codesign --force --options runtime --timestamp --entitlements entitlements.plist --sign "Developer ID Application: <Team> (<TEAMID>)" MyApp.app` (nested `.dylib`/`.so` files first, or use the PyInstaller `--codesign-identity` option and re-check).
67
+ 2. Verify: `codesign --verify --deep --strict --verbose=2 MyApp.app`.
68
+ 3. Package (`.dmg` via `hdiutil create`, or a `.zip`), sign the `.dmg`, then notarize: `xcrun notarytool submit MyApp.dmg --keychain-profile <profile> --wait`.
69
+ 4. On failure read the log: `xcrun notarytool log <submission-id> --keychain-profile <profile>`.
70
+ 5. Staple: `xcrun stapler staple MyApp.dmg`, then check with `spctl --assess --type open --context context:primary-signature -v MyApp.dmg`.
71
+
72
+ Entitlements, CI keychain setup and common notarization errors are in `references/windows-macos-signing.md`.
73
+
74
+ ## 5. PyPI: wheels, sdist, trusted publishing
75
+
76
+ 1. Build backend declared in `pyproject.toml` (`hatchling`, `setuptools`, `flit-core`, `uv_build`, or `maturin`/`scikit-build-core` for compiled extensions).
77
+ 2. Build: `python -m build` (or `uv build`), then `twine check dist/*`. Install the wheel into a fresh virtual environment and run the CLI once.
78
+ 3. Compiled extensions: build platform wheels with `cibuildwheel` in CI; pure Python ships one `py3-none-any` wheel.
79
+ 4. Publish from CI with trusted publishing, no API token: register the publisher on PyPI (project settings, or a pending publisher for a new project) naming the repository, workflow file and environment; the workflow then needs `permissions: id-token: write` and `pypa/gh-action-pypi-publish@release/v1`. Template in `references/pypi-trusted-publishing.md`.
80
+ 5. Rehearse on TestPyPI first. A version number can never be re-uploaded, even after deleting it.
81
+
82
+ ## 6. CI
83
+
84
+ One workflow, triggered by a version tag: a build matrix per OS that freezes, signs, smoke-tests and uploads artifacts; a publish job that needs the builds and runs in a protected environment with required reviewers. Secrets (Apple app-specific password or API key, signing credentials) live only in that environment.
85
+
86
+ ## Never
87
+
88
+ - Never commit certificates, `.p12` files, passwords or PyPI tokens.
89
+ - Never tell users to disable Gatekeeper, SmartScreen or antivirus as the fix.
90
+ - Never ship an unsigned build labelled as a release when signing was expected; ask first.
91
+ - Never publish to PyPI from a developer laptop when the project has a CI publisher.
92
+
93
+ ## Regulated or high-stakes distribution
94
+
95
+ Export controls on cryptography, app-store rules and licence obligations of bundled libraries (GPL/LGPL Qt bindings, for example) are not covered here. Flag them and have the owner or legal review before a public release.
96
+
97
+ ## Report back
98
+
99
+ ```
100
+ ## Distribution: <app> <version>
101
+ Channels: <PyPI | Windows installer | macOS dmg | Linux>
102
+ Builds: <OS/arch -> artifact, size>
103
+ Signing: Windows <signed+timestamped yes/no>, macOS <signed, notarized, stapled yes/no>
104
+ PyPI: <TestPyPI ok, trusted publisher configured, published yes/no>
105
+ Smoke tests: <clean-machine result per OS>
106
+ Open items: <credentials, reputation, licences>
107
+ ```
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Turn our PySide6 desktop tool into a signed Windows installer our customers can download",
4
+ "The PyInstaller build works on my machine but the exe can't find its icons and config file",
5
+ "macOS says our Python app is damaged and can't be opened; set up codesign and notarization",
6
+ "Publish our library to PyPI from GitHub Actions without storing an API token",
7
+ "Compile our Python CLI with Nuitka into a single binary for Linux and macOS"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Set up ruff, mypy and a pyproject.toml for our new Python service",
11
+ "Decide the next semantic version and write release notes for this sprint's changes",
12
+ "Pin the Python interpreter version so every developer and CI use the same one",
13
+ "Write a Dockerfile that runs our Python API in production",
14
+ "Write pytest fixtures for the billing module"
15
+ ]
16
+ }
@@ -0,0 +1,55 @@
1
+ # PyPI trusted publishing (GitHub Actions)
2
+
3
+ Read this when wiring a release workflow. Trusted publishing exchanges a short-lived GitHub OIDC token for a PyPI upload token; nothing long-lived is stored.
4
+
5
+ ## On PyPI
6
+
7
+ Project settings, Publishing, add a GitHub publisher with: owner, repository, workflow file name (for example `release.yml`) and environment name (for example `pypi`). For a project that does not exist yet, add a pending publisher from your account's Publishing page. Do the same on TestPyPI for rehearsals.
8
+
9
+ ## Workflow
10
+
11
+ ```yaml
12
+ name: release
13
+ on:
14
+ push:
15
+ tags: ["v*"]
16
+
17
+ jobs:
18
+ build:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.12"
25
+ - run: python -m pip install build twine
26
+ - run: python -m build
27
+ - run: twine check dist/*
28
+ - uses: actions/upload-artifact@v4
29
+ with:
30
+ name: dist
31
+ path: dist/
32
+
33
+ publish:
34
+ needs: build
35
+ runs-on: ubuntu-latest
36
+ environment: pypi # must match the publisher on PyPI
37
+ permissions:
38
+ id-token: write # required for trusted publishing
39
+ steps:
40
+ - uses: actions/download-artifact@v4
41
+ with:
42
+ name: dist
43
+ path: dist/
44
+ - uses: pypa/gh-action-pypi-publish@release/v1
45
+ ```
46
+
47
+ For TestPyPI add `with: repository-url: https://test.pypi.org/legacy/` and a separate environment.
48
+
49
+ Keep `id-token: write` on the publish job only, and protect the environment with required reviewers and a tag rule. Recent versions of the publish action also generate and upload attestations by default; leave that on.
50
+
51
+ ## Checks before the first real upload
52
+
53
+ - `name` and `version` in `pyproject.toml` are right; the version matches the tag.
54
+ - `readme`, `license` and `classifiers` render: `twine check` passes.
55
+ - A fresh `pip install` of the TestPyPI release works (`--extra-index-url https://pypi.org/simple/` so dependencies resolve).
@@ -0,0 +1,70 @@
1
+ # Windows installers and macOS signing
2
+
3
+ Read this when writing the installer script, setting up signing in CI or debugging a notarization failure. Check Apple's and Microsoft's current documentation before relying on a specific certificate product; both change their signing offerings.
4
+
5
+ ## Inno Setup (minimal)
6
+
7
+ ```ini
8
+ [Setup]
9
+ AppId={{8C5E2F0A-REPLACE-WITH-YOUR-GUID}}
10
+ AppName=MyApp
11
+ AppVersion=1.4.0
12
+ DefaultDirName={autopf}\MyApp
13
+ DefaultGroupName=MyApp
14
+ OutputBaseFilename=MyApp-1.4.0-setup
15
+ Compression=lzma2
16
+ SolidCompression=yes
17
+ ArchitecturesAllowed=x64compatible
18
+ ArchitecturesInstallIn64BitMode=x64compatible
19
+ PrivilegesRequiredOverridesAllowed=dialog
20
+
21
+ [Files]
22
+ Source: "dist\MyApp\*"; DestDir: "{app}"; Flags: recursesubdirs ignoreversion
23
+
24
+ [Icons]
25
+ Name: "{group}\MyApp"; Filename: "{app}\MyApp.exe"
26
+
27
+ [Run]
28
+ Filename: "{app}\MyApp.exe"; Flags: nowait postinstall skipifsilent
29
+ ```
30
+
31
+ Keep `AppId` fixed forever; upgrades find the old install by it. Compile with `iscc installer.iss`. Inno Setup can call the signer itself through a `SignTool=` entry so the uninstaller is signed too.
32
+
33
+ ## MSIX
34
+
35
+ Needs an `AppxManifest.xml` whose `Publisher` matches the signing certificate subject exactly. Package with `makeappx pack /d <folder> /p MyApp.msix`, sign with `signtool sign /fd SHA256 ...`. MSIX apps run with a virtualized file system and registry; test file writes and per-user settings.
36
+
37
+ ## signtool
38
+
39
+ ```
40
+ signtool sign /fd SHA256 /tr http://timestamp.example-ca.com /td SHA256 /a dist\MyApp\MyApp.exe
41
+ signtool verify /pa /v dist\MyApp\MyApp.exe
42
+ ```
43
+
44
+ Use the timestamp URL your CA or signing service documents. Cloud signing services ship their own signtool plug-in (dlib) and metadata file instead of `/a` or `/f`.
45
+
46
+ ## macOS entitlements for a frozen Python app
47
+
48
+ Frozen Python apps often need these under the hardened runtime:
49
+
50
+ ```xml
51
+ <key>com.apple.security.cs.allow-unsigned-executable-memory</key><true/>
52
+ <key>com.apple.security.cs.disable-library-validation</key><true/>
53
+ ```
54
+
55
+ Add only what the app needs; start without them and add one at a time if the signed app crashes at launch. Camera, microphone or Apple Events access also need usage strings in `Info.plist`.
56
+
57
+ ## macOS signing in CI
58
+
59
+ 1. Export the Developer ID Application certificate as `.p12`, store it base64-encoded with its password as CI secrets.
60
+ 2. In the job: create a temporary keychain (`security create-keychain`), import the `.p12` (`security import ... -T /usr/bin/codesign`), allow codesign access (`security set-key-partition-list -S apple-tool:,apple:`), sign, then delete the keychain.
61
+ 3. Notarize with an App Store Connect API key (`xcrun notarytool submit --key <p8> --key-id <id> --issuer <uuid>`) or an app-specific password stored with `xcrun notarytool store-credentials`.
62
+
63
+ ## Common notarization failures
64
+
65
+ | Message | Fix |
66
+ |---|---|
67
+ | The binary is not signed with a valid Developer ID certificate | A nested `.so`/`.dylib` was skipped; sign every Mach-O file |
68
+ | The signature does not include a secure timestamp | Add `--timestamp` |
69
+ | The executable does not have the hardened runtime enabled | Add `--options runtime` |
70
+ | Signed app fails after editing | Any change after signing breaks it; sign last, then package |
@@ -0,0 +1,107 @@
1
+ ---
2
+ name: python-patterns
3
+ description: Idiomatic modern Python 3 for writing and restructuring application code, covering type hints, dataclasses versus pydantic at trust boundaries, exception design, context managers, pyproject.toml packaging with uv, poetry or pip, ruff and mypy/pyright setup, and asyncio pitfalls. Use when writing new Python modules, modernising an older codebase, choosing how to model data or errors, or setting up a Python project's tooling.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Targets CPython 3.10+; notes call out 3.11 and 3.12 features. Needs python and one of uv, poetry or pip.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: coding
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "python"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Python patterns
15
+
16
+ Write Python the project's tools can check: typed, explicit about errors and resources, and packaged from one `pyproject.toml`.
17
+
18
+ ## 0. Read the project first
19
+
20
+ 1. Find the supported Python version: `requires-python` in `pyproject.toml`, `.python-version`, CI matrix. Never use syntax newer than the lowest supported version (for example `match` needs 3.10, `except*` and `asyncio.TaskGroup` need 3.11, `type X = ...` and `def f[T]()` need 3.12).
21
+ 2. Find the package manager: `uv.lock` means uv, `poetry.lock` means poetry, `requirements*.txt` or only `pyproject.toml` means pip. Use that tool; never mix them in one project.
22
+ 3. Find the linters and type checker: `[tool.ruff]`, `[tool.mypy]`, `[tool.pyright]` or `pyrightconfig.json`, `.pre-commit-config.yaml`. Follow their settings over this skill.
23
+ 4. If the project has none of these and the user wants a new setup, use `references/tooling.md`.
24
+
25
+ ## 1. Types
26
+
27
+ - Annotate every public function's parameters and return type. Inside function bodies, let inference work.
28
+ - Use built-in generics and unions: `list[str]`, `dict[str, int]`, `str | None` (3.10+). Use `typing` only for what builtins lack (`Protocol`, `TypedDict`, `Literal`, `Final`, `TypeVar`, `overload`).
29
+ - Accept abstract, return concrete: take `Iterable[T]` or `Mapping[K, V]` from `collections.abc`, return `list[T]` or `dict[K, V]`.
30
+ - Prefer `Protocol` over inheritance for "anything with a `.read()` method".
31
+ - `Any` is an escape hatch, not a type. If you need it, leave a comment saying why. Prefer `object` when you only pass a value through.
32
+ - Put imports used only in annotations under `if TYPE_CHECKING:` when they cause import cycles, and add `from __future__ import annotations` (or quote the annotation) so the name isn't evaluated at runtime, where it doesn't exist.
33
+ - Never silence the checker with a bare `# type: ignore`; use the code, e.g. `# type: ignore[arg-type]`, plus a reason.
34
+
35
+ ## 2. Modelling data
36
+
37
+ Decision rule:
38
+
39
+ | Data | Use |
40
+ |---|---|
41
+ | Internal value object, trusted input | `@dataclass(frozen=True, slots=True)` (`slots` needs 3.10) |
42
+ | Untrusted input: HTTP bodies, config files, queue messages, LLM output | pydantic `BaseModel` (or the project's existing validator) |
43
+ | A dict shape you can't change (JSON passed through) | `TypedDict` |
44
+ | Fixed set of choices | `enum.Enum` / `StrEnum` (3.11) or `Literal[...]` |
45
+
46
+ - Validate once at the boundary, then pass typed objects inward. Don't re-validate in every layer, and don't let raw `dict[str, Any]` travel through the core.
47
+ - Mutable defaults: never `def f(items=[])` or `items: list = []` on a dataclass. Use `None` and create inside, or `field(default_factory=list)`.
48
+ - Pydantic v1 and v2 APIs differ (`.dict()` vs `.model_dump()`, `@validator` vs `@field_validator`). Check the installed major version before writing model code.
49
+
50
+ ## 3. Errors
51
+
52
+ - Raise specific exceptions. Define one base exception per package (`class BillingError(Exception)`) and subclass it for cases callers handle differently.
53
+ - Catch the narrowest type you can handle, as close as possible to where you can do something useful. Never `except:` or `except Exception: pass`.
54
+ - When translating an error, chain it: `raise ConfigError(f"bad port {raw!r}") from exc`.
55
+ - Log *or* raise, not both at every layer. Log once, at the edge (request handler, CLI main, worker loop).
56
+ - Use `logger.exception(...)` inside `except` to keep the traceback. Use `logging.getLogger(__name__)`, never `print` for diagnostics in library code.
57
+ - Don't use exceptions for ordinary control flow across many layers; return `None` or a result type when absence is normal.
58
+ - `assert` is stripped under `python -O`. Never use it to validate input.
59
+
60
+ ## 4. Resources and context managers
61
+
62
+ - Anything that must be closed (files, sockets, DB connections, locks, temp dirs, HTTP clients) goes in `with` / `async with`.
63
+ - Write small context managers with `contextlib.contextmanager` (or `asynccontextmanager`); put cleanup in `finally`.
64
+ - Use `contextlib.ExitStack` when the number of resources is dynamic.
65
+ - Always pass `encoding="utf-8"` to `open()` for text files; the default depends on the platform.
66
+ - Use `pathlib.Path` for paths, not string concatenation.
67
+
68
+ ## 5. asyncio
69
+
70
+ 1. Never call blocking code in a coroutine (`time.sleep`, `requests`, sync DB drivers, heavy CPU). Use the async library or `await asyncio.to_thread(fn, ...)`.
71
+ 2. Every coroutine must be awaited. A call without `await` returns a coroutine object and does nothing.
72
+ 3. Keep a reference to tasks from `asyncio.create_task`; the loop only holds weak references, so an unreferenced task can be garbage-collected mid-run. On 3.11+ prefer `async with asyncio.TaskGroup() as tg:` which awaits and cancels children for you.
73
+ 4. Put timeouts on network calls: `asyncio.timeout(s)` (3.11+) or `asyncio.wait_for(...)`.
74
+ 5. Don't swallow `asyncio.CancelledError`. If you catch it to clean up, re-raise it.
75
+ 6. `asyncio.gather(...)` without `return_exceptions=True` cancels nothing when one fails; the others keep running. Use `TaskGroup` when siblings should stop together.
76
+ 7. Bound concurrency with `asyncio.Semaphore` instead of launching thousands of tasks.
77
+ 8. Call `asyncio.run(main())` once at the program entry point; never from inside a running loop.
78
+
79
+ ## 6. Idioms worth enforcing
80
+
81
+ - Comprehensions for simple transforms; a plain loop once there is more than one condition or a side effect.
82
+ - `enumerate`, `zip(..., strict=True)` (3.10), `itertools`, `functools.cache` before hand-rolled versions.
83
+ - f-strings for formatting, but `logger.info("user %s", user_id)` style in logging calls (lazy formatting).
84
+ - `__all__` or a leading underscore to mark what is public.
85
+ - No module-level side effects beyond constants: no network calls, no DB connections at import time. Put entry points under `if __name__ == "__main__":` or a `[project.scripts]` entry.
86
+ - Never build SQL, shell commands or file paths from user input with string formatting. Use parameterised queries, `subprocess.run([...])` with a list and no `shell=True`, and validated paths.
87
+
88
+ ## 7. Packaging and environments
89
+
90
+ - One `pyproject.toml` holds metadata, dependencies and tool config. No new `setup.py` unless a C build needs it.
91
+ - Always work in a virtual environment. Never `pip install` into the system or global interpreter, and never with `sudo`.
92
+ - Add dependencies with the project's tool so the lockfile updates: `uv add httpx`, `uv add --dev pytest`; `poetry add httpx`, `poetry add --group dev pytest`; pip projects edit `pyproject.toml` (or `requirements.in`) then reinstall.
93
+ - Commit the lockfile for applications. Libraries declare ranges in `[project.dependencies]` and don't pin exact versions.
94
+ - Run tools through the environment: `uv run pytest`, `poetry run mypy .`, or an activated `.venv`.
95
+
96
+ Commands and config snippets for each tool: `references/tooling.md`.
97
+
98
+ ## 8. Before you finish
99
+
100
+ 1. Run the formatter and linter the project uses (usually `ruff format` and `ruff check`).
101
+ 2. Run the type checker (`mypy` or `pyright`) on the files you touched. Fix new errors; don't add ignores to hide them.
102
+ 3. Run the tests. For writing tests, use the `python-testing` skill.
103
+ 4. Stop and ask the user before: raising `requires-python`, switching package manager, upgrading a major dependency (pydantic 1 to 2, SQLAlchemy 1 to 2), or turning on strict type checking for the whole project.
104
+
105
+ ## Report back
106
+
107
+ State: files changed, the lint, type-check and test commands you ran with their results, and any new dependency added (name and why).
@@ -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
+ }