@hasna/skills 0.1.59 → 0.1.61

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 (1059) hide show
  1. package/README.md +189 -60
  2. package/agent-skills/README.md +41 -0
  3. package/agent-skills/fleet-package-rollout/SKILL.md +169 -0
  4. package/agent-skills/inbox/SKILL.md +25 -0
  5. package/agent-skills/inbox/scripts/inbox +109 -0
  6. package/agent-skills/inbox/tests/test_registered_sender_id.sh +92 -0
  7. package/agent-skills/inbox-monitor/SKILL.md +41 -0
  8. package/agent-skills/inbox-monitor/scripts/inbox_monitor.sh +91 -0
  9. package/agent-skills/inbox-monitor/scripts/test_inbox_monitor.sh +71 -0
  10. package/agent-skills/merge-pr/SKILL.md +85 -0
  11. package/agent-skills/merge-pr/references/merge-safety.md +82 -0
  12. package/agent-skills/merge-pr/scripts/merge_pr_guard.py +694 -0
  13. package/agent-skills/merge-pr/scripts/test_merge_pr_guard.py +647 -0
  14. package/agent-skills/merge-pr/tests/fixtures/multi-commit-synthesized.json +28 -0
  15. package/agent-skills/merge-pr/tests/fixtures/trailer-free-provider.json +28 -0
  16. package/agent-skills/skill-goal-execute/SKILL.md +115 -0
  17. package/agent-skills/skill-login/SKILL.md +109 -0
  18. package/agent-skills/skill-project-create/SKILL.md +91 -0
  19. package/agent-skills/skill-publish/SKILL.md +207 -0
  20. package/bin/index.js +2457 -3344
  21. package/bin/mcp.js +1127 -2641
  22. package/bin/migrate.js +955 -33
  23. package/bin/server.js +2367 -1989
  24. package/bin/worker.js +2089 -151
  25. package/dist/cli/cli.test-utils.d.ts +13 -2
  26. package/dist/cli/commands/publish.d.ts +30 -0
  27. package/dist/cli/commands/registry.d.ts +8 -0
  28. package/dist/index.d.ts +8 -6
  29. package/dist/index.js +1734 -2720
  30. package/dist/lib/agent-sync.d.ts +123 -0
  31. package/dist/lib/api-url.d.ts +34 -0
  32. package/dist/lib/auth-store.d.ts +21 -5
  33. package/dist/lib/blog-article.d.ts +37 -0
  34. package/dist/lib/config.d.ts +56 -2
  35. package/dist/lib/content-scan.d.ts +62 -9
  36. package/dist/lib/discovery.d.ts +10 -10
  37. package/dist/lib/doc-derived-counts.d.ts +56 -0
  38. package/dist/lib/feedback.d.ts +7 -0
  39. package/dist/lib/file-bytes.d.ts +43 -0
  40. package/dist/lib/hosted-skill-set.d.ts +69 -0
  41. package/dist/lib/infra-identifiers.d.ts +144 -0
  42. package/dist/lib/installer.d.ts +20 -6
  43. package/dist/lib/native-storage.d.ts +14 -11
  44. package/dist/lib/packlist.d.ts +13 -0
  45. package/dist/lib/portable-skills-files.d.ts +25 -0
  46. package/dist/lib/portable-skills-types.d.ts +105 -0
  47. package/dist/lib/portable-skills.d.ts +52 -103
  48. package/dist/lib/pull.d.ts +41 -0
  49. package/dist/lib/registry-merge.d.ts +57 -0
  50. package/dist/lib/registry-types.d.ts +1 -14
  51. package/dist/lib/registry.d.ts +6 -3
  52. package/dist/lib/remote-client.d.ts +15 -1
  53. package/dist/lib/remote-registry.d.ts +1 -1
  54. package/dist/lib/remote-run-contract.d.ts +0 -7
  55. package/dist/lib/retired-settings.d.ts +100 -0
  56. package/dist/lib/run-state.d.ts +14 -0
  57. package/dist/lib/skill-aliases.d.ts +0 -12
  58. package/dist/lib/skill-bundle.d.ts +37 -0
  59. package/dist/lib/vendor-host-code-scan.d.ts +66 -0
  60. package/dist/lib/vendor-host-folding.d.ts +40 -0
  61. package/dist/lib/vendor-host-guard.d.ts +47 -0
  62. package/dist/lib/vendor-host-package.d.ts +42 -0
  63. package/dist/lib/vendor-host-policy.d.ts +96 -0
  64. package/dist/lib/vendor-host-url.d.ts +81 -0
  65. package/dist/mcp/mcp-test-client.d.ts +18 -0
  66. package/dist/storage.d.ts +1 -1
  67. package/dist/storage.js +104 -51
  68. package/docs/skill-standard.md +1 -1
  69. package/migrations/postgres/0002_org_scoped_skill_registry.sql +72 -0
  70. package/migrations/sqlite/0001_open_skills_self_hosted.sql +150 -0
  71. package/migrations/sqlite/0002_org_scoped_skill_registry.sql +47 -0
  72. package/package.json +4 -4
  73. package/skills/_common/http-client.ts +17 -2
  74. package/skills/_common/install.sh +2 -2
  75. package/skills/_common/installer.ts +4 -5
  76. package/skills/_common/skill-install.ts +3 -3
  77. package/skills/ad-creative-pack/SKILL.md +28 -18
  78. package/skills/ad-creative-pack/package.json +1 -2
  79. package/skills/analyze-data/SKILL.md +1 -1
  80. package/skills/analyze-data/src/formatters.ts +2 -2
  81. package/skills/api-docs-portal/SKILL.md +62 -24
  82. package/skills/api-docs-portal/package.json +28 -4
  83. package/skills/api-docs-portal/src/index.ts +919 -0
  84. package/skills/audio-extract/SKILL.md +1 -1
  85. package/skills/blog-article/SKILL.md +32 -22
  86. package/skills/blog-article/package.json +1 -2
  87. package/skills/brand-assets/SKILL.md +94 -33
  88. package/skills/brand-assets/package.json +28 -4
  89. package/skills/brand-assets/src/cli.ts +155 -0
  90. package/skills/brand-assets/src/constants.ts +8 -0
  91. package/skills/brand-assets/src/extract.ts +236 -0
  92. package/skills/brand-assets/src/index.ts +668 -0
  93. package/skills/brand-assets/src/types.ts +59 -0
  94. package/skills/brand-kit/SKILL.md +27 -18
  95. package/skills/brand-kit/package.json +1 -2
  96. package/skills/compress-video/SKILL.md +1 -1
  97. package/skills/contract-review-report/SKILL.md +27 -18
  98. package/skills/contract-review-report/package.json +1 -2
  99. package/skills/customer-feedback-report/SKILL.md +27 -19
  100. package/skills/customer-feedback-report/package.json +1 -2
  101. package/skills/email-sequence/SKILL.md +26 -17
  102. package/skills/email-sequence/package.json +1 -2
  103. package/skills/generate-sitemap/src/index.ts +1 -1
  104. package/skills/invoice-reconciliation/SKILL.md +75 -19
  105. package/skills/invoice-reconciliation/package.json +29 -4
  106. package/skills/invoice-reconciliation/src/index.ts +743 -0
  107. package/skills/{convert → invoice-reconciliation}/tsconfig.json +3 -1
  108. package/skills/landing-page-pack/SKILL.md +27 -19
  109. package/skills/landing-page-pack/package.json +1 -2
  110. package/skills/logo-design/SKILL.md +69 -26
  111. package/skills/logo-design/package.json +28 -4
  112. package/skills/logo-design/src/cli.ts +132 -0
  113. package/skills/logo-design/src/constants.ts +5 -0
  114. package/skills/logo-design/src/docs.ts +102 -0
  115. package/skills/logo-design/src/geometry.ts +324 -0
  116. package/skills/logo-design/src/index.ts +212 -0
  117. package/skills/logo-design/src/palette.ts +258 -0
  118. package/skills/logo-design/src/types.ts +50 -0
  119. package/skills/logo-design/tsconfig.json +11 -2
  120. package/skills/market-research-report/SKILL.md +28 -18
  121. package/skills/market-research-report/package.json +2 -3
  122. package/skills/meeting-pack/SKILL.md +26 -17
  123. package/skills/meeting-pack/package.json +1 -2
  124. package/skills/merge-pdfs/src/index.ts +1 -1
  125. package/skills/migration-plan-pack/SKILL.md +30 -19
  126. package/skills/migration-plan-pack/package.json +1 -2
  127. package/skills/one-page-website/SKILL.md +105 -23
  128. package/skills/one-page-website/package.json +27 -4
  129. package/skills/one-page-website/src/design.ts +336 -0
  130. package/skills/one-page-website/src/docs.ts +159 -0
  131. package/skills/one-page-website/src/index.ts +357 -0
  132. package/skills/one-page-website/src/page.ts +340 -0
  133. package/skills/one-page-website/src/styles.ts +508 -0
  134. package/skills/one-page-website/src/types.ts +78 -0
  135. package/skills/one-page-website/tsconfig.json +11 -2
  136. package/skills/pdf-generate/SKILL.md +1 -1
  137. package/skills/pdf-to-dataset/SKILL.md +64 -21
  138. package/skills/pdf-to-dataset/package.json +30 -4
  139. package/skills/pdf-to-dataset/src/index.ts +790 -0
  140. package/skills/{emoji → pdf-to-dataset}/tsconfig.json +3 -4
  141. package/skills/pdf-to-markdown/SKILL.md +55 -23
  142. package/skills/pdf-to-markdown/package.json +28 -4
  143. package/skills/pdf-to-markdown/src/index.ts +694 -0
  144. package/skills/pdf-to-markdown/tsconfig.json +11 -4
  145. package/skills/performance-audit-report/SKILL.md +24 -17
  146. package/skills/performance-audit-report/package.json +1 -2
  147. package/skills/pitch-deck/SKILL.md +27 -19
  148. package/skills/pitch-deck/package.json +1 -2
  149. package/skills/product-mockup/SKILL.md +85 -23
  150. package/skills/product-mockup/package.json +25 -4
  151. package/skills/product-mockup/src/cli.ts +150 -0
  152. package/skills/product-mockup/src/design.ts +151 -0
  153. package/skills/product-mockup/src/docs.ts +134 -0
  154. package/skills/product-mockup/src/index.ts +182 -0
  155. package/skills/product-mockup/src/render.ts +407 -0
  156. package/skills/product-mockup/src/types.ts +66 -0
  157. package/skills/product-mockup/tsconfig.json +11 -2
  158. package/skills/proposal-pack/SKILL.md +27 -19
  159. package/skills/proposal-pack/package.json +2 -3
  160. package/skills/repo-onboarding-report/SKILL.md +26 -16
  161. package/skills/repo-onboarding-report/package.json +1 -2
  162. package/skills/security-audit/src/index.ts +1 -1
  163. package/skills/security-audit-report/SKILL.md +28 -16
  164. package/skills/security-audit-report/package.json +2 -3
  165. package/skills/seo-content-pack/SKILL.md +27 -17
  166. package/skills/seo-content-pack/package.json +1 -2
  167. package/skills/slide-deck-generator/SKILL.md +70 -21
  168. package/skills/slide-deck-generator/package.json +31 -4
  169. package/skills/slide-deck-generator/src/cli.ts +133 -0
  170. package/skills/slide-deck-generator/src/index.ts +148 -0
  171. package/skills/slide-deck-generator/src/model.ts +307 -0
  172. package/skills/slide-deck-generator/src/pptx.ts +143 -0
  173. package/skills/slide-deck-generator/src/render.ts +248 -0
  174. package/skills/slide-deck-generator/src/types.ts +114 -0
  175. package/skills/slide-deck-generator/src/utils.ts +53 -0
  176. package/skills/slide-deck-generator/tsconfig.json +17 -0
  177. package/skills/social-content-calendar/SKILL.md +27 -18
  178. package/skills/social-content-calendar/package.json +1 -2
  179. package/skills/split-pdf/src/index.ts +1 -1
  180. package/skills/test-suite-generator/SKILL.md +26 -16
  181. package/skills/test-suite-generator/package.json +2 -3
  182. package/skills/todos-plan/SKILL.md +339 -170
  183. package/skills/video-highlight-pack/SKILL.md +27 -17
  184. package/skills/video-highlight-pack/package.json +1 -2
  185. package/dist/cli/onboarding.d.ts +0 -13
  186. package/dist/lib/hosted-availability.d.ts +0 -13
  187. package/dist/lib/pricing.d.ts +0 -89
  188. package/skills/academic-journal-matcher/CLAUDE.md +0 -19
  189. package/skills/academic-journal-matcher/package.json +0 -27
  190. package/skills/academic-journal-matcher/src/index.ts +0 -86
  191. package/skills/academic-journal-matcher/tsconfig.json +0 -10
  192. package/skills/action-item-router/CLAUDE.md +0 -19
  193. package/skills/action-item-router/package.json +0 -27
  194. package/skills/action-item-router/src/index.ts +0 -304
  195. package/skills/action-item-router/tsconfig.json +0 -10
  196. package/skills/ad-creative-generator/CLAUDE.md +0 -19
  197. package/skills/ad-creative-generator/package.json +0 -27
  198. package/skills/ad-creative-generator/src/index.ts +0 -419
  199. package/skills/ad-creative-generator/tsconfig.json +0 -10
  200. package/skills/advanced-math/CLAUDE.md +0 -19
  201. package/skills/advanced-math/package.json +0 -29
  202. package/skills/advanced-math/src/calculators.ts +0 -118
  203. package/skills/advanced-math/src/cli.ts +0 -130
  204. package/skills/advanced-math/src/conversion.ts +0 -90
  205. package/skills/advanced-math/src/finance.ts +0 -75
  206. package/skills/advanced-math/src/formatting.ts +0 -95
  207. package/skills/advanced-math/src/index.ts +0 -133
  208. package/skills/advanced-math/src/runtime.ts +0 -49
  209. package/skills/advanced-math/src/symbolic.ts +0 -110
  210. package/skills/advanced-math/src/types.ts +0 -36
  211. package/skills/advanced-math/tsconfig.json +0 -10
  212. package/skills/anomaly-investigator/CLAUDE.md +0 -19
  213. package/skills/anomaly-investigator/package.json +0 -27
  214. package/skills/anomaly-investigator/src/index.ts +0 -311
  215. package/skills/anomaly-investigator/tsconfig.json +0 -10
  216. package/skills/apidocs/.env.example +0 -8
  217. package/skills/apidocs/CLAUDE.md +0 -278
  218. package/skills/apidocs/LICENSE +0 -192
  219. package/skills/apidocs/README.md +0 -196
  220. package/skills/apidocs/api-docs-list.json +0 -186
  221. package/skills/apidocs/package.json +0 -53
  222. package/skills/apidocs/scripts/crawl-all.ts +0 -157
  223. package/skills/apidocs/scripts/publish.ts +0 -210
  224. package/skills/apidocs/src/commands/add.ts +0 -279
  225. package/skills/apidocs/src/commands/endpoints.ts +0 -157
  226. package/skills/apidocs/src/commands/list.ts +0 -51
  227. package/skills/apidocs/src/commands/query.ts +0 -63
  228. package/skills/apidocs/src/commands/remove.ts +0 -39
  229. package/skills/apidocs/src/commands/sync.ts +0 -227
  230. package/skills/apidocs/src/index.ts +0 -3
  231. package/skills/apidocs/src/lib/crawler.ts +0 -427
  232. package/skills/apidocs/src/lib/discovery.ts +0 -244
  233. package/skills/apidocs/src/lib/embeddings.ts +0 -136
  234. package/skills/apidocs/src/lib/endpoint-extractor.ts +0 -359
  235. package/skills/apidocs/src/lib/html-to-md.ts +0 -163
  236. package/skills/apidocs/src/lib/parser.ts +0 -288
  237. package/skills/apidocs/src/lib/search.ts +0 -189
  238. package/skills/apidocs/src/lib/storage.ts +0 -242
  239. package/skills/apidocs/src/lib/vectors-local.ts +0 -220
  240. package/skills/apidocs/src/lib/vectors-s3.ts +0 -255
  241. package/skills/apidocs/src/lib/vectors.ts +0 -97
  242. package/skills/apidocs/src/types/index.ts +0 -297
  243. package/skills/apidocs/src/utils/output.ts +0 -132
  244. package/skills/apidocs/src/utils/paths.ts +0 -126
  245. package/skills/apidocs/tsconfig.json +0 -24
  246. package/skills/audio/SKILL.md +0 -35
  247. package/skills/audio/package.json +0 -11
  248. package/skills/audio-cleanup-lab/CLAUDE.md +0 -3
  249. package/skills/audio-cleanup-lab/SKILL.md +0 -81
  250. package/skills/audio-cleanup-lab/package.json +0 -23
  251. package/skills/audio-cleanup-lab/src/index.ts +0 -274
  252. package/skills/audio-cleanup-lab/tsconfig.json +0 -14
  253. package/skills/audio-transcript-pack/SKILL.md +0 -43
  254. package/skills/audio-transcript-pack/package.json +0 -11
  255. package/skills/banner-ad-suite/CLAUDE.md +0 -19
  256. package/skills/banner-ad-suite/package.json +0 -27
  257. package/skills/banner-ad-suite/src/index.ts +0 -331
  258. package/skills/banner-ad-suite/tsconfig.json +0 -10
  259. package/skills/benchmark-finder/CLAUDE.md +0 -19
  260. package/skills/benchmark-finder/package.json +0 -27
  261. package/skills/benchmark-finder/src/index.ts +0 -294
  262. package/skills/benchmark-finder/tsconfig.json +0 -10
  263. package/skills/blog-topic-cluster/CLAUDE.md +0 -19
  264. package/skills/blog-topic-cluster/package.json +0 -27
  265. package/skills/blog-topic-cluster/src/index.ts +0 -274
  266. package/skills/blog-topic-cluster/tsconfig.json +0 -10
  267. package/skills/brand-photo-shoot/SKILL.md +0 -28
  268. package/skills/brand-photo-shoot/package.json +0 -11
  269. package/skills/brand-style-guide/CLAUDE.md +0 -20
  270. package/skills/brand-style-guide/SKILL.md +0 -13
  271. package/skills/brand-style-guide/package.json +0 -26
  272. package/skills/brand-style-guide/src/index.ts +0 -288
  273. package/skills/brand-style-guide/tsconfig.json +0 -22
  274. package/skills/brand-voice-audit/CLAUDE.md +0 -19
  275. package/skills/brand-voice-audit/package.json +0 -27
  276. package/skills/brand-voice-audit/src/index.ts +0 -302
  277. package/skills/brand-voice-audit/tsconfig.json +0 -10
  278. package/skills/browse/LICENSE +0 -192
  279. package/skills/browse/README.md +0 -25
  280. package/skills/browse/SKILL.md +0 -35
  281. package/skills/browse/package.json +0 -11
  282. package/skills/browse/tsconfig.json +0 -22
  283. package/skills/budget-variance-analyzer/CLAUDE.md +0 -16
  284. package/skills/budget-variance-analyzer/SKILL.md +0 -83
  285. package/skills/budget-variance-analyzer/package.json +0 -24
  286. package/skills/budget-variance-analyzer/src/index.ts +0 -298
  287. package/skills/budget-variance-analyzer/tsconfig.json +0 -21
  288. package/skills/calendar-events/CLAUDE.md +0 -19
  289. package/skills/calendar-events/package.json +0 -27
  290. package/skills/calendar-events/src/ai-parser.ts +0 -103
  291. package/skills/calendar-events/src/api.ts +0 -157
  292. package/skills/calendar-events/src/auth.ts +0 -22
  293. package/skills/calendar-events/src/config.ts +0 -6
  294. package/skills/calendar-events/src/format.ts +0 -96
  295. package/skills/calendar-events/src/help.ts +0 -54
  296. package/skills/calendar-events/src/index.ts +0 -415
  297. package/skills/calendar-events/src/logger.ts +0 -34
  298. package/skills/calendar-events/src/types.ts +0 -67
  299. package/skills/calendar-events/tsconfig.json +0 -10
  300. package/skills/campaign-metric-brief/CLAUDE.md +0 -19
  301. package/skills/campaign-metric-brief/package.json +0 -27
  302. package/skills/campaign-metric-brief/src/index.ts +0 -307
  303. package/skills/campaign-metric-brief/tsconfig.json +0 -10
  304. package/skills/campaign-moodboard/CLAUDE.md +0 -19
  305. package/skills/campaign-moodboard/package.json +0 -27
  306. package/skills/campaign-moodboard/src/index.ts +0 -288
  307. package/skills/campaign-moodboard/tsconfig.json +0 -10
  308. package/skills/caption-style-stylist/CLAUDE.md +0 -19
  309. package/skills/caption-style-stylist/package.json +0 -27
  310. package/skills/caption-style-stylist/src/index.ts +0 -275
  311. package/skills/caption-style-stylist/tsconfig.json +0 -10
  312. package/skills/chemistry-calculator/CLAUDE.md +0 -19
  313. package/skills/chemistry-calculator/package.json +0 -27
  314. package/skills/chemistry-calculator/src/index.ts +0 -110
  315. package/skills/chemistry-calculator/tsconfig.json +0 -10
  316. package/skills/churn-risk-notifier/CLAUDE.md +0 -19
  317. package/skills/churn-risk-notifier/package.json +0 -27
  318. package/skills/churn-risk-notifier/src/index.ts +0 -308
  319. package/skills/churn-risk-notifier/tsconfig.json +0 -10
  320. package/skills/citation-formatter/CLAUDE.md +0 -19
  321. package/skills/citation-formatter/package.json +0 -27
  322. package/skills/citation-formatter/src/index.ts +0 -83
  323. package/skills/citation-formatter/tsconfig.json +0 -10
  324. package/skills/classroom-newsletter-kit/CLAUDE.md +0 -19
  325. package/skills/classroom-newsletter-kit/package.json +0 -27
  326. package/skills/classroom-newsletter-kit/src/index.ts +0 -293
  327. package/skills/classroom-newsletter-kit/tsconfig.json +0 -10
  328. package/skills/color-palette-harmonizer/CLAUDE.md +0 -19
  329. package/skills/color-palette-harmonizer/package.json +0 -27
  330. package/skills/color-palette-harmonizer/src/index.ts +0 -278
  331. package/skills/color-palette-harmonizer/tsconfig.json +0 -10
  332. package/skills/colorextract/SKILL.md +0 -35
  333. package/skills/colorextract/bun.lock +0 -102
  334. package/skills/colorextract/package.json +0 -25
  335. package/skills/colorextract/src/index.ts +0 -405
  336. package/skills/competitor-ad-analyzer/CLAUDE.md +0 -19
  337. package/skills/competitor-ad-analyzer/package.json +0 -27
  338. package/skills/competitor-ad-analyzer/src/index.ts +0 -350
  339. package/skills/competitor-ad-analyzer/tsconfig.json +0 -10
  340. package/skills/compliance-copy-check/CLAUDE.md +0 -19
  341. package/skills/compliance-copy-check/package.json +0 -27
  342. package/skills/compliance-copy-check/src/index.ts +0 -289
  343. package/skills/compliance-copy-check/tsconfig.json +0 -10
  344. package/skills/compliance-report-pack/CLAUDE.md +0 -19
  345. package/skills/compliance-report-pack/package.json +0 -27
  346. package/skills/compliance-report-pack/src/index.ts +0 -301
  347. package/skills/compliance-report-pack/tsconfig.json +0 -10
  348. package/skills/consolelog/.env.example +0 -19
  349. package/skills/consolelog/CLAUDE.md +0 -157
  350. package/skills/consolelog/LICENSE +0 -192
  351. package/skills/consolelog/README.md +0 -239
  352. package/skills/consolelog/data/.gitkeep +0 -0
  353. package/skills/consolelog/exports/products-2025-12-14T13-50-53-041Z.csv +0 -16
  354. package/skills/consolelog/exports/products-2025-12-14T13-50-53-041Z.json +0 -227
  355. package/skills/consolelog/package.json +0 -40
  356. package/skills/consolelog/scripts/migrate.ts +0 -26
  357. package/skills/consolelog/scripts/seed.ts +0 -48
  358. package/skills/consolelog/src/db/index.ts +0 -44
  359. package/skills/consolelog/src/db/queries.ts +0 -348
  360. package/skills/consolelog/src/db/schema.ts +0 -93
  361. package/skills/consolelog/src/index.ts +0 -3
  362. package/skills/consolelog/src/lib/config.ts +0 -110
  363. package/skills/consolelog/src/lib/installer.ts +0 -294
  364. package/skills/consolelog/src/lib/monitor.ts +0 -194
  365. package/skills/consolelog/src/lib/types.ts +0 -189
  366. package/skills/consolelog/src/lib/watcher.ts +0 -207
  367. package/skills/consolelog/tests/api.test.ts +0 -154
  368. package/skills/consolelog/tests/config.test.ts +0 -192
  369. package/skills/consolelog/tests/db.test.ts +0 -447
  370. package/skills/consolelog/tests/installer.test.ts +0 -155
  371. package/skills/consolelog/tsconfig.json +0 -24
  372. package/skills/contract-plainlanguage/CLAUDE.md +0 -19
  373. package/skills/contract-plainlanguage/package.json +0 -27
  374. package/skills/contract-plainlanguage/src/index.ts +0 -294
  375. package/skills/contract-plainlanguage/tsconfig.json +0 -10
  376. package/skills/convert/.env.example +0 -7
  377. package/skills/convert/LICENSE +0 -192
  378. package/skills/convert/README.md +0 -250
  379. package/skills/convert/SKILL.md +0 -106
  380. package/skills/convert/package.json +0 -37
  381. package/skills/convert/src/converters/ai.ts +0 -375
  382. package/skills/convert/src/converters/data.ts +0 -339
  383. package/skills/convert/src/converters/document.ts +0 -189
  384. package/skills/convert/src/converters/image.ts +0 -227
  385. package/skills/convert/src/converters/index.ts +0 -9
  386. package/skills/convert/src/converters/pdf.ts +0 -255
  387. package/skills/convert/src/index-local.ts +0 -568
  388. package/skills/convert/src/index.ts +0 -4
  389. package/skills/convert/src/types.ts +0 -192
  390. package/skills/copytone-translator/CLAUDE.md +0 -19
  391. package/skills/copytone-translator/package.json +0 -27
  392. package/skills/copytone-translator/src/index.ts +0 -295
  393. package/skills/copytone-translator/tsconfig.json +0 -10
  394. package/skills/create-ebook/CLAUDE.md +0 -19
  395. package/skills/create-ebook/package.json +0 -27
  396. package/skills/create-ebook/src/index.ts +0 -637
  397. package/skills/create-ebook/tsconfig.json +0 -10
  398. package/skills/crm-note-enhancer/CLAUDE.md +0 -19
  399. package/skills/crm-note-enhancer/package.json +0 -27
  400. package/skills/crm-note-enhancer/src/index.ts +0 -317
  401. package/skills/crm-note-enhancer/tsconfig.json +0 -10
  402. package/skills/customer-journey-mapper/CLAUDE.md +0 -19
  403. package/skills/customer-journey-mapper/package.json +0 -27
  404. package/skills/customer-journey-mapper/src/index.ts +0 -312
  405. package/skills/customer-journey-mapper/tsconfig.json +0 -10
  406. package/skills/dashboard-narrator/CLAUDE.md +0 -19
  407. package/skills/dashboard-narrator/package.json +0 -27
  408. package/skills/dashboard-narrator/src/index.ts +0 -307
  409. package/skills/dashboard-narrator/tsconfig.json +0 -10
  410. package/skills/dataset-health-check/CLAUDE.md +0 -19
  411. package/skills/dataset-health-check/package.json +0 -27
  412. package/skills/dataset-health-check/src/index.ts +0 -323
  413. package/skills/dataset-health-check/tsconfig.json +0 -10
  414. package/skills/decision-journal/CLAUDE.md +0 -19
  415. package/skills/decision-journal/package.json +0 -27
  416. package/skills/decision-journal/src/index.ts +0 -313
  417. package/skills/decision-journal/tsconfig.json +0 -10
  418. package/skills/deepresearch/CLAUDE.md +0 -11
  419. package/skills/deepresearch/README.md +0 -26
  420. package/skills/deepresearch/SKILL.md +0 -41
  421. package/skills/deepresearch/package.json +0 -11
  422. package/skills/deepresearch/tsconfig.json +0 -29
  423. package/skills/delegation-brief-writer/CLAUDE.md +0 -19
  424. package/skills/delegation-brief-writer/package.json +0 -27
  425. package/skills/delegation-brief-writer/src/index.ts +0 -314
  426. package/skills/delegation-brief-writer/tsconfig.json +0 -10
  427. package/skills/deploy/LICENSE +0 -192
  428. package/skills/deploy/README.md +0 -382
  429. package/skills/deploy/SKILL.md +0 -138
  430. package/skills/deploy/package.json +0 -18
  431. package/skills/deploy/src/deployer.ts +0 -256
  432. package/skills/deploy/src/health.ts +0 -103
  433. package/skills/deploy/src/hosts.ts +0 -45
  434. package/skills/deploy/src/http-client.ts +0 -128
  435. package/skills/deploy/src/index-local.ts +0 -366
  436. package/skills/deploy/src/index.ts +0 -4
  437. package/skills/deploy/src/types.ts +0 -56
  438. package/skills/deploy/tsconfig.json +0 -18
  439. package/skills/destination-briefing/CLAUDE.md +0 -19
  440. package/skills/destination-briefing/package.json +0 -27
  441. package/skills/destination-briefing/src/index.ts +0 -291
  442. package/skills/destination-briefing/tsconfig.json +0 -10
  443. package/skills/doc-generate/CLAUDE.md +0 -19
  444. package/skills/doc-generate/SKILL.md +0 -295
  445. package/skills/doc-generate/package.json +0 -23
  446. package/skills/doc-generate/src/ai.ts +0 -50
  447. package/skills/doc-generate/src/cli.ts +0 -203
  448. package/skills/doc-generate/src/dependencies.ts +0 -44
  449. package/skills/doc-generate/src/document-builder.ts +0 -299
  450. package/skills/doc-generate/src/index.ts +0 -90
  451. package/skills/doc-generate/src/markdown-parser.ts +0 -125
  452. package/skills/doc-generate/src/types.ts +0 -68
  453. package/skills/doc-generate/tsconfig.json +0 -16
  454. package/skills/domainsearch/.env.example +0 -7
  455. package/skills/domainsearch/LICENSE +0 -192
  456. package/skills/domainsearch/SKILL.md +0 -41
  457. package/skills/domainsearch/package.json +0 -33
  458. package/skills/domainsearch/src/index.ts +0 -3
  459. package/skills/domainsearch/src/lib/api-client.ts +0 -181
  460. package/skills/domainsearch/src/lib/config.ts +0 -72
  461. package/skills/domainsearch/src/lib/installer.ts +0 -164
  462. package/skills/domainsearch/tsconfig.json +0 -22
  463. package/skills/educational-resource-finder/CLAUDE.md +0 -19
  464. package/skills/educational-resource-finder/package.json +0 -27
  465. package/skills/educational-resource-finder/src/index.ts +0 -289
  466. package/skills/educational-resource-finder/tsconfig.json +0 -10
  467. package/skills/email-campaign/CLAUDE.md +0 -19
  468. package/skills/email-campaign/package.json +0 -27
  469. package/skills/email-campaign/src/index.ts +0 -339
  470. package/skills/email-campaign/tsconfig.json +0 -10
  471. package/skills/emoji/.env.example +0 -7
  472. package/skills/emoji/QUICKSTART.md +0 -52
  473. package/skills/emoji/README.md +0 -175
  474. package/skills/emoji/SKILL.md +0 -63
  475. package/skills/emoji/package.json +0 -31
  476. package/skills/emoji/src/image-processor.ts +0 -143
  477. package/skills/emoji/src/index.ts +0 -282
  478. package/skills/emoji/src/prompt-generator.ts +0 -181
  479. package/skills/emoji/src/providers/gemini.ts +0 -58
  480. package/skills/emoji/src/providers/openai.ts +0 -55
  481. package/skills/emoji/src/types.ts +0 -72
  482. package/skills/exam-readiness-check/CLAUDE.md +0 -19
  483. package/skills/exam-readiness-check/package.json +0 -27
  484. package/skills/exam-readiness-check/src/index.ts +0 -289
  485. package/skills/exam-readiness-check/tsconfig.json +0 -10
  486. package/skills/excel/CLAUDE.md +0 -19
  487. package/skills/excel/SKILL.md +0 -38
  488. package/skills/excel/package.json +0 -30
  489. package/skills/excel/src/index.ts +0 -644
  490. package/skills/excel/tsconfig.json +0 -10
  491. package/skills/extract/.env.example +0 -3
  492. package/skills/extract/LICENSE +0 -192
  493. package/skills/extract/README.md +0 -61
  494. package/skills/extract/SKILL.md +0 -91
  495. package/skills/extract/package.json +0 -35
  496. package/skills/extract/src/extractors/image.ts +0 -42
  497. package/skills/extract/src/extractors/pdf.ts +0 -96
  498. package/skills/extract/src/index-local.ts +0 -258
  499. package/skills/extract/src/index.ts +0 -4
  500. package/skills/extract/src/providers/openai.ts +0 -222
  501. package/skills/extract/src/types.ts +0 -61
  502. package/skills/extract/tsconfig.json +0 -19
  503. package/skills/extract-invoice/CLAUDE.md +0 -19
  504. package/skills/extract-invoice/package.json +0 -27
  505. package/skills/extract-invoice/src/cli.ts +0 -97
  506. package/skills/extract-invoice/src/extractor.ts +0 -170
  507. package/skills/extract-invoice/src/file-utils.ts +0 -46
  508. package/skills/extract-invoice/src/formatters.ts +0 -144
  509. package/skills/extract-invoice/src/index.ts +0 -129
  510. package/skills/extract-invoice/src/runtime.ts +0 -46
  511. package/skills/extract-invoice/src/types.ts +0 -88
  512. package/skills/extract-invoice/tsconfig.json +0 -10
  513. package/skills/family-activity-curator/CLAUDE.md +0 -19
  514. package/skills/family-activity-curator/package.json +0 -27
  515. package/skills/family-activity-curator/src/index.ts +0 -293
  516. package/skills/family-activity-curator/tsconfig.json +0 -10
  517. package/skills/faq-packager/CLAUDE.md +0 -19
  518. package/skills/faq-packager/package.json +0 -27
  519. package/skills/faq-packager/src/index.ts +0 -292
  520. package/skills/faq-packager/tsconfig.json +0 -10
  521. package/skills/feedback-survey-designer/CLAUDE.md +0 -19
  522. package/skills/feedback-survey-designer/package.json +0 -27
  523. package/skills/feedback-survey-designer/src/index.ts +0 -299
  524. package/skills/feedback-survey-designer/tsconfig.json +0 -10
  525. package/skills/field-trip-planner/CLAUDE.md +0 -19
  526. package/skills/field-trip-planner/package.json +0 -27
  527. package/skills/field-trip-planner/src/index.ts +0 -289
  528. package/skills/field-trip-planner/tsconfig.json +0 -10
  529. package/skills/forecast-scenario-lab/CLAUDE.md +0 -19
  530. package/skills/forecast-scenario-lab/package.json +0 -27
  531. package/skills/forecast-scenario-lab/src/index.ts +0 -314
  532. package/skills/forecast-scenario-lab/tsconfig.json +0 -10
  533. package/skills/generate-book-cover/CLAUDE.md +0 -19
  534. package/skills/generate-book-cover/package.json +0 -11
  535. package/skills/generate-book-cover/tsconfig.json +0 -10
  536. package/skills/generate-diagram/CLAUDE.md +0 -19
  537. package/skills/generate-diagram/package.json +0 -27
  538. package/skills/generate-diagram/src/index.ts +0 -514
  539. package/skills/generate-diagram/tsconfig.json +0 -10
  540. package/skills/generate-documentation/CLAUDE.md +0 -19
  541. package/skills/generate-documentation/package.json +0 -27
  542. package/skills/generate-documentation/src/ai.ts +0 -131
  543. package/skills/generate-documentation/src/cli.ts +0 -71
  544. package/skills/generate-documentation/src/code-parser.ts +0 -300
  545. package/skills/generate-documentation/src/file-processing.ts +0 -182
  546. package/skills/generate-documentation/src/index.ts +0 -65
  547. package/skills/generate-documentation/src/runtime.ts +0 -35
  548. package/skills/generate-documentation/src/types.ts +0 -30
  549. package/skills/generate-documentation/tsconfig.json +0 -10
  550. package/skills/generate-mock-data/CLAUDE.md +0 -19
  551. package/skills/generate-mock-data/package.json +0 -29
  552. package/skills/generate-mock-data/src/ai.ts +0 -102
  553. package/skills/generate-mock-data/src/formatters.ts +0 -84
  554. package/skills/generate-mock-data/src/generator.ts +0 -377
  555. package/skills/generate-mock-data/src/index.ts +0 -201
  556. package/skills/generate-mock-data/src/logger.ts +0 -37
  557. package/skills/generate-mock-data/src/presets.ts +0 -110
  558. package/skills/generate-mock-data/src/types.ts +0 -21
  559. package/skills/generate-mock-data/tsconfig.json +0 -10
  560. package/skills/generate-pr-description/CLAUDE.md +0 -19
  561. package/skills/generate-pr-description/package.json +0 -27
  562. package/skills/generate-pr-description/src/ai.ts +0 -144
  563. package/skills/generate-pr-description/src/cli.ts +0 -80
  564. package/skills/generate-pr-description/src/clipboard.ts +0 -30
  565. package/skills/generate-pr-description/src/formatters.ts +0 -231
  566. package/skills/generate-pr-description/src/git.ts +0 -153
  567. package/skills/generate-pr-description/src/index.ts +0 -114
  568. package/skills/generate-pr-description/src/types.ts +0 -49
  569. package/skills/generate-pr-description/tsconfig.json +0 -10
  570. package/skills/generate-presentation/CLAUDE.md +0 -19
  571. package/skills/generate-presentation/package.json +0 -27
  572. package/skills/generate-presentation/src/ai-clients.ts +0 -61
  573. package/skills/generate-presentation/src/cli.ts +0 -126
  574. package/skills/generate-presentation/src/index.ts +0 -44
  575. package/skills/generate-presentation/src/logger.ts +0 -67
  576. package/skills/generate-presentation/src/presentation-generator.ts +0 -425
  577. package/skills/generate-presentation/src/runtime.ts +0 -6
  578. package/skills/generate-presentation/src/security.ts +0 -12
  579. package/skills/generate-presentation/src/types.ts +0 -28
  580. package/skills/generate-presentation/tsconfig.json +0 -10
  581. package/skills/generate-regex/CLAUDE.md +0 -19
  582. package/skills/generate-regex/package.json +0 -29
  583. package/skills/generate-regex/src/index.ts +0 -669
  584. package/skills/generate-regex/tsconfig.json +0 -10
  585. package/skills/generate-social-posts/CLAUDE.md +0 -19
  586. package/skills/generate-social-posts/package.json +0 -27
  587. package/skills/generate-social-posts/src/ai.ts +0 -88
  588. package/skills/generate-social-posts/src/cli.ts +0 -118
  589. package/skills/generate-social-posts/src/exporters.ts +0 -126
  590. package/skills/generate-social-posts/src/generator.ts +0 -130
  591. package/skills/generate-social-posts/src/index.ts +0 -78
  592. package/skills/generate-social-posts/src/platforms.ts +0 -39
  593. package/skills/generate-social-posts/src/runtime.ts +0 -34
  594. package/skills/generate-social-posts/src/source.ts +0 -116
  595. package/skills/generate-social-posts/src/types.ts +0 -58
  596. package/skills/generate-social-posts/tsconfig.json +0 -10
  597. package/skills/generate-sql/CLAUDE.md +0 -19
  598. package/skills/generate-sql/package.json +0 -27
  599. package/skills/generate-sql/src/index.ts +0 -636
  600. package/skills/generate-sql/tsconfig.json +0 -10
  601. package/skills/github-manager/CLAUDE.md +0 -19
  602. package/skills/github-manager/package.json +0 -29
  603. package/skills/github-manager/src/index.ts +0 -101
  604. package/skills/github-manager/tsconfig.json +0 -10
  605. package/skills/gmail/CLAUDE.md +0 -19
  606. package/skills/gmail/package.json +0 -27
  607. package/skills/gmail/src/index.ts +0 -410
  608. package/skills/gmail/tsconfig.json +0 -10
  609. package/skills/goal-quarterly-roadmap/CLAUDE.md +0 -19
  610. package/skills/goal-quarterly-roadmap/package.json +0 -27
  611. package/skills/goal-quarterly-roadmap/src/index.ts +0 -305
  612. package/skills/goal-quarterly-roadmap/tsconfig.json +0 -10
  613. package/skills/grant-application-drafter/CLAUDE.md +0 -19
  614. package/skills/grant-application-drafter/package.json +0 -27
  615. package/skills/grant-application-drafter/src/index.ts +0 -309
  616. package/skills/grant-application-drafter/tsconfig.json +0 -10
  617. package/skills/grocery-basket-optimizer/CLAUDE.md +0 -19
  618. package/skills/grocery-basket-optimizer/package.json +0 -27
  619. package/skills/grocery-basket-optimizer/src/index.ts +0 -304
  620. package/skills/grocery-basket-optimizer/tsconfig.json +0 -10
  621. package/skills/guest-communication-suite/CLAUDE.md +0 -19
  622. package/skills/guest-communication-suite/package.json +0 -27
  623. package/skills/guest-communication-suite/src/index.ts +0 -312
  624. package/skills/guest-communication-suite/tsconfig.json +0 -10
  625. package/skills/habit-reflection-digest/CLAUDE.md +0 -19
  626. package/skills/habit-reflection-digest/package.json +0 -27
  627. package/skills/habit-reflection-digest/src/index.ts +0 -308
  628. package/skills/habit-reflection-digest/tsconfig.json +0 -10
  629. package/skills/highlight-reel-generator/CLAUDE.md +0 -19
  630. package/skills/highlight-reel-generator/package.json +0 -27
  631. package/skills/highlight-reel-generator/src/index.ts +0 -286
  632. package/skills/highlight-reel-generator/tsconfig.json +0 -10
  633. package/skills/homework-feedback-coach/CLAUDE.md +0 -19
  634. package/skills/homework-feedback-coach/package.json +0 -27
  635. package/skills/homework-feedback-coach/src/index.ts +0 -316
  636. package/skills/homework-feedback-coach/tsconfig.json +0 -10
  637. package/skills/household-maintenance-mgr/CLAUDE.md +0 -19
  638. package/skills/household-maintenance-mgr/package.json +0 -27
  639. package/skills/household-maintenance-mgr/src/index.ts +0 -293
  640. package/skills/household-maintenance-mgr/tsconfig.json +0 -10
  641. package/skills/icon-pack/README.md +0 -28
  642. package/skills/icon-pack/SKILL.md +0 -23
  643. package/skills/icon-pack/package.json +0 -11
  644. package/skills/icon-pack/tsconfig.json +0 -20
  645. package/skills/image/LICENSE +0 -192
  646. package/skills/image/README.md +0 -25
  647. package/skills/image/SKILL.md +0 -49
  648. package/skills/image/examples/aurora-examples.sh +0 -33
  649. package/skills/image/examples/google-examples.sh +0 -37
  650. package/skills/image/examples/openai-examples.sh +0 -35
  651. package/skills/image/package.json +0 -11
  652. package/skills/image/tsconfig.json +0 -19
  653. package/skills/implementation-agent/CLAUDE.md +0 -19
  654. package/skills/implementation-agent/package.json +0 -29
  655. package/skills/implementation-agent/src/ai-generation.ts +0 -225
  656. package/skills/implementation-agent/src/index.ts +0 -608
  657. package/skills/implementation-agent/src/minimist.d.ts +0 -15
  658. package/skills/implementation-agent/src/templates.ts +0 -686
  659. package/skills/implementation-agent/src/types.ts +0 -53
  660. package/skills/implementation-agent/tsconfig.json +0 -10
  661. package/skills/inbox-priority-planner/CLAUDE.md +0 -19
  662. package/skills/inbox-priority-planner/package.json +0 -27
  663. package/skills/inbox-priority-planner/src/index.ts +0 -309
  664. package/skills/inbox-priority-planner/tsconfig.json +0 -10
  665. package/skills/invoice-dispute-helper/CLAUDE.md +0 -19
  666. package/skills/invoice-dispute-helper/package.json +0 -27
  667. package/skills/invoice-dispute-helper/src/index.ts +0 -304
  668. package/skills/invoice-dispute-helper/tsconfig.json +0 -10
  669. package/skills/itinerary-architect/CLAUDE.md +0 -19
  670. package/skills/itinerary-architect/package.json +0 -27
  671. package/skills/itinerary-architect/src/index.ts +0 -313
  672. package/skills/itinerary-architect/tsconfig.json +0 -10
  673. package/skills/kpi-digest-generator/CLAUDE.md +0 -19
  674. package/skills/kpi-digest-generator/package.json +0 -27
  675. package/skills/kpi-digest-generator/src/index.ts +0 -318
  676. package/skills/kpi-digest-generator/tsconfig.json +0 -10
  677. package/skills/lab-notebook-formatter/CLAUDE.md +0 -19
  678. package/skills/lab-notebook-formatter/package.json +0 -27
  679. package/skills/lab-notebook-formatter/src/index.ts +0 -88
  680. package/skills/lab-notebook-formatter/tsconfig.json +0 -10
  681. package/skills/landing-page-copy/CLAUDE.md +0 -19
  682. package/skills/landing-page-copy/package.json +0 -27
  683. package/skills/landing-page-copy/src/index.ts +0 -400
  684. package/skills/landing-page-copy/tsconfig.json +0 -10
  685. package/skills/learning-style-profiler/CLAUDE.md +0 -19
  686. package/skills/learning-style-profiler/package.json +0 -27
  687. package/skills/learning-style-profiler/src/index.ts +0 -291
  688. package/skills/learning-style-profiler/tsconfig.json +0 -10
  689. package/skills/lesson-plan-customizer/CLAUDE.md +0 -19
  690. package/skills/lesson-plan-customizer/package.json +0 -27
  691. package/skills/lesson-plan-customizer/src/index.ts +0 -303
  692. package/skills/lesson-plan-customizer/tsconfig.json +0 -10
  693. package/skills/livestream-runofshow/CLAUDE.md +0 -19
  694. package/skills/livestream-runofshow/package.json +0 -27
  695. package/skills/livestream-runofshow/src/index.ts +0 -299
  696. package/skills/livestream-runofshow/tsconfig.json +0 -10
  697. package/skills/longform-structurer/CLAUDE.md +0 -19
  698. package/skills/longform-structurer/package.json +0 -27
  699. package/skills/longform-structurer/src/index.ts +0 -293
  700. package/skills/longform-structurer/tsconfig.json +0 -10
  701. package/skills/managehook/.env.example +0 -16
  702. package/skills/managehook/CLAUDE.md +0 -48
  703. package/skills/managehook/README.md +0 -210
  704. package/skills/managehook/package.json +0 -24
  705. package/skills/managehook/scripts/migrate.ts +0 -57
  706. package/skills/managehook/scripts/seed.ts +0 -58
  707. package/skills/managehook/src/db/index.ts +0 -37
  708. package/skills/managehook/src/index.ts +0 -3
  709. package/skills/managehook/src/lib/api-client.ts +0 -108
  710. package/skills/managehook/src/lib/config.ts +0 -34
  711. package/skills/managehook/src/lib/installer.ts +0 -140
  712. package/skills/managehook/src/lib/service-dir.ts +0 -119
  713. package/skills/managehook/tsconfig.json +0 -29
  714. package/skills/manageskill/.env.example +0 -16
  715. package/skills/manageskill/CLAUDE.md +0 -48
  716. package/skills/manageskill/README.md +0 -210
  717. package/skills/manageskill/package.json +0 -24
  718. package/skills/manageskill/scripts/migrate.ts +0 -57
  719. package/skills/manageskill/scripts/seed.ts +0 -58
  720. package/skills/manageskill/src/db/index.ts +0 -37
  721. package/skills/manageskill/src/index.ts +0 -3
  722. package/skills/manageskill/src/lib/api-client.ts +0 -108
  723. package/skills/manageskill/src/lib/config.ts +0 -34
  724. package/skills/manageskill/src/lib/installer.ts +0 -140
  725. package/skills/manageskill/src/lib/service-dir.ts +0 -119
  726. package/skills/manageskill/tsconfig.json +0 -29
  727. package/skills/mcp-builder/CLAUDE.md +0 -19
  728. package/skills/mcp-builder/package.json +0 -30
  729. package/skills/mcp-builder/src/ai-descriptions.ts +0 -37
  730. package/skills/mcp-builder/src/generators.ts +0 -513
  731. package/skills/mcp-builder/src/index.ts +0 -62
  732. package/skills/mcp-builder/src/minimist.d.ts +0 -15
  733. package/skills/mcp-builder/src/naming.ts +0 -12
  734. package/skills/mcp-builder/src/options.ts +0 -170
  735. package/skills/mcp-builder/src/templates.ts +0 -149
  736. package/skills/mcp-builder/src/types.ts +0 -42
  737. package/skills/mcp-builder/tsconfig.json +0 -10
  738. package/skills/meal-plan-designer/CLAUDE.md +0 -19
  739. package/skills/meal-plan-designer/package.json +0 -27
  740. package/skills/meal-plan-designer/src/index.ts +0 -301
  741. package/skills/meal-plan-designer/tsconfig.json +0 -10
  742. package/skills/meeting-insight-summarizer/CLAUDE.md +0 -19
  743. package/skills/meeting-insight-summarizer/package.json +0 -27
  744. package/skills/meeting-insight-summarizer/src/index.ts +0 -316
  745. package/skills/meeting-insight-summarizer/tsconfig.json +0 -10
  746. package/skills/microcopy-generator/CLAUDE.md +0 -19
  747. package/skills/microcopy-generator/package.json +0 -27
  748. package/skills/microcopy-generator/src/index.ts +0 -303
  749. package/skills/microcopy-generator/tsconfig.json +0 -10
  750. package/skills/mindfulness-prompt-cache/CLAUDE.md +0 -19
  751. package/skills/mindfulness-prompt-cache/package.json +0 -27
  752. package/skills/mindfulness-prompt-cache/src/index.ts +0 -290
  753. package/skills/mindfulness-prompt-cache/tsconfig.json +0 -10
  754. package/skills/music/SKILL.md +0 -33
  755. package/skills/music/package.json +0 -11
  756. package/skills/music-album/SKILL.md +0 -37
  757. package/skills/music-album/package.json +0 -11
  758. package/skills/notion-manager/CLAUDE.md +0 -19
  759. package/skills/notion-manager/package.json +0 -29
  760. package/skills/notion-manager/src/index.ts +0 -105
  761. package/skills/notion-manager/tsconfig.json +0 -10
  762. package/skills/npmpublish/CLAUDE.md +0 -30
  763. package/skills/npmpublish/README.md +0 -83
  764. package/skills/npmpublish/SKILL.md +0 -70
  765. package/skills/npmpublish/package.json +0 -41
  766. package/skills/npmpublish/src/index.ts +0 -192
  767. package/skills/npmpublish/tsconfig.json +0 -18
  768. package/skills/onboarding-sequence-builder/CLAUDE.md +0 -19
  769. package/skills/onboarding-sequence-builder/package.json +0 -27
  770. package/skills/onboarding-sequence-builder/src/index.ts +0 -321
  771. package/skills/onboarding-sequence-builder/tsconfig.json +0 -10
  772. package/skills/onsite-ops-checklist/CLAUDE.md +0 -19
  773. package/skills/onsite-ops-checklist/package.json +0 -27
  774. package/skills/onsite-ops-checklist/src/index.ts +0 -307
  775. package/skills/onsite-ops-checklist/tsconfig.json +0 -10
  776. package/skills/outreach-cadence-designer/CLAUDE.md +0 -19
  777. package/skills/outreach-cadence-designer/package.json +0 -27
  778. package/skills/outreach-cadence-designer/src/index.ts +0 -330
  779. package/skills/outreach-cadence-designer/tsconfig.json +0 -10
  780. package/skills/packaging-concept-studio/CLAUDE.md +0 -19
  781. package/skills/packaging-concept-studio/package.json +0 -27
  782. package/skills/packaging-concept-studio/src/index.ts +0 -296
  783. package/skills/packaging-concept-studio/tsconfig.json +0 -10
  784. package/skills/packing-plan-pro/CLAUDE.md +0 -19
  785. package/skills/packing-plan-pro/package.json +0 -27
  786. package/skills/packing-plan-pro/src/index.ts +0 -306
  787. package/skills/packing-plan-pro/tsconfig.json +0 -10
  788. package/skills/parent-teacher-brief/CLAUDE.md +0 -19
  789. package/skills/parent-teacher-brief/package.json +0 -27
  790. package/skills/parent-teacher-brief/src/index.ts +0 -290
  791. package/skills/parent-teacher-brief/tsconfig.json +0 -10
  792. package/skills/partner-kit-assembler/CLAUDE.md +0 -19
  793. package/skills/partner-kit-assembler/package.json +0 -27
  794. package/skills/partner-kit-assembler/src/index.ts +0 -313
  795. package/skills/partner-kit-assembler/tsconfig.json +0 -10
  796. package/skills/payroll-change-prepper/CLAUDE.md +0 -19
  797. package/skills/payroll-change-prepper/package.json +0 -27
  798. package/skills/payroll-change-prepper/src/index.ts +0 -304
  799. package/skills/payroll-change-prepper/tsconfig.json +0 -10
  800. package/skills/pdf-read/SKILL.md +0 -56
  801. package/skills/pdf-read/package.json +0 -11
  802. package/skills/pdf-read/tsconfig.json +0 -8
  803. package/skills/persona-based-adwriter/CLAUDE.md +0 -19
  804. package/skills/persona-based-adwriter/package.json +0 -27
  805. package/skills/persona-based-adwriter/src/index.ts +0 -285
  806. package/skills/persona-based-adwriter/tsconfig.json +0 -10
  807. package/skills/persona-generator/CLAUDE.md +0 -19
  808. package/skills/persona-generator/package.json +0 -27
  809. package/skills/persona-generator/src/index.ts +0 -443
  810. package/skills/persona-generator/tsconfig.json +0 -10
  811. package/skills/personal-daily-ops/CLAUDE.md +0 -19
  812. package/skills/personal-daily-ops/package.json +0 -27
  813. package/skills/personal-daily-ops/src/index.ts +0 -324
  814. package/skills/personal-daily-ops/tsconfig.json +0 -10
  815. package/skills/pet-care-scheduler/CLAUDE.md +0 -19
  816. package/skills/pet-care-scheduler/package.json +0 -27
  817. package/skills/pet-care-scheduler/src/index.ts +0 -298
  818. package/skills/pet-care-scheduler/tsconfig.json +0 -10
  819. package/skills/photo-album/SKILL.md +0 -29
  820. package/skills/photo-album/package.json +0 -11
  821. package/skills/photo-album/tsconfig.json +0 -4
  822. package/skills/playlist-maker/SKILL.md +0 -33
  823. package/skills/playlist-maker/package.json +0 -11
  824. package/skills/playlist-maker/tsconfig.json +0 -4
  825. package/skills/podcast-show-notes/CLAUDE.md +0 -19
  826. package/skills/podcast-show-notes/package.json +0 -27
  827. package/skills/podcast-show-notes/src/index.ts +0 -302
  828. package/skills/podcast-show-notes/tsconfig.json +0 -10
  829. package/skills/presentation-theme-maker/CLAUDE.md +0 -19
  830. package/skills/presentation-theme-maker/package.json +0 -27
  831. package/skills/presentation-theme-maker/src/index.ts +0 -292
  832. package/skills/presentation-theme-maker/tsconfig.json +0 -10
  833. package/skills/press-release-drafter/CLAUDE.md +0 -19
  834. package/skills/press-release-drafter/package.json +0 -27
  835. package/skills/press-release-drafter/src/index.ts +0 -291
  836. package/skills/press-release-drafter/tsconfig.json +0 -10
  837. package/skills/print-collateral-designer/CLAUDE.md +0 -19
  838. package/skills/print-collateral-designer/package.json +0 -27
  839. package/skills/print-collateral-designer/src/index.ts +0 -298
  840. package/skills/print-collateral-designer/tsconfig.json +0 -10
  841. package/skills/procurement-scorecard/CLAUDE.md +0 -19
  842. package/skills/procurement-scorecard/package.json +0 -27
  843. package/skills/procurement-scorecard/src/index.ts +0 -338
  844. package/skills/procurement-scorecard/tsconfig.json +0 -10
  845. package/skills/product-demo-script/CLAUDE.md +0 -19
  846. package/skills/product-demo-script/package.json +0 -27
  847. package/skills/product-demo-script/src/index.ts +0 -326
  848. package/skills/product-demo-script/tsconfig.json +0 -10
  849. package/skills/project-dashboard-reports/SKILL.md +0 -78
  850. package/skills/project-dashboard-reports/package.json +0 -25
  851. package/skills/project-dashboard-reports/src/index.ts +0 -67
  852. package/skills/project-retro-companion/CLAUDE.md +0 -19
  853. package/skills/project-retro-companion/package.json +0 -27
  854. package/skills/project-retro-companion/src/index.ts +0 -298
  855. package/skills/project-retro-companion/tsconfig.json +0 -10
  856. package/skills/proposal-redline-advisor/CLAUDE.md +0 -19
  857. package/skills/proposal-redline-advisor/package.json +0 -27
  858. package/skills/proposal-redline-advisor/src/index.ts +0 -320
  859. package/skills/proposal-redline-advisor/tsconfig.json +0 -10
  860. package/skills/read-image/SKILL.md +0 -47
  861. package/skills/read-image/package.json +0 -33
  862. package/skills/read-image/src/index.ts +0 -264
  863. package/skills/read-pdf/SKILL.md +0 -53
  864. package/skills/read-pdf/package.json +0 -11
  865. package/skills/remove-background/CLAUDE.md +0 -19
  866. package/skills/remove-background/package.json +0 -11
  867. package/skills/remove-background/tsconfig.json +0 -10
  868. package/skills/risk-disclosure-kit/CLAUDE.md +0 -19
  869. package/skills/risk-disclosure-kit/package.json +0 -27
  870. package/skills/risk-disclosure-kit/src/index.ts +0 -307
  871. package/skills/risk-disclosure-kit/tsconfig.json +0 -10
  872. package/skills/roi-comparison-tool/CLAUDE.md +0 -19
  873. package/skills/roi-comparison-tool/package.json +0 -27
  874. package/skills/roi-comparison-tool/src/index.ts +0 -322
  875. package/skills/roi-comparison-tool/tsconfig.json +0 -10
  876. package/skills/sales-call-recapper/CLAUDE.md +0 -19
  877. package/skills/sales-call-recapper/package.json +0 -27
  878. package/skills/sales-call-recapper/src/index.ts +0 -300
  879. package/skills/sales-call-recapper/tsconfig.json +0 -10
  880. package/skills/salescopy/.env.example +0 -2
  881. package/skills/salescopy/CLAUDE.md +0 -23
  882. package/skills/salescopy/LICENSE +0 -192
  883. package/skills/salescopy/README.md +0 -72
  884. package/skills/salescopy/package.json +0 -27
  885. package/skills/salescopy/src/commands/config.ts +0 -115
  886. package/skills/salescopy/src/commands/generate.ts +0 -179
  887. package/skills/salescopy/src/commands/sessions.ts +0 -169
  888. package/skills/salescopy/src/commands/templates.ts +0 -99
  889. package/skills/salescopy/src/index.ts +0 -3
  890. package/skills/salescopy/src/lib/generator.ts +0 -197
  891. package/skills/salescopy/src/lib/storage.ts +0 -191
  892. package/skills/salescopy/src/types/index.ts +0 -74
  893. package/skills/salescopy/src/utils/logger.ts +0 -33
  894. package/skills/salescopy/src/utils/paths.ts +0 -25
  895. package/skills/salescopy/tsconfig.json +0 -23
  896. package/skills/scaffold-project/CLAUDE.md +0 -19
  897. package/skills/scaffold-project/package.json +0 -29
  898. package/skills/scaffold-project/src/ai-detect.ts +0 -136
  899. package/skills/scaffold-project/src/file-generators.ts +0 -292
  900. package/skills/scaffold-project/src/index.ts +0 -240
  901. package/skills/scaffold-project/src/project-config.ts +0 -338
  902. package/skills/scaffold-project/src/templates.ts +0 -173
  903. package/skills/scaffold-project/src/types.ts +0 -58
  904. package/skills/scaffold-project/tsconfig.json +0 -10
  905. package/skills/scholarship-tracker/CLAUDE.md +0 -19
  906. package/skills/scholarship-tracker/package.json +0 -27
  907. package/skills/scholarship-tracker/src/index.ts +0 -298
  908. package/skills/scholarship-tracker/tsconfig.json +0 -10
  909. package/skills/sdk-generator/SKILL.md +0 -45
  910. package/skills/sdk-generator/package.json +0 -11
  911. package/skills/sdk-generator/tsconfig.json +0 -8
  912. package/skills/seating-chart-maker/CLAUDE.md +0 -19
  913. package/skills/seating-chart-maker/package.json +0 -27
  914. package/skills/seating-chart-maker/src/index.ts +0 -312
  915. package/skills/seating-chart-maker/tsconfig.json +0 -10
  916. package/skills/seo-brief-builder/CLAUDE.md +0 -19
  917. package/skills/seo-brief-builder/package.json +0 -27
  918. package/skills/seo-brief-builder/src/index.ts +0 -288
  919. package/skills/seo-brief-builder/tsconfig.json +0 -10
  920. package/skills/short-video-pack/SKILL.md +0 -30
  921. package/skills/short-video-pack/package.json +0 -11
  922. package/skills/slack-assistant/CLAUDE.md +0 -19
  923. package/skills/slack-assistant/package.json +0 -29
  924. package/skills/slack-assistant/src/index.ts +0 -79
  925. package/skills/slack-assistant/tsconfig.json +0 -10
  926. package/skills/sleep-routine-analyzer/CLAUDE.md +0 -19
  927. package/skills/sleep-routine-analyzer/package.json +0 -27
  928. package/skills/sleep-routine-analyzer/src/index.ts +0 -293
  929. package/skills/sleep-routine-analyzer/tsconfig.json +0 -10
  930. package/skills/sms/README.md +0 -33
  931. package/skills/sms/package.json +0 -35
  932. package/skills/sms/src/index.ts +0 -335
  933. package/skills/sms/tsconfig.json +0 -21
  934. package/skills/social-media-kit/CLAUDE.md +0 -19
  935. package/skills/social-media-kit/package.json +0 -27
  936. package/skills/social-media-kit/src/index.ts +0 -281
  937. package/skills/social-media-kit/tsconfig.json +0 -10
  938. package/skills/sponsorship-proposal-lab/CLAUDE.md +0 -19
  939. package/skills/sponsorship-proposal-lab/package.json +0 -27
  940. package/skills/sponsorship-proposal-lab/src/index.ts +0 -300
  941. package/skills/sponsorship-proposal-lab/tsconfig.json +0 -10
  942. package/skills/spreadsheet-cleanroom/CLAUDE.md +0 -19
  943. package/skills/spreadsheet-cleanroom/package.json +0 -27
  944. package/skills/spreadsheet-cleanroom/src/index.ts +0 -331
  945. package/skills/spreadsheet-cleanroom/tsconfig.json +0 -10
  946. package/skills/stress-relief-playbook/CLAUDE.md +0 -19
  947. package/skills/stress-relief-playbook/package.json +0 -27
  948. package/skills/stress-relief-playbook/src/index.ts +0 -298
  949. package/skills/stress-relief-playbook/tsconfig.json +0 -10
  950. package/skills/study-guide-builder/CLAUDE.md +0 -19
  951. package/skills/study-guide-builder/package.json +0 -27
  952. package/skills/study-guide-builder/src/index.ts +0 -298
  953. package/skills/study-guide-builder/tsconfig.json +0 -10
  954. package/skills/subscription-spend-watcher/CLAUDE.md +0 -19
  955. package/skills/subscription-spend-watcher/package.json +0 -27
  956. package/skills/subscription-spend-watcher/src/index.ts +0 -312
  957. package/skills/subscription-spend-watcher/tsconfig.json +0 -10
  958. package/skills/subtitle/.env.example +0 -2
  959. package/skills/subtitle/CLAUDE.md +0 -37
  960. package/skills/subtitle/LICENSE +0 -192
  961. package/skills/subtitle/README.md +0 -63
  962. package/skills/subtitle/package.json +0 -43
  963. package/skills/subtitle/src/commands/config.ts +0 -53
  964. package/skills/subtitle/src/commands/generate.ts +0 -61
  965. package/skills/subtitle/src/index.ts +0 -3
  966. package/skills/subtitle/src/lib/generator.ts +0 -216
  967. package/skills/subtitle/src/lib/storage.ts +0 -62
  968. package/skills/subtitle/src/types/index.ts +0 -68
  969. package/skills/subtitle/src/utils/logger.ts +0 -34
  970. package/skills/subtitle/src/utils/paths.ts +0 -51
  971. package/skills/subtitle/tsconfig.json +0 -21
  972. package/skills/survey-insight-extractor/CLAUDE.md +0 -19
  973. package/skills/survey-insight-extractor/package.json +0 -27
  974. package/skills/survey-insight-extractor/src/index.ts +0 -317
  975. package/skills/survey-insight-extractor/tsconfig.json +0 -10
  976. package/skills/terraform-generator/CLAUDE.md +0 -19
  977. package/skills/terraform-generator/package.json +0 -29
  978. package/skills/terraform-generator/src/index.ts +0 -99
  979. package/skills/terraform-generator/tsconfig.json +0 -10
  980. package/skills/testimonial-graphics/CLAUDE.md +0 -19
  981. package/skills/testimonial-graphics/package.json +0 -27
  982. package/skills/testimonial-graphics/src/index.ts +0 -303
  983. package/skills/testimonial-graphics/tsconfig.json +0 -10
  984. package/skills/timesheet/.env.example +0 -25
  985. package/skills/timesheet/README.md +0 -235
  986. package/skills/timesheet/package.json +0 -47
  987. package/skills/timesheet/scripts/publish.ts +0 -210
  988. package/skills/timesheet/src/commands/employee.ts +0 -96
  989. package/skills/timesheet/src/commands/export.ts +0 -29
  990. package/skills/timesheet/src/commands/generate.ts +0 -102
  991. package/skills/timesheet/src/commands/holiday.ts +0 -74
  992. package/skills/timesheet/src/commands/profile.ts +0 -133
  993. package/skills/timesheet/src/commands/setup.ts +0 -21
  994. package/skills/timesheet/src/commands/vacation.ts +0 -93
  995. package/skills/timesheet/src/index.ts +0 -3
  996. package/skills/timesheet/src/lib/employees.ts +0 -56
  997. package/skills/timesheet/src/lib/export.ts +0 -123
  998. package/skills/timesheet/src/lib/holidays.ts +0 -79
  999. package/skills/timesheet/src/lib/paths.ts +0 -59
  1000. package/skills/timesheet/src/lib/profiles.ts +0 -168
  1001. package/skills/timesheet/src/lib/storage.ts +0 -83
  1002. package/skills/timesheet/src/lib/timesheet.ts +0 -130
  1003. package/skills/timesheet/src/lib/vacations.ts +0 -70
  1004. package/skills/timesheet/src/types/index.ts +0 -96
  1005. package/skills/timesheet/tsconfig.json +0 -29
  1006. package/skills/transcript/LICENSE +0 -192
  1007. package/skills/transcript/README.md +0 -17
  1008. package/skills/transcript/SKILL.md +0 -80
  1009. package/skills/transcript/package.json +0 -11
  1010. package/skills/transcript/tsconfig.json +0 -18
  1011. package/skills/travel-budget-balancer/CLAUDE.md +0 -19
  1012. package/skills/travel-budget-balancer/package.json +0 -27
  1013. package/skills/travel-budget-balancer/src/index.ts +0 -297
  1014. package/skills/travel-budget-balancer/tsconfig.json +0 -10
  1015. package/skills/video/SKILL.md +0 -37
  1016. package/skills/video/package.json +0 -11
  1017. package/skills/video-cut-suggester/CLAUDE.md +0 -19
  1018. package/skills/video-cut-suggester/package.json +0 -27
  1019. package/skills/video-cut-suggester/src/index.ts +0 -304
  1020. package/skills/video-cut-suggester/tsconfig.json +0 -10
  1021. package/skills/video-thumbnail/CLAUDE.md +0 -19
  1022. package/skills/video-thumbnail/package.json +0 -27
  1023. package/skills/video-thumbnail/src/index.ts +0 -356
  1024. package/skills/video-thumbnail/tsconfig.json +0 -10
  1025. package/skills/voiceover-jingle-pack/SKILL.md +0 -28
  1026. package/skills/voiceover-jingle-pack/package.json +0 -11
  1027. package/skills/webcrawling/CLAUDE.md +0 -11
  1028. package/skills/webcrawling/LICENSE +0 -192
  1029. package/skills/webcrawling/README.md +0 -24
  1030. package/skills/webcrawling/package.json +0 -11
  1031. package/skills/webcrawling/tsconfig.json +0 -22
  1032. package/skills/webinar-script-coach/CLAUDE.md +0 -19
  1033. package/skills/webinar-script-coach/package.json +0 -27
  1034. package/skills/webinar-script-coach/src/index.ts +0 -296
  1035. package/skills/webinar-script-coach/tsconfig.json +0 -10
  1036. package/skills/wellness-progress-reporter/CLAUDE.md +0 -19
  1037. package/skills/wellness-progress-reporter/package.json +0 -27
  1038. package/skills/wellness-progress-reporter/src/index.ts +0 -298
  1039. package/skills/wellness-progress-reporter/tsconfig.json +0 -10
  1040. package/skills/workout-cycle-planner/CLAUDE.md +0 -19
  1041. package/skills/workout-cycle-planner/package.json +0 -27
  1042. package/skills/workout-cycle-planner/src/index.ts +0 -299
  1043. package/skills/workout-cycle-planner/tsconfig.json +0 -10
  1044. package/skills/write/.env.example +0 -9
  1045. package/skills/write/LICENSE +0 -192
  1046. package/skills/write/README.md +0 -17
  1047. package/skills/write/SKILL.md +0 -90
  1048. package/skills/write/package.json +0 -32
  1049. package/skills/write/src/agents/image-generator.ts +0 -186
  1050. package/skills/write/src/agents/researcher.ts +0 -61
  1051. package/skills/write/src/agents/writer.ts +0 -99
  1052. package/skills/write/src/index-local.ts +0 -248
  1053. package/skills/write/src/index.ts +0 -4
  1054. package/skills/write/src/orchestrator.ts +0 -171
  1055. package/skills/write/src/types.ts +0 -65
  1056. package/skills/write/tsconfig.json +0 -18
  1057. /package/migrations/{0001_open_skills_self_hosted.sql → postgres/0001_open_skills_self_hosted.sql} +0 -0
  1058. /package/skills/{read-image → api-docs-portal}/tsconfig.json +0 -0
  1059. /package/skills/{read-pdf → brand-assets}/tsconfig.json +0 -0
package/bin/migrate.js CHANGED
@@ -2,26 +2,74 @@
2
2
  // @bun
3
3
 
4
4
  // src/server/migrate.ts
5
- import { existsSync, readdirSync, readFileSync } from "fs";
6
- import { join } from "path";
5
+ import { existsSync as existsSync3, readdirSync as readdirSync3, readFileSync as readFileSync3 } from "fs";
6
+ import { join as join5 } from "path";
7
+
8
+ // src/lib/retired-settings.ts
9
+ var RETIRED_ENV_SUFFIXES = ["_STORAGE_MODE", "_DEPLOYMENT_MODE", "_CLOUD_MODE"];
10
+ class RetiredSettingError extends Error {
11
+ code = "RETIRED_SETTING";
12
+ setting;
13
+ constructor(setting, message) {
14
+ super(message);
15
+ this.name = "RetiredSettingError";
16
+ this.setting = setting;
17
+ }
18
+ }
19
+ function isRetiredModeEnvVar(name, app) {
20
+ const upper = name.toUpperCase();
21
+ if (!upper.includes(app.toUpperCase()))
22
+ return false;
23
+ return RETIRED_ENV_SUFFIXES.some((suffix) => upper.endsWith(suffix));
24
+ }
25
+ function findRetiredModeEnvVars(env, app) {
26
+ const found = [];
27
+ for (const [name, value] of Object.entries(env)) {
28
+ if (value === undefined || value === "")
29
+ continue;
30
+ if (isRetiredModeEnvVar(name, app))
31
+ found.push({ name, value });
32
+ }
33
+ return found.sort((a, b) => a.name.localeCompare(b.name));
34
+ }
35
+ function assertNoRetiredModeEnvVars(env, options) {
36
+ const found = findRetiredModeEnvVars(env, options.app);
37
+ if (found.length === 0)
38
+ return;
39
+ const names = found.map((entry) => entry.name);
40
+ throw new RetiredSettingError(names[0], `${names.join(", ")} ${names.length === 1 ? "is" : "are"} no longer read. ` + "Deployment modes were removed: where a server keeps its data is decided by the " + `database it is given, not by a declared label. Set ${options.replacement} to a ` + "postgres:// URL to use PostgreSQL, or leave it unset for the on-box SQLite database. " + `Then unset ${names.join(" and ")}. ` + "Refused rather than ignored, because a discarded setting looks exactly like a " + "working one until something needs the data.");
41
+ }
7
42
 
8
43
  // src/server/config.ts
9
- var DEFAULT_SELF_HOSTED_API_URL = "https://skills.md";
44
+ var DATABASE_URL_ENV = "HASNA_SKILLS_DATABASE_URL";
45
+ var SKILLS_ENV_NAMESPACE = "SKILLS";
10
46
  function resolveServerConfig(env = process.env) {
47
+ assertNoRetiredModeEnvVars(env, {
48
+ app: SKILLS_ENV_NAMESPACE,
49
+ replacement: DATABASE_URL_ENV
50
+ });
11
51
  const nodeEnv = env.NODE_ENV || "development";
52
+ const host = env.HOST || env.SKILLS_HOST || "0.0.0.0";
53
+ const port = parsePositiveInt(env.PORT || env.SKILLS_PORT, 8787);
12
54
  return {
13
- host: env.HOST || env.SKILLS_HOST || "0.0.0.0",
14
- port: parsePositiveInt(env.PORT || env.SKILLS_PORT, 8787),
15
- databaseUrl: env.HASNA_SKILLS_DATABASE_URL || env.DATABASE_URL || undefined,
55
+ host,
56
+ port,
57
+ databaseUrl: env[DATABASE_URL_ENV] || env.DATABASE_URL || undefined,
16
58
  bootstrapApiKey: env.HASNA_SKILLS_BOOTSTRAP_API_KEY || undefined,
17
59
  artifactBucket: env.HASNA_SKILLS_S3_BUCKET || env.SKILLS_S3_BUCKET || undefined,
18
60
  artifactPrefix: normalizePrefix(env.HASNA_SKILLS_S3_PREFIX || env.SKILLS_S3_PREFIX || "skills/artifacts"),
19
61
  inlineWorker: env.HASNA_SKILLS_INLINE_WORKER === "1",
20
62
  requestBodyLimitBytes: parsePositiveInt(env.HASNA_SKILLS_REQUEST_BODY_LIMIT_BYTES, 1e6),
21
- publicBaseUrl: (env.SKILLS_PUBLIC_BASE_URL || DEFAULT_SELF_HOSTED_API_URL).replace(/\/+$/, ""),
22
- nodeEnv
63
+ skillBundleLimitBytes: parsePositiveInt(env.HASNA_SKILLS_BUNDLE_LIMIT_BYTES, 25000000),
64
+ publicBaseUrl: (env.SKILLS_PUBLIC_BASE_URL || localOrigin(host, port)).replace(/\/+$/, ""),
65
+ nodeEnv,
66
+ allowEphemeralStore: env.HASNA_SKILLS_ALLOW_EPHEMERAL_STORE === "1"
23
67
  };
24
68
  }
69
+ function localOrigin(host, port) {
70
+ const hostname = host === "0.0.0.0" || host === "::" ? "localhost" : host;
71
+ return `http://${hostname.includes(":") ? `[${hostname}]` : hostname}:${port}`;
72
+ }
25
73
  function parsePositiveInt(value, fallback) {
26
74
  const parsed = Number.parseInt(value ?? "", 10);
27
75
  return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
@@ -30,40 +78,914 @@ function normalizePrefix(value) {
30
78
  return value.replace(/^\/+|\/+$/g, "") || "skills/artifacts";
31
79
  }
32
80
 
33
- // src/server/migrate.ts
34
- async function runMigrations(databaseUrl, migrationsDir = join(process.cwd(), "migrations")) {
35
- if (!existsSync(migrationsDir))
36
- throw new Error(`migrations directory not found: ${migrationsDir}`);
37
- const bunWithSql = Bun;
38
- const sql = new bunWithSql.SQL(databaseUrl, { max: 1 });
39
- await sql.unsafe("CREATE TABLE IF NOT EXISTS schema_migrations (version text PRIMARY KEY, applied_at timestamptz NOT NULL DEFAULT now())");
40
- const appliedRows = await sql`SELECT version FROM schema_migrations`;
41
- const applied = new Set(appliedRows.map((row) => row.version));
42
- const appliedNow = [];
43
- for (const file of readdirSync(migrationsDir).filter((name) => name.endsWith(".sql")).sort()) {
44
- const version = file.replace(/\.sql$/, "");
45
- if (applied.has(version))
46
- continue;
47
- const sqlText = readFileSync(join(migrationsDir, file), "utf8");
48
- await sql.unsafe("BEGIN");
81
+ // src/server/database-url.ts
82
+ import { isAbsolute, join as join2 } from "path";
83
+ import { fileURLToPath } from "url";
84
+
85
+ // src/lib/config.ts
86
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync, readdirSync, statSync } from "fs";
87
+ import { join, dirname } from "path";
88
+ import { homedir } from "os";
89
+ function mergeDirectoryContents(sourceDir, targetDir) {
90
+ if (!existsSync(sourceDir))
91
+ return;
92
+ mkdirSync(targetDir, { recursive: true });
93
+ for (const entry of readdirSync(sourceDir)) {
94
+ const sourcePath = join(sourceDir, entry);
95
+ const targetPath = join(targetDir, entry);
49
96
  try {
50
- await sql.unsafe(sqlText);
51
- await sql`INSERT INTO schema_migrations (version) VALUES (${version})`;
52
- await sql.unsafe("COMMIT");
53
- appliedNow.push(version);
97
+ const sourceStat = statSync(sourcePath);
98
+ if (sourceStat.isDirectory()) {
99
+ mergeDirectoryContents(sourcePath, targetPath);
100
+ continue;
101
+ }
102
+ if (!existsSync(targetPath))
103
+ copyFileSync(sourcePath, targetPath);
104
+ } catch {}
105
+ }
106
+ }
107
+ var DATA_DIR_ENV = "HASNA_SKILLS_DIR";
108
+ function getDataDir() {
109
+ const override = process.env[DATA_DIR_ENV];
110
+ if (override) {
111
+ try {
112
+ mkdirSync(override, { recursive: true });
113
+ } catch {}
114
+ return override;
115
+ }
116
+ const home = process.env["HOME"] || process.env["USERPROFILE"] || homedir();
117
+ const newDir = join(home, ".hasna", "skills");
118
+ const oldDir = join(home, ".skills");
119
+ const oldConfigFile = join(home, ".skillsrc");
120
+ mkdirSync(newDir, { recursive: true });
121
+ try {
122
+ mergeDirectoryContents(oldDir, newDir);
123
+ } catch {}
124
+ if (existsSync(oldConfigFile) && !existsSync(join(newDir, "config.json"))) {
125
+ try {
126
+ copyFileSync(oldConfigFile, join(newDir, "config.json"));
127
+ } catch {}
128
+ }
129
+ return newDir;
130
+ }
131
+
132
+ // src/server/database-url.ts
133
+ var DEFAULT_SQLITE_FILENAME = "server.db";
134
+ var SQLITE_MEMORY_PATH = ":memory:";
135
+ var POSTGRES_SCHEMES = new Set(["postgres", "postgresql"]);
136
+ var SQLITE_SCHEMES = new Set(["sqlite", "sqlite3", "file"]);
137
+ var MEMORY_SCHEMES = new Set(["memory"]);
138
+ var SQLITE_EXTENSIONS = [".db", ".sqlite", ".sqlite3", ".db3"];
139
+ function defaultSqlitePath() {
140
+ return join2(getDataDir(), DEFAULT_SQLITE_FILENAME);
141
+ }
142
+ function resolveDatabaseTarget(raw) {
143
+ const value = raw?.trim();
144
+ if (!value) {
145
+ const path = defaultSqlitePath();
146
+ return { kind: "sqlite", path, durable: true, label: `sqlite (${path})` };
147
+ }
148
+ if (value === SQLITE_MEMORY_PATH) {
149
+ return { kind: "sqlite", path: SQLITE_MEMORY_PATH, durable: false, label: "sqlite (in-memory)" };
150
+ }
151
+ const schemeMatch = value.match(/^([a-z][a-z0-9+.-]+):/i);
152
+ const scheme = schemeMatch?.[1]?.toLowerCase();
153
+ if (scheme && POSTGRES_SCHEMES.has(scheme)) {
154
+ return { kind: "postgres", url: value, durable: true, label: "postgres" };
155
+ }
156
+ if (scheme && MEMORY_SCHEMES.has(scheme)) {
157
+ return { kind: "memory", durable: false, label: "memory (non-durable)" };
158
+ }
159
+ if (scheme && SQLITE_SCHEMES.has(scheme)) {
160
+ const path = sqlitePathFromUrl(value, scheme);
161
+ return path === SQLITE_MEMORY_PATH ? { kind: "sqlite", path, durable: false, label: "sqlite (in-memory)" } : { kind: "sqlite", path, durable: true, label: `sqlite (${path})` };
162
+ }
163
+ if (scheme) {
164
+ throw new Error(`unsupported database scheme "${scheme}:". Supported: postgres://, postgresql://, sqlite:, file:, ` + `an absolute or relative path to a .db/.sqlite file, ":memory:", or "memory:" (non-durable, tests only). ` + `Leave the setting empty to use the default SQLite database at ${defaultSqlitePath()}.`);
165
+ }
166
+ if (looksLikeSqlitePath(value)) {
167
+ const path = isAbsolute(value) ? value : join2(process.cwd(), value);
168
+ return { kind: "sqlite", path, durable: true, label: `sqlite (${path})` };
169
+ }
170
+ throw new Error(`could not resolve a database backend from "${value}". Use postgres://\u2026, sqlite:\u2026, an absolute or ` + `relative path ending in ${SQLITE_EXTENSIONS.join("/")}, ":memory:", or leave it empty for the ` + `default SQLite database at ${defaultSqlitePath()}.`);
171
+ }
172
+ function sqlitePathFromUrl(value, scheme) {
173
+ const rest = value.slice(scheme.length + 1).replace(/[?#].*$/, "");
174
+ if (rest.startsWith(SQLITE_MEMORY_PATH))
175
+ return SQLITE_MEMORY_PATH;
176
+ if (rest === "" || rest === "//") {
177
+ throw new Error(`"${value}" names no database file. Give a path (${scheme}:///var/lib/skills/server.db), ` + `or ":memory:" if a non-durable database is genuinely what you want. ` + "An empty path here usually means an unset variable in a templated URL.");
178
+ }
179
+ if (rest.startsWith("//")) {
180
+ if (!rest.startsWith("///")) {
181
+ const authority = rest.slice(2).split("/")[0];
182
+ throw new Error(`"${value}" has a host ("${authority}") where a path was expected. Remote SQLite files are not a thing; ` + `for an absolute path use ${scheme}:///${rest.slice(2)}, and for a relative one use ${scheme}:${rest.slice(2)}.`);
183
+ }
184
+ if (scheme === "file") {
185
+ try {
186
+ return fileURLToPath(new URL(value));
187
+ } catch {}
188
+ }
189
+ return rest.slice(2).replace(/^\/\/+/, "/");
190
+ }
191
+ return isAbsolute(rest) ? rest : join2(process.cwd(), rest);
192
+ }
193
+ function looksLikeSqlitePath(value) {
194
+ if (value.includes("/"))
195
+ return true;
196
+ return SQLITE_EXTENSIONS.some((extension) => value.toLowerCase().endsWith(extension));
197
+ }
198
+
199
+ // src/server/migrations-dir.ts
200
+ import { existsSync as existsSync2 } from "fs";
201
+ import { dirname as dirname2, join as join3 } from "path";
202
+ var MIGRATION_DIALECTS = ["postgres", "sqlite"];
203
+ var MAX_WALK_UP = 6;
204
+ function findMigrationsRoot(startDirs = defaultStartDirs()) {
205
+ for (const start of startDirs) {
206
+ let dir = start;
207
+ for (let level = 0;level < MAX_WALK_UP; level += 1) {
208
+ const candidate = join3(dir, "migrations");
209
+ if (MIGRATION_DIALECTS.some((dialect) => existsSync2(join3(candidate, dialect))))
210
+ return candidate;
211
+ const parent = dirname2(dir);
212
+ if (parent === dir)
213
+ break;
214
+ dir = parent;
215
+ }
216
+ }
217
+ return null;
218
+ }
219
+ function resolveMigrationsDir(dialect, root = findMigrationsRoot()) {
220
+ if (!root) {
221
+ throw new Error(`could not locate the migrations directory for dialect "${dialect}". ` + `Expected a migrations/${dialect}/ folder alongside the package root.`);
222
+ }
223
+ const dir = join3(root, dialect);
224
+ if (!existsSync2(dir)) {
225
+ throw new Error(`migrations directory not found: ${dir}`);
226
+ }
227
+ return dir;
228
+ }
229
+ function defaultStartDirs() {
230
+ const dirs = [import.meta.dir];
231
+ const cwd = process.cwd();
232
+ if (cwd && cwd !== import.meta.dir)
233
+ dirs.push(cwd);
234
+ return dirs;
235
+ }
236
+
237
+ // src/server/sqlite-store.ts
238
+ import { Database } from "bun:sqlite";
239
+ import { randomUUID as randomUUID2 } from "crypto";
240
+ import { mkdirSync as mkdirSync2, readFileSync as readFileSync2, readdirSync as readdirSync2 } from "fs";
241
+ import { dirname as dirname3, join as join4 } from "path";
242
+
243
+ // src/server/auth.ts
244
+ import { createHash } from "crypto";
245
+ function hashApiKey(token) {
246
+ return createHash("sha256").update(token).digest("hex");
247
+ }
248
+ function publicPrincipal(partial = {}) {
249
+ return {
250
+ apiKeyId: partial.apiKeyId || "key_dev",
251
+ orgId: partial.orgId || "org_dev",
252
+ orgSlug: partial.orgSlug || "dev",
253
+ orgName: partial.orgName || "Development",
254
+ userId: partial.userId || "user_dev",
255
+ email: partial.email || "dev@example.com",
256
+ role: partial.role || "owner",
257
+ scopes: partial.scopes || ["skills:read", "runs:write"]
258
+ };
259
+ }
260
+
261
+ // src/server/rows.ts
262
+ import { randomUUID } from "crypto";
263
+
264
+ // src/lib/skill-bundle.ts
265
+ var ANY_SEGMENT_EXCLUDES = new Set([
266
+ ".git",
267
+ ".ds_store",
268
+ ".system",
269
+ "node_modules",
270
+ ".aws",
271
+ ".ssh",
272
+ ".gnupg",
273
+ ".docker"
274
+ ]);
275
+ var ROOT_EXCLUDES = new Set(["dist", "build", ".turbo"]);
276
+ var CREDENTIAL_FILENAMES = new Set([
277
+ ".npmrc",
278
+ ".pypirc",
279
+ ".netrc",
280
+ ".envrc",
281
+ ".pgpass",
282
+ ".git-credentials",
283
+ "credentials",
284
+ "id_rsa",
285
+ "id_dsa",
286
+ "id_ecdsa",
287
+ "id_ed25519"
288
+ ]);
289
+ var ENV_TEMPLATE_NAMES = new Set([".env.example", ".env.sample", ".env.template", ".env.dist"]);
290
+ var NON_DOTENV_EXTENSIONS = new Set([
291
+ "ts",
292
+ "tsx",
293
+ "mts",
294
+ "cts",
295
+ "js",
296
+ "jsx",
297
+ "mjs",
298
+ "cjs",
299
+ "json",
300
+ "jsonc",
301
+ "json5",
302
+ "py",
303
+ "rb",
304
+ "go",
305
+ "rs",
306
+ "java",
307
+ "kt",
308
+ "kts",
309
+ "swift",
310
+ "c",
311
+ "h",
312
+ "cc",
313
+ "cpp",
314
+ "hpp",
315
+ "cs",
316
+ "php",
317
+ "sh",
318
+ "bash",
319
+ "zsh",
320
+ "fish",
321
+ "ps1",
322
+ "bat",
323
+ "cmd",
324
+ "lua",
325
+ "pl",
326
+ "pm",
327
+ "r",
328
+ "jl",
329
+ "dart",
330
+ "ex",
331
+ "exs",
332
+ "scala",
333
+ "clj",
334
+ "cljs",
335
+ "groovy",
336
+ "gradle",
337
+ "vb",
338
+ "fs",
339
+ "yaml",
340
+ "yml",
341
+ "toml",
342
+ "ini",
343
+ "xml",
344
+ "csv",
345
+ "tsv",
346
+ "html",
347
+ "htm",
348
+ "css",
349
+ "scss",
350
+ "sass",
351
+ "less",
352
+ "md",
353
+ "mdx",
354
+ "txt",
355
+ "rst",
356
+ "adoc",
357
+ "sql",
358
+ "graphql",
359
+ "gql",
360
+ "proto",
361
+ "d",
362
+ "png",
363
+ "jpg",
364
+ "jpeg",
365
+ "gif",
366
+ "svg",
367
+ "webp",
368
+ "ico",
369
+ "bmp",
370
+ "pdf",
371
+ "woff",
372
+ "woff2",
373
+ "ttf",
374
+ "otf",
375
+ "eot",
376
+ "mp3",
377
+ "mp4",
378
+ "wav",
379
+ "webm",
380
+ "zip",
381
+ "gz",
382
+ "tar",
383
+ "wasm"
384
+ ]);
385
+ function ownBytes(view) {
386
+ const source = view instanceof ArrayBuffer ? new Uint8Array(view) : view;
387
+ const out = new Uint8Array(new ArrayBuffer(source.byteLength));
388
+ out.set(source);
389
+ return out;
390
+ }
391
+
392
+ // src/server/rows.ts
393
+ function nowIso() {
394
+ return new Date().toISOString();
395
+ }
396
+ function normalizeLimit(limit) {
397
+ return Number.isFinite(limit) ? Math.max(0, Math.trunc(limit)) : 0;
398
+ }
399
+ function runId() {
400
+ return `run_${Date.now().toString(36)}_${randomUUID().slice(0, 8)}`;
401
+ }
402
+ function rowToRun(row) {
403
+ return {
404
+ id: String(row.id),
405
+ orgId: String(row.org_id),
406
+ userId: String(row.user_id),
407
+ skill: String(row.skill_slug),
408
+ requestedSlug: String(row.requested_slug),
409
+ status: String(row.status),
410
+ input: parseJsonObject(row.input_json),
411
+ args: parseJsonArray(row.args_json),
412
+ ...typeof row.idempotency_key === "string" ? { idempotencyKey: row.idempotency_key } : {},
413
+ correlationId: String(row.correlation_id),
414
+ costCents: Number(row.cost_cents ?? 0),
415
+ ...typeof row.output_type === "string" ? { outputType: row.output_type } : {},
416
+ ...typeof row.output_preview === "string" ? { outputPreview: row.output_preview } : {},
417
+ ...typeof row.error_code === "string" ? { errorCode: row.error_code } : {},
418
+ ...typeof row.error_message === "string" ? { errorMessage: row.error_message } : {},
419
+ createdAt: dateString(row.created_at),
420
+ ...row.started_at ? { startedAt: dateString(row.started_at) } : {},
421
+ ...row.completed_at ? { completedAt: dateString(row.completed_at) } : {}
422
+ };
423
+ }
424
+ function rowToLog(row) {
425
+ return {
426
+ runId: String(row.run_id),
427
+ sequence: Number(row.sequence),
428
+ level: String(row.level),
429
+ message: String(row.message),
430
+ createdAt: dateString(row.created_at)
431
+ };
432
+ }
433
+ function rowToArtifact(row) {
434
+ return {
435
+ id: String(row.id),
436
+ runId: String(row.run_id),
437
+ orgId: String(row.org_id),
438
+ fileName: String(row.file_name),
439
+ relativePath: String(row.relative_path),
440
+ contentType: String(row.content_type),
441
+ byteSize: Number(row.byte_size),
442
+ sha256: String(row.sha256),
443
+ storageKind: String(row.storage_kind),
444
+ ...typeof row.storage_key === "string" ? { storageKey: row.storage_key } : {},
445
+ ...typeof row.body_text === "string" ? { bodyText: row.body_text } : {},
446
+ createdAt: dateString(row.created_at)
447
+ };
448
+ }
449
+ function rowToSkill(row) {
450
+ return {
451
+ orgId: String(row.org_id),
452
+ slug: String(row.slug),
453
+ displayName: String(row.display_name),
454
+ description: String(row.description ?? ""),
455
+ category: String(row.category),
456
+ tags: parseJsonArray(row.tags_json),
457
+ source: String(row.source),
458
+ kind: String(row.kind) === "instruction" ? "instruction" : "executable",
459
+ ...typeof row.version === "string" ? { version: row.version } : {},
460
+ ...typeof row.skill_md === "string" ? { skillMd: row.skill_md } : {},
461
+ ...typeof row.bundle_sha256 === "string" ? { bundleSha256: row.bundle_sha256 } : {},
462
+ ...row.bundle_byte_size === null || row.bundle_byte_size === undefined ? {} : { bundleByteSize: Number(row.bundle_byte_size) },
463
+ ...typeof row.published_by_user_id === "string" ? { publishedByUserId: row.published_by_user_id } : {},
464
+ createdAt: dateString(row.created_at),
465
+ updatedAt: dateString(row.updated_at)
466
+ };
467
+ }
468
+ function rowToSkillBundle(row) {
469
+ return {
470
+ orgId: String(row.org_id),
471
+ sha256: String(row.sha256),
472
+ byteSize: Number(row.byte_size),
473
+ contentType: String(row.content_type),
474
+ storageKind: String(row.storage_kind),
475
+ ...typeof row.storage_key === "string" ? { storageKey: row.storage_key } : {},
476
+ ...toBytes(row.body_blob) ? { bytes: toBytes(row.body_blob) } : {},
477
+ createdAt: dateString(row.created_at)
478
+ };
479
+ }
480
+ function toBytes(value) {
481
+ if (value == null)
482
+ return null;
483
+ if (value instanceof Uint8Array)
484
+ return ownBytes(value);
485
+ if (value instanceof ArrayBuffer)
486
+ return ownBytes(value);
487
+ return null;
488
+ }
489
+ function parseJsonObject(value) {
490
+ if (value && typeof value === "object" && !Array.isArray(value))
491
+ return value;
492
+ if (typeof value === "string") {
493
+ try {
494
+ const parsed = JSON.parse(value);
495
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
496
+ } catch {}
497
+ }
498
+ return {};
499
+ }
500
+ function parseJsonArray(value) {
501
+ const parsed = typeof value === "string" ? safeParse(value) : value;
502
+ return Array.isArray(parsed) ? parsed.map(String) : [];
503
+ }
504
+ function safeParse(value) {
505
+ try {
506
+ return JSON.parse(value);
507
+ } catch {
508
+ return;
509
+ }
510
+ }
511
+ function dateString(value) {
512
+ if (value instanceof Date)
513
+ return value.toISOString();
514
+ return String(value);
515
+ }
516
+
517
+ // src/server/sqlite-store.ts
518
+ var CLAIM_ATTEMPTS = 8;
519
+ var CLAIMABLE_STATUSES = ["queued", "retrying"];
520
+ var LAST_USED_RESOLUTION_MS = 60000;
521
+
522
+ class SqliteSkillsStore {
523
+ backend;
524
+ db;
525
+ closed = false;
526
+ constructor(path = SQLITE_MEMORY_PATH, options = {}) {
527
+ const inMemory = path === SQLITE_MEMORY_PATH;
528
+ if (!inMemory)
529
+ mkdirSync2(dirname3(path), { recursive: true });
530
+ this.db = openDatabase(path);
531
+ this.db.exec(`PRAGMA busy_timeout = ${Math.max(0, options.busyTimeoutMs ?? 5000)}`);
532
+ if (!inMemory)
533
+ enableWalMode(this.db);
534
+ this.db.exec("PRAGMA foreign_keys = ON");
535
+ this.db.exec("PRAGMA synchronous = NORMAL");
536
+ if (options.migrate !== false) {
537
+ applySqliteMigrations(this.db, options.migrationsDir);
538
+ }
539
+ this.backend = {
540
+ kind: "sqlite",
541
+ durable: !inMemory,
542
+ label: inMemory ? "sqlite (in-memory)" : `sqlite (${path})`
543
+ };
544
+ }
545
+ get database() {
546
+ return this.db;
547
+ }
548
+ async close() {
549
+ if (this.closed)
550
+ return;
551
+ this.closed = true;
552
+ this.db.close(false);
553
+ }
554
+ async ensureBootstrapApiKey(token, principal) {
555
+ const resolved = publicPrincipal(principal);
556
+ this.db.transaction(() => {
557
+ this.db.run(`INSERT INTO organizations (id, slug, name) VALUES (?, ?, ?)
558
+ ON CONFLICT (id) DO UPDATE SET slug = excluded.slug, name = excluded.name`, [resolved.orgId, resolved.orgSlug, resolved.orgName]);
559
+ this.db.run(`INSERT INTO users (id, email, name) VALUES (?, ?, ?)
560
+ ON CONFLICT (id) DO UPDATE SET email = excluded.email`, [resolved.userId, resolved.email, resolved.email]);
561
+ this.db.run(`INSERT INTO organization_members (org_id, user_id, role) VALUES (?, ?, ?)
562
+ ON CONFLICT (org_id, user_id) DO UPDATE SET role = excluded.role`, [resolved.orgId, resolved.userId, resolved.role]);
563
+ this.db.run(`INSERT INTO api_keys (id, org_id, user_id, name, key_hash, scopes_json)
564
+ VALUES (?, ?, ?, ?, ?, ?)
565
+ ON CONFLICT (key_hash) DO NOTHING`, [resolved.apiKeyId, resolved.orgId, resolved.userId, "bootstrap", hashApiKey(token), JSON.stringify(resolved.scopes)]);
566
+ })();
567
+ }
568
+ async authenticateApiKeyHash(hash) {
569
+ const row = this.get(`SELECT k.id AS api_key_id, k.scopes_json, k.last_used_at, o.id AS org_id, o.slug AS org_slug, o.name AS org_name,
570
+ u.id AS user_id, u.email, m.role
571
+ FROM api_keys k
572
+ JOIN organizations o ON o.id = k.org_id
573
+ JOIN users u ON u.id = k.user_id
574
+ LEFT JOIN organization_members m ON m.org_id = k.org_id AND m.user_id = k.user_id
575
+ WHERE k.key_hash = ? AND k.revoked_at IS NULL
576
+ LIMIT 1`, [hash]);
577
+ if (!row)
578
+ return null;
579
+ const lastUsed = typeof row.last_used_at === "string" ? Date.parse(row.last_used_at) : Number.NaN;
580
+ if (!Number.isFinite(lastUsed) || Date.now() - lastUsed >= LAST_USED_RESOLUTION_MS) {
581
+ this.db.run("UPDATE api_keys SET last_used_at = ? WHERE id = ?", [nowIso(), String(row.api_key_id)]);
582
+ }
583
+ return {
584
+ apiKeyId: String(row.api_key_id),
585
+ orgId: String(row.org_id),
586
+ orgSlug: String(row.org_slug),
587
+ orgName: String(row.org_name),
588
+ userId: String(row.user_id),
589
+ email: String(row.email),
590
+ role: typeof row.role === "string" ? row.role : "member",
591
+ scopes: parseScopes(row.scopes_json)
592
+ };
593
+ }
594
+ async createRun(input) {
595
+ if (input.idempotencyKey) {
596
+ const existing = this.get("SELECT * FROM skills_runs WHERE org_id = ? AND idempotency_key = ? LIMIT 1", [input.principal.orgId, input.idempotencyKey]);
597
+ if (existing)
598
+ return rowToRun(existing);
599
+ }
600
+ const row = this.get(`INSERT INTO skills_runs (id, org_id, user_id, skill_slug, requested_slug, status, input_json, args_json, idempotency_key, correlation_id, created_at)
601
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
602
+ RETURNING *`, [
603
+ runId(),
604
+ input.principal.orgId,
605
+ input.principal.userId,
606
+ input.slug,
607
+ input.slug,
608
+ "queued",
609
+ JSON.stringify(input.input),
610
+ JSON.stringify(input.args),
611
+ input.idempotencyKey ?? null,
612
+ randomUUID2(),
613
+ nowIso()
614
+ ]);
615
+ return rowToRun(row);
616
+ }
617
+ async listRuns(principal, limit) {
618
+ return this.all("SELECT * FROM skills_runs WHERE org_id = ? ORDER BY created_at DESC, rowid DESC LIMIT ?", [principal.orgId, normalizeLimit(limit)]).map(rowToRun);
619
+ }
620
+ async getRun(principal, id) {
621
+ const row = this.get("SELECT * FROM skills_runs WHERE id = ? AND org_id = ? LIMIT 1", [id, principal.orgId]);
622
+ return row ? rowToRun(row) : null;
623
+ }
624
+ async claimNextRun(input) {
625
+ const lost = new Set;
626
+ for (let attempt = 0;attempt < CLAIM_ATTEMPTS; attempt += 1) {
627
+ const claimed = this.claimOnce(input.workerId, lost);
628
+ if (claimed === "empty")
629
+ return null;
630
+ if (claimed)
631
+ return claimed;
632
+ }
633
+ return null;
634
+ }
635
+ claimOnce(workerId, lost) {
636
+ this.db.exec("BEGIN IMMEDIATE");
637
+ try {
638
+ const excluded = [...lost];
639
+ const candidate = this.get(`SELECT id FROM skills_runs
640
+ WHERE status IN (${CLAIMABLE_STATUSES.map(() => "?").join(", ")})
641
+ ${excluded.length ? `AND id NOT IN (${excluded.map(() => "?").join(", ")})` : ""}
642
+ ORDER BY created_at ASC, rowid ASC
643
+ LIMIT 1`, [...CLAIMABLE_STATUSES, ...excluded]);
644
+ if (!candidate) {
645
+ this.db.exec("COMMIT");
646
+ return "empty";
647
+ }
648
+ const id = String(candidate.id);
649
+ const now = nowIso();
650
+ const result = this.db.run(`UPDATE skills_runs
651
+ SET status = 'running', started_at = COALESCE(started_at, ?), locked_by = ?, locked_at = ?
652
+ WHERE id = ? AND status IN (${CLAIMABLE_STATUSES.map(() => "?").join(", ")})`, [now, workerId, now, id, ...CLAIMABLE_STATUSES]);
653
+ if (result.changes !== 1) {
654
+ this.db.exec("ROLLBACK");
655
+ lost.add(id);
656
+ return null;
657
+ }
658
+ const row = this.get("SELECT * FROM skills_runs WHERE id = ? LIMIT 1", [id]);
659
+ if (!row) {
660
+ this.db.exec("ROLLBACK");
661
+ throw new Error(`claimed run ${id} vanished within its own transaction; refusing to report a lost claim as an empty queue`);
662
+ }
663
+ this.db.exec("COMMIT");
664
+ return rowToRun(row);
54
665
  } catch (error) {
55
- await sql.unsafe("ROLLBACK");
666
+ this.rollbackQuietly();
56
667
  throw error;
57
668
  }
58
669
  }
670
+ async updateRun(id, patch) {
671
+ const current = this.get("SELECT * FROM skills_runs WHERE id = ? LIMIT 1", [id]);
672
+ if (!current)
673
+ return null;
674
+ const run = { ...rowToRun(current), ...patch };
675
+ const row = this.get(`UPDATE skills_runs
676
+ SET status = ?, output_type = ?, output_preview = ?, error_code = ?, error_message = ?, started_at = ?, completed_at = ?
677
+ WHERE id = ?
678
+ RETURNING *`, [
679
+ run.status,
680
+ run.outputType ?? null,
681
+ run.outputPreview ?? null,
682
+ run.errorCode ?? null,
683
+ run.errorMessage ?? null,
684
+ run.startedAt ?? null,
685
+ run.completedAt ?? null,
686
+ id
687
+ ]);
688
+ return row ? rowToRun(row) : null;
689
+ }
690
+ async appendLog(id, orgId, level, message) {
691
+ const row = this.get(`INSERT INTO skills_run_logs (run_id, org_id, sequence, level, message, created_at)
692
+ VALUES (?, ?, (SELECT COALESCE(MAX(sequence), 0) + 1 FROM skills_run_logs WHERE run_id = ?), ?, ?, ?)
693
+ RETURNING *`, [id, orgId, id, level, message, nowIso()]);
694
+ return rowToLog(row);
695
+ }
696
+ async listLogs(principal, id) {
697
+ return this.all(`SELECT l.* FROM skills_run_logs l
698
+ JOIN skills_runs r ON r.id = l.run_id AND r.org_id = ?
699
+ WHERE l.run_id = ?
700
+ ORDER BY l.sequence ASC`, [principal.orgId, id]).map(rowToLog);
701
+ }
702
+ async addArtifact(artifact) {
703
+ const row = this.get(`INSERT INTO skills_artifacts (id, run_id, org_id, file_name, relative_path, content_type, byte_size, sha256, storage_kind, storage_key, body_text, created_at)
704
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
705
+ RETURNING *`, [
706
+ artifact.id,
707
+ artifact.runId,
708
+ artifact.orgId,
709
+ artifact.fileName,
710
+ artifact.relativePath,
711
+ artifact.contentType,
712
+ artifact.byteSize,
713
+ artifact.sha256,
714
+ artifact.storageKind,
715
+ artifact.storageKey ?? null,
716
+ artifact.bodyText ?? null,
717
+ nowIso()
718
+ ]);
719
+ return rowToArtifact(row);
720
+ }
721
+ async listArtifacts(principal, id) {
722
+ return this.all(`SELECT a.* FROM skills_artifacts a
723
+ JOIN skills_runs r ON r.id = a.run_id AND r.org_id = ?
724
+ WHERE a.run_id = ?
725
+ ORDER BY a.created_at ASC, a.rowid ASC`, [principal.orgId, id]).map(rowToArtifact);
726
+ }
727
+ async getArtifact(principal, id, artifact) {
728
+ const row = this.get(`SELECT a.* FROM skills_artifacts a
729
+ JOIN skills_runs r ON r.id = a.run_id AND r.org_id = ?
730
+ WHERE a.run_id = ? AND a.id = ?
731
+ LIMIT 1`, [principal.orgId, id, artifact]);
732
+ return row ? rowToArtifact(row) : null;
733
+ }
734
+ async publishSkill(input) {
735
+ const orgId = input.principal.orgId;
736
+ const now = nowIso();
737
+ return this.db.transaction(() => {
738
+ const previous = this.get("SELECT bundle_sha256 FROM skills_registry WHERE org_id = ? AND slug = ?", [orgId, input.slug]);
739
+ const previousSha = typeof previous?.bundle_sha256 === "string" ? previous.bundle_sha256 : null;
740
+ if (input.bundle) {
741
+ this.db.run(`INSERT INTO skills_bundles (org_id, sha256, byte_size, content_type, storage_kind, storage_key, body_blob, created_at)
742
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
743
+ ON CONFLICT (org_id, sha256) DO UPDATE SET
744
+ byte_size = excluded.byte_size,
745
+ content_type = excluded.content_type,
746
+ storage_kind = excluded.storage_kind,
747
+ storage_key = excluded.storage_key,
748
+ body_blob = excluded.body_blob`, [
749
+ orgId,
750
+ input.bundle.sha256,
751
+ input.bundle.byteSize,
752
+ input.bundle.contentType,
753
+ input.bundle.storageKind,
754
+ input.bundle.storageKey ?? null,
755
+ input.bundle.bytes ?? null,
756
+ now
757
+ ]);
758
+ }
759
+ const row = this.get(`INSERT INTO skills_registry (org_id, slug, display_name, description, category, tags_json, source, kind, version, skill_md,
760
+ bundle_sha256, bundle_byte_size, published_by_user_id, created_at, updated_at)
761
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
762
+ ON CONFLICT (org_id, slug) DO UPDATE SET
763
+ display_name = excluded.display_name,
764
+ description = excluded.description,
765
+ category = excluded.category,
766
+ tags_json = excluded.tags_json,
767
+ source = excluded.source,
768
+ kind = excluded.kind,
769
+ version = excluded.version,
770
+ skill_md = excluded.skill_md,
771
+ -- COALESCE, not a straight assignment. A publish that carries no bundle is a
772
+ -- metadata update, not an instruction to discard the stored one: the plain
773
+ -- assignment nulled bundle_sha256 and then handed the old digest to orphan
774
+ -- collection, so re-publishing metadata over an existing skill deleted its
775
+ -- tarball and left every client with a 404.
776
+ bundle_sha256 = COALESCE(excluded.bundle_sha256, skills_registry.bundle_sha256),
777
+ bundle_byte_size = COALESCE(excluded.bundle_byte_size, skills_registry.bundle_byte_size),
778
+ published_by_user_id = excluded.published_by_user_id,
779
+ updated_at = excluded.updated_at
780
+ RETURNING *`, [
781
+ orgId,
782
+ input.slug,
783
+ input.displayName,
784
+ input.description,
785
+ input.category,
786
+ JSON.stringify(input.tags),
787
+ input.source,
788
+ input.kind,
789
+ input.version ?? null,
790
+ input.skillMd ?? null,
791
+ input.bundle?.sha256 ?? null,
792
+ input.bundle?.byteSize ?? null,
793
+ input.principal.userId,
794
+ now,
795
+ now
796
+ ]);
797
+ if (previousSha && input.bundle && previousSha !== input.bundle.sha256)
798
+ this.collectOrphanBundle(orgId, previousSha);
799
+ return rowToSkill(row);
800
+ })();
801
+ }
802
+ async listSkills(principal) {
803
+ return this.all("SELECT * FROM skills_registry WHERE org_id = ? ORDER BY slug ASC", [principal.orgId]).map(rowToSkill);
804
+ }
805
+ async getSkill(principal, slug) {
806
+ const row = this.get("SELECT * FROM skills_registry WHERE org_id = ? AND slug = ? LIMIT 1", [principal.orgId, slug]);
807
+ return row ? rowToSkill(row) : null;
808
+ }
809
+ async updateSkill(principal, slug, patch) {
810
+ const current = await this.getSkill(principal, slug);
811
+ if (!current)
812
+ return null;
813
+ const next = { ...current, ...patch };
814
+ const row = this.get(`UPDATE skills_registry
815
+ SET display_name = ?, description = ?, category = ?, tags_json = ?, kind = ?, version = ?, skill_md = ?, updated_at = ?
816
+ WHERE org_id = ? AND slug = ?
817
+ RETURNING *`, [
818
+ next.displayName,
819
+ next.description,
820
+ next.category,
821
+ JSON.stringify(next.tags),
822
+ next.kind,
823
+ next.version ?? null,
824
+ next.skillMd ?? null,
825
+ nowIso(),
826
+ principal.orgId,
827
+ slug
828
+ ]);
829
+ return row ? rowToSkill(row) : null;
830
+ }
831
+ async deleteSkill(principal, slug) {
832
+ return this.db.transaction(() => {
833
+ const existing = this.get("SELECT bundle_sha256 FROM skills_registry WHERE org_id = ? AND slug = ?", [principal.orgId, slug]);
834
+ if (!existing)
835
+ return false;
836
+ this.db.run("DELETE FROM skills_registry WHERE org_id = ? AND slug = ?", [principal.orgId, slug]);
837
+ if (typeof existing.bundle_sha256 === "string")
838
+ this.collectOrphanBundle(principal.orgId, existing.bundle_sha256);
839
+ return true;
840
+ })();
841
+ }
842
+ async getSkillBundle(principal, sha256) {
843
+ const row = this.get("SELECT * FROM skills_bundles WHERE org_id = ? AND sha256 = ? LIMIT 1", [principal.orgId, sha256]);
844
+ return row ? rowToSkillBundle(row) : null;
845
+ }
846
+ collectOrphanBundle(orgId, sha256) {
847
+ const referenced = this.get("SELECT 1 AS present FROM skills_registry WHERE org_id = ? AND bundle_sha256 = ? LIMIT 1", [orgId, sha256]);
848
+ if (referenced)
849
+ return;
850
+ this.db.run("DELETE FROM skills_bundles WHERE org_id = ? AND sha256 = ?", [orgId, sha256]);
851
+ }
852
+ get(sql, params) {
853
+ return this.db.query(sql).get(...params) ?? null;
854
+ }
855
+ all(sql, params) {
856
+ return this.db.query(sql).all(...params);
857
+ }
858
+ rollbackQuietly() {
859
+ try {
860
+ this.db.exec("ROLLBACK");
861
+ } catch {}
862
+ }
863
+ }
864
+ function applySqliteMigrations(db, migrationsDir = resolveMigrationsDir("sqlite")) {
865
+ db.exec(`CREATE TABLE IF NOT EXISTS schema_migrations (
866
+ version text PRIMARY KEY,
867
+ applied_at text NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
868
+ )`);
869
+ const files = readdirSync2(migrationsDir).filter((name) => name.endsWith(".sql")).sort();
870
+ if (files.length === 0) {
871
+ throw new Error(`no .sql migrations found in ${migrationsDir}`);
872
+ }
873
+ const appliedNow = [];
874
+ for (const file of files) {
875
+ const version = file.replace(/\.sql$/, "");
876
+ const text = readFileSync2(join4(migrationsDir, file), "utf8");
877
+ const apply = db.transaction(() => {
878
+ const already = db.query("SELECT 1 AS present FROM schema_migrations WHERE version = ? LIMIT 1").get(version);
879
+ if (already)
880
+ return false;
881
+ db.exec(text);
882
+ db.run("INSERT INTO schema_migrations (version) VALUES (?)", [version]);
883
+ return true;
884
+ });
885
+ if (apply.immediate())
886
+ appliedNow.push(version);
887
+ }
59
888
  return appliedNow;
60
889
  }
890
+ function enableWalMode(db, attempts = 50, pauseMs = 10) {
891
+ for (let attempt = 0;attempt < attempts; attempt += 1) {
892
+ if (journalMode(db) === "wal")
893
+ return true;
894
+ try {
895
+ if (String(db.query("PRAGMA journal_mode = WAL").get()?.journal_mode).toLowerCase() === "wal") {
896
+ return true;
897
+ }
898
+ } catch {}
899
+ Bun.sleepSync(pauseMs);
900
+ }
901
+ return false;
902
+ }
903
+ function journalMode(db) {
904
+ try {
905
+ return String(db.query("PRAGMA journal_mode").get()?.journal_mode ?? "").toLowerCase();
906
+ } catch {
907
+ return "";
908
+ }
909
+ }
910
+ function openDatabase(path) {
911
+ try {
912
+ return new Database(path, { create: true, readwrite: true });
913
+ } catch (error) {
914
+ const reason = error instanceof Error ? error.message : String(error);
915
+ throw new Error(`cannot open the skills database at ${path}: ${reason}. ` + "Check that the directory exists and is writable. Set HASNA_SKILLS_DATABASE_URL to choose a " + "different path or a postgres:// URL, or HASNA_SKILLS_DIR to relocate the whole data directory.", { cause: error });
916
+ }
917
+ }
918
+ function parseScopes(value) {
919
+ if (Array.isArray(value))
920
+ return value.map(String);
921
+ if (typeof value !== "string")
922
+ return [];
923
+ try {
924
+ const parsed = JSON.parse(value);
925
+ return Array.isArray(parsed) ? parsed.map(String) : [];
926
+ } catch {
927
+ return [];
928
+ }
929
+ }
930
+
931
+ // src/server/migrate.ts
932
+ async function runMigrations(databaseUrl, migrationsDir) {
933
+ const target = resolveDatabaseTarget(databaseUrl);
934
+ if (!target.durable) {
935
+ throw new Error(`refusing to migrate ${target.label}: it does not outlive this process, so migrating it accomplishes nothing. ` + "Configure a sqlite file path or a postgres:// URL.");
936
+ }
937
+ if (target.kind === "sqlite") {
938
+ const store = new SqliteSkillsStore(target.path, { migrate: false, ...migrationsDir ? { migrationsDir } : {} });
939
+ try {
940
+ const applied = applySqliteMigrations(store.database, migrationsDir ?? resolveMigrationsDir("sqlite"));
941
+ return { backend: "sqlite", applied };
942
+ } finally {
943
+ await store.close();
944
+ }
945
+ }
946
+ return { backend: "postgres", applied: await runPostgresMigrations(target.url, migrationsDir ?? resolveMigrationsDir("postgres")) };
947
+ }
948
+ async function runPostgresMigrations(databaseUrl, migrationsDir) {
949
+ if (!existsSync3(migrationsDir))
950
+ throw new Error(`migrations directory not found: ${migrationsDir}`);
951
+ const bunWithSql = Bun;
952
+ const sql = new bunWithSql.SQL(databaseUrl, { max: 1 });
953
+ try {
954
+ await sql.unsafe("CREATE TABLE IF NOT EXISTS schema_migrations (version text PRIMARY KEY, applied_at timestamptz NOT NULL DEFAULT now())");
955
+ const appliedRows = await sql`SELECT version FROM schema_migrations`;
956
+ const applied = new Set(appliedRows.map((row) => row.version));
957
+ const appliedNow = [];
958
+ const files = readdirSync3(migrationsDir).filter((name) => name.endsWith(".sql")).sort();
959
+ if (files.length === 0)
960
+ throw new Error(`no .sql migrations found in ${migrationsDir}`);
961
+ for (const file of files) {
962
+ const version = file.replace(/\.sql$/, "");
963
+ if (applied.has(version))
964
+ continue;
965
+ const sqlText = readFileSync3(join5(migrationsDir, file), "utf8");
966
+ await sql.unsafe("BEGIN");
967
+ try {
968
+ await sql.unsafe(sqlText);
969
+ await sql`INSERT INTO schema_migrations (version) VALUES (${version})`;
970
+ await sql.unsafe("COMMIT");
971
+ appliedNow.push(version);
972
+ } catch (error) {
973
+ await sql.unsafe("ROLLBACK");
974
+ throw error;
975
+ }
976
+ }
977
+ return appliedNow;
978
+ } finally {
979
+ await sql.close?.();
980
+ }
981
+ }
61
982
  if (import.meta.main) {
62
983
  const config = resolveServerConfig();
63
- if (!config.databaseUrl)
64
- throw new Error("HASNA_SKILLS_DATABASE_URL or DATABASE_URL is required for migrations");
65
- const applied = await runMigrations(config.databaseUrl);
66
- console.log(JSON.stringify({ applied, count: applied.length }, null, 2));
984
+ if (!config.databaseUrl) {
985
+ throw new Error("HASNA_SKILLS_DATABASE_URL or DATABASE_URL is required for migrations. " + "SQLite databases migrate themselves when the server opens them, so there is nothing to do here " + "unless you are naming a target explicitly.");
986
+ }
987
+ const result = await runMigrations(config.databaseUrl);
988
+ console.log(JSON.stringify({ ...result, count: result.applied.length }, null, 2));
67
989
  }
68
990
  export {
69
991
  runMigrations