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 +55 -39
- package/dist/dashboard/operatingDashboardHtml.js +1 -1
- package/dist/index.js +48 -28
- package/dist/index.js.map +1 -1
- package/dist/packageInfo.d.ts +4 -0
- package/dist/packageInfo.js +18 -2
- package/dist/packageInfo.js.map +1 -1
- package/package.json +5 -4
- package/scripts/install.sh +102 -146
- package/server.json +46 -0
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# NodeBench MCP
|
|
1
|
+
# NodeBench MCP
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/nodebench-mcp)
|
|
4
4
|
[](https://www.npmjs.com/package/nodebench-mcp)
|
|
@@ -7,28 +7,28 @@
|
|
|
7
7
|
[](https://modelcontextprotocol.io)
|
|
8
8
|
[](https://www.npmjs.com/package/nodebench-mcp)
|
|
9
9
|
|
|
10
|
-
**Investigate a topic and return a sourced report fast.** NodeBench MCP
|
|
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
|
-
#
|
|
16
|
+
# Core workflow lane
|
|
17
17
|
claude mcp add nodebench -- npx -y nodebench-mcp
|
|
18
18
|
|
|
19
|
-
#
|
|
20
|
-
claude mcp add nodebench -- npx -y nodebench-mcp
|
|
19
|
+
# Power lane
|
|
20
|
+
claude mcp add nodebench-power -- npx -y nodebench-mcp-power
|
|
21
21
|
|
|
22
|
-
# Admin
|
|
23
|
-
claude mcp add nodebench -- npx -y nodebench-mcp
|
|
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**
|
|
29
|
-
- **Admin-only runtime gates**
|
|
30
|
-
- **Faster health path**
|
|
31
|
-
- **
|
|
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
|
-
|
|
|
106
|
+
| Entry | Surface | What it is for |
|
|
107
107
|
|---|---|---|
|
|
108
|
-
| `
|
|
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
|
-
#
|
|
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
|
|
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
|
|
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
|
|
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")
|
|
243
|
-
2. load_toolset("ui_ux_dive")
|
|
244
|
-
3. Use the newly loaded tools directly
|
|
245
|
-
4. Keep the default surface small
|
|
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
|
|
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
|
|
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`
|
|
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
|
|
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
|
|
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
|
|
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"**
|
|
408
|
+
**"No search provider available"** — Set `GEMINI_API_KEY`, `OPENAI_API_KEY`, or `PERPLEXITY_API_KEY`
|
|
395
409
|
|
|
396
|
-
**"GitHub API error 403"**
|
|
410
|
+
**"GitHub API error 403"** — Set `GITHUB_TOKEN` for higher rate limits
|
|
397
411
|
|
|
398
|
-
**"Cannot find module"**
|
|
412
|
+
**"Cannot find module"** — Run `npm run build` in the mcp-local directory
|
|
399
413
|
|
|
400
|
-
**MCP not connecting**
|
|
414
|
+
**MCP not connecting** — Check path is absolute, run `claude --mcp-debug`, ensure Node.js >= 18
|
|
401
415
|
|
|
402
|
-
**Windsurf not finding tools**
|
|
416
|
+
**Windsurf not finding tools** — Verify `~/.codeium/windsurf/mcp_config.json` has correct JSON structure
|
|
403
417
|
|
|
404
|
-
**Cursor tools not loading**
|
|
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**
|
|
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} ·
|
|
1514
|
+
<span>NodeBench</span> MCP v${NODEBENCH_VERSION} · workflow lanes + operator data · 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}
|
|
530
|
+
lines.push(`${B}${DISPLAY_NAME} v${NODEBENCH_VERSION} - Health Check${X}`);
|
|
526
531
|
lines.push("");
|
|
527
|
-
// 1. Tool count + preset
|
|
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(
|
|
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}
|
|
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
|
|
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}
|
|
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}
|
|
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,
|
|
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,
|
|
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,
|
|
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: ${
|
|
993
|
-
lines.push(` args: [${[
|
|
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}
|
|
1378
|
-
console.log(` ${D}Example:${X}
|
|
1379
|
-
console.log(` ${D}Example:${X}
|
|
1380
|
-
console.log(` ${D}Example:${X}
|
|
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:
|
|
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}
|
|
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
|
|
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": { "
|
|
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": { "
|
|
1461
|
+
lines.push(` { "mcpServers": { "${SERVER_KEY}": { "command": "npx", "args": ["-y", "${NODEBENCH_NPX_PACKAGE}"] } } }`);
|
|
1442
1462
|
lines.push("");
|
|
1443
|
-
lines.push(` ${C}Verify:${X}
|
|
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}
|
|
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(
|
|
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.
|