@jango-blockchained/hoox-cli 0.5.2 → 0.5.7

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 (114) hide show
  1. package/bin/hoox.js +3 -4
  2. package/dist/index.js +32989 -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 -1087
  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 -97
  9. package/src/commands/check/types.ts +0 -103
  10. package/src/commands/clone/clone-command.test.ts +0 -440
  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 -896
  15. package/src/commands/config/env-command.test.ts +0 -43
  16. package/src/commands/config/env-command.ts +0 -292
  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 -130
  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 -311
  25. package/src/commands/db/index.ts +0 -1
  26. package/src/commands/deploy/deploy-command.test.ts +0 -324
  27. package/src/commands/deploy/deploy-command.ts +0 -1054
  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 -405
  32. package/src/commands/dev/dev-command.ts +0 -398
  33. package/src/commands/dev/index.ts +0 -1
  34. package/src/commands/disclaimer/disclaimer-command.ts +0 -21
  35. package/src/commands/disclaimer/index.ts +0 -1
  36. package/src/commands/infra/index.ts +0 -5
  37. package/src/commands/infra/infra-command.test.ts +0 -719
  38. package/src/commands/infra/infra-command.ts +0 -974
  39. package/src/commands/infra/types.ts +0 -23
  40. package/src/commands/init/__tests__/cli-provisioner.test.ts +0 -17
  41. package/src/commands/init/cli-provisioner.ts +0 -71
  42. package/src/commands/init/index.ts +0 -1
  43. package/src/commands/init/init-command.test.ts +0 -854
  44. package/src/commands/init/init-command.ts +0 -597
  45. package/src/commands/init/types.ts +0 -23
  46. package/src/commands/logs/index.ts +0 -1
  47. package/src/commands/logs/logs-command.test.ts +0 -293
  48. package/src/commands/logs/logs-command.ts +0 -452
  49. package/src/commands/monitor/index.ts +0 -2
  50. package/src/commands/monitor/monitor-command.test.ts +0 -271
  51. package/src/commands/monitor/monitor-command.ts +0 -269
  52. package/src/commands/monitor/monitor-service.ts +0 -65
  53. package/src/commands/monitor/types.ts +0 -13
  54. package/src/commands/repair/index.ts +0 -2
  55. package/src/commands/repair/repair-command.test.ts +0 -243
  56. package/src/commands/repair/repair-command.ts +0 -220
  57. package/src/commands/repair/repair-service.ts +0 -164
  58. package/src/commands/repair/types.ts +0 -13
  59. package/src/commands/schema/index.ts +0 -1
  60. package/src/commands/schema/schema-command.ts +0 -137
  61. package/src/commands/test/index.ts +0 -2
  62. package/src/commands/test/test-command.test.ts +0 -318
  63. package/src/commands/test/test-command.ts +0 -406
  64. package/src/commands/tui/index.ts +0 -1
  65. package/src/commands/tui/tui-command.ts +0 -87
  66. package/src/commands/update/index.ts +0 -1
  67. package/src/commands/update/update-command.ts +0 -109
  68. package/src/commands/waf/index.ts +0 -2
  69. package/src/commands/waf/types.ts +0 -48
  70. package/src/commands/waf/waf-command.test.ts +0 -506
  71. package/src/commands/waf/waf-command.ts +0 -545
  72. package/src/index.ts +0 -261
  73. package/src/services/cloudflare/cloudflare-service.test.ts +0 -658
  74. package/src/services/cloudflare/cloudflare-service.ts +0 -433
  75. package/src/services/cloudflare/index.ts +0 -2
  76. package/src/services/cloudflare/types.ts +0 -30
  77. package/src/services/config/config-service.test.ts +0 -395
  78. package/src/services/config/config-service.ts +0 -202
  79. package/src/services/config/index.ts +0 -9
  80. package/src/services/config/types.ts +0 -66
  81. package/src/services/db/db-service.test.ts +0 -63
  82. package/src/services/db/db-service.ts +0 -131
  83. package/src/services/db/index.ts +0 -1
  84. package/src/services/docker/docker-service.ts +0 -155
  85. package/src/services/docker/index.ts +0 -1
  86. package/src/services/env/env-service.test.ts +0 -259
  87. package/src/services/env/env-service.ts +0 -372
  88. package/src/services/env/index.ts +0 -1
  89. package/src/services/kv/index.ts +0 -1
  90. package/src/services/kv/kv-sync-service.test.ts +0 -38
  91. package/src/services/kv/kv-sync-service.ts +0 -243
  92. package/src/services/prerequisites/index.ts +0 -1
  93. package/src/services/prerequisites/prerequisites-service.test.ts +0 -89
  94. package/src/services/prerequisites/prerequisites-service.ts +0 -377
  95. package/src/services/prerequisites/types.ts +0 -48
  96. package/src/services/schema/index.ts +0 -1
  97. package/src/services/schema/schema-service.ts +0 -99
  98. package/src/services/secrets/index.ts +0 -11
  99. package/src/services/secrets/secrets-service.test.ts +0 -502
  100. package/src/services/secrets/secrets-service.ts +0 -287
  101. package/src/services/secrets/types.ts +0 -50
  102. package/src/services/update/index.ts +0 -2
  103. package/src/services/update/update-service.test.ts +0 -76
  104. package/src/services/update/update-service.ts +0 -193
  105. package/src/ui/banner.ts +0 -141
  106. package/src/ui/index.ts +0 -8
  107. package/src/ui/menu.ts +0 -490
  108. package/src/utils/error-handler.ts +0 -62
  109. package/src/utils/errors.test.ts +0 -69
  110. package/src/utils/errors.ts +0 -24
  111. package/src/utils/formatters.test.ts +0 -180
  112. package/src/utils/formatters.ts +0 -269
  113. package/src/utils/git.ts +0 -134
  114. package/src/utils/theme.ts +0 -92
@@ -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,21 +0,0 @@
1
- /**
2
- * `hoox disclaimer` command — displays legal disclaimers and trademark information.
3
- *
4
- * Uses the centralized legal notices from @jango-blockchained/hoox-shared/legal
5
- * so all surfaces (CLI, HTTP, Dashboard) stay consistent.
6
- */
7
-
8
- import type { Command } from "commander";
9
- import { FULL_LEGAL_NOTICE } from "@jango-blockchained/hoox-shared/legal";
10
-
11
- /**
12
- * Registers the `hoox disclaimer` command on the given Commander.js program instance.
13
- */
14
- export function registerDisclaimerCommand(program: Command): void {
15
- program
16
- .command("disclaimer")
17
- .description("Display legal disclaimers and trademark information")
18
- .action(() => {
19
- console.log(FULL_LEGAL_NOTICE);
20
- });
21
- }
@@ -1 +0,0 @@
1
- export { registerDisclaimerCommand } from "./disclaimer-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";