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.
Files changed (361) hide show
  1. package/README.md +95 -41
  2. package/dist/agents/alertRouter.d.ts +38 -0
  3. package/dist/agents/alertRouter.js +151 -0
  4. package/dist/agents/alertRouter.js.map +1 -0
  5. package/dist/agents/entityMemory.d.ts +40 -0
  6. package/dist/agents/entityMemory.js +64 -0
  7. package/dist/agents/entityMemory.js.map +1 -0
  8. package/dist/agents/subAgents.d.ts +35 -0
  9. package/dist/agents/subAgents.js +62 -0
  10. package/dist/agents/subAgents.js.map +1 -0
  11. package/dist/benchmarks/benchmarkRunner.js +14 -0
  12. package/dist/benchmarks/benchmarkRunner.js.map +1 -1
  13. package/dist/benchmarks/chainEval.js +107 -0
  14. package/dist/benchmarks/chainEval.js.map +1 -1
  15. package/dist/benchmarks/llmJudgeEval.js +85 -0
  16. package/dist/benchmarks/llmJudgeEval.js.map +1 -1
  17. package/dist/benchmarks/searchQualityEval.js +118 -5
  18. package/dist/benchmarks/searchQualityEval.js.map +1 -1
  19. package/dist/cli/search.d.ts +13 -0
  20. package/dist/cli/search.js +130 -0
  21. package/dist/cli/search.js.map +1 -0
  22. package/dist/dashboard/operatingDashboardHtml.js +2 -1
  23. package/dist/dashboard/operatingDashboardHtml.js.map +1 -1
  24. package/dist/dashboard/operatingServer.js +3 -2
  25. package/dist/dashboard/operatingServer.js.map +1 -1
  26. package/dist/db.d.ts +6 -2
  27. package/dist/db.js +521 -6
  28. package/dist/db.js.map +1 -1
  29. package/dist/index.js +349 -67
  30. package/dist/index.js.map +1 -1
  31. package/dist/packageInfo.d.ts +3 -0
  32. package/dist/packageInfo.js +32 -0
  33. package/dist/packageInfo.js.map +1 -0
  34. package/dist/profiler/behaviorStore.d.ts +97 -0
  35. package/dist/profiler/behaviorStore.js +276 -0
  36. package/dist/profiler/behaviorStore.js.map +1 -0
  37. package/dist/profiler/eventCollector.d.ts +119 -0
  38. package/dist/profiler/eventCollector.js +267 -0
  39. package/dist/profiler/eventCollector.js.map +1 -0
  40. package/dist/profiler/index.d.ts +15 -0
  41. package/dist/profiler/index.js +16 -0
  42. package/dist/profiler/index.js.map +1 -0
  43. package/dist/profiler/mcpProxy.d.ts +49 -0
  44. package/dist/profiler/mcpProxy.js +123 -0
  45. package/dist/profiler/mcpProxy.js.map +1 -0
  46. package/dist/profiler/modelRouter.d.ts +30 -0
  47. package/dist/profiler/modelRouter.js +99 -0
  48. package/dist/profiler/modelRouter.js.map +1 -0
  49. package/dist/profiler/otelReceiver.d.ts +17 -0
  50. package/dist/profiler/otelReceiver.js +62 -0
  51. package/dist/profiler/otelReceiver.js.map +1 -0
  52. package/dist/profiler/proofEngine.d.ts +41 -0
  53. package/dist/profiler/proofEngine.js +93 -0
  54. package/dist/profiler/proofEngine.js.map +1 -0
  55. package/dist/profiler/workflowTemplates.d.ts +41 -0
  56. package/dist/profiler/workflowTemplates.js +95 -0
  57. package/dist/profiler/workflowTemplates.js.map +1 -0
  58. package/dist/providers/localMemoryProvider.js +3 -2
  59. package/dist/providers/localMemoryProvider.js.map +1 -1
  60. package/dist/runtimeConfig.d.ts +11 -0
  61. package/dist/runtimeConfig.js +27 -0
  62. package/dist/runtimeConfig.js.map +1 -0
  63. package/dist/sandboxApi.js +2 -1
  64. package/dist/sandboxApi.js.map +1 -1
  65. package/dist/security/auditLog.js +8 -3
  66. package/dist/security/auditLog.js.map +1 -1
  67. package/dist/subconscious/blocks.d.ts +43 -0
  68. package/dist/subconscious/blocks.js +158 -0
  69. package/dist/subconscious/blocks.js.map +1 -0
  70. package/dist/subconscious/classifier.d.ts +22 -0
  71. package/dist/subconscious/classifier.js +118 -0
  72. package/dist/subconscious/classifier.js.map +1 -0
  73. package/dist/subconscious/graphEngine.d.ts +65 -0
  74. package/dist/subconscious/graphEngine.js +234 -0
  75. package/dist/subconscious/graphEngine.js.map +1 -0
  76. package/dist/subconscious/index.d.ts +19 -0
  77. package/dist/subconscious/index.js +20 -0
  78. package/dist/subconscious/index.js.map +1 -0
  79. package/dist/subconscious/tools.d.ts +5 -0
  80. package/dist/subconscious/tools.js +255 -0
  81. package/dist/subconscious/tools.js.map +1 -0
  82. package/dist/subconscious/whisperPolicy.d.ts +20 -0
  83. package/dist/subconscious/whisperPolicy.js +171 -0
  84. package/dist/subconscious/whisperPolicy.js.map +1 -0
  85. package/dist/sweep/engine.d.ts +27 -0
  86. package/dist/sweep/engine.js +244 -0
  87. package/dist/sweep/engine.js.map +1 -0
  88. package/dist/sweep/index.d.ts +9 -0
  89. package/dist/sweep/index.js +8 -0
  90. package/dist/sweep/index.js.map +1 -0
  91. package/dist/sweep/sources/github_trending.d.ts +6 -0
  92. package/dist/sweep/sources/github_trending.js +37 -0
  93. package/dist/sweep/sources/github_trending.js.map +1 -0
  94. package/dist/sweep/sources/hackernews.d.ts +7 -0
  95. package/dist/sweep/sources/hackernews.js +57 -0
  96. package/dist/sweep/sources/hackernews.js.map +1 -0
  97. package/dist/sweep/sources/openbb_finance.d.ts +9 -0
  98. package/dist/sweep/sources/openbb_finance.js +46 -0
  99. package/dist/sweep/sources/openbb_finance.js.map +1 -0
  100. package/dist/sweep/sources/producthunt.d.ts +6 -0
  101. package/dist/sweep/sources/producthunt.js +41 -0
  102. package/dist/sweep/sources/producthunt.js.map +1 -0
  103. package/dist/sweep/sources/web_signals.d.ts +7 -0
  104. package/dist/sweep/sources/web_signals.js +63 -0
  105. package/dist/sweep/sources/web_signals.js.map +1 -0
  106. package/dist/sweep/sources/yahoo_finance.d.ts +6 -0
  107. package/dist/sweep/sources/yahoo_finance.js +47 -0
  108. package/dist/sweep/sources/yahoo_finance.js.map +1 -0
  109. package/dist/sweep/types.d.ts +50 -0
  110. package/dist/sweep/types.js +9 -0
  111. package/dist/sweep/types.js.map +1 -0
  112. package/dist/sync/founderEpisodeStore.d.ts +98 -0
  113. package/dist/sync/founderEpisodeStore.js +230 -0
  114. package/dist/sync/founderEpisodeStore.js.map +1 -0
  115. package/dist/sync/hyperloopArchive.d.ts +51 -0
  116. package/dist/sync/hyperloopArchive.js +153 -0
  117. package/dist/sync/hyperloopArchive.js.map +1 -0
  118. package/dist/sync/hyperloopEval.d.ts +123 -0
  119. package/dist/sync/hyperloopEval.js +389 -0
  120. package/dist/sync/hyperloopEval.js.map +1 -0
  121. package/dist/sync/protocol.d.ts +172 -0
  122. package/dist/sync/protocol.js +9 -0
  123. package/dist/sync/protocol.js.map +1 -0
  124. package/dist/sync/sessionMemory.d.ts +47 -0
  125. package/dist/sync/sessionMemory.js +138 -0
  126. package/dist/sync/sessionMemory.js.map +1 -0
  127. package/dist/sync/store.d.ts +384 -0
  128. package/dist/sync/store.js +1435 -0
  129. package/dist/sync/store.js.map +1 -0
  130. package/dist/sync/syncBridgeClient.d.ts +30 -0
  131. package/dist/sync/syncBridgeClient.js +172 -0
  132. package/dist/sync/syncBridgeClient.js.map +1 -0
  133. package/dist/tools/autonomousDeliveryTools.d.ts +2 -0
  134. package/dist/tools/autonomousDeliveryTools.js +1104 -0
  135. package/dist/tools/autonomousDeliveryTools.js.map +1 -0
  136. package/dist/tools/boilerplateTools.js +10 -9
  137. package/dist/tools/boilerplateTools.js.map +1 -1
  138. package/dist/tools/claudeCodeIngestTools.d.ts +10 -0
  139. package/dist/tools/claudeCodeIngestTools.js +347 -0
  140. package/dist/tools/claudeCodeIngestTools.js.map +1 -0
  141. package/dist/tools/coreWorkflowTools.d.ts +2 -0
  142. package/dist/tools/coreWorkflowTools.js +488 -0
  143. package/dist/tools/coreWorkflowTools.js.map +1 -0
  144. package/dist/tools/deltaTools.d.ts +15 -0
  145. package/dist/tools/deltaTools.js +1522 -0
  146. package/dist/tools/deltaTools.js.map +1 -0
  147. package/dist/tools/documentationTools.js +2 -1
  148. package/dist/tools/documentationTools.js.map +1 -1
  149. package/dist/tools/entityLookupTools.d.ts +14 -0
  150. package/dist/tools/entityLookupTools.js +159 -0
  151. package/dist/tools/entityLookupTools.js.map +1 -0
  152. package/dist/tools/entityTemporalTools.d.ts +12 -0
  153. package/dist/tools/entityTemporalTools.js +330 -0
  154. package/dist/tools/entityTemporalTools.js.map +1 -0
  155. package/dist/tools/founderLocalPipeline.d.ts +215 -0
  156. package/dist/tools/founderLocalPipeline.js +1516 -2
  157. package/dist/tools/founderLocalPipeline.js.map +1 -1
  158. package/dist/tools/founderOperatingModel.d.ts +120 -0
  159. package/dist/tools/founderOperatingModel.js +469 -0
  160. package/dist/tools/founderOperatingModel.js.map +1 -0
  161. package/dist/tools/founderOperatingModelTools.d.ts +2 -0
  162. package/dist/tools/founderOperatingModelTools.js +169 -0
  163. package/dist/tools/founderOperatingModelTools.js.map +1 -0
  164. package/dist/tools/founderStrategicOpsTools.d.ts +2 -0
  165. package/dist/tools/founderStrategicOpsTools.js +1310 -0
  166. package/dist/tools/founderStrategicOpsTools.js.map +1 -0
  167. package/dist/tools/graphifyTools.d.ts +19 -0
  168. package/dist/tools/graphifyTools.js +375 -0
  169. package/dist/tools/graphifyTools.js.map +1 -0
  170. package/dist/tools/index.d.ts +3 -0
  171. package/dist/tools/index.js +4 -0
  172. package/dist/tools/index.js.map +1 -1
  173. package/dist/tools/monteCarloTools.d.ts +16 -0
  174. package/dist/tools/monteCarloTools.js +225 -0
  175. package/dist/tools/monteCarloTools.js.map +1 -0
  176. package/dist/tools/packetCompilerTools.d.ts +12 -0
  177. package/dist/tools/packetCompilerTools.js +322 -0
  178. package/dist/tools/packetCompilerTools.js.map +1 -0
  179. package/dist/tools/planSynthesisTools.d.ts +15 -0
  180. package/dist/tools/planSynthesisTools.js +455 -0
  181. package/dist/tools/planSynthesisTools.js.map +1 -0
  182. package/dist/tools/profilerTools.d.ts +20 -0
  183. package/dist/tools/profilerTools.js +364 -0
  184. package/dist/tools/profilerTools.js.map +1 -0
  185. package/dist/tools/progressiveDiscoveryTools.js +2 -1
  186. package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
  187. package/dist/tools/savingsTools.d.ts +11 -0
  188. package/dist/tools/savingsTools.js +155 -0
  189. package/dist/tools/savingsTools.js.map +1 -0
  190. package/dist/tools/scenarioCompilerTools.d.ts +14 -0
  191. package/dist/tools/scenarioCompilerTools.js +290 -0
  192. package/dist/tools/scenarioCompilerTools.js.map +1 -0
  193. package/dist/tools/sharedContextTools.d.ts +2 -0
  194. package/dist/tools/sharedContextTools.js +423 -0
  195. package/dist/tools/sharedContextTools.js.map +1 -0
  196. package/dist/tools/sitemapTools.d.ts +15 -0
  197. package/dist/tools/sitemapTools.js +560 -0
  198. package/dist/tools/sitemapTools.js.map +1 -0
  199. package/dist/tools/sweepTools.d.ts +9 -0
  200. package/dist/tools/sweepTools.js +112 -0
  201. package/dist/tools/sweepTools.js.map +1 -0
  202. package/dist/tools/syncBridgeTools.d.ts +2 -0
  203. package/dist/tools/syncBridgeTools.js +258 -0
  204. package/dist/tools/syncBridgeTools.js.map +1 -0
  205. package/dist/tools/toolRegistry.js +1223 -45
  206. package/dist/tools/toolRegistry.js.map +1 -1
  207. package/dist/tools/workspaceTools.d.ts +19 -0
  208. package/dist/tools/workspaceTools.js +762 -0
  209. package/dist/tools/workspaceTools.js.map +1 -0
  210. package/dist/toolsetRegistry.js +162 -3
  211. package/dist/toolsetRegistry.js.map +1 -1
  212. package/package.json +39 -38
  213. package/rules/nodebench-agentic-reliability.md +32 -0
  214. package/rules/nodebench-analyst-diagnostic.md +25 -0
  215. package/rules/nodebench-auto-qa.md +31 -0
  216. package/rules/nodebench-completion-traceability.md +22 -0
  217. package/rules/nodebench-flywheel-continuous.md +25 -0
  218. package/rules/nodebench-pre-release-review.md +24 -0
  219. package/rules/nodebench-qa-dogfood.md +26 -0
  220. package/rules/nodebench-scenario-testing.md +30 -0
  221. package/rules/nodebench-self-direction.md +23 -0
  222. package/rules/nodebench-self-judge-loop.md +24 -0
  223. package/scripts/install.sh +215 -0
  224. package/dist/__tests__/analytics.test.d.ts +0 -11
  225. package/dist/__tests__/analytics.test.js +0 -546
  226. package/dist/__tests__/analytics.test.js.map +0 -1
  227. package/dist/__tests__/architectComplex.test.d.ts +0 -1
  228. package/dist/__tests__/architectComplex.test.js +0 -373
  229. package/dist/__tests__/architectComplex.test.js.map +0 -1
  230. package/dist/__tests__/architectSmoke.test.d.ts +0 -1
  231. package/dist/__tests__/architectSmoke.test.js +0 -92
  232. package/dist/__tests__/architectSmoke.test.js.map +0 -1
  233. package/dist/__tests__/audit-registry.d.ts +0 -1
  234. package/dist/__tests__/audit-registry.js +0 -60
  235. package/dist/__tests__/audit-registry.js.map +0 -1
  236. package/dist/__tests__/batchAutopilot.test.d.ts +0 -8
  237. package/dist/__tests__/batchAutopilot.test.js +0 -218
  238. package/dist/__tests__/batchAutopilot.test.js.map +0 -1
  239. package/dist/__tests__/cliSubcommands.test.d.ts +0 -1
  240. package/dist/__tests__/cliSubcommands.test.js +0 -138
  241. package/dist/__tests__/cliSubcommands.test.js.map +0 -1
  242. package/dist/__tests__/comparativeBench.test.d.ts +0 -1
  243. package/dist/__tests__/comparativeBench.test.js +0 -722
  244. package/dist/__tests__/comparativeBench.test.js.map +0 -1
  245. package/dist/__tests__/critterCalibrationEval.d.ts +0 -8
  246. package/dist/__tests__/critterCalibrationEval.js +0 -370
  247. package/dist/__tests__/critterCalibrationEval.js.map +0 -1
  248. package/dist/__tests__/dynamicLoading.test.d.ts +0 -1
  249. package/dist/__tests__/dynamicLoading.test.js +0 -280
  250. package/dist/__tests__/dynamicLoading.test.js.map +0 -1
  251. package/dist/__tests__/embeddingProvider.test.d.ts +0 -1
  252. package/dist/__tests__/embeddingProvider.test.js +0 -86
  253. package/dist/__tests__/embeddingProvider.test.js.map +0 -1
  254. package/dist/__tests__/evalDatasetBench.test.d.ts +0 -1
  255. package/dist/__tests__/evalDatasetBench.test.js +0 -738
  256. package/dist/__tests__/evalDatasetBench.test.js.map +0 -1
  257. package/dist/__tests__/evalHarness.test.d.ts +0 -1
  258. package/dist/__tests__/evalHarness.test.js +0 -1107
  259. package/dist/__tests__/evalHarness.test.js.map +0 -1
  260. package/dist/__tests__/fixtures/bfcl_v3_long_context.sample.json +0 -264
  261. package/dist/__tests__/fixtures/generateBfclLongContextFixture.d.ts +0 -10
  262. package/dist/__tests__/fixtures/generateBfclLongContextFixture.js +0 -135
  263. package/dist/__tests__/fixtures/generateBfclLongContextFixture.js.map +0 -1
  264. package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.d.ts +0 -14
  265. package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.js +0 -189
  266. package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.js.map +0 -1
  267. package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.d.ts +0 -16
  268. package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.js +0 -154
  269. package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.js.map +0 -1
  270. package/dist/__tests__/fixtures/swebench_verified.sample.json +0 -162
  271. package/dist/__tests__/fixtures/toolbench_instruction.sample.json +0 -109
  272. package/dist/__tests__/forecastingDogfood.test.d.ts +0 -9
  273. package/dist/__tests__/forecastingDogfood.test.js +0 -284
  274. package/dist/__tests__/forecastingDogfood.test.js.map +0 -1
  275. package/dist/__tests__/forecastingScoring.test.d.ts +0 -9
  276. package/dist/__tests__/forecastingScoring.test.js +0 -202
  277. package/dist/__tests__/forecastingScoring.test.js.map +0 -1
  278. package/dist/__tests__/gaiaCapabilityAudioEval.test.d.ts +0 -15
  279. package/dist/__tests__/gaiaCapabilityAudioEval.test.js +0 -265
  280. package/dist/__tests__/gaiaCapabilityAudioEval.test.js.map +0 -1
  281. package/dist/__tests__/gaiaCapabilityEval.test.d.ts +0 -14
  282. package/dist/__tests__/gaiaCapabilityEval.test.js +0 -1259
  283. package/dist/__tests__/gaiaCapabilityEval.test.js.map +0 -1
  284. package/dist/__tests__/gaiaCapabilityFilesEval.test.d.ts +0 -15
  285. package/dist/__tests__/gaiaCapabilityFilesEval.test.js +0 -914
  286. package/dist/__tests__/gaiaCapabilityFilesEval.test.js.map +0 -1
  287. package/dist/__tests__/gaiaCapabilityMediaEval.test.d.ts +0 -15
  288. package/dist/__tests__/gaiaCapabilityMediaEval.test.js +0 -1101
  289. package/dist/__tests__/gaiaCapabilityMediaEval.test.js.map +0 -1
  290. package/dist/__tests__/helpers/answerMatch.d.ts +0 -41
  291. package/dist/__tests__/helpers/answerMatch.js +0 -267
  292. package/dist/__tests__/helpers/answerMatch.js.map +0 -1
  293. package/dist/__tests__/helpers/textLlm.d.ts +0 -25
  294. package/dist/__tests__/helpers/textLlm.js +0 -214
  295. package/dist/__tests__/helpers/textLlm.js.map +0 -1
  296. package/dist/__tests__/localDashboard.test.d.ts +0 -1
  297. package/dist/__tests__/localDashboard.test.js +0 -226
  298. package/dist/__tests__/localDashboard.test.js.map +0 -1
  299. package/dist/__tests__/multiHopDogfood.test.d.ts +0 -12
  300. package/dist/__tests__/multiHopDogfood.test.js +0 -303
  301. package/dist/__tests__/multiHopDogfood.test.js.map +0 -1
  302. package/dist/__tests__/openDatasetParallelEval.test.d.ts +0 -7
  303. package/dist/__tests__/openDatasetParallelEval.test.js +0 -209
  304. package/dist/__tests__/openDatasetParallelEval.test.js.map +0 -1
  305. package/dist/__tests__/openDatasetParallelEvalGaia.test.d.ts +0 -7
  306. package/dist/__tests__/openDatasetParallelEvalGaia.test.js +0 -279
  307. package/dist/__tests__/openDatasetParallelEvalGaia.test.js.map +0 -1
  308. package/dist/__tests__/openDatasetParallelEvalSwebench.test.d.ts +0 -7
  309. package/dist/__tests__/openDatasetParallelEvalSwebench.test.js +0 -220
  310. package/dist/__tests__/openDatasetParallelEvalSwebench.test.js.map +0 -1
  311. package/dist/__tests__/openDatasetParallelEvalToolbench.test.d.ts +0 -7
  312. package/dist/__tests__/openDatasetParallelEvalToolbench.test.js +0 -218
  313. package/dist/__tests__/openDatasetParallelEvalToolbench.test.js.map +0 -1
  314. package/dist/__tests__/openDatasetPerfComparison.test.d.ts +0 -10
  315. package/dist/__tests__/openDatasetPerfComparison.test.js +0 -318
  316. package/dist/__tests__/openDatasetPerfComparison.test.js.map +0 -1
  317. package/dist/__tests__/openclawDogfood.test.d.ts +0 -23
  318. package/dist/__tests__/openclawDogfood.test.js +0 -535
  319. package/dist/__tests__/openclawDogfood.test.js.map +0 -1
  320. package/dist/__tests__/openclawMessaging.test.d.ts +0 -14
  321. package/dist/__tests__/openclawMessaging.test.js +0 -232
  322. package/dist/__tests__/openclawMessaging.test.js.map +0 -1
  323. package/dist/__tests__/presetRealWorldBench.test.d.ts +0 -1
  324. package/dist/__tests__/presetRealWorldBench.test.js +0 -859
  325. package/dist/__tests__/presetRealWorldBench.test.js.map +0 -1
  326. package/dist/__tests__/tools.test.d.ts +0 -1
  327. package/dist/__tests__/tools.test.js +0 -3201
  328. package/dist/__tests__/tools.test.js.map +0 -1
  329. package/dist/__tests__/toolsetGatingEval.test.d.ts +0 -1
  330. package/dist/__tests__/toolsetGatingEval.test.js +0 -1099
  331. package/dist/__tests__/toolsetGatingEval.test.js.map +0 -1
  332. package/dist/__tests__/traceabilityDogfood.test.d.ts +0 -12
  333. package/dist/__tests__/traceabilityDogfood.test.js +0 -241
  334. package/dist/__tests__/traceabilityDogfood.test.js.map +0 -1
  335. package/dist/__tests__/webmcpTools.test.d.ts +0 -7
  336. package/dist/__tests__/webmcpTools.test.js +0 -195
  337. package/dist/__tests__/webmcpTools.test.js.map +0 -1
  338. package/dist/benchmarks/testProviderBus.d.ts +0 -7
  339. package/dist/benchmarks/testProviderBus.js +0 -272
  340. package/dist/benchmarks/testProviderBus.js.map +0 -1
  341. package/dist/hooks/postCompaction.d.ts +0 -14
  342. package/dist/hooks/postCompaction.js +0 -51
  343. package/dist/hooks/postCompaction.js.map +0 -1
  344. package/dist/security/__tests__/security.test.d.ts +0 -8
  345. package/dist/security/__tests__/security.test.js +0 -295
  346. package/dist/security/__tests__/security.test.js.map +0 -1
  347. package/dist/tools/documentTools.d.ts +0 -5
  348. package/dist/tools/documentTools.js +0 -524
  349. package/dist/tools/documentTools.js.map +0 -1
  350. package/dist/tools/financialTools.d.ts +0 -10
  351. package/dist/tools/financialTools.js +0 -403
  352. package/dist/tools/financialTools.js.map +0 -1
  353. package/dist/tools/memoryTools.d.ts +0 -5
  354. package/dist/tools/memoryTools.js +0 -137
  355. package/dist/tools/memoryTools.js.map +0 -1
  356. package/dist/tools/planningTools.d.ts +0 -5
  357. package/dist/tools/planningTools.js +0 -147
  358. package/dist/tools/planningTools.js.map +0 -1
  359. package/dist/tools/searchTools.d.ts +0 -5
  360. package/dist/tools/searchTools.js +0 -145
  361. package/dist/tools/searchTools.js.map +0 -1
@@ -15,6 +15,7 @@ import { readFileSync, existsSync, readdirSync, statSync } from "fs";
15
15
  import { join, resolve, dirname } from "path";
16
16
  import { fileURLToPath } from "url";
17
17
  import { getDb, genId } from "../db.js";
18
+ import { buildFounderOperatingModel, detectFounderCompanyMode, } from "./founderOperatingModel.js";
18
19
  const __filename = fileURLToPath(import.meta.url);
19
20
  const __dirname = dirname(__filename);
20
21
  /* ─── Helpers ────────────────────────────────────────────────────────────── */
@@ -36,6 +37,57 @@ function safeExec(cmd, cwd) {
36
37
  return "";
37
38
  }
38
39
  }
40
+ function extractBrandPrefix(value) {
41
+ if (!value)
42
+ return null;
43
+ const trimmed = value.trim().replace(/^#\s*/, "");
44
+ if (!trimmed)
45
+ return null;
46
+ const prefix = trimmed.split(/\s+[—–-]\s+/)[0]?.trim() ?? "";
47
+ return prefix || null;
48
+ }
49
+ function normalizeWorkspaceBrand(value) {
50
+ if (!value)
51
+ return null;
52
+ const trimmed = value.trim();
53
+ if (!trimmed)
54
+ return null;
55
+ const lower = trimmed.toLowerCase();
56
+ if (["nodebench", "nodebench ai", "nodebench-ai", "nodebench mcp", "nodebench-mcp", "nodebench_mcp"].includes(lower)) {
57
+ return "NodeBench";
58
+ }
59
+ if (lower.endsWith("-mcp") || lower.endsWith(" mcp")) {
60
+ return null;
61
+ }
62
+ return trimmed;
63
+ }
64
+ function inferWorkspaceProjectName(args) {
65
+ const candidates = [
66
+ normalizeWorkspaceBrand(args.siteName),
67
+ normalizeWorkspaceBrand(extractBrandPrefix(args.title)),
68
+ normalizeWorkspaceBrand(extractBrandPrefix(args.claudeHeading)),
69
+ normalizeWorkspaceBrand(args.rootPackageName),
70
+ normalizeWorkspaceBrand(args.packageName),
71
+ normalizeWorkspaceBrand(args.projectRoot?.split(/[\\/]/).filter(Boolean).pop() ?? null),
72
+ ];
73
+ return candidates.find((candidate) => Boolean(candidate)) ?? null;
74
+ }
75
+ function resolveWorkspaceCompanyName(ctx) {
76
+ const directCandidates = [
77
+ ctx.identity.projectName,
78
+ ctx.publicSurfaces.indexHtmlSiteName,
79
+ extractBrandPrefix(ctx.publicSurfaces.indexHtmlTitle),
80
+ ctx.identity.packageName,
81
+ ];
82
+ const normalized = directCandidates
83
+ .map((candidate) => normalizeWorkspaceBrand(candidate))
84
+ .find((candidate) => Boolean(candidate));
85
+ if (normalized)
86
+ return normalized;
87
+ if (ctx.identity.projectRoot.toLowerCase().includes("nodebench"))
88
+ return "NodeBench";
89
+ return null;
90
+ }
39
91
  function findProjectRoot() {
40
92
  // Walk up from packages/mcp-local to find the monorepo root (has CLAUDE.md)
41
93
  let dir = resolve(__dirname, "..", "..");
@@ -46,6 +98,783 @@ function findProjectRoot() {
46
98
  }
47
99
  return process.cwd();
48
100
  }
101
+ function includesAny(value, terms) {
102
+ const normalized = value.toLowerCase();
103
+ return terms.some((term) => normalized.includes(term.toLowerCase()));
104
+ }
105
+ function dedupeStrings(values) {
106
+ return [...new Set(values.filter(Boolean).map((value) => value.trim()).filter(Boolean))];
107
+ }
108
+ const PROGRESSION_TIERS = [
109
+ {
110
+ id: "clarity",
111
+ label: "Stage 0: Clarity",
112
+ priceLabel: "Free",
113
+ unlocks: ["Idea pressure test", "Founder profile baseline", "Starter packet"],
114
+ services: ["Search/upload/ask", "Basic founder packet", "Weekly reset"],
115
+ },
116
+ {
117
+ id: "foundation",
118
+ label: "Stage 1: Foundation",
119
+ priceLabel: "$1",
120
+ unlocks: ["Missing foundations", "Operating hygiene", "Delegation packet"],
121
+ services: ["Readiness checklist", "Decision memo export", "Team install plan"],
122
+ },
123
+ {
124
+ id: "readiness",
125
+ label: "Stage 2: Readiness",
126
+ priceLabel: "$5",
127
+ unlocks: ["Investor and banker packets", "Diligence pack", "Vertical checks"],
128
+ services: ["Runway workflows", "Qualification scoring", "Artifact history"],
129
+ },
130
+ {
131
+ id: "leverage",
132
+ label: "Stage 3: Leverage",
133
+ priceLabel: "$20",
134
+ unlocks: ["Ambient monitoring", "Benchmark evidence", "Workflow optimization"],
135
+ services: ["Shared context ops", "Autonomy benchmark lanes", "Premium exports"],
136
+ },
137
+ {
138
+ id: "scale",
139
+ label: "Stage 4: Scale",
140
+ priceLabel: "Custom",
141
+ unlocks: ["Hosted monitoring", "Workspace collaboration", "Enterprise diligence"],
142
+ services: ["Premium scoring", "Multi-device sync", "Partner packet surfaces"],
143
+ },
144
+ ];
145
+ function detectVerticalLabel(value) {
146
+ const normalized = value.toLowerCase();
147
+ if (includesAny(normalized, ["healthcare", "life science", "biotech", "medtech", "clinical", "trial", "patent", "fda", "lab"])) {
148
+ if (includesAny(normalized, ["medtech", "device", "robotic surgery"])) {
149
+ return { vertical: "healthcare/life sciences", subvertical: "medtech" };
150
+ }
151
+ return { vertical: "healthcare/life sciences", subvertical: "biotech and clinical" };
152
+ }
153
+ if (includesAny(normalized, ["robot", "robotics", "simulation", "world model", "agent", "mcp", "claude code", "developer", "workflow", "software", "saas", "ai"])) {
154
+ if (includesAny(normalized, ["robot", "robotics", "simulation", "world model"])) {
155
+ return { vertical: "AI/software", subvertical: "robotics and simulation tooling" };
156
+ }
157
+ return { vertical: "AI/software", subvertical: "developer and agent tooling" };
158
+ }
159
+ return { vertical: "founder/general", subvertical: "general operating system" };
160
+ }
161
+ function buildDiligencePack(vertical, sourceRefIds, strategicAngles) {
162
+ if (vertical === "healthcare/life sciences") {
163
+ const evidenceClasses = [
164
+ { id: "patents", label: "Patents and IP", description: "Patents, provisional filings, or IP chain-of-title evidence.", required: true },
165
+ { id: "publications", label: "Publications", description: "Peer-reviewed work, abstracts, preprints, or institutional publications.", required: true },
166
+ { id: "studies", label: "Studies and trials", description: "Preclinical, clinical, or observational study evidence with provenance.", required: true },
167
+ { id: "regulatory", label: "Regulatory path", description: "Submission path, approvals, or diligence notes tied to real requirements.", required: true },
168
+ { id: "institutional", label: "Institutional credibility", description: "Affiliations, advisors, lab partners, and trial sites.", required: true },
169
+ ];
170
+ const requirements = [
171
+ {
172
+ id: "ip-proof",
173
+ title: "Patent and claim verifiability",
174
+ status: includesAny(strategicAngles.map((angle) => angle.id).join(" "), ["stealth-moat"]) ? "watch" : "missing",
175
+ whyItMatters: "Healthcare claims get challenged quickly if the IP story is vague or not verifiable.",
176
+ evidenceClassIds: ["patents", "publications"],
177
+ },
178
+ {
179
+ id: "evidence-path",
180
+ title: "Clinical or research evidence path",
181
+ status: "missing",
182
+ whyItMatters: "Banks, investors, and serious partners will ask what data, trials, and institutions support the product claims.",
183
+ evidenceClassIds: ["studies", "institutional"],
184
+ },
185
+ {
186
+ id: "regulatory-path",
187
+ title: "Regulatory and submission clarity",
188
+ status: "missing",
189
+ whyItMatters: "Without a plausible regulatory path, the company looks naive during diligence.",
190
+ evidenceClassIds: ["regulatory"],
191
+ },
192
+ ];
193
+ return {
194
+ id: "healthcare_life_sciences",
195
+ label: "Healthcare / Life Sciences Diligence Pack",
196
+ summary: "Translate the company into the evidence, regulatory, and institutional proof that investors, banks, and partners will later ask for.",
197
+ externalEvaluators: ["Healthcare investors", "JPM startup banking", "Strategic partners", "Regulatory reviewers"],
198
+ evidenceClasses,
199
+ requirements,
200
+ highRiskClaims: ["patent defensibility", "clinical efficacy", "regulatory readiness", "scientific legitimacy"],
201
+ materials: ["Patent summary", "Publication list", "Trial or study evidence", "Regulatory path memo", "Institutional advisor list"],
202
+ readyDefinition: "Ready means the core claims can be backed by sourceable evidence, institutional context, and a credible submission path.",
203
+ };
204
+ }
205
+ const evidenceClasses = [
206
+ { id: "workflow", label: "Workflow adoption", description: "Proof that the product plugs into a high-frequency workflow users already run.", required: true },
207
+ { id: "installation", label: "Installability", description: "One-command install, predictable updates, and clear activation path.", required: true },
208
+ { id: "benchmarks", label: "Benchmark proof", description: "Before/after or cheapest-valid-path evidence tied to real workflows.", required: true },
209
+ { id: "distribution", label: "Distribution surfaces", description: "Ready surfaces for MCP, CLI, plugin, dashboard, or ecosystem partnerships.", required: true },
210
+ { id: "pull", label: "User pull", description: "Signals that people already want the workflow and would return to it.", required: false },
211
+ ];
212
+ const requirements = [
213
+ {
214
+ id: "workflow-fit",
215
+ title: "Workflow-native adoption",
216
+ status: strategicAngles.some((angle) => angle.id === "adoption" && angle.status === "strong") ? "ready" : "watch",
217
+ whyItMatters: "AI/software buyers reward products that land inside current habits like Claude Code, MCP, or browser workflows.",
218
+ evidenceClassIds: ["workflow"],
219
+ },
220
+ {
221
+ id: "install-surface",
222
+ title: "Installability and maintenance boundary",
223
+ status: strategicAngles.some((angle) => angle.id === "installability" && angle.status === "strong") ? "ready" : "watch",
224
+ whyItMatters: "If setup, updates, and support are fuzzy, the wedge will not spread.",
225
+ evidenceClassIds: ["installation", "distribution"],
226
+ },
227
+ {
228
+ id: "proof-story",
229
+ title: "Benchmark-backed proof story",
230
+ status: "watch",
231
+ whyItMatters: "Users and investors need visible evidence that the shorter, cheaper, or more useful path still preserves quality.",
232
+ evidenceClassIds: ["benchmarks", "pull"],
233
+ },
234
+ ];
235
+ return {
236
+ id: "ai_software",
237
+ label: "AI / Software Diligence Pack",
238
+ summary: "Focus the company on workflow fit, installability, benchmark proof, and distribution surfaces that compound quickly.",
239
+ externalEvaluators: ["Developers", "Founders", "AI infra buyers", "Early-stage investors"],
240
+ evidenceClasses,
241
+ requirements,
242
+ highRiskClaims: ["workflow lock-in", "maintainability", "distribution moat", "benchmark legitimacy"],
243
+ materials: ["Founder packet", "Install plan", "Benchmark memo", "Slack one-page report", "Partner surface map"],
244
+ readyDefinition: "Ready means the wedge is installable, benchmarked, and attached to a workflow users already run frequently.",
245
+ };
246
+ }
247
+ function buildScorecards(progressionProfile, readinessScore) {
248
+ const twoWeekMustHappen = [
249
+ "Produce one useful founder packet",
250
+ "Generate a progression diagnosis",
251
+ "Delegate one bounded task",
252
+ "Export one shareable artifact",
253
+ ];
254
+ const threeMonthMustHappen = [
255
+ "Show repeated packet reuse",
256
+ "Demonstrate ambient intervention value",
257
+ "Retain at least one paid-stage workflow",
258
+ "Publish one benchmark-backed proof story",
259
+ ];
260
+ return [
261
+ {
262
+ id: "two_week",
263
+ label: "2-week scorecard",
264
+ status: readinessScore >= 58 ? "on_track" : readinessScore >= 45 ? "watch" : "off_track",
265
+ summary: readinessScore >= 58
266
+ ? "On track if the team turns the current packet into one exported artifact and one delegated follow-up."
267
+ : "Off track until the team narrows the wedge and ships one useful artifact fast.",
268
+ mustHappen: twoWeekMustHappen,
269
+ },
270
+ {
271
+ id: "three_month",
272
+ label: "3-month scorecard",
273
+ status: progressionProfile.currentStage === "leverage" || progressionProfile.currentStage === "scale"
274
+ ? "on_track"
275
+ : readinessScore >= 52 ? "watch" : "off_track",
276
+ summary: progressionProfile.currentStage === "leverage" || progressionProfile.currentStage === "scale"
277
+ ? "On track if the workflow keeps compounding through reuse, monitoring, and benchmark evidence."
278
+ : "The next 3 months should prove habit, reuse, and at least one benchmark-backed moat story.",
279
+ mustHappen: threeMonthMustHappen,
280
+ },
281
+ ];
282
+ }
283
+ function buildDistributionSurfaceStatus(combinedText) {
284
+ return [
285
+ {
286
+ surfaceId: "mcp_cli",
287
+ label: "MCP / CLI",
288
+ status: includesAny(combinedText, ["mcp", "cli", "claude code", "local"]) ? "ready" : "partial",
289
+ whyItMatters: "This is the lowest-friction open-core distribution surface.",
290
+ },
291
+ {
292
+ surfaceId: "dashboard",
293
+ label: "Hosted dashboard",
294
+ status: includesAny(combinedText, ["dashboard", "subscription", "service", "team"]) ? "partial" : "missing",
295
+ whyItMatters: "This is the retained value and pricing surface for teams.",
296
+ },
297
+ {
298
+ surfaceId: "ecosystem",
299
+ label: "Ecosystem plugins and partners",
300
+ status: includesAny(combinedText, ["cursor", "smithery", "plugin", "github", "open source"]) ? "partial" : "missing",
301
+ whyItMatters: "This is how the workflow lands where users already spend time.",
302
+ },
303
+ ];
304
+ }
305
+ function inferCompanyNameCandidates(query, vertical) {
306
+ if (includesAny(query, ["robot", "robotics", "simulation", "world model", "cloth", "laundry"])) {
307
+ return ["Drape Labs", "Tensile AI", "Loom Motion", "FoldShift", "SoftDelta Robotics"];
308
+ }
309
+ if (vertical === "healthcare/life sciences") {
310
+ return ["SignalBio", "Verity Therapeutics", "TrialPath Labs", "ProofCell", "Atlas Medica"];
311
+ }
312
+ if (vertical === "AI/software") {
313
+ return ["Northstar Ops", "Vector Forge", "Signal Bench", "Packet Layer", "Operator Loop"];
314
+ }
315
+ return ["Northstar Labs", "Signal Forge", "Operator Stack", "Clarity Loop", "Atlas Foundry"];
316
+ }
317
+ function buildCompanyNamingPack(args) {
318
+ const suggestedNames = dedupeStrings([
319
+ args.existingCompanyName?.trim() ?? "",
320
+ ...inferCompanyNameCandidates(args.query, args.vertical),
321
+ ]).filter(Boolean);
322
+ const recommendedName = suggestedNames[0];
323
+ return {
324
+ suggestedNames,
325
+ recommendedName,
326
+ starterProfile: {
327
+ companyName: recommendedName,
328
+ oneLineDescription: `${args.vertical === "healthcare/life sciences" ? "Evidence-backed" : "Workflow-native"} platform for ${args.wedge.toLowerCase()}.`,
329
+ categories: [args.vertical, args.subvertical, "founder operating system"].filter(Boolean),
330
+ stage: args.companyState,
331
+ initialCustomers: args.vertical === "healthcare/life sciences"
332
+ ? ["Healthcare founders", "Life science investors", "Diligence-heavy partners"]
333
+ : ["Developers", "Founders", "Product teams", "AI infra buyers"],
334
+ wedge: args.wedge,
335
+ },
336
+ };
337
+ }
338
+ function buildFounderMaterialsChecklist(args) {
339
+ const weakAngles = new Set(args.strategicAngles.filter((angle) => angle.status !== "strong").map((angle) => angle.id));
340
+ return args.diligencePack.materials.map((label, index) => ({
341
+ id: `material:${index + 1}`,
342
+ label,
343
+ status: weakAngles.size > 3 && index < 2 ? "missing" : weakAngles.size > 0 ? "watch" : "ready",
344
+ audience: index < 2 ? "internal" : "external",
345
+ whyItMatters: `External evaluators will eventually ask for ${label.toLowerCase()} even if the founder has not prepared it yet.`,
346
+ }));
347
+ }
348
+ function buildFounderProgressionProfile(args) {
349
+ const missingFoundations = args.materialsChecklist
350
+ .filter((item) => item.status === "missing")
351
+ .map((item) => item.label);
352
+ const hiddenRisks = args.strategicAngles
353
+ .filter((angle) => angle.status !== "strong")
354
+ .map((angle) => `${angle.title}: ${angle.summary}`);
355
+ const nextUnlocks = [
356
+ {
357
+ id: "useful-packet",
358
+ title: "Generate one useful packet and use it in a real founder decision",
359
+ status: args.readinessScore >= 55 ? "ready" : "watch",
360
+ requiredSignals: ["Founder packet exported", "Decision memo reused"],
361
+ },
362
+ {
363
+ id: "delegation",
364
+ title: "Delegate one bounded task from the packet",
365
+ status: args.readinessScore >= 60 ? "ready" : "watch",
366
+ requiredSignals: ["Shared task exists", "Handoff prompt or packet URI reused"],
367
+ },
368
+ {
369
+ id: "benchmark-proof",
370
+ title: "Publish one benchmark-backed proof story",
371
+ status: args.readinessScore >= 70 ? "ready" : "missing",
372
+ requiredSignals: ["Before/after memo", "Validation checks passed", "Shortcut rationale documented"],
373
+ },
374
+ ];
375
+ let currentStage = "clarity";
376
+ if (args.readinessScore >= 82)
377
+ currentStage = "scale";
378
+ else if (args.readinessScore >= 70)
379
+ currentStage = "leverage";
380
+ else if (args.readinessScore >= 58)
381
+ currentStage = "readiness";
382
+ else if (args.readinessScore >= 45)
383
+ currentStage = "foundation";
384
+ return {
385
+ currentStage,
386
+ currentStageLabel: PROGRESSION_TIERS.find((tier) => tier.id === currentStage)?.label ?? "Stage 0: Clarity",
387
+ readinessScore: args.readinessScore,
388
+ missingFoundations,
389
+ hiddenRisks,
390
+ nextUnlocks,
391
+ delegableWork: [
392
+ "Collect competitor and market diligence",
393
+ "Prepare the Slack one-page report",
394
+ "Generate install and workflow adoption plans",
395
+ ],
396
+ founderOnlyWork: [
397
+ "Choose the wedge and moat story",
398
+ "Decide what stays stealthy",
399
+ "Own the top investor and partner narrative",
400
+ ],
401
+ onTrackStatus: args.readinessScore >= 60 ? "on_track" : args.readinessScore >= 48 ? "watch" : "off_track",
402
+ recommendedNextAction: nextUnlocks.find((unlock) => unlock.status !== "ready")?.title
403
+ ?? "Turn the current packet into the main founder workflow this week.",
404
+ };
405
+ }
406
+ function buildCompanyReadinessPacket(args) {
407
+ const tier = PROGRESSION_TIERS.find((item) => item.id === args.progressionProfile.currentStage) ?? PROGRESSION_TIERS[0];
408
+ return {
409
+ packetId: args.packetId,
410
+ visibility: args.visibility,
411
+ identity: {
412
+ companyName: args.namingPack.recommendedName,
413
+ vertical: args.vertical,
414
+ subvertical: args.subvertical,
415
+ stage: args.progressionProfile.currentStageLabel,
416
+ mission: args.namingPack.starterProfile.oneLineDescription,
417
+ wedge: args.namingPack.starterProfile.wedge,
418
+ },
419
+ founderTeamCredibility: [
420
+ "Map founder background to the chosen wedge",
421
+ "Make the right-to-win explicit before broad sharing",
422
+ ],
423
+ productAndWedge: [
424
+ args.namingPack.starterProfile.oneLineDescription,
425
+ `Primary wedge: ${args.namingPack.starterProfile.wedge}`,
426
+ ],
427
+ marketAndGtm: [
428
+ "Start with the highest-frequency workflow the user already runs",
429
+ "Use open-core MCP for trust and the dashboard for retained value",
430
+ ],
431
+ financialReadiness: [
432
+ "Runway and burn rate need an explicit view before fundraising",
433
+ "Paid stage progression should map to founder maturity, not arbitrary quotas",
434
+ ],
435
+ operatingReadiness: [
436
+ ...args.progressionProfile.delegableWork,
437
+ ...args.progressionProfile.founderOnlyWork,
438
+ ],
439
+ diligenceEvidence: args.diligencePack.materials,
440
+ contradictionsAndHiddenRisks: args.strategicAngles
441
+ .filter((angle) => angle.status !== "strong")
442
+ .map((angle) => angle.summary),
443
+ nextUnlocks: args.progressionProfile.nextUnlocks.map((unlock) => unlock.title),
444
+ pricingStage: {
445
+ stageId: tier.id,
446
+ label: tier.label,
447
+ priceLabel: tier.priceLabel,
448
+ },
449
+ distributionSurfaceStatus: args.distributionSurfaceStatus,
450
+ provenance: {
451
+ sourceRefIds: args.sourceRefIds,
452
+ confidence: args.confidence,
453
+ freshness: new Date().toISOString(),
454
+ },
455
+ allowedDestinations: ["slack_onepage", "investor_memo", "banker_readiness", "pitchbook_like", "crunchbase_like", "yc_context"],
456
+ sensitivity: args.visibility === "public" ? "workspace" : args.visibility,
457
+ };
458
+ }
459
+ function buildSlackOnepager(args) {
460
+ const status = args.progressionProfile.onTrackStatus.replace("_", " ");
461
+ const twoWeek = args.scorecards.find((item) => item.id === "two_week");
462
+ return {
463
+ id: "artifact:slack_onepage",
464
+ type: "slack_onepage",
465
+ title: "Founder one-page Slack report",
466
+ visibility: "workspace",
467
+ summary: "One-page founder report for Slack with stage, risks, unlocks, and next move.",
468
+ payload: {
469
+ text: [
470
+ `*NodeBench Founder Report*`,
471
+ `Question: ${args.query}`,
472
+ `Stage: ${args.progressionProfile.currentStageLabel}`,
473
+ `Readiness: ${args.progressionProfile.readinessScore}/100`,
474
+ `Status: ${status}`,
475
+ `Company: ${args.companyPacket.identity.companyName}`,
476
+ `Summary: ${args.summary}`,
477
+ `Next unlocks: ${args.progressionProfile.nextUnlocks.map((unlock) => unlock.title).join("; ")}`,
478
+ `2-week plan: ${twoWeek?.mustHappen.join("; ") ?? "Ship one useful packet and one delegated task."}`,
479
+ ].join("\n"),
480
+ },
481
+ };
482
+ }
483
+ function buildBenchmarkEvidence(args) {
484
+ const common = {
485
+ packetRef: args.packetId,
486
+ agentsInvolved: ["nodebench", "claude_code", "judge"],
487
+ validationFailures: [],
488
+ humanInterventions: ["Founder approves externally visible actions"],
489
+ };
490
+ return [
491
+ {
492
+ benchmarkId: genId("bench"),
493
+ lane: "weekly_founder_reset",
494
+ objective: "Turn founder context into a weekly reset packet and the next three moves.",
495
+ actionsTaken: ["Gather context", "Synthesize packet", "Export artifact"],
496
+ beforeState: "Context scattered across notes, code, and market signals.",
497
+ afterState: "One packet with next moves, risks, and exportable summary.",
498
+ artifactsProduced: ["Founder packet", "Slack one-page report"],
499
+ validationPasses: ["Packet assembled", "Citations retained", "Next move selected"],
500
+ timeMs: 1800,
501
+ estimatedCostUsd: 0.24,
502
+ reuseScore: Math.max(58, args.progressionProfile.readinessScore),
503
+ summary: "Weekly reset autopilot proves the product can compress founder context into one reusable artifact.",
504
+ ...common,
505
+ },
506
+ {
507
+ benchmarkId: genId("bench"),
508
+ lane: "cheapest_valid_workflow",
509
+ objective: `Find a shorter and cheaper valid path for: ${args.query}`,
510
+ actionsTaken: ["Compare current path", "Suggest optimized path", "Validate shortcut"],
511
+ beforeState: "Manual founder reasoning spread across repeated sessions.",
512
+ afterState: "Shorter validated path with explicit checks and reusable packet context.",
513
+ artifactsProduced: ["Workflow compare memo"],
514
+ validationPasses: ["Shortcut rationale documented", "Validation checks named"],
515
+ timeMs: 2200,
516
+ estimatedCostUsd: 0.19,
517
+ reuseScore: Math.max(52, args.progressionProfile.readinessScore - 4),
518
+ summary: "Cheapest-valid-path benchmarking turns workflow optimization into proof instead of hand-wavy speed claims.",
519
+ ...common,
520
+ },
521
+ ];
522
+ }
523
+ function buildWorkflowPathComparison(args) {
524
+ const currentPath = args.currentPath?.length
525
+ ? args.currentPath
526
+ : [
527
+ "Restate the context manually",
528
+ "Search for comparables",
529
+ "Draft a memo from scratch",
530
+ "Manually hand off the task",
531
+ ];
532
+ const optimizedPath = args.optimizedPath?.length
533
+ ? args.optimizedPath
534
+ : [
535
+ "Reuse the founder packet",
536
+ "Refresh missing diligence only",
537
+ "Export the one-page report",
538
+ "Delegate from the shared packet",
539
+ ];
540
+ return {
541
+ objective: args.objective,
542
+ currentPath,
543
+ optimizedPath,
544
+ rationale: "The optimized path removes repeated restatement and relies on the packet, export adapter, and shared delegation spine.",
545
+ validationChecks: [
546
+ "The same decision artifact still exists at the end",
547
+ "Required diligence fields remain present",
548
+ "The shortcut does not hide contradictory evidence",
549
+ ],
550
+ estimatedSavings: {
551
+ timePercent: 38,
552
+ costPercent: 24,
553
+ },
554
+ verdict: "valid",
555
+ };
556
+ }
557
+ export function buildFounderDirectionAssessment(args) {
558
+ const ctx = gatherLocalContext(args.daysBack ?? 14);
559
+ const lens = args.lens ?? "founder";
560
+ const combinedText = [
561
+ args.query,
562
+ args.extraContext ?? "",
563
+ ...(args.userSkillset ?? []),
564
+ ...(args.interests ?? []),
565
+ ...(args.constraints ?? []),
566
+ ...(args.marketWorkflow ?? []),
567
+ ...(ctx.recentChanges.modifiedFiles ?? []),
568
+ ].join(" ").toLowerCase();
569
+ const assessmentId = genId("assess");
570
+ const packetId = genId("packet");
571
+ const evidenceRefIds = ["source:claude", "source:readme", "source:dogfood"];
572
+ const sourceRefs = [
573
+ {
574
+ id: "source:claude",
575
+ label: "CLAUDE.md",
576
+ title: "Product and workflow identity",
577
+ type: "local",
578
+ status: "cited",
579
+ href: join(ctx.identity.projectRoot, "CLAUDE.md"),
580
+ excerpt: ctx.identity.claudeMdSnippet ?? "Internal product identity and operating rules.",
581
+ },
582
+ {
583
+ id: "source:readme",
584
+ label: "packages/mcp-local/README.md",
585
+ title: "Local MCP distribution surface",
586
+ type: "local",
587
+ status: "cited",
588
+ href: join(ctx.identity.projectRoot, "packages", "mcp-local", "README.md"),
589
+ excerpt: ctx.publicSurfaces.readmeTagline ?? ctx.publicSurfaces.serverJsonDescription ?? "Local MCP packaging and positioning.",
590
+ },
591
+ {
592
+ id: "source:dogfood",
593
+ label: "Latest dogfood findings",
594
+ title: "Dogfood and proof pressure",
595
+ type: "local",
596
+ status: ctx.dogfoodFindings.verdict ? "cited" : "explored",
597
+ href: ctx.dogfoodFindings.latestFile ?? undefined,
598
+ excerpt: ctx.dogfoodFindings.findings.slice(0, 2).join(" ") || "No recent dogfood findings available.",
599
+ },
600
+ ];
601
+ const teamSpecific = (args.userSkillset ?? []).length > 0;
602
+ const aiSkeptic = includesAny(combinedText, ["no ai", "without ai", "anti ai", "environment", "peace", "altruistic"]);
603
+ const workflowAligned = includesAny(combinedText, ["claude code", "mcp", "cursor", "developer workflow", "agent workflow", "teams"]);
604
+ const installFocused = includesAny(combinedText, ["install", "local", "dashboard", "service", "subscription", "hosted", "self-host", "maintenance", "update"]);
605
+ const distributionFocused = includesAny(combinedText, ["investor", "credibility", "convince", "adopt", "workflow", "sell", "subscription"]);
606
+ const constrainedByScope = includesAny(combinedText, ["solo", "single founder", "limited", "specific skillset", "narrow skillset"]);
607
+ const publicExposureRisk = lens === "founder" || includesAny(combinedText, [
608
+ "stealth",
609
+ "moat",
610
+ "launch",
611
+ "posting",
612
+ "post publicly",
613
+ "announce",
614
+ "go public",
615
+ "marketing",
616
+ "reveal",
617
+ ]);
618
+ const hasRecentProof = ctx.dogfoodFindings.verdict?.toLowerCase().includes("pass") || ctx.sessionMemory.totalActions7d >= 5;
619
+ const strategicAngles = [
620
+ {
621
+ id: "stealth-moat",
622
+ title: "Stealth, moat, and public exposure timing",
623
+ status: publicExposureRisk ? "watch" : "unknown",
624
+ summary: publicExposureRisk
625
+ ? "Before posting broadly, assume the direction is easier to copy than it feels. Stay relatively stealthy until the moat, workflow lock-in, or evidence edge is clearer."
626
+ : "The run has not yet established whether public exposure helps more than it harms before the moat is proven.",
627
+ whyItMatters: "Premature posting can teach the market what you are doing before the wedge is hard to duplicate. Founders need moat evidence and market diligence before broad exposure.",
628
+ evidenceRefIds,
629
+ nextQuestion: "What have competitors already shipped, how easily can they copy this, and what moat would justify posting now instead of staying quieter longer?",
630
+ },
631
+ {
632
+ id: "team-shape",
633
+ title: "Team shape and complementary skill gaps",
634
+ status: teamSpecific || constrainedByScope ? "watch" : "unknown",
635
+ summary: teamSpecific || constrainedByScope
636
+ ? "The current direction depends heavily on a narrow skill profile. That can create wedge strength, but it also exposes obvious hiring, GTM, or credibility gaps."
637
+ : "The run does not yet spell out whether the team shape is a real edge or an unaddressed constraint.",
638
+ whyItMatters: "Specific skillsets help when they map cleanly to the wedge, but they slow a company down when core build, sell, or support functions are missing.",
639
+ evidenceRefIds,
640
+ nextQuestion: "Which missing capability would most reduce risk for this direction: technical depth, customer access, distribution, or investor credibility?",
641
+ },
642
+ {
643
+ id: "founder-fit",
644
+ title: "Founder and experience fit",
645
+ status: hasRecentProof ? "watch" : "unknown",
646
+ summary: hasRecentProof
647
+ ? "There is evidence of execution momentum, but the founder story still needs to make the wedge feel inevitable rather than merely possible."
648
+ : "This direction still needs stronger evidence that the builders and the problem are tightly matched.",
649
+ whyItMatters: "Investors and early users look for evidence that the founding team has unusual right-to-win on the exact problem they chose.",
650
+ evidenceRefIds,
651
+ nextQuestion: "What founder-specific experience, access, or technical edge makes this direction believable now?",
652
+ },
653
+ {
654
+ id: "build-speed",
655
+ title: "Build speed and time-to-first-proof",
656
+ status: installFocused || workflowAligned ? "strong" : "watch",
657
+ summary: installFocused || workflowAligned
658
+ ? "The direction can likely piggyback on existing local-first and developer workflow surfaces, which shortens the path to a useful wedge."
659
+ : "The idea still needs a more explicit plan for what can be built and proven in the next 2 to 4 weeks.",
660
+ whyItMatters: "The first version has to ship fast enough to create proof before the team burns time on secondary surfaces.",
661
+ evidenceRefIds,
662
+ nextQuestion: "What is the smallest founder-grade wedge we can build in 2 to 4 weeks that creates proof instead of debt?",
663
+ },
664
+ {
665
+ id: "installability",
666
+ title: "Installability and update path",
667
+ status: installFocused ? "strong" : "watch",
668
+ summary: installFocused
669
+ ? "The query already points toward installable surfaces such as local MCP, hosted dashboards, or team subscriptions, which is a healthy sign."
670
+ : "The current idea still needs a clear answer for how people install, maintain, and update it without high-touch onboarding.",
671
+ whyItMatters: "Installation friction and update pain destroy adoption even when the core product insight is strong.",
672
+ evidenceRefIds,
673
+ nextQuestion: "Should the first wedge land as a local MCP tool, a hosted dashboard, or a hybrid with local truth and web review?",
674
+ },
675
+ {
676
+ id: "maintainability",
677
+ title: "Maintainability and support burden",
678
+ status: includesAny(combinedText, ["maintain", "maintenance", "support", "ops", "update"]) ? "watch" : "strong",
679
+ summary: includesAny(combinedText, ["maintain", "maintenance", "support", "ops", "update"])
680
+ ? "The idea raises ongoing maintenance and support concerns, so the service boundary needs to stay narrow."
681
+ : "The current direction can stay relatively lean if the team avoids adding too many surfaces before the wedge is proven.",
682
+ whyItMatters: "A promising tool loses momentum fast if maintenance and support grow faster than product leverage.",
683
+ evidenceRefIds,
684
+ nextQuestion: "What should stay manual, local, or intentionally out-of-scope so maintenance does not outrun product value?",
685
+ },
686
+ {
687
+ id: "adoption",
688
+ title: "Workflow adoption and current market fit",
689
+ status: workflowAligned ? "strong" : "watch",
690
+ summary: workflowAligned
691
+ ? "The direction connects to workflows users already run today, including current developer loops like Claude Code and MCP-based tooling."
692
+ : "The current direction still needs proof that it plugs into a high-frequency workflow instead of asking users to learn a new behavior from scratch.",
693
+ whyItMatters: "The fastest adoption comes from landing inside an existing habit rather than trying to invent one.",
694
+ evidenceRefIds,
695
+ nextQuestion: "Which current high-frequency workflow does this naturally attach to, and how do we make that attachment unavoidable?",
696
+ },
697
+ {
698
+ id: "commercial",
699
+ title: "Commercialization and sellability",
700
+ status: installFocused || distributionFocused ? "strong" : "watch",
701
+ summary: installFocused || distributionFocused
702
+ ? "There is a credible path from tool to dashboard or subscription service if the wedge keeps producing durable proof for teams."
703
+ : "The idea still needs a sharper answer for how it becomes a repeatable product instead of bespoke help or one-off consulting.",
704
+ whyItMatters: "A good internal tool is not enough. The company needs a product that can be packaged, renewed, and expanded.",
705
+ evidenceRefIds,
706
+ nextQuestion: "What is the clearest route from useful tool to team dashboard, recurring subscription, or sellable operating layer?",
707
+ },
708
+ {
709
+ id: "conviction",
710
+ title: "User and investor conviction",
711
+ status: hasRecentProof ? "watch" : "unknown",
712
+ summary: hasRecentProof
713
+ ? "There is enough motion to support a story, but the packet still needs sharper comparables, outcomes, and proof points to persuade outsiders."
714
+ : "The current direction needs more evidence before it becomes a convincing story for users or investors.",
715
+ whyItMatters: "Conviction builds when outsiders can repeat the story and believe the timing, not only the ambition.",
716
+ evidenceRefIds,
717
+ nextQuestion: "What proof points, traction signals, or comparables would make this direction legible to a skeptical user or investor?",
718
+ },
719
+ ];
720
+ if (aiSkeptic || lens === "founder") {
721
+ strategicAngles.push({
722
+ id: "ai-tradeoffs",
723
+ title: "AI stance and mission tradeoffs",
724
+ status: aiSkeptic ? "watch" : "unknown",
725
+ summary: aiSkeptic
726
+ ? "The idea includes explicit skepticism about AI, so the product needs a clear answer for where AI is optional, bounded, or unnecessary."
727
+ : "The direction still needs a deliberate answer for when AI is essential versus when deterministic, local, or non-AI paths should stay available.",
728
+ whyItMatters: "Some teammates and users will reject products that feel casually dependent on AI. A deliberate stance reduces internal friction and market confusion.",
729
+ evidenceRefIds,
730
+ nextQuestion: "Where is AI genuinely necessary here, and where should the product stay local-first, deterministic, or optional?",
731
+ });
732
+ }
733
+ const issueAngles = strategicAngles.filter((angle) => angle.status !== "strong").map((angle) => angle.id);
734
+ const topIssue = strategicAngles.find((angle) => angle.status !== "strong") ?? strategicAngles[0];
735
+ const summary = issueAngles.length > 0
736
+ ? `Pressure test completed. The highest-risk angles right now are ${issueAngles.slice(0, 3).join(", ")}, and the next pass should turn those into a tighter founder wedge.`
737
+ : "Pressure test completed. The direction looks operationally legible; now convert it into a narrower wedge with faster proof.";
738
+ const nextQuestions = dedupeStrings(strategicAngles.map((angle) => angle.nextQuestion)).slice(0, 8);
739
+ const confidence = Math.max(55, Math.min(92, 70 + (hasRecentProof ? 8 : 0) + (workflowAligned ? 6 : 0) - issueAngles.length * 2));
740
+ const { vertical, subvertical } = detectVerticalLabel(combinedText);
741
+ const readinessScore = Math.max(35, Math.min(95, confidence - issueAngles.length * 3 + (installFocused ? 4 : 0)));
742
+ const workspaceCompanyName = resolveWorkspaceCompanyName(ctx);
743
+ const companyMode = detectFounderCompanyMode({
744
+ query: args.query,
745
+ canonicalEntity: workspaceCompanyName ?? undefined,
746
+ hasPrivateContext: Boolean(args.extraContext),
747
+ });
748
+ const queryReferencesWorkspace = Boolean(workspaceCompanyName && args.query.toLowerCase().includes(workspaceCompanyName.toLowerCase()));
749
+ const shouldUseWorkspaceIdentity = Boolean(workspaceCompanyName) &&
750
+ (companyMode === "own_company" || companyMode === "mixed_comparison" || queryReferencesWorkspace);
751
+ const diligencePack = buildDiligencePack(vertical, evidenceRefIds, strategicAngles);
752
+ const materialsChecklist = buildFounderMaterialsChecklist({ diligencePack, strategicAngles });
753
+ const progressionProfile = buildFounderProgressionProfile({
754
+ readinessScore,
755
+ strategicAngles,
756
+ materialsChecklist,
757
+ });
758
+ const scorecards = buildScorecards(progressionProfile, readinessScore);
759
+ const visibility = publicExposureRisk ? "workspace" : "internal";
760
+ const namingPack = buildCompanyNamingPack({
761
+ query: args.query,
762
+ vertical,
763
+ subvertical,
764
+ wedge: topIssue
765
+ ? `resolve ${topIssue.title.toLowerCase()} for ${subvertical}`
766
+ : `founder operating workflow for ${subvertical}`,
767
+ companyState: progressionProfile.currentStageLabel,
768
+ existingCompanyName: shouldUseWorkspaceIdentity ? workspaceCompanyName ?? undefined : undefined,
769
+ });
770
+ const distributionSurfaceStatus = buildDistributionSurfaceStatus(combinedText);
771
+ const companyReadinessPacket = buildCompanyReadinessPacket({
772
+ packetId,
773
+ sourceRefIds: sourceRefs.map((source) => source.id),
774
+ confidence,
775
+ visibility,
776
+ vertical,
777
+ subvertical,
778
+ readinessScore,
779
+ progressionProfile,
780
+ namingPack,
781
+ diligencePack,
782
+ distributionSurfaceStatus,
783
+ strategicAngles,
784
+ });
785
+ const benchmarkEvidence = buildBenchmarkEvidence({
786
+ packetId,
787
+ query: args.query,
788
+ progressionProfile,
789
+ });
790
+ const workflowComparison = buildWorkflowPathComparison({
791
+ objective: args.query,
792
+ });
793
+ const shareableArtifacts = [
794
+ buildSlackOnepager({
795
+ query: args.query,
796
+ summary,
797
+ progressionProfile,
798
+ scorecards,
799
+ companyPacket: companyReadinessPacket,
800
+ }),
801
+ {
802
+ id: "artifact:investor_memo",
803
+ type: "investor_memo",
804
+ title: "Investor memo starter",
805
+ visibility,
806
+ summary: "Starter investor memo with stage, wedge, risks, and next unlocks.",
807
+ payload: {
808
+ company: companyReadinessPacket.identity.companyName,
809
+ stage: progressionProfile.currentStageLabel,
810
+ wedge: companyReadinessPacket.identity.wedge,
811
+ risks: progressionProfile.hiddenRisks,
812
+ nextUnlocks: progressionProfile.nextUnlocks.map((unlock) => unlock.title),
813
+ },
814
+ },
815
+ ];
816
+ const operatingModel = buildFounderOperatingModel({
817
+ role: lens === "banker"
818
+ ? "banker"
819
+ : lens === "ceo"
820
+ ? "ceo"
821
+ : lens === "investor"
822
+ ? "investor"
823
+ : lens === "student"
824
+ ? "student"
825
+ : lens === "legal"
826
+ ? "legal"
827
+ : "founder",
828
+ query: args.query,
829
+ canonicalEntity: shouldUseWorkspaceIdentity
830
+ ? workspaceCompanyName ?? namingPack.recommendedName
831
+ : namingPack.recommendedName,
832
+ hasPrivateContext: Boolean(args.extraContext),
833
+ readinessScore,
834
+ hiddenRiskCount: progressionProfile.hiddenRisks.length,
835
+ visibility,
836
+ hasShareableArtifact: shareableArtifacts.length > 0,
837
+ hasBenchmarkProof: benchmarkEvidence.length > 0,
838
+ hasDelegatedTask: progressionProfile.delegableWork.length > 0,
839
+ hasDiligencePack: diligencePack.requirements.length > 0,
840
+ hasAmbientMonitoring: true,
841
+ hasRepeatedReuse: readinessScore >= 70,
842
+ vertical,
843
+ });
844
+ return {
845
+ assessmentId,
846
+ packetId,
847
+ packetType: "founder_direction_assessment",
848
+ generatedAt: new Date().toISOString(),
849
+ generatedBy: "founder_local_pipeline",
850
+ query: args.query,
851
+ lens,
852
+ summary,
853
+ confidence,
854
+ sourceRefs,
855
+ strategicAngles,
856
+ recommendedNextAction: topIssue
857
+ ? `Resolve ${topIssue.title.toLowerCase()} before broadening the roadmap.`
858
+ : "Turn the validated wedge into a single installable workflow and get real founder feedback this week.",
859
+ nextQuestions,
860
+ issueAngles,
861
+ progressionProfile,
862
+ progressionTiers: PROGRESSION_TIERS,
863
+ diligencePack,
864
+ readinessScore,
865
+ unlocks: progressionProfile.nextUnlocks,
866
+ materialsChecklist,
867
+ scorecards,
868
+ shareableArtifacts,
869
+ visibility,
870
+ benchmarkEvidence,
871
+ workflowComparison,
872
+ operatingModel,
873
+ distributionSurfaceStatus,
874
+ companyReadinessPacket,
875
+ companyNamingPack: namingPack,
876
+ };
877
+ }
49
878
  /* ─── Tool 1: founder_local_gather ───────────────────────────────────────── */
50
879
  function gatherLocalContext(daysBack = 7) {
51
880
  const root = findProjectRoot();
@@ -55,8 +884,17 @@ function gatherLocalContext(daysBack = 7) {
55
884
  ? claudeMd.split("\n").slice(0, 8).join("\n")
56
885
  : null;
57
886
  const pkgJson = safeRead(join(root, "packages", "mcp-local", "package.json"));
887
+ const rootPkgJson = safeRead(join(root, "package.json"));
58
888
  let packageName = null;
59
889
  let packageVersion = null;
890
+ let rootPackageName = null;
891
+ if (rootPkgJson) {
892
+ try {
893
+ const pkg = JSON.parse(rootPkgJson);
894
+ rootPackageName = pkg.name ?? null;
895
+ }
896
+ catch { /* ignore */ }
897
+ }
60
898
  if (pkgJson) {
61
899
  try {
62
900
  const pkg = JSON.parse(pkgJson);
@@ -77,13 +915,25 @@ function gatherLocalContext(daysBack = 7) {
77
915
  // ── Public surfaces ───────────────────────────────────────────
78
916
  const indexHtml = safeRead(join(root, "index.html"));
79
917
  let indexHtmlTitle = null;
918
+ let indexHtmlSiteName = null;
80
919
  let indexHtmlOgDescription = null;
81
920
  if (indexHtml) {
82
921
  const titleMatch = indexHtml.match(/<title>([^<]+)<\/title>/);
83
922
  indexHtmlTitle = titleMatch?.[1] ?? null;
923
+ const siteNameMatch = indexHtml.match(/og:site_name[^>]+content="([^"]+)"/);
924
+ indexHtmlSiteName = siteNameMatch?.[1] ?? null;
84
925
  const ogDescMatch = indexHtml.match(/og:description[^>]+content="([^"]+)"/);
85
926
  indexHtmlOgDescription = ogDescMatch?.[1] ?? null;
86
927
  }
928
+ const claudeHeading = claudeMd?.match(/^#\s+(.+)$/m)?.[1] ?? null;
929
+ const projectName = inferWorkspaceProjectName({
930
+ siteName: indexHtmlSiteName,
931
+ title: indexHtmlTitle,
932
+ claudeHeading,
933
+ rootPackageName,
934
+ packageName,
935
+ projectRoot: root,
936
+ });
87
937
  const serverJson = safeRead(join(root, "packages", "mcp-local", "server.json"));
88
938
  let serverJsonDescription = null;
89
939
  if (serverJson) {
@@ -176,9 +1026,9 @@ function gatherLocalContext(daysBack = 7) {
176
1026
  const runbook = safeRead(join(archDir, "DOGFOOD_RUNBOOK_V1.md"));
177
1027
  const dogfoodRunbookSnippet = runbook ? runbook.split("\n").slice(0, 12).join("\n") : null;
178
1028
  return {
179
- identity: { projectRoot: root, claudeMdSnippet, packageName, packageVersion },
1029
+ identity: { projectRoot: root, claudeMdSnippet, projectName, packageName, packageVersion },
180
1030
  recentChanges: { gitLogOneline: gitLog.split("\n").filter(Boolean), gitDiffStat, modifiedFiles, daysBack },
181
- publicSurfaces: { indexHtmlTitle, indexHtmlOgDescription, serverJsonDescription, readmeTagline },
1031
+ publicSurfaces: { indexHtmlTitle, indexHtmlSiteName, indexHtmlOgDescription, serverJsonDescription, readmeTagline },
182
1032
  sessionMemory: { recentActions, recentMilestones, totalActions7d, totalMilestones7d },
183
1033
  dogfoodFindings: { latestFile: latestDogfoodFile, verdict: dogfoodVerdict, p0Count, p1Count, findings: dogfoodFindings },
184
1034
  docs: { prdSnippet, dogfoodRunbookSnippet, architectureDocs },
@@ -422,6 +1272,47 @@ function synthesizePacket(ctx, packetType, originalQuery, webResults) {
422
1272
  };
423
1273
  }
424
1274
  /* ─── Exported Tools ─────────────────────────────────────────────────────── */
1275
+ function assessmentFromArgs(args) {
1276
+ return buildFounderDirectionAssessment({
1277
+ query: args.query ?? "Founder progression assessment",
1278
+ lens: args.lens,
1279
+ daysBack: args.daysBack,
1280
+ userSkillset: args.userSkillset,
1281
+ interests: args.interests,
1282
+ constraints: args.constraints,
1283
+ marketWorkflow: args.marketWorkflow,
1284
+ extraContext: args.extraContext,
1285
+ });
1286
+ }
1287
+ function buildExportPayload(assessment, adapter) {
1288
+ const basePayload = {
1289
+ company: assessment.companyReadinessPacket.identity.companyName,
1290
+ stage: assessment.progressionProfile.currentStageLabel,
1291
+ readinessScore: assessment.readinessScore,
1292
+ wedge: assessment.companyReadinessPacket.identity.wedge,
1293
+ nextUnlocks: assessment.unlocks.map((unlock) => unlock.title),
1294
+ hiddenRisks: assessment.progressionProfile.hiddenRisks,
1295
+ sourceRefs: assessment.sourceRefs.map((source) => source.label),
1296
+ visibility: assessment.visibility,
1297
+ };
1298
+ const titleMap = {
1299
+ slack_onepage: "Founder one-page Slack report",
1300
+ investor_memo: "Investor memo starter",
1301
+ banker_readiness: "Banker readiness packet",
1302
+ pitchbook_like: "PitchBook-style profile",
1303
+ crunchbase_like: "Crunchbase-style profile",
1304
+ yc_context: "YC application context",
1305
+ generic_json: "Generic structured export",
1306
+ };
1307
+ return {
1308
+ id: `artifact:${adapter}:${genId("export")}`,
1309
+ type: adapter,
1310
+ title: titleMap[adapter],
1311
+ visibility: assessment.visibility,
1312
+ summary: `Exported ${titleMap[adapter].toLowerCase()} for ${basePayload.company}.`,
1313
+ payload: basePayload,
1314
+ };
1315
+ }
425
1316
  export const founderLocalPipelineTools = [
426
1317
  {
427
1318
  name: "founder_local_gather",
@@ -572,5 +1463,628 @@ export const founderLocalPipelineTools = [
572
1463
  return packet;
573
1464
  },
574
1465
  },
1466
+ {
1467
+ name: "founder_direction_assessment",
1468
+ description: "Pressure-test a founder direction against team shape, AI stance, build speed, " +
1469
+ "installability, maintainability, workflow adoption, investor credibility, and " +
1470
+ "commercialization. Produces structured strategic angles, local evidence refs, " +
1471
+ "recommended next action, and follow-up questions that can flow into search, " +
1472
+ "shared context, or delegation.",
1473
+ inputSchema: {
1474
+ type: "object",
1475
+ properties: {
1476
+ query: {
1477
+ type: "string",
1478
+ description: "Founder idea, product direction, or company question to pressure-test",
1479
+ },
1480
+ lens: {
1481
+ type: "string",
1482
+ description: "Role lens shaping the assessment (default: founder)",
1483
+ },
1484
+ daysBack: {
1485
+ type: "number",
1486
+ description: "How many days of local project history to inspect (default: 14)",
1487
+ },
1488
+ userSkillset: {
1489
+ type: "array",
1490
+ items: { type: "string" },
1491
+ description: "Optional list of explicit team or founder skills to pressure-test against the idea",
1492
+ },
1493
+ interests: {
1494
+ type: "array",
1495
+ items: { type: "string" },
1496
+ description: "Optional founder interests or motivations that shape direction fit",
1497
+ },
1498
+ constraints: {
1499
+ type: "array",
1500
+ items: { type: "string" },
1501
+ description: "Optional constraints such as anti-AI preference, solo-founder limits, or regulatory concerns",
1502
+ },
1503
+ marketWorkflow: {
1504
+ type: "array",
1505
+ items: { type: "string" },
1506
+ description: "Known workflows or tools the target users already use, such as Claude Code",
1507
+ },
1508
+ extraContext: {
1509
+ type: "string",
1510
+ description: "Extra freeform context for the pressure test",
1511
+ },
1512
+ },
1513
+ required: ["query"],
1514
+ },
1515
+ annotations: { readOnlyHint: true },
1516
+ handler: async (args) => {
1517
+ return buildFounderDirectionAssessment(args);
1518
+ },
1519
+ },
1520
+ {
1521
+ name: "founder_stage_assess",
1522
+ description: "Return the founder progression stage, readiness score, and stage ladder for the current direction.",
1523
+ inputSchema: { type: "object", properties: { query: { type: "string" }, lens: { type: "string" }, extraContext: { type: "string" } } },
1524
+ annotations: { readOnlyHint: true },
1525
+ handler: async (args) => {
1526
+ const assessment = assessmentFromArgs(args);
1527
+ return {
1528
+ currentStage: assessment.progressionProfile.currentStage,
1529
+ currentStageLabel: assessment.progressionProfile.currentStageLabel,
1530
+ readinessScore: assessment.readinessScore,
1531
+ progressionTiers: assessment.progressionTiers,
1532
+ };
1533
+ },
1534
+ },
1535
+ {
1536
+ name: "founder_gaps_detect",
1537
+ description: "Detect missing foundations, hidden risks, and weak strategic angles for a founder direction.",
1538
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } } },
1539
+ annotations: { readOnlyHint: true },
1540
+ handler: async (args) => {
1541
+ const assessment = assessmentFromArgs(args);
1542
+ return {
1543
+ missingFoundations: assessment.progressionProfile.missingFoundations,
1544
+ hiddenRisks: assessment.progressionProfile.hiddenRisks,
1545
+ issueAngles: assessment.issueAngles,
1546
+ weakestAngle: assessment.strategicAngles.find((angle) => angle.status !== "strong") ?? null,
1547
+ };
1548
+ },
1549
+ },
1550
+ {
1551
+ name: "founder_next_unlocks",
1552
+ description: "List the next progression unlocks required to move the founder to the next stage.",
1553
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } } },
1554
+ annotations: { readOnlyHint: true },
1555
+ handler: async (args) => assessmentFromArgs(args).unlocks,
1556
+ },
1557
+ {
1558
+ name: "founder_materials_check",
1559
+ description: "Return the founder materials checklist and missing external-readiness artifacts.",
1560
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } } },
1561
+ annotations: { readOnlyHint: true },
1562
+ handler: async (args) => {
1563
+ const assessment = assessmentFromArgs(args);
1564
+ return {
1565
+ materialsChecklist: assessment.materialsChecklist,
1566
+ diligencePack: assessment.diligencePack.label,
1567
+ };
1568
+ },
1569
+ },
1570
+ {
1571
+ name: "founder_readiness_score",
1572
+ description: "Return the founder readiness score and a concise interpretation.",
1573
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } } },
1574
+ annotations: { readOnlyHint: true },
1575
+ handler: async (args) => {
1576
+ const assessment = assessmentFromArgs(args);
1577
+ return {
1578
+ readinessScore: assessment.readinessScore,
1579
+ stage: assessment.progressionProfile.currentStageLabel,
1580
+ summary: assessment.summary,
1581
+ };
1582
+ },
1583
+ },
1584
+ {
1585
+ name: "founder_ontrack_scorecard",
1586
+ description: "Return explicit 2-week and 3-month on-track or off-track scorecards.",
1587
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } } },
1588
+ annotations: { readOnlyHint: true },
1589
+ handler: async (args) => assessmentFromArgs(args).scorecards,
1590
+ },
1591
+ {
1592
+ name: "founder_delegation_boundary_scan",
1593
+ description: "Separate delegable work from founder-only work for the current direction.",
1594
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } } },
1595
+ annotations: { readOnlyHint: true },
1596
+ handler: async (args) => {
1597
+ const assessment = assessmentFromArgs(args);
1598
+ return {
1599
+ delegableWork: assessment.progressionProfile.delegableWork,
1600
+ founderOnlyWork: assessment.progressionProfile.founderOnlyWork,
1601
+ };
1602
+ },
1603
+ },
1604
+ {
1605
+ name: "founder_company_naming_pack",
1606
+ description: "Generate a founder company naming shortlist and starter profile.",
1607
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } }, required: ["query"] },
1608
+ annotations: { readOnlyHint: true },
1609
+ handler: async (args) => assessmentFromArgs(args).companyNamingPack,
1610
+ },
1611
+ {
1612
+ name: "runway_check",
1613
+ description: "Basic runway check that translates cash and burn into months remaining and flags risk.",
1614
+ inputSchema: {
1615
+ type: "object",
1616
+ properties: {
1617
+ cashOnHand: { type: "number" },
1618
+ monthlyBurn: { type: "number" },
1619
+ },
1620
+ required: ["cashOnHand", "monthlyBurn"],
1621
+ },
1622
+ annotations: { readOnlyHint: true },
1623
+ handler: async (args) => {
1624
+ const months = args.monthlyBurn > 0 ? Number((args.cashOnHand / args.monthlyBurn).toFixed(1)) : null;
1625
+ return {
1626
+ runwayMonths: months,
1627
+ status: months === null ? "unknown" : months >= 12 ? "healthy" : months >= 6 ? "watch" : "critical",
1628
+ recommendation: months !== null && months < 6
1629
+ ? "Reduce burn or accelerate revenue immediately."
1630
+ : "Keep runway visible in the weekly founder packet.",
1631
+ };
1632
+ },
1633
+ },
1634
+ {
1635
+ name: "burn_rate_sanity",
1636
+ description: "Sanity check founder burn against runway and stage expectations.",
1637
+ inputSchema: {
1638
+ type: "object",
1639
+ properties: {
1640
+ monthlyBurn: { type: "number" },
1641
+ teamSize: { type: "number" },
1642
+ stage: { type: "string" },
1643
+ },
1644
+ required: ["monthlyBurn"],
1645
+ },
1646
+ annotations: { readOnlyHint: true },
1647
+ handler: async (args) => ({
1648
+ burnPerPerson: args.teamSize ? Number((args.monthlyBurn / Math.max(args.teamSize, 1)).toFixed(0)) : null,
1649
+ stage: args.stage ?? "pre-seed",
1650
+ note: args.monthlyBurn > 150_000
1651
+ ? "Burn is high relative to an early founder stage unless traction or capital access is unusually strong."
1652
+ : "Burn looks compatible with an early-stage discipline story if progress is visible.",
1653
+ }),
1654
+ },
1655
+ {
1656
+ name: "financial_hygiene_check",
1657
+ description: "Return the hidden financial hygiene requirements many founders forget before diligence.",
1658
+ inputSchema: { type: "object", properties: { query: { type: "string" } } },
1659
+ annotations: { readOnlyHint: true },
1660
+ handler: async () => ({
1661
+ checklist: [
1662
+ "Runway and burn view",
1663
+ "Current raise and cap table summary",
1664
+ "Decision log for material spend",
1665
+ "Budget owner by function",
1666
+ ],
1667
+ warning: "Founders often get judged on financial discipline before they realize it.",
1668
+ }),
1669
+ },
1670
+ {
1671
+ name: "meeting_notes_extract_decisions",
1672
+ description: "Extract decisions, owners, and follow-ups from raw meeting notes.",
1673
+ inputSchema: { type: "object", properties: { notes: { type: "string" } }, required: ["notes"] },
1674
+ annotations: { readOnlyHint: true },
1675
+ handler: async (args) => {
1676
+ const lines = args.notes.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
1677
+ const decisions = lines.filter((line) => /decid|approved|ship|choose|agreed/i.test(line)).slice(0, 8);
1678
+ const followUps = lines.filter((line) => /next|todo|follow up|owner|action/i.test(line)).slice(0, 8);
1679
+ return { decisions, followUps };
1680
+ },
1681
+ },
1682
+ {
1683
+ name: "team_alignment_check",
1684
+ description: "Check whether the team is aligned on the wedge, next move, and moat story.",
1685
+ inputSchema: { type: "object", properties: { query: { type: "string" }, teamNotes: { type: "string" } } },
1686
+ annotations: { readOnlyHint: true },
1687
+ handler: async (args) => {
1688
+ const assessment = assessmentFromArgs({ query: args.query, extraContext: args.teamNotes });
1689
+ return {
1690
+ status: assessment.issueAngles.includes("team-shape") ? "watch" : "aligned",
1691
+ founderOnlyWork: assessment.progressionProfile.founderOnlyWork,
1692
+ delegableWork: assessment.progressionProfile.delegableWork,
1693
+ };
1694
+ },
1695
+ },
1696
+ {
1697
+ name: "hiring_gap_scan",
1698
+ description: "Identify the most obvious missing hiring lane for the current founder direction.",
1699
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } } },
1700
+ annotations: { readOnlyHint: true },
1701
+ handler: async (args) => {
1702
+ const assessment = assessmentFromArgs(args);
1703
+ return {
1704
+ gap: assessment.issueAngles.includes("team-shape") ? "GTM / complementary operator" : "No obvious urgent hiring gap detected",
1705
+ rationale: assessment.progressionProfile.hiddenRisks.find((risk) => /team|credibility|distribution/i.test(risk)) ?? assessment.summary,
1706
+ };
1707
+ },
1708
+ },
1709
+ {
1710
+ name: "decision_quality_scan",
1711
+ description: "Check whether the founder decision has clear criteria, falsifiers, and next actions.",
1712
+ inputSchema: { type: "object", properties: { query: { type: "string" }, decision: { type: "string" } }, required: ["decision"] },
1713
+ annotations: { readOnlyHint: true },
1714
+ handler: async (args) => ({
1715
+ hasDecision: true,
1716
+ criteriaPresent: /because|if|until|must/i.test(args.decision),
1717
+ needsFalsifier: !/unless|if not|fails when/i.test(args.decision),
1718
+ recommendedNextStep: "Add one explicit falsifier and one time-bound proof target.",
1719
+ }),
1720
+ },
1721
+ {
1722
+ name: "detect_vertical",
1723
+ description: "Detect the founder vertical and subvertical from the query and context.",
1724
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } }, required: ["query"] },
1725
+ annotations: { readOnlyHint: true },
1726
+ handler: async (args) => detectVerticalLabel(`${args.query} ${args.extraContext ?? ""}`),
1727
+ },
1728
+ {
1729
+ name: "detect_subvertical",
1730
+ description: "Detect the founder subvertical from the query and context.",
1731
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } }, required: ["query"] },
1732
+ annotations: { readOnlyHint: true },
1733
+ handler: async (args) => ({ subvertical: detectVerticalLabel(`${args.query} ${args.extraContext ?? ""}`).subvertical }),
1734
+ },
1735
+ {
1736
+ name: "load_diligence_pack",
1737
+ description: "Load the vertical diligence pack for the current direction.",
1738
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } }, required: ["query"] },
1739
+ annotations: { readOnlyHint: true },
1740
+ handler: async (args) => {
1741
+ const assessment = assessmentFromArgs(args);
1742
+ return assessment.diligencePack;
1743
+ },
1744
+ },
1745
+ {
1746
+ name: "readiness_scan",
1747
+ description: "Run a founder readiness scan against the progression and diligence model.",
1748
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } }, required: ["query"] },
1749
+ annotations: { readOnlyHint: true },
1750
+ handler: async (args) => {
1751
+ const assessment = assessmentFromArgs(args);
1752
+ return {
1753
+ readinessScore: assessment.readinessScore,
1754
+ currentStage: assessment.progressionProfile.currentStageLabel,
1755
+ requirements: assessment.diligencePack.requirements,
1756
+ };
1757
+ },
1758
+ },
1759
+ {
1760
+ name: "evidence_gap_scan",
1761
+ description: "List missing evidence classes and materials for diligence readiness.",
1762
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } }, required: ["query"] },
1763
+ annotations: { readOnlyHint: true },
1764
+ handler: async (args) => {
1765
+ const assessment = assessmentFromArgs(args);
1766
+ return {
1767
+ missingRequirements: assessment.diligencePack.requirements.filter((item) => item.status !== "ready"),
1768
+ missingMaterials: assessment.materialsChecklist.filter((item) => item.status !== "ready"),
1769
+ };
1770
+ },
1771
+ },
1772
+ {
1773
+ name: "claim_verification_scan",
1774
+ description: "Scan high-risk claims against available evidence classes.",
1775
+ inputSchema: { type: "object", properties: { query: { type: "string" }, claims: { type: "array", items: { type: "string" } } }, required: ["query"] },
1776
+ annotations: { readOnlyHint: true },
1777
+ handler: async (args) => {
1778
+ const assessment = assessmentFromArgs(args);
1779
+ return (args.claims ?? assessment.diligencePack.highRiskClaims).map((claim) => ({
1780
+ claim,
1781
+ status: assessment.diligencePack.highRiskClaims.includes(claim) ? "needs_verification" : "watch",
1782
+ requiredEvidence: assessment.diligencePack.evidenceClasses.filter((item) => item.required).map((item) => item.label),
1783
+ }));
1784
+ },
1785
+ },
1786
+ {
1787
+ name: "submission_readiness_score",
1788
+ description: "Score whether the company packet is ready for downstream submission or profile export.",
1789
+ inputSchema: { type: "object", properties: { query: { type: "string" }, destination: { type: "string" } }, required: ["query"] },
1790
+ annotations: { readOnlyHint: true },
1791
+ handler: async (args) => {
1792
+ const assessment = assessmentFromArgs(args);
1793
+ const completeness = assessment.materialsChecklist.filter((item) => item.status === "ready").length;
1794
+ const total = Math.max(assessment.materialsChecklist.length, 1);
1795
+ return {
1796
+ destination: args.destination ?? "generic",
1797
+ score: Math.round((completeness / total) * 100),
1798
+ missingFields: assessment.materialsChecklist.filter((item) => item.status !== "ready").map((item) => item.label),
1799
+ };
1800
+ },
1801
+ },
1802
+ {
1803
+ name: "extract_patent_claims",
1804
+ description: "Extract likely patent and IP claims from source text.",
1805
+ inputSchema: { type: "object", properties: { sourceText: { type: "string" } }, required: ["sourceText"] },
1806
+ annotations: { readOnlyHint: true },
1807
+ handler: async (args) => ({
1808
+ claims: args.sourceText.split(/[.;\n]/).filter((line) => /patent|ip|provisional|claim/i.test(line)).slice(0, 10),
1809
+ }),
1810
+ },
1811
+ {
1812
+ name: "extract_trial_evidence",
1813
+ description: "Extract trial, study, or lab evidence snippets from source text.",
1814
+ inputSchema: { type: "object", properties: { sourceText: { type: "string" } }, required: ["sourceText"] },
1815
+ annotations: { readOnlyHint: true },
1816
+ handler: async (args) => ({
1817
+ evidence: args.sourceText.split(/[.;\n]/).filter((line) => /trial|study|lab|clinical|preclinical/i.test(line)).slice(0, 10),
1818
+ }),
1819
+ },
1820
+ {
1821
+ name: "extract_publication_metadata",
1822
+ description: "Extract publication-oriented metadata from source text.",
1823
+ inputSchema: { type: "object", properties: { sourceText: { type: "string" } }, required: ["sourceText"] },
1824
+ annotations: { readOnlyHint: true },
1825
+ handler: async (args) => ({
1826
+ publications: args.sourceText.split(/[.;\n]/).filter((line) => /paper|publication|journal|conference|doi/i.test(line)).slice(0, 10),
1827
+ }),
1828
+ },
1829
+ {
1830
+ name: "extract_regulatory_artifacts",
1831
+ description: "Extract regulatory path signals from source text.",
1832
+ inputSchema: { type: "object", properties: { sourceText: { type: "string" } }, required: ["sourceText"] },
1833
+ annotations: { readOnlyHint: true },
1834
+ handler: async (args) => ({
1835
+ regulatoryArtifacts: args.sourceText.split(/[.;\n]/).filter((line) => /fda|510\(k\)|submission|compliance|approval|regulator/i.test(line)).slice(0, 10),
1836
+ }),
1837
+ },
1838
+ {
1839
+ name: "build_company_packet",
1840
+ description: "Build the canonical company readiness packet.",
1841
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } }, required: ["query"] },
1842
+ annotations: { readOnlyHint: true },
1843
+ handler: async (args) => assessmentFromArgs(args).companyReadinessPacket,
1844
+ },
1845
+ {
1846
+ name: "build_investor_packet",
1847
+ description: "Build an investor-oriented export payload from the canonical company packet.",
1848
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } }, required: ["query"] },
1849
+ annotations: { readOnlyHint: true },
1850
+ handler: async (args) => buildExportPayload(assessmentFromArgs(args), "investor_memo"),
1851
+ },
1852
+ {
1853
+ name: "build_banking_packet",
1854
+ description: "Build a banker-readiness packet from the canonical company packet.",
1855
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } }, required: ["query"] },
1856
+ annotations: { readOnlyHint: true },
1857
+ handler: async (args) => buildExportPayload(assessmentFromArgs(args), "banker_readiness"),
1858
+ },
1859
+ {
1860
+ name: "build_diligence_packet",
1861
+ description: "Build a diligence-oriented export payload from the canonical company packet.",
1862
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } }, required: ["query"] },
1863
+ annotations: { readOnlyHint: true },
1864
+ handler: async (args) => ({
1865
+ ...buildExportPayload(assessmentFromArgs(args), "generic_json"),
1866
+ payloadType: "diligence_packet",
1867
+ }),
1868
+ },
1869
+ {
1870
+ name: "build_submission_export",
1871
+ description: "Build a generic submission export from the canonical company packet.",
1872
+ inputSchema: { type: "object", properties: { query: { type: "string" }, destination: { type: "string" } }, required: ["query"] },
1873
+ annotations: { readOnlyHint: true },
1874
+ handler: async (args) => ({
1875
+ destination: args.destination ?? "generic",
1876
+ artifact: buildExportPayload(assessmentFromArgs(args), "generic_json"),
1877
+ }),
1878
+ },
1879
+ {
1880
+ name: "build_company_profile_starter",
1881
+ description: "Build a starter PitchBook/Crunchbase-like company profile.",
1882
+ inputSchema: { type: "object", properties: { query: { type: "string" } }, required: ["query"] },
1883
+ annotations: { readOnlyHint: true },
1884
+ handler: async (args) => assessmentFromArgs(args).companyNamingPack.starterProfile,
1885
+ },
1886
+ {
1887
+ name: "build_slack_onepager",
1888
+ description: "Build a Slack-friendly one-page founder report.",
1889
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } }, required: ["query"] },
1890
+ annotations: { readOnlyHint: true },
1891
+ handler: async (args) => buildExportPayload(assessmentFromArgs(args), "slack_onepage"),
1892
+ },
1893
+ {
1894
+ name: "export_pitchbook_profile",
1895
+ description: "Export a PitchBook-like structured profile from the company packet.",
1896
+ inputSchema: { type: "object", properties: { query: { type: "string" } }, required: ["query"] },
1897
+ annotations: { readOnlyHint: true },
1898
+ handler: async (args) => buildExportPayload(assessmentFromArgs(args), "pitchbook_like"),
1899
+ },
1900
+ {
1901
+ name: "export_crunchbase_profile",
1902
+ description: "Export a Crunchbase-like structured profile from the company packet.",
1903
+ inputSchema: { type: "object", properties: { query: { type: "string" } }, required: ["query"] },
1904
+ annotations: { readOnlyHint: true },
1905
+ handler: async (args) => buildExportPayload(assessmentFromArgs(args), "crunchbase_like"),
1906
+ },
1907
+ {
1908
+ name: "export_yc_application_context",
1909
+ description: "Export YC-style application context from the company packet.",
1910
+ inputSchema: { type: "object", properties: { query: { type: "string" } }, required: ["query"] },
1911
+ annotations: { readOnlyHint: true },
1912
+ handler: async (args) => buildExportPayload(assessmentFromArgs(args), "yc_context"),
1913
+ },
1914
+ {
1915
+ name: "compare_workflow_paths",
1916
+ description: "Compare current and optimized workflow paths and quantify likely savings.",
1917
+ inputSchema: {
1918
+ type: "object",
1919
+ properties: {
1920
+ objective: { type: "string" },
1921
+ currentPath: { type: "array", items: { type: "string" } },
1922
+ optimizedPath: { type: "array", items: { type: "string" } },
1923
+ },
1924
+ required: ["objective"],
1925
+ },
1926
+ annotations: { readOnlyHint: true },
1927
+ handler: async (args) => buildWorkflowPathComparison(args),
1928
+ },
1929
+ {
1930
+ name: "shortest_valid_path",
1931
+ description: "Return the shortest valid workflow path for the stated objective.",
1932
+ inputSchema: { type: "object", properties: { objective: { type: "string" } }, required: ["objective"] },
1933
+ annotations: { readOnlyHint: true },
1934
+ handler: async (args) => buildWorkflowPathComparison({ objective: args.objective }).optimizedPath,
1935
+ },
1936
+ {
1937
+ name: "cheapest_valid_path",
1938
+ description: "Return the cheapest valid workflow path for the stated objective.",
1939
+ inputSchema: { type: "object", properties: { objective: { type: "string" } }, required: ["objective"] },
1940
+ annotations: { readOnlyHint: true },
1941
+ handler: async (args) => buildWorkflowPathComparison({ objective: args.objective }),
1942
+ },
1943
+ {
1944
+ name: "validate_shortcut",
1945
+ description: "Validate that a proposed shortcut preserves output quality and visibility.",
1946
+ inputSchema: { type: "object", properties: { objective: { type: "string" }, shortcut: { type: "string" } }, required: ["objective", "shortcut"] },
1947
+ annotations: { readOnlyHint: true },
1948
+ handler: async (args) => ({
1949
+ objective: args.objective,
1950
+ shortcut: args.shortcut,
1951
+ validationChecks: buildWorkflowPathComparison({ objective: args.objective }).validationChecks,
1952
+ verdict: "valid",
1953
+ summary: "The shortcut is acceptable if citations, contradictions, and the final packet still remain visible.",
1954
+ }),
1955
+ },
1956
+ {
1957
+ name: "build_before_after_memo",
1958
+ description: "Build a memo showing the before and after path plus the validation rationale.",
1959
+ inputSchema: { type: "object", properties: { objective: { type: "string" } }, required: ["objective"] },
1960
+ annotations: { readOnlyHint: true },
1961
+ handler: async (args) => {
1962
+ const comparison = buildWorkflowPathComparison({ objective: args.objective });
1963
+ return {
1964
+ title: "Before and after workflow memo",
1965
+ comparison,
1966
+ memo: [
1967
+ `Objective: ${comparison.objective}`,
1968
+ `Before: ${comparison.currentPath.join(" -> ")}`,
1969
+ `After: ${comparison.optimizedPath.join(" -> ")}`,
1970
+ `Why valid: ${comparison.rationale}`,
1971
+ ].join("\n"),
1972
+ };
1973
+ },
1974
+ },
1975
+ {
1976
+ name: "run_founder_autonomy_benchmark",
1977
+ description: "Run the weekly founder reset autonomy benchmark lane.",
1978
+ inputSchema: { type: "object", properties: { query: { type: "string" } }, required: ["query"] },
1979
+ annotations: { readOnlyHint: true },
1980
+ handler: async (args) => assessmentFromArgs(args).benchmarkEvidence,
1981
+ },
1982
+ {
1983
+ name: "run_packet_to_implementation_benchmark",
1984
+ description: "Return a packet-to-implementation benchmark lane payload.",
1985
+ inputSchema: { type: "object", properties: { query: { type: "string" } }, required: ["query"] },
1986
+ annotations: { readOnlyHint: true },
1987
+ handler: async (args) => ({
1988
+ ...assessmentFromArgs(args).benchmarkEvidence[0],
1989
+ lane: "packet_to_implementation",
1990
+ objective: "Turn an approved packet into a bounded implementation handoff and validate the result.",
1991
+ }),
1992
+ },
1993
+ {
1994
+ name: "run_competitor_signal_benchmark",
1995
+ description: "Return a competitor-signal-to-response benchmark lane payload.",
1996
+ inputSchema: { type: "object", properties: { query: { type: "string" } }, required: ["query"] },
1997
+ annotations: { readOnlyHint: true },
1998
+ handler: async (args) => ({
1999
+ ...assessmentFromArgs(args).benchmarkEvidence[0],
2000
+ lane: "competitor_signal_response",
2001
+ objective: "Turn a competitor or market signal into a validated founder response packet.",
2002
+ }),
2003
+ },
2004
+ {
2005
+ name: "run_browserstack_benchmark_lane",
2006
+ description: "Return a BrowserStack/browser-automation benchmark lane payload.",
2007
+ inputSchema: { type: "object", properties: { query: { type: "string" } }, required: ["query"] },
2008
+ annotations: { readOnlyHint: true },
2009
+ handler: async (args) => ({
2010
+ ...assessmentFromArgs(args).benchmarkEvidence[0],
2011
+ lane: "browserstack_lane",
2012
+ objective: "Prove browser automation quality through before/after path validation and benchmark evidence.",
2013
+ }),
2014
+ },
2015
+ {
2016
+ name: "distribution_surface_scan",
2017
+ description: "Scan which distribution surfaces are actually ready right now.",
2018
+ inputSchema: { type: "object", properties: { query: { type: "string" }, extraContext: { type: "string" } }, required: ["query"] },
2019
+ annotations: { readOnlyHint: true },
2020
+ handler: async (args) => assessmentFromArgs(args).distributionSurfaceStatus,
2021
+ },
2022
+ {
2023
+ name: "open_core_boundary_advisor",
2024
+ description: "Advise what should stay open-core versus proprietary.",
2025
+ inputSchema: { type: "object", properties: { query: { type: "string" } }, required: ["query"] },
2026
+ annotations: { readOnlyHint: true },
2027
+ handler: async () => ({
2028
+ openSource: [
2029
+ "MCP and CLI tool surface",
2030
+ "Canonical packet schema",
2031
+ "Adapter interfaces",
2032
+ "Sample vertical packs and exports",
2033
+ ],
2034
+ proprietary: [
2035
+ "Hosted dashboard",
2036
+ "Sync bridge and collaboration",
2037
+ "Premium scoring and monitoring",
2038
+ "High-value data services",
2039
+ ],
2040
+ rationale: "Open the adoption layer, keep the retained value and hosted leverage closed.",
2041
+ }),
2042
+ },
2043
+ {
2044
+ name: "partnership_target_map",
2045
+ description: "Map likely partnership targets and why they fit the current wedge.",
2046
+ inputSchema: { type: "object", properties: { query: { type: "string" } }, required: ["query"] },
2047
+ annotations: { readOnlyHint: true },
2048
+ handler: async (args) => {
2049
+ const { vertical } = detectVerticalLabel(args.query);
2050
+ return {
2051
+ vertical,
2052
+ targets: vertical === "healthcare/life sciences"
2053
+ ? ["Banks with startup healthcare desks", "Clinical advisors", "Regulatory consultants", "Research institutions"]
2054
+ : ["Claude Code ecosystem", "Smithery and MCP marketplaces", "Open-source agent projects", "Developer communities"],
2055
+ };
2056
+ },
2057
+ },
2058
+ {
2059
+ name: "gtm_script_builder",
2060
+ description: "Build a starter GTM script for the current founder wedge.",
2061
+ inputSchema: { type: "object", properties: { query: { type: "string" }, audience: { type: "string" } }, required: ["query"] },
2062
+ annotations: { readOnlyHint: true },
2063
+ handler: async (args) => {
2064
+ const assessment = assessmentFromArgs(args);
2065
+ return {
2066
+ audience: args.audience ?? "founder/operator",
2067
+ script: [
2068
+ `We help ${args.audience ?? "founders"} see what they are missing before investors, banks, or customers ask for it.`,
2069
+ `Right now the strongest wedge is ${assessment.companyReadinessPacket.identity.wedge}.`,
2070
+ `The next proof is ${assessment.progressionProfile.recommendedNextAction}.`,
2071
+ ].join(" "),
2072
+ };
2073
+ },
2074
+ },
2075
+ {
2076
+ name: "founder_target_customer_map",
2077
+ description: "Map the downstream customer groups the company should target first.",
2078
+ inputSchema: { type: "object", properties: { query: { type: "string" } }, required: ["query"] },
2079
+ annotations: { readOnlyHint: true },
2080
+ handler: async (args) => {
2081
+ const { vertical } = detectVerticalLabel(args.query);
2082
+ return {
2083
+ targetCustomers: vertical === "healthcare/life sciences"
2084
+ ? ["Healthcare founders", "Diligence-heavy investors", "Clinical partners"]
2085
+ : ["Founder/operators", "Developer teams", "AI infra buyers", "Research/data customers"],
2086
+ };
2087
+ },
2088
+ },
575
2089
  ];
576
2090
  //# sourceMappingURL=founderLocalPipeline.js.map