nodebench-mcp 2.70.0 → 3.0.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 +95 -41
- package/dist/agents/alertRouter.d.ts +38 -0
- package/dist/agents/alertRouter.js +151 -0
- package/dist/agents/alertRouter.js.map +1 -0
- package/dist/agents/entityMemory.d.ts +40 -0
- package/dist/agents/entityMemory.js +64 -0
- package/dist/agents/entityMemory.js.map +1 -0
- package/dist/agents/subAgents.d.ts +35 -0
- package/dist/agents/subAgents.js +62 -0
- package/dist/agents/subAgents.js.map +1 -0
- package/dist/benchmarks/benchmarkRunner.js +14 -0
- package/dist/benchmarks/benchmarkRunner.js.map +1 -1
- package/dist/benchmarks/chainEval.js +107 -0
- package/dist/benchmarks/chainEval.js.map +1 -1
- package/dist/benchmarks/llmJudgeEval.js +85 -0
- package/dist/benchmarks/llmJudgeEval.js.map +1 -1
- package/dist/benchmarks/searchQualityEval.js +118 -5
- package/dist/benchmarks/searchQualityEval.js.map +1 -1
- package/dist/cli/search.d.ts +13 -0
- package/dist/cli/search.js +130 -0
- package/dist/cli/search.js.map +1 -0
- package/dist/dashboard/operatingDashboardHtml.js +2 -1
- package/dist/dashboard/operatingDashboardHtml.js.map +1 -1
- package/dist/dashboard/operatingServer.js +3 -2
- package/dist/dashboard/operatingServer.js.map +1 -1
- package/dist/db.d.ts +6 -2
- package/dist/db.js +521 -6
- package/dist/db.js.map +1 -1
- package/dist/index.js +349 -67
- package/dist/index.js.map +1 -1
- package/dist/packageInfo.d.ts +3 -0
- package/dist/packageInfo.js +32 -0
- package/dist/packageInfo.js.map +1 -0
- package/dist/profiler/behaviorStore.d.ts +97 -0
- package/dist/profiler/behaviorStore.js +276 -0
- package/dist/profiler/behaviorStore.js.map +1 -0
- package/dist/profiler/eventCollector.d.ts +119 -0
- package/dist/profiler/eventCollector.js +267 -0
- package/dist/profiler/eventCollector.js.map +1 -0
- package/dist/profiler/index.d.ts +15 -0
- package/dist/profiler/index.js +16 -0
- package/dist/profiler/index.js.map +1 -0
- package/dist/profiler/mcpProxy.d.ts +49 -0
- package/dist/profiler/mcpProxy.js +123 -0
- package/dist/profiler/mcpProxy.js.map +1 -0
- package/dist/profiler/modelRouter.d.ts +30 -0
- package/dist/profiler/modelRouter.js +99 -0
- package/dist/profiler/modelRouter.js.map +1 -0
- package/dist/profiler/otelReceiver.d.ts +17 -0
- package/dist/profiler/otelReceiver.js +62 -0
- package/dist/profiler/otelReceiver.js.map +1 -0
- package/dist/profiler/proofEngine.d.ts +41 -0
- package/dist/profiler/proofEngine.js +93 -0
- package/dist/profiler/proofEngine.js.map +1 -0
- package/dist/profiler/workflowTemplates.d.ts +41 -0
- package/dist/profiler/workflowTemplates.js +95 -0
- package/dist/profiler/workflowTemplates.js.map +1 -0
- package/dist/providers/localMemoryProvider.js +3 -2
- package/dist/providers/localMemoryProvider.js.map +1 -1
- package/dist/runtimeConfig.d.ts +11 -0
- package/dist/runtimeConfig.js +27 -0
- package/dist/runtimeConfig.js.map +1 -0
- package/dist/sandboxApi.js +2 -1
- package/dist/sandboxApi.js.map +1 -1
- package/dist/security/auditLog.js +8 -3
- package/dist/security/auditLog.js.map +1 -1
- package/dist/subconscious/blocks.d.ts +43 -0
- package/dist/subconscious/blocks.js +158 -0
- package/dist/subconscious/blocks.js.map +1 -0
- package/dist/subconscious/classifier.d.ts +22 -0
- package/dist/subconscious/classifier.js +118 -0
- package/dist/subconscious/classifier.js.map +1 -0
- package/dist/subconscious/graphEngine.d.ts +65 -0
- package/dist/subconscious/graphEngine.js +234 -0
- package/dist/subconscious/graphEngine.js.map +1 -0
- package/dist/subconscious/index.d.ts +19 -0
- package/dist/subconscious/index.js +20 -0
- package/dist/subconscious/index.js.map +1 -0
- package/dist/subconscious/tools.d.ts +5 -0
- package/dist/subconscious/tools.js +255 -0
- package/dist/subconscious/tools.js.map +1 -0
- package/dist/subconscious/whisperPolicy.d.ts +20 -0
- package/dist/subconscious/whisperPolicy.js +171 -0
- package/dist/subconscious/whisperPolicy.js.map +1 -0
- package/dist/sweep/engine.d.ts +27 -0
- package/dist/sweep/engine.js +244 -0
- package/dist/sweep/engine.js.map +1 -0
- package/dist/sweep/index.d.ts +9 -0
- package/dist/sweep/index.js +8 -0
- package/dist/sweep/index.js.map +1 -0
- package/dist/sweep/sources/github_trending.d.ts +6 -0
- package/dist/sweep/sources/github_trending.js +37 -0
- package/dist/sweep/sources/github_trending.js.map +1 -0
- package/dist/sweep/sources/hackernews.d.ts +7 -0
- package/dist/sweep/sources/hackernews.js +57 -0
- package/dist/sweep/sources/hackernews.js.map +1 -0
- package/dist/sweep/sources/openbb_finance.d.ts +9 -0
- package/dist/sweep/sources/openbb_finance.js +46 -0
- package/dist/sweep/sources/openbb_finance.js.map +1 -0
- package/dist/sweep/sources/producthunt.d.ts +6 -0
- package/dist/sweep/sources/producthunt.js +41 -0
- package/dist/sweep/sources/producthunt.js.map +1 -0
- package/dist/sweep/sources/web_signals.d.ts +7 -0
- package/dist/sweep/sources/web_signals.js +63 -0
- package/dist/sweep/sources/web_signals.js.map +1 -0
- package/dist/sweep/sources/yahoo_finance.d.ts +6 -0
- package/dist/sweep/sources/yahoo_finance.js +47 -0
- package/dist/sweep/sources/yahoo_finance.js.map +1 -0
- package/dist/sweep/types.d.ts +50 -0
- package/dist/sweep/types.js +9 -0
- package/dist/sweep/types.js.map +1 -0
- package/dist/sync/founderEpisodeStore.d.ts +98 -0
- package/dist/sync/founderEpisodeStore.js +230 -0
- package/dist/sync/founderEpisodeStore.js.map +1 -0
- package/dist/sync/hyperloopArchive.d.ts +51 -0
- package/dist/sync/hyperloopArchive.js +153 -0
- package/dist/sync/hyperloopArchive.js.map +1 -0
- package/dist/sync/hyperloopEval.d.ts +123 -0
- package/dist/sync/hyperloopEval.js +389 -0
- package/dist/sync/hyperloopEval.js.map +1 -0
- package/dist/sync/protocol.d.ts +172 -0
- package/dist/sync/protocol.js +9 -0
- package/dist/sync/protocol.js.map +1 -0
- package/dist/sync/sessionMemory.d.ts +47 -0
- package/dist/sync/sessionMemory.js +138 -0
- package/dist/sync/sessionMemory.js.map +1 -0
- package/dist/sync/store.d.ts +384 -0
- package/dist/sync/store.js +1435 -0
- package/dist/sync/store.js.map +1 -0
- package/dist/sync/syncBridgeClient.d.ts +30 -0
- package/dist/sync/syncBridgeClient.js +172 -0
- package/dist/sync/syncBridgeClient.js.map +1 -0
- package/dist/tools/autonomousDeliveryTools.d.ts +2 -0
- package/dist/tools/autonomousDeliveryTools.js +1104 -0
- package/dist/tools/autonomousDeliveryTools.js.map +1 -0
- package/dist/tools/boilerplateTools.js +10 -9
- package/dist/tools/boilerplateTools.js.map +1 -1
- package/dist/tools/claudeCodeIngestTools.d.ts +10 -0
- package/dist/tools/claudeCodeIngestTools.js +347 -0
- package/dist/tools/claudeCodeIngestTools.js.map +1 -0
- package/dist/tools/coreWorkflowTools.d.ts +2 -0
- package/dist/tools/coreWorkflowTools.js +488 -0
- package/dist/tools/coreWorkflowTools.js.map +1 -0
- package/dist/tools/deltaTools.d.ts +15 -0
- package/dist/tools/deltaTools.js +1522 -0
- package/dist/tools/deltaTools.js.map +1 -0
- package/dist/tools/documentationTools.js +2 -1
- package/dist/tools/documentationTools.js.map +1 -1
- package/dist/tools/entityLookupTools.d.ts +14 -0
- package/dist/tools/entityLookupTools.js +159 -0
- package/dist/tools/entityLookupTools.js.map +1 -0
- package/dist/tools/entityTemporalTools.d.ts +12 -0
- package/dist/tools/entityTemporalTools.js +330 -0
- package/dist/tools/entityTemporalTools.js.map +1 -0
- package/dist/tools/founderLocalPipeline.d.ts +215 -0
- package/dist/tools/founderLocalPipeline.js +1516 -2
- package/dist/tools/founderLocalPipeline.js.map +1 -1
- package/dist/tools/founderOperatingModel.d.ts +120 -0
- package/dist/tools/founderOperatingModel.js +469 -0
- package/dist/tools/founderOperatingModel.js.map +1 -0
- package/dist/tools/founderOperatingModelTools.d.ts +2 -0
- package/dist/tools/founderOperatingModelTools.js +169 -0
- package/dist/tools/founderOperatingModelTools.js.map +1 -0
- package/dist/tools/founderStrategicOpsTools.d.ts +2 -0
- package/dist/tools/founderStrategicOpsTools.js +1310 -0
- package/dist/tools/founderStrategicOpsTools.js.map +1 -0
- package/dist/tools/graphifyTools.d.ts +19 -0
- package/dist/tools/graphifyTools.js +375 -0
- package/dist/tools/graphifyTools.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/monteCarloTools.d.ts +16 -0
- package/dist/tools/monteCarloTools.js +225 -0
- package/dist/tools/monteCarloTools.js.map +1 -0
- package/dist/tools/packetCompilerTools.d.ts +12 -0
- package/dist/tools/packetCompilerTools.js +322 -0
- package/dist/tools/packetCompilerTools.js.map +1 -0
- package/dist/tools/planSynthesisTools.d.ts +15 -0
- package/dist/tools/planSynthesisTools.js +455 -0
- package/dist/tools/planSynthesisTools.js.map +1 -0
- package/dist/tools/profilerTools.d.ts +20 -0
- package/dist/tools/profilerTools.js +364 -0
- package/dist/tools/profilerTools.js.map +1 -0
- package/dist/tools/progressiveDiscoveryTools.js +2 -1
- package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
- package/dist/tools/savingsTools.d.ts +11 -0
- package/dist/tools/savingsTools.js +155 -0
- package/dist/tools/savingsTools.js.map +1 -0
- package/dist/tools/scenarioCompilerTools.d.ts +14 -0
- package/dist/tools/scenarioCompilerTools.js +290 -0
- package/dist/tools/scenarioCompilerTools.js.map +1 -0
- package/dist/tools/sharedContextTools.d.ts +2 -0
- package/dist/tools/sharedContextTools.js +423 -0
- package/dist/tools/sharedContextTools.js.map +1 -0
- package/dist/tools/sitemapTools.d.ts +15 -0
- package/dist/tools/sitemapTools.js +560 -0
- package/dist/tools/sitemapTools.js.map +1 -0
- package/dist/tools/sweepTools.d.ts +9 -0
- package/dist/tools/sweepTools.js +112 -0
- package/dist/tools/sweepTools.js.map +1 -0
- package/dist/tools/syncBridgeTools.d.ts +2 -0
- package/dist/tools/syncBridgeTools.js +258 -0
- package/dist/tools/syncBridgeTools.js.map +1 -0
- package/dist/tools/toolRegistry.js +1223 -45
- package/dist/tools/toolRegistry.js.map +1 -1
- package/dist/tools/workspaceTools.d.ts +19 -0
- package/dist/tools/workspaceTools.js +762 -0
- package/dist/tools/workspaceTools.js.map +1 -0
- package/dist/toolsetRegistry.js +162 -3
- package/dist/toolsetRegistry.js.map +1 -1
- package/package.json +39 -38
- package/rules/nodebench-agentic-reliability.md +32 -0
- package/rules/nodebench-analyst-diagnostic.md +25 -0
- package/rules/nodebench-auto-qa.md +31 -0
- package/rules/nodebench-completion-traceability.md +22 -0
- package/rules/nodebench-flywheel-continuous.md +25 -0
- package/rules/nodebench-pre-release-review.md +24 -0
- package/rules/nodebench-qa-dogfood.md +26 -0
- package/rules/nodebench-scenario-testing.md +30 -0
- package/rules/nodebench-self-direction.md +23 -0
- package/rules/nodebench-self-judge-loop.md +24 -0
- package/scripts/install.sh +215 -0
- package/dist/__tests__/analytics.test.d.ts +0 -11
- package/dist/__tests__/analytics.test.js +0 -546
- package/dist/__tests__/analytics.test.js.map +0 -1
- package/dist/__tests__/architectComplex.test.d.ts +0 -1
- package/dist/__tests__/architectComplex.test.js +0 -373
- package/dist/__tests__/architectComplex.test.js.map +0 -1
- package/dist/__tests__/architectSmoke.test.d.ts +0 -1
- package/dist/__tests__/architectSmoke.test.js +0 -92
- package/dist/__tests__/architectSmoke.test.js.map +0 -1
- package/dist/__tests__/audit-registry.d.ts +0 -1
- package/dist/__tests__/audit-registry.js +0 -60
- package/dist/__tests__/audit-registry.js.map +0 -1
- package/dist/__tests__/batchAutopilot.test.d.ts +0 -8
- package/dist/__tests__/batchAutopilot.test.js +0 -218
- package/dist/__tests__/batchAutopilot.test.js.map +0 -1
- package/dist/__tests__/cliSubcommands.test.d.ts +0 -1
- package/dist/__tests__/cliSubcommands.test.js +0 -138
- package/dist/__tests__/cliSubcommands.test.js.map +0 -1
- package/dist/__tests__/comparativeBench.test.d.ts +0 -1
- package/dist/__tests__/comparativeBench.test.js +0 -722
- package/dist/__tests__/comparativeBench.test.js.map +0 -1
- package/dist/__tests__/critterCalibrationEval.d.ts +0 -8
- package/dist/__tests__/critterCalibrationEval.js +0 -370
- package/dist/__tests__/critterCalibrationEval.js.map +0 -1
- package/dist/__tests__/dynamicLoading.test.d.ts +0 -1
- package/dist/__tests__/dynamicLoading.test.js +0 -280
- package/dist/__tests__/dynamicLoading.test.js.map +0 -1
- package/dist/__tests__/embeddingProvider.test.d.ts +0 -1
- package/dist/__tests__/embeddingProvider.test.js +0 -86
- package/dist/__tests__/embeddingProvider.test.js.map +0 -1
- package/dist/__tests__/evalDatasetBench.test.d.ts +0 -1
- package/dist/__tests__/evalDatasetBench.test.js +0 -738
- package/dist/__tests__/evalDatasetBench.test.js.map +0 -1
- package/dist/__tests__/evalHarness.test.d.ts +0 -1
- package/dist/__tests__/evalHarness.test.js +0 -1107
- package/dist/__tests__/evalHarness.test.js.map +0 -1
- package/dist/__tests__/fixtures/bfcl_v3_long_context.sample.json +0 -264
- package/dist/__tests__/fixtures/generateBfclLongContextFixture.d.ts +0 -10
- package/dist/__tests__/fixtures/generateBfclLongContextFixture.js +0 -135
- package/dist/__tests__/fixtures/generateBfclLongContextFixture.js.map +0 -1
- package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.d.ts +0 -14
- package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.js +0 -189
- package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.js.map +0 -1
- package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.d.ts +0 -16
- package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.js +0 -154
- package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.js.map +0 -1
- package/dist/__tests__/fixtures/swebench_verified.sample.json +0 -162
- package/dist/__tests__/fixtures/toolbench_instruction.sample.json +0 -109
- package/dist/__tests__/forecastingDogfood.test.d.ts +0 -9
- package/dist/__tests__/forecastingDogfood.test.js +0 -284
- package/dist/__tests__/forecastingDogfood.test.js.map +0 -1
- package/dist/__tests__/forecastingScoring.test.d.ts +0 -9
- package/dist/__tests__/forecastingScoring.test.js +0 -202
- package/dist/__tests__/forecastingScoring.test.js.map +0 -1
- package/dist/__tests__/gaiaCapabilityAudioEval.test.d.ts +0 -15
- package/dist/__tests__/gaiaCapabilityAudioEval.test.js +0 -265
- package/dist/__tests__/gaiaCapabilityAudioEval.test.js.map +0 -1
- package/dist/__tests__/gaiaCapabilityEval.test.d.ts +0 -14
- package/dist/__tests__/gaiaCapabilityEval.test.js +0 -1259
- package/dist/__tests__/gaiaCapabilityEval.test.js.map +0 -1
- package/dist/__tests__/gaiaCapabilityFilesEval.test.d.ts +0 -15
- package/dist/__tests__/gaiaCapabilityFilesEval.test.js +0 -914
- package/dist/__tests__/gaiaCapabilityFilesEval.test.js.map +0 -1
- package/dist/__tests__/gaiaCapabilityMediaEval.test.d.ts +0 -15
- package/dist/__tests__/gaiaCapabilityMediaEval.test.js +0 -1101
- package/dist/__tests__/gaiaCapabilityMediaEval.test.js.map +0 -1
- package/dist/__tests__/helpers/answerMatch.d.ts +0 -41
- package/dist/__tests__/helpers/answerMatch.js +0 -267
- package/dist/__tests__/helpers/answerMatch.js.map +0 -1
- package/dist/__tests__/helpers/textLlm.d.ts +0 -25
- package/dist/__tests__/helpers/textLlm.js +0 -214
- package/dist/__tests__/helpers/textLlm.js.map +0 -1
- package/dist/__tests__/localDashboard.test.d.ts +0 -1
- package/dist/__tests__/localDashboard.test.js +0 -226
- package/dist/__tests__/localDashboard.test.js.map +0 -1
- package/dist/__tests__/multiHopDogfood.test.d.ts +0 -12
- package/dist/__tests__/multiHopDogfood.test.js +0 -303
- package/dist/__tests__/multiHopDogfood.test.js.map +0 -1
- package/dist/__tests__/openDatasetParallelEval.test.d.ts +0 -7
- package/dist/__tests__/openDatasetParallelEval.test.js +0 -209
- package/dist/__tests__/openDatasetParallelEval.test.js.map +0 -1
- package/dist/__tests__/openDatasetParallelEvalGaia.test.d.ts +0 -7
- package/dist/__tests__/openDatasetParallelEvalGaia.test.js +0 -279
- package/dist/__tests__/openDatasetParallelEvalGaia.test.js.map +0 -1
- package/dist/__tests__/openDatasetParallelEvalSwebench.test.d.ts +0 -7
- package/dist/__tests__/openDatasetParallelEvalSwebench.test.js +0 -220
- package/dist/__tests__/openDatasetParallelEvalSwebench.test.js.map +0 -1
- package/dist/__tests__/openDatasetParallelEvalToolbench.test.d.ts +0 -7
- package/dist/__tests__/openDatasetParallelEvalToolbench.test.js +0 -218
- package/dist/__tests__/openDatasetParallelEvalToolbench.test.js.map +0 -1
- package/dist/__tests__/openDatasetPerfComparison.test.d.ts +0 -10
- package/dist/__tests__/openDatasetPerfComparison.test.js +0 -318
- package/dist/__tests__/openDatasetPerfComparison.test.js.map +0 -1
- package/dist/__tests__/openclawDogfood.test.d.ts +0 -23
- package/dist/__tests__/openclawDogfood.test.js +0 -535
- package/dist/__tests__/openclawDogfood.test.js.map +0 -1
- package/dist/__tests__/openclawMessaging.test.d.ts +0 -14
- package/dist/__tests__/openclawMessaging.test.js +0 -232
- package/dist/__tests__/openclawMessaging.test.js.map +0 -1
- package/dist/__tests__/presetRealWorldBench.test.d.ts +0 -1
- package/dist/__tests__/presetRealWorldBench.test.js +0 -859
- package/dist/__tests__/presetRealWorldBench.test.js.map +0 -1
- package/dist/__tests__/tools.test.d.ts +0 -1
- package/dist/__tests__/tools.test.js +0 -3201
- package/dist/__tests__/tools.test.js.map +0 -1
- package/dist/__tests__/toolsetGatingEval.test.d.ts +0 -1
- package/dist/__tests__/toolsetGatingEval.test.js +0 -1099
- package/dist/__tests__/toolsetGatingEval.test.js.map +0 -1
- package/dist/__tests__/traceabilityDogfood.test.d.ts +0 -12
- package/dist/__tests__/traceabilityDogfood.test.js +0 -241
- package/dist/__tests__/traceabilityDogfood.test.js.map +0 -1
- package/dist/__tests__/webmcpTools.test.d.ts +0 -7
- package/dist/__tests__/webmcpTools.test.js +0 -195
- package/dist/__tests__/webmcpTools.test.js.map +0 -1
- package/dist/benchmarks/testProviderBus.d.ts +0 -7
- package/dist/benchmarks/testProviderBus.js +0 -272
- package/dist/benchmarks/testProviderBus.js.map +0 -1
- package/dist/hooks/postCompaction.d.ts +0 -14
- package/dist/hooks/postCompaction.js +0 -51
- package/dist/hooks/postCompaction.js.map +0 -1
- package/dist/security/__tests__/security.test.d.ts +0 -8
- package/dist/security/__tests__/security.test.js +0 -295
- package/dist/security/__tests__/security.test.js.map +0 -1
- package/dist/tools/documentTools.d.ts +0 -5
- package/dist/tools/documentTools.js +0 -524
- package/dist/tools/documentTools.js.map +0 -1
- package/dist/tools/financialTools.d.ts +0 -10
- package/dist/tools/financialTools.js +0 -403
- package/dist/tools/financialTools.js.map +0 -1
- package/dist/tools/memoryTools.d.ts +0 -5
- package/dist/tools/memoryTools.js +0 -137
- package/dist/tools/memoryTools.js.map +0 -1
- package/dist/tools/planningTools.d.ts +0 -5
- package/dist/tools/planningTools.js +0 -147
- package/dist/tools/planningTools.js.map +0 -1
- package/dist/tools/searchTools.d.ts +0 -5
- package/dist/tools/searchTools.js +0 -145
- package/dist/tools/searchTools.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -33,6 +33,8 @@ import { initObservability, startWatchdog, stopWatchdog } from "./tools/observab
|
|
|
33
33
|
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
|
+
import { getRequestedPreset, resolveRuntimeFlags } from "./runtimeConfig.js";
|
|
37
|
+
import { NODEBENCH_PACKAGE_NAME, NODEBENCH_VERSION, comparePackageVersions } from "./packageInfo.js";
|
|
36
38
|
// TOON format — ~40% token savings on tool responses
|
|
37
39
|
import { encode as toonEncode } from "@toon-format/toon";
|
|
38
40
|
// Embedding provider — neural semantic search
|
|
@@ -40,7 +42,6 @@ import { initEmbeddingIndex } from "./tools/embeddingProvider.js";
|
|
|
40
42
|
// ── CLI argument parsing ──────────────────────────────────────────────
|
|
41
43
|
const cliArgs = process.argv.slice(2);
|
|
42
44
|
const useToon = !cliArgs.includes("--no-toon");
|
|
43
|
-
const useEmbedding = !cliArgs.includes("--no-embedding");
|
|
44
45
|
const useSmartPreset = cliArgs.includes("--smart-preset");
|
|
45
46
|
const showStats = cliArgs.includes("--stats");
|
|
46
47
|
const exportStats = cliArgs.includes("--export-stats");
|
|
@@ -51,25 +52,34 @@ const statusFlag = cliArgs.includes("--status");
|
|
|
51
52
|
const diagnoseFlag = cliArgs.includes("--diagnose");
|
|
52
53
|
const autoPresetFlag = cliArgs.includes("--auto-preset");
|
|
53
54
|
const syncConfigsFlag = cliArgs.includes("--sync-configs");
|
|
54
|
-
const
|
|
55
|
+
const requestedPreset = getRequestedPreset(cliArgs);
|
|
56
|
+
const runtimeFlags = resolveRuntimeFlags(cliArgs, requestedPreset);
|
|
57
|
+
const useEmbedding = runtimeFlags.enableEmbedding;
|
|
58
|
+
const useEngine = runtimeFlags.enableEngine;
|
|
59
|
+
const useProfile = runtimeFlags.enableProfiling;
|
|
55
60
|
const engineSecret = (() => {
|
|
56
61
|
const idx = cliArgs.indexOf("--engine-secret");
|
|
57
62
|
return idx >= 0 && idx + 1 < cliArgs.length ? cliArgs[idx + 1] : process.env.ENGINE_SECRET;
|
|
58
63
|
})();
|
|
59
64
|
export { TOOLSET_MAP };
|
|
60
|
-
// Starter:
|
|
61
|
-
|
|
62
|
-
const STARTER_TOOLSETS = ["deep_sim"];
|
|
65
|
+
// Starter/default: v3 core workflow facade only. Discovery/meta/dynamic tools are added separately.
|
|
66
|
+
const STARTER_TOOLSETS = ["core_workflow"];
|
|
63
67
|
// Core: the original default. ~81 tools across 15 domains.
|
|
64
|
-
const CORE_TOOLSETS = ["verification", "eval", "quality_gate", "learning", "flywheel", "recon", "security", "boilerplate", "skill_update", "context_sandbox", "observability", "execution_trace", "mission_harness", "deep_sim", "founder"];
|
|
68
|
+
const CORE_TOOLSETS = ["verification", "eval", "quality_gate", "learning", "flywheel", "autonomous_delivery", "sync_bridge", "shared_context", "recon", "security", "boilerplate", "skill_update", "context_sandbox", "observability", "execution_trace", "mission_harness", "deep_sim", "founder", "scenario_compiler", "packet_compiler", "entity_temporal"];
|
|
69
|
+
// Power: extended research + founder intelligence without admin/debug-only runtime surfaces.
|
|
70
|
+
const POWER_TOOLSETS = ["core_workflow", "deep_sim", "founder", "recon", "web", "shared_context", "sync_bridge", "session_memory", "entity_lookup", "delta", "site_map"];
|
|
71
|
+
// Admin: profiling, debugging, observability, dashboards, and eval harness domains.
|
|
72
|
+
const ADMIN_TOOLSETS = ["core_workflow", "observability", "profiler", "local_dashboard", "benchmark", "longitudinal_benchmark", "dogfood_judge", "execution_trace", "qa_orchestration", "mission_harness", "quality_gate", "eval", "verification"];
|
|
65
73
|
const PRESETS = {
|
|
66
|
-
// DEFAULT:
|
|
74
|
+
// DEFAULT: v3 core workflow facade. Progressive discovery expands into power/admin domains only when needed.
|
|
67
75
|
default: STARTER_TOOLSETS,
|
|
68
76
|
starter: STARTER_TOOLSETS,
|
|
77
|
+
power: POWER_TOOLSETS,
|
|
78
|
+
admin: ADMIN_TOOLSETS,
|
|
69
79
|
// Core AI Flywheel — everything from the old default
|
|
70
80
|
core: CORE_TOOLSETS,
|
|
71
|
-
// Themed presets — bridge between
|
|
72
|
-
web_dev: [...CORE_TOOLSETS, "ui_capture", "vision", "web", "seo", "git_workflow", "architect", "ui_ux_dive", "ui_ux_dive_v2", "mcp_bridge", "qa_orchestration", "visual_qa", "design_governance", "web_scraping"],
|
|
81
|
+
// Themed presets — bridge between the core workflow surface and full-domain coverage
|
|
82
|
+
web_dev: [...CORE_TOOLSETS, "ui_capture", "vision", "web", "seo", "git_workflow", "architect", "ui_ux_dive", "ui_ux_dive_v2", "mcp_bridge", "qa_orchestration", "visual_qa", "design_governance", "web_scraping", "site_map", "savings"],
|
|
73
83
|
research: [...CORE_TOOLSETS, "web", "llm", "rss", "email", "docs", "research_optimizer", "web_scraping", "temporal_intelligence", "deep_sim"],
|
|
74
84
|
data: [...CORE_TOOLSETS, "local_file", "llm", "web", "research_optimizer", "web_scraping", "temporal_intelligence"],
|
|
75
85
|
devops: [...CORE_TOOLSETS, "git_workflow", "session_memory", "benchmark", "pattern"],
|
|
@@ -77,22 +87,29 @@ const PRESETS = {
|
|
|
77
87
|
academic: [...CORE_TOOLSETS, "research_writing", "llm", "web", "local_file"],
|
|
78
88
|
multi_agent: [...CORE_TOOLSETS, "parallel", "self_eval", "session_memory", "pattern", "toon", "qa_orchestration", "agent_traverse", "engine_context", "research_optimizer", "web_scraping", "deep_sim"],
|
|
79
89
|
content: [...CORE_TOOLSETS, "llm", "critter", "email", "rss", "platform", "architect", "local_dashboard", "engine_context", "thompson_protocol"],
|
|
80
|
-
// ── Persona presets (
|
|
81
|
-
// Founder: decision intelligence + company tracking + session memory + local dashboard
|
|
82
|
-
founder: ["deep_sim", "founder", "learning", "local_dashboard"],
|
|
90
|
+
// ── Persona presets (kept for compatibility, but no longer the default entry point) ──
|
|
91
|
+
// Founder: decision intelligence + company tracking + session memory + local dashboard
|
|
92
|
+
founder: ["deep_sim", "founder", "learning", "local_dashboard", "autonomous_delivery", "sync_bridge", "shared_context", "site_map", "savings", "profiler", "sweep", "monte_carlo"],
|
|
83
93
|
// Banker/analyst: decision intelligence + company profiling + web research + recon (~39 tools)
|
|
84
|
-
banker: ["deep_sim", "founder", "web", "recon"],
|
|
85
|
-
// Operator: decision intelligence + company tracking + causal memory + action tracing
|
|
86
|
-
operator: ["deep_sim", "founder", "causal_memory"],
|
|
94
|
+
banker: ["deep_sim", "founder", "web", "recon", "autonomous_delivery", "sync_bridge", "shared_context", "profiler"],
|
|
95
|
+
// Operator: decision intelligence + company tracking + causal memory + action tracing
|
|
96
|
+
operator: ["deep_sim", "founder", "causal_memory", "autonomous_delivery", "sync_bridge", "shared_context", "profiler"],
|
|
87
97
|
// Researcher: decision intelligence + web + recon + session memory (~32 tools)
|
|
88
|
-
researcher: ["deep_sim", "web", "recon", "learning"],
|
|
98
|
+
researcher: ["deep_sim", "web", "recon", "learning", "autonomous_delivery", "sync_bridge", "shared_context", "profiler"],
|
|
89
99
|
// Cursor IDE has a hard 40-tool limit across ALL MCP servers.
|
|
90
100
|
cursor: ["deep_sim", "quality_gate", "learning", "session_memory", "web", "toon"],
|
|
101
|
+
// Hackathon: founder + web intelligence + entity enrichment + shared context
|
|
102
|
+
// Pairs with retention.sh for QA. Install: claude mcp add nodebench -- npx -y nodebench-mcp --preset=hackathon
|
|
103
|
+
hackathon: ["deep_sim", "founder", "learning", "web", "entity_enrichment", "autonomous_delivery", "sync_bridge", "shared_context", "recon", "local_dashboard", "delta", "profiler", "sweep", "monte_carlo"],
|
|
104
|
+
// Delta: full operating-intelligence preset — all delta.* packet tools + watchlist + entity intel
|
|
105
|
+
delta: ["deep_sim", "founder", "learning", "web", "entity_enrichment", "autonomous_delivery", "sync_bridge", "shared_context", "recon", "local_dashboard", "quality_gate", "execution_trace", "delta"],
|
|
91
106
|
full: ALL_DOMAIN_KEYS,
|
|
92
107
|
};
|
|
93
108
|
const PRESET_DESCRIPTIONS = {
|
|
94
|
-
default: "
|
|
95
|
-
starter: "
|
|
109
|
+
default: "Default v3 surface — 7 workflow tools plus discovery/meta helpers. Fast boot, one artifact-shaped workflow.",
|
|
110
|
+
starter: "Default v3 surface — 7 workflow tools plus discovery/meta helpers. Fast boot, one artifact-shaped workflow.",
|
|
111
|
+
power: "Extended workflow preset — founder + recon + web + packets without admin-only runtime surfaces.",
|
|
112
|
+
admin: "Admin/runtime preset — profiling, observability, dashboards, eval, and debug lanes.",
|
|
96
113
|
core: "Core AI Flywheel (~81 tools) — verification, eval, quality gates, learning, recon, mission harness",
|
|
97
114
|
web_dev: "Web projects — adds visual QA, SEO audit, git workflow, code architecture",
|
|
98
115
|
research: "Research workflows — adds web search, LLM calls, RSS feeds, email, docs",
|
|
@@ -102,24 +119,26 @@ const PRESET_DESCRIPTIONS = {
|
|
|
102
119
|
academic: "Academic papers — adds polish, review, translate, logic check, data analysis",
|
|
103
120
|
multi_agent: "Multi-agent teams — adds task locking, messaging, roles, oracle testing, frontend traversal",
|
|
104
121
|
content: "Content & publishing — adds LLM, accountability, email, RSS, platform queue",
|
|
105
|
-
founder: "Founder
|
|
122
|
+
founder: "Founder decision preset — company tracking, decision intelligence, shared context, local dashboard",
|
|
106
123
|
banker: "Banker/Analyst (~39 tools) — decision intelligence, company profiling, web research, recon",
|
|
107
|
-
operator: "Operator
|
|
124
|
+
operator: "Operator — decision intelligence, company tracking, causal memory, action tracing",
|
|
108
125
|
researcher: "Researcher (~32 tools) — decision intelligence, web search, recon, session memory",
|
|
109
126
|
cursor: "Cursor IDE (28 tools) — decision intelligence, quality gates, session memory, web, TOON encoding. Leaves 12 slots for other MCP servers.",
|
|
110
|
-
|
|
127
|
+
hackathon: "Hackathon — decision intelligence + entity intel + web research + team coordination. Pairs with retention.sh for QA.",
|
|
128
|
+
delta: "Delta (~65 tools) — full operating-intelligence preset. Entity intel, decision memos, watchlists, agent handoff, execution traces.",
|
|
129
|
+
full: "Everything — all domains for maximum coverage",
|
|
111
130
|
};
|
|
112
131
|
async function parseToolsets() {
|
|
113
132
|
if (cliArgs.includes("--help")) {
|
|
114
133
|
const lines = [
|
|
115
|
-
|
|
134
|
+
`nodebench-mcp v${NODEBENCH_VERSION} — Development Methodology MCP Server`,
|
|
116
135
|
"",
|
|
117
136
|
"Usage: nodebench-mcp [options]",
|
|
118
137
|
"",
|
|
119
138
|
"Options:",
|
|
120
139
|
" --toolsets <list> Comma-separated toolsets to enable (default: default)",
|
|
121
140
|
" --exclude <list> Comma-separated toolsets to exclude",
|
|
122
|
-
" --preset <name> Use a preset: default or full",
|
|
141
|
+
" --preset <name> Use a preset: default, power, admin, or full",
|
|
123
142
|
" --smart-preset Generate smart preset recommendation based on project type and usage history",
|
|
124
143
|
" --auto-preset Detect project type from package.json/pyproject.toml and recommend a preset",
|
|
125
144
|
" --stats Show usage statistics for current project",
|
|
@@ -127,8 +146,13 @@ async function parseToolsets() {
|
|
|
127
146
|
" --reset-stats Clear all usage analytics data",
|
|
128
147
|
" --list-presets List all available presets with descriptions",
|
|
129
148
|
" --dynamic Enable dynamic toolset loading (Search+Load pattern from arxiv 2509.20386)",
|
|
149
|
+
" --embedding Enable semantic embedding index on the default preset",
|
|
130
150
|
" --no-toon Disable TOON encoding (TOON is on by default for ~40% token savings)",
|
|
131
|
-
" --no-embedding Disable neural embedding search
|
|
151
|
+
" --no-embedding Disable neural embedding search",
|
|
152
|
+
" --profile Enable profiling proxy — logs every tool call with cost/latency",
|
|
153
|
+
" --admin Enable admin runtime surfaces (dashboards + watchdog)",
|
|
154
|
+
" --dashboards Start local dashboards explicitly",
|
|
155
|
+
" --watchdog Start observability watchdog explicitly",
|
|
132
156
|
" --engine Start headless API engine server on port 6276",
|
|
133
157
|
" --engine-secret <s> Require Bearer token for engine API (or set ENGINE_SECRET env var)",
|
|
134
158
|
" --explain <tool> Show plain-English explanation of a tool and exit",
|
|
@@ -147,12 +171,14 @@ async function parseToolsets() {
|
|
|
147
171
|
}),
|
|
148
172
|
"",
|
|
149
173
|
"Examples:",
|
|
150
|
-
" npx nodebench-mcp # Default
|
|
174
|
+
" npx nodebench-mcp # Default v3 core workflow surface",
|
|
175
|
+
" npx nodebench-mcp --preset power # Extended founder/research surface",
|
|
176
|
+
" npx nodebench-mcp --preset admin # Profiling, observability, dashboards",
|
|
151
177
|
" npx nodebench-mcp --preset web_dev # Web development (+ vision, SEO, git)",
|
|
152
178
|
" npx nodebench-mcp --preset research # Research workflows (+ web, LLM, RSS, email)",
|
|
153
179
|
" npx nodebench-mcp --preset data # Data analysis (+ local file parsing, LLM)",
|
|
154
180
|
" npx nodebench-mcp --preset academic # Academic writing (+ paper tools, LLM)",
|
|
155
|
-
" npx nodebench-mcp --preset full # All
|
|
181
|
+
" npx nodebench-mcp --preset full # All available domains",
|
|
156
182
|
" npx nodebench-mcp --smart-preset # Get AI-powered preset recommendation",
|
|
157
183
|
" npx nodebench-mcp --stats # Show usage statistics",
|
|
158
184
|
" npx nodebench-mcp --toolsets verification,eval,recon",
|
|
@@ -195,7 +221,7 @@ async function parseToolsets() {
|
|
|
195
221
|
const domainsToLoad = ALL_DOMAIN_KEYS.filter((k) => !excluded.has(k));
|
|
196
222
|
return loadToolsets(domainsToLoad);
|
|
197
223
|
}
|
|
198
|
-
// Default to
|
|
224
|
+
// Default to the v3 core workflow facade
|
|
199
225
|
return loadToolsets(PRESETS.default);
|
|
200
226
|
}
|
|
201
227
|
// ── Analytics CLI flag handling ─────────────────────────────────────────
|
|
@@ -454,9 +480,11 @@ if (autoPresetFlag) {
|
|
|
454
480
|
signals.push("academic: LaTeX files found");
|
|
455
481
|
recommended = "academic";
|
|
456
482
|
}
|
|
457
|
-
// Output — load
|
|
458
|
-
await loadToolsets(ALL_DOMAIN_KEYS);
|
|
483
|
+
// Output — only load the recommended preset to keep auto-preset fast
|
|
459
484
|
const presetToolsets = PRESETS[recommended];
|
|
485
|
+
if (presetToolsets) {
|
|
486
|
+
await loadToolsets(presetToolsets);
|
|
487
|
+
}
|
|
460
488
|
const toolCount = presetToolsets
|
|
461
489
|
? presetToolsets.reduce((s, k) => s + (TOOLSET_MAP[k]?.length ?? 0), 0) + 12
|
|
462
490
|
: 0;
|
|
@@ -491,22 +519,24 @@ if (healthFlag) {
|
|
|
491
519
|
const warn = `${Y}WARN${X}`;
|
|
492
520
|
const fail = `${R}FAIL${X}`;
|
|
493
521
|
const lines = [];
|
|
494
|
-
lines.push(`${B}NodeBench MCP
|
|
522
|
+
lines.push(`${B}NodeBench MCP v${NODEBENCH_VERSION} — Health Check${X}`);
|
|
495
523
|
lines.push("");
|
|
496
|
-
// 1. Tool count + preset — load
|
|
497
|
-
|
|
498
|
-
const presetIdx2 = cliArgs.indexOf("--preset");
|
|
499
|
-
const activePreset = presetIdx2 !== -1 && cliArgs[presetIdx2 + 1] ? cliArgs[presetIdx2 + 1] : "default";
|
|
500
|
-
const domainCount = Object.keys(TOOLSET_MAP).length;
|
|
501
|
-
const totalTools = Object.values(TOOLSET_MAP).reduce((s, v) => s + v.length, 0);
|
|
524
|
+
// 1. Tool count + preset — load only the active preset for a fast health path
|
|
525
|
+
const activePreset = requestedPreset;
|
|
502
526
|
const presetToolsets = PRESETS[activePreset];
|
|
527
|
+
if (presetToolsets) {
|
|
528
|
+
await loadToolsets(presetToolsets);
|
|
529
|
+
}
|
|
503
530
|
const presetToolCount = presetToolsets
|
|
504
531
|
? presetToolsets.reduce((s, k) => s + (TOOLSET_MAP[k]?.length ?? 0), 0) + 12
|
|
505
|
-
:
|
|
506
|
-
lines.push(`${C}Tools${X} ${presetToolCount}
|
|
532
|
+
: 12;
|
|
533
|
+
lines.push(`${C}Tools${X} ${presetToolCount} visible (preset: ${activePreset}) | ${ALL_DOMAIN_KEYS.length} domains available`);
|
|
507
534
|
// 2. TOON + Embedding
|
|
508
535
|
lines.push(`${C}TOON${X} ${useToon ? ok : `${warn} disabled (--no-toon)`}`);
|
|
509
|
-
lines.push(`${C}Embedding${X} ${useEmbedding ? ok : `${warn} disabled
|
|
536
|
+
lines.push(`${C}Embedding${X} ${useEmbedding ? ok : `${warn} disabled on default hot path`}`);
|
|
537
|
+
lines.push(`${C}Runtime${X} ${runtimeFlags.enableDashboards || runtimeFlags.enableWatchdog
|
|
538
|
+
? `${ok} admin surfaces enabled`
|
|
539
|
+
: `${warn} core-only (pass --admin, --dashboards, or --watchdog to enable admin runtime)`}`);
|
|
510
540
|
// 3. Database
|
|
511
541
|
const os = await import("node:os");
|
|
512
542
|
const path = await import("node:path");
|
|
@@ -592,6 +622,39 @@ if (healthFlag) {
|
|
|
592
622
|
catch { /* not running */ }
|
|
593
623
|
lines.push(` ${reachable ? ok : `${Y}--${X}`} ${name.padEnd(22)} :${port}${reachable ? "" : " (not running)"}`);
|
|
594
624
|
}
|
|
625
|
+
// 9. Version check (npm registry)
|
|
626
|
+
lines.push("");
|
|
627
|
+
lines.push(`${B}Version${X}`);
|
|
628
|
+
const currentVersion = NODEBENCH_VERSION;
|
|
629
|
+
let latestVersion = "";
|
|
630
|
+
try {
|
|
631
|
+
const controller = new AbortController();
|
|
632
|
+
const timeout = setTimeout(() => controller.abort(), 3000);
|
|
633
|
+
const res = await fetch("https://registry.npmjs.org/nodebench-mcp/latest", {
|
|
634
|
+
signal: controller.signal,
|
|
635
|
+
headers: { Accept: "application/json" },
|
|
636
|
+
});
|
|
637
|
+
clearTimeout(timeout);
|
|
638
|
+
if (res.ok) {
|
|
639
|
+
const data = await res.json();
|
|
640
|
+
latestVersion = data.version || "";
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
catch { /* offline or timeout */ }
|
|
644
|
+
const versionDelta = latestVersion ? comparePackageVersions(latestVersion, currentVersion) : 0;
|
|
645
|
+
if (latestVersion && versionDelta > 0) {
|
|
646
|
+
lines.push(` ${Y}UPDATE${X} ${currentVersion} → ${G}${latestVersion}${X}`);
|
|
647
|
+
lines.push(` Run: ${C}npm install -g ${NODEBENCH_PACKAGE_NAME}@latest${X}`);
|
|
648
|
+
}
|
|
649
|
+
else if (latestVersion && versionDelta === 0) {
|
|
650
|
+
lines.push(` ${ok} v${currentVersion} (up to date)`);
|
|
651
|
+
}
|
|
652
|
+
else if (latestVersion) {
|
|
653
|
+
lines.push(` ${ok} v${currentVersion} (ahead of npm latest v${latestVersion})`);
|
|
654
|
+
}
|
|
655
|
+
else {
|
|
656
|
+
lines.push(` ${ok} v${currentVersion} (registry check skipped — offline?)`);
|
|
657
|
+
}
|
|
595
658
|
// Summary
|
|
596
659
|
lines.push("");
|
|
597
660
|
const allEnvSet = envChecks.filter(([k]) => !!process.env[k]).length;
|
|
@@ -930,9 +993,52 @@ if (syncConfigsFlag) {
|
|
|
930
993
|
else {
|
|
931
994
|
lines.push(` env: ${Y}(none set)${X}`);
|
|
932
995
|
}
|
|
996
|
+
// ── Copy rules to ~/.claude/rules/ ──────────────────────────────────
|
|
997
|
+
lines.push("");
|
|
998
|
+
lines.push(`${B}Rules${X}`);
|
|
999
|
+
const claudeRulesDir = path.join(os.homedir(), ".claude", "rules");
|
|
1000
|
+
if (!fs.existsSync(claudeRulesDir)) {
|
|
1001
|
+
fs.mkdirSync(claudeRulesDir, { recursive: true });
|
|
1002
|
+
}
|
|
1003
|
+
// Find rules directory relative to this file
|
|
1004
|
+
const thisDir = path.dirname(new URL(import.meta.url).pathname.replace(/^\/([A-Z]:)/, "$1"));
|
|
1005
|
+
const rulesSearchPaths = [
|
|
1006
|
+
path.resolve(thisDir, "..", "rules"), // dist/../rules (installed package)
|
|
1007
|
+
path.resolve(thisDir, "..", "..", "rules"), // src/../../rules (dev mode)
|
|
1008
|
+
];
|
|
1009
|
+
let rulesDir = "";
|
|
1010
|
+
for (const p of rulesSearchPaths) {
|
|
1011
|
+
if (fs.existsSync(p)) {
|
|
1012
|
+
rulesDir = p;
|
|
1013
|
+
break;
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
let rulesInstalled = 0;
|
|
1017
|
+
if (rulesDir) {
|
|
1018
|
+
const ruleFiles = fs.readdirSync(rulesDir).filter((f) => f.startsWith("nodebench-") && f.endsWith(".md"));
|
|
1019
|
+
for (const file of ruleFiles) {
|
|
1020
|
+
const src = path.join(rulesDir, file);
|
|
1021
|
+
const dest = path.join(claudeRulesDir, file);
|
|
1022
|
+
// Don't overwrite if user's version is newer
|
|
1023
|
+
if (fs.existsSync(dest)) {
|
|
1024
|
+
const srcStat = fs.statSync(src);
|
|
1025
|
+
const destStat = fs.statSync(dest);
|
|
1026
|
+
if (destStat.mtimeMs > srcStat.mtimeMs) {
|
|
1027
|
+
lines.push(` ${Y}SKIP${X} ${file} (user version is newer)`);
|
|
1028
|
+
continue;
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
fs.copyFileSync(src, dest);
|
|
1032
|
+
rulesInstalled++;
|
|
1033
|
+
}
|
|
1034
|
+
lines.push(` ${G}OK${X} Installed ${rulesInstalled} rules to ${claudeRulesDir}`);
|
|
1035
|
+
}
|
|
1036
|
+
else {
|
|
1037
|
+
lines.push(` ${Y}WARN${X} Rules directory not found — rules not copied`);
|
|
1038
|
+
}
|
|
933
1039
|
lines.push("");
|
|
934
1040
|
const successCount = results.filter(r => r.action !== "failed").length;
|
|
935
|
-
lines.push(`${B}Written to ${successCount}/${results.length}
|
|
1041
|
+
lines.push(`${B}Written to ${successCount}/${results.length} IDE configs | ${rulesInstalled} rules installed${X}`);
|
|
936
1042
|
console.log(lines.join("\n"));
|
|
937
1043
|
process.exit(0);
|
|
938
1044
|
}
|
|
@@ -981,6 +1087,109 @@ if (cliArgs.length === 0 || (subCmd === undefined && !cliArgs.includes("--stdio"
|
|
|
981
1087
|
console.log(welcome.join("\n"));
|
|
982
1088
|
process.exit(0);
|
|
983
1089
|
}
|
|
1090
|
+
// ── Delta subcommands (run-and-exit, banking-convention verbs) ────────
|
|
1091
|
+
const DELTA_VERBS = ["brief", "diligence", "handoff", "watch", "memo", "scan", "compare", "review", "retain", "packets", "dogfood"];
|
|
1092
|
+
if (subCmd && DELTA_VERBS.includes(subCmd)) {
|
|
1093
|
+
const { createDeltaTools } = await import("./tools/deltaTools.js");
|
|
1094
|
+
const deltaTools = createDeltaTools();
|
|
1095
|
+
const toolName = subCmd === "packets" ? "delta_packets"
|
|
1096
|
+
: subCmd === "watch" ? "delta_watch"
|
|
1097
|
+
: subCmd === "dogfood" ? "delta_self_dogfood"
|
|
1098
|
+
: `delta_${subCmd}`;
|
|
1099
|
+
const tool = deltaTools.find((t) => t.name === toolName);
|
|
1100
|
+
if (!tool) {
|
|
1101
|
+
console.error(`Unknown delta command: ${subCmd}`);
|
|
1102
|
+
process.exit(1);
|
|
1103
|
+
}
|
|
1104
|
+
// Parse remaining args as JSON or key=value pairs
|
|
1105
|
+
const rawToolArgs = cliArgs.filter((a) => a !== subCmd && !a.startsWith("--"));
|
|
1106
|
+
const argStr = rawToolArgs.join(" ");
|
|
1107
|
+
const parseCliScalar = (value) => {
|
|
1108
|
+
if (value === "true")
|
|
1109
|
+
return true;
|
|
1110
|
+
if (value === "false")
|
|
1111
|
+
return false;
|
|
1112
|
+
if (/^-?\d+(\.\d+)?$/.test(value))
|
|
1113
|
+
return Number(value);
|
|
1114
|
+
if ((value.startsWith("{") && value.endsWith("}")) || (value.startsWith("[") && value.endsWith("]"))) {
|
|
1115
|
+
try {
|
|
1116
|
+
return JSON.parse(value);
|
|
1117
|
+
}
|
|
1118
|
+
catch {
|
|
1119
|
+
return value;
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
return value;
|
|
1123
|
+
};
|
|
1124
|
+
let toolArgs = {};
|
|
1125
|
+
if (argStr) {
|
|
1126
|
+
try {
|
|
1127
|
+
toolArgs = JSON.parse(argStr);
|
|
1128
|
+
}
|
|
1129
|
+
catch {
|
|
1130
|
+
if (rawToolArgs.length === 1) {
|
|
1131
|
+
try {
|
|
1132
|
+
toolArgs = JSON.parse(rawToolArgs[0]);
|
|
1133
|
+
}
|
|
1134
|
+
catch {
|
|
1135
|
+
toolArgs = {};
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
// Check for key=value pairs first, collect remaining as positional
|
|
1139
|
+
const kvParts = [];
|
|
1140
|
+
const positionalParts = [];
|
|
1141
|
+
for (const part of rawToolArgs) {
|
|
1142
|
+
const eqIdx = part.indexOf("=");
|
|
1143
|
+
if (eqIdx > 0) {
|
|
1144
|
+
toolArgs[part.slice(0, eqIdx)] = parseCliScalar(part.slice(eqIdx + 1));
|
|
1145
|
+
kvParts.push(part);
|
|
1146
|
+
}
|
|
1147
|
+
else {
|
|
1148
|
+
positionalParts.push(part);
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
// Join ALL positional words as the primary arg (handles multi-word strings)
|
|
1152
|
+
if (positionalParts.length > 0) {
|
|
1153
|
+
const fullPositional = positionalParts.join(" ");
|
|
1154
|
+
if (subCmd === "diligence" || subCmd === "compare")
|
|
1155
|
+
toolArgs.entity = toolArgs.entity || fullPositional;
|
|
1156
|
+
else if (subCmd === "watch")
|
|
1157
|
+
toolArgs.entity = toolArgs.entity || fullPositional;
|
|
1158
|
+
else if (subCmd === "memo")
|
|
1159
|
+
toolArgs.decision = toolArgs.decision || fullPositional;
|
|
1160
|
+
else if (subCmd === "handoff")
|
|
1161
|
+
toolArgs.task = toolArgs.task || fullPositional;
|
|
1162
|
+
else if (subCmd === "retain")
|
|
1163
|
+
toolArgs.content = toolArgs.content || fullPositional;
|
|
1164
|
+
else if (subCmd === "review")
|
|
1165
|
+
toolArgs.forecast = toolArgs.forecast || fullPositional;
|
|
1166
|
+
}
|
|
1167
|
+
// Default action for watch
|
|
1168
|
+
if (subCmd === "watch" && !toolArgs.action)
|
|
1169
|
+
toolArgs.action = toolArgs.entity ? "add" : "list";
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
else if (subCmd === "watch") {
|
|
1173
|
+
toolArgs.action = "list";
|
|
1174
|
+
}
|
|
1175
|
+
try {
|
|
1176
|
+
const result = await tool.handler(toolArgs);
|
|
1177
|
+
const structuredResult = result;
|
|
1178
|
+
const text = structuredResult.content?.[0]?.text || JSON.stringify(result);
|
|
1179
|
+
try {
|
|
1180
|
+
const parsed = JSON.parse(text);
|
|
1181
|
+
console.log(JSON.stringify(parsed, null, 2));
|
|
1182
|
+
}
|
|
1183
|
+
catch {
|
|
1184
|
+
console.log(text);
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
catch (err) {
|
|
1188
|
+
console.error(`Error running delta_${subCmd}:`, err);
|
|
1189
|
+
process.exit(1);
|
|
1190
|
+
}
|
|
1191
|
+
process.exit(0);
|
|
1192
|
+
}
|
|
984
1193
|
// ── Demo subcommand (run-and-exit) ───────────────────────────────────
|
|
985
1194
|
if (subCmd === "demo") {
|
|
986
1195
|
const USE_COLOR = process.stdout.isTTY;
|
|
@@ -1231,7 +1440,7 @@ if (subCmd === "setup") {
|
|
|
1231
1440
|
lines.push(` ${C}Dashboard:${X} https://www.nodebenchai.com/founder`);
|
|
1232
1441
|
lines.push(` ${C}Agent setup:${X} https://www.nodebenchai.com/agent-setup.txt`);
|
|
1233
1442
|
lines.push("");
|
|
1234
|
-
lines.push(` ${Y}Presets:${X} --preset default (
|
|
1443
|
+
lines.push(` ${Y}Presets:${X} --preset default (core workflow) | --preset power | --preset admin`);
|
|
1235
1444
|
lines.push(` ${Y}Founder tools:${X} founder_deep_context_gather, founder_packet_validate, founder_packet_diff`);
|
|
1236
1445
|
lines.push("");
|
|
1237
1446
|
console.log(lines.join("\n"));
|
|
@@ -1243,13 +1452,9 @@ getDb();
|
|
|
1243
1452
|
_setDbAccessor(getDb);
|
|
1244
1453
|
// Assemble tools (filtered by --toolsets / --exclude / --preset if provided)
|
|
1245
1454
|
let domainTools = await parseToolsets();
|
|
1246
|
-
// Determine current preset name for analytics
|
|
1247
|
-
let currentPreset =
|
|
1248
|
-
|
|
1249
|
-
if (presetIdx !== -1 && cliArgs[presetIdx + 1]) {
|
|
1250
|
-
currentPreset = cliArgs[presetIdx + 1];
|
|
1251
|
-
}
|
|
1252
|
-
else if (cliArgs.includes("--toolsets") || cliArgs.includes("--exclude")) {
|
|
1455
|
+
// Determine current preset name for analytics/runtime gating
|
|
1456
|
+
let currentPreset = requestedPreset;
|
|
1457
|
+
if (cliArgs.includes("--toolsets") || cliArgs.includes("--exclude")) {
|
|
1253
1458
|
currentPreset = 'custom';
|
|
1254
1459
|
}
|
|
1255
1460
|
// Dynamic loading: --dynamic flag enables Search+Load architecture
|
|
@@ -1727,8 +1932,44 @@ const dynamicLoadingTools = [
|
|
|
1727
1932
|
},
|
|
1728
1933
|
},
|
|
1729
1934
|
];
|
|
1935
|
+
// v3 preset gate: expose only facade tools + discover_tools + load_toolset
|
|
1936
|
+
const isV3Surface = currentPreset === "default" || currentPreset === "starter" || currentPreset === "v3";
|
|
1730
1937
|
// Combine all tools (mutable for dynamic loading)
|
|
1731
|
-
let allTools
|
|
1938
|
+
let allTools;
|
|
1939
|
+
if (isV3Surface) {
|
|
1940
|
+
allTools = [
|
|
1941
|
+
...domainTools,
|
|
1942
|
+
...discoveryTools.filter(t => t.name === "discover_tools"),
|
|
1943
|
+
...dynamicLoadingTools.filter(t => t.name === "load_toolset"),
|
|
1944
|
+
];
|
|
1945
|
+
}
|
|
1946
|
+
else {
|
|
1947
|
+
allTools = [...allToolsWithoutDiscovery, ...discoveryTools, ...dynamicLoadingTools];
|
|
1948
|
+
}
|
|
1949
|
+
// Always initialize profiler tables (lightweight, non-blocking)
|
|
1950
|
+
try {
|
|
1951
|
+
const { initEventCollectorTables } = require("./profiler/eventCollector.js");
|
|
1952
|
+
const { initWorkflowTemplateTables } = require("./profiler/workflowTemplates.js");
|
|
1953
|
+
const { initProofEngineTables } = require("./profiler/proofEngine.js");
|
|
1954
|
+
const { initModelRoutingTables } = require("./profiler/modelRouter.js");
|
|
1955
|
+
initEventCollectorTables();
|
|
1956
|
+
initWorkflowTemplateTables();
|
|
1957
|
+
initProofEngineTables();
|
|
1958
|
+
initModelRoutingTables();
|
|
1959
|
+
}
|
|
1960
|
+
catch { /* profiler tables optional */ }
|
|
1961
|
+
// Wrap all tools with profiling proxy when --profile is set
|
|
1962
|
+
// This adds ~1ms per tool call but logs everything to SQLite
|
|
1963
|
+
if (useProfile) {
|
|
1964
|
+
try {
|
|
1965
|
+
const { wrapToolsWithProxy } = require("./profiler/mcpProxy.js");
|
|
1966
|
+
allTools = wrapToolsWithProxy(allTools, { sessionId: `mcp_${Date.now().toString(36)}` });
|
|
1967
|
+
console.error("[profiler] All tools wrapped with profiling proxy (--profile)");
|
|
1968
|
+
}
|
|
1969
|
+
catch (e) {
|
|
1970
|
+
console.error("[profiler] Failed to enable profiling:", e?.message);
|
|
1971
|
+
}
|
|
1972
|
+
}
|
|
1732
1973
|
// Background: initialize embedding index for semantic search (non-blocking)
|
|
1733
1974
|
// Uses Agent-as-a-Graph bipartite corpus: tool nodes + domain nodes for graph-aware retrieval
|
|
1734
1975
|
if (useEmbedding) {
|
|
@@ -1777,7 +2018,16 @@ for (const tool of allTools) {
|
|
|
1777
2018
|
}
|
|
1778
2019
|
// Rebuild function for dynamic loading — reconstructs allTools + toolMap
|
|
1779
2020
|
function rebuildAllTools() {
|
|
1780
|
-
|
|
2021
|
+
if (isV3Surface) {
|
|
2022
|
+
allTools = [
|
|
2023
|
+
...domainTools,
|
|
2024
|
+
...discoveryTools.filter(t => t.name === "discover_tools"),
|
|
2025
|
+
...dynamicLoadingTools.filter(t => t.name === "load_toolset"),
|
|
2026
|
+
];
|
|
2027
|
+
}
|
|
2028
|
+
else {
|
|
2029
|
+
allTools = [...allToolsWithoutDiscovery, ...discoveryTools, ...dynamicLoadingTools];
|
|
2030
|
+
}
|
|
1781
2031
|
toolMap = new Map();
|
|
1782
2032
|
for (const tool of allTools) {
|
|
1783
2033
|
toolMap.set(tool.name, tool);
|
|
@@ -2508,7 +2758,7 @@ You are connected to NodeBench MCP. Follow these rules EXACTLY.
|
|
|
2508
2758
|
|
|
2509
2759
|
### SELF-SETUP — If a capability is missing
|
|
2510
2760
|
When discover_tools returns nothing useful, or a tool says "not configured":
|
|
2511
|
-
1. Escalate toolset: If started
|
|
2761
|
+
1. Escalate toolset: If started on the default lane, switch to --preset power, --preset core, or targeted --toolsets
|
|
2512
2762
|
2. Resolve providers: Configure missing API keys (GEMINI_API_KEY, OPENAI_API_KEY, etc.)
|
|
2513
2763
|
3. Bootstrap infra: Run scaffold_nodebench_project or bootstrap_parallel_agents if repo lacks infra
|
|
2514
2764
|
4. Smoke-test: Re-run the first workflow chain step to confirm the capability is available
|
|
@@ -2870,7 +3120,7 @@ Use NodeBench tools when you need to:
|
|
|
2870
3120
|
- Audit SEO, analyze Figma flows, detect Android flicker
|
|
2871
3121
|
- Call LLMs (GPT, Claude, Gemini) for analysis and extraction
|
|
2872
3122
|
Start with discover_tools("<your task>") to find the right tool.`;
|
|
2873
|
-
const server = new Server({ name: "nodebench-mcp-methodology", version:
|
|
3123
|
+
const server = new Server({ name: "nodebench-mcp-methodology", version: NODEBENCH_VERSION }, {
|
|
2874
3124
|
capabilities: { tools: { listChanged: true }, prompts: {} },
|
|
2875
3125
|
instructions: SERVER_INSTRUCTIONS,
|
|
2876
3126
|
});
|
|
@@ -3076,19 +3326,22 @@ process.on('exit', () => {
|
|
|
3076
3326
|
// Connect via stdio
|
|
3077
3327
|
const transport = new StdioServerTransport();
|
|
3078
3328
|
await server.connect(transport);
|
|
3079
|
-
// Start local dashboard servers
|
|
3080
|
-
// Operating Dashboard is PRIMARY — shows business intelligence + system data
|
|
3329
|
+
// Start local dashboard servers only when explicitly requested.
|
|
3081
3330
|
let operatingDashboardPort = 0;
|
|
3082
|
-
|
|
3083
|
-
|
|
3331
|
+
if (runtimeFlags.enableDashboards) {
|
|
3332
|
+
try {
|
|
3333
|
+
operatingDashboardPort = await startOperatingDashboardServer(getDb(), 6274);
|
|
3334
|
+
}
|
|
3335
|
+
catch { /* operating dashboard is optional — don't block MCP */ }
|
|
3084
3336
|
}
|
|
3085
|
-
|
|
3086
|
-
// UI Dive dashboard is secondary — shows UI review sessions
|
|
3337
|
+
// UI Dive dashboard is secondary — also admin-only
|
|
3087
3338
|
let dashboardPort = 0;
|
|
3088
|
-
|
|
3089
|
-
|
|
3339
|
+
if (runtimeFlags.enableDashboards) {
|
|
3340
|
+
try {
|
|
3341
|
+
dashboardPort = await startDashboardServer(getDb(), 6278);
|
|
3342
|
+
}
|
|
3343
|
+
catch { /* dashboard is optional — don't block MCP */ }
|
|
3090
3344
|
}
|
|
3091
|
-
catch { /* dashboard is optional — don't block MCP */ }
|
|
3092
3345
|
// Start engine API server (non-blocking, best-effort)
|
|
3093
3346
|
let enginePort = 0;
|
|
3094
3347
|
if (useEngine) {
|
|
@@ -3105,12 +3358,14 @@ if (useEngine) {
|
|
|
3105
3358
|
}
|
|
3106
3359
|
catch { /* engine is optional — don't block MCP */ }
|
|
3107
3360
|
}
|
|
3108
|
-
// Start observability watchdog
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3361
|
+
// Start observability watchdog only when explicitly requested.
|
|
3362
|
+
if (runtimeFlags.enableWatchdog) {
|
|
3363
|
+
try {
|
|
3364
|
+
initObservability(getDb);
|
|
3365
|
+
startWatchdog(getDb());
|
|
3366
|
+
}
|
|
3367
|
+
catch { /* observability is optional — don't block MCP */ }
|
|
3112
3368
|
}
|
|
3113
|
-
catch { /* observability is optional — don't block MCP */ }
|
|
3114
3369
|
// Graceful shutdown
|
|
3115
3370
|
process.on("SIGINT", () => { stopWatchdog(); process.exit(0); });
|
|
3116
3371
|
process.on("SIGTERM", () => { stopWatchdog(); process.exit(0); });
|
|
@@ -3120,5 +3375,32 @@ const toolsetInfo = cliArgs.includes("--toolsets") || cliArgs.includes("--exclud
|
|
|
3120
3375
|
const dashInfo = operatingDashboardPort ? ` dashboard at http://127.0.0.1:${operatingDashboardPort}` : "";
|
|
3121
3376
|
const uiDiveInfo = dashboardPort ? ` ui-dive at http://127.0.0.1:${dashboardPort}` : "";
|
|
3122
3377
|
const engineInfo = enginePort ? ` engine at http://127.0.0.1:${enginePort}` : "";
|
|
3123
|
-
|
|
3378
|
+
const runtimeInfo = runtimeFlags.enableDashboards || runtimeFlags.enableWatchdog
|
|
3379
|
+
? " admin-runtime"
|
|
3380
|
+
: " core-runtime";
|
|
3381
|
+
console.error(`nodebench-mcp ready (${allTools.length} tools, ${PROMPTS.length} prompts${toolsetInfo}, SQLite at ~/.nodebench/${dashInfo}${uiDiveInfo}${engineInfo}${runtimeInfo})`);
|
|
3382
|
+
// ── Auto-brief on first start (delta/hackathon presets) ──────────────
|
|
3383
|
+
// When using delta or hackathon preset, auto-run delta_brief on first session
|
|
3384
|
+
// to give users immediate value before they even ask.
|
|
3385
|
+
const presetIdx2 = cliArgs.indexOf("--preset");
|
|
3386
|
+
const activePreset = presetIdx2 >= 0 ? cliArgs[presetIdx2 + 1] : "";
|
|
3387
|
+
if (activePreset === "hackathon" || activePreset === "delta" || cliArgs.includes("--auto-brief")) {
|
|
3388
|
+
(async () => {
|
|
3389
|
+
try {
|
|
3390
|
+
const { createDeltaTools } = await import("./tools/deltaTools.js");
|
|
3391
|
+
const dTools = createDeltaTools();
|
|
3392
|
+
const briefTool = dTools.find((t) => t.name === "delta_brief");
|
|
3393
|
+
if (briefTool) {
|
|
3394
|
+
const result = await briefTool.handler({ persona: "founder" });
|
|
3395
|
+
const text = result.content?.[0]?.text;
|
|
3396
|
+
if (text) {
|
|
3397
|
+
const parsed = JSON.parse(text);
|
|
3398
|
+
const comp = parsed.compounding;
|
|
3399
|
+
console.error(`[delta] Auto-brief: ${comp?.totalPackets ?? 0} packets, ${comp?.watchedCount ?? 0} watched, ${comp?.daysSinceFirst ?? 0} days active`);
|
|
3400
|
+
}
|
|
3401
|
+
}
|
|
3402
|
+
}
|
|
3403
|
+
catch { /* auto-brief is best-effort */ }
|
|
3404
|
+
})();
|
|
3405
|
+
}
|
|
3124
3406
|
//# sourceMappingURL=index.js.map
|