@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,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Threat model the new document upload and sharing feature before we build it",
4
+ "Do a STRIDE analysis of our payment webhook architecture",
5
+ "What could an attacker do to this design? Here's the data flow for our multi-tenant reporting service",
6
+ "We're adding an LLM agent with tool access to our support portal, map the trust boundaries and threats",
7
+ "Before security sign-off, list the assets, threats and mitigations for the mobile login flow and rank them"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Scan the code in this pull request for XSS and injection flaws",
11
+ "Check whether any of our npm packages have known CVEs",
12
+ "Implement role-based access control on the admin routes",
13
+ "Write an architecture decision record for moving from REST to gRPC",
14
+ "Break this feature into implementation tasks and a delivery plan"
15
+ ]
16
+ }
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: transactional-email
3
+ description: Application code that sends one-to-one system email (sign-up confirmation, password reset, receipts, alerts) through a provider HTTP API such as Postmark, Amazon SES, Resend, Mailtrap or SendGrid, with versioned templates rendered from a typed model, sends queued and made idempotent by a stored message key, test inboxes and simulator addresses instead of real recipients, verified bounce, complaint and delivery webhooks, and a suppression check before every send. Use when wiring a provider SDK into a backend, building the email-sending service or queue worker, testing email flows without mailing real users, or handling a provider's bounce and complaint events in code.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Live sends need network access to the chosen provider and a verified sending domain. Examples are TypeScript; the rules apply to any language and SDK.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: integrations
9
+ kete-loom/risk: network
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ # Transactional email
14
+
15
+ Build the code path from "user did something" to "provider accepted one email", so each email goes out once, never to a suppressed address, never to a real person from a test, and every bounce or complaint comes back into the database. DNS records (SPF, DKIM, DMARC), warm-up and inbox placement belong to `email-deliverability`; this skill starts once a domain is verified.
16
+
17
+ ## Ground rules
18
+
19
+ 1. **API keys on the server, per environment.** Separate keys (or Postmark servers, SES accounts or Regions, SendGrid subusers) for development, staging and production. A dev key must be unable to reach real inboxes.
20
+ 2. **Transactional only on this path.** Marketing and bulk mail go on a separate stream, subdomain or provider account (Postmark `broadcast` stream, a separate SES configuration set, a SendGrid subuser) so a newsletter complaint spike can't block password resets.
21
+ 3. **Never send inside the request.** The web request writes an `outbound_email` row in the same database transaction as the business change, then a worker sends it (outbox pattern). The user's request never waits on the provider.
22
+ 4. **One logical email, one key.** Each row has a stable idempotency key (for example `password-reset:<user_id>:<token_id>`) with a unique index, so a retry or double-click creates no second row. Pass it to providers that support it (Resend `Idempotency-Key`, kept 24 hours); for the others, the unique row plus a `sent` status update is the guard.
23
+ 5. **Check suppression before every send.** Keep your own `email_suppressions` table fed by webhooks, check it in the worker, and do not rely on the provider silently dropping the message.
24
+ 6. **Verify every webhook** the way the provider supports (signature, SNS message signature, basic auth plus IP allow-list), on the raw body, and make processing idempotent by event ID.
25
+ 7. **Tests never hit real people.** Use a sandbox (Mailtrap sandbox inbox, SendGrid sandbox mode, Postmark test token) or simulator addresses (SES `@simulator.amazonses.com`, Resend `@resend.dev`). Details per provider in `references/providers.md`.
26
+
27
+ ## Choose the provider
28
+
29
+ | Need | Good fit |
30
+ |---|---|
31
+ | Fast setup, strict transactional focus, message streams, built-in templates | Postmark |
32
+ | Lowest unit cost at volume, already on AWS, own the event pipeline | Amazon SES v2 with configuration sets and SNS or EventBridge |
33
+ | Developer-first API, React Email templates, native idempotency keys | Resend |
34
+ | One vendor for a test sandbox and sending | Mailtrap |
35
+ | Existing Twilio account, dynamic templates, suppression groups | SendGrid |
36
+
37
+ If the project already uses one, keep it; the rules above are the same everywhere.
38
+
39
+ ## Implementation steps
40
+
41
+ 1. **Email module behind one interface**: `send({ template, to, model, idempotencyKey, tags })`. One adapter per provider; application code never imports a provider SDK directly. This is what lets tests swap in a sandbox.
42
+ 2. **Templates**: keep them in the repo (React Email, MJML, Handlebars) or in the provider (Postmark `TemplateAlias`, SendGrid dynamic template `d-...`). Either way: a typed model per template, an HTML and a plain-text part, a version in the template name or tag, and a snapshot test that renders each template with fixture data. Escape every user-supplied value; never put raw user input in a subject without trimming control characters and newlines.
43
+ 3. **Outbox row**: `id, idempotency_key UNIQUE, template, version, to_address, model_json, status (queued|sending|sent|failed|suppressed), provider_message_id, attempts, last_error, created_at, sent_at`.
44
+ 4. **Worker**: claim rows with `UPDATE ... SET status='sending' WHERE status='queued' ... RETURNING` (or `SELECT ... FOR UPDATE SKIP LOCKED`), check suppression (mark `suppressed` and stop), render, call the provider with the key, store `provider_message_id`, mark `sent`. Retry 429 and 5xx with backoff and jitter; mark `failed` without retry on 4xx validation errors (bad address, unverified sender).
45
+ 5. **Ambiguous timeouts**: if the provider call times out after sending the request, the email may have gone. With a provider idempotency key, retry with the same key. Without one, look the message up first (provider message search or activity API, by the tag or metadata holding your key) and retry only if it is not there. If the lookup is not possible, decide per template whether a duplicate or a missing email is worse; ask the user.
46
+ 6. **Webhook endpoint**: verify, store the raw event with its ID (unique), return 2xx quickly, process asynchronously. Map events to actions: hard bounce and spam complaint add to `email_suppressions` (reason, source event, date); soft bounce or deferral only logs; delivery updates the outbox row. Shapes in `references/providers.md`.
47
+ 7. **Suppression sync**: also import the provider's own suppression list periodically, and when a user changes their address, clear nothing automatically; a support-approved removal only.
48
+ 8. **Observability**: count sent, bounced, complained and suppressed per template per day, and alert if bounce or complaint rates jump after a deploy.
49
+
50
+ ## Reviewing an existing integration
51
+
52
+ - Provider call inside the HTTP handler or a database transaction, so a slow provider stalls requests or a rollback still sends.
53
+ - No idempotency: a retried job or double-submitted form sends the email twice; or the key is regenerated per attempt.
54
+ - Webhook route without verification, or verification over re-serialised JSON.
55
+ - Bounces and complaints received but never written to a suppression table, or soft bounces suppressed permanently.
56
+ - Production API key in `.env.example`, tests or CI that send to real addresses; staging using the production key.
57
+ - Password reset or magic-link tokens logged, put in tags or metadata, or left valid after use.
58
+ - Marketing mail sharing the transactional stream or key.
59
+
60
+ ## Stop and ask the user
61
+
62
+ - Before switching any environment to a production key or a live stream, or before sending to real recipients from a test.
63
+ - Whether duplicate or missing email is worse for each template when a send outcome is unknown.
64
+ - Before removing addresses from any suppression list, or before sending to a list of more than a handful of users through this path (that is bulk mail).
65
+
66
+ ## Before you finish
67
+
68
+ Provider docs are the final word on field names and limits. Test, in the sandbox: one email per idempotency key under a forced retry; a simulator bounce lands in `email_suppressions` and blocks the next send; a simulator complaint does the same; a webhook with a bad signature or credentials is rejected; templates render in HTML and text with fixture data.
@@ -0,0 +1,17 @@
1
+ {
2
+ "should_trigger": [
3
+ "Send our password reset and order receipt emails through Postmark templates from the Node backend",
4
+ "Our signup confirmation email sometimes goes out twice when the job retries, how do we make sends idempotent with Resend?",
5
+ "Set up an SES sandbox test using the mailbox simulator so our test suite never emails real customers",
6
+ "Verify SendGrid's signed event webhook and add bounced addresses to our own suppression table",
7
+ "Point staging at a Mailtrap sandbox inbox and assert in our tests that the welcome email arrived",
8
+ "Move our email sending out of the request handler into an outbox table and a worker"
9
+ ],
10
+ "should_not_trigger": [
11
+ "Set up SPF, DKIM and DMARC records for our new sending domain",
12
+ "Write a five-email welcome nurture sequence for trial users",
13
+ "Our receipts land in Gmail spam even though DKIM passes, what is wrong with our reputation?",
14
+ "Write a four-step cold email sequence for operations managers at hospitals",
15
+ "Triage my unread email and draft replies for the urgent ones"
16
+ ]
17
+ }
@@ -0,0 +1,63 @@
1
+ # Provider notes for transactional email
2
+
3
+ Read the section for the provider in use. Confirm field names against the provider's current API reference before shipping.
4
+
5
+ ## Postmark
6
+
7
+ - Send: `POST https://api.postmarkapp.com/email` (`From`, `To`, `Subject`, `HtmlBody`, `TextBody`, `MessageStream`, `Tag`, `Metadata`). Templates: `POST /email/withTemplate` with `TemplateAlias` or `TemplateId` and `TemplateModel`; batch with templates: `POST /email/batchWithTemplates`, up to 500 messages, returns 200 even if some fail, so check each result's `ErrorCode`.
8
+ - Auth header: `X-Postmark-Server-Token`. Test token: send `POSTMARK_API_TEST` as the server token to validate requests without delivering.
9
+ - Streams: `outbound` is the default transactional stream; create a broadcast stream for bulk mail. Omitting `MessageStream` uses `outbound`.
10
+ - Idempotency: no idempotency key in the API. Rely on your outbox unique key.
11
+ - Webhooks: Delivery, Bounce, Spam complaint, Open, Click, Subscription change. Postmark does **not** sign webhooks: protect the URL with HTTP basic auth credentials in the URL, HTTPS, and an allow-list of Postmark's published webhook IPs. Retries 5xx, 408, 429 and network failures (1, 5, 10, 10, 10, 15 minutes); other 4xx are dropped, so return 2xx once stored.
12
+ - Suppressions are per stream; hard bounces and spam complaints suppress automatically; a `SubscriptionChange` webhook tells you when one is added or removed.
13
+
14
+ ## Amazon SES (API v2)
15
+
16
+ - Send: `SendEmail` (SDK `SESv2Client` + `SendEmailCommand`) with `Content.Simple`, `Content.Template` (stored template) or `Content.Raw`, `ConfigurationSetName`, and `EmailTags` for your own message key.
17
+ - Sandbox (per Region): send only to verified addresses or the mailbox simulator, at most 200 messages per 24 hours and 1 per second. Request production access per Region.
18
+ - Mailbox simulator (works in the sandbox, does not hurt reputation, still billed): `success@simulator.amazonses.com`, `bounce@`, `complaint@`, `ooto@`, `suppressionlist@`. Add labels (`bounce+order123@simulator.amazonses.com`) to match events to messages.
19
+ - Events: configuration set event destinations to SNS, EventBridge, Firehose or CloudWatch. For SNS over HTTPS, confirm the `SubscriptionConfirmation` and verify every message's SNS signature (the AWS SDK message validator) before trusting it; also check the topic ARN.
20
+ - Account-level suppression list (on by default for bounces and complaints in accounts created after 25 Nov 2019; enable older ones with `aws sesv2 put-account-suppression-attributes --suppressed-reasons BOUNCE COMPLAINT`); manage with `PutSuppressedDestination`, `DeleteSuppressedDestination`, `ListSuppressedDestinations`. Only hard bounces (not soft) are added. Sending treats address case as equal, but the suppression management API needs the exact case stored, so keep the original address alongside your normalised one. Configuration sets can override it. Messages to suppressed addresses are accepted, not delivered, and still count toward the daily sending quota.
21
+ - Gmail does not send complaint feedback to SES, so a Gmail "Report spam" will not reach your suppression list.
22
+ - Idempotency: none in the API. Rely on your outbox key.
23
+
24
+ ## Resend
25
+
26
+ - Send: `POST https://api.resend.com/emails` with `from`, `to`, `subject`, `html`/`text` or `react` (Node SDK), `tags`. Header `Authorization: Bearer re_...`.
27
+ - Idempotency: `Idempotency-Key` header (SMTP: `Resend-Idempotency-Key`), 1-256 chars, kept 24 hours. Same key with a different payload returns `409 invalid_idempotent_request`; a request still in flight returns `409 concurrent_idempotent_requests` (safe to retry later).
28
+ - Test addresses: `delivered@resend.dev`, `bounced@resend.dev`, `complained@resend.dev` (these three accept `+label`, e.g. `bounced+signup1@resend.dev`) and `suppressed@resend.dev` (no labels). Test sends count against the account's sending quota.
29
+ - Webhooks are signed via Svix: headers `svix-id`, `svix-timestamp`, `svix-signature`; verify the raw body string with `resend.webhooks.verify` or the `svix` library `Webhook` class. Email events: `email.sent`, `email.delivered`, `email.delivery_delayed`, `email.bounced`, `email.complained`, `email.failed`, `email.suppressed`, `email.opened`, `email.clicked`, `email.scheduled`, `email.received`. Suppress on `email.bounced` and `email.complained`; mark the outbox row on `email.failed` and `email.suppressed`.
30
+
31
+ ## Mailtrap
32
+
33
+ - Testing: a sandbox inbox catches everything; nothing reaches real recipients. API: `POST https://sandbox.api.mailtrap.io/api/send/{inbox_id}` with the `Api-Token` header (or bearer token); SMTP credentials come from the inbox's Integration tab. Use it for development and staging, including automated tests that read the inbox through the API.
34
+ - Sending: transactional sending API for production with a separate token from the testing token. Check the current host and stream (transactional versus bulk) in the Mailtrap docs.
35
+
36
+ ## SendGrid (Twilio)
37
+
38
+ - Send: `POST https://api.sendgrid.com/v3/mail/send` with `personalizations[]`, `from`, `template_id` (`d-...` dynamic template) and `personalizations[].dynamic_template_data`, `custom_args` for your message key, `asm.group_id` for an unsubscribe group. `202 Accepted` on success.
39
+ - Sandbox mode: `"mail_settings": { "sandbox_mode": { "enable": true } }` validates and returns `200 OK` without delivering. The boolean must not be quoted.
40
+ - Signed Event Webhook: ECDSA signature in `X-Twilio-Email-Event-Webhook-Signature`, timestamp in `X-Twilio-Email-Event-Webhook-Timestamp`; verify over timestamp + raw body with the public key from the webhook settings, using the helper library. OAuth 2.0 client credentials can be enabled as well.
41
+ - Events arrive batched as a JSON array: `processed`, `dropped`, `delivered`, `deferred`, `bounce`, `open`, `click`, `spamreport`, `unsubscribe`, `group_unsubscribe`. Each has `sg_event_id`; dedupe on it.
42
+ - Suppressions: bounces, blocks, spam reports and invalid emails each have a `/v3/suppression/{bounces|blocks|spam_reports|invalid_emails}` endpoint; global unsubscribes are managed at `/v3/asm/suppressions/global` and unsubscribe-group suppressions at `/v3/asm/groups/{group_id}/suppressions`.
43
+ - Idempotency: none in the API. Rely on your outbox key.
44
+
45
+ ## Webhook handler shape (any provider)
46
+
47
+ ```ts
48
+ app.post("/webhooks/email", express.raw({ type: "*/*" }), async (req, res) => {
49
+ let events;
50
+ try {
51
+ events = verifyAndParse(req.headers, req.body); // provider-specific; returns an array (SendGrid batches events)
52
+ } catch {
53
+ return res.sendStatus(401); // bad signature or credentials: reject, never process
54
+ }
55
+ for (const event of events) {
56
+ const inserted = await db.emailEvents.insertIfAbsent({ id: event.id, provider, raw: JSON.stringify(event) });
57
+ if (inserted) await queue.add("email-event", { id: event.id });
58
+ }
59
+ res.sendStatus(200); // only after every event is stored, so a crash mid-batch gets a retry
60
+ });
61
+ ```
62
+
63
+ Map in the job: hard bounce or complaint → upsert `email_suppressions(address_normalised, reason, event_id, created_at)`; soft bounce → log and count; delivered → mark the outbox row.
@@ -0,0 +1,122 @@
1
+ ---
2
+ name: typescript-patterns
3
+ description: Idiomatic TypeScript and modern JavaScript for Node.js and the browser, covering strict tsconfig settings, discriminated unions and narrowing, restrained generics, typed error handling, async/await pitfalls, ESM versus CommonJS packaging, project layout and ESLint/Prettier setup. Use when writing or restructuring TS/JS code, designing types for a module, setting up tsconfig or package.json "type"/"exports", or choosing lint and format tooling.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs Node.js 18+ and the project's package manager (npm, pnpm, yarn or bun).
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: coding
9
+ kete-loom/risk: writes-files
10
+ kete-loom/requires: "node"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # TypeScript patterns
15
+
16
+ Write TypeScript that the compiler can actually check. Every rule here exists to keep the types honest about what happens at runtime.
17
+
18
+ ## 0. Read the project first
19
+
20
+ 1. Read `package.json` (`type`, `exports`, `engines`, scripts), every `tsconfig*.json`, and the lint/format config (`eslint.config.*`, `.eslintrc*`, `.prettierrc*`, `biome.json`).
21
+ 2. Note the lockfile (`package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, `bun.lock*`) and use only that package manager.
22
+ 3. Follow the existing style, folder layout and module system. Do not convert a codebase between ESM and CJS, or between tools, unless the user asked.
23
+ 4. Find the type-check command (often `tsc --noEmit` or a `typecheck` script) and run it before and after your change.
24
+
25
+ ## 1. tsconfig baseline
26
+
27
+ For new projects, or when the user asks to tighten settings, start from:
28
+
29
+ ```jsonc
30
+ {
31
+ "compilerOptions": {
32
+ "strict": true,
33
+ "noUncheckedIndexedAccess": true,
34
+ "noImplicitOverride": true,
35
+ "noFallthroughCasesInSwitch": true,
36
+ "exactOptionalPropertyTypes": true, // optional; stricter about `undefined`
37
+ "verbatimModuleSyntax": true,
38
+ "isolatedModules": true,
39
+ "skipLibCheck": true,
40
+ "target": "ES2022",
41
+ "module": "NodeNext", // Node apps and libraries
42
+ "moduleResolution": "NodeNext"
43
+ // bundled browser apps: "module": "ESNext", "moduleResolution": "Bundler"
44
+ }
45
+ }
46
+ ```
47
+
48
+ - Turning on `strict` in an existing codebase can produce hundreds of errors. **Stop and ask** before enabling it repo-wide; offer to enable it per package or fix errors in batches.
49
+ - `verbatimModuleSyntax` suits ESM packages (`"type": "module"`) and bundled apps. In files that compile to CommonJS it rejects `import`/`export` syntax (you would need `import x = require()`), so leave it off for CJS packages.
50
+ - Never weaken a compiler option to make an error go away.
51
+
52
+ ## 2. Type design
53
+
54
+ - Model states as **discriminated unions**, not bags of optional fields:
55
+ `type Result = { ok: true; value: User } | { ok: false; error: string }`.
56
+ - Narrow with `typeof`, `instanceof`, `in`, a discriminant check, or a type predicate (`(x): x is Foo`). End exhaustive `switch` statements with `default: return assertNever(x)`, where `function assertNever(x: never): never { throw new Error("Unexpected: " + String(x)) }`, so a new variant fails to compile.
57
+ - Prefer `unknown` over `any` for values you have not checked. Parse untrusted input (HTTP bodies, `JSON.parse`, env vars, files) at the boundary with a schema library the project already uses (zod, valibot, io-ts) or a hand-written guard.
58
+ - Use `as const` and `satisfies` to keep literal types while checking shape: `const routes = {...} satisfies Record<string, Route>`.
59
+ - Use `readonly` arrays and properties for data you do not mutate.
60
+ - Generics: add a type parameter only when it links two or more positions (input to output). If a parameter appears once, replace it with its constraint. Avoid conditional and mapped types in application code unless they remove real duplication.
61
+ - Prefer `type` aliases for unions and `interface` for object shapes that are extended; follow the project if it already chose.
62
+ - Avoid `enum`; use a union of string literals or an `as const` object. Avoid `namespace` in new code.
63
+
64
+ ## 3. Things never to do
65
+
66
+ - `any`, `as any`, `@ts-ignore`, or `!` non-null assertions to silence an error. If a cast is truly needed, use `@ts-expect-error` with a reason, or a checked guard.
67
+ - Double casts (`x as unknown as T`) outside tests.
68
+ - `Function`, `Object` or `{}` as types.
69
+ - Default exports in a codebase that uses named exports (or the reverse).
70
+
71
+ ## 4. Errors
72
+
73
+ 1. Throw `Error` subclasses, never strings or plain objects. Set `name` and pass `{ cause }` when wrapping: `throw new ConfigError("bad port", { cause: err })`.
74
+ 2. In `catch (err)`, `err` is `unknown`. Narrow before reading properties: `if (err instanceof HttpError) ...`.
75
+ 3. Catch only where you can handle, add context, or translate the error. Do not catch and log and continue unless losing the operation is acceptable.
76
+ 4. For expected failures (validation, not-found), returning a result union is often clearer than throwing. Pick one style per module.
77
+
78
+ ## 5. Async/await pitfalls
79
+
80
+ | Pitfall | Fix |
81
+ |---|---|
82
+ | Floating promise: `save(x);` with no `await` | `await` it, return it, or mark intentional fire-and-forget with `void save(x).catch(log)` |
83
+ | `arr.forEach(async x => ...)` does not wait | `for (const x of arr) await f(x)` (serial) or `await Promise.all(arr.map(f))` (parallel) |
84
+ | Async callback passed where a sync one is expected (event handlers, `Array.filter`) | Wrap and handle the promise explicitly |
85
+ | Sequential awaits on independent work | `await Promise.all([...])`; use `Promise.allSettled` when one failure must not cancel the rest |
86
+ | Unbounded `Promise.all` over thousands of items | Batch, or use a concurrency limiter the project already has |
87
+ | `return promise` inside `try` without `await` | `return await promise` so the `catch`/`finally` applies |
88
+ | Shared mutable state across awaits (check-then-act) | Re-read after the await, or serialise with a lock/queue |
89
+ | No timeout on network calls | `fetch(url, { signal: AbortSignal.timeout(5000) })` |
90
+
91
+ Turn on `@typescript-eslint/no-floating-promises` and `@typescript-eslint/no-misused-promises` (they need type-aware linting) to catch the first three.
92
+
93
+ ## 6. ESM versus CommonJS
94
+
95
+ - `"type": "module"` in `package.json` makes `.js` files ESM; otherwise they are CJS. `.mjs`/`.mts` are always ESM, `.cjs`/`.cts` always CJS.
96
+ - With `module: NodeNext`, relative imports in ESM need the runtime extension: `import { x } from "./util.js"` even though the source is `util.ts`.
97
+ - ESM has no `require`, `__dirname` or `__filename`. Use `import.meta.url` with `fileURLToPath`, or `import.meta.dirname` / `import.meta.filename` (Node 20.11+).
98
+ - Libraries: declare entry points with `exports` (with a `types` condition first in each block). Shipping both ESM and CJS needs a build tool such as tsup; verify with `npx @arethetypeswrong/cli --pack .` before publishing.
99
+ - With `verbatimModuleSyntax`, write `import type { Foo }` for type-only imports.
100
+ - **Stop and ask** before changing `type`, `exports` or `main` on a published package: it is a breaking change for consumers.
101
+
102
+ ## 7. Project layout
103
+
104
+ - Source in `src/`, build output in `dist/` (git-ignored), tests next to code (`foo.test.ts`) or in `test/`, following the project.
105
+ - Monorepos: use the package manager's workspaces (`pnpm-workspace.yaml`, `workspaces` in `package.json`) and TypeScript project references (`composite`, `references`) when packages build separately.
106
+ - Keep side effects out of module top level; export functions and wire them in an entry file.
107
+ - Read config from `process.env` once, validate it, and export a typed object.
108
+
109
+ ## 8. Lint and format
110
+
111
+ - ESLint 9+ uses flat config (`eslint.config.js`/`.mjs`). Use `typescript-eslint` with `recommendedTypeChecked` (or `strictTypeChecked`) and `parserOptions.projectService: true`.
112
+ - Let Prettier (or Biome, if the project uses it) own formatting; disable stylistic lint rules that conflict (`eslint-config-prettier`).
113
+ - Do not add a new linter, formatter or major dependency without asking.
114
+
115
+ ## 9. Finish
116
+
117
+ 1. Run, in this order, whatever the project defines: format check, lint, type-check, tests.
118
+ 2. Fix what you introduced. Report pre-existing failures instead of fixing them silently.
119
+
120
+ ## Report back
121
+
122
+ End with: files changed, the commands you ran with pass/fail, any `any`/casts you could not remove and why, and anything that needs the user's decision (strictness, module system, new dependency).
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Set up a strict tsconfig for a new Node 20 library that ships ESM",
4
+ "How should I type this API response so the success and error cases can't get mixed up?",
5
+ "Our package mixes require and import and half the files are .mjs, what's the right way to structure ESM vs CommonJS here?",
6
+ "Refactor this user service to stop using any and use proper unions and narrowing",
7
+ "Configure ESLint flat config with typescript-eslint and Prettier for our monorepo"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Write Vitest tests for the date formatting helpers and mock the clock",
11
+ "Review my TypeScript pull request for unhandled promises before I merge",
12
+ "tsc fails with TS2307 Cannot find module '@app/config', make the build pass",
13
+ "Add a useMemo to stop this React component re-rendering on every keystroke",
14
+ "Write idiomatic Python dataclasses for the order model"
15
+ ]
16
+ }
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: typescript-testing
3
+ description: Vitest and Jest test suites for TypeScript and JavaScript projects, picking whichever runner the repo already uses, with module mocks, spies, fake timers, async assertions, fixtures, coverage thresholds and a procedure for diagnosing flaky tests. Use when writing or fixing unit and integration tests in a TS/JS codebase, mocking an import or the clock, raising coverage, or chasing a test that passes locally and fails in CI.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs Node.js 18+ and the project's package manager and test runner.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: testing
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "node"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # TypeScript testing
15
+
16
+ Tests that run fast, fail for one reason, and give the same answer every time. Use the runner the project already has.
17
+
18
+ ## 0. Detect the setup
19
+
20
+ 1. Check `package.json` (`devDependencies`, `scripts.test`) and config files: `vitest.config.*` or a `test` block in `vite.config.*` means Vitest; `jest.config.*` or a `jest` key means Jest. `node:test` imports mean the built-in Node runner: keep using it (`node --test`, `mock` from `node:test`) and apply the rules below, not the Vitest/Jest APIs.
21
+ 2. If none exists, **stop and ask** which to add. Suggest Vitest for Vite or ESM-first projects, and Jest only if the team already knows it.
22
+ 3. Note the environment (`node`, `jsdom`, `happy-dom`), setup files, path aliases and whether globals (`describe`, `it`) are enabled or imported.
23
+ 4. Run the suite once. If it already fails, report which tests fail before changing anything.
24
+ 5. Run a single file while working: `npx vitest run path/to/file.test.ts` or `npx jest path/to/file.test.ts`. Filter by name with `-t "name"`.
25
+
26
+ ## 1. Write the test
27
+
28
+ - One behaviour per test; name it after that behaviour (`"rejects an expired token"`).
29
+ - Arrange, act, assert. Test through the public API of the module, not private helpers.
30
+ - Use the narrowest matcher that says what you mean: `toEqual` for structure, `toStrictEqual` when `undefined` properties matter, `toBe` for identity and primitives, `toThrow(ErrorClass)` for errors.
31
+ - Build test data with small factory functions (`makeUser({ role: "admin" })`) rather than large shared fixtures that every test mutates.
32
+ - Keep fixtures in files next to tests (`__fixtures__/`) for large payloads; load them, do not inline 200 lines.
33
+
34
+ ## 2. Async code
35
+
36
+ - Always `await` (or `return`) the promise under test. A missing `await` lets the test pass before the assertion runs.
37
+ - Rejections: `await expect(fn()).rejects.toThrow(NotFoundError)`. Never wrap in `try/catch` without `expect.assertions(n)`.
38
+ - Resolutions: `await expect(fn()).resolves.toEqual(value)`.
39
+ - Do not use real `setTimeout` sleeps to wait for work; await the operation, or use fake timers.
40
+
41
+ ## 3. Mocks and spies
42
+
43
+ Mock only boundaries: network, clock, randomness, filesystem, third-party SDKs. Never mock the unit under test.
44
+
45
+ | Need | Vitest | Jest |
46
+ |---|---|---|
47
+ | Mock a module | `vi.mock("./db", () => ({ query: vi.fn() }))` | `jest.mock("./db", () => ({ query: jest.fn() }))` |
48
+ | Keep the rest of the real module | `vi.mock(import("./db"), async (orig) => ({ ...(await orig()), query: vi.fn() }))` | `jest.mock("./db", () => ({ ...jest.requireActual("./db"), query: jest.fn() }))` |
49
+ | Variable used inside a mock factory | `const m = vi.hoisted(() => vi.fn())` | name it with a `mock` prefix |
50
+ | Spy on a method | `vi.spyOn(obj, "method")` | `jest.spyOn(obj, "method")` |
51
+ | Typed mock | `vi.mocked(fn)` | `jest.mocked(fn)` |
52
+ | Reset between tests | `vi.restoreAllMocks()` in `afterEach`, or `restoreMocks: true` in config | `restoreMocks: true` in config |
53
+
54
+ - `vi.mock` and `jest.mock` are hoisted above imports, so a factory cannot reference normal top-level variables.
55
+ - Jest with native ESM cannot use `jest.mock` on ESM imports; use `jest.unstable_mockModule` followed by a dynamic `await import()`, or run Jest through a CJS transform.
56
+ - For HTTP, prefer intercepting at the network layer (`msw`, `nock`, or `undici` `MockAgent`) over mocking `fetch` by hand, if the project already has one of them.
57
+ - Assert on what matters (`toHaveBeenCalledWith(expected)`), not on call counts that are an implementation detail.
58
+
59
+ ## 4. Timers and dates
60
+
61
+ ```ts
62
+ beforeEach(() => { vi.useFakeTimers(); vi.setSystemTime(new Date("2025-01-01T00:00:00Z")); });
63
+ afterEach(() => { vi.useRealTimers(); });
64
+
65
+ it("retries after 1s", async () => {
66
+ const p = withRetry(task);
67
+ await vi.advanceTimersByTimeAsync(1000); // async variant flushes promises between timers
68
+ await expect(p).resolves.toBe("ok");
69
+ });
70
+ ```
71
+
72
+ Jest equivalents: `jest.useFakeTimers()`, `jest.setSystemTime()`, `jest.advanceTimersByTimeAsync()`. Always restore real timers in `afterEach`.
73
+
74
+ ## 5. Coverage
75
+
76
+ - Vitest: `npx vitest run --coverage` (needs `@vitest/coverage-v8` or `@vitest/coverage-istanbul`). Jest: `npx jest --coverage`.
77
+ - Set thresholds in config (`test.coverage.thresholds` in Vitest, `coverageThreshold` in Jest) only if the team wants them enforced.
78
+ - Read the uncovered-lines report and test the **branches** that matter (error paths, boundaries). Do not write tests that only execute lines without asserting.
79
+
80
+ ## 6. Flaky tests
81
+
82
+ Follow this order and stop when you find the cause:
83
+
84
+ 1. Reproduce: run the single test many times (a shell loop or the runner's repeat option) and the whole file in random order (Vitest `--sequence.shuffle`, Jest `--randomize`).
85
+ 2. Run it alone and with the full suite. Passing alone but failing together means **shared state**: module-level variables, unrestored mocks, leftover DB rows, `process.env` changes. Reset in `beforeEach`/`afterEach`.
86
+ 3. Look for real time (`Date.now()`, `new Date()`), real timers, randomness, or locale/timezone (`TZ=UTC` in the test script).
87
+ 4. Look for missing `await`, unawaited promises in setup, or assertions on work still in progress.
88
+ 5. Look for real network, ports already in use, or order-dependent file writes. Use temp dirs (`fs.mkdtemp`) and port `0`.
89
+ 6. CI-only failures: compare Node version, CPU count (worker pools), and environment variables.
90
+
91
+ Never fix flakiness by adding retries, longer timeouts or `.skip` without telling the user; those hide the bug.
92
+
93
+ ## Rules
94
+
95
+ - Never delete, skip or loosen an existing assertion to get green. If a test is wrong, explain why and ask first.
96
+ - No real network calls, no real time, no dependence on test order.
97
+ - Do not add a new test runner or mocking library without asking.
98
+
99
+ ## Report back
100
+
101
+ End with: tests added or changed (file and name), the command you ran, pass/fail counts, coverage change if measured, and for a flaky test the root cause you found.
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Write Vitest unit tests for the invoice calculator in src/billing",
4
+ "How do I mock the ./db module in Jest but keep the rest of its real exports?",
5
+ "This retry test uses setTimeout and takes 30 seconds, use fake timers instead",
6
+ "Our auth.test.ts passes locally but fails randomly in CI, find out why",
7
+ "Get coverage on the payments package above 80% with jest --coverage"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Set up a strict tsconfig and decide between ESM and CommonJS for the new package",
11
+ "Write Playwright end-to-end tests for the signup flow in the browser",
12
+ "Review this TypeScript diff for type holes and async races",
13
+ "npm run build fails with ERR_REQUIRE_ESM after upgrading a dependency, fix it",
14
+ "Write pytest fixtures for the Django order views"
15
+ ]
16
+ }
@@ -0,0 +1,93 @@
1
+ ---
2
+ name: ui-demo-recording
3
+ description: Produces polished, repeatable product demo videos and feature walkthroughs of a web app by scripting the story as a Playwright run with recordVideo, seeding fixed demo data and a frozen clock, pacing actions for a human viewer, injecting a visible cursor and click ripples, adding captions or chapter titles, then trimming, scaling and encoding the WebM with FFmpeg into MP4 or GIF. Use when marketing, docs or a release note needs a screen recording of the app, when an existing demo video is out of date after a UI change, or when the same walkthrough must be re-recorded on every release.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs Node 18+, the @playwright/test or playwright package with a Chromium browser installed, and ffmpeg. The app must run locally or on a staging URL with demo data.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: coding
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "node, npx, ffmpeg"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # UI demo recording
15
+
16
+ A demo video is a script, not a screen grab. Write the walkthrough as code so it records identically every time, looks like a calm human is driving, and can be re-run after the next UI change. This skill makes videos for people to watch; for tests that assert behaviour, use the `e2e-testing-playwright` skill.
17
+
18
+ ## 0. Agree the storyboard
19
+
20
+ Ask the user (stop until you have answers):
21
+
22
+ 1. **Story**: the 3 to 7 steps the viewer should see, and the one outcome to end on.
23
+ 2. **Output**: length target, resolution (1920x1080 or 1280x720 for docs, 1080x1920 for vertical), MP4, WebM or GIF, with or without captions.
24
+ 3. **Environment**: local or staging URL, a demo account, and confirmation that **no real customer data** appears.
25
+ 4. **Branding**: light or dark theme, browser chrome or none (Playwright records the page only, without browser chrome).
26
+
27
+ Write the storyboard as a numbered list of scenes, each with an action, the on-screen caption and a hold time. Get a yes before recording.
28
+
29
+ ## 1. Make the app deterministic
30
+
31
+ The recording must look the same on every run.
32
+
33
+ - **Data**: seed a dedicated demo tenant or database with believable fake names, round numbers and no lorem ipsum. Reset it before each recording.
34
+ - **Time**: freeze the clock so dates and "5 minutes ago" labels are stable (`page.clock.setFixedTime` in Playwright 1.45+; see `references/playwright-recording.md`).
35
+ - **Network noise**: block analytics, chat widgets and cookie banners with `page.route`, or set the consent cookie in advance.
36
+ - **Randomness**: disable onboarding tours, A/B variants and "what's new" pop-ups through feature flags or localStorage before the first navigation.
37
+ - **Login**: sign in once in setup and save `storageState`; never record typing a real password.
38
+ - **Animations**: keep the app's own animations (they look good on video), but wait for them to finish before the next action.
39
+
40
+ ## 2. Write the recording script
41
+
42
+ Use a plain Playwright library script (or a dedicated Playwright Test project) separate from the test suite. Skeleton in `references/playwright-recording.md`.
43
+
44
+ 1. Create the context with `viewport` equal to the output size and `recordVideo: { dir, size }` set to the same size, plus `deviceScaleFactor: 1`. A mismatch gives blurry or letterboxed video.
45
+ 2. Inject the cursor overlay with `context.addInitScript` before the first page loads (`references/cursor-and-captions.md`).
46
+ 3. Drive each scene with role-based locators, moving the mouse to the target first (`page.mouse.move` with `steps`) so the viewer sees the pointer travel, then click.
47
+ 4. Type with `locator.pressSequentially(text, { delay: 40 to 80 })` so typing is visible; use `fill` for fields the viewer does not need to watch.
48
+ 5. Hold after each meaningful change (`page.waitForTimeout(800 to 1500)`). Holds are fine here because this is a recording, not a test; always wait for the visible result first (`expect(locator).toBeVisible()` or `locator.waitFor()`).
49
+ 6. Show captions or chapter titles through the overlay, or leave them for post-production (step 4).
50
+ 7. Close the context (`await context.close()`): the video file is only finished then. Get the path from `page.video().path()` or `saveAs`.
51
+
52
+ ## 3. Review the raw take
53
+
54
+ Play it back at full speed and check:
55
+
56
+ - [ ] Every scene from the storyboard appears in order, nothing extra.
57
+ - [ ] No spinners, flashes of unstyled content, error toasts, scrollbars jumping or debug panels.
58
+ - [ ] No real personal data, internal URLs, API keys or staff names visible.
59
+ - [ ] The cursor is visible and never teleports.
60
+
61
+ If a scene is flaky, fix the wait in the script; do not cut around it in the edit.
62
+
63
+ ## 4. Post-process with FFmpeg
64
+
65
+ Recipes in `references/post-processing.md`:
66
+
67
+ 1. Trim the blank first frames and the tail after the last hold.
68
+ 2. Convert WebM to H.264 MP4 with `yuv420p` and `+faststart` for the web.
69
+ 3. Optionally speed up dull stretches, add a title card or fade, burn in or attach captions (SRT or WebVTT), and add a music bed at low level if the user supplies a licensed track.
70
+ 4. For GIF, use the two-pass palette method, at most about 15 fps and 800 px wide, and keep it short.
71
+ 5. Probe the output (duration, resolution, size) before handing it over.
72
+
73
+ ## 5. Make it repeatable
74
+
75
+ - Commit the script, the seed data and the storyboard next to each other (for example `demos/<name>/`).
76
+ - Add an npm script such as `"demo:onboarding": "node demos/onboarding/record.mjs"`.
77
+ - If the user wants it refreshed each release, run it in CI against staging and upload the MP4 as an artifact; a human approves before it replaces the published video.
78
+
79
+ ## Never
80
+
81
+ - Never record production with real customer accounts or data.
82
+ - Never leave real credentials in the script; read them from the environment for a demo-only account.
83
+ - Never publish a recording without the user watching it first.
84
+
85
+ ## Report back
86
+
87
+ ```
88
+ Demo: <name> Length: mm:ss Output: <path> (WxH, fps, MB)
89
+ Script: <path> Seed: <path> Run: <command>
90
+ Scenes: 1 ... 2 ... (one line each with start time)
91
+ Checks: data is fake, no secrets on screen, cursor visible
92
+ Known gaps: ...
93
+ ```
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Record a 60-second demo video of our signup and first project flow for the landing page",
4
+ "Our product walkthrough video is out of date after the redesign, script it so we can re-record it every release",
5
+ "Make a Playwright script that records the dashboard demo with a visible cursor and click highlights",
6
+ "Turn the recorded WebM of our app tour into an MP4 and a small GIF for the release notes",
7
+ "Capture a screencast of the checkout feature with fake demo data and captions explaining each step"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Write Playwright tests that check the checkout flow still works after each deploy",
11
+ "Our Playwright suite fails in CI on the login test, find out why",
12
+ "Cut my interview footage into a three-minute story with B-roll",
13
+ "Build an animated explainer video in React with spring animations",
14
+ "Click through the staging app and look for bugs in the settings page"
15
+ ]
16
+ }
@@ -0,0 +1,48 @@
1
+ # Cursor highlight and caption overlay
2
+
3
+ Headless Chromium does not draw the OS cursor into the video, so draw one in the page. Pass this function to `context.addInitScript` so it runs before every page's scripts.
4
+
5
+ ```js
6
+ // demos/onboarding/cursor-overlay.mjs
7
+ export function cursorOverlay() {
8
+ const install = () => {
9
+ if (document.getElementById('__demo-cursor')) return;
10
+ const style = document.createElement('style');
11
+ style.textContent = `
12
+ #__demo-cursor { position: fixed; top: 0; left: 0; width: 22px; height: 22px; margin: -11px 0 0 -11px;
13
+ border-radius: 50%; background: rgba(255,255,255,.9); border: 2px solid rgba(0,0,0,.6);
14
+ box-shadow: 0 1px 4px rgba(0,0,0,.35); pointer-events: none; z-index: 2147483647;
15
+ transition: transform .08s ease-out; }
16
+ #__demo-cursor.down { transform: scale(.75); }
17
+ .__demo-ripple { position: fixed; width: 44px; height: 44px; margin: -22px 0 0 -22px; border-radius: 50%;
18
+ border: 3px solid rgba(59,130,246,.8); pointer-events: none; z-index: 2147483646;
19
+ animation: __demo-r .5s ease-out forwards; }
20
+ @keyframes __demo-r { from { transform: scale(.3); opacity: 1 } to { transform: scale(1.4); opacity: 0 } }
21
+ #__demo-caption { position: fixed; left: 50%; bottom: 48px; transform: translateX(-50%); max-width: 70%;
22
+ padding: 12px 20px; border-radius: 10px; background: rgba(17,24,39,.85); color: #fff;
23
+ font: 600 28px/1.3 system-ui, sans-serif; text-align: center; pointer-events: none;
24
+ z-index: 2147483647; opacity: 0; transition: opacity .25s; }
25
+ #__demo-caption.on { opacity: 1; }`;
26
+ document.head.appendChild(style);
27
+ const c = document.createElement('div'); c.id = '__demo-cursor';
28
+ const cap = document.createElement('div'); cap.id = '__demo-caption';
29
+ document.body.append(c, cap);
30
+ addEventListener('mousemove', (e) => { c.style.left = e.clientX + 'px'; c.style.top = e.clientY + 'px'; }, true);
31
+ addEventListener('mousedown', (e) => {
32
+ c.classList.add('down');
33
+ const r = document.createElement('div'); r.className = '__demo-ripple';
34
+ r.style.left = e.clientX + 'px'; r.style.top = e.clientY + 'px';
35
+ document.body.appendChild(r); setTimeout(() => r.remove(), 600);
36
+ }, true);
37
+ addEventListener('mouseup', () => c.classList.remove('down'), true);
38
+ window.__demoCaption = (t) => { cap.textContent = t; cap.classList.toggle('on', !!t); };
39
+ };
40
+ if (document.body) install(); else addEventListener('DOMContentLoaded', install);
41
+ }
42
+ ```
43
+
44
+ Rules:
45
+ - The overlay has `pointer-events: none` so it never intercepts clicks.
46
+ - Keep captions short (one line, under about 50 characters) and on screen for at least 1.5 seconds.
47
+ - If captions must be translatable or editable later, produce an SRT in post-processing instead of burning them into the page.
48
+ - A strict Content-Security-Policy can block injected styles in some apps; if the overlay is missing, run against a demo build that relaxes CSP, or use `bypassCSP: true` on the context.