tachibot-mcp 2.24.0 → 2.26.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 (42) hide show
  1. package/README.md +48 -50
  2. package/dist/src/cli/init.js +125 -0
  3. package/dist/src/orchestrators/collaborative/services/visualization/VisualizationService.js +32 -59
  4. package/dist/src/profiles/balanced.js +4 -1
  5. package/dist/src/profiles/code_focus.js +4 -1
  6. package/dist/src/profiles/full.js +4 -1
  7. package/dist/src/profiles/heavy_coding.js +4 -1
  8. package/dist/src/profiles/minimal.js +3 -0
  9. package/dist/src/profiles/research_power.js +3 -0
  10. package/dist/src/server-main.js +760 -0
  11. package/dist/src/server.js +11 -758
  12. package/dist/src/tools/debug-triage-tool.js +59 -0
  13. package/dist/src/tools/prompt-technique-tools.js +128 -33
  14. package/dist/src/tools/provider-catalog.js +8 -0
  15. package/dist/src/tools/refine-prompt-tool.js +57 -0
  16. package/dist/src/tools/registry.js +9 -0
  17. package/dist/src/tools/spec-writer-tool.js +64 -0
  18. package/dist/src/tools/tachi-tool.js +22 -0
  19. package/docs/TOOLS_REFERENCE.md +1183 -1068
  20. package/docs/TOOL_PARAMETERS.md +95 -424
  21. package/docs/TOOL_PROFILES.md +139 -140
  22. package/docs/plans/infra-plan-2026-07-research.json +194 -0
  23. package/docs/plans/infra-plan-2026-07.html +292 -0
  24. package/docs/superpowers/plans/2026-07-02-debug-triage-spec-writer.md +417 -0
  25. package/docs/superpowers/plans/2026-07-02-install-wave.md +412 -0
  26. package/docs/superpowers/plans/2026-07-03-refine-prompt.md +197 -0
  27. package/package.json +1 -1
  28. package/profiles/balanced.json +4 -1
  29. package/profiles/code_focus.json +4 -1
  30. package/profiles/full.json +4 -1
  31. package/profiles/heavy_coding.json +4 -1
  32. package/profiles/minimal.json +3 -0
  33. package/profiles/research_power.json +3 -0
  34. package/skills/judge/SKILL.md +1 -1
  35. package/skills/prompt/SKILL.md +40 -124
  36. package/skills/redteam/SKILL.md +1 -1
  37. package/skills/review/SKILL.md +1 -1
  38. package/skills/setup/SKILL.md +13 -0
  39. package/skills/spec/SKILL.md +15 -0
  40. package/skills/tachi/SKILL.md +1 -1
  41. package/skills/triage/SKILL.md +15 -0
  42. package/tools.config.json +2 -1
package/README.md CHANGED
@@ -4,18 +4,18 @@
4
4
 
5
5
  ### Multi-Model AI Orchestration Platform
6
6
 
7
- [![Version](https://img.shields.io/badge/version-2.24.0-blue.svg)](https://www.npmjs.com/package/tachibot-mcp)
8
- [![Tools](https://img.shields.io/badge/tools-61_active-brightgreen.svg)](#-tool-ecosystem-61-tools)
7
+ [![Version](https://img.shields.io/badge/version-2.26.0-blue.svg)](https://www.npmjs.com/package/tachibot-mcp)
8
+ [![Tools](https://img.shields.io/badge/tools-64_active-brightgreen.svg)](#-tool-ecosystem-64-tools)
9
9
  [![License](https://img.shields.io/badge/license-AGPL--3.0-green.svg)](LICENSE)
10
10
  [![Node](https://img.shields.io/badge/node-%3E%3D22.0.0-brightgreen.svg)](https://nodejs.org)
11
11
  [![MCP](https://img.shields.io/badge/MCP-Compatible-purple.svg)](https://modelcontextprotocol.io)
12
12
 
13
- **61 AI tools. 12 providers. One protocol.**
13
+ **64 AI tools. 12 providers. One protocol.**
14
14
 
15
15
  Orchestrate Perplexity, Grok, GPT-5.5, Gemini, Qwen, Kimi K2.7-Code, and MiniMax M3
16
16
  from Claude Code, Claude Desktop, Cursor, or any MCP client.
17
17
 
18
- [Get Started](#-quick-start) · [View Tools](#-tool-ecosystem-61-tools) · [Documentation](https://tachibot.com/docs)
18
+ [Get Started](#-quick-start) · [View Tools](#-tool-ecosystem-64-tools) · [Documentation](https://tachibot.com/docs)
19
19
 
20
20
  <br>
21
21
 
@@ -28,52 +28,39 @@ from Claude Code, Claude Desktop, Cursor, or any MCP client.
28
28
 
29
29
  ---
30
30
 
31
- ## What's New in v2.15.0
31
+ ## What's New in v2.26.0
32
32
 
33
- ### `/blueprint` Skill &mdash; Multi-Model Implementation Planning
34
- New skill that creates bite-sized TDD implementation plans using a 7-step multi-model council:
35
- ```
36
- /blueprint add OAuth with refresh tokens
37
- ```
38
- Pipeline: Grok search → Qwen+Kimi analysis → Kimi decompose → GPT pre-mortem critique → Gemini final judgment → **bite-sized TDD output** (exact files, test-first steps, commit points).
39
-
40
- Bridges `planner_maker`'s multi-model intelligence with the `writing-plans` execution format.
33
+ ### Prompt stack, modernized
34
+ - **`refine_prompt`** (new tool) &mdash; opt-in prompt improver on a cheap/fast model: raw query → goal-first brief + **what changed** + **open questions**. Never auto-fires, never executes anything — you review, then use the brief. In Claude Code, `/prompt refine` presents the open questions as clickable choices and merges your answers into a final brief.
35
+ - **Curated technique list** &mdash; `list_prompt_techniques` now defaults to the ~9 core techniques that still help 2026 reasoning models (output contracts like `scot`, `pre_mortem`, `bdd_spec`); `all=true` for the full 31.
36
+ - **`technique="auto"`** &mdash; `preview_prompt_technique` recommends the right technique for your task, with reasons. Ask `tachi` "improve my prompt" for the symptom-based menu.
41
37
 
42
- ### 31 Prompt Engineering Techniques (was 22)
43
- Added 9 research-backed techniques for coding and decision-making:
38
+ ### Setup, de-mystified
39
+ - **`tachibot init`** (new CLI wizard) &mdash; detects your API keys and clients, prints the exact config for Claude Code and Claude Desktop. Never writes or echoes keys.
40
+ - **One-click Claude Desktop install** &mdash; download the `.mcpb` from the latest release and double-click. No JSON editing.
41
+ - **`doctor`** &mdash; shows which keys are set, which tools are visible vs hidden and why, and what to try first.
44
42
 
45
- | Technique | Source | Category |
46
- |-----------|--------|----------|
47
- | `reflexion` | Shinn et al. 2023 | Engineering |
48
- | `react` (ReAct) | Yao et al. 2022 | Engineering |
49
- | `rubber_duck` | Hunt & Thomas 2008 | Engineering |
50
- | `test_driven` | Beck 2003 | Engineering |
51
- | `scot` (Structured CoT) | Li et al. 2025 (+13.79% HumanEval) | Structured Coding |
52
- | `pre_post` (Contracts) | Empirical SE 2025 | Structured Coding |
53
- | `bdd_spec` (Given/When/Then) | BDD 2025 | Structured Coding |
54
- | `least_to_most` | Zhou et al. 2022 | Research |
55
- | `pre_mortem` | Klein 2007 | Decision |
43
+ ### New tools & skills (64 tools · 17 skills)
44
+ - `debug_triage` &mdash; ranked root-cause hypotheses with the cheapest discriminating check for each (Grok 4.3)
45
+ - `spec_writer` &mdash; loose request reviewable spec: user stories, Given/When/Then, out-of-scope, open questions (GPT-5.5)
46
+ - `diff_review` / `plan_critique` / `testgen` / `security_review` &mdash; multi-model diff review, adversarial plan red-team, test generation, OWASP/CWE audit
47
+ - Skills: `/review`, `/redteam`, `/spec`, `/triage`, `/setup`
56
48
 
57
- Techniques are embedded directly in tool system prompts for automatic application.
58
-
59
- ### MiniMax M2.5 Upgrade
60
- - `minimax_code` &mdash; SWE-Bench **80.2%**, per-task TECHNIQUE tags (SCoT, reflexion, rubber_duck), per-task temperatures
61
- - `minimax_agent` &mdash; ReAct + least-to-most decomposition protocol, HALT criteria
62
-
63
- ### Enhanced Skills
64
- - `/breakdown` &mdash; now uses `least_to_most` ordering + `pre_mortem` failure analysis
65
- - `/judge` &mdash; first judge now runs pre-mortem ("assume this FAILED")
66
- - `/decompose` &mdash; deep-dives include pre/post contracts per sub-problem
67
- - `/prompt` &mdash; auto-recommend flow with 30-intent matching guide, 13 categories
49
+ ### Fixes
50
+ - `focus` orchestration screen: 37 lines of repeated scaffolding → 10 focused lines
51
+ - `npm test` exits 0 again (uncancelled race timers leaked past Jest teardown)
52
+ - GPT-5.5 high-effort reasoning no longer cut off at 3 minutes (timeout 180s → 600s)
68
53
 
69
54
  ---
70
55
 
71
56
  ## Skills (Claude Code)
72
57
 
73
- TachiBot ships with 14 slash commands for Claude Code. These orchestrate the tools into powerful workflows:
58
+ TachiBot ships with 17 slash commands for Claude Code. These orchestrate the tools into powerful workflows:
74
59
 
75
60
  | Skill | What it does | Example |
76
61
  |-------|-------------|---------|
62
+ | `/setup` | Guided configuration — runs doctor, walks through keys/profiles | `/setup` |
63
+ | `/spec` | Request → reviewable spec before planning | `/spec add OAuth somehow` |
77
64
  | `/blueprint` | Multi-model planning → bite-sized TDD steps | `/blueprint add OAuth with refresh tokens` |
78
65
  | `/judge` | Multi-model council - parallel analysis with synthesis | `/judge how to implement rate limiting` |
79
66
  | `/think` | Sequential reasoning chain with any model | `/think grok,gemini design a cache layer` |
@@ -87,6 +74,7 @@ TachiBot ships with 14 slash commands for Claude Code. These orchestrate the too
87
74
  | `/tot` | Tree-of-Thought: branch → jury-prune → synthesize | `/tot design a rate limiter` |
88
75
  | `/review` | Multi-model diff review — panel + Gemini judge verdict | `/review` (or paste a diff) |
89
76
  | `/redteam` | Adversarial plan red-team — pre-mortem, risks, plan edits | `/redteam <paste plan>` |
77
+ | `/triage` | Ranked root-cause bug triage | `/triage <paste stack trace>` |
90
78
  | `/tachi` | Help - see available skills, tools, key status | `/tachi` |
91
79
 
92
80
  Skills automatically adapt to your configured API keys. Even with just 1-2 providers, all skills work.
@@ -98,7 +86,7 @@ Skills automatically adapt to your configured API keys. Even with just 1-2 provi
98
86
  ## Key Features
99
87
 
100
88
  ### Multi-Model Intelligence
101
- - **61 AI Tools** across 12 providers &mdash; Perplexity, Grok, GPT-5, Gemini, Qwen, Kimi, MiniMax, DeepSeek, GLM (Zhipu), StepFun, ERNIE (Baidu), plus free local models (Ollama / LM Studio / llama.cpp / vLLM)
89
+ - **64 AI Tools** across 12 providers &mdash; Perplexity, Grok, GPT-5, Gemini, Qwen, Kimi, MiniMax, DeepSeek, GLM (Zhipu), StepFun, ERNIE (Baidu), plus free local models (Ollama / LM Studio / llama.cpp / vLLM)
102
90
  - **Gemini 3.5 Flash** (`gemini-3.5-flash`, GA May 19 2026) &mdash; Flash/search tier; reasoning default stays `gemini-3.1-pro-preview`
103
91
  - **Multi-Model Council** &mdash; planner_maker synthesizes plans from 5+ models into bite-sized TDD steps
104
92
  - **Smart Routing** &mdash; Automatic model selection for optimal results
@@ -115,10 +103,10 @@ Skills automatically adapt to your configured API keys. Even with just 1-2 provi
115
103
  |---------|-------|----------|
116
104
  | **Minimal** | 13 | Quick tasks, low token budget |
117
105
  | **Research Power** | 35 | Deep investigation, multi-source |
118
- | **Code Focus** | 39 | Software development, SWE tasks |
119
- | **Balanced** | 50 | General-purpose, mixed workflows |
120
- | **Heavy Coding** | 54 | Max code tools + agentic workflows |
121
- | **Full** (default) | 61 | Everything enabled |
106
+ | **Code Focus** | 42 | Software development, SWE tasks |
107
+ | **Balanced** | 53 | General-purpose, mixed workflows |
108
+ | **Heavy Coding** | 57 | Max code tools + agentic workflows |
109
+ | **Full** (default) | 64 | Everything enabled |
122
110
 
123
111
  ### Developer Experience
124
112
  - **Claude Code** &mdash; First-class support
@@ -136,6 +124,14 @@ Skills automatically adapt to your configured API keys. Even with just 1-2 provi
136
124
  npm install -g tachibot-mcp
137
125
  ```
138
126
 
127
+ ### Setup wizard
128
+
129
+ ```bash
130
+ npx -y -p tachibot-mcp tachibot init
131
+ ```
132
+
133
+ Detects your keys and clients, then prints the exact config for Claude Code and Claude Desktop.
134
+
139
135
  ### Claude Code (one-liner)
140
136
 
141
137
  ```bash
@@ -146,6 +142,8 @@ Then verify with `/mcp`. Add API keys with `--env`, e.g. `--env OPENROUTER_API_K
146
142
 
147
143
  ### Setup (Claude Desktop)
148
144
 
145
+ **One-click (easiest):** download [`tachibot-mcp.mcpb`](https://github.com/byPawel/tachibot-mcp/releases/latest) from the latest release and double-click it — Claude Desktop installs the extension with no JSON editing. Add your API keys when prompted (or later via the extension settings).
146
+
149
147
  **Gateway Mode (Recommended)** &mdash; 2 keys, all providers:
150
148
 
151
149
  ```json
@@ -188,16 +186,16 @@ See [Installation Guide](docs/INSTALLATION_BOTH.md) for detailed instructions.
188
186
 
189
187
  ---
190
188
 
191
- ## Tool Ecosystem (61 Tools)
189
+ ## Tool Ecosystem (64 Tools)
192
190
 
193
191
  ### Research & Search (5)
194
192
  `perplexity_ask` &#183; `perplexity_reason` &#183; `grok_search` &#183; `openai_search` &#183; `gemini_search`
195
193
 
196
- ### Reasoning & Planning (13)
197
- `grok_reason` &#183; `openai_reason` &#183; `qwen_reason` &#183; `qwq_reason` &#183; `kimi_thinking` &#183; `kimi_decompose` &#183; `deepseek_reason` &#183; `glm_reason` &#183; `stepfun_reason` &#183; `ernie_reason` &#183; `planner_maker` &#183; `planner_runner` &#183; `list_plans`
194
+ ### Reasoning & Planning (14)
195
+ `grok_reason` &#183; `openai_reason` &#183; `qwen_reason` &#183; `qwq_reason` &#183; `kimi_thinking` &#183; `kimi_decompose` &#183; `deepseek_reason` &#183; `glm_reason` &#183; `stepfun_reason` &#183; `ernie_reason` &#183; `planner_maker` &#183; `planner_runner` &#183; `list_plans` &#183; `spec_writer`
198
196
 
199
- ### Code Intelligence (10)
200
- `kimi_code` &#183; `grok_code` &#183; `grok_debug` &#183; `qwen_coder` &#183; `qwen_algo` &#183; `qwen_competitive` &#183; `deepseek_algo` &#183; `minimax_code` &#183; `minimax_agent` &#183; `testgen`
197
+ ### Code Intelligence (11)
198
+ `kimi_code` &#183; `grok_code` &#183; `grok_debug` &#183; `qwen_coder` &#183; `qwen_algo` &#183; `qwen_competitive` &#183; `deepseek_algo` &#183; `minimax_code` &#183; `minimax_agent` &#183; `testgen` &#183; `debug_triage`
201
199
 
202
200
  ### Analysis & Judgment (14)
203
201
  `gemini_analyze_text` &#183; `gemini_analyze_code` &#183; `gemini_judge` &#183; `jury` &#183; `diff_review` &#183; `plan_critique` &#183; `gemini_brainstorm` &#183; `openai_brainstorm` &#183; `openai_code_review` &#183; `openai_explain` &#183; `grok_brainstorm` &#183; `grok_architect` &#183; `security_review` &#183; `kimi_long_context`
@@ -208,8 +206,8 @@ See [Installation Guide](docs/INSTALLATION_BOTH.md) for detailed instructions.
208
206
  ### Workflows (9)
209
207
  `workflow` &#183; `workflow_start` &#183; `continue_workflow` &#183; `list_workflows` &#183; `create_workflow` &#183; `visualize_workflow` &#183; `workflow_status` &#183; `validate_workflow` &#183; `validate_workflow_file`
210
208
 
211
- ### Prompt Engineering (3)
212
- `list_prompt_techniques` &#183; `preview_prompt_technique` &#183; `execute_prompt_technique`
209
+ ### Prompt Engineering (4)
210
+ `list_prompt_techniques` &#183; `preview_prompt_technique` &#183; `execute_prompt_technique` &#183; `refine_prompt`
213
211
 
214
212
  ### Local Models (1)
215
213
  `local_query` &mdash; any OpenAI-compatible local server (Ollama / LM Studio / llama.cpp / vLLM). Zero-cost, offline, private; also available as the `local` jury juror (`hermes` is accepted as a legacy alias). Runs whatever `LOCAL_LLM_MODEL` points at &mdash; e.g. a Nous Hermes build (`ollama pull hermes3`). Note the [Hermes agent](https://hermes-agent.nousresearch.com) itself is model-agnostic &mdash; it runs on 300+ backends (GPT, Claude, Gemini, DeepSeek, or self-hosted Ollama/vLLM) &mdash; so "Hermes" was never a guarantee of distinct weights.
@@ -0,0 +1,125 @@
1
+ /**
2
+ * `tachibot init` — setup wizard. Detection + emission first: pure functions
3
+ * detect keys/clients and emit EXACT per-client instructions; a thin
4
+ * readline layer only picks the client. Keys are never written to disk by
5
+ * default and never echoed (masked to 6 chars). Node built-ins only.
6
+ */
7
+ import * as fs from "node:fs";
8
+ import * as os from "node:os";
9
+ import * as path from "node:path";
10
+ import * as readline from "node:readline/promises";
11
+ const KEYS = [
12
+ { name: "OpenRouter", envVar: "OPENROUTER_API_KEY", unlocks: "DeepSeek/GLM/Kimi/Qwen/MiniMax/StepFun/ERNIE + planner (~30 tools)" },
13
+ { name: "Perplexity", envVar: "PERPLEXITY_API_KEY", unlocks: "web research tools" },
14
+ { name: "Gemini / Google", envVar: "GOOGLE_API_KEY", unlocks: "Gemini tools + jury judge + diff_review/plan_critique" },
15
+ { name: "OpenAI", envVar: "OPENAI_API_KEY", unlocks: "GPT-5.5 tools + spec_writer" },
16
+ { name: "Grok / xAI", envVar: "GROK_API_KEY", unlocks: "Grok tools + debug_triage" },
17
+ ];
18
+ function defaultProbe() {
19
+ return {
20
+ // PATH lookup done via fs, not a subprocess: no shell involved, no injection surface.
21
+ which: (bin) => {
22
+ const dirs = (process.env.PATH || "").split(path.delimiter).filter(Boolean);
23
+ const exts = process.platform === "win32" ? [".exe", ".cmd", ".bat", ""] : [""];
24
+ return dirs.some((dir) => exts.some((ext) => {
25
+ try {
26
+ return fs.statSync(path.join(dir, bin + ext)).isFile();
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }));
32
+ },
33
+ exists: (p) => fs.existsSync(p),
34
+ };
35
+ }
36
+ function desktopConfigPath() {
37
+ if (process.platform === "darwin") {
38
+ return path.join(os.homedir(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
39
+ }
40
+ if (process.platform === "win32") {
41
+ return path.join(process.env.APPDATA || "", "Claude", "claude_desktop_config.json");
42
+ }
43
+ return path.join(os.homedir(), ".config", "Claude", "claude_desktop_config.json");
44
+ }
45
+ export function detectSetup(env = process.env, probe = defaultProbe()) {
46
+ const keys = KEYS.map((k) => ({
47
+ name: k.name,
48
+ envVar: k.envVar,
49
+ present: Boolean(env[k.envVar]?.trim()),
50
+ unlocks: k.unlocks,
51
+ }));
52
+ // Gemini/Grok alternates count as present
53
+ const alt = (primary, alternate) => {
54
+ const row = keys.find((k) => k.envVar === primary);
55
+ if (!row.present && env[alternate]?.trim())
56
+ row.present = true;
57
+ };
58
+ alt("GOOGLE_API_KEY", "GEMINI_API_KEY");
59
+ alt("GROK_API_KEY", "XAI_API_KEY");
60
+ const dcp = desktopConfigPath();
61
+ return {
62
+ keys,
63
+ clients: {
64
+ claudeCode: probe.which("claude"),
65
+ claudeDesktop: probe.exists(dcp),
66
+ desktopConfigPath: probe.exists(dcp) ? dcp : null,
67
+ },
68
+ };
69
+ }
70
+ export function buildClaudeCodeCommand(setup) {
71
+ const envFlags = setup.keys
72
+ .filter((k) => k.present)
73
+ .map((k) => `--env ${k.envVar}=<your-${k.name.toLowerCase().replace(/[^a-z]+/g, "-")}-key>`)
74
+ .join(" \\\n ");
75
+ return [
76
+ "claude mcp add tachibot \\",
77
+ envFlags ? ` ${envFlags} \\` : null,
78
+ " -- npx -y -p tachibot-mcp tachibot",
79
+ ].filter(Boolean).join("\n");
80
+ }
81
+ export function buildDesktopSnippet(setup, profile) {
82
+ const env = {};
83
+ for (const k of setup.keys.filter((k) => k.present))
84
+ env[k.envVar] = `<your-${k.envVar}>`;
85
+ env.TACHIBOT_PROFILE = profile;
86
+ return JSON.stringify({ mcpServers: { tachibot: { command: "tachibot", env } } }, null, 2);
87
+ }
88
+ const mask = (v) => (v ? `${v.slice(0, 6)}…` : "");
89
+ export async function runInitWizard() {
90
+ const setup = detectSetup();
91
+ const out = (s) => process.stdout.write(s + "\n");
92
+ out("\nTACHIBOT INIT\n=============");
93
+ out("\nAPI keys detected in this shell:");
94
+ for (const k of setup.keys) {
95
+ out(` ${k.present ? "✓" : "✗"} ${k.name} (${k.envVar})${k.present ? ` ${mask(process.env[k.envVar])}` : ""} — ${k.unlocks}`);
96
+ }
97
+ if (!setup.keys.some((k) => k.present)) {
98
+ out("\nNo keys found. Get ONE key to start — OPENROUTER_API_KEY unlocks the most tools (openrouter.ai).");
99
+ }
100
+ out("\nClients detected:");
101
+ out(` ${setup.clients.claudeCode ? "✓" : "✗"} Claude Code (claude on PATH)`);
102
+ out(` ${setup.clients.claudeDesktop ? "✓" : "✗"} Claude Desktop${setup.clients.desktopConfigPath ? ` (${setup.clients.desktopConfigPath})` : ""}`);
103
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
104
+ try {
105
+ const choice = (await rl.question("\nSet up for: [1] Claude Code [2] Claude Desktop [3] both [q] quit > ")).trim();
106
+ if (choice === "q")
107
+ return;
108
+ const profile = (await rl.question("Profile [full=all 63 tools | balanced | code_focus] (default: full) > ")).trim() || "full";
109
+ if (choice === "1" || choice === "3") {
110
+ out("\n— Claude Code — run this (fill in your real keys):\n");
111
+ out(buildClaudeCodeCommand(setup));
112
+ out("\nThen verify with /mcp inside Claude Code.");
113
+ }
114
+ if (choice === "2" || choice === "3") {
115
+ out("\n— Claude Desktop — easiest: double-click the tachibot-mcp.mcpb extension package (see GitHub releases).");
116
+ out("Or merge this into " + (setup.clients.desktopConfigPath ?? desktopConfigPath()) + ":\n");
117
+ out(buildDesktopSnippet(setup, profile));
118
+ out("\nThen restart Claude Desktop.");
119
+ }
120
+ out("\nFirst thing to run once connected: the `doctor` tool — it shows which tools your keys unlock.");
121
+ }
122
+ finally {
123
+ rl.close();
124
+ }
125
+ }
@@ -1,14 +1,18 @@
1
- import { ReasoningMode, REASONING_TEMPLATES, MODEL_PERSONAS } from "../../../../reasoning-chain.js";
2
- const renderWorkflowCascade = (steps, title) => {
3
- const lines = [`## ${title}`];
4
- steps.forEach((s, i) => lines.push(`${i + 1}. [${s.status}] ${s.name} (${s.model})`));
5
- return lines.join('\n');
6
- };
7
- const renderProgressReel = (phases, title) => {
8
- const lines = [`## ${title}`];
9
- phases.forEach(p => lines.push(`- [${p.status}] ${p.name}`));
10
- return lines.join('\n');
11
- };
1
+ import { ReasoningMode, REASONING_TEMPLATES } from "../../../../reasoning-chain.js";
2
+ // import {
3
+ // renderWorkflowCascade,
4
+ // renderProgressReel,
5
+ // renderThinkingChainArbor,
6
+ // renderGradientDivider,
7
+ // renderGradientBorderBox,
8
+ // renderTable,
9
+ // renderKeyValueTable,
10
+ // renderQuickFlow,
11
+ // icons,
12
+ // WorkflowStep,
13
+ // ProgressPhase,
14
+ // } from "../../../../utils/ink-renderer.js";
15
+ // Ink disabled — MCP clients render markdown, so these emit plain markdown.
12
16
  const renderThinkingChainArbor = (thoughts, title) => {
13
17
  const lines = [`## ${title}`];
14
18
  thoughts.forEach((t, i) => lines.push(`${i + 1}. (${t.model}) ${t.thought}`));
@@ -30,9 +34,6 @@ const renderTable = (data) => {
30
34
  const renderKeyValueTable = (data) => {
31
35
  return Object.entries(data).map(([k, v]) => `${k}: ${v}`).join('\n');
32
36
  };
33
- const renderQuickFlow = (steps, title) => {
34
- return `## ${title}\n${steps.join(' -> ')}`;
35
- };
36
37
  const icons = {
37
38
  brain: '*',
38
39
  sparkle: '*',
@@ -52,54 +53,26 @@ export class VisualizationService {
52
53
  */
53
54
  generateOrchestrationPlan(session) {
54
55
  const steps = session.chain.steps;
56
+ const done = session.currentStep;
57
+ // One clean header line + a per-step table. The old layout rendered the
58
+ // same step list four times (cascade, flow, progress reel, table) plus a
59
+ // metadata block and faux "gradient" boxes — a wall of duplicated scaffold.
60
+ // MCP clients render markdown, so a single table IS the visualization.
55
61
  const lines = [];
56
- // Header with gradient border box
57
- lines.push(renderGradientBorderBox(`${icons.brain} Collaborative Reasoning\n\n${session.objective}\n\nDomain: ${session.domain} | Session: ${session.id.slice(0, 8)}`, { width: 60, gradient: 'cristal' }));
58
- lines.push('');
59
- // Workflow cascade showing model flow
60
- const cascadeSteps = steps.map((step, idx) => ({
61
- name: `${this.getModeIcon(step.mode)} ${step.mode}`,
62
- model: step.model,
63
- status: idx < session.currentStep ? 'completed' :
64
- idx === session.currentStep ? 'running' : 'pending',
65
- duration: idx < session.currentStep ? 1000 + Math.random() * 2000 : undefined,
66
- }));
67
- lines.push(renderWorkflowCascade(cascadeSteps, 'Reasoning Chain'));
62
+ lines.push(`**Collaborative Reasoning** · ${session.objective}`);
63
+ lines.push(`${session.domain} · ${this.modelTurnTaking ? 'sequential' : 'parallel'} · ` +
64
+ `step ${Math.min(done + 1, steps.length)}/${steps.length} · \`${session.id.slice(0, 8)}\``);
68
65
  lines.push('');
69
- // Quick flow diagram
70
- const flowSteps = steps.map(s => `${s.model}: ${s.mode}`);
71
- lines.push(renderQuickFlow(flowSteps, 'Execution Flow'));
72
- lines.push('');
73
- // Progress reel
74
- const progressSteps = steps.map((step, idx) => ({
75
- name: `${step.model} - ${step.mode}`,
76
- status: idx < session.currentStep ? 'completed' :
77
- idx === session.currentStep ? 'active' : 'pending',
66
+ // One table: status · mode · model, in order. The mode already conveys each
67
+ // step's job, so no "Role" column (its half-filled "AI" fallback is the bit
68
+ // that read as generic). Status marks done (✓) / current (▸) / pending (·).
69
+ const tableData = steps.map((step, idx) => ({
70
+ '#': String(idx + 1),
71
+ '': idx < done ? '✓' : idx === done ? '▸' : '·',
72
+ Step: `${this.getModeIcon(step.mode)} ${step.mode}`,
73
+ Model: step.model,
78
74
  }));
79
- lines.push(renderProgressReel(progressSteps, 'Step Progress'));
80
- lines.push('');
81
- // Detailed steps table
82
- const tableData = steps.map((step, idx) => {
83
- const persona = Object.values(MODEL_PERSONAS).find(p => p.model === step.model);
84
- return {
85
- '#': String(idx + 1),
86
- Mode: `${this.getModeIcon(step.mode)} ${step.mode}`,
87
- Model: step.model,
88
- Role: persona?.role || 'AI',
89
- Status: idx < session.currentStep ? '✓' : idx === session.currentStep ? '⟳' : '○',
90
- };
91
- });
92
75
  lines.push(renderTable(tableData));
93
- lines.push('');
94
- // Session info
95
- lines.push(renderKeyValueTable({
96
- 'Session ID': session.id,
97
- 'Total Steps': String(steps.length),
98
- 'Current Step': String(session.currentStep + 1),
99
- 'Turn Taking': this.modelTurnTaking ? 'Sequential' : 'Parallel',
100
- }));
101
- lines.push('');
102
- lines.push(renderGradientDivider(60, 'rainbow'));
103
76
  return lines.join('\n');
104
77
  }
105
78
  /**
@@ -112,7 +85,7 @@ export class VisualizationService {
112
85
  const currentMode = currentStep?.mode || ReasoningMode.BRAINSTORM;
113
86
  const lines = [];
114
87
  // Thinking chain visualization
115
- const thoughts = session.chain.steps.slice(0, stage + 1).map((step, idx) => ({
88
+ const thoughts = session.chain.steps.slice(0, stage + 1).map((step) => ({
116
89
  thought: `${step.mode}: ${step.prompt.slice(0, 50)}...`,
117
90
  model: step.model,
118
91
  isRevision: step.mode === ReasoningMode.CRITIQUE,
@@ -1,5 +1,5 @@
1
1
  export const balancedProfile = {
2
- description: "Balanced set for general use (50 tools)",
2
+ description: "Balanced set for general use (53 tools)",
3
3
  tools: {
4
4
  think: true,
5
5
  focus: true,
@@ -12,6 +12,7 @@ export const balancedProfile = {
12
12
  grok_reason: true,
13
13
  grok_code: true,
14
14
  grok_debug: false,
15
+ debug_triage: true,
15
16
  grok_architect: false,
16
17
  grok_brainstorm: false,
17
18
  grok_search: true,
@@ -20,6 +21,8 @@ export const balancedProfile = {
20
21
  openai_code_review: false,
21
22
  openai_explain: false,
22
23
  openai_search: true,
24
+ spec_writer: true,
25
+ refine_prompt: true,
23
26
  gemini_brainstorm: true,
24
27
  gemini_analyze_code: true,
25
28
  gemini_analyze_text: true,
@@ -1,5 +1,5 @@
1
1
  export const codeFocusProfile = {
2
- description: "Code-heavy work with debugging and analysis (39 tools)",
2
+ description: "Code-heavy work with debugging and analysis (42 tools)",
3
3
  tools: {
4
4
  think: true,
5
5
  focus: true,
@@ -12,6 +12,7 @@ export const codeFocusProfile = {
12
12
  grok_reason: true,
13
13
  grok_code: true,
14
14
  grok_debug: true,
15
+ debug_triage: true,
15
16
  grok_architect: false,
16
17
  grok_brainstorm: false,
17
18
  grok_search: false,
@@ -20,6 +21,8 @@ export const codeFocusProfile = {
20
21
  openai_code_review: true,
21
22
  openai_explain: false,
22
23
  openai_search: false,
24
+ spec_writer: true,
25
+ refine_prompt: true,
23
26
  gemini_brainstorm: true,
24
27
  gemini_analyze_code: true,
25
28
  gemini_analyze_text: false,
@@ -1,5 +1,5 @@
1
1
  export const fullProfile = {
2
- description: "Default profile — all tools enabled for maximum capability (61 tools)",
2
+ description: "Default profile — all tools enabled for maximum capability (64 tools)",
3
3
  tools: {
4
4
  think: true,
5
5
  focus: true,
@@ -12,6 +12,7 @@ export const fullProfile = {
12
12
  grok_reason: true,
13
13
  grok_code: true,
14
14
  grok_debug: true,
15
+ debug_triage: true,
15
16
  grok_architect: true,
16
17
  grok_brainstorm: true,
17
18
  grok_search: true,
@@ -20,6 +21,8 @@ export const fullProfile = {
20
21
  openai_code_review: true,
21
22
  openai_explain: true,
22
23
  openai_search: true,
24
+ spec_writer: true,
25
+ refine_prompt: true,
23
26
  gemini_brainstorm: true,
24
27
  gemini_analyze_code: true,
25
28
  gemini_analyze_text: true,
@@ -1,5 +1,5 @@
1
1
  export const heavyCodingProfile = {
2
- description: "Heavy coding with all reasoning & code tools (54 tools)",
2
+ description: "Heavy coding with all reasoning & code tools (57 tools)",
3
3
  tools: {
4
4
  // Core reasoning - all enabled
5
5
  think: true,
@@ -15,6 +15,7 @@ export const heavyCodingProfile = {
15
15
  grok_reason: true,
16
16
  grok_code: true,
17
17
  grok_debug: true,
18
+ debug_triage: true,
18
19
  grok_architect: true,
19
20
  grok_brainstorm: true,
20
21
  grok_search: true,
@@ -24,6 +25,8 @@ export const heavyCodingProfile = {
24
25
  openai_code_review: true,
25
26
  openai_explain: true,
26
27
  openai_search: true,
28
+ spec_writer: true,
29
+ refine_prompt: true,
27
30
  // Gemini - all enabled
28
31
  gemini_brainstorm: true,
29
32
  gemini_analyze_code: true,
@@ -12,6 +12,7 @@ export const minimalProfile = {
12
12
  grok_reason: true,
13
13
  grok_code: false,
14
14
  grok_debug: false,
15
+ debug_triage: false,
15
16
  grok_architect: false,
16
17
  grok_brainstorm: false,
17
18
  grok_search: false,
@@ -20,6 +21,8 @@ export const minimalProfile = {
20
21
  openai_code_review: false,
21
22
  openai_explain: false,
22
23
  openai_search: false,
24
+ spec_writer: false,
25
+ refine_prompt: false,
23
26
  gemini_brainstorm: true,
24
27
  gemini_analyze_code: false,
25
28
  gemini_analyze_text: false,
@@ -12,6 +12,7 @@ export const researchPowerProfile = {
12
12
  grok_reason: true,
13
13
  grok_code: false,
14
14
  grok_debug: false,
15
+ debug_triage: false,
15
16
  grok_architect: false,
16
17
  grok_brainstorm: false,
17
18
  grok_search: true,
@@ -20,6 +21,8 @@ export const researchPowerProfile = {
20
21
  openai_code_review: false,
21
22
  openai_explain: false,
22
23
  openai_search: true,
24
+ spec_writer: false,
25
+ refine_prompt: false,
23
26
  gemini_brainstorm: true,
24
27
  gemini_analyze_code: false,
25
28
  gemini_analyze_text: false,