swagmanager-mcp 3.1.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/bin/swagmanager-mcp.js +211 -23
  2. package/dist/cli/app.d.ts +16 -1
  3. package/dist/cli/app.js +10 -1
  4. package/dist/cli/chat/ChatApp.d.ts +4 -2
  5. package/dist/cli/chat/ChatApp.js +130 -328
  6. package/dist/cli/chat/ChatInput.d.ts +24 -4
  7. package/dist/cli/chat/ChatInput.js +465 -33
  8. package/dist/cli/chat/MarkdownText.d.ts +1 -0
  9. package/dist/cli/chat/MarkdownText.js +1 -13
  10. package/dist/cli/chat/MessageList.d.ts +12 -11
  11. package/dist/cli/chat/MessageList.js +42 -11
  12. package/dist/cli/chat/ModelSelector.d.ts +20 -0
  13. package/dist/cli/chat/ModelSelector.js +69 -0
  14. package/dist/cli/chat/StreamingText.d.ts +5 -5
  15. package/dist/cli/chat/StreamingText.js +8 -20
  16. package/dist/cli/chat/SubagentPanel.d.ts +45 -0
  17. package/dist/cli/chat/SubagentPanel.js +110 -0
  18. package/dist/cli/chat/TeamPanel.d.ts +21 -0
  19. package/dist/cli/chat/TeamPanel.js +42 -0
  20. package/dist/cli/chat/ToolIndicator.d.ts +8 -1
  21. package/dist/cli/chat/ToolIndicator.js +303 -97
  22. package/dist/cli/chat/hooks/useAgentLoop.d.ts +38 -0
  23. package/dist/cli/chat/hooks/useAgentLoop.js +348 -0
  24. package/dist/cli/chat/hooks/useSlashCommands.d.ts +35 -0
  25. package/dist/cli/chat/hooks/useSlashCommands.js +378 -0
  26. package/dist/cli/commands/config-cmd.d.ts +10 -0
  27. package/dist/cli/commands/config-cmd.js +99 -0
  28. package/dist/cli/commands/doctor.d.ts +14 -0
  29. package/dist/cli/commands/doctor.js +172 -0
  30. package/dist/cli/commands/init.d.ts +16 -0
  31. package/dist/cli/commands/init.js +278 -0
  32. package/dist/cli/commands/mcp.d.ts +12 -0
  33. package/dist/cli/commands/mcp.js +162 -0
  34. package/dist/cli/print-mode.d.ts +31 -0
  35. package/dist/cli/print-mode.js +196 -0
  36. package/dist/cli/serve-mode.d.ts +35 -0
  37. package/dist/cli/serve-mode.js +585 -0
  38. package/dist/cli/services/agent-definitions.d.ts +25 -0
  39. package/dist/cli/services/agent-definitions.js +91 -0
  40. package/dist/cli/services/agent-events.d.ts +174 -0
  41. package/dist/cli/services/agent-events.js +175 -0
  42. package/dist/cli/services/agent-loop.d.ts +52 -37
  43. package/dist/cli/services/agent-loop.js +348 -688
  44. package/dist/cli/services/agent-worker-base.d.ts +97 -0
  45. package/dist/cli/services/agent-worker-base.js +210 -0
  46. package/dist/cli/services/background-processes.d.ts +126 -0
  47. package/dist/cli/services/background-processes.js +318 -0
  48. package/dist/cli/services/claude-md-loader.d.ts +16 -0
  49. package/dist/cli/services/claude-md-loader.js +58 -0
  50. package/dist/cli/services/config-modules.test.d.ts +1 -0
  51. package/dist/cli/services/config-modules.test.js +459 -0
  52. package/dist/cli/services/config-store.d.ts +8 -0
  53. package/dist/cli/services/config-store.js +11 -2
  54. package/dist/cli/services/debug-log.d.ts +10 -0
  55. package/dist/cli/services/debug-log.js +52 -0
  56. package/dist/cli/services/file-history.d.ts +21 -0
  57. package/dist/cli/services/file-history.js +83 -0
  58. package/dist/cli/services/format-server-response.d.ts +16 -0
  59. package/dist/cli/services/format-server-response.js +251 -0
  60. package/dist/cli/services/format-server-response.test.d.ts +1 -0
  61. package/dist/cli/services/format-server-response.test.js +847 -0
  62. package/dist/cli/services/git-context.d.ts +11 -0
  63. package/dist/cli/services/git-context.js +66 -0
  64. package/dist/cli/services/hooks.d.ts +56 -0
  65. package/dist/cli/services/hooks.js +205 -0
  66. package/dist/cli/services/interactive-tools.d.ts +125 -0
  67. package/dist/cli/services/interactive-tools.js +260 -0
  68. package/dist/cli/services/keybinding-manager.d.ts +52 -0
  69. package/dist/cli/services/keybinding-manager.js +115 -0
  70. package/dist/cli/services/local-tools.d.ts +6 -25
  71. package/dist/cli/services/local-tools.js +370 -499
  72. package/dist/cli/services/lsp-manager.d.ts +18 -0
  73. package/dist/cli/services/lsp-manager.js +717 -0
  74. package/dist/cli/services/mcp-client.d.ts +48 -0
  75. package/dist/cli/services/mcp-client.js +157 -0
  76. package/dist/cli/services/memory-manager.d.ts +16 -0
  77. package/dist/cli/services/memory-manager.js +57 -0
  78. package/dist/cli/services/model-manager.d.ts +16 -0
  79. package/dist/cli/services/model-manager.js +65 -0
  80. package/dist/cli/services/permission-modes.d.ts +13 -0
  81. package/dist/cli/services/permission-modes.js +43 -0
  82. package/dist/cli/services/ripgrep.d.ts +28 -0
  83. package/dist/cli/services/ripgrep.js +138 -0
  84. package/dist/cli/services/sandbox.d.ts +29 -0
  85. package/dist/cli/services/sandbox.js +97 -0
  86. package/dist/cli/services/sandbox.test.d.ts +1 -0
  87. package/dist/cli/services/sandbox.test.js +152 -0
  88. package/dist/cli/services/server-tools.d.ts +31 -15
  89. package/dist/cli/services/server-tools.js +140 -331
  90. package/dist/cli/services/session-persistence.d.ts +23 -0
  91. package/dist/cli/services/session-persistence.js +99 -0
  92. package/dist/cli/services/subagent-worker.d.ts +19 -0
  93. package/dist/cli/services/subagent-worker.js +41 -0
  94. package/dist/cli/services/subagent.d.ts +47 -0
  95. package/dist/cli/services/subagent.js +628 -0
  96. package/dist/cli/services/system-prompt.d.ts +7 -0
  97. package/dist/cli/services/system-prompt.js +160 -0
  98. package/dist/cli/services/team-lead.d.ts +72 -0
  99. package/dist/cli/services/team-lead.js +505 -0
  100. package/dist/cli/services/team-state.d.ts +76 -0
  101. package/dist/cli/services/team-state.js +398 -0
  102. package/dist/cli/services/teammate.d.ts +31 -0
  103. package/dist/cli/services/teammate.js +663 -0
  104. package/dist/cli/services/telemetry.d.ts +40 -2
  105. package/dist/cli/services/telemetry.js +84 -24
  106. package/dist/cli/services/tools/agent-tools.d.ts +14 -0
  107. package/dist/cli/services/tools/agent-tools.js +347 -0
  108. package/dist/cli/services/tools/file-ops.d.ts +15 -0
  109. package/dist/cli/services/tools/file-ops.js +464 -0
  110. package/dist/cli/services/tools/search-tools.d.ts +8 -0
  111. package/dist/cli/services/tools/search-tools.js +186 -0
  112. package/dist/cli/services/tools/shell-exec.d.ts +10 -0
  113. package/dist/cli/services/tools/shell-exec.js +168 -0
  114. package/dist/cli/services/tools/task-manager.d.ts +28 -0
  115. package/dist/cli/services/tools/task-manager.js +209 -0
  116. package/dist/cli/services/tools/web-tools.d.ts +11 -0
  117. package/dist/cli/services/tools/web-tools.js +389 -0
  118. package/dist/cli/shared/Theme.d.ts +10 -1
  119. package/dist/cli/shared/Theme.js +34 -1
  120. package/dist/cli/shared/markdown.d.ts +11 -1
  121. package/dist/cli/shared/markdown.js +492 -52
  122. package/dist/cli/status/StatusApp.js +3 -6
  123. package/dist/index.d.ts +7 -5
  124. package/dist/index.js +60 -40
  125. package/dist/server/handlers/analytics.d.ts +10 -0
  126. package/dist/server/handlers/analytics.js +250 -0
  127. package/dist/server/handlers/browser.d.ts +10 -0
  128. package/dist/server/handlers/browser.js +341 -0
  129. package/dist/server/handlers/catalog.d.ts +117 -0
  130. package/dist/server/handlers/catalog.js +752 -0
  131. package/dist/server/handlers/comms.d.ts +195 -0
  132. package/dist/server/handlers/comms.js +487 -0
  133. package/dist/server/handlers/crm.d.ts +89 -0
  134. package/dist/server/handlers/crm.js +432 -0
  135. package/dist/server/handlers/discovery.d.ts +6 -0
  136. package/dist/server/handlers/discovery.js +288 -0
  137. package/dist/server/handlers/embeddings.d.ts +92 -0
  138. package/dist/server/handlers/embeddings.js +197 -0
  139. package/dist/server/handlers/image-gen.d.ts +6 -0
  140. package/dist/server/handlers/image-gen.js +409 -0
  141. package/dist/server/handlers/inventory.d.ts +261 -0
  142. package/dist/server/handlers/inventory.js +265 -0
  143. package/dist/server/handlers/llm-providers.d.ts +6 -0
  144. package/dist/server/handlers/llm-providers.js +475 -0
  145. package/dist/server/handlers/operations.d.ts +120 -0
  146. package/dist/server/handlers/operations.js +128 -0
  147. package/dist/server/handlers/platform.d.ts +23 -0
  148. package/dist/server/handlers/platform.js +227 -0
  149. package/dist/server/handlers/supply-chain.d.ts +27 -0
  150. package/dist/server/handlers/supply-chain.js +298 -0
  151. package/dist/server/handlers/video-gen.d.ts +6 -0
  152. package/dist/server/handlers/video-gen.js +466 -0
  153. package/dist/server/handlers/voice.d.ts +6 -0
  154. package/dist/server/handlers/voice.js +140 -0
  155. package/dist/server/handlers/workflow-steps.d.ts +76 -0
  156. package/dist/server/handlers/workflow-steps.js +1896 -0
  157. package/dist/server/handlers/workflows.d.ts +7 -0
  158. package/dist/server/handlers/workflows.js +852 -0
  159. package/dist/server/index.d.ts +1 -0
  160. package/dist/server/index.js +1446 -0
  161. package/dist/server/lib/code-worker-pool.d.ts +31 -0
  162. package/dist/server/lib/code-worker-pool.js +224 -0
  163. package/dist/server/lib/code-worker.d.ts +1 -0
  164. package/dist/server/lib/code-worker.js +188 -0
  165. package/dist/server/lib/server-agent-loop.d.ts +77 -0
  166. package/dist/server/lib/server-agent-loop.js +362 -0
  167. package/dist/server/lib/server-subagent.d.ts +78 -0
  168. package/dist/server/lib/server-subagent.js +205 -0
  169. package/dist/server/lib/template-resolver.d.ts +29 -0
  170. package/dist/server/lib/template-resolver.js +185 -0
  171. package/dist/server/lib/utils.d.ts +12 -0
  172. package/dist/server/lib/utils.js +129 -0
  173. package/dist/server/proxy-handlers.d.ts +2 -0
  174. package/dist/server/proxy-handlers.js +1123 -0
  175. package/dist/server/tool-router.d.ts +70 -0
  176. package/dist/server/tool-router.js +403 -0
  177. package/dist/server/validation.d.ts +24 -0
  178. package/dist/server/validation.js +279 -0
  179. package/dist/shared/agent-core.d.ts +98 -0
  180. package/dist/shared/agent-core.js +325 -0
  181. package/dist/shared/agent-core.test.d.ts +1 -0
  182. package/dist/shared/agent-core.test.js +548 -0
  183. package/dist/shared/anthropic-types.d.ts +86 -0
  184. package/dist/shared/anthropic-types.js +7 -0
  185. package/dist/shared/api-client.d.ts +60 -0
  186. package/dist/shared/api-client.js +240 -0
  187. package/dist/shared/api-client.test.d.ts +1 -0
  188. package/dist/shared/api-client.test.js +648 -0
  189. package/dist/shared/constants.d.ts +31 -0
  190. package/dist/shared/constants.js +70 -0
  191. package/dist/shared/sse-parser.d.ts +26 -0
  192. package/dist/shared/sse-parser.js +206 -0
  193. package/dist/shared/sse-parser.test.d.ts +1 -0
  194. package/dist/shared/sse-parser.test.js +820 -0
  195. package/dist/shared/tool-dispatch.d.ts +48 -0
  196. package/dist/shared/tool-dispatch.js +151 -0
  197. package/dist/shared/tool-dispatch.test.d.ts +1 -0
  198. package/dist/shared/tool-dispatch.test.js +625 -0
  199. package/dist/shared/types.d.ts +62 -0
  200. package/dist/shared/types.js +7 -0
  201. package/package.json +26 -6
  202. package/src/cli/services/builtin-skills/commit.md +19 -0
  203. package/src/cli/services/builtin-skills/review-pr.md +21 -0
  204. package/src/cli/services/builtin-skills/review.md +18 -0
  205. package/dist/services/tool-registry.d.ts +0 -37
  206. package/dist/services/tool-registry.js +0 -49
  207. package/dist/tools/executor.d.ts +0 -69
  208. package/dist/tools/executor.js +0 -2680
@@ -4,21 +4,85 @@
4
4
  * whale code — local-first AI agent CLI
5
5
  *
6
6
  * Usage:
7
- * whaleStart chat (default, interactive terminal)
8
- * whale login — Log in with SwagManager credentials
9
- * whale logout — Clear saved session
10
- * whale status — Show connection status
11
- * whale help — Show this help
12
- * (non-TTY stdin) MCP stdio server for Claude Code / Cursor
7
+ * whale Start interactive chat
8
+ * whale -p "prompt" Non-interactive (print) mode
9
+ * whale login Log in with SwagManager credentials
10
+ * whale logout Clear saved session
11
+ * whale status Show connection status
12
+ * whale mcp list|add|remove Manage MCP servers
13
+ * whale doctor Run diagnostics
14
+ * whale config [key] [value] View/set configuration
15
+ * whale help Show this help
16
+ * (non-TTY stdin) MCP stdio server for Claude Code / Cursor
13
17
  */
14
18
 
15
19
  import { fileURLToPath } from "url";
16
20
  import { dirname, join } from "path";
21
+ import { readFileSync } from "fs";
22
+ import { parseArgs } from "util";
17
23
 
18
24
  const __filename = fileURLToPath(import.meta.url);
19
25
  const __dirname = dirname(__filename);
26
+ const distDir = join(__dirname, "..", "dist");
20
27
 
21
- const command = process.argv[2];
28
+ // Read version once — used for --version, help banner, etc.
29
+ let PKG_VERSION = "0.0.0";
30
+ try {
31
+ PKG_VERSION = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8")).version;
32
+ } catch { /* fallback */ }
33
+
34
+ // ── Parse CLI flags ──
35
+ let parsed;
36
+ try {
37
+ parsed = parseArgs({
38
+ allowPositionals: true,
39
+ strict: false,
40
+ options: {
41
+ // Print / headless mode
42
+ print: { type: "boolean", short: "p" },
43
+ "output-format": { type: "string" },
44
+ // Model & mode
45
+ model: { type: "string", short: "m" },
46
+ "permission-mode": { type: "string" },
47
+ // Session
48
+ resume: { type: "string", short: "r" },
49
+ continue: { type: "boolean", short: "c" },
50
+ "session-id": { type: "string" },
51
+ "no-session-persistence": { type: "boolean" },
52
+ // Limits
53
+ "max-turns": { type: "string" },
54
+ "max-budget-usd": { type: "string" },
55
+ effort: { type: "string" },
56
+ // Tool filtering
57
+ "allowed-tools": { type: "string" },
58
+ "disallowed-tools": { type: "string" },
59
+ // Fallback
60
+ "fallback-model": { type: "string" },
61
+ // Serve mode
62
+ port: { type: "string" },
63
+ host: { type: "string" },
64
+ // Debug / verbose
65
+ debug: { type: "boolean" },
66
+ verbose: { type: "boolean", short: "v" },
67
+ // Standard
68
+ help: { type: "boolean", short: "h" },
69
+ version: { type: "boolean" },
70
+ },
71
+ });
72
+ } catch (err) {
73
+ console.error(`Error: ${err.message}`);
74
+ console.error("Run 'whale help' for usage.");
75
+ process.exit(1);
76
+ }
77
+
78
+ const { values: flags, positionals } = parsed;
79
+
80
+ // First positional is the subcommand (unless --print is used)
81
+ const subcommand = positionals[0];
82
+ // If --print, remaining positionals form the message
83
+ const printMessage = flags.print
84
+ ? positionals.join(" ")
85
+ : undefined;
22
86
 
23
87
  // ── Help ──
24
88
  function showHelp() {
@@ -31,18 +95,45 @@ function showHelp() {
31
95
  console.log();
32
96
  console.log(` ${g}╭──────────────────────────────────────────╮${r}`);
33
97
  console.log(` ${g}│${r} ${g}│${r}`);
34
- console.log(` ${g}│${r} ${c}${B}◆ whale code${r} ${d}v3.0.0${r} ${g}│${r}`);
98
+ console.log(` ${g}│${r} ${c}${B}◆ whale code${r} ${d}v${PKG_VERSION}${r} ${g}│${r}`);
35
99
  console.log(` ${g}│${r} ${d}local-first AI agent CLI${r} ${g}│${r}`);
36
100
  console.log(` ${g}│${r} ${g}│${r}`);
37
101
  console.log(` ${g}╰──────────────────────────────────────────╯${r}`);
38
102
  console.log();
39
103
  console.log(` ${B}Commands:${r}`);
40
- console.log(` whale${d} Start chatting (default)${r}`);
41
- console.log(` whale login${d} Log in to SwagManager${r}`);
42
- console.log(` whale logout${d} Clear session${r}`);
43
- console.log(` whale stores${d} Switch active store${r}`);
44
- console.log(` whale status${d} Connection & tools${r}`);
45
- console.log(` whale setup${d} Install MCP to IDEs${r}`);
104
+ console.log(` whale${d} Start chatting (default)${r}`);
105
+ console.log(` whale login${d} Log in to SwagManager${r}`);
106
+ console.log(` whale logout${d} Clear session${r}`);
107
+ console.log(` whale stores${d} Switch active store${r}`);
108
+ console.log(` whale status${d} Connection & tools${r}`);
109
+ console.log(` whale setup${d} Install MCP to IDEs${r}`);
110
+ console.log(` whale mcp${d} Manage MCP servers${r}`);
111
+ console.log(` whale doctor${d} Run diagnostics${r}`);
112
+ console.log(` whale init${d} Generate .whale/CLAUDE.md for project${r}`);
113
+ console.log(` whale config${d} View/set configuration${r}`);
114
+ console.log(` whale serve${d} Local agent WebSocket server${r}`);
115
+ console.log();
116
+ console.log(` ${B}Print Mode (non-interactive):${r}`);
117
+ console.log(` whale -p "prompt"${d} Run single prompt, output to stdout${r}`);
118
+ console.log(` echo "prompt" | whale -p${d} Read prompt from stdin${r}`);
119
+ console.log();
120
+ console.log(` ${B}Flags:${r}`);
121
+ console.log(` -p, --print${d} Non-interactive mode${r}`);
122
+ console.log(` --output-format <fmt>${d} text|json|stream-json (default: text)${r}`);
123
+ console.log(` -m, --model <name>${d} sonnet|opus|haiku${r}`);
124
+ console.log(` --permission-mode <mode>${d} default|plan|yolo${r}`);
125
+ console.log(` -r, --resume <id>${d} Resume session by ID${r}`);
126
+ console.log(` -c, --continue${d} Continue most recent session${r}`);
127
+ console.log(` --session-id <id>${d} Custom session UUID${r}`);
128
+ console.log(` --no-session-persistence${d} Ephemeral session${r}`);
129
+ console.log(` --max-turns <n>${d} Limit agent turns${r}`);
130
+ console.log(` --max-budget-usd <n>${d} Cost cap in USD${r}`);
131
+ console.log(` --effort <level>${d} low|medium|high${r}`);
132
+ console.log(` --allowed-tools <list>${d} Comma-separated tool whitelist${r}`);
133
+ console.log(` --disallowed-tools <list>${d} Comma-separated tool blacklist${r}`);
134
+ console.log(` --fallback-model <name>${d} Auto-fallback on overload${r}`);
135
+ console.log(` --debug${d} Debug logging to stderr${r}`);
136
+ console.log(` -v, --verbose${d} Extra output${r}`);
46
137
  console.log();
47
138
  console.log(` ${B}In chat:${r}`);
48
139
  console.log(` ${d}Type ${r}/${d} to open command menu${r}`);
@@ -50,7 +141,70 @@ function showHelp() {
50
141
  console.log();
51
142
  }
52
143
 
53
- // ── Route ──
144
+ // Build options object from flags
145
+ function buildOptions() {
146
+ return {
147
+ model: flags.model,
148
+ permissionMode: flags["permission-mode"],
149
+ resumeSessionId: flags.resume,
150
+ continueLastSession: flags.continue,
151
+ sessionId: flags["session-id"],
152
+ noSessionPersistence: flags["no-session-persistence"],
153
+ maxTurns: flags["max-turns"] ? parseInt(flags["max-turns"], 10) : undefined,
154
+ maxBudgetUsd: flags["max-budget-usd"] ? parseFloat(flags["max-budget-usd"]) : undefined,
155
+ effort: flags.effort,
156
+ allowedTools: flags["allowed-tools"]?.split(",").map(s => s.trim()),
157
+ disallowedTools: flags["disallowed-tools"]?.split(",").map(s => s.trim()),
158
+ fallbackModel: flags["fallback-model"],
159
+ debug: flags.debug,
160
+ verbose: flags.verbose,
161
+ };
162
+ }
163
+
164
+ // ── Version ──
165
+ if (flags.version) {
166
+ console.log(PKG_VERSION);
167
+ process.exit(0);
168
+ }
169
+
170
+ // ── Help ──
171
+ if (flags.help && !subcommand) {
172
+ showHelp();
173
+ process.exit(0);
174
+ }
175
+
176
+ // ── Print mode ──
177
+ if (flags.print) {
178
+ const { runPrintMode } = await import(join(distDir, "cli", "print-mode.js"));
179
+ const options = buildOptions();
180
+
181
+ // Read stdin if available (non-TTY)
182
+ let stdinContent = "";
183
+ if (!process.stdin.isTTY) {
184
+ const chunks = [];
185
+ for await (const chunk of process.stdin) {
186
+ chunks.push(chunk);
187
+ }
188
+ stdinContent = Buffer.concat(chunks).toString("utf-8").trim();
189
+ }
190
+
191
+ // Combine stdin + positional message
192
+ const message = [stdinContent, printMessage].filter(Boolean).join("\n\n");
193
+ if (!message) {
194
+ console.error("Error: --print requires a message. Provide as argument or via stdin.");
195
+ process.exit(1);
196
+ }
197
+
198
+ const exitCode = await runPrintMode({
199
+ message,
200
+ outputFormat: flags["output-format"] || "text",
201
+ ...options,
202
+ });
203
+ process.exit(exitCode);
204
+ }
205
+
206
+ // ── Route subcommands ──
207
+ const command = subcommand;
54
208
  switch (command) {
55
209
  case "help":
56
210
  case "--help":
@@ -63,13 +217,13 @@ switch (command) {
63
217
  console.error("Error: whale login requires an interactive terminal.");
64
218
  process.exit(1);
65
219
  }
66
- const { renderLogin } = await import(join(__dirname, "..", "dist", "cli", "app.js"));
220
+ const { renderLogin } = await import(join(distDir, "cli", "app.js"));
67
221
  await renderLogin();
68
222
  break;
69
223
  }
70
224
 
71
225
  case "logout": {
72
- const { renderLogout } = await import(join(__dirname, "..", "dist", "cli", "app.js"));
226
+ const { renderLogout } = await import(join(distDir, "cli", "app.js"));
73
227
  await renderLogout();
74
228
  break;
75
229
  }
@@ -77,20 +231,20 @@ switch (command) {
77
231
  case "chat":
78
232
  case undefined: {
79
233
  if (process.stdin.isTTY) {
80
- const { renderChat } = await import(join(__dirname, "..", "dist", "cli", "app.js"));
81
- await renderChat();
234
+ const { renderChat } = await import(join(distDir, "cli", "app.js"));
235
+ await renderChat(buildOptions());
82
236
  } else if (command === "chat") {
83
237
  console.error("Error: whale chat requires an interactive terminal.");
84
238
  process.exit(1);
85
239
  } else {
86
240
  // Non-TTY, no command → MCP stdio server
87
- await import(join(__dirname, "..", "dist", "index.js"));
241
+ await import(join(distDir, "index.js"));
88
242
  }
89
243
  break;
90
244
  }
91
245
 
92
246
  case "status": {
93
- const { renderStatus } = await import(join(__dirname, "..", "dist", "cli", "app.js"));
247
+ const { renderStatus } = await import(join(distDir, "cli", "app.js"));
94
248
  await renderStatus();
95
249
  break;
96
250
  }
@@ -100,7 +254,7 @@ switch (command) {
100
254
  console.error("Error: whale setup requires an interactive terminal.");
101
255
  process.exit(1);
102
256
  }
103
- const { renderSetup } = await import(join(__dirname, "..", "dist", "cli", "app.js"));
257
+ const { renderSetup } = await import(join(distDir, "cli", "app.js"));
104
258
  await renderSetup();
105
259
  break;
106
260
  }
@@ -111,11 +265,45 @@ switch (command) {
111
265
  console.error("Error: whale stores requires an interactive terminal.");
112
266
  process.exit(1);
113
267
  }
114
- const { renderStores } = await import(join(__dirname, "..", "dist", "cli", "app.js"));
268
+ const { renderStores } = await import(join(distDir, "cli", "app.js"));
115
269
  await renderStores();
116
270
  break;
117
271
  }
118
272
 
273
+ case "mcp": {
274
+ const { runMcpCommand } = await import(join(distDir, "cli", "commands", "mcp.js"));
275
+ await runMcpCommand(positionals.slice(1));
276
+ break;
277
+ }
278
+
279
+ case "doctor": {
280
+ const { runDoctor } = await import(join(distDir, "cli", "commands", "doctor.js"));
281
+ await runDoctor();
282
+ break;
283
+ }
284
+
285
+ case "config": {
286
+ const { runConfigCommand } = await import(join(distDir, "cli", "commands", "config-cmd.js"));
287
+ await runConfigCommand(positionals.slice(1), flags);
288
+ break;
289
+ }
290
+
291
+ case "init": {
292
+ const { runInit } = await import(join(distDir, "cli", "commands", "init.js"));
293
+ await runInit();
294
+ break;
295
+ }
296
+
297
+ case "serve": {
298
+ const { runServeMode } = await import(join(distDir, "cli", "serve-mode.js"));
299
+ await runServeMode({
300
+ port: flags.port ? parseInt(flags.port, 10) : 3847,
301
+ host: flags.host || "127.0.0.1",
302
+ ...buildOptions(),
303
+ });
304
+ break;
305
+ }
306
+
119
307
  default:
120
308
  console.error(`Unknown command: ${command}`);
121
309
  console.error(`Run 'whale help' for usage.`);
package/dist/cli/app.d.ts CHANGED
@@ -3,9 +3,24 @@
3
3
  *
4
4
  * Dynamic imports for each mode — keeps MCP server path clean.
5
5
  */
6
+ export interface ChatOptions {
7
+ model?: string;
8
+ permissionMode?: string;
9
+ resumeSessionId?: string;
10
+ continueLastSession?: boolean;
11
+ sessionId?: string;
12
+ maxTurns?: number;
13
+ maxBudgetUsd?: number;
14
+ effort?: string;
15
+ allowedTools?: string[];
16
+ disallowedTools?: string[];
17
+ fallbackModel?: string;
18
+ debug?: boolean;
19
+ verbose?: boolean;
20
+ }
6
21
  export declare function renderLogin(): Promise<void>;
7
22
  export declare function renderLogout(): Promise<void>;
8
- export declare function renderChat(): Promise<void>;
23
+ export declare function renderChat(options?: ChatOptions): Promise<void>;
9
24
  export declare function renderSetup(): Promise<void>;
10
25
  export declare function renderStatus(): Promise<void>;
11
26
  export declare function renderStores(): Promise<void>;
package/dist/cli/app.js CHANGED
@@ -15,9 +15,18 @@ export async function renderLogout() {
15
15
  console.log("Logged out. Tokens cleared.");
16
16
  }
17
17
  }
18
- export async function renderChat() {
18
+ export async function renderChat(options) {
19
19
  const { matrixIntro } = await import("./shared/MatrixIntro.js");
20
20
  await matrixIntro();
21
+ // Apply options before starting chat
22
+ if (options?.model || options?.permissionMode) {
23
+ const agentLoop = await import("./services/agent-loop.js");
24
+ if (options.model)
25
+ agentLoop.setModel(options.model);
26
+ if (options.permissionMode) {
27
+ agentLoop.setPermissionMode(options.permissionMode);
28
+ }
29
+ }
21
30
  const { ChatApp } = await import("./chat/ChatApp.js");
22
31
  const { waitUntilExit } = render(_jsx(ChatApp, {}));
23
32
  await waitUntilExit();
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * ChatApp — whale code CLI
3
3
  *
4
- * Clean, Apple-polished chat interface.
5
- * Minimal header, generous spacing, subtle status.
4
+ * Uses Ink's <Static> for completed messages — written to stdout once,
5
+ * never re-rendered. Only the active area (streaming, tools, input)
6
+ * is managed by Ink's render loop. This prevents scroll bounce when
7
+ * content exceeds the terminal height.
6
8
  */
7
9
  export declare function ChatApp(): import("react/jsx-runtime").JSX.Element;