@hasna/skills 0.1.62 → 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 (526) 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 -254
  95. package/agent-skills/skill-publish/scripts/capture_registry.js +0 -47
  96. package/agent-skills/skill-publish/scripts/publish_with_git_head.sh +0 -143
  97. package/agent-skills/skill-publish/scripts/test_publish_with_git_head.sh +0 -231
  98. package/skills/_common/auth.ts +0 -45
  99. package/skills/_common/http-client.ts +0 -143
  100. package/skills/_common/index.ts +0 -26
  101. package/skills/_common/install.sh +0 -7
  102. package/skills/_common/installer.ts +0 -72
  103. package/skills/_common/skill-install.ts +0 -37
  104. package/skills/_common/vision.ts +0 -374
  105. package/skills/ad-creative-pack/SKILL.md +0 -55
  106. package/skills/ad-creative-pack/package.json +0 -10
  107. package/skills/analyze-data/CLAUDE.md +0 -16
  108. package/skills/analyze-data/SKILL.md +0 -112
  109. package/skills/analyze-data/package.json +0 -23
  110. package/skills/analyze-data/src/analysis.ts +0 -401
  111. package/skills/analyze-data/src/cli.ts +0 -66
  112. package/skills/analyze-data/src/formatters.ts +0 -235
  113. package/skills/analyze-data/src/index.ts +0 -74
  114. package/skills/analyze-data/src/logger.ts +0 -36
  115. package/skills/analyze-data/src/parsers.ts +0 -57
  116. package/skills/analyze-data/src/stats.ts +0 -151
  117. package/skills/analyze-data/src/types.ts +0 -85
  118. package/skills/analyze-data/tsconfig.json +0 -19
  119. package/skills/api-docs-portal/SKILL.md +0 -84
  120. package/skills/api-docs-portal/package.json +0 -35
  121. package/skills/api-docs-portal/src/index.ts +0 -919
  122. package/skills/api-docs-portal/tsconfig.json +0 -17
  123. package/skills/api-test-suite/CLAUDE.md +0 -19
  124. package/skills/api-test-suite/package.json +0 -27
  125. package/skills/api-test-suite/src/index.ts +0 -381
  126. package/skills/api-test-suite/tsconfig.json +0 -10
  127. package/skills/audio-extract/CLAUDE.md +0 -9
  128. package/skills/audio-extract/SKILL.md +0 -73
  129. package/skills/audio-extract/package.json +0 -23
  130. package/skills/audio-extract/src/index.ts +0 -323
  131. package/skills/audio-extract/tsconfig.json +0 -11
  132. package/skills/bio-sequence-tool/CLAUDE.md +0 -19
  133. package/skills/bio-sequence-tool/package.json +0 -27
  134. package/skills/bio-sequence-tool/src/index.ts +0 -85
  135. package/skills/bio-sequence-tool/tsconfig.json +0 -10
  136. package/skills/blog-article/CLAUDE.md +0 -12
  137. package/skills/blog-article/SKILL.md +0 -55
  138. package/skills/blog-article/package.json +0 -10
  139. package/skills/blog-article/tsconfig.json +0 -10
  140. package/skills/brand-assets/SKILL.md +0 -118
  141. package/skills/brand-assets/package.json +0 -35
  142. package/skills/brand-assets/src/cli.ts +0 -155
  143. package/skills/brand-assets/src/constants.ts +0 -8
  144. package/skills/brand-assets/src/extract.ts +0 -236
  145. package/skills/brand-assets/src/index.ts +0 -668
  146. package/skills/brand-assets/src/types.ts +0 -59
  147. package/skills/brand-assets/tsconfig.json +0 -17
  148. package/skills/brand-kit/SKILL.md +0 -54
  149. package/skills/brand-kit/package.json +0 -10
  150. package/skills/businessactivity/CLAUDE.md +0 -176
  151. package/skills/businessactivity/LICENSE +0 -192
  152. package/skills/businessactivity/README.md +0 -287
  153. package/skills/businessactivity/package.json +0 -25
  154. package/skills/businessactivity/scripts/publish.ts +0 -210
  155. package/skills/businessactivity/src/commands/activity.ts +0 -211
  156. package/skills/businessactivity/src/commands/function.ts +0 -227
  157. package/skills/businessactivity/src/commands/owner.ts +0 -193
  158. package/skills/businessactivity/src/commands/profile.ts +0 -121
  159. package/skills/businessactivity/src/commands/responsibility.ts +0 -264
  160. package/skills/businessactivity/src/commands/team.ts +0 -244
  161. package/skills/businessactivity/src/commands/workflow.ts +0 -359
  162. package/skills/businessactivity/src/index.ts +0 -3
  163. package/skills/businessactivity/src/lib/config.ts +0 -167
  164. package/skills/businessactivity/src/lib/output.ts +0 -76
  165. package/skills/businessactivity/src/lib/paths.ts +0 -79
  166. package/skills/businessactivity/src/lib/storage.ts +0 -95
  167. package/skills/businessactivity/src/types/index.ts +0 -86
  168. package/skills/businessactivity/tsconfig.json +0 -29
  169. package/skills/codefix/LICENSE +0 -192
  170. package/skills/codefix/README.md +0 -232
  171. package/skills/codefix/SKILL.md +0 -94
  172. package/skills/codefix/package.json +0 -21
  173. package/skills/codefix/src/fixers/batch.ts +0 -213
  174. package/skills/codefix/src/fixers/detector.ts +0 -160
  175. package/skills/codefix/src/fixers/index.ts +0 -7
  176. package/skills/codefix/src/fixers/runner.ts +0 -522
  177. package/skills/codefix/src/index-local.ts +0 -431
  178. package/skills/codefix/src/index.ts +0 -4
  179. package/skills/codefix/src/types.ts +0 -211
  180. package/skills/codefix/tsconfig.json +0 -15
  181. package/skills/commitpush/SKILL.md +0 -57
  182. package/skills/commitpush/package.json +0 -33
  183. package/skills/commitpush/src/index.ts +0 -34
  184. package/skills/commitpush/tsconfig.json +0 -17
  185. package/skills/commitpushpr/SKILL.md +0 -55
  186. package/skills/commitpushpr/package.json +0 -33
  187. package/skills/commitpushpr/src/index.ts +0 -34
  188. package/skills/commitpushpr/tsconfig.json +0 -17
  189. package/skills/compress-video/CLAUDE.md +0 -9
  190. package/skills/compress-video/SKILL.md +0 -79
  191. package/skills/compress-video/package.json +0 -23
  192. package/skills/compress-video/src/index.ts +0 -473
  193. package/skills/compress-video/tsconfig.json +0 -11
  194. package/skills/contract-review-report/SKILL.md +0 -52
  195. package/skills/contract-review-report/package.json +0 -10
  196. package/skills/customer-feedback-report/SKILL.md +0 -52
  197. package/skills/customer-feedback-report/package.json +0 -10
  198. package/skills/dashboard-builder/CLAUDE.md +0 -19
  199. package/skills/dashboard-builder/package.json +0 -29
  200. package/skills/dashboard-builder/src/index.ts +0 -150
  201. package/skills/dashboard-builder/tsconfig.json +0 -10
  202. package/skills/data-anonymizer/CLAUDE.md +0 -19
  203. package/skills/data-anonymizer/package.json +0 -27
  204. package/skills/data-anonymizer/src/index.ts +0 -183
  205. package/skills/data-anonymizer/tsconfig.json +0 -10
  206. package/skills/database-explorer/CLAUDE.md +0 -19
  207. package/skills/database-explorer/package.json +0 -29
  208. package/skills/database-explorer/src/index.ts +0 -95
  209. package/skills/database-explorer/tsconfig.json +0 -10
  210. package/skills/diff-viewer/CLAUDE.md +0 -19
  211. package/skills/diff-viewer/package.json +0 -30
  212. package/skills/diff-viewer/src/index.ts +0 -164
  213. package/skills/diff-viewer/tsconfig.json +0 -10
  214. package/skills/doc-read/SKILL.md +0 -45
  215. package/skills/doc-read/package.json +0 -29
  216. package/skills/doc-read/src/index.ts +0 -324
  217. package/skills/doc-read/tsconfig.json +0 -8
  218. package/skills/domainpurchase/LICENSE +0 -192
  219. package/skills/domainpurchase/SKILL.md +0 -29
  220. package/skills/domainpurchase/package.json +0 -30
  221. package/skills/domainpurchase/src/index.ts +0 -3
  222. package/skills/domainpurchase/tsconfig.json +0 -21
  223. package/skills/email-sequence/SKILL.md +0 -53
  224. package/skills/email-sequence/package.json +0 -10
  225. package/skills/experiment-power-calculator/CLAUDE.md +0 -19
  226. package/skills/experiment-power-calculator/package.json +0 -29
  227. package/skills/experiment-power-calculator/src/index.ts +0 -86
  228. package/skills/experiment-power-calculator/tsconfig.json +0 -10
  229. package/skills/extract-frames/CLAUDE.md +0 -19
  230. package/skills/extract-frames/package.json +0 -27
  231. package/skills/extract-frames/src/index.ts +0 -616
  232. package/skills/extract-frames/tsconfig.json +0 -10
  233. package/skills/file-organizer/CLAUDE.md +0 -19
  234. package/skills/file-organizer/package.json +0 -27
  235. package/skills/file-organizer/src/index.ts +0 -91
  236. package/skills/file-organizer/tsconfig.json +0 -10
  237. package/skills/folder-tree/CLAUDE.md +0 -19
  238. package/skills/folder-tree/package.json +0 -29
  239. package/skills/folder-tree/src/index.ts +0 -568
  240. package/skills/folder-tree/tsconfig.json +0 -10
  241. package/skills/form-filler/CLAUDE.md +0 -19
  242. package/skills/form-filler/package.json +0 -29
  243. package/skills/form-filler/src/index.ts +0 -81
  244. package/skills/form-filler/tsconfig.json +0 -10
  245. package/skills/generate-api-client/CLAUDE.md +0 -19
  246. package/skills/generate-api-client/package.json +0 -29
  247. package/skills/generate-api-client/src/generator.ts +0 -47
  248. package/skills/generate-api-client/src/index.ts +0 -92
  249. package/skills/generate-api-client/src/logger.ts +0 -34
  250. package/skills/generate-api-client/src/python-generator.ts +0 -245
  251. package/skills/generate-api-client/src/spec-loader.ts +0 -48
  252. package/skills/generate-api-client/src/type-mappers.ts +0 -79
  253. package/skills/generate-api-client/src/types.ts +0 -76
  254. package/skills/generate-api-client/src/typescript-generator.ts +0 -247
  255. package/skills/generate-api-client/tsconfig.json +0 -10
  256. package/skills/generate-chart/CLAUDE.md +0 -19
  257. package/skills/generate-chart/package.json +0 -27
  258. package/skills/generate-chart/src/index.ts +0 -510
  259. package/skills/generate-chart/tsconfig.json +0 -10
  260. package/skills/generate-dockerfile/CLAUDE.md +0 -19
  261. package/skills/generate-dockerfile/package.json +0 -27
  262. package/skills/generate-dockerfile/src/cli.ts +0 -78
  263. package/skills/generate-dockerfile/src/dockerfile-templates.ts +0 -392
  264. package/skills/generate-dockerfile/src/index.ts +0 -81
  265. package/skills/generate-dockerfile/src/logger.ts +0 -30
  266. package/skills/generate-dockerfile/src/project-detection.ts +0 -68
  267. package/skills/generate-dockerfile/src/support-files.ts +0 -171
  268. package/skills/generate-dockerfile/src/types.ts +0 -29
  269. package/skills/generate-dockerfile/tsconfig.json +0 -10
  270. package/skills/generate-env/CLAUDE.md +0 -19
  271. package/skills/generate-env/package.json +0 -29
  272. package/skills/generate-env/src/cli.ts +0 -85
  273. package/skills/generate-env/src/detection.ts +0 -161
  274. package/skills/generate-env/src/env-data.ts +0 -66
  275. package/skills/generate-env/src/generators.ts +0 -240
  276. package/skills/generate-env/src/index.ts +0 -120
  277. package/skills/generate-env/src/runtime.ts +0 -30
  278. package/skills/generate-env/src/types.ts +0 -32
  279. package/skills/generate-env/tsconfig.json +0 -10
  280. package/skills/generate-favicon/CLAUDE.md +0 -19
  281. package/skills/generate-favicon/package.json +0 -29
  282. package/skills/generate-favicon/src/index.ts +0 -421
  283. package/skills/generate-favicon/tsconfig.json +0 -10
  284. package/skills/generate-qrcode/CLAUDE.md +0 -19
  285. package/skills/generate-qrcode/package.json +0 -30
  286. package/skills/generate-qrcode/src/index.ts +0 -584
  287. package/skills/generate-qrcode/tsconfig.json +0 -10
  288. package/skills/generate-resume/CLAUDE.md +0 -19
  289. package/skills/generate-resume/package.json +0 -27
  290. package/skills/generate-resume/src/cli.ts +0 -157
  291. package/skills/generate-resume/src/index.ts +0 -178
  292. package/skills/generate-resume/src/parsers.ts +0 -95
  293. package/skills/generate-resume/src/renderers.ts +0 -538
  294. package/skills/generate-resume/src/security.ts +0 -39
  295. package/skills/generate-resume/src/types.ts +0 -86
  296. package/skills/generate-resume/tsconfig.json +0 -10
  297. package/skills/generate-sitemap/CLAUDE.md +0 -19
  298. package/skills/generate-sitemap/package.json +0 -27
  299. package/skills/generate-sitemap/src/index.ts +0 -626
  300. package/skills/generate-sitemap/tsconfig.json +0 -10
  301. package/skills/gif-maker/CLAUDE.md +0 -19
  302. package/skills/gif-maker/package.json +0 -30
  303. package/skills/gif-maker/src/index.ts +0 -600
  304. package/skills/gif-maker/tsconfig.json +0 -10
  305. package/skills/hook/LICENSE +0 -192
  306. package/skills/hook/README.md +0 -74
  307. package/skills/hook/SKILL.md +0 -85
  308. package/skills/hook/bunfig.toml +0 -5
  309. package/skills/hook/package.json +0 -28
  310. package/skills/hook/src/commands/create.ts +0 -112
  311. package/skills/hook/src/commands/events.ts +0 -37
  312. package/skills/hook/src/commands/validate.ts +0 -117
  313. package/skills/hook/src/index.ts +0 -118
  314. package/skills/hook/src/templates/root.ts +0 -196
  315. package/skills/hook/src/templates/source.ts +0 -647
  316. package/skills/hook/tsconfig.json +0 -18
  317. package/skills/http-server/CLAUDE.md +0 -19
  318. package/skills/http-server/package.json +0 -29
  319. package/skills/http-server/src/index.ts +0 -51
  320. package/skills/http-server/tsconfig.json +0 -10
  321. package/skills/implementation/LICENSE +0 -192
  322. package/skills/implementation/README.md +0 -53
  323. package/skills/implementation/SKILL.md +0 -57
  324. package/skills/implementation/bunfig.toml +0 -5
  325. package/skills/implementation/package.json +0 -28
  326. package/skills/implementation/src/commands/create.ts +0 -187
  327. package/skills/implementation/src/index.ts +0 -62
  328. package/skills/implementation/tsconfig.json +0 -18
  329. package/skills/implementation-plan/CLAUDE.md +0 -19
  330. package/skills/implementation-plan/package.json +0 -29
  331. package/skills/implementation-plan/src/index.ts +0 -520
  332. package/skills/implementation-plan/tsconfig.json +0 -10
  333. package/skills/implementation-todo/CLAUDE.md +0 -19
  334. package/skills/implementation-todo/package.json +0 -29
  335. package/skills/implementation-todo/src/index.ts +0 -429
  336. package/skills/implementation-todo/tsconfig.json +0 -10
  337. package/skills/invoice/.env.example +0 -3
  338. package/skills/invoice/CLAUDE.md +0 -31
  339. package/skills/invoice/LICENSE +0 -192
  340. package/skills/invoice/README.md +0 -70
  341. package/skills/invoice/package.json +0 -26
  342. package/skills/invoice/src/commands/companies.ts +0 -202
  343. package/skills/invoice/src/commands/config.ts +0 -132
  344. package/skills/invoice/src/commands/generate.ts +0 -177
  345. package/skills/invoice/src/commands/invoices.ts +0 -218
  346. package/skills/invoice/src/index.ts +0 -3
  347. package/skills/invoice/src/lib/api.ts +0 -124
  348. package/skills/invoice/src/lib/storage.ts +0 -171
  349. package/skills/invoice/src/types/index.ts +0 -86
  350. package/skills/invoice/src/utils/logger.ts +0 -33
  351. package/skills/invoice/src/utils/paths.ts +0 -25
  352. package/skills/invoice/tsconfig.json +0 -23
  353. package/skills/invoice-reconciliation/SKILL.md +0 -98
  354. package/skills/invoice-reconciliation/package.json +0 -36
  355. package/skills/invoice-reconciliation/src/index.ts +0 -743
  356. package/skills/invoice-reconciliation/tsconfig.json +0 -17
  357. package/skills/landing-page-pack/SKILL.md +0 -55
  358. package/skills/landing-page-pack/package.json +0 -10
  359. package/skills/latex-table-generator/CLAUDE.md +0 -19
  360. package/skills/latex-table-generator/package.json +0 -29
  361. package/skills/latex-table-generator/src/index.ts +0 -113
  362. package/skills/latex-table-generator/tsconfig.json +0 -10
  363. package/skills/logo-design/SKILL.md +0 -94
  364. package/skills/logo-design/package.json +0 -35
  365. package/skills/logo-design/src/cli.ts +0 -132
  366. package/skills/logo-design/src/constants.ts +0 -5
  367. package/skills/logo-design/src/docs.ts +0 -102
  368. package/skills/logo-design/src/geometry.ts +0 -324
  369. package/skills/logo-design/src/index.ts +0 -212
  370. package/skills/logo-design/src/palette.ts +0 -258
  371. package/skills/logo-design/src/types.ts +0 -50
  372. package/skills/logo-design/tsconfig.json +0 -17
  373. package/skills/lorem-generator/CLAUDE.md +0 -19
  374. package/skills/lorem-generator/package.json +0 -29
  375. package/skills/lorem-generator/src/index.ts +0 -59
  376. package/skills/lorem-generator/tsconfig.json +0 -10
  377. package/skills/managemcp/CLAUDE.md +0 -14
  378. package/skills/managemcp/README.md +0 -24
  379. package/skills/managemcp/package.json +0 -16
  380. package/skills/managemcp/src/index.ts +0 -3
  381. package/skills/managemcp/tsconfig.json +0 -27
  382. package/skills/markdown-validator/CLAUDE.md +0 -19
  383. package/skills/markdown-validator/package.json +0 -29
  384. package/skills/markdown-validator/src/index.ts +0 -92
  385. package/skills/markdown-validator/tsconfig.json +0 -10
  386. package/skills/market-research-report/SKILL.md +0 -51
  387. package/skills/market-research-report/package.json +0 -10
  388. package/skills/meeting-pack/SKILL.md +0 -52
  389. package/skills/meeting-pack/package.json +0 -10
  390. package/skills/merge-pdfs/CLAUDE.md +0 -19
  391. package/skills/merge-pdfs/package.json +0 -31
  392. package/skills/merge-pdfs/src/index.ts +0 -427
  393. package/skills/merge-pdfs/tsconfig.json +0 -10
  394. package/skills/migration-plan-pack/SKILL.md +0 -56
  395. package/skills/migration-plan-pack/package.json +0 -10
  396. package/skills/monitor/SKILL.md +0 -69
  397. package/skills/monitor/package.json +0 -33
  398. package/skills/monitor/src/index.ts +0 -34
  399. package/skills/monitor/tsconfig.json +0 -17
  400. package/skills/one-page-website/SKILL.md +0 -128
  401. package/skills/one-page-website/package.json +0 -34
  402. package/skills/one-page-website/src/design.ts +0 -336
  403. package/skills/one-page-website/src/docs.ts +0 -159
  404. package/skills/one-page-website/src/index.ts +0 -357
  405. package/skills/one-page-website/src/page.ts +0 -340
  406. package/skills/one-page-website/src/styles.ts +0 -508
  407. package/skills/one-page-website/src/types.ts +0 -78
  408. package/skills/one-page-website/tsconfig.json +0 -17
  409. package/skills/pdf-generate/CLAUDE.md +0 -19
  410. package/skills/pdf-generate/SKILL.md +0 -86
  411. package/skills/pdf-generate/package.json +0 -21
  412. package/skills/pdf-generate/src/cli.ts +0 -162
  413. package/skills/pdf-generate/src/html.ts +0 -84
  414. package/skills/pdf-generate/src/index.ts +0 -62
  415. package/skills/pdf-generate/src/markdown.ts +0 -27
  416. package/skills/pdf-generate/src/pdf-writer.ts +0 -78
  417. package/skills/pdf-generate/src/runtime.ts +0 -34
  418. package/skills/pdf-generate/src/security.ts +0 -37
  419. package/skills/pdf-generate/src/templates.ts +0 -311
  420. package/skills/pdf-generate/src/types.ts +0 -28
  421. package/skills/pdf-generate/tsconfig.json +0 -16
  422. package/skills/pdf-to-dataset/SKILL.md +0 -88
  423. package/skills/pdf-to-dataset/package.json +0 -37
  424. package/skills/pdf-to-dataset/src/index.ts +0 -790
  425. package/skills/pdf-to-dataset/tsconfig.json +0 -17
  426. package/skills/pdf-to-markdown/SKILL.md +0 -81
  427. package/skills/pdf-to-markdown/package.json +0 -35
  428. package/skills/pdf-to-markdown/src/index.ts +0 -694
  429. package/skills/pdf-to-markdown/tsconfig.json +0 -17
  430. package/skills/performance-audit-report/SKILL.md +0 -49
  431. package/skills/performance-audit-report/package.json +0 -10
  432. package/skills/pitch-deck/SKILL.md +0 -51
  433. package/skills/pitch-deck/package.json +0 -10
  434. package/skills/product-mockup/SKILL.md +0 -107
  435. package/skills/product-mockup/package.json +0 -32
  436. package/skills/product-mockup/src/cli.ts +0 -150
  437. package/skills/product-mockup/src/design.ts +0 -151
  438. package/skills/product-mockup/src/docs.ts +0 -134
  439. package/skills/product-mockup/src/index.ts +0 -182
  440. package/skills/product-mockup/src/render.ts +0 -407
  441. package/skills/product-mockup/src/types.ts +0 -66
  442. package/skills/product-mockup/tsconfig.json +0 -17
  443. package/skills/proposal-pack/SKILL.md +0 -53
  444. package/skills/proposal-pack/package.json +0 -10
  445. package/skills/read-csv/SKILL.md +0 -62
  446. package/skills/read-csv/package.json +0 -37
  447. package/skills/read-csv/src/index.ts +0 -356
  448. package/skills/read-csv/tsconfig.json +0 -17
  449. package/skills/read-excel/SKILL.md +0 -64
  450. package/skills/read-excel/package.json +0 -36
  451. package/skills/read-excel/src/index.ts +0 -266
  452. package/skills/read-excel/tsconfig.json +0 -17
  453. package/skills/regex-tester/CLAUDE.md +0 -19
  454. package/skills/regex-tester/package.json +0 -27
  455. package/skills/regex-tester/src/index.ts +0 -183
  456. package/skills/regex-tester/tsconfig.json +0 -10
  457. package/skills/repo-onboarding-report/SKILL.md +0 -52
  458. package/skills/repo-onboarding-report/package.json +0 -10
  459. package/skills/scancommitpr/SKILL.md +0 -178
  460. package/skills/scancommitpr/package.json +0 -34
  461. package/skills/scancommitpr/src/index.ts +0 -44
  462. package/skills/scancommitpr/tsconfig.json +0 -13
  463. package/skills/scancommitpush/SKILL.md +0 -174
  464. package/skills/scancommitpush/package.json +0 -32
  465. package/skills/scancommitpush/src/index.ts +0 -44
  466. package/skills/scancommitpush/tsconfig.json +0 -13
  467. package/skills/scientific-figure-check/CLAUDE.md +0 -19
  468. package/skills/scientific-figure-check/package.json +0 -29
  469. package/skills/scientific-figure-check/src/index.ts +0 -83
  470. package/skills/scientific-figure-check/tsconfig.json +0 -10
  471. package/skills/security-audit/CLAUDE.md +0 -19
  472. package/skills/security-audit/package.json +0 -27
  473. package/skills/security-audit/src/index.ts +0 -145
  474. package/skills/security-audit/tsconfig.json +0 -10
  475. package/skills/security-audit-report/SKILL.md +0 -52
  476. package/skills/security-audit-report/package.json +0 -10
  477. package/skills/seo-content-pack/SKILL.md +0 -54
  478. package/skills/seo-content-pack/package.json +0 -10
  479. package/skills/siteanalyze/SKILL.md +0 -25
  480. package/skills/siteanalyze/package.json +0 -27
  481. package/skills/siteanalyze/src/index.ts +0 -592
  482. package/skills/slide-deck-generator/SKILL.md +0 -93
  483. package/skills/slide-deck-generator/package.json +0 -38
  484. package/skills/slide-deck-generator/src/cli.ts +0 -133
  485. package/skills/slide-deck-generator/src/index.ts +0 -148
  486. package/skills/slide-deck-generator/src/model.ts +0 -307
  487. package/skills/slide-deck-generator/src/pptx.ts +0 -143
  488. package/skills/slide-deck-generator/src/render.ts +0 -248
  489. package/skills/slide-deck-generator/src/types.ts +0 -114
  490. package/skills/slide-deck-generator/src/utils.ts +0 -53
  491. package/skills/slide-deck-generator/tsconfig.json +0 -17
  492. package/skills/social-content-calendar/SKILL.md +0 -54
  493. package/skills/social-content-calendar/package.json +0 -10
  494. package/skills/split-pdf/CLAUDE.md +0 -19
  495. package/skills/split-pdf/package.json +0 -30
  496. package/skills/split-pdf/src/index.ts +0 -301
  497. package/skills/split-pdf/tsconfig.json +0 -10
  498. package/skills/statistical-test-selector/CLAUDE.md +0 -19
  499. package/skills/statistical-test-selector/package.json +0 -27
  500. package/skills/statistical-test-selector/src/index.ts +0 -75
  501. package/skills/statistical-test-selector/tsconfig.json +0 -10
  502. package/skills/test-suite-generator/SKILL.md +0 -51
  503. package/skills/test-suite-generator/package.json +0 -10
  504. package/skills/tmux-session/SKILL.md +0 -109
  505. package/skills/tmux-session/package.json +0 -33
  506. package/skills/tmux-session/src/index.ts +0 -34
  507. package/skills/tmux-session/tsconfig.json +0 -17
  508. package/skills/todos-plan/SKILL.md +0 -363
  509. package/skills/todos-plan/agents/openai.yaml +0 -4
  510. package/skills/todos-plan/package.json +0 -9
  511. package/skills/todos-plan/src/index.ts +0 -68
  512. package/skills/tsconfig.base.json +0 -12
  513. package/skills/validate-config/CLAUDE.md +0 -19
  514. package/skills/validate-config/package.json +0 -29
  515. package/skills/validate-config/src/index.ts +0 -56
  516. package/skills/validate-config/tsconfig.json +0 -10
  517. package/skills/video-downloader/CLAUDE.md +0 -19
  518. package/skills/video-downloader/package.json +0 -29
  519. package/skills/video-downloader/src/index.ts +0 -561
  520. package/skills/video-downloader/tsconfig.json +0 -10
  521. package/skills/video-highlight-pack/SKILL.md +0 -54
  522. package/skills/video-highlight-pack/package.json +0 -10
  523. package/skills/watermark/CLAUDE.md +0 -19
  524. package/skills/watermark/package.json +0 -32
  525. package/skills/watermark/src/index.ts +0 -587
  526. 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
- }