nodebench-mcp 3.0.2 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # NodeBench MCP
1
+ # NodeBench MCP
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/nodebench-mcp.svg)](https://www.npmjs.com/package/nodebench-mcp)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/nodebench-mcp.svg)](https://www.npmjs.com/package/nodebench-mcp)
@@ -7,28 +7,28 @@
7
7
  [![MCP Compatible](https://img.shields.io/badge/MCP-Compatible-green.svg)](https://modelcontextprotocol.io)
8
8
  [![Default](https://img.shields.io/badge/Default-9%20visible-brightgreen.svg)](https://www.npmjs.com/package/nodebench-mcp)
9
9
 
10
- **Investigate a topic and return a sourced report fast.** NodeBench MCP now defaults to a small workflow facade, with heavier research and admin surfaces moved behind explicit presets.
10
+ **Investigate a topic and return a sourced report fast.** The NodeBench MCP architecture is now split into three install lanes that share one runtime.
11
11
 
12
12
  Default install: `9` visible tools total, including `7` core workflow tools:
13
13
  `investigate`, `compare`, `track`, `summarize`, `search`, `report`, and `ask_context`.
14
14
 
15
15
  ```bash
16
- # Default v3 core workflow surface
16
+ # Core workflow lane
17
17
  claude mcp add nodebench -- npx -y nodebench-mcp
18
18
 
19
- # Extended workflow surface
20
- claude mcp add nodebench -- npx -y nodebench-mcp --preset power
19
+ # Power lane
20
+ claude mcp add nodebench-power -- npx -y nodebench-mcp-power
21
21
 
22
- # Admin/runtime surface
23
- claude mcp add nodebench -- npx -y nodebench-mcp --preset admin --admin
22
+ # Admin lane
23
+ claude mcp add nodebench-admin -- npx -y nodebench-mcp-admin
24
24
  ```
25
25
 
26
26
  ### What's New
27
27
 
28
- - **v3 default surface** the default preset is now a workflow-first facade instead of a tool warehouse.
29
- - **Admin-only runtime gates** dashboards and the observability watchdog no longer start on the default hot path. Use `--admin`, `--dashboards`, or `--watchdog` explicitly.
30
- - **Faster health path** `--health` now loads only the active preset instead of eagerly loading every domain.
31
- - **Power and admin presets** heavier research and operator lanes are still available, but no longer define the front door.
28
+ - **v3 default surface** - the default preset is now a workflow-first facade instead of a tool warehouse.
29
+ - **Admin-only runtime gates** - dashboards and the observability watchdog no longer start on the default hot path. Use `--admin`, `--dashboards`, or `--watchdog` explicitly.
30
+ - **Faster health path** - `--health` now loads only the active preset instead of eagerly loading every domain.
31
+ - **Separate install lanes** - `nodebench-mcp-power` and `nodebench-mcp-admin` are now published companion packages, while `--preset power` and `--preset admin` remain compatible paths on the core package.
32
32
 
33
33
  > **New here?** Read **[AGENT_LOGIC.md](./AGENT_LOGIC.md)** for the complete guide to how NodeBench thinks.
34
34
 
@@ -101,13 +101,13 @@ Production companion spec: [`docs/architecture/UNIFIED_WEB_MCP_PRODUCTION_SPEC.m
101
101
 
102
102
  NodeBench is now a workflow-first MCP. The default install proves one concrete job quickly, and the heavier surfaces are still available when you explicitly ask for them.
103
103
 
104
- ### Presets
104
+ ### Install Lanes And Presets
105
105
 
106
- | Preset | Surface | What it is for |
106
+ | Entry | Surface | What it is for |
107
107
  |---|---|---|
108
- | `default` | `9` visible tools | Workflow-first lane: `investigate`, `compare`, `track`, `summarize`, `search`, `report`, `ask_context`, `discover_tools`, `load_toolset` |
109
- | `power` | expanded workflow surface | Founder, recon, packets, and web-heavy workflows without admin runtime |
110
- | `admin` | operator surface | Profiling, observability, dashboards, eval, and debug-oriented lanes |
108
+ | `nodebench-mcp` | `9` visible tools | Workflow-first lane: `investigate`, `compare`, `track`, `summarize`, `search`, `report`, `ask_context`, `discover_tools`, `load_toolset` |
109
+ | `nodebench-mcp-power` | expanded workflow surface | Founder, recon, packets, and web-heavy workflows without admin runtime |
110
+ | `nodebench-mcp-admin` | operator surface | Profiling, observability, dashboards, eval, and debug-oriented lanes |
111
111
  | `core` | full methodology lane | Verification, eval, learning, recon, execution trace, and mission harness |
112
112
  | `founder` | compatibility preset | Legacy founder-facing pack kept for existing setups |
113
113
  | `full` | all loaded domains | Maximum coverage when you explicitly want the warehouse |
@@ -121,10 +121,16 @@ ASK -> CHECK -> WRITE -> SAVE
121
121
  The default preset is optimized for that loop. It does not start local dashboards or the observability watchdog unless you pass admin flags explicitly.
122
122
 
123
123
  ```bash
124
- # Claude Code
124
+ # Claude Code core lane
125
125
  claude mcp add nodebench -- npx -y nodebench-mcp
126
126
 
127
- # Windsurf / Cursor — add --preset to args in your MCP config when you want more than the default workflow surface
127
+ # Claude Code power lane
128
+ claude mcp add nodebench-power -- npx -y nodebench-mcp-power
129
+
130
+ # Claude Code admin lane
131
+ claude mcp add nodebench-admin -- npx -y nodebench-mcp-admin
132
+
133
+ # Windsurf / Cursor - add --preset to args only when you want a compatibility preset on the core package
128
134
  ```
129
135
 
130
136
  ---
@@ -135,6 +141,8 @@ claude mcp add nodebench -- npx -y nodebench-mcp
135
141
 
136
142
  ```bash
137
143
  claude mcp add nodebench -- npx -y nodebench-mcp
144
+ claude mcp add nodebench-power -- npx -y nodebench-mcp-power
145
+ claude mcp add nodebench-admin -- npx -y nodebench-mcp-admin
138
146
  ```
139
147
 
140
148
  Or add to `~/.claude/settings.json` or `.mcp.json` in your project root:
@@ -172,9 +180,9 @@ Add to `.windsurf/mcp.json` (or Settings > MCP > View raw config):
172
180
  ```json
173
181
  {
174
182
  "mcpServers": {
175
- "nodebench": {
183
+ "nodebench-power": {
176
184
  "command": "npx",
177
- "args": ["-y", "nodebench-mcp", "--preset", "power"]
185
+ "args": ["-y", "nodebench-mcp-power"]
178
186
  }
179
187
  }
180
188
  }
@@ -182,7 +190,13 @@ Add to `.windsurf/mcp.json` (or Settings > MCP > View raw config):
182
190
 
183
191
  ### Other MCP Clients
184
192
 
185
- Any MCP-compatible client works. Point `command` to `npx`, `args` to `["-y", "nodebench-mcp"]`. Add `"--preset", "<name>"` to the args array for presets.
193
+ Any MCP-compatible client works. Point `command` to `npx` and choose the package that matches the lane you want:
194
+
195
+ - `["-y", "nodebench-mcp"]` for the tiny default workflow lane
196
+ - `["-y", "nodebench-mcp-power"]` for the expanded founder/research lane
197
+ - `["-y", "nodebench-mcp-admin"]` for the operator lane
198
+
199
+ Add `"--preset", "<name>"` only when you want a compatibility preset on the core package.
186
200
 
187
201
  ### First Prompts to Try
188
202
 
@@ -232,17 +246,17 @@ Set these as environment variables, or add them to the `env` block in your MCP c
232
246
 
233
247
  ---
234
248
 
235
- ## Progressive Discovery How Optional Toolsets Stay Off the Hot Path
249
+ ## Progressive Discovery — How Optional Toolsets Stay Off the Hot Path
236
250
 
237
251
  The default preset exposes `9` tools. Everything else stays off the hot path until you deliberately load a specific toolset.
238
252
 
239
253
  ### How it works
240
254
 
241
255
  ```
242
- 1. discover_tools("your task description") ranked results from the full registry
243
- 2. load_toolset("ui_ux_dive") a specific toolset activates in your session
244
- 3. Use the newly loaded tools directly no proxy, native binding
245
- 4. Keep the default surface small only load what the workflow needs
256
+ 1. discover_tools("your task description") → ranked results from the full registry
257
+ 2. load_toolset("ui_ux_dive") → a specific toolset activates in your session
258
+ 3. Use the newly loaded tools directly → no proxy, native binding
259
+ 4. Keep the default surface small → only load what the workflow needs
246
260
  ```
247
261
 
248
262
  ### Multi-modal search engine
@@ -253,7 +267,7 @@ The default preset exposes `9` tools. Everything else stays off the hot path unt
253
267
  |---|---|
254
268
  | Keyword + TF-IDF | Exact matching, rare tags score higher |
255
269
  | Fuzzy (Levenshtein) | Tolerates typos |
256
- | Semantic (synonyms) | 30 word families "check" finds "verify", "validate" |
270
+ | Semantic (synonyms) | 30 word families — "check" finds "verify", "validate" |
257
271
  | N-gram + Bigram | Partial words and phrases |
258
272
  | Dense (TF-IDF cosine) | Vector-like ranking |
259
273
  | Embedding (neural) | Agent-as-a-Graph bipartite search |
@@ -284,7 +298,7 @@ Track actions, paths, and state across sessions. Important-change review surface
284
298
 
285
299
  ### Artifact Packets
286
300
 
287
- Every analysis produces a shareable artifact decision memos, delegation briefs, investigation reports. The output is the distribution.
301
+ Every analysis produces a shareable artifact — decision memos, delegation briefs, investigation reports. The output is the distribution.
288
302
 
289
303
  ### Founder Tools
290
304
 
@@ -292,7 +306,7 @@ Weekly reset, pre-delegation briefing, company tracking, important-change review
292
306
 
293
307
  ### Knowledge Compounding
294
308
 
295
- `record_learning` + `search_all_knowledge` findings persist across sessions. By session 9, the agent finds 2+ relevant prior findings before writing a single line of code.
309
+ `record_learning` + `search_all_knowledge` — findings persist across sessions. By session 9, the agent finds 2+ relevant prior findings before writing a single line of code.
296
310
 
297
311
  ---
298
312
 
@@ -332,7 +346,7 @@ npx nodebench-mcp --toolsets deep_sim,recon,learning
332
346
  # Exclude heavy toolsets
333
347
  npx nodebench-mcp --exclude vision,ui_capture,parallel
334
348
 
335
- # Dynamic loading start minimal, load on demand
349
+ # Dynamic loading — start minimal, load on demand
336
350
  npx nodebench-mcp --dynamic
337
351
 
338
352
  # Smart preset recommendation based on your project
@@ -348,7 +362,7 @@ npx nodebench-mcp --list-presets
348
362
  npx nodebench-mcp --help
349
363
  ```
350
364
 
351
- ### TOON Format Token Savings
365
+ ### TOON Format — Token Savings
352
366
 
353
367
  TOON (Token-Oriented Object Notation) is on by default. Every tool response is TOON-encoded for ~40% fewer tokens vs JSON. Disable with `--no-toon`.
354
368
 
@@ -361,7 +375,7 @@ NodeBench MCP runs locally on your machine.
361
375
  - All persistent data stored in `~/.nodebench/` (SQLite). No data sent to external servers unless you provide API keys and use tools that call external APIs.
362
376
  - Analytics data never leaves your machine.
363
377
  - The `local_file` toolset can read files anywhere your Node.js process has permission. Use the `default` preset to keep local-file tools off the hot path.
364
- - All API keys read from environment variables never hardcoded or logged.
378
+ - All API keys read from environment variables — never hardcoded or logged.
365
379
  - All database queries use parameterized statements.
366
380
 
367
381
  ---
@@ -391,22 +405,24 @@ Then use absolute path:
391
405
 
392
406
  ## Troubleshooting
393
407
 
394
- **"No search provider available"** Set `GEMINI_API_KEY`, `OPENAI_API_KEY`, or `PERPLEXITY_API_KEY`
408
+ **"No search provider available"** — Set `GEMINI_API_KEY`, `OPENAI_API_KEY`, or `PERPLEXITY_API_KEY`
395
409
 
396
- **"GitHub API error 403"** Set `GITHUB_TOKEN` for higher rate limits
410
+ **"GitHub API error 403"** — Set `GITHUB_TOKEN` for higher rate limits
397
411
 
398
- **"Cannot find module"** Run `npm run build` in the mcp-local directory
412
+ **"Cannot find module"** — Run `npm run build` in the mcp-local directory
399
413
 
400
- **MCP not connecting** Check path is absolute, run `claude --mcp-debug`, ensure Node.js >= 18
414
+ **MCP not connecting** — Check path is absolute, run `claude --mcp-debug`, ensure Node.js >= 18
401
415
 
402
- **Windsurf not finding tools** Verify `~/.codeium/windsurf/mcp_config.json` has correct JSON structure
416
+ **Windsurf not finding tools** — Verify `~/.codeium/windsurf/mcp_config.json` has correct JSON structure
403
417
 
404
- **Cursor tools not loading** Ensure `.cursor/mcp.json` exists in project root. Use `--preset cursor` to stay within the tool cap. Restart Cursor after config changes.
418
+ **Cursor tools not loading** — Ensure `.cursor/mcp.json` exists in project root. Use `--preset cursor` to stay within the tool cap. Restart Cursor after config changes.
405
419
 
406
- **Dynamic loading not working** Claude Code and GitHub Copilot support native dynamic loading. For Windsurf/Cursor, prefer `--preset cursor` or `--preset power` if your client does not refresh tools reliably after `load_toolset`.
420
+ **Dynamic loading not working** — Claude Code and GitHub Copilot support native dynamic loading. For Windsurf/Cursor, prefer `--preset cursor` or `--preset power` if your client does not refresh tools reliably after `load_toolset`.
407
421
 
408
422
  ---
409
423
 
410
424
  ## License
411
425
 
412
426
  MIT
427
+
428
+
@@ -1511,7 +1511,7 @@ export function getOperatingDashboardHtml() {
1511
1511
  <!-- 10. Footer -->
1512
1512
  <footer class="footer fade-in fade-in-9">
1513
1513
  <div class="footer-text">
1514
- <span>NodeBench</span> MCP v${NODEBENCH_VERSION} &middot; 325 tools &middot; 30 tables &middot; auto-refresh: 10s
1514
+ <span>NodeBench</span> MCP v${NODEBENCH_VERSION} &middot; workflow lanes + operator data &middot; auto-refresh: 10s
1515
1515
  </div>
1516
1516
  </footer>
1517
1517
  </div>
package/dist/index.js CHANGED
@@ -34,7 +34,7 @@ import { createMetaTools } from "./tools/metaTools.js";
34
34
  import { createProgressiveDiscoveryTools } from "./tools/progressiveDiscoveryTools.js";
35
35
  import { getQuickRef, ALL_REGISTRY_ENTRIES, TOOL_REGISTRY, getToolComplexity, getToolAnnotations, toolNameToTitle, _setDbAccessor, hybridSearch, WORKFLOW_CHAINS } from "./tools/toolRegistry.js";
36
36
  import { getRequestedPreset, resolveRuntimeFlags } from "./runtimeConfig.js";
37
- import { NODEBENCH_PACKAGE_NAME, NODEBENCH_VERSION, comparePackageVersions } from "./packageInfo.js";
37
+ import { NODEBENCH_CLI_COMMAND, NODEBENCH_DISPLAY_NAME, NODEBENCH_NPX_PACKAGE, NODEBENCH_PACKAGE_NAME, NODEBENCH_SERVER_KEY, NODEBENCH_VERSION, comparePackageVersions, } from "./packageInfo.js";
38
38
  // TOON format — ~40% token savings on tool responses
39
39
  import { encode as toonEncode } from "@toon-format/toon";
40
40
  // Embedding provider — neural semantic search
@@ -57,6 +57,11 @@ const runtimeFlags = resolveRuntimeFlags(cliArgs, requestedPreset);
57
57
  const useEmbedding = runtimeFlags.enableEmbedding;
58
58
  const useEngine = runtimeFlags.enableEngine;
59
59
  const useProfile = runtimeFlags.enableProfiling;
60
+ const DISPLAY_NAME = NODEBENCH_DISPLAY_NAME;
61
+ const CLI_COMMAND = NODEBENCH_CLI_COMMAND;
62
+ const NPX_COMMAND = `npx ${NODEBENCH_NPX_PACKAGE}`;
63
+ const NPX_Y_COMMAND = `npx -y ${NODEBENCH_NPX_PACKAGE}`;
64
+ const SERVER_KEY = NODEBENCH_SERVER_KEY;
60
65
  const engineSecret = (() => {
61
66
  const idx = cliArgs.indexOf("--engine-secret");
62
67
  return idx >= 0 && idx + 1 < cliArgs.length ? cliArgs[idx + 1] : process.env.ENGINE_SECRET;
@@ -522,9 +527,9 @@ if (healthFlag) {
522
527
  const warn = `${Y}WARN${X}`;
523
528
  const fail = `${R}FAIL${X}`;
524
529
  const lines = [];
525
- lines.push(`${B}NodeBench MCP v${NODEBENCH_VERSION} Health Check${X}`);
530
+ lines.push(`${B}${DISPLAY_NAME} v${NODEBENCH_VERSION} - Health Check${X}`);
526
531
  lines.push("");
527
- // 1. Tool count + preset load only the active preset for a fast health path
532
+ // 1. Tool count + preset - load only the active preset for a fast health path
528
533
  const activePreset = requestedPreset;
529
534
  const presetToolsets = PRESETS[activePreset];
530
535
  if (presetToolsets) {
@@ -634,7 +639,7 @@ if (healthFlag) {
634
639
  try {
635
640
  const controller = new AbortController();
636
641
  const timeout = setTimeout(() => controller.abort(), 3000);
637
- const res = await fetch("https://registry.npmjs.org/nodebench-mcp/latest", {
642
+ const res = await fetch(`https://registry.npmjs.org/${NODEBENCH_PACKAGE_NAME}/latest`, {
638
643
  signal: controller.signal,
639
644
  headers: { Accept: "application/json" },
640
645
  });
@@ -689,7 +694,7 @@ if (statusFlag) {
689
694
  const Database = (await import("better-sqlite3")).default;
690
695
  const db = new Database(dbPath, { readonly: true });
691
696
  const lines = [];
692
- lines.push(`${B}NodeBench MCP System Status${X}`);
697
+ lines.push(`${B}${DISPLAY_NAME} - System Status${X}`);
693
698
  lines.push("");
694
699
  // Uptime info from DB (last tool call as proxy for when server was active)
695
700
  try {
@@ -721,7 +726,7 @@ if (statusFlag) {
721
726
  // Error trend
722
727
  const errPrevHour = db.prepare(`SELECT COUNT(*) as cnt FROM tool_call_log WHERE result_status='error' AND created_at > datetime('now', '-2 hours') AND created_at <= datetime('now', '-1 hour')`).get();
723
728
  const direction = errors1h.cnt > errPrevHour.cnt ? `${R}increasing${X}` : errors1h.cnt < errPrevHour.cnt ? `${G}decreasing${X}` : `${G}stable${X}`;
724
- lines.push(`${C}Error Trend${X} ${direction} (${errPrevHour.cnt} prev hour ${errors1h.cnt} this hour)`);
729
+ lines.push(`${C}Error Trend${X} ${direction} (${errPrevHour.cnt} prev hour -> ${errors1h.cnt} this hour)`);
725
730
  // Active verification cycles
726
731
  const activeCycles = db.prepare(`SELECT COUNT(*) as cnt FROM verification_cycles WHERE status IN ('active', 'in_progress')`).get();
727
732
  if (activeCycles.cnt > 0) {
@@ -756,7 +761,7 @@ if (diagnoseFlag) {
756
761
  const Database = (await import("better-sqlite3")).default;
757
762
  const db = new Database(dbPath);
758
763
  const lines = [];
759
- lines.push(`${B}NodeBench MCP Diagnose & Heal${X}`);
764
+ lines.push(`${B}${DISPLAY_NAME} - Diagnose & Heal${X}`);
760
765
  lines.push("");
761
766
  let issueCount = 0;
762
767
  let healedCount = 0;
@@ -909,11 +914,26 @@ if (syncConfigsFlag) {
909
914
  if (process.env[key])
910
915
  envObj[key] = process.env[key];
911
916
  }
912
- // Build the MCP server config entry
917
+ // Build the MCP server config entry. Wrapper packages can override this so
918
+ // sync-configs writes the public lane command instead of an internal entry path.
913
919
  const nodePath = process.execPath; // path to node binary
920
+ const configCommandOverride = process.env.NODEBENCH_CONFIG_COMMAND_OVERRIDE?.trim();
921
+ let configArgsOverride;
922
+ const rawConfigArgsOverride = process.env.NODEBENCH_CONFIG_ARGS_OVERRIDE;
923
+ if (rawConfigArgsOverride) {
924
+ try {
925
+ const parsed = JSON.parse(rawConfigArgsOverride);
926
+ if (Array.isArray(parsed) && parsed.every((item) => typeof item === "string")) {
927
+ configArgsOverride = parsed;
928
+ }
929
+ }
930
+ catch {
931
+ // Ignore invalid override payloads and fall back to the local entry path.
932
+ }
933
+ }
914
934
  const serverEntry = {
915
- command: nodePath,
916
- args: [entryPath, ...forwardArgs],
935
+ command: configCommandOverride || nodePath,
936
+ args: configArgsOverride ?? [entryPath, ...forwardArgs],
917
937
  ...(Object.keys(envObj).length > 0 ? { env: envObj } : {}),
918
938
  };
919
939
  // Helper: merge into existing config file (preserves other servers)
@@ -946,13 +966,13 @@ if (syncConfigsFlag) {
946
966
  return { action: hadExisting ? "updated" : "created", path: filePath };
947
967
  }
948
968
  const lines = [];
949
- lines.push(`${B}NodeBench MCP Sync IDE Configs${X}`);
969
+ lines.push(`${B}${DISPLAY_NAME} - Sync IDE Configs${X}`);
950
970
  lines.push("");
951
971
  const results = [];
952
972
  // 1. Claude Code: ~/.claude/claude_desktop_config.json
953
973
  try {
954
974
  const claudeConfigPath = path.join(os.homedir(), ".claude", "claude_desktop_config.json");
955
- const r = mergeConfig(claudeConfigPath, "nodebench-mcp");
975
+ const r = mergeConfig(claudeConfigPath, SERVER_KEY);
956
976
  results.push({ name: "Claude Code", ...r });
957
977
  }
958
978
  catch (e) {
@@ -961,7 +981,7 @@ if (syncConfigsFlag) {
961
981
  // 2. Cursor: <project>/.cursor/mcp.json
962
982
  try {
963
983
  const cursorConfigPath = path.join(process.cwd(), ".cursor", "mcp.json");
964
- const r = mergeConfig(cursorConfigPath, "nodebench-mcp");
984
+ const r = mergeConfig(cursorConfigPath, SERVER_KEY);
965
985
  results.push({ name: "Cursor", ...r });
966
986
  }
967
987
  catch (e) {
@@ -970,7 +990,7 @@ if (syncConfigsFlag) {
970
990
  // 3. Windsurf: <project>/.windsurf/mcp.json
971
991
  try {
972
992
  const windsurfConfigPath = path.join(process.cwd(), ".windsurf", "mcp.json");
973
- const r = mergeConfig(windsurfConfigPath, "nodebench-mcp");
993
+ const r = mergeConfig(windsurfConfigPath, SERVER_KEY);
974
994
  results.push({ name: "Windsurf", ...r });
975
995
  }
976
996
  catch (e) {
@@ -989,8 +1009,8 @@ if (syncConfigsFlag) {
989
1009
  // Print config summary
990
1010
  lines.push("");
991
1011
  lines.push(`${C}Config entry:${X}`);
992
- lines.push(` command: ${nodePath}`);
993
- lines.push(` args: [${[entryPath, ...forwardArgs].map(a => `"${a}"`).join(", ")}]`);
1012
+ lines.push(` command: ${String(serverEntry.command)}`);
1013
+ lines.push(` args: [${(serverEntry.args ?? []).map(a => `"${a}"`).join(", ")}]`);
994
1014
  if (Object.keys(envObj).length > 0) {
995
1015
  lines.push(` env: ${Object.keys(envObj).join(", ")}`);
996
1016
  }
@@ -1374,10 +1394,10 @@ if (subCmd === "call") {
1374
1394
  const D = USE_COLOR ? "\x1b[2m" : "";
1375
1395
  const X = USE_COLOR ? "\x1b[0m" : "";
1376
1396
  if (!toolName) {
1377
- console.log(`\n ${B}Usage:${X} npx nodebench-mcp call <tool_name> [json_args]\n`);
1378
- console.log(` ${D}Example:${X} npx nodebench-mcp call founder_deep_context_gather '{"packetType":"weekly_reset"}'`);
1379
- console.log(` ${D}Example:${X} npx nodebench-mcp call discover_tools '{"query":"founder"}'`);
1380
- console.log(` ${D}Example:${X} npx nodebench-mcp call save_session_note '{"note":"test"}'\n`);
1397
+ console.log(`\n ${B}Usage:${X} ${NPX_COMMAND} call <tool_name> [json_args]\n`);
1398
+ console.log(` ${D}Example:${X} ${NPX_COMMAND} call founder_deep_context_gather '{"packetType":"weekly_reset"}'`);
1399
+ console.log(` ${D}Example:${X} ${NPX_COMMAND} call discover_tools '{"query":"founder"}'`);
1400
+ console.log(` ${D}Example:${X} ${NPX_COMMAND} call save_session_note '{"note":"test"}'\n`);
1381
1401
  process.exit(0);
1382
1402
  }
1383
1403
  // Find tool in all toolsets — meta/discovery tools are created later,
@@ -1389,7 +1409,7 @@ if (subCmd === "call") {
1389
1409
  const tool = allCallable.find(t => t.name === toolName);
1390
1410
  if (!tool) {
1391
1411
  console.log(`\n ${R}Tool not found:${X} ${toolName}`);
1392
- console.log(` ${D}Run: npx nodebench-mcp discover ${toolName}${X}\n`);
1412
+ console.log(` ${D}Run: ${NPX_COMMAND} discover ${toolName}${X}\n`);
1393
1413
  process.exit(1);
1394
1414
  }
1395
1415
  let parsedArgs;
@@ -1429,22 +1449,22 @@ if (subCmd === "setup") {
1429
1449
  const X = USE_COLOR ? "\x1b[0m" : "";
1430
1450
  const lines = [];
1431
1451
  lines.push("");
1432
- lines.push(` ${B}NodeBench MCP Quick Setup${X}`);
1452
+ lines.push(` ${B}${DISPLAY_NAME} - Quick Setup${X}`);
1433
1453
  lines.push("");
1434
1454
  lines.push(` ${G}1.${X} ${B}Claude Code${X}`);
1435
- lines.push(` claude mcp add nodebench -- npx -y nodebench-mcp`);
1455
+ lines.push(` claude mcp add ${SERVER_KEY} -- ${NPX_Y_COMMAND}`);
1436
1456
  lines.push("");
1437
1457
  lines.push(` ${G}2.${X} ${B}Cursor${X} ${D}(.cursor/mcp.json)${X}`);
1438
- lines.push(` { "mcpServers": { "nodebench": { "command": "npx", "args": ["-y", "nodebench-mcp"] } } }`);
1458
+ lines.push(` { "mcpServers": { "${SERVER_KEY}": { "command": "npx", "args": ["-y", "${NODEBENCH_NPX_PACKAGE}"] } } }`);
1439
1459
  lines.push("");
1440
1460
  lines.push(` ${G}3.${X} ${B}Windsurf${X} ${D}(.windsurf/mcp.json)${X}`);
1441
- lines.push(` { "mcpServers": { "nodebench": { "command": "npx", "args": ["-y", "nodebench-mcp"] } } }`);
1461
+ lines.push(` { "mcpServers": { "${SERVER_KEY}": { "command": "npx", "args": ["-y", "${NODEBENCH_NPX_PACKAGE}"] } } }`);
1442
1462
  lines.push("");
1443
- lines.push(` ${C}Verify:${X} npx nodebench-mcp call discover_tools '{"query":"founder"}'`);
1463
+ lines.push(` ${C}Verify:${X} ${NPX_COMMAND} call discover_tools '{"query":"founder"}'`);
1444
1464
  lines.push(` ${C}Dashboard:${X} https://www.nodebenchai.com/founder`);
1445
1465
  lines.push(` ${C}Agent setup:${X} https://www.nodebenchai.com/agent-setup.txt`);
1446
1466
  lines.push("");
1447
- lines.push(` ${Y}Presets:${X} --preset default (core workflow) | --preset power | --preset admin`);
1467
+ lines.push(` ${Y}Compatibility presets on core package:${X} --preset default | --preset power | --preset admin`);
1448
1468
  lines.push(` ${Y}Founder tools:${X} founder_deep_context_gather, founder_packet_validate, founder_packet_diff`);
1449
1469
  lines.push("");
1450
1470
  console.log(lines.join("\n"));
@@ -3382,7 +3402,7 @@ const engineInfo = enginePort ? ` engine at http://127.0.0.1:${enginePort}` : ""
3382
3402
  const runtimeInfo = runtimeFlags.enableDashboards || runtimeFlags.enableWatchdog
3383
3403
  ? " admin-runtime"
3384
3404
  : " core-runtime";
3385
- console.error(`nodebench-mcp ready (${allTools.length} tools, ${PROMPTS.length} prompts${toolsetInfo}, SQLite at ~/.nodebench/${dashInfo}${uiDiveInfo}${engineInfo}${runtimeInfo})`);
3405
+ console.error(`${CLI_COMMAND} ready (${allTools.length} tools, ${PROMPTS.length} prompts${toolsetInfo}, SQLite at ~/.nodebench/${dashInfo}${uiDiveInfo}${engineInfo}${runtimeInfo})`);
3386
3406
  // ── Auto-brief on first start (delta/hackathon presets) ──────────────
3387
3407
  // When using delta or hackathon preset, auto-run delta_brief on first session
3388
3408
  // to give users immediate value before they even ask.