@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,86 @@
1
+ ---
2
+ name: gcp-patterns
3
+ description: Guides Google Cloud projects through service-account-based IAM without key files, choosing Cloud Run, GKE or Cloud Run functions, Cloud SQL connections through the Auth Proxy or connectors, Cloud Storage access control, Secret Manager, VPC and firewall basics, and the GCP billing gotchas such as idle GKE nodes, egress, and log ingestion. Use when deploying to or designing on Google Cloud, granting roles to a service account, picking a GCP runtime, or tracing an unexpected Google Cloud charge.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Live checks need the gcloud CLI authenticated to the target project. Infrastructure code may be Terraform or gcloud scripts.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: devops
9
+ kete-loom/risk: network
10
+ kete-loom/requires: "gcloud"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Google Cloud patterns
15
+
16
+ Run workloads on Google Cloud with one dedicated identity per service, no downloaded keys, private data stores and a bill you can explain. Terraform mechanics are in `terraform-patterns`, Kubernetes manifests in `kubernetes-patterns`, CI auth wiring in `github-actions-ci`.
17
+
18
+ ## Ground rules
19
+
20
+ 1. **One project per environment** (dev, staging, prod), grouped under folders in an organization. Projects are the blast-radius and billing boundary.
21
+ 2. **One user-managed service account per workload.** Never run services as the default Compute Engine service account; in older projects it may hold the broad Editor role.
22
+ 3. **No service account key files.** Workloads on Google Cloud get credentials from the metadata server automatically. CI uses Workload Identity Federation; GKE pods use Workload Identity Federation for GKE. If someone asks for a JSON key, **stop and ask** what it's for and offer federation first. Recommend the org policy `iam.disableServiceAccountKeyCreation`.
23
+ 4. **Predefined roles, granted at the narrowest resource.** Grant `roles/secretmanager.secretAccessor` on the one secret, `roles/storage.objectViewer` on the one bucket, not at project level. Never grant basic roles (Owner, Editor, Viewer) to workloads.
24
+ 5. **Secrets in Secret Manager**, mounted or exposed as env vars by Cloud Run / GKE from a pinned version or `latest` deliberately. Never in source, `app.yaml`, or build args.
25
+ 6. **Everything in IaC.** Console clicks are for exploring. Enable APIs (`gcloud services enable ...`) in code too.
26
+
27
+ ## Choosing compute
28
+
29
+ | Need | Pick | Watch out for |
30
+ |---|---|---|
31
+ | Stateless HTTP service or container, scale to zero | Cloud Run (service) | Request timeout limits; CPU is throttled outside requests under the default request-based billing, so background work needs instance-based billing (`--no-cpu-throttling`); set `max-instances` to cap cost and DB connections |
32
+ | Batch or run-to-completion container | Cloud Run jobs | Set task timeout and retries explicitly |
33
+ | Single function on an event (Pub/Sub, Storage, Eventarc) | Cloud Run functions (formerly Cloud Functions) | Same limits as Cloud Run; 1st gen is legacy, prefer the current generation |
34
+ | Many services, need Kubernetes APIs, daemons or GPUs on nodes | GKE (Autopilot first, Standard if you need node control) | Cluster fee plus node or pod cost; idle node pools on Standard |
35
+ | Legacy VM software | Compute Engine with a managed instance group | Use OS Login / IAP TCP forwarding, no public SSH |
36
+
37
+ Decision rule: default to Cloud Run. Move to GKE only when a concrete requirement (sidecars Cloud Run can't host, node-level access, very high steady load) is named.
38
+
39
+ ## Networking basics
40
+
41
+ 1. Use a custom-mode VPC with explicit subnets per region; don't build on the `default` network, whose firewall rules are broad.
42
+ 2. Firewall rules target service accounts or network tags, not "all instances". No `0.0.0.0/0` ingress except to a load balancer.
43
+ 3. Private Google Access on subnets so private VMs reach Google APIs without external IPs.
44
+ 4. Cloud Run reaches private resources (Cloud SQL private IP, Memorystore) through Direct VPC egress or a Serverless VPC Access connector.
45
+ 5. Outbound internet from private resources goes through Cloud NAT. Put public HTTP behind an external Application Load Balancer with Cloud Armor if the user needs WAF rules.
46
+
47
+ ## Data
48
+
49
+ - **Cloud SQL:** private IP, automated backups and point-in-time recovery on, high availability for production, deletion protection on. Connect through the Cloud SQL Auth Proxy or the language connector libraries (IAM-authorized, TLS) rather than allowlisting IPs. Prefer IAM database authentication where the engine supports it.
50
+ - **Cloud Storage:** uniform bucket-level access on; public access prevention enforced; object versioning or soft delete for data you can't regenerate; lifecycle rules for old objects. Give out signed URLs for temporary access, never `allUsers`.
51
+ - **Firestore / Spanner / BigQuery:** pick by access pattern; BigQuery bills by bytes scanned on on-demand pricing, so partition and cluster large tables and never `SELECT *` on them.
52
+
53
+ ## Cost traps
54
+
55
+ - GKE Standard node pools left at fixed size; GKE clusters for one tiny service.
56
+ - Cloud Run with `min-instances` > 0 or instance-based billing on services that are mostly idle.
57
+ - Internet and cross-region egress; Cloud NAT data processing.
58
+ - Cloud Logging ingestion from chatty debug logs; set exclusion filters and retention.
59
+ - BigQuery full-table scans; unattached persistent disks and old snapshots; static external IPs not in use.
60
+
61
+ Set a budget with alert thresholds on the billing account first.
62
+
63
+ ## Steps for a change
64
+
65
+ 1. Confirm the project ID and environment (`gcloud config get-value project`). If the active project is not the one the user means, **stop and ask**.
66
+ 2. Write the change in IaC; enable the APIs it needs in the same change.
67
+ 3. Validate: `terraform plan`; for gcloud scripts, `describe` the current state first, since most gcloud commands have no dry-run mode. For IAM, list what the change grants and to whom.
68
+ 4. **Stop and ask before** applying anything that deletes or recreates a database, bucket or disk, grants a basic role, makes a resource public, or targets production.
69
+ 5. After apply, verify the service's health endpoint, check `gcloud run services describe` (or equivalent) shows the intended service account, and confirm nothing became public.
70
+
71
+ ## Never
72
+
73
+ - Download a service account key "temporarily".
74
+ - Grant `roles/owner` or `roles/editor` to a service account or to `allAuthenticatedUsers`.
75
+ - Delete a project, bucket or Cloud SQL instance without the user confirming the exact name.
76
+
77
+ ## Review output
78
+
79
+ ```
80
+ GCP review: <project/env>
81
+ Critical: <public buckets, key files, basic roles on workloads>
82
+ High: <default SA in use, no backups, open firewall rules>
83
+ Cost: <each trap found>
84
+ Suggested IaC changes: <file: change>
85
+ Not checked: <what you had no access to>
86
+ ```
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Deploy this container to Cloud Run and give it a dedicated service account with minimal roles",
4
+ "How should our Cloud Run service connect to Cloud SQL Postgres on a private IP?",
5
+ "A teammate wants to download a JSON key for a GCP service account, is there a better way?",
6
+ "Cloud Run, GKE Autopilot or Cloud Run functions for a Pub/Sub event processor?",
7
+ "Our Google Cloud invoice is dominated by Cloud Logging ingestion and BigQuery scans"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Let our GitHub Actions workflow authenticate to Google Cloud with workload identity federation",
11
+ "Choose between Lambda and ECS Fargate for our API on AWS",
12
+ "Make our Azure Functions app read secrets from Key Vault with a managed identity",
13
+ "Write a BigQuery SQL query that finds the top ten customers by revenue",
14
+ "Tune the Helm chart values for our ingress controller"
15
+ ]
16
+ }
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: git-workflow
3
+ description: Everyday team git without an interactive editor - feature branches, choosing rebase or merge, resolving conflicts, tidying commits with fixup and autosquash, recovering lost commits through the reflog, and force-pushing with --force-with-lease so nobody's work is overwritten. Use when a branch has diverged, a rebase or merge hit conflicts, commits need squashing or rewording before review, work seems lost after a reset or bad rebase, or a rewritten branch must be pushed.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs git 2.23+ (switch/restore); --force-if-includes needs 2.30+ and --update-refs needs 2.38+.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: devops
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "git"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Git workflow
15
+
16
+ Keep history readable and never lose anyone's work. Every command here runs without opening an editor, so an agent can drive it.
17
+
18
+ ## 0. Look before you act
19
+
20
+ 1. Run `git status`, `git branch --show-current` and `git log --oneline --graph -15 --all`.
21
+ 2. Run `git fetch --prune` so you compare against the real remote.
22
+ 3. Find the base branch: `git symbolic-ref refs/remotes/origin/HEAD` (usually `origin/main`). If the project documents a different flow (release branches, `develop`), follow it.
23
+ 4. If the working tree has uncommitted changes, **stop and ask** whether to commit them, stash them (`git stash push -u -m "<why>"`) or leave the task.
24
+ 5. Before any history rewrite, create a safety ref: `git branch backup/<branch>-$(date +%Y%m%d%H%M%S)`. Delete it only after the user confirms the result.
25
+
26
+ ## 1. Branching
27
+
28
+ - One branch per change, cut from an up-to-date base: `git switch -c <type>/<short-topic> --no-track origin/main`. Without `--no-track` the new branch tracks `origin/main`, so a bare `git push` or `git pull` targets main. Publish it with `git push -u origin <branch>`.
29
+ - Name branches by intent (`fix/login-timeout`, `feat/export-csv`), not by person.
30
+ - Keep branches short-lived. If a branch is more than a few days behind, integrate the base (section 2) before adding more work.
31
+ - Never commit straight to the default branch unless the project explicitly works that way.
32
+
33
+ ## 2. Rebase or merge?
34
+
35
+ | Situation | Do |
36
+ |---|---|
37
+ | Your own unshared feature branch is behind main | `git rebase origin/main` |
38
+ | Branch is shared and others have pushed to it | `git merge origin/main` (never rewrite shared history) |
39
+ | Integrating a finished branch into main | Follow the repo's PR setting (squash, rebase or merge commit). Don't override it locally. |
40
+ | Long-running release branch | Merge, so the history of what shipped stays intact |
41
+ | Stacked branches (B built on A) | `git rebase --update-refs origin/main` from the top branch moves the whole stack |
42
+
43
+ To check whether a branch is shared: `git log --format='%an' origin/main..origin/<branch> | sort -u`. More than one author means merge, or ask first.
44
+
45
+ Set `git config pull.rebase true` only if the team agrees; otherwise use explicit `git fetch` plus rebase or merge.
46
+
47
+ ## 3. Resolving conflicts
48
+
49
+ 1. List conflicted files: `git diff --name-only --diff-filter=U`.
50
+ 2. For each file, read both sides and the intent of each change (`git log --oneline -3 -- <file>` on each side). Resolve by meaning, not by picking a side wholesale.
51
+ 3. During a **rebase**, "ours" is the branch you are rebasing onto and "theirs" is your commit being replayed. That is the opposite of a merge. Use `git checkout --ours|--theirs <file>` only when one side should win entirely.
52
+ 4. Lockfiles and generated files: take the base version, then regenerate with the project's tool (for example reinstall dependencies) instead of hand-merging.
53
+ 5. Remove every conflict marker. Check: `git diff --check` and search for `^<<<<<<<|^>>>>>>>`.
54
+ 6. Build and run the tests before continuing.
55
+ 7. `git add <file>` then `git rebase --continue` (or `git commit --no-edit` for a merge). Use `GIT_EDITOR=true git rebase --continue` to accept the existing message without an editor.
56
+ 8. If the conflict is in code you don't understand, or both sides changed behaviour, **stop and ask** the user. To back out cleanly: `git rebase --abort` or `git merge --abort`.
57
+
58
+ Turn on `git config rerere.enabled true` for repeated conflicts while rebasing long branches.
59
+
60
+ ## 4. Cleaning up history without an editor
61
+
62
+ Only on commits that are not yet on a shared branch.
63
+
64
+ - **Fix an earlier commit:** stage the fix, `git commit --fixup=<sha>`, then
65
+ `GIT_SEQUENCE_EDITOR=true git rebase -i --autosquash origin/main`.
66
+ Setting the sequence editor to `true` accepts the generated todo list, so nothing interactive opens.
67
+ - **Reword the last commit:** `git commit --amend -m "<new message>"`.
68
+ - **Reword an older commit:** `git commit --allow-empty -m "amend! <exact original subject>" -m "<new full message>"`, then the autosquash command above. (`--fixup=reword:` does the same but opens an editor.)
69
+ - **Squash the whole branch into one commit:** `git reset --soft $(git merge-base HEAD origin/main)` then `git commit -m "<message>"`.
70
+ - **Split the last commit:** `git reset HEAD~1`, then stage and commit each piece by path (`git add <path>`; `git add -p` is interactive).
71
+ - **Drop a commit from the branch:** `git rebase --onto <sha>^ <sha>` (removes `<sha>`, keeps the rest).
72
+ - **Undo a commit already on a shared branch:** `git revert <sha>`. Never rewrite it.
73
+
74
+ After any rewrite, compare the result: `git diff backup/<branch>-<stamp> HEAD` should be empty when you only reshaped commits on the same base. If you also rebased onto a newer base, compare `git range-diff <old-base>..backup/<branch>-<stamp> <new-base>..HEAD` instead.
75
+
76
+ ## 5. Recovering lost work
77
+
78
+ Nothing committed is gone until garbage collection. By default the reflog keeps entries for commits no longer on any branch for 30 days (`gc.reflogExpireUnreachable`), and 90 days for the rest.
79
+
80
+ 1. `git reflog -30` (or `git reflog show <branch>`) to find the commit before the mistake, such as the entry before `rebase (start)` or `reset: moving to`.
81
+ 2. Inspect it: `git show --stat <sha>`.
82
+ 3. Restore without destroying anything: `git branch rescue/<topic> <sha>`. Only after the user agrees, move the branch: `git reset --hard <sha>`.
83
+ 4. Lost stash: `git fsck --no-reflogs --unreachable | grep commit`, then `git show <sha>` to find it, and `git stash apply <sha>`.
84
+ 5. Unstaged changes discarded with `git checkout -- .`, `git restore .` or `git reset --hard` are **not** recoverable by git. Say so plainly; check the editor's local history instead. Changes that had been staged survive as dangling blobs: `git fsck --lost-found` writes them to `.git/lost-found/other/` for inspection.
85
+
86
+ ## 6. Pushing rewritten branches safely
87
+
88
+ 1. Push: `git push --force-with-lease --force-if-includes origin <branch>`.
89
+ - `--force-with-lease` refuses if the remote moved since your last fetch.
90
+ - `--force-if-includes` also refuses if a background fetch updated the remote ref but you never integrated those commits.
91
+ 2. If the push is rejected, **do not** retry with `--force`. Fetch, inspect `git log HEAD..origin/<branch>`, integrate the new commits, and push again.
92
+ 3. Never force-push `main`, `master`, release branches or any protected branch. If one seems to need it, stop and ask.
93
+ 4. Tell collaborators on the branch that it was rewritten; they should `git fetch` and `git rebase origin/<branch>` or reset onto it.
94
+
95
+ ## Never
96
+
97
+ - Never run `git reset --hard`, `git clean -fd`, `git checkout -- .` or `git stash drop` on work the user hasn't confirmed is disposable.
98
+ - Never use plain `git push --force`.
99
+ - Never rewrite commits that exist on a shared or protected branch.
100
+ - Never resolve a conflict by deleting the other side's change without understanding it.
101
+ - Never bypass hooks with `--no-verify` unless the user asks.
102
+
103
+ ## Report back
104
+
105
+ End with:
106
+
107
+ ```
108
+ Branch: <name> (base <base>, ahead N / behind M)
109
+ Did: <rebase | merge | cleanup | recovery | push>
110
+ Conflicts: <files and how each was resolved, or none>
111
+ Safety ref: <backup branch name, or none>
112
+ Checks: <build/test command and result>
113
+ Next: <what the user or collaborators must do>
114
+ ```
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "My feature branch is 40 commits behind main and the rebase stopped with conflicts in three files, help me get through it",
4
+ "I did git reset --hard by mistake and my last two commits are gone, can we get them back?",
5
+ "Squash the fixup commits on this branch into the commits they belong to before I ask for review",
6
+ "Should I rebase or merge main into my branch? Two of us have been pushing to it",
7
+ "I rewrote my branch history locally, how do I push it without clobbering my teammate's commits?"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Write a commit message for these staged changes using feat/fix prefixes",
11
+ "Cut version 2.4.0, update the changelog and tag the release",
12
+ "Set up a GitHub Actions job that runs the tests on every pull request",
13
+ "Write a description for my pull request summarising the changes",
14
+ "Review the diff on this branch for bugs before I merge"
15
+ ]
16
+ }
@@ -0,0 +1,117 @@
1
+ ---
2
+ name: github-actions-ci
3
+ description: Writes, hardens and debugs GitHub Actions workflows under .github/workflows, including triggers and job structure, dependency caching, build matrices, reusable workflows and composite actions, keyless OIDC login to AWS, Google Cloud and Azure, least-privilege GITHUB_TOKEN permissions, SHA-pinned third-party actions, and diagnosing red runs from their logs. Use when creating or editing a GitHub Actions workflow YAML, speeding up a slow pipeline, removing stored cloud keys from CI, or figuring out why a GitHub Actions job failed.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Reading run logs and re-running jobs needs the GitHub CLI (gh) authenticated to the repository.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: devops
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "git, gh"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # GitHub Actions CI
15
+
16
+ Make workflows that are fast, give every job only the permissions it needs, never store long-lived cloud keys, and fail with logs you can act on. Release rollout strategy lives in `deployment-strategies`; versioning and changelogs in `release-management`; the cloud-side roles in `aws-patterns`, `gcp-patterns` and `azure-patterns`.
17
+
18
+ ## Ground rules
19
+
20
+ 1. **Set `permissions` explicitly.** At the top of every workflow put `permissions: contents: read`, then widen per job only where needed (`pull-requests: write`, `id-token: write`, `packages: write`). Don't rely on the repository default.
21
+ 2. **Pin third-party actions to a full commit SHA**, with the version in a comment: `uses: some-org/some-action@<40-char-sha> # v2.3.1`. Tags can be moved; SHAs can't. Let Dependabot or Renovate (`package-ecosystem: github-actions`) keep pins current. Actions owned by `actions/` and your own org may use tags if the team's policy allows, but SHAs are still safer.
22
+ 3. **No cloud access keys in secrets.** Use OIDC (below). Secrets that must exist (API tokens for third parties) live in environment secrets with required reviewers for production.
23
+ 4. **Never interpolate untrusted input into `run:`.** `${{ github.event.pull_request.title }}`, branch names, issue bodies and commit messages are attacker-controlled. Pass them through `env:` and quote the shell variable.
24
+ 5. **Treat `pull_request_target` and `workflow_run` as privileged.** They run with secrets and a write token. Never check out and run the PR's code in them. Use plain `pull_request` for building and testing contributions.
25
+ 6. **Bound every job:** `timeout-minutes` on each job (the default is hours), and `concurrency` so a new push cancels stale runs of the same branch.
26
+
27
+ ## Workflow skeleton
28
+
29
+ ```yaml
30
+ name: ci
31
+ on:
32
+ pull_request:
33
+ push:
34
+ branches: [main]
35
+ permissions:
36
+ contents: read
37
+ concurrency:
38
+ group: ${{ github.workflow }}-${{ github.ref }}
39
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
40
+ jobs:
41
+ test:
42
+ runs-on: ubuntu-latest
43
+ timeout-minutes: 15
44
+ strategy:
45
+ fail-fast: false
46
+ matrix:
47
+ node: [20, 22]
48
+ steps:
49
+ - uses: actions/checkout@<sha> # vN
50
+ with:
51
+ persist-credentials: false
52
+ - uses: actions/setup-node@<sha> # vN
53
+ with:
54
+ node-version: ${{ matrix.node }}
55
+ cache: npm
56
+ - run: npm ci
57
+ - run: npm test
58
+ ```
59
+
60
+ Adapt the setup action and commands to the project's language. Find the real test and build commands in the README, `package.json`, `Makefile` or equivalent before writing them.
61
+
62
+ ## Caching
63
+
64
+ 1. Prefer the setup action's built-in cache (`cache: npm | pip | gradle | maven`, Go and others have their own) over hand-written cache steps.
65
+ 2. With `actions/cache`, key on the OS plus a hash of the lockfile: `key: ${{ runner.os }}-deps-${{ hashFiles('**/package-lock.json') }}` and a `restore-keys` prefix for partial hits.
66
+ 3. Cache dependency downloads, not build outputs that hide stale-code bugs. Never cache anything containing secrets.
67
+ 4. For Docker builds use BuildKit cache (`cache-from` / `cache-to` with `type=gha`) in the build action.
68
+
69
+ ## Matrices and reuse
70
+
71
+ - `strategy.matrix` for versions and OSes; `include` / `exclude` to trim combinations; `fail-fast: false` when you need every result. Keep matrices small: each cell is a billed job.
72
+ - **Reusable workflows** (`on: workflow_call` with typed `inputs` and declared `secrets`) for whole pipelines shared across repos. Call with `uses: org/repo/.github/workflows/build.yml@<sha-or-tag>`. Pass only the secrets the callee needs; use `secrets: inherit` only within the same trust boundary.
73
+ - **Composite actions** (`action.yml` with `runs: using: composite`) for a few repeated steps inside jobs.
74
+ - Pass data between jobs with `outputs` (small values) or artifacts (files). Don't rebuild the same artifact in a deploy job: build once, deploy that artifact.
75
+
76
+ ## OIDC to clouds (no stored keys)
77
+
78
+ The job needs `permissions: id-token: write` (plus `contents: read`). The cloud must trust GitHub's issuer `https://token.actions.githubusercontent.com` and restrict the token's `sub` claim to this repo and, for deploys, to a branch or environment (for example `repo:org/app:environment:production`).
79
+
80
+ | Cloud | Action | Inputs | Cloud side |
81
+ |---|---|---|---|
82
+ | AWS | `aws-actions/configure-aws-credentials` | `role-to-assume`, `aws-region` | IAM OIDC provider + role trust policy with `aud` = `sts.amazonaws.com` and a `sub` condition |
83
+ | Google Cloud | `google-github-actions/auth` | `workload_identity_provider`, `service_account` | Workload Identity pool + provider with an attribute condition on `assertion.repository`, then `roles/iam.workloadIdentityUser` on the service account |
84
+ | Azure | `azure/login` | `client-id`, `tenant-id`, `subscription-id` | Federated credential on an app registration or user-assigned managed identity, subject matching the branch or environment |
85
+
86
+ Never accept a trust condition that allows any repository or any branch to assume a production role. If the user asks for one, **stop and explain** why first.
87
+
88
+ ## Debugging a failed run
89
+
90
+ 1. Get the failure: `gh run list --workflow <name> --limit 5`, then `gh run view <run-id> --log-failed`. Read the first error, not the last line.
91
+ 2. Classify it:
92
+ - **Code or test failure:** reproduce locally with the same command and versions as the matrix cell.
93
+ - **Environment drift:** `ubuntu-latest` moved, a tool version changed, a cache restored stale content. Pin the version or bump the cache key.
94
+ - **Permissions:** `Resource not accessible by integration` or 403 means the job's `permissions` block lacks a scope. Add only that scope to that job.
95
+ - **OIDC:** `Not authorized to perform sts:AssumeRoleWithWebIdentity` or similar means the `sub`/`aud` condition doesn't match. Compare the condition with the run's ref or environment.
96
+ - **Secret empty or missing:** runs from forked-repo pull requests get no secrets (except `GITHUB_TOKEN`, read-only). Don't switch to `pull_request_target` to get them; move the secret-needing step to a post-merge workflow.
97
+ - **Workflow never started:** events caused by `GITHUB_TOKEN` (a push or PR opened by another workflow) don't start new runs, except `workflow_dispatch` and `repository_dispatch`. Check the `on:` filters (`branches`, `paths`) too.
98
+ - **Flaky:** passes on `gh run rerun <run-id> --failed` with no change. Report it as flaky; don't paper over it with retries without telling the user.
99
+ 3. For more detail, re-run with debug logging (the UI option, or set the repository secret or variable `ACTIONS_STEP_DEBUG` to `true`; `ACTIONS_RUNNER_DEBUG` adds runner diagnostics).
100
+ 4. Lint workflows with `actionlint` if available before pushing.
101
+
102
+ ## Never
103
+
104
+ - Use `permissions: write-all`, or leave a deploy job without an `environment` protection rule.
105
+ - Echo secrets, or write them to files that get uploaded as artifacts.
106
+ - Add `continue-on-error: true` to hide a failing step.
107
+ - Push workflow changes to the default branch without the user seeing the diff.
108
+
109
+ ## Report format (reviews and fixes)
110
+
111
+ ```
112
+ Workflow: <file>
113
+ Findings: <severity> <line> <issue> -> <fix>
114
+ Changed: <what you edited>
115
+ Verified: <run id or local command and result>
116
+ Still open: <anything you could not verify>
117
+ ```
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Add a GitHub Actions workflow that runs our tests on Node 20 and 22 on every pull request",
4
+ "Our CI keeps reinstalling dependencies every run, add caching to the workflow",
5
+ "Replace the AWS_ACCESS_KEY_ID secret in our deploy workflow with OIDC",
6
+ "Why does this Actions job fail with Resource not accessible by integration?",
7
+ "Harden our workflows: pin third-party actions to SHAs and restrict GITHUB_TOKEN permissions"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Plan how to roll out the new payments service gradually with a canary and rollback",
11
+ "Write conventional commit messages for these staged changes",
12
+ "Cut a release, bump the version and generate the changelog",
13
+ "Write a multi-stage Dockerfile for our Go service",
14
+ "Set up least-privilege IAM for an S3 bucket our app reads from"
15
+ ]
16
+ }
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: github-api-automation
3
+ description: Scripts and services that drive GitHub through the gh CLI, the REST and GraphQL APIs or a GitHub App, covering the choice between fine-grained tokens and app installation tokens, JWT-to-installation-token exchange, Link-header and cursor pagination, primary and secondary rate limits, X-Hub-Signature-256 webhook verification, and the Actions REST endpoints for dispatching, re-running and reading workflow runs. Use when writing a bot, sync job or webhook receiver that calls the GitHub API, choosing between a PAT and a GitHub App, or debugging 403 rate-limit or signature failures from GitHub.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Live calls need network access to api.github.com (or a GitHub Enterprise Server host). Examples use the gh CLI and plain HTTP; the rules apply to Octokit and other SDKs.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: integrations
9
+ kete-loom/risk: network
10
+ kete-loom/requires: "gh"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # GitHub API automation
15
+
16
+ Build GitHub automation that uses the least-privileged credential, pages through every result, backs off before GitHub bans it, and trusts a webhook only after its signature checks out. Writing workflow YAML under `.github/workflows` is a different job; this skill is about calling GitHub from code or the shell.
17
+
18
+ ## Ground rules
19
+
20
+ 1. **Least privilege.** Ask for the narrowest repository access and permissions that do the job. Never use a classic PAT with `repo` scope for a shared service.
21
+ 2. **Secrets from the environment** (`GH_TOKEN`, app private key, webhook secret). Never commit them, log them or pass them on a command line other processes can read.
22
+ 3. **Pin the API version** with `X-GitHub-Api-Version`. Supported values are `2022-11-28` (the default when the header is omitted) and `2026-03-10`. Also send `Accept: application/vnd.github+json` and a `User-Agent`.
23
+ 4. **Read before you write.** Dry-run bulk changes (labels, branch protection, repo settings) by printing the planned calls first.
24
+ 5. **Webhooks are verified, deduplicated and acknowledged fast.**
25
+
26
+ ## Choose the credential
27
+
28
+ | Situation | Use |
29
+ |---|---|
30
+ | One-off script on your own machine | `gh auth login`, then `gh api` |
31
+ | Personal automation on a few repos | Fine-grained PAT scoped to those repos, with an expiry |
32
+ | Inside a GitHub Actions job | The job's `GITHUB_TOKEN`, with `permissions:` set in the workflow |
33
+ | Bot or service acting for an org, or across many orgs | GitHub App with an installation token |
34
+ | Acting as the signed-in user in your web app | GitHub App user access token (OAuth flow), not an OAuth App, unless you need something only OAuth Apps support |
35
+
36
+ Stop and ask the user before choosing a credential that will be shared by a team or deployed to production, and before requesting any `administration`, `secrets` or org-level write permission.
37
+
38
+ ## GitHub App auth
39
+
40
+ 1. Create the app with only the permissions and events it needs. Store the private key (PEM) as a secret.
41
+ 2. Sign a JWT with RS256: `iat` about 60 seconds in the past (clock drift), `exp` no more than 10 minutes ahead, `iss` set to the app's client ID (or app ID).
42
+ 3. Find the installation: `GET /repos/{owner}/{repo}/installation` or `GET /app/installations` with the JWT.
43
+ 4. Exchange: `POST /app/installations/{installation_id}/access_tokens`, optionally with `repositories` and `permissions` to narrow it further. The token lasts one hour; cache it and refresh a few minutes before `expires_at`.
44
+ 5. Call the API with `Authorization: Bearer <installation token>`. Never send the JWT to anything other than the `/app` endpoints.
45
+
46
+ ## Pagination
47
+
48
+ - REST: request `per_page=100` (the maximum on most endpoints) and follow the `Link` header's `rel="next"` URL until it is absent. Never build page numbers yourself on endpoints that return cursor links.
49
+ - `gh api --paginate repos/{owner}/{repo}/issues` follows links for you; add `--slurp` to merge pages into one JSON array before piping to `jq`.
50
+ - GraphQL: request `first: 100` (1 to 100 allowed) with `pageInfo { hasNextPage endCursor }`, then pass `endCursor` as `after`. `gh api graphql --paginate` works when the query takes a `$endCursor` variable.
51
+ - Use the search API only for searching; it has its own lower rate limit and caps results at 1,000 per query.
52
+
53
+ ## Rate limits
54
+
55
+ Primary limits per hour (check the docs, they change): unauthenticated 60; PAT or user token 5,000; app installation starts at 5,000 and scales to 12,500 (15,000 on Enterprise Cloud); `GITHUB_TOKEN` 1,000 per repo. GraphQL is budgeted separately in points.
56
+
57
+ Secondary limits apply on top: at most 100 concurrent requests, a points-per-minute budget per endpoint (writes cost more than reads), and about 80 content-creating requests per minute.
58
+
59
+ Rules:
60
+
61
+ 1. Read `x-ratelimit-remaining` and `x-ratelimit-reset` (epoch seconds) on every response. `GET /rate_limit` shows the buckets.
62
+ 2. On 403 or 429: if `retry-after` is present, wait that many seconds; else if `x-ratelimit-remaining` is `0`, wait until `x-ratelimit-reset`; else wait at least one minute. Then back off exponentially and give up after a fixed number of attempts.
63
+ 3. Make writes serially, not in parallel. Prefer conditional requests (`If-None-Match` with the stored `ETag`; a 304 does not count against the primary limit when authorised).
64
+ 4. Prefer webhooks to polling.
65
+
66
+ ## Webhooks
67
+
68
+ 1. Set a random secret on the webhook or app. Verify `X-Hub-Signature-256`: it is `sha256=` plus the hex HMAC-SHA256 of the **raw** body with that secret. Compute it before any JSON parsing and compare with a constant-time function. Reject with 401 on mismatch. Never fall back to the legacy SHA-1 `X-Hub-Signature`.
69
+ 2. Respond `2xx` within 10 seconds; queue the real work.
70
+ 3. Deduplicate on `X-GitHub-Delivery` (a GUID per delivery; redeliveries reuse it). Route on `X-GitHub-Event` plus the payload's `action`.
71
+ 4. GitHub does not retry failed deliveries automatically. To recover, list failed deliveries (`GET /app/hook/deliveries` for an app, or the repo/org hook deliveries endpoint) and redeliver them.
72
+ 5. Ignore events from your own bot (check `sender.type == "Bot"` and the login) to avoid loops.
73
+ 6. Local testing: `gh webhook forward --repo=OWNER/REPO --events=issues --url=http://localhost:3000/webhook` (a gh extension, `cli/gh-webhook`) or a smee.io channel.
74
+
75
+ ## Actions API
76
+
77
+ | Task | Call |
78
+ |---|---|
79
+ | Start a workflow with inputs | `POST /repos/{owner}/{repo}/actions/workflows/{workflow_id or file name}/dispatches` with `ref` and `inputs`; the workflow must declare `workflow_dispatch`. `gh workflow run deploy.yml -f env=staging` |
80
+ | List or watch runs | `GET /repos/{owner}/{repo}/actions/runs?branch=&status=`; `gh run list`, `gh run watch <id>` |
81
+ | Re-run | `POST .../actions/runs/{run_id}/rerun` or `.../rerun-failed-jobs`; `gh run rerun <id> --failed` |
82
+ | Cancel | `POST .../actions/runs/{run_id}/cancel` |
83
+ | Logs | `GET .../actions/runs/{run_id}/logs` returns a redirect to a zip; `gh run view <id> --log-failed` |
84
+ | Artifacts | `GET .../actions/runs/{run_id}/artifacts`; `gh run download <id>` |
85
+ | Secrets | Encrypt with the repo public key (`GET .../actions/secrets/public-key`, libsodium sealed box) before `PUT`; or `gh secret set NAME` |
86
+
87
+ By default a dispatch returns `204` with no body. Send `"return_run_details": true` in the body to get `200` with the new run's details (added February 2026; `gh` 2.87.0+ does this by default); check the REST reference for the field names. On GitHub Enterprise Server versions without it, list runs for that workflow and ref created after your request time, or pass a correlation ID as an input and match it in `run-name`.
88
+
89
+ ## Reviewing existing automation
90
+
91
+ Look for: a classic PAT or admin token where an app or `GITHUB_TOKEN` would do; tokens in logs or URLs; only the first page read; parallel write loops with no backoff; retries on 403 that ignore `retry-after`; webhook handlers that parse JSON before verifying, use `==` to compare signatures, or skip verification when the header is missing; no dedupe on `X-GitHub-Delivery`; bots that react to their own events.
92
+
93
+ ## Stop and ask the user
94
+
95
+ - Before any bulk write across many repositories (settings, branch protection, deleting branches, archiving).
96
+ - Before creating or rotating secrets, deploy keys or app private keys.
97
+ - Before granting an app org-wide installation instead of selected repositories.
98
+
99
+ ## Before you finish
100
+
101
+ Test with a throwaway repository: run the job twice (idempotent), force a page boundary (more than 100 items), send a webhook with a wrong signature (rejected), redeliver a webhook (processed once), and check the rate-limit headers in a log line. GitHub's REST and GraphQL docs at docs.github.com are the final word on endpoints and limits.
@@ -0,0 +1,17 @@
1
+ {
2
+ "should_trigger": [
3
+ "Write a script that uses gh api to add a label to every open issue across our org's repos",
4
+ "Should our PR bot use a fine-grained personal access token or a GitHub App installation token?",
5
+ "Our GitHub webhook receiver needs to verify X-Hub-Signature-256 before processing push events",
6
+ "The sync job hits 403 secondary rate limit errors from api.github.com, how do I back off properly?",
7
+ "Trigger a workflow_dispatch run from our deploy service through the REST API and wait for it to finish",
8
+ "Fetch every pull request with its review comments via the GraphQL API using cursor pagination"
9
+ ],
10
+ "should_not_trigger": [
11
+ "Add a GitHub Actions workflow that lints and tests on every pull request",
12
+ "Speed up the dependency cache step in our .github/workflows/test.yml",
13
+ "Create a Jira issue automatically when a build fails",
14
+ "Post a message to a Slack channel when a deploy finishes",
15
+ "Sync our Linear issues into a weekly report"
16
+ ]
17
+ }
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: go-patterns
3
+ description: Idiomatic Go for writing and restructuring code, covering package layout, error wrapping with %w and errors.Is/As, small consumer-side interfaces, context.Context propagation, goroutine and channel patterns that do not leak or race, Go modules hygiene, and golangci-lint setup. Use when writing new Go code, designing a Go package or service, choosing between channels and mutexes, or asking how a Go project should be structured.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs the go toolchain; golangci-lint is optional.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: coding
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "go"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Go patterns
15
+
16
+ Write Go that reads like the standard library: plain, explicit, and boring on purpose. Follow the project's existing conventions first; these rules fill the gaps.
17
+
18
+ ## 0. Before you write
19
+
20
+ 1. Read `go.mod` for the module path and the `go` directive. Do not use language or library features newer than that version.
21
+ 2. Check for `.golangci.yml` / `.golangci.yaml`, a `Makefile` or CI workflow, and use the lint and test commands they define.
22
+ 3. Search the codebase for an existing helper, error type or interface before adding a new one.
23
+
24
+ ## 1. Package layout
25
+
26
+ - One package per directory, named for what it provides (`invoice`, not `utils`, `common` or `helpers`). Package names are short, lower case, no underscores.
27
+ - `cmd/<binary>/main.go` for each executable; keep `main` thin (parse config, wire dependencies, call `run(ctx) error`).
28
+ - `internal/` for code other modules must not import. Prefer it by default for application code.
29
+ - Do not create `pkg/`, `models/` or layer-per-folder trees unless the project already uses them. Start flat; split a package when it has two clearly separate jobs.
30
+ - Avoid stutter: `invoice.New`, not `invoice.NewInvoice`; `http.Client`, not `http.HTTPClient`.
31
+ - No package-level mutable state except where unavoidable (registered metrics, `flag`). Pass dependencies in.
32
+
33
+ ## 2. Errors
34
+
35
+ - Return `error` as the last result. Check it immediately; never assign it to `_` without a comment saying why it is safe.
36
+ - Add context when you return: `fmt.Errorf("load invoice %s: %w", id, err)`. Lower case, no trailing punctuation, no "failed to" prefix chains.
37
+ - Use `%w` only when callers may need to inspect the cause. Use `%v` when the cause is an implementation detail you do not want in your API.
38
+ - Inspect with `errors.Is(err, ErrNotFound)` and `errors.As(err, &target)`. Never compare `err.Error()` strings, and never use `==` on a possibly wrapped error.
39
+ - Sentinel errors: `var ErrNotFound = errors.New("invoice: not found")`. Custom types when callers need fields (`*ValidationError{Field string}`).
40
+ - Combine independent failures (for example several `Close` calls) with `errors.Join`.
41
+ - Handle an error once: either log it or return it, not both.
42
+ - `panic` only for programmer errors that cannot happen in correct code. Never panic across a package boundary for expected failures.
43
+
44
+ ## 3. Interfaces
45
+
46
+ - Define interfaces where they are **used**, not where they are implemented. Keep them to the one or two methods the consumer needs.
47
+ - Functions accept interfaces and return concrete types (`func NewStore(db *sql.DB) *Store`).
48
+ - Do not create an interface for a single implementation "for mocking later". Add it when a second implementation or a test fake needs it.
49
+ - Assert compliance at compile time when it matters: `var _ io.Reader = (*Decoder)(nil)`.
50
+ - A nil pointer stored in an interface is not a nil interface. Return a literal `nil` for "no error", never a typed nil `*MyError`.
51
+
52
+ ## 4. Context
53
+
54
+ - `ctx context.Context` is the first parameter of anything that does I/O, blocks, or calls something that does. Name it `ctx`.
55
+ - Pass the caller's context down. Never store a context in a struct, and never pass `nil` (use `context.TODO()` while wiring).
56
+ - `context.Background()` belongs in `main`, tests and top-level goroutines that outlive a request, nowhere else.
57
+ - Every `WithCancel`, `WithTimeout`, `WithDeadline` is followed by `defer cancel()`.
58
+ - Context values carry request-scoped data only (trace IDs, auth principal) under an unexported key type. Never pass optional parameters through them.
59
+ - Long loops and blocking selects check `ctx.Done()` and return `ctx.Err()`.
60
+
61
+ ## 5. Goroutines and channels
62
+
63
+ Rule: **every goroutine you start has a clear owner, a way to stop, and someone who waits for it.**
64
+
65
+ - Use `sync.WaitGroup` or `golang.org/x/sync/errgroup` to wait. Call `wg.Add` before the `go` statement, never inside the goroutine; on Go 1.25+ `wg.Go(func() { ... })` does both. With errgroup, use `errgroup.WithContext` so the first error cancels the rest, and `g.SetLimit(n)` to bound concurrency.
66
+ - A goroutine that sends on a channel must be able to exit if nobody receives: select on `ctx.Done()` too, or use a buffered channel sized to the number of sends.
67
+ - The sender closes a channel, never the receiver. Close once. Ranging over a channel ends only when it is closed.
68
+ - Prefer a `sync.Mutex` guarding a field over a channel when you only protect shared state. Use channels to hand off ownership or signal events.
69
+ - Keep the mutex next to the fields it guards and document which ones. Do not copy a struct containing a mutex (pass a pointer).
70
+ - `time.After` in a hot loop allocates a timer per iteration; use a `time.Ticker` or a reused `time.NewTimer`. Before Go 1.23 an unstopped timer or ticker was not collected until it fired, so always `Stop` them on older modules.
71
+ - Never start goroutines in `init` or in a library constructor without a `Close`/`Stop` method.
72
+
73
+ Worked patterns (worker pool, fan-out with errgroup, pipeline with cancellation, graceful HTTP shutdown) are in `references/concurrency.md`. Read it before writing any of those shapes.
74
+
75
+ ## 6. Modules and dependencies
76
+
77
+ - Add a dependency with `go get example.com/mod@vX.Y.Z`, then `go mod tidy`. Commit `go.mod` and `go.sum` together.
78
+ - Prefer the standard library. Check whether `net/http`, `log/slog`, `encoding/json`, `slices`, `maps` already do the job before adding a package.
79
+ - `replace` directives are for local development or a temporary fork. Do not commit a `replace` pointing at a local path unless the repo already does.
80
+ - Use `go.work` for multi-module local work; do not commit it unless the repo already does.
81
+
82
+ ## 7. Style details that matter
83
+
84
+ - `gofmt` (or `goimports`) every file. Unformatted Go is a defect.
85
+ - Zero values should be useful: `var buf bytes.Buffer` works without a constructor; design your types the same way where you can.
86
+ - Slices: `append` may reuse the backing array. When you return or store a subslice the caller might append to, copy it (`slices.Clone`) or use a full slice expression `s[lo:hi:hi]`.
87
+ - Maps are not safe for concurrent writes. Guard them or use `sync.Map` only for its documented cases.
88
+ - `defer f.Close()` on a file you wrote to loses the write error; check the `Close` error for writers.
89
+ - Use `log/slog` for structured logging if the project has no logger yet.
90
+ - Exported identifiers get a doc comment that starts with the identifier's name.
91
+
92
+ ## 8. Lint and verify
93
+
94
+ Run, in order, and fix what they report in code you touched:
95
+
96
+ 1. `gofmt -l .` (must print nothing) or the project's format command.
97
+ 2. `go vet ./...`
98
+ 3. `golangci-lint run ./...` if the project has a config or the user wants it. For a new config, keep `linters.default: standard` (errcheck, govet, ineffassign, staticcheck, unused) and enable extras such as `errorlint`, `bodyclose` and `contextcheck` only as needed. golangci-lint v2 configs begin with `version: "2"`; run `golangci-lint migrate` to convert a v1 file.
99
+ 4. `go test -race ./...`
100
+
101
+ Do not silence a linter with `//nolint` unless you name the linter and give the reason: `//nolint:errcheck // best-effort cleanup`.
102
+
103
+ ## Stop and ask the user
104
+
105
+ - Before restructuring packages or moving files across `internal/` boundaries.
106
+ - Before adding a third-party dependency for something the standard library covers.
107
+ - Before changing an exported API (signature, error values) that other modules may import.
108
+
109
+ ## Never
110
+
111
+ - Ignore an error silently, or `log.Fatal` outside `main`.
112
+ - Start a goroutine with no way to stop it.
113
+ - Use `interface{}`/`any` where a concrete type or a generic type parameter would do.
114
+ - Add generics for code that only has one type today.
115
+
116
+ ## Report back
117
+
118
+ End with: files changed, the format/vet/lint/test commands you ran and their results, and anything you chose not to change.
@@ -0,0 +1,17 @@
1
+ {
2
+ "should_trigger": [
3
+ "How should I lay out the packages for a new Go HTTP service with a CLI and a worker?",
4
+ "Write a Go function that fetches 200 URLs concurrently, at most 10 at a time, and stops on the first error",
5
+ "Should I wrap this error with %w or %v, and how do callers check for ErrNotFound in Go?",
6
+ "Design a small interface in my Go code so the billing package doesn't depend on the postgres store",
7
+ "Set up golangci-lint for our Go repo and fix the idiomatic issues it finds in the new package",
8
+ "Where should context.Context go in these Go function signatures, and should I keep it on the struct?"
9
+ ],
10
+ "should_not_trigger": [
11
+ "Write table-driven tests with subtests for my Go parser and run them with -race",
12
+ "Review this Go pull request for goroutine leaks and ignored errors",
13
+ "go build fails with 'missing go.sum entry for module providing package', fix it",
14
+ "Refactor this TypeScript service to use dependency injection",
15
+ "Explain Rust ownership and borrowing for a Go developer"
16
+ ]
17
+ }