whale-code 6.5.9 → 6.5.11

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/setup.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","names":["existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","createInterface","home","CLI_TARGETS","name","configPath","configKey","detect","format","servers","process","platform","readJSON","path","JSON","parse","writeJSON","data","dir","recursive","stringify","prompt","rl","question","defaultValue","suffix","Promise","resolve","answer","trim","promptYN","defaultYes","hint","a","toLowerCase","runSetup","input","stdin","output","stdout","console","log","detected","filter","t","notDetected","length","forEach","close","supabaseUrl","supabaseKey","storeId","serverEntry","type","command","args","env","SUPABASE_URL","SUPABASE_SERVICE_ROLE_KEY","STORE_ID","installed","target","install","config","overwrite","isDirectRun","argv","includes","catch","error"],"sources":["../src/setup.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Whale Code — Interactive Setup\n *\n * Detects installed MCP-compatible CLIs and writes config for each.\n * Usage: whale setup\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { dirname, join } from \"path\";\nimport { createInterface } from \"readline\";\n\n// ============================================================================\n// CLI CONFIG TARGETS\n// ============================================================================\n\ninterface CLITarget {\n name: string;\n configPath: string;\n configKey: string; // JSON key that holds MCP servers\n detect: () => boolean;\n format: (servers: Record<string, any>) => Record<string, any>;\n}\n\nconst home = homedir();\n\nconst CLI_TARGETS: CLITarget[] = [\n {\n name: \"Claude Code\",\n configPath: join(home, \".claude\", \"settings.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".claude\")),\n format: (servers) => servers,\n },\n {\n name: \"Claude Desktop\",\n configPath:\n process.platform === \"darwin\"\n ? join(home, \"Library\", \"Application Support\", \"Claude\", \"claude_desktop_config.json\")\n : join(home, \"AppData\", \"Roaming\", \"Claude\", \"claude_desktop_config.json\"),\n configKey: \"mcpServers\",\n detect: () =>\n existsSync(\n process.platform === \"darwin\"\n ? join(home, \"Library\", \"Application Support\", \"Claude\")\n : join(home, \"AppData\", \"Roaming\", \"Claude\")\n ),\n format: (servers) => servers,\n },\n {\n name: \"Cursor\",\n configPath: join(home, \".cursor\", \"mcp.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".cursor\")),\n format: (servers) => servers,\n },\n {\n name: \"Windsurf\",\n configPath: join(home, \".codeium\", \"windsurf\", \"mcp_config.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".codeium\", \"windsurf\")),\n format: (servers) => servers,\n },\n {\n name: \"Gemini CLI\",\n configPath: join(home, \".gemini\", \"settings.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".gemini\")),\n format: (servers) => servers,\n },\n];\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction readJSON(path: string): Record<string, any> {\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeJSON(path: string, data: Record<string, any>): void {\n const dir = dirname(path);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(path, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\nfunction prompt(rl: ReturnType<typeof createInterface>, question: string, defaultValue?: string): Promise<string> {\n const suffix = defaultValue ? ` (${defaultValue})` : \"\";\n return new Promise((resolve) => {\n rl.question(`${question}${suffix}: `, (answer) => {\n resolve(answer.trim() || defaultValue || \"\");\n });\n });\n}\n\nfunction promptYN(rl: ReturnType<typeof createInterface>, question: string, defaultYes = true): Promise<boolean> {\n const hint = defaultYes ? \"[Y/n]\" : \"[y/N]\";\n return new Promise((resolve) => {\n rl.question(`${question} ${hint} `, (answer) => {\n const a = answer.trim().toLowerCase();\n if (a === \"\") resolve(defaultYes);\n else resolve(a === \"y\" || a === \"yes\");\n });\n });\n}\n\n// ============================================================================\n// MAIN\n// ============================================================================\n\nexport async function runSetup(): Promise<void> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n console.log(\"\");\n console.log(\" Whale Code — Setup\");\n console.log(\" ══════════════════\");\n console.log(\"\");\n\n // Detect installed CLIs\n const detected = CLI_TARGETS.filter((t) => t.detect());\n const notDetected = CLI_TARGETS.filter((t) => !t.detect());\n\n if (detected.length > 0) {\n console.log(\" Detected CLIs:\");\n detected.forEach((t) => console.log(` + ${t.name}`));\n }\n if (notDetected.length > 0) {\n console.log(\" Not found:\");\n notDetected.forEach((t) => console.log(` - ${t.name}`));\n }\n console.log(\"\");\n\n if (detected.length === 0) {\n console.log(\" No supported MCP clients detected.\");\n console.log(\" Install Claude Code, Claude Desktop, Cursor, Windsurf, or Gemini CLI first.\");\n rl.close();\n return;\n }\n\n // Collect credentials\n console.log(\" Enter your Supabase credentials:\");\n console.log(\"\");\n\n const supabaseUrl = await prompt(rl, \" Supabase URL\");\n if (!supabaseUrl) {\n console.log(\" Supabase URL is required. Aborting.\");\n rl.close();\n return;\n }\n\n const supabaseKey = await prompt(rl, \" Supabase Service Role Key\");\n if (!supabaseKey) {\n console.log(\" Service Role Key is required. Aborting.\");\n rl.close();\n return;\n }\n\n const storeId = await prompt(rl, \" Store ID (optional, press enter to skip)\");\n\n console.log(\"\");\n\n // Build MCP server entry\n const serverEntry: Record<string, any> = {\n type: \"stdio\",\n command: \"npx\",\n args: [\"-y\", \"whale-code\"],\n env: {\n SUPABASE_URL: supabaseUrl,\n SUPABASE_SERVICE_ROLE_KEY: supabaseKey,\n ...(storeId ? { STORE_ID: storeId } : {}),\n },\n };\n\n // Install to each detected CLI\n let installed = 0;\n for (const target of detected) {\n const install = await promptYN(rl, ` Install to ${target.name}?`);\n if (!install) continue;\n\n const config = readJSON(target.configPath);\n if (!config[target.configKey]) config[target.configKey] = {};\n\n // Check for existing entry\n if (config[target.configKey][\"whale-code\"]) {\n const overwrite = await promptYN(rl, ` whale-code already configured in ${target.name}. Overwrite?`, false);\n if (!overwrite) continue;\n }\n\n config[target.configKey][\"whale-code\"] = target.format(serverEntry);\n writeJSON(target.configPath, config);\n console.log(` Wrote ${target.configPath}`);\n installed++;\n }\n\n console.log(\"\");\n if (installed > 0) {\n console.log(` Done! Installed to ${installed} CLI${installed > 1 ? \"s\" : \"\"}.`);\n console.log(\" Restart your CLI(s) to load the MCP server.\");\n } else {\n console.log(\" No changes made.\");\n }\n console.log(\"\");\n\n rl.close();\n}\n\n// Run if called directly\nconst isDirectRun = process.argv[1]?.includes(\"setup\");\nif (isDirectRun) {\n runSetup().catch(console.error);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"setup.js","names":["existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","createInterface","home","CLI_TARGETS","name","configPath","configKey","detect","format","servers","process","platform","readJSON","path","JSON","parse","writeJSON","data","dir","recursive","stringify","prompt","rl","question","defaultValue","suffix","Promise","resolve","answer","trim","promptYN","defaultYes","hint","a","toLowerCase","runSetup","input","stdin","output","stdout","console","log","detected","filter","t","notDetected","length","forEach","close","serverEntry","type","command","args","installed","target","install","config","overwrite","isDirectRun","argv","includes","catch","error"],"sources":["../src/setup.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Whale Code — Interactive Setup\n *\n * Detects installed MCP-compatible CLIs and writes config for each.\n * Usage: whale setup\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { dirname, join } from \"path\";\nimport { createInterface } from \"readline\";\n\n// ============================================================================\n// CLI CONFIG TARGETS\n// ============================================================================\n\ninterface CLITarget {\n name: string;\n configPath: string;\n configKey: string; // JSON key that holds MCP servers\n detect: () => boolean;\n format: (servers: Record<string, any>) => Record<string, any>;\n}\n\nconst home = homedir();\n\nconst CLI_TARGETS: CLITarget[] = [\n {\n name: \"Claude Code\",\n configPath: join(home, \".claude\", \"settings.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".claude\")),\n format: (servers) => servers,\n },\n {\n name: \"Claude Desktop\",\n configPath:\n process.platform === \"darwin\"\n ? join(home, \"Library\", \"Application Support\", \"Claude\", \"claude_desktop_config.json\")\n : join(home, \"AppData\", \"Roaming\", \"Claude\", \"claude_desktop_config.json\"),\n configKey: \"mcpServers\",\n detect: () =>\n existsSync(\n process.platform === \"darwin\"\n ? join(home, \"Library\", \"Application Support\", \"Claude\")\n : join(home, \"AppData\", \"Roaming\", \"Claude\")\n ),\n format: (servers) => servers,\n },\n {\n name: \"Cursor\",\n configPath: join(home, \".cursor\", \"mcp.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".cursor\")),\n format: (servers) => servers,\n },\n {\n name: \"Windsurf\",\n configPath: join(home, \".codeium\", \"windsurf\", \"mcp_config.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".codeium\", \"windsurf\")),\n format: (servers) => servers,\n },\n {\n name: \"Gemini CLI\",\n configPath: join(home, \".gemini\", \"settings.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".gemini\")),\n format: (servers) => servers,\n },\n];\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction readJSON(path: string): Record<string, any> {\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeJSON(path: string, data: Record<string, any>): void {\n const dir = dirname(path);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(path, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\nfunction prompt(rl: ReturnType<typeof createInterface>, question: string, defaultValue?: string): Promise<string> {\n const suffix = defaultValue ? ` (${defaultValue})` : \"\";\n return new Promise((resolve) => {\n rl.question(`${question}${suffix}: `, (answer) => {\n resolve(answer.trim() || defaultValue || \"\");\n });\n });\n}\n\nfunction promptYN(rl: ReturnType<typeof createInterface>, question: string, defaultYes = true): Promise<boolean> {\n const hint = defaultYes ? \"[Y/n]\" : \"[y/N]\";\n return new Promise((resolve) => {\n rl.question(`${question} ${hint} `, (answer) => {\n const a = answer.trim().toLowerCase();\n if (a === \"\") resolve(defaultYes);\n else resolve(a === \"y\" || a === \"yes\");\n });\n });\n}\n\n// ============================================================================\n// MAIN\n// ============================================================================\n\nexport async function runSetup(): Promise<void> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n console.log(\"\");\n console.log(\" Whale Code — Setup\");\n console.log(\" ══════════════════\");\n console.log(\"\");\n\n // Detect installed CLIs\n const detected = CLI_TARGETS.filter((t) => t.detect());\n const notDetected = CLI_TARGETS.filter((t) => !t.detect());\n\n if (detected.length > 0) {\n console.log(\" Detected CLIs:\");\n detected.forEach((t) => console.log(` + ${t.name}`));\n }\n if (notDetected.length > 0) {\n console.log(\" Not found:\");\n notDetected.forEach((t) => console.log(` - ${t.name}`));\n }\n console.log(\"\");\n\n if (detected.length === 0) {\n console.log(\" No supported MCP clients detected.\");\n console.log(\" Install Claude Code, Claude Desktop, Cursor, Windsurf, or Gemini CLI first.\");\n rl.close();\n return;\n }\n\n // No API keys needed — whale-code uses built-in platform credentials.\n // Users authenticate via `whale login` (browser OAuth).\n console.log(\" No API keys required — authentication is handled by `whale login`.\");\n console.log(\"\");\n\n // Build MCP server entry — no env vars needed for normal users\n const serverEntry: Record<string, any> = {\n type: \"stdio\",\n command: \"npx\",\n args: [\"-y\", \"whale-code\"],\n };\n\n // Install to each detected CLI\n let installed = 0;\n for (const target of detected) {\n const install = await promptYN(rl, ` Install to ${target.name}?`);\n if (!install) continue;\n\n const config = readJSON(target.configPath);\n if (!config[target.configKey]) config[target.configKey] = {};\n\n // Check for existing entry\n if (config[target.configKey][\"whale-code\"]) {\n const overwrite = await promptYN(rl, ` whale-code already configured in ${target.name}. Overwrite?`, false);\n if (!overwrite) continue;\n }\n\n config[target.configKey][\"whale-code\"] = target.format(serverEntry);\n writeJSON(target.configPath, config);\n console.log(` Wrote ${target.configPath}`);\n installed++;\n }\n\n console.log(\"\");\n if (installed > 0) {\n console.log(` Done! Installed to ${installed} CLI${installed > 1 ? \"s\" : \"\"}.`);\n console.log(\" Restart your CLI(s) to load the MCP server.\");\n } else {\n console.log(\" No changes made.\");\n }\n console.log(\"\");\n\n rl.close();\n}\n\n// Run if called directly\nconst isDirectRun = process.argv[1]?.includes(\"setup\");\nif (isDirectRun) {\n runSetup().catch(console.error);\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whale-code",
3
- "version": "6.5.9",
3
+ "version": "6.5.11",
4
4
  "description": "whale code — local-first AI agent CLI for inventory, orders, and analytics powered by MCP",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",