@dsalazardev/ai-hub-cli 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1296) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +34 -0
  3. package/README.md +64 -2
  4. package/agents/cpp-build-resolver.md +25 -0
  5. package/agents/cpp-reviewer.md +28 -0
  6. package/agents/csharp-reviewer.md +28 -0
  7. package/agents/django-build-resolver.md +25 -0
  8. package/agents/django-reviewer.md +28 -0
  9. package/agents/explorer-domain.md +28 -0
  10. package/agents/fastapi-reviewer.md +28 -0
  11. package/agents/flutter-build-resolver.md +25 -0
  12. package/agents/flutter-reviewer.md +28 -0
  13. package/agents/go-build-resolver.md +25 -0
  14. package/agents/go-reviewer.md +28 -0
  15. package/agents/implementer-backend.md +30 -0
  16. package/agents/implementer-frontend.md +30 -0
  17. package/agents/java-build-resolver.md +26 -0
  18. package/agents/java-reviewer.md +29 -0
  19. package/agents/kotlin-build-resolver.md +25 -0
  20. package/agents/kotlin-reviewer.md +28 -0
  21. package/agents/mle-reviewer.md +28 -0
  22. package/agents/php-reviewer.md +29 -0
  23. package/agents/postgres-reviewer.md +28 -0
  24. package/agents/python-reviewer.md +28 -0
  25. package/agents/pytorch-build-resolver.md +25 -0
  26. package/agents/rag-reviewer.md +28 -0
  27. package/agents/react-build-resolver.md +26 -0
  28. package/agents/react-reviewer.md +29 -0
  29. package/agents/reviewer-architecture.md +32 -0
  30. package/agents/reviewer-tests.md +31 -0
  31. package/agents/rust-build-resolver.md +25 -0
  32. package/agents/rust-reviewer.md +28 -0
  33. package/agents/spec-author.md +36 -0
  34. package/agents/spec-miner.md +14 -0
  35. package/agents/swift-build-resolver.md +25 -0
  36. package/agents/swift-reviewer.md +28 -0
  37. package/agents/typescript-reviewer.md +28 -0
  38. package/agents/vue-reviewer.md +28 -0
  39. package/dist/backup/snapshots.d.ts +24 -0
  40. package/dist/backup/snapshots.js +171 -0
  41. package/dist/bin/ai-hub.d.ts +2 -0
  42. package/dist/bin/ai-hub.js +11 -0
  43. package/dist/catalog.d.ts +76 -0
  44. package/dist/catalog.js +321 -0
  45. package/dist/cli/args.d.ts +4 -0
  46. package/dist/cli/args.js +63 -0
  47. package/dist/cli/context.d.ts +7 -0
  48. package/dist/cli/context.js +79 -0
  49. package/dist/cli/doctor.d.ts +14 -0
  50. package/dist/cli/doctor.js +282 -0
  51. package/dist/cli/drift.d.ts +2 -0
  52. package/dist/cli/drift.js +34 -0
  53. package/dist/cli/items.d.ts +5 -0
  54. package/dist/cli/items.js +10 -0
  55. package/dist/cli/legacy.d.ts +3 -0
  56. package/dist/cli/legacy.js +18 -0
  57. package/dist/cli/maintenance.d.ts +8 -0
  58. package/dist/cli/maintenance.js +334 -0
  59. package/dist/cli/memory.d.ts +2 -0
  60. package/dist/cli/memory.js +89 -0
  61. package/dist/cli/onboarding.d.ts +36 -0
  62. package/dist/cli/onboarding.js +516 -0
  63. package/dist/cli/run.d.ts +15 -0
  64. package/dist/cli/run.js +185 -0
  65. package/dist/cli/source.d.ts +5 -0
  66. package/dist/cli/source.js +22 -0
  67. package/dist/cli/trunk.d.ts +8 -0
  68. package/dist/cli/trunk.js +54 -0
  69. package/dist/cli/types.d.ts +17 -0
  70. package/dist/cli/types.js +4 -0
  71. package/dist/cli/worktrees.d.ts +11 -0
  72. package/dist/cli/worktrees.js +141 -0
  73. package/dist/concurrency.d.ts +5 -0
  74. package/dist/concurrency.js +23 -0
  75. package/dist/engine/engine.d.ts +48 -0
  76. package/dist/engine/engine.js +114 -0
  77. package/dist/engine/gates.d.ts +2 -0
  78. package/dist/engine/gates.js +131 -0
  79. package/dist/frontmatter.d.ts +11 -0
  80. package/dist/frontmatter.js +30 -0
  81. package/dist/harness/guards/adapters/context.d.ts +19 -0
  82. package/dist/harness/guards/adapters/context.js +153 -0
  83. package/dist/harness/guards/adapters/hermes.d.ts +13 -0
  84. package/dist/harness/guards/adapters/hermes.js +18 -0
  85. package/dist/harness/guards/adapters/hooks.d.ts +25 -0
  86. package/dist/harness/guards/adapters/hooks.js +52 -0
  87. package/dist/harness/guards/branch.d.ts +5 -0
  88. package/dist/harness/guards/branch.js +43 -0
  89. package/dist/harness/guards/danger.d.ts +13 -0
  90. package/dist/harness/guards/danger.js +157 -0
  91. package/dist/harness/guards/index.d.ts +6 -0
  92. package/dist/harness/guards/index.js +6 -0
  93. package/dist/harness/guards/preflight.d.ts +14 -0
  94. package/dist/harness/guards/preflight.js +37 -0
  95. package/dist/harness/guards/ship.d.ts +2 -0
  96. package/dist/harness/guards/ship.js +35 -0
  97. package/dist/harness/guards/trunk.d.ts +5 -0
  98. package/dist/harness/guards/trunk.js +41 -0
  99. package/dist/harness/guards/types.d.ts +50 -0
  100. package/dist/harness/guards/types.js +1 -0
  101. package/dist/harness/memory/ledger.d.ts +53 -0
  102. package/dist/harness/memory/ledger.js +136 -0
  103. package/dist/harness/memory/state.d.ts +35 -0
  104. package/dist/harness/memory/state.js +121 -0
  105. package/dist/harness/worktree/reaper.d.ts +32 -0
  106. package/dist/harness/worktree/reaper.js +54 -0
  107. package/dist/manifest/build.d.ts +1 -0
  108. package/dist/manifest/build.js +1 -0
  109. package/dist/manifest/cli.d.ts +2 -0
  110. package/dist/manifest/cli.js +44 -0
  111. package/dist/manifest/dispatch.d.ts +13 -0
  112. package/dist/manifest/dispatch.js +36 -0
  113. package/dist/manifest/labels.d.ts +15 -0
  114. package/dist/manifest/labels.js +70 -0
  115. package/dist/manifest/manifest.d.ts +130 -0
  116. package/dist/manifest/manifest.js +220 -0
  117. package/dist/package-info.d.ts +4 -0
  118. package/dist/package-info.js +7 -0
  119. package/dist/paths.d.ts +33 -0
  120. package/dist/paths.js +123 -0
  121. package/dist/presets/detect.d.ts +24 -0
  122. package/dist/presets/detect.js +116 -0
  123. package/dist/presets/materialize.d.ts +26 -0
  124. package/dist/presets/materialize.js +192 -0
  125. package/dist/presets/resolve.d.ts +37 -0
  126. package/dist/presets/resolve.js +83 -0
  127. package/dist/presets/schema.d.ts +57 -0
  128. package/dist/presets/schema.js +68 -0
  129. package/dist/source-checkout.d.ts +8 -0
  130. package/dist/source-checkout.js +19 -0
  131. package/dist/sync/config.d.ts +47 -0
  132. package/dist/sync/config.js +85 -0
  133. package/dist/sync/lock.d.ts +16 -0
  134. package/dist/sync/lock.js +43 -0
  135. package/dist/sync/render.d.ts +18 -0
  136. package/dist/sync/render.js +259 -0
  137. package/dist/sync/sync.d.ts +38 -0
  138. package/dist/sync/sync.js +288 -0
  139. package/dist/sync/targets.d.ts +24 -0
  140. package/dist/sync/targets.js +78 -0
  141. package/engine/coupling.json +4 -0
  142. package/engine/engine.yaml +250 -0
  143. package/engine/legacy-paths.json +4 -0
  144. package/engine/preflight.md +11 -0
  145. package/manifest.json +402 -0
  146. package/package.json +62 -4
  147. package/presets/angular-express/harness/rules/01-zero-any.sh +25 -0
  148. package/presets/angular-express/harness/rules/02-no-ng-module.sh +21 -0
  149. package/presets/angular-express/harness/rules/03-no-constructor-injection.sh +21 -0
  150. package/presets/angular-express/harness/rules/04-no-legacy-directives.sh +21 -0
  151. package/presets/angular-express/harness/rules/05-no-dolibarrdal-inheritance.sh +25 -0
  152. package/presets/angular-express/harness/rules/06-no-todos.sh +22 -0
  153. package/presets/angular-express/harness/run-all.sh +13 -0
  154. package/presets/angular-express/preset.yaml +53 -0
  155. package/presets/angular-express/references/common-imports-catalog.md +146 -0
  156. package/presets/angular-express/references/fichajes-migration-notes.md +57 -0
  157. package/presets/angular-express/references/module-implementation-flow.md +260 -0
  158. package/presets/angular-express/references/products-coding-standard.md +143 -0
  159. package/presets/angular-express/references/products-module-blueprint.md +860 -0
  160. package/presets/angular-express/references/replicate-module-checklist.md +72 -0
  161. package/presets/angular-express/references/users-migration-notes.md +172 -0
  162. package/presets/angular-express/rules/architecture.md +8 -0
  163. package/presets/angular-express/rules/backend.md +4 -0
  164. package/presets/angular-express/rules/frontend.md +53 -0
  165. package/presets/angular-express/skills/angular-developer/SKILL.md +130 -0
  166. package/presets/angular-express/skills/angular-developer/references/angular-animations.md +160 -0
  167. package/presets/angular-express/skills/angular-developer/references/angular-aria.md +410 -0
  168. package/presets/angular-express/skills/angular-developer/references/cli.md +86 -0
  169. package/presets/angular-express/skills/angular-developer/references/component-harnesses.md +59 -0
  170. package/presets/angular-express/skills/angular-developer/references/component-styling.md +91 -0
  171. package/presets/angular-express/skills/angular-developer/references/components.md +117 -0
  172. package/presets/angular-express/skills/angular-developer/references/creating-services.md +97 -0
  173. package/presets/angular-express/skills/angular-developer/references/data-resolvers.md +69 -0
  174. package/presets/angular-express/skills/angular-developer/references/define-routes.md +67 -0
  175. package/presets/angular-express/skills/angular-developer/references/defining-providers.md +72 -0
  176. package/presets/angular-express/skills/angular-developer/references/di-fundamentals.md +120 -0
  177. package/presets/angular-express/skills/angular-developer/references/e2e-testing.md +66 -0
  178. package/presets/angular-express/skills/angular-developer/references/effects.md +83 -0
  179. package/presets/angular-express/skills/angular-developer/references/hierarchical-injectors.md +43 -0
  180. package/presets/angular-express/skills/angular-developer/references/host-elements.md +80 -0
  181. package/presets/angular-express/skills/angular-developer/references/injection-context.md +63 -0
  182. package/presets/angular-express/skills/angular-developer/references/inputs.md +101 -0
  183. package/presets/angular-express/skills/angular-developer/references/linked-signal.md +59 -0
  184. package/presets/angular-express/skills/angular-developer/references/loading-strategies.md +61 -0
  185. package/presets/angular-express/skills/angular-developer/references/mcp.md +106 -0
  186. package/presets/angular-express/skills/angular-developer/references/migrations.md +30 -0
  187. package/presets/angular-express/skills/angular-developer/references/navigate-to-routes.md +69 -0
  188. package/presets/angular-express/skills/angular-developer/references/outputs.md +86 -0
  189. package/presets/angular-express/skills/angular-developer/references/reactive-forms.md +122 -0
  190. package/presets/angular-express/skills/angular-developer/references/rendering-strategies.md +44 -0
  191. package/presets/angular-express/skills/angular-developer/references/resource.md +74 -0
  192. package/presets/angular-express/skills/angular-developer/references/route-animations.md +56 -0
  193. package/presets/angular-express/skills/angular-developer/references/route-guards.md +52 -0
  194. package/presets/angular-express/skills/angular-developer/references/router-lifecycle.md +45 -0
  195. package/presets/angular-express/skills/angular-developer/references/router-testing.md +87 -0
  196. package/presets/angular-express/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
  197. package/presets/angular-express/skills/angular-developer/references/signal-forms.md +897 -0
  198. package/presets/angular-express/skills/angular-developer/references/signals-overview.md +94 -0
  199. package/presets/angular-express/skills/angular-developer/references/tailwind-css.md +69 -0
  200. package/presets/angular-express/skills/angular-developer/references/template-driven-forms.md +114 -0
  201. package/presets/angular-express/skills/angular-developer/references/testing-fundamentals.md +66 -0
  202. package/presets/angular-express/skills/angular-new-app/SKILL.md +62 -0
  203. package/presets/angular-express/skills/frontend-design/LICENSE.txt +177 -0
  204. package/presets/angular-express/skills/frontend-design/SKILL.md +55 -0
  205. package/presets/angular-express/skills/onna-architecture-angular/SKILL.md +229 -0
  206. package/presets/angular-express/skills/onna-architecture-bff/SKILL.md +446 -0
  207. package/presets/angular-express/skills/onna-architecture-common/SKILL.md +313 -0
  208. package/presets/angular-express/skills/onna-design-system/SKILL.md +615 -0
  209. package/presets/base/preset.yaml +25 -0
  210. package/presets/base/rules/core.md +35 -0
  211. package/presets/generic-ts/preset.yaml +44 -0
  212. package/presets/python/preset.yaml +45 -0
  213. package/presets/python/rules/python.md +10 -0
  214. package/rules/skill-quality/skill-behavior-rubric.md +63 -0
  215. package/rules/skill-quality/skill-harden-rubric.md +102 -0
  216. package/rules/skill-quality/skill-migration-brief.md +200 -0
  217. package/rules/skill-quality/skill-rubric.md +40 -0
  218. package/schema/engine.schema.json +73 -0
  219. package/schema/manifest.schema.json +152 -0
  220. package/schema/preset.schema.json +98 -0
  221. package/schema/state.schema.json +27 -0
  222. package/skills/shared/ab-testing/SKILL.md +159 -0
  223. package/skills/shared/ab-testing/evals/README.md +8 -0
  224. package/skills/shared/ab-testing/evals/cases.yaml +49 -0
  225. package/skills/shared/ab-testing/references/pitfalls.md +74 -0
  226. package/skills/shared/ab-testing/references/sample-size-and-cuped.md +128 -0
  227. package/skills/shared/ab-testing/scripts/verify.sh +89 -0
  228. package/skills/shared/accessibility/SKILL.md +216 -0
  229. package/skills/shared/accessibility/evals/README.md +3 -0
  230. package/skills/shared/accessibility/evals/cases.yaml +47 -0
  231. package/skills/shared/accessibility/references/aria-patterns.md +113 -0
  232. package/skills/shared/accessibility/references/wcag22-checklist.md +83 -0
  233. package/skills/shared/accessibility/scripts/verify.sh +103 -0
  234. package/skills/shared/agent-eval/SKILL.md +187 -0
  235. package/skills/shared/agent-eval/evals/README.md +12 -0
  236. package/skills/shared/agent-eval/evals/cases.yaml +45 -0
  237. package/skills/shared/agent-eval/references/judge-design.md +118 -0
  238. package/skills/shared/agent-eval/references/runner-and-gate.md +183 -0
  239. package/skills/shared/agent-eval/scripts/verify.sh +161 -0
  240. package/skills/shared/agent-safety/SKILL.md +169 -0
  241. package/skills/shared/agent-safety/evals/README.md +12 -0
  242. package/skills/shared/agent-safety/evals/cases.yaml +46 -0
  243. package/skills/shared/agent-safety/references/threat-model.md +51 -0
  244. package/skills/shared/analyze/SKILL.md +123 -0
  245. package/skills/shared/analyze/evals/README.md +72 -0
  246. package/skills/shared/analyze/evals/cases.yaml +74 -0
  247. package/skills/shared/angular/SKILL.md +275 -0
  248. package/skills/shared/angular/evals/README.md +3 -0
  249. package/skills/shared/angular/evals/cases.yaml +38 -0
  250. package/skills/shared/angular/references/migration.md +81 -0
  251. package/skills/shared/angular/references/signals-rxjs.md +92 -0
  252. package/skills/shared/angular/scripts/verify.sh +122 -0
  253. package/skills/shared/api-connector-builder/SKILL.md +268 -0
  254. package/skills/shared/api-connector-builder/evals/README.md +11 -0
  255. package/skills/shared/api-connector-builder/evals/cases.yaml +47 -0
  256. package/skills/shared/api-connector-builder/references/auth-flows.md +132 -0
  257. package/skills/shared/api-connector-builder/references/pagination.md +144 -0
  258. package/skills/shared/api-connector-builder/scripts/verify.sh +172 -0
  259. package/skills/shared/api-design/SKILL.md +182 -0
  260. package/skills/shared/api-design/evals/README.md +3 -0
  261. package/skills/shared/api-design/evals/cases.yaml +45 -0
  262. package/skills/shared/api-design/references/graphql-design.md +70 -0
  263. package/skills/shared/api-design/references/openapi-contract.md +86 -0
  264. package/skills/shared/api-design/references/rest-conventions.md +63 -0
  265. package/skills/shared/api-design/references/versioning-and-evolution.md +49 -0
  266. package/skills/shared/api-design/scripts/verify.sh +138 -0
  267. package/skills/shared/astro/SKILL.md +257 -0
  268. package/skills/shared/astro/evals/README.md +3 -0
  269. package/skills/shared/astro/evals/cases.yaml +41 -0
  270. package/skills/shared/astro/references/content-layer.md +118 -0
  271. package/skills/shared/astro/references/deploy-and-integrations.md +163 -0
  272. package/skills/shared/astro/scripts/verify.sh +137 -0
  273. package/skills/shared/author-skill/SKILL.md +194 -0
  274. package/skills/shared/author-skill/evals/README.md +66 -0
  275. package/skills/shared/author-skill/evals/cases.yaml +75 -0
  276. package/skills/shared/author-skill/references/description-recipe.md +85 -0
  277. package/skills/shared/author-skill/references/eval-authoring.md +108 -0
  278. package/skills/shared/author-skill/references/skill-conventions.md +95 -0
  279. package/skills/shared/automation-flows/SKILL.md +122 -0
  280. package/skills/shared/automation-flows/evals/README.md +5 -0
  281. package/skills/shared/automation-flows/evals/cases.yaml +44 -0
  282. package/skills/shared/automation-flows/references/error-handling.md +58 -0
  283. package/skills/shared/automation-flows/references/n8n-workflow-json.md +63 -0
  284. package/skills/shared/automation-flows/scripts/verify.sh +78 -0
  285. package/skills/shared/aws-essentials/SKILL.md +206 -0
  286. package/skills/shared/aws-essentials/evals/README.md +10 -0
  287. package/skills/shared/aws-essentials/evals/cases.yaml +44 -0
  288. package/skills/shared/aws-essentials/references/iam-least-privilege.md +134 -0
  289. package/skills/shared/aws-essentials/references/rds-cloudfront-recipes.md +127 -0
  290. package/skills/shared/aws-essentials/scripts/verify.sh +99 -0
  291. package/skills/shared/backups/SKILL.md +131 -0
  292. package/skills/shared/backups/evals/README.md +3 -0
  293. package/skills/shared/backups/evals/cases.yaml +42 -0
  294. package/skills/shared/backups/references/engine-recipes.md +121 -0
  295. package/skills/shared/backups/references/restore-runbook.md +65 -0
  296. package/skills/shared/backups/scripts/verify.sh +80 -0
  297. package/skills/shared/bash-scripting/SKILL.md +227 -0
  298. package/skills/shared/bash-scripting/evals/README.md +3 -0
  299. package/skills/shared/bash-scripting/evals/cases.yaml +45 -0
  300. package/skills/shared/bash-scripting/references/portability.md +97 -0
  301. package/skills/shared/bash-scripting/scripts/verify.sh +140 -0
  302. package/skills/shared/building-agents/SKILL.md +386 -0
  303. package/skills/shared/building-agents/evals/README.md +68 -0
  304. package/skills/shared/building-agents/evals/cases.yaml +60 -0
  305. package/skills/shared/building-agents/references/agent-loops-and-harness.md +371 -0
  306. package/skills/shared/building-agents/references/evals-and-observability.md +420 -0
  307. package/skills/shared/building-agents/references/mcp-servers.md +294 -0
  308. package/skills/shared/building-agents/references/provider-abstraction.md +489 -0
  309. package/skills/shared/building-agents/references/tools-and-rag.md +417 -0
  310. package/skills/shared/building-agents/scripts/verify.sh +121 -0
  311. package/skills/shared/chatbot/SKILL.md +151 -0
  312. package/skills/shared/chatbot/evals/README.md +13 -0
  313. package/skills/shared/chatbot/evals/cases.yaml +43 -0
  314. package/skills/shared/chatbot/references/handoff-and-sales.md +71 -0
  315. package/skills/shared/chatbot/references/system-prompt-and-guardrails.md +78 -0
  316. package/skills/shared/chatbot/scripts/verify.sh +162 -0
  317. package/skills/shared/chrome-extension/SKILL.md +169 -0
  318. package/skills/shared/chrome-extension/evals/README.md +12 -0
  319. package/skills/shared/chrome-extension/evals/cases.yaml +40 -0
  320. package/skills/shared/chrome-extension/references/store-and-migration.md +84 -0
  321. package/skills/shared/chrome-extension/scripts/verify.sh +62 -0
  322. package/skills/shared/clarify/SKILL.md +161 -0
  323. package/skills/shared/clarify/evals/README.md +70 -0
  324. package/skills/shared/clarify/evals/cases.yaml +71 -0
  325. package/skills/shared/clickhouse-analytics/SKILL.md +159 -0
  326. package/skills/shared/clickhouse-analytics/evals/README.md +3 -0
  327. package/skills/shared/clickhouse-analytics/evals/cases.yaml +45 -0
  328. package/skills/shared/clickhouse-analytics/references/ingestion-and-mvs.md +109 -0
  329. package/skills/shared/clickhouse-analytics/references/query-optimization.md +76 -0
  330. package/skills/shared/clickhouse-analytics/references/schema-and-engines.md +63 -0
  331. package/skills/shared/clickhouse-analytics/scripts/verify.sh +109 -0
  332. package/skills/shared/cloudflare/SKILL.md +186 -0
  333. package/skills/shared/cloudflare/evals/README.md +15 -0
  334. package/skills/shared/cloudflare/evals/cases.yaml +46 -0
  335. package/skills/shared/cloudflare/references/storage-primitives.md +104 -0
  336. package/skills/shared/cloudflare/references/wrangler-config.md +91 -0
  337. package/skills/shared/cloudflare/scripts/verify.sh +133 -0
  338. package/skills/shared/code-review/SKILL.md +132 -0
  339. package/skills/shared/code-review/evals/README.md +3 -0
  340. package/skills/shared/code-review/evals/cases.yaml +55 -0
  341. package/skills/shared/code-review/references/pr-workflow.md +67 -0
  342. package/skills/shared/codebase-onboarding/SKILL.md +128 -0
  343. package/skills/shared/codebase-onboarding/evals/README.md +3 -0
  344. package/skills/shared/codebase-onboarding/evals/cases.yaml +69 -0
  345. package/skills/shared/codebase-onboarding/references/recon-playbook.md +57 -0
  346. package/skills/shared/codebase-onboarding/scripts/verify.sh +54 -0
  347. package/skills/shared/compose-multiplatform/SKILL.md +198 -0
  348. package/skills/shared/compose-multiplatform/evals/README.md +3 -0
  349. package/skills/shared/compose-multiplatform/evals/cases.yaml +40 -0
  350. package/skills/shared/compose-multiplatform/references/ios-interop.md +91 -0
  351. package/skills/shared/compose-multiplatform/references/project-setup.md +96 -0
  352. package/skills/shared/compose-multiplatform/scripts/verify.sh +123 -0
  353. package/skills/shared/connect-tool/SKILL.md +163 -0
  354. package/skills/shared/connect-tool/evals/cases.yaml +58 -0
  355. package/skills/shared/constitution/SKILL.md +158 -0
  356. package/skills/shared/constitution/evals/README.md +68 -0
  357. package/skills/shared/constitution/evals/cases.yaml +72 -0
  358. package/skills/shared/constitution/references/constitution-template.md +100 -0
  359. package/skills/shared/context-budget/SKILL.md +114 -0
  360. package/skills/shared/context-budget/evals/README.md +11 -0
  361. package/skills/shared/context-budget/evals/cases.yaml +40 -0
  362. package/skills/shared/context-budget/references/handoff-and-compaction.md +96 -0
  363. package/skills/shared/continuous-learning/SKILL.md +106 -0
  364. package/skills/shared/continuous-learning/evals/README.md +16 -0
  365. package/skills/shared/continuous-learning/evals/cases.yaml +39 -0
  366. package/skills/shared/continuous-learning/references/lesson-routing.md +106 -0
  367. package/skills/shared/coolify/SKILL.md +194 -0
  368. package/skills/shared/coolify/evals/README.md +21 -0
  369. package/skills/shared/coolify/evals/cases.yaml +46 -0
  370. package/skills/shared/coolify/references/databases-and-backups.md +99 -0
  371. package/skills/shared/coolify/references/deploy-recipes.md +105 -0
  372. package/skills/shared/coolify/references/install-and-proxy.md +80 -0
  373. package/skills/shared/coolify/scripts/verify.sh +123 -0
  374. package/skills/shared/cost-tracking/SKILL.md +176 -0
  375. package/skills/shared/cost-tracking/evals/README.md +3 -0
  376. package/skills/shared/cost-tracking/evals/cases.yaml +45 -0
  377. package/skills/shared/cost-tracking/references/cloud-caps.md +52 -0
  378. package/skills/shared/cost-tracking/references/pricing-tables.md +51 -0
  379. package/skills/shared/cost-tracking/scripts/verify.sh +135 -0
  380. package/skills/shared/cpp/SKILL.md +302 -0
  381. package/skills/shared/cpp/evals/README.md +14 -0
  382. package/skills/shared/cpp/evals/cases.yaml +44 -0
  383. package/skills/shared/cpp/references/cmake.md +167 -0
  384. package/skills/shared/cpp/references/move-and-templates.md +130 -0
  385. package/skills/shared/cpp/references/undefined-behavior.md +86 -0
  386. package/skills/shared/cpp/scripts/verify.sh +165 -0
  387. package/skills/shared/csharp-dotnet/SKILL.md +272 -0
  388. package/skills/shared/csharp-dotnet/evals/README.md +3 -0
  389. package/skills/shared/csharp-dotnet/evals/cases.yaml +48 -0
  390. package/skills/shared/csharp-dotnet/references/aspnetcore.md +99 -0
  391. package/skills/shared/csharp-dotnet/references/async.md +82 -0
  392. package/skills/shared/csharp-dotnet/references/efcore.md +96 -0
  393. package/skills/shared/csharp-dotnet/scripts/verify.sh +90 -0
  394. package/skills/shared/data-cleaning/SKILL.md +259 -0
  395. package/skills/shared/data-cleaning/evals/README.md +16 -0
  396. package/skills/shared/data-cleaning/evals/cases.yaml +57 -0
  397. package/skills/shared/data-cleaning/references/normalization-recipes.md +136 -0
  398. package/skills/shared/data-cleaning/references/validation-patterns.md +134 -0
  399. package/skills/shared/data-cleaning/scripts/verify.sh +115 -0
  400. package/skills/shared/data-scraper/SKILL.md +130 -0
  401. package/skills/shared/data-scraper/evals/README.md +3 -0
  402. package/skills/shared/data-scraper/evals/cases.yaml +46 -0
  403. package/skills/shared/data-scraper/references/anti-bot.md +85 -0
  404. package/skills/shared/data-scraper/references/frameworks.md +116 -0
  405. package/skills/shared/data-scraper/references/legal-compliance.md +64 -0
  406. package/skills/shared/data-scraper/scripts/verify.sh +166 -0
  407. package/skills/shared/db-migrations/SKILL.md +237 -0
  408. package/skills/shared/db-migrations/evals/README.md +10 -0
  409. package/skills/shared/db-migrations/evals/cases.yaml +46 -0
  410. package/skills/shared/db-migrations/references/backfill-and-batching.md +105 -0
  411. package/skills/shared/db-migrations/references/expand-contract-playbook.md +152 -0
  412. package/skills/shared/db-migrations/references/tools-and-runners.md +88 -0
  413. package/skills/shared/db-migrations/scripts/verify.sh +112 -0
  414. package/skills/shared/debug/SKILL.md +188 -0
  415. package/skills/shared/debug/evals/README.md +88 -0
  416. package/skills/shared/debug/evals/cases.yaml +74 -0
  417. package/skills/shared/decision-challenge/SKILL.md +113 -0
  418. package/skills/shared/decision-challenge/evals/README.md +3 -0
  419. package/skills/shared/decision-challenge/evals/cases.yaml +42 -0
  420. package/skills/shared/decision-records/SKILL.md +202 -0
  421. package/skills/shared/decision-records/evals/README.md +3 -0
  422. package/skills/shared/decision-records/evals/cases.yaml +43 -0
  423. package/skills/shared/decision-records/references/templates.md +252 -0
  424. package/skills/shared/decision-records/scripts/verify.sh +105 -0
  425. package/skills/shared/deep-learning/SKILL.md +226 -0
  426. package/skills/shared/deep-learning/evals/README.md +11 -0
  427. package/skills/shared/deep-learning/evals/cases.yaml +48 -0
  428. package/skills/shared/deep-learning/references/distributed.md +105 -0
  429. package/skills/shared/deep-learning/references/training-recipes.md +135 -0
  430. package/skills/shared/deployment/SKILL.md +374 -0
  431. package/skills/shared/deployment/evals/README.md +50 -0
  432. package/skills/shared/deployment/evals/cases.yaml +53 -0
  433. package/skills/shared/deployment/references/coolify.md +216 -0
  434. package/skills/shared/deployment/references/dockerfiles-by-stack.md +319 -0
  435. package/skills/shared/deployment/references/github-actions.md +295 -0
  436. package/skills/shared/deployment/references/hosting-targets.md +272 -0
  437. package/skills/shared/deployment/scripts/verify.sh +134 -0
  438. package/skills/shared/deprecation/SKILL.md +123 -0
  439. package/skills/shared/deprecation/evals/README.md +3 -0
  440. package/skills/shared/deprecation/evals/cases.yaml +42 -0
  441. package/skills/shared/design/IMPECCABLE-LICENSE.txt +191 -0
  442. package/skills/shared/design/SKILL.md +111 -0
  443. package/skills/shared/design/THIRD_PARTY.md +26 -0
  444. package/skills/shared/design/engine/LICENSE +21 -0
  445. package/skills/shared/design/engine/RUN.md +515 -0
  446. package/skills/shared/design/engine/UPSTREAM.json +4 -0
  447. package/skills/shared/design/engine/assets/app.css +216 -0
  448. package/skills/shared/design/engine/assets/base.css +105 -0
  449. package/skills/shared/design/engine/assets/base.js +37 -0
  450. package/skills/shared/design/engine/assets/charts.js +617 -0
  451. package/skills/shared/design/engine/assets/scenes/stage.css +28 -0
  452. package/skills/shared/design/engine/assets/scenes/stage.js +133 -0
  453. package/skills/shared/design/engine/library/app.json +1327 -0
  454. package/skills/shared/design/engine/library/directions.json +1078 -0
  455. package/skills/shared/design/engine/library/heroes.json +1086 -0
  456. package/skills/shared/design/engine/library/motions.json +92 -0
  457. package/skills/shared/design/engine/library/palettes.json +1485 -0
  458. package/skills/shared/design/engine/library/photos.json +7240 -0
  459. package/skills/shared/design/engine/library/sections.json +4429 -0
  460. package/skills/shared/design/engine/library/sites.json +8350 -0
  461. package/skills/shared/design/engine/library/type.json +2024 -0
  462. package/skills/shared/design/engine/references/app-screens.md +1199 -0
  463. package/skills/shared/design/engine/references/colour.md +141 -0
  464. package/skills/shared/design/engine/references/copy.md +177 -0
  465. package/skills/shared/design/engine/references/critique.md +182 -0
  466. package/skills/shared/design/engine/references/imagery.md +791 -0
  467. package/skills/shared/design/engine/references/layout.md +292 -0
  468. package/skills/shared/design/engine/references/motion.md +980 -0
  469. package/skills/shared/design/engine/references/research.md +356 -0
  470. package/skills/shared/design/engine/references/scenes.md +174 -0
  471. package/skills/shared/design/engine/references/tells.md +115 -0
  472. package/skills/shared/design/engine/references/type.md +170 -0
  473. package/skills/shared/design/engine/scripts/assets.mjs +865 -0
  474. package/skills/shared/design/engine/scripts/draw.mjs +584 -0
  475. package/skills/shared/design/engine/scripts/inspect.mjs +303 -0
  476. package/skills/shared/design/engine/scripts/lib/app-draw.mjs +203 -0
  477. package/skills/shared/design/engine/scripts/lib/cdp.mjs +248 -0
  478. package/skills/shared/design/engine/scripts/lib/probe.mjs +909 -0
  479. package/skills/shared/design/engine/scripts/lib/rules.mjs +243 -0
  480. package/skills/shared/design/engine/scripts/lint.mjs +119 -0
  481. package/skills/shared/design/engine/scripts/scenes.mjs +124 -0
  482. package/skills/shared/design/evals/cases.yaml +45 -0
  483. package/skills/shared/design/references/design-md.md +49 -0
  484. package/skills/shared/design/references/finish-review.md +46 -0
  485. package/skills/shared/design/references/modes.md +51 -0
  486. package/skills/shared/digitalocean/SKILL.md +227 -0
  487. package/skills/shared/digitalocean/evals/README.md +10 -0
  488. package/skills/shared/digitalocean/evals/cases.yaml +37 -0
  489. package/skills/shared/digitalocean/references/app-spec.md +126 -0
  490. package/skills/shared/digitalocean/references/droplet-ops.md +95 -0
  491. package/skills/shared/digitalocean/scripts/verify.sh +102 -0
  492. package/skills/shared/django/SKILL.md +263 -0
  493. package/skills/shared/django/evals/README.md +11 -0
  494. package/skills/shared/django/evals/cases.yaml +47 -0
  495. package/skills/shared/django/references/drf.md +109 -0
  496. package/skills/shared/django/references/orm-performance.md +91 -0
  497. package/skills/shared/django/references/security.md +81 -0
  498. package/skills/shared/django/references/testing.md +86 -0
  499. package/skills/shared/django/scripts/verify.sh +115 -0
  500. package/skills/shared/docker/SKILL.md +251 -0
  501. package/skills/shared/docker/evals/README.md +10 -0
  502. package/skills/shared/docker/evals/cases.yaml +44 -0
  503. package/skills/shared/docker/references/base-images-and-stages.md +104 -0
  504. package/skills/shared/docker/references/compose-recipes.md +109 -0
  505. package/skills/shared/docker/scripts/verify.sh +149 -0
  506. package/skills/shared/domains-dns/SKILL.md +131 -0
  507. package/skills/shared/domains-dns/evals/README.md +16 -0
  508. package/skills/shared/domains-dns/evals/cases.yaml +47 -0
  509. package/skills/shared/domains-dns/references/record-cookbook.md +94 -0
  510. package/skills/shared/domains-dns/references/tls-and-acme.md +90 -0
  511. package/skills/shared/domains-dns/references/verify-and-debug.md +64 -0
  512. package/skills/shared/domains-dns/scripts/verify.sh +163 -0
  513. package/skills/shared/drizzle-orm/SKILL.md +231 -0
  514. package/skills/shared/drizzle-orm/evals/README.md +12 -0
  515. package/skills/shared/drizzle-orm/evals/cases.yaml +47 -0
  516. package/skills/shared/drizzle-orm/references/relations-and-drivers.md +118 -0
  517. package/skills/shared/drizzle-orm/scripts/verify.sh +155 -0
  518. package/skills/shared/duckdb/SKILL.md +202 -0
  519. package/skills/shared/duckdb/evals/README.md +31 -0
  520. package/skills/shared/duckdb/evals/cases.yaml +41 -0
  521. package/skills/shared/duckdb/references/python-and-interop.md +105 -0
  522. package/skills/shared/duckdb/references/remote-and-lakehouse.md +101 -0
  523. package/skills/shared/duckdb/scripts/verify.sh +71 -0
  524. package/skills/shared/dynamodb/SKILL.md +204 -0
  525. package/skills/shared/dynamodb/evals/README.md +8 -0
  526. package/skills/shared/dynamodb/evals/cases.yaml +46 -0
  527. package/skills/shared/dynamodb/references/access-patterns.md +127 -0
  528. package/skills/shared/dynamodb/references/capacity-and-limits.md +78 -0
  529. package/skills/shared/dynamodb/scripts/verify.sh +108 -0
  530. package/skills/shared/e2e-testing/SKILL.md +233 -0
  531. package/skills/shared/e2e-testing/evals/README.md +10 -0
  532. package/skills/shared/e2e-testing/evals/cases.yaml +64 -0
  533. package/skills/shared/e2e-testing/references/config-and-ci.md +156 -0
  534. package/skills/shared/e2e-testing/references/flakiness-playbook.md +124 -0
  535. package/skills/shared/e2e-testing/scripts/verify.sh +117 -0
  536. package/skills/shared/electron/SKILL.md +209 -0
  537. package/skills/shared/electron/evals/README.md +13 -0
  538. package/skills/shared/electron/evals/cases.yaml +38 -0
  539. package/skills/shared/electron/references/packaging-and-updates.md +122 -0
  540. package/skills/shared/electron/references/security-and-ipc.md +158 -0
  541. package/skills/shared/electron/scripts/verify.sh +143 -0
  542. package/skills/shared/elixir/SKILL.md +209 -0
  543. package/skills/shared/elixir/evals/README.md +3 -0
  544. package/skills/shared/elixir/evals/cases.yaml +41 -0
  545. package/skills/shared/elixir/references/mix-and-releases.md +91 -0
  546. package/skills/shared/elixir/references/otp-patterns.md +96 -0
  547. package/skills/shared/elixir/scripts/verify.sh +76 -0
  548. package/skills/shared/email-deliverability/SKILL.md +148 -0
  549. package/skills/shared/email-deliverability/evals/README.md +21 -0
  550. package/skills/shared/email-deliverability/evals/cases.yaml +45 -0
  551. package/skills/shared/email-deliverability/scripts/verify.sh +98 -0
  552. package/skills/shared/embeddings-search/SKILL.md +184 -0
  553. package/skills/shared/embeddings-search/evals/README.md +10 -0
  554. package/skills/shared/embeddings-search/evals/cases.yaml +44 -0
  555. package/skills/shared/embeddings-search/references/evaluation.md +86 -0
  556. package/skills/shared/embeddings-search/references/models.md +73 -0
  557. package/skills/shared/embeddings-search/scripts/verify.sh +103 -0
  558. package/skills/shared/error-handling/SKILL.md +273 -0
  559. package/skills/shared/error-handling/evals/README.md +12 -0
  560. package/skills/shared/error-handling/evals/cases.yaml +46 -0
  561. package/skills/shared/error-handling/references/boundaries-and-messaging.md +120 -0
  562. package/skills/shared/error-handling/references/retry-and-resilience.md +154 -0
  563. package/skills/shared/error-handling/scripts/verify.sh +110 -0
  564. package/skills/shared/expo/SKILL.md +243 -0
  565. package/skills/shared/expo/evals/README.md +13 -0
  566. package/skills/shared/expo/evals/cases.yaml +44 -0
  567. package/skills/shared/expo/references/config-plugins.md +117 -0
  568. package/skills/shared/expo/references/eas-update.md +118 -0
  569. package/skills/shared/expo/scripts/verify.sh +132 -0
  570. package/skills/shared/fal/SKILL.md +196 -0
  571. package/skills/shared/fal/evals/README.md +3 -0
  572. package/skills/shared/fal/evals/cases.yaml +42 -0
  573. package/skills/shared/fal/references/models-and-cost.md +53 -0
  574. package/skills/shared/fal/references/queue-and-webhooks.md +153 -0
  575. package/skills/shared/fal/scripts/verify.sh +72 -0
  576. package/skills/shared/fastapi/SKILL.md +469 -0
  577. package/skills/shared/fastapi/evals/README.md +50 -0
  578. package/skills/shared/fastapi/evals/cases.yaml +55 -0
  579. package/skills/shared/fastapi/references/database.md +347 -0
  580. package/skills/shared/fastapi/references/production.md +338 -0
  581. package/skills/shared/fastapi/references/security.md +330 -0
  582. package/skills/shared/fastapi/references/testing.md +349 -0
  583. package/skills/shared/fastapi/scripts/verify.sh +157 -0
  584. package/skills/shared/finetuning/SKILL.md +232 -0
  585. package/skills/shared/finetuning/evals/README.md +13 -0
  586. package/skills/shared/finetuning/evals/cases.yaml +50 -0
  587. package/skills/shared/finetuning/references/hyperparameters-and-eval.md +74 -0
  588. package/skills/shared/finetuning/references/methods.md +189 -0
  589. package/skills/shared/firebase/SKILL.md +237 -0
  590. package/skills/shared/firebase/evals/README.md +12 -0
  591. package/skills/shared/firebase/evals/cases.yaml +45 -0
  592. package/skills/shared/firebase/references/cloud-functions.md +102 -0
  593. package/skills/shared/firebase/references/data-modeling.md +108 -0
  594. package/skills/shared/firebase/references/security-rules.md +137 -0
  595. package/skills/shared/firebase/scripts/verify.sh +98 -0
  596. package/skills/shared/flutter/SKILL.md +400 -0
  597. package/skills/shared/flutter/evals/README.md +54 -0
  598. package/skills/shared/flutter/evals/cases.yaml +69 -0
  599. package/skills/shared/flutter/references/architecture-and-state.md +499 -0
  600. package/skills/shared/flutter/references/i18n-and-dependencies.md +197 -0
  601. package/skills/shared/flutter/references/performance.md +299 -0
  602. package/skills/shared/flutter/references/testing.md +385 -0
  603. package/skills/shared/flutter/references/ui-and-navigation.md +378 -0
  604. package/skills/shared/flutter/scripts/verify.sh +104 -0
  605. package/skills/shared/fly-io/SKILL.md +197 -0
  606. package/skills/shared/fly-io/evals/README.md +3 -0
  607. package/skills/shared/fly-io/evals/cases.yaml +42 -0
  608. package/skills/shared/fly-io/references/fly-toml.md +155 -0
  609. package/skills/shared/fly-io/references/multi-region.md +66 -0
  610. package/skills/shared/fly-io/scripts/verify.sh +90 -0
  611. package/skills/shared/ftd/SKILL.md +111 -0
  612. package/skills/shared/ftd/evals/cases.yaml +66 -0
  613. package/skills/shared/ftd/evals/routing.json +24 -0
  614. package/skills/shared/game-design/SKILL.md +146 -0
  615. package/skills/shared/game-design/evals/README.md +13 -0
  616. package/skills/shared/game-design/evals/cases.yaml +47 -0
  617. package/skills/shared/game-design/references/mechanics-and-loops.md +78 -0
  618. package/skills/shared/game-design/references/playtesting-and-scope.md +58 -0
  619. package/skills/shared/game-design/references/progression-and-economy.md +70 -0
  620. package/skills/shared/game-storytelling/SKILL.md +134 -0
  621. package/skills/shared/game-storytelling/evals/README.md +28 -0
  622. package/skills/shared/game-storytelling/evals/cases.yaml +51 -0
  623. package/skills/shared/game-storytelling/references/branching-and-state.md +134 -0
  624. package/skills/shared/game-storytelling/references/dialogue-tools.md +117 -0
  625. package/skills/shared/game-storytelling/references/environmental-storytelling.md +71 -0
  626. package/skills/shared/gamedev-multiplayer/SKILL.md +237 -0
  627. package/skills/shared/gamedev-multiplayer/evals/README.md +12 -0
  628. package/skills/shared/gamedev-multiplayer/evals/cases.yaml +44 -0
  629. package/skills/shared/gamedev-multiplayer/references/godot-high-level-multiplayer.md +133 -0
  630. package/skills/shared/gamedev-multiplayer/references/prediction-and-latency.md +104 -0
  631. package/skills/shared/gamedev-multiplayer/references/unity-and-unreal-netcode.md +166 -0
  632. package/skills/shared/gamedev-pathing/SKILL.md +233 -0
  633. package/skills/shared/gamedev-pathing/evals/README.md +14 -0
  634. package/skills/shared/gamedev-pathing/evals/cases.yaml +49 -0
  635. package/skills/shared/gamedev-pathing/references/navmesh-workflow.md +110 -0
  636. package/skills/shared/gamedev-pathing/references/search-algorithms.md +135 -0
  637. package/skills/shared/gamedev-pathing/references/steering-and-avoidance.md +120 -0
  638. package/skills/shared/gamedev-physics/SKILL.md +225 -0
  639. package/skills/shared/gamedev-physics/evals/README.md +12 -0
  640. package/skills/shared/gamedev-physics/evals/cases.yaml +54 -0
  641. package/skills/shared/gamedev-physics/references/character-controllers.md +120 -0
  642. package/skills/shared/gamedev-physics/references/determinism-and-queries.md +124 -0
  643. package/skills/shared/gamedev-physics/references/layers-and-masks.md +115 -0
  644. package/skills/shared/gamedev-shaders/SKILL.md +232 -0
  645. package/skills/shared/gamedev-shaders/evals/README.md +14 -0
  646. package/skills/shared/gamedev-shaders/evals/cases.yaml +45 -0
  647. package/skills/shared/gamedev-shaders/references/effect-recipes.md +205 -0
  648. package/skills/shared/gamedev-shaders/references/godot-shading-language.md +133 -0
  649. package/skills/shared/gamedev-shaders/references/unity-and-unreal-shaders.md +169 -0
  650. package/skills/shared/gamedev-shipping/SKILL.md +220 -0
  651. package/skills/shared/gamedev-shipping/evals/README.md +9 -0
  652. package/skills/shared/gamedev-shipping/evals/cases.yaml +55 -0
  653. package/skills/shared/gamedev-shipping/references/mobile-and-desktop.md +127 -0
  654. package/skills/shared/gamedev-shipping/references/stores-and-ci.md +162 -0
  655. package/skills/shared/gamedev-shipping/references/web-export-headers.md +140 -0
  656. package/skills/shared/gcp-essentials/SKILL.md +324 -0
  657. package/skills/shared/gcp-essentials/evals/README.md +12 -0
  658. package/skills/shared/gcp-essentials/evals/cases.yaml +38 -0
  659. package/skills/shared/gcp-essentials/references/deploy-recipes.md +81 -0
  660. package/skills/shared/gcp-essentials/references/iam-and-auth.md +94 -0
  661. package/skills/shared/gcp-essentials/references/networking-and-sql.md +74 -0
  662. package/skills/shared/gcp-essentials/scripts/verify.sh +158 -0
  663. package/skills/shared/git-workflow/SKILL.md +214 -0
  664. package/skills/shared/git-workflow/evals/README.md +10 -0
  665. package/skills/shared/git-workflow/evals/cases.yaml +52 -0
  666. package/skills/shared/git-workflow/references/gitmoji.md +157 -0
  667. package/skills/shared/git-workflow/references/interactive-rebase.md +89 -0
  668. package/skills/shared/github-actions/SKILL.md +244 -0
  669. package/skills/shared/github-actions/evals/README.md +3 -0
  670. package/skills/shared/github-actions/evals/cases.yaml +45 -0
  671. package/skills/shared/github-actions/references/caching-and-matrix.md +92 -0
  672. package/skills/shared/github-actions/references/oidc-deploys.md +130 -0
  673. package/skills/shared/github-actions/scripts/verify.sh +105 -0
  674. package/skills/shared/gitlab-auth/SKILL.md +99 -0
  675. package/skills/shared/gitlab-workflow/SKILL.md +138 -0
  676. package/skills/shared/go/SKILL.md +390 -0
  677. package/skills/shared/go/evals/README.md +56 -0
  678. package/skills/shared/go/evals/cases.yaml +55 -0
  679. package/skills/shared/go/references/concurrency.md +557 -0
  680. package/skills/shared/go/references/http-services.md +529 -0
  681. package/skills/shared/go/references/testing.md +338 -0
  682. package/skills/shared/go/scripts/verify.sh +134 -0
  683. package/skills/shared/godot/SKILL.md +300 -0
  684. package/skills/shared/godot/evals/README.md +13 -0
  685. package/skills/shared/godot/evals/cases.yaml +50 -0
  686. package/skills/shared/godot/references/export-and-testing.md +102 -0
  687. package/skills/shared/godot/references/gdscript-style.md +84 -0
  688. package/skills/shared/godot/references/godot3-to-4-traps.md +89 -0
  689. package/skills/shared/godot/references/nodes-scenes-resources.md +109 -0
  690. package/skills/shared/harness/SKILL.md +316 -0
  691. package/skills/shared/harness/assets/_TEMPLATE/.env.example +8 -0
  692. package/skills/shared/harness/assets/_TEMPLATE/CREDENTIALS.md +25 -0
  693. package/skills/shared/harness/assets/_TEMPLATE/README.md +25 -0
  694. package/skills/shared/harness/assets/_TEMPLATE/gitignore +10 -0
  695. package/skills/shared/harness/assets/_TEMPLATE/test_connection.sh +30 -0
  696. package/skills/shared/harness/evals/README.md +54 -0
  697. package/skills/shared/harness/evals/cases.yaml +72 -0
  698. package/skills/shared/harness/examples/audit-example.md +120 -0
  699. package/skills/shared/harness/references/agents-md-template.md +41 -0
  700. package/skills/shared/harness/references/audit-report-template.html +140 -0
  701. package/skills/shared/harness/references/audit-report-template.md +116 -0
  702. package/skills/shared/harness/references/claude-md-template.md +85 -0
  703. package/skills/shared/harness/references/daily-curation-automation.md +68 -0
  704. package/skills/shared/harness/references/inbox-readme-template.md +51 -0
  705. package/skills/shared/harness/references/ingest-formats.md +185 -0
  706. package/skills/shared/harness/references/ingest-ignore-defaults.md +48 -0
  707. package/skills/shared/harness/references/obsidian-scaffolding.md +103 -0
  708. package/skills/shared/harness/references/providers.yaml +3546 -0
  709. package/skills/shared/harness/references/tools-readme-template.md +88 -0
  710. package/skills/shared/harness/references/wiki-archive-template.html +81 -0
  711. package/skills/shared/harness/references/wiki-article-template.md +60 -0
  712. package/skills/shared/harness/references/wiki-dashboard-template.html +136 -0
  713. package/skills/shared/harness/references/wiki-deep-improve-report-template.html +126 -0
  714. package/skills/shared/harness/references/wiki-gaps-template.md +22 -0
  715. package/skills/shared/harness/references/wiki-index-template.md +32 -0
  716. package/skills/shared/harness/references/wiki-protocol.md +926 -0
  717. package/skills/shared/harness/references/wiki-raw-template.md +7 -0
  718. package/skills/shared/harness/references/wiki-worklog-template.md +60 -0
  719. package/skills/shared/hetzner/SKILL.md +203 -0
  720. package/skills/shared/hetzner/evals/README.md +35 -0
  721. package/skills/shared/hetzner/evals/cases.yaml +46 -0
  722. package/skills/shared/hetzner/references/cloud-init.md +120 -0
  723. package/skills/shared/hetzner/references/plans-and-locations.md +56 -0
  724. package/skills/shared/hetzner/scripts/verify.sh +122 -0
  725. package/skills/shared/htmx/SKILL.md +261 -0
  726. package/skills/shared/htmx/evals/README.md +3 -0
  727. package/skills/shared/htmx/evals/cases.yaml +38 -0
  728. package/skills/shared/htmx/references/patterns.md +113 -0
  729. package/skills/shared/htmx/references/server-contract.md +91 -0
  730. package/skills/shared/htmx/scripts/verify.sh +93 -0
  731. package/skills/shared/huggingface/SKILL.md +191 -0
  732. package/skills/shared/huggingface/evals/README.md +11 -0
  733. package/skills/shared/huggingface/evals/cases.yaml +41 -0
  734. package/skills/shared/huggingface/references/endpoints-and-spaces.md +99 -0
  735. package/skills/shared/huggingface/references/hub-and-cli.md +85 -0
  736. package/skills/shared/huggingface/references/inference-providers.md +115 -0
  737. package/skills/shared/huggingface/scripts/verify.sh +123 -0
  738. package/skills/shared/idea-refinement/SKILL.md +121 -0
  739. package/skills/shared/idea-refinement/evals/README.md +3 -0
  740. package/skills/shared/idea-refinement/evals/cases.yaml +42 -0
  741. package/skills/shared/implement/SKILL.md +383 -0
  742. package/skills/shared/implement/evals/README.md +56 -0
  743. package/skills/shared/implement/evals/cases.yaml +43 -0
  744. package/skills/shared/implement/references/per-task-review.md +46 -0
  745. package/skills/shared/implement/scripts/review-package +59 -0
  746. package/skills/shared/implement/scripts/sdd-workspace +47 -0
  747. package/skills/shared/implement/scripts/task-brief +77 -0
  748. package/skills/shared/init/SKILL.md +209 -0
  749. package/skills/shared/init/evals/README.md +49 -0
  750. package/skills/shared/init/evals/cases.yaml +74 -0
  751. package/skills/shared/init/references/accompaniment-and-profile.md +122 -0
  752. package/skills/shared/init/references/discovery.md +90 -0
  753. package/skills/shared/init/references/recommend-skills.md +115 -0
  754. package/skills/shared/init/scripts/verify.sh +118 -0
  755. package/skills/shared/java/SKILL.md +341 -0
  756. package/skills/shared/java/evals/README.md +23 -0
  757. package/skills/shared/java/evals/cases.yaml +43 -0
  758. package/skills/shared/java/references/builds.md +133 -0
  759. package/skills/shared/java/references/concurrency.md +108 -0
  760. package/skills/shared/java/references/streams.md +102 -0
  761. package/skills/shared/java/scripts/verify.sh +107 -0
  762. package/skills/shared/knowledge-ops/SKILL.md +122 -0
  763. package/skills/shared/knowledge-ops/evals/README.md +16 -0
  764. package/skills/shared/knowledge-ops/evals/cases.yaml +50 -0
  765. package/skills/shared/knowledge-ops/references/gardening-playbook.md +126 -0
  766. package/skills/shared/kotlin-android/SKILL.md +245 -0
  767. package/skills/shared/kotlin-android/evals/README.md +13 -0
  768. package/skills/shared/kotlin-android/evals/cases.yaml +56 -0
  769. package/skills/shared/kotlin-android/references/architecture.md +200 -0
  770. package/skills/shared/kotlin-android/references/gradle-setup.md +125 -0
  771. package/skills/shared/kotlin-android/scripts/verify.sh +109 -0
  772. package/skills/shared/laravel/SKILL.md +301 -0
  773. package/skills/shared/laravel/evals/README.md +10 -0
  774. package/skills/shared/laravel/evals/cases.yaml +45 -0
  775. package/skills/shared/laravel/references/eloquent-patterns.md +126 -0
  776. package/skills/shared/laravel/references/queues-and-scheduling.md +153 -0
  777. package/skills/shared/laravel/scripts/verify.sh +128 -0
  778. package/skills/shared/level-design/SKILL.md +143 -0
  779. package/skills/shared/level-design/evals/README.md +35 -0
  780. package/skills/shared/level-design/evals/cases.yaml +58 -0
  781. package/skills/shared/level-design/references/blockout-to-art.md +118 -0
  782. package/skills/shared/level-design/references/guidance-and-readability.md +152 -0
  783. package/skills/shared/level-design/references/pacing-and-encounters.md +142 -0
  784. package/skills/shared/llm-pipeline/SKILL.md +150 -0
  785. package/skills/shared/llm-pipeline/evals/README.md +3 -0
  786. package/skills/shared/llm-pipeline/evals/cases.yaml +44 -0
  787. package/skills/shared/llm-pipeline/references/caching-layers.md +60 -0
  788. package/skills/shared/llm-pipeline/references/litellm-router.md +101 -0
  789. package/skills/shared/llm-pipeline/scripts/verify.sh +169 -0
  790. package/skills/shared/machine-learning/SKILL.md +228 -0
  791. package/skills/shared/machine-learning/evals/README.md +15 -0
  792. package/skills/shared/machine-learning/evals/cases.yaml +54 -0
  793. package/skills/shared/machine-learning/references/gbdt-and-tuning.md +83 -0
  794. package/skills/shared/machine-learning/references/metrics-and-imbalance.md +82 -0
  795. package/skills/shared/machine-learning/references/pipelines-and-cv.md +135 -0
  796. package/skills/shared/modal/SKILL.md +290 -0
  797. package/skills/shared/modal/evals/README.md +29 -0
  798. package/skills/shared/modal/evals/cases.yaml +50 -0
  799. package/skills/shared/modal/references/images-gpu-cookbook.md +160 -0
  800. package/skills/shared/modal/references/web-and-scaling.md +138 -0
  801. package/skills/shared/modal/scripts/verify.sh +127 -0
  802. package/skills/shared/mongodb/SKILL.md +342 -0
  803. package/skills/shared/mongodb/evals/README.md +29 -0
  804. package/skills/shared/mongodb/evals/cases.yaml +41 -0
  805. package/skills/shared/mongodb/references/aggregation.md +115 -0
  806. package/skills/shared/mongodb/references/data-modeling.md +135 -0
  807. package/skills/shared/mongodb/references/transactions-and-ops.md +128 -0
  808. package/skills/shared/mongodb/scripts/verify.sh +151 -0
  809. package/skills/shared/monitoring/SKILL.md +155 -0
  810. package/skills/shared/monitoring/evals/README.md +3 -0
  811. package/skills/shared/monitoring/evals/cases.yaml +47 -0
  812. package/skills/shared/monitoring/references/burn-rate-and-oncall.md +128 -0
  813. package/skills/shared/monitoring/references/tool-setup.md +154 -0
  814. package/skills/shared/monitoring/scripts/verify.sh +145 -0
  815. package/skills/shared/mysql/SKILL.md +249 -0
  816. package/skills/shared/mysql/evals/README.md +12 -0
  817. package/skills/shared/mysql/evals/cases.yaml +49 -0
  818. package/skills/shared/mysql/references/indexing-and-explain.md +161 -0
  819. package/skills/shared/mysql/references/mysql-vs-mariadb.md +78 -0
  820. package/skills/shared/mysql/references/online-ddl-and-migrations.md +120 -0
  821. package/skills/shared/mysql/references/replication-and-ha.md +115 -0
  822. package/skills/shared/mysql/scripts/verify.sh +141 -0
  823. package/skills/shared/neon/SKILL.md +218 -0
  824. package/skills/shared/neon/evals/README.md +11 -0
  825. package/skills/shared/neon/evals/cases.yaml +45 -0
  826. package/skills/shared/neon/references/branching-ci.md +86 -0
  827. package/skills/shared/neon/scripts/verify.sh +78 -0
  828. package/skills/shared/nestjs/SKILL.md +217 -0
  829. package/skills/shared/nestjs/evals/README.md +3 -0
  830. package/skills/shared/nestjs/evals/cases.yaml +38 -0
  831. package/skills/shared/nestjs/references/cross-cutting.md +135 -0
  832. package/skills/shared/nestjs/references/testing-recipes.md +105 -0
  833. package/skills/shared/nestjs/scripts/verify.sh +98 -0
  834. package/skills/shared/netlify/SKILL.md +208 -0
  835. package/skills/shared/netlify/evals/README.md +13 -0
  836. package/skills/shared/netlify/evals/cases.yaml +43 -0
  837. package/skills/shared/netlify/references/functions.md +97 -0
  838. package/skills/shared/netlify/references/netlify-toml.md +115 -0
  839. package/skills/shared/netlify/scripts/verify.sh +95 -0
  840. package/skills/shared/nextjs/SKILL.md +400 -0
  841. package/skills/shared/nextjs/evals/README.md +59 -0
  842. package/skills/shared/nextjs/evals/cases.yaml +56 -0
  843. package/skills/shared/nextjs/references/data-and-caching.md +309 -0
  844. package/skills/shared/nextjs/references/metadata.md +208 -0
  845. package/skills/shared/nextjs/references/performance.md +325 -0
  846. package/skills/shared/nextjs/references/react.md +383 -0
  847. package/skills/shared/nextjs/references/security.md +239 -0
  848. package/skills/shared/nextjs/references/testing.md +290 -0
  849. package/skills/shared/nextjs/scripts/verify.sh +141 -0
  850. package/skills/shared/nlp/SKILL.md +225 -0
  851. package/skills/shared/nlp/evals/README.md +10 -0
  852. package/skills/shared/nlp/evals/cases.yaml +45 -0
  853. package/skills/shared/nlp/references/evaluation.md +107 -0
  854. package/skills/shared/nlp/references/tokenization.md +95 -0
  855. package/skills/shared/no-code-app/SKILL.md +145 -0
  856. package/skills/shared/no-code-app/evals/README.md +3 -0
  857. package/skills/shared/no-code-app/evals/cases.yaml +43 -0
  858. package/skills/shared/no-code-app/references/platform-limits.md +100 -0
  859. package/skills/shared/nodejs/SKILL.md +229 -0
  860. package/skills/shared/nodejs/evals/README.md +3 -0
  861. package/skills/shared/nodejs/evals/cases.yaml +39 -0
  862. package/skills/shared/nodejs/references/express5-migration.md +53 -0
  863. package/skills/shared/nodejs/references/graceful-shutdown.md +73 -0
  864. package/skills/shared/nodejs/scripts/verify.sh +122 -0
  865. package/skills/shared/observability/SKILL.md +235 -0
  866. package/skills/shared/observability/evals/README.md +3 -0
  867. package/skills/shared/observability/evals/cases.yaml +51 -0
  868. package/skills/shared/observability/references/collector-config.md +98 -0
  869. package/skills/shared/observability/references/instrumentation-recipes.md +115 -0
  870. package/skills/shared/observability/scripts/verify.sh +156 -0
  871. package/skills/shared/ollama/SKILL.md +213 -0
  872. package/skills/shared/ollama/evals/README.md +9 -0
  873. package/skills/shared/ollama/evals/cases.yaml +43 -0
  874. package/skills/shared/ollama/references/api.md +148 -0
  875. package/skills/shared/ollama/references/hardware-sizing.md +87 -0
  876. package/skills/shared/ollama/scripts/verify.sh +116 -0
  877. package/skills/shared/open-weights/SKILL.md +239 -0
  878. package/skills/shared/open-weights/evals/README.md +14 -0
  879. package/skills/shared/open-weights/evals/cases.yaml +42 -0
  880. package/skills/shared/open-weights/references/licenses.md +123 -0
  881. package/skills/shared/open-weights/references/model-families.md +83 -0
  882. package/skills/shared/open-weights/references/sizing-and-quant.md +89 -0
  883. package/skills/shared/orient/SKILL.md +92 -0
  884. package/skills/shared/orient/evals/README.md +18 -0
  885. package/skills/shared/orient/evals/cases.yaml +67 -0
  886. package/skills/shared/orient/references/explain-ladder.md +93 -0
  887. package/skills/shared/orient/references/orientation-contract.md +86 -0
  888. package/skills/shared/parallel/SKILL.md +168 -0
  889. package/skills/shared/parallel/evals/README.md +62 -0
  890. package/skills/shared/parallel/evals/cases.yaml +44 -0
  891. package/skills/shared/performance/SKILL.md +229 -0
  892. package/skills/shared/performance/evals/README.md +3 -0
  893. package/skills/shared/performance/evals/cases.yaml +49 -0
  894. package/skills/shared/performance/references/profiling-playbook.md +54 -0
  895. package/skills/shared/performance/scripts/verify.sh +94 -0
  896. package/skills/shared/phoenix/SKILL.md +169 -0
  897. package/skills/shared/phoenix/evals/README.md +3 -0
  898. package/skills/shared/phoenix/evals/cases.yaml +40 -0
  899. package/skills/shared/phoenix/references/auth-and-scopes.md +82 -0
  900. package/skills/shared/phoenix/references/ecto-patterns.md +93 -0
  901. package/skills/shared/phoenix/references/liveview.md +134 -0
  902. package/skills/shared/phoenix/scripts/verify.sh +73 -0
  903. package/skills/shared/php/SKILL.md +397 -0
  904. package/skills/shared/php/evals/README.md +12 -0
  905. package/skills/shared/php/evals/cases.yaml +45 -0
  906. package/skills/shared/php/references/tooling.md +170 -0
  907. package/skills/shared/php/references/type-system.md +220 -0
  908. package/skills/shared/php/scripts/verify.sh +155 -0
  909. package/skills/shared/plan/SKILL.md +166 -0
  910. package/skills/shared/plan/evals/README.md +62 -0
  911. package/skills/shared/plan/evals/cases.yaml +49 -0
  912. package/skills/shared/plan/references/plan-template.md +153 -0
  913. package/skills/shared/planetscale/SKILL.md +198 -0
  914. package/skills/shared/planetscale/evals/README.md +11 -0
  915. package/skills/shared/planetscale/evals/cases.yaml +46 -0
  916. package/skills/shared/planetscale/references/deploy-requests.md +75 -0
  917. package/skills/shared/planetscale/references/no-foreign-keys.md +88 -0
  918. package/skills/shared/planetscale/scripts/verify.sh +115 -0
  919. package/skills/shared/planning-with-files/SKILL.md +278 -0
  920. package/skills/shared/planning-with-files/examples.md +202 -0
  921. package/skills/shared/planning-with-files/reference.md +218 -0
  922. package/skills/shared/planning-with-files/scripts/attest-plan.ps1 +118 -0
  923. package/skills/shared/planning-with-files/scripts/attest-plan.sh +110 -0
  924. package/skills/shared/planning-with-files/scripts/check-complete.ps1 +44 -0
  925. package/skills/shared/planning-with-files/scripts/check-complete.sh +46 -0
  926. package/skills/shared/planning-with-files/scripts/init-session.ps1 +166 -0
  927. package/skills/shared/planning-with-files/scripts/init-session.sh +284 -0
  928. package/skills/shared/planning-with-files/scripts/resolve-plan-dir.ps1 +44 -0
  929. package/skills/shared/planning-with-files/scripts/resolve-plan-dir.sh +76 -0
  930. package/skills/shared/planning-with-files/scripts/session-catchup.py +438 -0
  931. package/skills/shared/planning-with-files/scripts/set-active-plan.ps1 +50 -0
  932. package/skills/shared/planning-with-files/scripts/set-active-plan.sh +50 -0
  933. package/skills/shared/planning-with-files/templates/findings.md +95 -0
  934. package/skills/shared/planning-with-files/templates/progress.md +114 -0
  935. package/skills/shared/planning-with-files/templates/task_plan.md +132 -0
  936. package/skills/shared/postgresdb/SKILL.md +354 -0
  937. package/skills/shared/postgresdb/evals/README.md +55 -0
  938. package/skills/shared/postgresdb/evals/cases.yaml +57 -0
  939. package/skills/shared/postgresdb/references/migrations.md +279 -0
  940. package/skills/shared/postgresdb/references/operations-and-security.md +267 -0
  941. package/skills/shared/postgresdb/references/query-optimization.md +374 -0
  942. package/skills/shared/postgresdb/references/schema-and-indexing.md +379 -0
  943. package/skills/shared/postgresdb/scripts/verify.sh +191 -0
  944. package/skills/shared/prisma-orm/SKILL.md +313 -0
  945. package/skills/shared/prisma-orm/evals/README.md +12 -0
  946. package/skills/shared/prisma-orm/evals/cases.yaml +56 -0
  947. package/skills/shared/prisma-orm/references/migrations-and-v7-upgrade.md +197 -0
  948. package/skills/shared/prisma-orm/references/queries-and-performance.md +169 -0
  949. package/skills/shared/prisma-orm/scripts/verify.sh +137 -0
  950. package/skills/shared/prompt-engineering/SKILL.md +127 -0
  951. package/skills/shared/prompt-engineering/evals/README.md +11 -0
  952. package/skills/shared/prompt-engineering/evals/cases.yaml +46 -0
  953. package/skills/shared/prompt-engineering/references/eval-templates.md +94 -0
  954. package/skills/shared/prompt-engineering/references/output-contracts.md +120 -0
  955. package/skills/shared/prompt-engineering/scripts/verify.sh +84 -0
  956. package/skills/shared/python/SKILL.md +320 -0
  957. package/skills/shared/python/evals/README.md +19 -0
  958. package/skills/shared/python/evals/cases.yaml +46 -0
  959. package/skills/shared/python/references/async.md +136 -0
  960. package/skills/shared/python/references/stdlib.md +162 -0
  961. package/skills/shared/python/references/typing.md +160 -0
  962. package/skills/shared/python/scripts/verify.sh +125 -0
  963. package/skills/shared/rag/SKILL.md +209 -0
  964. package/skills/shared/rag/evals/README.md +13 -0
  965. package/skills/shared/rag/evals/cases.yaml +45 -0
  966. package/skills/shared/rag/references/evaluation.md +99 -0
  967. package/skills/shared/rag/references/pipeline.md +151 -0
  968. package/skills/shared/rag/scripts/verify.sh +99 -0
  969. package/skills/shared/rails/SKILL.md +264 -0
  970. package/skills/shared/rails/evals/README.md +12 -0
  971. package/skills/shared/rails/evals/cases.yaml +47 -0
  972. package/skills/shared/rails/references/activerecord.md +148 -0
  973. package/skills/shared/rails/references/hotwire.md +139 -0
  974. package/skills/shared/rails/references/testing.md +110 -0
  975. package/skills/shared/rails/scripts/verify.sh +128 -0
  976. package/skills/shared/railway/SKILL.md +245 -0
  977. package/skills/shared/railway/evals/README.md +14 -0
  978. package/skills/shared/railway/evals/cases.yaml +44 -0
  979. package/skills/shared/railway/references/cli-cookbook.md +137 -0
  980. package/skills/shared/railway/references/config-as-code.md +120 -0
  981. package/skills/shared/railway/scripts/verify.sh +162 -0
  982. package/skills/shared/react/SKILL.md +182 -0
  983. package/skills/shared/react/evals/README.md +3 -0
  984. package/skills/shared/react/evals/cases.yaml +43 -0
  985. package/skills/shared/react/references/data-and-state.md +152 -0
  986. package/skills/shared/react/references/performance.md +75 -0
  987. package/skills/shared/react/references/routing.md +99 -0
  988. package/skills/shared/react/scripts/verify.sh +123 -0
  989. package/skills/shared/react-native/SKILL.md +215 -0
  990. package/skills/shared/react-native/evals/README.md +3 -0
  991. package/skills/shared/react-native/evals/cases.yaml +42 -0
  992. package/skills/shared/react-native/references/native-modules.md +123 -0
  993. package/skills/shared/react-native/references/performance-debugging.md +46 -0
  994. package/skills/shared/react-native/scripts/verify.sh +120 -0
  995. package/skills/shared/redis/SKILL.md +298 -0
  996. package/skills/shared/redis/evals/README.md +10 -0
  997. package/skills/shared/redis/evals/cases.yaml +43 -0
  998. package/skills/shared/redis/references/caching.md +116 -0
  999. package/skills/shared/redis/references/locks-and-rate-limiting.md +140 -0
  1000. package/skills/shared/redis/references/queues.md +102 -0
  1001. package/skills/shared/redis/scripts/verify.sh +164 -0
  1002. package/skills/shared/render/SKILL.md +256 -0
  1003. package/skills/shared/render/evals/README.md +12 -0
  1004. package/skills/shared/render/evals/cases.yaml +45 -0
  1005. package/skills/shared/render/references/blueprint-reference.md +203 -0
  1006. package/skills/shared/render/scripts/verify.sh +167 -0
  1007. package/skills/shared/replicate/SKILL.md +210 -0
  1008. package/skills/shared/replicate/evals/README.md +9 -0
  1009. package/skills/shared/replicate/evals/cases.yaml +45 -0
  1010. package/skills/shared/replicate/references/cog-packaging.md +89 -0
  1011. package/skills/shared/replicate/references/deployments-api.md +87 -0
  1012. package/skills/shared/replicate/references/webhooks-and-async.md +110 -0
  1013. package/skills/shared/replicate/scripts/verify.sh +162 -0
  1014. package/skills/shared/research-ops/SKILL.md +200 -0
  1015. package/skills/shared/research-ops/evals/README.md +13 -0
  1016. package/skills/shared/research-ops/evals/cases.yaml +38 -0
  1017. package/skills/shared/research-ops/references/credibility-rubric.md +78 -0
  1018. package/skills/shared/research-ops/references/memo-template.md +63 -0
  1019. package/skills/shared/research-ops/scripts/verify.sh +181 -0
  1020. package/skills/shared/review/SKILL.md +314 -0
  1021. package/skills/shared/review/evals/README.md +84 -0
  1022. package/skills/shared/review/evals/cases.yaml +55 -0
  1023. package/skills/shared/ruby/SKILL.md +295 -0
  1024. package/skills/shared/ruby/evals/README.md +12 -0
  1025. package/skills/shared/ruby/evals/cases.yaml +41 -0
  1026. package/skills/shared/ruby/references/gems-and-testing.md +208 -0
  1027. package/skills/shared/ruby/references/metaprogramming.md +161 -0
  1028. package/skills/shared/ruby/scripts/verify.sh +83 -0
  1029. package/skills/shared/runpod/SKILL.md +238 -0
  1030. package/skills/shared/runpod/evals/README.md +11 -0
  1031. package/skills/shared/runpod/evals/cases.yaml +47 -0
  1032. package/skills/shared/runpod/references/cost-and-scaling.md +85 -0
  1033. package/skills/shared/runpod/references/serverless-workers.md +101 -0
  1034. package/skills/shared/runpod/scripts/verify.sh +126 -0
  1035. package/skills/shared/rust/SKILL.md +320 -0
  1036. package/skills/shared/rust/evals/README.md +12 -0
  1037. package/skills/shared/rust/evals/cases.yaml +42 -0
  1038. package/skills/shared/rust/references/async-tokio.md +141 -0
  1039. package/skills/shared/rust/references/axum-service.md +132 -0
  1040. package/skills/shared/rust/references/ownership.md +86 -0
  1041. package/skills/shared/rust/references/testing.md +108 -0
  1042. package/skills/shared/rust/scripts/verify.sh +91 -0
  1043. package/skills/shared/scaling/SKILL.md +137 -0
  1044. package/skills/shared/scaling/evals/README.md +3 -0
  1045. package/skills/shared/scaling/evals/cases.yaml +42 -0
  1046. package/skills/shared/scaling/references/load-testing-k6.md +127 -0
  1047. package/skills/shared/scaling/scripts/example.load.js +24 -0
  1048. package/skills/shared/scaling/scripts/verify.sh +70 -0
  1049. package/skills/shared/sdd/SKILL.md +250 -0
  1050. package/skills/shared/sdd/evals/README.md +60 -0
  1051. package/skills/shared/sdd/evals/cases.yaml +90 -0
  1052. package/skills/shared/sdd/references/model-routing.md +194 -0
  1053. package/skills/shared/sdd-init/SKILL.md +189 -0
  1054. package/skills/shared/sdd-init/evals/README.md +3 -0
  1055. package/skills/shared/sdd-init/evals/cases.yaml +43 -0
  1056. package/skills/shared/secure-coding/SKILL.md +336 -0
  1057. package/skills/shared/secure-coding/evals/README.md +68 -0
  1058. package/skills/shared/secure-coding/evals/cases.yaml +55 -0
  1059. package/skills/shared/secure-coding/references/authn-authz.md +249 -0
  1060. package/skills/shared/secure-coding/references/owasp-by-stack.md +574 -0
  1061. package/skills/shared/secure-coding/references/secrets-and-supply-chain.md +205 -0
  1062. package/skills/shared/secure-coding/references/threat-modeling.md +213 -0
  1063. package/skills/shared/secure-coding/scripts/verify.sh +208 -0
  1064. package/skills/shared/security-scan/SKILL.md +219 -0
  1065. package/skills/shared/security-scan/evals/README.md +14 -0
  1066. package/skills/shared/security-scan/evals/cases.yaml +50 -0
  1067. package/skills/shared/security-scan/references/tools.md +97 -0
  1068. package/skills/shared/security-scan/references/triage.md +92 -0
  1069. package/skills/shared/security-scan/scripts/verify.sh +108 -0
  1070. package/skills/shared/ship/SKILL.md +272 -0
  1071. package/skills/shared/ship/evals/README.md +89 -0
  1072. package/skills/shared/ship/evals/cases.yaml +44 -0
  1073. package/skills/shared/shopify/SKILL.md +229 -0
  1074. package/skills/shared/shopify/evals/README.md +14 -0
  1075. package/skills/shared/shopify/evals/cases.yaml +41 -0
  1076. package/skills/shared/shopify/references/apps-graphql.md +103 -0
  1077. package/skills/shared/shopify/references/checkout-extensibility.md +71 -0
  1078. package/skills/shared/shopify/references/liquid-themes.md +89 -0
  1079. package/skills/shared/shopify/scripts/verify.sh +120 -0
  1080. package/skills/shared/simplify-code/SKILL.md +101 -0
  1081. package/skills/shared/simplify-code/evals/README.md +3 -0
  1082. package/skills/shared/simplify-code/evals/cases.yaml +42 -0
  1083. package/skills/shared/skill-scout/SKILL.md +169 -0
  1084. package/skills/shared/skill-scout/evals/README.md +12 -0
  1085. package/skills/shared/skill-scout/evals/cases.yaml +56 -0
  1086. package/skills/shared/skill-scout/references/install-commands.md +76 -0
  1087. package/skills/shared/skill-scout/scripts/verify.sh +154 -0
  1088. package/skills/shared/solid-js/SKILL.md +260 -0
  1089. package/skills/shared/solid-js/evals/README.md +3 -0
  1090. package/skills/shared/solid-js/evals/cases.yaml +38 -0
  1091. package/skills/shared/solid-js/references/reactivity-deep-dive.md +89 -0
  1092. package/skills/shared/solid-js/references/router-and-start.md +93 -0
  1093. package/skills/shared/solid-js/scripts/verify.sh +130 -0
  1094. package/skills/shared/source-grounded-development/SKILL.md +108 -0
  1095. package/skills/shared/source-grounded-development/evals/README.md +3 -0
  1096. package/skills/shared/source-grounded-development/evals/cases.yaml +42 -0
  1097. package/skills/shared/specify/SKILL.md +391 -0
  1098. package/skills/shared/specify/evals/README.md +73 -0
  1099. package/skills/shared/specify/evals/cases.yaml +93 -0
  1100. package/skills/shared/specify/references/eliciting-requirements.md +117 -0
  1101. package/skills/shared/specify/references/spec-template.md +101 -0
  1102. package/skills/shared/speckit-analyze/SKILL.md +35 -0
  1103. package/skills/shared/speckit-assess-decide/SKILL.md +36 -0
  1104. package/skills/shared/speckit-assess-define/SKILL.md +36 -0
  1105. package/skills/shared/speckit-assess-intake/SKILL.md +38 -0
  1106. package/skills/shared/speckit-assess-research/SKILL.md +36 -0
  1107. package/skills/shared/speckit-assess-shape/SKILL.md +36 -0
  1108. package/skills/shared/speckit-bug-assess/SKILL.md +38 -0
  1109. package/skills/shared/speckit-bug-fix/SKILL.md +37 -0
  1110. package/skills/shared/speckit-bug-test/SKILL.md +37 -0
  1111. package/skills/shared/speckit-checklist/SKILL.md +35 -0
  1112. package/skills/shared/speckit-clarify/SKILL.md +32 -0
  1113. package/skills/shared/speckit-constitution/SKILL.md +35 -0
  1114. package/skills/shared/speckit-converge/SKILL.md +36 -0
  1115. package/skills/shared/speckit-implement/SKILL.md +32 -0
  1116. package/skills/shared/speckit-plan/SKILL.md +37 -0
  1117. package/skills/shared/speckit-specify/SKILL.md +36 -0
  1118. package/skills/shared/speckit-tasks/SKILL.md +34 -0
  1119. package/skills/shared/spreadsheet-ops/SKILL.md +180 -0
  1120. package/skills/shared/spreadsheet-ops/evals/README.md +33 -0
  1121. package/skills/shared/spreadsheet-ops/evals/cases.yaml +42 -0
  1122. package/skills/shared/spreadsheet-ops/references/formula-cookbook.md +70 -0
  1123. package/skills/shared/spreadsheet-ops/references/python-excel.md +87 -0
  1124. package/skills/shared/spreadsheet-ops/references/sheets-api-appsscript.md +118 -0
  1125. package/skills/shared/spreadsheet-ops/scripts/verify.sh +152 -0
  1126. package/skills/shared/spring-boot/SKILL.md +350 -0
  1127. package/skills/shared/spring-boot/evals/README.md +11 -0
  1128. package/skills/shared/spring-boot/evals/cases.yaml +49 -0
  1129. package/skills/shared/spring-boot/references/jpa.md +94 -0
  1130. package/skills/shared/spring-boot/references/security.md +92 -0
  1131. package/skills/shared/spring-boot/references/testing.md +95 -0
  1132. package/skills/shared/spring-boot/scripts/verify.sh +115 -0
  1133. package/skills/shared/sql/SKILL.md +286 -0
  1134. package/skills/shared/sql/evals/README.md +9 -0
  1135. package/skills/shared/sql/evals/cases.yaml +49 -0
  1136. package/skills/shared/sql/references/ctes-and-recursion.md +63 -0
  1137. package/skills/shared/sql/references/joins-and-sets.md +71 -0
  1138. package/skills/shared/sql/references/portability.md +38 -0
  1139. package/skills/shared/sql/references/window-functions.md +72 -0
  1140. package/skills/shared/sql/scripts/verify.sh +139 -0
  1141. package/skills/shared/sqlite-turso/SKILL.md +214 -0
  1142. package/skills/shared/sqlite-turso/evals/README.md +24 -0
  1143. package/skills/shared/sqlite-turso/evals/cases.yaml +45 -0
  1144. package/skills/shared/sqlite-turso/references/embedded-replicas.md +96 -0
  1145. package/skills/shared/sqlite-turso/scripts/verify.sh +95 -0
  1146. package/skills/shared/structured-extraction/SKILL.md +230 -0
  1147. package/skills/shared/structured-extraction/evals/README.md +13 -0
  1148. package/skills/shared/structured-extraction/evals/cases.yaml +70 -0
  1149. package/skills/shared/structured-extraction/references/providers.md +152 -0
  1150. package/skills/shared/structured-extraction/scripts/verify.sh +160 -0
  1151. package/skills/shared/suggest/SKILL.md +123 -0
  1152. package/skills/shared/suggest/evals/README.md +17 -0
  1153. package/skills/shared/suggest/evals/cases.yaml +78 -0
  1154. package/skills/shared/supabase/SKILL.md +268 -0
  1155. package/skills/shared/supabase/evals/README.md +12 -0
  1156. package/skills/shared/supabase/evals/cases.yaml +42 -0
  1157. package/skills/shared/supabase/references/auth-ssr.md +173 -0
  1158. package/skills/shared/supabase/references/rls-cookbook.md +122 -0
  1159. package/skills/shared/supabase/scripts/verify.sh +149 -0
  1160. package/skills/shared/svelte/SKILL.md +238 -0
  1161. package/skills/shared/svelte/evals/README.md +3 -0
  1162. package/skills/shared/svelte/evals/cases.yaml +41 -0
  1163. package/skills/shared/svelte/references/runes.md +97 -0
  1164. package/skills/shared/svelte/references/sveltekit-data.md +156 -0
  1165. package/skills/shared/svelte/scripts/verify.sh +128 -0
  1166. package/skills/shared/swift-ios/SKILL.md +224 -0
  1167. package/skills/shared/swift-ios/evals/README.md +3 -0
  1168. package/skills/shared/swift-ios/evals/cases.yaml +46 -0
  1169. package/skills/shared/swift-ios/references/concurrency.md +132 -0
  1170. package/skills/shared/swift-ios/references/testing.md +112 -0
  1171. package/skills/shared/swift-ios/scripts/verify.sh +98 -0
  1172. package/skills/shared/tasks/SKILL.md +265 -0
  1173. package/skills/shared/tasks/evals/README.md +70 -0
  1174. package/skills/shared/tasks/evals/cases.yaml +75 -0
  1175. package/skills/shared/tauri/SKILL.md +219 -0
  1176. package/skills/shared/tauri/evals/README.md +12 -0
  1177. package/skills/shared/tauri/evals/cases.yaml +46 -0
  1178. package/skills/shared/tauri/references/bundling-distribution.md +129 -0
  1179. package/skills/shared/tauri/references/security.md +143 -0
  1180. package/skills/shared/tauri/scripts/verify.sh +178 -0
  1181. package/skills/shared/technical-writing/SKILL.md +230 -0
  1182. package/skills/shared/technical-writing/evals/README.md +12 -0
  1183. package/skills/shared/technical-writing/evals/cases.yaml +53 -0
  1184. package/skills/shared/technical-writing/references/diataxis-modes.md +131 -0
  1185. package/skills/shared/technical-writing/references/vale-starter.md +90 -0
  1186. package/skills/shared/technical-writing/scripts/verify.sh +83 -0
  1187. package/skills/shared/testing-go/SKILL.md +263 -0
  1188. package/skills/shared/testing-go/evals/README.md +3 -0
  1189. package/skills/shared/testing-go/evals/cases.yaml +46 -0
  1190. package/skills/shared/testing-go/references/coverage-and-benchmarks.md +85 -0
  1191. package/skills/shared/testing-go/references/mocks-and-fakes.md +140 -0
  1192. package/skills/shared/testing-go/references/synctest-and-concurrency.md +82 -0
  1193. package/skills/shared/testing-go/scripts/verify.sh +72 -0
  1194. package/skills/shared/testing-py/SKILL.md +197 -0
  1195. package/skills/shared/testing-py/evals/README.md +5 -0
  1196. package/skills/shared/testing-py/evals/cases.yaml +44 -0
  1197. package/skills/shared/testing-py/references/mocking.md +141 -0
  1198. package/skills/shared/testing-py/references/property-testing.md +99 -0
  1199. package/skills/shared/testing-py/scripts/verify.sh +117 -0
  1200. package/skills/shared/testing-web/SKILL.md +244 -0
  1201. package/skills/shared/testing-web/evals/README.md +11 -0
  1202. package/skills/shared/testing-web/evals/cases.yaml +52 -0
  1203. package/skills/shared/testing-web/references/jest-setup.md +88 -0
  1204. package/skills/shared/testing-web/references/recipes.md +116 -0
  1205. package/skills/shared/testing-web/scripts/verify.sh +111 -0
  1206. package/skills/shared/together-fireworks/SKILL.md +176 -0
  1207. package/skills/shared/together-fireworks/evals/README.md +3 -0
  1208. package/skills/shared/together-fireworks/evals/cases.yaml +50 -0
  1209. package/skills/shared/together-fireworks/references/batch-and-tuning.md +59 -0
  1210. package/skills/shared/together-fireworks/references/models-and-pricing.md +79 -0
  1211. package/skills/shared/together-fireworks/scripts/verify.sh +165 -0
  1212. package/skills/shared/training-data/SKILL.md +226 -0
  1213. package/skills/shared/training-data/evals/README.md +13 -0
  1214. package/skills/shared/training-data/evals/cases.yaml +41 -0
  1215. package/skills/shared/training-data/references/formats.md +118 -0
  1216. package/skills/shared/training-data/references/synthesis-dedup-quality.md +134 -0
  1217. package/skills/shared/translation-l10n/SKILL.md +229 -0
  1218. package/skills/shared/translation-l10n/evals/README.md +3 -0
  1219. package/skills/shared/translation-l10n/evals/cases.yaml +39 -0
  1220. package/skills/shared/translation-l10n/references/icu-cookbook.md +82 -0
  1221. package/skills/shared/translation-l10n/references/rtl-and-bidi.md +60 -0
  1222. package/skills/shared/typescript/SKILL.md +225 -0
  1223. package/skills/shared/typescript/evals/README.md +15 -0
  1224. package/skills/shared/typescript/evals/cases.yaml +46 -0
  1225. package/skills/shared/typescript/references/build-and-monorepo.md +141 -0
  1226. package/skills/shared/typescript/references/type-system.md +162 -0
  1227. package/skills/shared/typescript/scripts/verify.sh +52 -0
  1228. package/skills/shared/ui-engineering/SKILL.md +113 -0
  1229. package/skills/shared/ui-engineering/evals/cases.yaml +38 -0
  1230. package/skills/shared/unity/SKILL.md +282 -0
  1231. package/skills/shared/unity/evals/README.md +8 -0
  1232. package/skills/shared/unity/evals/cases.yaml +43 -0
  1233. package/skills/shared/unity/references/build-and-platforms.md +65 -0
  1234. package/skills/shared/unity/references/input-system.md +102 -0
  1235. package/skills/shared/unity/references/lifecycle-deep-dive.md +75 -0
  1236. package/skills/shared/unreal/SKILL.md +270 -0
  1237. package/skills/shared/unreal/evals/README.md +12 -0
  1238. package/skills/shared/unreal/evals/cases.yaml +45 -0
  1239. package/skills/shared/unreal/references/blueprint-cpp-parity.md +109 -0
  1240. package/skills/shared/unreal/references/gameplay-framework.md +95 -0
  1241. package/skills/shared/unreal/references/packaging.md +83 -0
  1242. package/skills/shared/unslop/SKILL.md +143 -0
  1243. package/skills/shared/unslop/evals/README.md +25 -0
  1244. package/skills/shared/unslop/evals/cases.yaml +61 -0
  1245. package/skills/shared/unsloth/SKILL.md +254 -0
  1246. package/skills/shared/unsloth/evals/README.md +10 -0
  1247. package/skills/shared/unsloth/evals/cases.yaml +42 -0
  1248. package/skills/shared/unsloth/references/export.md +75 -0
  1249. package/skills/shared/unsloth/references/grpo.md +91 -0
  1250. package/skills/shared/unsloth/references/masking-and-templates.md +91 -0
  1251. package/skills/shared/variant-explorer/SKILL.md +93 -0
  1252. package/skills/shared/variant-explorer/evals/cases.yaml +38 -0
  1253. package/skills/shared/vector-db/SKILL.md +189 -0
  1254. package/skills/shared/vector-db/evals/README.md +10 -0
  1255. package/skills/shared/vector-db/evals/cases.yaml +45 -0
  1256. package/skills/shared/vector-db/references/engines.md +175 -0
  1257. package/skills/shared/vector-db/references/tuning.md +62 -0
  1258. package/skills/shared/vector-db/scripts/verify.sh +110 -0
  1259. package/skills/shared/vercel/SKILL.md +242 -0
  1260. package/skills/shared/vercel/evals/README.md +23 -0
  1261. package/skills/shared/vercel/evals/cases.yaml +45 -0
  1262. package/skills/shared/vercel/references/cli-cookbook.md +98 -0
  1263. package/skills/shared/vercel/references/vercel-json.md +120 -0
  1264. package/skills/shared/vercel/scripts/verify.sh +168 -0
  1265. package/skills/shared/verify/SKILL.md +230 -0
  1266. package/skills/shared/verify/evals/README.md +78 -0
  1267. package/skills/shared/verify/evals/cases.yaml +104 -0
  1268. package/skills/shared/vllm/SKILL.md +235 -0
  1269. package/skills/shared/vllm/evals/README.md +9 -0
  1270. package/skills/shared/vllm/evals/cases.yaml +47 -0
  1271. package/skills/shared/vllm/references/flags-and-endpoints.md +105 -0
  1272. package/skills/shared/vllm/references/memory-and-throughput.md +78 -0
  1273. package/skills/shared/vue-nuxt/SKILL.md +323 -0
  1274. package/skills/shared/vue-nuxt/evals/README.md +11 -0
  1275. package/skills/shared/vue-nuxt/evals/cases.yaml +49 -0
  1276. package/skills/shared/vue-nuxt/references/data-and-state.md +127 -0
  1277. package/skills/shared/vue-nuxt/references/migration-nuxt4.md +79 -0
  1278. package/skills/shared/vue-nuxt/references/nitro-and-rendering.md +117 -0
  1279. package/skills/shared/vue-nuxt/references/reactivity.md +135 -0
  1280. package/skills/shared/vue-nuxt/scripts/verify.sh +148 -0
  1281. package/skills/shared/webhooks/SKILL.md +229 -0
  1282. package/skills/shared/webhooks/evals/README.md +15 -0
  1283. package/skills/shared/webhooks/evals/cases.yaml +46 -0
  1284. package/skills/shared/webhooks/references/framework-raw-body.md +97 -0
  1285. package/skills/shared/webhooks/references/signature-schemes.md +66 -0
  1286. package/skills/shared/webhooks/scripts/verify.sh +142 -0
  1287. package/skills/shared/wordpress/SKILL.md +224 -0
  1288. package/skills/shared/wordpress/evals/README.md +3 -0
  1289. package/skills/shared/wordpress/evals/cases.yaml +50 -0
  1290. package/skills/shared/wordpress/references/hardening.md +108 -0
  1291. package/skills/shared/wordpress/references/performance.md +80 -0
  1292. package/skills/shared/wordpress/references/woocommerce.md +65 -0
  1293. package/skills/shared/wordpress/scripts/verify.sh +96 -0
  1294. package/skills/shared/worktrees/SKILL.md +204 -0
  1295. package/skills/shared/worktrees/evals/README.md +78 -0
  1296. package/skills/shared/worktrees/evals/cases.yaml +47 -0
@@ -0,0 +1,161 @@
1
+ # Indexing and EXPLAIN (InnoDB)
2
+
3
+ Everything here is MySQL 8.4 / MariaDB 11.8 InnoDB behaviour. If the same advice would hold on
4
+ PostgreSQL, it belongs in `sql`, not here.
5
+
6
+ ## The clustered-index model — why PK choice is everything
7
+
8
+ An InnoDB table *is* its primary-key B-tree. The full row lives in the leaf of the PK index; there
9
+ is no separate heap. Two consequences drive almost every indexing decision:
10
+
11
+ 1. **Every secondary index stores the PK value as its row pointer**, not a physical address. So a
12
+ wide PK is paid for once per secondary index, per row. A `CHAR(36)` random UUID PK on a table
13
+ with five secondary indexes carries 36 bytes × 5 copies of the key for every row, on top of the
14
+ clustered copy. A `BIGINT` PK is 8 bytes.
15
+ 2. **Insert locality follows PK order.** A monotonic PK (`BIGINT AUTO_INCREMENT`, ordered UUIDv7)
16
+ appends to the rightmost leaf — tight, sequential, cache-friendly. A random UUID v4 scatters
17
+ inserts across the whole B-tree, causing page splits and buffer-pool churn.
18
+
19
+ ```sql
20
+ -- Bad: random UUID as a human-readable CHAR(36) PK.
21
+ CREATE TABLE orders (
22
+ id CHAR(36) PRIMARY KEY, -- 36 bytes, random → page splits + fat secondary indexes
23
+ user_id BIGINT NOT NULL
24
+ ) ENGINE=InnoDB;
25
+
26
+ -- Good: small monotonic surrogate PK; store a public UUID as BINARY(16) if you need one.
27
+ CREATE TABLE orders (
28
+ id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
29
+ public_id BINARY(16) NOT NULL, -- UUIDv7 packed; ordered, 16 bytes
30
+ user_id BIGINT NOT NULL,
31
+ UNIQUE KEY uq_public (public_id)
32
+ ) ENGINE=InnoDB;
33
+ ```
34
+
35
+ If you must use a UUID PK, use a time-ordered one (UUIDv7) stored as `BINARY(16)`, never a random
36
+ v4 as `CHAR(36)`.
37
+
38
+ ## The leftmost-prefix rule, worked through
39
+
40
+ A composite index `INDEX (a, b, c)` is a single sorted B-tree keyed on the tuple `(a, b, c)`. It can
41
+ satisfy a predicate only by reading a *contiguous left prefix* of that tuple:
42
+
43
+ | Query predicate | Uses the index? | Why |
44
+ |---|---|---|
45
+ | `WHERE a = 1` | Yes (prefix `a`) | leftmost column present |
46
+ | `WHERE a = 1 AND b = 2` | Yes (prefix `a,b`) | contiguous prefix |
47
+ | `WHERE a = 1 AND b = 2 AND c = 3` | Yes (full key) | full prefix |
48
+ | `WHERE a = 1 ORDER BY b` | Yes — sort comes free | `b` is the next key column after the `a` equality |
49
+ | `WHERE b = 2` | No | skips the leftmost column `a` |
50
+ | `WHERE a = 1 AND c = 3` | Partial — only `a` | `b` is missing, so `c` can't be a seek key (used as a filter) |
51
+ | `WHERE a > 1 AND b = 2` | Range on `a` only | a range on an earlier column stops the next column from being a seek key |
52
+
53
+ The design rule that falls out: **equality columns first, then the single range or `ORDER BY`
54
+ column.** A range predicate "uses up" the index — no column after it can be a seek key, only a
55
+ filter.
56
+
57
+ ```sql
58
+ -- Query: WHERE user_id = ? AND status = ? AND created_at >= ? ORDER BY created_at DESC
59
+ -- Good: two equalities first, then the range/sort column last.
60
+ CREATE INDEX idx_u_s_c ON orders (user_id, status, created_at);
61
+ ```
62
+
63
+ ## Covering, prefix, invisible, and functional indexes
64
+
65
+ **Covering index** — if every column a query touches (SELECT list + WHERE + ORDER BY) is in one
66
+ index, InnoDB answers from the index alone and never walks back to the clustered PK leaf. `EXPLAIN`
67
+ shows `Using index`.
68
+
69
+ ```sql
70
+ SELECT status, total FROM orders WHERE user_id = ?;
71
+ -- Good: index covers the filter AND the selected columns → no PK back-lookup.
72
+ CREATE INDEX idx_cover ON orders (user_id, status, total);
73
+ ```
74
+
75
+ **Prefix index** — index the first N characters of a long `VARCHAR`/`TEXT`. Required for `TEXT`
76
+ (which can't be indexed whole) and useful to shrink a fat key. It can never be a covering index, and
77
+ N must be long enough for selectivity.
78
+
79
+ ```sql
80
+ CREATE INDEX idx_email_prefix ON users (email(20)); -- first 20 chars
81
+ -- Pick N from selectivity: SELECT COUNT(DISTINCT LEFT(email,20))/COUNT(*) FROM users;
82
+ ```
83
+
84
+ **Invisible index** (`INVISIBLE`) — the optimizer ignores it but maintains it. Use it to stage a new
85
+ index on a hot table, or to test "would dropping this index hurt?" without actually dropping it.
86
+
87
+ ```sql
88
+ ALTER TABLE orders ALTER INDEX idx_cover INVISIBLE; -- test impact; ALTER ... VISIBLE to restore
89
+ ```
90
+
91
+ **Functional / multi-valued index** (8.0.13+) — index an expression so a non-sargable predicate
92
+ becomes sargable without a generated column.
93
+
94
+ ```sql
95
+ CREATE INDEX idx_lower_email ON users ((LOWER(email))); -- query must use LOWER(email) too
96
+ CREATE INDEX idx_tags ON docs ((CAST(meta->'$.tags' AS UNSIGNED ARRAY))); -- multi-valued, for JSON arrays
97
+ ```
98
+
99
+ ## Reading EXPLAIN field by field
100
+
101
+ Three forms:
102
+ - `EXPLAIN <q>` — the chosen plan, no execution.
103
+ - `EXPLAIN ANALYZE <q>` — actually runs the query, reports *actual* rows and timing per node.
104
+ - `EXPLAIN FORMAT=JSON <q>` — full cost model, `used_key_parts`, `filtered`, attached conditions.
105
+
106
+ The **access `type`** is the first thing to read — worst to best:
107
+
108
+ | `type` | Meaning | Verdict |
109
+ |---|---|---|
110
+ | `ALL` | Full table scan | Bad on a large table |
111
+ | `index` | Full index scan (whole index read) | Usually still too much |
112
+ | `range` | Index range scan (`>`, `BETWEEN`, `IN`) | Good |
113
+ | `ref` | Non-unique index lookup by equality | Good |
114
+ | `eq_ref` | Unique/PK lookup, one row per join row | Great (joins) |
115
+ | `const` / `system` | At most one row, resolved as a constant | Best |
116
+
117
+ Then read:
118
+ - **`rows`** — *estimated* rows examined at this node. An estimate from stats, not truth — confirm
119
+ with `EXPLAIN ANALYZE`.
120
+ - **`filtered`** — estimated % of `rows` surviving the `WHERE`. Low `filtered` × high `rows` = the
121
+ index gets you to the neighbourhood but the predicate isn't selective in the index.
122
+ - **`key`** / **`key_len`** — the chosen index and how many bytes of it were used. A short `key_len`
123
+ on a composite index means only a prefix was usable.
124
+ - **`Extra`** flags: `Using index` (covering — good), `Using filesort` (a separate sort pass — the
125
+ index didn't satisfy `ORDER BY`), `Using temporary` (a materialised temp table, common with
126
+ `GROUP BY`/`DISTINCT` that can't use an index), `Using where` (post-filter after the index).
127
+
128
+ ## Every common "why no index" cause, with the fix
129
+
130
+ ```sql
131
+ -- 1. Function on the indexed column → index unusable.
132
+ -- Bad:
133
+ SELECT * FROM orders WHERE DATE(created_at) = '2026-06-01';
134
+ -- Good (sargable range):
135
+ SELECT * FROM orders WHERE created_at >= '2026-06-01' AND created_at < '2026-06-02';
136
+
137
+ -- 2. Implicit type cast: VARCHAR column compared to a number → per-row cast, no index.
138
+ -- Bad (phone is VARCHAR):
139
+ SELECT * FROM users WHERE phone = 6041234567;
140
+ -- Good:
141
+ SELECT * FROM users WHERE phone = '6041234567';
142
+
143
+ -- 3. Charset/collation mismatch on a JOIN key → per-row conversion, no index on the joined side.
144
+ -- Bad: a.code is utf8mb4, b.code is latin1.
145
+ -- Good: make both columns the same charset+collation (ALTER one side), then the join uses the index.
146
+
147
+ -- 4. Leading wildcard LIKE → no prefix to seek.
148
+ -- Bad:
149
+ SELECT * FROM products WHERE name LIKE '%phone%';
150
+ -- Good (prefix only):
151
+ SELECT * FROM products WHERE name LIKE 'phone%'; -- or a FULLTEXT index for substring search
152
+
153
+ -- 5. OR across different columns → often defeats a single index.
154
+ -- Bad:
155
+ SELECT * FROM t WHERE a = 1 OR b = 2;
156
+ -- Good: UNION two index-friendly halves, or an index_merge the optimizer can use.
157
+ SELECT * FROM t WHERE a = 1 UNION SELECT * FROM t WHERE b = 2;
158
+ ```
159
+
160
+ After every fix, re-run `EXPLAIN ANALYZE` and confirm the `type` improved and `rows` dropped — the
161
+ plan is the proof, not the rewrite.
@@ -0,0 +1,78 @@
1
+ # MySQL vs MariaDB divergence
2
+
3
+ MariaDB began as a MySQL fork and the two have diverged enough that copy-pasted SQL, auth setup, and
4
+ operational assumptions break across them. Always know *which* engine the project runs before you
5
+ answer. This is the depth behind the small table in `SKILL.md`.
6
+
7
+ ## Versions and support
8
+
9
+ | | MySQL | MariaDB |
10
+ |---|---|---|
11
+ | Current LTS | **8.4 LTS** (GA 2024-04-30, supported through April 2032) | **11.8 LTS** (2025 yearly LTS) |
12
+ | Innovation / short-cycle | **9.x** (9.0 GA 2024-07-01, …, 9.4.0 2025-07-22) | rolling releases between LTS years |
13
+ | Owner | Oracle | MariaDB Foundation / MariaDB plc |
14
+
15
+ MariaDB version numbers do **not** track MySQL's — MariaDB 11.8 is not "MySQL 11". Feature parity is
16
+ partial and one-directional in places (MariaDB has features MySQL lacks and vice versa).
17
+
18
+ ## Authentication
19
+
20
+ | | MySQL 8.4 / 9.x | MariaDB 11.8 |
21
+ |---|---|---|
22
+ | Default plugin | `caching_sha2_password` (SHA-256, server-side cache; TLS for first auth) | `mysql_native_password` and `ed25519` |
23
+ | `mysql_native_password` | Disabled by default in 8.4, **removed in 9.0** | Still a first-class plugin |
24
+
25
+ This is the most common cross-engine connection failure: a client/driver configured for MariaDB's
26
+ native auth hits a MySQL 8.4 server and gets *"Authentication plugin caching_sha2_password cannot be
27
+ loaded"* — fix is a `caching_sha2_password`-aware client over TLS, not re-enabling the old plugin.
28
+
29
+ ## Vector search — NOT drop-in compatible
30
+
31
+ Both engines added native vector search, but with **incompatible syntax**:
32
+
33
+ | | MySQL 9.0+ (Innovation only) | MariaDB 11.8 (LTS) |
34
+ |---|---|---|
35
+ | Type | `VECTOR(n)` — 4-byte floats, default max 2048, max 16383 entries | `VECTOR(n)` |
36
+ | Parse / format | `STRING_TO_VECTOR()` / `TO_VECTOR()`, `VECTOR_TO_STRING()` / `FROM_VECTOR()` | `VEC_FromText()` / `VEC_ToText()` |
37
+ | Distance | distance functions per the 9.x line | `VEC_DISTANCE_EUCLIDEAN()`, `VEC_DISTANCE_COSINE()`, `VEC_DISTANCE()` |
38
+ | Acceleration | — | SIMD (AVX2/AVX512/ARM/Power10) |
39
+ | Key constraint | A `VECTOR` column **cannot be any kind of key** (no PK/FK/UK/partition) | indexable for approximate search |
40
+ | LTS availability | **Not in 8.4 LTS** — Innovation 9.x only | In the 11.8 LTS line |
41
+
42
+ If a project needs vector search on a conservative LTS today, MariaDB 11.8 has it in LTS; MySQL only
43
+ has it on the short-lived 9.x Innovation track. The SQL is not portable between them — pick one and
44
+ write to its functions.
45
+
46
+ ## Snapshot isolation
47
+
48
+ MariaDB 11.8 ships `innodb_snapshot_isolation` defaulting **ON**, which makes a `REPEATABLE READ`
49
+ transaction *detect write conflicts* (raising an error instead of silently applying a stale-snapshot
50
+ write). Stock MySQL `REPEATABLE READ` does **not** do this — it gives a consistent snapshot but no
51
+ write-conflict detection. Code that relies on MariaDB raising a conflict error will silently succeed
52
+ (and possibly lose an update) on MySQL, and vice versa code that doesn't expect the error will fail
53
+ on MariaDB.
54
+
55
+ ## Other SQL surface divergences
56
+
57
+ | Feature | MySQL | MariaDB |
58
+ |---|---|---|
59
+ | `RETURNING` | `INSERT ... RETURNING` only (8.0+) | `INSERT` / `UPDATE` / `DELETE ... RETURNING` |
60
+ | Sequences | No `CREATE SEQUENCE` (use `AUTO_INCREMENT`) | `CREATE SEQUENCE` supported |
61
+ | System-versioned (temporal) tables | Not supported | `WITH SYSTEM VERSIONING` + `FOR SYSTEM_TIME` queries |
62
+ | `JSON` type | Native binary `JSON` | Historically a `LONGTEXT` alias with JSON functions; check the version — behaviour and storage differ |
63
+ | Optimizer / hints | Oracle-style optimizer, `/*+ HINT */` hint syntax, hypergraph optimizer in newer Innovation | Different optimizer, different hint set and defaults; plans differ for the same query |
64
+ | Storage engines | InnoDB-centric | InnoDB plus Aria, ColumnStore, Spider, etc. |
65
+
66
+ ## Migration gotchas, both directions
67
+
68
+ - **MariaDB → MySQL**: drop reliance on sequences, system-versioned tables, multi-statement
69
+ `RETURNING`, and the snapshot-isolation conflict behaviour. Re-check JSON columns. Re-key any
70
+ vector columns and rewrite vector SQL.
71
+ - **MySQL → MariaDB**: auth changes (native/ed25519 vs caching_sha2_password); rewrite MySQL 9
72
+ vector SQL to `VEC_*`; expect `innodb_snapshot_isolation=ON` to start raising conflict errors your
73
+ app didn't see before; verify optimizer-hint syntax and re-test query plans.
74
+ - **Don't trust `mysqldump` round-trips blindly** across engines — types, charsets, and engine
75
+ clauses can differ. Dump, then read the DDL before loading into the other engine.
76
+
77
+ Bottom line: treat MySQL and MariaDB as two different databases that happen to share a wire protocol
78
+ and a lot of grammar. Confirm the engine, then write to its specifics.
@@ -0,0 +1,120 @@
1
+ # Online DDL and migrations (the MySQL mechanics)
2
+
3
+ This file owns the MySQL-only knobs — `ALGORITHM=`, `LOCK=`, pt-online-schema-change, gh-ost — that
4
+ make a schema change run without an outage. The vendor-neutral *strategy* (expand-contract, batched
5
+ backfill, dual-write) lives in `db-migrations`; this is the InnoDB machinery that strategy rides on.
6
+
7
+ ## ALGORITHM / LOCK matrix per operation
8
+
9
+ Every `ALTER TABLE` resolves to one of three algorithms. **Always state it explicitly** — if you
10
+ omit `ALGORITHM=`, MySQL silently picks the cheapest one that works, and "cheapest that works" can
11
+ quietly be `COPY`, which locks and rebuilds a multi-GB table.
12
+
13
+ | Operation | Best algorithm | Notes |
14
+ |---|---|---|
15
+ | Add column at the end | `INSTANT` | metadata-only since 8.0.12; near-free |
16
+ | Add column in the middle | `INSTANT` (8.0.29+) | older versions fall back to INPLACE/COPY |
17
+ | Drop a column | `INSTANT` (8.0.29+) | else INPLACE |
18
+ | Rename a column | `INSTANT` | metadata-only |
19
+ | Set / drop a column DEFAULT | `INSTANT` | metadata-only |
20
+ | Add a secondary index | `INPLACE, LOCK=NONE` | rebuilds the index without blocking writes |
21
+ | Drop an index | `INPLACE` (often INSTANT) | metadata change |
22
+ | Change column NULL → NOT NULL | `INPLACE` | requires the data to already satisfy it |
23
+ | Change column data type / charset | `COPY` | full table rebuild — this is the dangerous one |
24
+ | Add / drop a PRIMARY KEY | `COPY` (usually) | rebuilds the clustered index and every secondary |
25
+ | Change ROW_FORMAT / KEY_BLOCK_SIZE | `INPLACE` (rebuild) | not blocking but rewrites the table |
26
+
27
+ ```sql
28
+ -- Always be explicit. If the operation can't be done with the algorithm you named, the statement
29
+ -- FAILS LOUDLY instead of silently degrading to a locking COPY.
30
+ ALTER TABLE orders ADD COLUMN note VARCHAR(255) NULL, ALGORITHM=INSTANT, LOCK=NONE;
31
+
32
+ -- Adding a secondary index on a live table: rebuild without blocking writes.
33
+ ALTER TABLE orders ADD INDEX idx_user_created (user_id, created_at),
34
+ ALGORITHM=INPLACE, LOCK=NONE;
35
+ ```
36
+
37
+ There is a hard limit on `INSTANT` add-column: each `INSTANT` add increments a row-version counter,
38
+ and after a number of them the table needs a rebuild before more `INSTANT` adds are allowed. Check
39
+ `information_schema.INNODB_TABLES.INSTANT_COLS` / row-version columns if `INSTANT` starts refusing.
40
+
41
+ ## When INSTANT/INPLACE can't do it non-blockingly → gh-ost or pt-osc
42
+
43
+ For a `COPY`-only change on a large *hot* table (type change, PK change, charset migration), don't
44
+ run it in place at peak. Use an external tool that builds a shadow table, copies rows in chunks,
45
+ keeps it in sync, and swaps atomically.
46
+
47
+ ### gh-ost (GitHub) — binlog-based, triggerless
48
+
49
+ gh-ost reads the binlog to keep the shadow table in sync, so it adds no triggers to your hot table
50
+ and throttles cleanly on replica lag.
51
+
52
+ ```bash
53
+ # Always --dry-run (omit --execute) first; read the plan, then add --execute.
54
+ gh-ost \
55
+ --host=primary.db --database=shop --table=orders \
56
+ --alter="MODIFY COLUMN total DECIMAL(19,4) NOT NULL" \
57
+ --max-load="Threads_running=25" \
58
+ --critical-load="Threads_running=100" \
59
+ --max-lag-millis=1500 \
60
+ --throttle-control-replicas="replica1.db,replica2.db" \
61
+ --chunk-size=1000 \
62
+ --cut-over=default \
63
+ --postpone-cut-over-flag-file=/tmp/ghost.postpone \
64
+ --execute
65
+ # Touch/remove the postpone file to control exactly when the atomic cutover happens.
66
+ ```
67
+
68
+ gh-ost needs `binlog_format=ROW` and either a connection to a replica or `--allow-on-master` with
69
+ binlog access. It can't follow a table that already has triggers.
70
+
71
+ ### pt-online-schema-change (Percona) — trigger-based
72
+
73
+ Use pt-osc when gh-ost can't read the binlog (no replica, restricted binlog). It installs AFTER
74
+ INSERT/UPDATE/DELETE triggers on the original table to mirror writes into the shadow copy.
75
+
76
+ ```bash
77
+ pt-online-schema-change \
78
+ --alter "MODIFY COLUMN total DECIMAL(19,4) NOT NULL" \
79
+ --max-lag=1.5 --check-slave-lag replica1.db \
80
+ --chunk-time=0.5 \
81
+ --dry-run \
82
+ D=shop,t=orders
83
+ # Replace --dry-run with --execute once the dry run is clean.
84
+ ```
85
+
86
+ Caveat: pt-osc's triggers conflict with any pre-existing triggers on the table, and foreign keys
87
+ referencing the table need `--alter-foreign-keys-method` chosen deliberately (rebuild_constraints
88
+ vs drop_swap) — a wrong choice can briefly break FK integrity at cutover.
89
+
90
+ ### Choosing between them
91
+
92
+ | Situation | Tool |
93
+ |---|---|
94
+ | You have a replica and ROW binlog, no existing triggers | gh-ost (lighter, no triggers on hot table) |
95
+ | No replica / restricted binlog access | pt-osc (triggers) |
96
+ | Table already has triggers | pt-osc with care, or refactor first |
97
+ | Foreign keys point at the table | pt-osc with an explicit `--alter-foreign-keys-method` |
98
+
99
+ ## Rollback
100
+
101
+ - An `INSTANT`/`INPLACE` `ALTER` is a single transaction-like operation: if it fails it leaves the
102
+ table unchanged. There is no half-applied state to clean up.
103
+ - gh-ost / pt-osc: before cutover, the original table is untouched — abort freely (gh-ost: remove
104
+ the panic flag or kill it; the `_gho`/`_new` shadow + `_del` old table are left for you to drop).
105
+ *After* cutover, "rollback" means running the reverse `ALTER` as a new migration. Design the
106
+ reverse step before you cut over.
107
+
108
+ ## How this composes with db-migrations expand-contract
109
+
110
+ The vendor-neutral pattern from `db-migrations` is: **expand** (add the new column/index, both old
111
+ and new readable), **migrate** (backfill + dual-write), **contract** (drop the old). Each phase maps
112
+ to a specific MySQL mechanic here:
113
+
114
+ - *Expand* = an `ALGORITHM=INSTANT` add-column / `INPLACE` add-index — cheap, non-blocking.
115
+ - *Backfill* = chunked `UPDATE ... WHERE id BETWEEN ? AND ?` in small batches (never one giant
116
+ `UPDATE` that holds gap locks across the whole table); or let gh-ost do it for a type change.
117
+ - *Contract* = an `INSTANT` drop-column once nothing reads the old one.
118
+
119
+ Keep each phase a separate, forward-only migration so the reverse is always a clean step.
120
+ `db-migrations` owns *why* and *in what order*; this skill owns *which `ALGORITHM=` / which tool*.
@@ -0,0 +1,115 @@
1
+ # Replication and HA
2
+
3
+ MySQL 8.4 / MariaDB 11.8 replication mechanics: binlog formats, GTID, the topologies, lag diagnosis,
4
+ and failover. Backup *strategy* as a discipline lives in `backups`; this owns the binlog/PITR and
5
+ replication-setup mechanics.
6
+
7
+ ## Binlog format — ROW, and why
8
+
9
+ | Format | What it logs | Verdict |
10
+ |---|---|---|
11
+ | `ROW` | The actual before/after row images | **The only safe default.** Deterministic; replicas apply exactly what happened. |
12
+ | `STATEMENT` | The literal SQL text | Non-deterministic statements (`NOW()`, `UUID()`, `LIMIT` without `ORDER BY`, triggers) replicate *differently* on the replica → silent data drift. |
13
+ | `MIXED` | STATEMENT, switching to ROW when it detects non-determinism | Better than STATEMENT but the detection is imperfect; prefer ROW outright. |
14
+
15
+ ```ini
16
+ # my.cnf — the replication baseline.
17
+ [mysqld]
18
+ server_id = 1 # unique per host in the topology
19
+ log_bin = mysql-bin
20
+ binlog_format = ROW
21
+ gtid_mode = ON
22
+ enforce_gtid_consistency = ON
23
+ binlog_expire_logs_seconds = 604800 # 7 days of binlog retained for replicas/PITR
24
+ ```
25
+
26
+ ## GTID-based replication, end to end
27
+
28
+ A GTID (Global Transaction ID) tags every committed transaction with `source_uuid:sequence`. The
29
+ replica records which GTIDs it has applied, so with `SOURCE_AUTO_POSITION=1` it requests exactly the
30
+ transactions it's missing — no manual log-file/position bookkeeping, and each transaction applies
31
+ **at most once** (auto-skip on reconnect/failover).
32
+
33
+ **MySQL 8.4 adds tagged GTIDs**: an optional third, colon-separated component
34
+ (`source_uuid:tag:sequence`) that groups related transactions — useful to mark, filter, or
35
+ selectively skip a logical batch.
36
+
37
+ ```sql
38
+ -- On the replica (8.4 syntax: CHANGE REPLICATION SOURCE TO, not the old CHANGE MASTER TO).
39
+ CHANGE REPLICATION SOURCE TO
40
+ SOURCE_HOST='primary.db',
41
+ SOURCE_USER='repl',
42
+ SOURCE_PASSWORD='***',
43
+ SOURCE_SSL=1, -- caching_sha2_password needs TLS
44
+ SOURCE_AUTO_POSITION=1; -- GTID auto-positioning
45
+ START REPLICA;
46
+ SHOW REPLICA STATUS\G
47
+ ```
48
+
49
+ The replication user authenticates with `caching_sha2_password` by default, so the channel must use
50
+ `SOURCE_SSL=1` or the first-time auth fails.
51
+
52
+ ## Topology chooser
53
+
54
+ | Topology | Durability on primary loss | Use when |
55
+ |---|---|---|
56
+ | **Async** (default) | Can lose the last un-replicated transactions | Read scaling, geo replicas, where small data-loss-on-failover is acceptable |
57
+ | **Semi-synchronous** | Primary waits for ≥1 replica to *receive* (not apply) each commit | You need "committed means at least one replica has it" without full consensus cost |
58
+ | **Group Replication / InnoDB Cluster** | Quorum-committed (Paxos-style); automatic failover | You need automatic failover and a single logical primary with managed membership |
59
+
60
+ InnoDB Cluster = Group Replication + MySQL Shell (`dba.createCluster()`) for orchestration + **MySQL
61
+ Router** as the connection front-end that routes writes to the primary and reads to replicas. Apps
62
+ connect to the Router's port (6446 read-write / 6447 read-only), never directly to a node, so a
63
+ failover is transparent to the application.
64
+
65
+ ```ini
66
+ # Semi-sync (loadable component in 8.4): primary waits for one replica to ACK receipt.
67
+ [mysqld]
68
+ rpl_semi_sync_source_enabled = 1
69
+ rpl_semi_sync_source_timeout = 1000 # ms before falling back to async if no ACK
70
+ rpl_semi_sync_replica_enabled = 1
71
+ ```
72
+
73
+ ## Replica-lag diagnosis — read the field, don't eyeball
74
+
75
+ ```sql
76
+ SHOW REPLICA STATUS\G
77
+ -- Read in this order:
78
+ -- Replica_IO_Running / Replica_SQL_Running → both must be 'Yes'
79
+ -- Last_IO_Error / Last_SQL_Error → why it stopped
80
+ -- Seconds_Behind_Source → coarse; NULL means BROKEN, not "0 lag"
81
+ ```
82
+
83
+ `Seconds_Behind_Source` is a blunt instrument (it's relative to the SQL thread's current event, and
84
+ goes NULL the moment a thread stops). For real, per-worker lag use performance_schema:
85
+
86
+ ```sql
87
+ SELECT WORKER_ID,
88
+ LAST_APPLIED_TRANSACTION,
89
+ APPLYING_TRANSACTION,
90
+ APPLYING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP
91
+ FROM performance_schema.replication_applier_status_by_worker;
92
+
93
+ -- End-to-end lag = now() - the original commit timestamp of the transaction being applied.
94
+ ```
95
+
96
+ If lag is structural, enable multi-threaded apply (`replica_parallel_workers > 0`,
97
+ `replica_parallel_type = LOGICAL_CLOCK`) so the replica applies independent transactions in parallel.
98
+
99
+ ## Failover
100
+
101
+ - **Async/semi-sync, manual**: pick the most-caught-up replica (highest applied GTID set), point the
102
+ other replicas and the app at it, `RESET REPLICA ALL` on the new primary. GTID auto-positioning
103
+ means surviving replicas resync from exactly where they were.
104
+ - **InnoDB Cluster**: failover is automatic — the group elects a new primary; MySQL Router redirects
105
+ writes. Your job is to monitor `cluster.status()` and re-add the recovered node with
106
+ `cluster.rejoinInstance()`.
107
+ - Always confirm the old primary is truly down (fenced) before promoting — a split brain where two
108
+ nodes both accept writes is the worst outcome, far worse than a few seconds of downtime.
109
+
110
+ ## Read-replica routing
111
+
112
+ Route reads to replicas but **never read your own just-written row from a lagging async replica** —
113
+ that's the read-after-write consistency trap. Either route a user's reads to the primary for a short
114
+ window after their write, or use `WAIT_FOR_EXECUTED_GTID_SET()` on the replica to block until it has
115
+ caught up to the GTID your write produced. InnoDB Cluster's Router can be configured for this.
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # verify.sh — mysql skill gate. Run from your PROJECT root.
5
+ #
6
+ # What it does (read-only, idempotent, never writes, NEVER connects to a database):
7
+ # Discovers *.sql and *.cnf / my.cnf files and heuristically lints them for the MySQL/InnoDB
8
+ # foot-guns this skill warns about:
9
+ # - CHARACTER SET utf8 / CHARSET=utf8 that is not utf8mb4 (silent emoji truncation) [warn]
10
+ # - ENGINE=MyISAM on CREATE TABLE (no transactions/FKs) [warn]
11
+ # - likely random-UUID / CHAR(36) PRIMARY KEY (InnoDB clustered-index bloat) [warn]
12
+ # - default_authentication_plugin = mysql_native_password in config [warn]
13
+ # - an indexed column wrapped in a function in WHERE (DATE(col)/LOWER(col), non-sargable) [warn]
14
+ # - binlog_format = STATEMENT in a committed config [FAIL]
15
+ # - unbalanced parens/single-quotes in a SQL statement [FAIL]
16
+ # Optionally runs `sqlfluff --dialect mysql` if sqlfluff is installed.
17
+ #
18
+ # Exit code: non-zero ONLY on (a) unbalanced delimiters, (b) a committed binlog_format=STATEMENT,
19
+ # or (c) a real sqlfluff lint error. Every schema heuristic is advisory [warn], never a failure.
20
+ # An empty/clean target exits 0 with no false failure.
21
+ #
22
+ # Portability: stock macOS bash 3.2 — no mapfile, no associative arrays. Arrays are initialised so
23
+ # they are safe to expand under `set -u`. Pure grep/awk; no network, no mysql client.
24
+
25
+ YELLOW=$'\033[33m'; GREEN=$'\033[32m'; RED=$'\033[31m'; NC=$'\033[0m'
26
+ EXIT=0
27
+ note() { printf '%s[warn]%s %s\n' "$YELLOW" "$NC" "$*"; }
28
+ skip() { printf '%s[skip]%s %s\n' "$YELLOW" "$NC" "$*"; }
29
+ ok() { printf '%s[ok]%s %s\n' "$GREEN" "$NC" "$*"; }
30
+ err() { printf '%s[fail]%s %s\n' "$RED" "$NC" "$*"; EXIT=1; }
31
+
32
+ ROOT="$(pwd)"
33
+
34
+ # --- discover files (exclude vendor dirs) -----------------------------------------------------
35
+ SQL_FILES=()
36
+ while IFS= read -r -d '' f; do SQL_FILES+=("$f"); done < <(
37
+ find "$ROOT" \
38
+ \( -path '*/node_modules/*' -o -path '*/.git/*' -o -path '*/vendor/*' -o -path '*/.venv/*' \) -prune -o \
39
+ -type f -name '*.sql' -print0 2>/dev/null
40
+ )
41
+
42
+ CNF_FILES=()
43
+ while IFS= read -r -d '' f; do CNF_FILES+=("$f"); done < <(
44
+ find "$ROOT" \
45
+ \( -path '*/node_modules/*' -o -path '*/.git/*' -o -path '*/vendor/*' -o -path '*/.venv/*' \) -prune -o \
46
+ -type f \( -name '*.cnf' -o -name 'my.cnf' \) -print0 2>/dev/null
47
+ )
48
+
49
+ if [ "${#SQL_FILES[@]}" -eq 0 ] && [ "${#CNF_FILES[@]}" -eq 0 ]; then
50
+ ok "no *.sql or *.cnf files found — nothing to lint"
51
+ exit 0
52
+ fi
53
+
54
+ # --- strip comments + string literals for the balance heuristic -------------------------------
55
+ # Pure awk so it behaves identically on BSD (macOS) and GNU awk. Removes -- line comments,
56
+ # /* */ block comments, and '...' single-quoted literals (handling '' escapes) so the
57
+ # paren/quote balance check does not trip on legitimate content.
58
+ strip_sql() {
59
+ awk '
60
+ BEGIN { inblock = 0; instr = 0 }
61
+ {
62
+ line = $0; out = ""; i = 1; n = length(line)
63
+ while (i <= n) {
64
+ ch = substr(line, i, 1)
65
+ ch2 = substr(line, i, 2)
66
+ if (inblock) { p = index(substr(line,i), "*/"); if (p==0){i=n+1;continue} i+=p+1; inblock=0; continue }
67
+ if (instr) {
68
+ if (ch == "\x27") {
69
+ if (substr(line,i,2) == "\x27\x27") { i+=2; continue } # escaped quote
70
+ instr = 0; i++; continue
71
+ }
72
+ i++; continue
73
+ }
74
+ if (ch2 == "--") { i = n + 1; continue }
75
+ if (ch2 == "/*") { inblock = 1; i += 2; continue }
76
+ if (ch == "\x27") { instr = 1; i++; continue }
77
+ out = out ch; i++
78
+ }
79
+ print out
80
+ }
81
+ ' "$1"
82
+ }
83
+
84
+ # --- per-SQL-file checks ----------------------------------------------------------------------
85
+ for f in ${SQL_FILES[@]+"${SQL_FILES[@]}"}; do
86
+ # legacy utf8 (not utf8mb4)
87
+ if grep -Eiq '(CHARACTER[[:space:]]+SET|CHARSET[[:space:]]*=)[[:space:]]*utf8([^m]|$|mb3)' "$f"; then
88
+ note "$f: legacy 'utf8' (utf8mb3) charset — silently truncates emoji. Use utf8mb4."
89
+ fi
90
+ # MyISAM
91
+ if grep -Eiq 'ENGINE[[:space:]]*=[[:space:]]*MyISAM' "$f"; then
92
+ note "$f: ENGINE=MyISAM — no transactions/FKs, crash-unsafe. Use InnoDB."
93
+ fi
94
+ # likely random-UUID / CHAR(36) PK
95
+ if grep -Eiq 'CHAR\(36\)[^,)]*PRIMARY[[:space:]]+KEY|PRIMARY[[:space:]]+KEY[^,)]*CHAR\(36\)' "$f"; then
96
+ note "$f: CHAR(36) PRIMARY KEY — likely a random UUID PK; bloats InnoDB secondary indexes. Prefer BIGINT AUTO_INCREMENT or UUIDv7 as BINARY(16)."
97
+ fi
98
+ # function-wrapped indexed column in WHERE (non-sargable)
99
+ if grep -Eiq 'WHERE[[:space:]].*(DATE|LOWER|UPPER|YEAR|MONTH|CAST|CONVERT)[[:space:]]*\([[:alnum:]_.`]+\)[[:space:]]*=' "$f"; then
100
+ note "$f: a function-wrapped column in WHERE (e.g. WHERE DATE(col)=...) is non-sargable — the index can't be used. Rewrite to a range, or add a functional/generated-column index."
101
+ fi
102
+ # balance check on comment/literal-stripped SQL
103
+ stripped="$(strip_sql "$f")"
104
+ opens="$(printf '%s' "$stripped" | tr -cd '(' | wc -c | tr -d ' ')"
105
+ closes="$(printf '%s' "$stripped" | tr -cd ')' | wc -c | tr -d ' ')"
106
+ quotes="$(printf '%s' "$stripped" | tr -cd "\047" | wc -c | tr -d ' ')"
107
+ if [ "$opens" != "$closes" ]; then
108
+ err "$f: unbalanced parentheses ($opens '(' vs $closes ')')."
109
+ fi
110
+ if [ $(( quotes % 2 )) -ne 0 ]; then
111
+ err "$f: unbalanced single-quotes after stripping comments/literals."
112
+ fi
113
+ done
114
+
115
+ # --- per-config-file checks -------------------------------------------------------------------
116
+ for f in ${CNF_FILES[@]+"${CNF_FILES[@]}"}; do
117
+ if grep -Eiq '^[[:space:]]*binlog_format[[:space:]]*=[[:space:]]*STATEMENT' "$f"; then
118
+ err "$f: binlog_format = STATEMENT — non-deterministic statements drift on replicas. Use ROW."
119
+ fi
120
+ if grep -Eiq '^[[:space:]]*default_authentication_plugin[[:space:]]*=[[:space:]]*mysql_native_password' "$f"; then
121
+ note "$f: default_authentication_plugin = mysql_native_password — disabled by default in 8.4, removed in 9.0. Use caching_sha2_password + TLS."
122
+ fi
123
+ done
124
+
125
+ # --- optional sqlfluff --------------------------------------------------------------------------
126
+ if [ "${#SQL_FILES[@]}" -gt 0 ]; then
127
+ if command -v sqlfluff >/dev/null 2>&1; then
128
+ if sqlfluff lint --dialect mysql ${SQL_FILES[@]+"${SQL_FILES[@]}"} >/dev/null 2>&1; then
129
+ ok "sqlfluff (dialect mysql): no lint errors"
130
+ else
131
+ err "sqlfluff (dialect mysql) reported lint errors — run: sqlfluff lint --dialect mysql <file>"
132
+ fi
133
+ else
134
+ skip "sqlfluff not installed — skipping SQL lint (advisory)"
135
+ fi
136
+ fi
137
+
138
+ if [ "$EXIT" -eq 0 ]; then
139
+ ok "verify passed (advisory warnings, if any, are non-blocking)"
140
+ fi
141
+ exit "$EXIT"