@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,133 @@
1
+ ---
2
+ name: fsharp-patterns
3
+ description: Idiomatic F# for writing and restructuring code - discriminated unions and records that make illegal states unrepresentable, Option and Result pipelines instead of exceptions and null, task/async/result computation expressions, compilation-order-aware module layout, and safe .NET interop. Use when writing new F# code, modelling a domain in F#, converting exception-heavy or C#-style F# to a functional style, or calling .NET libraries from F#.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs the .NET SDK (dotnet CLI). Nullable reference type guidance needs F# 9 or later.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: coding
9
+ kete-loom/risk: writes-files
10
+ kete-loom/requires: "dotnet"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # F# patterns
15
+
16
+ Write F# that the compiler can check: types carry the rules, functions are total, errors are values, and side effects live at the edges.
17
+
18
+ ## 0. Before you write
19
+
20
+ 1. Open the `.fsproj` and read the `<Compile Include=...>` list. F# compiles files **in that order**; a file can only use what is above it.
21
+ 2. Check the target framework and `LangVersion`, and whether `<Nullable>enable</Nullable>` is set (F# 9+).
22
+ 3. Check `<PackageReference>` (or `paket.references`) for FsToolkit.ErrorHandling, FSharpPlus or similar. Use what the project already has; don't add a library for a few helpers.
23
+ 4. Match the existing style: Fantomas config (`.editorconfig`), module vs namespace usage, naming. If the project is formatted with Fantomas, run `dotnet fantomas <files>` after editing.
24
+
25
+ ## 1. Model the domain with types
26
+
27
+ - **Records** for data that always has all its fields. **Discriminated unions** for "one of these". Never a record with a `Kind: string` plus optional fields that only apply to some kinds.
28
+ - **Single-case unions with a private constructor** for validated primitives, with a `create` that returns `Result`:
29
+
30
+ ```fsharp
31
+ type EmailAddress = private EmailAddress of string
32
+
33
+ module EmailAddress =
34
+ let create (s: string) =
35
+ if System.String.IsNullOrWhiteSpace s || not (s.Contains '@')
36
+ then Error "invalid email"
37
+ else Ok (EmailAddress (s.Trim()))
38
+ let value (EmailAddress s) = s
39
+ ```
40
+
41
+ - Encode states as cases, not flags: `type Order = Draft of DraftOrder | Paid of PaidOrder | Shipped of ShippedOrder`, so a function that ships only accepts `PaidOrder`.
42
+ - Use `[<Measure>]` units for money and quantities that must not mix (`decimal<GHS>`). Use `decimal`, never `float`, for money.
43
+ - Use `option` for "may be absent". Use `| null` (F# 9) only at interop boundaries, never to model missing domain data.
44
+ - Add `[<RequireQualifiedAccess>]` to unions whose case names would clash (`Status.Active`).
45
+
46
+ ## 2. Keep functions total
47
+
48
+ - No partial functions on input you don't control: avoid `List.head`, `List.find`, `Seq.head`, `Map.find`, `Array.get`/`arr.[i]`, `Option.get`, `.Value` and `int "abc"`. Use `List.tryHead`, `List.tryFind`, `Map.tryFind`, `Array.tryItem`, `Int32.TryParse`.
49
+ - Every `match` must be complete. Treat warning FS0025 (incomplete matches) as an error: `<WarningsAsErrors>$(WarningsAsErrors);FS0025</WarningsAsErrors>` (append, so existing entries survive).
50
+ - Avoid a trailing `| _ ->` on your own unions: it hides new cases. List the cases so adding one breaks the build where it matters.
51
+ - Prefer immutable values and `List`/`Map`/`Set`. Use `mutable` or `ref` only inside a function for a local loop or measured hot path, never shared across threads or captured in a closure that outlives it.
52
+
53
+ ## 3. Errors as values
54
+
55
+ Decision rule:
56
+
57
+ | Situation | Use |
58
+ |---|---|
59
+ | Value may be missing, no reason needed | `Option` |
60
+ | Expected failure the caller must handle (validation, not found, conflict) | `Result<'T, DomainError>` with a union error type |
61
+ | Bug or broken invariant (should never happen) | exception (`invalidOp`, `failwith`) |
62
+ | .NET call that throws on expected failure (I/O, parsing, HTTP) | catch at the boundary, convert to `Result` |
63
+
64
+ - Make the error type a union (`type OrderError = NotFound of OrderId | OutOfStock of Sku | PaymentDeclined of string`), not `string`, once callers branch on it.
65
+ - Compose with `Result.bind`, `Result.map`, `Result.mapError`, `Option.bind`, `Option.map`, `Option.defaultValue`.
66
+ - Convert at the edges: `Option.ofObj` / `Option.ofNullable` for .NET nulls, `Result.requireSome` (FsToolkit) or a small helper for Option to Result.
67
+ - Wrap throwing calls once, at the boundary, and catch the specific exception:
68
+
69
+ ```fsharp
70
+ let readConfig path =
71
+ try Ok (System.IO.File.ReadAllText path)
72
+ with
73
+ | :? System.IO.FileNotFoundException -> Error (ConfigMissing path)
74
+ | :? System.UnauthorizedAccessException -> Error (ConfigDenied path)
75
+ ```
76
+
77
+ Never catch `exn` and turn it into `Ok` or a default; never use `try ... with _ -> ()`.
78
+
79
+ ## 4. Computation expressions
80
+
81
+ - `task { }` for code that talks to .NET (ASP.NET Core, EF Core, HttpClient). It is hot (starts immediately) and has less overhead.
82
+ - `async { }` for cold, composable workflows and F#-first libraries; pass `CancellationToken` via `Async.CancellationToken` or explicit parameters. Convert with `Async.AwaitTask` and `Async.StartAsTask` at the boundary only.
83
+ - Don't mix: pick one per layer. Never block with `.Result`, `.Wait()` or `Async.RunSynchronously` except in `main` or a script.
84
+ - `result { }`, `option { }`, `asyncResult { }`, `taskResult { }` and `validation { }` come from FsToolkit.ErrorHandling (not FSharp.Core; a FsToolkit.ErrorHandling.TaskResult package also exists, so check which one the project references before using `taskResult`). Use them if the project references it; otherwise use `Result.bind` pipelines, or ask before adding the package.
85
+ - `let!` binds, `do!` awaits unit, `return!` returns a wrapped value, `and!` runs applicatively (accumulates errors in `validation { }`).
86
+ - In `task { }`, `use` disposes when the task finishes; don't return a disposable resource out of the block.
87
+
88
+ ```fsharp
89
+ // deps.FindCustomer and deps.Save return Task<Result<_, OrderError>>
90
+ let placeOrder (deps: Deps) (req: PlaceOrderRequest) : Task<Result<OrderId, OrderError>> =
91
+ taskResult {
92
+ let! customer = deps.FindCustomer req.CustomerId
93
+ let! lines = validateLines req.Lines |> Result.mapError InvalidLines
94
+ let order = Order.create customer lines
95
+ do! deps.Save order
96
+ return order.Id
97
+ }
98
+ ```
99
+
100
+ ## 5. Modules and file order
101
+
102
+ - Order files bottom-up: domain types, then pure domain logic, then infrastructure (DB, HTTP), then composition root / `Program.fs` last.
103
+ - One concept per file: a type and its module of functions with the same name (`type Order` + `module Order`), types first.
104
+ - Use `namespace` at the top of library files and modules inside; a top-level `module X` is fine for small apps and scripts.
105
+ - Mutually recursive types go in one `type ... and ...` group or a `namespace rec`; use `rec` sparingly, not to dodge file order.
106
+ - Keep side effects out of domain modules. Pass dependencies as function parameters or a small record of functions; reach for interfaces only when interop needs them.
107
+ - Mark helpers `private` and keep public surface small. Add `.fsi` signature files only if the project already uses them.
108
+
109
+ ## 6. .NET interop
110
+
111
+ - Treat every value from a C#/.NET API as possibly null: wrap with `Option.ofObj`, `Option.ofNullable`, or `match x with null -> ... | v -> ...`. With `<Nullable>enable</Nullable>`, annotate interop types as `string | null` and let the compiler warn.
112
+ - `TryParse`-style out parameters return a tuple: `match Int32.TryParse s with | true, n -> Some n | _ -> None`.
113
+ - Expose C#-friendly APIs from library code consumed by C#: classes with members, `Task<T>` not `Async<T>`, `seq`/`IReadOnlyList` not F# `list`, no curried public members, `[<CompiledName>]` where useful.
114
+ - Records and unions get structural equality; .NET classes don't. Don't use classes as `Map` keys unless they implement equality.
115
+ - `[<CLIMutable>]` on records only when a serializer or ORM needs a parameterless constructor. For JSON with unions, use the project's serializer setup (for example FSharp.SystemTextJson) rather than hand-written converters.
116
+ - Implement `IDisposable` with `interface IDisposable with member _.Dispose() = ...` and bind with `use`, not `let`.
117
+
118
+ ## Never
119
+
120
+ - Never use exceptions for control flow inside a `Result` pipeline.
121
+ - Never `ignore` a `Result`, `Task` or `Async` (`|> ignore` on a `Task<Result<_,_>>` drops the error).
122
+ - Never add `| _ ->` just to silence FS0025.
123
+ - Never reorder `.fsproj` files without checking every file that depended on the old order still compiles.
124
+
125
+ ## Stop and ask the user
126
+
127
+ - Before adding a NuGet package (FsToolkit.ErrorHandling, FSharpPlus, a JSON library).
128
+ - Before changing a public signature that C# or other assemblies consume.
129
+ - When the domain rule is unclear (which states are valid, which errors callers need to distinguish).
130
+
131
+ ## Report back
132
+
133
+ List the files changed and where they sit in the compile order, any new types or error cases, and the build or test command you ran with its result.
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Model our order lifecycle in F# so you can't ship an order that hasn't been paid",
4
+ "This F# module throws exceptions everywhere, rewrite it to return Result instead",
5
+ "Write an F# function that loads a customer from EF Core inside a task computation expression and returns Result",
6
+ "How should I organise the modules and file order in my new F# web API project?",
7
+ "Wrap this C# library that returns nulls so my F# code only sees Option values"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Write Expecto property tests with FsCheck for my F# parser",
11
+ "Review this F# pull request for incomplete pattern matches and mutable state",
12
+ "My F# project fails to build with FS0039 after I added a new file, fix it",
13
+ "Refactor this C# service to use records and pattern matching",
14
+ "Set up an EF Core migration for the new Orders table in our C# API"
15
+ ]
16
+ }
@@ -0,0 +1,136 @@
1
+ ---
2
+ name: fsharp-testing
3
+ description: Writes and fixes F# tests with Expecto or xUnit, FsCheck property-based tests for invariants, Unquote quotation assertions, and correct testing of task and async code without blocking. Use when adding tests to an F# project, turning example-based F# tests into properties, choosing between Expecto and xUnit for F#, or debugging flaky or hanging F# async tests.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs the .NET SDK (dotnet CLI) and the project's test packages.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: testing
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "dotnet"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # F# testing
15
+
16
+ Test behaviour through public functions, prefer properties for invariants, and keep async tests asynchronous.
17
+
18
+ ## 0. Find the setup first
19
+
20
+ 1. Find the test project (`*.Tests.fsproj`) and read its `<PackageReference>`s (or `paket.references`): Expecto, xUnit (`xunit` or `xunit.v3`), NUnit, FsCheck, `FsCheck.Xunit` / `FsCheck.Xunit.v3`, `Expecto.FsCheck`, Unquote.
21
+ 2. **Use the framework already there.** Don't add Expecto to an xUnit project or the reverse. If there is no test project, ask the user which one; default to Expecto for F#-only code and xUnit when the solution already uses it for C#.
22
+ 3. Run the suite once: `dotnet test` (or `dotnet run --project tests/X.Tests` for Expecto projects without the test adapter). If it already fails, **stop and tell the user** before changing anything.
23
+ 4. Remember file order: a new test file must be added to `<Compile Include=...>` in the test `.fsproj`, after the helpers it uses and before `Main.fs` / `Program.fs`.
24
+
25
+ ## 1. Expecto
26
+
27
+ ```fsharp
28
+ module OrderTests
29
+
30
+ open Expecto
31
+
32
+ [<Tests>]
33
+ let tests =
34
+ testList "Order" [
35
+ testCase "total sums line amounts" <| fun () ->
36
+ let order = Order.create [ line 2 10m; line 1 5m ]
37
+ Expect.equal (Order.total order) 25m "total"
38
+
39
+ testCase "empty order is rejected" <| fun () ->
40
+ Expect.isError (Order.tryCreate []) "empty order"
41
+
42
+ testTask "saves and reloads" {
43
+ let! saved = repo.Save order
44
+ let! loaded = repo.Load saved.Id
45
+ Expect.equal loaded (Some saved) "round trip"
46
+ }
47
+
48
+ testCaseAsync "async workflow" <| async {
49
+ let! r = Workflow.run input
50
+ Expect.isOk r "workflow"
51
+ }
52
+ ]
53
+ ```
54
+
55
+ - `Expect.*` arguments are **actual, expected, message**. Swapping them gives misleading failure output.
56
+ - Entry point: `[<EntryPoint>] let main argv = runTestsInAssemblyWithCLIArgs [] argv`, with `[<Tests>]` on each test value.
57
+ - For `dotnet test` and IDE discovery, reference `YoloDev.Expecto.TestSdk` and `Microsoft.NET.Test.Sdk`.
58
+ - Never commit `ftestCase` / `ftestList` (focused) or `ptestCase` (pending) by accident; focused tests silently skip the rest of the suite.
59
+ - Use `testSequenced` for tests that share a resource (a database, a port); Expecto runs tests in parallel by default.
60
+
61
+ ## 2. xUnit
62
+
63
+ ```fsharp
64
+ module OrderTests
65
+
66
+ open Xunit
67
+ open Swensen.Unquote
68
+
69
+ [<Fact>]
70
+ let ``total sums line amounts`` () =
71
+ let order = Order.create [ line 2 10m; line 1 5m ]
72
+ test <@ Order.total order = 25m @>
73
+
74
+ [<Theory>]
75
+ [<InlineData("", false)>]
76
+ [<InlineData("a@b.co", true)>]
77
+ let ``email validation`` (input: string, ok: bool) =
78
+ test <@ Result.isOk (EmailAddress.create input) = ok @>
79
+
80
+ [<Fact>]
81
+ let ``saves and reloads`` () = task {
82
+ let! saved = repo.Save order
83
+ let! loaded = repo.Load saved.Id
84
+ loaded =! Some saved
85
+ }
86
+ ```
87
+
88
+ - Use backtick names that read as sentences. Put tests in a module, not a class, unless you need fixture constructors or `IDisposable` cleanup.
89
+ - Async tests return `Task` via `task { }`. Never call `.Result`, `.Wait()` or `Async.RunSynchronously` in a test; it can deadlock and hides the real exception.
90
+ - Use `Assert.ThrowsAsync<T>` (or Unquote `raises`) for expected exceptions, not `try ... with`.
91
+
92
+ ## 3. Unquote
93
+
94
+ - `test <@ expr @>` fails with a step-by-step reduction of the expression, which beats `Assert.True`.
95
+ - Operators: `actual =! expected`, `actual <>! other`, `x >! y`, `raises<ArgumentException> <@ f bad @>`.
96
+ - Works inside Expecto and xUnit. Keep each quotation to one claim; split compound `&&` checks into separate tests.
97
+
98
+ ## 4. FsCheck property tests
99
+
100
+ Write a property when a rule holds for all inputs: round trips (`parse (format x) = x`), invariants (total is never negative), equivalence to a simple model, idempotence (`normalise (normalise x) = normalise x`).
101
+
102
+ ```fsharp
103
+ // xUnit
104
+ [<Property>]
105
+ let ``reverse twice is identity`` (xs: int list) =
106
+ List.rev (List.rev xs) = xs
107
+
108
+ // Expecto (Expecto.FsCheck)
109
+ testProperty "format then parse round trips" <| fun (m: Money) ->
110
+ Money.parse (Money.format m) = Ok m
111
+ ```
112
+
113
+ - Custom data: build a `Gen` and turn it into an `Arbitrary` with `Arb.fromGen`. Use `Gen.choose (lo, hi)`, `Gen.elements`, `Gen.map`, `Gen.filter` sparingly (heavy filters make FsCheck give up).
114
+ - Register generators as a type with static members returning `Arbitrary<'T>`, then `[<Property(Arbitrary = [| typeof<Generators> |])>]` in xUnit, or the `arbitrary` field of `FsCheckConfig` in Expecto.
115
+ - For validated types (private single-case unions), generate raw values that pass `create`, so properties exercise the real constructor.
116
+ - Use `==>` for preconditions only when they rarely fail; otherwise write a generator.
117
+ - When a property fails, FsCheck prints the shrunk counterexample and a seed. Copy the counterexample into a regular example test so it stays covered, then fix the code.
118
+ - FsCheck 2 and 3 differ (for example, 3 uses `ArbMap.defaults` where 2 used `Arb.Default`). Check the referenced version before copying examples.
119
+
120
+ ## 5. Testing task and async code
121
+
122
+ - Test the async function itself; don't wrap it in a synchronous helper.
123
+ - Pass a `CancellationToken` in and assert cancellation behaviour with a pre-cancelled token.
124
+ - Replace real time and I/O with function parameters (`now: unit -> DateTimeOffset`, `send: Email -> Task<Result<unit, SendError>>`). Pass fakes as plain lambdas; you rarely need a mocking library in F#.
125
+ - For `Result`-returning workflows, assert on the exact error case (`Error (OutOfStock sku)`), not just `isError`.
126
+ - No real network or wall-clock sleeps. If a test needs a delay, the design needs an injected clock.
127
+
128
+ ## Never
129
+
130
+ - Never delete, skip or weaken an existing test to make the suite pass without the user's agreement.
131
+ - Never leave focused (`ftest*`) or `Skip =` tests in a commit.
132
+ - Never assert on `ToString()` or `sprintf "%A"` output of records and unions; compare values, they have structural equality.
133
+
134
+ ## Report back
135
+
136
+ List tests added (names and file), the command you ran (`dotnet test --filter ...` or the Expecto run), final pass/fail counts, any FsCheck seed that found a bug, and what is still untested.
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Add Expecto tests for the F# invoice module, including the task-based repository calls",
4
+ "Turn these F# example tests into FsCheck properties so we cover more inputs",
5
+ "My xUnit test in F# hangs when I call Async.RunSynchronously, how should I test this async workflow?",
6
+ "Write Unquote assertions for the F# parser instead of Assert.Equal",
7
+ "Should our new F# library use Expecto or xUnit for its test project?"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Model the payment states in F# with discriminated unions",
11
+ "Review my F# changes for partial functions and incomplete matches",
12
+ "The F# test project won't compile because of a value restriction error",
13
+ "Write xUnit tests with Moq for my C# OrderService",
14
+ "Raise test coverage across the repo to 80 percent"
15
+ ]
16
+ }
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: gcp-patterns
3
+ description: Guides Google Cloud projects through service-account-based IAM without key files, choosing Cloud Run, GKE or Cloud Run functions, Cloud SQL connections through the Auth Proxy or connectors, Cloud Storage access control, Secret Manager, VPC and firewall basics, and the GCP billing gotchas such as idle GKE nodes, egress, and log ingestion. Use when deploying to or designing on Google Cloud, granting roles to a service account, picking a GCP runtime, or tracing an unexpected Google Cloud charge.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Live checks need the gcloud CLI authenticated to the target project. Infrastructure code may be Terraform or gcloud scripts.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: devops
9
+ kete-loom/risk: network
10
+ kete-loom/requires: "gcloud"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Google Cloud patterns
15
+
16
+ Run workloads on Google Cloud with one dedicated identity per service, no downloaded keys, private data stores and a bill you can explain. Terraform mechanics are in `terraform-patterns`, Kubernetes manifests in `kubernetes-patterns`, CI auth wiring in `github-actions-ci`.
17
+
18
+ ## Ground rules
19
+
20
+ 1. **One project per environment** (dev, staging, prod), grouped under folders in an organization. Projects are the blast-radius and billing boundary.
21
+ 2. **One user-managed service account per workload.** Never run services as the default Compute Engine service account; in older projects it may hold the broad Editor role.
22
+ 3. **No service account key files.** Workloads on Google Cloud get credentials from the metadata server automatically. CI uses Workload Identity Federation; GKE pods use Workload Identity Federation for GKE. If someone asks for a JSON key, **stop and ask** what it's for and offer federation first. Recommend the org policy `iam.disableServiceAccountKeyCreation`.
23
+ 4. **Predefined roles, granted at the narrowest resource.** Grant `roles/secretmanager.secretAccessor` on the one secret, `roles/storage.objectViewer` on the one bucket, not at project level. Never grant basic roles (Owner, Editor, Viewer) to workloads.
24
+ 5. **Secrets in Secret Manager**, mounted or exposed as env vars by Cloud Run / GKE from a pinned version or `latest` deliberately. Never in source, `app.yaml`, or build args.
25
+ 6. **Everything in IaC.** Console clicks are for exploring. Enable APIs (`gcloud services enable ...`) in code too.
26
+
27
+ ## Choosing compute
28
+
29
+ | Need | Pick | Watch out for |
30
+ |---|---|---|
31
+ | Stateless HTTP service or container, scale to zero | Cloud Run (service) | Request timeout limits; CPU is throttled outside requests under the default request-based billing, so background work needs instance-based billing (`--no-cpu-throttling`); set `max-instances` to cap cost and DB connections |
32
+ | Batch or run-to-completion container | Cloud Run jobs | Set task timeout and retries explicitly |
33
+ | Single function on an event (Pub/Sub, Storage, Eventarc) | Cloud Run functions (formerly Cloud Functions) | Same limits as Cloud Run; 1st gen is legacy, prefer the current generation |
34
+ | Many services, need Kubernetes APIs, daemons or GPUs on nodes | GKE (Autopilot first, Standard if you need node control) | Cluster fee plus node or pod cost; idle node pools on Standard |
35
+ | Legacy VM software | Compute Engine with a managed instance group | Use OS Login / IAP TCP forwarding, no public SSH |
36
+
37
+ Decision rule: default to Cloud Run. Move to GKE only when a concrete requirement (sidecars Cloud Run can't host, node-level access, very high steady load) is named.
38
+
39
+ ## Networking basics
40
+
41
+ 1. Use a custom-mode VPC with explicit subnets per region; don't build on the `default` network, whose firewall rules are broad.
42
+ 2. Firewall rules target service accounts or network tags, not "all instances". No `0.0.0.0/0` ingress except to a load balancer.
43
+ 3. Private Google Access on subnets so private VMs reach Google APIs without external IPs.
44
+ 4. Cloud Run reaches private resources (Cloud SQL private IP, Memorystore) through Direct VPC egress or a Serverless VPC Access connector.
45
+ 5. Outbound internet from private resources goes through Cloud NAT. Put public HTTP behind an external Application Load Balancer with Cloud Armor if the user needs WAF rules.
46
+
47
+ ## Data
48
+
49
+ - **Cloud SQL:** private IP, automated backups and point-in-time recovery on, high availability for production, deletion protection on. Connect through the Cloud SQL Auth Proxy or the language connector libraries (IAM-authorized, TLS) rather than allowlisting IPs. Prefer IAM database authentication where the engine supports it.
50
+ - **Cloud Storage:** uniform bucket-level access on; public access prevention enforced; object versioning or soft delete for data you can't regenerate; lifecycle rules for old objects. Give out signed URLs for temporary access, never `allUsers`.
51
+ - **Firestore / Spanner / BigQuery:** pick by access pattern; BigQuery bills by bytes scanned on on-demand pricing, so partition and cluster large tables and never `SELECT *` on them.
52
+
53
+ ## Cost traps
54
+
55
+ - GKE Standard node pools left at fixed size; GKE clusters for one tiny service.
56
+ - Cloud Run with `min-instances` > 0 or instance-based billing on services that are mostly idle.
57
+ - Internet and cross-region egress; Cloud NAT data processing.
58
+ - Cloud Logging ingestion from chatty debug logs; set exclusion filters and retention.
59
+ - BigQuery full-table scans; unattached persistent disks and old snapshots; static external IPs not in use.
60
+
61
+ Set a budget with alert thresholds on the billing account first.
62
+
63
+ ## Steps for a change
64
+
65
+ 1. Confirm the project ID and environment (`gcloud config get-value project`). If the active project is not the one the user means, **stop and ask**.
66
+ 2. Write the change in IaC; enable the APIs it needs in the same change.
67
+ 3. Validate: `terraform plan`; for gcloud scripts, `describe` the current state first, since most gcloud commands have no dry-run mode. For IAM, list what the change grants and to whom.
68
+ 4. **Stop and ask before** applying anything that deletes or recreates a database, bucket or disk, grants a basic role, makes a resource public, or targets production.
69
+ 5. After apply, verify the service's health endpoint, check `gcloud run services describe` (or equivalent) shows the intended service account, and confirm nothing became public.
70
+
71
+ ## Never
72
+
73
+ - Download a service account key "temporarily".
74
+ - Grant `roles/owner` or `roles/editor` to a service account or to `allAuthenticatedUsers`.
75
+ - Delete a project, bucket or Cloud SQL instance without the user confirming the exact name.
76
+
77
+ ## Review output
78
+
79
+ ```
80
+ GCP review: <project/env>
81
+ Critical: <public buckets, key files, basic roles on workloads>
82
+ High: <default SA in use, no backups, open firewall rules>
83
+ Cost: <each trap found>
84
+ Suggested IaC changes: <file: change>
85
+ Not checked: <what you had no access to>
86
+ ```
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Deploy this container to Cloud Run and give it a dedicated service account with minimal roles",
4
+ "How should our Cloud Run service connect to Cloud SQL Postgres on a private IP?",
5
+ "A teammate wants to download a JSON key for a GCP service account, is there a better way?",
6
+ "Cloud Run, GKE Autopilot or Cloud Run functions for a Pub/Sub event processor?",
7
+ "Our Google Cloud invoice is dominated by Cloud Logging ingestion and BigQuery scans"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Let our GitHub Actions workflow authenticate to Google Cloud with workload identity federation",
11
+ "Choose between Lambda and ECS Fargate for our API on AWS",
12
+ "Make our Azure Functions app read secrets from Key Vault with a managed identity",
13
+ "Write a BigQuery SQL query that finds the top ten customers by revenue",
14
+ "Tune the Helm chart values for our ingress controller"
15
+ ]
16
+ }
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: git-workflow
3
+ description: Everyday team git without an interactive editor - feature branches, choosing rebase or merge, resolving conflicts, tidying commits with fixup and autosquash, recovering lost commits through the reflog, and force-pushing with --force-with-lease so nobody's work is overwritten. Use when a branch has diverged, a rebase or merge hit conflicts, commits need squashing or rewording before review, work seems lost after a reset or bad rebase, or a rewritten branch must be pushed.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs git 2.23+ (switch/restore); --force-if-includes needs 2.30+ and --update-refs needs 2.38+.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: devops
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "git"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Git workflow
15
+
16
+ Keep history readable and never lose anyone's work. Every command here runs without opening an editor, so an agent can drive it.
17
+
18
+ ## 0. Look before you act
19
+
20
+ 1. Run `git status`, `git branch --show-current` and `git log --oneline --graph -15 --all`.
21
+ 2. Run `git fetch --prune` so you compare against the real remote.
22
+ 3. Find the base branch: `git symbolic-ref refs/remotes/origin/HEAD` (usually `origin/main`). If the project documents a different flow (release branches, `develop`), follow it.
23
+ 4. If the working tree has uncommitted changes, **stop and ask** whether to commit them, stash them (`git stash push -u -m "<why>"`) or leave the task.
24
+ 5. Before any history rewrite, create a safety ref: `git branch backup/<branch>-$(date +%Y%m%d%H%M%S)`. Delete it only after the user confirms the result.
25
+
26
+ ## 1. Branching
27
+
28
+ - One branch per change, cut from an up-to-date base: `git switch -c <type>/<short-topic> --no-track origin/main`. Without `--no-track` the new branch tracks `origin/main`, so a bare `git push` or `git pull` targets main. Publish it with `git push -u origin <branch>`.
29
+ - Name branches by intent (`fix/login-timeout`, `feat/export-csv`), not by person.
30
+ - Keep branches short-lived. If a branch is more than a few days behind, integrate the base (section 2) before adding more work.
31
+ - Never commit straight to the default branch unless the project explicitly works that way.
32
+
33
+ ## 2. Rebase or merge?
34
+
35
+ | Situation | Do |
36
+ |---|---|
37
+ | Your own unshared feature branch is behind main | `git rebase origin/main` |
38
+ | Branch is shared and others have pushed to it | `git merge origin/main` (never rewrite shared history) |
39
+ | Integrating a finished branch into main | Follow the repo's PR setting (squash, rebase or merge commit). Don't override it locally. |
40
+ | Long-running release branch | Merge, so the history of what shipped stays intact |
41
+ | Stacked branches (B built on A) | `git rebase --update-refs origin/main` from the top branch moves the whole stack |
42
+
43
+ To check whether a branch is shared: `git log --format='%an' origin/main..origin/<branch> | sort -u`. More than one author means merge, or ask first.
44
+
45
+ Set `git config pull.rebase true` only if the team agrees; otherwise use explicit `git fetch` plus rebase or merge.
46
+
47
+ ## 3. Resolving conflicts
48
+
49
+ 1. List conflicted files: `git diff --name-only --diff-filter=U`.
50
+ 2. For each file, read both sides and the intent of each change (`git log --oneline -3 -- <file>` on each side). Resolve by meaning, not by picking a side wholesale.
51
+ 3. During a **rebase**, "ours" is the branch you are rebasing onto and "theirs" is your commit being replayed. That is the opposite of a merge. Use `git checkout --ours|--theirs <file>` only when one side should win entirely.
52
+ 4. Lockfiles and generated files: take the base version, then regenerate with the project's tool (for example reinstall dependencies) instead of hand-merging.
53
+ 5. Remove every conflict marker. Check: `git diff --check` and search for `^<<<<<<<|^>>>>>>>`.
54
+ 6. Build and run the tests before continuing.
55
+ 7. `git add <file>` then `git rebase --continue` (or `git commit --no-edit` for a merge). Use `GIT_EDITOR=true git rebase --continue` to accept the existing message without an editor.
56
+ 8. If the conflict is in code you don't understand, or both sides changed behaviour, **stop and ask** the user. To back out cleanly: `git rebase --abort` or `git merge --abort`.
57
+
58
+ Turn on `git config rerere.enabled true` for repeated conflicts while rebasing long branches.
59
+
60
+ ## 4. Cleaning up history without an editor
61
+
62
+ Only on commits that are not yet on a shared branch.
63
+
64
+ - **Fix an earlier commit:** stage the fix, `git commit --fixup=<sha>`, then
65
+ `GIT_SEQUENCE_EDITOR=true git rebase -i --autosquash origin/main`.
66
+ Setting the sequence editor to `true` accepts the generated todo list, so nothing interactive opens.
67
+ - **Reword the last commit:** `git commit --amend -m "<new message>"`.
68
+ - **Reword an older commit:** `git commit --allow-empty -m "amend! <exact original subject>" -m "<new full message>"`, then the autosquash command above. (`--fixup=reword:` does the same but opens an editor.)
69
+ - **Squash the whole branch into one commit:** `git reset --soft $(git merge-base HEAD origin/main)` then `git commit -m "<message>"`.
70
+ - **Split the last commit:** `git reset HEAD~1`, then stage and commit each piece by path (`git add <path>`; `git add -p` is interactive).
71
+ - **Drop a commit from the branch:** `git rebase --onto <sha>^ <sha>` (removes `<sha>`, keeps the rest).
72
+ - **Undo a commit already on a shared branch:** `git revert <sha>`. Never rewrite it.
73
+
74
+ After any rewrite, compare the result: `git diff backup/<branch>-<stamp> HEAD` should be empty when you only reshaped commits on the same base. If you also rebased onto a newer base, compare `git range-diff <old-base>..backup/<branch>-<stamp> <new-base>..HEAD` instead.
75
+
76
+ ## 5. Recovering lost work
77
+
78
+ Nothing committed is gone until garbage collection. By default the reflog keeps entries for commits no longer on any branch for 30 days (`gc.reflogExpireUnreachable`), and 90 days for the rest.
79
+
80
+ 1. `git reflog -30` (or `git reflog show <branch>`) to find the commit before the mistake, such as the entry before `rebase (start)` or `reset: moving to`.
81
+ 2. Inspect it: `git show --stat <sha>`.
82
+ 3. Restore without destroying anything: `git branch rescue/<topic> <sha>`. Only after the user agrees, move the branch: `git reset --hard <sha>`.
83
+ 4. Lost stash: `git fsck --no-reflogs --unreachable | grep commit`, then `git show <sha>` to find it, and `git stash apply <sha>`.
84
+ 5. Unstaged changes discarded with `git checkout -- .`, `git restore .` or `git reset --hard` are **not** recoverable by git. Say so plainly; check the editor's local history instead. Changes that had been staged survive as dangling blobs: `git fsck --lost-found` writes them to `.git/lost-found/other/` for inspection.
85
+
86
+ ## 6. Pushing rewritten branches safely
87
+
88
+ 1. Push: `git push --force-with-lease --force-if-includes origin <branch>`.
89
+ - `--force-with-lease` refuses if the remote moved since your last fetch.
90
+ - `--force-if-includes` also refuses if a background fetch updated the remote ref but you never integrated those commits.
91
+ 2. If the push is rejected, **do not** retry with `--force`. Fetch, inspect `git log HEAD..origin/<branch>`, integrate the new commits, and push again.
92
+ 3. Never force-push `main`, `master`, release branches or any protected branch. If one seems to need it, stop and ask.
93
+ 4. Tell collaborators on the branch that it was rewritten; they should `git fetch` and `git rebase origin/<branch>` or reset onto it.
94
+
95
+ ## Never
96
+
97
+ - Never run `git reset --hard`, `git clean -fd`, `git checkout -- .` or `git stash drop` on work the user hasn't confirmed is disposable.
98
+ - Never use plain `git push --force`.
99
+ - Never rewrite commits that exist on a shared or protected branch.
100
+ - Never resolve a conflict by deleting the other side's change without understanding it.
101
+ - Never bypass hooks with `--no-verify` unless the user asks.
102
+
103
+ ## Report back
104
+
105
+ End with:
106
+
107
+ ```
108
+ Branch: <name> (base <base>, ahead N / behind M)
109
+ Did: <rebase | merge | cleanup | recovery | push>
110
+ Conflicts: <files and how each was resolved, or none>
111
+ Safety ref: <backup branch name, or none>
112
+ Checks: <build/test command and result>
113
+ Next: <what the user or collaborators must do>
114
+ ```
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "My feature branch is 40 commits behind main and the rebase stopped with conflicts in three files, help me get through it",
4
+ "I did git reset --hard by mistake and my last two commits are gone, can we get them back?",
5
+ "Squash the fixup commits on this branch into the commits they belong to before I ask for review",
6
+ "Should I rebase or merge main into my branch? Two of us have been pushing to it",
7
+ "I rewrote my branch history locally, how do I push it without clobbering my teammate's commits?"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Write a commit message for these staged changes using feat/fix prefixes",
11
+ "Cut version 2.4.0, update the changelog and tag the release",
12
+ "Set up a GitHub Actions job that runs the tests on every pull request",
13
+ "Write a description for my pull request summarising the changes",
14
+ "Review the diff on this branch for bugs before I merge"
15
+ ]
16
+ }