@lhremote/cli 0.0.0 → 0.2.0

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 (285) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +58 -2
  3. package/dist/cli.js +4 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/handlers/campaign-add-action.d.ts +14 -0
  6. package/dist/handlers/campaign-add-action.d.ts.map +1 -0
  7. package/dist/handlers/campaign-add-action.js +51 -0
  8. package/dist/handlers/campaign-add-action.js.map +1 -0
  9. package/dist/handlers/campaign-add-action.test.d.ts +2 -0
  10. package/dist/handlers/campaign-add-action.test.d.ts.map +1 -0
  11. package/dist/handlers/campaign-add-action.test.js +121 -0
  12. package/dist/handlers/campaign-add-action.test.js.map +1 -0
  13. package/dist/handlers/campaign-create.d.ts +11 -0
  14. package/dist/handlers/campaign-create.d.ts.map +1 -0
  15. package/dist/handlers/campaign-create.js +79 -0
  16. package/dist/handlers/campaign-create.js.map +1 -0
  17. package/dist/handlers/campaign-create.test.d.ts +2 -0
  18. package/dist/handlers/campaign-create.test.d.ts.map +1 -0
  19. package/dist/handlers/campaign-create.test.js +139 -0
  20. package/dist/handlers/campaign-create.test.js.map +1 -0
  21. package/dist/handlers/campaign-delete.d.ts +8 -0
  22. package/dist/handlers/campaign-delete.d.ts.map +1 -0
  23. package/dist/handlers/campaign-delete.js +39 -0
  24. package/dist/handlers/campaign-delete.js.map +1 -0
  25. package/dist/handlers/campaign-delete.test.d.ts +2 -0
  26. package/dist/handlers/campaign-delete.test.d.ts.map +1 -0
  27. package/dist/handlers/campaign-delete.test.js +73 -0
  28. package/dist/handlers/campaign-delete.test.js.map +1 -0
  29. package/dist/handlers/campaign-exclude-add.d.ts +11 -0
  30. package/dist/handlers/campaign-exclude-add.d.ts.map +1 -0
  31. package/dist/handlers/campaign-exclude-add.js +58 -0
  32. package/dist/handlers/campaign-exclude-add.js.map +1 -0
  33. package/dist/handlers/campaign-exclude-add.test.d.ts +2 -0
  34. package/dist/handlers/campaign-exclude-add.test.d.ts.map +1 -0
  35. package/dist/handlers/campaign-exclude-add.test.js +144 -0
  36. package/dist/handlers/campaign-exclude-add.test.js.map +1 -0
  37. package/dist/handlers/campaign-exclude-list.d.ts +9 -0
  38. package/dist/handlers/campaign-exclude-list.d.ts.map +1 -0
  39. package/dist/handlers/campaign-exclude-list.js +46 -0
  40. package/dist/handlers/campaign-exclude-list.js.map +1 -0
  41. package/dist/handlers/campaign-exclude-list.test.d.ts +2 -0
  42. package/dist/handlers/campaign-exclude-list.test.d.ts.map +1 -0
  43. package/dist/handlers/campaign-exclude-list.test.js +109 -0
  44. package/dist/handlers/campaign-exclude-list.test.js.map +1 -0
  45. package/dist/handlers/campaign-exclude-remove.d.ts +11 -0
  46. package/dist/handlers/campaign-exclude-remove.d.ts.map +1 -0
  47. package/dist/handlers/campaign-exclude-remove.js +58 -0
  48. package/dist/handlers/campaign-exclude-remove.js.map +1 -0
  49. package/dist/handlers/campaign-exclude-remove.test.d.ts +2 -0
  50. package/dist/handlers/campaign-exclude-remove.test.d.ts.map +1 -0
  51. package/dist/handlers/campaign-exclude-remove.test.js +147 -0
  52. package/dist/handlers/campaign-exclude-remove.test.js.map +1 -0
  53. package/dist/handlers/campaign-export.d.ts +9 -0
  54. package/dist/handlers/campaign-export.d.ts.map +1 -0
  55. package/dist/handlers/campaign-export.js +42 -0
  56. package/dist/handlers/campaign-export.js.map +1 -0
  57. package/dist/handlers/campaign-export.test.d.ts +2 -0
  58. package/dist/handlers/campaign-export.test.d.ts.map +1 -0
  59. package/dist/handlers/campaign-export.test.js +84 -0
  60. package/dist/handlers/campaign-export.test.js.map +1 -0
  61. package/dist/handlers/campaign-get.d.ts +8 -0
  62. package/dist/handlers/campaign-get.d.ts.map +1 -0
  63. package/dist/handlers/campaign-get.js +46 -0
  64. package/dist/handlers/campaign-get.js.map +1 -0
  65. package/dist/handlers/campaign-get.test.d.ts +2 -0
  66. package/dist/handlers/campaign-get.test.d.ts.map +1 -0
  67. package/dist/handlers/campaign-get.test.js +131 -0
  68. package/dist/handlers/campaign-get.test.js.map +1 -0
  69. package/dist/handlers/campaign-list.d.ts +6 -0
  70. package/dist/handlers/campaign-list.d.ts.map +1 -0
  71. package/dist/handlers/campaign-list.js +55 -0
  72. package/dist/handlers/campaign-list.js.map +1 -0
  73. package/dist/handlers/campaign-list.test.d.ts +2 -0
  74. package/dist/handlers/campaign-list.test.d.ts.map +1 -0
  75. package/dist/handlers/campaign-list.test.js +129 -0
  76. package/dist/handlers/campaign-list.test.js.map +1 -0
  77. package/dist/handlers/campaign-move-next.d.ts +10 -0
  78. package/dist/handlers/campaign-move-next.d.ts.map +1 -0
  79. package/dist/handlers/campaign-move-next.js +52 -0
  80. package/dist/handlers/campaign-move-next.js.map +1 -0
  81. package/dist/handlers/campaign-move-next.test.d.ts +2 -0
  82. package/dist/handlers/campaign-move-next.test.d.ts.map +1 -0
  83. package/dist/handlers/campaign-move-next.test.js +127 -0
  84. package/dist/handlers/campaign-move-next.test.js.map +1 -0
  85. package/dist/handlers/campaign-remove-action.d.ts +8 -0
  86. package/dist/handlers/campaign-remove-action.d.ts.map +1 -0
  87. package/dist/handlers/campaign-remove-action.js +43 -0
  88. package/dist/handlers/campaign-remove-action.js.map +1 -0
  89. package/dist/handlers/campaign-remove-action.test.d.ts +2 -0
  90. package/dist/handlers/campaign-remove-action.test.d.ts.map +1 -0
  91. package/dist/handlers/campaign-remove-action.test.js +79 -0
  92. package/dist/handlers/campaign-remove-action.test.js.map +1 -0
  93. package/dist/handlers/campaign-reorder-actions.d.ts +9 -0
  94. package/dist/handlers/campaign-reorder-actions.d.ts.map +1 -0
  95. package/dist/handlers/campaign-reorder-actions.js +66 -0
  96. package/dist/handlers/campaign-reorder-actions.js.map +1 -0
  97. package/dist/handlers/campaign-reorder-actions.test.d.ts +2 -0
  98. package/dist/handlers/campaign-reorder-actions.test.d.ts.map +1 -0
  99. package/dist/handlers/campaign-reorder-actions.test.js +118 -0
  100. package/dist/handlers/campaign-reorder-actions.test.js.map +1 -0
  101. package/dist/handlers/campaign-retry.d.ts +10 -0
  102. package/dist/handlers/campaign-retry.d.ts.map +1 -0
  103. package/dist/handlers/campaign-retry.js +45 -0
  104. package/dist/handlers/campaign-retry.js.map +1 -0
  105. package/dist/handlers/campaign-retry.test.d.ts +2 -0
  106. package/dist/handlers/campaign-retry.test.d.ts.map +1 -0
  107. package/dist/handlers/campaign-retry.test.js +111 -0
  108. package/dist/handlers/campaign-retry.test.js.map +1 -0
  109. package/dist/handlers/campaign-start.d.ts +10 -0
  110. package/dist/handlers/campaign-start.d.ts.map +1 -0
  111. package/dist/handlers/campaign-start.js +54 -0
  112. package/dist/handlers/campaign-start.js.map +1 -0
  113. package/dist/handlers/campaign-start.test.d.ts +2 -0
  114. package/dist/handlers/campaign-start.test.d.ts.map +1 -0
  115. package/dist/handlers/campaign-start.test.js +119 -0
  116. package/dist/handlers/campaign-start.test.js.map +1 -0
  117. package/dist/handlers/campaign-statistics.d.ts +10 -0
  118. package/dist/handlers/campaign-statistics.d.ts.map +1 -0
  119. package/dist/handlers/campaign-statistics.js +63 -0
  120. package/dist/handlers/campaign-statistics.js.map +1 -0
  121. package/dist/handlers/campaign-statistics.test.d.ts +2 -0
  122. package/dist/handlers/campaign-statistics.test.d.ts.map +1 -0
  123. package/dist/handlers/campaign-statistics.test.js +141 -0
  124. package/dist/handlers/campaign-statistics.test.js.map +1 -0
  125. package/dist/handlers/campaign-status.d.ts +10 -0
  126. package/dist/handlers/campaign-status.d.ts.map +1 -0
  127. package/dist/handlers/campaign-status.js +62 -0
  128. package/dist/handlers/campaign-status.js.map +1 -0
  129. package/dist/handlers/campaign-status.test.d.ts +2 -0
  130. package/dist/handlers/campaign-status.test.d.ts.map +1 -0
  131. package/dist/handlers/campaign-status.test.js +123 -0
  132. package/dist/handlers/campaign-status.test.js.map +1 -0
  133. package/dist/handlers/campaign-stop.d.ts +8 -0
  134. package/dist/handlers/campaign-stop.d.ts.map +1 -0
  135. package/dist/handlers/campaign-stop.js +39 -0
  136. package/dist/handlers/campaign-stop.js.map +1 -0
  137. package/dist/handlers/campaign-stop.test.d.ts +2 -0
  138. package/dist/handlers/campaign-stop.test.d.ts.map +1 -0
  139. package/dist/handlers/campaign-stop.test.js +73 -0
  140. package/dist/handlers/campaign-stop.test.js.map +1 -0
  141. package/dist/handlers/campaign-update.d.ts +11 -0
  142. package/dist/handlers/campaign-update.d.ts.map +1 -0
  143. package/dist/handlers/campaign-update.js +51 -0
  144. package/dist/handlers/campaign-update.js.map +1 -0
  145. package/dist/handlers/campaign-update.test.d.ts +2 -0
  146. package/dist/handlers/campaign-update.test.d.ts.map +1 -0
  147. package/dist/handlers/campaign-update.test.js +95 -0
  148. package/dist/handlers/campaign-update.test.js.map +1 -0
  149. package/dist/handlers/check-replies.d.ts +9 -0
  150. package/dist/handlers/check-replies.d.ts.map +1 -0
  151. package/dist/handlers/check-replies.js +49 -0
  152. package/dist/handlers/check-replies.js.map +1 -0
  153. package/dist/handlers/check-replies.test.d.ts +2 -0
  154. package/dist/handlers/check-replies.test.d.ts.map +1 -0
  155. package/dist/handlers/check-replies.test.js +138 -0
  156. package/dist/handlers/check-replies.test.js.map +1 -0
  157. package/dist/handlers/check-status.d.ts +8 -0
  158. package/dist/handlers/check-status.d.ts.map +1 -0
  159. package/dist/handlers/check-status.js +50 -0
  160. package/dist/handlers/check-status.js.map +1 -0
  161. package/dist/handlers/check-status.test.d.ts +2 -0
  162. package/dist/handlers/check-status.test.d.ts.map +1 -0
  163. package/dist/handlers/check-status.test.js +112 -0
  164. package/dist/handlers/check-status.test.js.map +1 -0
  165. package/dist/handlers/describe-actions.d.ts +7 -0
  166. package/dist/handlers/describe-actions.d.ts.map +1 -0
  167. package/dist/handlers/describe-actions.js +74 -0
  168. package/dist/handlers/describe-actions.js.map +1 -0
  169. package/dist/handlers/describe-actions.test.d.ts +2 -0
  170. package/dist/handlers/describe-actions.test.d.ts.map +1 -0
  171. package/dist/handlers/describe-actions.test.js +95 -0
  172. package/dist/handlers/describe-actions.test.js.map +1 -0
  173. package/dist/handlers/find-app.d.ts +5 -0
  174. package/dist/handlers/find-app.d.ts.map +1 -0
  175. package/dist/handlers/find-app.js +28 -0
  176. package/dist/handlers/find-app.js.map +1 -0
  177. package/dist/handlers/find-app.test.d.ts +2 -0
  178. package/dist/handlers/find-app.test.d.ts.map +1 -0
  179. package/dist/handlers/find-app.test.js +75 -0
  180. package/dist/handlers/find-app.test.js.map +1 -0
  181. package/dist/handlers/import-people-from-urls.d.ts +10 -0
  182. package/dist/handlers/import-people-from-urls.d.ts.map +1 -0
  183. package/dist/handlers/import-people-from-urls.js +96 -0
  184. package/dist/handlers/import-people-from-urls.js.map +1 -0
  185. package/dist/handlers/import-people-from-urls.test.d.ts +2 -0
  186. package/dist/handlers/import-people-from-urls.test.d.ts.map +1 -0
  187. package/dist/handlers/import-people-from-urls.test.js +166 -0
  188. package/dist/handlers/import-people-from-urls.test.js.map +1 -0
  189. package/dist/handlers/index.d.ts +33 -0
  190. package/dist/handlers/index.d.ts.map +1 -0
  191. package/dist/handlers/index.js +35 -0
  192. package/dist/handlers/index.js.map +1 -0
  193. package/dist/handlers/launch-app.d.ts +3 -0
  194. package/dist/handlers/launch-app.d.ts.map +1 -0
  195. package/dist/handlers/launch-app.js +18 -0
  196. package/dist/handlers/launch-app.js.map +1 -0
  197. package/dist/handlers/launch-app.test.d.ts +2 -0
  198. package/dist/handlers/launch-app.test.d.ts.map +1 -0
  199. package/dist/handlers/launch-app.test.js +64 -0
  200. package/dist/handlers/launch-app.test.js.map +1 -0
  201. package/dist/handlers/list-accounts.d.ts +8 -0
  202. package/dist/handlers/list-accounts.d.ts.map +1 -0
  203. package/dist/handlers/list-accounts.js +43 -0
  204. package/dist/handlers/list-accounts.js.map +1 -0
  205. package/dist/handlers/list-accounts.test.d.ts +2 -0
  206. package/dist/handlers/list-accounts.test.d.ts.map +1 -0
  207. package/dist/handlers/list-accounts.test.js +87 -0
  208. package/dist/handlers/list-accounts.test.js.map +1 -0
  209. package/dist/handlers/person-ids.d.ts +7 -0
  210. package/dist/handlers/person-ids.d.ts.map +1 -0
  211. package/dist/handlers/person-ids.js +50 -0
  212. package/dist/handlers/person-ids.js.map +1 -0
  213. package/dist/handlers/query-messages.d.ts +10 -0
  214. package/dist/handlers/query-messages.d.ts.map +1 -0
  215. package/dist/handlers/query-messages.integration.test.d.ts +2 -0
  216. package/dist/handlers/query-messages.integration.test.d.ts.map +1 -0
  217. package/dist/handlers/query-messages.integration.test.js +106 -0
  218. package/dist/handlers/query-messages.integration.test.js.map +1 -0
  219. package/dist/handlers/query-messages.js +113 -0
  220. package/dist/handlers/query-messages.js.map +1 -0
  221. package/dist/handlers/query-messages.test.d.ts +2 -0
  222. package/dist/handlers/query-messages.test.d.ts.map +1 -0
  223. package/dist/handlers/query-messages.test.js +231 -0
  224. package/dist/handlers/query-messages.test.js.map +1 -0
  225. package/dist/handlers/query-profile.d.ts +7 -0
  226. package/dist/handlers/query-profile.d.ts.map +1 -0
  227. package/dist/handlers/query-profile.js +79 -0
  228. package/dist/handlers/query-profile.js.map +1 -0
  229. package/dist/handlers/query-profile.test.d.ts +2 -0
  230. package/dist/handlers/query-profile.test.d.ts.map +1 -0
  231. package/dist/handlers/query-profile.test.js +221 -0
  232. package/dist/handlers/query-profile.test.js.map +1 -0
  233. package/dist/handlers/query-profiles.d.ts +9 -0
  234. package/dist/handlers/query-profiles.d.ts.map +1 -0
  235. package/dist/handlers/query-profiles.js +83 -0
  236. package/dist/handlers/query-profiles.js.map +1 -0
  237. package/dist/handlers/query-profiles.test.d.ts +2 -0
  238. package/dist/handlers/query-profiles.test.d.ts.map +1 -0
  239. package/dist/handlers/query-profiles.test.js +286 -0
  240. package/dist/handlers/query-profiles.test.js.map +1 -0
  241. package/dist/handlers/quit-app.d.ts +3 -0
  242. package/dist/handlers/quit-app.d.ts.map +1 -0
  243. package/dist/handlers/quit-app.js +18 -0
  244. package/dist/handlers/quit-app.js.map +1 -0
  245. package/dist/handlers/quit-app.test.d.ts +2 -0
  246. package/dist/handlers/quit-app.test.d.ts.map +1 -0
  247. package/dist/handlers/quit-app.test.js +60 -0
  248. package/dist/handlers/quit-app.test.js.map +1 -0
  249. package/dist/handlers/scrape-messaging-history.d.ts +8 -0
  250. package/dist/handlers/scrape-messaging-history.d.ts.map +1 -0
  251. package/dist/handlers/scrape-messaging-history.js +45 -0
  252. package/dist/handlers/scrape-messaging-history.js.map +1 -0
  253. package/dist/handlers/scrape-messaging-history.test.d.ts +2 -0
  254. package/dist/handlers/scrape-messaging-history.test.d.ts.map +1 -0
  255. package/dist/handlers/scrape-messaging-history.test.js +101 -0
  256. package/dist/handlers/scrape-messaging-history.test.js.map +1 -0
  257. package/dist/handlers/start-instance.d.ts +7 -0
  258. package/dist/handlers/start-instance.d.ts.map +1 -0
  259. package/dist/handlers/start-instance.js +42 -0
  260. package/dist/handlers/start-instance.js.map +1 -0
  261. package/dist/handlers/start-instance.test.d.ts +2 -0
  262. package/dist/handlers/start-instance.test.d.ts.map +1 -0
  263. package/dist/handlers/start-instance.test.js +97 -0
  264. package/dist/handlers/start-instance.test.js.map +1 -0
  265. package/dist/handlers/stop-instance.d.ts +7 -0
  266. package/dist/handlers/stop-instance.d.ts.map +1 -0
  267. package/dist/handlers/stop-instance.js +34 -0
  268. package/dist/handlers/stop-instance.js.map +1 -0
  269. package/dist/handlers/stop-instance.test.d.ts +2 -0
  270. package/dist/handlers/stop-instance.test.d.ts.map +1 -0
  271. package/dist/handlers/stop-instance.test.js +66 -0
  272. package/dist/handlers/stop-instance.test.js.map +1 -0
  273. package/dist/handlers/testing/mock-helpers.d.ts +56 -0
  274. package/dist/handlers/testing/mock-helpers.d.ts.map +1 -0
  275. package/dist/handlers/testing/mock-helpers.js +95 -0
  276. package/dist/handlers/testing/mock-helpers.js.map +1 -0
  277. package/dist/program.d.ts +6 -0
  278. package/dist/program.d.ts.map +1 -0
  279. package/dist/program.js +341 -0
  280. package/dist/program.js.map +1 -0
  281. package/dist/program.test.d.ts +2 -0
  282. package/dist/program.test.d.ts.map +1 -0
  283. package/dist/program.test.js +154 -0
  284. package/dist/program.test.js.map +1 -0
  285. package/package.json +27 -13
@@ -0,0 +1,341 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { createRequire } from "node:module";
4
+ import { Command, InvalidArgumentError, Option } from "commander";
5
+ import { handleCampaignAddAction, handleCampaignCreate, handleCampaignDelete, handleCampaignExcludeAdd, handleCampaignExcludeList, handleCampaignExcludeRemove, handleCampaignExport, handleCampaignGet, handleCampaignList, handleCampaignMoveNext, handleCampaignRemoveAction, handleCampaignReorderActions, handleCampaignRetry, handleCampaignStart, handleCampaignStatistics, handleCampaignStatus, handleCampaignStop, handleCampaignUpdate, handleImportPeopleFromUrls, handleCheckReplies, handleCheckStatus, handleDescribeActions, handleFindApp, handleLaunchApp, handleListAccounts, handleQueryMessages, handleQueryProfile, handleQueryProfiles, handleScrapeMessagingHistory, handleQuitApp, handleStartInstance, handleStopInstance, } from "./handlers/index.js";
6
+ const require = createRequire(import.meta.url);
7
+ const { version } = require("../package.json");
8
+ /** Parse a string as a positive integer, throwing on invalid input. */
9
+ function parsePositiveInt(value) {
10
+ const n = Number(value);
11
+ if (!Number.isInteger(n) || n <= 0) {
12
+ throw new InvalidArgumentError(`Expected a positive integer, got "${value}".`);
13
+ }
14
+ return n;
15
+ }
16
+ /** Parse a string as a max-results value: positive integer or -1 for unlimited. */
17
+ function parseMaxResults(value) {
18
+ const n = Number(value);
19
+ if (!Number.isInteger(n) || n < -1 || n === 0) {
20
+ throw new InvalidArgumentError(`Expected a positive integer or -1 for unlimited, got "${value}".`);
21
+ }
22
+ return n;
23
+ }
24
+ /** Parse a string as a non-negative integer, throwing on invalid input. */
25
+ function parseNonNegativeInt(value) {
26
+ const n = Number(value);
27
+ if (!Number.isInteger(n) || n < 0) {
28
+ throw new InvalidArgumentError(`Expected a non-negative integer, got "${value}".`);
29
+ }
30
+ return n;
31
+ }
32
+ /**
33
+ * Create the CLI program with all subcommands registered.
34
+ */
35
+ export function createProgram() {
36
+ const program = new Command()
37
+ .name("lhremote")
38
+ .description("CLI for LinkedHelper automation")
39
+ .version(version);
40
+ program
41
+ .command("find-app")
42
+ .description("Detect running LinkedHelper instances")
43
+ .option("--json", "Output as JSON")
44
+ .action(handleFindApp);
45
+ program
46
+ .command("launch-app")
47
+ .description("Launch the LinkedHelper application")
48
+ .action(handleLaunchApp);
49
+ program
50
+ .command("quit-app")
51
+ .description("Quit the LinkedHelper application")
52
+ .action(handleQuitApp);
53
+ program
54
+ .command("list-accounts")
55
+ .description("List LinkedHelper accounts")
56
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
57
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
58
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
59
+ .option("--json", "Output as JSON")
60
+ .action(handleListAccounts);
61
+ program
62
+ .command("start-instance")
63
+ .description("Start a LinkedHelper instance")
64
+ .argument("<accountId>", "Account ID to start", parsePositiveInt)
65
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
66
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
67
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
68
+ .action(handleStartInstance);
69
+ program
70
+ .command("stop-instance")
71
+ .description("Stop a LinkedHelper instance")
72
+ .argument("<accountId>", "Account ID to stop", parsePositiveInt)
73
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
74
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
75
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
76
+ .action(handleStopInstance);
77
+ program
78
+ .command("campaign-list")
79
+ .description("List LinkedHelper campaigns")
80
+ .option("--include-archived", "Include archived campaigns")
81
+ .option("--json", "Output as JSON")
82
+ .action(handleCampaignList);
83
+ program
84
+ .command("campaign-create")
85
+ .description("Create a new campaign from YAML or JSON configuration")
86
+ .option("--file <path>", "Path to campaign configuration file")
87
+ .option("--yaml <config>", "Inline YAML campaign configuration")
88
+ .option("--json-input <config>", "Inline JSON campaign configuration")
89
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
90
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
91
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
92
+ .option("--json", "Output as JSON")
93
+ .action(handleCampaignCreate);
94
+ program
95
+ .command("campaign-get")
96
+ .description("Get detailed campaign information")
97
+ .argument("<campaignId>", "Campaign ID", parsePositiveInt)
98
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
99
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
100
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
101
+ .option("--json", "Output as JSON")
102
+ .action(handleCampaignGet);
103
+ program
104
+ .command("campaign-delete")
105
+ .description("Delete (archive) a campaign")
106
+ .argument("<campaignId>", "Campaign ID to delete", parsePositiveInt)
107
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
108
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
109
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
110
+ .option("--json", "Output as JSON")
111
+ .action(handleCampaignDelete);
112
+ program
113
+ .command("campaign-exclude-list")
114
+ .description("View the exclude list for a campaign or action")
115
+ .argument("<campaignId>", "Campaign ID", parsePositiveInt)
116
+ .option("--action-id <id>", "Action ID (shows action-level exclude list instead of campaign-level)", parsePositiveInt)
117
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
118
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
119
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
120
+ .option("--json", "Output as JSON")
121
+ .action(handleCampaignExcludeList);
122
+ program
123
+ .command("campaign-exclude-add")
124
+ .description("Add people to a campaign or action exclude list")
125
+ .argument("<campaignId>", "Campaign ID", parsePositiveInt)
126
+ .option("--person-ids <ids>", "Comma-separated person IDs")
127
+ .option("--person-ids-file <path>", "File containing person IDs")
128
+ .option("--action-id <id>", "Action ID (adds to action-level exclude list instead of campaign-level)", parsePositiveInt)
129
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
130
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
131
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
132
+ .option("--json", "Output as JSON")
133
+ .action(handleCampaignExcludeAdd);
134
+ program
135
+ .command("campaign-exclude-remove")
136
+ .description("Remove people from a campaign or action exclude list")
137
+ .argument("<campaignId>", "Campaign ID", parsePositiveInt)
138
+ .option("--person-ids <ids>", "Comma-separated person IDs")
139
+ .option("--person-ids-file <path>", "File containing person IDs")
140
+ .option("--action-id <id>", "Action ID (removes from action-level exclude list instead of campaign-level)", parsePositiveInt)
141
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
142
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
143
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
144
+ .option("--json", "Output as JSON")
145
+ .action(handleCampaignExcludeRemove);
146
+ program
147
+ .command("campaign-export")
148
+ .description("Export a campaign configuration as YAML or JSON")
149
+ .argument("<campaignId>", "Campaign ID to export", parsePositiveInt)
150
+ .addOption(new Option("--format <format>", "Export format")
151
+ .choices(["yaml", "json"])
152
+ .default("yaml"))
153
+ .option("--output <path>", "Output file path (default: stdout)")
154
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
155
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
156
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
157
+ .action(handleCampaignExport);
158
+ program
159
+ .command("campaign-status")
160
+ .description("Check campaign execution status")
161
+ .argument("<campaignId>", "Campaign ID to check", parsePositiveInt)
162
+ .option("--include-results", "Include execution results")
163
+ .option("--limit <n>", "Max results to show (default: 20)", parsePositiveInt)
164
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
165
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
166
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
167
+ .option("--json", "Output as JSON")
168
+ .action(handleCampaignStatus);
169
+ program
170
+ .command("campaign-statistics")
171
+ .description("Get per-action statistics for a campaign")
172
+ .argument("<campaignId>", "Campaign ID", parsePositiveInt)
173
+ .option("--action-id <id>", "Filter to a specific action", parsePositiveInt)
174
+ .option("--max-errors <n>", "Max top errors per action (default: 5)", parsePositiveInt)
175
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
176
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
177
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
178
+ .option("--json", "Output as JSON")
179
+ .action(handleCampaignStatistics);
180
+ program
181
+ .command("campaign-move-next")
182
+ .description("Move people from one action to the next in a campaign")
183
+ .argument("<campaignId>", "Campaign ID", parsePositiveInt)
184
+ .argument("<actionId>", "Action ID to move people from", parsePositiveInt)
185
+ .option("--person-ids <ids>", "Comma-separated person IDs")
186
+ .option("--person-ids-file <path>", "File containing person IDs")
187
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
188
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
189
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
190
+ .option("--json", "Output as JSON")
191
+ .action(handleCampaignMoveNext);
192
+ program
193
+ .command("campaign-retry")
194
+ .description("Reset specified people for re-run in a campaign")
195
+ .argument("<campaignId>", "Campaign ID", parsePositiveInt)
196
+ .option("--person-ids <ids>", "Comma-separated person IDs")
197
+ .option("--person-ids-file <path>", "File containing person IDs")
198
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
199
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
200
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
201
+ .option("--json", "Output as JSON")
202
+ .action(handleCampaignRetry);
203
+ program
204
+ .command("campaign-start")
205
+ .description("Start a campaign with specified target persons")
206
+ .argument("<campaignId>", "Campaign ID to start", parsePositiveInt)
207
+ .option("--person-ids <ids>", "Comma-separated person IDs")
208
+ .option("--person-ids-file <path>", "File containing person IDs")
209
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
210
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
211
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
212
+ .option("--json", "Output as JSON")
213
+ .action(handleCampaignStart);
214
+ program
215
+ .command("campaign-stop")
216
+ .description("Stop a running campaign")
217
+ .argument("<campaignId>", "Campaign ID to stop", parsePositiveInt)
218
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
219
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
220
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
221
+ .option("--json", "Output as JSON")
222
+ .action(handleCampaignStop);
223
+ program
224
+ .command("campaign-update")
225
+ .description("Update a campaign's name and/or description")
226
+ .argument("<campaignId>", "Campaign ID to update", parsePositiveInt)
227
+ .option("--name <name>", "New campaign name")
228
+ .option("--description <text>", "New campaign description")
229
+ .option("--clear-description", "Clear the campaign description")
230
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
231
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
232
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
233
+ .option("--json", "Output as JSON")
234
+ .action(handleCampaignUpdate);
235
+ program
236
+ .command("campaign-add-action")
237
+ .description("Add a new action to a campaign's action chain")
238
+ .argument("<campaignId>", "Campaign ID", parsePositiveInt)
239
+ .requiredOption("--name <name>", "Display name for the action")
240
+ .requiredOption("--action-type <type>", "Action type identifier (e.g., 'VisitAndExtract', 'MessageToPerson')")
241
+ .option("--description <text>", "Action description")
242
+ .option("--cool-down <ms>", "Milliseconds between action executions", parsePositiveInt)
243
+ .option("--max-results <n>", "Maximum results per iteration (-1 for unlimited)", parseMaxResults)
244
+ .option("--action-settings <json>", "Action-specific settings as JSON")
245
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
246
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
247
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
248
+ .option("--json", "Output as JSON")
249
+ .action(handleCampaignAddAction);
250
+ program
251
+ .command("campaign-remove-action")
252
+ .description("Remove an action from a campaign's action chain")
253
+ .argument("<campaignId>", "Campaign ID", parsePositiveInt)
254
+ .argument("<actionId>", "Action ID to remove", parsePositiveInt)
255
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
256
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
257
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
258
+ .option("--json", "Output as JSON")
259
+ .action(handleCampaignRemoveAction);
260
+ program
261
+ .command("campaign-reorder-actions")
262
+ .description("Reorder actions in a campaign's action chain")
263
+ .argument("<campaignId>", "Campaign ID", parsePositiveInt)
264
+ .requiredOption("--action-ids <ids>", "Comma-separated action IDs in desired order")
265
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
266
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
267
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
268
+ .option("--json", "Output as JSON")
269
+ .action(handleCampaignReorderActions);
270
+ program
271
+ .command("import-people-from-urls")
272
+ .description("Import LinkedIn profile URLs into a campaign action target list")
273
+ .argument("<campaignId>", "Campaign ID to import into", parsePositiveInt)
274
+ .option("--urls <urls>", "Comma-separated LinkedIn profile URLs")
275
+ .option("--urls-file <path>", "File containing LinkedIn profile URLs")
276
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
277
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
278
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
279
+ .option("--json", "Output as JSON")
280
+ .action(handleImportPeopleFromUrls);
281
+ program
282
+ .command("describe-actions")
283
+ .description("List available LinkedHelper action types")
284
+ .option("--category <category>", "Filter by category (people, messaging, engagement, crm, workflow)")
285
+ .option("--type <type>", "Get details for a specific action type")
286
+ .option("--json", "Output as JSON")
287
+ .action(handleDescribeActions);
288
+ program
289
+ .command("query-messages")
290
+ .description("Query messaging history from the local database")
291
+ .option("--person-id <id>", "Filter by person ID", parsePositiveInt)
292
+ .option("--chat-id <id>", "Show specific conversation thread", parsePositiveInt)
293
+ .option("--search <text>", "Search message text")
294
+ .option("--limit <n>", "Max results (default: 20)", parsePositiveInt)
295
+ .option("--offset <n>", "Pagination offset (default: 0)", parseNonNegativeInt)
296
+ .option("--json", "Output as JSON")
297
+ .action(handleQueryMessages);
298
+ program
299
+ .command("query-profile")
300
+ .description("Look up a cached profile from the local database")
301
+ .option("--person-id <id>", "Look up by internal person ID", parsePositiveInt)
302
+ .option("--public-id <slug>", "Look up by LinkedIn public ID")
303
+ .option("--json", "Output as JSON")
304
+ .action(handleQueryProfile);
305
+ program
306
+ .command("query-profiles")
307
+ .description("Search for profiles in the local database")
308
+ .option("--query <text>", "Search name or headline")
309
+ .option("--company <name>", "Filter by company")
310
+ .option("--limit <n>", "Max results (default: 20)", parsePositiveInt)
311
+ .option("--offset <n>", "Pagination offset (default: 0)", parseNonNegativeInt)
312
+ .option("--json", "Output as JSON")
313
+ .action(handleQueryProfiles);
314
+ program
315
+ .command("scrape-messaging-history")
316
+ .description("Scrape messaging history from LinkedIn into the local database")
317
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
318
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
319
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
320
+ .option("--json", "Output as JSON")
321
+ .action(handleScrapeMessagingHistory);
322
+ program
323
+ .command("check-replies")
324
+ .description("Check for new message replies from LinkedIn")
325
+ .option("--since <timestamp>", "Only show replies after this ISO timestamp")
326
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
327
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
328
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
329
+ .option("--json", "Output as JSON")
330
+ .action(handleCheckReplies);
331
+ program
332
+ .command("check-status")
333
+ .description("Check LinkedHelper status")
334
+ .option("--cdp-port <port>", "CDP debugging port", parsePositiveInt)
335
+ .option("--cdp-host <host>", "CDP host (default: 127.0.0.1)")
336
+ .option("--allow-remote", "SECURITY: allow non-loopback CDP connections (enables remote code execution on target)")
337
+ .option("--json", "Output as JSON")
338
+ .action(handleCheckStatus);
339
+ return program;
340
+ }
341
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=program.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.test.d.ts","sourceRoot":"","sources":["../src/program.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,154 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { createRequire } from "node:module";
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { createProgram } from "./program.js";
6
+ const require = createRequire(import.meta.url);
7
+ const { version } = require("../package.json");
8
+ describe("createProgram", () => {
9
+ const originalExitCode = process.exitCode;
10
+ beforeEach(() => {
11
+ process.exitCode = undefined;
12
+ });
13
+ afterEach(() => {
14
+ process.exitCode = originalExitCode;
15
+ vi.restoreAllMocks();
16
+ });
17
+ it("creates a program named lhremote", () => {
18
+ const program = createProgram();
19
+ expect(program.name()).toBe("lhremote");
20
+ });
21
+ it("reads version from package.json", () => {
22
+ const program = createProgram();
23
+ expect(program.version()).toBe(version);
24
+ });
25
+ it("registers all expected subcommands", () => {
26
+ const program = createProgram();
27
+ const commandNames = program.commands.map((c) => c.name());
28
+ expect(commandNames).toContain("find-app");
29
+ expect(commandNames).toContain("launch-app");
30
+ expect(commandNames).toContain("quit-app");
31
+ expect(commandNames).toContain("list-accounts");
32
+ expect(commandNames).toContain("start-instance");
33
+ expect(commandNames).toContain("stop-instance");
34
+ expect(commandNames).toContain("query-profile");
35
+ expect(commandNames).toContain("query-profiles");
36
+ expect(commandNames).toContain("query-messages");
37
+ expect(commandNames).toContain("scrape-messaging-history");
38
+ expect(commandNames).toContain("campaign-create");
39
+ expect(commandNames).toContain("campaign-delete");
40
+ expect(commandNames).toContain("campaign-export");
41
+ expect(commandNames).toContain("campaign-get");
42
+ expect(commandNames).toContain("campaign-list");
43
+ expect(commandNames).toContain("campaign-retry");
44
+ expect(commandNames).toContain("campaign-start");
45
+ expect(commandNames).toContain("campaign-statistics");
46
+ expect(commandNames).toContain("campaign-status");
47
+ expect(commandNames).toContain("campaign-stop");
48
+ expect(commandNames).toContain("campaign-update");
49
+ expect(commandNames).toContain("check-replies");
50
+ expect(commandNames).toContain("check-status");
51
+ expect(commandNames).toContain("describe-actions");
52
+ expect(commandNames).toContain("import-people-from-urls");
53
+ expect(commandNames).toContain("campaign-move-next");
54
+ expect(commandNames).toContain("campaign-add-action");
55
+ expect(commandNames).toContain("campaign-remove-action");
56
+ expect(commandNames).toContain("campaign-reorder-actions");
57
+ expect(commandNames).toContain("campaign-exclude-list");
58
+ expect(commandNames).toContain("campaign-exclude-add");
59
+ expect(commandNames).toContain("campaign-exclude-remove");
60
+ expect(commandNames).toHaveLength(32);
61
+ });
62
+ describe("launch-app", () => {
63
+ it("does not have --cdp-port option", () => {
64
+ const program = createProgram();
65
+ const cmd = program.commands.find((c) => c.name() === "launch-app");
66
+ const portOption = cmd?.options.find((o) => o.long === "--cdp-port");
67
+ expect(portOption).toBeUndefined();
68
+ });
69
+ });
70
+ describe("quit-app", () => {
71
+ it("does not have --cdp-port option", () => {
72
+ const program = createProgram();
73
+ const cmd = program.commands.find((c) => c.name() === "quit-app");
74
+ const portOption = cmd?.options.find((o) => o.long === "--cdp-port");
75
+ expect(portOption).toBeUndefined();
76
+ });
77
+ });
78
+ describe("list-accounts", () => {
79
+ it("accepts --json option", () => {
80
+ const program = createProgram();
81
+ const cmd = program.commands.find((c) => c.name() === "list-accounts");
82
+ const jsonOption = cmd?.options.find((o) => o.long === "--json");
83
+ expect(jsonOption).toBeDefined();
84
+ });
85
+ });
86
+ describe("start-instance", () => {
87
+ it("requires accountId argument", () => {
88
+ const program = createProgram();
89
+ const cmd = program.commands.find((c) => c.name() === "start-instance");
90
+ const args = cmd?.registeredArguments;
91
+ expect(args).toHaveLength(1);
92
+ expect(args?.[0]?.required).toBe(true);
93
+ });
94
+ it("rejects non-numeric accountId", async () => {
95
+ vi.spyOn(process.stderr, "write").mockReturnValue(true);
96
+ const program = createProgram();
97
+ program.exitOverride().configureOutput({ writeErr: () => { } });
98
+ await expect(program.parseAsync(["node", "lhremote", "start-instance", "abc"])).rejects.toThrow();
99
+ });
100
+ });
101
+ describe("campaign-add-action --max-results", () => {
102
+ it("rejects non-numeric value", async () => {
103
+ const program = createProgram();
104
+ program.exitOverride().configureOutput({ writeErr: () => { } });
105
+ await expect(program.parseAsync([
106
+ "node", "lhremote", "campaign-add-action", "1",
107
+ "--name", "test", "--action-type", "VisitAndExtract",
108
+ "--max-results", "abc",
109
+ ])).rejects.toThrow();
110
+ });
111
+ it("rejects fractional value", async () => {
112
+ const program = createProgram();
113
+ program.exitOverride().configureOutput({ writeErr: () => { } });
114
+ await expect(program.parseAsync([
115
+ "node", "lhremote", "campaign-add-action", "1",
116
+ "--name", "test", "--action-type", "VisitAndExtract",
117
+ "--max-results", "3.7",
118
+ ])).rejects.toThrow();
119
+ });
120
+ it("rejects zero", async () => {
121
+ const program = createProgram();
122
+ program.exitOverride().configureOutput({ writeErr: () => { } });
123
+ await expect(program.parseAsync([
124
+ "node", "lhremote", "campaign-add-action", "1",
125
+ "--name", "test", "--action-type", "VisitAndExtract",
126
+ "--max-results", "0",
127
+ ])).rejects.toThrow();
128
+ });
129
+ it("rejects values less than -1", async () => {
130
+ const program = createProgram();
131
+ program.exitOverride().configureOutput({ writeErr: () => { } });
132
+ await expect(program.parseAsync([
133
+ "node", "lhremote", "campaign-add-action", "1",
134
+ "--name", "test", "--action-type", "VisitAndExtract",
135
+ "--max-results", "-2",
136
+ ])).rejects.toThrow();
137
+ });
138
+ });
139
+ describe("check-status", () => {
140
+ it("accepts --json option", () => {
141
+ const program = createProgram();
142
+ const cmd = program.commands.find((c) => c.name() === "check-status");
143
+ const jsonOption = cmd?.options.find((o) => o.long === "--json");
144
+ expect(jsonOption).toBeDefined();
145
+ });
146
+ it("accepts --cdp-port option", () => {
147
+ const program = createProgram();
148
+ const cmd = program.commands.find((c) => c.name() === "check-status");
149
+ const portOption = cmd?.options.find((o) => o.long === "--cdp-port");
150
+ expect(portOption).toBeDefined();
151
+ });
152
+ });
153
+ });
154
+ //# sourceMappingURL=program.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.test.js","sourceRoot":"","sources":["../src/program.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@lhremote/cli",
3
- "version": "0.0.0",
3
+ "version": "0.2.0",
4
4
  "description": "CLI for LinkedHelper automation",
5
5
  "type": "module",
6
6
  "engines": {
7
- "node": ">=22"
7
+ "node": ">=24"
8
8
  },
9
9
  "license": "AGPL-3.0-only",
10
10
  "author": "Alexey Pelykh (https://github.com/alexey-pelykh)",
@@ -15,23 +15,37 @@
15
15
  "url": "https://github.com/alexey-pelykh/lhremote.git",
16
16
  "directory": "packages/cli"
17
17
  },
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/program.d.ts",
21
+ "import": "./dist/program.js"
22
+ },
23
+ "./handlers": {
24
+ "types": "./dist/handlers/index.d.ts",
25
+ "import": "./dist/handlers/index.js"
26
+ }
27
+ },
18
28
  "bin": {
19
- "lhremote": "./dist/cli.js"
29
+ "lhremote-cli": "./dist/cli.js"
20
30
  },
21
31
  "files": [
22
32
  "dist"
23
33
  ],
24
- "scripts": {
25
- "build": "tsc",
26
- "test": "echo 'No tests configured'",
27
- "lint": "echo 'No linter configured'",
28
- "dev": "tsc --watch"
29
- },
30
34
  "dependencies": {
31
- "@lhremote/core": "workspace:^"
35
+ "commander": "^14.0.3",
36
+ "@lhremote/core": "^0.2.0"
32
37
  },
33
38
  "devDependencies": {
34
- "@types/node": "catalog:",
35
- "typescript": "catalog:"
39
+ "@types/node": "^25",
40
+ "eslint": "^9.39.2",
41
+ "typescript": "^5.9.3",
42
+ "vitest": "^4.0.18"
43
+ },
44
+ "scripts": {
45
+ "build": "tsc",
46
+ "test": "vitest run",
47
+ "test:e2e": "vitest run --config ../../vitest.e2e.config.ts",
48
+ "lint": "eslint src/",
49
+ "dev": "tsc --watch"
36
50
  }
37
- }
51
+ }