@zoer7788/mcp-nexus-node 0.1.5 → 0.1.7

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 (333) hide show
  1. package/cli.js +1 -0
  2. package/package.json +4 -5
  3. package/vendor/devspace/dist/cli.js +374 -0
  4. package/vendor/devspace/dist/config.js +253 -0
  5. package/vendor/devspace/dist/dashboard.js +545 -0
  6. package/vendor/devspace/dist/db/client.js +29 -0
  7. package/vendor/devspace/dist/db/migrations.js +123 -0
  8. package/vendor/devspace/dist/db/schema.js +52 -0
  9. package/vendor/devspace/dist/git-worktrees.js +134 -0
  10. package/vendor/devspace/dist/git.js +41 -0
  11. package/vendor/devspace/dist/logger.js +69 -0
  12. package/vendor/devspace/dist/oauth-provider.js +237 -0
  13. package/vendor/devspace/dist/oauth-store.js +138 -0
  14. package/vendor/devspace/dist/pi-tools.js +81 -0
  15. package/vendor/devspace/dist/review-checkpoints.js +142 -0
  16. package/vendor/devspace/dist/roots.js +34 -0
  17. package/vendor/devspace/dist/server.js +1204 -0
  18. package/vendor/devspace/dist/skills.js +45 -0
  19. package/vendor/devspace/dist/ui/.vite/manifest.json +2520 -0
  20. package/vendor/devspace/dist/ui/assets/abap-CLvhMVsD.js +1 -0
  21. package/vendor/devspace/dist/ui/assets/actionscript-3--17pq3dv.js +1 -0
  22. package/vendor/devspace/dist/ui/assets/ada-C5qYipkI.js +1 -0
  23. package/vendor/devspace/dist/ui/assets/andromeeda-vGVdxbeo.js +1 -0
  24. package/vendor/devspace/dist/ui/assets/angular-html-Dj4LysSE.js +1 -0
  25. package/vendor/devspace/dist/ui/assets/angular-ts-CxuC_FFh.js +1 -0
  26. package/vendor/devspace/dist/ui/assets/apache-U0d_L8uA.js +1 -0
  27. package/vendor/devspace/dist/ui/assets/apex-CGTLDQj6.js +1 -0
  28. package/vendor/devspace/dist/ui/assets/apl-RwuvNFFo.js +1 -0
  29. package/vendor/devspace/dist/ui/assets/applescript-CCn79oCD.js +1 -0
  30. package/vendor/devspace/dist/ui/assets/ara-4CJ0cIlV.js +1 -0
  31. package/vendor/devspace/dist/ui/assets/asciidoc-DE70LPWp.js +1 -0
  32. package/vendor/devspace/dist/ui/assets/asm-Cmm7eHzH.js +1 -0
  33. package/vendor/devspace/dist/ui/assets/astro-ncoaUbsO.js +1 -0
  34. package/vendor/devspace/dist/ui/assets/aurora-x-CDeNXAV0.js +1 -0
  35. package/vendor/devspace/dist/ui/assets/awk-BWXHIvNe.js +1 -0
  36. package/vendor/devspace/dist/ui/assets/ayu-dark-DluEY0Gj.js +1 -0
  37. package/vendor/devspace/dist/ui/assets/ayu-light-C3h-C4tm.js +1 -0
  38. package/vendor/devspace/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +1 -0
  39. package/vendor/devspace/dist/ui/assets/ballerina-B7ZEbQpA.js +1 -0
  40. package/vendor/devspace/dist/ui/assets/bat-Bo4NYOV-.js +1 -0
  41. package/vendor/devspace/dist/ui/assets/beancount-D-usSTwE.js +1 -0
  42. package/vendor/devspace/dist/ui/assets/berry-DKpUyyne.js +1 -0
  43. package/vendor/devspace/dist/ui/assets/bibtex-Ci_nEsc7.js +1 -0
  44. package/vendor/devspace/dist/ui/assets/bicep-CUHmPFLl.js +1 -0
  45. package/vendor/devspace/dist/ui/assets/bird2-C2hNVINV.js +1 -0
  46. package/vendor/devspace/dist/ui/assets/blade-Dw8-Lzux.js +1 -0
  47. package/vendor/devspace/dist/ui/assets/bsl-BkkzgIyY.js +1 -0
  48. package/vendor/devspace/dist/ui/assets/c-Dpbbo_f2.js +1 -0
  49. package/vendor/devspace/dist/ui/assets/c3-CnJL0r0V.js +1 -0
  50. package/vendor/devspace/dist/ui/assets/cadence-CQ2zXKGN.js +1 -0
  51. package/vendor/devspace/dist/ui/assets/cairo-DLTphjLi.js +1 -0
  52. package/vendor/devspace/dist/ui/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
  53. package/vendor/devspace/dist/ui/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
  54. package/vendor/devspace/dist/ui/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
  55. package/vendor/devspace/dist/ui/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
  56. package/vendor/devspace/dist/ui/assets/clarity-SemFz856.js +1 -0
  57. package/vendor/devspace/dist/ui/assets/clojure-DqKBuwfJ.js +1 -0
  58. package/vendor/devspace/dist/ui/assets/cmake-Bj61d0ZC.js +1 -0
  59. package/vendor/devspace/dist/ui/assets/cobol-4ddX3THy.js +1 -0
  60. package/vendor/devspace/dist/ui/assets/codeowners-C8r90Shi.js +1 -0
  61. package/vendor/devspace/dist/ui/assets/codeql-oeQT6MSM.js +1 -0
  62. package/vendor/devspace/dist/ui/assets/coffee-Bn-a5KqK.js +1 -0
  63. package/vendor/devspace/dist/ui/assets/common-lisp-Cv5bFMCO.js +1 -0
  64. package/vendor/devspace/dist/ui/assets/coq-BrsZFFmf.js +1 -0
  65. package/vendor/devspace/dist/ui/assets/cpp-DoRrlM_T.js +1 -0
  66. package/vendor/devspace/dist/ui/assets/crystal-DiZfCxn-.js +1 -0
  67. package/vendor/devspace/dist/ui/assets/csharp-Ct8U2NOr.js +1 -0
  68. package/vendor/devspace/dist/ui/assets/css-DiQoSjDH.js +1 -0
  69. package/vendor/devspace/dist/ui/assets/csv-Dx-8-gkx.js +1 -0
  70. package/vendor/devspace/dist/ui/assets/cue-CE9AQfxI.js +1 -0
  71. package/vendor/devspace/dist/ui/assets/cypher-ClKdZ_lG.js +1 -0
  72. package/vendor/devspace/dist/ui/assets/d-qD-0Kul2.js +1 -0
  73. package/vendor/devspace/dist/ui/assets/dark-plus-Cs2F2srj.js +1 -0
  74. package/vendor/devspace/dist/ui/assets/dart-DkHntEIa.js +1 -0
  75. package/vendor/devspace/dist/ui/assets/dax-BkyTk9wS.js +1 -0
  76. package/vendor/devspace/dist/ui/assets/desktop-Dlh5hvp9.js +1 -0
  77. package/vendor/devspace/dist/ui/assets/diff-woXpYk--.js +1 -0
  78. package/vendor/devspace/dist/ui/assets/docker-IyjqRm3v.js +1 -0
  79. package/vendor/devspace/dist/ui/assets/dotenv-_5a1GRtc.js +1 -0
  80. package/vendor/devspace/dist/ui/assets/dracula-BHWKrbxM.js +1 -0
  81. package/vendor/devspace/dist/ui/assets/dracula-soft-5eyTD99u.js +1 -0
  82. package/vendor/devspace/dist/ui/assets/dream-maker-DW3nJb8Q.js +1 -0
  83. package/vendor/devspace/dist/ui/assets/edge-wEhCUoEt.js +1 -0
  84. package/vendor/devspace/dist/ui/assets/elixir-C3obhm0H.js +1 -0
  85. package/vendor/devspace/dist/ui/assets/elm-DyTBfh1L.js +1 -0
  86. package/vendor/devspace/dist/ui/assets/emacs-lisp-C9PiwqqW.js +1 -0
  87. package/vendor/devspace/dist/ui/assets/erb-f4TnXRuY.js +1 -0
  88. package/vendor/devspace/dist/ui/assets/erlang-Cphh6RMH.js +1 -0
  89. package/vendor/devspace/dist/ui/assets/everforest-dark-sB-x3p7T.js +1 -0
  90. package/vendor/devspace/dist/ui/assets/everforest-light-Df2xbC6M.js +1 -0
  91. package/vendor/devspace/dist/ui/assets/fennel-DQxkIbk2.js +1 -0
  92. package/vendor/devspace/dist/ui/assets/fish-BJitypiv.js +1 -0
  93. package/vendor/devspace/dist/ui/assets/fluent-C03EYrpw.js +1 -0
  94. package/vendor/devspace/dist/ui/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
  95. package/vendor/devspace/dist/ui/assets/fortran-free-form-CYNrtFtB.js +1 -0
  96. package/vendor/devspace/dist/ui/assets/fsharp-D13ZGOAj.js +1 -0
  97. package/vendor/devspace/dist/ui/assets/gdresource-C0sCabJj.js +1 -0
  98. package/vendor/devspace/dist/ui/assets/gdscript-Cp2uCuqX.js +1 -0
  99. package/vendor/devspace/dist/ui/assets/gdshader-CBce3t8t.js +1 -0
  100. package/vendor/devspace/dist/ui/assets/genie-CV2tkWYe.js +1 -0
  101. package/vendor/devspace/dist/ui/assets/gherkin-DExj1W_8.js +1 -0
  102. package/vendor/devspace/dist/ui/assets/git-commit-BSykSTBG.js +1 -0
  103. package/vendor/devspace/dist/ui/assets/git-rebase-vhZbWNfp.js +1 -0
  104. package/vendor/devspace/dist/ui/assets/github-dark-C-LZuMrd.js +1 -0
  105. package/vendor/devspace/dist/ui/assets/github-dark-default-DXG-b-1a.js +1 -0
  106. package/vendor/devspace/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
  107. package/vendor/devspace/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
  108. package/vendor/devspace/dist/ui/assets/github-light-EUqPIrTm.js +1 -0
  109. package/vendor/devspace/dist/ui/assets/github-light-default-BXViO-2h.js +1 -0
  110. package/vendor/devspace/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +1 -0
  111. package/vendor/devspace/dist/ui/assets/gleam-CSRkHgEL.js +1 -0
  112. package/vendor/devspace/dist/ui/assets/glimmer-js-BG7puL6Y.js +1 -0
  113. package/vendor/devspace/dist/ui/assets/glimmer-ts-CNCfLLL1.js +1 -0
  114. package/vendor/devspace/dist/ui/assets/glsl-DhT76AL5.js +1 -0
  115. package/vendor/devspace/dist/ui/assets/gn-ilITqXS6.js +1 -0
  116. package/vendor/devspace/dist/ui/assets/gnuplot-7GGW24-e.js +1 -0
  117. package/vendor/devspace/dist/ui/assets/go-BJwz_mda.js +1 -0
  118. package/vendor/devspace/dist/ui/assets/graphql-CJX08w8y.js +1 -0
  119. package/vendor/devspace/dist/ui/assets/groovy-CacY0gHj.js +1 -0
  120. package/vendor/devspace/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
  121. package/vendor/devspace/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
  122. package/vendor/devspace/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  123. package/vendor/devspace/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
  124. package/vendor/devspace/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
  125. package/vendor/devspace/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
  126. package/vendor/devspace/dist/ui/assets/hack-DY4NGCCL.js +1 -0
  127. package/vendor/devspace/dist/ui/assets/haml-DwSkmVcG.js +1 -0
  128. package/vendor/devspace/dist/ui/assets/handlebars-CQ_1dEmi.js +1 -0
  129. package/vendor/devspace/dist/ui/assets/haskell-D8IpX4py.js +1 -0
  130. package/vendor/devspace/dist/ui/assets/haxe-OTjmBuCE.js +1 -0
  131. package/vendor/devspace/dist/ui/assets/hcl-Dh228itO.js +1 -0
  132. package/vendor/devspace/dist/ui/assets/heavy-payload-2rGBiitA.js +4 -0
  133. package/vendor/devspace/dist/ui/assets/hjson-CxZEssPk.js +1 -0
  134. package/vendor/devspace/dist/ui/assets/hlsl-Cvrh5tZx.js +1 -0
  135. package/vendor/devspace/dist/ui/assets/horizon-CE9ld1lL.js +1 -0
  136. package/vendor/devspace/dist/ui/assets/horizon-bright-Br1oVSNq.js +1 -0
  137. package/vendor/devspace/dist/ui/assets/houston-CsvMBhTu.js +1 -0
  138. package/vendor/devspace/dist/ui/assets/html-B_e3Njif.js +1 -0
  139. package/vendor/devspace/dist/ui/assets/html-derivative-_nHZ_Bk-.js +1 -0
  140. package/vendor/devspace/dist/ui/assets/http-CfcvPIru.js +1 -0
  141. package/vendor/devspace/dist/ui/assets/hurl-9vWDQIMO.js +1 -0
  142. package/vendor/devspace/dist/ui/assets/hxml-B0Qn7Nwc.js +1 -0
  143. package/vendor/devspace/dist/ui/assets/hy-CZbG8q4J.js +1 -0
  144. package/vendor/devspace/dist/ui/assets/imba-DsUTQ-LC.js +1 -0
  145. package/vendor/devspace/dist/ui/assets/ini-B5eOa1yu.js +1 -0
  146. package/vendor/devspace/dist/ui/assets/java-C4S5r6L5.js +1 -0
  147. package/vendor/devspace/dist/ui/assets/javascript-BRwqbMMC.js +1 -0
  148. package/vendor/devspace/dist/ui/assets/jinja-DHxzMMc5.js +1 -0
  149. package/vendor/devspace/dist/ui/assets/jison-B1DqeWXb.js +1 -0
  150. package/vendor/devspace/dist/ui/assets/json-DcFTkEdd.js +1 -0
  151. package/vendor/devspace/dist/ui/assets/json5-BR5RXkoi.js +1 -0
  152. package/vendor/devspace/dist/ui/assets/jsonc-CYpm1nAK.js +1 -0
  153. package/vendor/devspace/dist/ui/assets/jsonl-CmCQp5Yx.js +1 -0
  154. package/vendor/devspace/dist/ui/assets/jsonnet-CJTPZ8u_.js +1 -0
  155. package/vendor/devspace/dist/ui/assets/jssm-DXw9l8Rf.js +1 -0
  156. package/vendor/devspace/dist/ui/assets/jsx-DgfmYa9f.js +1 -0
  157. package/vendor/devspace/dist/ui/assets/julia-3M8SJ8iF.js +1 -0
  158. package/vendor/devspace/dist/ui/assets/just-UyH7_DNz.js +1 -0
  159. package/vendor/devspace/dist/ui/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
  160. package/vendor/devspace/dist/ui/assets/kanagawa-lotus-BN08jTvb.js +1 -0
  161. package/vendor/devspace/dist/ui/assets/kanagawa-wave-CTweb8Dz.js +1 -0
  162. package/vendor/devspace/dist/ui/assets/kdl-CsD5j6eV.js +1 -0
  163. package/vendor/devspace/dist/ui/assets/kotlin-DhhofPvG.js +1 -0
  164. package/vendor/devspace/dist/ui/assets/kusto-BUv0MjJC.js +1 -0
  165. package/vendor/devspace/dist/ui/assets/laserwave-C_8bwKvT.js +1 -0
  166. package/vendor/devspace/dist/ui/assets/latex-wUbha6EX.js +1 -0
  167. package/vendor/devspace/dist/ui/assets/lean-CewbzKMR.js +1 -0
  168. package/vendor/devspace/dist/ui/assets/less-DVTAwKKz.js +1 -0
  169. package/vendor/devspace/dist/ui/assets/light-plus-DVQuIRkW.js +1 -0
  170. package/vendor/devspace/dist/ui/assets/liquid-DqNTB9kN.js +1 -0
  171. package/vendor/devspace/dist/ui/assets/llvm-Cm23YOpf.js +1 -0
  172. package/vendor/devspace/dist/ui/assets/log-BNLmms1o.js +1 -0
  173. package/vendor/devspace/dist/ui/assets/logo-Cluzi2Zq.js +1 -0
  174. package/vendor/devspace/dist/ui/assets/lua-DrEQ1QTW.js +1 -0
  175. package/vendor/devspace/dist/ui/assets/luau-CNKltnaQ.js +1 -0
  176. package/vendor/devspace/dist/ui/assets/make-Dixweg8N.js +1 -0
  177. package/vendor/devspace/dist/ui/assets/markdown-BYOwaDjH.js +1 -0
  178. package/vendor/devspace/dist/ui/assets/marko-B3GJw9Md.js +1 -0
  179. package/vendor/devspace/dist/ui/assets/material-theme-Bm3Qr25_.js +1 -0
  180. package/vendor/devspace/dist/ui/assets/material-theme-darker-2IIEA8gg.js +1 -0
  181. package/vendor/devspace/dist/ui/assets/material-theme-lighter-uhdI0v04.js +1 -0
  182. package/vendor/devspace/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +1 -0
  183. package/vendor/devspace/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +1 -0
  184. package/vendor/devspace/dist/ui/assets/matlab-D7qyCx1q.js +1 -0
  185. package/vendor/devspace/dist/ui/assets/mdc-BnThk82m.js +1 -0
  186. package/vendor/devspace/dist/ui/assets/mdx-DQZ5AkYe.js +1 -0
  187. package/vendor/devspace/dist/ui/assets/mermaid-Bk4SNUv9.js +1 -0
  188. package/vendor/devspace/dist/ui/assets/min-dark-BSWPekZh.js +1 -0
  189. package/vendor/devspace/dist/ui/assets/min-light-DDpmG2fV.js +1 -0
  190. package/vendor/devspace/dist/ui/assets/mipsasm-BMqwQI7S.js +1 -0
  191. package/vendor/devspace/dist/ui/assets/mojo-BgCJLMeH.js +1 -0
  192. package/vendor/devspace/dist/ui/assets/monokai-CdkpiU2Y.js +1 -0
  193. package/vendor/devspace/dist/ui/assets/moonbit-CaWjb8XO.js +1 -0
  194. package/vendor/devspace/dist/ui/assets/move-B1IS1UjX.js +1 -0
  195. package/vendor/devspace/dist/ui/assets/narrat-_X_XdTYD.js +1 -0
  196. package/vendor/devspace/dist/ui/assets/nextflow-Bbiyy34d.js +1 -0
  197. package/vendor/devspace/dist/ui/assets/nextflow-groovy-Dc_ddanL.js +1 -0
  198. package/vendor/devspace/dist/ui/assets/nginx-B5IeSsOX.js +1 -0
  199. package/vendor/devspace/dist/ui/assets/night-owl-DhmEMT88.js +1 -0
  200. package/vendor/devspace/dist/ui/assets/night-owl-light-eJ-hLW7d.js +1 -0
  201. package/vendor/devspace/dist/ui/assets/nim-BJraatnS.js +1 -0
  202. package/vendor/devspace/dist/ui/assets/nix-IvuFDN5E.js +1 -0
  203. package/vendor/devspace/dist/ui/assets/nord-Cb4Vim4T.js +1 -0
  204. package/vendor/devspace/dist/ui/assets/nushell-DcLAeLz5.js +1 -0
  205. package/vendor/devspace/dist/ui/assets/objective-c-D1A_Heim.js +1 -0
  206. package/vendor/devspace/dist/ui/assets/objective-cpp-BsSzOQcm.js +1 -0
  207. package/vendor/devspace/dist/ui/assets/ocaml-O90oeIOV.js +1 -0
  208. package/vendor/devspace/dist/ui/assets/odin-B1RWQWA5.js +1 -0
  209. package/vendor/devspace/dist/ui/assets/one-dark-pro-CLwyXe_n.js +1 -0
  210. package/vendor/devspace/dist/ui/assets/one-light-D7Lr4KcI.js +1 -0
  211. package/vendor/devspace/dist/ui/assets/openscad-BUDT5pXO.js +1 -0
  212. package/vendor/devspace/dist/ui/assets/pascal-4ZHwLPI5.js +1 -0
  213. package/vendor/devspace/dist/ui/assets/perl-BAhrR4gt.js +1 -0
  214. package/vendor/devspace/dist/ui/assets/php-BKRCk_wX.js +1 -0
  215. package/vendor/devspace/dist/ui/assets/pierre-dark-sU4Zdns8.js +1 -0
  216. package/vendor/devspace/dist/ui/assets/pierre-dark-soft-HXgun5vs.js +1 -0
  217. package/vendor/devspace/dist/ui/assets/pierre-light-DWBk51d8.js +1 -0
  218. package/vendor/devspace/dist/ui/assets/pierre-light-soft-CodEzPxf.js +1 -0
  219. package/vendor/devspace/dist/ui/assets/pkl-ot-7Btpt.js +1 -0
  220. package/vendor/devspace/dist/ui/assets/plastic-DQwYfKfQ.js +1 -0
  221. package/vendor/devspace/dist/ui/assets/plsql-DGHpHOYJ.js +1 -0
  222. package/vendor/devspace/dist/ui/assets/po-BiJDBrnU.js +1 -0
  223. package/vendor/devspace/dist/ui/assets/poimandres-DRFjx7u4.js +1 -0
  224. package/vendor/devspace/dist/ui/assets/polar-C7UOKdEL.js +1 -0
  225. package/vendor/devspace/dist/ui/assets/postcss-BXeXVLqQ.js +1 -0
  226. package/vendor/devspace/dist/ui/assets/powerquery-DNMTfnFr.js +1 -0
  227. package/vendor/devspace/dist/ui/assets/powershell-DshXNtvi.js +1 -0
  228. package/vendor/devspace/dist/ui/assets/prisma-BsRQq5mF.js +1 -0
  229. package/vendor/devspace/dist/ui/assets/prolog-iXnhIJG7.js +1 -0
  230. package/vendor/devspace/dist/ui/assets/proto-DB4EqR-F.js +1 -0
  231. package/vendor/devspace/dist/ui/assets/pug-B8gmSV7z.js +1 -0
  232. package/vendor/devspace/dist/ui/assets/puppet-CDv2pdJW.js +1 -0
  233. package/vendor/devspace/dist/ui/assets/purescript-9MfHhQsQ.js +1 -0
  234. package/vendor/devspace/dist/ui/assets/python-gzcpVVnB.js +1 -0
  235. package/vendor/devspace/dist/ui/assets/qml-DKrxIjHR.js +1 -0
  236. package/vendor/devspace/dist/ui/assets/qmldir-DCQb3MpD.js +1 -0
  237. package/vendor/devspace/dist/ui/assets/qss-Fe1Jh2GI.js +1 -0
  238. package/vendor/devspace/dist/ui/assets/r-YASBZvTH.js +1 -0
  239. package/vendor/devspace/dist/ui/assets/racket-DcIDlBhZ.js +1 -0
  240. package/vendor/devspace/dist/ui/assets/raku-B3gFvitq.js +1 -0
  241. package/vendor/devspace/dist/ui/assets/razor-P-XFZqh6.js +1 -0
  242. package/vendor/devspace/dist/ui/assets/red-CJ3rzSJv.js +1 -0
  243. package/vendor/devspace/dist/ui/assets/reg-CRGYupPL.js +1 -0
  244. package/vendor/devspace/dist/ui/assets/regexp-CCpiH6nO.js +1 -0
  245. package/vendor/devspace/dist/ui/assets/rel-BtDbiS_P.js +1 -0
  246. package/vendor/devspace/dist/ui/assets/review-payload-BLYwg6t8.js +1 -0
  247. package/vendor/devspace/dist/ui/assets/riscv-Ckw8ddFX.js +1 -0
  248. package/vendor/devspace/dist/ui/assets/ron-VUp2lXgN.js +1 -0
  249. package/vendor/devspace/dist/ui/assets/rose-pine-BthvhNj6.js +1 -0
  250. package/vendor/devspace/dist/ui/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
  251. package/vendor/devspace/dist/ui/assets/rose-pine-moon-hon4tzzS.js +1 -0
  252. package/vendor/devspace/dist/ui/assets/rosmsg-CAekHB0j.js +1 -0
  253. package/vendor/devspace/dist/ui/assets/rst-CFAzckbn.js +1 -0
  254. package/vendor/devspace/dist/ui/assets/ruby-Dyp_Rx-S.js +1 -0
  255. package/vendor/devspace/dist/ui/assets/rust-Cfkwpbl8.js +1 -0
  256. package/vendor/devspace/dist/ui/assets/sas-YkWZIXxT.js +1 -0
  257. package/vendor/devspace/dist/ui/assets/sass-DXrisJhu.js +1 -0
  258. package/vendor/devspace/dist/ui/assets/scala-DKOlJaKm.js +1 -0
  259. package/vendor/devspace/dist/ui/assets/scheme-DQCgrYNe.js +1 -0
  260. package/vendor/devspace/dist/ui/assets/scss-Cf89idGl.js +1 -0
  261. package/vendor/devspace/dist/ui/assets/sdbl-bTVj8UrX.js +1 -0
  262. package/vendor/devspace/dist/ui/assets/shaderlab-TOUzSsQk.js +1 -0
  263. package/vendor/devspace/dist/ui/assets/shellscript-BFMb52q8.js +1 -0
  264. package/vendor/devspace/dist/ui/assets/shellsession-DuthW-5v.js +1 -0
  265. package/vendor/devspace/dist/ui/assets/slack-dark-DnToyrRv.js +1 -0
  266. package/vendor/devspace/dist/ui/assets/slack-ochin-B2OO5cIa.js +1 -0
  267. package/vendor/devspace/dist/ui/assets/smalltalk-B16xEiuN.js +1 -0
  268. package/vendor/devspace/dist/ui/assets/snazzy-light-4G7pJPwS.js +1 -0
  269. package/vendor/devspace/dist/ui/assets/solarized-dark-DV17i1UV.js +1 -0
  270. package/vendor/devspace/dist/ui/assets/solarized-light-DSh2HLQt.js +1 -0
  271. package/vendor/devspace/dist/ui/assets/solidity-CKzVLygQ.js +1 -0
  272. package/vendor/devspace/dist/ui/assets/soy-BohVVlJU.js +1 -0
  273. package/vendor/devspace/dist/ui/assets/sparql-D_iOobhT.js +1 -0
  274. package/vendor/devspace/dist/ui/assets/splunk-BC2Px7Mm.js +1 -0
  275. package/vendor/devspace/dist/ui/assets/sql-CnK9R2Gt.js +1 -0
  276. package/vendor/devspace/dist/ui/assets/ssh-config-BgfXC-Er.js +1 -0
  277. package/vendor/devspace/dist/ui/assets/stata-D-sV4Vbr.js +1 -0
  278. package/vendor/devspace/dist/ui/assets/stylus-B6D30XZt.js +1 -0
  279. package/vendor/devspace/dist/ui/assets/surrealql-ChAy0gHv.js +1 -0
  280. package/vendor/devspace/dist/ui/assets/svelte-3HBVqG-H.js +1 -0
  281. package/vendor/devspace/dist/ui/assets/swift-DonLKvLd.js +1 -0
  282. package/vendor/devspace/dist/ui/assets/synthwave-84-nFMaYfgc.js +1 -0
  283. package/vendor/devspace/dist/ui/assets/system-verilog-DJ5XKQeo.js +1 -0
  284. package/vendor/devspace/dist/ui/assets/systemd-BxMlprV5.js +1 -0
  285. package/vendor/devspace/dist/ui/assets/talonscript-CohzipZa.js +1 -0
  286. package/vendor/devspace/dist/ui/assets/tasl-DMoTqEGO.js +1 -0
  287. package/vendor/devspace/dist/ui/assets/tcl-CZd0xW_V.js +1 -0
  288. package/vendor/devspace/dist/ui/assets/templ-BixlV4Cp.js +1 -0
  289. package/vendor/devspace/dist/ui/assets/terraform-DswuEJGm.js +1 -0
  290. package/vendor/devspace/dist/ui/assets/tex-DWoJKHvD.js +1 -0
  291. package/vendor/devspace/dist/ui/assets/tokyo-night-oM2G3aXe.js +1 -0
  292. package/vendor/devspace/dist/ui/assets/toml-CcmNWLt0.js +1 -0
  293. package/vendor/devspace/dist/ui/assets/ts-tags-DLA8eH13.js +1 -0
  294. package/vendor/devspace/dist/ui/assets/tsv-sltzmVWM.js +1 -0
  295. package/vendor/devspace/dist/ui/assets/tsx-BYWa5JUz.js +1 -0
  296. package/vendor/devspace/dist/ui/assets/turtle-ByJddavk.js +1 -0
  297. package/vendor/devspace/dist/ui/assets/twig-CnY65vAo.js +1 -0
  298. package/vendor/devspace/dist/ui/assets/typescript-ByInUsro.js +1 -0
  299. package/vendor/devspace/dist/ui/assets/typespec-B88KGewJ.js +1 -0
  300. package/vendor/devspace/dist/ui/assets/typst-DI99ib-x.js +1 -0
  301. package/vendor/devspace/dist/ui/assets/useFileDiffInstance-Dg0pWcJV.js +244 -0
  302. package/vendor/devspace/dist/ui/assets/v-DETTlOr0.js +1 -0
  303. package/vendor/devspace/dist/ui/assets/vala-zf12oZj6.js +1 -0
  304. package/vendor/devspace/dist/ui/assets/vb-Djn5o6TS.js +1 -0
  305. package/vendor/devspace/dist/ui/assets/verilog-CiiDBU1e.js +1 -0
  306. package/vendor/devspace/dist/ui/assets/vesper-D5bVUKB1.js +1 -0
  307. package/vendor/devspace/dist/ui/assets/vhdl-BroJfC0k.js +1 -0
  308. package/vendor/devspace/dist/ui/assets/viml-DvXPmvsu.js +1 -0
  309. package/vendor/devspace/dist/ui/assets/vitesse-black-fwtXNY1n.js +1 -0
  310. package/vendor/devspace/dist/ui/assets/vitesse-dark-BZCL-v6S.js +1 -0
  311. package/vendor/devspace/dist/ui/assets/vitesse-light-VbXTXTou.js +1 -0
  312. package/vendor/devspace/dist/ui/assets/vue-Qngt2rkz.js +1 -0
  313. package/vendor/devspace/dist/ui/assets/vue-html-DDue9upr.js +1 -0
  314. package/vendor/devspace/dist/ui/assets/vue-vine-DBcAKsA6.js +1 -0
  315. package/vendor/devspace/dist/ui/assets/vyper-CgoNMtux.js +1 -0
  316. package/vendor/devspace/dist/ui/assets/wasm-BnjxR4X6.js +1 -0
  317. package/vendor/devspace/dist/ui/assets/wasm-ByWQv1Qj.js +1 -0
  318. package/vendor/devspace/dist/ui/assets/wenyan-C8pVoKbM.js +1 -0
  319. package/vendor/devspace/dist/ui/assets/wgsl-BsKzXJz4.js +1 -0
  320. package/vendor/devspace/dist/ui/assets/wikitext-ClFFjSW2.js +1 -0
  321. package/vendor/devspace/dist/ui/assets/wit-DdvCle-K.js +1 -0
  322. package/vendor/devspace/dist/ui/assets/wolfram-DLL8P-h_.js +1 -0
  323. package/vendor/devspace/dist/ui/assets/workspace-app-DGD9R89D.css +1 -0
  324. package/vendor/devspace/dist/ui/assets/workspace-app-DuzpU4Hf.js +118 -0
  325. package/vendor/devspace/dist/ui/assets/xml-CRLR5jiL.js +1 -0
  326. package/vendor/devspace/dist/ui/assets/xsl-CmcwyXbm.js +1 -0
  327. package/vendor/devspace/dist/ui/assets/yaml-Dpe6Eg-k.js +1 -0
  328. package/vendor/devspace/dist/ui/assets/zenscript-BnlCZFoB.js +1 -0
  329. package/vendor/devspace/dist/ui/assets/zig-CMLA9XwU.js +1 -0
  330. package/vendor/devspace/dist/ui/workspace-app.html +15 -0
  331. package/vendor/devspace/dist/user-config.js +57 -0
  332. package/vendor/devspace/dist/workspace-store.js +75 -0
  333. package/vendor/devspace/dist/workspaces.js +226 -0
package/cli.js CHANGED
@@ -197,6 +197,7 @@ function findProject(name) {
197
197
  function devspaceCommand() {
198
198
  const explicit = process.env.DEVSPACE_CLI;
199
199
  if (explicit && existsSync(explicit)) return ["node", explicit];
200
+ try { return ["node", require.resolve("@zoer7788/devspace/dist/cli.js")]; } catch {}
200
201
  try { return ["node", require.resolve("@waishnav/devspace/dist/cli.js")]; } catch {}
201
202
  const bundled = join(packageDir, "vendor", "devspace", "dist", "cli.js");
202
203
  if (existsSync(bundled)) return ["node", bundled];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zoer7788/mcp-nexus-node",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Remote node for MCP Nexus pairing and DevSpace project control.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -9,14 +9,13 @@
9
9
  },
10
10
  "files": [
11
11
  "cli.js",
12
- "README.md"
12
+ "README.md",
13
+ "vendor"
13
14
  ],
14
15
  "scripts": {
15
16
  "check": "node --check cli.js"
16
17
  },
17
- "dependencies": {
18
- "@waishnav/devspace": "^1.0.3"
19
- },
18
+ "dependencies": {},
20
19
  "publishConfig": {
21
20
  "access": "public"
22
21
  }
@@ -0,0 +1,374 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
3
+ import { stdin as input, stdout as output } from "node:process";
4
+ import { resolve } from "node:path";
5
+ import * as prompts from "@clack/prompts";
6
+ import { getShellConfig } from "@earendil-works/pi-coding-agent";
7
+ import { satisfies } from "semver";
8
+ import { loadConfig } from "./config.js";
9
+ import { localDashboardUrl } from "./dashboard.js";
10
+ import { generateOwnerToken, loadDevspaceFiles, writeDevspaceAuth, writeDevspaceConfig, } from "./user-config.js";
11
+ import { expandHomePath } from "./roots.js";
12
+ const require = createRequire(import.meta.url);
13
+ const SUPPORTED_NODE_RANGE = ">=20.12 <27";
14
+ async function main(argv) {
15
+ assertSupportedNode();
16
+ const [rawCommand, ...args] = argv;
17
+ const command = normalizeCommand(rawCommand);
18
+ switch (command) {
19
+ case "serve":
20
+ await ensureConfigured();
21
+ await serve();
22
+ return;
23
+ case "ui":
24
+ await ensureConfigured();
25
+ await serve({ openDashboard: true });
26
+ return;
27
+ case "init":
28
+ await runInit({ force: args.includes("--force") });
29
+ return;
30
+ case "doctor":
31
+ await runDoctor();
32
+ return;
33
+ case "config":
34
+ runConfigCommand(args);
35
+ return;
36
+ case "help":
37
+ printHelp();
38
+ return;
39
+ case "version":
40
+ printVersion();
41
+ return;
42
+ }
43
+ }
44
+ function normalizeCommand(command) {
45
+ if (!command || command === "serve" || command === "start")
46
+ return "serve";
47
+ if (command === "ui" || command === "dashboard" || command === "app")
48
+ return "ui";
49
+ if (command === "init" || command === "doctor" || command === "config")
50
+ return command;
51
+ if (command === "help" || command === "--help" || command === "-h")
52
+ return "help";
53
+ if (command === "version" || command === "--version" || command === "-v")
54
+ return "version";
55
+ throw new Error(`Unknown command: ${command}`);
56
+ }
57
+ async function ensureConfigured() {
58
+ const files = loadDevspaceFiles();
59
+ if (files.configExists && files.authExists)
60
+ return;
61
+ if (process.env.DEVSPACE_OAUTH_OWNER_TOKEN)
62
+ return;
63
+ if (!input.isTTY || !output.isTTY) {
64
+ throw new Error([
65
+ "DevSpace is not configured and this terminal is non-interactive.",
66
+ "",
67
+ "Run:",
68
+ " devspace init",
69
+ "",
70
+ "Or provide DEVSPACE_OAUTH_OWNER_TOKEN and DEVSPACE_ALLOWED_ROOTS.",
71
+ ].join("\n"));
72
+ }
73
+ await runInit({ force: false });
74
+ }
75
+ async function runInit({ force }) {
76
+ const files = loadDevspaceFiles();
77
+ if (!force && files.configExists && files.authExists) {
78
+ prompts.log.info(`DevSpace is already configured at ${files.dir}`);
79
+ prompts.log.info("Run `devspace init --force` to update it.");
80
+ return;
81
+ }
82
+ try {
83
+ prompts.intro("DevSpace setup");
84
+ const defaultRoots = files.config.allowedRoots?.join(", ") || process.cwd();
85
+ const rootsAnswer = await textPrompt({
86
+ message: `Where are your projects located? Press Enter to use ${defaultRoots}`,
87
+ placeholder: defaultRoots,
88
+ defaultValue: defaultRoots,
89
+ validate: (value) => value?.trim() ? undefined : "Enter at least one project root.",
90
+ });
91
+ const allowedRoots = rootsAnswer
92
+ .split(",")
93
+ .map((root) => resolve(expandHomePath(root.trim())))
94
+ .filter(Boolean);
95
+ const defaultPort = String(files.config.port ?? 7676);
96
+ const portAnswer = await textPrompt({
97
+ message: `Which local port should DevSpace use? Press Enter to use ${defaultPort}`,
98
+ placeholder: defaultPort,
99
+ defaultValue: defaultPort,
100
+ validate: validatePort,
101
+ });
102
+ const port = Number(portAnswer);
103
+ prompts.note([
104
+ "DevSpace needs a public base URL so ChatGPT or Claude can reach this MCP server.",
105
+ "Create a tunnel or reverse proxy with Cloudflare Tunnel, ngrok, Pinggy, Tailscale Funnel, or your own HTTPS proxy.",
106
+ "Paste the public origin here, without /mcp.",
107
+ "",
108
+ "Example: https://your-tunnel-host.example.com",
109
+ ].join("\n"), "Public URL required");
110
+ const publicBaseUrl = normalizePublicBaseUrl(await textPrompt({
111
+ message: files.config.publicBaseUrl
112
+ ? `What is the public base URL? Press Enter to keep ${files.config.publicBaseUrl}`
113
+ : "What is the public base URL?",
114
+ placeholder: files.config.publicBaseUrl ?? "https://your-tunnel-host.example.com",
115
+ defaultValue: files.config.publicBaseUrl ?? "",
116
+ validate: validateRequiredPublicBaseUrl,
117
+ }));
118
+ const config = {
119
+ host: files.config.host ?? "127.0.0.1",
120
+ port,
121
+ allowedRoots,
122
+ publicBaseUrl,
123
+ };
124
+ const auth = {
125
+ ownerToken: files.auth.ownerToken ?? generateOwnerToken(),
126
+ };
127
+ const configPath = writeDevspaceConfig(config);
128
+ const authPath = writeDevspaceAuth(auth);
129
+ const lines = [
130
+ `Config: ${configPath}`,
131
+ `Auth: ${authPath}`,
132
+ `Local MCP URL: http://${config.host}:${config.port}/mcp`,
133
+ ...(publicBaseUrl ? [`Public MCP URL: ${publicBaseUrl}/mcp`] : []),
134
+ ];
135
+ prompts.note(lines.join("\n"), "DevSpace configured");
136
+ prompts.note([
137
+ `Owner password: ${auth.ownerToken}`,
138
+ "Use this when ChatGPT or Claude asks you to approve DevSpace access.",
139
+ `Stored at: ${authPath}`,
140
+ ].join("\n"), "Owner password");
141
+ prompts.outro("Run `devspace serve` to start the MCP server.");
142
+ }
143
+ catch (error) {
144
+ if (error instanceof SetupCancelledError) {
145
+ prompts.cancel("Setup cancelled");
146
+ return;
147
+ }
148
+ throw error;
149
+ }
150
+ }
151
+ async function serve(options = {}) {
152
+ const sqliteStatus = checkSqliteNative();
153
+ if (sqliteStatus !== "ok") {
154
+ throw new Error([
155
+ "better-sqlite3 could not load for this Node runtime.",
156
+ sqliteStatus,
157
+ "",
158
+ "Try reinstalling or rebuilding dependencies under the active Node version:",
159
+ " npm rebuild better-sqlite3",
160
+ ].join("\n"));
161
+ }
162
+ const { createServer } = await import("./server.js");
163
+ const config = loadConfig();
164
+ const { app, close } = createServer(config);
165
+ const httpServer = app.listen(config.port, config.host, () => {
166
+ const dashboardUrl = localDashboardUrl(config);
167
+ console.log(`devspace listening on http://${config.host}:${config.port}/mcp`);
168
+ console.log(`dashboard: ${dashboardUrl}`);
169
+ console.log(`public base url: ${config.publicBaseUrl}`);
170
+ console.log(`allowed roots: ${config.allowedRoots.join(", ")}`);
171
+ console.log(`allowed hosts: ${config.allowedHosts.join(", ")}`);
172
+ if (config.allowedHosts.includes("*")) {
173
+ console.warn("warning: Host header allowlist is disabled because DEVSPACE_ALLOWED_HOSTS=*");
174
+ }
175
+ console.log("auth: Owner password approval required");
176
+ console.log(`logging: ${config.logging.level} ${config.logging.format}`);
177
+ if (options.openDashboard) {
178
+ void openUrl(dashboardUrl).catch((error) => {
179
+ console.warn(`unable to open dashboard automatically: ${error instanceof Error ? error.message : String(error)}`);
180
+ console.warn(`open this URL manually: ${dashboardUrl}`);
181
+ });
182
+ }
183
+ });
184
+ const shutdown = () => {
185
+ httpServer.close(() => {
186
+ close();
187
+ process.exit(0);
188
+ });
189
+ };
190
+ process.once("SIGINT", shutdown);
191
+ process.once("SIGTERM", shutdown);
192
+ }
193
+ async function openUrl(url) {
194
+ const { spawn } = await import("node:child_process");
195
+ const command = process.platform === "darwin"
196
+ ? "open"
197
+ : process.platform === "win32"
198
+ ? "cmd"
199
+ : "xdg-open";
200
+ const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
201
+ const child = spawn(command, args, { detached: true, stdio: "ignore" });
202
+ child.unref();
203
+ }
204
+ async function runDoctor() {
205
+ const files = loadDevspaceFiles();
206
+ console.log(`Config dir: ${files.dir}`);
207
+ console.log(`Config file: ${files.configExists ? files.configPath : "missing"}`);
208
+ console.log(`Auth file: ${files.authExists ? files.authPath : "missing"}`);
209
+ console.log(`Node: ${process.version} (${nodeVersionStatus()})`);
210
+ console.log(`Node ABI: ${process.versions.modules}`);
211
+ console.log(`Platform: ${process.platform} ${process.arch}`);
212
+ console.log(`Git: ${checkGitAvailable()}`);
213
+ console.log(`Bash shell: ${checkBashShell()}`);
214
+ console.log(`SQLite native dependency: ${checkSqliteNative()}`);
215
+ try {
216
+ const config = loadConfig();
217
+ console.log(`Local MCP URL: http://${config.host}:${config.port}/mcp`);
218
+ console.log(`Public MCP URL: ${new URL("/mcp", config.publicBaseUrl).toString()}`);
219
+ console.log(`Allowed roots: ${config.allowedRoots.join(", ")}`);
220
+ console.log(`Allowed hosts: ${config.allowedHosts.join(", ")}`);
221
+ }
222
+ catch (error) {
223
+ console.log(`Config status: ${error instanceof Error ? error.message : String(error)}`);
224
+ }
225
+ }
226
+ function runConfigCommand(args) {
227
+ const [subcommand, key, ...rest] = args;
228
+ const files = loadDevspaceFiles();
229
+ if (!subcommand || subcommand === "get") {
230
+ console.log(JSON.stringify(files.config, null, 2));
231
+ return;
232
+ }
233
+ if (subcommand !== "set") {
234
+ throw new Error(`Unknown config command: ${subcommand}`);
235
+ }
236
+ if (key !== "publicBaseUrl") {
237
+ throw new Error("Only `devspace config set publicBaseUrl <url|null>` is supported right now.");
238
+ }
239
+ const value = rest.join(" ").trim();
240
+ if (!value) {
241
+ throw new Error("Missing publicBaseUrl value.");
242
+ }
243
+ writeDevspaceConfig({
244
+ ...files.config,
245
+ publicBaseUrl: normalizeOptionalPublicBaseUrl(value),
246
+ });
247
+ console.log(`Updated ${files.configPath}`);
248
+ }
249
+ function printHelp() {
250
+ console.log([
251
+ "DevSpace",
252
+ "",
253
+ "Usage:",
254
+ " devspace Run first-time setup if needed, then start the server",
255
+ " devspace serve Start the server",
256
+ " devspace ui Start the server and open the visual dashboard",
257
+ " devspace init Create or update ~/.devspace/config.json and auth.json",
258
+ " devspace doctor Show config, runtime, and native dependency status",
259
+ " devspace config get Print persisted config",
260
+ " devspace config set publicBaseUrl <url|null>",
261
+ " devspace -v, --version Print the installed version",
262
+ "",
263
+ "For temporary tunnels:",
264
+ " DEVSPACE_PUBLIC_BASE_URL=https://example.trycloudflare.com devspace serve",
265
+ ].join("\n"));
266
+ }
267
+ function printVersion() {
268
+ const packageJson = require("../package.json");
269
+ if (typeof packageJson.version !== "string") {
270
+ throw new Error("Unable to read DevSpace package version.");
271
+ }
272
+ console.log(packageJson.version);
273
+ }
274
+ function normalizeOptionalPublicBaseUrl(value) {
275
+ const trimmed = value.trim();
276
+ if (!trimmed || trimmed === "null" || trimmed === "none")
277
+ return null;
278
+ return normalizePublicBaseUrl(trimmed);
279
+ }
280
+ function normalizePublicBaseUrl(value) {
281
+ const trimmed = value.trim();
282
+ const parsed = new URL(trimmed);
283
+ parsed.hash = "";
284
+ parsed.search = "";
285
+ parsed.pathname = parsed.pathname.replace(/\/+$/, "");
286
+ return parsed.toString().replace(/\/$/, "");
287
+ }
288
+ async function textPrompt(options) {
289
+ const result = await prompts.text({
290
+ ...options,
291
+ validate: (value) => options.validate?.(value?.trim() ? value : options.defaultValue),
292
+ });
293
+ if (prompts.isCancel(result))
294
+ throw new SetupCancelledError();
295
+ const value = String(result).trim();
296
+ return value || options.defaultValue;
297
+ }
298
+ function validatePort(value) {
299
+ const port = Number(value);
300
+ return Number.isInteger(port) && port >= 1 && port <= 65535
301
+ ? undefined
302
+ : "Enter a port between 1 and 65535.";
303
+ }
304
+ function validateRequiredPublicBaseUrl(value) {
305
+ const trimmed = value?.trim() ?? "";
306
+ if (!trimmed)
307
+ return "Enter the public URL from your tunnel or reverse proxy.";
308
+ if (trimmed.endsWith("/mcp"))
309
+ return "Enter the base URL only, without /mcp.";
310
+ return validatePublicBaseUrl(trimmed);
311
+ }
312
+ function validatePublicBaseUrl(value) {
313
+ try {
314
+ const parsed = new URL(value);
315
+ return parsed.protocol === "http:" || parsed.protocol === "https:"
316
+ ? undefined
317
+ : "Use an http or https URL.";
318
+ }
319
+ catch {
320
+ return "Enter a valid URL, for example https://your-tunnel-host.example.com.";
321
+ }
322
+ }
323
+ function assertSupportedNode() {
324
+ if (satisfies(process.versions.node, SUPPORTED_NODE_RANGE))
325
+ return;
326
+ throw new Error([
327
+ `DevSpace requires Node ${SUPPORTED_NODE_RANGE}.`,
328
+ `Current Node: ${process.version}`,
329
+ "",
330
+ "Install Node 22 LTS or use a version manager such as nvm, fnm, or mise.",
331
+ ].join("\n"));
332
+ }
333
+ function nodeVersionStatus() {
334
+ return satisfies(process.versions.node, SUPPORTED_NODE_RANGE)
335
+ ? `supported ${SUPPORTED_NODE_RANGE}`
336
+ : `unsupported, requires ${SUPPORTED_NODE_RANGE}`;
337
+ }
338
+ class SetupCancelledError extends Error {
339
+ }
340
+ function checkSqliteNative() {
341
+ try {
342
+ const Database = require("better-sqlite3");
343
+ const db = new Database(":memory:");
344
+ db.close();
345
+ return "ok";
346
+ }
347
+ catch (error) {
348
+ return error instanceof Error ? error.message : String(error);
349
+ }
350
+ }
351
+ function checkGitAvailable() {
352
+ try {
353
+ const { execFileSync } = require("node:child_process");
354
+ return execFileSync("git", ["--version"], { encoding: "utf8" }).trim();
355
+ }
356
+ catch (error) {
357
+ const message = error instanceof Error ? error.message : String(error);
358
+ return `unavailable (${message})`;
359
+ }
360
+ }
361
+ function checkBashShell() {
362
+ try {
363
+ const { shell, args } = getShellConfig();
364
+ return `${shell} ${args.join(" ")}`;
365
+ }
366
+ catch (error) {
367
+ const message = error instanceof Error ? error.message : String(error);
368
+ return `unavailable (${message})`;
369
+ }
370
+ }
371
+ main(process.argv.slice(2)).catch((error) => {
372
+ console.error(error instanceof Error ? error.message : String(error));
373
+ process.exitCode = 1;
374
+ });
@@ -0,0 +1,253 @@
1
+ import { homedir } from "node:os";
2
+ import { join, resolve } from "node:path";
3
+ import { expandHomePath } from "./roots.js";
4
+ import { loadDevspaceFiles, } from "./user-config.js";
5
+ const DEFAULT_OAUTH_ACCESS_TOKEN_TTL_SECONDS = 60 * 60;
6
+ const DEFAULT_OAUTH_REFRESH_TOKEN_TTL_SECONDS = 30 * 24 * 60 * 60;
7
+ const ROUTE_TUNNEL_MODES = ["manual", "cloudflare-named", "ngrok"];
8
+ function parsePort(value) {
9
+ if (value === undefined || value === "")
10
+ return 7676;
11
+ const port = Number(value);
12
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
13
+ throw new Error(`Invalid PORT: ${value}`);
14
+ }
15
+ return port;
16
+ }
17
+ function parseAllowedRoots(value) {
18
+ if (Array.isArray(value)) {
19
+ const roots = value.map((entry) => entry.trim()).filter(Boolean);
20
+ return (roots.length > 0 ? roots : [process.cwd()]).map((root) => resolve(expandHomePath(root)));
21
+ }
22
+ const rawRoots = value
23
+ ?.split(",")
24
+ .map((entry) => entry.trim())
25
+ .filter(Boolean) ?? [];
26
+ const roots = rawRoots.length > 0 ? rawRoots : [process.cwd()];
27
+ return roots.map((root) => resolve(expandHomePath(root)));
28
+ }
29
+ function parseAllowedHosts(value, derivedHosts) {
30
+ if (Array.isArray(value)) {
31
+ return normalizeAllowedHosts(value, derivedHosts);
32
+ }
33
+ const rawHosts = value
34
+ ?.split(",")
35
+ .map((entry) => entry.trim())
36
+ .filter(Boolean) ?? [];
37
+ return normalizeAllowedHosts(rawHosts, derivedHosts);
38
+ }
39
+ function normalizeAllowedHosts(rawHosts, derivedHosts) {
40
+ const hosts = rawHosts.length > 0 ? rawHosts : derivedHosts;
41
+ if (hosts.includes("*"))
42
+ return ["*"];
43
+ return Array.from(new Set(hosts.map((host) => host.trim()).filter(Boolean)));
44
+ }
45
+ function parseBoolean(value) {
46
+ return ["1", "true", "yes", "on"].includes(value?.toLowerCase() ?? "");
47
+ }
48
+ function parseMinimalTools(env, persisted) {
49
+ if (env.DEVSPACE_TOOL_MODE === "minimal")
50
+ return true;
51
+ if (env.DEVSPACE_TOOL_MODE === "full")
52
+ return false;
53
+ if (env.DEVSPACE_TOOL_MODE) {
54
+ throw new Error(`Invalid DEVSPACE_TOOL_MODE: ${env.DEVSPACE_TOOL_MODE}`);
55
+ }
56
+ if (env.DEVSPACE_MINIMAL_TOOLS !== undefined)
57
+ return parseBoolean(env.DEVSPACE_MINIMAL_TOOLS);
58
+ return persisted ?? true;
59
+ }
60
+ function parseLogLevel(value) {
61
+ if (!value || value === "info")
62
+ return "info";
63
+ if (["silent", "error", "warn", "debug"].includes(value))
64
+ return value;
65
+ throw new Error(`Invalid DEVSPACE_LOG_LEVEL: ${value}`);
66
+ }
67
+ function parseLogFormat(value) {
68
+ if (!value || value === "json")
69
+ return "json";
70
+ if (value === "pretty")
71
+ return "pretty";
72
+ throw new Error(`Invalid DEVSPACE_LOG_FORMAT: ${value}`);
73
+ }
74
+ function parsePathList(value) {
75
+ if (Array.isArray(value)) {
76
+ return value.map((entry) => resolve(expandHomePath(entry.trim()))).filter(Boolean);
77
+ }
78
+ return (value
79
+ ?.split(",")
80
+ .map((entry) => entry.trim())
81
+ .filter(Boolean)
82
+ .map((entry) => resolve(expandHomePath(entry))) ?? []);
83
+ }
84
+ function parseRouteTunnelMode(value) {
85
+ if (typeof value !== "string" || !ROUTE_TUNNEL_MODES.includes(value)) {
86
+ throw new Error(`Invalid route tunnel mode: ${String(value)}`);
87
+ }
88
+ return value;
89
+ }
90
+ function parseRoutes(value) {
91
+ if (!value)
92
+ return [];
93
+ if (!Array.isArray(value))
94
+ throw new Error("Invalid routes: expected an array.");
95
+ return value.map((route, index) => {
96
+ if (!route || typeof route !== "object") {
97
+ throw new Error(`Invalid routes[${index}]: expected an object.`);
98
+ }
99
+ const name = typeof route.name === "string" ? route.name.trim() : "";
100
+ const root = typeof route.root === "string" ? route.root.trim() : "";
101
+ const hostname = typeof route.hostname === "string" ? route.hostname.trim() : "";
102
+ const port = Number(route.port);
103
+ if (!name)
104
+ throw new Error(`Invalid routes[${index}].name: required.`);
105
+ if (!root)
106
+ throw new Error(`Invalid routes[${index}].root: required.`);
107
+ if (!hostname)
108
+ throw new Error(`Invalid routes[${index}].hostname: required.`);
109
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
110
+ throw new Error(`Invalid routes[${index}].port: expected 1-65535.`);
111
+ }
112
+ const publicBaseUrl = route.publicBaseUrl?.trim() || `https://${hostname}`;
113
+ return {
114
+ name,
115
+ root: resolve(expandHomePath(root)),
116
+ port,
117
+ hostname,
118
+ tunnel: parseRouteTunnelMode(route.tunnel ?? "manual"),
119
+ publicBaseUrl,
120
+ subdomain: route.subdomain?.trim() || undefined,
121
+ tunnelName: route.tunnelName?.trim() || undefined,
122
+ tunnelId: route.tunnelId?.trim() || undefined,
123
+ cloudflareConfig: route.cloudflareConfig?.trim()
124
+ ? resolve(expandHomePath(route.cloudflareConfig.trim()))
125
+ : undefined,
126
+ enabled: route.enabled ?? true,
127
+ };
128
+ });
129
+ }
130
+ function parseStringList(value, fallback) {
131
+ const entries = value
132
+ ?.split(",")
133
+ .map((entry) => entry.trim())
134
+ .filter(Boolean);
135
+ return entries && entries.length > 0 ? entries : fallback;
136
+ }
137
+ function parsePositiveInteger(value, fallback, name) {
138
+ if (!value)
139
+ return fallback;
140
+ const parsed = Number(value);
141
+ if (!Number.isInteger(parsed) || parsed < 1) {
142
+ throw new Error(`Invalid ${name}: ${value}`);
143
+ }
144
+ return parsed;
145
+ }
146
+ function parseToolNaming(value) {
147
+ if (!value || value === "short")
148
+ return "short";
149
+ if (value === "legacy")
150
+ return "legacy";
151
+ throw new Error(`Invalid DEVSPACE_TOOL_NAMING: ${value}`);
152
+ }
153
+ function parseBooleanSetting(value, persisted, fallback) {
154
+ return value === undefined ? persisted ?? fallback : parseBoolean(value);
155
+ }
156
+ function parseLoggingConfig(env, persisted) {
157
+ return {
158
+ level: parseLogLevel(env.DEVSPACE_LOG_LEVEL ?? persisted?.level),
159
+ format: parseLogFormat(env.DEVSPACE_LOG_FORMAT ?? persisted?.format),
160
+ requests: parseBooleanSetting(env.DEVSPACE_LOG_REQUESTS, persisted?.requests, true),
161
+ assets: parseBooleanSetting(env.DEVSPACE_LOG_ASSETS, persisted?.assets, false),
162
+ toolCalls: parseBooleanSetting(env.DEVSPACE_LOG_TOOL_CALLS, persisted?.toolCalls, true),
163
+ shellCommands: parseBooleanSetting(env.DEVSPACE_LOG_SHELL_COMMANDS, persisted?.shellCommands, false),
164
+ trustProxy: parseBooleanSetting(env.DEVSPACE_TRUST_PROXY, persisted?.trustProxy, false),
165
+ };
166
+ }
167
+ function parseWidgetMode(value) {
168
+ if (!value || value === "full")
169
+ return "full";
170
+ if (value === "off" || value === "changes")
171
+ return value;
172
+ throw new Error(`Invalid DEVSPACE_WIDGETS: ${value}`);
173
+ }
174
+ function parseRequiredSecret(value, name) {
175
+ const secret = value?.trim();
176
+ if (!secret) {
177
+ throw new Error(`${name} is required for DevSpace OAuth. Run: devspace init`);
178
+ }
179
+ if (secret.length < 16) {
180
+ throw new Error(`${name} must be at least 16 characters long.`);
181
+ }
182
+ return secret;
183
+ }
184
+ function parseOAuthConfig(env, ownerToken) {
185
+ return {
186
+ ownerToken: parseRequiredSecret(env.DEVSPACE_OAUTH_OWNER_TOKEN ?? ownerToken, "DEVSPACE_OAUTH_OWNER_TOKEN"),
187
+ accessTokenTtlSeconds: parsePositiveInteger(env.DEVSPACE_OAUTH_ACCESS_TOKEN_TTL_SECONDS, DEFAULT_OAUTH_ACCESS_TOKEN_TTL_SECONDS, "DEVSPACE_OAUTH_ACCESS_TOKEN_TTL_SECONDS"),
188
+ refreshTokenTtlSeconds: parsePositiveInteger(env.DEVSPACE_OAUTH_REFRESH_TOKEN_TTL_SECONDS, DEFAULT_OAUTH_REFRESH_TOKEN_TTL_SECONDS, "DEVSPACE_OAUTH_REFRESH_TOKEN_TTL_SECONDS"),
189
+ scopes: parseStringList(env.DEVSPACE_OAUTH_SCOPES, ["devspace"]),
190
+ allowedRedirectHosts: parseStringList(env.DEVSPACE_OAUTH_ALLOWED_REDIRECT_HOSTS, [
191
+ "chatgpt.com",
192
+ "localhost",
193
+ "127.0.0.1",
194
+ ]),
195
+ };
196
+ }
197
+ function defaultStateDir() {
198
+ return join(homedir(), ".local", "share", "devspace");
199
+ }
200
+ function defaultWorktreeRoot() {
201
+ return join(homedir(), ".devspace", "worktrees");
202
+ }
203
+ function defaultAgentDir() {
204
+ return join(homedir(), ".codex");
205
+ }
206
+ export function loadConfig(env = process.env) {
207
+ const files = loadDevspaceFiles(env);
208
+ const host = env.HOST ?? files.config.host ?? "127.0.0.1";
209
+ const port = parsePort(env.PORT ?? files.config.port);
210
+ const publicBaseUrl = parsePublicBaseUrl(env.DEVSPACE_PUBLIC_BASE_URL ?? files.config.publicBaseUrl ?? localPublicBaseUrl(host, port));
211
+ const derivedAllowedHosts = [
212
+ "localhost",
213
+ "127.0.0.1",
214
+ "::1",
215
+ host,
216
+ new URL(publicBaseUrl).hostname,
217
+ ...(files.config.allowedHosts ?? []),
218
+ ];
219
+ return {
220
+ host,
221
+ port,
222
+ oauth: parseOAuthConfig(env, files.auth.ownerToken),
223
+ allowedRoots: parseAllowedRoots(env.DEVSPACE_ALLOWED_ROOTS ?? files.config.allowedRoots),
224
+ allowedHosts: parseAllowedHosts(env.DEVSPACE_ALLOWED_HOSTS, derivedAllowedHosts),
225
+ publicBaseUrl,
226
+ minimalTools: parseMinimalTools(env, files.config.minimalTools),
227
+ toolNaming: parseToolNaming(env.DEVSPACE_TOOL_NAMING ?? files.config.toolNaming),
228
+ widgets: parseWidgetMode(env.DEVSPACE_WIDGETS ?? files.config.widgets),
229
+ stateDir: resolve(expandHomePath(env.DEVSPACE_STATE_DIR ?? files.config.stateDir ?? defaultStateDir())),
230
+ worktreeRoot: resolve(expandHomePath(env.DEVSPACE_WORKTREE_ROOT ?? files.config.worktreeRoot ?? defaultWorktreeRoot())),
231
+ skillsEnabled: env.DEVSPACE_SKILLS === undefined
232
+ ? files.config.skillsEnabled ?? true
233
+ : parseBoolean(env.DEVSPACE_SKILLS),
234
+ skillPaths: parsePathList(env.DEVSPACE_SKILL_PATHS ?? files.config.skillPaths),
235
+ agentDir: resolve(expandHomePath(env.DEVSPACE_AGENT_DIR ?? files.config.agentDir ?? defaultAgentDir())),
236
+ logging: parseLoggingConfig(env, files.config.logging),
237
+ routes: parseRoutes(files.config.routes),
238
+ };
239
+ }
240
+ function parsePublicBaseUrl(value) {
241
+ const parsed = new URL(value);
242
+ parsed.hash = "";
243
+ parsed.search = "";
244
+ parsed.pathname = parsed.pathname.replace(/\/+$/, "");
245
+ return parsed.toString().replace(/\/$/, "");
246
+ }
247
+ function localPublicBaseUrl(host, port) {
248
+ const publicHost = host === "0.0.0.0" || host === "::" ? "127.0.0.1" : host;
249
+ const formattedHost = publicHost.includes(":") && !publicHost.startsWith("[")
250
+ ? `[${publicHost}]`
251
+ : publicHost;
252
+ return `http://${formattedHost}:${port}`;
253
+ }