dev3000 0.0.72 → 0.0.74

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 (277) hide show
  1. package/README.md +78 -30
  2. package/dist/cli.js +3 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/dev-environment.d.ts +10 -1
  5. package/dist/dev-environment.d.ts.map +1 -1
  6. package/dist/dev-environment.js +676 -6
  7. package/dist/dev-environment.js.map +1 -1
  8. package/dist/src/loading.html +1 -1
  9. package/dist/src/tui-interface-impl.tsx +35 -30
  10. package/dist/tui-interface-impl.d.ts.map +1 -1
  11. package/dist/tui-interface-impl.js +26 -20
  12. package/dist/tui-interface-impl.js.map +1 -1
  13. package/dist/tui-interface.d.ts.map +1 -1
  14. package/dist/tui-interface.js +26 -5
  15. package/dist/tui-interface.js.map +1 -1
  16. package/mcp-server/.next/BUILD_ID +1 -1
  17. package/mcp-server/.next/build-manifest.json +8 -8
  18. package/mcp-server/.next/fallback-build-manifest.json +2 -2
  19. package/mcp-server/.next/images-manifest.json +2 -2
  20. package/mcp-server/.next/next-minimal-server.js.nft.json +1 -1
  21. package/mcp-server/.next/next-server.js.nft.json +1 -1
  22. package/mcp-server/.next/prerender-manifest.json +10 -10
  23. package/mcp-server/.next/required-server-files.json +5 -6
  24. package/mcp-server/.next/routes-manifest.json +1 -0
  25. package/mcp-server/.next/server/app/_global-error/page/build-manifest.json +6 -6
  26. package/mcp-server/.next/server/app/_global-error/page.js +8 -8
  27. package/mcp-server/.next/server/app/_global-error/page.js.nft.json +1 -1
  28. package/mcp-server/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  29. package/mcp-server/.next/server/app/_global-error.html +2 -2
  30. package/mcp-server/.next/server/app/_global-error.rsc +8 -8
  31. package/mcp-server/.next/server/app/_not-found/page/build-manifest.json +6 -6
  32. package/mcp-server/.next/server/app/_not-found/page.js +10 -10
  33. package/mcp-server/.next/server/app/_not-found/page.js.nft.json +1 -1
  34. package/mcp-server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  35. package/mcp-server/.next/server/app/_not-found.html +1 -1
  36. package/mcp-server/.next/server/app/_not-found.rsc +8 -8
  37. package/mcp-server/.next/server/app/api/logs/append/route/build-manifest.json +1 -8
  38. package/mcp-server/.next/server/app/api/logs/append/route.js +4 -4
  39. package/mcp-server/.next/server/app/api/logs/append/route.js.nft.json +1 -1
  40. package/mcp-server/.next/server/app/api/logs/head/route/build-manifest.json +1 -8
  41. package/mcp-server/.next/server/app/api/logs/head/route.js +4 -4
  42. package/mcp-server/.next/server/app/api/logs/head/route.js.nft.json +1 -1
  43. package/mcp-server/.next/server/app/api/logs/list/route/build-manifest.json +1 -8
  44. package/mcp-server/.next/server/app/api/logs/list/route.js +4 -4
  45. package/mcp-server/.next/server/app/api/logs/list/route.js.nft.json +1 -1
  46. package/mcp-server/.next/server/app/api/logs/rotate/route/build-manifest.json +1 -8
  47. package/mcp-server/.next/server/app/api/logs/rotate/route.js +5 -5
  48. package/mcp-server/.next/server/app/api/logs/rotate/route.js.nft.json +1 -1
  49. package/mcp-server/.next/server/app/api/logs/stream/route/build-manifest.json +1 -8
  50. package/mcp-server/.next/server/app/api/logs/stream/route.js +4 -4
  51. package/mcp-server/.next/server/app/api/logs/stream/route.js.nft.json +1 -1
  52. package/mcp-server/.next/server/app/api/logs/tail/route/build-manifest.json +1 -8
  53. package/mcp-server/.next/server/app/api/logs/tail/route.js +4 -4
  54. package/mcp-server/.next/server/app/api/logs/tail/route.js.nft.json +1 -1
  55. package/mcp-server/.next/server/app/api/screenshots/[filename]/route/build-manifest.json +1 -8
  56. package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js +5 -5
  57. package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js.nft.json +1 -1
  58. package/mcp-server/.next/server/app/api/tools/route/build-manifest.json +1 -8
  59. package/mcp-server/.next/server/app/api/tools/route.js +5 -5
  60. package/mcp-server/.next/server/app/api/tools/route.js.nft.json +1 -1
  61. package/mcp-server/.next/server/app/index.html +1 -1
  62. package/mcp-server/.next/server/app/index.rsc +10 -10
  63. package/mcp-server/.next/server/app/logs/page/build-manifest.json +6 -6
  64. package/mcp-server/.next/server/app/logs/page.js +13 -13
  65. package/mcp-server/.next/server/app/logs/page.js.nft.json +1 -1
  66. package/mcp-server/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  67. package/mcp-server/.next/server/app/mcp/route/build-manifest.json +1 -8
  68. package/mcp-server/.next/server/app/mcp/route.js +6 -5
  69. package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
  70. package/mcp-server/.next/server/app/page/build-manifest.json +6 -6
  71. package/mcp-server/.next/server/app/page.js +12 -12
  72. package/mcp-server/.next/server/app/page.js.nft.json +1 -1
  73. package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
  74. package/mcp-server/.next/server/chunks/[root-of-the-server]__013bbeea._.js +7 -0
  75. package/mcp-server/.next/server/chunks/[root-of-the-server]__013bbeea._.js.map +1 -0
  76. package/mcp-server/.next/server/chunks/[root-of-the-server]__270b33b7._.js +33 -0
  77. package/mcp-server/.next/server/chunks/[root-of-the-server]__270b33b7._.js.map +1 -0
  78. package/mcp-server/.next/server/chunks/[root-of-the-server]__5580d2ea._.js +35 -0
  79. package/mcp-server/.next/server/chunks/[root-of-the-server]__5580d2ea._.js.map +1 -0
  80. package/mcp-server/.next/server/chunks/[root-of-the-server]__6fa7ea53._.js +3 -0
  81. package/mcp-server/.next/server/chunks/[root-of-the-server]__73645708._.js +11 -0
  82. package/mcp-server/.next/server/chunks/[root-of-the-server]__73645708._.js.map +1 -0
  83. package/mcp-server/.next/server/chunks/[root-of-the-server]__8fc8f497._.js +4 -0
  84. package/mcp-server/.next/server/chunks/[root-of-the-server]__8fc8f497._.js.map +1 -0
  85. package/mcp-server/.next/server/chunks/[root-of-the-server]__9c489027._.js +3 -0
  86. package/mcp-server/.next/server/chunks/[root-of-the-server]__9c489027._.js.map +1 -0
  87. package/mcp-server/.next/server/chunks/[root-of-the-server]__cc81580c._.js +3 -0
  88. package/mcp-server/.next/server/chunks/[root-of-the-server]__cc81580c._.js.map +1 -0
  89. package/mcp-server/.next/server/chunks/[root-of-the-server]__d1f9e389._.js +3 -0
  90. package/mcp-server/.next/server/chunks/[root-of-the-server]__d1f9e389._.js.map +1 -0
  91. package/mcp-server/.next/server/chunks/[root-of-the-server]__d200fe4a._.js +3 -0
  92. package/mcp-server/.next/server/chunks/[root-of-the-server]__d200fe4a._.js.map +1 -0
  93. package/mcp-server/.next/server/chunks/[root-of-the-server]__e2089993._.js +3 -0
  94. package/mcp-server/.next/server/chunks/[root-of-the-server]__e2089993._.js.map +1 -0
  95. package/mcp-server/.next/server/chunks/[root-of-the-server]__ffb73672._.js +3 -0
  96. package/mcp-server/.next/server/chunks/[root-of-the-server]__ffb73672._.js.map +1 -0
  97. package/mcp-server/.next/server/chunks/{0916f_next_ab257ac1._.js → d1d76_next_09a9e080._.js} +4 -4
  98. package/mcp-server/.next/server/chunks/d1d76_next_09a9e080._.js.map +1 -0
  99. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0217e89c._.js +3 -0
  100. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0217e89c._.js.map +1 -0
  101. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__02a8c992._.js +3 -0
  102. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__05689c01._.js +3 -0
  103. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__6518b3b8._.js.map → [root-of-the-server]__05689c01._.js.map} +1 -1
  104. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__8db775f9._.js +3 -0
  105. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__8db775f9._.js.map +1 -0
  106. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__524f1e5c._.js → [root-of-the-server]__91510608._.js} +2 -2
  107. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__91510608._.js.map +1 -0
  108. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__9f07837d._.js +3 -0
  109. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__9f07837d._.js.map +1 -0
  110. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__db74836a._.js +3 -0
  111. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__db74836a._.js.map +1 -0
  112. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__e5dec879._.js +3 -0
  113. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__e5dec879._.js.map +1 -0
  114. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__fb40854a._.js +3 -0
  115. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__fb40854a._.js.map +1 -0
  116. package/mcp-server/.next/server/chunks/ssr/_0b8335fc._.js +8 -0
  117. package/mcp-server/.next/server/chunks/ssr/_0b8335fc._.js.map +1 -0
  118. package/mcp-server/.next/server/chunks/ssr/_28084f73._.js +3 -0
  119. package/mcp-server/.next/server/chunks/ssr/_28084f73._.js.map +1 -0
  120. package/mcp-server/.next/server/chunks/ssr/{_8babd77a._.js → _6129d8ec._.js} +3 -3
  121. package/mcp-server/.next/server/chunks/ssr/_6129d8ec._.js.map +1 -0
  122. package/mcp-server/.next/server/chunks/ssr/_62451611._.js +3 -0
  123. package/mcp-server/.next/server/chunks/ssr/_62451611._.js.map +1 -0
  124. package/mcp-server/.next/server/chunks/ssr/_7d3d2f5f._.js +4 -0
  125. package/mcp-server/.next/server/chunks/ssr/_7d3d2f5f._.js.map +1 -0
  126. package/mcp-server/.next/server/chunks/ssr/_b15f05ee._.js +3 -0
  127. package/mcp-server/.next/server/chunks/ssr/_b15f05ee._.js.map +1 -0
  128. package/mcp-server/.next/server/chunks/ssr/_bacf0748._.js +8 -0
  129. package/mcp-server/.next/server/chunks/ssr/_bacf0748._.js.map +1 -0
  130. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_032c5c2e._.js +3 -0
  131. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_032c5c2e._.js.map +1 -0
  132. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_08b22e19._.js +3 -0
  133. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_08b22e19._.js.map +1 -0
  134. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_369453b3._.js +6 -0
  135. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_369453b3._.js.map +1 -0
  136. package/mcp-server/.next/server/chunks/ssr/{0916f_next_dist_54420d8c._.js → d1d76_next_dist_ad253fdc._.js} +3 -3
  137. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_ad253fdc._.js.map +1 -0
  138. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_b9509b36._.js +6 -0
  139. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_b9509b36._.js.map +1 -0
  140. package/mcp-server/.next/server/chunks/ssr/{0916f_next_dist_client_components_f453b63e._.js → d1d76_next_dist_client_components_6557bb14._.js} +2 -2
  141. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_6557bb14._.js.map +1 -0
  142. package/mcp-server/.next/server/chunks/ssr/{0916f_next_dist_client_components_builtin_forbidden_7b57efa5.js → d1d76_next_dist_client_components_builtin_forbidden_c162dd05.js} +2 -2
  143. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_builtin_forbidden_c162dd05.js.map +1 -0
  144. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_builtin_global-error_3d982957.js +3 -0
  145. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_builtin_global-error_3d982957.js.map +1 -0
  146. package/mcp-server/.next/server/chunks/ssr/{0916f_next_dist_client_components_builtin_unauthorized_6614f15c.js → d1d76_next_dist_client_components_builtin_unauthorized_e4f02ffd.js} +2 -2
  147. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_builtin_unauthorized_e4f02ffd.js.map +1 -0
  148. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_esm_build_templates_app-page_134a93a5.js +4 -0
  149. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_esm_build_templates_app-page_134a93a5.js.map +1 -0
  150. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_layout_tsx_afa41767._.js +1 -1
  151. package/mcp-server/.next/server/middleware-build-manifest.js +7 -8
  152. package/mcp-server/.next/server/server-reference-manifest.js +1 -1
  153. package/mcp-server/.next/server/server-reference-manifest.json +1 -1
  154. package/mcp-server/.next/static/chunks/11ac0d0e69696c72.js +1 -0
  155. package/mcp-server/.next/static/chunks/172f6179d608c15f.js +1 -0
  156. package/mcp-server/.next/static/chunks/526448e84b58822c.js +1 -0
  157. package/mcp-server/.next/static/chunks/571fbcba7786c174.js +1 -0
  158. package/mcp-server/.next/static/chunks/{044e917a180dc576.js → 711519b5a2e53fc8.js} +1 -1
  159. package/mcp-server/.next/static/chunks/addab50e23821c6c.js +1 -0
  160. package/mcp-server/.next/static/chunks/bb8a4e5f381a85ec.js +1 -0
  161. package/mcp-server/.next/static/chunks/dbbdc51e76f4cea4.js +1 -0
  162. package/mcp-server/.next/static/chunks/e09be78bba2194fd.js +1 -0
  163. package/mcp-server/.next/static/chunks/fec3a6ddaef02b8b.js +1 -0
  164. package/mcp-server/.next/static/chunks/{turbopack-ef2dba9946ddb22a.js → turbopack-7cd5a898ed038e26.js} +2 -2
  165. package/mcp-server/app/mcp/route.ts +133 -2
  166. package/mcp-server/app/mcp/tools.ts +991 -5
  167. package/mcp-server/next.config.ts +4 -0
  168. package/mcp-server/package.json +12 -6
  169. package/package.json +4 -4
  170. package/src/tui-interface-impl.tsx +35 -30
  171. package/mcp-server/.next/app-build-manifest.json +0 -52
  172. package/mcp-server/.next/postcss.js +0 -6
  173. package/mcp-server/.next/postcss.js.map +0 -5
  174. package/mcp-server/.next/server/app/_global-error/page/app-build-manifest.json +0 -14
  175. package/mcp-server/.next/server/app/_not-found/page/app-build-manifest.json +0 -15
  176. package/mcp-server/.next/server/app/api/logs/append/route/app-build-manifest.json +0 -12
  177. package/mcp-server/.next/server/app/api/logs/head/route/app-build-manifest.json +0 -12
  178. package/mcp-server/.next/server/app/api/logs/list/route/app-build-manifest.json +0 -12
  179. package/mcp-server/.next/server/app/api/logs/rotate/route/app-build-manifest.json +0 -12
  180. package/mcp-server/.next/server/app/api/logs/stream/route/app-build-manifest.json +0 -12
  181. package/mcp-server/.next/server/app/api/logs/tail/route/app-build-manifest.json +0 -12
  182. package/mcp-server/.next/server/app/api/screenshots/[filename]/route/app-build-manifest.json +0 -12
  183. package/mcp-server/.next/server/app/api/tools/route/app-build-manifest.json +0 -12
  184. package/mcp-server/.next/server/app/logs/page/app-build-manifest.json +0 -18
  185. package/mcp-server/.next/server/app/mcp/route/app-build-manifest.json +0 -12
  186. package/mcp-server/.next/server/app/page/app-build-manifest.json +0 -17
  187. package/mcp-server/.next/server/chunks/0916f_next_ab257ac1._.js.map +0 -1
  188. package/mcp-server/.next/server/chunks/[root-of-the-server]__1b561deb._.js +0 -3
  189. package/mcp-server/.next/server/chunks/[root-of-the-server]__1b561deb._.js.map +0 -1
  190. package/mcp-server/.next/server/chunks/[root-of-the-server]__38e8baae._.js +0 -21
  191. package/mcp-server/.next/server/chunks/[root-of-the-server]__38e8baae._.js.map +0 -1
  192. package/mcp-server/.next/server/chunks/[root-of-the-server]__47380b6c._.js +0 -7
  193. package/mcp-server/.next/server/chunks/[root-of-the-server]__47380b6c._.js.map +0 -1
  194. package/mcp-server/.next/server/chunks/[root-of-the-server]__674284d7._.js +0 -3
  195. package/mcp-server/.next/server/chunks/[root-of-the-server]__674284d7._.js.map +0 -1
  196. package/mcp-server/.next/server/chunks/[root-of-the-server]__6a89b7dc._.js +0 -3
  197. package/mcp-server/.next/server/chunks/[root-of-the-server]__6a89b7dc._.js.map +0 -1
  198. package/mcp-server/.next/server/chunks/[root-of-the-server]__729bfe09._.js +0 -11
  199. package/mcp-server/.next/server/chunks/[root-of-the-server]__729bfe09._.js.map +0 -1
  200. package/mcp-server/.next/server/chunks/[root-of-the-server]__a433711a._.js +0 -3
  201. package/mcp-server/.next/server/chunks/[root-of-the-server]__a433711a._.js.map +0 -1
  202. package/mcp-server/.next/server/chunks/[root-of-the-server]__a58600d8._.js +0 -3
  203. package/mcp-server/.next/server/chunks/[root-of-the-server]__a58600d8._.js.map +0 -1
  204. package/mcp-server/.next/server/chunks/[root-of-the-server]__bc43993b._.js +0 -3
  205. package/mcp-server/.next/server/chunks/[root-of-the-server]__c464573d._.js +0 -3
  206. package/mcp-server/.next/server/chunks/[root-of-the-server]__c464573d._.js.map +0 -1
  207. package/mcp-server/.next/server/chunks/[root-of-the-server]__e6d29491._.js +0 -4
  208. package/mcp-server/.next/server/chunks/[root-of-the-server]__e6d29491._.js.map +0 -1
  209. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_54420d8c._.js.map +0 -1
  210. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_927c15f3._.js +0 -3
  211. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_927c15f3._.js.map +0 -1
  212. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_c17417af._.js +0 -3
  213. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_c17417af._.js.map +0 -1
  214. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_c724e947._.js +0 -6
  215. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_c724e947._.js.map +0 -1
  216. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_builtin_forbidden_7b57efa5.js.map +0 -1
  217. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_builtin_global-error_118601bd.js +0 -3
  218. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_builtin_global-error_118601bd.js.map +0 -1
  219. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_builtin_unauthorized_6614f15c.js.map +0 -1
  220. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_f453b63e._.js.map +0 -1
  221. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_esm_87a80014._.js +0 -6
  222. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_esm_87a80014._.js.map +0 -1
  223. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_esm_build_templates_app-page_25a3dd8d.js +0 -4
  224. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_esm_build_templates_app-page_25a3dd8d.js.map +0 -1
  225. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__224ddd99._.js +0 -3
  226. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__224ddd99._.js.map +0 -1
  227. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__2cdf0446._.js +0 -3
  228. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__2cdf0446._.js.map +0 -1
  229. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__524f1e5c._.js.map +0 -1
  230. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__6518b3b8._.js +0 -3
  231. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__73b7df71._.js +0 -3
  232. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__73b7df71._.js.map +0 -1
  233. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__83ee047c._.js +0 -3
  234. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__83ee047c._.js.map +0 -1
  235. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__b2efa505._.js +0 -3
  236. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__b2efa505._.js.map +0 -1
  237. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__d9cb0b6d._.js +0 -3
  238. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__d9cb0b6d._.js.map +0 -1
  239. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__db132681._.js +0 -3
  240. package/mcp-server/.next/server/chunks/ssr/_188bfe33._.js +0 -6
  241. package/mcp-server/.next/server/chunks/ssr/_188bfe33._.js.map +0 -1
  242. package/mcp-server/.next/server/chunks/ssr/_3a061fbf._.js +0 -4
  243. package/mcp-server/.next/server/chunks/ssr/_3a061fbf._.js.map +0 -1
  244. package/mcp-server/.next/server/chunks/ssr/_8babd77a._.js.map +0 -1
  245. package/mcp-server/.next/server/chunks/ssr/_9d670a6b._.js +0 -5
  246. package/mcp-server/.next/server/chunks/ssr/_9d670a6b._.js.map +0 -1
  247. package/mcp-server/.next/server/chunks/ssr/_d858c4cd._.js +0 -3
  248. package/mcp-server/.next/server/chunks/ssr/_d858c4cd._.js.map +0 -1
  249. package/mcp-server/.next/server/chunks/ssr/_dae9c1d5._.js +0 -8
  250. package/mcp-server/.next/server/chunks/ssr/_dae9c1d5._.js.map +0 -1
  251. package/mcp-server/.next/server/chunks/ssr/_f03e80a8._.js +0 -6
  252. package/mcp-server/.next/server/chunks/ssr/_f03e80a8._.js.map +0 -1
  253. package/mcp-server/.next/static/chunks/1415a83da347ea73.js +0 -1
  254. package/mcp-server/.next/static/chunks/14ca28aed9ba7e16.js +0 -1
  255. package/mcp-server/.next/static/chunks/259312562b58ea20.js +0 -5
  256. package/mcp-server/.next/static/chunks/37a3ca444b4e0ebc.js +0 -1
  257. package/mcp-server/.next/static/chunks/37f62e06d680d8df.js +0 -1
  258. package/mcp-server/.next/static/chunks/40b55f6f752f90a1.js +0 -1
  259. package/mcp-server/.next/static/chunks/5a5edc75ee7e7de4.js +0 -1
  260. package/mcp-server/.next/static/chunks/5dd333b6181425ad.js +0 -1
  261. package/mcp-server/.next/static/chunks/6839f59cc7f3e68c.js +0 -1
  262. package/mcp-server/.next/static/chunks/7a1b61971931d3f6.js +0 -1
  263. package/mcp-server/.next/static/chunks/881ec25f9292cb32.js +0 -1
  264. package/mcp-server/.next/static/chunks/8a5ef92054eb3f68.js +0 -1
  265. package/mcp-server/.next/static/chunks/af081359d0245052.js +0 -5
  266. package/mcp-server/.next/static/chunks/b137bfc92ad8bec0.js +0 -1
  267. package/mcp-server/.next/static/chunks/c5f8464bc8083ee7.js +0 -1
  268. package/mcp-server/.next/static/chunks/eab992a4c8e8981a.js +0 -1
  269. package/mcp-server/.next/static/chunks/turbopack-aef1414f7c590584.js +0 -3
  270. package/mcp-server/.next/static/chunks/turbopack-e808877bd413e182.js +0 -3
  271. package/mcp-server/.next/webpack-loaders.js +0 -6
  272. package/mcp-server/.next/webpack-loaders.js.map +0 -5
  273. /package/mcp-server/.next/server/chunks/{[root-of-the-server]__bc43993b._.js.map → [root-of-the-server]__6fa7ea53._.js.map} +0 -0
  274. /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__db132681._.js.map → [root-of-the-server]__02a8c992._.js.map} +0 -0
  275. /package/mcp-server/.next/static/{3E55dEq7tPut9JesZEs2c → e3oE33k8Pj7aB0H8XMR1s}/_buildManifest.js +0 -0
  276. /package/mcp-server/.next/static/{3E55dEq7tPut9JesZEs2c → e3oE33k8Pj7aB0H8XMR1s}/_clientMiddlewareManifest.json +0 -0
  277. /package/mcp-server/.next/static/{3E55dEq7tPut9JesZEs2c → e3oE33k8Pj7aB0H8XMR1s}/_ssgManifest.js +0 -0
@@ -10,6 +10,12 @@ import { NextJsErrorDetector, OutputProcessor, StandardLogParser } from "./servi
10
10
  import { DevTUI } from "./tui-interface.js";
11
11
  import { getProjectDisplayName, getProjectName } from "./utils/project-name.js";
12
12
  import { formatTimestamp } from "./utils/timestamp.js";
13
+ // MCP names
14
+ const MCP_NAMES = {
15
+ DEV3000: "dev3000",
16
+ CHROME_DEVTOOLS: "dev3000-chrome-devtools",
17
+ NEXTJS_DEV: "dev3000-nextjs-dev"
18
+ };
13
19
  class Logger {
14
20
  logFile;
15
21
  tail;
@@ -71,6 +77,378 @@ async function findAvailablePort(startPort) {
71
77
  }
72
78
  throw new Error(`No available ports found starting from ${startPort}`);
73
79
  }
80
+ const AI_CLI_TOOLS = [
81
+ {
82
+ binary: "claude",
83
+ name: "Claude Code",
84
+ addMcpCommand: (name, command, ...args) => ["claude", "mcp", "add", name, command, ...args],
85
+ addHttpMcpCommand: (name, url) => ["claude", "mcp", "add", "-t", "http", name, url],
86
+ removeMcpCommand: (name) => ["claude", "mcp", "remove", name]
87
+ },
88
+ {
89
+ binary: "gemini",
90
+ name: "Gemini CLI",
91
+ addMcpCommand: (name, command, ...args) => ["gemini", "mcp", "add", name, command, ...args],
92
+ addHttpMcpCommand: (name, url) => ["gemini", "mcp", "add", "-t", "http", name, url],
93
+ removeMcpCommand: (name) => ["gemini", "mcp", "remove", name]
94
+ }
95
+ // TODO: Research and add other AI CLI tools once we verify their MCP capabilities
96
+ // {
97
+ // binary: "cursor-agent",
98
+ // name: "Cursor Agent",
99
+ // addMcpCommand: (name, command, ...args) => ["cursor-agent", "mcp", "add", name, command, ...args],
100
+ // addHttpMcpCommand: (name, url) => ["cursor-agent", "mcp", "add", "-t", "http", name, url],
101
+ // removeMcpCommand: (name) => ["cursor-agent", "mcp", "remove", name]
102
+ // },
103
+ // {
104
+ // binary: "codex",
105
+ // name: "Codex CLI",
106
+ // addMcpCommand: (name, command, ...args) => ["codex", "mcp", "add", name, command, ...args],
107
+ // addHttpMcpCommand: (name, url) => ["codex", "mcp", "add", "-t", "http", name, url],
108
+ // removeMcpCommand: (name) => ["codex", "mcp", "remove", name]
109
+ // }
110
+ ];
111
+ /**
112
+ * Check if Next.js MCP server is enabled in the project configuration
113
+ */
114
+ async function isNextjsMcpEnabled() {
115
+ try {
116
+ const configFiles = ["next.config.js", "next.config.ts", "next.config.mjs", "next.config.cjs"];
117
+ for (const configFile of configFiles) {
118
+ if (existsSync(configFile)) {
119
+ try {
120
+ // Read the config file content
121
+ const configContent = readFileSync(configFile, "utf8");
122
+ // Look for experimental.mcpServer: true or experimental.mcpServer = true
123
+ // This is a simple string-based check that should work for most cases
124
+ const hasMcpServerConfig = /experimental\s*:\s*{[^}]*mcpServer\s*:\s*true|experimental\.mcpServer\s*[=:]\s*true/s.test(configContent);
125
+ if (hasMcpServerConfig) {
126
+ return true;
127
+ }
128
+ }
129
+ catch {
130
+ // If we can't read the file, continue checking other config files
131
+ }
132
+ }
133
+ }
134
+ return false;
135
+ }
136
+ catch {
137
+ return false;
138
+ }
139
+ }
140
+ /**
141
+ * Check if Chrome version supports chrome-devtools MCP (>= 140.0.7339.214)
142
+ */
143
+ async function isChromeDevtoolsMcpSupported() {
144
+ try {
145
+ // Try different Chrome binary paths
146
+ const chromePaths = [
147
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", // macOS
148
+ "/opt/google/chrome/chrome", // Linux
149
+ "chrome", // PATH
150
+ "google-chrome", // Linux PATH
151
+ "google-chrome-stable" // Linux PATH
152
+ ];
153
+ for (const chromePath of chromePaths) {
154
+ try {
155
+ const versionOutput = await new Promise((resolve, reject) => {
156
+ const chromeProcess = spawn(chromePath, ["--version"], {
157
+ stdio: ["ignore", "pipe", "ignore"]
158
+ });
159
+ let output = "";
160
+ chromeProcess.stdout?.on("data", (data) => {
161
+ output += data.toString();
162
+ });
163
+ chromeProcess.on("close", (code) => {
164
+ if (code === 0) {
165
+ resolve(output.trim());
166
+ }
167
+ else {
168
+ reject(new Error(`Chrome version check failed with code ${code}`));
169
+ }
170
+ });
171
+ chromeProcess.on("error", reject);
172
+ // Timeout after 3 seconds
173
+ setTimeout(() => {
174
+ chromeProcess.kill();
175
+ reject(new Error("Chrome version check timeout"));
176
+ }, 3000);
177
+ });
178
+ // Parse version from output like "Google Chrome 140.0.7339.214"
179
+ const versionMatch = versionOutput.match(/(\d+)\.(\d+)\.(\d+)\.(\d+)/);
180
+ if (versionMatch) {
181
+ const [, major, minor, build, patch] = versionMatch.map(Number);
182
+ const currentVersion = [major, minor, build, patch];
183
+ const requiredVersion = [140, 0, 7339, 214];
184
+ // Compare version numbers
185
+ for (let i = 0; i < 4; i++) {
186
+ if (currentVersion[i] > requiredVersion[i])
187
+ return true;
188
+ if (currentVersion[i] < requiredVersion[i])
189
+ return false;
190
+ }
191
+ return true; // Versions are equal
192
+ }
193
+ break; // Found Chrome but couldn't parse version - continue with other paths
194
+ }
195
+ catch {
196
+ // Try next Chrome path
197
+ }
198
+ }
199
+ return false; // Chrome not found or version not supported
200
+ }
201
+ catch {
202
+ return false; // Any error means not supported
203
+ }
204
+ }
205
+ /**
206
+ * Detect which AI CLI tools are available on the system
207
+ */
208
+ async function detectAvailableAiCliTools() {
209
+ const availableTools = [];
210
+ for (const tool of AI_CLI_TOOLS) {
211
+ try {
212
+ // Try to run the binary with --version to check if it exists
213
+ await new Promise((resolve, reject) => {
214
+ const testProcess = spawn(tool.binary, ["--version"], {
215
+ stdio: ["ignore", "pipe", "pipe"]
216
+ });
217
+ testProcess.on("close", (_code) => {
218
+ // Most CLIs return 0 for --version, but some might return other codes
219
+ // We just check if the binary exists and runs
220
+ resolve();
221
+ });
222
+ testProcess.on("error", (error) => {
223
+ // Binary not found or not executable
224
+ reject(error);
225
+ });
226
+ // Timeout after 2 seconds
227
+ setTimeout(() => {
228
+ testProcess.kill();
229
+ reject(new Error("Timeout"));
230
+ }, 2000);
231
+ });
232
+ availableTools.push(tool);
233
+ }
234
+ catch {
235
+ // Tool not available - continue checking others
236
+ }
237
+ }
238
+ return availableTools;
239
+ }
240
+ /**
241
+ * Configure MCPs for a specific AI CLI tool
242
+ */
243
+ async function configureMcpsForCliTool(tool, mcpPort, appPort, enableChromeDevtools, chromeDevtoolsSupported, enableNextjsMcp) {
244
+ const results = {
245
+ dev3000: false,
246
+ chromeDevtools: false,
247
+ nextjsDev: false
248
+ };
249
+ // Configure main dev3000 MCP
250
+ try {
251
+ const dev3000Command = tool.addHttpMcpCommand(MCP_NAMES.DEV3000, `http://localhost:${mcpPort}/mcp`);
252
+ await new Promise((resolve, reject) => {
253
+ const configProcess = spawn(dev3000Command[0], dev3000Command.slice(1), {
254
+ stdio: ["inherit", "pipe", "pipe"]
255
+ });
256
+ let errorOutput = "";
257
+ configProcess.stderr?.on("data", (data) => {
258
+ errorOutput += data.toString();
259
+ });
260
+ configProcess.on("close", (code) => {
261
+ if (code === 0 || errorOutput.includes("already exists")) {
262
+ results.dev3000 = true;
263
+ resolve();
264
+ }
265
+ else {
266
+ reject(new Error(`Failed to configure dev3000 MCP: ${errorOutput}`));
267
+ }
268
+ });
269
+ configProcess.on("error", reject);
270
+ });
271
+ }
272
+ catch (error) {
273
+ console.log(`⚠️ Failed to configure dev3000 MCP for ${tool.name}:`, error);
274
+ }
275
+ // Configure chrome-devtools MCP if enabled and Chrome version is supported
276
+ if (enableChromeDevtools && chromeDevtoolsSupported) {
277
+ try {
278
+ const chromeDevtoolsCommand = tool.addMcpCommand(MCP_NAMES.CHROME_DEVTOOLS, "npx", "chrome-devtools-mcp@latest", "--browserUrl", "http://127.0.0.1:9222");
279
+ await new Promise((resolve, reject) => {
280
+ const configProcess = spawn(chromeDevtoolsCommand[0], chromeDevtoolsCommand.slice(1), {
281
+ stdio: ["inherit", "pipe", "pipe"]
282
+ });
283
+ let errorOutput = "";
284
+ configProcess.stderr?.on("data", (data) => {
285
+ errorOutput += data.toString();
286
+ });
287
+ configProcess.on("close", (code) => {
288
+ if (code === 0 || errorOutput.includes("already exists")) {
289
+ results.chromeDevtools = true;
290
+ resolve();
291
+ }
292
+ else {
293
+ reject(new Error(`Failed to configure chrome-devtools MCP: ${errorOutput}`));
294
+ }
295
+ });
296
+ configProcess.on("error", reject);
297
+ });
298
+ }
299
+ catch (error) {
300
+ console.log(`⚠️ Failed to configure chrome-devtools MCP for ${tool.name}:`, error);
301
+ }
302
+ }
303
+ else if (enableChromeDevtools && !chromeDevtoolsSupported) {
304
+ // Chrome version doesn't support chrome-devtools MCP
305
+ results.chromeSkipped = "Chrome < 140.0.7339.214";
306
+ }
307
+ // Configure nextjs-dev MCP if enabled
308
+ if (enableNextjsMcp) {
309
+ try {
310
+ const nextjsDevCommand = tool.addHttpMcpCommand(MCP_NAMES.NEXTJS_DEV, `http://localhost:${appPort}/_next/mcp`);
311
+ await new Promise((resolve, reject) => {
312
+ const configProcess = spawn(nextjsDevCommand[0], nextjsDevCommand.slice(1), {
313
+ stdio: ["inherit", "pipe", "pipe"]
314
+ });
315
+ let errorOutput = "";
316
+ configProcess.stderr?.on("data", (data) => {
317
+ errorOutput += data.toString();
318
+ });
319
+ configProcess.on("close", (code) => {
320
+ if (code === 0 || errorOutput.includes("already exists")) {
321
+ results.nextjsDev = true;
322
+ resolve();
323
+ }
324
+ else {
325
+ reject(new Error(`Failed to configure nextjs-dev MCP: ${errorOutput}`));
326
+ }
327
+ });
328
+ configProcess.on("error", reject);
329
+ });
330
+ }
331
+ catch (error) {
332
+ console.log(`⚠️ Failed to configure nextjs-dev MCP for ${tool.name}:`, error);
333
+ }
334
+ }
335
+ return results;
336
+ }
337
+ /**
338
+ * Clean up MCP configurations for a specific AI CLI tool
339
+ */
340
+ async function cleanupMcpsForCliTool(tool, enableChromeDevtools, enableNextjsMcp) {
341
+ // Clean up dev3000 MCP
342
+ try {
343
+ const dev3000Command = tool.removeMcpCommand(MCP_NAMES.DEV3000);
344
+ await new Promise((resolve) => {
345
+ const cleanupProcess = spawn(dev3000Command[0], dev3000Command.slice(1), {
346
+ stdio: ["inherit", "pipe", "pipe"]
347
+ });
348
+ cleanupProcess.on("close", () => resolve());
349
+ cleanupProcess.on("error", () => resolve()); // Don't fail on cleanup errors
350
+ });
351
+ }
352
+ catch {
353
+ // Ignore cleanup errors
354
+ }
355
+ // Clean up chrome-devtools MCP if it was enabled
356
+ if (enableChromeDevtools) {
357
+ try {
358
+ const chromeDevtoolsCommand = tool.removeMcpCommand(MCP_NAMES.CHROME_DEVTOOLS);
359
+ await new Promise((resolve) => {
360
+ const cleanupProcess = spawn(chromeDevtoolsCommand[0], chromeDevtoolsCommand.slice(1), {
361
+ stdio: ["inherit", "pipe", "pipe"]
362
+ });
363
+ cleanupProcess.on("close", () => resolve());
364
+ cleanupProcess.on("error", () => resolve()); // Don't fail on cleanup errors
365
+ });
366
+ }
367
+ catch {
368
+ // Ignore cleanup errors
369
+ }
370
+ }
371
+ // Clean up nextjs-dev MCP if it was enabled
372
+ if (enableNextjsMcp) {
373
+ try {
374
+ const nextjsDevCommand = tool.removeMcpCommand(MCP_NAMES.NEXTJS_DEV);
375
+ await new Promise((resolve) => {
376
+ const cleanupProcess = spawn(nextjsDevCommand[0], nextjsDevCommand.slice(1), {
377
+ stdio: ["inherit", "pipe", "pipe"]
378
+ });
379
+ cleanupProcess.on("close", () => resolve());
380
+ cleanupProcess.on("error", () => resolve()); // Don't fail on cleanup errors
381
+ });
382
+ }
383
+ catch {
384
+ // Ignore cleanup errors
385
+ }
386
+ }
387
+ }
388
+ /**
389
+ * Configure MCPs for all detected AI CLI tools
390
+ */
391
+ async function configureAiCliIntegrations(mcpPort, appPort, enableChromeDevtools, silent = false) {
392
+ if (!silent)
393
+ console.log("🔍 Detecting available AI CLI tools...");
394
+ const availableTools = await detectAvailableAiCliTools();
395
+ if (availableTools.length === 0) {
396
+ if (!silent)
397
+ console.log("📝 No AI CLI tools detected - dev3000 will work when CLIs are installed later");
398
+ return [];
399
+ }
400
+ // Check Chrome version if chrome-devtools MCP is requested
401
+ let chromeDevtoolsSupported = false;
402
+ if (enableChromeDevtools) {
403
+ if (!silent)
404
+ console.log("🔍 Checking Chrome version for chrome-devtools MCP compatibility...");
405
+ chromeDevtoolsSupported = await isChromeDevtoolsMcpSupported();
406
+ if (!chromeDevtoolsSupported && !silent) {
407
+ console.log("⚠️ Chrome version < 140.0.7339.214 detected - chrome-devtools MCP will be skipped");
408
+ }
409
+ }
410
+ // Check if NextJS MCP is enabled in project configuration
411
+ const enableNextjsMcp = await isNextjsMcpEnabled();
412
+ if (enableNextjsMcp && !silent) {
413
+ console.log("🔍 Next.js MCP server detected in project configuration");
414
+ }
415
+ if (!silent)
416
+ console.log(`🔧 Configuring MCPs for ${availableTools.length} detected AI CLI tools...`);
417
+ for (const tool of availableTools) {
418
+ if (!silent)
419
+ console.log(` Configuring ${tool.name}...`);
420
+ const results = await configureMcpsForCliTool(tool, mcpPort, appPort, enableChromeDevtools, chromeDevtoolsSupported, enableNextjsMcp);
421
+ let status = "";
422
+ if (results.dev3000)
423
+ status += "✅ dev3000";
424
+ if (results.chromeDevtools)
425
+ status += results.dev3000 ? " + chrome-devtools" : "✅ chrome-devtools";
426
+ if (results.nextjsDev)
427
+ status += results.dev3000 || results.chromeDevtools ? " + nextjs-dev" : "✅ nextjs-dev";
428
+ if (results.chromeSkipped)
429
+ status +=
430
+ results.dev3000 || results.nextjsDev
431
+ ? ` (chrome-devtools skipped: ${results.chromeSkipped})`
432
+ : `⚠️ chrome-devtools skipped: ${results.chromeSkipped}`;
433
+ if (!results.dev3000 && !results.chromeDevtools && !results.nextjsDev && !results.chromeSkipped)
434
+ status = "❌ failed";
435
+ if (!silent)
436
+ console.log(` ${tool.name}: ${status}`);
437
+ }
438
+ return availableTools;
439
+ }
440
+ /**
441
+ * Clean up MCP configurations for all detected AI CLI tools
442
+ */
443
+ async function cleanupAiCliIntegrations(availableTools, enableChromeDevtools, enableNextjsMcp, silent = false) {
444
+ if (availableTools.length === 0)
445
+ return;
446
+ if (!silent)
447
+ console.log("🧹 Cleaning up AI CLI MCP configurations...");
448
+ for (const tool of availableTools) {
449
+ await cleanupMcpsForCliTool(tool, enableChromeDevtools, enableNextjsMcp);
450
+ }
451
+ }
74
452
  export function createPersistentLogFile() {
75
453
  // Get unique project name
76
454
  const projectName = getProjectName();
@@ -193,6 +571,8 @@ export class DevEnvironment {
193
571
  tui = null;
194
572
  portChangeMessage = null;
195
573
  firstSigintTime = null;
574
+ configuredAiCliTools = [];
575
+ enableNextjsMcp = false;
196
576
  constructor(options) {
197
577
  // Handle portMcp vs mcpPort naming
198
578
  this.options = {
@@ -246,6 +626,8 @@ export class DevEnvironment {
246
626
  if (!existsSync(this.mcpPublicDir)) {
247
627
  mkdirSync(this.mcpPublicDir, { recursive: true });
248
628
  }
629
+ // Initialize project-specific D3K log file (clear for new session)
630
+ this.initializeD3KLog();
249
631
  }
250
632
  async checkPortsAvailable(silent = false) {
251
633
  // Always kill any existing MCP server to ensure clean state
@@ -437,10 +819,31 @@ export class DevEnvironment {
437
819
  await this.waitForServer();
438
820
  await this.tui.updateStatus(`Waiting for ${this.options.commandName} MCP server...`);
439
821
  await this.waitForMcpServer();
822
+ // Progressive MCP discovery - after dev server is ready
823
+ await this.tui.updateStatus("Discovering available MCPs...");
824
+ await this.discoverMcpsAfterServerStart();
825
+ // Configure AI CLI integrations (both dev3000 and chrome-devtools MCPs)
826
+ if (!this.options.serversOnly) {
827
+ await this.tui.updateStatus("Configuring AI CLI integrations...");
828
+ // Check if NextJS MCP is enabled and store the result
829
+ this.enableNextjsMcp = await isNextjsMcpEnabled();
830
+ this.configuredAiCliTools = await configureAiCliIntegrations(this.options.mcpPort || "3684", this.options.port, this.options.chromeDevtoolsMcp !== false, // Default to true unless explicitly disabled
831
+ true // Silent mode when TUI is active
832
+ );
833
+ if (this.configuredAiCliTools.length > 0) {
834
+ this.logD3K(`AI CLI Integration: Configured ${this.configuredAiCliTools.length} AI CLI tools for seamless dev3000 access`);
835
+ }
836
+ else {
837
+ this.logD3K("AI CLI Integration: No AI CLIs detected, manual configuration will be needed");
838
+ }
839
+ }
440
840
  // Start CDP monitoring if not in servers-only mode
441
841
  if (!this.options.serversOnly) {
442
842
  await this.tui.updateStatus(`Starting ${this.options.commandName} browser...`);
443
- this.startCDPMonitoringAsync();
843
+ await this.startCDPMonitoringSync();
844
+ // Progressive MCP discovery - after browser is ready
845
+ await this.tui.updateStatus("Final MCP discovery scan...");
846
+ await this.discoverMcpsAfterBrowserStart();
444
847
  }
445
848
  else {
446
849
  this.debugLog("Browser monitoring disabled via --servers-only flag");
@@ -473,10 +876,31 @@ export class DevEnvironment {
473
876
  await this.waitForServer();
474
877
  this.spinner.text = `Waiting for ${this.options.commandName} MCP server...`;
475
878
  await this.waitForMcpServer();
879
+ // Progressive MCP discovery - after dev server is ready
880
+ this.spinner.text = "Discovering available MCPs...";
881
+ await this.discoverMcpsAfterServerStart();
882
+ // Configure AI CLI integrations (both dev3000 and chrome-devtools MCPs)
883
+ if (!this.options.serversOnly) {
884
+ this.spinner.text = "Configuring AI CLI integrations...";
885
+ // Check if NextJS MCP is enabled and store the result
886
+ this.enableNextjsMcp = await isNextjsMcpEnabled();
887
+ this.configuredAiCliTools = await configureAiCliIntegrations(this.options.mcpPort || "3684", this.options.port, this.options.chromeDevtoolsMcp !== false, // Default to true unless explicitly disabled
888
+ false // Show output in non-TUI mode
889
+ );
890
+ if (this.configuredAiCliTools.length > 0) {
891
+ this.logD3K(`AI CLI Integration: Configured ${this.configuredAiCliTools.length} AI CLI tools for seamless dev3000 access`);
892
+ }
893
+ else {
894
+ this.logD3K("AI CLI Integration: No AI CLIs detected, manual configuration will be needed");
895
+ }
896
+ }
476
897
  // Start CDP monitoring if not in servers-only mode
477
898
  if (!this.options.serversOnly) {
478
899
  this.spinner.text = `Starting ${this.options.commandName} browser...`;
479
- this.startCDPMonitoringAsync();
900
+ await this.startCDPMonitoringSync();
901
+ // Progressive MCP discovery - after browser is ready
902
+ this.spinner.text = "Final MCP discovery scan...";
903
+ await this.discoverMcpsAfterBrowserStart();
480
904
  }
481
905
  else {
482
906
  this.debugLog("Browser monitoring disabled via --servers-only flag");
@@ -1064,17 +1488,259 @@ export class DevEnvironment {
1064
1488
  this.debugLog("MCP server health check failed, terminating");
1065
1489
  throw new Error(`MCP server failed to start after ${maxAttempts} seconds. Check the logs for errors.`);
1066
1490
  }
1067
- startCDPMonitoringAsync() {
1491
+ async discoverMcpsAfterServerStart() {
1492
+ try {
1493
+ this.debugLog("Starting MCP discovery after dev server startup");
1494
+ // Call the MCP discovery function - make HTTP request to our own MCP server
1495
+ const mcpUrl = `http://localhost:${this.options.mcpPort}/mcp`;
1496
+ const projectName = getProjectName();
1497
+ this.debugLog(`Running MCP discovery for project: ${projectName} via ${mcpUrl}`);
1498
+ const requestPayload = {
1499
+ jsonrpc: "2.0",
1500
+ id: 1,
1501
+ method: "tools/call",
1502
+ params: {
1503
+ name: "discover_available_mcps",
1504
+ arguments: {
1505
+ projectName: projectName
1506
+ }
1507
+ }
1508
+ };
1509
+ const response = await fetch(mcpUrl, {
1510
+ method: "POST",
1511
+ headers: {
1512
+ "Content-Type": "application/json",
1513
+ Accept: "application/json, text/event-stream"
1514
+ },
1515
+ body: JSON.stringify(requestPayload)
1516
+ });
1517
+ if (!response.ok) {
1518
+ throw new Error(`MCP request failed: ${response.status} ${response.statusText}`);
1519
+ }
1520
+ // Handle both JSON and SSE responses
1521
+ const contentType = response.headers.get("content-type") || "";
1522
+ let result;
1523
+ if (contentType.includes("text/event-stream")) {
1524
+ // Parse Server-Sent Events format
1525
+ const sseText = await response.text();
1526
+ const dataLine = sseText.split("\n").find((line) => line.startsWith("data: "));
1527
+ if (dataLine) {
1528
+ result = JSON.parse(dataLine.substring(6)); // Remove "data: " prefix
1529
+ }
1530
+ else {
1531
+ throw new Error("No data found in SSE response");
1532
+ }
1533
+ }
1534
+ else {
1535
+ // Parse regular JSON
1536
+ result = await response.json();
1537
+ }
1538
+ if (result.error) {
1539
+ throw new Error(`MCP error: ${result.error.message}`);
1540
+ }
1541
+ // Parse the discovered MCPs from the response
1542
+ const responseText = result.result?.content?.[0]?.text || "";
1543
+ const discoveredMcps = this.parseMcpDiscoveryResult(responseText);
1544
+ if (discoveredMcps.length > 0) {
1545
+ this.debugLog(`MCP discovery found: ${discoveredMcps.join(", ")}`);
1546
+ // Log discovery results to the main log file with [D3K] tags
1547
+ const discoveryMessage = `MCP Discovery: Found ${discoveredMcps.join(", ")} after dev server startup`;
1548
+ this.logD3K(discoveryMessage);
1549
+ // Additional logging for each MCP
1550
+ for (const mcp of discoveredMcps) {
1551
+ this.logD3K(`MCP Integration: ${mcp} MCP detected via process/port scanning`);
1552
+ }
1553
+ }
1554
+ else {
1555
+ this.debugLog("MCP discovery found no MCPs after dev server startup");
1556
+ this.logD3K("MCP Discovery: No MCPs detected after dev server startup");
1557
+ }
1558
+ }
1559
+ catch (error) {
1560
+ this.debugLog(`MCP discovery error after server start: ${error}`);
1561
+ // Non-fatal - just log the error
1562
+ this.logD3K(`MCP Discovery Error: ${error instanceof Error ? error.message : String(error)}`);
1563
+ }
1564
+ }
1565
+ async discoverMcpsAfterBrowserStart() {
1566
+ try {
1567
+ this.debugLog("Starting MCP discovery after browser startup");
1568
+ // Call the MCP discovery function - make HTTP request to our own MCP server
1569
+ const mcpUrl = `http://localhost:${this.options.mcpPort}/mcp`;
1570
+ const projectName = getProjectName();
1571
+ this.debugLog(`Running final MCP discovery for project: ${projectName} via ${mcpUrl}`);
1572
+ const requestPayload = {
1573
+ jsonrpc: "2.0",
1574
+ id: 1,
1575
+ method: "tools/call",
1576
+ params: {
1577
+ name: "discover_available_mcps",
1578
+ arguments: {
1579
+ projectName: projectName
1580
+ }
1581
+ }
1582
+ };
1583
+ const response = await fetch(mcpUrl, {
1584
+ method: "POST",
1585
+ headers: {
1586
+ "Content-Type": "application/json",
1587
+ Accept: "application/json, text/event-stream"
1588
+ },
1589
+ body: JSON.stringify(requestPayload)
1590
+ });
1591
+ if (!response.ok) {
1592
+ throw new Error(`MCP request failed: ${response.status} ${response.statusText}`);
1593
+ }
1594
+ // Handle both JSON and SSE responses
1595
+ const contentType = response.headers.get("content-type") || "";
1596
+ let result;
1597
+ if (contentType.includes("text/event-stream")) {
1598
+ // Parse Server-Sent Events format
1599
+ const sseText = await response.text();
1600
+ const dataLine = sseText.split("\n").find((line) => line.startsWith("data: "));
1601
+ if (dataLine) {
1602
+ result = JSON.parse(dataLine.substring(6)); // Remove "data: " prefix
1603
+ }
1604
+ else {
1605
+ throw new Error("No data found in SSE response");
1606
+ }
1607
+ }
1608
+ else {
1609
+ // Parse regular JSON
1610
+ result = await response.json();
1611
+ }
1612
+ if (result.error) {
1613
+ throw new Error(`MCP error: ${result.error.message}`);
1614
+ }
1615
+ // Parse the discovered MCPs from the response
1616
+ const responseText = result.result?.content?.[0]?.text || "";
1617
+ const discoveredMcps = this.parseMcpDiscoveryResult(responseText);
1618
+ if (discoveredMcps.length > 0) {
1619
+ this.debugLog(`Final MCP discovery found: ${discoveredMcps.join(", ")}`);
1620
+ // Log discovery results to the main log file with [D3K] tags
1621
+ const discoveryMessage = `MCP Discovery: Final scan found ${discoveredMcps.join(", ")} after browser startup`;
1622
+ this.logD3K(discoveryMessage);
1623
+ // Log integration summary
1624
+ const integrationTypes = [];
1625
+ if (discoveredMcps.includes("nextjs-dev"))
1626
+ integrationTypes.push("Next.js");
1627
+ if (discoveredMcps.includes("chrome-devtools"))
1628
+ integrationTypes.push("Chrome DevTools");
1629
+ if (integrationTypes.length > 0) {
1630
+ this.logD3K(`MCP Integration: Activated integrations [${integrationTypes.join(", ")}]`);
1631
+ this.logD3K(`Orchestrator Mode: dev3000 is now running as debugging orchestrator with ${integrationTypes.length} MCP integration(s)`);
1632
+ // If chrome-devtools is detected, share CDP URL for coordination
1633
+ if (discoveredMcps.includes("chrome-devtools")) {
1634
+ this.shareCdpUrlWithChromeDevtools();
1635
+ }
1636
+ }
1637
+ }
1638
+ else {
1639
+ this.debugLog("Final MCP discovery found no MCPs");
1640
+ this.logD3K("MCP Discovery: Final scan completed - running in standalone mode");
1641
+ }
1642
+ }
1643
+ catch (error) {
1644
+ this.debugLog(`MCP discovery error after browser start: ${error}`);
1645
+ // Non-fatal - just log the error
1646
+ this.logD3K(`MCP Discovery Error: ${error instanceof Error ? error.message : String(error)}`);
1647
+ }
1648
+ }
1649
+ initializeD3KLog() {
1650
+ try {
1651
+ const debugLogDir = join(homedir(), ".d3k", "logs");
1652
+ if (!existsSync(debugLogDir)) {
1653
+ mkdirSync(debugLogDir, { recursive: true });
1654
+ }
1655
+ // Create project-specific D3K log file and clear it for new session
1656
+ const projectName = getProjectName();
1657
+ const d3kLogFile = join(debugLogDir, `dev3000-${projectName}-d3k.log`);
1658
+ writeFileSync(d3kLogFile, "");
1659
+ }
1660
+ catch {
1661
+ // Ignore D3K log initialization errors - non-critical
1662
+ }
1663
+ }
1664
+ logD3K(message) {
1665
+ // Write [D3K] logs to project-specific dev3000 debug log, NOT to main project log
1666
+ // This prevents Claude from thinking dev3000's orchestration logic needs to be "fixed"
1667
+ const timestamp = formatTimestamp(new Date(), this.options.dateTimeFormat || "local");
1668
+ const logEntry = `[${timestamp}] [D3K] ${message}\n`;
1669
+ try {
1670
+ const debugLogDir = join(homedir(), ".d3k", "logs");
1671
+ if (!existsSync(debugLogDir)) {
1672
+ mkdirSync(debugLogDir, { recursive: true });
1673
+ }
1674
+ // Create project-specific D3K log file to avoid confusion between multiple instances
1675
+ const projectName = getProjectName();
1676
+ const d3kLogFile = join(debugLogDir, `dev3000-${projectName}-d3k.log`);
1677
+ appendFileSync(d3kLogFile, logEntry);
1678
+ }
1679
+ catch {
1680
+ // Ignore D3K log write errors - non-critical
1681
+ }
1682
+ }
1683
+ shareCdpUrlWithChromeDevtools() {
1684
+ if (!this.cdpMonitor)
1685
+ return;
1686
+ const cdpUrl = this.cdpMonitor.getCdpUrl();
1687
+ if (cdpUrl) {
1688
+ this.logD3K(`CDP Integration: Chrome DevTools can connect to existing browser at ${cdpUrl}`);
1689
+ this.logD3K(`CDP Coordination: Use this URL to avoid launching duplicate Chrome instances`);
1690
+ this.logD3K(`CDP Enhanced Workflow: chrome-devtools can now take screenshots, inject JS, and debug using dev3000's browser`);
1691
+ this.logD3K(`CDP Claude Suggestion: When using chrome-devtools MCP, connect to: ${cdpUrl}`);
1692
+ // Also update session info to make CDP URL immediately available
1693
+ const projectName = getProjectName();
1694
+ writeSessionInfo(projectName, this.options.logFile, this.options.port, this.options.mcpPort, cdpUrl, this.cdpMonitor.getChromePids());
1695
+ }
1696
+ else {
1697
+ this.logD3K("CDP Integration: CDP URL not yet available - browser may still be starting");
1698
+ // Retry after a short delay since browser might still be initializing
1699
+ setTimeout(() => {
1700
+ if (this.cdpMonitor) {
1701
+ const delayedCdpUrl = this.cdpMonitor.getCdpUrl();
1702
+ if (delayedCdpUrl) {
1703
+ this.logD3K(`CDP Integration: Chrome DevTools can now connect to ${delayedCdpUrl}`);
1704
+ this.logD3K(`CDP Delayed Coordination: Browser initialization complete`);
1705
+ const projectName = getProjectName();
1706
+ writeSessionInfo(projectName, this.options.logFile, this.options.port, this.options.mcpPort, delayedCdpUrl, this.cdpMonitor.getChromePids());
1707
+ }
1708
+ }
1709
+ }, 2000); // Wait 2 seconds for browser to fully initialize
1710
+ }
1711
+ }
1712
+ parseMcpDiscoveryResult(responseText) {
1713
+ // Parse the MCP discovery response text to extract discovered MCPs
1714
+ // Example: "🔍 **MCP DISCOVERY RESULTS**\n\nDiscovered MCPs: chrome-devtools, nextjs-dev"
1715
+ const mcps = [];
1716
+ // Look for the "Discovered MCPs:" line
1717
+ const match = responseText.match(/Discovered MCPs:\s*([^\n]+)/i);
1718
+ if (match?.[1]) {
1719
+ const mcpList = match[1].trim();
1720
+ if (mcpList !== "none") {
1721
+ // Split by comma and clean up each MCP name
1722
+ mcps.push(...mcpList
1723
+ .split(",")
1724
+ .map((name) => name.trim())
1725
+ .filter(Boolean));
1726
+ }
1727
+ }
1728
+ return mcps;
1729
+ }
1730
+ async startCDPMonitoringSync() {
1068
1731
  // Skip if in servers-only mode
1069
1732
  if (this.options.serversOnly) {
1070
1733
  return;
1071
1734
  }
1072
- // Start CDP monitoring in background without blocking completion
1073
- this.startCDPMonitoring().catch((error) => {
1735
+ try {
1736
+ await this.startCDPMonitoring();
1737
+ }
1738
+ catch (error) {
1074
1739
  console.error(chalk.red("⚠️ CDP monitoring setup failed:"), error);
1075
1740
  // CDP monitoring is critical - shutdown if it fails
1076
1741
  this.gracefulShutdown();
1077
- });
1742
+ throw error;
1743
+ }
1078
1744
  }
1079
1745
  async startCDPMonitoring() {
1080
1746
  // Skip if in servers-only mode
@@ -1321,6 +1987,10 @@ export class DevEnvironment {
1321
1987
  }
1322
1988
  }
1323
1989
  }
1990
+ // Clean up AI CLI MCP configurations
1991
+ if (this.configuredAiCliTools.length > 0) {
1992
+ await cleanupAiCliIntegrations(this.configuredAiCliTools, this.options.chromeDevtoolsMcp !== false, this.enableNextjsMcp, this.options.tui);
1993
+ }
1324
1994
  // Kill processes on both ports
1325
1995
  const killPortProcess = async (port, name) => {
1326
1996
  try {