@miosa/cli 0.2.0 → 1.0.1

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 (55) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/bin/miosa.js +20 -1
  3. package/dist/bin/miosa.js.map +1 -1
  4. package/dist/client.d.ts +2 -0
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +19 -0
  7. package/dist/client.js.map +1 -1
  8. package/dist/commands/billing.d.ts +3 -0
  9. package/dist/commands/billing.d.ts.map +1 -0
  10. package/dist/commands/billing.js +211 -0
  11. package/dist/commands/billing.js.map +1 -0
  12. package/dist/commands/builds.d.ts +3 -0
  13. package/dist/commands/builds.d.ts.map +1 -0
  14. package/dist/commands/builds.js +198 -0
  15. package/dist/commands/builds.js.map +1 -0
  16. package/dist/commands/databases.d.ts.map +1 -1
  17. package/dist/commands/databases.js +159 -1
  18. package/dist/commands/databases.js.map +1 -1
  19. package/dist/commands/env.d.ts +3 -0
  20. package/dist/commands/env.d.ts.map +1 -0
  21. package/dist/commands/env.js +176 -0
  22. package/dist/commands/env.js.map +1 -0
  23. package/dist/commands/logs.d.ts.map +1 -1
  24. package/dist/commands/logs.js +123 -45
  25. package/dist/commands/logs.js.map +1 -1
  26. package/dist/commands/regions.d.ts.map +1 -1
  27. package/dist/commands/regions.js +37 -1
  28. package/dist/commands/regions.js.map +1 -1
  29. package/dist/commands/releases.d.ts.map +1 -1
  30. package/dist/commands/releases.js +67 -0
  31. package/dist/commands/releases.js.map +1 -1
  32. package/dist/commands/rollback.d.ts +3 -0
  33. package/dist/commands/rollback.d.ts.map +1 -0
  34. package/dist/commands/rollback.js +62 -0
  35. package/dist/commands/rollback.js.map +1 -0
  36. package/dist/commands/scale.d.ts +3 -0
  37. package/dist/commands/scale.d.ts.map +1 -0
  38. package/dist/commands/scale.js +61 -0
  39. package/dist/commands/scale.js.map +1 -0
  40. package/dist/commands/storage.d.ts.map +1 -1
  41. package/dist/commands/storage.js +198 -0
  42. package/dist/commands/storage.js.map +1 -1
  43. package/dist/commands/teams.d.ts +3 -0
  44. package/dist/commands/teams.d.ts.map +1 -0
  45. package/dist/commands/teams.js +171 -0
  46. package/dist/commands/teams.js.map +1 -0
  47. package/dist/commands/templates.d.ts +3 -0
  48. package/dist/commands/templates.d.ts.map +1 -0
  49. package/dist/commands/templates.js +266 -0
  50. package/dist/commands/templates.js.map +1 -0
  51. package/dist/update-check.d.ts +13 -0
  52. package/dist/update-check.d.ts.map +1 -0
  53. package/dist/update-check.js +91 -0
  54. package/dist/update-check.js.map +1 -0
  55. package/package.json +3 -2
@@ -0,0 +1,266 @@
1
+ import chalk from "chalk";
2
+ import { readFileSync } from "node:fs";
3
+ import { loadConfig } from "../config.js";
4
+ import { MiosaClient } from "../client.js";
5
+ import { renderTable } from "../ui/table.js";
6
+ import { spin } from "../ui/spinner.js";
7
+ import { handleError } from "./util.js";
8
+ function unwrapTemplates(raw) {
9
+ if (Array.isArray(raw))
10
+ return raw;
11
+ return raw.data ?? raw.templates ?? [];
12
+ }
13
+ function unwrapTemplate(raw) {
14
+ if ("data" in raw && raw.data)
15
+ return raw.data;
16
+ if ("template" in raw && raw.template)
17
+ return raw.template;
18
+ return raw;
19
+ }
20
+ function unwrapBuilds(raw) {
21
+ if (Array.isArray(raw))
22
+ return raw;
23
+ return raw.data ?? raw.builds ?? [];
24
+ }
25
+ function fmtTemplateState(state) {
26
+ if (!state)
27
+ return chalk.dim("-");
28
+ if (state === "ready" || state === "active")
29
+ return chalk.green(state);
30
+ if (state === "building" || state === "pending")
31
+ return chalk.yellow(state);
32
+ if (state === "failed" || state === "error")
33
+ return chalk.red(state);
34
+ return chalk.dim(state);
35
+ }
36
+ function fmtBuildState(state) {
37
+ if (!state)
38
+ return chalk.dim("-");
39
+ if (state === "success" || state === "complete")
40
+ return chalk.green(state);
41
+ if (state === "building" || state === "running" || state === "pending")
42
+ return chalk.yellow(state);
43
+ if (state === "failed" || state === "error")
44
+ return chalk.red(state);
45
+ return chalk.dim(state);
46
+ }
47
+ export function register(program) {
48
+ const templates = program
49
+ .command("templates")
50
+ .description("Manage sandbox templates");
51
+ // list
52
+ templates
53
+ .command("list")
54
+ .description("List sandbox templates")
55
+ .option("--json", "Output raw JSON")
56
+ .action(async (opts) => {
57
+ try {
58
+ const config = loadConfig();
59
+ const client = new MiosaClient(config);
60
+ const spinner = spin("Fetching templates...");
61
+ const rows = unwrapTemplates(await client.apiGet("/api/v1/sandbox-templates"));
62
+ spinner.stop();
63
+ if (opts.json) {
64
+ console.log(JSON.stringify(rows, null, 2));
65
+ return;
66
+ }
67
+ if (rows.length === 0) {
68
+ console.log(chalk.dim("No templates found."));
69
+ return;
70
+ }
71
+ renderTable(rows, [
72
+ { header: "ID", key: (t) => t.id.slice(0, 12), width: 14 },
73
+ { header: "NAME", key: "name", width: 28 },
74
+ {
75
+ header: "STATE",
76
+ key: (t) => fmtTemplateState(t.state),
77
+ width: 12,
78
+ },
79
+ {
80
+ header: "IMAGE",
81
+ key: (t) => t.image
82
+ ? t.image.length > 32
83
+ ? `${t.image.slice(0, 29)}...`
84
+ : t.image
85
+ : chalk.dim("-"),
86
+ width: 34,
87
+ },
88
+ {
89
+ header: "CREATED",
90
+ key: (t) => t.created_at ? t.created_at.slice(0, 10) : chalk.dim("-"),
91
+ width: 12,
92
+ },
93
+ ]);
94
+ }
95
+ catch (err) {
96
+ handleError(err);
97
+ }
98
+ });
99
+ // get
100
+ templates
101
+ .command("get <id>")
102
+ .description("Get sandbox template details")
103
+ .option("--json", "Output raw JSON")
104
+ .action(async (id, opts) => {
105
+ try {
106
+ const config = loadConfig();
107
+ const client = new MiosaClient(config);
108
+ const spinner = spin("Fetching template...");
109
+ const tmpl = unwrapTemplate(await client.apiGet(`/api/v1/sandbox-templates/${encodeURIComponent(id)}`));
110
+ spinner.stop();
111
+ if (opts.json) {
112
+ console.log(JSON.stringify(tmpl, null, 2));
113
+ return;
114
+ }
115
+ console.log();
116
+ console.log(` ${chalk.bold("ID")} ${tmpl.id}`);
117
+ console.log(` ${chalk.bold("Name")} ${tmpl.name}`);
118
+ console.log(` ${chalk.bold("State")} ${fmtTemplateState(tmpl.state)}`);
119
+ if (tmpl.image)
120
+ console.log(` ${chalk.bold("Image")} ${tmpl.image}`);
121
+ if (tmpl.created_at)
122
+ console.log(` ${chalk.bold("Created")} ${tmpl.created_at}`);
123
+ if (tmpl.updated_at)
124
+ console.log(` ${chalk.bold("Updated")} ${tmpl.updated_at}`);
125
+ console.log();
126
+ console.log(chalk.dim(` Run "miosa templates builds ${tmpl.id}" to view build history.`));
127
+ console.log();
128
+ }
129
+ catch (err) {
130
+ handleError(err);
131
+ }
132
+ });
133
+ // create
134
+ templates
135
+ .command("create")
136
+ .description("Create a sandbox template from a Dockerfile")
137
+ .requiredOption("--name <name>", "Template name")
138
+ .requiredOption("--dockerfile <path>", "Path to Dockerfile to build the template from")
139
+ .option("--json", "Output raw JSON")
140
+ .action(async (opts) => {
141
+ try {
142
+ let dockerfileContent;
143
+ try {
144
+ dockerfileContent = readFileSync(opts.dockerfile, "utf8");
145
+ }
146
+ catch (err) {
147
+ console.error(chalk.red(`Cannot read Dockerfile at ${opts.dockerfile}: ${err instanceof Error ? err.message : String(err)}`));
148
+ process.exit(1);
149
+ }
150
+ const config = loadConfig();
151
+ const client = new MiosaClient(config);
152
+ const spinner = spin(`Creating template ${opts.name}...`);
153
+ const tmpl = unwrapTemplate(await client.apiPost("/api/v1/sandbox-templates", {
154
+ name: opts.name,
155
+ dockerfile: dockerfileContent,
156
+ }));
157
+ spinner.succeed(`Created template ${tmpl.name}`);
158
+ if (opts.json) {
159
+ console.log(JSON.stringify(tmpl, null, 2));
160
+ return;
161
+ }
162
+ console.log();
163
+ console.log(` ${chalk.bold("ID")} ${tmpl.id}`);
164
+ console.log(` ${chalk.bold("Name")} ${tmpl.name}`);
165
+ console.log(` ${chalk.bold("State")} ${fmtTemplateState(tmpl.state)}`);
166
+ console.log();
167
+ console.log(chalk.dim(` Run "miosa templates builds ${tmpl.id}" to track the build.`));
168
+ console.log();
169
+ }
170
+ catch (err) {
171
+ handleError(err);
172
+ }
173
+ });
174
+ // builds
175
+ templates
176
+ .command("builds <id>")
177
+ .description("List builds for a sandbox template")
178
+ .option("--json", "Output raw JSON")
179
+ .action(async (id, opts) => {
180
+ try {
181
+ const config = loadConfig();
182
+ const client = new MiosaClient(config);
183
+ const spinner = spin("Fetching builds...");
184
+ const rows = unwrapBuilds(await client.apiGet(`/api/v1/sandbox-templates/${encodeURIComponent(id)}/builds`));
185
+ spinner.stop();
186
+ if (opts.json) {
187
+ console.log(JSON.stringify(rows, null, 2));
188
+ return;
189
+ }
190
+ if (rows.length === 0) {
191
+ console.log(chalk.dim("No builds found."));
192
+ return;
193
+ }
194
+ renderTable(rows, [
195
+ { header: "BUILD ID", key: (b) => b.id.slice(0, 12), width: 14 },
196
+ {
197
+ header: "STATE",
198
+ key: (b) => fmtBuildState(b.state),
199
+ width: 12,
200
+ },
201
+ {
202
+ header: "STARTED",
203
+ key: (b) => b.started_at
204
+ ? b.started_at.slice(0, 19).replace("T", " ")
205
+ : chalk.dim("-"),
206
+ width: 20,
207
+ },
208
+ {
209
+ header: "FINISHED",
210
+ key: (b) => b.finished_at
211
+ ? b.finished_at.slice(0, 19).replace("T", " ")
212
+ : chalk.dim("-"),
213
+ width: 20,
214
+ },
215
+ {
216
+ header: "ERROR",
217
+ key: (b) => b.error
218
+ ? chalk.red(b.error.length > 30
219
+ ? `${b.error.slice(0, 27)}...`
220
+ : b.error)
221
+ : chalk.dim("-"),
222
+ width: 32,
223
+ },
224
+ ]);
225
+ }
226
+ catch (err) {
227
+ handleError(err);
228
+ }
229
+ });
230
+ // delete
231
+ templates
232
+ .command("delete <id>")
233
+ .description("Delete a sandbox template")
234
+ .option("-f, --force", "Skip confirmation prompt")
235
+ .option("--json", "Output raw JSON")
236
+ .action(async (id, opts) => {
237
+ try {
238
+ if (!opts.force) {
239
+ const { default: inquirer } = await import("inquirer");
240
+ const { ok } = await inquirer.prompt([
241
+ {
242
+ type: "confirm",
243
+ name: "ok",
244
+ message: chalk.red(`Delete template ${id}? This will remove the template and its build history.`),
245
+ default: false,
246
+ },
247
+ ]);
248
+ if (!ok) {
249
+ console.log(chalk.dim(" Cancelled."));
250
+ process.exit(0);
251
+ }
252
+ }
253
+ const config = loadConfig();
254
+ const client = new MiosaClient(config);
255
+ const spinner = spin("Deleting template...");
256
+ const result = await client.apiDelete(`/api/v1/sandbox-templates/${encodeURIComponent(id)}`);
257
+ spinner.succeed("Template deleted");
258
+ if (opts.json)
259
+ console.log(JSON.stringify(result ?? { ok: true }, null, 2));
260
+ }
261
+ catch (err) {
262
+ handleError(err);
263
+ }
264
+ });
265
+ }
266
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/commands/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Auto-update checker — fires async after command completion.
3
+ * Checks npm registry for the latest @miosa/cli version once per 24h.
4
+ * Caches the result in ~/.miosa/update-check.json.
5
+ * Never blocks the command; errors are silently swallowed.
6
+ */
7
+ /**
8
+ * Schedule an async update check that prints a notice if a newer version is
9
+ * available. Must be called after `program.parseAsync()` so it never delays
10
+ * command output. Uses `setImmediate` to yield first, then fires a fetch.
11
+ */
12
+ export declare function scheduleUpdateCheck(currentVersion: string): void;
13
+ //# sourceMappingURL=update-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8CH;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAsChE"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Auto-update checker — fires async after command completion.
3
+ * Checks npm registry for the latest @miosa/cli version once per 24h.
4
+ * Caches the result in ~/.miosa/update-check.json.
5
+ * Never blocks the command; errors are silently swallowed.
6
+ */
7
+ import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
8
+ import { homedir } from "node:os";
9
+ import { join } from "node:path";
10
+ import chalk from "chalk";
11
+ const CACHE_PATH = join(homedir(), ".miosa", "update-check.json");
12
+ const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
13
+ const REGISTRY_URL = "https://registry.npmjs.org/@miosa/cli/latest";
14
+ function readCache() {
15
+ try {
16
+ const raw = readFileSync(CACHE_PATH, "utf8");
17
+ return JSON.parse(raw);
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ function writeCache(data) {
24
+ try {
25
+ mkdirSync(join(homedir(), ".miosa"), { recursive: true });
26
+ writeFileSync(CACHE_PATH, JSON.stringify(data), "utf8");
27
+ }
28
+ catch {
29
+ // Non-fatal — cache write failures are ignored
30
+ }
31
+ }
32
+ function compareVersions(current, latest) {
33
+ const parse = (v) => {
34
+ const parts = v.replace(/^v/, "").split(".").map(Number);
35
+ return [parts[0] ?? 0, parts[1] ?? 0, parts[2] ?? 0];
36
+ };
37
+ const [cMaj, cMin, cPat] = parse(current);
38
+ const [lMaj, lMin, lPat] = parse(latest);
39
+ if (lMaj !== cMaj)
40
+ return lMaj > cMaj;
41
+ if (lMin !== cMin)
42
+ return lMin > cMin;
43
+ return lPat > cPat;
44
+ }
45
+ /**
46
+ * Schedule an async update check that prints a notice if a newer version is
47
+ * available. Must be called after `program.parseAsync()` so it never delays
48
+ * command output. Uses `setImmediate` to yield first, then fires a fetch.
49
+ */
50
+ export function scheduleUpdateCheck(currentVersion) {
51
+ setImmediate(() => {
52
+ void (async () => {
53
+ try {
54
+ const cache = readCache();
55
+ const now = Date.now();
56
+ // Use cached result if still fresh
57
+ if (cache && now - cache.checkedAt < CACHE_TTL_MS) {
58
+ if (compareVersions(currentVersion, cache.latestVersion)) {
59
+ printNotice(currentVersion, cache.latestVersion);
60
+ }
61
+ return;
62
+ }
63
+ // Fetch latest from npm — 3 second timeout so this never hangs
64
+ const ac = new AbortController();
65
+ const timer = setTimeout(() => ac.abort(), 3_000);
66
+ let latestVersion;
67
+ try {
68
+ const resp = await fetch(REGISTRY_URL, { signal: ac.signal });
69
+ if (!resp.ok)
70
+ return;
71
+ const json = (await resp.json());
72
+ latestVersion = json.version;
73
+ }
74
+ finally {
75
+ clearTimeout(timer);
76
+ }
77
+ writeCache({ checkedAt: now, latestVersion });
78
+ if (compareVersions(currentVersion, latestVersion)) {
79
+ printNotice(currentVersion, latestVersion);
80
+ }
81
+ }
82
+ catch {
83
+ // Never surface update-check errors to the user
84
+ }
85
+ })();
86
+ });
87
+ }
88
+ function printNotice(current, latest) {
89
+ console.error(chalk.yellow(`Update available: ${current} → ${latest}. Run \`npm update -g @miosa/cli\` to update.`));
90
+ }
91
+ //# sourceMappingURL=update-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miosa/cli",
3
- "version": "0.2.0",
3
+ "version": "1.0.1",
4
4
  "description": "MIOSA platform CLI — projects, sandboxes, deploys, databases, more",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,7 +19,8 @@
19
19
  },
20
20
  "files": [
21
21
  "dist",
22
- "README.md"
22
+ "README.md",
23
+ "CHANGELOG.md"
23
24
  ],
24
25
  "keywords": [
25
26
  "miosa",