@hasna/skills 0.1.60 → 0.1.62

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 (1062) 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 +254 -0
  20. package/agent-skills/skill-publish/scripts/capture_registry.js +47 -0
  21. package/agent-skills/skill-publish/scripts/publish_with_git_head.sh +143 -0
  22. package/agent-skills/skill-publish/scripts/test_publish_with_git_head.sh +231 -0
  23. package/bin/index.js +2760 -3690
  24. package/bin/mcp.js +1200 -2714
  25. package/bin/migrate.js +955 -33
  26. package/bin/server.js +2491 -2113
  27. package/bin/worker.js +2213 -275
  28. package/dist/cli/cli.test-utils.d.ts +13 -2
  29. package/dist/cli/commands/publish.d.ts +30 -0
  30. package/dist/cli/commands/registry.d.ts +8 -0
  31. package/dist/index.d.ts +8 -6
  32. package/dist/index.js +1811 -2797
  33. package/dist/lib/agent-sync.d.ts +123 -0
  34. package/dist/lib/api-url.d.ts +34 -0
  35. package/dist/lib/auth-store.d.ts +21 -5
  36. package/dist/lib/blog-article.d.ts +37 -0
  37. package/dist/lib/config.d.ts +56 -2
  38. package/dist/lib/content-scan.d.ts +62 -9
  39. package/dist/lib/discovery.d.ts +10 -10
  40. package/dist/lib/doc-derived-counts.d.ts +56 -0
  41. package/dist/lib/feedback.d.ts +7 -0
  42. package/dist/lib/file-bytes.d.ts +43 -0
  43. package/dist/lib/hosted-skill-set.d.ts +69 -0
  44. package/dist/lib/infra-identifiers.d.ts +144 -0
  45. package/dist/lib/installer.d.ts +20 -6
  46. package/dist/lib/native-storage.d.ts +14 -11
  47. package/dist/lib/packlist.d.ts +13 -0
  48. package/dist/lib/portable-skills-files.d.ts +25 -0
  49. package/dist/lib/portable-skills-types.d.ts +105 -0
  50. package/dist/lib/portable-skills.d.ts +52 -103
  51. package/dist/lib/pull.d.ts +41 -0
  52. package/dist/lib/registry-merge.d.ts +57 -0
  53. package/dist/lib/registry-types.d.ts +1 -14
  54. package/dist/lib/registry.d.ts +6 -3
  55. package/dist/lib/remote-client.d.ts +15 -1
  56. package/dist/lib/remote-registry.d.ts +1 -1
  57. package/dist/lib/remote-run-contract.d.ts +0 -7
  58. package/dist/lib/retired-settings.d.ts +100 -0
  59. package/dist/lib/run-state.d.ts +14 -0
  60. package/dist/lib/skill-aliases.d.ts +0 -12
  61. package/dist/lib/skill-bundle.d.ts +37 -0
  62. package/dist/lib/vendor-host-code-scan.d.ts +66 -0
  63. package/dist/lib/vendor-host-folding.d.ts +40 -0
  64. package/dist/lib/vendor-host-guard.d.ts +47 -0
  65. package/dist/lib/vendor-host-package.d.ts +42 -0
  66. package/dist/lib/vendor-host-policy.d.ts +96 -0
  67. package/dist/lib/vendor-host-url.d.ts +81 -0
  68. package/dist/mcp/mcp-test-client.d.ts +18 -0
  69. package/dist/storage.d.ts +1 -1
  70. package/dist/storage.js +104 -51
  71. package/docs/skill-standard.md +1 -1
  72. package/migrations/postgres/0002_org_scoped_skill_registry.sql +72 -0
  73. package/migrations/sqlite/0001_open_skills_self_hosted.sql +150 -0
  74. package/migrations/sqlite/0002_org_scoped_skill_registry.sql +47 -0
  75. package/package.json +4 -4
  76. package/skills/_common/http-client.ts +17 -2
  77. package/skills/_common/install.sh +2 -2
  78. package/skills/_common/installer.ts +4 -5
  79. package/skills/_common/skill-install.ts +3 -3
  80. package/skills/ad-creative-pack/SKILL.md +28 -18
  81. package/skills/ad-creative-pack/package.json +1 -2
  82. package/skills/analyze-data/SKILL.md +1 -1
  83. package/skills/analyze-data/src/formatters.ts +2 -2
  84. package/skills/api-docs-portal/SKILL.md +62 -24
  85. package/skills/api-docs-portal/package.json +28 -4
  86. package/skills/api-docs-portal/src/index.ts +919 -0
  87. package/skills/audio-extract/SKILL.md +1 -1
  88. package/skills/blog-article/SKILL.md +32 -22
  89. package/skills/blog-article/package.json +1 -2
  90. package/skills/brand-assets/SKILL.md +94 -33
  91. package/skills/brand-assets/package.json +28 -4
  92. package/skills/brand-assets/src/cli.ts +155 -0
  93. package/skills/brand-assets/src/constants.ts +8 -0
  94. package/skills/brand-assets/src/extract.ts +236 -0
  95. package/skills/brand-assets/src/index.ts +668 -0
  96. package/skills/brand-assets/src/types.ts +59 -0
  97. package/skills/brand-kit/SKILL.md +27 -18
  98. package/skills/brand-kit/package.json +1 -2
  99. package/skills/compress-video/SKILL.md +1 -1
  100. package/skills/contract-review-report/SKILL.md +27 -18
  101. package/skills/contract-review-report/package.json +1 -2
  102. package/skills/customer-feedback-report/SKILL.md +27 -19
  103. package/skills/customer-feedback-report/package.json +1 -2
  104. package/skills/email-sequence/SKILL.md +26 -17
  105. package/skills/email-sequence/package.json +1 -2
  106. package/skills/generate-sitemap/src/index.ts +1 -1
  107. package/skills/invoice-reconciliation/SKILL.md +75 -19
  108. package/skills/invoice-reconciliation/package.json +29 -4
  109. package/skills/invoice-reconciliation/src/index.ts +743 -0
  110. package/skills/{convert → invoice-reconciliation}/tsconfig.json +3 -1
  111. package/skills/landing-page-pack/SKILL.md +27 -19
  112. package/skills/landing-page-pack/package.json +1 -2
  113. package/skills/logo-design/SKILL.md +69 -26
  114. package/skills/logo-design/package.json +28 -4
  115. package/skills/logo-design/src/cli.ts +132 -0
  116. package/skills/logo-design/src/constants.ts +5 -0
  117. package/skills/logo-design/src/docs.ts +102 -0
  118. package/skills/logo-design/src/geometry.ts +324 -0
  119. package/skills/logo-design/src/index.ts +212 -0
  120. package/skills/logo-design/src/palette.ts +258 -0
  121. package/skills/logo-design/src/types.ts +50 -0
  122. package/skills/logo-design/tsconfig.json +11 -2
  123. package/skills/market-research-report/SKILL.md +28 -18
  124. package/skills/market-research-report/package.json +2 -3
  125. package/skills/meeting-pack/SKILL.md +26 -17
  126. package/skills/meeting-pack/package.json +1 -2
  127. package/skills/merge-pdfs/src/index.ts +1 -1
  128. package/skills/migration-plan-pack/SKILL.md +30 -19
  129. package/skills/migration-plan-pack/package.json +1 -2
  130. package/skills/one-page-website/SKILL.md +105 -23
  131. package/skills/one-page-website/package.json +27 -4
  132. package/skills/one-page-website/src/design.ts +336 -0
  133. package/skills/one-page-website/src/docs.ts +159 -0
  134. package/skills/one-page-website/src/index.ts +357 -0
  135. package/skills/one-page-website/src/page.ts +340 -0
  136. package/skills/one-page-website/src/styles.ts +508 -0
  137. package/skills/one-page-website/src/types.ts +78 -0
  138. package/skills/one-page-website/tsconfig.json +11 -2
  139. package/skills/pdf-generate/SKILL.md +1 -1
  140. package/skills/pdf-to-dataset/SKILL.md +64 -21
  141. package/skills/pdf-to-dataset/package.json +30 -4
  142. package/skills/pdf-to-dataset/src/index.ts +790 -0
  143. package/skills/{emoji → pdf-to-dataset}/tsconfig.json +3 -4
  144. package/skills/pdf-to-markdown/SKILL.md +55 -23
  145. package/skills/pdf-to-markdown/package.json +28 -4
  146. package/skills/pdf-to-markdown/src/index.ts +694 -0
  147. package/skills/pdf-to-markdown/tsconfig.json +11 -4
  148. package/skills/performance-audit-report/SKILL.md +24 -17
  149. package/skills/performance-audit-report/package.json +1 -2
  150. package/skills/pitch-deck/SKILL.md +27 -19
  151. package/skills/pitch-deck/package.json +1 -2
  152. package/skills/product-mockup/SKILL.md +85 -23
  153. package/skills/product-mockup/package.json +25 -4
  154. package/skills/product-mockup/src/cli.ts +150 -0
  155. package/skills/product-mockup/src/design.ts +151 -0
  156. package/skills/product-mockup/src/docs.ts +134 -0
  157. package/skills/product-mockup/src/index.ts +182 -0
  158. package/skills/product-mockup/src/render.ts +407 -0
  159. package/skills/product-mockup/src/types.ts +66 -0
  160. package/skills/product-mockup/tsconfig.json +11 -2
  161. package/skills/proposal-pack/SKILL.md +27 -19
  162. package/skills/proposal-pack/package.json +2 -3
  163. package/skills/repo-onboarding-report/SKILL.md +26 -16
  164. package/skills/repo-onboarding-report/package.json +1 -2
  165. package/skills/security-audit/src/index.ts +1 -1
  166. package/skills/security-audit-report/SKILL.md +28 -16
  167. package/skills/security-audit-report/package.json +2 -3
  168. package/skills/seo-content-pack/SKILL.md +27 -17
  169. package/skills/seo-content-pack/package.json +1 -2
  170. package/skills/slide-deck-generator/SKILL.md +70 -21
  171. package/skills/slide-deck-generator/package.json +31 -4
  172. package/skills/slide-deck-generator/src/cli.ts +133 -0
  173. package/skills/slide-deck-generator/src/index.ts +148 -0
  174. package/skills/slide-deck-generator/src/model.ts +307 -0
  175. package/skills/slide-deck-generator/src/pptx.ts +143 -0
  176. package/skills/slide-deck-generator/src/render.ts +248 -0
  177. package/skills/slide-deck-generator/src/types.ts +114 -0
  178. package/skills/slide-deck-generator/src/utils.ts +53 -0
  179. package/skills/slide-deck-generator/tsconfig.json +17 -0
  180. package/skills/social-content-calendar/SKILL.md +27 -18
  181. package/skills/social-content-calendar/package.json +1 -2
  182. package/skills/split-pdf/src/index.ts +1 -1
  183. package/skills/test-suite-generator/SKILL.md +26 -16
  184. package/skills/test-suite-generator/package.json +2 -3
  185. package/skills/todos-plan/SKILL.md +339 -170
  186. package/skills/video-highlight-pack/SKILL.md +27 -17
  187. package/skills/video-highlight-pack/package.json +1 -2
  188. package/dist/cli/onboarding.d.ts +0 -13
  189. package/dist/lib/hosted-availability.d.ts +0 -13
  190. package/dist/lib/pricing.d.ts +0 -89
  191. package/skills/academic-journal-matcher/CLAUDE.md +0 -19
  192. package/skills/academic-journal-matcher/package.json +0 -27
  193. package/skills/academic-journal-matcher/src/index.ts +0 -86
  194. package/skills/academic-journal-matcher/tsconfig.json +0 -10
  195. package/skills/action-item-router/CLAUDE.md +0 -19
  196. package/skills/action-item-router/package.json +0 -27
  197. package/skills/action-item-router/src/index.ts +0 -304
  198. package/skills/action-item-router/tsconfig.json +0 -10
  199. package/skills/ad-creative-generator/CLAUDE.md +0 -19
  200. package/skills/ad-creative-generator/package.json +0 -27
  201. package/skills/ad-creative-generator/src/index.ts +0 -419
  202. package/skills/ad-creative-generator/tsconfig.json +0 -10
  203. package/skills/advanced-math/CLAUDE.md +0 -19
  204. package/skills/advanced-math/package.json +0 -29
  205. package/skills/advanced-math/src/calculators.ts +0 -118
  206. package/skills/advanced-math/src/cli.ts +0 -130
  207. package/skills/advanced-math/src/conversion.ts +0 -90
  208. package/skills/advanced-math/src/finance.ts +0 -75
  209. package/skills/advanced-math/src/formatting.ts +0 -95
  210. package/skills/advanced-math/src/index.ts +0 -133
  211. package/skills/advanced-math/src/runtime.ts +0 -49
  212. package/skills/advanced-math/src/symbolic.ts +0 -110
  213. package/skills/advanced-math/src/types.ts +0 -36
  214. package/skills/advanced-math/tsconfig.json +0 -10
  215. package/skills/anomaly-investigator/CLAUDE.md +0 -19
  216. package/skills/anomaly-investigator/package.json +0 -27
  217. package/skills/anomaly-investigator/src/index.ts +0 -311
  218. package/skills/anomaly-investigator/tsconfig.json +0 -10
  219. package/skills/apidocs/.env.example +0 -8
  220. package/skills/apidocs/CLAUDE.md +0 -278
  221. package/skills/apidocs/LICENSE +0 -192
  222. package/skills/apidocs/README.md +0 -196
  223. package/skills/apidocs/api-docs-list.json +0 -186
  224. package/skills/apidocs/package.json +0 -53
  225. package/skills/apidocs/scripts/crawl-all.ts +0 -157
  226. package/skills/apidocs/scripts/publish.ts +0 -210
  227. package/skills/apidocs/src/commands/add.ts +0 -279
  228. package/skills/apidocs/src/commands/endpoints.ts +0 -157
  229. package/skills/apidocs/src/commands/list.ts +0 -51
  230. package/skills/apidocs/src/commands/query.ts +0 -63
  231. package/skills/apidocs/src/commands/remove.ts +0 -39
  232. package/skills/apidocs/src/commands/sync.ts +0 -227
  233. package/skills/apidocs/src/index.ts +0 -3
  234. package/skills/apidocs/src/lib/crawler.ts +0 -427
  235. package/skills/apidocs/src/lib/discovery.ts +0 -244
  236. package/skills/apidocs/src/lib/embeddings.ts +0 -136
  237. package/skills/apidocs/src/lib/endpoint-extractor.ts +0 -359
  238. package/skills/apidocs/src/lib/html-to-md.ts +0 -163
  239. package/skills/apidocs/src/lib/parser.ts +0 -288
  240. package/skills/apidocs/src/lib/search.ts +0 -189
  241. package/skills/apidocs/src/lib/storage.ts +0 -242
  242. package/skills/apidocs/src/lib/vectors-local.ts +0 -220
  243. package/skills/apidocs/src/lib/vectors-s3.ts +0 -255
  244. package/skills/apidocs/src/lib/vectors.ts +0 -97
  245. package/skills/apidocs/src/types/index.ts +0 -297
  246. package/skills/apidocs/src/utils/output.ts +0 -132
  247. package/skills/apidocs/src/utils/paths.ts +0 -126
  248. package/skills/apidocs/tsconfig.json +0 -24
  249. package/skills/audio/SKILL.md +0 -35
  250. package/skills/audio/package.json +0 -11
  251. package/skills/audio-cleanup-lab/CLAUDE.md +0 -3
  252. package/skills/audio-cleanup-lab/SKILL.md +0 -81
  253. package/skills/audio-cleanup-lab/package.json +0 -23
  254. package/skills/audio-cleanup-lab/src/index.ts +0 -274
  255. package/skills/audio-cleanup-lab/tsconfig.json +0 -14
  256. package/skills/audio-transcript-pack/SKILL.md +0 -43
  257. package/skills/audio-transcript-pack/package.json +0 -11
  258. package/skills/banner-ad-suite/CLAUDE.md +0 -19
  259. package/skills/banner-ad-suite/package.json +0 -27
  260. package/skills/banner-ad-suite/src/index.ts +0 -331
  261. package/skills/banner-ad-suite/tsconfig.json +0 -10
  262. package/skills/benchmark-finder/CLAUDE.md +0 -19
  263. package/skills/benchmark-finder/package.json +0 -27
  264. package/skills/benchmark-finder/src/index.ts +0 -294
  265. package/skills/benchmark-finder/tsconfig.json +0 -10
  266. package/skills/blog-topic-cluster/CLAUDE.md +0 -19
  267. package/skills/blog-topic-cluster/package.json +0 -27
  268. package/skills/blog-topic-cluster/src/index.ts +0 -274
  269. package/skills/blog-topic-cluster/tsconfig.json +0 -10
  270. package/skills/brand-photo-shoot/SKILL.md +0 -28
  271. package/skills/brand-photo-shoot/package.json +0 -11
  272. package/skills/brand-style-guide/CLAUDE.md +0 -20
  273. package/skills/brand-style-guide/SKILL.md +0 -13
  274. package/skills/brand-style-guide/package.json +0 -26
  275. package/skills/brand-style-guide/src/index.ts +0 -288
  276. package/skills/brand-style-guide/tsconfig.json +0 -22
  277. package/skills/brand-voice-audit/CLAUDE.md +0 -19
  278. package/skills/brand-voice-audit/package.json +0 -27
  279. package/skills/brand-voice-audit/src/index.ts +0 -302
  280. package/skills/brand-voice-audit/tsconfig.json +0 -10
  281. package/skills/browse/LICENSE +0 -192
  282. package/skills/browse/README.md +0 -25
  283. package/skills/browse/SKILL.md +0 -35
  284. package/skills/browse/package.json +0 -11
  285. package/skills/browse/tsconfig.json +0 -22
  286. package/skills/budget-variance-analyzer/CLAUDE.md +0 -16
  287. package/skills/budget-variance-analyzer/SKILL.md +0 -83
  288. package/skills/budget-variance-analyzer/package.json +0 -24
  289. package/skills/budget-variance-analyzer/src/index.ts +0 -298
  290. package/skills/budget-variance-analyzer/tsconfig.json +0 -21
  291. package/skills/calendar-events/CLAUDE.md +0 -19
  292. package/skills/calendar-events/package.json +0 -27
  293. package/skills/calendar-events/src/ai-parser.ts +0 -103
  294. package/skills/calendar-events/src/api.ts +0 -157
  295. package/skills/calendar-events/src/auth.ts +0 -22
  296. package/skills/calendar-events/src/config.ts +0 -6
  297. package/skills/calendar-events/src/format.ts +0 -96
  298. package/skills/calendar-events/src/help.ts +0 -54
  299. package/skills/calendar-events/src/index.ts +0 -415
  300. package/skills/calendar-events/src/logger.ts +0 -34
  301. package/skills/calendar-events/src/types.ts +0 -67
  302. package/skills/calendar-events/tsconfig.json +0 -10
  303. package/skills/campaign-metric-brief/CLAUDE.md +0 -19
  304. package/skills/campaign-metric-brief/package.json +0 -27
  305. package/skills/campaign-metric-brief/src/index.ts +0 -307
  306. package/skills/campaign-metric-brief/tsconfig.json +0 -10
  307. package/skills/campaign-moodboard/CLAUDE.md +0 -19
  308. package/skills/campaign-moodboard/package.json +0 -27
  309. package/skills/campaign-moodboard/src/index.ts +0 -288
  310. package/skills/campaign-moodboard/tsconfig.json +0 -10
  311. package/skills/caption-style-stylist/CLAUDE.md +0 -19
  312. package/skills/caption-style-stylist/package.json +0 -27
  313. package/skills/caption-style-stylist/src/index.ts +0 -275
  314. package/skills/caption-style-stylist/tsconfig.json +0 -10
  315. package/skills/chemistry-calculator/CLAUDE.md +0 -19
  316. package/skills/chemistry-calculator/package.json +0 -27
  317. package/skills/chemistry-calculator/src/index.ts +0 -110
  318. package/skills/chemistry-calculator/tsconfig.json +0 -10
  319. package/skills/churn-risk-notifier/CLAUDE.md +0 -19
  320. package/skills/churn-risk-notifier/package.json +0 -27
  321. package/skills/churn-risk-notifier/src/index.ts +0 -308
  322. package/skills/churn-risk-notifier/tsconfig.json +0 -10
  323. package/skills/citation-formatter/CLAUDE.md +0 -19
  324. package/skills/citation-formatter/package.json +0 -27
  325. package/skills/citation-formatter/src/index.ts +0 -83
  326. package/skills/citation-formatter/tsconfig.json +0 -10
  327. package/skills/classroom-newsletter-kit/CLAUDE.md +0 -19
  328. package/skills/classroom-newsletter-kit/package.json +0 -27
  329. package/skills/classroom-newsletter-kit/src/index.ts +0 -293
  330. package/skills/classroom-newsletter-kit/tsconfig.json +0 -10
  331. package/skills/color-palette-harmonizer/CLAUDE.md +0 -19
  332. package/skills/color-palette-harmonizer/package.json +0 -27
  333. package/skills/color-palette-harmonizer/src/index.ts +0 -278
  334. package/skills/color-palette-harmonizer/tsconfig.json +0 -10
  335. package/skills/colorextract/SKILL.md +0 -35
  336. package/skills/colorextract/bun.lock +0 -102
  337. package/skills/colorextract/package.json +0 -25
  338. package/skills/colorextract/src/index.ts +0 -405
  339. package/skills/competitor-ad-analyzer/CLAUDE.md +0 -19
  340. package/skills/competitor-ad-analyzer/package.json +0 -27
  341. package/skills/competitor-ad-analyzer/src/index.ts +0 -350
  342. package/skills/competitor-ad-analyzer/tsconfig.json +0 -10
  343. package/skills/compliance-copy-check/CLAUDE.md +0 -19
  344. package/skills/compliance-copy-check/package.json +0 -27
  345. package/skills/compliance-copy-check/src/index.ts +0 -289
  346. package/skills/compliance-copy-check/tsconfig.json +0 -10
  347. package/skills/compliance-report-pack/CLAUDE.md +0 -19
  348. package/skills/compliance-report-pack/package.json +0 -27
  349. package/skills/compliance-report-pack/src/index.ts +0 -301
  350. package/skills/compliance-report-pack/tsconfig.json +0 -10
  351. package/skills/consolelog/.env.example +0 -19
  352. package/skills/consolelog/CLAUDE.md +0 -157
  353. package/skills/consolelog/LICENSE +0 -192
  354. package/skills/consolelog/README.md +0 -239
  355. package/skills/consolelog/data/.gitkeep +0 -0
  356. package/skills/consolelog/exports/products-2025-12-14T13-50-53-041Z.csv +0 -16
  357. package/skills/consolelog/exports/products-2025-12-14T13-50-53-041Z.json +0 -227
  358. package/skills/consolelog/package.json +0 -40
  359. package/skills/consolelog/scripts/migrate.ts +0 -26
  360. package/skills/consolelog/scripts/seed.ts +0 -48
  361. package/skills/consolelog/src/db/index.ts +0 -44
  362. package/skills/consolelog/src/db/queries.ts +0 -348
  363. package/skills/consolelog/src/db/schema.ts +0 -93
  364. package/skills/consolelog/src/index.ts +0 -3
  365. package/skills/consolelog/src/lib/config.ts +0 -110
  366. package/skills/consolelog/src/lib/installer.ts +0 -294
  367. package/skills/consolelog/src/lib/monitor.ts +0 -194
  368. package/skills/consolelog/src/lib/types.ts +0 -189
  369. package/skills/consolelog/src/lib/watcher.ts +0 -207
  370. package/skills/consolelog/tests/api.test.ts +0 -154
  371. package/skills/consolelog/tests/config.test.ts +0 -192
  372. package/skills/consolelog/tests/db.test.ts +0 -447
  373. package/skills/consolelog/tests/installer.test.ts +0 -155
  374. package/skills/consolelog/tsconfig.json +0 -24
  375. package/skills/contract-plainlanguage/CLAUDE.md +0 -19
  376. package/skills/contract-plainlanguage/package.json +0 -27
  377. package/skills/contract-plainlanguage/src/index.ts +0 -294
  378. package/skills/contract-plainlanguage/tsconfig.json +0 -10
  379. package/skills/convert/.env.example +0 -7
  380. package/skills/convert/LICENSE +0 -192
  381. package/skills/convert/README.md +0 -250
  382. package/skills/convert/SKILL.md +0 -106
  383. package/skills/convert/package.json +0 -37
  384. package/skills/convert/src/converters/ai.ts +0 -375
  385. package/skills/convert/src/converters/data.ts +0 -339
  386. package/skills/convert/src/converters/document.ts +0 -189
  387. package/skills/convert/src/converters/image.ts +0 -227
  388. package/skills/convert/src/converters/index.ts +0 -9
  389. package/skills/convert/src/converters/pdf.ts +0 -255
  390. package/skills/convert/src/index-local.ts +0 -568
  391. package/skills/convert/src/index.ts +0 -4
  392. package/skills/convert/src/types.ts +0 -192
  393. package/skills/copytone-translator/CLAUDE.md +0 -19
  394. package/skills/copytone-translator/package.json +0 -27
  395. package/skills/copytone-translator/src/index.ts +0 -295
  396. package/skills/copytone-translator/tsconfig.json +0 -10
  397. package/skills/create-ebook/CLAUDE.md +0 -19
  398. package/skills/create-ebook/package.json +0 -27
  399. package/skills/create-ebook/src/index.ts +0 -637
  400. package/skills/create-ebook/tsconfig.json +0 -10
  401. package/skills/crm-note-enhancer/CLAUDE.md +0 -19
  402. package/skills/crm-note-enhancer/package.json +0 -27
  403. package/skills/crm-note-enhancer/src/index.ts +0 -317
  404. package/skills/crm-note-enhancer/tsconfig.json +0 -10
  405. package/skills/customer-journey-mapper/CLAUDE.md +0 -19
  406. package/skills/customer-journey-mapper/package.json +0 -27
  407. package/skills/customer-journey-mapper/src/index.ts +0 -312
  408. package/skills/customer-journey-mapper/tsconfig.json +0 -10
  409. package/skills/dashboard-narrator/CLAUDE.md +0 -19
  410. package/skills/dashboard-narrator/package.json +0 -27
  411. package/skills/dashboard-narrator/src/index.ts +0 -307
  412. package/skills/dashboard-narrator/tsconfig.json +0 -10
  413. package/skills/dataset-health-check/CLAUDE.md +0 -19
  414. package/skills/dataset-health-check/package.json +0 -27
  415. package/skills/dataset-health-check/src/index.ts +0 -323
  416. package/skills/dataset-health-check/tsconfig.json +0 -10
  417. package/skills/decision-journal/CLAUDE.md +0 -19
  418. package/skills/decision-journal/package.json +0 -27
  419. package/skills/decision-journal/src/index.ts +0 -313
  420. package/skills/decision-journal/tsconfig.json +0 -10
  421. package/skills/deepresearch/CLAUDE.md +0 -11
  422. package/skills/deepresearch/README.md +0 -26
  423. package/skills/deepresearch/SKILL.md +0 -41
  424. package/skills/deepresearch/package.json +0 -11
  425. package/skills/deepresearch/tsconfig.json +0 -29
  426. package/skills/delegation-brief-writer/CLAUDE.md +0 -19
  427. package/skills/delegation-brief-writer/package.json +0 -27
  428. package/skills/delegation-brief-writer/src/index.ts +0 -314
  429. package/skills/delegation-brief-writer/tsconfig.json +0 -10
  430. package/skills/deploy/LICENSE +0 -192
  431. package/skills/deploy/README.md +0 -382
  432. package/skills/deploy/SKILL.md +0 -138
  433. package/skills/deploy/package.json +0 -18
  434. package/skills/deploy/src/deployer.ts +0 -256
  435. package/skills/deploy/src/health.ts +0 -103
  436. package/skills/deploy/src/hosts.ts +0 -45
  437. package/skills/deploy/src/http-client.ts +0 -128
  438. package/skills/deploy/src/index-local.ts +0 -366
  439. package/skills/deploy/src/index.ts +0 -4
  440. package/skills/deploy/src/types.ts +0 -56
  441. package/skills/deploy/tsconfig.json +0 -18
  442. package/skills/destination-briefing/CLAUDE.md +0 -19
  443. package/skills/destination-briefing/package.json +0 -27
  444. package/skills/destination-briefing/src/index.ts +0 -291
  445. package/skills/destination-briefing/tsconfig.json +0 -10
  446. package/skills/doc-generate/CLAUDE.md +0 -19
  447. package/skills/doc-generate/SKILL.md +0 -295
  448. package/skills/doc-generate/package.json +0 -23
  449. package/skills/doc-generate/src/ai.ts +0 -50
  450. package/skills/doc-generate/src/cli.ts +0 -203
  451. package/skills/doc-generate/src/dependencies.ts +0 -44
  452. package/skills/doc-generate/src/document-builder.ts +0 -299
  453. package/skills/doc-generate/src/index.ts +0 -90
  454. package/skills/doc-generate/src/markdown-parser.ts +0 -125
  455. package/skills/doc-generate/src/types.ts +0 -68
  456. package/skills/doc-generate/tsconfig.json +0 -16
  457. package/skills/domainsearch/.env.example +0 -7
  458. package/skills/domainsearch/LICENSE +0 -192
  459. package/skills/domainsearch/SKILL.md +0 -41
  460. package/skills/domainsearch/package.json +0 -33
  461. package/skills/domainsearch/src/index.ts +0 -3
  462. package/skills/domainsearch/src/lib/api-client.ts +0 -181
  463. package/skills/domainsearch/src/lib/config.ts +0 -72
  464. package/skills/domainsearch/src/lib/installer.ts +0 -164
  465. package/skills/domainsearch/tsconfig.json +0 -22
  466. package/skills/educational-resource-finder/CLAUDE.md +0 -19
  467. package/skills/educational-resource-finder/package.json +0 -27
  468. package/skills/educational-resource-finder/src/index.ts +0 -289
  469. package/skills/educational-resource-finder/tsconfig.json +0 -10
  470. package/skills/email-campaign/CLAUDE.md +0 -19
  471. package/skills/email-campaign/package.json +0 -27
  472. package/skills/email-campaign/src/index.ts +0 -339
  473. package/skills/email-campaign/tsconfig.json +0 -10
  474. package/skills/emoji/.env.example +0 -7
  475. package/skills/emoji/QUICKSTART.md +0 -52
  476. package/skills/emoji/README.md +0 -175
  477. package/skills/emoji/SKILL.md +0 -63
  478. package/skills/emoji/package.json +0 -31
  479. package/skills/emoji/src/image-processor.ts +0 -143
  480. package/skills/emoji/src/index.ts +0 -282
  481. package/skills/emoji/src/prompt-generator.ts +0 -181
  482. package/skills/emoji/src/providers/gemini.ts +0 -58
  483. package/skills/emoji/src/providers/openai.ts +0 -55
  484. package/skills/emoji/src/types.ts +0 -72
  485. package/skills/exam-readiness-check/CLAUDE.md +0 -19
  486. package/skills/exam-readiness-check/package.json +0 -27
  487. package/skills/exam-readiness-check/src/index.ts +0 -289
  488. package/skills/exam-readiness-check/tsconfig.json +0 -10
  489. package/skills/excel/CLAUDE.md +0 -19
  490. package/skills/excel/SKILL.md +0 -38
  491. package/skills/excel/package.json +0 -30
  492. package/skills/excel/src/index.ts +0 -644
  493. package/skills/excel/tsconfig.json +0 -10
  494. package/skills/extract/.env.example +0 -3
  495. package/skills/extract/LICENSE +0 -192
  496. package/skills/extract/README.md +0 -61
  497. package/skills/extract/SKILL.md +0 -91
  498. package/skills/extract/package.json +0 -35
  499. package/skills/extract/src/extractors/image.ts +0 -42
  500. package/skills/extract/src/extractors/pdf.ts +0 -96
  501. package/skills/extract/src/index-local.ts +0 -258
  502. package/skills/extract/src/index.ts +0 -4
  503. package/skills/extract/src/providers/openai.ts +0 -222
  504. package/skills/extract/src/types.ts +0 -61
  505. package/skills/extract/tsconfig.json +0 -19
  506. package/skills/extract-invoice/CLAUDE.md +0 -19
  507. package/skills/extract-invoice/package.json +0 -27
  508. package/skills/extract-invoice/src/cli.ts +0 -97
  509. package/skills/extract-invoice/src/extractor.ts +0 -170
  510. package/skills/extract-invoice/src/file-utils.ts +0 -46
  511. package/skills/extract-invoice/src/formatters.ts +0 -144
  512. package/skills/extract-invoice/src/index.ts +0 -129
  513. package/skills/extract-invoice/src/runtime.ts +0 -46
  514. package/skills/extract-invoice/src/types.ts +0 -88
  515. package/skills/extract-invoice/tsconfig.json +0 -10
  516. package/skills/family-activity-curator/CLAUDE.md +0 -19
  517. package/skills/family-activity-curator/package.json +0 -27
  518. package/skills/family-activity-curator/src/index.ts +0 -293
  519. package/skills/family-activity-curator/tsconfig.json +0 -10
  520. package/skills/faq-packager/CLAUDE.md +0 -19
  521. package/skills/faq-packager/package.json +0 -27
  522. package/skills/faq-packager/src/index.ts +0 -292
  523. package/skills/faq-packager/tsconfig.json +0 -10
  524. package/skills/feedback-survey-designer/CLAUDE.md +0 -19
  525. package/skills/feedback-survey-designer/package.json +0 -27
  526. package/skills/feedback-survey-designer/src/index.ts +0 -299
  527. package/skills/feedback-survey-designer/tsconfig.json +0 -10
  528. package/skills/field-trip-planner/CLAUDE.md +0 -19
  529. package/skills/field-trip-planner/package.json +0 -27
  530. package/skills/field-trip-planner/src/index.ts +0 -289
  531. package/skills/field-trip-planner/tsconfig.json +0 -10
  532. package/skills/forecast-scenario-lab/CLAUDE.md +0 -19
  533. package/skills/forecast-scenario-lab/package.json +0 -27
  534. package/skills/forecast-scenario-lab/src/index.ts +0 -314
  535. package/skills/forecast-scenario-lab/tsconfig.json +0 -10
  536. package/skills/generate-book-cover/CLAUDE.md +0 -19
  537. package/skills/generate-book-cover/package.json +0 -11
  538. package/skills/generate-book-cover/tsconfig.json +0 -10
  539. package/skills/generate-diagram/CLAUDE.md +0 -19
  540. package/skills/generate-diagram/package.json +0 -27
  541. package/skills/generate-diagram/src/index.ts +0 -514
  542. package/skills/generate-diagram/tsconfig.json +0 -10
  543. package/skills/generate-documentation/CLAUDE.md +0 -19
  544. package/skills/generate-documentation/package.json +0 -27
  545. package/skills/generate-documentation/src/ai.ts +0 -131
  546. package/skills/generate-documentation/src/cli.ts +0 -71
  547. package/skills/generate-documentation/src/code-parser.ts +0 -300
  548. package/skills/generate-documentation/src/file-processing.ts +0 -182
  549. package/skills/generate-documentation/src/index.ts +0 -65
  550. package/skills/generate-documentation/src/runtime.ts +0 -35
  551. package/skills/generate-documentation/src/types.ts +0 -30
  552. package/skills/generate-documentation/tsconfig.json +0 -10
  553. package/skills/generate-mock-data/CLAUDE.md +0 -19
  554. package/skills/generate-mock-data/package.json +0 -29
  555. package/skills/generate-mock-data/src/ai.ts +0 -102
  556. package/skills/generate-mock-data/src/formatters.ts +0 -84
  557. package/skills/generate-mock-data/src/generator.ts +0 -377
  558. package/skills/generate-mock-data/src/index.ts +0 -201
  559. package/skills/generate-mock-data/src/logger.ts +0 -37
  560. package/skills/generate-mock-data/src/presets.ts +0 -110
  561. package/skills/generate-mock-data/src/types.ts +0 -21
  562. package/skills/generate-mock-data/tsconfig.json +0 -10
  563. package/skills/generate-pr-description/CLAUDE.md +0 -19
  564. package/skills/generate-pr-description/package.json +0 -27
  565. package/skills/generate-pr-description/src/ai.ts +0 -144
  566. package/skills/generate-pr-description/src/cli.ts +0 -80
  567. package/skills/generate-pr-description/src/clipboard.ts +0 -30
  568. package/skills/generate-pr-description/src/formatters.ts +0 -231
  569. package/skills/generate-pr-description/src/git.ts +0 -153
  570. package/skills/generate-pr-description/src/index.ts +0 -114
  571. package/skills/generate-pr-description/src/types.ts +0 -49
  572. package/skills/generate-pr-description/tsconfig.json +0 -10
  573. package/skills/generate-presentation/CLAUDE.md +0 -19
  574. package/skills/generate-presentation/package.json +0 -27
  575. package/skills/generate-presentation/src/ai-clients.ts +0 -61
  576. package/skills/generate-presentation/src/cli.ts +0 -126
  577. package/skills/generate-presentation/src/index.ts +0 -44
  578. package/skills/generate-presentation/src/logger.ts +0 -67
  579. package/skills/generate-presentation/src/presentation-generator.ts +0 -425
  580. package/skills/generate-presentation/src/runtime.ts +0 -6
  581. package/skills/generate-presentation/src/security.ts +0 -12
  582. package/skills/generate-presentation/src/types.ts +0 -28
  583. package/skills/generate-presentation/tsconfig.json +0 -10
  584. package/skills/generate-regex/CLAUDE.md +0 -19
  585. package/skills/generate-regex/package.json +0 -29
  586. package/skills/generate-regex/src/index.ts +0 -669
  587. package/skills/generate-regex/tsconfig.json +0 -10
  588. package/skills/generate-social-posts/CLAUDE.md +0 -19
  589. package/skills/generate-social-posts/package.json +0 -27
  590. package/skills/generate-social-posts/src/ai.ts +0 -88
  591. package/skills/generate-social-posts/src/cli.ts +0 -118
  592. package/skills/generate-social-posts/src/exporters.ts +0 -126
  593. package/skills/generate-social-posts/src/generator.ts +0 -130
  594. package/skills/generate-social-posts/src/index.ts +0 -78
  595. package/skills/generate-social-posts/src/platforms.ts +0 -39
  596. package/skills/generate-social-posts/src/runtime.ts +0 -34
  597. package/skills/generate-social-posts/src/source.ts +0 -116
  598. package/skills/generate-social-posts/src/types.ts +0 -58
  599. package/skills/generate-social-posts/tsconfig.json +0 -10
  600. package/skills/generate-sql/CLAUDE.md +0 -19
  601. package/skills/generate-sql/package.json +0 -27
  602. package/skills/generate-sql/src/index.ts +0 -636
  603. package/skills/generate-sql/tsconfig.json +0 -10
  604. package/skills/github-manager/CLAUDE.md +0 -19
  605. package/skills/github-manager/package.json +0 -29
  606. package/skills/github-manager/src/index.ts +0 -101
  607. package/skills/github-manager/tsconfig.json +0 -10
  608. package/skills/gmail/CLAUDE.md +0 -19
  609. package/skills/gmail/package.json +0 -27
  610. package/skills/gmail/src/index.ts +0 -410
  611. package/skills/gmail/tsconfig.json +0 -10
  612. package/skills/goal-quarterly-roadmap/CLAUDE.md +0 -19
  613. package/skills/goal-quarterly-roadmap/package.json +0 -27
  614. package/skills/goal-quarterly-roadmap/src/index.ts +0 -305
  615. package/skills/goal-quarterly-roadmap/tsconfig.json +0 -10
  616. package/skills/grant-application-drafter/CLAUDE.md +0 -19
  617. package/skills/grant-application-drafter/package.json +0 -27
  618. package/skills/grant-application-drafter/src/index.ts +0 -309
  619. package/skills/grant-application-drafter/tsconfig.json +0 -10
  620. package/skills/grocery-basket-optimizer/CLAUDE.md +0 -19
  621. package/skills/grocery-basket-optimizer/package.json +0 -27
  622. package/skills/grocery-basket-optimizer/src/index.ts +0 -304
  623. package/skills/grocery-basket-optimizer/tsconfig.json +0 -10
  624. package/skills/guest-communication-suite/CLAUDE.md +0 -19
  625. package/skills/guest-communication-suite/package.json +0 -27
  626. package/skills/guest-communication-suite/src/index.ts +0 -312
  627. package/skills/guest-communication-suite/tsconfig.json +0 -10
  628. package/skills/habit-reflection-digest/CLAUDE.md +0 -19
  629. package/skills/habit-reflection-digest/package.json +0 -27
  630. package/skills/habit-reflection-digest/src/index.ts +0 -308
  631. package/skills/habit-reflection-digest/tsconfig.json +0 -10
  632. package/skills/highlight-reel-generator/CLAUDE.md +0 -19
  633. package/skills/highlight-reel-generator/package.json +0 -27
  634. package/skills/highlight-reel-generator/src/index.ts +0 -286
  635. package/skills/highlight-reel-generator/tsconfig.json +0 -10
  636. package/skills/homework-feedback-coach/CLAUDE.md +0 -19
  637. package/skills/homework-feedback-coach/package.json +0 -27
  638. package/skills/homework-feedback-coach/src/index.ts +0 -316
  639. package/skills/homework-feedback-coach/tsconfig.json +0 -10
  640. package/skills/household-maintenance-mgr/CLAUDE.md +0 -19
  641. package/skills/household-maintenance-mgr/package.json +0 -27
  642. package/skills/household-maintenance-mgr/src/index.ts +0 -293
  643. package/skills/household-maintenance-mgr/tsconfig.json +0 -10
  644. package/skills/icon-pack/README.md +0 -28
  645. package/skills/icon-pack/SKILL.md +0 -23
  646. package/skills/icon-pack/package.json +0 -11
  647. package/skills/icon-pack/tsconfig.json +0 -20
  648. package/skills/image/LICENSE +0 -192
  649. package/skills/image/README.md +0 -25
  650. package/skills/image/SKILL.md +0 -49
  651. package/skills/image/examples/aurora-examples.sh +0 -33
  652. package/skills/image/examples/google-examples.sh +0 -37
  653. package/skills/image/examples/openai-examples.sh +0 -35
  654. package/skills/image/package.json +0 -11
  655. package/skills/image/tsconfig.json +0 -19
  656. package/skills/implementation-agent/CLAUDE.md +0 -19
  657. package/skills/implementation-agent/package.json +0 -29
  658. package/skills/implementation-agent/src/ai-generation.ts +0 -225
  659. package/skills/implementation-agent/src/index.ts +0 -608
  660. package/skills/implementation-agent/src/minimist.d.ts +0 -15
  661. package/skills/implementation-agent/src/templates.ts +0 -686
  662. package/skills/implementation-agent/src/types.ts +0 -53
  663. package/skills/implementation-agent/tsconfig.json +0 -10
  664. package/skills/inbox-priority-planner/CLAUDE.md +0 -19
  665. package/skills/inbox-priority-planner/package.json +0 -27
  666. package/skills/inbox-priority-planner/src/index.ts +0 -309
  667. package/skills/inbox-priority-planner/tsconfig.json +0 -10
  668. package/skills/invoice-dispute-helper/CLAUDE.md +0 -19
  669. package/skills/invoice-dispute-helper/package.json +0 -27
  670. package/skills/invoice-dispute-helper/src/index.ts +0 -304
  671. package/skills/invoice-dispute-helper/tsconfig.json +0 -10
  672. package/skills/itinerary-architect/CLAUDE.md +0 -19
  673. package/skills/itinerary-architect/package.json +0 -27
  674. package/skills/itinerary-architect/src/index.ts +0 -313
  675. package/skills/itinerary-architect/tsconfig.json +0 -10
  676. package/skills/kpi-digest-generator/CLAUDE.md +0 -19
  677. package/skills/kpi-digest-generator/package.json +0 -27
  678. package/skills/kpi-digest-generator/src/index.ts +0 -318
  679. package/skills/kpi-digest-generator/tsconfig.json +0 -10
  680. package/skills/lab-notebook-formatter/CLAUDE.md +0 -19
  681. package/skills/lab-notebook-formatter/package.json +0 -27
  682. package/skills/lab-notebook-formatter/src/index.ts +0 -88
  683. package/skills/lab-notebook-formatter/tsconfig.json +0 -10
  684. package/skills/landing-page-copy/CLAUDE.md +0 -19
  685. package/skills/landing-page-copy/package.json +0 -27
  686. package/skills/landing-page-copy/src/index.ts +0 -400
  687. package/skills/landing-page-copy/tsconfig.json +0 -10
  688. package/skills/learning-style-profiler/CLAUDE.md +0 -19
  689. package/skills/learning-style-profiler/package.json +0 -27
  690. package/skills/learning-style-profiler/src/index.ts +0 -291
  691. package/skills/learning-style-profiler/tsconfig.json +0 -10
  692. package/skills/lesson-plan-customizer/CLAUDE.md +0 -19
  693. package/skills/lesson-plan-customizer/package.json +0 -27
  694. package/skills/lesson-plan-customizer/src/index.ts +0 -303
  695. package/skills/lesson-plan-customizer/tsconfig.json +0 -10
  696. package/skills/livestream-runofshow/CLAUDE.md +0 -19
  697. package/skills/livestream-runofshow/package.json +0 -27
  698. package/skills/livestream-runofshow/src/index.ts +0 -299
  699. package/skills/livestream-runofshow/tsconfig.json +0 -10
  700. package/skills/longform-structurer/CLAUDE.md +0 -19
  701. package/skills/longform-structurer/package.json +0 -27
  702. package/skills/longform-structurer/src/index.ts +0 -293
  703. package/skills/longform-structurer/tsconfig.json +0 -10
  704. package/skills/managehook/.env.example +0 -16
  705. package/skills/managehook/CLAUDE.md +0 -48
  706. package/skills/managehook/README.md +0 -210
  707. package/skills/managehook/package.json +0 -24
  708. package/skills/managehook/scripts/migrate.ts +0 -57
  709. package/skills/managehook/scripts/seed.ts +0 -58
  710. package/skills/managehook/src/db/index.ts +0 -37
  711. package/skills/managehook/src/index.ts +0 -3
  712. package/skills/managehook/src/lib/api-client.ts +0 -108
  713. package/skills/managehook/src/lib/config.ts +0 -34
  714. package/skills/managehook/src/lib/installer.ts +0 -140
  715. package/skills/managehook/src/lib/service-dir.ts +0 -119
  716. package/skills/managehook/tsconfig.json +0 -29
  717. package/skills/manageskill/.env.example +0 -16
  718. package/skills/manageskill/CLAUDE.md +0 -48
  719. package/skills/manageskill/README.md +0 -210
  720. package/skills/manageskill/package.json +0 -24
  721. package/skills/manageskill/scripts/migrate.ts +0 -57
  722. package/skills/manageskill/scripts/seed.ts +0 -58
  723. package/skills/manageskill/src/db/index.ts +0 -37
  724. package/skills/manageskill/src/index.ts +0 -3
  725. package/skills/manageskill/src/lib/api-client.ts +0 -108
  726. package/skills/manageskill/src/lib/config.ts +0 -34
  727. package/skills/manageskill/src/lib/installer.ts +0 -140
  728. package/skills/manageskill/src/lib/service-dir.ts +0 -119
  729. package/skills/manageskill/tsconfig.json +0 -29
  730. package/skills/mcp-builder/CLAUDE.md +0 -19
  731. package/skills/mcp-builder/package.json +0 -30
  732. package/skills/mcp-builder/src/ai-descriptions.ts +0 -37
  733. package/skills/mcp-builder/src/generators.ts +0 -513
  734. package/skills/mcp-builder/src/index.ts +0 -62
  735. package/skills/mcp-builder/src/minimist.d.ts +0 -15
  736. package/skills/mcp-builder/src/naming.ts +0 -12
  737. package/skills/mcp-builder/src/options.ts +0 -170
  738. package/skills/mcp-builder/src/templates.ts +0 -149
  739. package/skills/mcp-builder/src/types.ts +0 -42
  740. package/skills/mcp-builder/tsconfig.json +0 -10
  741. package/skills/meal-plan-designer/CLAUDE.md +0 -19
  742. package/skills/meal-plan-designer/package.json +0 -27
  743. package/skills/meal-plan-designer/src/index.ts +0 -301
  744. package/skills/meal-plan-designer/tsconfig.json +0 -10
  745. package/skills/meeting-insight-summarizer/CLAUDE.md +0 -19
  746. package/skills/meeting-insight-summarizer/package.json +0 -27
  747. package/skills/meeting-insight-summarizer/src/index.ts +0 -316
  748. package/skills/meeting-insight-summarizer/tsconfig.json +0 -10
  749. package/skills/microcopy-generator/CLAUDE.md +0 -19
  750. package/skills/microcopy-generator/package.json +0 -27
  751. package/skills/microcopy-generator/src/index.ts +0 -303
  752. package/skills/microcopy-generator/tsconfig.json +0 -10
  753. package/skills/mindfulness-prompt-cache/CLAUDE.md +0 -19
  754. package/skills/mindfulness-prompt-cache/package.json +0 -27
  755. package/skills/mindfulness-prompt-cache/src/index.ts +0 -290
  756. package/skills/mindfulness-prompt-cache/tsconfig.json +0 -10
  757. package/skills/music/SKILL.md +0 -33
  758. package/skills/music/package.json +0 -11
  759. package/skills/music-album/SKILL.md +0 -37
  760. package/skills/music-album/package.json +0 -11
  761. package/skills/notion-manager/CLAUDE.md +0 -19
  762. package/skills/notion-manager/package.json +0 -29
  763. package/skills/notion-manager/src/index.ts +0 -105
  764. package/skills/notion-manager/tsconfig.json +0 -10
  765. package/skills/npmpublish/CLAUDE.md +0 -30
  766. package/skills/npmpublish/README.md +0 -83
  767. package/skills/npmpublish/SKILL.md +0 -70
  768. package/skills/npmpublish/package.json +0 -41
  769. package/skills/npmpublish/src/index.ts +0 -192
  770. package/skills/npmpublish/tsconfig.json +0 -18
  771. package/skills/onboarding-sequence-builder/CLAUDE.md +0 -19
  772. package/skills/onboarding-sequence-builder/package.json +0 -27
  773. package/skills/onboarding-sequence-builder/src/index.ts +0 -321
  774. package/skills/onboarding-sequence-builder/tsconfig.json +0 -10
  775. package/skills/onsite-ops-checklist/CLAUDE.md +0 -19
  776. package/skills/onsite-ops-checklist/package.json +0 -27
  777. package/skills/onsite-ops-checklist/src/index.ts +0 -307
  778. package/skills/onsite-ops-checklist/tsconfig.json +0 -10
  779. package/skills/outreach-cadence-designer/CLAUDE.md +0 -19
  780. package/skills/outreach-cadence-designer/package.json +0 -27
  781. package/skills/outreach-cadence-designer/src/index.ts +0 -330
  782. package/skills/outreach-cadence-designer/tsconfig.json +0 -10
  783. package/skills/packaging-concept-studio/CLAUDE.md +0 -19
  784. package/skills/packaging-concept-studio/package.json +0 -27
  785. package/skills/packaging-concept-studio/src/index.ts +0 -296
  786. package/skills/packaging-concept-studio/tsconfig.json +0 -10
  787. package/skills/packing-plan-pro/CLAUDE.md +0 -19
  788. package/skills/packing-plan-pro/package.json +0 -27
  789. package/skills/packing-plan-pro/src/index.ts +0 -306
  790. package/skills/packing-plan-pro/tsconfig.json +0 -10
  791. package/skills/parent-teacher-brief/CLAUDE.md +0 -19
  792. package/skills/parent-teacher-brief/package.json +0 -27
  793. package/skills/parent-teacher-brief/src/index.ts +0 -290
  794. package/skills/parent-teacher-brief/tsconfig.json +0 -10
  795. package/skills/partner-kit-assembler/CLAUDE.md +0 -19
  796. package/skills/partner-kit-assembler/package.json +0 -27
  797. package/skills/partner-kit-assembler/src/index.ts +0 -313
  798. package/skills/partner-kit-assembler/tsconfig.json +0 -10
  799. package/skills/payroll-change-prepper/CLAUDE.md +0 -19
  800. package/skills/payroll-change-prepper/package.json +0 -27
  801. package/skills/payroll-change-prepper/src/index.ts +0 -304
  802. package/skills/payroll-change-prepper/tsconfig.json +0 -10
  803. package/skills/pdf-read/SKILL.md +0 -56
  804. package/skills/pdf-read/package.json +0 -11
  805. package/skills/pdf-read/tsconfig.json +0 -8
  806. package/skills/persona-based-adwriter/CLAUDE.md +0 -19
  807. package/skills/persona-based-adwriter/package.json +0 -27
  808. package/skills/persona-based-adwriter/src/index.ts +0 -285
  809. package/skills/persona-based-adwriter/tsconfig.json +0 -10
  810. package/skills/persona-generator/CLAUDE.md +0 -19
  811. package/skills/persona-generator/package.json +0 -27
  812. package/skills/persona-generator/src/index.ts +0 -443
  813. package/skills/persona-generator/tsconfig.json +0 -10
  814. package/skills/personal-daily-ops/CLAUDE.md +0 -19
  815. package/skills/personal-daily-ops/package.json +0 -27
  816. package/skills/personal-daily-ops/src/index.ts +0 -324
  817. package/skills/personal-daily-ops/tsconfig.json +0 -10
  818. package/skills/pet-care-scheduler/CLAUDE.md +0 -19
  819. package/skills/pet-care-scheduler/package.json +0 -27
  820. package/skills/pet-care-scheduler/src/index.ts +0 -298
  821. package/skills/pet-care-scheduler/tsconfig.json +0 -10
  822. package/skills/photo-album/SKILL.md +0 -29
  823. package/skills/photo-album/package.json +0 -11
  824. package/skills/photo-album/tsconfig.json +0 -4
  825. package/skills/playlist-maker/SKILL.md +0 -33
  826. package/skills/playlist-maker/package.json +0 -11
  827. package/skills/playlist-maker/tsconfig.json +0 -4
  828. package/skills/podcast-show-notes/CLAUDE.md +0 -19
  829. package/skills/podcast-show-notes/package.json +0 -27
  830. package/skills/podcast-show-notes/src/index.ts +0 -302
  831. package/skills/podcast-show-notes/tsconfig.json +0 -10
  832. package/skills/presentation-theme-maker/CLAUDE.md +0 -19
  833. package/skills/presentation-theme-maker/package.json +0 -27
  834. package/skills/presentation-theme-maker/src/index.ts +0 -292
  835. package/skills/presentation-theme-maker/tsconfig.json +0 -10
  836. package/skills/press-release-drafter/CLAUDE.md +0 -19
  837. package/skills/press-release-drafter/package.json +0 -27
  838. package/skills/press-release-drafter/src/index.ts +0 -291
  839. package/skills/press-release-drafter/tsconfig.json +0 -10
  840. package/skills/print-collateral-designer/CLAUDE.md +0 -19
  841. package/skills/print-collateral-designer/package.json +0 -27
  842. package/skills/print-collateral-designer/src/index.ts +0 -298
  843. package/skills/print-collateral-designer/tsconfig.json +0 -10
  844. package/skills/procurement-scorecard/CLAUDE.md +0 -19
  845. package/skills/procurement-scorecard/package.json +0 -27
  846. package/skills/procurement-scorecard/src/index.ts +0 -338
  847. package/skills/procurement-scorecard/tsconfig.json +0 -10
  848. package/skills/product-demo-script/CLAUDE.md +0 -19
  849. package/skills/product-demo-script/package.json +0 -27
  850. package/skills/product-demo-script/src/index.ts +0 -326
  851. package/skills/product-demo-script/tsconfig.json +0 -10
  852. package/skills/project-dashboard-reports/SKILL.md +0 -78
  853. package/skills/project-dashboard-reports/package.json +0 -25
  854. package/skills/project-dashboard-reports/src/index.ts +0 -67
  855. package/skills/project-retro-companion/CLAUDE.md +0 -19
  856. package/skills/project-retro-companion/package.json +0 -27
  857. package/skills/project-retro-companion/src/index.ts +0 -298
  858. package/skills/project-retro-companion/tsconfig.json +0 -10
  859. package/skills/proposal-redline-advisor/CLAUDE.md +0 -19
  860. package/skills/proposal-redline-advisor/package.json +0 -27
  861. package/skills/proposal-redline-advisor/src/index.ts +0 -320
  862. package/skills/proposal-redline-advisor/tsconfig.json +0 -10
  863. package/skills/read-image/SKILL.md +0 -47
  864. package/skills/read-image/package.json +0 -33
  865. package/skills/read-image/src/index.ts +0 -264
  866. package/skills/read-pdf/SKILL.md +0 -53
  867. package/skills/read-pdf/package.json +0 -11
  868. package/skills/remove-background/CLAUDE.md +0 -19
  869. package/skills/remove-background/package.json +0 -11
  870. package/skills/remove-background/tsconfig.json +0 -10
  871. package/skills/risk-disclosure-kit/CLAUDE.md +0 -19
  872. package/skills/risk-disclosure-kit/package.json +0 -27
  873. package/skills/risk-disclosure-kit/src/index.ts +0 -307
  874. package/skills/risk-disclosure-kit/tsconfig.json +0 -10
  875. package/skills/roi-comparison-tool/CLAUDE.md +0 -19
  876. package/skills/roi-comparison-tool/package.json +0 -27
  877. package/skills/roi-comparison-tool/src/index.ts +0 -322
  878. package/skills/roi-comparison-tool/tsconfig.json +0 -10
  879. package/skills/sales-call-recapper/CLAUDE.md +0 -19
  880. package/skills/sales-call-recapper/package.json +0 -27
  881. package/skills/sales-call-recapper/src/index.ts +0 -300
  882. package/skills/sales-call-recapper/tsconfig.json +0 -10
  883. package/skills/salescopy/.env.example +0 -2
  884. package/skills/salescopy/CLAUDE.md +0 -23
  885. package/skills/salescopy/LICENSE +0 -192
  886. package/skills/salescopy/README.md +0 -72
  887. package/skills/salescopy/package.json +0 -27
  888. package/skills/salescopy/src/commands/config.ts +0 -115
  889. package/skills/salescopy/src/commands/generate.ts +0 -179
  890. package/skills/salescopy/src/commands/sessions.ts +0 -169
  891. package/skills/salescopy/src/commands/templates.ts +0 -99
  892. package/skills/salescopy/src/index.ts +0 -3
  893. package/skills/salescopy/src/lib/generator.ts +0 -197
  894. package/skills/salescopy/src/lib/storage.ts +0 -191
  895. package/skills/salescopy/src/types/index.ts +0 -74
  896. package/skills/salescopy/src/utils/logger.ts +0 -33
  897. package/skills/salescopy/src/utils/paths.ts +0 -25
  898. package/skills/salescopy/tsconfig.json +0 -23
  899. package/skills/scaffold-project/CLAUDE.md +0 -19
  900. package/skills/scaffold-project/package.json +0 -29
  901. package/skills/scaffold-project/src/ai-detect.ts +0 -136
  902. package/skills/scaffold-project/src/file-generators.ts +0 -292
  903. package/skills/scaffold-project/src/index.ts +0 -240
  904. package/skills/scaffold-project/src/project-config.ts +0 -338
  905. package/skills/scaffold-project/src/templates.ts +0 -173
  906. package/skills/scaffold-project/src/types.ts +0 -58
  907. package/skills/scaffold-project/tsconfig.json +0 -10
  908. package/skills/scholarship-tracker/CLAUDE.md +0 -19
  909. package/skills/scholarship-tracker/package.json +0 -27
  910. package/skills/scholarship-tracker/src/index.ts +0 -298
  911. package/skills/scholarship-tracker/tsconfig.json +0 -10
  912. package/skills/sdk-generator/SKILL.md +0 -45
  913. package/skills/sdk-generator/package.json +0 -11
  914. package/skills/sdk-generator/tsconfig.json +0 -8
  915. package/skills/seating-chart-maker/CLAUDE.md +0 -19
  916. package/skills/seating-chart-maker/package.json +0 -27
  917. package/skills/seating-chart-maker/src/index.ts +0 -312
  918. package/skills/seating-chart-maker/tsconfig.json +0 -10
  919. package/skills/seo-brief-builder/CLAUDE.md +0 -19
  920. package/skills/seo-brief-builder/package.json +0 -27
  921. package/skills/seo-brief-builder/src/index.ts +0 -288
  922. package/skills/seo-brief-builder/tsconfig.json +0 -10
  923. package/skills/short-video-pack/SKILL.md +0 -30
  924. package/skills/short-video-pack/package.json +0 -11
  925. package/skills/slack-assistant/CLAUDE.md +0 -19
  926. package/skills/slack-assistant/package.json +0 -29
  927. package/skills/slack-assistant/src/index.ts +0 -79
  928. package/skills/slack-assistant/tsconfig.json +0 -10
  929. package/skills/sleep-routine-analyzer/CLAUDE.md +0 -19
  930. package/skills/sleep-routine-analyzer/package.json +0 -27
  931. package/skills/sleep-routine-analyzer/src/index.ts +0 -293
  932. package/skills/sleep-routine-analyzer/tsconfig.json +0 -10
  933. package/skills/sms/README.md +0 -33
  934. package/skills/sms/package.json +0 -35
  935. package/skills/sms/src/index.ts +0 -335
  936. package/skills/sms/tsconfig.json +0 -21
  937. package/skills/social-media-kit/CLAUDE.md +0 -19
  938. package/skills/social-media-kit/package.json +0 -27
  939. package/skills/social-media-kit/src/index.ts +0 -281
  940. package/skills/social-media-kit/tsconfig.json +0 -10
  941. package/skills/sponsorship-proposal-lab/CLAUDE.md +0 -19
  942. package/skills/sponsorship-proposal-lab/package.json +0 -27
  943. package/skills/sponsorship-proposal-lab/src/index.ts +0 -300
  944. package/skills/sponsorship-proposal-lab/tsconfig.json +0 -10
  945. package/skills/spreadsheet-cleanroom/CLAUDE.md +0 -19
  946. package/skills/spreadsheet-cleanroom/package.json +0 -27
  947. package/skills/spreadsheet-cleanroom/src/index.ts +0 -331
  948. package/skills/spreadsheet-cleanroom/tsconfig.json +0 -10
  949. package/skills/stress-relief-playbook/CLAUDE.md +0 -19
  950. package/skills/stress-relief-playbook/package.json +0 -27
  951. package/skills/stress-relief-playbook/src/index.ts +0 -298
  952. package/skills/stress-relief-playbook/tsconfig.json +0 -10
  953. package/skills/study-guide-builder/CLAUDE.md +0 -19
  954. package/skills/study-guide-builder/package.json +0 -27
  955. package/skills/study-guide-builder/src/index.ts +0 -298
  956. package/skills/study-guide-builder/tsconfig.json +0 -10
  957. package/skills/subscription-spend-watcher/CLAUDE.md +0 -19
  958. package/skills/subscription-spend-watcher/package.json +0 -27
  959. package/skills/subscription-spend-watcher/src/index.ts +0 -312
  960. package/skills/subscription-spend-watcher/tsconfig.json +0 -10
  961. package/skills/subtitle/.env.example +0 -2
  962. package/skills/subtitle/CLAUDE.md +0 -37
  963. package/skills/subtitle/LICENSE +0 -192
  964. package/skills/subtitle/README.md +0 -63
  965. package/skills/subtitle/package.json +0 -43
  966. package/skills/subtitle/src/commands/config.ts +0 -53
  967. package/skills/subtitle/src/commands/generate.ts +0 -61
  968. package/skills/subtitle/src/index.ts +0 -3
  969. package/skills/subtitle/src/lib/generator.ts +0 -216
  970. package/skills/subtitle/src/lib/storage.ts +0 -62
  971. package/skills/subtitle/src/types/index.ts +0 -68
  972. package/skills/subtitle/src/utils/logger.ts +0 -34
  973. package/skills/subtitle/src/utils/paths.ts +0 -51
  974. package/skills/subtitle/tsconfig.json +0 -21
  975. package/skills/survey-insight-extractor/CLAUDE.md +0 -19
  976. package/skills/survey-insight-extractor/package.json +0 -27
  977. package/skills/survey-insight-extractor/src/index.ts +0 -317
  978. package/skills/survey-insight-extractor/tsconfig.json +0 -10
  979. package/skills/terraform-generator/CLAUDE.md +0 -19
  980. package/skills/terraform-generator/package.json +0 -29
  981. package/skills/terraform-generator/src/index.ts +0 -99
  982. package/skills/terraform-generator/tsconfig.json +0 -10
  983. package/skills/testimonial-graphics/CLAUDE.md +0 -19
  984. package/skills/testimonial-graphics/package.json +0 -27
  985. package/skills/testimonial-graphics/src/index.ts +0 -303
  986. package/skills/testimonial-graphics/tsconfig.json +0 -10
  987. package/skills/timesheet/.env.example +0 -25
  988. package/skills/timesheet/README.md +0 -235
  989. package/skills/timesheet/package.json +0 -47
  990. package/skills/timesheet/scripts/publish.ts +0 -210
  991. package/skills/timesheet/src/commands/employee.ts +0 -96
  992. package/skills/timesheet/src/commands/export.ts +0 -29
  993. package/skills/timesheet/src/commands/generate.ts +0 -102
  994. package/skills/timesheet/src/commands/holiday.ts +0 -74
  995. package/skills/timesheet/src/commands/profile.ts +0 -133
  996. package/skills/timesheet/src/commands/setup.ts +0 -21
  997. package/skills/timesheet/src/commands/vacation.ts +0 -93
  998. package/skills/timesheet/src/index.ts +0 -3
  999. package/skills/timesheet/src/lib/employees.ts +0 -56
  1000. package/skills/timesheet/src/lib/export.ts +0 -123
  1001. package/skills/timesheet/src/lib/holidays.ts +0 -79
  1002. package/skills/timesheet/src/lib/paths.ts +0 -59
  1003. package/skills/timesheet/src/lib/profiles.ts +0 -168
  1004. package/skills/timesheet/src/lib/storage.ts +0 -83
  1005. package/skills/timesheet/src/lib/timesheet.ts +0 -130
  1006. package/skills/timesheet/src/lib/vacations.ts +0 -70
  1007. package/skills/timesheet/src/types/index.ts +0 -96
  1008. package/skills/timesheet/tsconfig.json +0 -29
  1009. package/skills/transcript/LICENSE +0 -192
  1010. package/skills/transcript/README.md +0 -17
  1011. package/skills/transcript/SKILL.md +0 -80
  1012. package/skills/transcript/package.json +0 -11
  1013. package/skills/transcript/tsconfig.json +0 -18
  1014. package/skills/travel-budget-balancer/CLAUDE.md +0 -19
  1015. package/skills/travel-budget-balancer/package.json +0 -27
  1016. package/skills/travel-budget-balancer/src/index.ts +0 -297
  1017. package/skills/travel-budget-balancer/tsconfig.json +0 -10
  1018. package/skills/video/SKILL.md +0 -37
  1019. package/skills/video/package.json +0 -11
  1020. package/skills/video-cut-suggester/CLAUDE.md +0 -19
  1021. package/skills/video-cut-suggester/package.json +0 -27
  1022. package/skills/video-cut-suggester/src/index.ts +0 -304
  1023. package/skills/video-cut-suggester/tsconfig.json +0 -10
  1024. package/skills/video-thumbnail/CLAUDE.md +0 -19
  1025. package/skills/video-thumbnail/package.json +0 -27
  1026. package/skills/video-thumbnail/src/index.ts +0 -356
  1027. package/skills/video-thumbnail/tsconfig.json +0 -10
  1028. package/skills/voiceover-jingle-pack/SKILL.md +0 -28
  1029. package/skills/voiceover-jingle-pack/package.json +0 -11
  1030. package/skills/webcrawling/CLAUDE.md +0 -11
  1031. package/skills/webcrawling/LICENSE +0 -192
  1032. package/skills/webcrawling/README.md +0 -24
  1033. package/skills/webcrawling/package.json +0 -11
  1034. package/skills/webcrawling/tsconfig.json +0 -22
  1035. package/skills/webinar-script-coach/CLAUDE.md +0 -19
  1036. package/skills/webinar-script-coach/package.json +0 -27
  1037. package/skills/webinar-script-coach/src/index.ts +0 -296
  1038. package/skills/webinar-script-coach/tsconfig.json +0 -10
  1039. package/skills/wellness-progress-reporter/CLAUDE.md +0 -19
  1040. package/skills/wellness-progress-reporter/package.json +0 -27
  1041. package/skills/wellness-progress-reporter/src/index.ts +0 -298
  1042. package/skills/wellness-progress-reporter/tsconfig.json +0 -10
  1043. package/skills/workout-cycle-planner/CLAUDE.md +0 -19
  1044. package/skills/workout-cycle-planner/package.json +0 -27
  1045. package/skills/workout-cycle-planner/src/index.ts +0 -299
  1046. package/skills/workout-cycle-planner/tsconfig.json +0 -10
  1047. package/skills/write/.env.example +0 -9
  1048. package/skills/write/LICENSE +0 -192
  1049. package/skills/write/README.md +0 -17
  1050. package/skills/write/SKILL.md +0 -90
  1051. package/skills/write/package.json +0 -32
  1052. package/skills/write/src/agents/image-generator.ts +0 -186
  1053. package/skills/write/src/agents/researcher.ts +0 -61
  1054. package/skills/write/src/agents/writer.ts +0 -99
  1055. package/skills/write/src/index-local.ts +0 -248
  1056. package/skills/write/src/index.ts +0 -4
  1057. package/skills/write/src/orchestrator.ts +0 -171
  1058. package/skills/write/src/types.ts +0 -65
  1059. package/skills/write/tsconfig.json +0 -18
  1060. /package/migrations/{0001_open_skills_self_hosted.sql → postgres/0001_open_skills_self_hosted.sql} +0 -0
  1061. /package/skills/{read-image → api-docs-portal}/tsconfig.json +0 -0
  1062. /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