@jango-blockchained/hoox-cli 0.5.1 → 0.5.6

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 (106) hide show
  1. package/bin/hoox.js +3 -4
  2. package/dist/index.js +32545 -0
  3. package/package.json +10 -15
  4. package/src/commands/check/check-command.test.ts +0 -476
  5. package/src/commands/check/check-command.ts +0 -1144
  6. package/src/commands/check/index.ts +0 -10
  7. package/src/commands/check/prerequisites-command.test.ts +0 -19
  8. package/src/commands/check/prerequisites-command.ts +0 -96
  9. package/src/commands/check/types.ts +0 -103
  10. package/src/commands/clone/clone-command.test.ts +0 -442
  11. package/src/commands/clone/clone-command.ts +0 -431
  12. package/src/commands/clone/index.ts +0 -1
  13. package/src/commands/config/config-command.test.ts +0 -583
  14. package/src/commands/config/config-command.ts +0 -897
  15. package/src/commands/config/env-command.test.ts +0 -43
  16. package/src/commands/config/env-command.ts +0 -295
  17. package/src/commands/config/index.ts +0 -3
  18. package/src/commands/config/kv-command.test.ts +0 -14
  19. package/src/commands/config/kv-command.ts +0 -290
  20. package/src/commands/dashboard/dashboard-command.test.ts +0 -47
  21. package/src/commands/dashboard/dashboard-command.ts +0 -128
  22. package/src/commands/dashboard/index.ts +0 -1
  23. package/src/commands/db/db-command.test.ts +0 -21
  24. package/src/commands/db/db-command.ts +0 -312
  25. package/src/commands/db/index.ts +0 -1
  26. package/src/commands/deploy/deploy-command.test.ts +0 -304
  27. package/src/commands/deploy/deploy-command.ts +0 -1135
  28. package/src/commands/deploy/index.ts +0 -2
  29. package/src/commands/deploy/telegram-service.ts +0 -76
  30. package/src/commands/deploy/types.ts +0 -34
  31. package/src/commands/dev/dev-command.test.ts +0 -383
  32. package/src/commands/dev/dev-command.ts +0 -398
  33. package/src/commands/dev/index.ts +0 -1
  34. package/src/commands/infra/index.ts +0 -5
  35. package/src/commands/infra/infra-command.test.ts +0 -719
  36. package/src/commands/infra/infra-command.ts +0 -974
  37. package/src/commands/infra/types.ts +0 -23
  38. package/src/commands/init/__tests__/cli-provisioner.test.ts +0 -17
  39. package/src/commands/init/cli-provisioner.ts +0 -71
  40. package/src/commands/init/index.ts +0 -1
  41. package/src/commands/init/init-command.test.ts +0 -876
  42. package/src/commands/init/init-command.ts +0 -593
  43. package/src/commands/init/types.ts +0 -23
  44. package/src/commands/logs/index.ts +0 -1
  45. package/src/commands/logs/logs-command.test.ts +0 -294
  46. package/src/commands/logs/logs-command.ts +0 -452
  47. package/src/commands/monitor/index.ts +0 -2
  48. package/src/commands/monitor/monitor-command.test.ts +0 -263
  49. package/src/commands/monitor/monitor-command.ts +0 -269
  50. package/src/commands/monitor/monitor-service.ts +0 -65
  51. package/src/commands/monitor/types.ts +0 -13
  52. package/src/commands/repair/index.ts +0 -2
  53. package/src/commands/repair/repair-command.test.ts +0 -224
  54. package/src/commands/repair/repair-command.ts +0 -220
  55. package/src/commands/repair/repair-service.ts +0 -138
  56. package/src/commands/repair/types.ts +0 -13
  57. package/src/commands/test/index.ts +0 -2
  58. package/src/commands/test/test-command.test.ts +0 -319
  59. package/src/commands/test/test-command.ts +0 -406
  60. package/src/commands/tui/index.ts +0 -1
  61. package/src/commands/tui/tui-command.ts +0 -87
  62. package/src/commands/update/index.ts +0 -1
  63. package/src/commands/update/update-command.ts +0 -168
  64. package/src/commands/waf/index.ts +0 -2
  65. package/src/commands/waf/types.ts +0 -48
  66. package/src/commands/waf/waf-command.test.ts +0 -506
  67. package/src/commands/waf/waf-command.ts +0 -548
  68. package/src/index.ts +0 -269
  69. package/src/services/cloudflare/cloudflare-service.test.ts +0 -658
  70. package/src/services/cloudflare/cloudflare-service.ts +0 -433
  71. package/src/services/cloudflare/index.ts +0 -2
  72. package/src/services/cloudflare/types.ts +0 -30
  73. package/src/services/config/config-service.test.ts +0 -395
  74. package/src/services/config/config-service.ts +0 -207
  75. package/src/services/config/index.ts +0 -9
  76. package/src/services/config/types.ts +0 -66
  77. package/src/services/db/db-service.test.ts +0 -51
  78. package/src/services/db/db-service.ts +0 -131
  79. package/src/services/db/index.ts +0 -1
  80. package/src/services/docker/docker-service.ts +0 -155
  81. package/src/services/docker/index.ts +0 -1
  82. package/src/services/env/env-service.test.ts +0 -236
  83. package/src/services/env/env-service.ts +0 -386
  84. package/src/services/env/index.ts +0 -1
  85. package/src/services/kv/index.ts +0 -1
  86. package/src/services/kv/kv-sync-service.test.ts +0 -38
  87. package/src/services/kv/kv-sync-service.ts +0 -234
  88. package/src/services/prerequisites/index.ts +0 -1
  89. package/src/services/prerequisites/prerequisites-service.test.ts +0 -89
  90. package/src/services/prerequisites/prerequisites-service.ts +0 -377
  91. package/src/services/prerequisites/types.ts +0 -48
  92. package/src/services/secrets/index.ts +0 -11
  93. package/src/services/secrets/secrets-service.test.ts +0 -495
  94. package/src/services/secrets/secrets-service.ts +0 -287
  95. package/src/services/secrets/types.ts +0 -50
  96. package/src/services/update/index.ts +0 -2
  97. package/src/services/update/update-service.test.ts +0 -76
  98. package/src/services/update/update-service.ts +0 -193
  99. package/src/ui/banner.ts +0 -141
  100. package/src/ui/index.ts +0 -8
  101. package/src/ui/menu.ts +0 -490
  102. package/src/utils/errors.test.ts +0 -69
  103. package/src/utils/errors.ts +0 -23
  104. package/src/utils/formatters.test.ts +0 -180
  105. package/src/utils/formatters.ts +0 -269
  106. package/src/utils/theme.ts +0 -94
@@ -1,398 +0,0 @@
1
- /**
2
- * `hoox dev` command group — local development for workers and dashboard.
3
- *
4
- * Subcommands:
5
- * start — Launch all workers with wrangler dev
6
- * worker — Start a single worker with wrangler dev
7
- * dashboard — Start the Next.js dashboard dev server
8
- */
9
-
10
- import { Command } from "commander";
11
- import { select } from "@clack/prompts";
12
- import path from "node:path";
13
- import { ConfigService } from "../../services/config/index.js";
14
- import { CloudflareService } from "../../services/cloudflare/index.js";
15
- import { PrerequisitesService } from "../../services/prerequisites/index.js";
16
- import { DockerService } from "../../services/docker/index.js";
17
- import {
18
- formatSuccess,
19
- formatError,
20
- getFormatOptions,
21
- } from "../../utils/formatters.js";
22
- import { CLIError, ExitCode } from "../../utils/errors.js";
23
-
24
- // ---------------------------------------------------------------------------
25
- // Command registration
26
- // ---------------------------------------------------------------------------
27
-
28
- /**
29
- * Register the `hoox dev` command group with subcommands:
30
- * start, worker <name>, dashboard.
31
- */
32
- export function registerDevCommand(program: Command): void {
33
- const devCmd = program
34
- .command("dev")
35
- .summary("Local development commands for workers and dashboard")
36
- .description(
37
- `Start local development servers for your Hoox workers and dashboard.
38
-
39
- RUNTIME OPTIONS:
40
- native - Uses wrangler dev (default, recommended for most cases)
41
- docker - Uses Docker Compose (requires Docker + docker-compose)
42
-
43
- The CLI will prompt you to choose a runtime if Docker is available and no preference is saved. Your choice is saved to wrangler.jsonc for future runs.
44
-
45
- EXAMPLES:
46
- hoox dev start Start all workers (prompts for runtime)
47
- hoox dev start --runtime native Force native runtime (wrangler dev)
48
- hoox dev start --runtime docker Force Docker runtime
49
- hoox dev worker trade-worker Start single worker
50
- hoox dev dashboard Start dashboard dev server`
51
- );
52
-
53
- // -- dev start ------------------------------------------------------------
54
- devCmd
55
- .command("start")
56
- .summary("Start all enabled workers for local development")
57
- .description(
58
- `Start all enabled workers using either wrangler dev (native) or Docker Compose.
59
-
60
- The command checks for prerequisites (wrangler version, Docker availability) and starts workers on sequential ports starting at 8787.
61
-
62
- PORT ASSIGNMENTS:
63
- hoox → 8787
64
- trade-worker → 8788
65
- d1-worker → 8789
66
- telegram-worker → 8790
67
- web3-wallet-worker → 8792
68
- (other workers) → 8800+
69
-
70
- OPTIONS:
71
- --runtime <native|docker> Choose dev runtime (overrides saved preference)
72
-
73
- EXAMPLES:
74
- hoox dev start
75
- hoox dev start --runtime native
76
- hoox dev start --runtime docker`
77
- )
78
- .option(
79
- "--runtime <native|docker>",
80
- "Choose dev runtime (overrides saved preference)"
81
- )
82
- .action(async (options: { runtime?: string }) => {
83
- const fmt = getFormatOptions(program);
84
- try {
85
- const configService = new ConfigService();
86
- const prereqs = new PrerequisitesService();
87
- const docker = new DockerService();
88
-
89
- // Load config early so we can read saved runtime preference
90
- await configService.load();
91
-
92
- // === Prerequisite checks ===
93
-
94
- // 1. Wrangler version check (advisory)
95
- const wranglerCheck = await prereqs.checkWranglerVersion();
96
- if (wranglerCheck.outdated) {
97
- process.stdout.write(
98
- `\n! wrangler is outdated (${wranglerCheck.current} < ${wranglerCheck.minimum})\n` +
99
- ` Run \`bunx wrangler update\` to update.\n` +
100
- ` Press Enter to continue or Ctrl+C to abort.\n\n`
101
- );
102
- // Wait briefly — user can proceed with Enter or Ctrl+C
103
- }
104
-
105
- // 2. Check Docker availability
106
- const dockerStatus = await docker.checkAvailability();
107
- const dockerViable = dockerStatus.docker && dockerStatus.compose;
108
- const composeExists = await docker.composeFileExists();
109
-
110
- // 3. Determine runtime
111
- let runtime: "native" | "docker" = "native";
112
- if (options.runtime === "native" || options.runtime === "docker") {
113
- runtime = options.runtime;
114
- } else {
115
- const savedRuntime = configService.getDevRuntime();
116
- if (savedRuntime) {
117
- runtime = savedRuntime;
118
- } else if (dockerViable && composeExists) {
119
- const choice = await select({
120
- message: "Which runtime would you like to use?",
121
- options: [
122
- {
123
- value: "native",
124
- label: "Native (wrangler dev)",
125
- hint: "run locally with wrangler",
126
- },
127
- {
128
- value: "docker",
129
- label: "Docker",
130
- hint: "run via docker compose",
131
- },
132
- ],
133
- });
134
- runtime = choice;
135
- await configService.setDevRuntime(runtime);
136
- }
137
- }
138
-
139
- // Validate configuration
140
- const validation = configService.validate();
141
- if (!validation.valid) {
142
- formatError(
143
- new CLIError(
144
- `Invalid configuration:\n${validation.errors.map((e) => ` - ${e}`).join("\n")}`,
145
- ExitCode.INVALID_USAGE
146
- ),
147
- fmt
148
- );
149
- process.exitCode = ExitCode.INVALID_USAGE;
150
- return;
151
- }
152
-
153
- // === Runtime branching ===
154
-
155
- if (runtime === "docker") {
156
- const profiles = ["workers"];
157
- formatSuccess(
158
- `Starting workers via Docker Compose (profiles: ${profiles.join(", ")})...`,
159
- fmt
160
- );
161
- const result = await docker.composeUp(profiles, false);
162
- if (!result.ok) {
163
- formatError(
164
- new CLIError(
165
- result.error ?? "Docker compose failed",
166
- ExitCode.ERROR
167
- ),
168
- fmt
169
- );
170
- process.exitCode = ExitCode.ERROR;
171
- }
172
- return;
173
- }
174
-
175
- // === Native runtime (wrangler dev) ===
176
-
177
- const enabledWorkers = configService.listEnabledWorkers();
178
- if (enabledWorkers.length === 0) {
179
- formatError(
180
- new CLIError(
181
- "No enabled workers found in wrangler.jsonc. Enable at least one worker.",
182
- ExitCode.INVALID_USAGE
183
- ),
184
- fmt
185
- );
186
- process.exitCode = ExitCode.INVALID_USAGE;
187
- return;
188
- }
189
-
190
- // Port assignments for known workers (from local-dev.md)
191
- const LOCAL_PORTS: Record<string, number> = {
192
- hoox: 8787,
193
- "trade-worker": 8788,
194
- "d1-worker": 8789,
195
- "telegram-worker": 8790,
196
- "web3-wallet-worker": 8792,
197
- };
198
-
199
- let nextFallbackPort = 8800;
200
- const cf = new CloudflareService();
201
- let started = 0;
202
- let failed = 0;
203
-
204
- for (const name of enabledWorkers) {
205
- const worker = configService.getWorker(name);
206
- if (!worker) {
207
- formatError(`Worker "${name}" not found in config, skipping.`, fmt);
208
- failed++;
209
- continue;
210
- }
211
-
212
- const port = LOCAL_PORTS[name] ?? nextFallbackPort++;
213
- formatSuccess(
214
- `Starting worker "${name}" (${worker.path}) on port ${port}...`,
215
- fmt
216
- );
217
-
218
- const result = await cf.dev(worker.path, port);
219
- if (!result.ok) {
220
- formatError(
221
- `Failed to start worker "${name}": ${result.error}`,
222
- fmt
223
- );
224
- failed++;
225
- } else {
226
- formatSuccess(
227
- `Worker "${name}" running on http://localhost:${result.value.port}`,
228
- fmt
229
- );
230
- started++;
231
- }
232
- }
233
-
234
- if (started > 0) {
235
- formatSuccess(
236
- `Started ${started} worker(s) — http://localhost:8787 (and adjacent ports)`,
237
- fmt
238
- );
239
- }
240
- if (failed > 0) {
241
- process.exitCode = ExitCode.ERROR;
242
- }
243
- } catch (err) {
244
- const message = err instanceof Error ? err.message : String(err);
245
- formatError(message, fmt);
246
- process.exitCode = ExitCode.ERROR;
247
- }
248
- });
249
-
250
- // -- dev worker <name> [--port] -------------------------------------------
251
- devCmd
252
- .command("worker <name>")
253
- .summary("Start a single worker for local development")
254
- .description(
255
- `Start a specific worker using wrangler dev.
256
-
257
- ARGUMENTS:
258
- name Worker name (e.g., trade-worker, agent-worker, hoox)
259
-
260
- OPTIONS:
261
- --port <port> Dev server port (default: 8787)
262
- --runtime <native|docker> Choose dev runtime (overrides saved preference)
263
-
264
- EXAMPLES:
265
- hoox dev worker trade-worker
266
- hoox dev worker agent-worker --port 8788
267
- hoox dev worker hoox --runtime docker`
268
- )
269
- .option("--port <port>", "Dev server port (default: 8787)", (v: string) =>
270
- parseInt(v, 10)
271
- )
272
- .option(
273
- "--runtime <native|docker>",
274
- "Choose dev runtime (overrides saved preference)"
275
- )
276
- .action(
277
- async (name: string, options: { port?: number; runtime?: string }) => {
278
- const fmt = getFormatOptions(program);
279
- try {
280
- const configService = new ConfigService();
281
- await configService.load();
282
-
283
- // Validate the worker exists in config
284
- const worker = configService.getWorker(name);
285
- if (!worker) {
286
- formatError(
287
- new CLIError(
288
- `Worker "${name}" not found in wrangler.jsonc.\n` +
289
- `Available workers: ${configService.listWorkers().join(", ")}`,
290
- ExitCode.INVALID_USAGE
291
- ),
292
- fmt
293
- );
294
- process.exitCode = ExitCode.INVALID_USAGE;
295
- return;
296
- }
297
-
298
- if (!worker.enabled) {
299
- formatError(
300
- new CLIError(
301
- `Worker "${name}" is disabled. Enable it with the config command first.`,
302
- ExitCode.INVALID_USAGE
303
- ),
304
- fmt
305
- );
306
- process.exitCode = ExitCode.INVALID_USAGE;
307
- return;
308
- }
309
-
310
- const port = options.port ?? 8787;
311
-
312
- formatSuccess(
313
- `Starting worker "${name}" (${worker.path}) on port ${port}...`,
314
- fmt
315
- );
316
-
317
- const cf = new CloudflareService();
318
- const result = await cf.dev(worker.path, port);
319
-
320
- if (!result.ok) {
321
- formatError(
322
- new CLIError(
323
- `Failed to start worker "${name}": ${result.error}`,
324
- ExitCode.ERROR
325
- ),
326
- fmt
327
- );
328
- process.exitCode = ExitCode.ERROR;
329
- return;
330
- }
331
-
332
- formatSuccess(
333
- `Worker "${name}" running on http://localhost:${result.value.port}`,
334
- fmt
335
- );
336
- } catch (err) {
337
- const message = err instanceof Error ? err.message : String(err);
338
- formatError(message, fmt);
339
- process.exitCode = ExitCode.ERROR;
340
- }
341
- }
342
- );
343
-
344
- // -- dev dashboard --------------------------------------------------------
345
- devCmd
346
- .command("dashboard")
347
- .summary("Start the Next.js dashboard dev server")
348
- .description(
349
- `Start the Hoox dashboard development server using Next.js.
350
-
351
- The dashboard runs on http://localhost:3000 with hot-reloading enabled.
352
-
353
- OPTIONS:
354
- --runtime <native|docker> Choose dev runtime (overrides saved preference)
355
-
356
- EXAMPLES:
357
- hoox dev dashboard
358
- hoox dev dashboard --runtime docker`
359
- )
360
- .option(
361
- "--runtime <native|docker>",
362
- "Choose dev runtime (overrides saved preference)"
363
- )
364
- .action(async () => {
365
- const fmt = getFormatOptions(program);
366
- try {
367
- const dashboardPath = path.resolve(process.cwd(), "workers/dashboard");
368
- const dashboardDir = Bun.file(dashboardPath);
369
-
370
- if (!(await dashboardDir.exists())) {
371
- formatError(
372
- new CLIError(
373
- `Dashboard directory not found: ${dashboardPath}`,
374
- ExitCode.INVALID_USAGE
375
- ),
376
- fmt
377
- );
378
- process.exitCode = ExitCode.INVALID_USAGE;
379
- return;
380
- }
381
-
382
- formatSuccess("Starting Next.js dashboard dev server...", fmt);
383
-
384
- // Fire-and-forget: spawn `bun run dev` inside pages/dashboard
385
- Bun.spawn(["bun", "run", "dev"], {
386
- cwd: dashboardPath,
387
- stdout: "inherit",
388
- stderr: "inherit",
389
- });
390
-
391
- formatSuccess("Dashboard starting on http://localhost:3000", fmt);
392
- } catch (err) {
393
- const message = err instanceof Error ? err.message : String(err);
394
- formatError(message, fmt);
395
- process.exitCode = ExitCode.ERROR;
396
- }
397
- });
398
- }
@@ -1 +0,0 @@
1
- export { registerDevCommand } from "./dev-command.js";
@@ -1,5 +0,0 @@
1
- /**
2
- * Barrel export for the `hoox infra` command group.
3
- */
4
- export { registerInfraCommand } from "./infra-command.js";
5
- export type { InfraOptions, ProvisionItem, ProvisionResult } from "./types.js";