kiwivm-cli 0.1.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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +118 -0
  3. package/dist/admin-fOud1ZmX.mjs +15 -0
  4. package/dist/admin-fOud1ZmX.mjs.map +1 -0
  5. package/dist/backup-D1UJ4aap.mjs +12 -0
  6. package/dist/backup-D1UJ4aap.mjs.map +1 -0
  7. package/dist/help-Dk-WApoi.mjs +40 -0
  8. package/dist/help-Dk-WApoi.mjs.map +1 -0
  9. package/dist/index.d.mts +5 -0
  10. package/dist/index.d.mts.map +1 -0
  11. package/dist/index.mjs +177 -0
  12. package/dist/index.mjs.map +1 -0
  13. package/dist/info-DKExtFYH.mjs +13 -0
  14. package/dist/info-DKExtFYH.mjs.map +1 -0
  15. package/dist/monitoring-BSuv8fj9.mjs +13 -0
  16. package/dist/monitoring-BSuv8fj9.mjs.map +1 -0
  17. package/dist/network-1ycEIJqT.mjs +15 -0
  18. package/dist/network-1ycEIJqT.mjs.map +1 -0
  19. package/dist/power-CDg0Mx1A.mjs +14 -0
  20. package/dist/power-CDg0Mx1A.mjs.map +1 -0
  21. package/dist/snapshot-LO_ufoj5.mjs +23 -0
  22. package/dist/snapshot-LO_ufoj5.mjs.map +1 -0
  23. package/dist/system-Bl-dsqX9.mjs +21 -0
  24. package/dist/system-Bl-dsqX9.mjs.map +1 -0
  25. package/package.json +46 -0
  26. package/src/client.test.ts +68 -0
  27. package/src/client.ts +55 -0
  28. package/src/commands/admin.test.ts +65 -0
  29. package/src/commands/admin.ts +25 -0
  30. package/src/commands/backup.test.ts +66 -0
  31. package/src/commands/backup.ts +23 -0
  32. package/src/commands/help.test.ts +50 -0
  33. package/src/commands/help.ts +36 -0
  34. package/src/commands/info.test.ts +67 -0
  35. package/src/commands/info.ts +20 -0
  36. package/src/commands/monitoring.test.ts +82 -0
  37. package/src/commands/monitoring.ts +20 -0
  38. package/src/commands/network.test.ts +85 -0
  39. package/src/commands/network.ts +24 -0
  40. package/src/commands/power.test.ts +68 -0
  41. package/src/commands/power.ts +22 -0
  42. package/src/commands/snapshot.test.ts +159 -0
  43. package/src/commands/snapshot.ts +40 -0
  44. package/src/commands/system.test.ts +98 -0
  45. package/src/commands/system.ts +29 -0
  46. package/src/index.test.ts +375 -0
  47. package/src/index.ts +172 -0
  48. package/src/types.ts +94 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 fujuntao
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,118 @@
1
+ # kiwivm-cli
2
+
3
+ CLI for managing KiwiVM (64clouds/BuyVM) VPS instances.
4
+
5
+ ## Setup
6
+
7
+ ### 1. Environment Variables
8
+
9
+ ```bash
10
+ export KIWIVM_VEID=12345678
11
+ export KIWIVM_API_KEY=your_api_key_here
12
+ ```
13
+
14
+ Get your VEID and API key from the KiwiVM Control Panel -- REST API page.
15
+
16
+ Alternatively, pass them as flags on every command:
17
+
18
+ ```bash
19
+ kiwivm-cli --veid 12345678 --api-key your_key info
20
+ ```
21
+
22
+ ### 2. Install
23
+
24
+ Requires **Node.js >= 24**.
25
+
26
+ ```bash
27
+ npm install -g kiwivm-cli
28
+ ```
29
+
30
+ Or run directly with npx:
31
+
32
+ ```bash
33
+ npx kiwivm-cli help
34
+ ```
35
+
36
+ ## Usage
37
+
38
+ ```bash
39
+ kiwivm-cli <category> <action> [--flags...]
40
+ ```
41
+
42
+ ### Examples
43
+
44
+ ```bash
45
+ # Get service info
46
+ kiwivm-cli info
47
+
48
+ # Get live service info (CPU, RAM, disk, uptime)
49
+ kiwivm-cli info live
50
+
51
+ # Power control
52
+ kiwivm-cli power start
53
+ kiwivm-cli power stop
54
+ kiwivm-cli power restart
55
+ kiwivm-cli power kill
56
+
57
+ # Snapshots
58
+ kiwivm-cli snapshot list
59
+ kiwivm-cli snapshot create --description "before update"
60
+ kiwivm-cli snapshot delete --snapshot vsb1234567890
61
+ kiwivm-cli snapshot restore --snapshot vsb1234567890
62
+ kiwivm-cli snapshot sticky --snapshot vsb1234567890 --sticky 1
63
+ kiwivm-cli snapshot import --source-veid 87654321 --source-token token123
64
+
65
+ # Backups
66
+ kiwivm-cli backup list
67
+ kiwivm-cli backup copy --backup-token abc123
68
+
69
+ # System
70
+ kiwivm-cli system hostname --new-hostname my-vps
71
+ kiwivm-cli system rdns --ip 1.2.3.4 --ptr my.domain.com
72
+ kiwivm-cli system password
73
+ kiwivm-cli system sshkey
74
+ kiwivm-cli system sshkey --ssh-keys "ssh-ed25519 AAAAC3..."
75
+ kiwivm-cli system os
76
+ kiwivm-cli system reinstall --os "ubuntu-22.04"
77
+
78
+ # Network
79
+ kiwivm-cli network ipv6-add
80
+ kiwivm-cli network ipv6-delete --ip 2001:db8::1
81
+ kiwivm-cli network private-list
82
+ kiwivm-cli network private-assign --ip 10.0.0.5
83
+ kiwivm-cli network private-delete --ip 10.0.0.5
84
+
85
+ # Monitoring
86
+ kiwivm-cli monitoring usage
87
+ kiwivm-cli monitoring audit
88
+ kiwivm-cli monitoring rate-limit
89
+
90
+ # Admin
91
+ kiwivm-cli admin suspensions
92
+ kiwivm-cli admin unsuspend --record-id 123
93
+ kiwivm-cli admin resolve
94
+ kiwivm-cli admin resolve-violation --record-id 456
95
+ ```
96
+
97
+ Output is JSON to stdout. Errors go to stderr with exit code 1.
98
+
99
+ ## Development
100
+
101
+ ```bash
102
+ git clone https://github.com/FuJuntao/kiwivm-cli.git
103
+ cd kiwivm-cli
104
+ npm install
105
+ ```
106
+
107
+ | Command | Description |
108
+ |---------|-------------|
109
+ | `npm test` | Run tests (vitest) |
110
+ | `npm run typecheck` | Type check (tsc --noEmit) |
111
+ | `npm run build` | Build with tsdown -> `dist/index.mjs` |
112
+ | `npm run lint` | Lint with Biome |
113
+ | `npm run format` | Format with Biome |
114
+ | `npm run check` | Lint + format check |
115
+
116
+ ## License
117
+
118
+ MIT
@@ -0,0 +1,15 @@
1
+ //#region src/commands/admin.ts
2
+ async function run(action, flags, client) {
3
+ switch (action) {
4
+ case "suspensions": return client.call("getSuspensionDetails");
5
+ case "unsuspend": return client.call("unsuspend", { recordId: flags["recordId"] });
6
+ case "resolve":
7
+ if (flags["recordId"] !== void 0) return client.call("resolvePolicyViolation", { recordId: flags["recordId"] });
8
+ return client.call("getPolicyViolations");
9
+ default: throw new Error(`Unknown admin action: ${action}. Valid: suspensions, unsuspend, resolve`);
10
+ }
11
+ }
12
+ //#endregion
13
+ export { run };
14
+
15
+ //# sourceMappingURL=admin-fOud1ZmX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-fOud1ZmX.mjs","names":[],"sources":["../src/commands/admin.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\n\nexport async function run(\n action: string,\n flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"suspensions\":\n return client.call(\"getSuspensionDetails\");\n case \"unsuspend\":\n return client.call(\"unsuspend\", { recordId: flags[\"recordId\"] });\n case \"resolve\":\n if (flags[\"recordId\"] !== undefined) {\n return client.call(\"resolvePolicyViolation\", {\n recordId: flags[\"recordId\"],\n });\n }\n return client.call(\"getPolicyViolations\");\n default:\n throw new Error(\n `Unknown admin action: ${action}. Valid: suspensions, unsuspend, resolve`,\n );\n }\n}\n"],"mappings":";AAEA,eAAsB,IACpB,QACA,OACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,cACH,QAAO,OAAO,KAAK,uBAAuB;EAC5C,KAAK,YACH,QAAO,OAAO,KAAK,aAAa,EAAE,UAAU,MAAM,aAAa,CAAC;EAClE,KAAK;AACH,OAAI,MAAM,gBAAgB,KAAA,EACxB,QAAO,OAAO,KAAK,0BAA0B,EAC3C,UAAU,MAAM,aACjB,CAAC;AAEJ,UAAO,OAAO,KAAK,sBAAsB;EAC3C,QACE,OAAM,IAAI,MACR,yBAAyB,OAAO,0CACjC"}
@@ -0,0 +1,12 @@
1
+ //#region src/commands/backup.ts
2
+ async function run(action, flags, client) {
3
+ switch (action) {
4
+ case "list": return client.call("backup/list");
5
+ case "copy": return client.call("backup/copyToSnapshot", { backupToken: flags["backupToken"] });
6
+ default: throw new Error(`Unknown backup action: ${action}. Valid: list, copy`);
7
+ }
8
+ }
9
+ //#endregion
10
+ export { run };
11
+
12
+ //# sourceMappingURL=backup-D1UJ4aap.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-D1UJ4aap.mjs","names":[],"sources":["../src/commands/backup.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\nimport type { Backup, KiwiVMResponse } from \"../types.ts\";\n\ninterface BackupListResponse extends KiwiVMResponse {\n backups: Backup[];\n}\n\nexport async function run(\n action: string,\n flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"list\":\n return client.call<BackupListResponse>(\"backup/list\");\n case \"copy\":\n return client.call(\"backup/copyToSnapshot\", {\n backupToken: flags[\"backupToken\"],\n });\n default:\n throw new Error(`Unknown backup action: ${action}. Valid: list, copy`);\n }\n}\n"],"mappings":";AAOA,eAAsB,IACpB,QACA,OACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,OACH,QAAO,OAAO,KAAyB,cAAc;EACvD,KAAK,OACH,QAAO,OAAO,KAAK,yBAAyB,EAC1C,aAAa,MAAM,gBACpB,CAAC;EACJ,QACE,OAAM,IAAI,MAAM,0BAA0B,OAAO,qBAAqB"}
@@ -0,0 +1,40 @@
1
+ //#region src/commands/help.ts
2
+ const HELP = `Usage: kiwivm-cli <category> <action> [--flags...]
3
+
4
+ Auth: --veid <VEID> --api-key <KEY> (or KIWIVM_VEID / KIWIVM_API_KEY env vars)
5
+
6
+ Categories:
7
+
8
+ power start | stop | restart | kill
9
+ info (no action) | live
10
+ snapshot create | list | delete | restore | sticky | export | import
11
+ backup list | copy
12
+ system hostname | rdns | password | sshkey | os | reinstall
13
+ network ipv6-add | ipv6-delete | private-list | private-assign | private-delete
14
+ monitoring usage | audit | rate-limit
15
+ admin suspensions | unsuspend | resolve | resolve-violation
16
+
17
+ Flags:
18
+
19
+ --description Snapshot description (snapshot create)
20
+ --snapshot Snapshot file name (snapshot delete/restore/sticky/export)
21
+ --sticky 0 or 1 (snapshot sticky)
22
+ --source-veid Source VEID (snapshot import)
23
+ --source-token Source token (snapshot import)
24
+ --backup-token Backup token (backup copy)
25
+ --new-hostname New hostname (system hostname)
26
+ --ip IP address (system rdns, network ipv6-delete/private-assign/private-delete)
27
+ --ptr PTR/rDNS record (system rdns)
28
+ --ssh-keys SSH keys (system sshkey update)
29
+ --os OS template name (system reinstall)
30
+ --record-id Record ID (admin unsuspend/resolve-violation)
31
+
32
+ Output: JSON to stdout. Errors to stderr with exit code 1.
33
+ `;
34
+ async function run() {
35
+ return HELP;
36
+ }
37
+ //#endregion
38
+ export { run };
39
+
40
+ //# sourceMappingURL=help-Dk-WApoi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-Dk-WApoi.mjs","names":[],"sources":["../src/commands/help.ts"],"sourcesContent":["const HELP = `Usage: kiwivm-cli <category> <action> [--flags...]\n\nAuth: --veid <VEID> --api-key <KEY> (or KIWIVM_VEID / KIWIVM_API_KEY env vars)\n\nCategories:\n\n power start | stop | restart | kill\n info (no action) | live\n snapshot create | list | delete | restore | sticky | export | import\n backup list | copy\n system hostname | rdns | password | sshkey | os | reinstall\n network ipv6-add | ipv6-delete | private-list | private-assign | private-delete\n monitoring usage | audit | rate-limit\n admin suspensions | unsuspend | resolve | resolve-violation\n\nFlags:\n\n --description Snapshot description (snapshot create)\n --snapshot Snapshot file name (snapshot delete/restore/sticky/export)\n --sticky 0 or 1 (snapshot sticky)\n --source-veid Source VEID (snapshot import)\n --source-token Source token (snapshot import)\n --backup-token Backup token (backup copy)\n --new-hostname New hostname (system hostname)\n --ip IP address (system rdns, network ipv6-delete/private-assign/private-delete)\n --ptr PTR/rDNS record (system rdns)\n --ssh-keys SSH keys (system sshkey update)\n --os OS template name (system reinstall)\n --record-id Record ID (admin unsuspend/resolve-violation)\n\nOutput: JSON to stdout. Errors to stderr with exit code 1.\n`;\n\nexport async function run(): Promise<string> {\n return HELP;\n}\n"],"mappings":";AAAA,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCb,eAAsB,MAAuB;AAC3C,QAAO"}
@@ -0,0 +1,5 @@
1
+ //#region src/index.d.ts
2
+ declare function main(): Promise<void>;
3
+ //#endregion
4
+ export { main };
5
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";iBAoEe,IAAA,CAAA,GAAI,OAAA"}
package/dist/index.mjs ADDED
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/env node
2
+ //#region src/types.ts
3
+ var KiwiVMError = class extends Error {
4
+ errorCode;
5
+ rawResponse;
6
+ constructor(message, errorCode, rawResponse) {
7
+ super(message);
8
+ this.name = "KiwiVMError";
9
+ this.errorCode = errorCode;
10
+ this.rawResponse = rawResponse;
11
+ }
12
+ };
13
+ //#endregion
14
+ //#region src/client.ts
15
+ const API_BASE = "https://api.64clouds.com/v1";
16
+ var KiwiVMClient = class {
17
+ veid;
18
+ apiKey;
19
+ constructor(options) {
20
+ this.veid = options.veid;
21
+ this.apiKey = options.apiKey;
22
+ }
23
+ async call(endpoint, params = {}) {
24
+ const body = new URLSearchParams();
25
+ body.set("veid", this.veid);
26
+ body.set("api_key", this.apiKey);
27
+ for (const [key, value] of Object.entries(params)) if (value !== void 0) body.set(key, String(value));
28
+ const response = await fetch(`${API_BASE}/${endpoint}`, {
29
+ method: "POST",
30
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
31
+ body
32
+ });
33
+ if (!response.ok) throw new Error(`HTTP ${response.status}: ${response.statusText}`);
34
+ const data = await response.json();
35
+ if (data.error !== 0) throw new KiwiVMError(data.message ?? `API error: ${data.error}`, data.error, data);
36
+ return data;
37
+ }
38
+ };
39
+ //#endregion
40
+ //#region src/index.ts
41
+ function parseFlags(args) {
42
+ const flags = {};
43
+ for (let i = 0; i < args.length; i++) {
44
+ const arg = args[i];
45
+ if (!arg?.startsWith("--")) continue;
46
+ const eqIdx = arg.indexOf("=");
47
+ if (eqIdx !== -1) {
48
+ const key = arg.slice(2, eqIdx);
49
+ const value = arg.slice(eqIdx + 1);
50
+ flags[toCamelCase(key)] = value;
51
+ } else {
52
+ const next = args[i + 1];
53
+ if (next !== void 0 && !next.startsWith("--")) {
54
+ const key = arg.slice(2);
55
+ flags[toCamelCase(key)] = next;
56
+ i++;
57
+ } else {
58
+ const key = arg.slice(2);
59
+ flags[toCamelCase(key)] = "";
60
+ }
61
+ }
62
+ }
63
+ return flags;
64
+ }
65
+ function toCamelCase(key) {
66
+ const known = {
67
+ "backup-token": "backupToken",
68
+ "new-hostname": "newHostname",
69
+ "ssh-keys": "sshKeys",
70
+ "source-veid": "sourceVeid",
71
+ "source-token": "sourceToken",
72
+ "record-id": "recordId",
73
+ "api-key": "apiKey",
74
+ "rate-limit": "rateLimit"
75
+ };
76
+ if (known[key]) return known[key];
77
+ return key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
78
+ }
79
+ function getCommandFromArgs(args) {
80
+ const positional = [];
81
+ let i = 0;
82
+ while (i < args.length) {
83
+ const arg = args[i];
84
+ if (!arg || arg.startsWith("--")) break;
85
+ positional.push(arg);
86
+ i++;
87
+ }
88
+ return {
89
+ positional,
90
+ flags: parseFlags(args.slice(i))
91
+ };
92
+ }
93
+ async function main() {
94
+ const { positional, flags } = getCommandFromArgs(process.argv.slice(2));
95
+ const category = positional[0] ?? "";
96
+ const action = positional[1] ?? "";
97
+ if (category === "" || category === "help") {
98
+ const { run } = await import("./help-Dk-WApoi.mjs");
99
+ const text = await run();
100
+ console.log(text);
101
+ return;
102
+ }
103
+ const flagVeid = flags["veid"];
104
+ const flagApiKey = flags["apiKey"];
105
+ const resolvedVeid = flagVeid || process.env["KIWIVM_VEID"];
106
+ const resolvedApiKey = flagApiKey || process.env["KIWIVM_API_KEY"];
107
+ if (!resolvedVeid || !resolvedApiKey) {
108
+ console.error("Error: VEID and API key are required. Use --veid and --api-key flags, or set KIWIVM_VEID and KIWIVM_API_KEY environment variables.");
109
+ process.exit(1);
110
+ }
111
+ const handlerFlags = { ...flags };
112
+ delete handlerFlags["veid"];
113
+ delete handlerFlags["apiKey"];
114
+ const client = new KiwiVMClient({
115
+ veid: resolvedVeid,
116
+ apiKey: resolvedApiKey
117
+ });
118
+ try {
119
+ let result;
120
+ switch (category) {
121
+ case "power": {
122
+ const { run } = await import("./power-CDg0Mx1A.mjs");
123
+ result = await run(action, handlerFlags, client);
124
+ break;
125
+ }
126
+ case "info": {
127
+ const { run } = await import("./info-DKExtFYH.mjs");
128
+ result = await run(action, handlerFlags, client);
129
+ break;
130
+ }
131
+ case "snapshot": {
132
+ const { run } = await import("./snapshot-LO_ufoj5.mjs");
133
+ result = await run(action, handlerFlags, client);
134
+ break;
135
+ }
136
+ case "backup": {
137
+ const { run } = await import("./backup-D1UJ4aap.mjs");
138
+ result = await run(action, handlerFlags, client);
139
+ break;
140
+ }
141
+ case "system": {
142
+ const { run } = await import("./system-Bl-dsqX9.mjs");
143
+ result = await run(action, handlerFlags, client);
144
+ break;
145
+ }
146
+ case "network": {
147
+ const { run } = await import("./network-1ycEIJqT.mjs");
148
+ result = await run(action, handlerFlags, client);
149
+ break;
150
+ }
151
+ case "monitoring": {
152
+ const { run } = await import("./monitoring-BSuv8fj9.mjs");
153
+ result = await run(action, handlerFlags, client);
154
+ break;
155
+ }
156
+ case "admin": {
157
+ const { run } = await import("./admin-fOud1ZmX.mjs");
158
+ result = await run(action, handlerFlags, client);
159
+ break;
160
+ }
161
+ default:
162
+ console.error(`Unknown category: ${category}`);
163
+ console.error("Run 'kiwivm-cli help' for usage.");
164
+ process.exit(1);
165
+ }
166
+ console.log(JSON.stringify(result));
167
+ } catch (error) {
168
+ const message = error instanceof KiwiVMError ? error.message : String(error);
169
+ console.error(`Error: ${message}`);
170
+ process.exit(1);
171
+ }
172
+ }
173
+ if (!process.env["VITEST"]) main();
174
+ //#endregion
175
+ export { main };
176
+
177
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/types.ts","../src/client.ts","../src/index.ts"],"sourcesContent":["export interface KiwiVMResponse {\n error: number;\n message?: string;\n}\n\nexport class KiwiVMError extends Error {\n public readonly errorCode: number;\n public readonly rawResponse: KiwiVMResponse;\n\n constructor(message: string, errorCode: number, rawResponse: KiwiVMResponse) {\n super(message);\n this.name = \"KiwiVMError\";\n this.errorCode = errorCode;\n this.rawResponse = rawResponse;\n }\n}\n\nexport interface ServiceInfo extends KiwiVMResponse {\n hostname?: string;\n node_alias?: string;\n node_location?: string;\n location_ipv6_ready?: number;\n plan?: string;\n plan_monthly_data?: number;\n plan_disk?: number;\n plan_ram?: number;\n plan_swap?: number;\n os?: string;\n email?: string;\n data_counter?: number;\n data_next_reset?: number;\n ip_addresses?: string[];\n private_ip_addresses?: string[];\n ip_nullroutes?: Record<\n string,\n {\n nullroute_timestamp: number;\n nullroute_duration_s: number;\n log: string;\n }\n >;\n iso1?: string;\n iso2?: string;\n available_isos?: string[];\n plan_max_ipv6s?: number;\n rdns_api_available?: number;\n plan_private_network_available?: number;\n location_private_network_available?: number;\n ptr?: Record<string, string>;\n suspended?: number;\n policy_violation?: number;\n suspension_count?: number;\n total_abuse_points?: number;\n max_abuse_points?: number;\n}\n\nexport interface LiveServiceInfo extends ServiceInfo {\n vm_type?: \"ovz\" | \"kvm\";\n vz_status?: Record<string, unknown>;\n vz_quota?: Record<string, unknown>;\n ve_status?: \"Starting\" | \"Running\" | \"Stopped\";\n ve_mac1?: string;\n ve_used_disk_space_b?: number;\n ve_disk_quota_gb?: number;\n is_cpu_throttled?: number;\n is_disk_throttled?: number;\n ssh_port?: number;\n live_hostname?: string;\n load_average?: string;\n mem_available_kb?: number;\n swap_total_kb?: number;\n swap_available_kb?: number;\n screendump_png_base64?: string;\n}\n\nexport interface Snapshot {\n fileName: string;\n os: string;\n description: string;\n size: number;\n md5: string;\n sticky: number;\n purgesIn: number;\n downloadLink: string;\n downloadLinkSSL: string;\n}\n\nexport interface Backup {\n backupToken: string;\n size: number;\n os: string;\n md5: string;\n timestamp: number;\n}\n","import type { KiwiVMResponse } from \"./types.ts\";\nimport { KiwiVMError } from \"./types.ts\";\n\nconst API_BASE = \"https://api.64clouds.com/v1\";\n\nexport interface ClientOptions {\n veid: string;\n apiKey: string;\n}\n\nexport class KiwiVMClient {\n private veid: string;\n private apiKey: string;\n\n constructor(options: ClientOptions) {\n this.veid = options.veid;\n this.apiKey = options.apiKey;\n }\n\n async call<T extends KiwiVMResponse = KiwiVMResponse>(\n endpoint: string,\n params: Record<string, string | number | boolean | undefined> = {},\n ): Promise<T> {\n const body = new URLSearchParams();\n body.set(\"veid\", this.veid);\n body.set(\"api_key\", this.apiKey);\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n body.set(key, String(value));\n }\n }\n\n const response = await fetch(`${API_BASE}/${endpoint}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as T & KiwiVMResponse;\n\n if (data.error !== 0) {\n throw new KiwiVMError(\n data.message ?? `API error: ${data.error}`,\n data.error,\n data,\n );\n }\n\n return data as T;\n }\n}\n","#!/usr/bin/env node\n\nimport { KiwiVMClient } from \"./client.ts\";\nimport { KiwiVMError } from \"./types.ts\";\n\nfunction parseFlags(args: string[]): Record<string, string> {\n const flags: Record<string, string> = {};\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (!arg?.startsWith(\"--\")) continue;\n const eqIdx = arg.indexOf(\"=\");\n if (eqIdx !== -1) {\n const key = arg.slice(2, eqIdx);\n const value = arg.slice(eqIdx + 1);\n flags[toCamelCase(key)] = value;\n } else {\n const next = args[i + 1];\n if (next !== undefined && !next.startsWith(\"--\")) {\n const key = arg.slice(2);\n flags[toCamelCase(key)] = next;\n i++;\n } else {\n // --flag with no value (treat as boolean/empty string)\n const key = arg.slice(2);\n flags[toCamelCase(key)] = \"\";\n }\n }\n }\n return flags;\n}\n\nfunction toCamelCase(key: string): string {\n // Known mappings: kebab-case flags that need camelCase API param names\n const known: Record<string, string> = {\n \"backup-token\": \"backupToken\",\n \"new-hostname\": \"newHostname\",\n \"ssh-keys\": \"sshKeys\",\n \"source-veid\": \"sourceVeid\",\n \"source-token\": \"sourceToken\",\n \"record-id\": \"recordId\",\n \"api-key\": \"apiKey\",\n \"rate-limit\": \"rateLimit\",\n };\n if (known[key]) return known[key];\n\n // Default: convert --some-flag to someFlag\n return key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\nfunction getCommandFromArgs(args: string[]): {\n positional: string[];\n flags: Record<string, string>;\n} {\n const positional: string[] = [];\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n if (!arg || arg.startsWith(\"--\")) {\n break;\n }\n positional.push(arg);\n i++;\n }\n const flagArgs = args.slice(i);\n const flags = parseFlags(flagArgs);\n return { positional, flags };\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n const { positional, flags } = getCommandFromArgs(args);\n\n const category = positional[0] ?? \"\";\n const action = positional[1] ?? \"\";\n\n // Handle help before auth (no credentials needed)\n if (category === \"\" || category === \"help\") {\n const { run } = await import(\"./commands/help.ts\");\n const text = await run();\n console.log(text as string);\n return;\n }\n\n // Resolve auth: flags first, then env vars\n const flagVeid = flags[\"veid\"];\n const flagApiKey = flags[\"apiKey\"];\n const resolvedVeid = flagVeid || process.env[\"KIWIVM_VEID\"];\n const resolvedApiKey = flagApiKey || process.env[\"KIWIVM_API_KEY\"];\n\n if (!resolvedVeid || !resolvedApiKey) {\n console.error(\n \"Error: VEID and API key are required. Use --veid and --api-key flags, or set KIWIVM_VEID and KIWIVM_API_KEY environment variables.\",\n );\n process.exit(1);\n }\n\n // Strip auth flags before passing to handlers\n const handlerFlags = { ...flags };\n delete handlerFlags[\"veid\"];\n delete handlerFlags[\"apiKey\"];\n\n const client = new KiwiVMClient({\n veid: resolvedVeid,\n apiKey: resolvedApiKey,\n });\n\n try {\n let result: unknown;\n\n switch (category) {\n case \"power\": {\n const { run } = await import(\"./commands/power.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"info\": {\n const { run } = await import(\"./commands/info.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"snapshot\": {\n const { run } = await import(\"./commands/snapshot.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"backup\": {\n const { run } = await import(\"./commands/backup.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"system\": {\n const { run } = await import(\"./commands/system.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"network\": {\n const { run } = await import(\"./commands/network.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"monitoring\": {\n const { run } = await import(\"./commands/monitoring.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"admin\": {\n const { run } = await import(\"./commands/admin.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n default: {\n console.error(`Unknown category: ${category}`);\n console.error(\"Run 'kiwivm-cli help' for usage.\");\n process.exit(1);\n }\n }\n\n console.log(JSON.stringify(result));\n } catch (error) {\n const message =\n error instanceof KiwiVMError ? error.message : String(error);\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n\nexport { main };\n\n// Only auto-run when executed directly (not when imported by tests)\nif (!process.env[\"VITEST\"]) {\n main();\n}\n"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ //#region src/commands/info.ts
2
+ async function run(action, _flags, client) {
3
+ switch (action) {
4
+ case "live": return client.call("getLiveServiceInfo");
5
+ case "":
6
+ case "info": return client.call("getServiceInfo");
7
+ default: throw new Error(`Unknown info action: ${action}. Valid: (no action), live`);
8
+ }
9
+ }
10
+ //#endregion
11
+ export { run };
12
+
13
+ //# sourceMappingURL=info-DKExtFYH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info-DKExtFYH.mjs","names":[],"sources":["../src/commands/info.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\nimport type { LiveServiceInfo, ServiceInfo } from \"../types.ts\";\n\nexport async function run(\n action: string,\n _flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"live\":\n return client.call<LiveServiceInfo>(\"getLiveServiceInfo\");\n case \"\":\n case \"info\":\n return client.call<ServiceInfo>(\"getServiceInfo\");\n default:\n throw new Error(\n `Unknown info action: ${action}. Valid: (no action), live`,\n );\n }\n}\n"],"mappings":";AAGA,eAAsB,IACpB,QACA,QACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,OACH,QAAO,OAAO,KAAsB,qBAAqB;EAC3D,KAAK;EACL,KAAK,OACH,QAAO,OAAO,KAAkB,iBAAiB;EACnD,QACE,OAAM,IAAI,MACR,wBAAwB,OAAO,4BAChC"}
@@ -0,0 +1,13 @@
1
+ //#region src/commands/monitoring.ts
2
+ async function run(action, _flags, client) {
3
+ switch (action) {
4
+ case "usage": return client.call("getRawUsageStats");
5
+ case "audit": return client.call("getAuditLog");
6
+ case "rate-limit": return client.call("getRateLimitStatus");
7
+ default: throw new Error(`Unknown monitoring action: ${action}. Valid: usage, audit, rate-limit`);
8
+ }
9
+ }
10
+ //#endregion
11
+ export { run };
12
+
13
+ //# sourceMappingURL=monitoring-BSuv8fj9.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitoring-BSuv8fj9.mjs","names":[],"sources":["../src/commands/monitoring.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\n\nexport async function run(\n action: string,\n _flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"usage\":\n return client.call(\"getRawUsageStats\");\n case \"audit\":\n return client.call(\"getAuditLog\");\n case \"rate-limit\":\n return client.call(\"getRateLimitStatus\");\n default:\n throw new Error(\n `Unknown monitoring action: ${action}. Valid: usage, audit, rate-limit`,\n );\n }\n}\n"],"mappings":";AAEA,eAAsB,IACpB,QACA,QACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,QACH,QAAO,OAAO,KAAK,mBAAmB;EACxC,KAAK,QACH,QAAO,OAAO,KAAK,cAAc;EACnC,KAAK,aACH,QAAO,OAAO,KAAK,qBAAqB;EAC1C,QACE,OAAM,IAAI,MACR,8BAA8B,OAAO,mCACtC"}
@@ -0,0 +1,15 @@
1
+ //#region src/commands/network.ts
2
+ async function run(action, flags, client) {
3
+ switch (action) {
4
+ case "ipv6-add": return client.call("ipv6/add");
5
+ case "ipv6-delete": return client.call("ipv6/delete", { ip: flags["ip"] });
6
+ case "private-list": return client.call("privateIp/getAvailableIps");
7
+ case "private-assign": return client.call("privateIp/assign", { ip: flags["ip"] });
8
+ case "private-delete": return client.call("privateIp/delete", { ip: flags["ip"] });
9
+ default: throw new Error(`Unknown network action: ${action}. Valid: ipv6-add, ipv6-delete, private-list, private-assign, private-delete`);
10
+ }
11
+ }
12
+ //#endregion
13
+ export { run };
14
+
15
+ //# sourceMappingURL=network-1ycEIJqT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-1ycEIJqT.mjs","names":[],"sources":["../src/commands/network.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\n\nexport async function run(\n action: string,\n flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"ipv6-add\":\n return client.call(\"ipv6/add\");\n case \"ipv6-delete\":\n return client.call(\"ipv6/delete\", { ip: flags[\"ip\"] });\n case \"private-list\":\n return client.call(\"privateIp/getAvailableIps\");\n case \"private-assign\":\n return client.call(\"privateIp/assign\", { ip: flags[\"ip\"] });\n case \"private-delete\":\n return client.call(\"privateIp/delete\", { ip: flags[\"ip\"] });\n default:\n throw new Error(\n `Unknown network action: ${action}. Valid: ipv6-add, ipv6-delete, private-list, private-assign, private-delete`,\n );\n }\n}\n"],"mappings":";AAEA,eAAsB,IACpB,QACA,OACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,WACH,QAAO,OAAO,KAAK,WAAW;EAChC,KAAK,cACH,QAAO,OAAO,KAAK,eAAe,EAAE,IAAI,MAAM,OAAO,CAAC;EACxD,KAAK,eACH,QAAO,OAAO,KAAK,4BAA4B;EACjD,KAAK,iBACH,QAAO,OAAO,KAAK,oBAAoB,EAAE,IAAI,MAAM,OAAO,CAAC;EAC7D,KAAK,iBACH,QAAO,OAAO,KAAK,oBAAoB,EAAE,IAAI,MAAM,OAAO,CAAC;EAC7D,QACE,OAAM,IAAI,MACR,2BAA2B,OAAO,8EACnC"}
@@ -0,0 +1,14 @@
1
+ //#region src/commands/power.ts
2
+ async function run(action, _flags, client) {
3
+ switch (action) {
4
+ case "start": return client.call("start");
5
+ case "stop": return client.call("stop");
6
+ case "restart": return client.call("restart");
7
+ case "kill": return client.call("kill");
8
+ default: throw new Error(`Unknown power action: ${action}. Valid: start, stop, restart, kill`);
9
+ }
10
+ }
11
+ //#endregion
12
+ export { run };
13
+
14
+ //# sourceMappingURL=power-CDg0Mx1A.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power-CDg0Mx1A.mjs","names":[],"sources":["../src/commands/power.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\n\nexport async function run(\n action: string,\n _flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"start\":\n return client.call(\"start\");\n case \"stop\":\n return client.call(\"stop\");\n case \"restart\":\n return client.call(\"restart\");\n case \"kill\":\n return client.call(\"kill\");\n default:\n throw new Error(\n `Unknown power action: ${action}. Valid: start, stop, restart, kill`,\n );\n }\n}\n"],"mappings":";AAEA,eAAsB,IACpB,QACA,QACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,QACH,QAAO,OAAO,KAAK,QAAQ;EAC7B,KAAK,OACH,QAAO,OAAO,KAAK,OAAO;EAC5B,KAAK,UACH,QAAO,OAAO,KAAK,UAAU;EAC/B,KAAK,OACH,QAAO,OAAO,KAAK,OAAO;EAC5B,QACE,OAAM,IAAI,MACR,yBAAyB,OAAO,qCACjC"}
@@ -0,0 +1,23 @@
1
+ //#region src/commands/snapshot.ts
2
+ async function run(action, flags, client) {
3
+ switch (action) {
4
+ case "create": return client.call("snapshot/create", { description: flags["description"] });
5
+ case "list": return client.call("snapshot/list");
6
+ case "delete": return client.call("snapshot/delete", { snapshot: flags["snapshot"] });
7
+ case "restore": return client.call("snapshot/restore", { snapshot: flags["snapshot"] });
8
+ case "sticky": return client.call("snapshot/toggleSticky", {
9
+ snapshot: flags["snapshot"],
10
+ sticky: flags["sticky"] !== void 0 ? Number(flags["sticky"]) : void 0
11
+ });
12
+ case "export": return client.call("snapshot/export", { snapshot: flags["snapshot"] });
13
+ case "import": return client.call("snapshot/import", {
14
+ sourceVeid: flags["sourceVeid"],
15
+ sourceToken: flags["sourceToken"]
16
+ });
17
+ default: throw new Error(`Unknown snapshot action: ${action}. Valid: create, list, delete, restore, sticky, export, import`);
18
+ }
19
+ }
20
+ //#endregion
21
+ export { run };
22
+
23
+ //# sourceMappingURL=snapshot-LO_ufoj5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-LO_ufoj5.mjs","names":[],"sources":["../src/commands/snapshot.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\nimport type { KiwiVMResponse, Snapshot } from \"../types.ts\";\n\nexport async function run(\n action: string,\n flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"create\":\n return client.call(\"snapshot/create\", {\n description: flags[\"description\"],\n });\n case \"list\":\n return client.call<KiwiVMResponse & { snapshots: Snapshot[] }>(\n \"snapshot/list\",\n );\n case \"delete\":\n return client.call(\"snapshot/delete\", { snapshot: flags[\"snapshot\"] });\n case \"restore\":\n return client.call(\"snapshot/restore\", { snapshot: flags[\"snapshot\"] });\n case \"sticky\":\n return client.call(\"snapshot/toggleSticky\", {\n snapshot: flags[\"snapshot\"],\n sticky:\n flags[\"sticky\"] !== undefined ? Number(flags[\"sticky\"]) : undefined,\n });\n case \"export\":\n return client.call(\"snapshot/export\", { snapshot: flags[\"snapshot\"] });\n case \"import\":\n return client.call(\"snapshot/import\", {\n sourceVeid: flags[\"sourceVeid\"],\n sourceToken: flags[\"sourceToken\"],\n });\n default:\n throw new Error(\n `Unknown snapshot action: ${action}. Valid: create, list, delete, restore, sticky, export, import`,\n );\n }\n}\n"],"mappings":";AAGA,eAAsB,IACpB,QACA,OACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,SACH,QAAO,OAAO,KAAK,mBAAmB,EACpC,aAAa,MAAM,gBACpB,CAAC;EACJ,KAAK,OACH,QAAO,OAAO,KACZ,gBACD;EACH,KAAK,SACH,QAAO,OAAO,KAAK,mBAAmB,EAAE,UAAU,MAAM,aAAa,CAAC;EACxE,KAAK,UACH,QAAO,OAAO,KAAK,oBAAoB,EAAE,UAAU,MAAM,aAAa,CAAC;EACzE,KAAK,SACH,QAAO,OAAO,KAAK,yBAAyB;GAC1C,UAAU,MAAM;GAChB,QACE,MAAM,cAAc,KAAA,IAAY,OAAO,MAAM,UAAU,GAAG,KAAA;GAC7D,CAAC;EACJ,KAAK,SACH,QAAO,OAAO,KAAK,mBAAmB,EAAE,UAAU,MAAM,aAAa,CAAC;EACxE,KAAK,SACH,QAAO,OAAO,KAAK,mBAAmB;GACpC,YAAY,MAAM;GAClB,aAAa,MAAM;GACpB,CAAC;EACJ,QACE,OAAM,IAAI,MACR,4BAA4B,OAAO,gEACpC"}
@@ -0,0 +1,21 @@
1
+ //#region src/commands/system.ts
2
+ async function run(action, flags, client) {
3
+ switch (action) {
4
+ case "hostname": return client.call("setHostname", { newHostname: flags["newHostname"] });
5
+ case "rdns": return client.call("setPTR", {
6
+ ip: flags["ip"],
7
+ ptr: flags["ptr"]
8
+ });
9
+ case "password": return client.call("resetRootPassword");
10
+ case "sshkey":
11
+ if (flags["sshKeys"] !== void 0) return client.call("updateSshKeys", { sshKeys: flags["sshKeys"] });
12
+ return client.call("getSshKeys");
13
+ case "os": return client.call("getAvailableOS");
14
+ case "reinstall": return client.call("reinstallOS", { os: flags["os"] });
15
+ default: throw new Error(`Unknown system action: ${action}. Valid: hostname, rdns, password, sshkey, os, reinstall`);
16
+ }
17
+ }
18
+ //#endregion
19
+ export { run };
20
+
21
+ //# sourceMappingURL=system-Bl-dsqX9.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-Bl-dsqX9.mjs","names":[],"sources":["../src/commands/system.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\n\nexport async function run(\n action: string,\n flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"hostname\":\n return client.call(\"setHostname\", { newHostname: flags[\"newHostname\"] });\n case \"rdns\":\n return client.call(\"setPTR\", { ip: flags[\"ip\"], ptr: flags[\"ptr\"] });\n case \"password\":\n return client.call(\"resetRootPassword\");\n case \"sshkey\":\n if (flags[\"sshKeys\"] !== undefined) {\n return client.call(\"updateSshKeys\", { sshKeys: flags[\"sshKeys\"] });\n }\n return client.call(\"getSshKeys\");\n case \"os\":\n return client.call(\"getAvailableOS\");\n case \"reinstall\":\n return client.call(\"reinstallOS\", { os: flags[\"os\"] });\n default:\n throw new Error(\n `Unknown system action: ${action}. Valid: hostname, rdns, password, sshkey, os, reinstall`,\n );\n }\n}\n"],"mappings":";AAEA,eAAsB,IACpB,QACA,OACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,WACH,QAAO,OAAO,KAAK,eAAe,EAAE,aAAa,MAAM,gBAAgB,CAAC;EAC1E,KAAK,OACH,QAAO,OAAO,KAAK,UAAU;GAAE,IAAI,MAAM;GAAO,KAAK,MAAM;GAAQ,CAAC;EACtE,KAAK,WACH,QAAO,OAAO,KAAK,oBAAoB;EACzC,KAAK;AACH,OAAI,MAAM,eAAe,KAAA,EACvB,QAAO,OAAO,KAAK,iBAAiB,EAAE,SAAS,MAAM,YAAY,CAAC;AAEpE,UAAO,OAAO,KAAK,aAAa;EAClC,KAAK,KACH,QAAO,OAAO,KAAK,iBAAiB;EACtC,KAAK,YACH,QAAO,OAAO,KAAK,eAAe,EAAE,IAAI,MAAM,OAAO,CAAC;EACxD,QACE,OAAM,IAAI,MACR,0BAA0B,OAAO,0DAClC"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "kiwivm-cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI for managing KiwiVM (BuyVM) VPS instances",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "kiwivm-cli": "dist/index.mjs"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/FuJuntao/kiwivm-cli.git"
13
+ },
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "src",
20
+ "LICENSE",
21
+ "README.md"
22
+ ],
23
+ "engines": {
24
+ "node": ">=24.0.0"
25
+ },
26
+ "scripts": {
27
+ "lint": "biome lint src",
28
+ "format": "biome format --write src",
29
+ "check": "biome check src",
30
+ "test": "vitest run",
31
+ "typecheck": "tsc --noEmit",
32
+ "build": "tsdown",
33
+ "prepublishOnly": "npm run build"
34
+ },
35
+ "dependencies": {},
36
+ "devDependencies": {
37
+ "@biomejs/biome": "^2.4.12",
38
+ "@tsconfig/node-lts": "^24.0.0",
39
+ "@tsconfig/node-ts": "^23.6.4",
40
+ "@tsconfig/strictest": "^2.0.8",
41
+ "@types/node": "^24.0.0",
42
+ "tsdown": "^0.21.8",
43
+ "typescript": "^6.0.2",
44
+ "vitest": "^4.1.4"
45
+ }
46
+ }