@hasna/skills 0.1.61 → 0.1.63

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 (523) hide show
  1. package/README.md +10 -6
  2. package/bin/index.js +14271 -21602
  3. package/bin/mcp.js +3527 -11449
  4. package/bin/migrate.js +53 -3
  5. package/bin/server.js +5140 -2675
  6. package/bin/worker.js +4542 -2129
  7. package/dist/cli/commands/publish.d.ts +2 -0
  8. package/dist/cli/components/App.d.ts +2 -1
  9. package/dist/cli/components/CategorySelect.d.ts +2 -1
  10. package/dist/cli/components/Header.d.ts +2 -1
  11. package/dist/cli/components/InstallProgress.d.ts +2 -1
  12. package/dist/cli/components/SearchView.d.ts +2 -1
  13. package/dist/cli/components/SkillSelect.d.ts +2 -1
  14. package/dist/index.d.ts +4 -1
  15. package/dist/index.js +5094 -13755
  16. package/dist/lib/agent-sync.d.ts +38 -3
  17. package/dist/lib/home-adoption.d.ts +91 -0
  18. package/dist/lib/home-census.d.ts +22 -0
  19. package/dist/lib/home-migration.d.ts +61 -0
  20. package/dist/lib/portable-skills-files.d.ts +21 -1
  21. package/dist/lib/portable-skills-types.d.ts +46 -0
  22. package/dist/lib/pull.d.ts +66 -0
  23. package/dist/lib/remote-client.d.ts +6 -0
  24. package/dist/lib/run-state.d.ts +5 -0
  25. package/dist/lib/skill-bundles.d.ts +54 -0
  26. package/dist/lib/skill-contract.d.ts +35 -0
  27. package/dist/lib/skill-hash.d.ts +77 -0
  28. package/dist/sdk/cancel.d.ts +30 -0
  29. package/dist/sdk/dispatcher.d.ts +40 -0
  30. package/dist/sdk/event-sink.d.ts +2 -0
  31. package/dist/sdk/events.d.ts +79 -0
  32. package/dist/sdk/execution/admission.d.ts +44 -0
  33. package/dist/sdk/execution/dispatchers/e2b.d.ts +17 -0
  34. package/dist/sdk/execution/dispatchers/ecs.d.ts +151 -0
  35. package/dist/sdk/execution/image-profile.d.ts +73 -0
  36. package/dist/sdk/execution/index.d.ts +15 -0
  37. package/dist/sdk/execution/receipts.d.ts +44 -0
  38. package/dist/sdk/execution/state-machine.d.ts +38 -0
  39. package/dist/sdk/execution/storage.d.ts +158 -0
  40. package/dist/sdk/execution/types.d.ts +130 -0
  41. package/dist/sdk/executor.d.ts +17 -0
  42. package/dist/sdk/governance-store.d.ts +156 -0
  43. package/dist/sdk/governance.d.ts +92 -0
  44. package/dist/sdk/index.d.ts +26 -0
  45. package/dist/sdk/index.js +48730 -0
  46. package/dist/sdk/offline.d.ts +16 -0
  47. package/dist/sdk/outputs.d.ts +71 -0
  48. package/dist/sdk/registry.d.ts +28 -0
  49. package/dist/sdk/runs.d.ts +229 -0
  50. package/dist/sdk/server.d.ts +35 -0
  51. package/dist/sdk/spend.d.ts +36 -0
  52. package/dist/sdk/storage.d.ts +25 -0
  53. package/dist/server/app.d.ts +42 -0
  54. package/dist/server/artifact-storage.d.ts +102 -0
  55. package/dist/server/auth.d.ts +5 -0
  56. package/dist/server/config.d.ts +40 -0
  57. package/dist/server/database-url.d.ts +42 -0
  58. package/dist/server/handlers.d.ts +3 -0
  59. package/dist/server/index.d.ts +2 -0
  60. package/dist/server/migrate.d.ts +13 -0
  61. package/dist/server/migrations-dir.d.ts +18 -0
  62. package/dist/server/redaction.d.ts +1 -0
  63. package/dist/server/registry.d.ts +5 -0
  64. package/dist/server/rows.d.ts +23 -0
  65. package/dist/server/skills-api.d.ts +68 -0
  66. package/dist/server/sqlite-store.d.ts +114 -0
  67. package/dist/server/store-fixtures.d.ts +25 -0
  68. package/dist/server/store.d.ts +144 -0
  69. package/dist/server/types.d.ts +242 -0
  70. package/dist/server/worker.d.ts +4 -0
  71. package/dist/storage.js +32 -0
  72. package/docs/skill-standard.md +211 -39
  73. package/migrations/postgres/0003_run_outputs_governance.sql +83 -0
  74. package/migrations/sqlite/0003_run_outputs_governance.sql +58 -0
  75. package/package.json +11 -8
  76. package/schemas/skill.schema.json +181 -0
  77. package/agent-skills/README.md +0 -41
  78. package/agent-skills/fleet-package-rollout/SKILL.md +0 -169
  79. package/agent-skills/inbox/SKILL.md +0 -25
  80. package/agent-skills/inbox/scripts/inbox +0 -109
  81. package/agent-skills/inbox/tests/test_registered_sender_id.sh +0 -92
  82. package/agent-skills/inbox-monitor/SKILL.md +0 -41
  83. package/agent-skills/inbox-monitor/scripts/inbox_monitor.sh +0 -91
  84. package/agent-skills/inbox-monitor/scripts/test_inbox_monitor.sh +0 -71
  85. package/agent-skills/merge-pr/SKILL.md +0 -85
  86. package/agent-skills/merge-pr/references/merge-safety.md +0 -82
  87. package/agent-skills/merge-pr/scripts/merge_pr_guard.py +0 -694
  88. package/agent-skills/merge-pr/scripts/test_merge_pr_guard.py +0 -647
  89. package/agent-skills/merge-pr/tests/fixtures/multi-commit-synthesized.json +0 -28
  90. package/agent-skills/merge-pr/tests/fixtures/trailer-free-provider.json +0 -28
  91. package/agent-skills/skill-goal-execute/SKILL.md +0 -115
  92. package/agent-skills/skill-login/SKILL.md +0 -109
  93. package/agent-skills/skill-project-create/SKILL.md +0 -91
  94. package/agent-skills/skill-publish/SKILL.md +0 -207
  95. package/skills/_common/auth.ts +0 -45
  96. package/skills/_common/http-client.ts +0 -143
  97. package/skills/_common/index.ts +0 -26
  98. package/skills/_common/install.sh +0 -7
  99. package/skills/_common/installer.ts +0 -72
  100. package/skills/_common/skill-install.ts +0 -37
  101. package/skills/_common/vision.ts +0 -374
  102. package/skills/ad-creative-pack/SKILL.md +0 -55
  103. package/skills/ad-creative-pack/package.json +0 -10
  104. package/skills/analyze-data/CLAUDE.md +0 -16
  105. package/skills/analyze-data/SKILL.md +0 -112
  106. package/skills/analyze-data/package.json +0 -23
  107. package/skills/analyze-data/src/analysis.ts +0 -401
  108. package/skills/analyze-data/src/cli.ts +0 -66
  109. package/skills/analyze-data/src/formatters.ts +0 -235
  110. package/skills/analyze-data/src/index.ts +0 -74
  111. package/skills/analyze-data/src/logger.ts +0 -36
  112. package/skills/analyze-data/src/parsers.ts +0 -57
  113. package/skills/analyze-data/src/stats.ts +0 -151
  114. package/skills/analyze-data/src/types.ts +0 -85
  115. package/skills/analyze-data/tsconfig.json +0 -19
  116. package/skills/api-docs-portal/SKILL.md +0 -84
  117. package/skills/api-docs-portal/package.json +0 -35
  118. package/skills/api-docs-portal/src/index.ts +0 -919
  119. package/skills/api-docs-portal/tsconfig.json +0 -17
  120. package/skills/api-test-suite/CLAUDE.md +0 -19
  121. package/skills/api-test-suite/package.json +0 -27
  122. package/skills/api-test-suite/src/index.ts +0 -381
  123. package/skills/api-test-suite/tsconfig.json +0 -10
  124. package/skills/audio-extract/CLAUDE.md +0 -9
  125. package/skills/audio-extract/SKILL.md +0 -73
  126. package/skills/audio-extract/package.json +0 -23
  127. package/skills/audio-extract/src/index.ts +0 -323
  128. package/skills/audio-extract/tsconfig.json +0 -11
  129. package/skills/bio-sequence-tool/CLAUDE.md +0 -19
  130. package/skills/bio-sequence-tool/package.json +0 -27
  131. package/skills/bio-sequence-tool/src/index.ts +0 -85
  132. package/skills/bio-sequence-tool/tsconfig.json +0 -10
  133. package/skills/blog-article/CLAUDE.md +0 -12
  134. package/skills/blog-article/SKILL.md +0 -55
  135. package/skills/blog-article/package.json +0 -10
  136. package/skills/blog-article/tsconfig.json +0 -10
  137. package/skills/brand-assets/SKILL.md +0 -118
  138. package/skills/brand-assets/package.json +0 -35
  139. package/skills/brand-assets/src/cli.ts +0 -155
  140. package/skills/brand-assets/src/constants.ts +0 -8
  141. package/skills/brand-assets/src/extract.ts +0 -236
  142. package/skills/brand-assets/src/index.ts +0 -668
  143. package/skills/brand-assets/src/types.ts +0 -59
  144. package/skills/brand-assets/tsconfig.json +0 -17
  145. package/skills/brand-kit/SKILL.md +0 -54
  146. package/skills/brand-kit/package.json +0 -10
  147. package/skills/businessactivity/CLAUDE.md +0 -176
  148. package/skills/businessactivity/LICENSE +0 -192
  149. package/skills/businessactivity/README.md +0 -287
  150. package/skills/businessactivity/package.json +0 -25
  151. package/skills/businessactivity/scripts/publish.ts +0 -210
  152. package/skills/businessactivity/src/commands/activity.ts +0 -211
  153. package/skills/businessactivity/src/commands/function.ts +0 -227
  154. package/skills/businessactivity/src/commands/owner.ts +0 -193
  155. package/skills/businessactivity/src/commands/profile.ts +0 -121
  156. package/skills/businessactivity/src/commands/responsibility.ts +0 -264
  157. package/skills/businessactivity/src/commands/team.ts +0 -244
  158. package/skills/businessactivity/src/commands/workflow.ts +0 -359
  159. package/skills/businessactivity/src/index.ts +0 -3
  160. package/skills/businessactivity/src/lib/config.ts +0 -167
  161. package/skills/businessactivity/src/lib/output.ts +0 -76
  162. package/skills/businessactivity/src/lib/paths.ts +0 -79
  163. package/skills/businessactivity/src/lib/storage.ts +0 -95
  164. package/skills/businessactivity/src/types/index.ts +0 -86
  165. package/skills/businessactivity/tsconfig.json +0 -29
  166. package/skills/codefix/LICENSE +0 -192
  167. package/skills/codefix/README.md +0 -232
  168. package/skills/codefix/SKILL.md +0 -94
  169. package/skills/codefix/package.json +0 -21
  170. package/skills/codefix/src/fixers/batch.ts +0 -213
  171. package/skills/codefix/src/fixers/detector.ts +0 -160
  172. package/skills/codefix/src/fixers/index.ts +0 -7
  173. package/skills/codefix/src/fixers/runner.ts +0 -522
  174. package/skills/codefix/src/index-local.ts +0 -431
  175. package/skills/codefix/src/index.ts +0 -4
  176. package/skills/codefix/src/types.ts +0 -211
  177. package/skills/codefix/tsconfig.json +0 -15
  178. package/skills/commitpush/SKILL.md +0 -57
  179. package/skills/commitpush/package.json +0 -33
  180. package/skills/commitpush/src/index.ts +0 -34
  181. package/skills/commitpush/tsconfig.json +0 -17
  182. package/skills/commitpushpr/SKILL.md +0 -55
  183. package/skills/commitpushpr/package.json +0 -33
  184. package/skills/commitpushpr/src/index.ts +0 -34
  185. package/skills/commitpushpr/tsconfig.json +0 -17
  186. package/skills/compress-video/CLAUDE.md +0 -9
  187. package/skills/compress-video/SKILL.md +0 -79
  188. package/skills/compress-video/package.json +0 -23
  189. package/skills/compress-video/src/index.ts +0 -473
  190. package/skills/compress-video/tsconfig.json +0 -11
  191. package/skills/contract-review-report/SKILL.md +0 -52
  192. package/skills/contract-review-report/package.json +0 -10
  193. package/skills/customer-feedback-report/SKILL.md +0 -52
  194. package/skills/customer-feedback-report/package.json +0 -10
  195. package/skills/dashboard-builder/CLAUDE.md +0 -19
  196. package/skills/dashboard-builder/package.json +0 -29
  197. package/skills/dashboard-builder/src/index.ts +0 -150
  198. package/skills/dashboard-builder/tsconfig.json +0 -10
  199. package/skills/data-anonymizer/CLAUDE.md +0 -19
  200. package/skills/data-anonymizer/package.json +0 -27
  201. package/skills/data-anonymizer/src/index.ts +0 -183
  202. package/skills/data-anonymizer/tsconfig.json +0 -10
  203. package/skills/database-explorer/CLAUDE.md +0 -19
  204. package/skills/database-explorer/package.json +0 -29
  205. package/skills/database-explorer/src/index.ts +0 -95
  206. package/skills/database-explorer/tsconfig.json +0 -10
  207. package/skills/diff-viewer/CLAUDE.md +0 -19
  208. package/skills/diff-viewer/package.json +0 -30
  209. package/skills/diff-viewer/src/index.ts +0 -164
  210. package/skills/diff-viewer/tsconfig.json +0 -10
  211. package/skills/doc-read/SKILL.md +0 -45
  212. package/skills/doc-read/package.json +0 -29
  213. package/skills/doc-read/src/index.ts +0 -324
  214. package/skills/doc-read/tsconfig.json +0 -8
  215. package/skills/domainpurchase/LICENSE +0 -192
  216. package/skills/domainpurchase/SKILL.md +0 -29
  217. package/skills/domainpurchase/package.json +0 -30
  218. package/skills/domainpurchase/src/index.ts +0 -3
  219. package/skills/domainpurchase/tsconfig.json +0 -21
  220. package/skills/email-sequence/SKILL.md +0 -53
  221. package/skills/email-sequence/package.json +0 -10
  222. package/skills/experiment-power-calculator/CLAUDE.md +0 -19
  223. package/skills/experiment-power-calculator/package.json +0 -29
  224. package/skills/experiment-power-calculator/src/index.ts +0 -86
  225. package/skills/experiment-power-calculator/tsconfig.json +0 -10
  226. package/skills/extract-frames/CLAUDE.md +0 -19
  227. package/skills/extract-frames/package.json +0 -27
  228. package/skills/extract-frames/src/index.ts +0 -616
  229. package/skills/extract-frames/tsconfig.json +0 -10
  230. package/skills/file-organizer/CLAUDE.md +0 -19
  231. package/skills/file-organizer/package.json +0 -27
  232. package/skills/file-organizer/src/index.ts +0 -91
  233. package/skills/file-organizer/tsconfig.json +0 -10
  234. package/skills/folder-tree/CLAUDE.md +0 -19
  235. package/skills/folder-tree/package.json +0 -29
  236. package/skills/folder-tree/src/index.ts +0 -568
  237. package/skills/folder-tree/tsconfig.json +0 -10
  238. package/skills/form-filler/CLAUDE.md +0 -19
  239. package/skills/form-filler/package.json +0 -29
  240. package/skills/form-filler/src/index.ts +0 -81
  241. package/skills/form-filler/tsconfig.json +0 -10
  242. package/skills/generate-api-client/CLAUDE.md +0 -19
  243. package/skills/generate-api-client/package.json +0 -29
  244. package/skills/generate-api-client/src/generator.ts +0 -47
  245. package/skills/generate-api-client/src/index.ts +0 -92
  246. package/skills/generate-api-client/src/logger.ts +0 -34
  247. package/skills/generate-api-client/src/python-generator.ts +0 -245
  248. package/skills/generate-api-client/src/spec-loader.ts +0 -48
  249. package/skills/generate-api-client/src/type-mappers.ts +0 -79
  250. package/skills/generate-api-client/src/types.ts +0 -76
  251. package/skills/generate-api-client/src/typescript-generator.ts +0 -247
  252. package/skills/generate-api-client/tsconfig.json +0 -10
  253. package/skills/generate-chart/CLAUDE.md +0 -19
  254. package/skills/generate-chart/package.json +0 -27
  255. package/skills/generate-chart/src/index.ts +0 -510
  256. package/skills/generate-chart/tsconfig.json +0 -10
  257. package/skills/generate-dockerfile/CLAUDE.md +0 -19
  258. package/skills/generate-dockerfile/package.json +0 -27
  259. package/skills/generate-dockerfile/src/cli.ts +0 -78
  260. package/skills/generate-dockerfile/src/dockerfile-templates.ts +0 -392
  261. package/skills/generate-dockerfile/src/index.ts +0 -81
  262. package/skills/generate-dockerfile/src/logger.ts +0 -30
  263. package/skills/generate-dockerfile/src/project-detection.ts +0 -68
  264. package/skills/generate-dockerfile/src/support-files.ts +0 -171
  265. package/skills/generate-dockerfile/src/types.ts +0 -29
  266. package/skills/generate-dockerfile/tsconfig.json +0 -10
  267. package/skills/generate-env/CLAUDE.md +0 -19
  268. package/skills/generate-env/package.json +0 -29
  269. package/skills/generate-env/src/cli.ts +0 -85
  270. package/skills/generate-env/src/detection.ts +0 -161
  271. package/skills/generate-env/src/env-data.ts +0 -66
  272. package/skills/generate-env/src/generators.ts +0 -240
  273. package/skills/generate-env/src/index.ts +0 -120
  274. package/skills/generate-env/src/runtime.ts +0 -30
  275. package/skills/generate-env/src/types.ts +0 -32
  276. package/skills/generate-env/tsconfig.json +0 -10
  277. package/skills/generate-favicon/CLAUDE.md +0 -19
  278. package/skills/generate-favicon/package.json +0 -29
  279. package/skills/generate-favicon/src/index.ts +0 -421
  280. package/skills/generate-favicon/tsconfig.json +0 -10
  281. package/skills/generate-qrcode/CLAUDE.md +0 -19
  282. package/skills/generate-qrcode/package.json +0 -30
  283. package/skills/generate-qrcode/src/index.ts +0 -584
  284. package/skills/generate-qrcode/tsconfig.json +0 -10
  285. package/skills/generate-resume/CLAUDE.md +0 -19
  286. package/skills/generate-resume/package.json +0 -27
  287. package/skills/generate-resume/src/cli.ts +0 -157
  288. package/skills/generate-resume/src/index.ts +0 -178
  289. package/skills/generate-resume/src/parsers.ts +0 -95
  290. package/skills/generate-resume/src/renderers.ts +0 -538
  291. package/skills/generate-resume/src/security.ts +0 -39
  292. package/skills/generate-resume/src/types.ts +0 -86
  293. package/skills/generate-resume/tsconfig.json +0 -10
  294. package/skills/generate-sitemap/CLAUDE.md +0 -19
  295. package/skills/generate-sitemap/package.json +0 -27
  296. package/skills/generate-sitemap/src/index.ts +0 -626
  297. package/skills/generate-sitemap/tsconfig.json +0 -10
  298. package/skills/gif-maker/CLAUDE.md +0 -19
  299. package/skills/gif-maker/package.json +0 -30
  300. package/skills/gif-maker/src/index.ts +0 -600
  301. package/skills/gif-maker/tsconfig.json +0 -10
  302. package/skills/hook/LICENSE +0 -192
  303. package/skills/hook/README.md +0 -74
  304. package/skills/hook/SKILL.md +0 -85
  305. package/skills/hook/bunfig.toml +0 -5
  306. package/skills/hook/package.json +0 -28
  307. package/skills/hook/src/commands/create.ts +0 -112
  308. package/skills/hook/src/commands/events.ts +0 -37
  309. package/skills/hook/src/commands/validate.ts +0 -117
  310. package/skills/hook/src/index.ts +0 -118
  311. package/skills/hook/src/templates/root.ts +0 -196
  312. package/skills/hook/src/templates/source.ts +0 -647
  313. package/skills/hook/tsconfig.json +0 -18
  314. package/skills/http-server/CLAUDE.md +0 -19
  315. package/skills/http-server/package.json +0 -29
  316. package/skills/http-server/src/index.ts +0 -51
  317. package/skills/http-server/tsconfig.json +0 -10
  318. package/skills/implementation/LICENSE +0 -192
  319. package/skills/implementation/README.md +0 -53
  320. package/skills/implementation/SKILL.md +0 -57
  321. package/skills/implementation/bunfig.toml +0 -5
  322. package/skills/implementation/package.json +0 -28
  323. package/skills/implementation/src/commands/create.ts +0 -187
  324. package/skills/implementation/src/index.ts +0 -62
  325. package/skills/implementation/tsconfig.json +0 -18
  326. package/skills/implementation-plan/CLAUDE.md +0 -19
  327. package/skills/implementation-plan/package.json +0 -29
  328. package/skills/implementation-plan/src/index.ts +0 -520
  329. package/skills/implementation-plan/tsconfig.json +0 -10
  330. package/skills/implementation-todo/CLAUDE.md +0 -19
  331. package/skills/implementation-todo/package.json +0 -29
  332. package/skills/implementation-todo/src/index.ts +0 -429
  333. package/skills/implementation-todo/tsconfig.json +0 -10
  334. package/skills/invoice/.env.example +0 -3
  335. package/skills/invoice/CLAUDE.md +0 -31
  336. package/skills/invoice/LICENSE +0 -192
  337. package/skills/invoice/README.md +0 -70
  338. package/skills/invoice/package.json +0 -26
  339. package/skills/invoice/src/commands/companies.ts +0 -202
  340. package/skills/invoice/src/commands/config.ts +0 -132
  341. package/skills/invoice/src/commands/generate.ts +0 -177
  342. package/skills/invoice/src/commands/invoices.ts +0 -218
  343. package/skills/invoice/src/index.ts +0 -3
  344. package/skills/invoice/src/lib/api.ts +0 -124
  345. package/skills/invoice/src/lib/storage.ts +0 -171
  346. package/skills/invoice/src/types/index.ts +0 -86
  347. package/skills/invoice/src/utils/logger.ts +0 -33
  348. package/skills/invoice/src/utils/paths.ts +0 -25
  349. package/skills/invoice/tsconfig.json +0 -23
  350. package/skills/invoice-reconciliation/SKILL.md +0 -98
  351. package/skills/invoice-reconciliation/package.json +0 -36
  352. package/skills/invoice-reconciliation/src/index.ts +0 -743
  353. package/skills/invoice-reconciliation/tsconfig.json +0 -17
  354. package/skills/landing-page-pack/SKILL.md +0 -55
  355. package/skills/landing-page-pack/package.json +0 -10
  356. package/skills/latex-table-generator/CLAUDE.md +0 -19
  357. package/skills/latex-table-generator/package.json +0 -29
  358. package/skills/latex-table-generator/src/index.ts +0 -113
  359. package/skills/latex-table-generator/tsconfig.json +0 -10
  360. package/skills/logo-design/SKILL.md +0 -94
  361. package/skills/logo-design/package.json +0 -35
  362. package/skills/logo-design/src/cli.ts +0 -132
  363. package/skills/logo-design/src/constants.ts +0 -5
  364. package/skills/logo-design/src/docs.ts +0 -102
  365. package/skills/logo-design/src/geometry.ts +0 -324
  366. package/skills/logo-design/src/index.ts +0 -212
  367. package/skills/logo-design/src/palette.ts +0 -258
  368. package/skills/logo-design/src/types.ts +0 -50
  369. package/skills/logo-design/tsconfig.json +0 -17
  370. package/skills/lorem-generator/CLAUDE.md +0 -19
  371. package/skills/lorem-generator/package.json +0 -29
  372. package/skills/lorem-generator/src/index.ts +0 -59
  373. package/skills/lorem-generator/tsconfig.json +0 -10
  374. package/skills/managemcp/CLAUDE.md +0 -14
  375. package/skills/managemcp/README.md +0 -24
  376. package/skills/managemcp/package.json +0 -16
  377. package/skills/managemcp/src/index.ts +0 -3
  378. package/skills/managemcp/tsconfig.json +0 -27
  379. package/skills/markdown-validator/CLAUDE.md +0 -19
  380. package/skills/markdown-validator/package.json +0 -29
  381. package/skills/markdown-validator/src/index.ts +0 -92
  382. package/skills/markdown-validator/tsconfig.json +0 -10
  383. package/skills/market-research-report/SKILL.md +0 -51
  384. package/skills/market-research-report/package.json +0 -10
  385. package/skills/meeting-pack/SKILL.md +0 -52
  386. package/skills/meeting-pack/package.json +0 -10
  387. package/skills/merge-pdfs/CLAUDE.md +0 -19
  388. package/skills/merge-pdfs/package.json +0 -31
  389. package/skills/merge-pdfs/src/index.ts +0 -427
  390. package/skills/merge-pdfs/tsconfig.json +0 -10
  391. package/skills/migration-plan-pack/SKILL.md +0 -56
  392. package/skills/migration-plan-pack/package.json +0 -10
  393. package/skills/monitor/SKILL.md +0 -69
  394. package/skills/monitor/package.json +0 -33
  395. package/skills/monitor/src/index.ts +0 -34
  396. package/skills/monitor/tsconfig.json +0 -17
  397. package/skills/one-page-website/SKILL.md +0 -128
  398. package/skills/one-page-website/package.json +0 -34
  399. package/skills/one-page-website/src/design.ts +0 -336
  400. package/skills/one-page-website/src/docs.ts +0 -159
  401. package/skills/one-page-website/src/index.ts +0 -357
  402. package/skills/one-page-website/src/page.ts +0 -340
  403. package/skills/one-page-website/src/styles.ts +0 -508
  404. package/skills/one-page-website/src/types.ts +0 -78
  405. package/skills/one-page-website/tsconfig.json +0 -17
  406. package/skills/pdf-generate/CLAUDE.md +0 -19
  407. package/skills/pdf-generate/SKILL.md +0 -86
  408. package/skills/pdf-generate/package.json +0 -21
  409. package/skills/pdf-generate/src/cli.ts +0 -162
  410. package/skills/pdf-generate/src/html.ts +0 -84
  411. package/skills/pdf-generate/src/index.ts +0 -62
  412. package/skills/pdf-generate/src/markdown.ts +0 -27
  413. package/skills/pdf-generate/src/pdf-writer.ts +0 -78
  414. package/skills/pdf-generate/src/runtime.ts +0 -34
  415. package/skills/pdf-generate/src/security.ts +0 -37
  416. package/skills/pdf-generate/src/templates.ts +0 -311
  417. package/skills/pdf-generate/src/types.ts +0 -28
  418. package/skills/pdf-generate/tsconfig.json +0 -16
  419. package/skills/pdf-to-dataset/SKILL.md +0 -88
  420. package/skills/pdf-to-dataset/package.json +0 -37
  421. package/skills/pdf-to-dataset/src/index.ts +0 -790
  422. package/skills/pdf-to-dataset/tsconfig.json +0 -17
  423. package/skills/pdf-to-markdown/SKILL.md +0 -81
  424. package/skills/pdf-to-markdown/package.json +0 -35
  425. package/skills/pdf-to-markdown/src/index.ts +0 -694
  426. package/skills/pdf-to-markdown/tsconfig.json +0 -17
  427. package/skills/performance-audit-report/SKILL.md +0 -49
  428. package/skills/performance-audit-report/package.json +0 -10
  429. package/skills/pitch-deck/SKILL.md +0 -51
  430. package/skills/pitch-deck/package.json +0 -10
  431. package/skills/product-mockup/SKILL.md +0 -107
  432. package/skills/product-mockup/package.json +0 -32
  433. package/skills/product-mockup/src/cli.ts +0 -150
  434. package/skills/product-mockup/src/design.ts +0 -151
  435. package/skills/product-mockup/src/docs.ts +0 -134
  436. package/skills/product-mockup/src/index.ts +0 -182
  437. package/skills/product-mockup/src/render.ts +0 -407
  438. package/skills/product-mockup/src/types.ts +0 -66
  439. package/skills/product-mockup/tsconfig.json +0 -17
  440. package/skills/proposal-pack/SKILL.md +0 -53
  441. package/skills/proposal-pack/package.json +0 -10
  442. package/skills/read-csv/SKILL.md +0 -62
  443. package/skills/read-csv/package.json +0 -37
  444. package/skills/read-csv/src/index.ts +0 -356
  445. package/skills/read-csv/tsconfig.json +0 -17
  446. package/skills/read-excel/SKILL.md +0 -64
  447. package/skills/read-excel/package.json +0 -36
  448. package/skills/read-excel/src/index.ts +0 -266
  449. package/skills/read-excel/tsconfig.json +0 -17
  450. package/skills/regex-tester/CLAUDE.md +0 -19
  451. package/skills/regex-tester/package.json +0 -27
  452. package/skills/regex-tester/src/index.ts +0 -183
  453. package/skills/regex-tester/tsconfig.json +0 -10
  454. package/skills/repo-onboarding-report/SKILL.md +0 -52
  455. package/skills/repo-onboarding-report/package.json +0 -10
  456. package/skills/scancommitpr/SKILL.md +0 -178
  457. package/skills/scancommitpr/package.json +0 -34
  458. package/skills/scancommitpr/src/index.ts +0 -44
  459. package/skills/scancommitpr/tsconfig.json +0 -13
  460. package/skills/scancommitpush/SKILL.md +0 -174
  461. package/skills/scancommitpush/package.json +0 -32
  462. package/skills/scancommitpush/src/index.ts +0 -44
  463. package/skills/scancommitpush/tsconfig.json +0 -13
  464. package/skills/scientific-figure-check/CLAUDE.md +0 -19
  465. package/skills/scientific-figure-check/package.json +0 -29
  466. package/skills/scientific-figure-check/src/index.ts +0 -83
  467. package/skills/scientific-figure-check/tsconfig.json +0 -10
  468. package/skills/security-audit/CLAUDE.md +0 -19
  469. package/skills/security-audit/package.json +0 -27
  470. package/skills/security-audit/src/index.ts +0 -145
  471. package/skills/security-audit/tsconfig.json +0 -10
  472. package/skills/security-audit-report/SKILL.md +0 -52
  473. package/skills/security-audit-report/package.json +0 -10
  474. package/skills/seo-content-pack/SKILL.md +0 -54
  475. package/skills/seo-content-pack/package.json +0 -10
  476. package/skills/siteanalyze/SKILL.md +0 -25
  477. package/skills/siteanalyze/package.json +0 -27
  478. package/skills/siteanalyze/src/index.ts +0 -592
  479. package/skills/slide-deck-generator/SKILL.md +0 -93
  480. package/skills/slide-deck-generator/package.json +0 -38
  481. package/skills/slide-deck-generator/src/cli.ts +0 -133
  482. package/skills/slide-deck-generator/src/index.ts +0 -148
  483. package/skills/slide-deck-generator/src/model.ts +0 -307
  484. package/skills/slide-deck-generator/src/pptx.ts +0 -143
  485. package/skills/slide-deck-generator/src/render.ts +0 -248
  486. package/skills/slide-deck-generator/src/types.ts +0 -114
  487. package/skills/slide-deck-generator/src/utils.ts +0 -53
  488. package/skills/slide-deck-generator/tsconfig.json +0 -17
  489. package/skills/social-content-calendar/SKILL.md +0 -54
  490. package/skills/social-content-calendar/package.json +0 -10
  491. package/skills/split-pdf/CLAUDE.md +0 -19
  492. package/skills/split-pdf/package.json +0 -30
  493. package/skills/split-pdf/src/index.ts +0 -301
  494. package/skills/split-pdf/tsconfig.json +0 -10
  495. package/skills/statistical-test-selector/CLAUDE.md +0 -19
  496. package/skills/statistical-test-selector/package.json +0 -27
  497. package/skills/statistical-test-selector/src/index.ts +0 -75
  498. package/skills/statistical-test-selector/tsconfig.json +0 -10
  499. package/skills/test-suite-generator/SKILL.md +0 -51
  500. package/skills/test-suite-generator/package.json +0 -10
  501. package/skills/tmux-session/SKILL.md +0 -109
  502. package/skills/tmux-session/package.json +0 -33
  503. package/skills/tmux-session/src/index.ts +0 -34
  504. package/skills/tmux-session/tsconfig.json +0 -17
  505. package/skills/todos-plan/SKILL.md +0 -363
  506. package/skills/todos-plan/agents/openai.yaml +0 -4
  507. package/skills/todos-plan/package.json +0 -9
  508. package/skills/todos-plan/src/index.ts +0 -68
  509. package/skills/tsconfig.base.json +0 -12
  510. package/skills/validate-config/CLAUDE.md +0 -19
  511. package/skills/validate-config/package.json +0 -29
  512. package/skills/validate-config/src/index.ts +0 -56
  513. package/skills/validate-config/tsconfig.json +0 -10
  514. package/skills/video-downloader/CLAUDE.md +0 -19
  515. package/skills/video-downloader/package.json +0 -29
  516. package/skills/video-downloader/src/index.ts +0 -561
  517. package/skills/video-downloader/tsconfig.json +0 -10
  518. package/skills/video-highlight-pack/SKILL.md +0 -54
  519. package/skills/video-highlight-pack/package.json +0 -10
  520. package/skills/watermark/CLAUDE.md +0 -19
  521. package/skills/watermark/package.json +0 -32
  522. package/skills/watermark/src/index.ts +0 -587
  523. package/skills/watermark/tsconfig.json +0 -10
@@ -1,592 +0,0 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * siteanalyze — Analyze any website's design system via Playwright + AI Vision
4
- * Supports multiple providers: anthropic, openai, xai, gemini
5
- */
6
- import { writeFileSync, existsSync, mkdirSync } from "fs";
7
- import { tmpdir } from "os";
8
- import { join } from "path";
9
- import {
10
- analyzeImage,
11
- detectProvider,
12
- listAvailableProviders,
13
- parseJsonResponse,
14
- type VisionProvider,
15
- } from "../../_common/vision.js";
16
-
17
- // ============================================================================
18
- // Types
19
- // ============================================================================
20
-
21
- export interface DesignColors {
22
- primary?: string;
23
- secondary?: string;
24
- accent?: string;
25
- background?: string;
26
- text?: string;
27
- border?: string;
28
- muted?: string;
29
- [key: string]: string | undefined;
30
- }
31
-
32
- export interface TypographyScale {
33
- fontFamilies: string[];
34
- sizes: string[];
35
- weights: string[];
36
- lineHeights?: string[];
37
- }
38
-
39
- export interface ComponentPattern {
40
- name: string;
41
- description: string;
42
- }
43
-
44
- export interface SiteAnalyzeResult {
45
- url: string;
46
- framework: string | null;
47
- hasShadcn: boolean;
48
- hasTailwind: boolean;
49
- colors: DesignColors;
50
- typography: TypographyScale;
51
- components: ComponentPattern[];
52
- provider: VisionProvider | null;
53
- model: string | null;
54
- openStylesProfile: {
55
- name: string;
56
- displayName: string;
57
- category: string;
58
- description: string;
59
- colors: Record<string, string>;
60
- typography: TypographyScale;
61
- framework: string | null;
62
- tags: string[];
63
- };
64
- screenshotPath?: string;
65
- rawAnalysis?: string;
66
- }
67
-
68
- // ============================================================================
69
- // HTML/CSS analysis (quick mode — no browser needed)
70
- // ============================================================================
71
-
72
- async function fetchPageSource(url: string): Promise<string> {
73
- const response = await fetch(url, {
74
- headers: {
75
- "User-Agent":
76
- "Mozilla/5.0 (compatible; siteanalyze/1.0; +https://github.com/hasna/skills)",
77
- },
78
- });
79
- if (!response.ok) {
80
- throw new Error(`Failed to fetch ${url}: ${response.status} ${response.statusText}`);
81
- }
82
- return response.text();
83
- }
84
-
85
- function detectFrameworkFromHtml(html: string): {
86
- hasShadcn: boolean;
87
- hasTailwind: boolean;
88
- framework: string | null;
89
- } {
90
- const lower = html.toLowerCase();
91
- const hasShadcn =
92
- lower.includes("shadcn") ||
93
- lower.includes("@radix-ui") ||
94
- lower.includes("radix-ui") ||
95
- lower.includes("cmdk") ||
96
- lower.includes("data-radix");
97
- const hasTailwind =
98
- lower.includes("tailwind") ||
99
- lower.includes("tw-") ||
100
- /class="[^"]*\b(flex|grid|p-\d|m-\d|text-\w+|bg-\w+|border-\w+)\b/.test(html);
101
-
102
- let framework: string | null = null;
103
- if (hasShadcn) {
104
- framework = "shadcn/ui";
105
- } else if (lower.includes("mui") || lower.includes("material-ui")) {
106
- framework = "Material UI";
107
- } else if (lower.includes("chakra")) {
108
- framework = "Chakra UI";
109
- } else if (lower.includes("mantine")) {
110
- framework = "Mantine";
111
- } else if (lower.includes("antd") || lower.includes("ant-design")) {
112
- framework = "Ant Design";
113
- } else if (lower.includes("bootstrap")) {
114
- framework = "Bootstrap";
115
- } else if (hasTailwind) {
116
- framework = "Tailwind CSS";
117
- }
118
-
119
- return { hasShadcn, hasTailwind, framework };
120
- }
121
-
122
- function extractColorsFromCss(html: string): DesignColors {
123
- const colors: DesignColors = {};
124
- const hexPattern = /#([0-9A-Fa-f]{3,8})\b/g;
125
- const cssVarPattern = /--[\w-]+:\s*(#[0-9A-Fa-f]{3,8}|rgba?\([^)]+\)|hsla?\([^)]+\))/g;
126
-
127
- // Try to extract CSS custom properties (most reliable)
128
- const varMatches = [...html.matchAll(cssVarPattern)].slice(0, 20);
129
- if (varMatches.length > 0) {
130
- for (const match of varMatches) {
131
- const varName = match[0].split(":")[0].trim();
132
- const value = match[1].trim();
133
- if (varName.includes("primary")) colors.primary = value;
134
- else if (varName.includes("secondary")) colors.secondary = value;
135
- else if (varName.includes("accent")) colors.accent = value;
136
- else if (varName.includes("background") || varName.includes("bg")) colors.background = value;
137
- else if (varName.includes("foreground") || varName.includes("text")) colors.text = value;
138
- else if (varName.includes("border")) colors.border = value;
139
- else if (varName.includes("muted")) colors.muted = value;
140
- }
141
- }
142
-
143
- // Fall back to raw hex extraction from inline styles
144
- if (Object.keys(colors).length === 0) {
145
- const hexMatches = [...html.matchAll(hexPattern)].map((m) => m[0]);
146
- const unique = [...new Set(hexMatches)].slice(0, 5);
147
- if (unique[0]) colors.primary = unique[0];
148
- if (unique[1]) colors.secondary = unique[1];
149
- if (unique[2]) colors.accent = unique[2];
150
- }
151
-
152
- return colors;
153
- }
154
-
155
- // ============================================================================
156
- // Vision-based analysis
157
- // ============================================================================
158
-
159
- async function captureScreenshot(url: string): Promise<string | null> {
160
- // Try to use playwright if available
161
- try {
162
- // Dynamic import so the skill works without playwright installed
163
- const { chromium } = await import("playwright" as never) as {
164
- chromium: {
165
- launch: (opts?: Record<string, unknown>) => Promise<{
166
- newPage: () => Promise<{
167
- goto: (url: string, opts?: Record<string, unknown>) => Promise<unknown>;
168
- screenshot: (opts?: Record<string, unknown>) => Promise<Buffer>;
169
- close: () => Promise<void>;
170
- }>;
171
- close: () => Promise<void>;
172
- }>;
173
- };
174
- };
175
-
176
- const tmpDir = join(tmpdir(), "siteanalyze");
177
- if (!existsSync(tmpDir)) {
178
- mkdirSync(tmpDir, { recursive: true });
179
- }
180
- const screenshotPath = join(tmpDir, `screenshot-${Date.now()}.png`);
181
-
182
- const browser = await chromium.launch({ headless: true });
183
- const page = await browser.newPage();
184
- await page.goto(url, { waitUntil: "networkidle", timeout: 30000 });
185
- const buffer = await page.screenshot({ path: screenshotPath, fullPage: false });
186
- await page.close();
187
- await browser.close();
188
-
189
- return screenshotPath;
190
- } catch {
191
- return null;
192
- }
193
- }
194
-
195
- async function analyzeScreenshot(
196
- screenshotPath: string,
197
- url: string,
198
- options: { provider?: VisionProvider; model?: string }
199
- ): Promise<{
200
- colors: DesignColors;
201
- typography: TypographyScale;
202
- components: ComponentPattern[];
203
- styleCategory: string;
204
- description: string;
205
- rawAnalysis: string;
206
- provider: VisionProvider;
207
- model: string;
208
- }> {
209
- const { readFileSync } = await import("fs");
210
- const imageBase64 = readFileSync(screenshotPath).toString("base64");
211
-
212
- const prompt = `Analyze this website screenshot from ${url}.
213
-
214
- Extract:
215
- 1. Color palette — primary, secondary, accent, background, text, border, muted colors (hex values)
216
- 2. Typography — font families used, size scale, font weights
217
- 3. UI components — list the main component patterns you see (buttons, cards, nav, etc.)
218
- 4. Design style category (minimalist/corporate/startup/editorial/material/glassmorphism/brutalist/neubrutalism)
219
- 5. Brief description of the overall design system
220
-
221
- Respond ONLY with valid JSON:
222
- {
223
- "colors": {
224
- "primary": "#...",
225
- "secondary": "#...",
226
- "accent": "#...",
227
- "background": "#...",
228
- "text": "#...",
229
- "border": "#...",
230
- "muted": "#..."
231
- },
232
- "typography": {
233
- "fontFamilies": ["..."],
234
- "sizes": ["xs", "sm", "base", "lg", "xl", "2xl"],
235
- "weights": ["400", "500", "600", "700"]
236
- },
237
- "components": [
238
- { "name": "Button", "description": "Rounded pill buttons with primary color fill" }
239
- ],
240
- "styleCategory": "minimalist",
241
- "description": "..."
242
- }`;
243
-
244
- const result = await analyzeImage(imageBase64, "image/png", prompt, {
245
- provider: options.provider,
246
- model: options.model,
247
- jsonMode: true,
248
- maxTokens: 2048,
249
- });
250
-
251
- const parsed = parseJsonResponse(result.text) as {
252
- colors: DesignColors;
253
- typography: TypographyScale;
254
- components: ComponentPattern[];
255
- styleCategory: string;
256
- description: string;
257
- };
258
-
259
- return {
260
- colors: parsed.colors ?? {},
261
- typography: parsed.typography ?? { fontFamilies: [], sizes: [], weights: [] },
262
- components: parsed.components ?? [],
263
- styleCategory: parsed.styleCategory ?? "unknown",
264
- description: parsed.description ?? "",
265
- rawAnalysis: result.text,
266
- provider: result.provider,
267
- model: result.model,
268
- };
269
- }
270
-
271
- // ============================================================================
272
- // Core analysis function
273
- // ============================================================================
274
-
275
- export async function analyzeSite(
276
- url: string,
277
- options?: {
278
- provider?: VisionProvider;
279
- model?: string;
280
- quickMode?: boolean; // skip screenshot/vision — HTML analysis only
281
- }
282
- ): Promise<SiteAnalyzeResult> {
283
- // Fetch HTML for framework/color detection
284
- const html = await fetchPageSource(url);
285
- const { hasShadcn, hasTailwind, framework } = detectFrameworkFromHtml(html);
286
- const quickColors = extractColorsFromCss(html);
287
-
288
- const availableProviders = listAvailableProviders();
289
- const useVision = !options?.quickMode && availableProviders.length > 0;
290
-
291
- if (!useVision) {
292
- // Quick mode or no provider available — return HTML analysis only
293
- return {
294
- url,
295
- framework,
296
- hasShadcn,
297
- hasTailwind,
298
- colors: quickColors,
299
- typography: { fontFamilies: [], sizes: [], weights: [] },
300
- components: [],
301
- provider: null,
302
- model: null,
303
- openStylesProfile: {
304
- name: `site-${Date.now()}`,
305
- displayName: url,
306
- category: framework ?? "Unknown",
307
- description: `Design system extracted from ${url} (HTML analysis only)`,
308
- colors: quickColors as Record<string, string>,
309
- typography: { fontFamilies: [], sizes: [], weights: [] },
310
- framework,
311
- tags: [
312
- "extracted",
313
- "auto-generated",
314
- ...(hasShadcn ? ["shadcn"] : []),
315
- ...(hasTailwind ? ["tailwind"] : []),
316
- ],
317
- },
318
- };
319
- }
320
-
321
- // Vision-based analysis
322
- const screenshotPath = await captureScreenshot(url);
323
- let visionResult: Awaited<ReturnType<typeof analyzeScreenshot>> | null = null;
324
-
325
- if (screenshotPath) {
326
- visionResult = await analyzeScreenshot(screenshotPath, url, {
327
- provider: options?.provider,
328
- model: options?.model,
329
- });
330
- }
331
-
332
- const colors = visionResult?.colors ?? quickColors;
333
- const typography = visionResult?.typography ?? { fontFamilies: [], sizes: [], weights: [] };
334
- const components = visionResult?.components ?? [];
335
- const styleCategory = visionResult?.styleCategory ?? framework ?? "Unknown";
336
- const description =
337
- visionResult?.description ??
338
- `Design system extracted from ${url}`;
339
-
340
- return {
341
- url,
342
- framework,
343
- hasShadcn,
344
- hasTailwind,
345
- colors,
346
- typography,
347
- components,
348
- provider: visionResult?.provider ?? null,
349
- model: visionResult?.model ?? null,
350
- screenshotPath: screenshotPath ?? undefined,
351
- rawAnalysis: visionResult?.rawAnalysis,
352
- openStylesProfile: {
353
- name: `site-${Date.now()}`,
354
- displayName: url,
355
- category: styleCategory,
356
- description,
357
- colors: colors as Record<string, string>,
358
- typography,
359
- framework,
360
- tags: [
361
- "extracted",
362
- "auto-generated",
363
- ...(hasShadcn ? ["shadcn"] : []),
364
- ...(hasTailwind ? ["tailwind"] : []),
365
- ],
366
- },
367
- };
368
- }
369
-
370
- // ============================================================================
371
- // CLI
372
- // ============================================================================
373
-
374
- type OutputFormat = "profile" | "colors" | "full";
375
-
376
- interface CliOptions {
377
- url: string | null;
378
- format: OutputFormat;
379
- output: string | null;
380
- provider: VisionProvider | null;
381
- model: string | null;
382
- quickMode: boolean;
383
- }
384
-
385
- function parseArgs(argv: string[]): { command: string; options: CliOptions } {
386
- const args = argv.slice(2);
387
-
388
- let command = "help";
389
- const options: CliOptions = {
390
- url: null,
391
- format: "full",
392
- output: null,
393
- provider: null,
394
- model: null,
395
- quickMode: false,
396
- };
397
-
398
- if (args.length === 0) {
399
- return { command: "help", options };
400
- }
401
-
402
- const firstArg = args[0];
403
- if (firstArg === "analyze") {
404
- command = "analyze";
405
- } else if (
406
- firstArg === "help" ||
407
- firstArg === "--help" ||
408
- firstArg === "-h"
409
- ) {
410
- command = "help";
411
- } else if (firstArg.startsWith("http://") || firstArg.startsWith("https://")) {
412
- // Allow `siteanalyze <url>` shorthand
413
- command = "analyze";
414
- options.url = firstArg;
415
- args.splice(0, 1);
416
- // Re-parse remaining flags below (shift args[0] already used)
417
- for (let i = 0; i < args.length; i++) {
418
- const arg = args[i];
419
- if ((arg === "--format" || arg === "-f") && args[i + 1]) {
420
- const fmt = args[++i];
421
- if (fmt === "profile" || fmt === "colors" || fmt === "full") {
422
- options.format = fmt;
423
- }
424
- } else if ((arg === "--output" || arg === "-o") && args[i + 1]) {
425
- options.output = args[++i];
426
- } else if (arg === "--provider" && args[i + 1]) {
427
- const p = args[++i] as VisionProvider;
428
- if (["anthropic", "openai", "xai", "gemini"].includes(p)) options.provider = p;
429
- } else if (arg === "--model" && args[i + 1]) {
430
- options.model = args[++i];
431
- } else if (arg === "--quick") {
432
- options.quickMode = true;
433
- }
434
- }
435
- return { command, options };
436
- } else {
437
- command = "help";
438
- }
439
-
440
- for (let i = 1; i < args.length; i++) {
441
- const arg = args[i];
442
- if ((arg === "--url" || arg === "-u") && args[i + 1]) {
443
- options.url = args[++i];
444
- } else if ((arg === "--format" || arg === "-f") && args[i + 1]) {
445
- const fmt = args[++i];
446
- if (fmt === "profile" || fmt === "colors" || fmt === "full") {
447
- options.format = fmt;
448
- } else {
449
- console.error(`Invalid format: ${fmt}. Use: profile, colors, full`);
450
- process.exit(1);
451
- }
452
- } else if ((arg === "--output" || arg === "-o") && args[i + 1]) {
453
- options.output = args[++i];
454
- } else if (arg === "--provider" && args[i + 1]) {
455
- const p = args[++i] as VisionProvider;
456
- if (["anthropic", "openai", "xai", "gemini"].includes(p)) {
457
- options.provider = p;
458
- } else {
459
- console.error(`Invalid provider: ${p}. Use: anthropic, openai, xai, gemini`);
460
- process.exit(1);
461
- }
462
- } else if (arg === "--model" && args[i + 1]) {
463
- options.model = args[++i];
464
- } else if (arg === "--quick") {
465
- options.quickMode = true;
466
- }
467
- }
468
-
469
- return { command, options };
470
- }
471
-
472
- function printHelp(): void {
473
- const available = listAvailableProviders();
474
- console.log(`
475
- siteanalyze — Analyze any website's design system via Playwright + AI Vision
476
-
477
- USAGE
478
- siteanalyze <url> [options]
479
- siteanalyze analyze --url <url> [options]
480
- siteanalyze help
481
-
482
- COMMANDS
483
- analyze Analyze a website's design system (default when URL is given)
484
- help Show this help message
485
-
486
- OPTIONS
487
- --url, -u <url> Website URL to analyze (required)
488
- --format, -f <format> Output format: profile | colors | full (default: full)
489
- --output, -o <file> Write JSON result to file instead of stdout
490
- --provider <name> AI provider: anthropic | openai | xai | gemini (auto-detected)
491
- --model <name> Model override (uses provider default if not set)
492
- --quick Skip AI vision analysis — HTML/CSS analysis only
493
-
494
- FORMATS
495
- profile Print only the open-styles compatible profile object
496
- colors Print only the extracted colors
497
- full Print the complete analysis result (default)
498
-
499
- EXAMPLES
500
- siteanalyze https://vercel.com
501
- siteanalyze https://stripe.com --format profile
502
- siteanalyze https://tailwindcss.com --provider openai
503
- siteanalyze https://shadcn.com --quick
504
- siteanalyze analyze --url https://example.com --output ./profile.json
505
-
506
- ENVIRONMENT
507
- ANTHROPIC_API_KEY Claude API key (anthropic provider)
508
- OPENAI_API_KEY OpenAI API key (openai provider)
509
- XAI_API_KEY xAI API key (xai provider)
510
- GEMINI_API_KEY Google Gemini API key (gemini provider)
511
-
512
- AVAILABLE PROVIDERS
513
- ${available.length > 0 ? available.join(", ") : "(none — set an API key for vision analysis, or use --quick)"}
514
- `);
515
- }
516
-
517
- async function main(): Promise<void> {
518
- const { command, options } = parseArgs(process.argv);
519
-
520
- if (command === "help") {
521
- printHelp();
522
- process.exit(0);
523
- }
524
-
525
- if (command === "analyze") {
526
- if (!options.url) {
527
- console.error("Error: URL is required.");
528
- console.error(
529
- "Run `siteanalyze help` for usage."
530
- );
531
- process.exit(1);
532
- }
533
-
534
- const available = listAvailableProviders();
535
- if (!options.quickMode && available.length === 0) {
536
- console.warn(
537
- "Warning: No AI provider API key found — running in quick mode (HTML analysis only)."
538
- );
539
- console.warn(
540
- "Set ANTHROPIC_API_KEY, OPENAI_API_KEY, XAI_API_KEY, or GEMINI_API_KEY for visual analysis."
541
- );
542
- options.quickMode = true;
543
- }
544
-
545
- try {
546
- console.error(`Analyzing ${options.url}...`);
547
-
548
- const result = await analyzeSite(options.url, {
549
- provider: options.provider ?? undefined,
550
- model: options.model ?? undefined,
551
- quickMode: options.quickMode,
552
- });
553
-
554
- let output: unknown;
555
- if (options.format === "colors") {
556
- output = result.colors;
557
- } else if (options.format === "profile") {
558
- output = result.openStylesProfile;
559
- } else {
560
- output = {
561
- url: result.url,
562
- framework: result.framework,
563
- hasShadcn: result.hasShadcn,
564
- hasTailwind: result.hasTailwind,
565
- colors: result.colors,
566
- typography: result.typography,
567
- components: result.components,
568
- provider: result.provider,
569
- model: result.model,
570
- openStylesProfile: result.openStylesProfile,
571
- };
572
- }
573
-
574
- const json = JSON.stringify(output, null, 2);
575
-
576
- if (options.output) {
577
- writeFileSync(options.output, json, "utf-8");
578
- console.error(`Result written to: ${options.output}`);
579
- } else {
580
- console.log(json);
581
- }
582
- } catch (error) {
583
- console.error(
584
- "Error:",
585
- error instanceof Error ? error.message : String(error)
586
- );
587
- process.exit(1);
588
- }
589
- }
590
- }
591
-
592
- main();
@@ -1,93 +0,0 @@
1
- ---
2
- name: slide-deck-generator
3
- description: Turn a brief or Markdown outline into a real slide deck locally - structured slides.json, deck.md, speaker notes, theme guide, a self-contained keyboard-navigable HTML deck, and a PPTX file.
4
- ---
5
-
6
- # Slide Deck Generator
7
-
8
- Parse a brief, outline, report, or product narrative into a slide model, then render it to several
9
- formats at once. This is the local binary renderer: it does the deterministic parsing, layout, and
10
- file writing so no model call is needed to produce the artifacts.
11
-
12
- `pitch-deck` is an instruction skill that decides the narrative and then delegates the actual
13
- rendering to this skill. Anything that needs a real `.pptx` or a shareable HTML deck should call
14
- `slide-deck-generator`.
15
-
16
- Everything runs locally. No API keys, no network calls, no accounts.
17
-
18
- ## Requirements
19
-
20
- - [Bun](https://bun.sh) 1.1+.
21
- - `bun install` inside this skill directory. Runtime dependencies:
22
- - `marked` — Markdown tokenizing for `--source` outlines.
23
- - `pptxgenjs` — writes the real `deck.pptx` (Open XML zip package).
24
- - No API keys and no network access. `deck.html` embeds all CSS and JS inline and makes zero
25
- external requests.
26
-
27
- ## Usage
28
-
29
- ```bash
30
- # From a Markdown outline
31
- bun run src/index.ts --source ./outline.md --slides 10 --theme aurora \
32
- --audience executives --format report --output ./out
33
-
34
- # From a one-paragraph brief
35
- bun run src/index.ts --brief "Q2 launch review for AI billing" --slides 8 --theme midnight
36
-
37
- # Skip PPTX rendering, emit machine-readable manifest
38
- bun run src/index.ts --source ./outline.md --no-pptx --json
39
- ```
40
-
41
- Open `out/deck.html` in any browser: `←`/`→` (or space) to navigate, `Home`/`End` to jump, `N` to
42
- toggle speaker notes, `Ctrl/Cmd-P` to print one slide per page.
43
-
44
- ### Markdown parsing rules
45
-
46
- - The first `#` heading becomes the deck title (unless `--title` is given).
47
- - Each `#`/`##` heading starts a new slide; `###` headings become bullets.
48
- - List items become bullets; paragraphs become speaker notes (and become bullets when a slide would
49
- otherwise be empty); blockquotes become full-bleed quote slides; the first lines of a code block
50
- become bullets.
51
- - Plain prose with no Markdown structure is split into sentences and grouped into slides.
52
- - The deck is then fitted to `--slides`: dense slides split into `(cont.)` slides, short adjacent
53
- slides merge, and any remaining gap is filled with format-appropriate scaffold slides.
54
-
55
- ## Options
56
-
57
- | Option | Description | Default |
58
- |--------|-------------|---------|
59
- | `-b, --brief <text>` | Brief, outline, or narrative text. Also accepted as a bare positional argument. | — |
60
- | `-s, --source <path>` | Read the brief/outline from a Markdown or text file. | — |
61
- | `-t, --title <text>` | Deck title. | first `#` heading, else first line of the brief |
62
- | `-n, --slides <n>` | Target slide count (1–60). | `8` |
63
- | `--theme <name>` | `midnight`, `aurora`, `sandstone`, `ocean`, or `mono`. | `midnight` |
64
- | `--audience <type>` | `team`, `customers`, `executives`, or `students`. Shapes the speaker notes. | `team` |
65
- | `--format <type>` | `general`, `training`, `sales`, `report`, or `proposal`. Shapes the closing slides. | `general` |
66
- | `-o, --output <dir>` | Output directory. | `./slide-deck` |
67
- | `--no-pptx` | Skip `deck.pptx`; still write every other file. | off |
68
- | `--json` | Print `manifest.json` to stdout instead of the text summary. | off |
69
- | `-h, --help` | Show help. | — |
70
- | `-v, --version` | Show version. | — |
71
-
72
- Either `--brief` or `--source` is required.
73
-
74
- ## Outputs
75
-
76
- Written under `--output`:
77
-
78
- | File | Contents |
79
- |------|----------|
80
- | `slides.json` | The slide model: index, layout (`title`/`agenda`/`bullets`/`section`/`quote`/`closing`), title, subtitle, bullets, and notes per slide. |
81
- | `deck.md` | Readable Markdown deck, one `---` separated section per slide with inline notes. |
82
- | `speaker-notes.md` | Per-slide talk track, on-screen recap, runtime estimate, and a delivery checklist. |
83
- | `theme-guide.md` | Palette hex values, typography scale, layout rules, and how to swap themes. |
84
- | `deck.html` | Self-contained reveal-style deck: inline CSS/JS, keyboard + click navigation, progress bar, notes toggle, and a print stylesheet that paginates one slide per page. No external requests. |
85
- | `deck.pptx` | Real PowerPoint file written by `pptxgenjs` (16:9), including per-slide speaker notes. Opens in PowerPoint, Keynote, LibreOffice, and Google Slides. |
86
- | `manifest.json` | Run metadata: title, source, theme, audience, format, slide count, layouts, and file list. |
87
-
88
- ## Notes
89
-
90
- - PPTX rendering failures are non-fatal: the other files are still written, a warning goes to
91
- stderr, and `manifest.json` records `pptx: "failed: …"`.
92
- - Scaffold slides added to reach `--slides` are labelled in their notes so they are easy to find and
93
- replace before presenting.