auvrynt 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (364) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +239 -0
  3. package/dist/blender-client.js +109 -0
  4. package/dist/blender-tools.js +930 -0
  5. package/dist/cli.js +370 -0
  6. package/dist/config.js +211 -0
  7. package/dist/connection-status.js +91 -0
  8. package/dist/db/client.js +22 -0
  9. package/dist/db/schema.js +29 -0
  10. package/dist/dotnet-tools.js +223 -0
  11. package/dist/git-worktrees.js +134 -0
  12. package/dist/git.js +41 -0
  13. package/dist/godot-animation-tilemap.js +82 -0
  14. package/dist/godot-csharp-build.js +93 -0
  15. package/dist/godot-csharp-project.js +157 -0
  16. package/dist/godot-csharp-runner.js +146 -0
  17. package/dist/godot-csharp-semantic.js +161 -0
  18. package/dist/godot-csharp-validate.js +71 -0
  19. package/dist/godot-dotnet-env.js +169 -0
  20. package/dist/godot-editor-bridge.js +140 -0
  21. package/dist/godot-gdscript.js +824 -0
  22. package/dist/godot-project-settings.js +223 -0
  23. package/dist/godot-runtime-testing.js +249 -0
  24. package/dist/godot-tools.js +183 -0
  25. package/dist/image-tools.js +157 -0
  26. package/dist/logger.js +76 -0
  27. package/dist/oauth-provider.js +266 -0
  28. package/dist/pi-tools.js +81 -0
  29. package/dist/processes.js +218 -0
  30. package/dist/review-checkpoints.js +142 -0
  31. package/dist/roots.js +53 -0
  32. package/dist/search-discovery.js +271 -0
  33. package/dist/serena-manager.js +443 -0
  34. package/dist/serena-tools.js +411 -0
  35. package/dist/server.js +2835 -0
  36. package/dist/skills.js +45 -0
  37. package/dist/ui/.vite/manifest.json +2520 -0
  38. package/dist/ui/assets/abap-CLvhMVsD.js +1 -0
  39. package/dist/ui/assets/actionscript-3--17pq3dv.js +1 -0
  40. package/dist/ui/assets/ada-C5qYipkI.js +1 -0
  41. package/dist/ui/assets/andromeeda-vGVdxbeo.js +1 -0
  42. package/dist/ui/assets/angular-html-BJqQFYI6.js +1 -0
  43. package/dist/ui/assets/angular-ts-CMJECO0Y.js +1 -0
  44. package/dist/ui/assets/apache-U0d_L8uA.js +1 -0
  45. package/dist/ui/assets/apex-CGTLDQj6.js +1 -0
  46. package/dist/ui/assets/apl-DWeXpBBr.js +1 -0
  47. package/dist/ui/assets/applescript-CCn79oCD.js +1 -0
  48. package/dist/ui/assets/ara-4CJ0cIlV.js +1 -0
  49. package/dist/ui/assets/asciidoc-DE70LPWp.js +1 -0
  50. package/dist/ui/assets/asm-Cmm7eHzH.js +1 -0
  51. package/dist/ui/assets/astro-CLbttLOq.js +1 -0
  52. package/dist/ui/assets/aurora-x-CDeNXAV0.js +1 -0
  53. package/dist/ui/assets/awk-BWXHIvNe.js +1 -0
  54. package/dist/ui/assets/ayu-dark-DluEY0Gj.js +1 -0
  55. package/dist/ui/assets/ayu-light-C3h-C4tm.js +1 -0
  56. package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +1 -0
  57. package/dist/ui/assets/ballerina-B7ZEbQpA.js +1 -0
  58. package/dist/ui/assets/bat-Bo4NYOV-.js +1 -0
  59. package/dist/ui/assets/beancount-D-usSTwE.js +1 -0
  60. package/dist/ui/assets/berry-DKpUyyne.js +1 -0
  61. package/dist/ui/assets/bibtex-Ci_nEsc7.js +1 -0
  62. package/dist/ui/assets/bicep-CUHmPFLl.js +1 -0
  63. package/dist/ui/assets/bird2-C2hNVINV.js +1 -0
  64. package/dist/ui/assets/blade-BOzY0P2V.js +1 -0
  65. package/dist/ui/assets/bsl-BkkzgIyY.js +1 -0
  66. package/dist/ui/assets/c-BG-8uJvh.js +1 -0
  67. package/dist/ui/assets/c3-CnJL0r0V.js +1 -0
  68. package/dist/ui/assets/cadence-CQ2zXKGN.js +1 -0
  69. package/dist/ui/assets/cairo-DLTphjLi.js +1 -0
  70. package/dist/ui/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
  71. package/dist/ui/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
  72. package/dist/ui/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
  73. package/dist/ui/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
  74. package/dist/ui/assets/clarity-SemFz856.js +1 -0
  75. package/dist/ui/assets/clojure-DqKBuwfJ.js +1 -0
  76. package/dist/ui/assets/cmake-Bj61d0ZC.js +1 -0
  77. package/dist/ui/assets/cobol-I_17IuGe.js +1 -0
  78. package/dist/ui/assets/codeowners-C8r90Shi.js +1 -0
  79. package/dist/ui/assets/codeql-oeQT6MSM.js +1 -0
  80. package/dist/ui/assets/coffee-C0B8hmok.js +1 -0
  81. package/dist/ui/assets/common-lisp-Cv5bFMCO.js +1 -0
  82. package/dist/ui/assets/coq-BrsZFFmf.js +1 -0
  83. package/dist/ui/assets/cpp-DDJXt6Vs.js +1 -0
  84. package/dist/ui/assets/crystal-Bexqace6.js +1 -0
  85. package/dist/ui/assets/csharp-Ct8U2NOr.js +1 -0
  86. package/dist/ui/assets/css-DSQhw_9R.js +1 -0
  87. package/dist/ui/assets/csv-Dx-8-gkx.js +1 -0
  88. package/dist/ui/assets/cue-CE9AQfxI.js +1 -0
  89. package/dist/ui/assets/cypher-ClKdZ_lG.js +1 -0
  90. package/dist/ui/assets/d-qD-0Kul2.js +1 -0
  91. package/dist/ui/assets/dark-plus-Cs2F2srj.js +1 -0
  92. package/dist/ui/assets/dart-DkHntEIa.js +1 -0
  93. package/dist/ui/assets/dax-BkyTk9wS.js +1 -0
  94. package/dist/ui/assets/desktop-Dlh5hvp9.js +1 -0
  95. package/dist/ui/assets/diff-woXpYk--.js +1 -0
  96. package/dist/ui/assets/docker-IyjqRm3v.js +1 -0
  97. package/dist/ui/assets/dotenv-_5a1GRtc.js +1 -0
  98. package/dist/ui/assets/dracula-BHWKrbxM.js +1 -0
  99. package/dist/ui/assets/dracula-soft-5eyTD99u.js +1 -0
  100. package/dist/ui/assets/dream-maker-DW3nJb8Q.js +1 -0
  101. package/dist/ui/assets/edge-Z8YYkHOr.js +1 -0
  102. package/dist/ui/assets/elixir-CG9uKtAF.js +1 -0
  103. package/dist/ui/assets/elm-GfWG2IfT.js +1 -0
  104. package/dist/ui/assets/emacs-lisp-C9PiwqqW.js +1 -0
  105. package/dist/ui/assets/erb-xe89e73J.js +1 -0
  106. package/dist/ui/assets/erlang-Cphh6RMH.js +1 -0
  107. package/dist/ui/assets/everforest-dark-sB-x3p7T.js +1 -0
  108. package/dist/ui/assets/everforest-light-Df2xbC6M.js +1 -0
  109. package/dist/ui/assets/fennel-DQxkIbk2.js +1 -0
  110. package/dist/ui/assets/fish-BJitypiv.js +1 -0
  111. package/dist/ui/assets/fluent-C03EYrpw.js +1 -0
  112. package/dist/ui/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
  113. package/dist/ui/assets/fortran-free-form-CYNrtFtB.js +1 -0
  114. package/dist/ui/assets/fsharp-D13ZGOAj.js +1 -0
  115. package/dist/ui/assets/gdresource-C0sCabJj.js +1 -0
  116. package/dist/ui/assets/gdscript-Cp2uCuqX.js +1 -0
  117. package/dist/ui/assets/gdshader-CBce3t8t.js +1 -0
  118. package/dist/ui/assets/genie-CV2tkWYe.js +1 -0
  119. package/dist/ui/assets/gherkin-DExj1W_8.js +1 -0
  120. package/dist/ui/assets/git-commit-BSykSTBG.js +1 -0
  121. package/dist/ui/assets/git-rebase-CoTL_uSE.js +1 -0
  122. package/dist/ui/assets/github-dark-C-LZuMrd.js +1 -0
  123. package/dist/ui/assets/github-dark-default-DXG-b-1a.js +1 -0
  124. package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
  125. package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
  126. package/dist/ui/assets/github-light-EUqPIrTm.js +1 -0
  127. package/dist/ui/assets/github-light-default-BXViO-2h.js +1 -0
  128. package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +1 -0
  129. package/dist/ui/assets/gleam-CSRkHgEL.js +1 -0
  130. package/dist/ui/assets/glimmer-js-DAn4UCSu.js +1 -0
  131. package/dist/ui/assets/glimmer-ts-Tjyi6Gh5.js +1 -0
  132. package/dist/ui/assets/glsl-CtTDZoqR.js +1 -0
  133. package/dist/ui/assets/gn-ilITqXS6.js +1 -0
  134. package/dist/ui/assets/gnuplot-7GGW24-e.js +1 -0
  135. package/dist/ui/assets/go-BJwz_mda.js +1 -0
  136. package/dist/ui/assets/graphql-D5gcC_Jk.js +1 -0
  137. package/dist/ui/assets/groovy-CacY0gHj.js +1 -0
  138. package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
  139. package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
  140. package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  141. package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
  142. package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
  143. package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
  144. package/dist/ui/assets/hack-BJXY27dt.js +1 -0
  145. package/dist/ui/assets/haml-BLfFoZf7.js +1 -0
  146. package/dist/ui/assets/handlebars-Dw6CWkvN.js +1 -0
  147. package/dist/ui/assets/haskell-D8IpX4py.js +1 -0
  148. package/dist/ui/assets/haxe-OTjmBuCE.js +1 -0
  149. package/dist/ui/assets/hcl-Dh228itO.js +1 -0
  150. package/dist/ui/assets/heavy-payload-Dcg0-F-S.js +4 -0
  151. package/dist/ui/assets/hjson-CxZEssPk.js +1 -0
  152. package/dist/ui/assets/hlsl-Cvrh5tZx.js +1 -0
  153. package/dist/ui/assets/horizon-CE9ld1lL.js +1 -0
  154. package/dist/ui/assets/horizon-bright-Br1oVSNq.js +1 -0
  155. package/dist/ui/assets/houston-CsvMBhTu.js +1 -0
  156. package/dist/ui/assets/html-CAcAWvoN.js +1 -0
  157. package/dist/ui/assets/html-derivative-8aSW2E_7.js +1 -0
  158. package/dist/ui/assets/http-B2YR_3V1.js +1 -0
  159. package/dist/ui/assets/hurl-BnDJ9Zhf.js +1 -0
  160. package/dist/ui/assets/hxml-B0Qn7Nwc.js +1 -0
  161. package/dist/ui/assets/hy-CZbG8q4J.js +1 -0
  162. package/dist/ui/assets/imba-DsUTQ-LC.js +1 -0
  163. package/dist/ui/assets/ini-B5eOa1yu.js +1 -0
  164. package/dist/ui/assets/java-Doxi4W8u.js +1 -0
  165. package/dist/ui/assets/javascript-BbRdEqti.js +1 -0
  166. package/dist/ui/assets/jinja-CS3Tpv_Q.js +1 -0
  167. package/dist/ui/assets/jison-BkPGYVHR.js +1 -0
  168. package/dist/ui/assets/json-BMt1m3m8.js +1 -0
  169. package/dist/ui/assets/json5-BR5RXkoi.js +1 -0
  170. package/dist/ui/assets/jsonc-CYpm1nAK.js +1 -0
  171. package/dist/ui/assets/jsonl-CmCQp5Yx.js +1 -0
  172. package/dist/ui/assets/jsonnet-CJTPZ8u_.js +1 -0
  173. package/dist/ui/assets/jssm-DXw9l8Rf.js +1 -0
  174. package/dist/ui/assets/jsx-CQKrJXXY.js +1 -0
  175. package/dist/ui/assets/julia-BuN7i2du.js +1 -0
  176. package/dist/ui/assets/just-BswEPFPu.js +1 -0
  177. package/dist/ui/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
  178. package/dist/ui/assets/kanagawa-lotus-BN08jTvb.js +1 -0
  179. package/dist/ui/assets/kanagawa-wave-CTweb8Dz.js +1 -0
  180. package/dist/ui/assets/kdl-CsD5j6eV.js +1 -0
  181. package/dist/ui/assets/kotlin-DhhofPvG.js +1 -0
  182. package/dist/ui/assets/kusto-BUv0MjJC.js +1 -0
  183. package/dist/ui/assets/laserwave-C_8bwKvT.js +1 -0
  184. package/dist/ui/assets/latex-DU2VyFfA.js +1 -0
  185. package/dist/ui/assets/lean-CewbzKMR.js +1 -0
  186. package/dist/ui/assets/less-DVTAwKKz.js +1 -0
  187. package/dist/ui/assets/light-plus-DVQuIRkW.js +1 -0
  188. package/dist/ui/assets/liquid-Cmz1L3dq.js +1 -0
  189. package/dist/ui/assets/llvm-Cm23YOpf.js +1 -0
  190. package/dist/ui/assets/log-BNLmms1o.js +1 -0
  191. package/dist/ui/assets/logo-Cluzi2Zq.js +1 -0
  192. package/dist/ui/assets/lua-CfVXhkaJ.js +1 -0
  193. package/dist/ui/assets/luau-CNKltnaQ.js +1 -0
  194. package/dist/ui/assets/make-Dixweg8N.js +1 -0
  195. package/dist/ui/assets/markdown-BYOwaDjH.js +1 -0
  196. package/dist/ui/assets/marko-C5bfqGiA.js +1 -0
  197. package/dist/ui/assets/material-theme-Bm3Qr25_.js +1 -0
  198. package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +1 -0
  199. package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +1 -0
  200. package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +1 -0
  201. package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +1 -0
  202. package/dist/ui/assets/matlab-D7qyCx1q.js +1 -0
  203. package/dist/ui/assets/mdc-CVBXYfyq.js +1 -0
  204. package/dist/ui/assets/mdx-DQZ5AkYe.js +1 -0
  205. package/dist/ui/assets/mermaid-Bk4SNUv9.js +1 -0
  206. package/dist/ui/assets/min-dark-BSWPekZh.js +1 -0
  207. package/dist/ui/assets/min-light-DDpmG2fV.js +1 -0
  208. package/dist/ui/assets/mipsasm-BMqwQI7S.js +1 -0
  209. package/dist/ui/assets/mojo-BgCJLMeH.js +1 -0
  210. package/dist/ui/assets/monokai-CdkpiU2Y.js +1 -0
  211. package/dist/ui/assets/moonbit-CaWjb8XO.js +1 -0
  212. package/dist/ui/assets/move-B1IS1UjX.js +1 -0
  213. package/dist/ui/assets/narrat-_X_XdTYD.js +1 -0
  214. package/dist/ui/assets/nextflow-Bbiyy34d.js +1 -0
  215. package/dist/ui/assets/nextflow-groovy-Dc_ddanL.js +1 -0
  216. package/dist/ui/assets/nginx-CzJafxLa.js +1 -0
  217. package/dist/ui/assets/night-owl-DhmEMT88.js +1 -0
  218. package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +1 -0
  219. package/dist/ui/assets/nim-DABKtHtM.js +1 -0
  220. package/dist/ui/assets/nix-IvuFDN5E.js +1 -0
  221. package/dist/ui/assets/nord-Cb4Vim4T.js +1 -0
  222. package/dist/ui/assets/nushell-DcLAeLz5.js +1 -0
  223. package/dist/ui/assets/objective-c-D1A_Heim.js +1 -0
  224. package/dist/ui/assets/objective-cpp-BsSzOQcm.js +1 -0
  225. package/dist/ui/assets/ocaml-O90oeIOV.js +1 -0
  226. package/dist/ui/assets/odin-B1RWQWA5.js +1 -0
  227. package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +1 -0
  228. package/dist/ui/assets/one-light-D7Lr4KcI.js +1 -0
  229. package/dist/ui/assets/openscad-BUDT5pXO.js +1 -0
  230. package/dist/ui/assets/pascal-4ZHwLPI5.js +1 -0
  231. package/dist/ui/assets/perl-CBh7L3lZ.js +1 -0
  232. package/dist/ui/assets/php-DFbI9q5p.js +1 -0
  233. package/dist/ui/assets/pierre-dark-sU4Zdns8.js +1 -0
  234. package/dist/ui/assets/pierre-dark-soft-HXgun5vs.js +1 -0
  235. package/dist/ui/assets/pierre-light-DWBk51d8.js +1 -0
  236. package/dist/ui/assets/pierre-light-soft-CodEzPxf.js +1 -0
  237. package/dist/ui/assets/pkl-ot-7Btpt.js +1 -0
  238. package/dist/ui/assets/plastic-DQwYfKfQ.js +1 -0
  239. package/dist/ui/assets/plsql-DGHpHOYJ.js +1 -0
  240. package/dist/ui/assets/po-BiJDBrnU.js +1 -0
  241. package/dist/ui/assets/poimandres-DRFjx7u4.js +1 -0
  242. package/dist/ui/assets/polar-C7UOKdEL.js +1 -0
  243. package/dist/ui/assets/postcss-BXeXVLqQ.js +1 -0
  244. package/dist/ui/assets/powerquery-DNMTfnFr.js +1 -0
  245. package/dist/ui/assets/powershell-DshXNtvi.js +1 -0
  246. package/dist/ui/assets/prisma-BsRQq5mF.js +1 -0
  247. package/dist/ui/assets/prolog-iXnhIJG7.js +1 -0
  248. package/dist/ui/assets/proto-DB4EqR-F.js +1 -0
  249. package/dist/ui/assets/pug-C_PxC7gO.js +1 -0
  250. package/dist/ui/assets/puppet-CDv2pdJW.js +1 -0
  251. package/dist/ui/assets/purescript-9MfHhQsQ.js +1 -0
  252. package/dist/ui/assets/python-gzcpVVnB.js +1 -0
  253. package/dist/ui/assets/qml-DtngoFFK.js +1 -0
  254. package/dist/ui/assets/qmldir-DCQb3MpD.js +1 -0
  255. package/dist/ui/assets/qss-Fe1Jh2GI.js +1 -0
  256. package/dist/ui/assets/r-DohkcevW.js +1 -0
  257. package/dist/ui/assets/racket-DcIDlBhZ.js +1 -0
  258. package/dist/ui/assets/raku-B3gFvitq.js +1 -0
  259. package/dist/ui/assets/razor-C4t8J0_E.js +1 -0
  260. package/dist/ui/assets/red-CJ3rzSJv.js +1 -0
  261. package/dist/ui/assets/reg-CRGYupPL.js +1 -0
  262. package/dist/ui/assets/regexp-OGbTbjgY.js +1 -0
  263. package/dist/ui/assets/rel-BtDbiS_P.js +1 -0
  264. package/dist/ui/assets/review-payload-C5Qz60Kq.js +1 -0
  265. package/dist/ui/assets/riscv-Ckw8ddFX.js +1 -0
  266. package/dist/ui/assets/ron-VUp2lXgN.js +1 -0
  267. package/dist/ui/assets/rose-pine-BthvhNj6.js +1 -0
  268. package/dist/ui/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
  269. package/dist/ui/assets/rose-pine-moon-hon4tzzS.js +1 -0
  270. package/dist/ui/assets/rosmsg-CAekHB0j.js +1 -0
  271. package/dist/ui/assets/rst-CfBbbcvC.js +1 -0
  272. package/dist/ui/assets/ruby-Bw0mpxHY.js +1 -0
  273. package/dist/ui/assets/rust-Cfkwpbl8.js +1 -0
  274. package/dist/ui/assets/sas-Cs3s9JOf.js +1 -0
  275. package/dist/ui/assets/sass-DXrisJhu.js +1 -0
  276. package/dist/ui/assets/scala-DKOlJaKm.js +1 -0
  277. package/dist/ui/assets/scheme-DQCgrYNe.js +1 -0
  278. package/dist/ui/assets/scss-sRxNJS54.js +1 -0
  279. package/dist/ui/assets/sdbl-bTVj8UrX.js +1 -0
  280. package/dist/ui/assets/shaderlab-TOUzSsQk.js +1 -0
  281. package/dist/ui/assets/shellscript-B0X6wh0R.js +1 -0
  282. package/dist/ui/assets/shellsession-D2FdOioR.js +1 -0
  283. package/dist/ui/assets/slack-dark-DnToyrRv.js +1 -0
  284. package/dist/ui/assets/slack-ochin-B2OO5cIa.js +1 -0
  285. package/dist/ui/assets/smalltalk-B16xEiuN.js +1 -0
  286. package/dist/ui/assets/snazzy-light-4G7pJPwS.js +1 -0
  287. package/dist/ui/assets/solarized-dark-DV17i1UV.js +1 -0
  288. package/dist/ui/assets/solarized-light-DSh2HLQt.js +1 -0
  289. package/dist/ui/assets/solidity-CKzVLygQ.js +1 -0
  290. package/dist/ui/assets/soy-s6g9OjJ1.js +1 -0
  291. package/dist/ui/assets/sparql-D_iOobhT.js +1 -0
  292. package/dist/ui/assets/splunk-BC2Px7Mm.js +1 -0
  293. package/dist/ui/assets/sql-DVTnh5V-.js +1 -0
  294. package/dist/ui/assets/ssh-config-BgfXC-Er.js +1 -0
  295. package/dist/ui/assets/stata-DFIDiXF9.js +1 -0
  296. package/dist/ui/assets/stylus-B6D30XZt.js +1 -0
  297. package/dist/ui/assets/surrealql-DVfrsLyg.js +1 -0
  298. package/dist/ui/assets/svelte-D5GsxESq.js +1 -0
  299. package/dist/ui/assets/swift-DonLKvLd.js +1 -0
  300. package/dist/ui/assets/synthwave-84-nFMaYfgc.js +1 -0
  301. package/dist/ui/assets/system-verilog-DJ5XKQeo.js +1 -0
  302. package/dist/ui/assets/systemd-BxMlprV5.js +1 -0
  303. package/dist/ui/assets/talonscript-CohzipZa.js +1 -0
  304. package/dist/ui/assets/tasl-DMoTqEGO.js +1 -0
  305. package/dist/ui/assets/tcl-CZd0xW_V.js +1 -0
  306. package/dist/ui/assets/templ-DI-Zyqzd.js +1 -0
  307. package/dist/ui/assets/terraform-DswuEJGm.js +1 -0
  308. package/dist/ui/assets/tex-WHHmlbJI.js +1 -0
  309. package/dist/ui/assets/tokyo-night-oM2G3aXe.js +1 -0
  310. package/dist/ui/assets/toml-CcmNWLt0.js +1 -0
  311. package/dist/ui/assets/ts-tags-Dwpo2RFJ.js +1 -0
  312. package/dist/ui/assets/tsv-sltzmVWM.js +1 -0
  313. package/dist/ui/assets/tsx-ph_idaAW.js +1 -0
  314. package/dist/ui/assets/turtle-ByJddavk.js +1 -0
  315. package/dist/ui/assets/twig-YO17jFjR.js +1 -0
  316. package/dist/ui/assets/typescript-CbAxjhkl.js +1 -0
  317. package/dist/ui/assets/typespec-B88KGewJ.js +1 -0
  318. package/dist/ui/assets/typst-DI99ib-x.js +1 -0
  319. package/dist/ui/assets/useFileDiffInstance-B2DLX3Vg.js +244 -0
  320. package/dist/ui/assets/v-DETTlOr0.js +1 -0
  321. package/dist/ui/assets/vala-zf12oZj6.js +1 -0
  322. package/dist/ui/assets/vb-Djn5o6TS.js +1 -0
  323. package/dist/ui/assets/verilog-CiiDBU1e.js +1 -0
  324. package/dist/ui/assets/vesper-D5bVUKB1.js +1 -0
  325. package/dist/ui/assets/vhdl-BroJfC0k.js +1 -0
  326. package/dist/ui/assets/viml-DvXPmvsu.js +1 -0
  327. package/dist/ui/assets/vitesse-black-fwtXNY1n.js +1 -0
  328. package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +1 -0
  329. package/dist/ui/assets/vitesse-light-VbXTXTou.js +1 -0
  330. package/dist/ui/assets/vue-CraHL-Ps.js +1 -0
  331. package/dist/ui/assets/vue-html-e9tyZNtS.js +1 -0
  332. package/dist/ui/assets/vue-vine-CofmxaUb.js +1 -0
  333. package/dist/ui/assets/vyper-CgoNMtux.js +1 -0
  334. package/dist/ui/assets/wasm-BnjxR4X6.js +1 -0
  335. package/dist/ui/assets/wasm-ByWQv1Qj.js +1 -0
  336. package/dist/ui/assets/wenyan-C8pVoKbM.js +1 -0
  337. package/dist/ui/assets/wgsl-BsKzXJz4.js +1 -0
  338. package/dist/ui/assets/wikitext-ClFFjSW2.js +1 -0
  339. package/dist/ui/assets/wit-DdvCle-K.js +1 -0
  340. package/dist/ui/assets/wolfram-DLL8P-h_.js +1 -0
  341. package/dist/ui/assets/workspace-app-8--oTbCd.css +1 -0
  342. package/dist/ui/assets/workspace-app-C5QsE314.js +118 -0
  343. package/dist/ui/assets/xml-BWSdPZHm.js +1 -0
  344. package/dist/ui/assets/xsl-BtCt7Hx8.js +1 -0
  345. package/dist/ui/assets/yaml-BZiTw7cQ.js +1 -0
  346. package/dist/ui/assets/zenscript-BnlCZFoB.js +1 -0
  347. package/dist/ui/assets/zig-CMLA9XwU.js +1 -0
  348. package/dist/ui/workspace-app.html +15 -0
  349. package/dist/user-config.js +57 -0
  350. package/dist/view-image.js +104 -0
  351. package/dist/web-tools.js +200 -0
  352. package/dist/window-capture.js +74 -0
  353. package/dist/workspace-store.js +125 -0
  354. package/dist/workspaces.js +226 -0
  355. package/docs/DEVELOPMENT_TOOLS.md +95 -0
  356. package/docs/assets/auvrynt-logo-light.png +0 -0
  357. package/docs/assets/auvrynt-screenshot.png +0 -0
  358. package/docs/chatgpt-coding-workflow.md +143 -0
  359. package/docs/configuration.md +132 -0
  360. package/docs/gotchas.md +215 -0
  361. package/docs/security.md +100 -0
  362. package/docs/setup.md +132 -0
  363. package/package.json +70 -0
  364. package/scripts/dev-server.mjs +120 -0
@@ -0,0 +1,223 @@
1
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
2
+ import { join, relative } from "node:path";
3
+ export async function getProjectSettings(registry, input) {
4
+ const workspace = registry.getWorkspace(input.workspaceId);
5
+ const godotFile = join(registry.resolvePath(workspace, input.projectPath), "project.godot");
6
+ const content = await readFile(godotFile, "utf8");
7
+ const settings = {};
8
+ const lines = content.split(/\r?\n/);
9
+ let currentSection = "";
10
+ for (const line of lines) {
11
+ const sectionMatch = line.match(/^\[(\w+)\]$/);
12
+ if (sectionMatch) {
13
+ currentSection = sectionMatch[1];
14
+ continue;
15
+ }
16
+ const kvMatch = line.match(/^(\S+)\s*=\s*(.+)$/);
17
+ if (kvMatch) {
18
+ const key = currentSection ? `${currentSection}/${kvMatch[1]}` : kvMatch[1];
19
+ settings[key] = kvMatch[2].trim();
20
+ }
21
+ }
22
+ return settings;
23
+ }
24
+ export async function setProjectSetting(registry, input) {
25
+ const workspace = registry.getWorkspace(input.workspaceId);
26
+ const godotFile = join(registry.resolvePath(workspace, input.projectPath), "project.godot");
27
+ let content = await readFile(godotFile, "utf8");
28
+ const newValueStr = JSON.stringify(input.value);
29
+ const keyParts = input.settingKey.split("/");
30
+ const [section, ...keyRest] = keyParts;
31
+ const key = keyRest.join("/");
32
+ const keyRegex = new RegExp(`^(${key}\\s*=\\s*)(.+)$`, "m");
33
+ const prev = keyRegex.exec(content)?.[2];
34
+ if (keyRegex.test(content)) {
35
+ content = content.replace(keyRegex, `$1${newValueStr}`);
36
+ }
37
+ else {
38
+ const sectionRegex = new RegExp(`\\[${section}\\]`, "m");
39
+ if (sectionRegex.test(content)) {
40
+ content = content.replace(sectionRegex, `[${section}]\n${key}=${newValueStr}`);
41
+ }
42
+ else {
43
+ content += `\n[${section}]\n${key}=${newValueStr}\n`;
44
+ }
45
+ }
46
+ await writeFile(godotFile, content, "utf8");
47
+ return { previousValue: prev, newValue: newValueStr };
48
+ }
49
+ export async function getInputMap(registry, input) {
50
+ const settings = await getProjectSettings(registry, input);
51
+ const inputActions = {};
52
+ for (const [key, value] of Object.entries(settings)) {
53
+ if (key.startsWith("input/")) {
54
+ const actionName = key.replace("input/", "");
55
+ inputActions[actionName] = [value];
56
+ }
57
+ }
58
+ return inputActions;
59
+ }
60
+ export async function getAutoloads(registry, input) {
61
+ const settings = await getProjectSettings(registry, input);
62
+ const autoloads = {};
63
+ for (const [key, value] of Object.entries(settings)) {
64
+ if (key.startsWith("autoload/")) {
65
+ const name = key.replace("autoload/", "");
66
+ autoloads[name] = value;
67
+ }
68
+ }
69
+ return autoloads;
70
+ }
71
+ export async function applyPixelArtImportPreset(registry, input) {
72
+ const workspace = registry.getWorkspace(input.workspaceId);
73
+ const changed = [];
74
+ const errors = [];
75
+ for (const texturePath of input.paths) {
76
+ try {
77
+ const absPath = registry.resolvePath(workspace, texturePath);
78
+ const importPath = absPath + ".import";
79
+ let importContent;
80
+ try {
81
+ importContent = await readFile(importPath, "utf8");
82
+ }
83
+ catch {
84
+ // Create a minimal .import file
85
+ importContent = `[remap]\n\nimporter="texture"\n`;
86
+ }
87
+ // Apply pixel art import settings
88
+ const pixelArtSettings = [
89
+ ["process/fix_alpha_border", "false"],
90
+ ["process/premult_alpha", "false"],
91
+ ["compress/mode", "0"], // Lossless
92
+ ["compress/high_quality", "false"],
93
+ ["flags/repeat", "0"],
94
+ ["flags/filter", "false"], // nearest neighbour
95
+ ["flags/mipmaps", "false"],
96
+ ["flags/anisotropic", "false"],
97
+ ["flags/srgb", "2"],
98
+ ];
99
+ for (const [key, val] of pixelArtSettings) {
100
+ const keyRegex = new RegExp(`^(${key}\\s*=\\s*)(.*)$`, "m");
101
+ if (keyRegex.test(importContent)) {
102
+ importContent = importContent.replace(keyRegex, `$1${val}`);
103
+ }
104
+ }
105
+ await writeFile(importPath, importContent, "utf8");
106
+ changed.push(texturePath);
107
+ }
108
+ catch (err) {
109
+ errors.push(`${texturePath}: ${err instanceof Error ? err.message : String(err)}`);
110
+ }
111
+ }
112
+ return { changed, errors };
113
+ }
114
+ // ─── VS Code Configuration Generator ────────────────────────────────────────
115
+ export async function generateVscodeConfig(registry, input) {
116
+ const workspace = registry.getWorkspace(input.workspaceId);
117
+ const targetDir = registry.resolvePath(workspace, input.projectPath);
118
+ const vscodeDir = join(targetDir, ".vscode");
119
+ await mkdir(vscodeDir, { recursive: true });
120
+ const generated = [];
121
+ const skipped = [];
122
+ const godotExe = input.godotExecutable ?? "${env:GODOT_DOTNET_EXECUTABLE}";
123
+ // tasks.json
124
+ const tasksPath = join(vscodeDir, "tasks.json");
125
+ let tasksContent = { version: "2.0.0", tasks: [] };
126
+ try {
127
+ tasksContent = JSON.parse(await readFile(tasksPath, "utf8"));
128
+ }
129
+ catch { }
130
+ const godotTasks = [
131
+ {
132
+ label: "Godot: Build C#",
133
+ type: "shell",
134
+ command: "dotnet build",
135
+ args: ["${workspaceFolder}"],
136
+ group: "build",
137
+ },
138
+ {
139
+ label: "Godot: Restore NuGet",
140
+ type: "shell",
141
+ command: "dotnet restore",
142
+ args: ["${workspaceFolder}"],
143
+ },
144
+ {
145
+ label: "Godot: Run Project",
146
+ type: "shell",
147
+ command: godotExe,
148
+ args: ["--path", "${workspaceFolder}", "-d"],
149
+ },
150
+ {
151
+ label: "Godot: Headless Validate",
152
+ type: "shell",
153
+ command: godotExe,
154
+ args: ["--headless", "--path", "${workspaceFolder}", "--editor", "--quit"],
155
+ },
156
+ ];
157
+ const existingLabels = new Set((tasksContent.tasks ?? []).map((t) => t.label));
158
+ for (const task of godotTasks) {
159
+ if (!existingLabels.has(task.label)) {
160
+ tasksContent.tasks.push(task);
161
+ }
162
+ }
163
+ await writeFile(tasksPath, JSON.stringify(tasksContent, null, 2), "utf8");
164
+ generated.push(relative(workspace.root, tasksPath).replace(/\\/g, "/"));
165
+ // launch.json
166
+ const launchPath = join(vscodeDir, "launch.json");
167
+ let launchContent = { version: "0.2.0", configurations: [] };
168
+ try {
169
+ launchContent = JSON.parse(await readFile(launchPath, "utf8"));
170
+ }
171
+ catch { }
172
+ const existingNames = new Set((launchContent.configurations ?? []).map((c) => c.name));
173
+ if (!existingNames.has("Godot C# Debug")) {
174
+ launchContent.configurations.push({
175
+ name: "Godot C# Debug",
176
+ type: "coreclr",
177
+ request: "attach",
178
+ processId: "${command:pickProcess}",
179
+ program: "${workspaceFolder}/bin/Debug/net8.0/${workspaceFolderBasename}.dll",
180
+ });
181
+ await writeFile(launchPath, JSON.stringify(launchContent, null, 2), "utf8");
182
+ generated.push(relative(workspace.root, launchPath).replace(/\\/g, "/"));
183
+ }
184
+ else {
185
+ skipped.push(relative(workspace.root, launchPath).replace(/\\/g, "/"));
186
+ }
187
+ return { generated, skipped };
188
+ }
189
+ export async function listExportPresets(registry, input) {
190
+ const workspace = registry.getWorkspace(input.workspaceId);
191
+ const presetFile = join(registry.resolvePath(workspace, input.projectPath), "export_presets.cfg");
192
+ let content;
193
+ try {
194
+ content = await readFile(presetFile, "utf8");
195
+ }
196
+ catch {
197
+ return [];
198
+ }
199
+ const presets = [];
200
+ const lines = content.split(/\r?\n/);
201
+ let currentPreset = null;
202
+ for (const line of lines) {
203
+ if (line.startsWith("[preset.")) {
204
+ if (currentPreset)
205
+ presets.push(currentPreset);
206
+ currentPreset = { name: "", platform: "", mode: "release" };
207
+ }
208
+ else if (currentPreset) {
209
+ if (line.startsWith("name=")) {
210
+ currentPreset.name = line.replace(/^name=/, "").replace(/"/g, "").trim();
211
+ }
212
+ else if (line.startsWith("platform=")) {
213
+ currentPreset.platform = line.replace(/^platform=/, "").replace(/"/g, "").trim();
214
+ }
215
+ else if (line.startsWith("export_debug=")) {
216
+ currentPreset.mode = line.includes("true") ? "debug" : "release";
217
+ }
218
+ }
219
+ }
220
+ if (currentPreset)
221
+ presets.push(currentPreset);
222
+ return presets;
223
+ }
@@ -0,0 +1,249 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { mkdir } from "node:fs/promises";
4
+ import { dirname, relative } from "node:path";
5
+ const execFileAsync = promisify(execFile);
6
+ // ─── Remote Scene Tree ────────────────────────────────────────────────────
7
+ export async function getRemoteSceneTree(input, bridgeClient) {
8
+ if (!bridgeClient.status)
9
+ throw new Error("Godot Editor Bridge is not connected.");
10
+ return bridgeClient.sendRequest("remote.get_scene_tree", {
11
+ maxDepth: input.maxDepth ?? 10,
12
+ });
13
+ }
14
+ export async function getRuntimeProperty(input, bridgeClient) {
15
+ if (!bridgeClient.status)
16
+ throw new Error("Godot Editor Bridge is not connected.");
17
+ return bridgeClient.sendRequest("remote.get_property", {
18
+ nodePath: input.nodePath,
19
+ property: input.property,
20
+ });
21
+ }
22
+ export async function getPerformanceMonitors(input, bridgeClient) {
23
+ if (!bridgeClient.status)
24
+ throw new Error("Godot Editor Bridge is not connected.");
25
+ return bridgeClient.sendRequest("remote.get_performance_monitors", {});
26
+ }
27
+ export function parseCsharpExceptions(logLines) {
28
+ const exceptions = [];
29
+ let currentEx = null;
30
+ const EXCEPTION_TYPES = [
31
+ "NullReferenceException", "InvalidCastException", "ObjectDisposedException",
32
+ "InvalidOperationException", "ArgumentException", "ArgumentNullException",
33
+ "NotImplementedException", "IndexOutOfRangeException", "KeyNotFoundException",
34
+ "IOException", "FileNotFoundException",
35
+ ];
36
+ for (const line of logLines) {
37
+ const trimmed = line.trim();
38
+ // Check inner exception prefix FIRST (before top-level exception detection)
39
+ if (currentEx && trimmed.startsWith("---> ")) {
40
+ const innerMatch = trimmed.slice(5).match(/(\w*Exception):\s*(.*)/);
41
+ if (innerMatch) {
42
+ currentEx.innerExceptions.push({
43
+ exceptionType: innerMatch[1],
44
+ message: innerMatch[2],
45
+ innerExceptions: [],
46
+ stackFrames: [],
47
+ firstOccurrence: new Date().toISOString(),
48
+ repeatCount: 1,
49
+ });
50
+ }
51
+ continue;
52
+ }
53
+ const isException = EXCEPTION_TYPES.some((t) => trimmed.includes(t)) || trimmed.includes("Exception:");
54
+ if (isException) {
55
+ if (currentEx)
56
+ exceptions.push(currentEx);
57
+ const typeMatch = trimmed.match(/(\w+Exception):\s*(.*)/);
58
+ currentEx = {
59
+ exceptionType: typeMatch?.[1] ?? "Exception",
60
+ message: typeMatch?.[2] ?? trimmed,
61
+ innerExceptions: [],
62
+ stackFrames: [],
63
+ firstOccurrence: new Date().toISOString(),
64
+ repeatCount: 1,
65
+ };
66
+ continue;
67
+ }
68
+ if (currentEx) {
69
+ const frameMatch = trimmed.match(/^at\s+(.*?)(?:\s+in\s+(.*?):line\s+(\d+))?$/);
70
+ if (frameMatch) {
71
+ currentEx.stackFrames.push({
72
+ method: frameMatch[1],
73
+ path: frameMatch[2],
74
+ line: frameMatch[3] ? Number(frameMatch[3]) : undefined,
75
+ });
76
+ }
77
+ }
78
+ }
79
+ if (currentEx)
80
+ exceptions.push(currentEx);
81
+ // Collapse repeated exceptions
82
+ const collapsed = [];
83
+ for (const ex of exceptions) {
84
+ const prev = collapsed.find((e) => e.exceptionType === ex.exceptionType && e.message === ex.message);
85
+ if (prev) {
86
+ prev.repeatCount++;
87
+ }
88
+ else {
89
+ collapsed.push(ex);
90
+ }
91
+ }
92
+ return collapsed;
93
+ }
94
+ export async function pressAction(input, bridgeClient) {
95
+ if (!bridgeClient.status)
96
+ throw new Error("Godot Editor Bridge is not connected for input simulation.");
97
+ const duration = Math.min(input.durationMs ?? 100, 2000);
98
+ await bridgeClient.sendRequest("input.press_action", { action: input.action, durationMs: duration });
99
+ return { sent: true };
100
+ }
101
+ export async function releaseAction(input, bridgeClient) {
102
+ if (!bridgeClient.status)
103
+ throw new Error("Godot Editor Bridge is not connected.");
104
+ await bridgeClient.sendRequest("input.release_action", { action: input.action });
105
+ return { sent: true };
106
+ }
107
+ export async function mouseClick(input, bridgeClient) {
108
+ if (!bridgeClient.status)
109
+ throw new Error("Godot Editor Bridge is not connected.");
110
+ await bridgeClient.sendRequest("input.mouse_click", { x: input.x, y: input.y, button: input.button ?? 1 });
111
+ return { sent: true };
112
+ }
113
+ export async function assertNodeExists(input, bridgeClient) {
114
+ if (!bridgeClient.status)
115
+ throw new Error("Godot Editor Bridge is not connected.");
116
+ try {
117
+ await bridgeClient.sendRequest("remote.get_node", { nodePath: input.nodePath });
118
+ return { passed: true, message: `Node '${input.nodePath}' exists.` };
119
+ }
120
+ catch {
121
+ return { passed: false, message: `Node '${input.nodePath}' does not exist.` };
122
+ }
123
+ }
124
+ export async function assertProperty(input, bridgeClient) {
125
+ if (!bridgeClient.status)
126
+ throw new Error("Godot Editor Bridge is not connected.");
127
+ const { value } = await getRuntimeProperty({ workspaceId: input.workspaceId, nodePath: input.nodePath, property: input.property }, bridgeClient);
128
+ let passed;
129
+ switch (input.comparison) {
130
+ case "eq":
131
+ passed = JSON.stringify(value) === JSON.stringify(input.expected);
132
+ break;
133
+ case "neq":
134
+ passed = JSON.stringify(value) !== JSON.stringify(input.expected);
135
+ break;
136
+ case "gt":
137
+ passed = value > input.expected;
138
+ break;
139
+ case "lt":
140
+ passed = value < input.expected;
141
+ break;
142
+ case "approx":
143
+ passed = Math.abs(value - input.expected) < 0.001;
144
+ break;
145
+ case "contains":
146
+ passed = String(value).includes(String(input.expected));
147
+ break;
148
+ case "exists":
149
+ passed = value !== null && value !== undefined;
150
+ break;
151
+ default: passed = false;
152
+ }
153
+ return {
154
+ passed,
155
+ actual: value,
156
+ expected: input.expected,
157
+ message: passed
158
+ ? `Property '${input.property}' assertion passed.`
159
+ : `Expected '${input.property}' to be ${input.comparison} '${JSON.stringify(input.expected)}', got '${JSON.stringify(value)}'.`,
160
+ };
161
+ }
162
+ export async function runTestSequence(registry, processManager, input, bridgeClient) {
163
+ const MAX_STEPS = 50;
164
+ const MAX_DURATION_MS = 30000;
165
+ const MAX_SCREENSHOTS = 5;
166
+ if (input.steps.length > MAX_STEPS) {
167
+ throw new Error(`Test sequence too long (max ${MAX_STEPS} steps).`);
168
+ }
169
+ const results = [];
170
+ let totalDuration = 0;
171
+ let screenshotCount = 0;
172
+ for (let i = 0; i < input.steps.length; i++) {
173
+ const step = input.steps[i];
174
+ switch (step.type) {
175
+ case "wait": {
176
+ const delay = Math.min(step.durationMs, 5000);
177
+ totalDuration += delay;
178
+ if (totalDuration > MAX_DURATION_MS) {
179
+ results.push({ step: i, type: step.type, passed: false, message: "Total duration limit exceeded." });
180
+ return { results };
181
+ }
182
+ await new Promise((r) => setTimeout(r, delay));
183
+ results.push({ step: i, type: step.type, passed: true, message: `Waited ${delay}ms.` });
184
+ break;
185
+ }
186
+ case "press_action": {
187
+ const r = await pressAction({ workspaceId: input.workspaceId, processId: input.processId, action: step.action, durationMs: step.durationMs }, bridgeClient).catch((err) => ({ sent: false, error: err.message }));
188
+ results.push({ step: i, type: step.type, passed: r.sent ?? false, message: `Press action '${step.action}'` });
189
+ break;
190
+ }
191
+ case "screenshot": {
192
+ if (screenshotCount >= MAX_SCREENSHOTS) {
193
+ results.push({ step: i, type: step.type, passed: false, message: "Screenshot limit exceeded." });
194
+ break;
195
+ }
196
+ screenshotCount++;
197
+ results.push({ step: i, type: step.type, passed: true, message: `Screenshot step queued to ${step.outputPath}.` });
198
+ break;
199
+ }
200
+ case "assert_node_exists": {
201
+ const r = await assertNodeExists({ workspaceId: input.workspaceId, nodePath: step.nodePath }, bridgeClient).catch(() => ({ passed: false, message: "Bridge error" }));
202
+ results.push({ step: i, type: step.type, passed: r.passed, message: r.message });
203
+ break;
204
+ }
205
+ case "assert_property": {
206
+ const r = await assertProperty({ workspaceId: input.workspaceId, nodePath: step.nodePath, property: step.property, comparison: step.comparison, expected: step.expected }, bridgeClient).catch((err) => ({ passed: false, actual: null, expected: step.expected, message: err.message }));
207
+ results.push({ step: i, type: step.type, passed: r.passed, message: r.message });
208
+ break;
209
+ }
210
+ case "assert_no_errors": {
211
+ const logs = processManager.getProcessLogs({ workspaceId: input.workspaceId, processId: input.processId, lines: 100 });
212
+ const hasErrors = logs.lines.some((l) => l.includes("ERROR:") || l.includes("Exception:"));
213
+ results.push({ step: i, type: step.type, passed: !hasErrors, message: hasErrors ? "Runtime errors detected." : "No runtime errors." });
214
+ break;
215
+ }
216
+ default: {
217
+ results.push({ step: i, type: step.type ?? "unknown", passed: false, message: "Unknown step type." });
218
+ }
219
+ }
220
+ }
221
+ return { results };
222
+ }
223
+ export async function exportGodotProject(registry, input) {
224
+ const workspace = registry.getWorkspace(input.workspaceId);
225
+ const projectDir = registry.resolvePath(workspace, input.projectPath);
226
+ const absoluteOutputPath = registry.resolvePath(workspace, input.outputPath);
227
+ await mkdir(dirname(absoluteOutputPath), { recursive: true });
228
+ const godotExe = process.env.GODOT_DOTNET_EXECUTABLE ?? process.env.GODOT_EXECUTABLE ?? "godot-mono";
229
+ const exportFlag = (input.mode ?? "debug") === "debug" ? "--export-debug" : "--export-release";
230
+ const args = ["--headless", "--path", projectDir, exportFlag, input.preset, absoluteOutputPath];
231
+ const start = Date.now();
232
+ try {
233
+ const { stdout, stderr } = await execFileAsync(godotExe, args, { cwd: projectDir });
234
+ return {
235
+ success: true,
236
+ outputFiles: [relative(workspace.root, absoluteOutputPath).replace(/\\/g, "/")],
237
+ durationMs: Date.now() - start,
238
+ output: (stdout + "\n" + stderr).slice(0, 1000),
239
+ };
240
+ }
241
+ catch (err) {
242
+ return {
243
+ success: false,
244
+ outputFiles: [],
245
+ durationMs: Date.now() - start,
246
+ output: (err.stdout ?? "") + "\n" + (err.stderr ?? err.message),
247
+ };
248
+ }
249
+ }
@@ -0,0 +1,183 @@
1
+ import { readFile, readdir } from "node:fs/promises";
2
+ import { execFile } from "node:child_process";
3
+ import { promisify } from "node:util";
4
+ import { join } from "node:path";
5
+ const execFileAsync = promisify(execFile);
6
+ export function parseGodotProjectFile(content) {
7
+ let configVersion = 5;
8
+ let name = "Godot Project";
9
+ let mainScene = "";
10
+ let renderer = "Forward+";
11
+ const features = [];
12
+ const autoloads = {};
13
+ const inputActions = [];
14
+ const nameMatch = content.match(/config\/name="([^"]+)"/);
15
+ if (nameMatch)
16
+ name = nameMatch[1];
17
+ const sceneMatch = content.match(/run\/main_scene="([^"]+)"/);
18
+ if (sceneMatch)
19
+ mainScene = sceneMatch[1];
20
+ const versionMatch = content.match(/config_version=(\d+)/);
21
+ if (versionMatch)
22
+ configVersion = Number(versionMatch[1]);
23
+ const rendererMatch = content.match(/rendering\/renderer\/rendering_method="([^"]+)"/);
24
+ if (rendererMatch)
25
+ renderer = rendererMatch[1];
26
+ const featureMatch = content.match(/config\/features=PackedStringArray\((.*?)\)/);
27
+ if (featureMatch) {
28
+ features.push(...featureMatch[1].split(",").map((f) => f.replace(/"/g, "").trim()));
29
+ }
30
+ // Parse [autoload] section
31
+ const autoloadSection = content.match(/\[autoload\]([\s\S]*?)(?=\n\[|$)/);
32
+ if (autoloadSection) {
33
+ const lines = autoloadSection[1].split("\n");
34
+ for (const line of lines) {
35
+ const kv = line.match(/^(\w+)="([^"]+)"/);
36
+ if (kv)
37
+ autoloads[kv[1]] = kv[2];
38
+ }
39
+ }
40
+ // Parse [input] section
41
+ const inputSection = content.match(/\[input\]([\s\S]*?)(?=\n\[|$)/);
42
+ if (inputSection) {
43
+ const lines = inputSection[1].split("\n");
44
+ for (const line of lines) {
45
+ const kv = line.match(/^(\w+)=\{/);
46
+ if (kv)
47
+ inputActions.push(kv[1]);
48
+ }
49
+ }
50
+ return { configVersion, name, mainScene, renderer, features, autoloads, inputActions };
51
+ }
52
+ export function parseGodotScene(content) {
53
+ const nodes = [];
54
+ const externalResources = [];
55
+ const signals = [];
56
+ const lines = content.split(/\r?\n/);
57
+ let currentElement = null;
58
+ for (const line of lines) {
59
+ const trimmed = line.trim();
60
+ if (trimmed.startsWith("[ext_resource")) {
61
+ const idMatch = trimmed.match(/id="([^"]+)"/);
62
+ const typeMatch = trimmed.match(/type="([^"]+)"/);
63
+ const pathMatch = trimmed.match(/path="([^"]+)"/);
64
+ if (idMatch && typeMatch && pathMatch) {
65
+ externalResources.push({ id: idMatch[1], type: typeMatch[1], path: pathMatch[1] });
66
+ }
67
+ }
68
+ else if (trimmed.startsWith("[node")) {
69
+ const nameMatch = trimmed.match(/name="([^"]+)"/);
70
+ const typeMatch = trimmed.match(/type="([^"]+)"/);
71
+ const parentMatch = trimmed.match(/parent="([^"]+)"/);
72
+ if (nameMatch) {
73
+ const node = {
74
+ name: nameMatch[1],
75
+ type: typeMatch ? typeMatch[1] : "Node",
76
+ parent: parentMatch ? parentMatch[1] : undefined,
77
+ properties: {},
78
+ };
79
+ nodes.push(node);
80
+ currentElement = { type: "node", data: node };
81
+ }
82
+ }
83
+ else if (trimmed.startsWith("[connection")) {
84
+ const signalMatch = trimmed.match(/signal="([^"]+)"/);
85
+ const fromMatch = trimmed.match(/from="([^"]+)"/);
86
+ const toMatch = trimmed.match(/to="([^"]+)"/);
87
+ const methodMatch = trimmed.match(/method="([^"]+)"/);
88
+ if (signalMatch && fromMatch && toMatch && methodMatch) {
89
+ signals.push({
90
+ signal: signalMatch[1],
91
+ from: fromMatch[1],
92
+ to: toMatch[1],
93
+ method: methodMatch[1],
94
+ });
95
+ }
96
+ }
97
+ else if (currentElement?.type === "node" && trimmed.includes("=")) {
98
+ const eqIdx = trimmed.indexOf("=");
99
+ const k = trimmed.slice(0, eqIdx).trim();
100
+ const v = trimmed.slice(eqIdx + 1).trim();
101
+ currentElement.data.properties[k] = v;
102
+ }
103
+ }
104
+ const rootNode = nodes.find((n) => !n.parent)?.name;
105
+ return { rootNode, nodes, externalResources, signals };
106
+ }
107
+ export async function detectGodotProject(registry, input) {
108
+ const workspace = registry.getWorkspace(input.workspaceId);
109
+ const targetDir = input.path
110
+ ? registry.resolvePath(workspace, input.path)
111
+ : workspace.root;
112
+ const projectGodotPath = join(targetDir, "project.godot");
113
+ let content = "";
114
+ try {
115
+ content = await readFile(projectGodotPath, "utf8");
116
+ }
117
+ catch {
118
+ return {
119
+ projectPath: input.path ?? ".",
120
+ godotProjectFound: false,
121
+ hasCSharp: false,
122
+ };
123
+ }
124
+ const parsed = parseGodotProjectFile(content);
125
+ let dirFiles = [];
126
+ try {
127
+ dirFiles = await readdir(targetDir);
128
+ }
129
+ catch { }
130
+ const hasCSharp = dirFiles.some((f) => f.endsWith(".csproj") || f.endsWith(".sln"));
131
+ return {
132
+ projectPath: input.path ?? ".",
133
+ godotProjectFound: true,
134
+ ...parsed,
135
+ hasCSharp,
136
+ };
137
+ }
138
+ export async function godotRun(registry, processManager, input) {
139
+ const workspace = registry.getWorkspace(input.workspaceId);
140
+ const projectDir = registry.resolvePath(workspace, input.projectPath);
141
+ const godotBin = process.env.GODOT_EXECUTABLE ?? "godot";
142
+ const args = ["--path", `"${projectDir}"`];
143
+ if (input.scenePath) {
144
+ const absScene = registry.resolvePath(workspace, input.scenePath);
145
+ args.push(`"${absScene}"`);
146
+ }
147
+ if (input.editor)
148
+ args.push("-e");
149
+ if (input.debug)
150
+ args.push("-d");
151
+ if (input.additionalArguments)
152
+ args.push(...input.additionalArguments);
153
+ const command = `${godotBin} ${args.join(" ")}`;
154
+ const result = processManager.startProcess({
155
+ workspaceId: input.workspaceId,
156
+ command,
157
+ workingDirectory: projectDir,
158
+ });
159
+ return {
160
+ processId: result.processId,
161
+ status: result.status,
162
+ detectedUrls: result.detectedUrls,
163
+ };
164
+ }
165
+ export async function inspectGodotScene(registry, input) {
166
+ const workspace = registry.getWorkspace(input.workspaceId);
167
+ const absolutePath = registry.resolvePath(workspace, input.scenePath);
168
+ if (input.scenePath.endsWith(".scn")) {
169
+ throw new Error("Binary .scn scenes are not supported. Use text .tscn format.");
170
+ }
171
+ const content = await readFile(absolutePath, "utf8");
172
+ const parsed = parseGodotScene(content);
173
+ const nodeTypes = Array.from(new Set(parsed.nodes.map((n) => n.type)));
174
+ return {
175
+ scenePath: input.scenePath,
176
+ rootNode: parsed.rootNode,
177
+ nodeCount: parsed.nodes.length,
178
+ nodeTypes,
179
+ nodes: parsed.nodes,
180
+ externalResources: parsed.externalResources,
181
+ signals: parsed.signals,
182
+ };
183
+ }