@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,25 @@
1
+ ---
2
+ name: csharp
3
+ description: Always-on rules for C# and .NET code, covering nullable reference types, async and await, disposal, exceptions, data access safety, and build and test checks.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: coding
8
+ kete-loom/risk: read-only
9
+ kete-loom/paths: "**/*.cs"
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ - Keep nullable reference types enabled and fix nullable warnings; never silence them with `!` unless the value is proven non-null.
14
+ - Never block on async code with `.Result`, `.Wait()` or `.GetAwaiter().GetResult()`; use `await` all the way up.
15
+ - Never write `async void` except for event handlers. Return `Task` or `ValueTask`.
16
+ - Accept a `CancellationToken` in async APIs that do I/O and pass it to every call that takes one.
17
+ - Dispose every `IDisposable` with `using` or `await using`; never leave a stream, connection or reader open.
18
+ - Do not create a new `HttpClient` per request; use `IHttpClientFactory` or a shared instance.
19
+ - Throw specific exceptions and rethrow with `throw;`, never `throw ex;`, which loses the stack trace.
20
+ - Never build SQL by string concatenation or interpolation; use parameters or the ORM's parameterized APIs.
21
+ - Never deserialize untrusted data with `BinaryFormatter` or with type-name handling (such as Newtonsoft `TypeNameHandling` other than `None`) that lets the payload choose the type.
22
+ - Avoid enumerating an `IEnumerable<T>` or LINQ query more than once; materialize it with `ToList()` when you need it twice.
23
+ - Run `dotnet build` with warnings visible and `dotnet test`, and use the project's configured formatter and analyzers.
24
+
25
+ For more, load the csharp-patterns and csharp-testing skills.
package/rules/dart.md ADDED
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: dart
3
+ description: Always-on rules for Dart and Flutter code, covering null safety, async, widget lifecycle, analysis, formatting and tests.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: coding
8
+ kete-loom/risk: read-only
9
+ kete-loom/paths: "**/*.dart"
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ - Run `dart analyze` (or `flutter analyze`) and fix every issue you introduce. Respect the project's `analysis_options.yaml`; never add `// ignore:` to silence a real problem.
14
+ - Format with `dart format`. Do not hand-format against it.
15
+ - Make a type nullable only when absence is a real state. Promote with a null check or a local copy; use `!` only for an invariant the analyzer cannot see, never to silence an error.
16
+ - Use `late` only when the value is always set before first read; reading it earlier throws at runtime.
17
+ - Never `as`-cast decoded JSON blindly; check shape and types (patterns or explicit checks) before use.
18
+ - Await every `Future` or mark intentional fire-and-forget with `unawaited(...)`. Unawaited errors escape every `try`.
19
+ - Catch specific types with `on`, and use `rethrow` (not `throw e`) to keep the stack trace.
20
+ - Don't add a `_` default to a switch over a sealed type or enum; it hides new cases from the exhaustiveness check.
21
+ - In Flutter, check `mounted` (or `context.mounted`) after any `await` before using `BuildContext` or calling `setState`.
22
+ - In `dispose()`, dispose every controller and `FocusNode` you create and cancel every `StreamSubscription` and `Timer`.
23
+ - Never do I/O or heavy work in `build()`; it must be fast and side-effect free.
24
+ - Use the project's state management and routing approach; do not introduce a new one.
25
+ - Give list items in reorderable or stateful lists a stable `Key`.
26
+ - Never ship secrets in an app, in source or via `--dart-define`; anything in the binary is readable.
27
+ - Add or update tests with `package:test` or `flutter_test` for changed logic; run `dart test` or `flutter test`.
28
+
29
+ For more, load the dart-patterns, dart-testing and flutter-patterns skills.
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: fsharp
3
+ description: Always-on rules for F# code, covering immutability, discriminated unions and exhaustive matching, Option and Result, async and task code, .NET interop, and checks.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: coding
8
+ kete-loom/risk: read-only
9
+ kete-loom/paths: "**/*.fs, **/*.fsi, **/*.fsx"
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ - Prefer immutable values, records and F# collections; use `mutable` or `ref` only for local, contained state.
14
+ - Model closed sets of cases with discriminated unions and match them exhaustively; never ignore incomplete-match warnings.
15
+ - Avoid the wildcard `_` case over a union you own, so a new case is a compile warning at every match.
16
+ - Use `Option` for absence and `Result` for expected failures; keep exceptions for truly exceptional conditions.
17
+ - Never call `Option.get`, `List.head` or `.Value` on something that can be empty; match on it or use a safe function such as `List.tryHead`.
18
+ - Convert nulls from .NET APIs at the boundary with `Option.ofObj` or `Option.ofNullable`.
19
+ - Keep file order in the project file meaningful: a file only uses what is defined above it, so put new types before their users.
20
+ - Never block on async work with `Async.RunSynchronously` or `.Result` inside library or server code; compose with `async { }` or `task { }`.
21
+ - Pass a `CancellationToken` through async and task workflows that do I/O.
22
+ - Dispose resources with `use` or `use!`, not `let`.
23
+ - Never build SQL by string concatenation; use parameters or the data library's parameterized API.
24
+ - Annotate parameter and return types on public functions so an inference change cannot silently change the API.
25
+ - Treat compiler warnings as errors where the project does, and run `dotnet build` and `dotnet test` before finishing.
26
+ - Use the project's configured formatter and test framework.
27
+
28
+ For more, load the fsharp-patterns and fsharp-testing skills.
package/rules/git.md ADDED
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: git
3
+ description: Always-on git hygiene rules for agents, covering small focused commits, Conventional Commits messages, keeping secrets and generated files out, safe pushing and never rewriting shared history.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: devops
8
+ kete-loom/risk: read-only
9
+ kete-loom/owner: "Kete-org"
10
+ ---
11
+
12
+ - Never commit directly to the default branch unless that is the project's workflow; branch first.
13
+ - Run `git status` and `git diff --staged` before every commit and check that only the intended changes are staged.
14
+ - Stage files by name. Avoid `git add -A` or `git add .` when unrelated or untracked files are present.
15
+ - Keep each commit small and focused on one logical change that builds and passes tests on its own.
16
+ - Follow the project's commit message convention (check recent `git log`); if it has none, use Conventional Commits, `type(scope): summary`. Write the summary in the imperative and add a body that explains why when the reason is not obvious.
17
+ - Never commit secrets, `.env` files, credentials, private keys or personal data. If one was committed, stop and tell the user; removing it from history does not un-leak it, so it must be rotated.
18
+ - Never commit build output, dependency folders, caches or editor files. Keep lockfiles the project already tracks in sync with its manifest.
19
+ - Never skip hooks with `--no-verify`. If a hook fails, fix the cause and commit again; do not amend an earlier commit to work around it.
20
+ - Never force-push a shared branch or rewrite published history. On your own branch, use `--force-with-lease`, never plain `--force`.
21
+ - Never run destructive commands (`reset --hard`, `clean -fd`, `checkout -- .`, `branch -D`, `stash drop`) without the user's consent; they discard uncommitted work.
22
+ - Do not change git config, remotes or signing settings unless asked.
23
+ - Use non-interactive commands; avoid flags that open an editor or prompt, such as `rebase -i` or `add -p`.
24
+ - Resolve merge conflicts by reading both sides; never accept one side wholesale to make the conflict go away.
25
+
26
+ For more, load the git-workflow and conventional-commits skills.
package/rules/go.md ADDED
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: go
3
+ description: Always-on rules for Go files, covering formatting, vet, error handling, context, goroutine and resource lifetimes, and concurrency safety.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: coding
8
+ kete-loom/risk: read-only
9
+ kete-loom/paths: "**/*.go"
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ - Format with `gofmt` (or the project's `goimports`). Run `go vet ./...` and `go test ./...` after a change, plus the project's configured linter.
14
+ - Run tests with `-race` when the code uses goroutines or shared state.
15
+ - Check every returned error. Never discard one with `_` unless a comment says why.
16
+ - Wrap errors with context using `fmt.Errorf("doing x: %w", err)`, and inspect them with `errors.Is` and `errors.As`, never by comparing strings.
17
+ - Handle an error or return it, not both: do not log and then return the same error.
18
+ - Never `panic` for expected failures in library code; return an error.
19
+ - Pass `context.Context` as the first parameter of anything that does I/O or may block, and honour its cancellation. Never store it in a struct.
20
+ - `defer` the `Close` of files, response bodies and rows right after the error check; check `rows.Err()` after iterating.
21
+ - Give every goroutine a way to stop (context, closed channel or `sync.WaitGroup`). Never start one you cannot end.
22
+ - Protect shared state with a mutex or channels. Never copy a value that contains a `sync.Mutex`.
23
+ - Only the sender closes a channel. Never close a channel twice or send on a closed one.
24
+ - Set a timeout on outbound HTTP calls (client `Timeout` or a context deadline); `http.Get` and `http.DefaultClient` have none. Set `ReadHeaderTimeout` on `http.Server`.
25
+ - Use parameterized queries in `database/sql`; never build SQL with `fmt.Sprintf`.
26
+ - Pass `exec.Command` separate arguments; never run `sh -c` with a string built from input.
27
+ - Keep `go.mod` and `go.sum` tidy with `go mod tidy`; never edit `go.sum` by hand.
28
+
29
+ For more, load the go-patterns and go-testing skills.
package/rules/java.md ADDED
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: java
3
+ description: Always-on rules for Java files, covering build tooling, null handling, exceptions, resources, concurrency and injection safety.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: coding
8
+ kete-loom/risk: read-only
9
+ kete-loom/paths: "**/*.java"
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ - Use the project's build tool through its wrapper (`./mvnw` or `./gradlew`), not a globally installed `mvn` or `gradle`.
14
+ - Use the project's configured formatter and static analysis; never disable a check to make the build pass.
15
+ - Use `try`-with-resources for streams, readers, connections and statements so they always close.
16
+ - Never catch and ignore an exception. Catch the narrowest type, and pass the original as the cause when wrapping.
17
+ - Never catch `Throwable` or `Error`; when catching `InterruptedException`, restore the flag with `Thread.currentThread().interrupt()`.
18
+ - Return empty collections or `Optional`, not `null`. Use `Optional` only as a return type, never for fields or parameters.
19
+ - Validate parameters at public boundaries with `Objects.requireNonNull` or explicit checks.
20
+ - Override `equals` and `hashCode` together, never one alone.
21
+ - Compare strings and boxed numbers with `equals`, never `==`.
22
+ - Pass an explicit `Charset` (`StandardCharsets.UTF_8`) when converting bytes and text.
23
+ - Use `java.time` (`Instant`, `LocalDate`, `ZonedDateTime`), never `Date` or `Calendar` in new code.
24
+ - Use `PreparedStatement` or the framework's parameter binding; never concatenate user input into SQL or JPQL. Run processes with `ProcessBuilder` and an argument list.
25
+ - Never deserialize untrusted data with `ObjectInputStream`. Disable external entities when parsing untrusted XML.
26
+ - Run concurrent work on an `ExecutorService` (or the framework's executor) and shut it down, rather than unmanaged `new Thread(...)`. Guard shared mutable state with `java.util.concurrent` types or locks.
27
+ - Use `SecureRandom`, not `Random`, for tokens and keys.
28
+
29
+ For more, load the java-patterns and java-testing skills.
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: kotlin
3
+ description: Always-on rules for Kotlin code, covering null safety, sealed types, coroutines and structured concurrency, Java interop, and build and test checks.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: coding
8
+ kete-loom/risk: read-only
9
+ kete-loom/paths: "**/*.kt, **/*.kts"
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ - Never use `!!` in new code. Use `?:` with an early return or error, `requireNotNull`/`checkNotNull`, or a non-null type validated at the boundary.
14
+ - Give values from unannotated Java APIs an explicit Kotlin type at the call site so a null fails where it enters.
15
+ - Use `lateinit var` only for values a framework sets before first use, never for values that can be missing.
16
+ - Prefer `val` and read-only collection types; never put mutable collections in a `data class`, since `copy()` shares them.
17
+ - Model closed sets of states with `sealed interface` or `sealed class`, and match them with `when` as an expression with no `else`.
18
+ - Never use `GlobalScope`. Launch coroutines in a scope tied to a lifecycle and let structured concurrency cancel them.
19
+ - Never block a coroutine thread with `Thread.sleep` or blocking I/O; use `delay`, suspending APIs, or `withContext(Dispatchers.IO)`.
20
+ - Never swallow `CancellationException`. When catching `Exception` or `Throwable` (or using `runCatching`) in suspending code, rethrow it.
21
+ - Do not use `runBlocking` in production code paths; keep it to `main` and tests that cannot use `runTest`.
22
+ - Make shared mutable state safe with `Mutex`, atomics or confinement to one dispatcher; never mutate it from several coroutines unguarded.
23
+ - Use `use { }` on every `Closeable` so it is closed on all paths.
24
+ - Use the project's configured build (Gradle or Maven), formatter and linter, and run its tests before finishing.
25
+ - Test suspending code with `runTest` from kotlinx-coroutines-test, not `runBlocking` with real delays.
26
+
27
+ For more, load the kotlin-patterns and kotlin-testing skills.
package/rules/perl.md ADDED
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: perl
3
+ description: Always-on rules for modern Perl 5 code, covering strict and warnings, lexical scope, safe open and system calls, untrusted input, SQL, encoding and tests.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: coding
8
+ kete-loom/risk: read-only
9
+ kete-loom/paths: "**/*.pl, **/*.pm, **/*.t, **/*.psgi"
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ - Start every file with `use strict;` and `use warnings;` (or the project's equivalent bundle, such as `use v5.36;`).
14
+ - Declare variables with `my` in the smallest scope. Never use undeclared globals; use `our` only for package interfaces.
15
+ - Use three-argument `open` with a lexical filehandle and check it: `open(my $fh, '<', $path) or die "Can't open $path: $!";`.
16
+ - Check the result of every system call (`open`, `close`, `mkdir`, `unlink`, `rename`) and include `$!` in the error, or `use autodie`.
17
+ - Call external programs with list-form `system` or `exec` (`system('cmd', @args)`), never one interpolated string. Check `$?` afterwards.
18
+ - Never pass untrusted input to string `eval`, two-argument `open`, or backticks. Catch exceptions with block `eval { }` or the project's try/catch module.
19
+ - Localise special variables (`local $_`, `local $/`) when you change them.
20
+ - Use placeholders (`?`) with DBI `prepare`/`execute`; never interpolate values into SQL.
21
+ - Pass and return complex data by reference; don't flatten hashes and arrays you need to keep separate.
22
+ - Decode input and encode output explicitly (`use utf8;` when the source has non-ASCII text, `:encoding(UTF-8)` layers on handles).
23
+ - Run `perl -c` and the project's configured Perl::Critic and Perl::Tidy settings on changed files.
24
+ - Write tests in `t/*.t` with `Test::More` (or the project's framework), end with `done_testing`, and run them with `prove -lr t`.
25
+
26
+ For more, load the perl-patterns and perl-testing skills.
package/rules/php.md ADDED
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: php
3
+ description: Always-on rules for modern PHP 8 code, covering strict types, typed signatures, input handling, SQL, errors, Composer and tests.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: coding
8
+ kete-loom/risk: read-only
9
+ kete-loom/paths: "**/*.php"
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ - Start new files with `declare(strict_types=1);` and match existing files that already use it.
14
+ - Type every parameter, return and property. Use `?T` or union types only when null or another type is a real state.
15
+ - Use enums for fixed sets of values when the project's PHP version supports them (8.1+), not loose strings.
16
+ - Compare with `===` and `!==`. Use `match` over `switch` when mapping values; it compares strictly and throws `UnhandledMatchError` on no match.
17
+ - Never build SQL by string concatenation. Use prepared statements with bound parameters (PDO or the project's query builder/ORM).
18
+ - Escape output for its context: `htmlspecialchars($v, ENT_QUOTES, 'UTF-8')` for HTML, or the template engine's auto-escaping.
19
+ - Never pass user input to `eval`, `include`/`require`, `unserialize`, `exec`, `shell_exec` or `system`. Use `json_decode` for untrusted data and `escapeshellarg` if a shell is unavoidable.
20
+ - Hash passwords with `password_hash` and check with `password_verify`. Use `random_bytes`/`random_int` for tokens, never `rand` or `mt_rand`.
21
+ - Throw specific exceptions and catch them where you can act. Never suppress errors with `@`.
22
+ - Run the project's configured formatter and code style tool; keep classes in PSR-4 autoload paths (one class per file, namespace matches directory).
23
+ - Run the project's static analyser (PHPStan or Psalm) at its configured level and fix what you introduce.
24
+ - Add dependencies with `composer require`, commit `composer.lock` in applications, and never edit `vendor/`.
25
+ - Validate request input at the boundary; never trust `$_GET`, `$_POST`, `$_COOKIE` or headers.
26
+ - Add or update tests with the project's test framework (PHPUnit or Pest) and run them.
27
+
28
+ For more, load the php-patterns, php-testing and laravel-patterns skills.
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: python
3
+ description: Always-on rules for Python 3 files, covering environments, type hints, exceptions, resource handling, untrusted input and the project's own tooling.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: coding
8
+ kete-loom/risk: read-only
9
+ kete-loom/paths: "**/*.py, **/*.pyi"
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ - Use the project's environment and dependency tool (its lockfile or `pyproject.toml` shows which). Never install packages into the system Python.
14
+ - Use the project's configured formatter, linter, type checker and test runner, and run them after a change.
15
+ - Where the project uses type hints, add them to new and changed function signatures. Never use `# type: ignore` without a specific error code and a reason.
16
+ - Never use a mutable default argument (`def f(x=[])`); default to `None` and create the value inside.
17
+ - Never use a bare `except:` or `except Exception: pass`. Catch the narrowest exception, and use `raise ... from err` when wrapping.
18
+ - Open files, locks, connections and sockets with `with` so they always close.
19
+ - Pass `encoding="utf-8"` when opening text files.
20
+ - Resolve any path built from user input and check it stays inside the allowed directory before using it.
21
+ - Never pass user input to `eval`, `exec`, `pickle.loads`, `yaml.load` without `SafeLoader`, or `subprocess` with `shell=True`. Pass `subprocess` an argument list.
22
+ - Use parameterized queries; never format SQL with f-strings or `%`.
23
+ - Use `secrets`, not `random`, for tokens and passwords.
24
+ - Use timezone-aware datetimes (`datetime.now(timezone.utc)`); never compare naive and aware values.
25
+ - Use `logging` in library code, not `print`.
26
+ - Set a timeout on every network call; `requests` and `urllib` wait forever by default.
27
+ - Never call blocking I/O inside `async def`; use an async library or `asyncio.to_thread`.
28
+ - Compare to `None` with `is` / `is not`.
29
+
30
+ For more, load the python-patterns and python-testing skills.
package/rules/ruby.md ADDED
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: ruby
3
+ description: Always-on rules for Ruby code, covering style, nil handling, exceptions, unsafe input, Bundler, Rails safety and tests.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: coding
8
+ kete-loom/risk: read-only
9
+ kete-loom/paths: "**/*.rb, **/*.rake, **/*.erb, **/*.gemspec, **/Gemfile, **/Rakefile"
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ - Run the project's configured linter and formatter (RuboCop or Standard) and fix what you introduce. Don't add inline disables to hide real problems.
14
+ - Match the project's use of `# frozen_string_literal: true`; don't mutate string literals.
15
+ - Handle `nil` explicitly. Use `fetch` for required keys so a missing key raises instead of returning `nil`; use `&.` only where `nil` is a valid state.
16
+ - Rescue specific exception classes. Never `rescue Exception` (it catches `Interrupt` and `SystemExit`); re-raise with bare `raise` when you can't handle it.
17
+ - Use `ensure` or block forms (`File.open { }`) so resources are always released.
18
+ - Never pass user input to `eval`, `instance_eval`, `send`, `public_send`, `constantize` or `Object.const_get` without an allowlist.
19
+ - Call shell commands with argument arrays (`system("cmd", arg)`, `Open3.capture3("cmd", arg)`), never interpolated strings or backticks.
20
+ - Never use `Marshal.load` or `YAML.load` on untrusted data; use `JSON.parse` or `YAML.safe_load`.
21
+ - In Rails, never interpolate into SQL; use `where(name: v)` or bound placeholders. Permit params with strong parameters, never `permit!`.
22
+ - In Rails views, never call `html_safe` or `raw` on user input; let ERB escape it.
23
+ - In Rails, avoid N+1 queries with `includes`/`preload`, and change the schema only through migrations.
24
+ - Add gems through the `Gemfile` with Bundler and commit `Gemfile.lock`. Run commands with `bundle exec`.
25
+ - Add or update tests with the project's framework (RSpec or Minitest) and run them.
26
+
27
+ For more, load the ruby-patterns, ruby-testing and rails-patterns skills.
package/rules/rust.md ADDED
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: rust
3
+ description: Always-on rules for Rust files, covering cargo tooling, error handling, panics, unsafe code, async and dependency hygiene.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: coding
8
+ kete-loom/risk: read-only
9
+ kete-loom/paths: "**/*.rs"
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ - Run `cargo fmt`, `cargo clippy --all-targets` and `cargo test` after a change. Fix clippy warnings instead of adding `#[allow]` without a reason.
14
+ - Return `Result` for recoverable failures and propagate with `?`. Add context to errors as they cross a boundary.
15
+ - Use the project's error approach (often `thiserror` for libraries, `anyhow` for applications); never return `Box<dyn Error>` or `String` errors from a public library API without reason.
16
+ - Never use `unwrap()` or `expect()` on input, I/O or anything that can fail at runtime outside tests. Use `expect("why this cannot fail")` only for true invariants.
17
+ - Avoid code that can panic on untrusted input: indexing with `[]`, slicing strings at byte offsets, and unchecked arithmetic (it panics in debug and wraps silently in release). Use `get`, `checked_*` or `saturating_*`.
18
+ - Write `unsafe` only when it is required, keep the block minimal, and add a `// SAFETY:` comment stating the invariant it relies on.
19
+ - Never hold a `std::sync::Mutex` guard across an `.await`; drop it first or use the async runtime's mutex.
20
+ - Never call blocking I/O or long CPU work directly in async code; use the runtime's blocking task facility (such as `spawn_blocking`).
21
+ - Never log or `Debug`-print secrets; implement `Debug` by hand for types that hold them.
22
+ - Use parameterized queries in database code; never build SQL with `format!`.
23
+ - Pass `std::process::Command` separate `.arg()` values; never run `sh -c` with a string built from input.
24
+ - Commit `Cargo.lock` (always for binaries; Cargo now recommends it for libraries too). Do not add a dependency for a few lines of code.
25
+
26
+ For more, load the rust-patterns and rust-testing skills.
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: security
3
+ description: Always-on secure coding rules for any language, covering input validation, injection, authorization, least privilege, deserialisation, dependencies and keeping secrets and personal data out of logs.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: security
8
+ kete-loom/risk: read-only
9
+ kete-loom/owner: "Kete-org"
10
+ ---
11
+
12
+ - Treat all external input as untrusted: request data, headers, cookies, uploaded files, queue messages, LLM output and third-party API responses.
13
+ - Validate input at the trust boundary against an allowlist of type, length, range and format. Reject what fails; do not try to clean it up.
14
+ - Use parameterised queries or the ORM's bound parameters. Never build SQL, NoSQL or LDAP queries by string concatenation or formatting.
15
+ - Run external commands with an argument array and no shell. Never pass user input into a shell string, `eval` or dynamic code execution.
16
+ - Encode output for its context (HTML, attribute, URL, JS) and use the framework's auto-escaping; never mark untrusted data as safe.
17
+ - Resolve user-supplied file paths against a fixed base directory and reject any result outside it.
18
+ - Enforce authentication and authorization on the server for every request and every object accessed. Hidden UI or client checks are not access control.
19
+ - Grant least privilege: minimal scopes for tokens, database users, service accounts, CI jobs and file permissions.
20
+ - Never deserialise untrusted data with formats that can run code (`pickle`, Java native serialization, unsafe YAML loaders). Use JSON or a safe loader with a schema.
21
+ - Validate outbound URLs built from user input against an allowlist of hosts to prevent SSRF.
22
+ - Use the platform's vetted crypto and password-hashing libraries and a cryptographically secure random source for tokens. Never write your own crypto.
23
+ - Keep TLS certificate verification on. Never disable it to make a request work.
24
+ - Never log secrets, tokens, passwords, session IDs or personal data. Redact them in errors, traces and analytics too.
25
+ - Return generic error messages to clients; keep stack traces and internal details in server logs.
26
+ - Add dependencies only when needed, from the official registry, pinned through the lockfile. Check the name for typosquats and run the project's audit tool after changes.
27
+ - Default to secure configuration: deny by default, `Secure`, `HttpOnly` and `SameSite` on session cookies, CSRF protection on state-changing requests that use cookie auth, debug mode off in production.
28
+
29
+ For more, load the security-review skill.
package/rules/swift.md ADDED
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: swift
3
+ description: Always-on rules for Swift code, covering optionals, value types, error handling, Swift concurrency and actors, memory and retain cycles, and build and test checks.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: coding
8
+ kete-loom/risk: read-only
9
+ kete-loom/paths: "**/*.swift"
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ - Never use `!`, `try!` or `as!` on values that can fail at runtime; use `guard let`, `if let`, `??`, `as?` or a thrown error.
14
+ - Avoid implicitly unwrapped optionals except for values a framework sets before first use, such as outlets.
15
+ - Prefer `let` over `var`, and `struct` or `enum` for data; use `class` when you need identity or shared mutable state.
16
+ - Switch over enums exhaustively; avoid `default` on enums you own so a new case is a compile error, and use `@unknown default` for non-frozen SDK enums.
17
+ - Throw specific, meaningful errors and handle them with `do`/`catch`; never discard them with `try?` where the failure matters.
18
+ - Use `async`/`await` and structured concurrency (`async let`, task groups) over completion handlers in new code.
19
+ - Protect shared mutable state with an `actor` or `@MainActor`; never mutate it from several tasks unguarded.
20
+ - Update UI only on the main actor.
21
+ - Make types that cross concurrency domains `Sendable`, and fix concurrency warnings; use `@unchecked Sendable` or `nonisolated(unsafe)` only when you add the synchronization yourself and say why in a comment.
22
+ - Check `Task.isCancelled` or call `try Task.checkCancellation()` in long-running work.
23
+ - Capture `self` weakly (`[weak self]`) in escaping closures stored by `self` or its children, to avoid retain cycles.
24
+ - Mark delegate properties `weak`.
25
+ - Never store secrets in `UserDefaults` or plain files; use the Keychain.
26
+ - Build and test with the project's configured tooling (`swift build` and `swift test` for packages, or the Xcode scheme), and use its configured formatter or linter.
27
+
28
+ For more, load the swift-patterns and swift-testing skills.
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: testing
3
+ description: Always-on rules for writing and running tests in any language, covering behaviour-focused tests, failing tests first for bugs, determinism, isolation, speed and running the suite before finishing.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: testing
8
+ kete-loom/risk: read-only
9
+ kete-loom/owner: "Kete-org"
10
+ ---
11
+
12
+ - Use the project's configured test framework, runner and file layout. Do not add a second one.
13
+ - Test behaviour through the public interface: inputs, outputs and observable effects. Do not assert on private methods or internal call order.
14
+ - For a bug, first write a test that reproduces it and watch it fail, then fix the code until it passes.
15
+ - Give each test one reason to fail and a name that says the expected behaviour.
16
+ - Cover edge cases and error paths, not just the happy path: empty, boundary, invalid and failing-dependency inputs.
17
+ - Make tests deterministic. Inject or fake the clock, seed any randomness and never depend on test order, wall-clock time or time zone.
18
+ - Never use fixed sleeps to wait. Wait on a condition with a timeout, or use fake timers.
19
+ - Keep tests isolated: each test sets up and tears down its own state, uses temporary directories and never relies on shared mutable globals.
20
+ - Never call the real network or third-party services in unit tests. Fake slow or nondeterministic boundaries (network, clock, external APIs); use real objects for the code under test.
21
+ - Keep unit tests fast; move slow integration and end-to-end tests to their own suite.
22
+ - A flaky test is a bug: find the cause instead of adding retries.
23
+ - Run the relevant tests after every change and the full suite before finishing.
24
+
25
+ For more, load the tdd-workflow skill and the testing skill for your language, such as python-testing or typescript-testing.
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: typescript
3
+ description: Always-on rules for TypeScript and JavaScript files, covering type safety, untrusted input, async errors, modules and the project's own tooling.
4
+ license: MIT
5
+ metadata:
6
+ kete-loom/version: "0.1.0"
7
+ kete-loom/category: coding
8
+ kete-loom/risk: read-only
9
+ kete-loom/paths: "**/*.ts, **/*.tsx, **/*.mts, **/*.cts, **/*.js, **/*.jsx, **/*.mjs, **/*.cjs"
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ - Use the project's package manager (the one its lockfile belongs to), formatter, linter and test runner. Never add a second lockfile.
14
+ - Run the project's type check (often `tsc --noEmit`) and lint after a change, not only the tests.
15
+ - Never weaken `tsconfig.json` or lint settings to make an error go away.
16
+ - Never silence the compiler with `any`, `as any`, `@ts-ignore` or a `!` non-null assertion. If a suppression is truly needed, use `@ts-expect-error` with a reason.
17
+ - Type values you have not checked as `unknown` and narrow them. Validate untrusted input (request bodies, `JSON.parse`, env vars, files) at the boundary with the project's schema library or a type guard.
18
+ - End a `switch` over a union with a `never` check so a new case fails to compile.
19
+ - Use `const` by default, `let` when reassigned, never `var`. Use `===` and `!==` (the project's `== null` idiom aside).
20
+ - Await or return every promise, or mark it with `void` and handle its rejection. Never leave a floating promise.
21
+ - Never pass an async function to `forEach`; use `for...of` with `await`, or `Promise.all` / `Promise.allSettled` over `map`.
22
+ - Catch errors as `unknown`, and throw `Error` objects, never strings. Pass the original as `{ cause }` when wrapping.
23
+ - Use `?.` and `??` for missing values; `||` also replaces `0`, `""` and `false`.
24
+ - Never build HTML, SQL, shell commands or file paths by string concatenation with user input. Use parameterized queries, `execFile`/`spawn` with an argument array, and the framework's escaping.
25
+ - Never use `eval`, `new Function` or `innerHTML` with untrusted data.
26
+ - Match the package's module system (`"type"` in `package.json`, `.mjs`/`.cjs`); never mix `require` and `import` in one file.
27
+ - Never put secrets in client code or in env vars the framework exposes to the browser (such as `NEXT_PUBLIC_` or `VITE_`).
28
+
29
+ For more, load the typescript-patterns and typescript-testing skills.
@@ -0,0 +1,52 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ketecode.ai/schemas/kete-loom/skill-frontmatter.schema.json",
4
+ "title": "Kete Loom SKILL.md frontmatter",
5
+ "description": "The strictest common subset of the Agent Skills spec (agentskills.io) as read by Claude Code, Codex, OpenCode, Cursor, Gemini CLI and GitHub Copilot, plus Kete Loom's metadata keys. Extra keys live under `metadata` as strings, because OpenCode requires metadata to be a string-to-string map.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["name", "description", "license", "metadata"],
9
+ "properties": {
10
+ "name": {
11
+ "type": "string",
12
+ "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
13
+ "minLength": 1,
14
+ "maxLength": 64,
15
+ "description": "Must equal the skill's folder name."
16
+ },
17
+ "description": {
18
+ "type": "string",
19
+ "minLength": 80,
20
+ "maxLength": 1024,
21
+ "description": "Single line. Says what the skill does AND when to use it (contains 'Use when')."
22
+ },
23
+ "license": { "type": "string" },
24
+ "compatibility": {
25
+ "type": "string",
26
+ "maxLength": 500,
27
+ "description": "Plain-language environment requirements (tools, network, OS)."
28
+ },
29
+ "metadata": {
30
+ "type": "object",
31
+ "additionalProperties": { "type": "string" },
32
+ "required": ["kete-loom/version", "kete-loom/category", "kete-loom/risk"],
33
+ "properties": {
34
+ "kete-loom/version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
35
+ "kete-loom/category": {
36
+ "type": "string",
37
+ "enum": ["coding", "testing", "security", "integrations", "devops", "data", "ai", "docs", "business", "compliance", "meta"]
38
+ },
39
+ "kete-loom/risk": {
40
+ "type": "string",
41
+ "enum": ["read-only", "writes-files", "runs-commands", "network"],
42
+ "description": "Highest-impact action the skill instructs the agent to take."
43
+ },
44
+ "kete-loom/requires": {
45
+ "type": "string",
46
+ "description": "Comma-separated CLIs or runtimes the skill expects, e.g. 'git, node'."
47
+ },
48
+ "kete-loom/owner": { "type": "string" }
49
+ }
50
+ }
51
+ }
52
+ }
@@ -0,0 +1,96 @@
1
+ 'use strict';
2
+
3
+ // `kete-loom audit`: a deterministic readiness scorecard for working on a project with coding agents.
4
+ // Same input, same result: it reads files and runs read-only git commands, never a model.
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+ const { execFileSync } = require('child_process');
9
+ const { detect } = require('./profiles');
10
+ const { inventory } = require('./inventory');
11
+
12
+ const CODEX_MAX_BYTES = 32768;
13
+ const DETECT_CHECKS = path.join(__dirname, '..', '..', 'skills', 'verification-loop', 'scripts', 'detect-checks.js');
14
+
15
+ const git = (cwd, args) => {
16
+ try {
17
+ return execFileSync('git', args, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 5000 }).trim();
18
+ } catch {
19
+ return null;
20
+ }
21
+ };
22
+
23
+ function audit({ cwd = process.cwd(), home, catalog }) {
24
+ const checks = [];
25
+ const add = (id, status, title, detail, fix) => checks.push({ id, status, title, detail, ...(fix ? { fix } : {}) });
26
+ const root = git(cwd, ['rev-parse', '--show-toplevel']) || cwd;
27
+ const has = (f) => fs.existsSync(path.join(root, f));
28
+
29
+ if (git(cwd, ['rev-parse', '--is-inside-work-tree']) === 'true') add('git', 'pass', 'Git repository', 'Agents can see history, diffs and status.');
30
+ else add('git', 'warn', 'Git repository', 'This folder is not a git repository, so agents can\'t diff, review or roll back their changes.', 'git init');
31
+
32
+ const instr = ['AGENTS.md', 'CLAUDE.md'].filter(has);
33
+ if (!instr.length) add('instructions', 'fail', 'Agent instructions', 'No AGENTS.md or CLAUDE.md: every agent starts without your build commands, conventions or boundaries.', 'Write AGENTS.md (the /project-init command or the codebase-onboarding skill can draft it)');
34
+ else {
35
+ const big = instr.filter((f) => fs.statSync(path.join(root, f)).size > CODEX_MAX_BYTES);
36
+ if (big.length) add('instructions', 'warn', 'Agent instructions', `${big.join(', ')} is over 32 KiB; Codex stops reading there and every host pays for it on every turn.`, 'Move detail into skills, rules or linked docs');
37
+ else add('instructions', 'pass', 'Agent instructions', `${instr.join(' and ')} present.`);
38
+ }
39
+
40
+ const found = detect(root);
41
+ const installedRows = [...inventory({ scope: 'user', home, cwd: root }), ...inventory({ scope: 'project', home, cwd: root })];
42
+ const installedNames = new Set(installedRows.map((r) => r.name));
43
+ if (!found.length) add('packs', 'pass', 'Packs for this stack', 'No language or framework detected that Kete Loom has a pack for.');
44
+ else {
45
+ const want = [...new Set(found.flatMap((d) => [...(d.skills || []), ...(d.agents || []), ...(d.rules || [])]))].filter((n) => ['skills', 'agents', 'rules'].some((k) => (catalog[k] || []).some((i) => i.dir === n)));
46
+ const missing = want.filter((n) => !installedNames.has(n));
47
+ const stack = found.map((d) => d.what).join(', ');
48
+ if (!missing.length) add('packs', 'pass', 'Packs for this stack', `Installed for ${stack}.`);
49
+ else add('packs', missing.length === want.length ? 'fail' : 'warn', 'Packs for this stack', `Detected ${stack}; missing ${missing.length} of ${want.length}: ${missing.slice(0, 8).join(', ')}${missing.length > 8 ? '…' : ''}.`, 'npx @ketecode/loom install --profile core (run it in this project)');
50
+ }
51
+
52
+ let commands = [];
53
+ try {
54
+ commands = JSON.parse(execFileSync(process.execPath, [DETECT_CHECKS, root], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 10000 })).checks || [];
55
+ } catch (e) {
56
+ // detect-checks exits 3 when it finds nothing; its JSON is still on stdout.
57
+ try {
58
+ commands = JSON.parse(e.stdout || '{}').checks || [];
59
+ } catch {
60
+ commands = [];
61
+ }
62
+ }
63
+ const kinds = new Set(commands.map((c) => c.kind));
64
+ if (!kinds.has('test')) add('verification', 'fail', 'Verification commands', 'No test command found, so agents can\'t prove a change works.', 'Add a test script (package.json "test", Makefile "test", pytest config…) and name it in AGENTS.md');
65
+ else if (!kinds.has('lint') && !kinds.has('typecheck')) add('verification', 'warn', 'Verification commands', `Tests found (${commands.find((c) => c.kind === 'test').command}), but no lint or type-check command.`, 'Add a lint or type-check script so agents catch mistakes before tests');
66
+ else add('verification', 'pass', 'Verification commands', commands.map((c) => c.command).join(', '));
67
+
68
+ const ci = ['.github/workflows', '.gitlab-ci.yml', '.circleci', 'azure-pipelines.yml', 'bitbucket-pipelines.yml', 'Jenkinsfile', '.buildkite'].filter(has);
69
+ if (ci.length) add('ci', 'pass', 'Continuous integration', `${ci.join(', ')}.`);
70
+ else add('ci', 'warn', 'Continuous integration', 'No CI configuration found, so nothing re-checks what agents push.', 'Add CI that runs the same build, lint and test commands (the github-actions-ci skill can set it up)');
71
+
72
+ const hooks = new Set(installedRows.filter((r) => r.kind === 'hooks').map((r) => r.name));
73
+ const safety = ['block-dangerous-commands', 'guard-secrets'];
74
+ const missingHooks = safety.filter((h) => !hooks.has(h));
75
+ if (!missingHooks.length) add('hooks', 'pass', 'Safety hooks', `${safety.join(' and ')} are installed.`);
76
+ else add('hooks', 'warn', 'Safety hooks', `Not installed: ${missingHooks.join(', ')}. Nothing stops an agent from running rm -rf ~ or writing a key into a file.`, `npx @ketecode/loom install --hook ${missingHooks.join(',')}`);
77
+
78
+ const tracked = (git(root, ['ls-files']) || '').split('\n').filter((f) => /(^|\/)\.env(\.[^/]*)?$/.test(f) && !/\.(example|sample|template|dist|defaults)$/.test(f));
79
+ const ignore = has('.gitignore') ? fs.readFileSync(path.join(root, '.gitignore'), 'utf8') : '';
80
+ if (tracked.length) add('secrets', 'fail', 'Secrets', `Committed environment files: ${tracked.join(', ')}. Anything in them is in git history.`, 'git rm --cached the files, add .env* to .gitignore, and rotate every secret they held');
81
+ else if (!/^\s*\/?\.env\*?\s*$|^\s*\.\*\s*$|^\s*\*\.env\s*$/m.test(ignore)) add('secrets', 'warn', 'Secrets', '.gitignore does not ignore .env files, so the next one created can be committed by accident.', 'Add .env and .env.* to .gitignore (keep .env.example tracked)');
82
+ else add('secrets', 'pass', 'Secrets', 'No environment files committed, and .gitignore covers them.');
83
+
84
+ if (has('package.json')) {
85
+ const locks = ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'bun.lock', 'bun.lockb', 'npm-shrinkwrap.json'].filter(has);
86
+ if (locks.length) add('lockfile', 'pass', 'Dependency lockfile', locks.join(', '));
87
+ else add('lockfile', 'warn', 'Dependency lockfile', 'package.json without a lockfile: agents and CI can resolve different dependency versions.', 'Run your package manager\'s install and commit the lockfile');
88
+ }
89
+
90
+ const weight = { pass: 1, warn: 0.5, fail: 0 };
91
+ const score = Math.round((checks.reduce((n, c) => n + weight[c.status], 0) / checks.length) * 100);
92
+ const order = { fail: 0, warn: 1, pass: 2 };
93
+ return { root, score, checks: checks.sort((a, b) => order[a.status] - order[b.status]) };
94
+ }
95
+
96
+ module.exports = { audit };