@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,587 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import sharp from "sharp";
4
- import { PDFDocument, rgb, StandardFonts, degrees } from "pdf-lib";
5
- import * as fs from "fs";
6
- import * as path from "path";
7
- import minimist from "minimist";
8
- import { globSync } from "glob";
9
-
10
- // Types
11
- interface WatermarkOptions {
12
- output: string | null;
13
- text: string | null;
14
- image: string | null;
15
- position: string;
16
- opacity: number;
17
- rotation: number;
18
- tile: boolean;
19
- margin: number;
20
- // Text options
21
- font: string;
22
- fontSize: number;
23
- color: string;
24
- bgColor: string | null;
25
- shadow: boolean;
26
- outline: boolean;
27
- outlineColor: string;
28
- // Image options
29
- scale: number;
30
- width: number | null;
31
- height: number | null;
32
- // PDF options
33
- pages: string;
34
- layer: "over" | "under";
35
- }
36
-
37
- // Position presets
38
- const POSITION_PRESETS: Record<string, { x: string; y: string }> = {
39
- "top-left": { x: "left", y: "top" },
40
- "top-center": { x: "center", y: "top" },
41
- "top-right": { x: "right", y: "top" },
42
- "center-left": { x: "left", y: "center" },
43
- center: { x: "center", y: "center" },
44
- "center-right": { x: "right", y: "center" },
45
- "bottom-left": { x: "left", y: "bottom" },
46
- "bottom-center": { x: "center", y: "bottom" },
47
- "bottom-right": { x: "right", y: "bottom" },
48
- };
49
-
50
- // Parse command line arguments
51
- const args = minimist(process.argv.slice(2), {
52
- string: [
53
- "output",
54
- "text",
55
- "image",
56
- "position",
57
- "font",
58
- "color",
59
- "bg-color",
60
- "outline-color",
61
- "pages",
62
- "layer",
63
- ],
64
- boolean: ["tile", "shadow", "outline", "help"],
65
- default: {
66
- position: "bottom-right",
67
- opacity: 0.5,
68
- rotation: 0,
69
- tile: false,
70
- margin: 20,
71
- font: "Arial",
72
- "font-size": 24,
73
- color: "#ffffff",
74
- shadow: true,
75
- outline: false,
76
- "outline-color": "#000000",
77
- scale: 0.2,
78
- pages: "all",
79
- layer: "over",
80
- },
81
- alias: {
82
- o: "output",
83
- t: "text",
84
- i: "image",
85
- p: "position",
86
- h: "help",
87
- },
88
- });
89
-
90
- // Show help
91
- if (args.help || args._.length === 0) {
92
- console.log(`
93
- Watermark - Add watermarks to images and PDFs
94
-
95
- Usage:
96
- skills run watermark -- <file> [options]
97
-
98
- Options:
99
- -o, --output <path> Output file or directory
100
- -t, --text <text> Text watermark content
101
- -i, --image <path> Image watermark (logo) path
102
- -p, --position <pos> Position: top-left, center, bottom-right, etc. or "x,y"
103
- --opacity <number> Opacity 0.0-1.0 (default: 0.5)
104
- --rotation <degrees> Rotation angle (default: 0)
105
- --tile Tile watermark across image
106
- --margin <pixels> Margin from edges (default: 20)
107
-
108
- Text Options:
109
- --font <name> Font family (default: Arial)
110
- --font-size <pixels> Font size (default: 24)
111
- --color <hex> Text color (default: #ffffff)
112
- --bg-color <hex> Background color
113
- --shadow Add drop shadow (default: true)
114
- --outline Add text outline
115
- --outline-color <hex> Outline color (default: #000000)
116
-
117
- Image Options:
118
- --scale <factor> Scale relative to image (default: 0.2)
119
- --width <pixels> Fixed width
120
- --height <pixels> Fixed height
121
-
122
- PDF Options:
123
- --pages <range> Pages: "all", "1-5", "1,3,5" (default: all)
124
- --layer <position> Layer: over, under (default: over)
125
-
126
- Examples:
127
- skills run watermark -- photo.jpg --text "Copyright" -o marked.jpg
128
- skills run watermark -- photo.jpg --image logo.png -o branded.jpg
129
- skills run watermark -- doc.pdf --text "DRAFT" --rotation -45 -o draft.pdf
130
- `);
131
- process.exit(0);
132
- }
133
-
134
- // Parse options
135
- const options: WatermarkOptions = {
136
- output: args.output || null,
137
- text: args.text || null,
138
- image: args.image || null,
139
- position: args.position,
140
- opacity: parseFloat(args.opacity) || 0.5,
141
- rotation: parseFloat(args.rotation) || 0,
142
- tile: args.tile,
143
- margin: parseInt(args.margin) || 20,
144
- font: args.font,
145
- fontSize: parseInt(args["font-size"]) || 24,
146
- color: args.color,
147
- bgColor: args["bg-color"] || null,
148
- shadow: args.shadow,
149
- outline: args.outline,
150
- outlineColor: args["outline-color"],
151
- scale: parseFloat(args.scale) || 0.2,
152
- width: args.width ? parseInt(args.width) : null,
153
- height: args.height ? parseInt(args.height) : null,
154
- pages: args.pages,
155
- layer: args.layer as "over" | "under",
156
- };
157
-
158
- // Validate
159
- if (!options.text && !options.image) {
160
- console.error("Error: Must specify --text or --image watermark");
161
- process.exit(1);
162
- }
163
-
164
- // Get input files
165
- function getInputFiles(patterns: string[]): string[] {
166
- const files: string[] = [];
167
-
168
- for (const pattern of patterns) {
169
- const matches = globSync(pattern);
170
- if (matches.length > 0) {
171
- files.push(...matches);
172
- } else if (fs.existsSync(pattern)) {
173
- files.push(pattern);
174
- }
175
- }
176
-
177
- return files;
178
- }
179
-
180
- // Parse hex color to RGB
181
- function hexToRgb(hex: string): { r: number; g: number; b: number } {
182
- const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
183
- if (result) {
184
- return {
185
- r: parseInt(result[1], 16),
186
- g: parseInt(result[2], 16),
187
- b: parseInt(result[3], 16),
188
- };
189
- }
190
- return { r: 255, g: 255, b: 255 };
191
- }
192
-
193
- // Calculate position
194
- function calculatePosition(
195
- position: string,
196
- containerWidth: number,
197
- containerHeight: number,
198
- watermarkWidth: number,
199
- watermarkHeight: number,
200
- margin: number
201
- ): { x: number; y: number } {
202
- // Check for custom position
203
- if (position.includes(",")) {
204
- const [x, y] = position.split(",").map((v) => parseInt(v.trim()));
205
- return { x, y };
206
- }
207
-
208
- const preset = POSITION_PRESETS[position] || POSITION_PRESETS["bottom-right"];
209
-
210
- let x: number;
211
- let y: number;
212
-
213
- // Calculate X
214
- switch (preset.x) {
215
- case "left":
216
- x = margin;
217
- break;
218
- case "right":
219
- x = containerWidth - watermarkWidth - margin;
220
- break;
221
- default: // center
222
- x = (containerWidth - watermarkWidth) / 2;
223
- }
224
-
225
- // Calculate Y
226
- switch (preset.y) {
227
- case "top":
228
- y = margin;
229
- break;
230
- case "bottom":
231
- y = containerHeight - watermarkHeight - margin;
232
- break;
233
- default: // center
234
- y = (containerHeight - watermarkHeight) / 2;
235
- }
236
-
237
- return { x: Math.max(0, x), y: Math.max(0, y) };
238
- }
239
-
240
- // Create text watermark SVG
241
- function createTextSvg(
242
- text: string,
243
- options: WatermarkOptions,
244
- width: number,
245
- height: number
246
- ): string {
247
- const { color, fontSize, shadow, outline, outlineColor, bgColor } = options;
248
-
249
- let shadowFilter = "";
250
- if (shadow) {
251
- shadowFilter = `
252
- <filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
253
- <feDropShadow dx="2" dy="2" stdDeviation="2" flood-opacity="0.5"/>
254
- </filter>
255
- `;
256
- }
257
-
258
- const textStyle = `
259
- font-family: ${options.font}, Arial, sans-serif;
260
- font-size: ${fontSize}px;
261
- fill: ${color};
262
- ${shadow ? 'filter: url(#shadow);' : ''}
263
- ${outline ? `stroke: ${outlineColor}; stroke-width: 1px;` : ''}
264
- `;
265
-
266
- let bgRect = "";
267
- if (bgColor) {
268
- bgRect = `<rect x="0" y="0" width="100%" height="100%" fill="${bgColor}" rx="4"/>`;
269
- }
270
-
271
- // Estimate text dimensions
272
- const textWidth = text.length * fontSize * 0.6;
273
- const textHeight = fontSize * 1.2;
274
- const padding = 10;
275
-
276
- return `
277
- <svg width="${textWidth + padding * 2}" height="${textHeight + padding * 2}" xmlns="http://www.w3.org/2000/svg">
278
- <defs>${shadowFilter}</defs>
279
- ${bgRect}
280
- <text x="50%" y="50%" dominant-baseline="middle" text-anchor="middle" style="${textStyle}">
281
- ${text}
282
- </text>
283
- </svg>
284
- `;
285
- }
286
-
287
- // Watermark image using Sharp
288
- async function watermarkImage(inputPath: string, outputPath: string): Promise<void> {
289
- console.log(`Processing: ${inputPath}`);
290
-
291
- const image = sharp(inputPath);
292
- const metadata = await image.metadata();
293
- const { width: imgWidth = 800, height: imgHeight = 600 } = metadata;
294
-
295
- let watermarkBuffer: Buffer;
296
- let watermarkWidth: number;
297
- let watermarkHeight: number;
298
-
299
- if (options.text) {
300
- // Create text watermark
301
- const svg = createTextSvg(options.text, options, imgWidth, imgHeight);
302
- const svgBuffer = Buffer.from(svg);
303
- const svgImage = sharp(svgBuffer);
304
- const svgMeta = await svgImage.metadata();
305
- watermarkWidth = svgMeta.width || 200;
306
- watermarkHeight = svgMeta.height || 50;
307
-
308
- // Apply rotation if needed
309
- if (options.rotation !== 0) {
310
- watermarkBuffer = await svgImage
311
- .rotate(options.rotation, { background: { r: 0, g: 0, b: 0, alpha: 0 } })
312
- .toBuffer();
313
- const rotatedMeta = await sharp(watermarkBuffer).metadata();
314
- watermarkWidth = rotatedMeta.width || watermarkWidth;
315
- watermarkHeight = rotatedMeta.height || watermarkHeight;
316
- } else {
317
- watermarkBuffer = await svgImage.toBuffer();
318
- }
319
- } else if (options.image) {
320
- // Load image watermark
321
- let wmImage = sharp(options.image);
322
- const wmMeta = await wmImage.metadata();
323
-
324
- // Calculate dimensions
325
- if (options.width || options.height) {
326
- watermarkWidth = options.width || Math.round((options.height! / wmMeta.height!) * wmMeta.width!);
327
- watermarkHeight = options.height || Math.round((options.width! / wmMeta.width!) * wmMeta.height!);
328
- } else {
329
- watermarkWidth = Math.round(imgWidth * options.scale);
330
- watermarkHeight = Math.round((watermarkWidth / wmMeta.width!) * wmMeta.height!);
331
- }
332
-
333
- wmImage = wmImage.resize(watermarkWidth, watermarkHeight, { fit: "inside" });
334
-
335
- // Apply rotation
336
- if (options.rotation !== 0) {
337
- wmImage = wmImage.rotate(options.rotation, { background: { r: 0, g: 0, b: 0, alpha: 0 } });
338
- }
339
-
340
- watermarkBuffer = await wmImage.toBuffer();
341
- const finalMeta = await sharp(watermarkBuffer).metadata();
342
- watermarkWidth = finalMeta.width || watermarkWidth;
343
- watermarkHeight = finalMeta.height || watermarkHeight;
344
- } else {
345
- throw new Error("No watermark specified");
346
- }
347
-
348
- // Apply opacity
349
- if (options.opacity < 1) {
350
- watermarkBuffer = await sharp(watermarkBuffer)
351
- .ensureAlpha()
352
- .raw()
353
- .toBuffer({ resolveWithObject: true })
354
- .then(({ data, info }) => {
355
- // Modify alpha channel
356
- for (let i = 3; i < data.length; i += 4) {
357
- data[i] = Math.round(data[i] * options.opacity);
358
- }
359
- return sharp(data, { raw: { width: info.width, height: info.height, channels: 4 } })
360
- .png()
361
- .toBuffer();
362
- });
363
- }
364
-
365
- if (options.tile) {
366
- // Create tiled watermark
367
- const composites: sharp.OverlayOptions[] = [];
368
- const spacingX = watermarkWidth + options.margin * 2;
369
- const spacingY = watermarkHeight + options.margin * 2;
370
-
371
- for (let y = 0; y < imgHeight; y += spacingY) {
372
- for (let x = 0; x < imgWidth; x += spacingX) {
373
- composites.push({
374
- input: watermarkBuffer,
375
- left: Math.round(x),
376
- top: Math.round(y),
377
- });
378
- }
379
- }
380
-
381
- await image.composite(composites).toFile(outputPath);
382
- } else {
383
- // Single watermark
384
- const { x, y } = calculatePosition(
385
- options.position,
386
- imgWidth,
387
- imgHeight,
388
- watermarkWidth,
389
- watermarkHeight,
390
- options.margin
391
- );
392
-
393
- await image
394
- .composite([
395
- {
396
- input: watermarkBuffer,
397
- left: Math.round(x),
398
- top: Math.round(y),
399
- },
400
- ])
401
- .toFile(outputPath);
402
- }
403
-
404
- console.log(` -> ${outputPath}`);
405
- }
406
-
407
- // Parse page range
408
- function parsePageRange(pageStr: string, totalPages: number): number[] {
409
- if (pageStr === "all") {
410
- return Array.from({ length: totalPages }, (_, i) => i);
411
- }
412
-
413
- const pages: Set<number> = new Set();
414
- const parts = pageStr.split(",").map((p) => p.trim());
415
-
416
- for (const part of parts) {
417
- if (part.includes("-")) {
418
- const [start, end] = part.split("-").map((n) => parseInt(n.trim()));
419
- for (let i = start - 1; i < Math.min(end, totalPages); i++) {
420
- if (i >= 0) pages.add(i);
421
- }
422
- } else {
423
- const pageNum = parseInt(part) - 1;
424
- if (pageNum >= 0 && pageNum < totalPages) {
425
- pages.add(pageNum);
426
- }
427
- }
428
- }
429
-
430
- return Array.from(pages).sort((a, b) => a - b);
431
- }
432
-
433
- // Watermark PDF
434
- async function watermarkPdf(inputPath: string, outputPath: string): Promise<void> {
435
- console.log(`Processing PDF: ${inputPath}`);
436
-
437
- const pdfBytes = fs.readFileSync(inputPath);
438
- const pdfDoc = await PDFDocument.load(pdfBytes);
439
- const pages = pdfDoc.getPages();
440
- const totalPages = pages.length;
441
-
442
- const pageIndices = parsePageRange(options.pages, totalPages);
443
- console.log(` Watermarking ${pageIndices.length} of ${totalPages} pages`);
444
-
445
- // Embed font for text watermark
446
- const font = await pdfDoc.embedFont(StandardFonts.Helvetica);
447
-
448
- for (const pageIndex of pageIndices) {
449
- const page = pages[pageIndex];
450
- const { width, height } = page.getSize();
451
-
452
- if (options.text) {
453
- // Process text variables
454
- let text = options.text
455
- .replace("{n}", String(pageIndex + 1))
456
- .replace("{total}", String(totalPages))
457
- .replace("{date}", new Date().toISOString().split("T")[0])
458
- .replace("{filename}", path.basename(inputPath, ".pdf"));
459
-
460
- const textWidth = font.widthOfTextAtSize(text, options.fontSize);
461
- const textHeight = options.fontSize;
462
-
463
- const { x, y } = calculatePosition(
464
- options.position,
465
- width,
466
- height,
467
- textWidth,
468
- textHeight,
469
- options.margin
470
- );
471
-
472
- const color = hexToRgb(options.color);
473
-
474
- // Draw text
475
- page.drawText(text, {
476
- x,
477
- y,
478
- size: options.fontSize,
479
- font,
480
- color: rgb(color.r / 255, color.g / 255, color.b / 255),
481
- opacity: options.opacity,
482
- rotate: degrees(options.rotation),
483
- });
484
- }
485
-
486
- if (options.image) {
487
- // Embed and draw image watermark
488
- const imageBytes = fs.readFileSync(options.image);
489
- const ext = path.extname(options.image).toLowerCase();
490
-
491
- let embeddedImage;
492
- if (ext === ".png") {
493
- embeddedImage = await pdfDoc.embedPng(imageBytes);
494
- } else {
495
- embeddedImage = await pdfDoc.embedJpg(imageBytes);
496
- }
497
-
498
- // Calculate dimensions
499
- let wmWidth = embeddedImage.width;
500
- let wmHeight = embeddedImage.height;
501
-
502
- if (options.width || options.height) {
503
- wmWidth = options.width || Math.round((options.height! / wmHeight) * wmWidth);
504
- wmHeight = options.height || Math.round((options.width! / wmWidth) * wmHeight);
505
- } else {
506
- wmWidth = Math.round(width * options.scale);
507
- wmHeight = Math.round((wmWidth / embeddedImage.width) * embeddedImage.height);
508
- }
509
-
510
- const { x, y } = calculatePosition(
511
- options.position,
512
- width,
513
- height,
514
- wmWidth,
515
- wmHeight,
516
- options.margin
517
- );
518
-
519
- page.drawImage(embeddedImage, {
520
- x,
521
- y,
522
- width: wmWidth,
523
- height: wmHeight,
524
- opacity: options.opacity,
525
- rotate: degrees(options.rotation),
526
- });
527
- }
528
- }
529
-
530
- const outputBytes = await pdfDoc.save();
531
- fs.writeFileSync(outputPath, outputBytes);
532
- console.log(` -> ${outputPath}`);
533
- }
534
-
535
- // Main execution
536
- async function main(): Promise<void> {
537
- try {
538
- const inputFiles = getInputFiles(args._ as string[]);
539
-
540
- if (inputFiles.length === 0) {
541
- console.error("Error: No input files found");
542
- process.exit(1);
543
- }
544
-
545
- const isBatch = inputFiles.length > 1;
546
- const outputIsDir = options.output && (isBatch || fs.existsSync(options.output) && fs.statSync(options.output).isDirectory());
547
-
548
- // Create output directory if needed
549
- if (outputIsDir && options.output && !fs.existsSync(options.output)) {
550
- fs.mkdirSync(options.output, { recursive: true });
551
- }
552
-
553
- console.log(`\nProcessing ${inputFiles.length} file(s)...\n`);
554
-
555
- for (const inputFile of inputFiles) {
556
- const ext = path.extname(inputFile).toLowerCase();
557
- const basename = path.basename(inputFile);
558
-
559
- // Determine output path
560
- let outputPath: string;
561
- if (outputIsDir && options.output) {
562
- outputPath = path.join(options.output, basename);
563
- } else if (options.output) {
564
- outputPath = options.output;
565
- } else {
566
- const name = path.basename(inputFile, ext);
567
- outputPath = path.join(path.dirname(inputFile), `${name}-watermarked${ext}`);
568
- }
569
-
570
- // Process based on type
571
- if (ext === ".pdf") {
572
- await watermarkPdf(inputFile, outputPath);
573
- } else if ([".jpg", ".jpeg", ".png", ".webp", ".tiff", ".bmp"].includes(ext)) {
574
- await watermarkImage(inputFile, outputPath);
575
- } else {
576
- console.warn(`Skipping unsupported format: ${inputFile}`);
577
- }
578
- }
579
-
580
- console.log("\nDone!");
581
- } catch (error: any) {
582
- console.error(`Error: ${error.message}`);
583
- process.exit(1);
584
- }
585
- }
586
-
587
- main();
@@ -1,10 +0,0 @@
1
- {
2
- "extends": "../tsconfig.base.json",
3
- "compilerOptions": {
4
- "outDir": "dist"
5
- },
6
- "include": [
7
- "src/**/*",
8
- "bin/**/*"
9
- ]
10
- }