@hasna/skills 0.1.62 → 0.1.64

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 (541) hide show
  1. package/README.md +38 -12
  2. package/bin/index.js +15743 -21709
  3. package/bin/mcp.js +3866 -11522
  4. package/bin/migrate.js +281 -35
  5. package/bin/server.js +5805 -2682
  6. package/bin/worker.js +5280 -2388
  7. package/dist/cli/commands/publish.d.ts +2 -0
  8. package/dist/cli/commands/registry-reconcile.d.ts +2 -0
  9. package/dist/cli/components/App.d.ts +2 -1
  10. package/dist/cli/components/CategorySelect.d.ts +2 -1
  11. package/dist/cli/components/Header.d.ts +2 -1
  12. package/dist/cli/components/InstallProgress.d.ts +2 -1
  13. package/dist/cli/components/SearchView.d.ts +2 -1
  14. package/dist/cli/components/SkillSelect.d.ts +2 -1
  15. package/dist/index.d.ts +5 -2
  16. package/dist/index.js +5386 -13739
  17. package/dist/lib/agent-sync.d.ts +61 -6
  18. package/dist/lib/auth-store.d.ts +37 -0
  19. package/dist/lib/config.d.ts +51 -0
  20. package/dist/lib/home-adoption.d.ts +91 -0
  21. package/dist/lib/home-census.d.ts +26 -0
  22. package/dist/lib/home-migration.d.ts +60 -0
  23. package/dist/lib/native-storage.d.ts +1 -1
  24. package/dist/lib/portable-skills-files.d.ts +21 -1
  25. package/dist/lib/portable-skills-types.d.ts +46 -0
  26. package/dist/lib/portable-skills.d.ts +35 -6
  27. package/dist/lib/pull.d.ts +97 -0
  28. package/dist/lib/registry-reconcile.d.ts +114 -0
  29. package/dist/lib/registry.d.ts +7 -4
  30. package/dist/lib/remote-client.d.ts +124 -1
  31. package/dist/lib/remote-registry.d.ts +26 -0
  32. package/dist/lib/revision.d.ts +29 -0
  33. package/dist/lib/run-state.d.ts +5 -0
  34. package/dist/lib/skill-bundles.d.ts +54 -0
  35. package/dist/lib/skill-contract.d.ts +35 -0
  36. package/dist/lib/skill-hash.d.ts +77 -0
  37. package/dist/sdk/cancel.d.ts +30 -0
  38. package/dist/sdk/dispatcher.d.ts +40 -0
  39. package/dist/sdk/event-sink.d.ts +2 -0
  40. package/dist/sdk/events.d.ts +79 -0
  41. package/dist/sdk/execution/admission.d.ts +44 -0
  42. package/dist/sdk/execution/dispatchers/e2b.d.ts +17 -0
  43. package/dist/sdk/execution/dispatchers/ecs.d.ts +151 -0
  44. package/dist/sdk/execution/image-profile.d.ts +73 -0
  45. package/dist/sdk/execution/index.d.ts +15 -0
  46. package/dist/sdk/execution/receipts.d.ts +44 -0
  47. package/dist/sdk/execution/state-machine.d.ts +38 -0
  48. package/dist/sdk/execution/storage.d.ts +158 -0
  49. package/dist/sdk/execution/types.d.ts +130 -0
  50. package/dist/sdk/executor.d.ts +17 -0
  51. package/dist/sdk/governance-store.d.ts +156 -0
  52. package/dist/sdk/governance.d.ts +92 -0
  53. package/dist/sdk/index.d.ts +26 -0
  54. package/dist/sdk/index.js +49728 -0
  55. package/dist/sdk/offline.d.ts +16 -0
  56. package/dist/sdk/outputs.d.ts +71 -0
  57. package/dist/sdk/registry.d.ts +28 -0
  58. package/dist/sdk/runs.d.ts +229 -0
  59. package/dist/sdk/server.d.ts +35 -0
  60. package/dist/sdk/spend.d.ts +36 -0
  61. package/dist/sdk/storage.d.ts +25 -0
  62. package/dist/server/app.d.ts +42 -0
  63. package/dist/server/artifact-storage.d.ts +102 -0
  64. package/dist/server/auth.d.ts +5 -0
  65. package/dist/server/config.d.ts +50 -0
  66. package/dist/server/database-url.d.ts +42 -0
  67. package/dist/server/handlers.d.ts +3 -0
  68. package/dist/server/index.d.ts +2 -0
  69. package/dist/server/migrate.d.ts +13 -0
  70. package/dist/server/migrations-dir.d.ts +18 -0
  71. package/dist/server/redaction.d.ts +1 -0
  72. package/dist/server/registry.d.ts +5 -0
  73. package/dist/server/rows.d.ts +24 -0
  74. package/dist/server/skills-api.d.ts +170 -0
  75. package/dist/server/sqlite-store.d.ts +131 -0
  76. package/dist/server/store-fixtures.d.ts +25 -0
  77. package/dist/server/store.d.ts +170 -0
  78. package/dist/server/types.d.ts +337 -0
  79. package/dist/server/worker.d.ts +4 -0
  80. package/dist/storage.js +39 -2
  81. package/docs/skill-standard.md +211 -39
  82. package/migrations/postgres/0003_run_outputs_governance.sql +83 -0
  83. package/migrations/postgres/0004_hosted_pins.sql +28 -0
  84. package/migrations/postgres/0005_revision_tombstone_registry.sql +37 -0
  85. package/migrations/postgres/0005_tag_projection.sql +36 -0
  86. package/migrations/sqlite/0003_run_outputs_governance.sql +58 -0
  87. package/migrations/sqlite/0004_hosted_pins.sql +21 -0
  88. package/migrations/sqlite/0005_revision_tombstone_registry.sql +18 -0
  89. package/migrations/sqlite/0005_tag_projection.sql +25 -0
  90. package/package.json +12 -8
  91. package/schemas/skill.schema.json +181 -0
  92. package/agent-skills/README.md +0 -41
  93. package/agent-skills/fleet-package-rollout/SKILL.md +0 -169
  94. package/agent-skills/inbox/SKILL.md +0 -25
  95. package/agent-skills/inbox/scripts/inbox +0 -109
  96. package/agent-skills/inbox/tests/test_registered_sender_id.sh +0 -92
  97. package/agent-skills/inbox-monitor/SKILL.md +0 -41
  98. package/agent-skills/inbox-monitor/scripts/inbox_monitor.sh +0 -91
  99. package/agent-skills/inbox-monitor/scripts/test_inbox_monitor.sh +0 -71
  100. package/agent-skills/merge-pr/SKILL.md +0 -85
  101. package/agent-skills/merge-pr/references/merge-safety.md +0 -82
  102. package/agent-skills/merge-pr/scripts/merge_pr_guard.py +0 -694
  103. package/agent-skills/merge-pr/scripts/test_merge_pr_guard.py +0 -647
  104. package/agent-skills/merge-pr/tests/fixtures/multi-commit-synthesized.json +0 -28
  105. package/agent-skills/merge-pr/tests/fixtures/trailer-free-provider.json +0 -28
  106. package/agent-skills/skill-goal-execute/SKILL.md +0 -115
  107. package/agent-skills/skill-login/SKILL.md +0 -109
  108. package/agent-skills/skill-project-create/SKILL.md +0 -91
  109. package/agent-skills/skill-publish/SKILL.md +0 -254
  110. package/agent-skills/skill-publish/scripts/capture_registry.js +0 -47
  111. package/agent-skills/skill-publish/scripts/publish_with_git_head.sh +0 -143
  112. package/agent-skills/skill-publish/scripts/test_publish_with_git_head.sh +0 -231
  113. package/skills/_common/auth.ts +0 -45
  114. package/skills/_common/http-client.ts +0 -143
  115. package/skills/_common/index.ts +0 -26
  116. package/skills/_common/install.sh +0 -7
  117. package/skills/_common/installer.ts +0 -72
  118. package/skills/_common/skill-install.ts +0 -37
  119. package/skills/_common/vision.ts +0 -374
  120. package/skills/ad-creative-pack/SKILL.md +0 -55
  121. package/skills/ad-creative-pack/package.json +0 -10
  122. package/skills/analyze-data/CLAUDE.md +0 -16
  123. package/skills/analyze-data/SKILL.md +0 -112
  124. package/skills/analyze-data/package.json +0 -23
  125. package/skills/analyze-data/src/analysis.ts +0 -401
  126. package/skills/analyze-data/src/cli.ts +0 -66
  127. package/skills/analyze-data/src/formatters.ts +0 -235
  128. package/skills/analyze-data/src/index.ts +0 -74
  129. package/skills/analyze-data/src/logger.ts +0 -36
  130. package/skills/analyze-data/src/parsers.ts +0 -57
  131. package/skills/analyze-data/src/stats.ts +0 -151
  132. package/skills/analyze-data/src/types.ts +0 -85
  133. package/skills/analyze-data/tsconfig.json +0 -19
  134. package/skills/api-docs-portal/SKILL.md +0 -84
  135. package/skills/api-docs-portal/package.json +0 -35
  136. package/skills/api-docs-portal/src/index.ts +0 -919
  137. package/skills/api-docs-portal/tsconfig.json +0 -17
  138. package/skills/api-test-suite/CLAUDE.md +0 -19
  139. package/skills/api-test-suite/package.json +0 -27
  140. package/skills/api-test-suite/src/index.ts +0 -381
  141. package/skills/api-test-suite/tsconfig.json +0 -10
  142. package/skills/audio-extract/CLAUDE.md +0 -9
  143. package/skills/audio-extract/SKILL.md +0 -73
  144. package/skills/audio-extract/package.json +0 -23
  145. package/skills/audio-extract/src/index.ts +0 -323
  146. package/skills/audio-extract/tsconfig.json +0 -11
  147. package/skills/bio-sequence-tool/CLAUDE.md +0 -19
  148. package/skills/bio-sequence-tool/package.json +0 -27
  149. package/skills/bio-sequence-tool/src/index.ts +0 -85
  150. package/skills/bio-sequence-tool/tsconfig.json +0 -10
  151. package/skills/blog-article/CLAUDE.md +0 -12
  152. package/skills/blog-article/SKILL.md +0 -55
  153. package/skills/blog-article/package.json +0 -10
  154. package/skills/blog-article/tsconfig.json +0 -10
  155. package/skills/brand-assets/SKILL.md +0 -118
  156. package/skills/brand-assets/package.json +0 -35
  157. package/skills/brand-assets/src/cli.ts +0 -155
  158. package/skills/brand-assets/src/constants.ts +0 -8
  159. package/skills/brand-assets/src/extract.ts +0 -236
  160. package/skills/brand-assets/src/index.ts +0 -668
  161. package/skills/brand-assets/src/types.ts +0 -59
  162. package/skills/brand-assets/tsconfig.json +0 -17
  163. package/skills/brand-kit/SKILL.md +0 -54
  164. package/skills/brand-kit/package.json +0 -10
  165. package/skills/businessactivity/CLAUDE.md +0 -176
  166. package/skills/businessactivity/LICENSE +0 -192
  167. package/skills/businessactivity/README.md +0 -287
  168. package/skills/businessactivity/package.json +0 -25
  169. package/skills/businessactivity/scripts/publish.ts +0 -210
  170. package/skills/businessactivity/src/commands/activity.ts +0 -211
  171. package/skills/businessactivity/src/commands/function.ts +0 -227
  172. package/skills/businessactivity/src/commands/owner.ts +0 -193
  173. package/skills/businessactivity/src/commands/profile.ts +0 -121
  174. package/skills/businessactivity/src/commands/responsibility.ts +0 -264
  175. package/skills/businessactivity/src/commands/team.ts +0 -244
  176. package/skills/businessactivity/src/commands/workflow.ts +0 -359
  177. package/skills/businessactivity/src/index.ts +0 -3
  178. package/skills/businessactivity/src/lib/config.ts +0 -167
  179. package/skills/businessactivity/src/lib/output.ts +0 -76
  180. package/skills/businessactivity/src/lib/paths.ts +0 -79
  181. package/skills/businessactivity/src/lib/storage.ts +0 -95
  182. package/skills/businessactivity/src/types/index.ts +0 -86
  183. package/skills/businessactivity/tsconfig.json +0 -29
  184. package/skills/codefix/LICENSE +0 -192
  185. package/skills/codefix/README.md +0 -232
  186. package/skills/codefix/SKILL.md +0 -94
  187. package/skills/codefix/package.json +0 -21
  188. package/skills/codefix/src/fixers/batch.ts +0 -213
  189. package/skills/codefix/src/fixers/detector.ts +0 -160
  190. package/skills/codefix/src/fixers/index.ts +0 -7
  191. package/skills/codefix/src/fixers/runner.ts +0 -522
  192. package/skills/codefix/src/index-local.ts +0 -431
  193. package/skills/codefix/src/index.ts +0 -4
  194. package/skills/codefix/src/types.ts +0 -211
  195. package/skills/codefix/tsconfig.json +0 -15
  196. package/skills/commitpush/SKILL.md +0 -57
  197. package/skills/commitpush/package.json +0 -33
  198. package/skills/commitpush/src/index.ts +0 -34
  199. package/skills/commitpush/tsconfig.json +0 -17
  200. package/skills/commitpushpr/SKILL.md +0 -55
  201. package/skills/commitpushpr/package.json +0 -33
  202. package/skills/commitpushpr/src/index.ts +0 -34
  203. package/skills/commitpushpr/tsconfig.json +0 -17
  204. package/skills/compress-video/CLAUDE.md +0 -9
  205. package/skills/compress-video/SKILL.md +0 -79
  206. package/skills/compress-video/package.json +0 -23
  207. package/skills/compress-video/src/index.ts +0 -473
  208. package/skills/compress-video/tsconfig.json +0 -11
  209. package/skills/contract-review-report/SKILL.md +0 -52
  210. package/skills/contract-review-report/package.json +0 -10
  211. package/skills/customer-feedback-report/SKILL.md +0 -52
  212. package/skills/customer-feedback-report/package.json +0 -10
  213. package/skills/dashboard-builder/CLAUDE.md +0 -19
  214. package/skills/dashboard-builder/package.json +0 -29
  215. package/skills/dashboard-builder/src/index.ts +0 -150
  216. package/skills/dashboard-builder/tsconfig.json +0 -10
  217. package/skills/data-anonymizer/CLAUDE.md +0 -19
  218. package/skills/data-anonymizer/package.json +0 -27
  219. package/skills/data-anonymizer/src/index.ts +0 -183
  220. package/skills/data-anonymizer/tsconfig.json +0 -10
  221. package/skills/database-explorer/CLAUDE.md +0 -19
  222. package/skills/database-explorer/package.json +0 -29
  223. package/skills/database-explorer/src/index.ts +0 -95
  224. package/skills/database-explorer/tsconfig.json +0 -10
  225. package/skills/diff-viewer/CLAUDE.md +0 -19
  226. package/skills/diff-viewer/package.json +0 -30
  227. package/skills/diff-viewer/src/index.ts +0 -164
  228. package/skills/diff-viewer/tsconfig.json +0 -10
  229. package/skills/doc-read/SKILL.md +0 -45
  230. package/skills/doc-read/package.json +0 -29
  231. package/skills/doc-read/src/index.ts +0 -324
  232. package/skills/doc-read/tsconfig.json +0 -8
  233. package/skills/domainpurchase/LICENSE +0 -192
  234. package/skills/domainpurchase/SKILL.md +0 -29
  235. package/skills/domainpurchase/package.json +0 -30
  236. package/skills/domainpurchase/src/index.ts +0 -3
  237. package/skills/domainpurchase/tsconfig.json +0 -21
  238. package/skills/email-sequence/SKILL.md +0 -53
  239. package/skills/email-sequence/package.json +0 -10
  240. package/skills/experiment-power-calculator/CLAUDE.md +0 -19
  241. package/skills/experiment-power-calculator/package.json +0 -29
  242. package/skills/experiment-power-calculator/src/index.ts +0 -86
  243. package/skills/experiment-power-calculator/tsconfig.json +0 -10
  244. package/skills/extract-frames/CLAUDE.md +0 -19
  245. package/skills/extract-frames/package.json +0 -27
  246. package/skills/extract-frames/src/index.ts +0 -616
  247. package/skills/extract-frames/tsconfig.json +0 -10
  248. package/skills/file-organizer/CLAUDE.md +0 -19
  249. package/skills/file-organizer/package.json +0 -27
  250. package/skills/file-organizer/src/index.ts +0 -91
  251. package/skills/file-organizer/tsconfig.json +0 -10
  252. package/skills/folder-tree/CLAUDE.md +0 -19
  253. package/skills/folder-tree/package.json +0 -29
  254. package/skills/folder-tree/src/index.ts +0 -568
  255. package/skills/folder-tree/tsconfig.json +0 -10
  256. package/skills/form-filler/CLAUDE.md +0 -19
  257. package/skills/form-filler/package.json +0 -29
  258. package/skills/form-filler/src/index.ts +0 -81
  259. package/skills/form-filler/tsconfig.json +0 -10
  260. package/skills/generate-api-client/CLAUDE.md +0 -19
  261. package/skills/generate-api-client/package.json +0 -29
  262. package/skills/generate-api-client/src/generator.ts +0 -47
  263. package/skills/generate-api-client/src/index.ts +0 -92
  264. package/skills/generate-api-client/src/logger.ts +0 -34
  265. package/skills/generate-api-client/src/python-generator.ts +0 -245
  266. package/skills/generate-api-client/src/spec-loader.ts +0 -48
  267. package/skills/generate-api-client/src/type-mappers.ts +0 -79
  268. package/skills/generate-api-client/src/types.ts +0 -76
  269. package/skills/generate-api-client/src/typescript-generator.ts +0 -247
  270. package/skills/generate-api-client/tsconfig.json +0 -10
  271. package/skills/generate-chart/CLAUDE.md +0 -19
  272. package/skills/generate-chart/package.json +0 -27
  273. package/skills/generate-chart/src/index.ts +0 -510
  274. package/skills/generate-chart/tsconfig.json +0 -10
  275. package/skills/generate-dockerfile/CLAUDE.md +0 -19
  276. package/skills/generate-dockerfile/package.json +0 -27
  277. package/skills/generate-dockerfile/src/cli.ts +0 -78
  278. package/skills/generate-dockerfile/src/dockerfile-templates.ts +0 -392
  279. package/skills/generate-dockerfile/src/index.ts +0 -81
  280. package/skills/generate-dockerfile/src/logger.ts +0 -30
  281. package/skills/generate-dockerfile/src/project-detection.ts +0 -68
  282. package/skills/generate-dockerfile/src/support-files.ts +0 -171
  283. package/skills/generate-dockerfile/src/types.ts +0 -29
  284. package/skills/generate-dockerfile/tsconfig.json +0 -10
  285. package/skills/generate-env/CLAUDE.md +0 -19
  286. package/skills/generate-env/package.json +0 -29
  287. package/skills/generate-env/src/cli.ts +0 -85
  288. package/skills/generate-env/src/detection.ts +0 -161
  289. package/skills/generate-env/src/env-data.ts +0 -66
  290. package/skills/generate-env/src/generators.ts +0 -240
  291. package/skills/generate-env/src/index.ts +0 -120
  292. package/skills/generate-env/src/runtime.ts +0 -30
  293. package/skills/generate-env/src/types.ts +0 -32
  294. package/skills/generate-env/tsconfig.json +0 -10
  295. package/skills/generate-favicon/CLAUDE.md +0 -19
  296. package/skills/generate-favicon/package.json +0 -29
  297. package/skills/generate-favicon/src/index.ts +0 -421
  298. package/skills/generate-favicon/tsconfig.json +0 -10
  299. package/skills/generate-qrcode/CLAUDE.md +0 -19
  300. package/skills/generate-qrcode/package.json +0 -30
  301. package/skills/generate-qrcode/src/index.ts +0 -584
  302. package/skills/generate-qrcode/tsconfig.json +0 -10
  303. package/skills/generate-resume/CLAUDE.md +0 -19
  304. package/skills/generate-resume/package.json +0 -27
  305. package/skills/generate-resume/src/cli.ts +0 -157
  306. package/skills/generate-resume/src/index.ts +0 -178
  307. package/skills/generate-resume/src/parsers.ts +0 -95
  308. package/skills/generate-resume/src/renderers.ts +0 -538
  309. package/skills/generate-resume/src/security.ts +0 -39
  310. package/skills/generate-resume/src/types.ts +0 -86
  311. package/skills/generate-resume/tsconfig.json +0 -10
  312. package/skills/generate-sitemap/CLAUDE.md +0 -19
  313. package/skills/generate-sitemap/package.json +0 -27
  314. package/skills/generate-sitemap/src/index.ts +0 -626
  315. package/skills/generate-sitemap/tsconfig.json +0 -10
  316. package/skills/gif-maker/CLAUDE.md +0 -19
  317. package/skills/gif-maker/package.json +0 -30
  318. package/skills/gif-maker/src/index.ts +0 -600
  319. package/skills/gif-maker/tsconfig.json +0 -10
  320. package/skills/hook/LICENSE +0 -192
  321. package/skills/hook/README.md +0 -74
  322. package/skills/hook/SKILL.md +0 -85
  323. package/skills/hook/bunfig.toml +0 -5
  324. package/skills/hook/package.json +0 -28
  325. package/skills/hook/src/commands/create.ts +0 -112
  326. package/skills/hook/src/commands/events.ts +0 -37
  327. package/skills/hook/src/commands/validate.ts +0 -117
  328. package/skills/hook/src/index.ts +0 -118
  329. package/skills/hook/src/templates/root.ts +0 -196
  330. package/skills/hook/src/templates/source.ts +0 -647
  331. package/skills/hook/tsconfig.json +0 -18
  332. package/skills/http-server/CLAUDE.md +0 -19
  333. package/skills/http-server/package.json +0 -29
  334. package/skills/http-server/src/index.ts +0 -51
  335. package/skills/http-server/tsconfig.json +0 -10
  336. package/skills/implementation/LICENSE +0 -192
  337. package/skills/implementation/README.md +0 -53
  338. package/skills/implementation/SKILL.md +0 -57
  339. package/skills/implementation/bunfig.toml +0 -5
  340. package/skills/implementation/package.json +0 -28
  341. package/skills/implementation/src/commands/create.ts +0 -187
  342. package/skills/implementation/src/index.ts +0 -62
  343. package/skills/implementation/tsconfig.json +0 -18
  344. package/skills/implementation-plan/CLAUDE.md +0 -19
  345. package/skills/implementation-plan/package.json +0 -29
  346. package/skills/implementation-plan/src/index.ts +0 -520
  347. package/skills/implementation-plan/tsconfig.json +0 -10
  348. package/skills/implementation-todo/CLAUDE.md +0 -19
  349. package/skills/implementation-todo/package.json +0 -29
  350. package/skills/implementation-todo/src/index.ts +0 -429
  351. package/skills/implementation-todo/tsconfig.json +0 -10
  352. package/skills/invoice/.env.example +0 -3
  353. package/skills/invoice/CLAUDE.md +0 -31
  354. package/skills/invoice/LICENSE +0 -192
  355. package/skills/invoice/README.md +0 -70
  356. package/skills/invoice/package.json +0 -26
  357. package/skills/invoice/src/commands/companies.ts +0 -202
  358. package/skills/invoice/src/commands/config.ts +0 -132
  359. package/skills/invoice/src/commands/generate.ts +0 -177
  360. package/skills/invoice/src/commands/invoices.ts +0 -218
  361. package/skills/invoice/src/index.ts +0 -3
  362. package/skills/invoice/src/lib/api.ts +0 -124
  363. package/skills/invoice/src/lib/storage.ts +0 -171
  364. package/skills/invoice/src/types/index.ts +0 -86
  365. package/skills/invoice/src/utils/logger.ts +0 -33
  366. package/skills/invoice/src/utils/paths.ts +0 -25
  367. package/skills/invoice/tsconfig.json +0 -23
  368. package/skills/invoice-reconciliation/SKILL.md +0 -98
  369. package/skills/invoice-reconciliation/package.json +0 -36
  370. package/skills/invoice-reconciliation/src/index.ts +0 -743
  371. package/skills/invoice-reconciliation/tsconfig.json +0 -17
  372. package/skills/landing-page-pack/SKILL.md +0 -55
  373. package/skills/landing-page-pack/package.json +0 -10
  374. package/skills/latex-table-generator/CLAUDE.md +0 -19
  375. package/skills/latex-table-generator/package.json +0 -29
  376. package/skills/latex-table-generator/src/index.ts +0 -113
  377. package/skills/latex-table-generator/tsconfig.json +0 -10
  378. package/skills/logo-design/SKILL.md +0 -94
  379. package/skills/logo-design/package.json +0 -35
  380. package/skills/logo-design/src/cli.ts +0 -132
  381. package/skills/logo-design/src/constants.ts +0 -5
  382. package/skills/logo-design/src/docs.ts +0 -102
  383. package/skills/logo-design/src/geometry.ts +0 -324
  384. package/skills/logo-design/src/index.ts +0 -212
  385. package/skills/logo-design/src/palette.ts +0 -258
  386. package/skills/logo-design/src/types.ts +0 -50
  387. package/skills/logo-design/tsconfig.json +0 -17
  388. package/skills/lorem-generator/CLAUDE.md +0 -19
  389. package/skills/lorem-generator/package.json +0 -29
  390. package/skills/lorem-generator/src/index.ts +0 -59
  391. package/skills/lorem-generator/tsconfig.json +0 -10
  392. package/skills/managemcp/CLAUDE.md +0 -14
  393. package/skills/managemcp/README.md +0 -24
  394. package/skills/managemcp/package.json +0 -16
  395. package/skills/managemcp/src/index.ts +0 -3
  396. package/skills/managemcp/tsconfig.json +0 -27
  397. package/skills/markdown-validator/CLAUDE.md +0 -19
  398. package/skills/markdown-validator/package.json +0 -29
  399. package/skills/markdown-validator/src/index.ts +0 -92
  400. package/skills/markdown-validator/tsconfig.json +0 -10
  401. package/skills/market-research-report/SKILL.md +0 -51
  402. package/skills/market-research-report/package.json +0 -10
  403. package/skills/meeting-pack/SKILL.md +0 -52
  404. package/skills/meeting-pack/package.json +0 -10
  405. package/skills/merge-pdfs/CLAUDE.md +0 -19
  406. package/skills/merge-pdfs/package.json +0 -31
  407. package/skills/merge-pdfs/src/index.ts +0 -427
  408. package/skills/merge-pdfs/tsconfig.json +0 -10
  409. package/skills/migration-plan-pack/SKILL.md +0 -56
  410. package/skills/migration-plan-pack/package.json +0 -10
  411. package/skills/monitor/SKILL.md +0 -69
  412. package/skills/monitor/package.json +0 -33
  413. package/skills/monitor/src/index.ts +0 -34
  414. package/skills/monitor/tsconfig.json +0 -17
  415. package/skills/one-page-website/SKILL.md +0 -128
  416. package/skills/one-page-website/package.json +0 -34
  417. package/skills/one-page-website/src/design.ts +0 -336
  418. package/skills/one-page-website/src/docs.ts +0 -159
  419. package/skills/one-page-website/src/index.ts +0 -357
  420. package/skills/one-page-website/src/page.ts +0 -340
  421. package/skills/one-page-website/src/styles.ts +0 -508
  422. package/skills/one-page-website/src/types.ts +0 -78
  423. package/skills/one-page-website/tsconfig.json +0 -17
  424. package/skills/pdf-generate/CLAUDE.md +0 -19
  425. package/skills/pdf-generate/SKILL.md +0 -86
  426. package/skills/pdf-generate/package.json +0 -21
  427. package/skills/pdf-generate/src/cli.ts +0 -162
  428. package/skills/pdf-generate/src/html.ts +0 -84
  429. package/skills/pdf-generate/src/index.ts +0 -62
  430. package/skills/pdf-generate/src/markdown.ts +0 -27
  431. package/skills/pdf-generate/src/pdf-writer.ts +0 -78
  432. package/skills/pdf-generate/src/runtime.ts +0 -34
  433. package/skills/pdf-generate/src/security.ts +0 -37
  434. package/skills/pdf-generate/src/templates.ts +0 -311
  435. package/skills/pdf-generate/src/types.ts +0 -28
  436. package/skills/pdf-generate/tsconfig.json +0 -16
  437. package/skills/pdf-to-dataset/SKILL.md +0 -88
  438. package/skills/pdf-to-dataset/package.json +0 -37
  439. package/skills/pdf-to-dataset/src/index.ts +0 -790
  440. package/skills/pdf-to-dataset/tsconfig.json +0 -17
  441. package/skills/pdf-to-markdown/SKILL.md +0 -81
  442. package/skills/pdf-to-markdown/package.json +0 -35
  443. package/skills/pdf-to-markdown/src/index.ts +0 -694
  444. package/skills/pdf-to-markdown/tsconfig.json +0 -17
  445. package/skills/performance-audit-report/SKILL.md +0 -49
  446. package/skills/performance-audit-report/package.json +0 -10
  447. package/skills/pitch-deck/SKILL.md +0 -51
  448. package/skills/pitch-deck/package.json +0 -10
  449. package/skills/product-mockup/SKILL.md +0 -107
  450. package/skills/product-mockup/package.json +0 -32
  451. package/skills/product-mockup/src/cli.ts +0 -150
  452. package/skills/product-mockup/src/design.ts +0 -151
  453. package/skills/product-mockup/src/docs.ts +0 -134
  454. package/skills/product-mockup/src/index.ts +0 -182
  455. package/skills/product-mockup/src/render.ts +0 -407
  456. package/skills/product-mockup/src/types.ts +0 -66
  457. package/skills/product-mockup/tsconfig.json +0 -17
  458. package/skills/proposal-pack/SKILL.md +0 -53
  459. package/skills/proposal-pack/package.json +0 -10
  460. package/skills/read-csv/SKILL.md +0 -62
  461. package/skills/read-csv/package.json +0 -37
  462. package/skills/read-csv/src/index.ts +0 -356
  463. package/skills/read-csv/tsconfig.json +0 -17
  464. package/skills/read-excel/SKILL.md +0 -64
  465. package/skills/read-excel/package.json +0 -36
  466. package/skills/read-excel/src/index.ts +0 -266
  467. package/skills/read-excel/tsconfig.json +0 -17
  468. package/skills/regex-tester/CLAUDE.md +0 -19
  469. package/skills/regex-tester/package.json +0 -27
  470. package/skills/regex-tester/src/index.ts +0 -183
  471. package/skills/regex-tester/tsconfig.json +0 -10
  472. package/skills/repo-onboarding-report/SKILL.md +0 -52
  473. package/skills/repo-onboarding-report/package.json +0 -10
  474. package/skills/scancommitpr/SKILL.md +0 -178
  475. package/skills/scancommitpr/package.json +0 -34
  476. package/skills/scancommitpr/src/index.ts +0 -44
  477. package/skills/scancommitpr/tsconfig.json +0 -13
  478. package/skills/scancommitpush/SKILL.md +0 -174
  479. package/skills/scancommitpush/package.json +0 -32
  480. package/skills/scancommitpush/src/index.ts +0 -44
  481. package/skills/scancommitpush/tsconfig.json +0 -13
  482. package/skills/scientific-figure-check/CLAUDE.md +0 -19
  483. package/skills/scientific-figure-check/package.json +0 -29
  484. package/skills/scientific-figure-check/src/index.ts +0 -83
  485. package/skills/scientific-figure-check/tsconfig.json +0 -10
  486. package/skills/security-audit/CLAUDE.md +0 -19
  487. package/skills/security-audit/package.json +0 -27
  488. package/skills/security-audit/src/index.ts +0 -145
  489. package/skills/security-audit/tsconfig.json +0 -10
  490. package/skills/security-audit-report/SKILL.md +0 -52
  491. package/skills/security-audit-report/package.json +0 -10
  492. package/skills/seo-content-pack/SKILL.md +0 -54
  493. package/skills/seo-content-pack/package.json +0 -10
  494. package/skills/siteanalyze/SKILL.md +0 -25
  495. package/skills/siteanalyze/package.json +0 -27
  496. package/skills/siteanalyze/src/index.ts +0 -592
  497. package/skills/slide-deck-generator/SKILL.md +0 -93
  498. package/skills/slide-deck-generator/package.json +0 -38
  499. package/skills/slide-deck-generator/src/cli.ts +0 -133
  500. package/skills/slide-deck-generator/src/index.ts +0 -148
  501. package/skills/slide-deck-generator/src/model.ts +0 -307
  502. package/skills/slide-deck-generator/src/pptx.ts +0 -143
  503. package/skills/slide-deck-generator/src/render.ts +0 -248
  504. package/skills/slide-deck-generator/src/types.ts +0 -114
  505. package/skills/slide-deck-generator/src/utils.ts +0 -53
  506. package/skills/slide-deck-generator/tsconfig.json +0 -17
  507. package/skills/social-content-calendar/SKILL.md +0 -54
  508. package/skills/social-content-calendar/package.json +0 -10
  509. package/skills/split-pdf/CLAUDE.md +0 -19
  510. package/skills/split-pdf/package.json +0 -30
  511. package/skills/split-pdf/src/index.ts +0 -301
  512. package/skills/split-pdf/tsconfig.json +0 -10
  513. package/skills/statistical-test-selector/CLAUDE.md +0 -19
  514. package/skills/statistical-test-selector/package.json +0 -27
  515. package/skills/statistical-test-selector/src/index.ts +0 -75
  516. package/skills/statistical-test-selector/tsconfig.json +0 -10
  517. package/skills/test-suite-generator/SKILL.md +0 -51
  518. package/skills/test-suite-generator/package.json +0 -10
  519. package/skills/tmux-session/SKILL.md +0 -109
  520. package/skills/tmux-session/package.json +0 -33
  521. package/skills/tmux-session/src/index.ts +0 -34
  522. package/skills/tmux-session/tsconfig.json +0 -17
  523. package/skills/todos-plan/SKILL.md +0 -363
  524. package/skills/todos-plan/agents/openai.yaml +0 -4
  525. package/skills/todos-plan/package.json +0 -9
  526. package/skills/todos-plan/src/index.ts +0 -68
  527. package/skills/tsconfig.base.json +0 -12
  528. package/skills/validate-config/CLAUDE.md +0 -19
  529. package/skills/validate-config/package.json +0 -29
  530. package/skills/validate-config/src/index.ts +0 -56
  531. package/skills/validate-config/tsconfig.json +0 -10
  532. package/skills/video-downloader/CLAUDE.md +0 -19
  533. package/skills/video-downloader/package.json +0 -29
  534. package/skills/video-downloader/src/index.ts +0 -561
  535. package/skills/video-downloader/tsconfig.json +0 -10
  536. package/skills/video-highlight-pack/SKILL.md +0 -54
  537. package/skills/video-highlight-pack/package.json +0 -10
  538. package/skills/watermark/CLAUDE.md +0 -19
  539. package/skills/watermark/package.json +0 -32
  540. package/skills/watermark/src/index.ts +0 -587
  541. package/skills/watermark/tsconfig.json +0 -10
@@ -1,35 +0,0 @@
1
- {
2
- "name": "brand-assets",
3
- "version": "0.1.0",
4
- "private": true,
5
- "description": "Extract brand assets, colors, and typography from a website you name, with full source provenance",
6
- "type": "module",
7
- "main": "src/index.ts",
8
- "bin": {
9
- "brand-assets": "src/index.ts"
10
- },
11
- "files": [
12
- "src",
13
- "SKILL.md",
14
- "tsconfig.json"
15
- ],
16
- "keywords": [
17
- "brand",
18
- "logo",
19
- "favicon",
20
- "palette",
21
- "scraper",
22
- "skill"
23
- ],
24
- "scripts": {
25
- "start": "bun run src/index.ts",
26
- "typecheck": "tsc --noEmit"
27
- },
28
- "dependencies": {
29
- "node-html-parser": "^6.1.13"
30
- },
31
- "devDependencies": {
32
- "@types/bun": "latest",
33
- "typescript": "^5.7.0"
34
- }
35
- }
@@ -1,155 +0,0 @@
1
- import { VERSION } from "./constants.js";
2
- import type { CliOptions, HtmlNode } from "./types.js";
3
-
4
- export async function loadHtmlParser(): Promise<(html: string) => HtmlNode> {
5
- try {
6
- const mod = await import("node-html-parser");
7
- return mod.parse as unknown as (html: string) => HtmlNode;
8
- } catch {
9
- throw new Error("Missing dependency 'node-html-parser'. Run bun install in this skill directory.");
10
- }
11
- }
12
-
13
- /* ------------------------------------------------------------------ */
14
- /* cli */
15
- /* ------------------------------------------------------------------ */
16
-
17
- function printHelp(): void {
18
- console.log(`brand-assets v${VERSION}
19
-
20
- Extract brand assets from a website you name. Fetches the page over plain HTTP,
21
- parses it for icons, social preview images, theme colors, CSS color custom
22
- properties, and font stacks, then downloads what it finds.
23
-
24
- No API keys and no third-party services: the only host contacted is the one in
25
- the URL you pass (plus whatever that page links its own assets from).
26
-
27
- USAGE:
28
- brand-assets --url <url> [options]
29
- brand-assets <url> [options]
30
-
31
- OPTIONS:
32
- -u, --url <url> Website to inspect. Required.
33
- -o, --output <dir> Output directory [./brand-assets]
34
- -t, --timeout <ms> Per-request timeout in milliseconds [15000]
35
- --max-assets <n> Maximum assets to download [20]
36
- --no-download Discover and report only, fetch no binaries
37
- --json Print the brand profile as JSON on stdout
38
- --help Show this help message
39
- --version Show the current version
40
-
41
- WHAT IS DISCOVERED:
42
- <link rel="icon" | "shortcut icon" | "apple-touch-icon" | "mask-icon">
43
- <link rel="manifest"> (parsed for name, theme_color, background_color, icons)
44
- <meta property="og:image">, <meta name="twitter:image">
45
- <meta name="theme-color"> (including per-color-scheme media variants)
46
- <img> and inline <svg> whose src, alt, class, or id looks like a logo
47
- CSS custom properties whose name contains color / brand / accent / bg / fg
48
- font-family declarations, in inline <style> and in linked stylesheets
49
-
50
- OUTPUTS:
51
- assets/ Downloaded icons, logos, and social images
52
- brand-profile.json Everything discovered, machine readable
53
- brand-profile.md The same profile as a readable summary
54
- palette.json Every color with its hex and where it was found
55
- typography.md Font stacks with their source
56
- sources.json asset file -> source URL map
57
- manifest.json Every file written, with byte sizes
58
-
59
- EXIT CODES:
60
- 0 page fetched and parsed
61
- 1 missing --url, network failure, non-200 response, or non-HTML content type
62
-
63
- EXAMPLES:
64
- brand-assets --url https://example.com
65
- brand-assets https://example.com --output ./out/example --timeout 30000
66
- brand-assets --url https://example.com --no-download --json
67
- `);
68
- }
69
-
70
- export function parseArgs(argv: string[]): CliOptions {
71
- const options: CliOptions = {
72
- output: "./brand-assets",
73
- timeout: 15000,
74
- maxAssets: 20,
75
- download: true,
76
- json: false,
77
- };
78
-
79
- for (let i = 0; i < argv.length; i += 1) {
80
- const arg = argv[i];
81
- switch (arg) {
82
- case "--help":
83
- case "-h":
84
- printHelp();
85
- process.exit(0);
86
- case "--version":
87
- case "-v":
88
- console.log(VERSION);
89
- process.exit(0);
90
- case "--url":
91
- case "-u":
92
- options.url = argv[++i];
93
- break;
94
- case "--output":
95
- case "-o":
96
- options.output = argv[++i] ?? options.output;
97
- break;
98
- case "--timeout":
99
- case "-t": {
100
- const value = Number.parseInt(argv[++i] ?? "", 10);
101
- if (!Number.isFinite(value) || value < 500 || value > 300000) {
102
- throw new Error(`Invalid --timeout value: ${argv[i]} (expected 500-300000 ms)`);
103
- }
104
- options.timeout = value;
105
- break;
106
- }
107
- case "--max-assets": {
108
- const value = Number.parseInt(argv[++i] ?? "", 10);
109
- if (!Number.isFinite(value) || value < 0 || value > 200) {
110
- throw new Error(`Invalid --max-assets value: ${argv[i]} (expected 0-200)`);
111
- }
112
- options.maxAssets = value;
113
- break;
114
- }
115
- case "--no-download":
116
- options.download = false;
117
- break;
118
- case "--json":
119
- options.json = true;
120
- break;
121
- default:
122
- if (arg.startsWith("-")) {
123
- throw new Error(`Unknown option: ${arg}`);
124
- }
125
- if (!options.url) {
126
- options.url = arg;
127
- break;
128
- }
129
- throw new Error(`Unexpected argument: ${arg}`);
130
- }
131
- }
132
-
133
- if (!options.url || options.url.trim() === "") {
134
- throw new Error(
135
- "Missing required --url <url> argument. This skill inspects a specific website; " +
136
- "there is no brand-name search fallback. Example: brand-assets --url https://example.com",
137
- );
138
- }
139
-
140
- return options;
141
- }
142
-
143
- export function normalizeUrl(input: string): URL {
144
- const candidate = /^https?:\/\//i.test(input) ? input : `https://${input}`;
145
- try {
146
- const url = new URL(candidate);
147
- if (url.protocol !== "http:" && url.protocol !== "https:") {
148
- throw new Error("unsupported protocol");
149
- }
150
- return url;
151
- } catch {
152
- throw new Error(`Invalid --url value: ${input} (expected an http(s) URL such as https://example.com)`);
153
- }
154
- }
155
-
@@ -1,8 +0,0 @@
1
- export const VERSION = "0.1.0";
2
- export const USER_AGENT =
3
- "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36";
4
- export const MAX_ASSET_BYTES = 8 * 1024 * 1024;
5
- export const MAX_STYLESHEETS = 6;
6
- export const MAX_STYLESHEET_BYTES = 2 * 1024 * 1024;
7
- export const MAX_PALETTE_ENTRIES = 48;
8
-
@@ -1,236 +0,0 @@
1
- import { extname } from "path";
2
- import { USER_AGENT } from "./constants.js";
3
- import type { ColorHit, FontHit, HtmlNode } from "./types.js";
4
-
5
- export async function fetchWithTimeout(url: string, timeout: number, accept: string): Promise<Response> {
6
- try {
7
- return await fetch(url, {
8
- redirect: "follow",
9
- signal: AbortSignal.timeout(timeout),
10
- headers: {
11
- "user-agent": USER_AGENT,
12
- accept,
13
- "accept-language": "en-US,en;q=0.9",
14
- },
15
- });
16
- } catch (error) {
17
- const message = error instanceof Error ? error.message : String(error);
18
- if (/timeout|abort/i.test(message)) {
19
- throw new Error(`Request to ${url} timed out after ${timeout}ms. Raise it with --timeout <ms>.`);
20
- }
21
- throw new Error(`Network request to ${url} failed: ${message}`);
22
- }
23
- }
24
-
25
- export async function fetchPage(url: string, timeout: number): Promise<{ html: string; finalUrl: string; contentType: string }> {
26
- const response = await fetchWithTimeout(url, timeout, "text/html,application/xhtml+xml");
27
-
28
- if (!response.ok) {
29
- throw new Error(`${url} returned HTTP ${response.status} ${response.statusText || ""}`.trim());
30
- }
31
-
32
- const contentType = response.headers.get("content-type") ?? "";
33
- if (!/text\/html|application\/xhtml\+xml/i.test(contentType)) {
34
- throw new Error(
35
- `${response.url} returned content-type "${contentType || "unknown"}", which is not HTML. ` +
36
- "Point --url at an HTML page rather than a file or API endpoint.",
37
- );
38
- }
39
-
40
- return { html: await response.text(), finalUrl: response.url || url, contentType };
41
- }
42
-
43
- /* ------------------------------------------------------------------ */
44
- /* color + font extraction */
45
- /* ------------------------------------------------------------------ */
46
-
47
- const CSS_NAMED_COLORS: Record<string, string> = {
48
- black: "#000000",
49
- white: "#FFFFFF",
50
- red: "#FF0000",
51
- green: "#008000",
52
- blue: "#0000FF",
53
- navy: "#000080",
54
- teal: "#008080",
55
- orange: "#FFA500",
56
- purple: "#800080",
57
- gray: "#808080",
58
- grey: "#808080",
59
- silver: "#C0C0C0",
60
- gold: "#FFD700",
61
- crimson: "#DC143C",
62
- indigo: "#4B0082",
63
- };
64
-
65
- export function toHex(value: string): string | null {
66
- const raw = value.trim().toLowerCase();
67
-
68
- const hexMatch = /^#([0-9a-f]{3,8})$/.exec(raw);
69
- if (hexMatch) {
70
- const body = hexMatch[1];
71
- if (body.length === 3 || body.length === 4) {
72
- const rgb = body
73
- .slice(0, 3)
74
- .split("")
75
- .map((c) => c + c)
76
- .join("");
77
- return `#${rgb.toUpperCase()}`;
78
- }
79
- if (body.length === 6 || body.length === 8) {
80
- return `#${body.slice(0, 6).toUpperCase()}`;
81
- }
82
- return null;
83
- }
84
-
85
- const rgbMatch = /^rgba?\(\s*([0-9.]+)[\s,]+([0-9.]+)[\s,]+([0-9.]+)/.exec(raw);
86
- if (rgbMatch) {
87
- const channels = rgbMatch.slice(1, 4).map((n) => Math.round(Math.min(255, Math.max(0, Number(n)))));
88
- if (channels.some((n) => Number.isNaN(n))) return null;
89
- return `#${channels.map((n) => n.toString(16).padStart(2, "0")).join("").toUpperCase()}`;
90
- }
91
-
92
- const hslMatch = /^hsla?\(\s*([0-9.]+)(?:deg)?[\s,]+([0-9.]+)%[\s,]+([0-9.]+)%/.exec(raw);
93
- if (hslMatch) {
94
- const h = Number(hslMatch[1]);
95
- const s = Number(hslMatch[2]) / 100;
96
- const l = Number(hslMatch[3]) / 100;
97
- if ([h, s, l].some((n) => Number.isNaN(n))) return null;
98
- const c = (1 - Math.abs(2 * l - 1)) * s;
99
- const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
100
- const m = l - c / 2;
101
- let rgb: [number, number, number];
102
- const hue = ((h % 360) + 360) % 360;
103
- if (hue < 60) rgb = [c, x, 0];
104
- else if (hue < 120) rgb = [x, c, 0];
105
- else if (hue < 180) rgb = [0, c, x];
106
- else if (hue < 240) rgb = [0, x, c];
107
- else if (hue < 300) rgb = [x, 0, c];
108
- else rgb = [c, 0, x];
109
- return `#${rgb
110
- .map((v) =>
111
- Math.round((v + m) * 255)
112
- .toString(16)
113
- .padStart(2, "0"),
114
- )
115
- .join("")
116
- .toUpperCase()}`;
117
- }
118
-
119
- return CSS_NAMED_COLORS[raw] ?? null;
120
- }
121
-
122
- const COLOR_PROP_PATTERN =
123
- /(--[a-z0-9-]*(?:color|colour|brand|accent|primary|secondary|bg|background|fg|foreground|surface|theme|ink|text)[a-z0-9-]*)\s*:\s*([^;{}]+)/gi;
124
- const COLOR_DECL_PATTERN =
125
- /(?:^|[;{}\s])(color|background-color|background|border-color|border-top-color|outline-color|accent-color|caret-color|fill|stroke)\s*:\s*([^;{}]+)/gi;
126
- const FONT_PATTERN = /(font-family|--[a-z0-9-]*font[a-z0-9-]*)\s*:\s*([^;{}]+)/gi;
127
-
128
- const COLOR_TOKEN_PATTERN =
129
- /(#[0-9a-f]{3,8}\b|rgba?\([^)]*\)|hsla?\([^)]*\)|\b(?:black|white|red|green|blue|navy|teal|orange|purple|gray|grey|silver|gold|crimson|indigo)\b)/i;
130
-
131
- function firstColorIn(value: string): { hex: string; raw: string } | null {
132
- const match = COLOR_TOKEN_PATTERN.exec(value);
133
- if (!match) return null;
134
- const hex = toHex(match[1]);
135
- return hex ? { hex, raw: match[1] } : null;
136
- }
137
-
138
- export function extractColorsFromCss(css: string, foundIn: string): ColorHit[] {
139
- const hits: ColorHit[] = [];
140
-
141
- COLOR_PROP_PATTERN.lastIndex = 0;
142
- let match: RegExpExecArray | null;
143
- while ((match = COLOR_PROP_PATTERN.exec(css)) !== null) {
144
- const name = match[1].trim();
145
- const value = match[2].trim();
146
- const color = firstColorIn(value);
147
- if (color) hits.push({ hex: color.hex, raw: color.raw, name, kind: "custom-property", foundIn });
148
- }
149
-
150
- COLOR_DECL_PATTERN.lastIndex = 0;
151
- while ((match = COLOR_DECL_PATTERN.exec(css)) !== null) {
152
- const name = match[1].trim().toLowerCase();
153
- const value = match[2].trim();
154
- if (value.startsWith("var(")) continue;
155
- const color = firstColorIn(value);
156
- if (color) hits.push({ hex: color.hex, raw: color.raw, name, kind: "declaration", foundIn });
157
- }
158
-
159
- return hits;
160
- }
161
-
162
- export function extractFontsFromCss(css: string, foundIn: string): FontHit[] {
163
- const hits: FontHit[] = [];
164
- FONT_PATTERN.lastIndex = 0;
165
- let match: RegExpExecArray | null;
166
- while ((match = FONT_PATTERN.exec(css)) !== null) {
167
- const property = match[1].trim();
168
- const stack = match[2].trim().replace(/\s+/g, " ");
169
- if (!stack || stack.startsWith("var(") || stack.length > 300) continue;
170
- const families = stack
171
- .split(",")
172
- .map((entry) => entry.trim().replace(/^['"]|['"]$/g, ""))
173
- .filter(Boolean);
174
- if (families.length === 0) continue;
175
- // CSS-wide keywords carry no typographic information.
176
- if (/^(inherit|initial|unset|revert|revert-layer|none|auto)$/i.test(families[0])) continue;
177
- hits.push({ stack, families, property, foundIn });
178
- }
179
- return hits;
180
- }
181
-
182
- /* ------------------------------------------------------------------ */
183
- /* html parsing */
184
- /* ------------------------------------------------------------------ */
185
-
186
- export function safeResolve(href: string | undefined, base: string): string | null {
187
- if (!href) return null;
188
- const trimmed = href.trim();
189
- if (!trimmed || trimmed.startsWith("data:") || trimmed.startsWith("javascript:")) return null;
190
- try {
191
- const url = new URL(trimmed, base);
192
- if (url.protocol !== "http:" && url.protocol !== "https:") return null;
193
- return url.toString();
194
- } catch {
195
- return null;
196
- }
197
- }
198
-
199
- export function looksLikeLogo(node: HtmlNode): boolean {
200
- const haystack = [
201
- node.getAttribute("class"),
202
- node.getAttribute("id"),
203
- node.getAttribute("alt"),
204
- node.getAttribute("src"),
205
- node.getAttribute("aria-label"),
206
- ]
207
- .filter(Boolean)
208
- .join(" ")
209
- .toLowerCase();
210
- return /logo|wordmark|brandmark|\bbrand\b/.test(haystack);
211
- }
212
-
213
- export function sanitizeFilename(value: string, fallback: string): string {
214
- const cleaned = value
215
- .replace(/[?#].*$/, "")
216
- .split("/")
217
- .pop()!
218
- .replace(/[^a-zA-Z0-9._-]+/g, "-")
219
- .replace(/^[-.]+/, "")
220
- .slice(0, 80);
221
- return cleaned || fallback;
222
- }
223
-
224
- export function extensionFor(contentType: string | null, url: string): string {
225
- const fromUrl = extname(new URL(url).pathname).toLowerCase();
226
- if (fromUrl && fromUrl.length <= 6) return fromUrl;
227
- if (!contentType) return ".bin";
228
- if (/svg/.test(contentType)) return ".svg";
229
- if (/png/.test(contentType)) return ".png";
230
- if (/jpe?g/.test(contentType)) return ".jpg";
231
- if (/webp/.test(contentType)) return ".webp";
232
- if (/gif/.test(contentType)) return ".gif";
233
- if (/x-icon|vnd\.microsoft\.icon/.test(contentType)) return ".ico";
234
- if (/avif/.test(contentType)) return ".avif";
235
- return ".bin";
236
- }