cleargate 0.1.0-alpha.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.
package/dist/cli.js ADDED
@@ -0,0 +1,280 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ createTokenStore
4
+ } from "./chunk-4V4QABOJ.js";
5
+
6
+ // src/cli.ts
7
+ import { Command } from "commander";
8
+
9
+ // package.json
10
+ var package_default = {
11
+ name: "cleargate",
12
+ version: "0.1.0-alpha.1",
13
+ private: false,
14
+ type: "module",
15
+ description: "ClearGate CLI \u2014 connects AI agent teams to the ClearGate MCP server",
16
+ bin: {
17
+ cleargate: "dist/cli.js"
18
+ },
19
+ main: "./dist/cli.cjs",
20
+ module: "./dist/cli.js",
21
+ exports: {
22
+ ".": {
23
+ types: "./dist/cli.d.ts",
24
+ import: "./dist/cli.js",
25
+ require: "./dist/cli.cjs"
26
+ },
27
+ "./admin-api": {
28
+ types: "./dist/admin-api/index.d.ts",
29
+ import: "./dist/admin-api/index.js",
30
+ require: "./dist/admin-api/index.cjs"
31
+ }
32
+ },
33
+ files: [
34
+ "dist",
35
+ "README.md"
36
+ ],
37
+ engines: {
38
+ node: ">=24.0.0"
39
+ },
40
+ scripts: {
41
+ build: "tsup",
42
+ dev: "tsup --watch",
43
+ typecheck: "tsc --noEmit",
44
+ pretest: "npm run build",
45
+ test: "vitest run",
46
+ "test:watch": "vitest"
47
+ },
48
+ dependencies: {
49
+ "@napi-rs/keyring": "^1.2.0",
50
+ commander: "^12",
51
+ zod: "^4.3.0"
52
+ },
53
+ devDependencies: {
54
+ "@types/node": "^24.0.0",
55
+ tsup: "^8",
56
+ typescript: "^5.8.0",
57
+ vitest: "^2.1.0"
58
+ }
59
+ };
60
+
61
+ // src/commands/_stub.ts
62
+ function stubHandler(name) {
63
+ return () => {
64
+ process.stderr.write(`${name}: not yet implemented
65
+ `);
66
+ process.exit(1);
67
+ };
68
+ }
69
+
70
+ // src/commands/join.ts
71
+ import * as os2 from "os";
72
+
73
+ // src/config.ts
74
+ import * as fs from "fs";
75
+ import * as os from "os";
76
+ import * as path from "path";
77
+ import { z } from "zod";
78
+ var ConfigSchema = z.object({
79
+ mcpUrl: z.string().url().optional(),
80
+ profile: z.string().min(1).default("default"),
81
+ logLevel: z.enum(["debug", "info", "warn", "error"]).default("info")
82
+ }).strict();
83
+ function loadConfig(opts = {}) {
84
+ const {
85
+ flags = {},
86
+ env = process.env,
87
+ configPath
88
+ } = opts;
89
+ const resolvedConfigPath = configPath ?? (() => {
90
+ const home = os.homedir();
91
+ if (!home) return null;
92
+ return path.join(home, ".cleargate", "config.json");
93
+ })();
94
+ let fileLayer = {};
95
+ if (resolvedConfigPath) {
96
+ try {
97
+ const raw = fs.readFileSync(resolvedConfigPath, "utf8");
98
+ let parsed;
99
+ try {
100
+ parsed = JSON.parse(raw);
101
+ } catch {
102
+ throw new Error(
103
+ `Failed to parse config file at ${resolvedConfigPath}: invalid JSON`
104
+ );
105
+ }
106
+ const fileResult = ConfigSchema.safeParse(parsed);
107
+ if (!fileResult.success) {
108
+ throw new Error(
109
+ `Invalid config file at ${resolvedConfigPath}: ${fileResult.error.message}`
110
+ );
111
+ }
112
+ fileLayer = fileResult.data;
113
+ } catch (err) {
114
+ if (err instanceof Error && "code" in err && err.code === "ENOENT") {
115
+ } else {
116
+ throw err;
117
+ }
118
+ }
119
+ }
120
+ const envLayer = {};
121
+ if (env["CLEARGATE_MCP_URL"]) {
122
+ envLayer.mcpUrl = env["CLEARGATE_MCP_URL"];
123
+ }
124
+ if (env["CLEARGATE_PROFILE"]) {
125
+ envLayer.profile = env["CLEARGATE_PROFILE"];
126
+ }
127
+ if (env["CLEARGATE_LOG_LEVEL"]) {
128
+ envLayer.logLevel = env["CLEARGATE_LOG_LEVEL"];
129
+ }
130
+ const merged = {
131
+ ...fileLayer,
132
+ ...envLayer,
133
+ ...flags.mcpUrl !== void 0 ? { mcpUrl: flags.mcpUrl } : {},
134
+ ...flags.profile !== void 0 ? { profile: flags.profile } : {},
135
+ ...flags.logLevel !== void 0 ? { logLevel: flags.logLevel } : {}
136
+ };
137
+ for (const key of Object.keys(merged)) {
138
+ if (merged[key] === void 0) {
139
+ delete merged[key];
140
+ }
141
+ }
142
+ const result = ConfigSchema.safeParse(merged);
143
+ if (!result.success) {
144
+ throw new Error(`Config validation failed: ${result.error.message}`);
145
+ }
146
+ return result.data;
147
+ }
148
+
149
+ // src/commands/join.ts
150
+ var UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
151
+ async function joinHandler(opts) {
152
+ const fetchFn = opts.fetch ?? globalThis.fetch;
153
+ const stdout = opts.stdout ?? ((s) => process.stdout.write(s));
154
+ const stderr = opts.stderr ?? ((s) => process.stderr.write(s));
155
+ const exit = opts.exit ?? ((c) => process.exit(c));
156
+ const hostname2 = opts.hostname ?? (() => os2.hostname());
157
+ let token;
158
+ let baseUrl;
159
+ try {
160
+ if (UUID_V4_RE.test(opts.inviteUrl)) {
161
+ token = opts.inviteUrl;
162
+ const cfg = loadConfig({
163
+ flags: { profile: opts.profile, mcpUrl: opts.mcpUrlFlag }
164
+ });
165
+ if (!cfg.mcpUrl) {
166
+ stderr(
167
+ "cleargate: bare invite token requires mcpUrl. Pass --mcp-url <url> or set CLEARGATE_MCP_URL.\n"
168
+ );
169
+ exit(5);
170
+ return;
171
+ }
172
+ baseUrl = cfg.mcpUrl;
173
+ } else {
174
+ const url = new URL(opts.inviteUrl);
175
+ const m = url.pathname.match(/^\/join\/([0-9a-f-]{36})$/i);
176
+ if (!m || !UUID_V4_RE.test(m[1])) {
177
+ throw new Error("bad path");
178
+ }
179
+ token = m[1];
180
+ baseUrl = url.origin;
181
+ }
182
+ } catch {
183
+ stderr("cleargate: invalid invite URL or token format.\n");
184
+ exit(5);
185
+ return;
186
+ }
187
+ let response;
188
+ try {
189
+ response = await fetchFn(`${baseUrl}/join/${token}`, { method: "POST" });
190
+ } catch (err) {
191
+ stderr(
192
+ `cleargate: cannot reach ${baseUrl} (${err instanceof Error ? err.message : String(err)}).
193
+ `
194
+ );
195
+ exit(2);
196
+ return;
197
+ }
198
+ if (response.status === 410) {
199
+ const body = await response.json().catch(() => ({}));
200
+ if (body.error === "invite_expired") {
201
+ stderr("cleargate: invite expired. Request a new invite.\n");
202
+ } else {
203
+ stderr("cleargate: invite already consumed. Request a new invite.\n");
204
+ }
205
+ exit(3);
206
+ return;
207
+ }
208
+ if (response.status === 404) {
209
+ stderr("cleargate: invite not found.\n");
210
+ exit(4);
211
+ return;
212
+ }
213
+ if (response.status === 429) {
214
+ const retry = response.headers.get("retry-after") ?? "900";
215
+ stderr(`cleargate: too many requests. Retry after ${retry}s.
216
+ `);
217
+ exit(8);
218
+ return;
219
+ }
220
+ if (response.status >= 500) {
221
+ stderr(`cleargate: server error ${response.status}.
222
+ `);
223
+ exit(6);
224
+ return;
225
+ }
226
+ if (!response.ok) {
227
+ stderr(`cleargate: unexpected status ${response.status}.
228
+ `);
229
+ exit(7);
230
+ return;
231
+ }
232
+ let rawBody;
233
+ try {
234
+ rawBody = await response.json();
235
+ } catch {
236
+ stderr("cleargate: server returned non-JSON response.\n");
237
+ exit(7);
238
+ return;
239
+ }
240
+ const b = rawBody;
241
+ if (typeof b.refresh_token !== "string" || typeof b.project_name !== "string") {
242
+ stderr("cleargate: server returned unexpected response shape.\n");
243
+ exit(7);
244
+ return;
245
+ }
246
+ const refreshToken = b.refresh_token;
247
+ const projectName = b.project_name;
248
+ try {
249
+ const store = await (opts.createStore ?? createTokenStore)();
250
+ await store.save(opts.profile, refreshToken);
251
+ stdout(`joined project '${projectName}' as '${hostname2()}'
252
+ `);
253
+ stdout(`refresh token saved to ${store.backend}.
254
+ `);
255
+ } catch (err) {
256
+ stderr(
257
+ `cleargate: internal error: ${err instanceof Error ? err.message : String(err)}
258
+ `
259
+ );
260
+ exit(99);
261
+ }
262
+ }
263
+
264
+ // src/cli.ts
265
+ var program = new Command();
266
+ program.name("cleargate").description("ClearGate CLI \u2014 connects AI agent teams to the ClearGate MCP server").version(package_default.version, "-V, --version").option("--profile <name>", "configuration profile to use", "default").option("--mcp-url <url>", "MCP server URL (overrides config file and env)").showHelpAfterError("(use `cleargate --help`)");
267
+ program.command("join <invite-url>").description("join a ClearGate workspace using an invite URL").action(async (inviteUrl, _opts, command) => {
268
+ const globals = command.parent.opts();
269
+ await joinHandler({
270
+ inviteUrl,
271
+ profile: globals.profile,
272
+ mcpUrlFlag: globals.mcpUrl
273
+ });
274
+ });
275
+ program.command("whoami").description("print the currently authenticated agent identity").action(stubHandler("whoami"));
276
+ program.command("stamp").description("stamp a delivery artifact into the MCP server").action(stubHandler("stamp"));
277
+ program.command("wiki").description("query or update the workspace wiki").action(stubHandler("wiki"));
278
+ program.command("admin").description("administrative operations (create-project, invite, issue-token, revoke-token)").action(stubHandler("admin"));
279
+ void program.parseAsync(process.argv);
280
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../package.json","../src/commands/_stub.ts","../src/commands/join.ts","../src/config.ts"],"sourcesContent":["import { Command } from 'commander';\nimport pkg from '../package.json' with { type: 'json' };\nimport { stubHandler } from './commands/_stub.js';\nimport { joinHandler } from './commands/join.js';\n\nconst program = new Command();\n\nprogram\n .name('cleargate')\n .description('ClearGate CLI — connects AI agent teams to the ClearGate MCP server')\n .version(pkg.version, '-V, --version')\n .option('--profile <name>', 'configuration profile to use', 'default')\n .option('--mcp-url <url>', 'MCP server URL (overrides config file and env)')\n .showHelpAfterError('(use `cleargate --help`)');\n\nprogram\n .command('join <invite-url>')\n .description('join a ClearGate workspace using an invite URL')\n .action(async (inviteUrl: string, _opts: Record<string, unknown>, command: Command) => {\n const globals = command.parent!.opts<{ profile: string; mcpUrl?: string }>();\n await joinHandler({\n inviteUrl,\n profile: globals.profile,\n mcpUrlFlag: globals.mcpUrl,\n });\n });\n\nprogram\n .command('whoami')\n .description('print the currently authenticated agent identity')\n .action(stubHandler('whoami'));\n\nprogram\n .command('stamp')\n .description('stamp a delivery artifact into the MCP server')\n .action(stubHandler('stamp'));\n\nprogram\n .command('wiki')\n .description('query or update the workspace wiki')\n .action(stubHandler('wiki'));\n\nprogram\n .command('admin')\n .description('administrative operations (create-project, invite, issue-token, revoke-token)')\n .action(stubHandler('admin'));\n\nvoid program.parseAsync(process.argv);\n","{\n \"name\": \"cleargate\",\n \"version\": \"0.1.0-alpha.1\",\n \"private\": false,\n \"type\": \"module\",\n \"description\": \"ClearGate CLI — connects AI agent teams to the ClearGate MCP server\",\n \"bin\": {\n \"cleargate\": \"dist/cli.js\"\n },\n \"main\": \"./dist/cli.cjs\",\n \"module\": \"./dist/cli.js\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/cli.d.ts\",\n \"import\": \"./dist/cli.js\",\n \"require\": \"./dist/cli.cjs\"\n },\n \"./admin-api\": {\n \"types\": \"./dist/admin-api/index.d.ts\",\n \"import\": \"./dist/admin-api/index.js\",\n \"require\": \"./dist/admin-api/index.cjs\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"engines\": {\n \"node\": \">=24.0.0\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"pretest\": \"npm run build\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\"\n },\n \"dependencies\": {\n \"@napi-rs/keyring\": \"^1.2.0\",\n \"commander\": \"^12\",\n \"zod\": \"^4.3.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^24.0.0\",\n \"tsup\": \"^8\",\n \"typescript\": \"^5.8.0\",\n \"vitest\": \"^2.1.0\"\n }\n}\n","/**\n * Shared stub handler for all not-yet-implemented subcommands.\n * Writes \"<name>: not yet implemented\" to stderr and exits 1.\n */\nexport function stubHandler(name: string): () => never {\n return (): never => {\n process.stderr.write(`${name}: not yet implemented\\n`);\n process.exit(1);\n };\n}\n","import * as os from 'node:os';\nimport { loadConfig } from '../config.js';\nimport { createTokenStore } from '../auth/factory.js';\n\nconst UUID_V4_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport interface JoinOptions {\n inviteUrl: string;\n profile: string;\n mcpUrlFlag?: string;\n /** Test seam: replaces globalThis.fetch */\n fetch?: typeof globalThis.fetch;\n /** Test seam: replaces createTokenStore */\n createStore?: typeof createTokenStore;\n /** Test seam: replaces os.hostname() */\n hostname?: () => string;\n /** Test seam: replaces process.stdout.write */\n stdout?: (s: string) => void;\n /** Test seam: replaces process.stderr.write */\n stderr?: (s: string) => void;\n /** Test seam: replaces process.exit */\n exit?: (code: number) => never;\n}\n\nexport async function joinHandler(opts: JoinOptions): Promise<void> {\n const fetchFn = opts.fetch ?? globalThis.fetch;\n const stdout = opts.stdout ?? ((s) => process.stdout.write(s));\n const stderr = opts.stderr ?? ((s) => process.stderr.write(s));\n const exit = opts.exit ?? ((c: number): never => process.exit(c));\n const hostname = opts.hostname ?? (() => os.hostname());\n\n // ── Parse inviteUrl → { token, baseUrl } ──────────────────────────────────\n let token: string;\n let baseUrl: string;\n\n try {\n if (UUID_V4_RE.test(opts.inviteUrl)) {\n // Bare UUID form — requires mcpUrl from config\n token = opts.inviteUrl;\n const cfg = loadConfig({\n flags: { profile: opts.profile, mcpUrl: opts.mcpUrlFlag },\n });\n if (!cfg.mcpUrl) {\n stderr(\n 'cleargate: bare invite token requires mcpUrl. Pass --mcp-url <url> or set CLEARGATE_MCP_URL.\\n',\n );\n exit(5);\n return; // unreachable — satisfies TypeScript after mock exit\n }\n baseUrl = cfg.mcpUrl;\n } else {\n // Full URL form: https://host/join/<uuid>\n const url = new URL(opts.inviteUrl);\n const m = url.pathname.match(/^\\/join\\/([0-9a-f-]{36})$/i);\n if (!m || !UUID_V4_RE.test(m[1]!)) {\n throw new Error('bad path');\n }\n token = m[1]!;\n baseUrl = url.origin;\n }\n } catch {\n stderr('cleargate: invalid invite URL or token format.\\n');\n exit(5);\n return; // unreachable\n }\n\n // ── POST /join/:token ──────────────────────────────────────────────────────\n let response: Response;\n try {\n response = await fetchFn(`${baseUrl}/join/${token}`, { method: 'POST' });\n } catch (err) {\n stderr(\n `cleargate: cannot reach ${baseUrl} (${err instanceof Error ? err.message : String(err)}).\\n`,\n );\n exit(2);\n return; // unreachable\n }\n\n // ── Error status handling ──────────────────────────────────────────────────\n if (response.status === 410) {\n const body = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n if (body.error === 'invite_expired') {\n stderr('cleargate: invite expired. Request a new invite.\\n');\n } else {\n stderr('cleargate: invite already consumed. Request a new invite.\\n');\n }\n exit(3);\n return;\n }\n\n if (response.status === 404) {\n stderr('cleargate: invite not found.\\n');\n exit(4);\n return;\n }\n\n if (response.status === 429) {\n const retry = response.headers.get('retry-after') ?? '900';\n stderr(`cleargate: too many requests. Retry after ${retry}s.\\n`);\n exit(8);\n return;\n }\n\n if (response.status >= 500) {\n stderr(`cleargate: server error ${response.status}.\\n`);\n exit(6);\n return;\n }\n\n if (!response.ok) {\n stderr(`cleargate: unexpected status ${response.status}.\\n`);\n exit(7);\n return;\n }\n\n // ── 200 — extract with named field access (NEVER spread) ──────────────────\n let rawBody: unknown;\n try {\n rawBody = await response.json();\n } catch {\n stderr('cleargate: server returned non-JSON response.\\n');\n exit(7);\n return;\n }\n\n const b = rawBody as {\n refresh_token?: unknown;\n project_name?: unknown;\n member_role?: unknown;\n };\n\n if (typeof b.refresh_token !== 'string' || typeof b.project_name !== 'string') {\n stderr('cleargate: server returned unexpected response shape.\\n');\n exit(7);\n return;\n }\n\n // ── Seat the refresh token ─────────────────────────────────────────────────\n // Named field access — b.refresh_token is a bare string, never logged\n const refreshToken: string = b.refresh_token;\n const projectName: string = b.project_name;\n\n try {\n const store = await (opts.createStore ?? createTokenStore)();\n await store.save(opts.profile, refreshToken);\n\n // ── Success output (D10) ─────────────────────────────────────────────────\n stdout(`joined project '${projectName}' as '${hostname()}'\\n`);\n stdout(`refresh token saved to ${store.backend}.\\n`);\n } catch (err) {\n stderr(\n `cleargate: internal error: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n exit(99);\n }\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { z } from 'zod';\n\nexport const ConfigSchema = z\n .object({\n mcpUrl: z.string().url().optional(),\n profile: z.string().min(1).default('default'),\n logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n })\n .strict();\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\n/** Partial raw config used for each layer before merge */\ntype RawConfig = Partial<{\n mcpUrl: string | undefined;\n profile: string | undefined;\n logLevel: string | undefined;\n}>;\n\nexport interface LoadConfigOptions {\n flags?: RawConfig;\n env?: NodeJS.ProcessEnv;\n configPath?: string;\n}\n\n/**\n * Synchronously loads and merges config from all layers:\n * flags > env > config file > zod defaults\n */\nexport function loadConfig(opts: LoadConfigOptions = {}): Config {\n const {\n flags = {},\n env = process.env,\n configPath,\n } = opts;\n\n // Resolve config file path\n const resolvedConfigPath =\n configPath ??\n (() => {\n const home = os.homedir();\n if (!home) return null;\n return path.join(home, '.cleargate', 'config.json');\n })();\n\n // Layer: file\n let fileLayer: RawConfig = {};\n if (resolvedConfigPath) {\n try {\n const raw = fs.readFileSync(resolvedConfigPath, 'utf8');\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\n `Failed to parse config file at ${resolvedConfigPath}: invalid JSON`,\n );\n }\n // Validate file contents strictly (unknown keys will throw here)\n const fileResult = ConfigSchema.safeParse(parsed);\n if (!fileResult.success) {\n throw new Error(\n `Invalid config file at ${resolvedConfigPath}: ${fileResult.error.message}`,\n );\n }\n fileLayer = fileResult.data;\n } catch (err) {\n // Re-throw parse/validation errors; silently skip only ENOENT\n if (\n err instanceof Error &&\n 'code' in err &&\n (err as NodeJS.ErrnoException).code === 'ENOENT'\n ) {\n // file doesn't exist — skip silently\n } else {\n throw err;\n }\n }\n }\n\n // Layer: env\n const envLayer: RawConfig = {};\n if (env['CLEARGATE_MCP_URL']) {\n envLayer.mcpUrl = env['CLEARGATE_MCP_URL'];\n }\n if (env['CLEARGATE_PROFILE']) {\n envLayer.profile = env['CLEARGATE_PROFILE'];\n }\n if (env['CLEARGATE_LOG_LEVEL']) {\n envLayer.logLevel = env['CLEARGATE_LOG_LEVEL'];\n }\n\n // Merge: flags > env > file (start from {} so zod defaults fill in missing fields)\n const merged: Record<string, unknown> = {\n ...fileLayer,\n ...envLayer,\n ...(flags.mcpUrl !== undefined ? { mcpUrl: flags.mcpUrl } : {}),\n ...(flags.profile !== undefined ? { profile: flags.profile } : {}),\n ...(flags.logLevel !== undefined ? { logLevel: flags.logLevel } : {}),\n };\n\n // Remove undefined values so zod defaults apply properly\n for (const key of Object.keys(merged)) {\n if (merged[key] === undefined) {\n delete merged[key];\n }\n }\n\n const result = ConfigSchema.safeParse(merged);\n if (!result.success) {\n throw new Error(`Config validation failed: ${result.error.message}`);\n }\n\n return result.data;\n}\n\n/**\n * Asserts mcpUrl is present, throws a user-friendly error if not.\n */\nexport function requireMcpUrl(cfg: Config): string {\n if (cfg.mcpUrl === undefined) {\n throw new Error(\n 'mcpUrl not configured. Run `cleargate join <invite-url>` first.',\n );\n }\n return cfg.mcpUrl;\n}\n"],"mappings":"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","names":["os","hostname"]}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "cleargate",
3
+ "version": "0.1.0-alpha.1",
4
+ "private": false,
5
+ "type": "module",
6
+ "description": "ClearGate CLI — connects AI agent teams to the ClearGate MCP server",
7
+ "bin": {
8
+ "cleargate": "dist/cli.js"
9
+ },
10
+ "main": "./dist/cli.cjs",
11
+ "module": "./dist/cli.js",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/cli.d.ts",
15
+ "import": "./dist/cli.js",
16
+ "require": "./dist/cli.cjs"
17
+ },
18
+ "./admin-api": {
19
+ "types": "./dist/admin-api/index.d.ts",
20
+ "import": "./dist/admin-api/index.js",
21
+ "require": "./dist/admin-api/index.cjs"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "README.md"
27
+ ],
28
+ "engines": {
29
+ "node": ">=24.0.0"
30
+ },
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "dev": "tsup --watch",
34
+ "typecheck": "tsc --noEmit",
35
+ "pretest": "npm run build",
36
+ "test": "vitest run",
37
+ "test:watch": "vitest"
38
+ },
39
+ "dependencies": {
40
+ "@napi-rs/keyring": "^1.2.0",
41
+ "commander": "^12",
42
+ "zod": "^4.3.0"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^24.0.0",
46
+ "tsup": "^8",
47
+ "typescript": "^5.8.0",
48
+ "vitest": "^2.1.0"
49
+ }
50
+ }