@ketecode/loom 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (656) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +516 -2
  3. package/agents/accessibility-reviewer/AGENT.md +70 -0
  4. package/agents/accessibility-reviewer/evals/triggers.json +15 -0
  5. package/agents/agent-evaluator/AGENT.md +74 -0
  6. package/agents/agent-evaluator/evals/triggers.json +15 -0
  7. package/agents/architect/AGENT.md +82 -0
  8. package/agents/architect/evals/triggers.json +17 -0
  9. package/agents/billing-reviewer/AGENT.md +68 -0
  10. package/agents/billing-reviewer/evals/triggers.json +16 -0
  11. package/agents/code-reviewer/AGENT.md +51 -0
  12. package/agents/code-reviewer/evals/triggers.json +14 -0
  13. package/agents/code-simplifier/AGENT.md +74 -0
  14. package/agents/code-simplifier/evals/triggers.json +15 -0
  15. package/agents/cpp-build-resolver/AGENT.md +73 -0
  16. package/agents/cpp-build-resolver/evals/triggers.json +16 -0
  17. package/agents/cpp-reviewer/AGENT.md +59 -0
  18. package/agents/cpp-reviewer/evals/triggers.json +16 -0
  19. package/agents/csharp-build-resolver/AGENT.md +84 -0
  20. package/agents/csharp-build-resolver/evals/triggers.json +17 -0
  21. package/agents/csharp-reviewer/AGENT.md +88 -0
  22. package/agents/csharp-reviewer/evals/triggers.json +17 -0
  23. package/agents/dart-build-resolver/AGENT.md +80 -0
  24. package/agents/dart-build-resolver/evals/triggers.json +17 -0
  25. package/agents/dart-reviewer/AGENT.md +66 -0
  26. package/agents/dart-reviewer/evals/triggers.json +17 -0
  27. package/agents/database-reviewer/AGENT.md +72 -0
  28. package/agents/database-reviewer/evals/triggers.json +16 -0
  29. package/agents/django-reviewer/AGENT.md +61 -0
  30. package/agents/django-reviewer/evals/triggers.json +15 -0
  31. package/agents/doc-updater/AGENT.md +92 -0
  32. package/agents/doc-updater/evals/triggers.json +14 -0
  33. package/agents/e2e-runner/AGENT.md +88 -0
  34. package/agents/e2e-runner/evals/triggers.json +16 -0
  35. package/agents/fastapi-reviewer/AGENT.md +63 -0
  36. package/agents/fastapi-reviewer/evals/triggers.json +15 -0
  37. package/agents/flutter-reviewer/AGENT.md +70 -0
  38. package/agents/flutter-reviewer/evals/triggers.json +15 -0
  39. package/agents/fsharp-build-resolver/AGENT.md +81 -0
  40. package/agents/fsharp-build-resolver/evals/triggers.json +15 -0
  41. package/agents/fsharp-reviewer/AGENT.md +77 -0
  42. package/agents/fsharp-reviewer/evals/triggers.json +15 -0
  43. package/agents/go-build-resolver/AGENT.md +85 -0
  44. package/agents/go-build-resolver/evals/triggers.json +16 -0
  45. package/agents/go-reviewer/AGENT.md +66 -0
  46. package/agents/go-reviewer/evals/triggers.json +16 -0
  47. package/agents/healthcare-reviewer/AGENT.md +65 -0
  48. package/agents/healthcare-reviewer/evals/triggers.json +16 -0
  49. package/agents/i18n-reviewer/AGENT.md +64 -0
  50. package/agents/i18n-reviewer/evals/triggers.json +16 -0
  51. package/agents/infra-reviewer/AGENT.md +93 -0
  52. package/agents/infra-reviewer/evals/triggers.json +15 -0
  53. package/agents/java-build-resolver/AGENT.md +82 -0
  54. package/agents/java-build-resolver/evals/triggers.json +16 -0
  55. package/agents/java-reviewer/AGENT.md +64 -0
  56. package/agents/java-reviewer/evals/triggers.json +16 -0
  57. package/agents/kotlin-build-resolver/AGENT.md +89 -0
  58. package/agents/kotlin-build-resolver/evals/triggers.json +16 -0
  59. package/agents/kotlin-reviewer/AGENT.md +75 -0
  60. package/agents/kotlin-reviewer/evals/triggers.json +16 -0
  61. package/agents/mle-reviewer/AGENT.md +68 -0
  62. package/agents/mle-reviewer/evals/triggers.json +16 -0
  63. package/agents/network-config-reviewer/AGENT.md +68 -0
  64. package/agents/network-config-reviewer/evals/triggers.json +17 -0
  65. package/agents/payments-reviewer/AGENT.md +64 -0
  66. package/agents/payments-reviewer/evals/triggers.json +16 -0
  67. package/agents/performance-optimizer/AGENT.md +86 -0
  68. package/agents/performance-optimizer/evals/triggers.json +16 -0
  69. package/agents/perl-build-resolver/AGENT.md +84 -0
  70. package/agents/perl-build-resolver/evals/triggers.json +15 -0
  71. package/agents/perl-reviewer/AGENT.md +77 -0
  72. package/agents/perl-reviewer/evals/triggers.json +15 -0
  73. package/agents/php-build-resolver/AGENT.md +88 -0
  74. package/agents/php-build-resolver/evals/triggers.json +16 -0
  75. package/agents/php-reviewer/AGENT.md +61 -0
  76. package/agents/php-reviewer/evals/triggers.json +15 -0
  77. package/agents/planner/AGENT.md +75 -0
  78. package/agents/planner/evals/triggers.json +17 -0
  79. package/agents/pr-test-analyzer/AGENT.md +82 -0
  80. package/agents/pr-test-analyzer/evals/triggers.json +16 -0
  81. package/agents/python-build-resolver/AGENT.md +87 -0
  82. package/agents/python-build-resolver/evals/triggers.json +16 -0
  83. package/agents/python-reviewer/AGENT.md +63 -0
  84. package/agents/python-reviewer/evals/triggers.json +15 -0
  85. package/agents/rag-reviewer/AGENT.md +71 -0
  86. package/agents/rag-reviewer/evals/triggers.json +16 -0
  87. package/agents/react-reviewer/AGENT.md +70 -0
  88. package/agents/react-reviewer/evals/triggers.json +16 -0
  89. package/agents/refactor-cleaner/AGENT.md +82 -0
  90. package/agents/refactor-cleaner/evals/triggers.json +16 -0
  91. package/agents/ruby-build-resolver/AGENT.md +93 -0
  92. package/agents/ruby-build-resolver/evals/triggers.json +16 -0
  93. package/agents/ruby-reviewer/AGENT.md +62 -0
  94. package/agents/ruby-reviewer/evals/triggers.json +16 -0
  95. package/agents/rust-build-resolver/AGENT.md +98 -0
  96. package/agents/rust-build-resolver/evals/triggers.json +16 -0
  97. package/agents/rust-reviewer/AGENT.md +78 -0
  98. package/agents/rust-reviewer/evals/triggers.json +15 -0
  99. package/agents/security-reviewer/AGENT.md +84 -0
  100. package/agents/security-reviewer/evals/triggers.json +16 -0
  101. package/agents/silent-failure-hunter/AGENT.md +66 -0
  102. package/agents/silent-failure-hunter/evals/triggers.json +16 -0
  103. package/agents/solidity-reviewer/AGENT.md +70 -0
  104. package/agents/solidity-reviewer/evals/triggers.json +16 -0
  105. package/agents/swift-build-resolver/AGENT.md +85 -0
  106. package/agents/swift-build-resolver/evals/triggers.json +15 -0
  107. package/agents/swift-reviewer/AGENT.md +75 -0
  108. package/agents/swift-reviewer/evals/triggers.json +15 -0
  109. package/agents/typescript-build-resolver/AGENT.md +76 -0
  110. package/agents/typescript-build-resolver/evals/triggers.json +15 -0
  111. package/agents/typescript-reviewer/AGENT.md +76 -0
  112. package/agents/typescript-reviewer/evals/triggers.json +15 -0
  113. package/agents/vue-reviewer/AGENT.md +75 -0
  114. package/agents/vue-reviewer/evals/triggers.json +15 -0
  115. package/bin/kete-loom.js +683 -0
  116. package/commands/aside.md +19 -0
  117. package/commands/build-fix.md +26 -0
  118. package/commands/campaign.md +19 -0
  119. package/commands/changelog.md +36 -0
  120. package/commands/checkpoint.md +26 -0
  121. package/commands/codemap.md +25 -0
  122. package/commands/commit.md +26 -0
  123. package/commands/deps-audit.md +32 -0
  124. package/commands/epic-decompose.md +21 -0
  125. package/commands/explain.md +37 -0
  126. package/commands/feature-dev.md +22 -0
  127. package/commands/hookify.md +23 -0
  128. package/commands/i18n-check.md +39 -0
  129. package/commands/issue-sync.md +22 -0
  130. package/commands/jira.md +19 -0
  131. package/commands/learn.md +23 -0
  132. package/commands/loom.md +21 -0
  133. package/commands/loop.md +20 -0
  134. package/commands/model-route.md +27 -0
  135. package/commands/onboard.md +35 -0
  136. package/commands/orchestrate.md +21 -0
  137. package/commands/plan-feature.md +36 -0
  138. package/commands/postmortem.md +42 -0
  139. package/commands/pr-describe.md +39 -0
  140. package/commands/pr.md +22 -0
  141. package/commands/prd.md +41 -0
  142. package/commands/project-init.md +21 -0
  143. package/commands/refactor-clean.md +24 -0
  144. package/commands/resume-session.md +22 -0
  145. package/commands/review.md +35 -0
  146. package/commands/save-session.md +37 -0
  147. package/commands/security-scan.md +32 -0
  148. package/commands/sessions.md +21 -0
  149. package/commands/skill-create.md +21 -0
  150. package/commands/tdd.md +36 -0
  151. package/commands/test-coverage.md +24 -0
  152. package/commands/threat-model.md +36 -0
  153. package/commands/update-docs.md +25 -0
  154. package/commands/verify.md +21 -0
  155. package/hooks/block-dangerous-commands/HOOK.md +30 -0
  156. package/hooks/block-dangerous-commands/cases.json +50 -0
  157. package/hooks/block-dangerous-commands/hook.js +75 -0
  158. package/hooks/block-no-verify/HOOK.md +25 -0
  159. package/hooks/block-no-verify/cases.json +30 -0
  160. package/hooks/block-no-verify/hook.js +43 -0
  161. package/hooks/format-on-edit/HOOK.md +24 -0
  162. package/hooks/format-on-edit/hook.js +89 -0
  163. package/hooks/guard-secrets/HOOK.md +19 -0
  164. package/hooks/guard-secrets/cases.json +110 -0
  165. package/hooks/guard-secrets/hook.js +44 -0
  166. package/hooks/load-session-context/HOOK.md +20 -0
  167. package/hooks/load-session-context/hook.js +56 -0
  168. package/hooks/protect-files/HOOK.md +24 -0
  169. package/hooks/protect-files/cases.json +27 -0
  170. package/hooks/protect-files/hook.js +39 -0
  171. package/hooks/run.js +132 -0
  172. package/mcp/atlassian.json +11 -0
  173. package/mcp/chrome-devtools.json +18 -0
  174. package/mcp/cloudflare.json +11 -0
  175. package/mcp/context7.json +11 -0
  176. package/mcp/fetch.json +17 -0
  177. package/mcp/figma.json +11 -0
  178. package/mcp/git.json +17 -0
  179. package/mcp/github.json +11 -0
  180. package/mcp/linear.json +11 -0
  181. package/mcp/memory.json +18 -0
  182. package/mcp/notion.json +11 -0
  183. package/mcp/playwright.json +18 -0
  184. package/mcp/sentry.json +11 -0
  185. package/mcp/stripe.json +11 -0
  186. package/mcp/supabase.json +11 -0
  187. package/mcp/time.json +17 -0
  188. package/package.json +59 -4
  189. package/profiles.json +165 -0
  190. package/rules/common.md +21 -0
  191. package/rules/cpp.md +29 -0
  192. package/rules/csharp.md +25 -0
  193. package/rules/dart.md +29 -0
  194. package/rules/fsharp.md +28 -0
  195. package/rules/git.md +26 -0
  196. package/rules/go.md +29 -0
  197. package/rules/java.md +29 -0
  198. package/rules/kotlin.md +27 -0
  199. package/rules/perl.md +26 -0
  200. package/rules/php.md +28 -0
  201. package/rules/python.md +30 -0
  202. package/rules/ruby.md +27 -0
  203. package/rules/rust.md +26 -0
  204. package/rules/security.md +29 -0
  205. package/rules/swift.md +28 -0
  206. package/rules/testing.md +25 -0
  207. package/rules/typescript.md +29 -0
  208. package/schemas/skill-frontmatter.schema.json +52 -0
  209. package/scripts/lib/audit.js +96 -0
  210. package/scripts/lib/frontmatter.js +65 -0
  211. package/scripts/lib/hooks-install.js +292 -0
  212. package/scripts/lib/i18n.js +51 -0
  213. package/scripts/lib/inventory.js +85 -0
  214. package/scripts/lib/lint.js +158 -0
  215. package/scripts/lib/mcp-install.js +284 -0
  216. package/scripts/lib/profiles.js +128 -0
  217. package/scripts/lib/render.js +86 -0
  218. package/scripts/lib/rules-install.js +118 -0
  219. package/scripts/lib/skills.js +86 -0
  220. package/scripts/lib/targets.js +113 -0
  221. package/skills/accounting-api-integration/SKILL.md +81 -0
  222. package/skills/accounting-api-integration/evals/triggers.json +17 -0
  223. package/skills/accounting-api-integration/references/quickbooks.md +48 -0
  224. package/skills/accounting-api-integration/references/xero.md +45 -0
  225. package/skills/agent-harness-design/SKILL.md +125 -0
  226. package/skills/agent-harness-design/evals/triggers.json +21 -0
  227. package/skills/ai-media-generation/SKILL.md +89 -0
  228. package/skills/ai-media-generation/evals/triggers.json +16 -0
  229. package/skills/ai-media-generation/references/job-pipeline.md +76 -0
  230. package/skills/angular-patterns/SKILL.md +122 -0
  231. package/skills/angular-patterns/evals/triggers.json +16 -0
  232. package/skills/api-design/SKILL.md +96 -0
  233. package/skills/api-design/evals/triggers.json +18 -0
  234. package/skills/api-design/references/conventions.md +133 -0
  235. package/skills/architecture-decision-records/SKILL.md +98 -0
  236. package/skills/architecture-decision-records/evals/triggers.json +17 -0
  237. package/skills/article-writing/SKILL.md +108 -0
  238. package/skills/article-writing/evals/triggers.json +16 -0
  239. package/skills/aspnet-core-patterns/SKILL.md +149 -0
  240. package/skills/aspnet-core-patterns/evals/triggers.json +16 -0
  241. package/skills/auth-patterns/SKILL.md +104 -0
  242. package/skills/auth-patterns/evals/triggers.json +17 -0
  243. package/skills/auth-patterns/references/oauth-oidc.md +64 -0
  244. package/skills/autonomous-loops/SKILL.md +99 -0
  245. package/skills/autonomous-loops/evals/triggers.json +14 -0
  246. package/skills/aws-patterns/SKILL.md +91 -0
  247. package/skills/aws-patterns/evals/triggers.json +16 -0
  248. package/skills/azure-patterns/SKILL.md +86 -0
  249. package/skills/azure-patterns/evals/triggers.json +16 -0
  250. package/skills/benchmark-methodology/SKILL.md +88 -0
  251. package/skills/benchmark-methodology/evals/triggers.json +16 -0
  252. package/skills/benchmark-methodology/references/language-harnesses.md +130 -0
  253. package/skills/bgp-diagnostics/SKILL.md +84 -0
  254. package/skills/bgp-diagnostics/evals/triggers.json +18 -0
  255. package/skills/bgp-diagnostics/references/bgp-reference.md +81 -0
  256. package/skills/bioinformatics-workflows/SKILL.md +108 -0
  257. package/skills/bioinformatics-workflows/evals/triggers.json +16 -0
  258. package/skills/bioinformatics-workflows/references/commands.md +71 -0
  259. package/skills/bioinformatics-workflows/references/formats.md +24 -0
  260. package/skills/bioinformatics-workflows/references/workflow-managers.md +107 -0
  261. package/skills/brand-voice/SKILL.md +112 -0
  262. package/skills/brand-voice/evals/triggers.json +16 -0
  263. package/skills/browser-qa/SKILL.md +99 -0
  264. package/skills/browser-qa/evals/triggers.json +16 -0
  265. package/skills/bun-runtime/SKILL.md +93 -0
  266. package/skills/bun-runtime/evals/triggers.json +16 -0
  267. package/skills/cisco-ios-config/SKILL.md +101 -0
  268. package/skills/cisco-ios-config/evals/triggers.json +18 -0
  269. package/skills/cisco-ios-config/references/verification.md +63 -0
  270. package/skills/clickhouse-patterns/SKILL.md +101 -0
  271. package/skills/clickhouse-patterns/evals/triggers.json +18 -0
  272. package/skills/clickhouse-patterns/references/engines-and-views.md +138 -0
  273. package/skills/clinical-decision-support/SKILL.md +90 -0
  274. package/skills/clinical-decision-support/evals/triggers.json +16 -0
  275. package/skills/clinical-decision-support/references/cds-hooks.md +76 -0
  276. package/skills/clinical-decision-support/references/regulatory-boundaries.md +37 -0
  277. package/skills/code-tour/SKILL.md +97 -0
  278. package/skills/code-tour/evals/triggers.json +14 -0
  279. package/skills/codebase-onboarding/SKILL.md +112 -0
  280. package/skills/codebase-onboarding/evals/triggers.json +14 -0
  281. package/skills/cold-outreach-sequences/SKILL.md +90 -0
  282. package/skills/cold-outreach-sequences/evals/triggers.json +16 -0
  283. package/skills/content-repurposing/SKILL.md +82 -0
  284. package/skills/content-repurposing/evals/triggers.json +16 -0
  285. package/skills/context-budget/SKILL.md +84 -0
  286. package/skills/context-budget/evals/triggers.json +14 -0
  287. package/skills/conventional-commits/SKILL.md +144 -0
  288. package/skills/conventional-commits/evals/triggers.json +16 -0
  289. package/skills/cpp-patterns/SKILL.md +129 -0
  290. package/skills/cpp-patterns/evals/triggers.json +16 -0
  291. package/skills/cpp-patterns/references/cmake-and-tooling.md +88 -0
  292. package/skills/cpp-patterns/references/undefined-behaviour.md +75 -0
  293. package/skills/cpp-testing/SKILL.md +131 -0
  294. package/skills/cpp-testing/evals/triggers.json +16 -0
  295. package/skills/csharp-patterns/SKILL.md +110 -0
  296. package/skills/csharp-patterns/evals/triggers.json +17 -0
  297. package/skills/csharp-patterns/references/analyzers.md +59 -0
  298. package/skills/csharp-testing/SKILL.md +85 -0
  299. package/skills/csharp-testing/evals/triggers.json +17 -0
  300. package/skills/csharp-testing/references/integration-tests.md +77 -0
  301. package/skills/css-architecture/SKILL.md +143 -0
  302. package/skills/css-architecture/evals/triggers.json +16 -0
  303. package/skills/customs-trade-compliance/SKILL.md +95 -0
  304. package/skills/customs-trade-compliance/evals/triggers.json +16 -0
  305. package/skills/customs-trade-compliance/references/incoterms-2020.md +42 -0
  306. package/skills/dart-patterns/SKILL.md +157 -0
  307. package/skills/dart-patterns/evals/triggers.json +18 -0
  308. package/skills/dart-testing/SKILL.md +164 -0
  309. package/skills/dart-testing/evals/triggers.json +18 -0
  310. package/skills/data-analysis-notebooks/SKILL.md +113 -0
  311. package/skills/data-analysis-notebooks/evals/triggers.json +16 -0
  312. package/skills/data-analysis-notebooks/references/dataframe-pitfalls.md +49 -0
  313. package/skills/data-analysis-notebooks/references/statistics-pitfalls.md +24 -0
  314. package/skills/data-pipelines/SKILL.md +90 -0
  315. package/skills/data-pipelines/evals/triggers.json +16 -0
  316. package/skills/data-pipelines/references/orchestrators.md +64 -0
  317. package/skills/database-migrations/SKILL.md +102 -0
  318. package/skills/database-migrations/evals/triggers.json +16 -0
  319. package/skills/database-migrations/references/recipes.md +98 -0
  320. package/skills/database-migrations/references/tools.md +21 -0
  321. package/skills/dbt-patterns/SKILL.md +96 -0
  322. package/skills/dbt-patterns/evals/triggers.json +16 -0
  323. package/skills/dbt-patterns/references/yaml-examples.md +114 -0
  324. package/skills/deep-research/SKILL.md +107 -0
  325. package/skills/deep-research/evals/triggers.json +14 -0
  326. package/skills/dependency-audit/SKILL.md +103 -0
  327. package/skills/dependency-audit/evals/triggers.json +16 -0
  328. package/skills/dependency-audit/references/tools.md +124 -0
  329. package/skills/deployment-strategies/SKILL.md +108 -0
  330. package/skills/deployment-strategies/evals/triggers.json +16 -0
  331. package/skills/django-patterns/SKILL.md +123 -0
  332. package/skills/django-patterns/evals/triggers.json +16 -0
  333. package/skills/docker-patterns/SKILL.md +132 -0
  334. package/skills/docker-patterns/evals/triggers.json +16 -0
  335. package/skills/docker-patterns/references/dockerfiles.md +105 -0
  336. package/skills/e2e-testing-playwright/SKILL.md +94 -0
  337. package/skills/e2e-testing-playwright/evals/triggers.json +16 -0
  338. package/skills/e2e-testing-playwright/references/config-and-ci.md +129 -0
  339. package/skills/ef-core-patterns/SKILL.md +117 -0
  340. package/skills/ef-core-patterns/evals/triggers.json +16 -0
  341. package/skills/email-deliverability/SKILL.md +99 -0
  342. package/skills/email-deliverability/evals/triggers.json +17 -0
  343. package/skills/email-deliverability/references/dns-records.md +85 -0
  344. package/skills/error-handling-patterns/SKILL.md +112 -0
  345. package/skills/error-handling-patterns/evals/triggers.json +18 -0
  346. package/skills/error-handling-patterns/references/language-idioms.md +49 -0
  347. package/skills/estimation-and-scoping/SKILL.md +97 -0
  348. package/skills/estimation-and-scoping/evals/triggers.json +14 -0
  349. package/skills/evm-dapp-integration/SKILL.md +73 -0
  350. package/skills/evm-dapp-integration/evals/triggers.json +16 -0
  351. package/skills/fastapi-patterns/SKILL.md +127 -0
  352. package/skills/fastapi-patterns/evals/triggers.json +16 -0
  353. package/skills/ffmpeg-media-processing/SKILL.md +94 -0
  354. package/skills/ffmpeg-media-processing/evals/triggers.json +16 -0
  355. package/skills/ffmpeg-media-processing/references/recipes.md +112 -0
  356. package/skills/fhir-integration/SKILL.md +81 -0
  357. package/skills/fhir-integration/evals/triggers.json +16 -0
  358. package/skills/fhir-integration/references/search-and-bundles.md +73 -0
  359. package/skills/fhir-integration/references/smart-on-fhir.md +50 -0
  360. package/skills/flask-patterns/SKILL.md +132 -0
  361. package/skills/flask-patterns/evals/triggers.json +16 -0
  362. package/skills/flutter-patterns/SKILL.md +99 -0
  363. package/skills/flutter-patterns/evals/triggers.json +16 -0
  364. package/skills/flutterwave-integration/SKILL.md +75 -0
  365. package/skills/flutterwave-integration/evals/triggers.json +16 -0
  366. package/skills/flutterwave-integration/references/api.md +73 -0
  367. package/skills/flutterwave-integration/references/webhooks.md +49 -0
  368. package/skills/fsharp-patterns/SKILL.md +133 -0
  369. package/skills/fsharp-patterns/evals/triggers.json +16 -0
  370. package/skills/fsharp-testing/SKILL.md +136 -0
  371. package/skills/fsharp-testing/evals/triggers.json +16 -0
  372. package/skills/gcp-patterns/SKILL.md +86 -0
  373. package/skills/gcp-patterns/evals/triggers.json +16 -0
  374. package/skills/git-workflow/SKILL.md +114 -0
  375. package/skills/git-workflow/evals/triggers.json +16 -0
  376. package/skills/github-actions-ci/SKILL.md +117 -0
  377. package/skills/github-actions-ci/evals/triggers.json +16 -0
  378. package/skills/github-api-automation/SKILL.md +101 -0
  379. package/skills/github-api-automation/evals/triggers.json +17 -0
  380. package/skills/go-patterns/SKILL.md +118 -0
  381. package/skills/go-patterns/evals/triggers.json +17 -0
  382. package/skills/go-patterns/references/concurrency.md +162 -0
  383. package/skills/go-testing/SKILL.md +154 -0
  384. package/skills/go-testing/evals/triggers.json +17 -0
  385. package/skills/hexagonal-architecture/SKILL.md +89 -0
  386. package/skills/hexagonal-architecture/evals/triggers.json +17 -0
  387. package/skills/hipaa-compliance/SKILL.md +91 -0
  388. package/skills/hipaa-compliance/evals/triggers.json +18 -0
  389. package/skills/hipaa-compliance/references/safeguards.md +68 -0
  390. package/skills/hl7v2-integration/SKILL.md +69 -0
  391. package/skills/hl7v2-integration/evals/triggers.json +16 -0
  392. package/skills/hl7v2-integration/references/messages-and-ack.md +78 -0
  393. package/skills/homelab-network-setup/SKILL.md +125 -0
  394. package/skills/homelab-network-setup/evals/triggers.json +18 -0
  395. package/skills/homelab-network-setup/references/firewall-and-dns.md +45 -0
  396. package/skills/homelab-network-setup/references/wireguard.md +72 -0
  397. package/skills/hubtel-integration/SKILL.md +77 -0
  398. package/skills/hubtel-integration/evals/triggers.json +16 -0
  399. package/skills/hubtel-integration/references/api.md +92 -0
  400. package/skills/i18n-localization/SKILL.md +114 -0
  401. package/skills/i18n-localization/evals/triggers.json +16 -0
  402. package/skills/i18n-localization/references/libraries.md +52 -0
  403. package/skills/incident-postmortem/SKILL.md +118 -0
  404. package/skills/incident-postmortem/evals/triggers.json +14 -0
  405. package/skills/inventory-demand-planning/SKILL.md +89 -0
  406. package/skills/inventory-demand-planning/evals/triggers.json +16 -0
  407. package/skills/inventory-demand-planning/references/formulas.md +62 -0
  408. package/skills/investor-materials/SKILL.md +127 -0
  409. package/skills/investor-materials/evals/triggers.json +16 -0
  410. package/skills/investor-materials/references/templates.md +74 -0
  411. package/skills/invoicing-and-tax/SKILL.md +84 -0
  412. package/skills/invoicing-and-tax/evals/triggers.json +17 -0
  413. package/skills/invoicing-and-tax/references/e-invoicing.md +24 -0
  414. package/skills/invoicing-and-tax/references/invoice-fields.md +38 -0
  415. package/skills/invoicing-and-tax/references/rounding.md +26 -0
  416. package/skills/java-patterns/SKILL.md +141 -0
  417. package/skills/java-patterns/evals/triggers.json +17 -0
  418. package/skills/java-testing/SKILL.md +142 -0
  419. package/skills/java-testing/evals/triggers.json +16 -0
  420. package/skills/jetpack-compose-patterns/SKILL.md +88 -0
  421. package/skills/jetpack-compose-patterns/evals/triggers.json +16 -0
  422. package/skills/jira-integration/SKILL.md +92 -0
  423. package/skills/jira-integration/evals/triggers.json +17 -0
  424. package/skills/jpa-hibernate/SKILL.md +92 -0
  425. package/skills/jpa-hibernate/evals/triggers.json +18 -0
  426. package/skills/jpa-hibernate/references/mapping.md +99 -0
  427. package/skills/kotlin-multiplatform/SKILL.md +97 -0
  428. package/skills/kotlin-multiplatform/evals/triggers.json +16 -0
  429. package/skills/kotlin-patterns/SKILL.md +128 -0
  430. package/skills/kotlin-patterns/evals/triggers.json +16 -0
  431. package/skills/kotlin-testing/SKILL.md +117 -0
  432. package/skills/kotlin-testing/evals/triggers.json +16 -0
  433. package/skills/ktor-patterns/SKILL.md +135 -0
  434. package/skills/ktor-patterns/evals/triggers.json +18 -0
  435. package/skills/kubernetes-patterns/SKILL.md +106 -0
  436. package/skills/kubernetes-patterns/evals/triggers.json +16 -0
  437. package/skills/kubernetes-patterns/references/manifests.md +115 -0
  438. package/skills/laravel-patterns/SKILL.md +136 -0
  439. package/skills/laravel-patterns/evals/triggers.json +16 -0
  440. package/skills/linear-integration/SKILL.md +98 -0
  441. package/skills/linear-integration/evals/triggers.json +17 -0
  442. package/skills/literature-review/SKILL.md +109 -0
  443. package/skills/literature-review/evals/triggers.json +16 -0
  444. package/skills/literature-review/references/appraisal.md +41 -0
  445. package/skills/literature-review/references/search-sources.md +39 -0
  446. package/skills/llm-app-patterns/SKILL.md +97 -0
  447. package/skills/llm-app-patterns/evals/triggers.json +17 -0
  448. package/skills/llm-evals/SKILL.md +98 -0
  449. package/skills/llm-evals/evals/triggers.json +16 -0
  450. package/skills/llm-evals/references/graders.md +66 -0
  451. package/skills/logistics-exception-management/SKILL.md +90 -0
  452. package/skills/logistics-exception-management/evals/triggers.json +16 -0
  453. package/skills/manim-animations/SKILL.md +106 -0
  454. package/skills/manim-animations/evals/triggers.json +16 -0
  455. package/skills/market-research/SKILL.md +117 -0
  456. package/skills/market-research/evals/triggers.json +16 -0
  457. package/skills/marketing-campaign/SKILL.md +111 -0
  458. package/skills/marketing-campaign/evals/triggers.json +16 -0
  459. package/skills/mcp-server-patterns/SKILL.md +127 -0
  460. package/skills/mcp-server-patterns/evals/triggers.json +18 -0
  461. package/skills/mcp-server-patterns/references/protocol-notes.md +68 -0
  462. package/skills/metrics-dashboards/SKILL.md +113 -0
  463. package/skills/metrics-dashboards/evals/triggers.json +16 -0
  464. package/skills/ml-experiment-workflow/SKILL.md +125 -0
  465. package/skills/ml-experiment-workflow/evals/triggers.json +16 -0
  466. package/skills/mongodb-patterns/SKILL.md +115 -0
  467. package/skills/mongodb-patterns/evals/triggers.json +18 -0
  468. package/skills/mongodb-patterns/references/indexes-and-aggregation.md +94 -0
  469. package/skills/mpesa-daraja-integration/SKILL.md +70 -0
  470. package/skills/mpesa-daraja-integration/evals/triggers.json +16 -0
  471. package/skills/mpesa-daraja-integration/references/api.md +103 -0
  472. package/skills/mpesa-daraja-integration/references/callbacks.md +74 -0
  473. package/skills/mtn-momo-integration/SKILL.md +66 -0
  474. package/skills/mtn-momo-integration/evals/triggers.json +16 -0
  475. package/skills/mtn-momo-integration/references/api.md +153 -0
  476. package/skills/mtn-momo-integration/references/callbacks.md +92 -0
  477. package/skills/mtn-momo-integration/references/sandbox-and-go-live.md +51 -0
  478. package/skills/mtn-momo-integration/scripts/sandbox-setup.js +79 -0
  479. package/skills/mysql-patterns/SKILL.md +96 -0
  480. package/skills/mysql-patterns/evals/triggers.json +16 -0
  481. package/skills/mysql-patterns/references/explain.md +34 -0
  482. package/skills/mysql-patterns/references/online-ddl.md +41 -0
  483. package/skills/nestjs-patterns/SKILL.md +114 -0
  484. package/skills/nestjs-patterns/evals/triggers.json +16 -0
  485. package/skills/nestjs-patterns/references/testing.md +68 -0
  486. package/skills/network-automation/SKILL.md +107 -0
  487. package/skills/network-automation/evals/triggers.json +18 -0
  488. package/skills/network-automation/references/tool-snippets.md +153 -0
  489. package/skills/network-troubleshooting/SKILL.md +152 -0
  490. package/skills/network-troubleshooting/evals/triggers.json +18 -0
  491. package/skills/network-troubleshooting/references/commands.md +33 -0
  492. package/skills/nextjs-patterns/SKILL.md +150 -0
  493. package/skills/nextjs-patterns/evals/triggers.json +18 -0
  494. package/skills/nextjs-patterns/references/caching.md +87 -0
  495. package/skills/node-backend-patterns/SKILL.md +103 -0
  496. package/skills/node-backend-patterns/evals/triggers.json +16 -0
  497. package/skills/node-backend-patterns/references/templates.md +122 -0
  498. package/skills/nuxt-patterns/SKILL.md +103 -0
  499. package/skills/nuxt-patterns/evals/triggers.json +16 -0
  500. package/skills/parallel-agent-orchestration/SKILL.md +106 -0
  501. package/skills/parallel-agent-orchestration/evals/triggers.json +14 -0
  502. package/skills/paystack-integration/SKILL.md +59 -0
  503. package/skills/paystack-integration/evals/triggers.json +14 -0
  504. package/skills/paystack-integration/references/api.md +73 -0
  505. package/skills/paystack-integration/references/mobile-money.md +50 -0
  506. package/skills/paystack-integration/references/webhooks.md +80 -0
  507. package/skills/pci-dss-scope/SKILL.md +103 -0
  508. package/skills/pci-dss-scope/evals/triggers.json +18 -0
  509. package/skills/pci-dss-scope/references/saq-and-data.md +36 -0
  510. package/skills/perl-patterns/SKILL.md +135 -0
  511. package/skills/perl-patterns/evals/triggers.json +18 -0
  512. package/skills/perl-testing/SKILL.md +126 -0
  513. package/skills/perl-testing/evals/triggers.json +17 -0
  514. package/skills/php-patterns/SKILL.md +116 -0
  515. package/skills/php-patterns/evals/triggers.json +16 -0
  516. package/skills/php-testing/SKILL.md +123 -0
  517. package/skills/php-testing/evals/triggers.json +16 -0
  518. package/skills/postgres-patterns/SKILL.md +103 -0
  519. package/skills/postgres-patterns/evals/triggers.json +17 -0
  520. package/skills/postgres-patterns/references/explain.md +59 -0
  521. package/skills/postgres-patterns/references/locks.md +53 -0
  522. package/skills/prd-writing/SKILL.md +124 -0
  523. package/skills/prd-writing/evals/triggers.json +15 -0
  524. package/skills/prisma-patterns/SKILL.md +83 -0
  525. package/skills/prisma-patterns/evals/triggers.json +18 -0
  526. package/skills/prisma-patterns/references/prisma-8.md +46 -0
  527. package/skills/prisma-patterns/references/workflow.md +50 -0
  528. package/skills/privacy-compliance/SKILL.md +121 -0
  529. package/skills/privacy-compliance/evals/triggers.json +18 -0
  530. package/skills/privacy-compliance/references/jurisdictions.md +51 -0
  531. package/skills/production-scheduling/SKILL.md +98 -0
  532. package/skills/production-scheduling/evals/triggers.json +16 -0
  533. package/skills/prompt-engineering/SKILL.md +92 -0
  534. package/skills/prompt-engineering/evals/triggers.json +16 -0
  535. package/skills/python-patterns/SKILL.md +107 -0
  536. package/skills/python-patterns/evals/triggers.json +16 -0
  537. package/skills/python-patterns/references/tooling.md +101 -0
  538. package/skills/python-testing/SKILL.md +126 -0
  539. package/skills/python-testing/evals/triggers.json +16 -0
  540. package/skills/python-testing/references/mocking.md +71 -0
  541. package/skills/pytorch-patterns/SKILL.md +139 -0
  542. package/skills/pytorch-patterns/evals/triggers.json +16 -0
  543. package/skills/pytorch-patterns/references/debugging.md +39 -0
  544. package/skills/quarkus-patterns/SKILL.md +93 -0
  545. package/skills/quarkus-patterns/evals/triggers.json +18 -0
  546. package/skills/rag-pipeline-patterns/SKILL.md +117 -0
  547. package/skills/rag-pipeline-patterns/evals/triggers.json +18 -0
  548. package/skills/rag-pipeline-patterns/references/evaluation.md +37 -0
  549. package/skills/rag-pipeline-patterns/references/retrieval-recipes.md +78 -0
  550. package/skills/rails-patterns/SKILL.md +132 -0
  551. package/skills/rails-patterns/evals/triggers.json +16 -0
  552. package/skills/react-native-patterns/SKILL.md +101 -0
  553. package/skills/react-native-patterns/evals/triggers.json +16 -0
  554. package/skills/react-patterns/SKILL.md +140 -0
  555. package/skills/react-patterns/evals/triggers.json +18 -0
  556. package/skills/react-performance/SKILL.md +107 -0
  557. package/skills/react-performance/evals/triggers.json +18 -0
  558. package/skills/redis-patterns/SKILL.md +109 -0
  559. package/skills/redis-patterns/evals/triggers.json +18 -0
  560. package/skills/redis-patterns/references/operations.md +61 -0
  561. package/skills/refactoring-safely/SKILL.md +107 -0
  562. package/skills/refactoring-safely/evals/triggers.json +17 -0
  563. package/skills/release-management/SKILL.md +141 -0
  564. package/skills/release-management/evals/triggers.json +16 -0
  565. package/skills/remotion-video/SKILL.md +91 -0
  566. package/skills/remotion-video/evals/triggers.json +16 -0
  567. package/skills/remotion-video/references/lambda.md +66 -0
  568. package/skills/returns-reverse-logistics/SKILL.md +97 -0
  569. package/skills/returns-reverse-logistics/evals/triggers.json +16 -0
  570. package/skills/ruby-patterns/SKILL.md +127 -0
  571. package/skills/ruby-patterns/evals/triggers.json +18 -0
  572. package/skills/ruby-testing/SKILL.md +113 -0
  573. package/skills/ruby-testing/evals/triggers.json +18 -0
  574. package/skills/runbook-writing/SKILL.md +101 -0
  575. package/skills/runbook-writing/evals/triggers.json +14 -0
  576. package/skills/rust-patterns/SKILL.md +118 -0
  577. package/skills/rust-patterns/evals/triggers.json +16 -0
  578. package/skills/rust-patterns/references/cargo-and-clippy.md +105 -0
  579. package/skills/rust-patterns/references/errors-and-traits.md +97 -0
  580. package/skills/rust-testing/SKILL.md +148 -0
  581. package/skills/rust-testing/evals/triggers.json +16 -0
  582. package/skills/rust-testing/references/fakes-proptest-async.md +113 -0
  583. package/skills/search-first/SKILL.md +73 -0
  584. package/skills/search-first/evals/triggers.json +14 -0
  585. package/skills/security-review/SKILL.md +58 -0
  586. package/skills/security-review/evals/triggers.json +14 -0
  587. package/skills/security-review/references/checklist.md +54 -0
  588. package/skills/security-review/scripts/scan-secrets.js +79 -0
  589. package/skills/seo-audit/SKILL.md +111 -0
  590. package/skills/seo-audit/evals/triggers.json +16 -0
  591. package/skills/seo-audit/references/checks.md +65 -0
  592. package/skills/session-handoff/SKILL.md +101 -0
  593. package/skills/session-handoff/evals/triggers.json +14 -0
  594. package/skills/skill-authoring/SKILL.md +87 -0
  595. package/skills/skill-authoring/evals/triggers.json +14 -0
  596. package/skills/skill-authoring/references/frontmatter.md +40 -0
  597. package/skills/slack-app-integration/SKILL.md +108 -0
  598. package/skills/slack-app-integration/evals/triggers.json +17 -0
  599. package/skills/smart-contract-security/SKILL.md +110 -0
  600. package/skills/smart-contract-security/evals/triggers.json +16 -0
  601. package/skills/smart-contract-security/references/vulnerability-checklist.md +79 -0
  602. package/skills/social-media-publishing/SKILL.md +84 -0
  603. package/skills/social-media-publishing/evals/triggers.json +17 -0
  604. package/skills/social-media-publishing/references/platform-apis.md +116 -0
  605. package/skills/solidity-patterns/SKILL.md +95 -0
  606. package/skills/solidity-patterns/evals/triggers.json +16 -0
  607. package/skills/spring-boot-patterns/SKILL.md +128 -0
  608. package/skills/spring-boot-patterns/evals/triggers.json +18 -0
  609. package/skills/spring-boot-patterns/references/testing.md +72 -0
  610. package/skills/stripe-integration/SKILL.md +69 -0
  611. package/skills/stripe-integration/evals/triggers.json +16 -0
  612. package/skills/stripe-integration/references/api.md +71 -0
  613. package/skills/stripe-integration/references/billing.md +58 -0
  614. package/skills/stripe-integration/references/webhooks.md +76 -0
  615. package/skills/subscription-billing-ops/SKILL.md +118 -0
  616. package/skills/subscription-billing-ops/evals/triggers.json +17 -0
  617. package/skills/subscription-billing-ops/references/proration.md +47 -0
  618. package/skills/subscription-billing-ops/references/revenue-metrics.md +38 -0
  619. package/skills/svelte-patterns/SKILL.md +122 -0
  620. package/skills/svelte-patterns/evals/triggers.json +16 -0
  621. package/skills/swift-patterns/SKILL.md +113 -0
  622. package/skills/swift-patterns/evals/triggers.json +16 -0
  623. package/skills/swift-patterns/references/concurrency-migration.md +40 -0
  624. package/skills/swift-testing/SKILL.md +121 -0
  625. package/skills/swift-testing/evals/triggers.json +16 -0
  626. package/skills/swift-testing/references/swift-testing-cheatsheet.md +81 -0
  627. package/skills/swiftui-patterns/SKILL.md +102 -0
  628. package/skills/swiftui-patterns/evals/triggers.json +16 -0
  629. package/skills/tdd-workflow/SKILL.md +67 -0
  630. package/skills/tdd-workflow/evals/triggers.json +14 -0
  631. package/skills/technical-writing/SKILL.md +95 -0
  632. package/skills/technical-writing/evals/triggers.json +14 -0
  633. package/skills/terraform-patterns/SKILL.md +122 -0
  634. package/skills/terraform-patterns/evals/triggers.json +16 -0
  635. package/skills/terraform-patterns/references/backends.md +67 -0
  636. package/skills/test-coverage-improvement/SKILL.md +107 -0
  637. package/skills/test-coverage-improvement/evals/triggers.json +16 -0
  638. package/skills/threat-modeling/SKILL.md +113 -0
  639. package/skills/threat-modeling/evals/triggers.json +16 -0
  640. package/skills/typescript-patterns/SKILL.md +122 -0
  641. package/skills/typescript-patterns/evals/triggers.json +16 -0
  642. package/skills/typescript-testing/SKILL.md +101 -0
  643. package/skills/typescript-testing/evals/triggers.json +16 -0
  644. package/skills/verification-loop/SKILL.md +70 -0
  645. package/skills/verification-loop/evals/triggers.json +14 -0
  646. package/skills/verification-loop/scripts/detect-checks.js +102 -0
  647. package/skills/vite-patterns/SKILL.md +117 -0
  648. package/skills/vite-patterns/evals/triggers.json +16 -0
  649. package/skills/vue-patterns/SKILL.md +104 -0
  650. package/skills/vue-patterns/evals/triggers.json +16 -0
  651. package/skills/web-accessibility/SKILL.md +119 -0
  652. package/skills/web-accessibility/evals/triggers.json +16 -0
  653. package/skills/web-performance/SKILL.md +107 -0
  654. package/skills/web-performance/evals/triggers.json +16 -0
  655. package/skills/web-scraping/SKILL.md +80 -0
  656. package/skills/web-scraping/evals/triggers.json +16 -0
@@ -0,0 +1,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
+ }
@@ -0,0 +1,52 @@
1
+ # i18n libraries: syntax and setup notes
2
+
3
+ Read the section for the library the project already uses. Check the installed version's docs before relying on a detail here.
4
+
5
+ ## FormatJS / react-intl (ICU MessageFormat)
6
+
7
+ - Messages are ICU: `{count, plural, one {# file} other {# files}}`, `{role, select, admin {...} other {...}}`, `{rank, selectordinal, one {#st} two {#nd} few {#rd} other {#th}}`.
8
+ - Components: `<FormattedMessage id="..." defaultMessage="..." description="..." values={{ name }} />`; hooks: `useIntl().formatMessage(...)`, `formatNumber`, `formatDate`, `formatList`.
9
+ - Rich text: `values={{ link: (chunks) => <a href="/terms">{chunks}</a> }}` with `<link>terms</link>` in the message.
10
+ - Extract: `formatjs extract 'src/**/*.{ts,tsx}' --out-file lang/en.json`. Compile: `formatjs compile lang/fr.json --out-file compiled/fr.json` (add `--ast` for pre-parsed messages; `--ast --pseudo-locale en-XA` for pseudo-localisation).
11
+ - `eslint-plugin-formatjs` can enforce `description`, placeholder use and no literal strings in JSX.
12
+
13
+ ## i18next / react-i18next / next-i18next
14
+
15
+ - Not ICU by default. Interpolation is `{{name}}`. Use `i18next-icu` only if you want ICU syntax.
16
+ - Plurals use key suffixes from `Intl.PluralRules`: `item_one`, `item_other` (plus `_two`, `_few`, `_many` where the language has them). Call `t('item', { count })`; the option must be named `count`. A `_zero` key, if present, is used for 0.
17
+ - Ordinals: `t('place', { count, ordinal: true })` with `place_ordinal_one`, `place_ordinal_two`, `place_ordinal_few`, `place_ordinal_other`.
18
+ - Context (gender etc.): `t('friend', { context: 'female' })` → `friend_female`.
19
+ - Markup: `<Trans i18nKey="terms">Read the <0>terms</0></Trans>`.
20
+ - Extraction: `i18next-cli` (`npx i18next-cli extract`), configured with the project's locales and namespaces. `i18next-parser` is deprecated and unmaintained since September 2025; `npx i18next-cli migrate-config` converts its config.
21
+ - Set `fallbackLng`; enable `saveMissing` or a `missingKeyHandler` in development to report missing keys.
22
+
23
+ ## vue-i18n
24
+
25
+ - `$t('key', { name })`, plurals with `$t('car', n)` and pipe-separated forms `no cars | one car | {n} cars`. `{n}` or `{count}` inserts the number. For languages whose forms don't fit the default order (Russian, Polish), supply a rule function per locale in `createI18n`: `pluralRules` with the Composition API, `pluralizationRules` with the legacy Options API.
26
+ - `$d(date, 'short')` and `$n(amount, 'currency')` with `datetimeFormats` and `numberFormats` per locale.
27
+ - Composition API: `const { t, d, n } = useI18n()`.
28
+
29
+ ## gettext (Python, PHP, C, many others)
30
+
31
+ - `_("Text")`, `ngettext("%(n)d file", "%(n)d files", n)`, `pgettext("context", "Open")` for disambiguation.
32
+ - Extract with `xgettext` (or Babel `pybabel extract`, Django `makemessages`), update with `msgmerge`, compile with `msgfmt`.
33
+ - Plural forms are defined per language in the `.po` header `Plural-Forms:`.
34
+ - Use named placeholders (`%(name)s`) so translators can reorder them.
35
+
36
+ ## Android
37
+
38
+ - `res/values/strings.xml` for the source, `res/values-fr/strings.xml` etc. for others. Plurals: `<plurals name="files"><item quantity="one">%d file</item><item quantity="other">%d files</item></plurals>`, read with `getQuantityString(R.plurals.files, n, n)`.
39
+ - Use positional args (`%1$s`) so translators can reorder.
40
+ - RTL: `android:supportsRtl="true"`, `start`/`end` instead of `left`/`right`.
41
+ - Pseudo-locales: `pseudoLocalesEnabled true` in a debug build type gives `en-XA` (accented) and `ar-XB` (bidi).
42
+
43
+ ## iOS / macOS
44
+
45
+ - String Catalogs (`.xcstrings`, Xcode 15+) or `Localizable.strings` with `.stringsdict` for plurals. SwiftUI `Text("key")` looks up `LocalizedStringKey`; elsewhere `String(localized:)`.
46
+ - Format with `FormatStyle` (`.formatted(.currency(code: "EUR"))`, `Date.FormatStyle`) or `NumberFormatter`/`DateFormatter` with the user's locale.
47
+ - Use leading/trailing constraints for automatic RTL mirroring. Xcode scheme options include pseudo-languages such as double-length and right-to-left.
48
+
49
+ ## Rails
50
+
51
+ - `config/locales/*.yml`, `t('.title')` with lazy lookup, plurals under `one:`/`other:` keys with `count:`. `l(date, format: :short)` and `number_to_currency` with the locale.
52
+ - `i18n-tasks missing` and `i18n-tasks unused` (gem) check sync.
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: incident-postmortem
3
+ description: Blameless post-incident review writing that rebuilds a timestamped timeline from alerts, chat and deploy logs, quantifies customer and business impact, separates the trigger from root causes and contributing factors, records what went well and where the team got lucky, and turns findings into a short list of owned, dated action items with a follow-up review. Use when an outage, data loss, security event or near miss is over and someone needs the postmortem, incident report or retrospective written, reviewed or its action items tracked.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Reads logs, chat exports or git history when the user provides them; git optional.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: docs
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ # Incident postmortem
14
+
15
+ A postmortem explains what happened and changes the system so it does not happen the same way again. It is written after the incident is resolved. If the incident is still live, **stop**: the job is mitigation, not writing. Say so and help with diagnosis or the relevant runbook instead.
16
+
17
+ ## Blameless rules (apply to every sentence)
18
+
19
+ - Describe actions and the information people had at the time, not character. "The deploy ran against prod because the target defaulted to prod" not "Sam deployed to prod by mistake".
20
+ - Use roles ("on-call engineer", "incident commander") instead of names in the narrative. Names belong only in the action-item owner column.
21
+ - Ask "why did this make sense at the time?" Human error is a starting point for analysis, never a root cause.
22
+ - Do not write "should have", "failed to" or "carelessly". Rewrite as a gap in tooling, process, alerting or knowledge.
23
+
24
+ ## 0. Gather inputs
25
+
26
+ 1. Ask for or locate: alert history, the incident channel or chat export, deploy and config change history (`git log` around the window), dashboards or graphs, support tickets, status page updates.
27
+ 2. Confirm severity and who the audience is (engineering only, whole company, customers). A customer-facing summary is a separate, shorter document; offer it, do not mix the two.
28
+ 3. If any input contains customer personal data, secrets or tokens, leave them out of the document and tell the user.
29
+
30
+ ## 1. Summary
31
+
32
+ Three to five sentences anyone in the company can read: what users saw, for how long, the cause in plain words, and whether it is fixed.
33
+
34
+ ## 2. Impact
35
+
36
+ Quantify with sources. Use what you can measure; mark estimates as estimates.
37
+
38
+ - Duration: start of impact, detection, mitigation, full resolution (UTC).
39
+ - Who and how many: users, accounts, regions, requests failed, error rate.
40
+ - Business: orders lost, SLA or SLO budget burned, refunds or credits, data lost or exposed.
41
+ - If data was lost or exposed, or a contract SLA may be breached, flag that legal, security or account teams must review before publishing.
42
+
43
+ ## 3. Timeline
44
+
45
+ UTC timestamps, one event per line, facts only. Include the trigger, first symptom, detection, every key decision, each mitigation attempt (including ones that did not work) and resolution.
46
+
47
+ ```
48
+ 2026-03-04 14:02 UTC Config change merged raising pool size (trigger)
49
+ 14:09 p99 latency on checkout-api rises above 2 s
50
+ 14:21 Alert "checkout 5xx > 2%" pages on-call (detection: 12 min after impact)
51
+ 14:30 Incident declared SEV2, commander assigned
52
+ 14:38 Rollback of config attempted; no effect (pods not restarted)
53
+ 14:51 Pods restarted, error rate back to baseline (mitigated)
54
+ 15:30 Monitoring confirms steady state (resolved)
55
+ ```
56
+
57
+ Compute and state, all measured from the start of impact (first symptom, not the trigger): time to detect, time to mitigate, time to resolve. In the example: 12, 42 and 81 minutes. If the team measures from another point, say which.
58
+
59
+ ## 4. Root causes and contributing factors
60
+
61
+ - Separate the **trigger** (the change or event that set it off) from **root causes** (conditions that let the trigger cause harm) and **contributing factors** (things that made it worse or slower to fix).
62
+ - Work backwards with repeated "why" questions, but follow every branch, not one chain. Most incidents have several causes. Stop a branch when you reach something the team can change.
63
+ - Check each category: change management, testing, alerting and detection, capacity, dependencies, documentation and runbooks, access and tooling, communication.
64
+ - Each cause must be supported by evidence in the timeline. If it is a hypothesis, label it as one and add an action item to confirm it.
65
+
66
+ ## 5. What went well, what went poorly, where we got lucky
67
+
68
+ Short bullets for each. "Lucky" items are real risks that did not bite this time; they usually deserve action items too.
69
+
70
+ ## 6. Action items
71
+
72
+ Each item fixes a cause or contributing factor, and the table must show which.
73
+
74
+ ```
75
+ | # | Action | Type | Addresses | Owner | Due | Ticket |
76
+ |---|--------|------|-----------|-------|-----|--------|
77
+ | 1 | Alert on checkout p99 > 1 s for 5 min | Detect | CF2 | <person> | 2026-03-18 | OPS-412 |
78
+ | 2 | Config changes to pool size trigger rolling restart | Prevent | RC1 | <person> | 2026-03-31 | PLAT-88 |
79
+ ```
80
+
81
+ Rules:
82
+
83
+ - Types: Prevent, Detect, Mitigate, Process. Prefer system changes over "be more careful" or "add a reminder to the wiki".
84
+ - Every item has one named owner, a due date and a ticket. "Team" is not an owner.
85
+ - Keep it short: five to ten items that will actually be done beat thirty that will not. Mark each as must-do or nice-to-have.
86
+ - If an item has no owner, list it under "Unowned" and **ask the user** who takes it.
87
+
88
+ ## 7. Follow-up
89
+
90
+ - Schedule a review date (often two to four weeks out) to check action items are closed.
91
+ - Note whether the runbook used during the incident needs updating; the `runbook-writing` skill covers that.
92
+ - Record where the postmortem is published and who must sign off before it goes wider.
93
+
94
+ ## Output format
95
+
96
+ ```
97
+ # Postmortem: <short title> (<date>, <severity>)
98
+ Status: Draft | In review | Final Authors: <roles or names> Incident commander: <role>
99
+ ## Summary
100
+ ## Impact
101
+ ## Timeline (UTC)
102
+ ## Root causes and contributing factors (RC1.., CF1.., trigger)
103
+ ## What went well / What went poorly / Where we got lucky
104
+ ## Action items (table)
105
+ ## Follow-up (review date, sign-off, related docs)
106
+ ## Appendix (graphs, log excerpts, links)
107
+ ```
108
+
109
+ ## Reviewing a draft postmortem
110
+
111
+ Report problems most serious first: blame language, missing impact numbers, timeline gaps (no detection time), a single "root cause" that is really the trigger or human error, action items without owner, date or link to a cause, and missing follow-up date.
112
+
113
+ ## Never
114
+
115
+ - Never name an individual as the cause.
116
+ - Never invent timestamps, impact numbers or log lines. Leave a `TODO: confirm` where data is missing.
117
+ - Never publish customer data, credentials or internal hostnames in a customer-facing version.
118
+ - Never close the postmortem with action items still unowned.
@@ -0,0 +1,14 @@
1
+ {
2
+ "should_trigger": [
3
+ "Yesterday's checkout outage is resolved. Write the blameless postmortem from this Slack export and the deploy log",
4
+ "Turn our incident channel notes into a timeline with time to detect and time to mitigate, plus root causes",
5
+ "Review this incident report draft, I think it blames the on-call engineer and the action items have no owners",
6
+ "We had a near miss where a migration almost dropped the users table; write it up as a post-incident review"
7
+ ],
8
+ "should_not_trigger": [
9
+ "The API is returning 500s right now, help me figure out what's wrong",
10
+ "Write a runbook for what on-call should do when the disk-full alert fires",
11
+ "Plan a canary rollout with automatic rollback for the new payment service",
12
+ "Write a handoff note so tomorrow's session can continue this refactor"
13
+ ]
14
+ }
@@ -0,0 +1,89 @@
1
+ ---
2
+ name: inventory-demand-planning
3
+ description: Inventory and demand planning for stocked SKUs, from cleaning sales history and picking a simple forecast to sizing safety stock for a target service level, setting reorder points and order quantities from lead times, ranking items with ABC analysis, and weighing stockout cost against overstock cost, built as a spreadsheet or a small script. Use when deciding how much stock to hold or when to reorder, building a replenishment model or reorder report, or explaining why a SKU keeps running out or piling up.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Works with a spreadsheet, CSV exports or a short script in the project's language; no external services.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: business
9
+ kete-loom/risk: writes-files
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ # Inventory and demand planning
14
+
15
+ Answer two questions per SKU and location: **when to reorder** (reorder point) and **how much** (order quantity), with a safety stock that matches a stated service level. Keep the model simple enough that the planner can audit every cell.
16
+
17
+ Formulas, z-values and a worked example are in `references/formulas.md`. Read it before writing any formula.
18
+
19
+ ## 0. Gather inputs, or stop and ask
20
+
21
+ For each SKU (and each warehouse if stock is not shared) you need:
22
+
23
+ 1. Demand history at a fixed grain (daily or weekly units), ideally 12+ months to see seasonality.
24
+ 2. Lead time from order to available-to-sell, in the same time unit, with its variability if the supplier is unreliable.
25
+ 3. Unit cost, holding cost rate (typically quoted as a % of unit cost per year), and ordering cost per purchase order.
26
+ 4. Constraints: MOQ, case pack, pallet or container quantity, shelf life, budget or space caps.
27
+ 5. The service-level target and who owns it.
28
+
29
+ If lead time, MOQ or the service-level target is missing, **stop and ask the user**. Do not invent supplier terms.
30
+
31
+ ## 1. Clean demand before forecasting
32
+
33
+ - Use **demand, not sales**. Days with zero stock show zero sales but not zero demand; flag them and either exclude them or estimate lost sales.
34
+ - Remove or tag one-offs: bulk B2B orders, promotions, data errors, returns booked as negative sales.
35
+ - Keep units consistent (eaches vs cases). Note any SKU replacements and join their history.
36
+
37
+ ## 2. Forecast with the simplest method that works
38
+
39
+ | Pattern | Method |
40
+ |---|---|
41
+ | Stable, no trend | Moving average (4 to 12 periods) or simple exponential smoothing |
42
+ | Trend | Holt (double) exponential smoothing |
43
+ | Clear seasonality, 2+ years of data | Seasonal index on top of a baseline, or Holt-Winters |
44
+ | Intermittent (many zero periods) | Croston-style or just a min/max rule; do not fit a smooth curve |
45
+ | New item, no history | Analogue SKU scaled by the user's launch estimate; mark it as a judgement |
46
+
47
+ Backtest on a holdout (the last 8 to 13 weeks): report MAE and bias per SKU. A forecast with persistent bias is worse than a noisy one; fix bias first. Do not pick a complex model unless it beats the moving average on the holdout.
48
+
49
+ ## 3. ABC (and XYZ) classification
50
+
51
+ 1. Rank SKUs by annual consumption value (annual units x unit cost).
52
+ 2. A = top ~80% of value, B = next ~15%, C = rest. These cut-offs are conventions; confirm them with the user.
53
+ 3. Optional XYZ by demand variability (coefficient of variation) so A-X items get tight control and C-Z items get simple rules.
54
+ 4. Use classes to set service levels and review frequency, for example A 98%, B 95%, C 90%, and review A items weekly.
55
+
56
+ ## 4. Safety stock, reorder point, order quantity
57
+
58
+ 1. Pick the service-level type and say which: **cycle service level** (probability of no stockout per cycle) is what the z-score formula gives. Fill rate is different and needs the loss function.
59
+ 2. Safety stock from the formula in `references/formulas.md`, including lead-time variability when the supplier is late often.
60
+ 3. Reorder point = expected demand over lead time + safety stock (add the review period for periodic review).
61
+ 4. Order quantity: EOQ as a starting point, then round up to MOQ and case pack, and cap by shelf life and budget.
62
+ 5. Compare **inventory position** (on hand + on order - backorders - allocated), not on-hand, with the reorder point.
63
+
64
+ ## 5. Stockout vs overstock trade-off
65
+
66
+ - State both costs per SKU: stockout = lost margin + expediting + customer churn; overstock = holding + obsolescence + markdown.
67
+ - For seasonal or perishable one-shot buys use the newsvendor critical ratio: underage cost / (underage + overage cost).
68
+ - Show the user a table of service level vs average inventory value; let them choose. Going from 95% to 99% usually costs far more stock than 90% to 95%.
69
+
70
+ ## 6. Build the model
71
+
72
+ Spreadsheet layout: one inputs sheet (per SKU parameters), one demand sheet (history, cleaned flags), one calc sheet (forecast, sigma, SS, ROP, EOQ), one output sheet (reorder report). No hard-coded numbers inside formulas; reference input cells.
73
+
74
+ In code: read CSV exports, compute per SKU, write a reorder report CSV. Add a test on one hand-checked SKU (the worked example in `references/formulas.md`).
75
+
76
+ ## Rules
77
+
78
+ - Never place or change purchase orders, or write to an ERP or store inventory system, without the user's explicit go-ahead.
79
+ - Never treat stockout periods as zero demand.
80
+ - Never mix time units: demand per week with lead time in days is the most common bug.
81
+ - Do not promise a service level the data cannot support; say when history is too short.
82
+
83
+ ## Report
84
+
85
+ ```
86
+ SKU | class | avg demand/period | sigma | lead time | service level | safety stock | reorder point | order qty | on hand | position | action
87
+ ```
88
+
89
+ Then: method used and holdout MAE/bias, assumptions the user must confirm, SKUs with too little data, and the stock-value impact of the chosen service levels.
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Work out safety stock and reorder points for our 400 SKUs from this weekly sales CSV",
4
+ "Build me a replenishment spreadsheet that tells the buyer when to reorder and how many cases",
5
+ "Do an ABC analysis of our product range and suggest service levels per class",
6
+ "Our best seller keeps stocking out even though the supplier lead time is only three weeks, what is wrong with our reorder rule?",
7
+ "How much extra stock does going from 95% to 99% service level cost us on the A items?"
8
+ ],
9
+ "should_not_trigger": [
10
+ "A pallet of our goods arrived damaged, help me file a claim with the freight carrier",
11
+ "Sequence next week's jobs across our three CNC machines to cut changeovers",
12
+ "Set up grading rules for returned items so we know what to restock and what to scrap",
13
+ "Find the right HS code for our stainless steel water bottles before we ship to Canada",
14
+ "Build a revenue dashboard with weekly active customers and churn"
15
+ ]
16
+ }
@@ -0,0 +1,62 @@
1
+ # Inventory formulas
2
+
3
+ Use one time unit (days or weeks) for every term.
4
+
5
+ ## Symbols
6
+
7
+ - `d` average demand per period, `sigma_d` standard deviation of demand per period
8
+ - `L` average lead time in periods, `sigma_L` standard deviation of lead time
9
+ - `R` review period (periodic review only)
10
+ - `z` standard normal quantile for the cycle service level
11
+ - `D` annual demand, `S` cost per order, `H` holding cost per unit per year (= unit cost x holding rate)
12
+
13
+ ## z for cycle service level
14
+
15
+ | CSL | z |
16
+ |---|---|
17
+ | 90% | 1.28 |
18
+ | 95% | 1.645 |
19
+ | 97.5% | 1.96 |
20
+ | 98% | 2.05 |
21
+ | 99% | 2.33 |
22
+ | 99.5% | 2.58 |
23
+
24
+ Spreadsheet: `=NORM.S.INV(0.95)`. Python: `scipy.stats.norm.ppf(0.95)` or `statistics.NormalDist().inv_cdf(0.95)` (standard library).
25
+
26
+ ## Safety stock
27
+
28
+ - Demand varies, lead time fixed: `SS = z * sigma_d * sqrt(L)`
29
+ - Both vary (independent): `SS = z * sqrt(L * sigma_d^2 + d^2 * sigma_L^2)`
30
+ - Periodic review: replace `L` with `L + R`.
31
+
32
+ These assume roughly normal demand. For intermittent or very skewed demand, use an empirical percentile of lead-time demand from history instead.
33
+
34
+ ## Reorder point
35
+
36
+ - Continuous review: `ROP = d * L + SS`
37
+ - Periodic review order-up-to level: `S_max = d * (L + R) + SS`; order `S_max - inventory position`.
38
+
39
+ ## Economic order quantity
40
+
41
+ `EOQ = sqrt(2 * D * S / H)`
42
+
43
+ Round up to MOQ and case pack. EOQ is flat near its optimum, so rounding costs little.
44
+
45
+ ## Newsvendor (single buy)
46
+
47
+ Critical ratio `CR = Cu / (Cu + Co)`, where `Cu` = margin lost per unit short and `Co` = cost per unit left over (cost minus salvage). Order the demand quantile at `CR`: `Q = mean + z(CR) * sigma` for normal demand.
48
+
49
+ ## Forecast accuracy
50
+
51
+ - `MAE = mean(|actual - forecast|)`
52
+ - `Bias = sum(forecast - actual) / sum(actual)`; positive means over-forecasting.
53
+ - Avoid MAPE on low-volume SKUs; zero actuals make it undefined.
54
+
55
+ ## Worked example (use as a test case)
56
+
57
+ Weekly demand `d = 100`, `sigma_d = 20`, lead time `L = 4` weeks fixed, CSL 95% (`z = 1.645`).
58
+
59
+ - `SS = 1.645 * 20 * sqrt(4) = 65.8`, round up to 66
60
+ - `ROP = 100 * 4 + 66 = 466`
61
+
62
+ With `D = 5200`, `S = 50`, unit cost 10, holding rate 25% (`H = 2.5`): `EOQ = sqrt(2 * 5200 * 50 / 2.5) = sqrt(208000) = 456.1`, so about 456 before rounding to case pack.
@@ -0,0 +1,127 @@
1
+ ---
2
+ name: investor-materials
3
+ description: Drafts startup fundraising documents, namely a pitch deck outline, a one-page investor summary and the recurring investor update, built around a clear narrative, the few metrics investors judge a company on, a specific ask and use of funds. Use when a founder is preparing to raise a seed or Series A round, writing to existing investors about progress, or wants a deck or one-pager reviewed for gaps and common fundraising mistakes.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. No tools required; uses the metrics and documents the founder provides.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: business
9
+ kete-loom/risk: read-only
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ # Investor materials
14
+
15
+ Help a founder tell a true, specific story that makes an investor want the next meeting. You draft structure and words; the founder owns every number and claim.
16
+
17
+ ## 0. Pick the document and collect facts
18
+
19
+ Ask which of these is needed (often several):
20
+
21
+ | Document | Purpose | Length |
22
+ |---|---|---|
23
+ | Pitch deck | Get and run the meeting | 10-15 slides plus appendix |
24
+ | One-pager | Cold or warm intro, forwardable | One page |
25
+ | Investor update | Keep current investors informed and helpful | One screen of email, sent on a fixed cadence |
26
+
27
+ Collect before writing, and ask for anything missing:
28
+
29
+ 1. What the company does in one sentence, for whom, and why now.
30
+ 2. Stage, amount raised so far, the round being raised (amount, instrument such as a SAFE or priced round), and any committed investors.
31
+ 3. Real metrics with dates: revenue or MRR, growth rate, customers or users, retention, gross margin, burn and runway.
32
+ 4. Team: founders and why they are the right people.
33
+ 5. Target investors (stage, sector, geography).
34
+
35
+ **Stop and ask** rather than fill a gap with an invented or rounded-up number. If a metric is weak, the narrative must deal with it honestly, not hide it.
36
+
37
+ ## 1. Narrative first
38
+
39
+ Write the story in five sentences before any slide:
40
+
41
+ 1. The problem, for a specific customer, with evidence it hurts.
42
+ 2. The solution and what is different about it.
43
+ 3. Proof it is working (traction, the best single metric).
44
+ 4. Why this becomes big (market and business model).
45
+ 5. Why this team, and what this money achieves.
46
+
47
+ Every slide must support one of these sentences. Cut slides that do not.
48
+
49
+ ## 2. Pitch deck outline
50
+
51
+ Use this order unless the founder's strongest point should come earlier (often traction):
52
+
53
+ 1. **Title**: company, one-line description, contact.
54
+ 2. **Problem**: who has it, how they cope today, what it costs them.
55
+ 3. **Solution**: the product and the key insight. Show it (screenshot or demo flow).
56
+ 4. **Why now**: what changed (technology, regulation, behaviour, cost).
57
+ 5. **Traction**: one chart of the best metric over time, plus two or three supporting numbers.
58
+ 6. **Market**: bottom-up size (number of customers times price), not only a top-down headline figure. See the `market-research` skill for sizing.
59
+ 7. **Business model**: how you charge, price points, unit economics if known.
60
+ 8. **Competition**: honest map of alternatives, including "do nothing" and spreadsheets, and why customers pick you.
61
+ 9. **Go-to-market**: how customers are acquired today and how that scales.
62
+ 10. **Team**: relevant experience, not job-title lists.
63
+ 11. **The ask**: amount, instrument, what it funds, milestones it reaches and how many months of runway.
64
+ 12. **Appendix**: detailed financials, cohort data, product detail, for questions.
65
+
66
+ Slide-writing rules: one message per slide, written as the slide headline ("Revenue grew 3x in 6 months", not "Traction"); numbers with dates and definitions; readable at a glance.
67
+
68
+ Detailed slide prompts and a one-pager and update template are in `references/templates.md`. Read it when drafting the document itself.
69
+
70
+ ## 3. Metrics that matter
71
+
72
+ Choose the ones that fit the business model and define each one:
73
+
74
+ - **SaaS / subscription**: MRR or ARR, month-on-month growth, net revenue retention, logo churn, CAC payback, gross margin.
75
+ - **Marketplace**: GMV, take rate, net revenue, repeat purchase rate, liquidity on both sides.
76
+ - **Consumer**: active users (define active), retention cohorts, engagement frequency, organic share of acquisition.
77
+ - **Fintech / payments**: total payment volume, revenue as a share of volume, loss and fraud rates, licences held.
78
+ - **All**: burn, runway in months, revenue or usage concentration in top customers.
79
+
80
+ Say "revenue" only for recognised revenue. Label bookings, pilots, letters of intent and GMV as what they are.
81
+
82
+ ## 4. The ask
83
+
84
+ - State an exact amount or a narrow range, the instrument and the terms already agreed (for example a valuation cap on a SAFE).
85
+ - Use of funds as three to five buckets with percentages that sum to 100.
86
+ - Tie the money to milestones that make the next round possible, and the runway it buys.
87
+
88
+ ## 5. Investor update
89
+
90
+ Send on a fixed cadence (monthly or quarterly), short, same structure every time:
91
+
92
+ 1. Headline: one-line summary of the period.
93
+ 2. Key metrics table, same metrics each time, with change versus last period.
94
+ 3. Wins.
95
+ 4. Challenges, stated plainly, with what you are doing about them.
96
+ 5. Asks: specific introductions, hires or advice.
97
+ 6. Cash and runway.
98
+
99
+ Never skip bad months; consistency builds trust.
100
+
101
+ ## Common mistakes to flag when reviewing
102
+
103
+ - No clear ask, or an ask with no milestones.
104
+ - Top-down market size only ("1% of a $50B market").
105
+ - Vanity metrics (downloads, sign-ups) without retention or revenue.
106
+ - Undefined or cherry-picked metrics, or charts without axes and dates.
107
+ - "No competitors".
108
+ - Too much text; slides that need the founder to explain them.
109
+ - Financial projections presented as facts.
110
+ - Inconsistent numbers between deck, one-pager and data room.
111
+
112
+ ## Rules
113
+
114
+ - Never invent, inflate or round up traction, revenue, customers, logos or committed investors. Misrepresenting facts to investors can be fraud.
115
+ - Do not give legal, tax or securities advice; for instruments, terms and fundraising rules in the founder's jurisdiction, tell them to confirm with a lawyer.
116
+ - Keep confidential figures out of anything the founder says will be shared publicly.
117
+
118
+ ## Output
119
+
120
+ Deliver the requested document(s) in Markdown, followed by:
121
+
122
+ ```
123
+ ## Gaps and questions
124
+ - <missing metric or claim that needs a source>
125
+ ## Review notes
126
+ - <mistakes from the list above that apply, with the fix>
127
+ ```
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "We're raising a $1.5M seed round. Help me outline the pitch deck.",
4
+ "Write our monthly update to investors: MRR is up 12%, we lost a big customer and runway is 14 months",
5
+ "Turn these notes into a one-page summary I can send to angel investors",
6
+ "Review my Series A deck and tell me what VCs will push back on",
7
+ "What metrics should a B2B SaaS startup put on the traction slide, and how do I phrase the ask?"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Estimate TAM, SAM and SOM for a pharmacy inventory app in Nigeria with sources",
11
+ "Plan a launch campaign with a budget split across paid social and email",
12
+ "Write a long-form blog post on lessons from our first year as a startup",
13
+ "Define the voice and tone guidelines for our company's website copy",
14
+ "Prepare release notes for version 2.0 of our CLI"
15
+ ]
16
+ }