@waniwani/cli 0.0.12 → 0.0.14

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/index.js CHANGED
@@ -189,157 +189,103 @@ import { Command as Command2 } from "commander";
189
189
  import ora from "ora";
190
190
 
191
191
  // src/lib/auth.ts
192
- import { access, mkdir as mkdir4, readFile as readFile3, writeFile as writeFile4 } from "fs/promises";
192
+ import { access, mkdir as mkdir3, readFile as readFile2, writeFile as writeFile3 } from "fs/promises";
193
193
  import { homedir as homedir2 } from "os";
194
- import { join as join4 } from "path";
195
- import { z as z3 } from "zod";
196
-
197
- // src/lib/config.ts
198
- import { mkdir as mkdir3, readFile as readFile2, writeFile as writeFile3 } from "fs/promises";
199
- import { homedir } from "os";
200
194
  import { join as join3 } from "path";
201
195
  import { z as z2 } from "zod";
202
196
 
203
- // src/lib/project-config.ts
197
+ // src/lib/config.ts
204
198
  import { existsSync as existsSync2 } from "fs";
205
199
  import { mkdir as mkdir2, readFile, writeFile as writeFile2 } from "fs/promises";
200
+ import { homedir } from "os";
206
201
  import { join as join2 } from "path";
207
202
  import { z } from "zod";
208
- var PROJECT_CONFIG_DIR2 = ".waniwani";
209
- var PROJECT_CONFIG_FILE2 = "settings.local.json";
210
- var ProjectConfigSchema = z.object({
211
- mcpId: z.string().optional(),
212
- defaults: z.object({
213
- model: z.string().optional(),
214
- maxSteps: z.number().optional()
215
- }).optional()
203
+ var LOCAL_DIR = join2(process.cwd(), ".waniwani");
204
+ var LOCAL_FILE = join2(LOCAL_DIR, "settings.json");
205
+ var GLOBAL_DIR = join2(homedir(), ".waniwani");
206
+ var GLOBAL_FILE = join2(GLOBAL_DIR, "settings.json");
207
+ var DEFAULT_API_URL = "https://app.waniwani.ai";
208
+ var ConfigSchema = z.object({
209
+ defaults: z.object({ model: z.string(), maxSteps: z.number() }).default({ model: "claude-sonnet-4-20250514", maxSteps: 10 }),
210
+ mcpId: z.string().nullable().default(null),
211
+ apiUrl: z.string().nullable().default(null)
216
212
  });
217
- var projectConfigCache;
218
- function getProjectConfigPath() {
219
- return join2(process.cwd(), PROJECT_CONFIG_DIR2, PROJECT_CONFIG_FILE2);
220
- }
221
- function getProjectConfigDir() {
222
- return join2(process.cwd(), PROJECT_CONFIG_DIR2);
223
- }
224
- function hasProjectConfig() {
225
- return existsSync2(getProjectConfigDir());
226
- }
227
- async function loadProjectConfig() {
228
- if (projectConfigCache !== void 0) {
229
- return projectConfigCache;
213
+ var Config = class {
214
+ dir;
215
+ file;
216
+ cache = null;
217
+ scope;
218
+ constructor(forceGlobal = false) {
219
+ const useLocal = !forceGlobal && existsSync2(LOCAL_DIR);
220
+ this.dir = useLocal ? LOCAL_DIR : GLOBAL_DIR;
221
+ this.file = useLocal ? LOCAL_FILE : GLOBAL_FILE;
222
+ this.scope = useLocal ? "local" : "global";
230
223
  }
231
- const configPath = getProjectConfigPath();
232
- try {
233
- const content = await readFile(configPath, "utf-8");
234
- projectConfigCache = ProjectConfigSchema.parse(JSON.parse(content));
235
- return projectConfigCache;
236
- } catch {
237
- projectConfigCache = null;
238
- return null;
224
+ async load() {
225
+ if (!this.cache) {
226
+ try {
227
+ this.cache = ConfigSchema.parse(
228
+ JSON.parse(await readFile(this.file, "utf-8"))
229
+ );
230
+ } catch {
231
+ this.cache = ConfigSchema.parse({});
232
+ }
233
+ }
234
+ return this.cache;
239
235
  }
240
- }
241
- async function saveProjectConfig(config2) {
242
- const configDir = getProjectConfigDir();
243
- const configPath = getProjectConfigPath();
244
- await mkdir2(configDir, { recursive: true });
245
- const existing = await loadProjectConfig() ?? {};
246
- const merged = ProjectConfigSchema.parse({ ...existing, ...config2 });
247
- await writeFile2(configPath, JSON.stringify(merged, null, " "), "utf-8");
248
- projectConfigCache = merged;
249
- }
250
-
251
- // src/lib/config.ts
252
- var CONFIG_DIR = join3(homedir(), ".waniwani");
253
- var CONFIG_FILE = join3(CONFIG_DIR, "config.json");
254
- var DEFAULT_API_URL = "https://app.waniwani.ai";
255
- var ConfigSchema = z2.object({
256
- defaults: z2.object({ model: z2.string(), maxSteps: z2.number() }).default({ model: "claude-sonnet-4-20250514", maxSteps: 10 }),
257
- activeMcpId: z2.string().nullable().default(null),
258
- apiUrl: z2.string().nullable().default(null)
259
- });
260
- var cache = null;
261
- async function load() {
262
- if (cache) return cache;
263
- try {
264
- cache = ConfigSchema.parse(
265
- JSON.parse(await readFile2(CONFIG_FILE, "utf-8"))
266
- );
267
- } catch {
268
- cache = ConfigSchema.parse({});
236
+ async save(data) {
237
+ this.cache = data;
238
+ await mkdir2(this.dir, { recursive: true });
239
+ await writeFile2(this.file, JSON.stringify(data, null, " "));
269
240
  }
270
- return cache;
271
- }
272
- async function save(cfg) {
273
- cache = cfg;
274
- await mkdir3(CONFIG_DIR, { recursive: true });
275
- await writeFile3(CONFIG_FILE, JSON.stringify(cfg, null, 2));
276
- }
277
- async function update(fn) {
278
- const cfg = await load();
279
- fn(cfg);
280
- await save(cfg);
281
- }
282
- var config = {
283
- getDefaults: async () => {
284
- const cfg = await load();
285
- return cfg.defaults;
286
- },
287
- getEffectiveDefaults: async () => {
288
- const global = await load();
289
- const project = await loadProjectConfig();
290
- return { ...global.defaults, ...project?.defaults };
291
- },
292
- setDefaults: (defaults) => {
293
- return update((cfg) => {
294
- cfg.defaults = { ...cfg.defaults, ...defaults };
295
- });
296
- },
297
- getActiveMcpId: async () => {
298
- const cfg = await load();
299
- return cfg.activeMcpId;
300
- },
301
- getEffectiveMcpId: async () => {
302
- const project = await loadProjectConfig();
303
- if (project?.mcpId) return project.mcpId;
304
- const cfg = await load();
305
- return cfg.activeMcpId;
306
- },
307
- setActiveMcpId: (id) => {
308
- return update((cfg) => {
309
- cfg.activeMcpId = id;
310
- });
311
- },
312
- getApiUrl: async () => {
241
+ async getDefaults() {
242
+ return (await this.load()).defaults;
243
+ }
244
+ async setDefaults(defaults) {
245
+ const data = await this.load();
246
+ data.defaults = { ...data.defaults, ...defaults };
247
+ await this.save(data);
248
+ }
249
+ async getMcpId() {
250
+ return (await this.load()).mcpId;
251
+ }
252
+ async setMcpId(id) {
253
+ const data = await this.load();
254
+ data.mcpId = id;
255
+ await this.save(data);
256
+ }
257
+ async getApiUrl() {
313
258
  if (process.env.WANIWANI_API_URL) return process.env.WANIWANI_API_URL;
314
- const cfg = await load();
315
- return cfg.apiUrl || DEFAULT_API_URL;
316
- },
317
- setApiUrl: (url) => {
318
- return update((cfg) => {
319
- cfg.apiUrl = url;
320
- });
321
- },
322
- clear: () => {
323
- return save(ConfigSchema.parse({}));
259
+ return (await this.load()).apiUrl || DEFAULT_API_URL;
260
+ }
261
+ async setApiUrl(url) {
262
+ const data = await this.load();
263
+ data.apiUrl = url;
264
+ await this.save(data);
265
+ }
266
+ async clear() {
267
+ await this.save(ConfigSchema.parse({}));
324
268
  }
325
269
  };
270
+ var config = new Config();
271
+ var globalConfig = new Config(true);
326
272
 
327
273
  // src/lib/auth.ts
328
- var CONFIG_DIR2 = join4(homedir2(), ".waniwani");
329
- var AUTH_FILE = join4(CONFIG_DIR2, "auth.json");
330
- var AuthStoreSchema = z3.object({
331
- accessToken: z3.string().nullable().default(null),
332
- refreshToken: z3.string().nullable().default(null),
333
- expiresAt: z3.string().nullable().default(null)
274
+ var CONFIG_DIR = join3(homedir2(), ".waniwani");
275
+ var AUTH_FILE = join3(CONFIG_DIR, "auth.json");
276
+ var AuthStoreSchema = z2.object({
277
+ accessToken: z2.string().nullable().default(null),
278
+ refreshToken: z2.string().nullable().default(null),
279
+ expiresAt: z2.string().nullable().default(null)
334
280
  });
335
281
  async function ensureConfigDir() {
336
- await mkdir4(CONFIG_DIR2, { recursive: true });
282
+ await mkdir3(CONFIG_DIR, { recursive: true });
337
283
  }
338
284
  async function readAuthStore() {
339
285
  await ensureConfigDir();
340
286
  try {
341
287
  await access(AUTH_FILE);
342
- const content = await readFile3(AUTH_FILE, "utf-8");
288
+ const content = await readFile2(AUTH_FILE, "utf-8");
343
289
  return AuthStoreSchema.parse(JSON.parse(content));
344
290
  } catch {
345
291
  return AuthStoreSchema.parse({});
@@ -347,7 +293,7 @@ async function readAuthStore() {
347
293
  }
348
294
  async function writeAuthStore(store) {
349
295
  await ensureConfigDir();
350
- await writeFile4(AUTH_FILE, JSON.stringify(store, null, 2), "utf-8");
296
+ await writeFile3(AUTH_FILE, JSON.stringify(store, null, 2), "utf-8");
351
297
  }
352
298
  var AuthManager = class {
353
299
  storeCache = null;
@@ -593,7 +539,7 @@ var loginCommand = new Command2("login").description("Log in to WaniWani").optio
593
539
  const codeChallenge = await generateCodeChallenge(codeVerifier);
594
540
  const state = generateState();
595
541
  const apiUrl = await config.getApiUrl();
596
- const authUrl = new URL(`${apiUrl}/oauth/authorize`);
542
+ const authUrl = new URL(`${apiUrl}/api/auth/oauth2/authorize`);
597
543
  authUrl.searchParams.set("client_id", CLIENT_ID);
598
544
  authUrl.searchParams.set("redirect_uri", CALLBACK_URL);
599
545
  authUrl.searchParams.set("response_type", "code");
@@ -754,24 +700,13 @@ var createCommand = new Command4("create").description("Create a new MCP sandbox
754
700
  name
755
701
  });
756
702
  spinner.succeed("MCP sandbox created");
757
- const useProjectConfig = !options.global && hasProjectConfig();
758
- if (useProjectConfig) {
759
- await saveProjectConfig({ mcpId: result.id });
760
- } else {
761
- await config.setActiveMcpId(result.id);
762
- }
703
+ const cfg = options.global ? globalConfig : config;
704
+ await cfg.setMcpId(result.id);
763
705
  if (json) {
764
- formatOutput(
765
- { ...result, scope: useProjectConfig ? "project" : "global" },
766
- true
767
- );
706
+ formatOutput({ ...result, scope: cfg.scope }, true);
768
707
  } else {
769
- const scope = useProjectConfig ? "(saved to project)" : "(saved globally)";
770
708
  console.log();
771
- formatSuccess(
772
- `MCP sandbox "${name}" created successfully! ${scope}`,
773
- false
774
- );
709
+ formatSuccess(`MCP sandbox "${name}" created! (${cfg.scope})`, false);
775
710
  console.log();
776
711
  console.log(` MCP ID: ${result.id}`);
777
712
  console.log(` Sandbox ID: ${result.sandboxId}`);
@@ -797,7 +732,7 @@ var deployCommand = new Command5("deploy").description("Deploy MCP server to Git
797
732
  try {
798
733
  let mcpId = options.mcpId;
799
734
  if (!mcpId) {
800
- mcpId = await config.getActiveMcpId();
735
+ mcpId = await config.getMcpId();
801
736
  if (!mcpId) {
802
737
  throw new McpError(
803
738
  "No active MCP. Run 'waniwani mcp create <name>' or 'waniwani mcp use <name>'."
@@ -848,7 +783,7 @@ var listCommand = new Command6("list").description("List all MCPs in your organi
848
783
  `/api/admin/mcps${options.all ? "?all=true" : ""}`
849
784
  );
850
785
  spinner.stop();
851
- const activeMcpId = await config.getActiveMcpId();
786
+ const activeMcpId = await config.getMcpId();
852
787
  if (json) {
853
788
  formatOutput(
854
789
  {
@@ -905,7 +840,7 @@ var statusCommand = new Command7("status").description("Show current MCP sandbox
905
840
  try {
906
841
  let mcpId = options.mcpId;
907
842
  if (!mcpId) {
908
- mcpId = await config.getActiveMcpId();
843
+ mcpId = await config.getMcpId();
909
844
  if (!mcpId) {
910
845
  throw new McpError(
911
846
  "No active MCP. Run 'waniwani mcp create <name>' to create one or 'waniwani mcp use <name>' to select one."
@@ -947,7 +882,7 @@ var stopCommand = new Command8("stop").description("Stop and clean up the MCP sa
947
882
  try {
948
883
  let mcpId = options.mcpId;
949
884
  if (!mcpId) {
950
- mcpId = await config.getActiveMcpId();
885
+ mcpId = await config.getMcpId();
951
886
  if (!mcpId) {
952
887
  throw new McpError("No active MCP. Use --mcp-id to specify one.");
953
888
  }
@@ -955,8 +890,8 @@ var stopCommand = new Command8("stop").description("Stop and clean up the MCP sa
955
890
  const spinner = ora6("Stopping MCP sandbox...").start();
956
891
  await api.delete(`/api/admin/mcps/${mcpId}`);
957
892
  spinner.succeed("MCP sandbox stopped");
958
- if (await config.getActiveMcpId() === mcpId) {
959
- await config.setActiveMcpId(null);
893
+ if (await config.getMcpId() === mcpId) {
894
+ await config.setMcpId(null);
960
895
  }
961
896
  if (json) {
962
897
  formatOutput({ stopped: mcpId }, true);
@@ -980,7 +915,7 @@ var testCommand = new Command9("test").description("Test MCP tools via the sandb
980
915
  try {
981
916
  let mcpId = options.mcpId;
982
917
  if (!mcpId) {
983
- mcpId = await config.getActiveMcpId();
918
+ mcpId = await config.getMcpId();
984
919
  if (!mcpId) {
985
920
  throw new McpError(
986
921
  "No active MCP. Run 'waniwani mcp create <name>' or 'waniwani mcp use <name>'."
@@ -1081,20 +1016,12 @@ var useCommand = new Command10("use").description("Select an MCP to use for subs
1081
1016
  `MCP "${name}" is ${mcp.status}. Only active MCPs can be used.`
1082
1017
  );
1083
1018
  }
1084
- const useProjectConfig = !options.global && hasProjectConfig();
1085
- if (useProjectConfig) {
1086
- await saveProjectConfig({ mcpId: mcp.id });
1087
- } else {
1088
- await config.setActiveMcpId(mcp.id);
1089
- }
1019
+ const cfg = options.global ? globalConfig : config;
1020
+ await cfg.setMcpId(mcp.id);
1090
1021
  if (json) {
1091
- formatOutput(
1092
- { selected: mcp, scope: useProjectConfig ? "project" : "global" },
1093
- true
1094
- );
1022
+ formatOutput({ selected: mcp, scope: cfg.scope }, true);
1095
1023
  } else {
1096
- const scope = useProjectConfig ? "(project)" : "(global)";
1097
- formatSuccess(`Now using MCP "${name}" ${scope}`, false);
1024
+ formatSuccess(`Now using MCP "${name}" (${cfg.scope})`, false);
1098
1025
  console.log();
1099
1026
  console.log(` MCP ID: ${mcp.id}`);
1100
1027
  console.log(` Preview URL: ${mcp.previewUrl}`);
@@ -1191,7 +1118,7 @@ var switchCommand = new Command13("switch").description("Switch to a different o
1191
1118
  orgId: org.id
1192
1119
  });
1193
1120
  spinner.succeed("Organization switched");
1194
- config.setActiveMcpId(null);
1121
+ config.setMcpId(null);
1195
1122
  if (json) {
1196
1123
  formatOutput({ switched: org }, true);
1197
1124
  } else {
@@ -1221,7 +1148,7 @@ var taskCommand = new Command15("task").description("Send a task to Claude runni
1221
1148
  try {
1222
1149
  let mcpId = options.mcpId;
1223
1150
  if (!mcpId) {
1224
- mcpId = await config.getEffectiveMcpId();
1151
+ mcpId = await config.getMcpId();
1225
1152
  if (!mcpId) {
1226
1153
  throw new McpError(
1227
1154
  "No active MCP. Run 'waniwani init' then 'waniwani mcp use <name>'."
@@ -1234,7 +1161,7 @@ var taskCommand = new Command15("task").description("Send a task to Claude runni
1234
1161
  "Not logged in. Run 'waniwani login' to authenticate."
1235
1162
  );
1236
1163
  }
1237
- const defaults = await config.getEffectiveDefaults();
1164
+ const defaults = await config.getDefaults();
1238
1165
  const model = options.model ?? defaults.model;
1239
1166
  const maxSteps = options.maxSteps ? Number.parseInt(options.maxSteps, 10) : defaults.maxSteps;
1240
1167
  if (!json) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/lib/errors.ts","../src/lib/output.ts","../src/commands/login.ts","../src/lib/auth.ts","../src/lib/config.ts","../src/lib/project-config.ts","../src/commands/logout.ts","../src/commands/mcp/index.ts","../src/commands/mcp/create.ts","../src/lib/api.ts","../src/commands/mcp/deploy.ts","../src/commands/mcp/list.ts","../src/commands/mcp/status.ts","../src/commands/mcp/stop.ts","../src/commands/mcp/test.ts","../src/commands/mcp/use.ts","../src/commands/org/index.ts","../src/commands/org/list.ts","../src/commands/org/switch.ts","../src/commands/task.ts","../src/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { loginCommand } from \"./commands/login.js\";\nimport { logoutCommand } from \"./commands/logout.js\";\nimport { mcpCommand } from \"./commands/mcp/index.js\";\nimport { orgCommand } from \"./commands/org/index.js\";\nimport { taskCommand } from \"./commands/task.js\";\n\nconst version = \"0.1.0\";\n\nexport const program = new Command()\n\t.name(\"waniwani\")\n\t.description(\"WaniWani CLI for MCP development workflow\")\n\t.version(version)\n\t.option(\"--json\", \"Output results as JSON\")\n\t.option(\"--verbose\", \"Enable verbose logging\");\n\n// Auth commands\nprogram.addCommand(loginCommand);\nprogram.addCommand(logoutCommand);\n\n// Main commands\nprogram.addCommand(initCommand);\nprogram.addCommand(mcpCommand);\nprogram.addCommand(taskCommand);\nprogram.addCommand(orgCommand);\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Command } from \"commander\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../lib/output.js\";\n\nconst PROJECT_CONFIG_DIR = \".waniwani\";\nconst PROJECT_CONFIG_FILE = \"settings.local.json\";\n\nexport const initCommand = new Command(\"init\")\n\t.description(\"Initialize WaniWani project config in current directory\")\n\t.action(async (_, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tconst cwd = process.cwd();\n\t\t\tconst configDir = join(cwd, PROJECT_CONFIG_DIR);\n\t\t\tconst configPath = join(configDir, PROJECT_CONFIG_FILE);\n\n\t\t\tif (existsSync(configDir)) {\n\t\t\t\tif (json) {\n\t\t\t\t\tformatOutput(\n\t\t\t\t\t\t{ initialized: false, message: \"Already initialized\" },\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(\"Project already initialized (.waniwani/ exists)\");\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait mkdir(configDir, { recursive: true });\n\n\t\t\tconst defaultConfig = {\n\t\t\t\tmcpId: null,\n\t\t\t\tdefaults: {},\n\t\t\t};\n\n\t\t\tawait writeFile(\n\t\t\t\tconfigPath,\n\t\t\t\tJSON.stringify(defaultConfig, null, \"\\t\"),\n\t\t\t\t\"utf-8\",\n\t\t\t);\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput({ initialized: true, path: configDir }, true);\n\t\t\t} else {\n\t\t\t\tformatSuccess(\"Initialized WaniWani project config\", false);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(` Created: ${PROJECT_CONFIG_DIR}/${PROJECT_CONFIG_FILE}`);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\"Now run:\");\n\t\t\t\tconsole.log(' waniwani mcp create \"my-mcp\"');\n\t\t\t\tconsole.log(\" waniwani mcp use <name>\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import chalk from \"chalk\";\nimport { ZodError } from \"zod\";\n\nexport class CLIError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic code: string,\n\t\tpublic details?: Record<string, unknown>,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"CLIError\";\n\t}\n}\n\nexport class ConfigError extends CLIError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(message, \"CONFIG_ERROR\", details);\n\t}\n}\n\nexport class AuthError extends CLIError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(message, \"AUTH_ERROR\", details);\n\t}\n}\n\nexport class SandboxError extends CLIError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(message, \"SANDBOX_ERROR\", details);\n\t}\n}\n\nexport class GitHubError extends CLIError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(message, \"GITHUB_ERROR\", details);\n\t}\n}\n\nexport class McpError extends CLIError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(message, \"MCP_ERROR\", details);\n\t}\n}\n\nexport function handleError(error: unknown, json: boolean): void {\n\tif (error instanceof ZodError) {\n\t\tconst message = error.issues\n\t\t\t.map((e) => `${e.path.join(\".\")}: ${e.message}`)\n\t\t\t.join(\", \");\n\t\toutputError(\"VALIDATION_ERROR\", `Invalid input: ${message}`, json);\n\t} else if (error instanceof CLIError) {\n\t\toutputError(error.code, error.message, json, error.details);\n\t} else if (error instanceof Error) {\n\t\toutputError(\"UNKNOWN_ERROR\", error.message, json);\n\t} else {\n\t\toutputError(\"UNKNOWN_ERROR\", String(error), json);\n\t}\n}\n\nfunction outputError(\n\tcode: string,\n\tmessage: string,\n\tjson: boolean,\n\tdetails?: Record<string, unknown>,\n): void {\n\tif (json) {\n\t\tconsole.error(\n\t\t\tJSON.stringify({ success: false, error: { code, message, details } }),\n\t\t);\n\t} else {\n\t\tconsole.error(chalk.red(`Error [${code}]:`), message);\n\t\tif (details) {\n\t\t\tconsole.error(chalk.gray(\"Details:\"), JSON.stringify(details, null, 2));\n\t\t}\n\t}\n}\n","import chalk from \"chalk\";\n\nexport function formatOutput<T>(data: T, json: boolean): void {\n\tif (json) {\n\t\tconsole.log(JSON.stringify({ success: true, data }, null, 2));\n\t} else {\n\t\tprettyPrint(data);\n\t}\n}\n\nexport function formatSuccess(message: string, json: boolean): void {\n\tif (json) {\n\t\tconsole.log(JSON.stringify({ success: true, message }));\n\t} else {\n\t\tconsole.log(chalk.green(\"✓\"), message);\n\t}\n}\n\nexport function formatError(error: Error | string, json: boolean): void {\n\tconst message = error instanceof Error ? error.message : error;\n\tif (json) {\n\t\tconsole.error(JSON.stringify({ success: false, error: message }));\n\t} else {\n\t\tconsole.error(chalk.red(\"✗\"), message);\n\t}\n}\n\nexport function formatTable(\n\theaders: string[],\n\trows: string[][],\n\tjson: boolean,\n): void {\n\tif (json) {\n\t\tconst data = rows.map((row) =>\n\t\t\tObject.fromEntries(headers.map((header, i) => [header, row[i]])),\n\t\t);\n\t\tconsole.log(JSON.stringify({ success: true, data }, null, 2));\n\t} else {\n\t\t// Simple table formatting without external dependency\n\t\tconst colWidths = headers.map((h, i) =>\n\t\t\tMath.max(h.length, ...rows.map((r) => (r[i] || \"\").length)),\n\t\t);\n\n\t\tconst separator = colWidths.map((w) => \"-\".repeat(w + 2)).join(\"+\");\n\t\tconst formatRow = (row: string[]) =>\n\t\t\trow.map((cell, i) => ` ${(cell || \"\").padEnd(colWidths[i])} `).join(\"|\");\n\n\t\tconsole.log(chalk.cyan(formatRow(headers)));\n\t\tconsole.log(separator);\n\t\tfor (const row of rows) {\n\t\t\tconsole.log(formatRow(row));\n\t\t}\n\t}\n}\n\nexport function formatList(\n\titems: Array<{ label: string; value: string }>,\n\tjson: boolean,\n): void {\n\tif (json) {\n\t\tconst data = Object.fromEntries(\n\t\t\titems.map((item) => [item.label, item.value]),\n\t\t);\n\t\tconsole.log(JSON.stringify({ success: true, data }, null, 2));\n\t} else {\n\t\tconst maxLabelLength = Math.max(...items.map((i) => i.label.length));\n\t\titems.forEach((item) => {\n\t\t\tconsole.log(\n\t\t\t\t`${chalk.gray(item.label.padEnd(maxLabelLength))} ${chalk.white(item.value)}`,\n\t\t\t);\n\t\t});\n\t}\n}\n\nfunction prettyPrint(data: unknown, indent = 0): void {\n\tconst prefix = \" \".repeat(indent);\n\n\tif (Array.isArray(data)) {\n\t\tdata.forEach((item, index) => {\n\t\t\tconsole.log(`${prefix}${chalk.gray(`[${index}]`)}`);\n\t\t\tprettyPrint(item, indent + 1);\n\t\t});\n\t} else if (typeof data === \"object\" && data !== null) {\n\t\tfor (const [key, value] of Object.entries(data)) {\n\t\t\tif (typeof value === \"object\" && value !== null) {\n\t\t\t\tconsole.log(`${prefix}${chalk.gray(key)}:`);\n\t\t\t\tprettyPrint(value, indent + 1);\n\t\t\t} else {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`${prefix}${chalk.gray(key)}: ${chalk.white(String(value))}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tconsole.log(`${prefix}${chalk.white(String(data))}`);\n\t}\n}\n","import { spawn } from \"node:child_process\";\nimport { createServer, type Server } from \"node:http\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\nimport { auth } from \"../lib/auth.js\";\nimport { config } from \"../lib/config.js\";\nimport { CLIError, handleError } from \"../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../lib/output.js\";\nimport type { OAuthTokenResponse } from \"../types/index.js\";\n\nconst CALLBACK_PORT = 54321;\nconst CALLBACK_URL = `http://localhost:${CALLBACK_PORT}/callback`;\nconst CLIENT_ID = \"waniwani-cli\";\n\nfunction generateCodeVerifier(): string {\n\tconst array = new Uint8Array(32);\n\tcrypto.getRandomValues(array);\n\treturn btoa(String.fromCharCode(...array))\n\t\t.replace(/\\+/g, \"-\")\n\t\t.replace(/\\//g, \"_\")\n\t\t.replace(/=+$/, \"\");\n}\n\nasync function generateCodeChallenge(verifier: string): Promise<string> {\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(verifier);\n\tconst hash = await crypto.subtle.digest(\"SHA-256\", data);\n\treturn btoa(String.fromCharCode(...new Uint8Array(hash)))\n\t\t.replace(/\\+/g, \"-\")\n\t\t.replace(/\\//g, \"_\")\n\t\t.replace(/=+$/, \"\");\n}\n\nfunction generateState(): string {\n\tconst array = new Uint8Array(16);\n\tcrypto.getRandomValues(array);\n\treturn Array.from(array, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nasync function openBrowser(url: string): Promise<void> {\n\tconst [cmd, ...args] =\n\t\tprocess.platform === \"darwin\"\n\t\t\t? [\"open\", url]\n\t\t\t: process.platform === \"win32\"\n\t\t\t\t? [\"cmd\", \"/c\", \"start\", url]\n\t\t\t\t: [\"xdg-open\", url];\n\n\tspawn(cmd, args, { stdio: \"ignore\", detached: true }).unref();\n}\n\nasync function waitForCallback(\n\texpectedState: string,\n\ttimeoutMs: number = 300000,\n): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tlet server: Server | null = null;\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tserver?.close();\n\t\t\treject(new CLIError(\"Login timed out\", \"LOGIN_TIMEOUT\"));\n\t\t}, timeoutMs);\n\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tserver?.close();\n\t\t};\n\n\t\tconst htmlResponse = (title: string, message: string, color: string) =>\n\t\t\t`<html>\n <body style=\"font-family: system-ui; padding: 40px; text-align: center;\">\n <h1 style=\"color: ${color};\">${title}</h1>\n <p>${message}</p>\n <p>You can close this window.</p>\n </body>\n </html>`;\n\n\t\ttry {\n\t\t\tserver = createServer((req, res) => {\n\t\t\t\tconst url = new URL(\n\t\t\t\t\treq.url || \"/\",\n\t\t\t\t\t`http://localhost:${CALLBACK_PORT}`,\n\t\t\t\t);\n\n\t\t\t\tif (url.pathname === \"/callback\") {\n\t\t\t\t\tconst code = url.searchParams.get(\"code\");\n\t\t\t\t\tconst state = url.searchParams.get(\"state\");\n\t\t\t\t\tconst error = url.searchParams.get(\"error\");\n\n\t\t\t\t\tres.setHeader(\"Content-Type\", \"text/html\");\n\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tres.statusCode = 400;\n\t\t\t\t\t\tres.end(htmlResponse(\"Login Failed\", `Error: ${error}`, \"#ef4444\"));\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\treject(new CLIError(`OAuth error: ${error}`, \"OAUTH_ERROR\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (state !== expectedState) {\n\t\t\t\t\t\tres.statusCode = 400;\n\t\t\t\t\t\tres.end(\n\t\t\t\t\t\t\thtmlResponse(\n\t\t\t\t\t\t\t\t\"Login Failed\",\n\t\t\t\t\t\t\t\t\"Invalid state parameter. Please try again.\",\n\t\t\t\t\t\t\t\t\"#ef4444\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\treject(new CLIError(\"Invalid state parameter\", \"INVALID_STATE\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!code) {\n\t\t\t\t\t\tres.statusCode = 400;\n\t\t\t\t\t\tres.end(\n\t\t\t\t\t\t\thtmlResponse(\n\t\t\t\t\t\t\t\t\"Login Failed\",\n\t\t\t\t\t\t\t\t\"No authorization code received.\",\n\t\t\t\t\t\t\t\t\"#ef4444\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\treject(new CLIError(\"No authorization code\", \"NO_CODE\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tres.statusCode = 200;\n\t\t\t\t\tres.end(\n\t\t\t\t\t\thtmlResponse(\n\t\t\t\t\t\t\t\"Login Successful!\",\n\t\t\t\t\t\t\t\"You can close this window and return to the terminal.\",\n\t\t\t\t\t\t\t\"#22c55e\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Schedule cleanup after response is sent\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\tresolve(code);\n\t\t\t\t\t}, 100);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tres.statusCode = 404;\n\t\t\t\tres.end(\"Not found\");\n\t\t\t});\n\n\t\t\tserver.on(\"error\", (err: NodeJS.ErrnoException) => {\n\t\t\t\tcleanup();\n\t\t\t\tif (err.code === \"EADDRINUSE\") {\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew CLIError(\n\t\t\t\t\t\t\t`Port ${CALLBACK_PORT} is already in use. Close any other WaniWani CLI instances and try again.`,\n\t\t\t\t\t\t\t\"PORT_IN_USE\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treject(err);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tserver.listen(CALLBACK_PORT);\n\t\t} catch (err: unknown) {\n\t\t\tcleanup();\n\t\t\treject(err);\n\t\t}\n\t});\n}\n\nasync function exchangeCodeForToken(\n\tcode: string,\n\tcodeVerifier: string,\n): Promise<OAuthTokenResponse> {\n\tconst apiUrl = await config.getApiUrl();\n\tconst response = await fetch(`${apiUrl}/api/auth/oauth2/token`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t},\n\t\tbody: new URLSearchParams({\n\t\t\tgrant_type: \"authorization_code\",\n\t\t\tcode,\n\t\t\tredirect_uri: CALLBACK_URL,\n\t\t\tclient_id: CLIENT_ID,\n\t\t\tcode_verifier: codeVerifier,\n\t\t}).toString(),\n\t});\n\n\tif (!response.ok) {\n\t\tconst error = await response.json().catch(() => ({}));\n\t\tthrow new CLIError(\n\t\t\t(error as { error_description?: string }).error_description ||\n\t\t\t\t\"Failed to exchange code for token\",\n\t\t\t\"TOKEN_EXCHANGE_FAILED\",\n\t\t);\n\t}\n\n\treturn response.json() as Promise<OAuthTokenResponse>;\n}\n\nexport const loginCommand = new Command(\"login\")\n\t.description(\"Log in to WaniWani\")\n\t.option(\"--no-browser\", \"Don't open the browser automatically\")\n\t.action(async (options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\t// Check if already logged in\n\t\t\tif (await auth.isLoggedIn()) {\n\t\t\t\tif (json) {\n\t\t\t\t\tformatOutput({ alreadyLoggedIn: true }, true);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.yellow(\n\t\t\t\t\t\t\t\"Already logged in. Use 'waniwani logout' to log out first.\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!json) {\n\t\t\t\tconsole.log(chalk.bold(\"\\nWaniWani CLI Login\\n\"));\n\t\t\t}\n\n\t\t\t// Generate PKCE values\n\t\t\tconst codeVerifier = generateCodeVerifier();\n\t\t\tconst codeChallenge = await generateCodeChallenge(codeVerifier);\n\t\t\tconst state = generateState();\n\n\t\t\t// Build authorization URL\n\t\t\tconst apiUrl = await config.getApiUrl();\n\t\t\tconst authUrl = new URL(`${apiUrl}/oauth/authorize`);\n\t\t\tauthUrl.searchParams.set(\"client_id\", CLIENT_ID);\n\t\t\tauthUrl.searchParams.set(\"redirect_uri\", CALLBACK_URL);\n\t\t\tauthUrl.searchParams.set(\"response_type\", \"code\");\n\t\t\tauthUrl.searchParams.set(\"code_challenge\", codeChallenge);\n\t\t\tauthUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n\t\t\tauthUrl.searchParams.set(\"state\", state);\n\n\t\t\tif (!json) {\n\t\t\t\tconsole.log(\"Opening browser for authentication...\\n\");\n\t\t\t\tconsole.log(`If the browser doesn't open, visit:\\n`);\n\t\t\t\tconsole.log(chalk.cyan(` ${authUrl.toString()}`));\n\t\t\t\tconsole.log();\n\t\t\t}\n\n\t\t\t// Start callback server and open browser\n\t\t\tconst callbackPromise = waitForCallback(state);\n\n\t\t\tif (options.browser !== false) {\n\t\t\t\tawait openBrowser(authUrl.toString());\n\t\t\t}\n\n\t\t\tconst spinner = ora(\"Waiting for authorization...\").start();\n\n\t\t\t// Wait for callback with auth code\n\t\t\tconst code = await callbackPromise;\n\n\t\t\tspinner.text = \"Exchanging code for token...\";\n\n\t\t\t// Exchange code for token\n\t\t\tconst tokenResponse = await exchangeCodeForToken(code, codeVerifier);\n\n\t\t\t// Store tokens\n\t\t\tawait auth.setTokens(\n\t\t\t\ttokenResponse.access_token,\n\t\t\t\ttokenResponse.refresh_token,\n\t\t\t\ttokenResponse.expires_in,\n\t\t\t);\n\n\t\t\tspinner.succeed(\"Logged in successfully!\");\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput({ success: true, loggedIn: true }, true);\n\t\t\t} else {\n\t\t\t\tconsole.log();\n\t\t\t\tformatSuccess(\"You're now logged in to WaniWani!\", false);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\"Get started:\");\n\t\t\t\tconsole.log(\n\t\t\t\t\t\" waniwani mcp create my-server Create a new MCP sandbox\",\n\t\t\t\t);\n\t\t\t\tconsole.log(' waniwani task \"Add a tool\" Send tasks to Claude');\n\t\t\t\tconsole.log(\n\t\t\t\t\t\" waniwani org list View your organizations\",\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport { config } from \"./config.js\";\n\nconst CONFIG_DIR = join(homedir(), \".waniwani\");\nconst AUTH_FILE = join(CONFIG_DIR, \"auth.json\");\n\nconst AuthStoreSchema = z.object({\n\taccessToken: z.string().nullable().default(null),\n\trefreshToken: z.string().nullable().default(null),\n\texpiresAt: z.string().nullable().default(null),\n});\n\ntype AuthStore = z.infer<typeof AuthStoreSchema>;\n\nasync function ensureConfigDir(): Promise<void> {\n\tawait mkdir(CONFIG_DIR, { recursive: true });\n}\n\nasync function readAuthStore(): Promise<AuthStore> {\n\tawait ensureConfigDir();\n\ttry {\n\t\tawait access(AUTH_FILE);\n\t\tconst content = await readFile(AUTH_FILE, \"utf-8\");\n\t\treturn AuthStoreSchema.parse(JSON.parse(content));\n\t} catch {\n\t\treturn AuthStoreSchema.parse({});\n\t}\n}\n\nasync function writeAuthStore(store: AuthStore): Promise<void> {\n\tawait ensureConfigDir();\n\tawait writeFile(AUTH_FILE, JSON.stringify(store, null, 2), \"utf-8\");\n}\n\nclass AuthManager {\n\tprivate storeCache: AuthStore | null = null;\n\n\tprivate async getStore(): Promise<AuthStore> {\n\t\tif (!this.storeCache) {\n\t\t\tthis.storeCache = await readAuthStore();\n\t\t}\n\t\treturn this.storeCache;\n\t}\n\n\tprivate async saveStore(store: AuthStore): Promise<void> {\n\t\tthis.storeCache = store;\n\t\tawait writeAuthStore(store);\n\t}\n\n\tasync isLoggedIn(): Promise<boolean> {\n\t\tconst store = await this.getStore();\n\t\treturn !!store.accessToken;\n\t}\n\n\tasync getAccessToken(): Promise<string | null> {\n\t\tconst store = await this.getStore();\n\t\treturn store.accessToken;\n\t}\n\n\tasync getRefreshToken(): Promise<string | null> {\n\t\tconst store = await this.getStore();\n\t\treturn store.refreshToken;\n\t}\n\n\tasync setTokens(\n\t\taccessToken: string,\n\t\trefreshToken: string,\n\t\texpiresIn: number,\n\t): Promise<void> {\n\t\tconst expiresAt = new Date(Date.now() + expiresIn * 1000).toISOString();\n\t\tconst store = await this.getStore();\n\t\tstore.accessToken = accessToken;\n\t\tstore.refreshToken = refreshToken;\n\t\tstore.expiresAt = expiresAt;\n\t\tawait this.saveStore(store);\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tconst emptyStore = AuthStoreSchema.parse({});\n\t\tawait this.saveStore(emptyStore);\n\t}\n\n\tasync isTokenExpired(): Promise<boolean> {\n\t\tconst store = await this.getStore();\n\t\tif (!store.expiresAt) return true;\n\t\t// Consider expired 5 minutes before actual expiry\n\t\treturn new Date(store.expiresAt).getTime() - 5 * 60 * 1000 < Date.now();\n\t}\n\n\tasync tryRefreshToken(): Promise<boolean> {\n\t\tconst refreshToken = await this.getRefreshToken();\n\t\tif (!refreshToken) return false;\n\n\t\ttry {\n\t\t\tconst apiUrl = await config.getApiUrl();\n\t\t\tconst response = await fetch(`${apiUrl}/api/auth/oauth2/token`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\t\t\tbody: new URLSearchParams({\n\t\t\t\t\tgrant_type: \"refresh_token\",\n\t\t\t\t\trefresh_token: refreshToken,\n\t\t\t\t\tclient_id: \"waniwani-cli\",\n\t\t\t\t}).toString(),\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tawait this.clear();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst data = (await response.json()) as {\n\t\t\t\taccess_token: string;\n\t\t\t\trefresh_token: string;\n\t\t\t\texpires_in: number;\n\t\t\t};\n\n\t\t\tawait this.setTokens(\n\t\t\t\tdata.access_token,\n\t\t\t\tdata.refresh_token,\n\t\t\t\tdata.expires_in,\n\t\t\t);\n\n\t\t\treturn true;\n\t\t} catch {\n\t\t\tawait this.clear();\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\nexport const auth = new AuthManager();\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport { loadProjectConfig } from \"./project-config.js\";\n\nconst CONFIG_DIR = join(homedir(), \".waniwani\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\nconst DEFAULT_API_URL = \"https://app.waniwani.ai\";\n\nconst ConfigSchema = z.object({\n\tdefaults: z\n\t\t.object({ model: z.string(), maxSteps: z.number() })\n\t\t.default({ model: \"claude-sonnet-4-20250514\", maxSteps: 10 }),\n\tactiveMcpId: z.string().nullable().default(null),\n\tapiUrl: z.string().nullable().default(null),\n});\n\ntype Config = z.infer<typeof ConfigSchema>;\n\nlet cache: Config | null = null;\n\nasync function load(): Promise<Config> {\n\tif (cache) return cache;\n\ttry {\n\t\tcache = ConfigSchema.parse(\n\t\t\tJSON.parse(await readFile(CONFIG_FILE, \"utf-8\")),\n\t\t);\n\t} catch {\n\t\tcache = ConfigSchema.parse({});\n\t}\n\treturn cache;\n}\n\nasync function save(cfg: Config): Promise<void> {\n\tcache = cfg;\n\tawait mkdir(CONFIG_DIR, { recursive: true });\n\tawait writeFile(CONFIG_FILE, JSON.stringify(cfg, null, 2));\n}\n\nasync function update(fn: (cfg: Config) => void): Promise<void> {\n\tconst cfg = await load();\n\tfn(cfg);\n\tawait save(cfg);\n}\n\nexport const config = {\n\tgetDefaults: async () => {\n\t\tconst cfg = await load();\n\t\treturn cfg.defaults;\n\t},\n\n\tgetEffectiveDefaults: async () => {\n\t\tconst global = await load();\n\t\tconst project = await loadProjectConfig();\n\t\treturn { ...global.defaults, ...project?.defaults };\n\t},\n\n\tsetDefaults: (defaults: Partial<Config[\"defaults\"]>) => {\n\t\treturn update((cfg) => {\n\t\t\tcfg.defaults = { ...cfg.defaults, ...defaults };\n\t\t});\n\t},\n\n\tgetActiveMcpId: async () => {\n\t\tconst cfg = await load();\n\t\treturn cfg.activeMcpId;\n\t},\n\n\tgetEffectiveMcpId: async () => {\n\t\tconst project = await loadProjectConfig();\n\t\tif (project?.mcpId) return project.mcpId;\n\t\tconst cfg = await load();\n\t\treturn cfg.activeMcpId;\n\t},\n\n\tsetActiveMcpId: (id: string | null) => {\n\t\treturn update((cfg) => {\n\t\t\tcfg.activeMcpId = id;\n\t\t});\n\t},\n\n\tgetApiUrl: async () => {\n\t\tif (process.env.WANIWANI_API_URL) return process.env.WANIWANI_API_URL;\n\t\tconst cfg = await load();\n\t\treturn cfg.apiUrl || DEFAULT_API_URL;\n\t},\n\n\tsetApiUrl: (url: string | null) => {\n\t\treturn update((cfg) => {\n\t\t\tcfg.apiUrl = url;\n\t\t});\n\t},\n\n\tclear: () => {\n\t\treturn save(ConfigSchema.parse({}));\n\t},\n};\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\n\nconst PROJECT_CONFIG_DIR = \".waniwani\";\nconst PROJECT_CONFIG_FILE = \"settings.local.json\";\n\nexport const ProjectConfigSchema = z.object({\n\tmcpId: z.string().optional(),\n\tdefaults: z\n\t\t.object({\n\t\t\tmodel: z.string().optional(),\n\t\t\tmaxSteps: z.number().optional(),\n\t\t})\n\t\t.optional(),\n});\n\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>;\n\nlet projectConfigCache: ProjectConfig | null | undefined;\n\nfunction getProjectConfigPath(): string {\n\treturn join(process.cwd(), PROJECT_CONFIG_DIR, PROJECT_CONFIG_FILE);\n}\n\nfunction getProjectConfigDir(): string {\n\treturn join(process.cwd(), PROJECT_CONFIG_DIR);\n}\n\nexport function hasProjectConfig(): boolean {\n\treturn existsSync(getProjectConfigDir());\n}\n\nexport async function loadProjectConfig(): Promise<ProjectConfig | null> {\n\tif (projectConfigCache !== undefined) {\n\t\treturn projectConfigCache;\n\t}\n\n\tconst configPath = getProjectConfigPath();\n\n\ttry {\n\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\tprojectConfigCache = ProjectConfigSchema.parse(JSON.parse(content));\n\t\treturn projectConfigCache;\n\t} catch {\n\t\t// Config file doesn't exist or is invalid - that's fine\n\t\tprojectConfigCache = null;\n\t\treturn null;\n\t}\n}\n\nexport async function saveProjectConfig(\n\tconfig: Partial<ProjectConfig>,\n): Promise<void> {\n\tconst configDir = getProjectConfigDir();\n\tconst configPath = getProjectConfigPath();\n\n\t// Ensure .waniwani directory exists\n\tawait mkdir(configDir, { recursive: true });\n\n\t// Merge with existing config\n\tconst existing = (await loadProjectConfig()) ?? {};\n\tconst merged = ProjectConfigSchema.parse({ ...existing, ...config });\n\n\tawait writeFile(configPath, JSON.stringify(merged, null, \"\\t\"), \"utf-8\");\n\n\t// Update cache\n\tprojectConfigCache = merged;\n}\n\nexport function clearProjectConfigCache(): void {\n\tprojectConfigCache = undefined;\n}\n","import { Command } from \"commander\";\nimport { auth } from \"../lib/auth.js\";\nimport { config } from \"../lib/config.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../lib/output.js\";\n\nexport const logoutCommand = new Command(\"logout\")\n\t.description(\"Log out from WaniWani\")\n\t.action(async (_, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tif (!(await auth.isLoggedIn())) {\n\t\t\t\tif (json) {\n\t\t\t\t\tformatOutput({ alreadyLoggedOut: true }, true);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(\"Not currently logged in.\");\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Clear local auth state\n\t\t\tawait auth.clear();\n\t\t\tawait config.clear();\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput({ success: true }, true);\n\t\t\t} else {\n\t\t\t\tformatSuccess(\"You have been logged out.\", false);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { Command } from \"commander\";\nimport { createCommand } from \"./create.js\";\nimport { deployCommand } from \"./deploy.js\";\nimport { listCommand } from \"./list.js\";\nimport { statusCommand } from \"./status.js\";\nimport { stopCommand } from \"./stop.js\";\nimport { testCommand } from \"./test.js\";\nimport { useCommand } from \"./use.js\";\n\nexport const mcpCommand = new Command(\"mcp\")\n\t.description(\"MCP sandbox management commands\")\n\t.addCommand(createCommand)\n\t.addCommand(listCommand)\n\t.addCommand(useCommand)\n\t.addCommand(statusCommand)\n\t.addCommand(stopCommand)\n\t.addCommand(testCommand)\n\t.addCommand(deployCommand);\n","import { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { handleError } from \"../../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../../lib/output.js\";\nimport {\n\thasProjectConfig,\n\tsaveProjectConfig,\n} from \"../../lib/project-config.js\";\nimport type { CreateMcpResponse } from \"../../types/index.js\";\n\nexport const createCommand = new Command(\"create\")\n\t.description(\"Create a new MCP sandbox from template\")\n\t.argument(\"<name>\", \"Name for the MCP project\")\n\t.option(\"--global\", \"Save to global config instead of project config\")\n\t.action(async (name: string, options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tconst spinner = ora(\"Creating MCP sandbox...\").start();\n\n\t\t\tconst result = await api.post<CreateMcpResponse>(\"/api/admin/mcps\", {\n\t\t\t\tname,\n\t\t\t});\n\n\t\t\tspinner.succeed(\"MCP sandbox created\");\n\n\t\t\t// Save to project config if in a project, otherwise global\n\t\t\tconst useProjectConfig = !options.global && hasProjectConfig();\n\n\t\t\tif (useProjectConfig) {\n\t\t\t\tawait saveProjectConfig({ mcpId: result.id });\n\t\t\t} else {\n\t\t\t\tawait config.setActiveMcpId(result.id);\n\t\t\t}\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput(\n\t\t\t\t\t{ ...result, scope: useProjectConfig ? \"project\" : \"global\" },\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst scope = useProjectConfig\n\t\t\t\t\t? \"(saved to project)\"\n\t\t\t\t\t: \"(saved globally)\";\n\t\t\t\tconsole.log();\n\t\t\t\tformatSuccess(\n\t\t\t\t\t`MCP sandbox \"${name}\" created successfully! ${scope}`,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(` MCP ID: ${result.id}`);\n\t\t\t\tconsole.log(` Sandbox ID: ${result.sandboxId}`);\n\t\t\t\tconsole.log(` Preview URL: ${result.previewUrl}`);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(`Next steps:`);\n\t\t\t\tconsole.log(` waniwani task \"Add a tool that does X\"`);\n\t\t\t\tconsole.log(` waniwani mcp test`);\n\t\t\t\tconsole.log(` waniwani mcp deploy`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { auth } from \"./auth.js\";\nimport { config } from \"./config.js\";\nimport { AuthError, CLIError } from \"./errors.js\";\n\nexport interface ApiResponse<T> {\n\tsuccess: boolean;\n\tdata?: T;\n\terror?: {\n\t\tcode: string;\n\t\tmessage: string;\n\t\tdetails?: Record<string, unknown>;\n\t};\n}\n\nexport class ApiError extends CLIError {\n\tconstructor(\n\t\tmessage: string,\n\t\tcode: string,\n\t\tpublic statusCode: number,\n\t\tdetails?: Record<string, unknown>,\n\t) {\n\t\tsuper(message, code, details);\n\t\tthis.name = \"ApiError\";\n\t}\n}\n\nasync function request<T>(\n\tmethod: string,\n\tpath: string,\n\toptions?: {\n\t\tbody?: unknown;\n\t\trequireAuth?: boolean;\n\t\theaders?: Record<string, string>;\n\t},\n): Promise<T> {\n\tconst {\n\t\tbody,\n\t\trequireAuth = true,\n\t\theaders: extraHeaders = {},\n\t} = options || {};\n\n\tconst headers: Record<string, string> = {\n\t\t\"Content-Type\": \"application/json\",\n\t\t...extraHeaders,\n\t};\n\n\tif (requireAuth) {\n\t\tconst token = await auth.getAccessToken();\n\t\tif (!token) {\n\t\t\tthrow new AuthError(\n\t\t\t\t\"Not logged in. Run 'waniwani login' to authenticate.\",\n\t\t\t);\n\t\t}\n\t\theaders.Authorization = `Bearer ${token}`;\n\t}\n\n\tconst baseUrl = await config.getApiUrl();\n\tconst url = `${baseUrl}${path}`;\n\n\tconst response = await fetch(url, {\n\t\tmethod,\n\t\theaders,\n\t\tbody: body ? JSON.stringify(body) : undefined,\n\t});\n\n\t// Handle empty responses (204 No Content)\n\tif (response.status === 204) {\n\t\treturn undefined as T;\n\t}\n\n\tconst data = (await response.json()) as ApiResponse<T>;\n\n\tif (!response.ok || data.error) {\n\t\tconst error = data.error || {\n\t\t\tcode: \"API_ERROR\",\n\t\t\tmessage: `Request failed with status ${response.status}`,\n\t\t};\n\n\t\t// Handle token expiration\n\t\tif (response.status === 401) {\n\t\t\tconst refreshed = await auth.tryRefreshToken();\n\t\t\tif (refreshed) {\n\t\t\t\t// Retry with new token\n\t\t\t\treturn request<T>(method, path, options);\n\t\t\t}\n\t\t\tthrow new AuthError(\n\t\t\t\t\"Session expired. Run 'waniwani login' to re-authenticate.\",\n\t\t\t);\n\t\t}\n\n\t\tthrow new ApiError(\n\t\t\terror.message,\n\t\t\terror.code,\n\t\t\tresponse.status,\n\t\t\terror.details,\n\t\t);\n\t}\n\n\treturn data.data as T;\n}\n\nexport const api = {\n\tget: <T>(path: string, options?: { requireAuth?: boolean }) =>\n\t\trequest<T>(\"GET\", path, options),\n\n\tpost: <T>(\n\t\tpath: string,\n\t\tbody?: unknown,\n\t\toptions?: { requireAuth?: boolean; headers?: Record<string, string> },\n\t) => request<T>(\"POST\", path, { body, ...options }),\n\n\tdelete: <T>(path: string, options?: { requireAuth?: boolean }) =>\n\t\trequest<T>(\"DELETE\", path, options),\n\n\tgetBaseUrl: () => config.getApiUrl(),\n};\n","import { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { handleError, McpError } from \"../../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../../lib/output.js\";\nimport type { DeployResponse } from \"../../types/index.js\";\n\nexport const deployCommand = new Command(\"deploy\")\n\t.description(\"Deploy MCP server to GitHub + Vercel from sandbox\")\n\t.option(\"--repo <name>\", \"GitHub repository name\")\n\t.option(\"--org <name>\", \"GitHub organization\")\n\t.option(\"--private\", \"Create private repository\")\n\t.option(\"--mcp-id <id>\", \"Specific MCP ID\")\n\t.action(async (options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tlet mcpId = options.mcpId;\n\n\t\t\tif (!mcpId) {\n\t\t\t\tmcpId = await config.getActiveMcpId();\n\t\t\t\tif (!mcpId) {\n\t\t\t\t\tthrow new McpError(\n\t\t\t\t\t\t\"No active MCP. Run 'waniwani mcp create <name>' or 'waniwani mcp use <name>'.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst spinner = ora(\"Deploying to GitHub...\").start();\n\n\t\t\tconst result = await api.post<DeployResponse>(\n\t\t\t\t`/api/admin/mcps/${mcpId}/deploy`,\n\t\t\t\t{\n\t\t\t\t\trepoName: options.repo,\n\t\t\t\t\torg: options.org,\n\t\t\t\t\tprivate: options.private ?? false,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tspinner.succeed(\"Deployment complete!\");\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput(result, true);\n\t\t\t} else {\n\t\t\t\tconsole.log();\n\t\t\t\tformatSuccess(\"MCP server deployed!\", false);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(` Repository: ${result.repository.url}`);\n\t\t\t\tif (result.deployment.url) {\n\t\t\t\t\tconsole.log(` Deployment: ${result.deployment.url}`);\n\t\t\t\t}\n\t\t\t\tconsole.log();\n\t\t\t\tif (result.deployment.note) {\n\t\t\t\t\tconsole.log(`Note: ${result.deployment.note}`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { handleError } from \"../../lib/errors.js\";\nimport { formatOutput, formatTable } from \"../../lib/output.js\";\nimport type { Mcp, McpListResponse } from \"../../types/index.js\";\n\nexport const listCommand = new Command(\"list\")\n\t.description(\"List all MCPs in your organization\")\n\t.option(\"--all\", \"Include stopped/expired MCPs\")\n\t.action(async (options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tconst spinner = ora(\"Fetching MCPs...\").start();\n\n\t\t\tconst mcps = await api.get<McpListResponse>(\n\t\t\t\t`/api/admin/mcps${options.all ? \"?all=true\" : \"\"}`,\n\t\t\t);\n\n\t\t\tspinner.stop();\n\n\t\t\tconst activeMcpId = await config.getActiveMcpId();\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput(\n\t\t\t\t\t{\n\t\t\t\t\t\tmcps: mcps.map((m: Mcp) => ({\n\t\t\t\t\t\t\t...m,\n\t\t\t\t\t\t\tisActive: m.id === activeMcpId,\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tactiveMcpId,\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tif (mcps.length === 0) {\n\t\t\t\t\tconsole.log(\"No MCPs found.\");\n\t\t\t\t\tconsole.log(\"\\nCreate a new MCP sandbox: waniwani mcp create <name>\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconsole.log(chalk.bold(\"\\nMCPs:\\n\"));\n\n\t\t\t\tconst rows = mcps.map((m: Mcp) => {\n\t\t\t\t\tconst isActive = m.id === activeMcpId;\n\t\t\t\t\tconst statusColor =\n\t\t\t\t\t\tm.status === \"active\"\n\t\t\t\t\t\t\t? chalk.green\n\t\t\t\t\t\t\t: m.status === \"stopped\"\n\t\t\t\t\t\t\t\t? chalk.red\n\t\t\t\t\t\t\t\t: chalk.yellow;\n\n\t\t\t\t\treturn [\n\t\t\t\t\t\tisActive\n\t\t\t\t\t\t\t? chalk.cyan(`* ${m.id.slice(0, 8)}`)\n\t\t\t\t\t\t\t: ` ${m.id.slice(0, 8)}`,\n\t\t\t\t\t\tm.name,\n\t\t\t\t\t\tstatusColor(m.status),\n\t\t\t\t\t\tm.previewUrl,\n\t\t\t\t\t\tm.createdAt ? new Date(m.createdAt).toLocaleString() : \"N/A\",\n\t\t\t\t\t];\n\t\t\t\t});\n\n\t\t\t\tformatTable(\n\t\t\t\t\t[\"ID\", \"Name\", \"Status\", \"Preview URL\", \"Created\"],\n\t\t\t\t\trows,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\n\t\t\t\tconsole.log();\n\t\t\t\tif (activeMcpId) {\n\t\t\t\t\tconsole.log(`Active MCP: ${chalk.cyan(activeMcpId.slice(0, 8))}`);\n\t\t\t\t}\n\t\t\t\tconsole.log(\"\\nSelect an MCP: waniwani mcp use <name>\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { handleError, McpError } from \"../../lib/errors.js\";\nimport { formatList, formatOutput } from \"../../lib/output.js\";\nimport type { Mcp } from \"../../types/index.js\";\n\nexport const statusCommand = new Command(\"status\")\n\t.description(\"Show current MCP sandbox status\")\n\t.option(\"--mcp-id <id>\", \"Specific MCP ID\")\n\t.action(async (options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tlet mcpId = options.mcpId;\n\n\t\t\tif (!mcpId) {\n\t\t\t\tmcpId = await config.getActiveMcpId();\n\t\t\t\tif (!mcpId) {\n\t\t\t\t\tthrow new McpError(\n\t\t\t\t\t\t\"No active MCP. Run 'waniwani mcp create <name>' to create one or 'waniwani mcp use <name>' to select one.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst spinner = ora(\"Fetching MCP status...\").start();\n\t\t\tconst result = await api.get<Mcp>(`/api/admin/mcps/${mcpId}`);\n\t\t\tspinner.stop();\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput(result, true);\n\t\t\t} else {\n\t\t\t\tconst statusColor =\n\t\t\t\t\tresult.status === \"active\" ? chalk.green : chalk.red;\n\n\t\t\t\tformatList(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ label: \"MCP ID\", value: result.id },\n\t\t\t\t\t\t{ label: \"Name\", value: result.name },\n\t\t\t\t\t\t{ label: \"Status\", value: statusColor(result.status) },\n\t\t\t\t\t\t{ label: \"Sandbox ID\", value: result.sandboxId },\n\t\t\t\t\t\t{ label: \"Preview URL\", value: result.previewUrl },\n\t\t\t\t\t\t{ label: \"Created\", value: result.createdAt },\n\t\t\t\t\t\t{ label: \"Expires\", value: result.expiresAt ?? \"N/A\" },\n\t\t\t\t\t],\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { handleError, McpError } from \"../../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../../lib/output.js\";\n\nexport const stopCommand = new Command(\"stop\")\n\t.description(\"Stop and clean up the MCP sandbox\")\n\t.option(\"--mcp-id <id>\", \"Specific MCP ID\")\n\t.action(async (options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tlet mcpId = options.mcpId;\n\n\t\t\tif (!mcpId) {\n\t\t\t\tmcpId = await config.getActiveMcpId();\n\t\t\t\tif (!mcpId) {\n\t\t\t\t\tthrow new McpError(\"No active MCP. Use --mcp-id to specify one.\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst spinner = ora(\"Stopping MCP sandbox...\").start();\n\t\t\tawait api.delete(`/api/admin/mcps/${mcpId}`);\n\t\t\tspinner.succeed(\"MCP sandbox stopped\");\n\n\t\t\t// Clear active MCP if it was the one we stopped\n\t\t\tif ((await config.getActiveMcpId()) === mcpId) {\n\t\t\t\tawait config.setActiveMcpId(null);\n\t\t\t}\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput({ stopped: mcpId }, true);\n\t\t\t} else {\n\t\t\t\tformatSuccess(\"MCP sandbox stopped and cleaned up.\", false);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { handleError, McpError, SandboxError } from \"../../lib/errors.js\";\nimport { formatOutput, formatTable } from \"../../lib/output.js\";\nimport type {\n\tMcpCallResponse,\n\tMcpTestResponse,\n\tMcpToolResult,\n} from \"../../types/index.js\";\n\nexport const testCommand = new Command(\"test\")\n\t.description(\"Test MCP tools via the sandbox\")\n\t.argument(\"[tool]\", \"Tool name to test (lists tools if omitted)\")\n\t.argument(\"[args...]\", \"JSON arguments for the tool\")\n\t.option(\"--mcp-id <id>\", \"Specific MCP ID\")\n\t.action(\n\t\tasync (tool: string | undefined, args: string[], options, command) => {\n\t\t\tconst globalOptions = command.optsWithGlobals();\n\t\t\tconst json = globalOptions.json ?? false;\n\n\t\t\ttry {\n\t\t\t\tlet mcpId = options.mcpId;\n\n\t\t\t\tif (!mcpId) {\n\t\t\t\t\tmcpId = await config.getActiveMcpId();\n\t\t\t\t\tif (!mcpId) {\n\t\t\t\t\t\tthrow new McpError(\n\t\t\t\t\t\t\t\"No active MCP. Run 'waniwani mcp create <name>' or 'waniwani mcp use <name>'.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!tool) {\n\t\t\t\t\t// List tools\n\t\t\t\t\tconst spinner = ora(\"Fetching available tools...\").start();\n\t\t\t\t\tconst result = await api.post<McpTestResponse>(\n\t\t\t\t\t\t`/api/admin/mcps/${mcpId}/test`,\n\t\t\t\t\t\t{ action: \"list\" },\n\t\t\t\t\t);\n\t\t\t\t\tspinner.stop();\n\n\t\t\t\t\tconst tools = result.tools;\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\tformatOutput({ tools }, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (tools.length === 0) {\n\t\t\t\t\t\t\tconsole.log(\"No tools available.\");\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.log(chalk.bold(\"\\nAvailable Tools:\\n\"));\n\t\t\t\t\t\t\tformatTable(\n\t\t\t\t\t\t\t\t[\"Name\", \"Description\"],\n\t\t\t\t\t\t\t\ttools.map((t) => [t.name, t.description || \"No description\"]),\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`\\nTest a tool: waniwani mcp test <tool-name> '{\"arg\": \"value\"}'`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Call tool\n\t\t\t\t\tlet toolArgs: Record<string, unknown> = {};\n\t\t\t\t\tif (args.length > 0) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\ttoolArgs = JSON.parse(args.join(\" \"));\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tthrow new SandboxError(\n\t\t\t\t\t\t\t\t`Invalid JSON arguments. Expected format: '{\"key\": \"value\"}'`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst spinner = ora(`Calling tool \"${tool}\"...`).start();\n\t\t\t\t\tconst startTime = Date.now();\n\t\t\t\t\tconst result = await api.post<McpCallResponse>(\n\t\t\t\t\t\t`/api/admin/mcps/${mcpId}/test`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taction: \"call\",\n\t\t\t\t\t\t\ttool,\n\t\t\t\t\t\t\targs: toolArgs,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tconst duration = result.duration || Date.now() - startTime;\n\t\t\t\t\tspinner.stop();\n\n\t\t\t\t\tconst output: McpToolResult = {\n\t\t\t\t\t\ttool,\n\t\t\t\t\t\tinput: toolArgs,\n\t\t\t\t\t\tresult: result.result,\n\t\t\t\t\t\tduration,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\tformatOutput(output, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.log(chalk.bold(\"\\nTool Result:\\n\"));\n\t\t\t\t\t\tconsole.log(chalk.gray(\"Tool:\"), tool);\n\t\t\t\t\t\tconsole.log(chalk.gray(\"Input:\"), JSON.stringify(toolArgs));\n\t\t\t\t\t\tconsole.log(chalk.gray(\"Duration:\"), `${duration}ms`);\n\t\t\t\t\t\tconsole.log(chalk.gray(\"Result:\"));\n\t\t\t\t\t\tconsole.log(JSON.stringify(result.result, null, 2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error, json);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t},\n\t);\n","import { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { handleError, McpError } from \"../../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../../lib/output.js\";\nimport {\n\thasProjectConfig,\n\tsaveProjectConfig,\n} from \"../../lib/project-config.js\";\nimport type { Mcp, McpListResponse } from \"../../types/index.js\";\n\nexport const useCommand = new Command(\"use\")\n\t.description(\"Select an MCP to use for subsequent commands\")\n\t.argument(\"<name>\", \"Name of the MCP to use\")\n\t.option(\"--global\", \"Save to global config instead of project config\")\n\t.action(async (name: string, options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tconst spinner = ora(\"Fetching MCPs...\").start();\n\n\t\t\t// Fetch all MCPs\n\t\t\tconst mcps = await api.get<McpListResponse>(\"/api/admin/mcps\");\n\n\t\t\tspinner.stop();\n\n\t\t\t// Find MCP by name\n\t\t\tconst mcp = mcps.find((m: Mcp) => m.name === name);\n\n\t\t\tif (!mcp) {\n\t\t\t\tthrow new McpError(\n\t\t\t\t\t`MCP \"${name}\" not found. Run 'waniwani mcp list' to see available MCPs.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (mcp.status !== \"active\") {\n\t\t\t\tthrow new McpError(\n\t\t\t\t\t`MCP \"${name}\" is ${mcp.status}. Only active MCPs can be used.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Save to project config if in a project, otherwise global\n\t\t\tconst useProjectConfig = !options.global && hasProjectConfig();\n\n\t\t\tif (useProjectConfig) {\n\t\t\t\tawait saveProjectConfig({ mcpId: mcp.id });\n\t\t\t} else {\n\t\t\t\tawait config.setActiveMcpId(mcp.id);\n\t\t\t}\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput(\n\t\t\t\t\t{ selected: mcp, scope: useProjectConfig ? \"project\" : \"global\" },\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst scope = useProjectConfig ? \"(project)\" : \"(global)\";\n\t\t\t\tformatSuccess(`Now using MCP \"${name}\" ${scope}`, false);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(` MCP ID: ${mcp.id}`);\n\t\t\t\tconsole.log(` Preview URL: ${mcp.previewUrl}`);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\"Next steps:\");\n\t\t\t\tconsole.log(' waniwani task \"Add a tool\"');\n\t\t\t\tconsole.log(\" waniwani mcp test\");\n\t\t\t\tconsole.log(\" waniwani mcp status\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list.js\";\nimport { switchCommand } from \"./switch.js\";\n\nexport const orgCommand = new Command(\"org\")\n\t.description(\"Organization management commands\")\n\t.addCommand(listCommand)\n\t.addCommand(switchCommand);\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { handleError } from \"../../lib/errors.js\";\nimport { formatOutput, formatTable } from \"../../lib/output.js\";\nimport type { Org, OrgListResponse } from \"../../types/index.js\";\n\nexport const listCommand = new Command(\"list\")\n\t.description(\"List your organizations\")\n\t.action(async (_, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tconst spinner = ora(\"Fetching organizations...\").start();\n\n\t\t\tconst result = await api.get<OrgListResponse>(\"/api/oauth/orgs\");\n\n\t\t\tspinner.stop();\n\n\t\t\tconst { orgs, activeOrgId } = result;\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput(\n\t\t\t\t\t{\n\t\t\t\t\t\torgs: orgs.map((o: Org) => ({\n\t\t\t\t\t\t\t...o,\n\t\t\t\t\t\t\tisActive: o.id === activeOrgId,\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tactiveOrgId,\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tif (orgs.length === 0) {\n\t\t\t\t\tconsole.log(\"No organizations found.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconsole.log(chalk.bold(\"\\nOrganizations:\\n\"));\n\n\t\t\t\tconst rows = orgs.map((o: Org) => {\n\t\t\t\t\tconst isActive = o.id === activeOrgId;\n\t\t\t\t\treturn [\n\t\t\t\t\t\tisActive ? chalk.cyan(`* ${o.name}`) : ` ${o.name}`,\n\t\t\t\t\t\to.slug,\n\t\t\t\t\t\to.role,\n\t\t\t\t\t];\n\t\t\t\t});\n\n\t\t\t\tformatTable([\"Name\", \"Slug\", \"Role\"], rows, false);\n\n\t\t\t\tconsole.log();\n\t\t\t\tif (activeOrgId) {\n\t\t\t\t\tconst activeOrg = orgs.find((o: Org) => o.id === activeOrgId);\n\t\t\t\t\tif (activeOrg) {\n\t\t\t\t\t\tconsole.log(`Active organization: ${chalk.cyan(activeOrg.name)}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconsole.log(\"\\nSwitch organization: waniwani org switch <name>\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { CLIError, handleError } from \"../../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../../lib/output.js\";\nimport type {\n\tOrg,\n\tOrgListResponse,\n\tOrgSwitchResponse,\n} from \"../../types/index.js\";\n\nexport const switchCommand = new Command(\"switch\")\n\t.description(\"Switch to a different organization\")\n\t.argument(\"<name>\", \"Name or slug of the organization to switch to\")\n\t.action(async (name: string, _, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tconst spinner = ora(\"Fetching organizations...\").start();\n\n\t\t\t// First fetch orgs to find the org ID\n\t\t\tconst { orgs } = await api.get<OrgListResponse>(\"/api/oauth/orgs\");\n\n\t\t\t// Find org by name or slug\n\t\t\tconst org = orgs.find((o: Org) => o.name === name || o.slug === name);\n\n\t\t\tif (!org) {\n\t\t\t\tspinner.stop();\n\t\t\t\tthrow new CLIError(\n\t\t\t\t\t`Organization \"${name}\" not found. Run 'waniwani org list' to see available organizations.`,\n\t\t\t\t\t\"ORG_NOT_FOUND\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tspinner.text = \"Switching organization...\";\n\n\t\t\t// Switch to the org\n\t\t\tawait api.post<OrgSwitchResponse>(\"/api/oauth/orgs/switch\", {\n\t\t\t\torgId: org.id,\n\t\t\t});\n\n\t\t\tspinner.succeed(\"Organization switched\");\n\n\t\t\t// Clear local MCP selection since we switched orgs\n\t\t\tconfig.setActiveMcpId(null);\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput({ switched: org }, true);\n\t\t\t} else {\n\t\t\t\tformatSuccess(`Switched to organization \"${org.name}\"`, false);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\"Note: Active MCP selection has been cleared.\");\n\t\t\t\tconsole.log(\n\t\t\t\t\t\"Run 'waniwani mcp list' to see MCPs in this organization.\",\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../lib/api.js\";\nimport { auth } from \"../lib/auth.js\";\nimport { config } from \"../lib/config.js\";\nimport { AuthError, handleError, McpError } from \"../lib/errors.js\";\nimport { formatOutput } from \"../lib/output.js\";\nimport type { TaskDoneEvent, TaskStep, TaskStepEvent } from \"../types/index.js\";\n\nexport const taskCommand = new Command(\"task\")\n\t.description(\"Send a task to Claude running in the sandbox\")\n\t.argument(\"<prompt>\", \"Task description/prompt\")\n\t.option(\"--mcp-id <id>\", \"Specific MCP ID\")\n\t.option(\"--model <model>\", \"Claude model to use\")\n\t.option(\"--max-steps <n>\", \"Maximum tool use steps\")\n\t.action(async (prompt: string, options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tlet mcpId = options.mcpId;\n\n\t\t\tif (!mcpId) {\n\t\t\t\tmcpId = await config.getEffectiveMcpId();\n\t\t\t\tif (!mcpId) {\n\t\t\t\t\tthrow new McpError(\n\t\t\t\t\t\t\"No active MCP. Run 'waniwani init' then 'waniwani mcp use <name>'.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst token = await auth.getAccessToken();\n\t\t\tif (!token) {\n\t\t\t\tthrow new AuthError(\n\t\t\t\t\t\"Not logged in. Run 'waniwani login' to authenticate.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst defaults = await config.getEffectiveDefaults();\n\t\t\tconst model = options.model ?? defaults.model;\n\t\t\tconst maxSteps = options.maxSteps\n\t\t\t\t? Number.parseInt(options.maxSteps, 10)\n\t\t\t\t: defaults.maxSteps;\n\n\t\t\tif (!json) {\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(chalk.bold(\"Task:\"), prompt);\n\t\t\t\tconsole.log();\n\t\t\t}\n\n\t\t\tconst spinner = ora(\"Starting task...\").start();\n\n\t\t\t// Use fetch with SSE for streaming\n\t\t\tconst baseUrl = api.getBaseUrl();\n\t\t\tconst response = await fetch(`${baseUrl}/api/admin/mcps/${mcpId}/task`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t\tAccept: \"text/event-stream\",\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tprompt,\n\t\t\t\t\tmodel,\n\t\t\t\t\tmaxSteps,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst error = await response\n\t\t\t\t\t.json()\n\t\t\t\t\t.catch(() => ({ message: response.statusText }));\n\t\t\t\tspinner.fail(\"Task failed\");\n\t\t\t\tthrow new Error(\n\t\t\t\t\terror.message || `Request failed with status ${response.status}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tspinner.stop();\n\n\t\t\tconst steps: TaskStep[] = [];\n\t\t\tlet stepCount = 0;\n\t\t\tlet maxStepsReached = false;\n\n\t\t\t// Process SSE stream\n\t\t\tconst reader = response.body?.getReader();\n\t\t\tif (!reader) {\n\t\t\t\tthrow new Error(\"No response body\");\n\t\t\t}\n\n\t\t\tconst decoder = new TextDecoder();\n\t\t\tlet buffer = \"\";\n\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) break;\n\n\t\t\t\tbuffer += decoder.decode(value, { stream: true });\n\t\t\t\tconst lines = buffer.split(\"\\n\");\n\t\t\t\tbuffer = lines.pop() || \"\";\n\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\tif (line.startsWith(\"event: \")) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (line.startsWith(\"data: \")) {\n\t\t\t\t\t\tconst data = line.slice(6);\n\t\t\t\t\t\tif (!data || data === \"[DONE]\") continue;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst parsed = JSON.parse(data);\n\n\t\t\t\t\t\t\t// Handle step events\n\t\t\t\t\t\t\tif (parsed.type === \"text\") {\n\t\t\t\t\t\t\t\tconst event = parsed as TaskStepEvent;\n\t\t\t\t\t\t\t\tsteps.push({ type: \"text\", text: event.content });\n\t\t\t\t\t\t\t\tif (!json && event.content) {\n\t\t\t\t\t\t\t\t\tconsole.log(chalk.white(event.content));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (parsed.type === \"tool_call\") {\n\t\t\t\t\t\t\t\tconst event = parsed as TaskStepEvent;\n\t\t\t\t\t\t\t\tsteps.push({\n\t\t\t\t\t\t\t\t\ttype: \"tool_call\",\n\t\t\t\t\t\t\t\t\ttool: event.tool,\n\t\t\t\t\t\t\t\t\tinput: event.input,\n\t\t\t\t\t\t\t\t\toutput: event.output,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (!json) {\n\t\t\t\t\t\t\t\t\tconsole.log(chalk.cyan(`> Using tool: ${event.tool}`));\n\t\t\t\t\t\t\t\t\tif (event.input?.command) {\n\t\t\t\t\t\t\t\t\t\tconsole.log(chalk.gray(` $ ${event.input.command}`));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (event.output) {\n\t\t\t\t\t\t\t\t\t\t// Show abbreviated output\n\t\t\t\t\t\t\t\t\t\tconst outputLines = event.output.split(\"\\n\");\n\t\t\t\t\t\t\t\t\t\tif (outputLines.length > 10) {\n\t\t\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\t\t\tchalk.gray(outputLines.slice(0, 5).join(\"\\n\")),\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t\t\t\t\t\t\t\t` ... (${outputLines.length - 10} more lines)`,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\tconsole.log(chalk.gray(outputLines.slice(-5).join(\"\\n\")));\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tconsole.log(chalk.gray(event.output));\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconsole.log();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (parsed.success !== undefined) {\n\t\t\t\t\t\t\t\t// Handle done event\n\t\t\t\t\t\t\t\tconst doneEvent = parsed as TaskDoneEvent;\n\t\t\t\t\t\t\t\tstepCount = doneEvent.stepCount;\n\t\t\t\t\t\t\t\tmaxStepsReached = doneEvent.maxStepsReached || false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Ignore malformed JSON\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = {\n\t\t\t\tsuccess: true,\n\t\t\t\tsteps,\n\t\t\t\tstepCount,\n\t\t\t\tmaxStepsReached,\n\t\t\t};\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput(result, true);\n\t\t\t} else {\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(chalk.green(\"✓\"), `Task completed in ${stepCount} steps.`);\n\t\t\t\tif (maxStepsReached) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.yellow(\"⚠\"),\n\t\t\t\t\t\t\"Maximum steps reached. Task may be incomplete.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { program } from \"./cli.js\";\n\nprogram.parse(process.argv);\n"],"mappings":"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","names":["Command","chalk","chalk","chalk","Command","mkdir","readFile","writeFile","homedir","join","z","mkdir","readFile","writeFile","join","z","existsSync","mkdir","writeFile","join","PROJECT_CONFIG_DIR","PROJECT_CONFIG_FILE","config","join","z","readFile","mkdir","writeFile","CONFIG_DIR","join","homedir","z","mkdir","readFile","writeFile","Command","chalk","Command","Command","Command","Command","ora","Command","ora","Command","ora","Command","ora","chalk","Command","ora","Command","ora","chalk","chalk","Command","ora","Command","ora","chalk","Command","ora","Command","ora","chalk","Command","ora","Command","ora","chalk","Command","ora","Command","ora","Command","Command","chalk","Command","ora","listCommand","Command","ora","chalk","Command","ora","Command","ora","Command","listCommand","chalk","Command","ora","Command","chalk","ora","Command"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/lib/errors.ts","../src/lib/output.ts","../src/commands/login.ts","../src/lib/auth.ts","../src/lib/config.ts","../src/commands/logout.ts","../src/commands/mcp/index.ts","../src/commands/mcp/create.ts","../src/lib/api.ts","../src/commands/mcp/deploy.ts","../src/commands/mcp/list.ts","../src/commands/mcp/status.ts","../src/commands/mcp/stop.ts","../src/commands/mcp/test.ts","../src/commands/mcp/use.ts","../src/commands/org/index.ts","../src/commands/org/list.ts","../src/commands/org/switch.ts","../src/commands/task.ts","../src/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { loginCommand } from \"./commands/login.js\";\nimport { logoutCommand } from \"./commands/logout.js\";\nimport { mcpCommand } from \"./commands/mcp/index.js\";\nimport { orgCommand } from \"./commands/org/index.js\";\nimport { taskCommand } from \"./commands/task.js\";\n\nconst version = \"0.1.0\";\n\nexport const program = new Command()\n\t.name(\"waniwani\")\n\t.description(\"WaniWani CLI for MCP development workflow\")\n\t.version(version)\n\t.option(\"--json\", \"Output results as JSON\")\n\t.option(\"--verbose\", \"Enable verbose logging\");\n\n// Auth commands\nprogram.addCommand(loginCommand);\nprogram.addCommand(logoutCommand);\n\n// Main commands\nprogram.addCommand(initCommand);\nprogram.addCommand(mcpCommand);\nprogram.addCommand(taskCommand);\nprogram.addCommand(orgCommand);\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Command } from \"commander\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../lib/output.js\";\n\nconst PROJECT_CONFIG_DIR = \".waniwani\";\nconst PROJECT_CONFIG_FILE = \"settings.local.json\";\n\nexport const initCommand = new Command(\"init\")\n\t.description(\"Initialize WaniWani project config in current directory\")\n\t.action(async (_, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tconst cwd = process.cwd();\n\t\t\tconst configDir = join(cwd, PROJECT_CONFIG_DIR);\n\t\t\tconst configPath = join(configDir, PROJECT_CONFIG_FILE);\n\n\t\t\tif (existsSync(configDir)) {\n\t\t\t\tif (json) {\n\t\t\t\t\tformatOutput(\n\t\t\t\t\t\t{ initialized: false, message: \"Already initialized\" },\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(\"Project already initialized (.waniwani/ exists)\");\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait mkdir(configDir, { recursive: true });\n\n\t\t\tconst defaultConfig = {\n\t\t\t\tmcpId: null,\n\t\t\t\tdefaults: {},\n\t\t\t};\n\n\t\t\tawait writeFile(\n\t\t\t\tconfigPath,\n\t\t\t\tJSON.stringify(defaultConfig, null, \"\\t\"),\n\t\t\t\t\"utf-8\",\n\t\t\t);\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput({ initialized: true, path: configDir }, true);\n\t\t\t} else {\n\t\t\t\tformatSuccess(\"Initialized WaniWani project config\", false);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(` Created: ${PROJECT_CONFIG_DIR}/${PROJECT_CONFIG_FILE}`);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\"Now run:\");\n\t\t\t\tconsole.log(' waniwani mcp create \"my-mcp\"');\n\t\t\t\tconsole.log(\" waniwani mcp use <name>\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import chalk from \"chalk\";\nimport { ZodError } from \"zod\";\n\nexport class CLIError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic code: string,\n\t\tpublic details?: Record<string, unknown>,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"CLIError\";\n\t}\n}\n\nexport class ConfigError extends CLIError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(message, \"CONFIG_ERROR\", details);\n\t}\n}\n\nexport class AuthError extends CLIError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(message, \"AUTH_ERROR\", details);\n\t}\n}\n\nexport class SandboxError extends CLIError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(message, \"SANDBOX_ERROR\", details);\n\t}\n}\n\nexport class GitHubError extends CLIError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(message, \"GITHUB_ERROR\", details);\n\t}\n}\n\nexport class McpError extends CLIError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(message, \"MCP_ERROR\", details);\n\t}\n}\n\nexport function handleError(error: unknown, json: boolean): void {\n\tif (error instanceof ZodError) {\n\t\tconst message = error.issues\n\t\t\t.map((e) => `${e.path.join(\".\")}: ${e.message}`)\n\t\t\t.join(\", \");\n\t\toutputError(\"VALIDATION_ERROR\", `Invalid input: ${message}`, json);\n\t} else if (error instanceof CLIError) {\n\t\toutputError(error.code, error.message, json, error.details);\n\t} else if (error instanceof Error) {\n\t\toutputError(\"UNKNOWN_ERROR\", error.message, json);\n\t} else {\n\t\toutputError(\"UNKNOWN_ERROR\", String(error), json);\n\t}\n}\n\nfunction outputError(\n\tcode: string,\n\tmessage: string,\n\tjson: boolean,\n\tdetails?: Record<string, unknown>,\n): void {\n\tif (json) {\n\t\tconsole.error(\n\t\t\tJSON.stringify({ success: false, error: { code, message, details } }),\n\t\t);\n\t} else {\n\t\tconsole.error(chalk.red(`Error [${code}]:`), message);\n\t\tif (details) {\n\t\t\tconsole.error(chalk.gray(\"Details:\"), JSON.stringify(details, null, 2));\n\t\t}\n\t}\n}\n","import chalk from \"chalk\";\n\nexport function formatOutput<T>(data: T, json: boolean): void {\n\tif (json) {\n\t\tconsole.log(JSON.stringify({ success: true, data }, null, 2));\n\t} else {\n\t\tprettyPrint(data);\n\t}\n}\n\nexport function formatSuccess(message: string, json: boolean): void {\n\tif (json) {\n\t\tconsole.log(JSON.stringify({ success: true, message }));\n\t} else {\n\t\tconsole.log(chalk.green(\"✓\"), message);\n\t}\n}\n\nexport function formatError(error: Error | string, json: boolean): void {\n\tconst message = error instanceof Error ? error.message : error;\n\tif (json) {\n\t\tconsole.error(JSON.stringify({ success: false, error: message }));\n\t} else {\n\t\tconsole.error(chalk.red(\"✗\"), message);\n\t}\n}\n\nexport function formatTable(\n\theaders: string[],\n\trows: string[][],\n\tjson: boolean,\n): void {\n\tif (json) {\n\t\tconst data = rows.map((row) =>\n\t\t\tObject.fromEntries(headers.map((header, i) => [header, row[i]])),\n\t\t);\n\t\tconsole.log(JSON.stringify({ success: true, data }, null, 2));\n\t} else {\n\t\t// Simple table formatting without external dependency\n\t\tconst colWidths = headers.map((h, i) =>\n\t\t\tMath.max(h.length, ...rows.map((r) => (r[i] || \"\").length)),\n\t\t);\n\n\t\tconst separator = colWidths.map((w) => \"-\".repeat(w + 2)).join(\"+\");\n\t\tconst formatRow = (row: string[]) =>\n\t\t\trow.map((cell, i) => ` ${(cell || \"\").padEnd(colWidths[i])} `).join(\"|\");\n\n\t\tconsole.log(chalk.cyan(formatRow(headers)));\n\t\tconsole.log(separator);\n\t\tfor (const row of rows) {\n\t\t\tconsole.log(formatRow(row));\n\t\t}\n\t}\n}\n\nexport function formatList(\n\titems: Array<{ label: string; value: string }>,\n\tjson: boolean,\n): void {\n\tif (json) {\n\t\tconst data = Object.fromEntries(\n\t\t\titems.map((item) => [item.label, item.value]),\n\t\t);\n\t\tconsole.log(JSON.stringify({ success: true, data }, null, 2));\n\t} else {\n\t\tconst maxLabelLength = Math.max(...items.map((i) => i.label.length));\n\t\titems.forEach((item) => {\n\t\t\tconsole.log(\n\t\t\t\t`${chalk.gray(item.label.padEnd(maxLabelLength))} ${chalk.white(item.value)}`,\n\t\t\t);\n\t\t});\n\t}\n}\n\nfunction prettyPrint(data: unknown, indent = 0): void {\n\tconst prefix = \" \".repeat(indent);\n\n\tif (Array.isArray(data)) {\n\t\tdata.forEach((item, index) => {\n\t\t\tconsole.log(`${prefix}${chalk.gray(`[${index}]`)}`);\n\t\t\tprettyPrint(item, indent + 1);\n\t\t});\n\t} else if (typeof data === \"object\" && data !== null) {\n\t\tfor (const [key, value] of Object.entries(data)) {\n\t\t\tif (typeof value === \"object\" && value !== null) {\n\t\t\t\tconsole.log(`${prefix}${chalk.gray(key)}:`);\n\t\t\t\tprettyPrint(value, indent + 1);\n\t\t\t} else {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`${prefix}${chalk.gray(key)}: ${chalk.white(String(value))}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tconsole.log(`${prefix}${chalk.white(String(data))}`);\n\t}\n}\n","import { spawn } from \"node:child_process\";\nimport { createServer, type Server } from \"node:http\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\nimport { auth } from \"../lib/auth.js\";\nimport { config } from \"../lib/config.js\";\nimport { CLIError, handleError } from \"../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../lib/output.js\";\nimport type { OAuthTokenResponse } from \"../types/index.js\";\n\nconst CALLBACK_PORT = 54321;\nconst CALLBACK_URL = `http://localhost:${CALLBACK_PORT}/callback`;\nconst CLIENT_ID = \"waniwani-cli\";\n\nfunction generateCodeVerifier(): string {\n\tconst array = new Uint8Array(32);\n\tcrypto.getRandomValues(array);\n\treturn btoa(String.fromCharCode(...array))\n\t\t.replace(/\\+/g, \"-\")\n\t\t.replace(/\\//g, \"_\")\n\t\t.replace(/=+$/, \"\");\n}\n\nasync function generateCodeChallenge(verifier: string): Promise<string> {\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(verifier);\n\tconst hash = await crypto.subtle.digest(\"SHA-256\", data);\n\treturn btoa(String.fromCharCode(...new Uint8Array(hash)))\n\t\t.replace(/\\+/g, \"-\")\n\t\t.replace(/\\//g, \"_\")\n\t\t.replace(/=+$/, \"\");\n}\n\nfunction generateState(): string {\n\tconst array = new Uint8Array(16);\n\tcrypto.getRandomValues(array);\n\treturn Array.from(array, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nasync function openBrowser(url: string): Promise<void> {\n\tconst [cmd, ...args] =\n\t\tprocess.platform === \"darwin\"\n\t\t\t? [\"open\", url]\n\t\t\t: process.platform === \"win32\"\n\t\t\t\t? [\"cmd\", \"/c\", \"start\", url]\n\t\t\t\t: [\"xdg-open\", url];\n\n\tspawn(cmd, args, { stdio: \"ignore\", detached: true }).unref();\n}\n\nasync function waitForCallback(\n\texpectedState: string,\n\ttimeoutMs: number = 300000,\n): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tlet server: Server | null = null;\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tserver?.close();\n\t\t\treject(new CLIError(\"Login timed out\", \"LOGIN_TIMEOUT\"));\n\t\t}, timeoutMs);\n\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tserver?.close();\n\t\t};\n\n\t\tconst htmlResponse = (title: string, message: string, color: string) =>\n\t\t\t`<html>\n <body style=\"font-family: system-ui; padding: 40px; text-align: center;\">\n <h1 style=\"color: ${color};\">${title}</h1>\n <p>${message}</p>\n <p>You can close this window.</p>\n </body>\n </html>`;\n\n\t\ttry {\n\t\t\tserver = createServer((req, res) => {\n\t\t\t\tconst url = new URL(\n\t\t\t\t\treq.url || \"/\",\n\t\t\t\t\t`http://localhost:${CALLBACK_PORT}`,\n\t\t\t\t);\n\n\t\t\t\tif (url.pathname === \"/callback\") {\n\t\t\t\t\tconst code = url.searchParams.get(\"code\");\n\t\t\t\t\tconst state = url.searchParams.get(\"state\");\n\t\t\t\t\tconst error = url.searchParams.get(\"error\");\n\n\t\t\t\t\tres.setHeader(\"Content-Type\", \"text/html\");\n\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tres.statusCode = 400;\n\t\t\t\t\t\tres.end(htmlResponse(\"Login Failed\", `Error: ${error}`, \"#ef4444\"));\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\treject(new CLIError(`OAuth error: ${error}`, \"OAUTH_ERROR\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (state !== expectedState) {\n\t\t\t\t\t\tres.statusCode = 400;\n\t\t\t\t\t\tres.end(\n\t\t\t\t\t\t\thtmlResponse(\n\t\t\t\t\t\t\t\t\"Login Failed\",\n\t\t\t\t\t\t\t\t\"Invalid state parameter. Please try again.\",\n\t\t\t\t\t\t\t\t\"#ef4444\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\treject(new CLIError(\"Invalid state parameter\", \"INVALID_STATE\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!code) {\n\t\t\t\t\t\tres.statusCode = 400;\n\t\t\t\t\t\tres.end(\n\t\t\t\t\t\t\thtmlResponse(\n\t\t\t\t\t\t\t\t\"Login Failed\",\n\t\t\t\t\t\t\t\t\"No authorization code received.\",\n\t\t\t\t\t\t\t\t\"#ef4444\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\treject(new CLIError(\"No authorization code\", \"NO_CODE\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tres.statusCode = 200;\n\t\t\t\t\tres.end(\n\t\t\t\t\t\thtmlResponse(\n\t\t\t\t\t\t\t\"Login Successful!\",\n\t\t\t\t\t\t\t\"You can close this window and return to the terminal.\",\n\t\t\t\t\t\t\t\"#22c55e\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Schedule cleanup after response is sent\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\tresolve(code);\n\t\t\t\t\t}, 100);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tres.statusCode = 404;\n\t\t\t\tres.end(\"Not found\");\n\t\t\t});\n\n\t\t\tserver.on(\"error\", (err: NodeJS.ErrnoException) => {\n\t\t\t\tcleanup();\n\t\t\t\tif (err.code === \"EADDRINUSE\") {\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew CLIError(\n\t\t\t\t\t\t\t`Port ${CALLBACK_PORT} is already in use. Close any other WaniWani CLI instances and try again.`,\n\t\t\t\t\t\t\t\"PORT_IN_USE\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treject(err);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tserver.listen(CALLBACK_PORT);\n\t\t} catch (err: unknown) {\n\t\t\tcleanup();\n\t\t\treject(err);\n\t\t}\n\t});\n}\n\nasync function exchangeCodeForToken(\n\tcode: string,\n\tcodeVerifier: string,\n): Promise<OAuthTokenResponse> {\n\tconst apiUrl = await config.getApiUrl();\n\tconst response = await fetch(`${apiUrl}/api/auth/oauth2/token`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t},\n\t\tbody: new URLSearchParams({\n\t\t\tgrant_type: \"authorization_code\",\n\t\t\tcode,\n\t\t\tredirect_uri: CALLBACK_URL,\n\t\t\tclient_id: CLIENT_ID,\n\t\t\tcode_verifier: codeVerifier,\n\t\t}).toString(),\n\t});\n\n\tif (!response.ok) {\n\t\tconst error = await response.json().catch(() => ({}));\n\t\tthrow new CLIError(\n\t\t\t(error as { error_description?: string }).error_description ||\n\t\t\t\t\"Failed to exchange code for token\",\n\t\t\t\"TOKEN_EXCHANGE_FAILED\",\n\t\t);\n\t}\n\n\treturn response.json() as Promise<OAuthTokenResponse>;\n}\n\nexport const loginCommand = new Command(\"login\")\n\t.description(\"Log in to WaniWani\")\n\t.option(\"--no-browser\", \"Don't open the browser automatically\")\n\t.action(async (options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\t// Check if already logged in\n\t\t\tif (await auth.isLoggedIn()) {\n\t\t\t\tif (json) {\n\t\t\t\t\tformatOutput({ alreadyLoggedIn: true }, true);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.yellow(\n\t\t\t\t\t\t\t\"Already logged in. Use 'waniwani logout' to log out first.\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!json) {\n\t\t\t\tconsole.log(chalk.bold(\"\\nWaniWani CLI Login\\n\"));\n\t\t\t}\n\n\t\t\t// Generate PKCE values\n\t\t\tconst codeVerifier = generateCodeVerifier();\n\t\t\tconst codeChallenge = await generateCodeChallenge(codeVerifier);\n\t\t\tconst state = generateState();\n\n\t\t\t// Build authorization URL\n\t\t\tconst apiUrl = await config.getApiUrl();\n\t\t\tconst authUrl = new URL(`${apiUrl}/api/auth/oauth2/authorize`);\n\t\t\tauthUrl.searchParams.set(\"client_id\", CLIENT_ID);\n\t\t\tauthUrl.searchParams.set(\"redirect_uri\", CALLBACK_URL);\n\t\t\tauthUrl.searchParams.set(\"response_type\", \"code\");\n\t\t\tauthUrl.searchParams.set(\"code_challenge\", codeChallenge);\n\t\t\tauthUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n\t\t\tauthUrl.searchParams.set(\"state\", state);\n\n\t\t\tif (!json) {\n\t\t\t\tconsole.log(\"Opening browser for authentication...\\n\");\n\t\t\t\tconsole.log(`If the browser doesn't open, visit:\\n`);\n\t\t\t\tconsole.log(chalk.cyan(` ${authUrl.toString()}`));\n\t\t\t\tconsole.log();\n\t\t\t}\n\n\t\t\t// Start callback server and open browser\n\t\t\tconst callbackPromise = waitForCallback(state);\n\n\t\t\tif (options.browser !== false) {\n\t\t\t\tawait openBrowser(authUrl.toString());\n\t\t\t}\n\n\t\t\tconst spinner = ora(\"Waiting for authorization...\").start();\n\n\t\t\t// Wait for callback with auth code\n\t\t\tconst code = await callbackPromise;\n\n\t\t\tspinner.text = \"Exchanging code for token...\";\n\n\t\t\t// Exchange code for token\n\t\t\tconst tokenResponse = await exchangeCodeForToken(code, codeVerifier);\n\n\t\t\t// Store tokens\n\t\t\tawait auth.setTokens(\n\t\t\t\ttokenResponse.access_token,\n\t\t\t\ttokenResponse.refresh_token,\n\t\t\t\ttokenResponse.expires_in,\n\t\t\t);\n\n\t\t\tspinner.succeed(\"Logged in successfully!\");\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput({ success: true, loggedIn: true }, true);\n\t\t\t} else {\n\t\t\t\tconsole.log();\n\t\t\t\tformatSuccess(\"You're now logged in to WaniWani!\", false);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\"Get started:\");\n\t\t\t\tconsole.log(\n\t\t\t\t\t\" waniwani mcp create my-server Create a new MCP sandbox\",\n\t\t\t\t);\n\t\t\t\tconsole.log(' waniwani task \"Add a tool\" Send tasks to Claude');\n\t\t\t\tconsole.log(\n\t\t\t\t\t\" waniwani org list View your organizations\",\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport { config } from \"./config.js\";\n\nconst CONFIG_DIR = join(homedir(), \".waniwani\");\nconst AUTH_FILE = join(CONFIG_DIR, \"auth.json\");\n\nconst AuthStoreSchema = z.object({\n\taccessToken: z.string().nullable().default(null),\n\trefreshToken: z.string().nullable().default(null),\n\texpiresAt: z.string().nullable().default(null),\n});\n\ntype AuthStore = z.infer<typeof AuthStoreSchema>;\n\nasync function ensureConfigDir(): Promise<void> {\n\tawait mkdir(CONFIG_DIR, { recursive: true });\n}\n\nasync function readAuthStore(): Promise<AuthStore> {\n\tawait ensureConfigDir();\n\ttry {\n\t\tawait access(AUTH_FILE);\n\t\tconst content = await readFile(AUTH_FILE, \"utf-8\");\n\t\treturn AuthStoreSchema.parse(JSON.parse(content));\n\t} catch {\n\t\treturn AuthStoreSchema.parse({});\n\t}\n}\n\nasync function writeAuthStore(store: AuthStore): Promise<void> {\n\tawait ensureConfigDir();\n\tawait writeFile(AUTH_FILE, JSON.stringify(store, null, 2), \"utf-8\");\n}\n\nclass AuthManager {\n\tprivate storeCache: AuthStore | null = null;\n\n\tprivate async getStore(): Promise<AuthStore> {\n\t\tif (!this.storeCache) {\n\t\t\tthis.storeCache = await readAuthStore();\n\t\t}\n\t\treturn this.storeCache;\n\t}\n\n\tprivate async saveStore(store: AuthStore): Promise<void> {\n\t\tthis.storeCache = store;\n\t\tawait writeAuthStore(store);\n\t}\n\n\tasync isLoggedIn(): Promise<boolean> {\n\t\tconst store = await this.getStore();\n\t\treturn !!store.accessToken;\n\t}\n\n\tasync getAccessToken(): Promise<string | null> {\n\t\tconst store = await this.getStore();\n\t\treturn store.accessToken;\n\t}\n\n\tasync getRefreshToken(): Promise<string | null> {\n\t\tconst store = await this.getStore();\n\t\treturn store.refreshToken;\n\t}\n\n\tasync setTokens(\n\t\taccessToken: string,\n\t\trefreshToken: string,\n\t\texpiresIn: number,\n\t): Promise<void> {\n\t\tconst expiresAt = new Date(Date.now() + expiresIn * 1000).toISOString();\n\t\tconst store = await this.getStore();\n\t\tstore.accessToken = accessToken;\n\t\tstore.refreshToken = refreshToken;\n\t\tstore.expiresAt = expiresAt;\n\t\tawait this.saveStore(store);\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tconst emptyStore = AuthStoreSchema.parse({});\n\t\tawait this.saveStore(emptyStore);\n\t}\n\n\tasync isTokenExpired(): Promise<boolean> {\n\t\tconst store = await this.getStore();\n\t\tif (!store.expiresAt) return true;\n\t\t// Consider expired 5 minutes before actual expiry\n\t\treturn new Date(store.expiresAt).getTime() - 5 * 60 * 1000 < Date.now();\n\t}\n\n\tasync tryRefreshToken(): Promise<boolean> {\n\t\tconst refreshToken = await this.getRefreshToken();\n\t\tif (!refreshToken) return false;\n\n\t\ttry {\n\t\t\tconst apiUrl = await config.getApiUrl();\n\t\t\tconst response = await fetch(`${apiUrl}/api/auth/oauth2/token`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\t\t\tbody: new URLSearchParams({\n\t\t\t\t\tgrant_type: \"refresh_token\",\n\t\t\t\t\trefresh_token: refreshToken,\n\t\t\t\t\tclient_id: \"waniwani-cli\",\n\t\t\t\t}).toString(),\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tawait this.clear();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst data = (await response.json()) as {\n\t\t\t\taccess_token: string;\n\t\t\t\trefresh_token: string;\n\t\t\t\texpires_in: number;\n\t\t\t};\n\n\t\t\tawait this.setTokens(\n\t\t\t\tdata.access_token,\n\t\t\t\tdata.refresh_token,\n\t\t\t\tdata.expires_in,\n\t\t\t);\n\n\t\t\treturn true;\n\t\t} catch {\n\t\t\tawait this.clear();\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\nexport const auth = new AuthManager();\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\n\nconst LOCAL_DIR = join(process.cwd(), \".waniwani\");\nconst LOCAL_FILE = join(LOCAL_DIR, \"settings.json\");\nconst GLOBAL_DIR = join(homedir(), \".waniwani\");\nconst GLOBAL_FILE = join(GLOBAL_DIR, \"settings.json\");\nconst DEFAULT_API_URL = \"https://app.waniwani.ai\";\n\nconst ConfigSchema = z.object({\n\tdefaults: z\n\t\t.object({ model: z.string(), maxSteps: z.number() })\n\t\t.default({ model: \"claude-sonnet-4-20250514\", maxSteps: 10 }),\n\tmcpId: z.string().nullable().default(null),\n\tapiUrl: z.string().nullable().default(null),\n});\n\ntype ConfigData = z.infer<typeof ConfigSchema>;\n\nclass Config {\n\tprivate dir: string;\n\tprivate file: string;\n\tprivate cache: ConfigData | null = null;\n\treadonly scope: \"local\" | \"global\";\n\n\tconstructor(forceGlobal = false) {\n\t\tconst useLocal = !forceGlobal && existsSync(LOCAL_DIR);\n\t\tthis.dir = useLocal ? LOCAL_DIR : GLOBAL_DIR;\n\t\tthis.file = useLocal ? LOCAL_FILE : GLOBAL_FILE;\n\t\tthis.scope = useLocal ? \"local\" : \"global\";\n\t}\n\n\tprivate async load(): Promise<ConfigData> {\n\t\tif (!this.cache) {\n\t\t\ttry {\n\t\t\t\tthis.cache = ConfigSchema.parse(\n\t\t\t\t\tJSON.parse(await readFile(this.file, \"utf-8\")),\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\tthis.cache = ConfigSchema.parse({});\n\t\t\t}\n\t\t}\n\t\treturn this.cache;\n\t}\n\n\tprivate async save(data: ConfigData): Promise<void> {\n\t\tthis.cache = data;\n\t\tawait mkdir(this.dir, { recursive: true });\n\t\tawait writeFile(this.file, JSON.stringify(data, null, \"\\t\"));\n\t}\n\n\tasync getDefaults() {\n\t\treturn (await this.load()).defaults;\n\t}\n\n\tasync setDefaults(defaults: Partial<ConfigData[\"defaults\"]>) {\n\t\tconst data = await this.load();\n\t\tdata.defaults = { ...data.defaults, ...defaults };\n\t\tawait this.save(data);\n\t}\n\n\tasync getMcpId() {\n\t\treturn (await this.load()).mcpId;\n\t}\n\n\tasync setMcpId(id: string | null) {\n\t\tconst data = await this.load();\n\t\tdata.mcpId = id;\n\t\tawait this.save(data);\n\t}\n\n\tasync getApiUrl() {\n\t\tif (process.env.WANIWANI_API_URL) return process.env.WANIWANI_API_URL;\n\t\treturn (await this.load()).apiUrl || DEFAULT_API_URL;\n\t}\n\n\tasync setApiUrl(url: string | null) {\n\t\tconst data = await this.load();\n\t\tdata.apiUrl = url;\n\t\tawait this.save(data);\n\t}\n\n\tasync clear() {\n\t\tawait this.save(ConfigSchema.parse({}));\n\t}\n}\n\nexport const config = new Config();\nexport const globalConfig = new Config(true);\n","import { Command } from \"commander\";\nimport { auth } from \"../lib/auth.js\";\nimport { config } from \"../lib/config.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../lib/output.js\";\n\nexport const logoutCommand = new Command(\"logout\")\n\t.description(\"Log out from WaniWani\")\n\t.action(async (_, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tif (!(await auth.isLoggedIn())) {\n\t\t\t\tif (json) {\n\t\t\t\t\tformatOutput({ alreadyLoggedOut: true }, true);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(\"Not currently logged in.\");\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Clear local auth state\n\t\t\tawait auth.clear();\n\t\t\tawait config.clear();\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput({ success: true }, true);\n\t\t\t} else {\n\t\t\t\tformatSuccess(\"You have been logged out.\", false);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { Command } from \"commander\";\nimport { createCommand } from \"./create.js\";\nimport { deployCommand } from \"./deploy.js\";\nimport { listCommand } from \"./list.js\";\nimport { statusCommand } from \"./status.js\";\nimport { stopCommand } from \"./stop.js\";\nimport { testCommand } from \"./test.js\";\nimport { useCommand } from \"./use.js\";\n\nexport const mcpCommand = new Command(\"mcp\")\n\t.description(\"MCP sandbox management commands\")\n\t.addCommand(createCommand)\n\t.addCommand(listCommand)\n\t.addCommand(useCommand)\n\t.addCommand(statusCommand)\n\t.addCommand(stopCommand)\n\t.addCommand(testCommand)\n\t.addCommand(deployCommand);\n","import { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config, globalConfig } from \"../../lib/config.js\";\nimport { handleError } from \"../../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../../lib/output.js\";\nimport type { CreateMcpResponse } from \"../../types/index.js\";\n\nexport const createCommand = new Command(\"create\")\n\t.description(\"Create a new MCP sandbox from template\")\n\t.argument(\"<name>\", \"Name for the MCP project\")\n\t.option(\"--global\", \"Save to global config instead of project config\")\n\t.action(async (name: string, options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tconst spinner = ora(\"Creating MCP sandbox...\").start();\n\n\t\t\tconst result = await api.post<CreateMcpResponse>(\"/api/admin/mcps\", {\n\t\t\t\tname,\n\t\t\t});\n\n\t\t\tspinner.succeed(\"MCP sandbox created\");\n\n\t\t\tconst cfg = options.global ? globalConfig : config;\n\t\t\tawait cfg.setMcpId(result.id);\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput({ ...result, scope: cfg.scope }, true);\n\t\t\t} else {\n\t\t\t\tconsole.log();\n\t\t\t\tformatSuccess(`MCP sandbox \"${name}\" created! (${cfg.scope})`, false);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(` MCP ID: ${result.id}`);\n\t\t\t\tconsole.log(` Sandbox ID: ${result.sandboxId}`);\n\t\t\t\tconsole.log(` Preview URL: ${result.previewUrl}`);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(`Next steps:`);\n\t\t\t\tconsole.log(` waniwani task \"Add a tool that does X\"`);\n\t\t\t\tconsole.log(` waniwani mcp test`);\n\t\t\t\tconsole.log(` waniwani mcp deploy`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { auth } from \"./auth.js\";\nimport { config } from \"./config.js\";\nimport { AuthError, CLIError } from \"./errors.js\";\n\nexport interface ApiResponse<T> {\n\tsuccess: boolean;\n\tdata?: T;\n\terror?: {\n\t\tcode: string;\n\t\tmessage: string;\n\t\tdetails?: Record<string, unknown>;\n\t};\n}\n\nexport class ApiError extends CLIError {\n\tconstructor(\n\t\tmessage: string,\n\t\tcode: string,\n\t\tpublic statusCode: number,\n\t\tdetails?: Record<string, unknown>,\n\t) {\n\t\tsuper(message, code, details);\n\t\tthis.name = \"ApiError\";\n\t}\n}\n\nasync function request<T>(\n\tmethod: string,\n\tpath: string,\n\toptions?: {\n\t\tbody?: unknown;\n\t\trequireAuth?: boolean;\n\t\theaders?: Record<string, string>;\n\t},\n): Promise<T> {\n\tconst {\n\t\tbody,\n\t\trequireAuth = true,\n\t\theaders: extraHeaders = {},\n\t} = options || {};\n\n\tconst headers: Record<string, string> = {\n\t\t\"Content-Type\": \"application/json\",\n\t\t...extraHeaders,\n\t};\n\n\tif (requireAuth) {\n\t\tconst token = await auth.getAccessToken();\n\t\tif (!token) {\n\t\t\tthrow new AuthError(\n\t\t\t\t\"Not logged in. Run 'waniwani login' to authenticate.\",\n\t\t\t);\n\t\t}\n\t\theaders.Authorization = `Bearer ${token}`;\n\t}\n\n\tconst baseUrl = await config.getApiUrl();\n\tconst url = `${baseUrl}${path}`;\n\n\tconst response = await fetch(url, {\n\t\tmethod,\n\t\theaders,\n\t\tbody: body ? JSON.stringify(body) : undefined,\n\t});\n\n\t// Handle empty responses (204 No Content)\n\tif (response.status === 204) {\n\t\treturn undefined as T;\n\t}\n\n\tconst data = (await response.json()) as ApiResponse<T>;\n\n\tif (!response.ok || data.error) {\n\t\tconst error = data.error || {\n\t\t\tcode: \"API_ERROR\",\n\t\t\tmessage: `Request failed with status ${response.status}`,\n\t\t};\n\n\t\t// Handle token expiration\n\t\tif (response.status === 401) {\n\t\t\tconst refreshed = await auth.tryRefreshToken();\n\t\t\tif (refreshed) {\n\t\t\t\t// Retry with new token\n\t\t\t\treturn request<T>(method, path, options);\n\t\t\t}\n\t\t\tthrow new AuthError(\n\t\t\t\t\"Session expired. Run 'waniwani login' to re-authenticate.\",\n\t\t\t);\n\t\t}\n\n\t\tthrow new ApiError(\n\t\t\terror.message,\n\t\t\terror.code,\n\t\t\tresponse.status,\n\t\t\terror.details,\n\t\t);\n\t}\n\n\treturn data.data as T;\n}\n\nexport const api = {\n\tget: <T>(path: string, options?: { requireAuth?: boolean }) =>\n\t\trequest<T>(\"GET\", path, options),\n\n\tpost: <T>(\n\t\tpath: string,\n\t\tbody?: unknown,\n\t\toptions?: { requireAuth?: boolean; headers?: Record<string, string> },\n\t) => request<T>(\"POST\", path, { body, ...options }),\n\n\tdelete: <T>(path: string, options?: { requireAuth?: boolean }) =>\n\t\trequest<T>(\"DELETE\", path, options),\n\n\tgetBaseUrl: () => config.getApiUrl(),\n};\n","import { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { handleError, McpError } from \"../../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../../lib/output.js\";\nimport type { DeployResponse } from \"../../types/index.js\";\n\nexport const deployCommand = new Command(\"deploy\")\n\t.description(\"Deploy MCP server to GitHub + Vercel from sandbox\")\n\t.option(\"--repo <name>\", \"GitHub repository name\")\n\t.option(\"--org <name>\", \"GitHub organization\")\n\t.option(\"--private\", \"Create private repository\")\n\t.option(\"--mcp-id <id>\", \"Specific MCP ID\")\n\t.action(async (options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tlet mcpId = options.mcpId;\n\n\t\t\tif (!mcpId) {\n\t\t\t\tmcpId = await config.getMcpId();\n\t\t\t\tif (!mcpId) {\n\t\t\t\t\tthrow new McpError(\n\t\t\t\t\t\t\"No active MCP. Run 'waniwani mcp create <name>' or 'waniwani mcp use <name>'.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst spinner = ora(\"Deploying to GitHub...\").start();\n\n\t\t\tconst result = await api.post<DeployResponse>(\n\t\t\t\t`/api/admin/mcps/${mcpId}/deploy`,\n\t\t\t\t{\n\t\t\t\t\trepoName: options.repo,\n\t\t\t\t\torg: options.org,\n\t\t\t\t\tprivate: options.private ?? false,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tspinner.succeed(\"Deployment complete!\");\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput(result, true);\n\t\t\t} else {\n\t\t\t\tconsole.log();\n\t\t\t\tformatSuccess(\"MCP server deployed!\", false);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(` Repository: ${result.repository.url}`);\n\t\t\t\tif (result.deployment.url) {\n\t\t\t\t\tconsole.log(` Deployment: ${result.deployment.url}`);\n\t\t\t\t}\n\t\t\t\tconsole.log();\n\t\t\t\tif (result.deployment.note) {\n\t\t\t\t\tconsole.log(`Note: ${result.deployment.note}`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { handleError } from \"../../lib/errors.js\";\nimport { formatOutput, formatTable } from \"../../lib/output.js\";\nimport type { Mcp, McpListResponse } from \"../../types/index.js\";\n\nexport const listCommand = new Command(\"list\")\n\t.description(\"List all MCPs in your organization\")\n\t.option(\"--all\", \"Include stopped/expired MCPs\")\n\t.action(async (options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tconst spinner = ora(\"Fetching MCPs...\").start();\n\n\t\t\tconst mcps = await api.get<McpListResponse>(\n\t\t\t\t`/api/admin/mcps${options.all ? \"?all=true\" : \"\"}`,\n\t\t\t);\n\n\t\t\tspinner.stop();\n\n\t\t\tconst activeMcpId = await config.getMcpId();\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput(\n\t\t\t\t\t{\n\t\t\t\t\t\tmcps: mcps.map((m: Mcp) => ({\n\t\t\t\t\t\t\t...m,\n\t\t\t\t\t\t\tisActive: m.id === activeMcpId,\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tactiveMcpId,\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tif (mcps.length === 0) {\n\t\t\t\t\tconsole.log(\"No MCPs found.\");\n\t\t\t\t\tconsole.log(\"\\nCreate a new MCP sandbox: waniwani mcp create <name>\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconsole.log(chalk.bold(\"\\nMCPs:\\n\"));\n\n\t\t\t\tconst rows = mcps.map((m: Mcp) => {\n\t\t\t\t\tconst isActive = m.id === activeMcpId;\n\t\t\t\t\tconst statusColor =\n\t\t\t\t\t\tm.status === \"active\"\n\t\t\t\t\t\t\t? chalk.green\n\t\t\t\t\t\t\t: m.status === \"stopped\"\n\t\t\t\t\t\t\t\t? chalk.red\n\t\t\t\t\t\t\t\t: chalk.yellow;\n\n\t\t\t\t\treturn [\n\t\t\t\t\t\tisActive\n\t\t\t\t\t\t\t? chalk.cyan(`* ${m.id.slice(0, 8)}`)\n\t\t\t\t\t\t\t: ` ${m.id.slice(0, 8)}`,\n\t\t\t\t\t\tm.name,\n\t\t\t\t\t\tstatusColor(m.status),\n\t\t\t\t\t\tm.previewUrl,\n\t\t\t\t\t\tm.createdAt ? new Date(m.createdAt).toLocaleString() : \"N/A\",\n\t\t\t\t\t];\n\t\t\t\t});\n\n\t\t\t\tformatTable(\n\t\t\t\t\t[\"ID\", \"Name\", \"Status\", \"Preview URL\", \"Created\"],\n\t\t\t\t\trows,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\n\t\t\t\tconsole.log();\n\t\t\t\tif (activeMcpId) {\n\t\t\t\t\tconsole.log(`Active MCP: ${chalk.cyan(activeMcpId.slice(0, 8))}`);\n\t\t\t\t}\n\t\t\t\tconsole.log(\"\\nSelect an MCP: waniwani mcp use <name>\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { handleError, McpError } from \"../../lib/errors.js\";\nimport { formatList, formatOutput } from \"../../lib/output.js\";\nimport type { Mcp } from \"../../types/index.js\";\n\nexport const statusCommand = new Command(\"status\")\n\t.description(\"Show current MCP sandbox status\")\n\t.option(\"--mcp-id <id>\", \"Specific MCP ID\")\n\t.action(async (options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tlet mcpId = options.mcpId;\n\n\t\t\tif (!mcpId) {\n\t\t\t\tmcpId = await config.getMcpId();\n\t\t\t\tif (!mcpId) {\n\t\t\t\t\tthrow new McpError(\n\t\t\t\t\t\t\"No active MCP. Run 'waniwani mcp create <name>' to create one or 'waniwani mcp use <name>' to select one.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst spinner = ora(\"Fetching MCP status...\").start();\n\t\t\tconst result = await api.get<Mcp>(`/api/admin/mcps/${mcpId}`);\n\t\t\tspinner.stop();\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput(result, true);\n\t\t\t} else {\n\t\t\t\tconst statusColor =\n\t\t\t\t\tresult.status === \"active\" ? chalk.green : chalk.red;\n\n\t\t\t\tformatList(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ label: \"MCP ID\", value: result.id },\n\t\t\t\t\t\t{ label: \"Name\", value: result.name },\n\t\t\t\t\t\t{ label: \"Status\", value: statusColor(result.status) },\n\t\t\t\t\t\t{ label: \"Sandbox ID\", value: result.sandboxId },\n\t\t\t\t\t\t{ label: \"Preview URL\", value: result.previewUrl },\n\t\t\t\t\t\t{ label: \"Created\", value: result.createdAt },\n\t\t\t\t\t\t{ label: \"Expires\", value: result.expiresAt ?? \"N/A\" },\n\t\t\t\t\t],\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { handleError, McpError } from \"../../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../../lib/output.js\";\n\nexport const stopCommand = new Command(\"stop\")\n\t.description(\"Stop and clean up the MCP sandbox\")\n\t.option(\"--mcp-id <id>\", \"Specific MCP ID\")\n\t.action(async (options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tlet mcpId = options.mcpId;\n\n\t\t\tif (!mcpId) {\n\t\t\t\tmcpId = await config.getMcpId();\n\t\t\t\tif (!mcpId) {\n\t\t\t\t\tthrow new McpError(\"No active MCP. Use --mcp-id to specify one.\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst spinner = ora(\"Stopping MCP sandbox...\").start();\n\t\t\tawait api.delete(`/api/admin/mcps/${mcpId}`);\n\t\t\tspinner.succeed(\"MCP sandbox stopped\");\n\n\t\t\t// Clear active MCP if it was the one we stopped\n\t\t\tif ((await config.getMcpId()) === mcpId) {\n\t\t\t\tawait config.setMcpId(null);\n\t\t\t}\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput({ stopped: mcpId }, true);\n\t\t\t} else {\n\t\t\t\tformatSuccess(\"MCP sandbox stopped and cleaned up.\", false);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { handleError, McpError, SandboxError } from \"../../lib/errors.js\";\nimport { formatOutput, formatTable } from \"../../lib/output.js\";\nimport type {\n\tMcpCallResponse,\n\tMcpTestResponse,\n\tMcpToolResult,\n} from \"../../types/index.js\";\n\nexport const testCommand = new Command(\"test\")\n\t.description(\"Test MCP tools via the sandbox\")\n\t.argument(\"[tool]\", \"Tool name to test (lists tools if omitted)\")\n\t.argument(\"[args...]\", \"JSON arguments for the tool\")\n\t.option(\"--mcp-id <id>\", \"Specific MCP ID\")\n\t.action(\n\t\tasync (tool: string | undefined, args: string[], options, command) => {\n\t\t\tconst globalOptions = command.optsWithGlobals();\n\t\t\tconst json = globalOptions.json ?? false;\n\n\t\t\ttry {\n\t\t\t\tlet mcpId = options.mcpId;\n\n\t\t\t\tif (!mcpId) {\n\t\t\t\t\tmcpId = await config.getMcpId();\n\t\t\t\t\tif (!mcpId) {\n\t\t\t\t\t\tthrow new McpError(\n\t\t\t\t\t\t\t\"No active MCP. Run 'waniwani mcp create <name>' or 'waniwani mcp use <name>'.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!tool) {\n\t\t\t\t\t// List tools\n\t\t\t\t\tconst spinner = ora(\"Fetching available tools...\").start();\n\t\t\t\t\tconst result = await api.post<McpTestResponse>(\n\t\t\t\t\t\t`/api/admin/mcps/${mcpId}/test`,\n\t\t\t\t\t\t{ action: \"list\" },\n\t\t\t\t\t);\n\t\t\t\t\tspinner.stop();\n\n\t\t\t\t\tconst tools = result.tools;\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\tformatOutput({ tools }, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (tools.length === 0) {\n\t\t\t\t\t\t\tconsole.log(\"No tools available.\");\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.log(chalk.bold(\"\\nAvailable Tools:\\n\"));\n\t\t\t\t\t\t\tformatTable(\n\t\t\t\t\t\t\t\t[\"Name\", \"Description\"],\n\t\t\t\t\t\t\t\ttools.map((t) => [t.name, t.description || \"No description\"]),\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`\\nTest a tool: waniwani mcp test <tool-name> '{\"arg\": \"value\"}'`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Call tool\n\t\t\t\t\tlet toolArgs: Record<string, unknown> = {};\n\t\t\t\t\tif (args.length > 0) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\ttoolArgs = JSON.parse(args.join(\" \"));\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tthrow new SandboxError(\n\t\t\t\t\t\t\t\t`Invalid JSON arguments. Expected format: '{\"key\": \"value\"}'`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst spinner = ora(`Calling tool \"${tool}\"...`).start();\n\t\t\t\t\tconst startTime = Date.now();\n\t\t\t\t\tconst result = await api.post<McpCallResponse>(\n\t\t\t\t\t\t`/api/admin/mcps/${mcpId}/test`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taction: \"call\",\n\t\t\t\t\t\t\ttool,\n\t\t\t\t\t\t\targs: toolArgs,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tconst duration = result.duration || Date.now() - startTime;\n\t\t\t\t\tspinner.stop();\n\n\t\t\t\t\tconst output: McpToolResult = {\n\t\t\t\t\t\ttool,\n\t\t\t\t\t\tinput: toolArgs,\n\t\t\t\t\t\tresult: result.result,\n\t\t\t\t\t\tduration,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\tformatOutput(output, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.log(chalk.bold(\"\\nTool Result:\\n\"));\n\t\t\t\t\t\tconsole.log(chalk.gray(\"Tool:\"), tool);\n\t\t\t\t\t\tconsole.log(chalk.gray(\"Input:\"), JSON.stringify(toolArgs));\n\t\t\t\t\t\tconsole.log(chalk.gray(\"Duration:\"), `${duration}ms`);\n\t\t\t\t\t\tconsole.log(chalk.gray(\"Result:\"));\n\t\t\t\t\t\tconsole.log(JSON.stringify(result.result, null, 2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error, json);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t},\n\t);\n","import { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config, globalConfig } from \"../../lib/config.js\";\nimport { handleError, McpError } from \"../../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../../lib/output.js\";\nimport type { Mcp, McpListResponse } from \"../../types/index.js\";\n\nexport const useCommand = new Command(\"use\")\n\t.description(\"Select an MCP to use for subsequent commands\")\n\t.argument(\"<name>\", \"Name of the MCP to use\")\n\t.option(\"--global\", \"Save to global config instead of project config\")\n\t.action(async (name: string, options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tconst spinner = ora(\"Fetching MCPs...\").start();\n\n\t\t\t// Fetch all MCPs\n\t\t\tconst mcps = await api.get<McpListResponse>(\"/api/admin/mcps\");\n\n\t\t\tspinner.stop();\n\n\t\t\t// Find MCP by name\n\t\t\tconst mcp = mcps.find((m: Mcp) => m.name === name);\n\n\t\t\tif (!mcp) {\n\t\t\t\tthrow new McpError(\n\t\t\t\t\t`MCP \"${name}\" not found. Run 'waniwani mcp list' to see available MCPs.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (mcp.status !== \"active\") {\n\t\t\t\tthrow new McpError(\n\t\t\t\t\t`MCP \"${name}\" is ${mcp.status}. Only active MCPs can be used.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst cfg = options.global ? globalConfig : config;\n\t\t\tawait cfg.setMcpId(mcp.id);\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput({ selected: mcp, scope: cfg.scope }, true);\n\t\t\t} else {\n\t\t\t\tformatSuccess(`Now using MCP \"${name}\" (${cfg.scope})`, false);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(` MCP ID: ${mcp.id}`);\n\t\t\t\tconsole.log(` Preview URL: ${mcp.previewUrl}`);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\"Next steps:\");\n\t\t\t\tconsole.log(' waniwani task \"Add a tool\"');\n\t\t\t\tconsole.log(\" waniwani mcp test\");\n\t\t\t\tconsole.log(\" waniwani mcp status\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list.js\";\nimport { switchCommand } from \"./switch.js\";\n\nexport const orgCommand = new Command(\"org\")\n\t.description(\"Organization management commands\")\n\t.addCommand(listCommand)\n\t.addCommand(switchCommand);\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { handleError } from \"../../lib/errors.js\";\nimport { formatOutput, formatTable } from \"../../lib/output.js\";\nimport type { Org, OrgListResponse } from \"../../types/index.js\";\n\nexport const listCommand = new Command(\"list\")\n\t.description(\"List your organizations\")\n\t.action(async (_, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tconst spinner = ora(\"Fetching organizations...\").start();\n\n\t\t\tconst result = await api.get<OrgListResponse>(\"/api/oauth/orgs\");\n\n\t\t\tspinner.stop();\n\n\t\t\tconst { orgs, activeOrgId } = result;\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput(\n\t\t\t\t\t{\n\t\t\t\t\t\torgs: orgs.map((o: Org) => ({\n\t\t\t\t\t\t\t...o,\n\t\t\t\t\t\t\tisActive: o.id === activeOrgId,\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tactiveOrgId,\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tif (orgs.length === 0) {\n\t\t\t\t\tconsole.log(\"No organizations found.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconsole.log(chalk.bold(\"\\nOrganizations:\\n\"));\n\n\t\t\t\tconst rows = orgs.map((o: Org) => {\n\t\t\t\t\tconst isActive = o.id === activeOrgId;\n\t\t\t\t\treturn [\n\t\t\t\t\t\tisActive ? chalk.cyan(`* ${o.name}`) : ` ${o.name}`,\n\t\t\t\t\t\to.slug,\n\t\t\t\t\t\to.role,\n\t\t\t\t\t];\n\t\t\t\t});\n\n\t\t\t\tformatTable([\"Name\", \"Slug\", \"Role\"], rows, false);\n\n\t\t\t\tconsole.log();\n\t\t\t\tif (activeOrgId) {\n\t\t\t\t\tconst activeOrg = orgs.find((o: Org) => o.id === activeOrgId);\n\t\t\t\t\tif (activeOrg) {\n\t\t\t\t\t\tconsole.log(`Active organization: ${chalk.cyan(activeOrg.name)}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconsole.log(\"\\nSwitch organization: waniwani org switch <name>\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../../lib/api.js\";\nimport { config } from \"../../lib/config.js\";\nimport { CLIError, handleError } from \"../../lib/errors.js\";\nimport { formatOutput, formatSuccess } from \"../../lib/output.js\";\nimport type {\n\tOrg,\n\tOrgListResponse,\n\tOrgSwitchResponse,\n} from \"../../types/index.js\";\n\nexport const switchCommand = new Command(\"switch\")\n\t.description(\"Switch to a different organization\")\n\t.argument(\"<name>\", \"Name or slug of the organization to switch to\")\n\t.action(async (name: string, _, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tconst spinner = ora(\"Fetching organizations...\").start();\n\n\t\t\t// First fetch orgs to find the org ID\n\t\t\tconst { orgs } = await api.get<OrgListResponse>(\"/api/oauth/orgs\");\n\n\t\t\t// Find org by name or slug\n\t\t\tconst org = orgs.find((o: Org) => o.name === name || o.slug === name);\n\n\t\t\tif (!org) {\n\t\t\t\tspinner.stop();\n\t\t\t\tthrow new CLIError(\n\t\t\t\t\t`Organization \"${name}\" not found. Run 'waniwani org list' to see available organizations.`,\n\t\t\t\t\t\"ORG_NOT_FOUND\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tspinner.text = \"Switching organization...\";\n\n\t\t\t// Switch to the org\n\t\t\tawait api.post<OrgSwitchResponse>(\"/api/oauth/orgs/switch\", {\n\t\t\t\torgId: org.id,\n\t\t\t});\n\n\t\t\tspinner.succeed(\"Organization switched\");\n\n\t\t\t// Clear local MCP selection since we switched orgs\n\t\t\tconfig.setMcpId(null);\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput({ switched: org }, true);\n\t\t\t} else {\n\t\t\t\tformatSuccess(`Switched to organization \"${org.name}\"`, false);\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(\"Note: Active MCP selection has been cleared.\");\n\t\t\t\tconsole.log(\n\t\t\t\t\t\"Run 'waniwani mcp list' to see MCPs in this organization.\",\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\nimport { api } from \"../lib/api.js\";\nimport { auth } from \"../lib/auth.js\";\nimport { config } from \"../lib/config.js\";\nimport { AuthError, handleError, McpError } from \"../lib/errors.js\";\nimport { formatOutput } from \"../lib/output.js\";\nimport type { TaskDoneEvent, TaskStep, TaskStepEvent } from \"../types/index.js\";\n\nexport const taskCommand = new Command(\"task\")\n\t.description(\"Send a task to Claude running in the sandbox\")\n\t.argument(\"<prompt>\", \"Task description/prompt\")\n\t.option(\"--mcp-id <id>\", \"Specific MCP ID\")\n\t.option(\"--model <model>\", \"Claude model to use\")\n\t.option(\"--max-steps <n>\", \"Maximum tool use steps\")\n\t.action(async (prompt: string, options, command) => {\n\t\tconst globalOptions = command.optsWithGlobals();\n\t\tconst json = globalOptions.json ?? false;\n\n\t\ttry {\n\t\t\tlet mcpId = options.mcpId;\n\n\t\t\tif (!mcpId) {\n\t\t\t\tmcpId = await config.getMcpId();\n\t\t\t\tif (!mcpId) {\n\t\t\t\t\tthrow new McpError(\n\t\t\t\t\t\t\"No active MCP. Run 'waniwani init' then 'waniwani mcp use <name>'.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst token = await auth.getAccessToken();\n\t\t\tif (!token) {\n\t\t\t\tthrow new AuthError(\n\t\t\t\t\t\"Not logged in. Run 'waniwani login' to authenticate.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst defaults = await config.getDefaults();\n\t\t\tconst model = options.model ?? defaults.model;\n\t\t\tconst maxSteps = options.maxSteps\n\t\t\t\t? Number.parseInt(options.maxSteps, 10)\n\t\t\t\t: defaults.maxSteps;\n\n\t\t\tif (!json) {\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(chalk.bold(\"Task:\"), prompt);\n\t\t\t\tconsole.log();\n\t\t\t}\n\n\t\t\tconst spinner = ora(\"Starting task...\").start();\n\n\t\t\t// Use fetch with SSE for streaming\n\t\t\tconst baseUrl = api.getBaseUrl();\n\t\t\tconst response = await fetch(`${baseUrl}/api/admin/mcps/${mcpId}/task`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t\tAccept: \"text/event-stream\",\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tprompt,\n\t\t\t\t\tmodel,\n\t\t\t\t\tmaxSteps,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst error = await response\n\t\t\t\t\t.json()\n\t\t\t\t\t.catch(() => ({ message: response.statusText }));\n\t\t\t\tspinner.fail(\"Task failed\");\n\t\t\t\tthrow new Error(\n\t\t\t\t\terror.message || `Request failed with status ${response.status}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tspinner.stop();\n\n\t\t\tconst steps: TaskStep[] = [];\n\t\t\tlet stepCount = 0;\n\t\t\tlet maxStepsReached = false;\n\n\t\t\t// Process SSE stream\n\t\t\tconst reader = response.body?.getReader();\n\t\t\tif (!reader) {\n\t\t\t\tthrow new Error(\"No response body\");\n\t\t\t}\n\n\t\t\tconst decoder = new TextDecoder();\n\t\t\tlet buffer = \"\";\n\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) break;\n\n\t\t\t\tbuffer += decoder.decode(value, { stream: true });\n\t\t\t\tconst lines = buffer.split(\"\\n\");\n\t\t\t\tbuffer = lines.pop() || \"\";\n\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\tif (line.startsWith(\"event: \")) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (line.startsWith(\"data: \")) {\n\t\t\t\t\t\tconst data = line.slice(6);\n\t\t\t\t\t\tif (!data || data === \"[DONE]\") continue;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst parsed = JSON.parse(data);\n\n\t\t\t\t\t\t\t// Handle step events\n\t\t\t\t\t\t\tif (parsed.type === \"text\") {\n\t\t\t\t\t\t\t\tconst event = parsed as TaskStepEvent;\n\t\t\t\t\t\t\t\tsteps.push({ type: \"text\", text: event.content });\n\t\t\t\t\t\t\t\tif (!json && event.content) {\n\t\t\t\t\t\t\t\t\tconsole.log(chalk.white(event.content));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (parsed.type === \"tool_call\") {\n\t\t\t\t\t\t\t\tconst event = parsed as TaskStepEvent;\n\t\t\t\t\t\t\t\tsteps.push({\n\t\t\t\t\t\t\t\t\ttype: \"tool_call\",\n\t\t\t\t\t\t\t\t\ttool: event.tool,\n\t\t\t\t\t\t\t\t\tinput: event.input,\n\t\t\t\t\t\t\t\t\toutput: event.output,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (!json) {\n\t\t\t\t\t\t\t\t\tconsole.log(chalk.cyan(`> Using tool: ${event.tool}`));\n\t\t\t\t\t\t\t\t\tif (event.input?.command) {\n\t\t\t\t\t\t\t\t\t\tconsole.log(chalk.gray(` $ ${event.input.command}`));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (event.output) {\n\t\t\t\t\t\t\t\t\t\t// Show abbreviated output\n\t\t\t\t\t\t\t\t\t\tconst outputLines = event.output.split(\"\\n\");\n\t\t\t\t\t\t\t\t\t\tif (outputLines.length > 10) {\n\t\t\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\t\t\tchalk.gray(outputLines.slice(0, 5).join(\"\\n\")),\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\t\t\tchalk.gray(\n\t\t\t\t\t\t\t\t\t\t\t\t\t` ... (${outputLines.length - 10} more lines)`,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\tconsole.log(chalk.gray(outputLines.slice(-5).join(\"\\n\")));\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tconsole.log(chalk.gray(event.output));\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconsole.log();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (parsed.success !== undefined) {\n\t\t\t\t\t\t\t\t// Handle done event\n\t\t\t\t\t\t\t\tconst doneEvent = parsed as TaskDoneEvent;\n\t\t\t\t\t\t\t\tstepCount = doneEvent.stepCount;\n\t\t\t\t\t\t\t\tmaxStepsReached = doneEvent.maxStepsReached || false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Ignore malformed JSON\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = {\n\t\t\t\tsuccess: true,\n\t\t\t\tsteps,\n\t\t\t\tstepCount,\n\t\t\t\tmaxStepsReached,\n\t\t\t};\n\n\t\t\tif (json) {\n\t\t\t\tformatOutput(result, true);\n\t\t\t} else {\n\t\t\t\tconsole.log();\n\t\t\t\tconsole.log(chalk.green(\"✓\"), `Task completed in ${stepCount} steps.`);\n\t\t\t\tif (maxStepsReached) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.yellow(\"⚠\"),\n\t\t\t\t\t\t\"Maximum steps reached. Task may be incomplete.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thandleError(error, json);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n","import { program } from \"./cli.js\";\n\nprogram.parse(process.argv);\n"],"mappings":"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","names":["Command","chalk","chalk","chalk","Command","mkdir","readFile","writeFile","homedir","join","z","existsSync","mkdir","writeFile","join","join","homedir","z","mkdir","readFile","writeFile","Command","chalk","Command","Command","Command","Command","ora","Command","ora","Command","ora","Command","ora","chalk","Command","ora","Command","ora","chalk","chalk","Command","ora","Command","ora","chalk","Command","ora","Command","ora","chalk","Command","ora","Command","ora","chalk","Command","ora","Command","ora","Command","Command","chalk","Command","ora","listCommand","Command","ora","chalk","Command","ora","Command","ora","Command","listCommand","chalk","Command","ora","Command","chalk","ora","Command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@waniwani/cli",
3
- "version": "0.0.12",
3
+ "version": "0.0.14",
4
4
  "description": "WaniWani CLI for MCP development workflow",
5
5
  "type": "module",
6
6
  "exports": {