@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
package/src/index.ts DELETED
@@ -1,269 +0,0 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * Hoox CLI — main entry point.
4
- * Built with commander.js. Commands are registered via dedicated register* functions.
5
- * Global options --json and --quiet are available to all commands via program.opts().
6
- */
7
-
8
- import { Command } from "commander";
9
- import { toError } from "@jango-blockchained/hoox-shared";
10
- import {
11
- FULL_LEGAL_NOTICE,
12
- COPYRIGHT,
13
- } from "@jango-blockchained/hoox-shared/legal";
14
- import { CLIError, ExitCode } from "./utils/errors.js";
15
- import { formatError } from "./utils/formatters.js";
16
- import { theme } from "./utils/theme.js";
17
-
18
- // ---------------------------------------------------------------------------
19
- // Program setup
20
- // ---------------------------------------------------------------------------
21
-
22
- const program = new Command();
23
-
24
- program
25
- .name("hoox")
26
- .description(
27
- "Hoox CLI — manage Cloudflare Workers, infrastructure, secrets, and deployments"
28
- )
29
- .version(`0.2.0\n\n${COPYRIGHT}`)
30
- .addHelpText(
31
- "beforeAll",
32
- theme.heading("\nHoox CLI — Cloudflare Workers Platform\n")
33
- )
34
- .configureHelp({
35
- styleTitle: (str: string) => theme.heading(str),
36
- styleCommandText: (str: string) => theme.bold(str),
37
- styleOptionText: (str: string) => str,
38
- styleDescriptionText: (str: string) => theme.dim(str),
39
- });
40
-
41
- // Global options — accessible by all commands via program.opts()
42
- program.option("--json", "Output in JSON format");
43
- program.option("--quiet", "Minimal output");
44
- program.option("-y, --yes", "Skip confirmation prompts");
45
-
46
- // ---------------------------------------------------------------------------
47
- // Error handling — map CommanderError and CLIError to proper exit codes
48
- // ---------------------------------------------------------------------------
49
-
50
- program.exitOverride((err) => {
51
- // Commander's own informational exits — let them through
52
- if (
53
- err.code === "commander.helpDisplayed" ||
54
- err.code === "commander.version"
55
- ) {
56
- process.exit(ExitCode.SUCCESS);
57
- }
58
-
59
- // Parent command without subcommand — already displayed help, clean exit
60
- if (
61
- err.code === "commander.missingArgument" ||
62
- err.message === "(outputHelp)" ||
63
- err.message?.includes("outputHelp")
64
- ) {
65
- process.exit(ExitCode.SUCCESS);
66
- }
67
-
68
- // Unknown command / option: exit code 2 (invalid usage)
69
- if (
70
- err.code === "commander.unknownCommand" ||
71
- err.code === "commander.unknownOption"
72
- ) {
73
- formatError(
74
- new CLIError(err.message, ExitCode.INVALID_USAGE, undefined, false)
75
- );
76
- process.exit(ExitCode.INVALID_USAGE);
77
- }
78
-
79
- // Missing mandatory option / argument: exit code 2 (invalid usage)
80
- if (
81
- err.code === "commander.missingMandatoryOptionValue" ||
82
- err.code === "commander.missingArgument"
83
- ) {
84
- formatError(
85
- new CLIError(err.message, ExitCode.INVALID_USAGE, undefined, false)
86
- );
87
- process.exit(ExitCode.INVALID_USAGE);
88
- }
89
-
90
- // If the error is already a CLIError, use its exit code
91
- if (err instanceof CLIError) {
92
- formatError(err);
93
- process.exit((err as CLIError).code);
94
- }
95
-
96
- // Generic fallback
97
- formatError(new CLIError(err.message, ExitCode.ERROR, undefined, false));
98
- process.exit(ExitCode.ERROR);
99
- });
100
-
101
- // ---------------------------------------------------------------------------
102
- // Global process error handlers
103
- // ---------------------------------------------------------------------------
104
-
105
- process.on("uncaughtException", (err) => {
106
- formatError(
107
- err instanceof CLIError
108
- ? err
109
- : new CLIError(
110
- `Uncaught exception: ${err.message}`,
111
- ExitCode.ERROR,
112
- err.stack,
113
- false
114
- )
115
- );
116
- process.exit(ExitCode.ERROR);
117
- });
118
-
119
- process.on("unhandledRejection", (reason) => {
120
- const err =
121
- reason instanceof Error
122
- ? reason
123
- : new Error(`Unhandled rejection: ${toError(reason)}`);
124
-
125
- formatError(new CLIError(err.message, ExitCode.ERROR, err.stack, false));
126
- process.exit(ExitCode.ERROR);
127
- });
128
-
129
- // ---------------------------------------------------------------------------
130
- // Command registration (added in subtasks 06–16)
131
- // ---------------------------------------------------------------------------
132
-
133
- import { registerInitCommand } from "./commands/init/index.js";
134
- import { WIZARD_STATE_PATH } from "@jango-blockchained/hoox-shared";
135
- import { registerDevCommand } from "./commands/dev/index.js";
136
- import { registerDeployCommand } from "./commands/deploy/index.js";
137
- import { registerInfraCommand } from "./commands/infra/index.js";
138
- import { registerConfigCommand } from "./commands/config/index.js";
139
- import { registerCheckCommand } from "./commands/check/index.js";
140
- import { registerLogsCommand } from "./commands/logs/index.js";
141
- import { registerTestCommand } from "./commands/test/index.js";
142
- import { registerWafCommand } from "./commands/waf/index.js";
143
- import { registerCloneCommand } from "./commands/clone/index.js";
144
- import { registerDashboardCommand } from "./commands/dashboard/index.js";
145
- import { registerDbCommand } from "./commands/db/index.js";
146
- import { registerMonitorCommand } from "./commands/monitor/index.js";
147
- import { registerRepairCommand } from "./commands/repair/index.js";
148
- import { registerUpdateCommand } from "./commands/update/index.js";
149
- import { registerTUICommand } from "./commands/tui/index.js";
150
- import { runInteractiveTUI } from "./ui/index.js";
151
-
152
- // ── Legal / Disclaimer command ──────────────────────────────────────────
153
-
154
- program
155
- .command("disclaimer")
156
- .description("Display legal disclaimers and trademark information")
157
- .action(() => {
158
- console.log(FULL_LEGAL_NOTICE);
159
- });
160
-
161
- // ── Command registration ────────────────────────────────────────────────
162
-
163
- registerInitCommand(program);
164
- registerDevCommand(program);
165
- registerDeployCommand(program);
166
- registerInfraCommand(program);
167
- registerConfigCommand(program);
168
- registerCheckCommand(program);
169
- registerLogsCommand(program);
170
- registerTestCommand(program);
171
- registerWafCommand(program);
172
- registerCloneCommand(program);
173
- registerDashboardCommand(program);
174
- registerDbCommand(program);
175
- registerMonitorCommand(program);
176
- registerRepairCommand(program);
177
- registerUpdateCommand(program);
178
- registerTUICommand(program);
179
-
180
- // ---------------------------------------------------------------------------
181
- // preAction hooks — auto-check wrangler version before dev/deploy
182
- // ---------------------------------------------------------------------------
183
-
184
- import { UpdateService } from "./services/update/index.js";
185
-
186
- const devCmd = program.commands.find((c) => c.name() === "dev");
187
- if (devCmd) {
188
- const devStartCmd = devCmd.commands.find((c) => c.name() === "start");
189
- if (devStartCmd) {
190
- devStartCmd.hook("preAction", async () => {
191
- const service = new UpdateService();
192
- await service.checkAndPromptUpdate({ yes: program.opts().yes });
193
- });
194
- }
195
- }
196
-
197
- const deployCmd = program.commands.find((c) => c.name() === "deploy");
198
- if (deployCmd) {
199
- const deploySubs = ["all", "workers", "worker", "dashboard"];
200
- for (const sub of deploySubs) {
201
- const cmd = deployCmd.commands.find((c) => c.name() === sub);
202
- if (cmd) {
203
- cmd.hook("preAction", async () => {
204
- const service = new UpdateService();
205
- await service.checkAndPromptUpdate({ yes: program.opts().yes });
206
- });
207
- }
208
- }
209
- }
210
-
211
- // ---------------------------------------------------------------------------
212
- // Main entry — exported so bin/hoox.js can invoke it explicitly
213
- // (import.meta.main is false when loaded as a dependency)
214
- // ---------------------------------------------------------------------------
215
-
216
- /**
217
- * Main CLI entry point.
218
- * Parses args or launches the interactive TUI if no args are given.
219
- */
220
- export async function main(): Promise<void> {
221
- const hasArgs = process.argv.slice(2).length > 0;
222
-
223
- if (hasArgs) {
224
- program.parse();
225
- } else {
226
- // Auto-launch the setup wizard if not yet initialized
227
- const configFile = Bun.file("wrangler.jsonc");
228
- const hasConfig = await configFile.exists();
229
- const wizardStateFile = Bun.file(WIZARD_STATE_PATH);
230
- const hasWizardState = await wizardStateFile.exists();
231
-
232
- if (!hasConfig) {
233
- // No wrangler.jsonc → project is uninitialized → run the wizard
234
- // If there's a partial wizard state file, auto-resume
235
- const args = hasWizardState ? ["init", "--resume"] : ["init"];
236
- await program.parseAsync(args, { from: "user" });
237
- process.exit(ExitCode.SUCCESS);
238
- }
239
-
240
- // Clean up stale wizard state if project is already initialized
241
- if (hasWizardState) {
242
- await Bun.write(WIZARD_STATE_PATH, "");
243
- }
244
-
245
- // Interactive TUI mode — launches when hoox is called with no arguments
246
- await runInteractiveTUI(program);
247
- process.exit(ExitCode.SUCCESS);
248
- }
249
- }
250
-
251
- if (import.meta.main) {
252
- await main();
253
- }
254
-
255
- // ---------------------------------------------------------------------------
256
- // Exports
257
- // ---------------------------------------------------------------------------
258
-
259
- export { program };
260
- export { CLIError, ExitCode } from "./utils/errors.js";
261
- export {
262
- formatSuccess,
263
- formatError,
264
- formatTable,
265
- formatJson,
266
- formatKeyValue,
267
- } from "./utils/formatters.js";
268
- export type { FormatOptions } from "./utils/formatters.js";
269
- export { theme, icons } from "./utils/theme.js";