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.
- package/README.md +78 -30
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/dev-environment.d.ts +10 -1
- package/dist/dev-environment.d.ts.map +1 -1
- package/dist/dev-environment.js +676 -6
- package/dist/dev-environment.js.map +1 -1
- package/dist/src/loading.html +1 -1
- package/dist/src/tui-interface-impl.tsx +35 -30
- package/dist/tui-interface-impl.d.ts.map +1 -1
- package/dist/tui-interface-impl.js +26 -20
- package/dist/tui-interface-impl.js.map +1 -1
- package/dist/tui-interface.d.ts.map +1 -1
- package/dist/tui-interface.js +26 -5
- package/dist/tui-interface.js.map +1 -1
- package/mcp-server/.next/BUILD_ID +1 -1
- package/mcp-server/.next/build-manifest.json +8 -8
- package/mcp-server/.next/fallback-build-manifest.json +2 -2
- package/mcp-server/.next/images-manifest.json +2 -2
- package/mcp-server/.next/next-minimal-server.js.nft.json +1 -1
- package/mcp-server/.next/next-server.js.nft.json +1 -1
- package/mcp-server/.next/prerender-manifest.json +10 -10
- package/mcp-server/.next/required-server-files.json +5 -6
- package/mcp-server/.next/routes-manifest.json +1 -0
- package/mcp-server/.next/server/app/_global-error/page/build-manifest.json +6 -6
- package/mcp-server/.next/server/app/_global-error/page.js +8 -8
- package/mcp-server/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/_global-error.html +2 -2
- package/mcp-server/.next/server/app/_global-error.rsc +8 -8
- package/mcp-server/.next/server/app/_not-found/page/build-manifest.json +6 -6
- package/mcp-server/.next/server/app/_not-found/page.js +10 -10
- package/mcp-server/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/_not-found.html +1 -1
- package/mcp-server/.next/server/app/_not-found.rsc +8 -8
- package/mcp-server/.next/server/app/api/logs/append/route/build-manifest.json +1 -8
- package/mcp-server/.next/server/app/api/logs/append/route.js +4 -4
- package/mcp-server/.next/server/app/api/logs/append/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/head/route/build-manifest.json +1 -8
- package/mcp-server/.next/server/app/api/logs/head/route.js +4 -4
- package/mcp-server/.next/server/app/api/logs/head/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/list/route/build-manifest.json +1 -8
- package/mcp-server/.next/server/app/api/logs/list/route.js +4 -4
- package/mcp-server/.next/server/app/api/logs/list/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/rotate/route/build-manifest.json +1 -8
- package/mcp-server/.next/server/app/api/logs/rotate/route.js +5 -5
- package/mcp-server/.next/server/app/api/logs/rotate/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/stream/route/build-manifest.json +1 -8
- package/mcp-server/.next/server/app/api/logs/stream/route.js +4 -4
- package/mcp-server/.next/server/app/api/logs/stream/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/tail/route/build-manifest.json +1 -8
- package/mcp-server/.next/server/app/api/logs/tail/route.js +4 -4
- package/mcp-server/.next/server/app/api/logs/tail/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route/build-manifest.json +1 -8
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js +5 -5
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/tools/route/build-manifest.json +1 -8
- package/mcp-server/.next/server/app/api/tools/route.js +5 -5
- package/mcp-server/.next/server/app/api/tools/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/index.html +1 -1
- package/mcp-server/.next/server/app/index.rsc +10 -10
- package/mcp-server/.next/server/app/logs/page/build-manifest.json +6 -6
- package/mcp-server/.next/server/app/logs/page.js +13 -13
- package/mcp-server/.next/server/app/logs/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/mcp/route/build-manifest.json +1 -8
- package/mcp-server/.next/server/app/mcp/route.js +6 -5
- package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/page/build-manifest.json +6 -6
- package/mcp-server/.next/server/app/page.js +12 -12
- package/mcp-server/.next/server/app/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__013bbeea._.js +7 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__013bbeea._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__270b33b7._.js +33 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__270b33b7._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__5580d2ea._.js +35 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__5580d2ea._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__6fa7ea53._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__73645708._.js +11 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__73645708._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__8fc8f497._.js +4 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__8fc8f497._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__9c489027._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__9c489027._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__cc81580c._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__cc81580c._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__d1f9e389._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__d1f9e389._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__d200fe4a._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__d200fe4a._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__e2089993._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__e2089993._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__ffb73672._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__ffb73672._.js.map +1 -0
- package/mcp-server/.next/server/chunks/{0916f_next_ab257ac1._.js → d1d76_next_09a9e080._.js} +4 -4
- package/mcp-server/.next/server/chunks/d1d76_next_09a9e080._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0217e89c._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0217e89c._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__02a8c992._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__05689c01._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__6518b3b8._.js.map → [root-of-the-server]__05689c01._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__8db775f9._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__8db775f9._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__524f1e5c._.js → [root-of-the-server]__91510608._.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__91510608._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__9f07837d._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__9f07837d._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__db74836a._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__db74836a._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__e5dec879._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__e5dec879._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__fb40854a._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__fb40854a._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/_0b8335fc._.js +8 -0
- package/mcp-server/.next/server/chunks/ssr/_0b8335fc._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/_28084f73._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/_28084f73._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/{_8babd77a._.js → _6129d8ec._.js} +3 -3
- package/mcp-server/.next/server/chunks/ssr/_6129d8ec._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/_62451611._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/_62451611._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/_7d3d2f5f._.js +4 -0
- package/mcp-server/.next/server/chunks/ssr/_7d3d2f5f._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/_b15f05ee._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/_b15f05ee._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/_bacf0748._.js +8 -0
- package/mcp-server/.next/server/chunks/ssr/_bacf0748._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_032c5c2e._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_032c5c2e._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_08b22e19._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_08b22e19._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_369453b3._.js +6 -0
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_369453b3._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/{0916f_next_dist_54420d8c._.js → d1d76_next_dist_ad253fdc._.js} +3 -3
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_ad253fdc._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_b9509b36._.js +6 -0
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_b9509b36._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/{0916f_next_dist_client_components_f453b63e._.js → d1d76_next_dist_client_components_6557bb14._.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_6557bb14._.js.map +1 -0
- 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
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_builtin_forbidden_c162dd05.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_builtin_global-error_3d982957.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_builtin_global-error_3d982957.js.map +1 -0
- 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
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_builtin_unauthorized_e4f02ffd.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_esm_build_templates_app-page_134a93a5.js +4 -0
- package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_esm_build_templates_app-page_134a93a5.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_layout_tsx_afa41767._.js +1 -1
- package/mcp-server/.next/server/middleware-build-manifest.js +7 -8
- package/mcp-server/.next/server/server-reference-manifest.js +1 -1
- package/mcp-server/.next/server/server-reference-manifest.json +1 -1
- package/mcp-server/.next/static/chunks/11ac0d0e69696c72.js +1 -0
- package/mcp-server/.next/static/chunks/172f6179d608c15f.js +1 -0
- package/mcp-server/.next/static/chunks/526448e84b58822c.js +1 -0
- package/mcp-server/.next/static/chunks/571fbcba7786c174.js +1 -0
- package/mcp-server/.next/static/chunks/{044e917a180dc576.js → 711519b5a2e53fc8.js} +1 -1
- package/mcp-server/.next/static/chunks/addab50e23821c6c.js +1 -0
- package/mcp-server/.next/static/chunks/bb8a4e5f381a85ec.js +1 -0
- package/mcp-server/.next/static/chunks/dbbdc51e76f4cea4.js +1 -0
- package/mcp-server/.next/static/chunks/e09be78bba2194fd.js +1 -0
- package/mcp-server/.next/static/chunks/fec3a6ddaef02b8b.js +1 -0
- package/mcp-server/.next/static/chunks/{turbopack-ef2dba9946ddb22a.js → turbopack-7cd5a898ed038e26.js} +2 -2
- package/mcp-server/app/mcp/route.ts +133 -2
- package/mcp-server/app/mcp/tools.ts +991 -5
- package/mcp-server/next.config.ts +4 -0
- package/mcp-server/package.json +12 -6
- package/package.json +4 -4
- package/src/tui-interface-impl.tsx +35 -30
- package/mcp-server/.next/app-build-manifest.json +0 -52
- package/mcp-server/.next/postcss.js +0 -6
- package/mcp-server/.next/postcss.js.map +0 -5
- package/mcp-server/.next/server/app/_global-error/page/app-build-manifest.json +0 -14
- package/mcp-server/.next/server/app/_not-found/page/app-build-manifest.json +0 -15
- package/mcp-server/.next/server/app/api/logs/append/route/app-build-manifest.json +0 -12
- package/mcp-server/.next/server/app/api/logs/head/route/app-build-manifest.json +0 -12
- package/mcp-server/.next/server/app/api/logs/list/route/app-build-manifest.json +0 -12
- package/mcp-server/.next/server/app/api/logs/rotate/route/app-build-manifest.json +0 -12
- package/mcp-server/.next/server/app/api/logs/stream/route/app-build-manifest.json +0 -12
- package/mcp-server/.next/server/app/api/logs/tail/route/app-build-manifest.json +0 -12
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route/app-build-manifest.json +0 -12
- package/mcp-server/.next/server/app/api/tools/route/app-build-manifest.json +0 -12
- package/mcp-server/.next/server/app/logs/page/app-build-manifest.json +0 -18
- package/mcp-server/.next/server/app/mcp/route/app-build-manifest.json +0 -12
- package/mcp-server/.next/server/app/page/app-build-manifest.json +0 -17
- package/mcp-server/.next/server/chunks/0916f_next_ab257ac1._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__1b561deb._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__1b561deb._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__38e8baae._.js +0 -21
- package/mcp-server/.next/server/chunks/[root-of-the-server]__38e8baae._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__47380b6c._.js +0 -7
- package/mcp-server/.next/server/chunks/[root-of-the-server]__47380b6c._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__674284d7._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__674284d7._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__6a89b7dc._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__6a89b7dc._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__729bfe09._.js +0 -11
- package/mcp-server/.next/server/chunks/[root-of-the-server]__729bfe09._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__a433711a._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__a433711a._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__a58600d8._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__a58600d8._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__bc43993b._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__c464573d._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__c464573d._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__e6d29491._.js +0 -4
- package/mcp-server/.next/server/chunks/[root-of-the-server]__e6d29491._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_54420d8c._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_927c15f3._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_927c15f3._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_c17417af._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_c17417af._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_c724e947._.js +0 -6
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_c724e947._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_builtin_forbidden_7b57efa5.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_builtin_global-error_118601bd.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_builtin_global-error_118601bd.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_builtin_unauthorized_6614f15c.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_f453b63e._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_esm_87a80014._.js +0 -6
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_esm_87a80014._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_esm_build_templates_app-page_25a3dd8d.js +0 -4
- package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_esm_build_templates_app-page_25a3dd8d.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__224ddd99._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__224ddd99._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__2cdf0446._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__2cdf0446._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__524f1e5c._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__6518b3b8._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__73b7df71._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__73b7df71._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__83ee047c._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__83ee047c._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__b2efa505._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__b2efa505._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__d9cb0b6d._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__d9cb0b6d._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__db132681._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/_188bfe33._.js +0 -6
- package/mcp-server/.next/server/chunks/ssr/_188bfe33._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_3a061fbf._.js +0 -4
- package/mcp-server/.next/server/chunks/ssr/_3a061fbf._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_8babd77a._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_9d670a6b._.js +0 -5
- package/mcp-server/.next/server/chunks/ssr/_9d670a6b._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_d858c4cd._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/_d858c4cd._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_dae9c1d5._.js +0 -8
- package/mcp-server/.next/server/chunks/ssr/_dae9c1d5._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_f03e80a8._.js +0 -6
- package/mcp-server/.next/server/chunks/ssr/_f03e80a8._.js.map +0 -1
- package/mcp-server/.next/static/chunks/1415a83da347ea73.js +0 -1
- package/mcp-server/.next/static/chunks/14ca28aed9ba7e16.js +0 -1
- package/mcp-server/.next/static/chunks/259312562b58ea20.js +0 -5
- package/mcp-server/.next/static/chunks/37a3ca444b4e0ebc.js +0 -1
- package/mcp-server/.next/static/chunks/37f62e06d680d8df.js +0 -1
- package/mcp-server/.next/static/chunks/40b55f6f752f90a1.js +0 -1
- package/mcp-server/.next/static/chunks/5a5edc75ee7e7de4.js +0 -1
- package/mcp-server/.next/static/chunks/5dd333b6181425ad.js +0 -1
- package/mcp-server/.next/static/chunks/6839f59cc7f3e68c.js +0 -1
- package/mcp-server/.next/static/chunks/7a1b61971931d3f6.js +0 -1
- package/mcp-server/.next/static/chunks/881ec25f9292cb32.js +0 -1
- package/mcp-server/.next/static/chunks/8a5ef92054eb3f68.js +0 -1
- package/mcp-server/.next/static/chunks/af081359d0245052.js +0 -5
- package/mcp-server/.next/static/chunks/b137bfc92ad8bec0.js +0 -1
- package/mcp-server/.next/static/chunks/c5f8464bc8083ee7.js +0 -1
- package/mcp-server/.next/static/chunks/eab992a4c8e8981a.js +0 -1
- package/mcp-server/.next/static/chunks/turbopack-aef1414f7c590584.js +0 -3
- package/mcp-server/.next/static/chunks/turbopack-e808877bd413e182.js +0 -3
- package/mcp-server/.next/webpack-loaders.js +0 -6
- package/mcp-server/.next/webpack-loaders.js.map +0 -5
- /package/mcp-server/.next/server/chunks/{[root-of-the-server]__bc43993b._.js.map → [root-of-the-server]__6fa7ea53._.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__db132681._.js.map → [root-of-the-server]__02a8c992._.js.map} +0 -0
- /package/mcp-server/.next/static/{3E55dEq7tPut9JesZEs2c → e3oE33k8Pj7aB0H8XMR1s}/_buildManifest.js +0 -0
- /package/mcp-server/.next/static/{3E55dEq7tPut9JesZEs2c → e3oE33k8Pj7aB0H8XMR1s}/_clientMiddlewareManifest.json +0 -0
- /package/mcp-server/.next/static/{3E55dEq7tPut9JesZEs2c → e3oE33k8Pj7aB0H8XMR1s}/_ssgManifest.js +0 -0
package/dist/dev-environment.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
1073
|
-
|
|
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 {
|