@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,125 @@
1
+ ---
2
+ name: homelab-network-setup
3
+ description: Plans and builds a self-hosted home lab network from an address and VLAN plan through inter-VLAN firewall policy, local DNS filtering with Pi-hole or AdGuard Home, WireGuard remote access, configuration backups, and exposing a few services to the internet without opening the whole LAN. Use when someone is designing or rebuilding a home or small-office network, isolating IoT or guest devices, setting up a VPN to reach home from outside, or deciding how to publish a self-hosted app safely.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Vendor-neutral; applies to OPNsense, pfSense, OpenWrt, MikroTik, UniFi and similar routers. WireGuard commands need wireguard-tools.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: devops
9
+ kete-loom/risk: writes-files
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ # Home lab network setup
14
+
15
+ Produce a written plan first, then configs. A home lab is usually run by one person with no out-of-band access, so every step must leave a way back in.
16
+
17
+ WireGuard configs and key handling are in `references/wireguard.md`. A starting firewall policy matrix and DNS details are in `references/firewall-and-dns.md`. Read them when you reach those steps.
18
+
19
+ ## Ground rules
20
+
21
+ 1. **Plan before touching the router.** Write the address plan, VLAN list and firewall matrix and get the user to confirm it.
22
+ 2. **Keep a way back in.** Before changing the router or firewall: export its configuration, keep a wired port on the management network, and know how to factory-reset and restore. Never change the VLAN or rules on the port or Wi-Fi you are using to manage it without a rollback.
23
+ 3. **Default deny between segments.** Each VLAN reaches only what the matrix allows. The internet never reaches the LAN except through the VPN or an explicitly published service.
24
+ 4. **Prefer VPN to port forwards.** A service reachable only over WireGuard has no internet attack surface beyond one UDP port that ignores unauthenticated packets.
25
+ 5. **Secrets stay local.** Never print or commit private keys, PSKs, admin passwords or API tokens. Generate keys on the device that uses them.
26
+
27
+ ## Step 1: Gather facts (ask if unknown)
28
+
29
+ - Router/firewall hardware and OS, and whether switches and access points support 802.1Q VLANs (managed or "smart" switches; unmanaged switches do not).
30
+ - ISP setup: does the router's WAN address match the public IP shown by an external "what is my IP" check? A WAN address in `100.64.0.0/10`, or one that does not match, means CGNAT: inbound port forwards and a plain WireGuard server will not work. Stop and offer a relay option (a VPS endpoint or a mesh VPN service) or asking the ISP for a public IPv4.
31
+ - Devices by trust level, and which services must be reachable from where.
32
+ - Whether IPv6 is delivered. If it is, every rule below must be written for IPv6 too, because IPv6 hosts are globally addressable.
33
+
34
+ ## Step 2: Address and VLAN plan
35
+
36
+ Use one `/24` per VLAN from `10.0.0.0/8` or `172.16.0.0/12`, and avoid `192.168.0.0/24` and `192.168.1.0/24`: they collide with most remote networks you will VPN in from. Make the third octet equal the VLAN ID so addresses are self-describing.
37
+
38
+ | VLAN | Name | Example subnet | Holds |
39
+ |---|---|---|---|
40
+ | 10 | mgmt | 10.10.10.0/24 | Router, switch, AP and hypervisor admin interfaces |
41
+ | 20 | trusted | 10.10.20.0/24 | Your laptops and phones |
42
+ | 30 | servers | 10.10.30.0/24 | Self-hosted services, NAS |
43
+ | 40 | iot | 10.10.40.0/24 | TVs, smart plugs, speakers |
44
+ | 50 | guest | 10.10.50.0/24 | Visitors, internet only |
45
+ | 60 | cameras | 10.10.60.0/24 | IP cameras, no internet |
46
+ | — | wg | 10.10.99.0/24 | WireGuard clients (not a VLAN, a routed tunnel subnet) |
47
+
48
+ - Use `home.arpa` (reserved for home networks by RFC 8375) or a subdomain of a domain you own for local names. Do not use `.local` (mDNS) or an invented TLD.
49
+ - Reserve static DHCP leases for servers and infrastructure; keep a dynamic range for the rest.
50
+ - Switch ports: trunk (tagged) to the router, APs and hypervisors; access (untagged) ports for single devices. Map each Wi-Fi SSID to one VLAN.
51
+
52
+ ## Step 3: Firewall policy
53
+
54
+ Write the policy as a matrix, source rows by destination columns, before writing any rule. Start from `references/firewall-and-dns.md` and adapt it. Then on each internal interface, in this order:
55
+
56
+ 1. Allow established and related traffic.
57
+ 2. Allow DNS (UDP and TCP 53) and DHCP to the router or the DNS server only.
58
+ 3. Allow the specific source-to-destination ports from the matrix (for example trusted → servers TCP 443, 22).
59
+ 4. Block the interface's traffic to all private ranges (`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, and the router's own addresses on other VLANs, including its admin UI).
60
+ 5. Allow to the internet (any remaining destination), except for VLANs that must stay offline, such as cameras.
61
+
62
+ - Admin UIs (router, switch, hypervisor, NAS) answer only from mgmt and trusted, never from IoT or guest.
63
+ - Casting and discovery across VLANs need an mDNS reflector or repeater on the router plus narrow allow rules; enable them only for the pairs that need them.
64
+ - Turn UPnP/NAT-PMP off, or limit it to one gaming console's address. It lets any LAN device open inbound ports.
65
+
66
+ ## Step 4: DNS
67
+
68
+ 1. Run Pi-hole or AdGuard Home on a static address in the servers or mgmt VLAN, with upstream either a public DoT/DoH resolver or a local recursive resolver such as Unbound.
69
+ 2. Hand it out by DHCP on every VLAN. Do not list a public resolver as a second DNS server: clients use both, and filtering silently stops.
70
+ 3. If you want a fallback, run a second filtering instance, not a public resolver.
71
+ 4. Optionally redirect or block outbound port 53 from clients so hard-coded resolvers go through yours. Devices using DNS-over-HTTPS will bypass this; that needs DoH blocklists, not a port rule.
72
+ 5. Add local records for each service (`nas.home.arpa`) so you never browse by IP.
73
+
74
+ ## Step 5: WireGuard remote access
75
+
76
+ Follow `references/wireguard.md`. The essentials:
77
+
78
+ - Run the server on the router or a server in the servers VLAN; forward one UDP port (51820 by convention) to it.
79
+ - One key pair per client device. `AllowedIPs` on the server side is that peer's single tunnel address (`/32`).
80
+ - Split tunnel (clients route only the home subnets) by default; full tunnel (`0.0.0.0/0, ::/0`) only when the user wants all traffic to exit at home.
81
+ - Treat the `wg` subnet as its own source in the firewall matrix: usually the same access as trusted, never more.
82
+ - For a dynamic home IP, point a DNS name at it with dynamic DNS and use that name as the client `Endpoint`.
83
+
84
+ ## Step 6: Publishing a service safely
85
+
86
+ Ask first whether the service really needs to be public. If only the user and family use it, the VPN is the answer. When it must be public:
87
+
88
+ 1. Put it in the servers VLAN (or a dedicated DMZ VLAN) that cannot initiate connections to trusted or mgmt.
89
+ 2. Expose only a reverse proxy on TCP 443 with automatic certificates; forward nothing else. Never forward SSH, RDP, SMB, database ports, or any admin UI.
90
+ 3. Add authentication in front of apps that lack strong login (a forward-auth or SSO layer), and rate limiting or ban-on-failure.
91
+ 4. As an alternative to a port forward, an outbound tunnel service keeps the home IP private and works behind CGNAT. Note that the provider then sees the traffic.
92
+ 5. Keep the published software patched; subscribe to its release notes.
93
+
94
+ ## Step 7: Backups and change safety
95
+
96
+ - Export router, switch and AP configs after every change and store them off the device (encrypted if they contain keys). Note firmware versions with them.
97
+ - Back up the DNS server's config and the WireGuard configs the same way.
98
+ - Before applying firewall changes remotely, schedule an automatic rollback (use the router's own mechanism if it has one, such as MikroTik Safe Mode; on Linux, schedule a restore of the saved ruleset with `at` or a timer) and cancel it only once you have reconnected.
99
+ - Follow 3-2-1 for data on the NAS: three copies, two media, one off-site.
100
+
101
+ ## Stop and ask the user
102
+
103
+ - Before applying any change to the router, firewall or switch you connect through.
104
+ - When CGNAT is detected, or the hardware cannot do VLANs.
105
+ - Before exposing anything to the internet; confirm which service, who uses it, and the auth in front of it.
106
+
107
+ ## Never
108
+
109
+ - Never put admin interfaces on the WAN or in the guest/IoT VLANs.
110
+ - Never reuse one WireGuard key pair on several devices.
111
+ - Never write keys, passwords or real public IPs into files that will be committed or shared.
112
+
113
+ ## Deliverable
114
+
115
+ ```
116
+ 1. Facts: hardware, ISP/CGNAT result, IPv6 yes/no
117
+ 2. Address and VLAN plan (table)
118
+ 3. Firewall matrix (table) and rule order per interface
119
+ 4. DNS: server, upstream, records, how clients get it
120
+ 5. Remote access: WireGuard server, port, peers, split or full tunnel
121
+ 6. Published services: name, path (proxy/tunnel), auth
122
+ 7. Backup and rollback plan
123
+ 8. Order of work, with the step that could cut access marked
124
+ 9. Open questions for the user
125
+ ```
@@ -0,0 +1,18 @@
1
+ {
2
+ "should_trigger": [
3
+ "I just bought a managed switch and an OPNsense box, how should I lay out VLANs for my homelab?",
4
+ "Help me put all my smart plugs and the TV on their own network so they can't see my NAS",
5
+ "Set up WireGuard so I can reach Jellyfin and my NAS at home from my phone",
6
+ "Should I port forward Nextcloud or is there a safer way to make it reachable from outside?",
7
+ "Plan a Pi-hole setup for every VLAN at home without a public DNS fallback leaking queries",
8
+ "I'm rebuilding my home network from scratch, guest Wi-Fi, cameras with no internet, the works"
9
+ ],
10
+ "should_not_trigger": [
11
+ "My laptop gets a 169.254 address and can't reach anything, how do I debug it?",
12
+ "Audit this pf.conf and OpenVPN server config from my firewall for weak settings",
13
+ "Write a docker-compose file for Nextcloud with Postgres and Redis",
14
+ "Create a Kubernetes Ingress with cert-manager for my cluster",
15
+ "Design an AWS VPC with private subnets and a NAT gateway for production",
16
+ "dig shows SERVFAIL for my domain but only on some resolvers, why?"
17
+ ]
18
+ }
@@ -0,0 +1,45 @@
1
+ # Firewall matrix and DNS details
2
+
3
+ ## Starting matrix
4
+
5
+ Rows are sources, columns are destinations. "Ports" means only the listed ports; everything not listed is blocked. Adapt it with the user, then turn each cell into rules.
6
+
7
+ | From \ To | mgmt | trusted | servers | iot | guest | cameras | internet |
8
+ |---|---|---|---|---|---|---|---|
9
+ | mgmt | allow | allow | allow | allow | no | allow | allow |
10
+ | trusted | admin ports (443, 22) | allow | service ports | control ports (casting, app) | no | NVR ports | allow |
11
+ | wg (VPN) | admin ports, if wanted | same as trusted | service ports | no | no | NVR ports | per tunnel mode |
12
+ | servers | no | no | allow | no | no | NVR pulls streams | allow (updates) |
13
+ | iot | no | replies only | specific ports (Home Assistant, MQTT) | allow or no | no | no | allow |
14
+ | guest | no | no | no | no | no (client isolation) | no | allow |
15
+ | cameras | no | no | NVR only | no | no | no | **no** |
16
+
17
+ "Replies only" is covered by the established/related rule; it never needs its own allow.
18
+
19
+ Every VLAN also needs: DNS to the DNS server, DHCP to the router, and NTP to the router (or allow NTP out) so clocks stay correct for TLS.
20
+
21
+ ## Rule example (nftables, one internal interface)
22
+
23
+ ```nft
24
+ table inet filter {
25
+ chain forward {
26
+ type filter hook forward priority 0; policy drop;
27
+ ct state established,related accept
28
+ ct state invalid drop
29
+ iifname "vlan40" ip daddr 10.10.30.53 meta l4proto { tcp, udp } th dport 53 accept # iot -> Pi-hole/AdGuard
30
+ iifname "vlan40" ip daddr 10.10.30.10 tcp dport { 1883, 8123 } accept # iot -> Home Assistant, MQTT
31
+ iifname "vlan40" ip daddr { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 } drop
32
+ iifname "vlan40" oifname "wan" accept
33
+ }
34
+ }
35
+ ```
36
+
37
+ Check a ruleset file without applying it: `sudo nft -c -f ruleset.nft`. Put every allow to a private address (DNS server included) above the private-range drop, or it never matches. Rules for traffic to the router itself (its DNS, admin UI) go in the `input` chain, not `forward`.
38
+
39
+ ## DNS details
40
+
41
+ - **Recursive upstream.** Running Unbound locally as Pi-hole/AdGuard's upstream means no third-party resolver sees your queries; the trade-off is your ISP sees queries to authoritative servers in clear text. A DoT/DoH upstream hides queries from the ISP but trusts that provider.
42
+ - **Conditional forwarding** lets the DNS server ask the router for names of DHCP clients (`laptop.home.arpa`) and for reverse lookups of local addresses.
43
+ - **Router's own DNS.** If the router also runs a resolver, either point it at the filter too or disable it, so there is one source of truth.
44
+ - **IPv6.** Router advertisements can hand out their own DNS server (RDNSS). Make it the filter's IPv6 address, or clients will bypass the filter over IPv6.
45
+ - **Do not expose DNS to the WAN.** An open resolver on port 53 is abused for amplification attacks. Allow port 53 only from internal interfaces and the VPN.
@@ -0,0 +1,72 @@
1
+ # WireGuard remote access
2
+
3
+ ## Keys
4
+
5
+ Generate each key pair on the device that will use it, so the private key never travels:
6
+
7
+ ```sh
8
+ umask 077
9
+ wg genkey | tee client.key | wg pubkey > client.pub
10
+ wg genpsk > client.psk # optional pre-shared key per peer, adds a symmetric layer
11
+ ```
12
+
13
+ Only public keys (and the PSK, over a secure channel) are exchanged. Phone apps generate their own pair; copy only the public key off the phone. If you must generate a config for a phone elsewhere and show it as a QR code (`qrencode -t ansiutf8 < phone.conf`), delete the file afterwards.
14
+
15
+ ## Server (`/etc/wireguard/wg0.conf`)
16
+
17
+ ```ini
18
+ [Interface]
19
+ Address = 10.10.99.1/24
20
+ ListenPort = 51820
21
+ PrivateKey = <server private key>
22
+
23
+ [Peer]
24
+ # laptop
25
+ PublicKey = <laptop public key>
26
+ PresharedKey = <laptop psk>
27
+ AllowedIPs = 10.10.99.2/32
28
+
29
+ [Peer]
30
+ # phone
31
+ PublicKey = <phone public key>
32
+ AllowedIPs = 10.10.99.3/32
33
+ ```
34
+
35
+ - Server-side `AllowedIPs` is both a route and an access check: packets from that peer are accepted only from those source addresses. Give each client a single `/32` (and `/128` for IPv6). Add a subnet only for a site-to-site peer that routes a whole network.
36
+ - The server needs IP forwarding (`net.ipv4.ip_forward=1`, and `net.ipv6.conf.all.forwarding=1` for IPv6) and firewall rules allowing `wg0` to reach the permitted VLANs. If the home subnets do not know the route back to `10.10.99.0/24` (the server is not the router), add that route on the router or NAT the tunnel traffic.
37
+ - On router OSes (OPNsense, pfSense, OpenWrt, MikroTik) the same fields exist in the WireGuard UI; the firewall rules go on the WireGuard interface.
38
+
39
+ ## Client
40
+
41
+ ```ini
42
+ [Interface]
43
+ Address = 10.10.99.2/32
44
+ PrivateKey = <laptop private key>
45
+ DNS = 10.10.30.53 # your Pi-hole/AdGuard, so home names resolve
46
+
47
+ [Peer]
48
+ PublicKey = <server public key>
49
+ PresharedKey = <laptop psk>
50
+ Endpoint = vpn.example.com:51820
51
+ AllowedIPs = 10.10.0.0/16 # split tunnel: home subnets only
52
+ PersistentKeepalive = 25 # only needed if the client sits behind NAT and must receive traffic
53
+ ```
54
+
55
+ - Full tunnel: `AllowedIPs = 0.0.0.0/0, ::/0`. Then home DNS and the server's NAT to the internet must work, or the client loses all connectivity.
56
+ - If the client's own LAN uses the same subnet as home, routing breaks. That is why the plan avoids `192.168.0.0/24` and `192.168.1.0/24`.
57
+
58
+ ## Bring up and check
59
+
60
+ ```sh
61
+ sudo wg-quick up wg0
62
+ sudo wg show # after sending traffic (ping the server tunnel IP): a recent "latest handshake" and rising transfer counters = working
63
+ sudo systemctl enable wg-quick@wg0 # start at boot on systemd hosts
64
+ ```
65
+
66
+ - No handshake at all: the UDP port forward, the ISP (CGNAT), the `Endpoint` name, or mismatched public keys.
67
+ - Handshake but no traffic: `AllowedIPs` on either side, IP forwarding, or firewall rules on `wg0`.
68
+ - Handshake and pings work but web pages or SSH stall: MTU. Set `MTU = 1280` in the client `[Interface]` to test, then raise it.
69
+
70
+ ## Revoking a device
71
+
72
+ Delete its `[Peer]` block from the server's `wg0.conf`, then apply without dropping other peers: `sudo wg syncconf wg0 <(sudo wg-quick strip wg0)` (bash), or remove it live with `sudo wg set wg0 peer <pubkey> remove`. Do both, or the peer returns on the next restart. Because each device has its own key, nothing else changes.
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: hubtel-integration
3
+ description: Guides Ghana-focused Hubtel merchant integrations end to end, from Online Checkout (redirect or onsite iframe) and Direct Receive Money prompts on MTN, Telecel and AirtelTigo wallets to callback handling, the mandatory Transaction Status Check, Basic auth with API ID and key, the 4-IP whitelist, and sending SMS through the Hubtel SMS API. Use when accepting payments into a Hubtel Merchant Account, wiring a Hubtel callback or status check, fixing a Hubtel 403 or 4000 response, or sending transactional SMS through Hubtel.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Live calls need network access to Hubtel's API hosts from a whitelisted server IP. Examples are TypeScript (Node 18+); the rules apply to any backend language.
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
+ # Hubtel integration
14
+
15
+ Accept payments into a Hubtel Merchant Account so that a fake callback can't mark an order paid, a missing callback still settles, and a `clientReference` is never charged twice. Also covers sending SMS. If the project takes Ghana payments through Paystack or calls MTN MoMo directly, follow that skill instead.
16
+
17
+ ## Ground rules
18
+
19
+ 1. **Credentials stay on the server.** Sales (payments) use `Authorization: Basic base64(API ID:API Key)`; SMS uses `base64(ClientID:ClientSecret)`. Read both from the environment. They are different credential pairs.
20
+ 2. **Calls only work from whitelisted IPs.** Share your server's public egress IP with your Hubtel Retail Systems Engineer. Hubtel allows at most 4 IPs per service; anything else gets `403 Forbidden` or a timeout. Serverless functions with changing IPs need a fixed-egress proxy or NAT.
21
+ 3. **Your Collection Account Number is in the URL or body** of every payment and status call. It identifies your merchant account; keep it in config, not code.
22
+ 4. **One unique `clientReference` per attempt, stored first.** Hubtel says it must never be duplicated. Max 32 characters for Online Checkout, 36 for Direct Receive Money; use alphanumerics.
23
+ 5. **The server sets the amount.** `totalAmount` / `Amount` are decimals in cedis with at most 2 decimal places. Keep integer pesewas in your database and format at the boundary (`(pesewas / 100).toFixed(2)`), never compute with floats.
24
+ 6. **Callbacks are not signed.** Use them as a trigger only. Confirm with the Transaction Status Check, and give value only when `status` is `Paid` and the amount equals what you stored. Hubtel publishes a callback source IP per product that you can allow-list (see `references/api.md`).
25
+ 7. **Status check is mandatory when no callback arrives.** Hubtel's docs require it for any transaction with no final callback after 5 minutes. Run it from a background job.
26
+ 8. **Prevent unsolicited prompts.** For Direct Receive Money, Hubtel requires that customers can't freely type any number: either lock the number to a verified account or send an OTP to the number first.
27
+
28
+ ## Choose the flow
29
+
30
+ | Need | Use |
31
+ |---|---|
32
+ | Hosted page with mobile money, card, Hubtel/G-Money wallet and GhQR | Online Checkout: `POST https://payproxyapi.hubtel.com/items/initiate`, redirect to `checkoutUrl` or embed `checkoutDirectUrl` in an iframe |
33
+ | Prompt a wallet from your own UI | Direct Receive Money: `POST https://rmp.hubtel.com/merchantaccount/merchants/{Collection_Account_Number}/receive/mobilemoney` with `Channel` `mtn-gh`, `vodafone-gh` (Telecel) or `tigo-gh` (AirtelTigo) |
34
+ | Notify a customer | SMS: `POST https://sms.hubtel.com/v1/messages/send` |
35
+
36
+ ## Flow
37
+
38
+ ```
39
+ client ──(order id)──▶ server: create pending payment with clientReference
40
+ server ──initiate checkout or receive money──▶ Hubtel
41
+ checkout: responseCode "0000" + checkoutUrl → redirect customer
42
+ receive money: ResponseCode "0001" = pending, customer approves on phone
43
+ Hubtel ──POST callbackUrl / PrimaryCallbackURL──▶ server: 200 fast, queue a status check
44
+ server ──GET api-txnstatus.hubtel.com/transactions/{acct}/status?clientReference=..──▶ Paid + amount match → fulfil once
45
+ background job: status-check anything still pending after 5 minutes
46
+ ```
47
+
48
+ ## Implementation steps
49
+
50
+ 1. **Configure**: API ID and key, Collection Account Number, callback base URL, and (for SMS) client ID, secret and an approved sender ID (max 11 characters). Confirm the server's egress IP is whitelisted before debugging anything else.
51
+ 2. **Initiate** with the request bodies in `references/api.md`. `description` must not contain special characters (`&*!%@`), which Hubtel rejects.
52
+ 3. **Callback endpoint**: accept `POST`, respond `200` quickly, look up the pending payment by `ClientReference` from the body, and enqueue a status check. Unknown reference → log and ignore.
53
+ 4. **Status check** `GET https://api-txnstatus.hubtel.com/transactions/{Collection_Account_Number}/status?clientReference=...`. Map `data.status`: `Paid` → fulfil (guarded update `WHERE status = 'pending'`), `Unpaid` → keep waiting until your timeout then mark failed, `Refunded` → reverse fulfilment.
54
+ 5. **Map response codes** using `references/api.md`: `0000` success, `0001` pending, `2001` customer-side failure (insufficient funds, wrong PIN, timeout), `4000` validation error, `4070` fees not set or below minimum, `0005` unknown state (contact Hubtel; do not retry blindly).
55
+ 6. **SMS**: send with Basic auth, then store `messageId` and check delivery with `GET https://sms.hubtel.com/v1/messages/{messageId}`. `Sent` is not `Delivered`.
56
+ 7. **Persist** per payment: `clientReference`, order id, expected amount (pesewas), channel, phone, Hubtel `TransactionId` / `checkoutId`, `ExternalTransactionId`, charges, status, timestamps.
57
+
58
+ ## Reviewing an existing integration
59
+
60
+ - Order fulfilled from the callback body, or from `0000` on the initiate response.
61
+ - No status-check job, so payments stuck in `0001` never settle.
62
+ - `clientReference` reused on retry, or longer than the limit.
63
+ - Float amounts with more than 2 decimals, or a price taken from the client.
64
+ - Sales and SMS credentials mixed up, or credentials in client code.
65
+ - Calls from an unwhitelisted host (works locally through a VPN, fails in production with 403).
66
+ - Direct Receive Money open to any typed phone number with no OTP or account lock.
67
+ - Charges ignored: `AmountAfterCharges` is what settles; reconcile on it.
68
+
69
+ ## Stop and ask the user
70
+
71
+ - Whether they already have a Hubtel Merchant Account, the Collection Account Number, and a whitelisted IP. Without these nothing can be tested live.
72
+ - Which product they want (Online Checkout or Direct Receive Money) and whether Hubtel has enabled it on the account.
73
+ - Before sending bulk SMS: sender ID approval and consent for marketing messages.
74
+
75
+ ## Before you finish
76
+
77
+ Hubtel's docs at developers.hubtel.com are the final word; this skill gives the rules and the shape. Then test: a paid checkout, a cancelled checkout, a wallet prompt the customer rejects, a prompt that times out, a callback that never arrives (status job settles it), the same callback twice (fulfils once), and a forged callback for a real `clientReference` while the status check says `Unpaid` (must not fulfil).
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Integrate Hubtel online checkout for a Ghanaian school fees portal",
4
+ "Accept Telecel Cash payments through Hubtel in our Ghana app",
5
+ "Hubtel receive money returns 403 Forbidden from our server, why?",
6
+ "Send order confirmation SMS to customers with Hubtel",
7
+ "Hubtel never sent the callback for some payments, how do I check their status?"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Let users pay with MTN MoMo through Paystack in the mobile app",
11
+ "Call the MTN MoMo Open API requesttopay endpoint directly",
12
+ "Accept Ghana mobile money with Flutterwave direct charge instead of the hosted page",
13
+ "Audit our payment webhook handlers for missing signature checks",
14
+ "Send transactional email receipts with SendGrid after checkout"
15
+ ]
16
+ }
@@ -0,0 +1,92 @@
1
+ # Hubtel API shapes used by this skill
2
+
3
+ Payments (Sales) auth: `Authorization: Basic base64(API ID:API Key)`. SMS auth: `Authorization: Basic base64(ClientID:ClientSecret)`. Send `Content-Type: application/json`. All payment hosts only answer whitelisted IPs (max 4 per service).
4
+
5
+ Confirm fields against developers.hubtel.com before shipping; this is a working summary.
6
+
7
+ ## Online Checkout
8
+
9
+ `POST https://payproxyapi.hubtel.com/items/initiate`
10
+
11
+ ```json
12
+ {
13
+ "totalAmount": 25.50,
14
+ "description": "Order 8F2C1A",
15
+ "callbackUrl": "https://api.example.com/hooks/hubtel/checkout",
16
+ "returnUrl": "https://app.example.com/pay/return",
17
+ "cancellationUrl": "https://app.example.com/pay/cancelled",
18
+ "merchantAccountNumber": "<Collection Account Number>",
19
+ "clientReference": "ord8f2c1aA1",
20
+ "payeeName": "Ama Mensah",
21
+ "payeeMobileNumber": "233241234567",
22
+ "payeeEmail": "ama@example.com"
23
+ }
24
+ ```
25
+
26
+ All fields above are mandatory except the `payee*` ones. `clientReference` max 32 characters. Response: `responseCode` `"0000"` (accepted), `data.checkoutUrl` (redirect), `data.checkoutDirectUrl` (onsite iframe), `data.checkoutId`, `data.clientReference`. The return URL is display only; fulfilment waits for the callback plus status check.
27
+
28
+ Checkout callback source IP to allow-list (optional extra layer, confirm the current value in Hubtel's docs because it can change): `108.129.40.25`.
29
+
30
+ ## Direct Receive Money
31
+
32
+ `POST https://rmp.hubtel.com/merchantaccount/merchants/{Collection_Account_Number}/receive/mobilemoney`
33
+
34
+ ```json
35
+ {
36
+ "CustomerName": "Ama Mensah",
37
+ "CustomerMsisdn": "233241234567",
38
+ "CustomerEmail": "ama@example.com",
39
+ "Channel": "mtn-gh",
40
+ "Amount": 25.50,
41
+ "PrimaryCallbackURL": "https://api.example.com/hooks/hubtel/receive",
42
+ "Description": "Order 8F2C1A",
43
+ "ClientReference": "ord8f2c1aA1"
44
+ }
45
+ ```
46
+
47
+ | Channel | Network |
48
+ |---|---|
49
+ | `mtn-gh` | MTN Ghana |
50
+ | `vodafone-gh` | Telecel Ghana |
51
+ | `tigo-gh` | AirtelTigo |
52
+
53
+ `CustomerMsisdn` in international format (`233...`) and on the network named by `Channel`. `ClientReference` max 36 characters. Response: `ResponseCode` `"0001"` (pending, callback follows), `Data.TransactionId`, `Data.Amount`, `Data.Charges`, `Data.AmountAfterCharges`, `Data.AmountCharged`. The final state usually arrives within about 30 seconds.
54
+
55
+ Receive Money callback source IP to allow-list (optional extra layer, confirm the current value in Hubtel's docs): `18.202.122.131`.
56
+
57
+ ## Transaction Status Check
58
+
59
+ `GET https://api-txnstatus.hubtel.com/transactions/{Collection_Account_Number}/status?clientReference=ord8f2c1aA1`
60
+
61
+ Also accepts `hubtelTransactionId` or `networkTransactionId`; prefer `clientReference`. Response `data`: `status` (`Paid`, `Unpaid`, `Refunded`), `amount`, `charges`, `amountAfterCharges`, `transactionId`, `externalTransactionId`, `paymentMethod`, `clientReference`, `date`.
62
+
63
+ ## Response codes
64
+
65
+ | Code | Meaning | Action |
66
+ |---|---|---|
67
+ | `0000` | Success (in a callback: paid; on checkout initiate: accepted) | Confirm with status check, then fulfil |
68
+ | `0001` | Accepted, pending | Wait for callback; status-check after 5 minutes |
69
+ | `0005` | HTTP failure reaching the payment partner; state unknown | Don't retry with a new reference; contact Hubtel to confirm |
70
+ | `2001` | Customer or telco failure (insufficient funds, wrong PIN, USSD timeout, number not on channel, special characters in description) | Mark failed; let the customer retry with a new reference |
71
+ | `4000` | Validation error | Fix the request |
72
+ | `4070` | Fees not set or amount below minimum | Contact Hubtel account manager |
73
+
74
+ ## SMS
75
+
76
+ `POST https://sms.hubtel.com/v1/messages/send` with `{ "From": "MyBrand", "To": "233241234567", "Content": "Your order 8F2C1A is paid." }`. `From` is the sender ID, max 11 characters. Batch: `POST /v1/messages/batch/simple/send` (`Recipients` array) or `/v1/messages/batch/personalized/send`. Status: `GET /v1/messages/{messageId}` or `/v1/messages/batch/{batchId}`; statuses include `Delivered`, `Sent`, `Pending`, `Blacklisted`, `Undeliverable`, `Rejected`. A `GET` send variant takes `clientid` and `clientsecret` in the query string; avoid it, because URLs end up in logs.
77
+
78
+ ## Status check client (TypeScript)
79
+
80
+ ```ts
81
+ const auth = 'Basic ' + Buffer.from(`${process.env.HUBTEL_API_ID}:${process.env.HUBTEL_API_KEY}`).toString('base64');
82
+
83
+ export async function hubtelIsPaid(clientReference: string, expectedPesewas: number) {
84
+ const acct = process.env.HUBTEL_COLLECTION_ACCOUNT!;
85
+ const url = `https://api-txnstatus.hubtel.com/transactions/${acct}/status?clientReference=${encodeURIComponent(clientReference)}`;
86
+ const res = await fetch(url, { headers: { Authorization: auth } });
87
+ if (res.status === 403) throw new Error('Hubtel 403: server IP is not whitelisted');
88
+ if (!res.ok) throw new Error(`Hubtel status check failed: ${res.status}`);
89
+ const { data } = await res.json();
90
+ return data?.status === 'Paid' && Math.round(Number(data.amount) * 100) === expectedPesewas;
91
+ }
92
+ ```
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: i18n-localization
3
+ description: Internationalises an application so it can ship in more languages and regions, by moving user-facing text into message catalogs, writing ICU MessageFormat messages with plural and select rules, formatting dates, numbers, currency and lists through locale-aware APIs, making layouts work right-to-left, testing with pseudo-localisation, and keeping translation keys in sync across locales. Use when adding a second language or locale to an app, setting up i18next, react-intl, vue-i18n, gettext, Android or iOS string resources, fixing plurals or currency that read wrong in one language, or adding Arabic or Hebrew support.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Examples use JavaScript Intl and ICU MessageFormat; the rules apply to any i18n library or platform.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: coding
9
+ kete-loom/risk: writes-files
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ # i18n and localisation
14
+
15
+ Make the app translatable once, correctly, so each new locale is a translation job and not a code change. For library-specific syntax and setup, read `references/libraries.md`.
16
+
17
+ ## 0. Before you start
18
+
19
+ 1. Find what the project already uses: search for `i18next`, `react-intl`/`@formatjs`, `vue-i18n`, `next-intl`, `gettext`/`.po` files, `res/values*/strings.xml`, `Localizable.strings`/`.xcstrings`, Rails `config/locales`, or a hand-rolled `t()` helper. **Use the existing system.** Never add a second one.
20
+ 2. If there is none, recommend one that fits the stack (see `references/libraries.md`) and **stop and ask the user** before adding a dependency.
21
+ 3. Ask, if not stated: target locales, the source locale, who translates (people, a translation platform, machine translation with review), and whether locale comes from the URL, user profile or `Accept-Language`.
22
+
23
+ ## 1. Externalise strings
24
+
25
+ - Every user-visible string goes into the catalog: labels, buttons, errors, empty states, emails, push notifications, `alt`, `title`, `aria-label`, `placeholder`, page titles, and validation messages from the server.
26
+ - Not translated: log messages, identifiers, CSS class names, enum values stored in the database, analytics event names.
27
+ - Key names describe meaning and place, not the English text: `checkout.summary.total`, not `total_colon`. Don't reuse one key for two contexts that look the same in English ("Open" as verb and as status).
28
+ - Add a translator description to any key whose meaning isn't obvious from its text, including what each placeholder holds.
29
+ - Server-side errors return a code plus parameters; the client turns the code into a message. Don't send English sentences over an API for display.
30
+
31
+ ## 2. Write whole messages, never concatenations
32
+
33
+ - Never build a sentence from pieces: `t('hello') + ' ' + name + '!'` and `"You have " + n + " items"` break in languages with different word order. Use one message with named placeholders: `Hello, {name}!`.
34
+ - Don't put formatted values together with `+` either; pass raw values as arguments and let the message format them.
35
+ - Markup inside a sentence (a link, bold text) stays inside the message as a tag the library supports (`<link>terms</link>` in react-intl, `<0>…</0>` in react-i18next `Trans`), so translators can move it.
36
+ - Gender or variant wording uses `select`: `{gender, select, female {She replied} male {He replied} other {They replied}}`.
37
+
38
+ ## 3. Plurals
39
+
40
+ - Use the library's plural support; never `n === 1 ? 'item' : 'items'`. Languages use up to six CLDR plural categories: `zero`, `one`, `two`, `few`, `many`, `other`. English uses `one` and `other`; Arabic uses all six; Japanese uses only `other`.
41
+ - ICU form: `{count, plural, =0 {No messages} one {# message} other {# messages}}`. `#` is the locale-formatted number. `other` is required.
42
+ - `=0` is an exact-match override, not a category. `one` is not "exactly 1" in every language (for example, in Russian `one` also covers 21, 31...), so never use `one` to mean "singular" in logic.
43
+ - Ordinals ("1st", "2nd") use `selectordinal`, or `Intl.PluralRules(locale, { type: 'ordinal' })`.
44
+ - When a translator adds a category your source lacks (Polish `few`, `many`), the catalog must accept it. Check that your extraction and validation tooling does not strip unknown categories.
45
+
46
+ ## 4. Locale-aware formatting
47
+
48
+ Use platform formatting with the active locale; never hand-format. In JavaScript:
49
+
50
+ | Value | API |
51
+ |---|---|
52
+ | Number, percent | `new Intl.NumberFormat(locale).format(n)`, `{ style: 'percent' }` |
53
+ | Currency | `new Intl.NumberFormat(locale, { style: 'currency', currency: 'EUR' })` |
54
+ | Date and time | `new Intl.DateTimeFormat(locale, { dateStyle: 'medium', timeStyle: 'short', timeZone })` |
55
+ | "3 days ago" | `new Intl.RelativeTimeFormat(locale, { numeric: 'auto' })` |
56
+ | "A, B and C" | `new Intl.ListFormat(locale, { type: 'conjunction' })` |
57
+ | Sorting | `new Intl.Collator(locale).compare` (never default `Array.prototype.sort` on display text) |
58
+ | Plural category | `new Intl.PluralRules(locale).select(n)` |
59
+
60
+ Rules:
61
+
62
+ - **Currency is data, not locale.** Store amount and ISO 4217 code together; the locale only decides how it's displayed. Never derive the currency from the user's language.
63
+ - Store timestamps in UTC; format in the user's time zone. Date-only values (birthdays) must not be shifted by time zone.
64
+ - Don't parse user-typed numbers with `parseFloat`: `1.234,5` is valid German. Use a locale-aware input or a single agreed format.
65
+ - Hard-coded patterns like `MM/DD/YYYY`, `toFixed(2)` for display, and `'$' + amount` are bugs.
66
+ - Cache formatter instances; constructing `Intl.*` objects in a hot render loop is slow.
67
+
68
+ ## 5. Right-to-left (Arabic, Hebrew, Persian, Urdu)
69
+
70
+ 1. Set `lang` and `dir="rtl"` on `<html>` from the active locale (or `android:supportsRtl="true"` on Android; iOS mirrors automatically with leading/trailing constraints).
71
+ 2. Replace physical CSS with logical properties: `margin-inline-start` not `margin-left`, `padding-inline-end`, `inset-inline-start`, `border-inline-start`, `text-align: start`. In Tailwind use `ms-*`, `me-*`, `ps-*`, `pe-*`, `rtl:`/`ltr:` variants, and for insets `start-*`/`end-*` (v3.3 to v4.1) or `inset-s-*`/`inset-e-*` (v4.2+, where `start-*`/`end-*` are deprecated).
72
+ 3. Mirror direction-bearing icons (back/forward arrows, chevrons, progress) but not logos, media playback controls, clocks or checkmarks.
73
+ 4. User-generated or mixed-direction text: use `dir="auto"` on the element, or `<bdi>` around an interpolated name, so a Latin username doesn't scramble an Arabic sentence.
74
+ 5. Numbers, phone numbers and code stay left-to-right inside RTL text.
75
+ 6. Check flex `row` order, absolutely positioned elements, transforms (`translateX`), and canvas or SVG drawing, which logical properties don't flip.
76
+
77
+ ## 6. Pseudo-localisation
78
+
79
+ Run the UI in a pseudo-locale before real translations exist. It exposes hard-coded strings (unchanged English), truncation (translations into German or Finnish often run a third longer than English, and short labels can double), concatenation and encoding bugs.
80
+
81
+ - Generate an accented, padded locale: `Settings` → `[Šéţţîñĝš one two]`. FormatJS: `formatjs compile --ast --pseudo-locale en-XA` (also `en-XB`, `xx-LS`, `xx-AC`, `xx-HA`); Android: `pseudoLocalesEnabled true` in the build type gives `en-XA` and `ar-XB`.
82
+ - Add a bidi pseudo-locale (or `ar-XB`) to test RTL with readable text.
83
+ - Walk every changed screen at mobile width. Anything still plain English is a missed string.
84
+
85
+ ## 7. Translation workflow and keeping keys in sync
86
+
87
+ 1. The source locale is the only catalog developers edit by hand. Other locales come from translators or the translation platform.
88
+ 2. Extract keys from code with the library's extractor (`formatjs extract`, `i18next-cli` (the replacement for the deprecated `i18next-parser`), `xgettext`, Xcode string catalog sync) instead of maintaining them by hand.
89
+ 3. Add a check to CI that fails when:
90
+ - a key used in code is missing from the source catalog;
91
+ - a key exists in a locale catalog but not in the source (orphaned);
92
+ - a translation's placeholders differ from the source (`{name}` renamed or dropped);
93
+ - a message fails ICU syntax parsing.
94
+ 4. Missing translations fall back through a defined chain (`pt-BR` → `pt` → source locale) at runtime and are reported, never shown as raw keys.
95
+ 5. When English text changes meaning, change the key (or mark translations as needing review), so stale translations don't ship silently.
96
+ 6. Never machine-translate straight into production catalogs for legal, medical, financial or safety text; a fluent human reviewer must approve those.
97
+
98
+ ## Never
99
+
100
+ - Never concatenate translated fragments or format values with string operations.
101
+ - Never detect language from IP address or country alone; let users choose and remember their choice.
102
+ - Never use flags to represent languages.
103
+ - Never put translatable text in images, or truncate text with fixed-width containers.
104
+ - Never lowercase or uppercase translated strings in code without the locale (`toLocaleUpperCase(locale)`: Turkish dotted i).
105
+
106
+ ## Report back
107
+
108
+ End with:
109
+
110
+ - **Strings externalised:** count and files touched.
111
+ - **Formatting changed:** which values moved to locale-aware APIs.
112
+ - **RTL:** done, partial or not in scope, and what was checked.
113
+ - **Sync check:** the command added or run and its result.
114
+ - **Open items:** strings not externalised, locales without translations, anything needing a translator or reviewer.
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "We need to launch our React dashboard in French and German, set up translations for it",
4
+ "Our plural messages say '1 items' and break in Polish, fix the pluralisation with ICU",
5
+ "Add Arabic support to the web app including right-to-left layout",
6
+ "Prices show as $ even for EUR customers, make currency and date formatting locale-aware",
7
+ "Set up pseudo-localisation and a CI check that our translation JSON files stay in sync with the source keys"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Review this pull request for hard-coded strings and broken plurals before it merges",
11
+ "Audit the signup form for WCAG keyboard and screen reader problems",
12
+ "Write the README for our CLI tool in plain English",
13
+ "Rewrite our marketing copy so it sounds consistent with our brand voice",
14
+ "Convert all timestamps in the orders table from local time to UTC in a database migration"
15
+ ]
16
+ }