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,824 @@
1
+ import { readFile, writeFile, mkdir, readdir } from "node:fs/promises";
2
+ import { join, dirname, relative, basename } from "node:path";
3
+ import { existsSync } from "node:fs";
4
+ import { execFile } from "node:child_process";
5
+ import { promisify } from "node:util";
6
+ import { getBridgeClient } from "./godot-editor-bridge.js";
7
+ const execFileAsync = promisify(execFile);
8
+ export async function inspectGodotGdscriptEnvironment(registry, input) {
9
+ const workspace = registry.getWorkspace(input.workspaceId);
10
+ const root = registry.resolvePath(workspace, input.projectPath ?? ".");
11
+ const problems = [];
12
+ let godotExecutable = process.env.GODOT_EXECUTABLE || "godot";
13
+ let godotVersion = "";
14
+ try {
15
+ const { stdout } = await execFileAsync(godotExecutable, ["--version"]);
16
+ godotVersion = stdout.trim();
17
+ }
18
+ catch {
19
+ godotExecutable = "";
20
+ problems.push({
21
+ code: "GODOT_NOT_FOUND",
22
+ message: "Godot executable not found. Make sure 'godot' is in your PATH or set GODOT_EXECUTABLE.",
23
+ suggestedFix: "Set GODOT_EXECUTABLE environment variable.",
24
+ });
25
+ }
26
+ // Scan project files to check script counts
27
+ let usesGdscript = false;
28
+ let usesCsharp = false;
29
+ try {
30
+ const files = await scanWorkspaceDir(root);
31
+ usesGdscript = files.some(f => f.endsWith(".gd"));
32
+ usesCsharp = files.some(f => f.endsWith(".cs"));
33
+ }
34
+ catch { }
35
+ const bridge = getBridgeClient(input.workspaceId);
36
+ return {
37
+ godotExecutable: godotExecutable || undefined,
38
+ godotVersion: godotVersion || undefined,
39
+ editorBridgeConnected: bridge.status,
40
+ usesGdscript,
41
+ usesCsharp,
42
+ mixedLanguage: usesGdscript && usesCsharp,
43
+ problems,
44
+ };
45
+ }
46
+ // Helper to recursively list files in directory, ignoring build artifacts
47
+ async function scanWorkspaceDir(dir) {
48
+ const results = [];
49
+ async function scan(current) {
50
+ const entries = await readdir(current, { withFileTypes: true });
51
+ for (const entry of entries) {
52
+ const full = join(current, entry.name);
53
+ if (entry.name === ".godot" || entry.name === "bin" || entry.name === "obj" || entry.name === ".git") {
54
+ continue;
55
+ }
56
+ if (entry.isDirectory()) {
57
+ await scan(full);
58
+ }
59
+ else if (entry.isFile()) {
60
+ results.push(full);
61
+ }
62
+ }
63
+ }
64
+ await scan(dir);
65
+ return results;
66
+ }
67
+ export async function getGdscriptDiagnostics(registry, input) {
68
+ const workspace = registry.getWorkspace(input.workspaceId);
69
+ const projectRoot = registry.resolvePath(workspace, input.projectPath);
70
+ const errors = [];
71
+ const warnings = [];
72
+ const scriptFiles = [];
73
+ if (input.scriptPath) {
74
+ scriptFiles.push(registry.resolvePath(workspace, input.scriptPath));
75
+ }
76
+ else {
77
+ const all = await scanWorkspaceDir(projectRoot);
78
+ scriptFiles.push(...all.filter(f => f.endsWith(".gd")));
79
+ }
80
+ // Regex-based checks for common issues and syntax validation
81
+ for (const script of scriptFiles) {
82
+ const relPath = relative(workspace.root, script);
83
+ try {
84
+ const content = await readFile(script, "utf8");
85
+ const lines = content.split(/\r?\n/);
86
+ let insideMultilineComment = false;
87
+ for (let i = 0; i < lines.length; i++) {
88
+ const rawLine = lines[i];
89
+ const line = rawLine.trim();
90
+ const lineNum = i + 1;
91
+ if (line.startsWith('"""')) {
92
+ insideMultilineComment = !insideMultilineComment;
93
+ continue;
94
+ }
95
+ if (insideMultilineComment || line.startsWith("#") || !line) {
96
+ continue;
97
+ }
98
+ // Basic indentation checks (mixed tabs and spaces)
99
+ if (rawLine.startsWith(" ") && rawLine.startsWith("\t")) {
100
+ errors.push({
101
+ code: "MIXED_INDENTATION",
102
+ message: "Mixed tabs and spaces in indentation.",
103
+ path: relPath,
104
+ line: lineNum,
105
+ category: "parser",
106
+ });
107
+ }
108
+ // Godot 3 old keywords
109
+ if (line.includes("yield(")) {
110
+ errors.push({
111
+ code: "DEPRECATED_YIELD",
112
+ message: "Use of deprecated yield(). Use 'await' in Godot 4.",
113
+ path: relPath,
114
+ line: lineNum,
115
+ category: "parser",
116
+ });
117
+ }
118
+ if (line.startsWith("export var ")) {
119
+ errors.push({
120
+ code: "DEPRECATED_EXPORT",
121
+ message: "Use of deprecated 'export var'. Use '@export var' or '@export' in Godot 4.",
122
+ path: relPath,
123
+ line: lineNum,
124
+ category: "annotation",
125
+ });
126
+ }
127
+ if (line.startsWith("onready var ")) {
128
+ errors.push({
129
+ code: "DEPRECATED_ONREADY",
130
+ message: "Use of deprecated 'onready var'. Use '@onready var' in Godot 4.",
131
+ path: relPath,
132
+ line: lineNum,
133
+ category: "annotation",
134
+ });
135
+ }
136
+ // Typo in annotations
137
+ const annotationMatch = line.match(/^@(\w+)/);
138
+ if (annotationMatch) {
139
+ const name = annotationMatch[1];
140
+ const valid = ["export", "onready", "tool", "icon", "warning_ignore", "rpc", "export_range", "export_enum", "export_file", "export_dir", "export_multiline", "export_color_no_alpha", "export_node_path", "export_placeholder", "export_group", "export_subgroup", "export_category"];
141
+ if (!valid.includes(name)) {
142
+ warnings.push({
143
+ code: "UNKNOWN_ANNOTATION",
144
+ message: `Unknown or invalid annotation: @${name}`,
145
+ path: relPath,
146
+ line: lineNum,
147
+ category: "annotation",
148
+ });
149
+ }
150
+ }
151
+ }
152
+ }
153
+ catch (e) {
154
+ errors.push({
155
+ message: `Failed to read/parse script file: ${e.message}`,
156
+ path: relPath,
157
+ category: "parser",
158
+ });
159
+ }
160
+ }
161
+ // Headless Godot check if godot executable is available
162
+ const godotExecutable = process.env.GODOT_EXECUTABLE || "godot";
163
+ try {
164
+ const { stderr } = await execFileAsync(godotExecutable, ["--headless", "--path", projectRoot, "--validate-scripts"], { timeout: 3000 });
165
+ const output = stderr.toString();
166
+ const lines = output.split("\n");
167
+ for (const line of lines) {
168
+ if (line.includes("ERROR:") || line.includes("SCRIPT ERROR:")) {
169
+ errors.push({
170
+ message: line.trim(),
171
+ path: input.scriptPath || "project",
172
+ category: "parser",
173
+ });
174
+ }
175
+ }
176
+ }
177
+ catch { }
178
+ return { errors, warnings };
179
+ }
180
+ export async function inspectGdscript(registry, input) {
181
+ const workspace = registry.getWorkspace(input.workspaceId);
182
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
183
+ const content = await readFile(absPath, "utf8");
184
+ const lines = content.split(/\r?\n/);
185
+ let extendsType;
186
+ let className;
187
+ let toolScript = false;
188
+ const signals = [];
189
+ const exports = [];
190
+ const methods = [];
191
+ const nodePathReferences = [];
192
+ const preloadDependencies = [];
193
+ for (let i = 0; i < lines.length; i++) {
194
+ const line = lines[i].trim();
195
+ const lineNum = i + 1;
196
+ if (line.startsWith("extends ")) {
197
+ extendsType = line.substring(8).trim();
198
+ }
199
+ else if (line.startsWith("class_name ")) {
200
+ className = line.substring(11).trim();
201
+ }
202
+ else if (line.startsWith("@tool")) {
203
+ toolScript = true;
204
+ }
205
+ else if (line.startsWith("signal ")) {
206
+ const sigNameMatch = line.match(/^signal\s+(\w+)(?:\((.*?)\))?/);
207
+ if (sigNameMatch) {
208
+ const sigName = sigNameMatch[1];
209
+ const paramsStr = sigNameMatch[2] || "";
210
+ const parameters = paramsStr.split(",").map(p => {
211
+ const parts = p.trim().split(":");
212
+ return {
213
+ name: parts[0].trim(),
214
+ type: parts[1]?.trim(),
215
+ };
216
+ }).filter(p => p.name);
217
+ signals.push({ name: sigName, parameters });
218
+ }
219
+ }
220
+ else if (line.startsWith("@export") || line.startsWith("export ")) {
221
+ const nameMatch = line.match(/(?:var\s+)?(\w+)\s*(?::|=)/) || line.match(/var\s+(\w+)/);
222
+ if (nameMatch) {
223
+ const propName = nameMatch[1];
224
+ const typeMatch = line.match(/:([^\s=]+)/);
225
+ const valMatch = line.match(/=\s*(.+)$/);
226
+ const annotMatch = line.match(/^@export\w*/);
227
+ exports.push({
228
+ name: propName,
229
+ type: typeMatch ? typeMatch[1].trim() : undefined,
230
+ defaultValue: valMatch ? valMatch[1].trim() : undefined,
231
+ annotation: annotMatch ? annotMatch[0] : undefined,
232
+ });
233
+ }
234
+ }
235
+ else if (line.startsWith("func ") || line.startsWith("static func ")) {
236
+ const isStatic = line.startsWith("static ");
237
+ const methMatch = line.match(/func\s+(\w+)\s*\((.*?)\)(?:\s*->\s*([^\s:]+))?/);
238
+ if (methMatch) {
239
+ const methName = methMatch[1];
240
+ const params = methMatch[2].split(",").map(p => p.trim()).filter(p => p);
241
+ const retType = methMatch[3];
242
+ methods.push({
243
+ name: methName,
244
+ parameters: params,
245
+ returnType: retType,
246
+ static: isStatic,
247
+ line: lineNum,
248
+ });
249
+ }
250
+ }
251
+ // Node path references
252
+ const nodeMatch = line.match(/\$(?:"([^"]+)"|'([^']+)'|([a-zA-Z0-9_\/]+))/g);
253
+ if (nodeMatch) {
254
+ for (const m of nodeMatch) {
255
+ nodePathReferences.push({ path: m, line: lineNum });
256
+ }
257
+ }
258
+ // Preloads & loads
259
+ const preloadMatch = line.match(/(?:preload|load)\((?:"([^"]+)"|'([^']+)')\)/g);
260
+ if (preloadMatch) {
261
+ for (const m of preloadMatch) {
262
+ preloadDependencies.push({ path: m, line: lineNum });
263
+ }
264
+ }
265
+ }
266
+ return {
267
+ extendsType,
268
+ className,
269
+ toolScript,
270
+ signals,
271
+ exports,
272
+ methods,
273
+ nodePathReferences,
274
+ preloadDependencies,
275
+ };
276
+ }
277
+ export async function createGdscript(registry, input) {
278
+ const workspace = registry.getWorkspace(input.workspaceId);
279
+ const absPath = registry.resolvePath(workspace, input.outputPath);
280
+ if (existsSync(absPath)) {
281
+ throw new Error(`File already exists: ${input.outputPath}`);
282
+ }
283
+ await mkdir(dirname(absPath), { recursive: true });
284
+ const lines = [];
285
+ if (input.toolScript) {
286
+ lines.push("@tool");
287
+ }
288
+ if (input.className) {
289
+ lines.push(`class_name ${input.className}`);
290
+ }
291
+ lines.push(`extends ${input.baseType}`);
292
+ lines.push("");
293
+ if (input.template === "node") {
294
+ lines.push("func _ready() -> void:");
295
+ lines.push("\tpass");
296
+ lines.push("");
297
+ lines.push("func _process(delta: float) -> void:");
298
+ lines.push("\tpass");
299
+ }
300
+ else if (input.template === "editor_plugin") {
301
+ lines.push("func _enter_tree() -> void:");
302
+ lines.push("\tpass");
303
+ lines.push("");
304
+ lines.push("func _exit_tree() -> void:");
305
+ lines.push("\tpass");
306
+ }
307
+ await writeFile(absPath, lines.join("\n"), "utf8");
308
+ return { path: input.outputPath, created: true };
309
+ }
310
+ export async function attachGdscript(registry, input) {
311
+ const workspace = registry.getWorkspace(input.workspaceId);
312
+ const absScriptPath = registry.resolvePath(workspace, input.scriptPath);
313
+ const relScriptPath = relative(workspace.root, absScriptPath).replace(/\\/g, "/");
314
+ const resPath = `res://${relScriptPath}`;
315
+ const client = getBridgeClient(input.workspaceId);
316
+ const result = await client.sendRequest("node.attach_script", {
317
+ nodePath: input.nodePath,
318
+ scriptPath: resPath,
319
+ });
320
+ return { attached: !!result?.attached };
321
+ }
322
+ export async function detachGdscript(registry, input) {
323
+ const client = getBridgeClient(input.workspaceId);
324
+ const result = await client.sendRequest("node.detach_script", {
325
+ nodePath: input.nodePath,
326
+ });
327
+ return { detached: !!result?.detached };
328
+ }
329
+ export async function createGdscriptSignal(registry, input) {
330
+ const workspace = registry.getWorkspace(input.workspaceId);
331
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
332
+ const content = await readFile(absPath, "utf8");
333
+ // Semantic check to avoid duplicates
334
+ if (content.includes(`signal ${input.signalName}`)) {
335
+ throw new Error(`Signal ${input.signalName} already exists in script.`);
336
+ }
337
+ const lines = content.split(/\r?\n/);
338
+ const paramsStr = (input.parameters ?? []).map(p => p.type ? `${p.name}: ${p.type}` : p.name).join(", ");
339
+ const signalLine = paramsStr ? `signal ${input.signalName}(${paramsStr})` : `signal ${input.signalName}`;
340
+ // Insert signals right after class_name or extends
341
+ let insertIdx = 0;
342
+ for (let i = 0; i < lines.length; i++) {
343
+ if (lines[i].startsWith("extends ") || lines[i].startsWith("class_name ") || lines[i].startsWith("@tool")) {
344
+ insertIdx = i + 1;
345
+ }
346
+ }
347
+ lines.splice(insertIdx, 0, signalLine);
348
+ await writeFile(absPath, lines.join("\n"), "utf8");
349
+ return { success: true };
350
+ }
351
+ export async function createGdscriptSignalHandler(registry, input) {
352
+ const workspace = registry.getWorkspace(input.workspaceId);
353
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
354
+ const content = await readFile(absPath, "utf8");
355
+ if (content.includes(`func ${input.methodName}`)) {
356
+ throw new Error(`Method ${input.methodName} already exists in script.`);
357
+ }
358
+ const lines = content.split(/\r?\n/);
359
+ const paramsStr = (input.parameters ?? []).map(p => p.type ? `${p.name}: ${p.type}` : p.name).join(", ");
360
+ const methodLines = [
361
+ "",
362
+ `func ${input.methodName}(${paramsStr}) -> void:`,
363
+ "\tpass",
364
+ ];
365
+ lines.push(...methodLines);
366
+ await writeFile(absPath, lines.join("\n"), "utf8");
367
+ return { success: true };
368
+ }
369
+ // ─── Global Classes & Autoloads ──────────────────────────────────────────────
370
+ export async function getGlobalClasses(registry, input) {
371
+ const workspace = registry.getWorkspace(input.workspaceId);
372
+ const files = await scanWorkspaceDir(workspace.root);
373
+ const gdscriptFiles = files.filter(f => f.endsWith(".gd"));
374
+ const classes = [];
375
+ for (const file of gdscriptFiles) {
376
+ const content = await readFile(file, "utf8");
377
+ const classMatch = content.match(/^class_name\s+(\w+)/m);
378
+ if (classMatch) {
379
+ const extendsMatch = content.match(/^extends\s+(\w+)/m);
380
+ classes.push({
381
+ className: classMatch[1],
382
+ baseType: extendsMatch ? extendsMatch[1] : "RefCounted",
383
+ scriptPath: relative(workspace.root, file).replace(/\\/g, "/"),
384
+ });
385
+ }
386
+ }
387
+ return classes;
388
+ }
389
+ export async function addClassName(registry, input) {
390
+ const workspace = registry.getWorkspace(input.workspaceId);
391
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
392
+ const content = await readFile(absPath, "utf8");
393
+ if (content.includes("class_name ")) {
394
+ throw new Error("Script already has a class_name defined.");
395
+ }
396
+ const lines = content.split(/\r?\n/);
397
+ let insertIdx = 0;
398
+ for (let i = 0; i < lines.length; i++) {
399
+ if (lines[i].startsWith("extends ") || lines[i].startsWith("@tool")) {
400
+ insertIdx = i + 1;
401
+ }
402
+ }
403
+ lines.splice(insertIdx, 0, `class_name ${input.className}`);
404
+ await writeFile(absPath, lines.join("\n"), "utf8");
405
+ return { success: true };
406
+ }
407
+ export async function removeClassName(registry, input) {
408
+ const workspace = registry.getWorkspace(input.workspaceId);
409
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
410
+ const content = await readFile(absPath, "utf8");
411
+ const classMatch = content.match(/^class_name\s+(\w+)/m);
412
+ const warnings = [];
413
+ if (classMatch) {
414
+ warnings.push(`References to global class '${classMatch[1]}' in other scenes/scripts may be broken.`);
415
+ }
416
+ const lines = content.split(/\r?\n/).filter(l => !l.startsWith("class_name "));
417
+ await writeFile(absPath, lines.join("\n"), "utf8");
418
+ return { success: true, warnings };
419
+ }
420
+ export async function addGdscriptAutoload(registry, input) {
421
+ const workspace = registry.getWorkspace(input.workspaceId);
422
+ const godotFile = join(workspace.root, "project.godot");
423
+ if (!existsSync(godotFile)) {
424
+ throw new Error("No project.godot found at workspace root.");
425
+ }
426
+ const content = await readFile(godotFile, "utf8");
427
+ const lines = content.split(/\r?\n/);
428
+ let autoloadSecIdx = lines.findIndex(l => l.trim() === "[autoload]");
429
+ const relScriptPath = relative(workspace.root, registry.resolvePath(workspace, input.scriptPath)).replace(/\\/g, "/");
430
+ const autoloadLine = `${input.singletonName}="*res://${relScriptPath}"`;
431
+ if (autoloadSecIdx === -1) {
432
+ lines.push("", "[autoload]", autoloadLine);
433
+ }
434
+ else {
435
+ // Check if duplicate singleton name
436
+ const exists = lines.some(l => l.startsWith(`${input.singletonName}=`));
437
+ if (exists) {
438
+ throw new Error(`Autoload singleton '${input.singletonName}' already exists.`);
439
+ }
440
+ lines.splice(autoloadSecIdx + 1, 0, autoloadLine);
441
+ }
442
+ await writeFile(godotFile, lines.join("\n"), "utf8");
443
+ return { success: true };
444
+ }
445
+ export async function getAutoloadUsage(registry, input) {
446
+ const workspace = registry.getWorkspace(input.workspaceId);
447
+ const files = await scanWorkspaceDir(workspace.root);
448
+ const scriptFiles = files.filter(f => f.endsWith(".gd") || f.endsWith(".cs"));
449
+ const results = [];
450
+ for (const file of scriptFiles) {
451
+ const content = await readFile(file, "utf8");
452
+ const lines = content.split(/\r?\n/);
453
+ const relPath = relative(workspace.root, file);
454
+ for (let i = 0; i < lines.length; i++) {
455
+ const line = lines[i];
456
+ if (line.includes(input.singletonName)) {
457
+ results.push({
458
+ path: relPath,
459
+ line: i + 1,
460
+ text: line.trim(),
461
+ });
462
+ }
463
+ }
464
+ }
465
+ return results;
466
+ }
467
+ // ─── Tool Scripts & Plugins ──────────────────────────────────────────────────
468
+ export async function inspectToolScript(registry, input) {
469
+ const workspace = registry.getWorkspace(input.workspaceId);
470
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
471
+ const content = await readFile(absPath, "utf8");
472
+ const toolScript = content.includes("@tool");
473
+ const methods = [];
474
+ const warnings = [];
475
+ if (toolScript) {
476
+ // Extract methods that execute editor-side
477
+ const lines = content.split(/\r?\n/);
478
+ for (const line of lines) {
479
+ const m = line.match(/func\s+(\w+)/);
480
+ if (m)
481
+ methods.push(m[1]);
482
+ }
483
+ warnings.push("Tool scripts run inside the editor. Avoid modifying files or running subprocesses in tool script code.");
484
+ }
485
+ return { toolScript, methods, warnings };
486
+ }
487
+ export async function createEditorPlugin(registry, input) {
488
+ const workspace = registry.getWorkspace(input.workspaceId);
489
+ const addonDir = join(workspace.root, "addons", input.pluginName);
490
+ await mkdir(addonDir, { recursive: true });
491
+ const cfgContent = `[plugin]
492
+
493
+ name="${input.pluginName}"
494
+ description="${input.description ?? "A Auvrynt generated editor plugin"}"
495
+ author="${input.author ?? "Auvrynt Agent"}"
496
+ version="${input.version ?? "1.0.0"}"
497
+ script="plugin.gd"
498
+ `;
499
+ const gdContent = `@tool
500
+ extends EditorPlugin
501
+
502
+ func _enter_tree() -> void:
503
+ \tprint("[${input.pluginName}] Plugin enabled.")
504
+
505
+ func _exit_tree() -> void:
506
+ \tprint("[${input.pluginName}] Plugin disabled.")
507
+ `;
508
+ const cfgPath = join(addonDir, "plugin.cfg");
509
+ const gdPath = join(addonDir, "plugin.gd");
510
+ await writeFile(cfgPath, cfgContent, "utf8");
511
+ await writeFile(gdPath, gdContent, "utf8");
512
+ return {
513
+ success: true,
514
+ filesCreated: [
515
+ relative(workspace.root, cfgPath).replace(/\\/g, "/"),
516
+ relative(workspace.root, gdPath).replace(/\\/g, "/"),
517
+ ],
518
+ };
519
+ }
520
+ // ─── Dependencies & Node Paths ────────────────────────────────────────────────
521
+ export async function getGdscriptDependencies(registry, input) {
522
+ const workspace = registry.getWorkspace(input.workspaceId);
523
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
524
+ const content = await readFile(absPath, "utf8");
525
+ const results = [];
526
+ const lines = content.split(/\r?\n/);
527
+ for (const line of lines) {
528
+ const preload = line.match(/preload\((?:"([^"]+)"|'([^']+)')\)/);
529
+ if (preload) {
530
+ const p = preload[1] || preload[2];
531
+ results.push({
532
+ path: p,
533
+ loadType: "preload",
534
+ exists: existsSync(join(workspace.root, p.replace("res://", ""))),
535
+ });
536
+ }
537
+ const loadMatch = line.match(/load\((?:"([^"]+)"|'([^']+)')\)/);
538
+ if (loadMatch) {
539
+ const p = loadMatch[1] || loadMatch[2];
540
+ results.push({
541
+ path: p,
542
+ loadType: "load",
543
+ exists: existsSync(join(workspace.root, p.replace("res://", ""))),
544
+ });
545
+ }
546
+ }
547
+ return results;
548
+ }
549
+ export async function findCyclicScriptDependencies(registry, input) {
550
+ const workspace = registry.getWorkspace(input.workspaceId);
551
+ const files = await scanWorkspaceDir(workspace.root);
552
+ const scriptFiles = files.filter(f => f.endsWith(".gd"));
553
+ const graph = new Map();
554
+ for (const file of scriptFiles) {
555
+ const relPath = relative(workspace.root, file).replace(/\\/g, "/");
556
+ const content = await readFile(file, "utf8");
557
+ const preloads = [];
558
+ const lines = content.split(/\r?\n/);
559
+ for (const line of lines) {
560
+ const preload = line.match(/preload\((?:"([^"]+)"|'([^']+)')\)/);
561
+ if (preload) {
562
+ const p = preload[1] || preload[2];
563
+ preloads.push(p.replace("res://", ""));
564
+ }
565
+ }
566
+ graph.set(relPath, preloads);
567
+ }
568
+ // Tarjan's or simple DFS cycle detection
569
+ const cycles = [];
570
+ const visited = new Set();
571
+ const stack = new Set();
572
+ function dfs(node, currentPath) {
573
+ visited.add(node);
574
+ stack.add(node);
575
+ currentPath.push(node);
576
+ const neighbors = graph.get(node) ?? [];
577
+ for (const neighbor of neighbors) {
578
+ if (stack.has(neighbor)) {
579
+ const cycleStart = currentPath.indexOf(neighbor);
580
+ if (cycleStart !== -1) {
581
+ cycles.push(currentPath.slice(cycleStart));
582
+ }
583
+ }
584
+ else if (!visited.has(neighbor)) {
585
+ dfs(neighbor, [...currentPath]);
586
+ }
587
+ }
588
+ stack.delete(node);
589
+ }
590
+ for (const node of graph.keys()) {
591
+ if (!visited.has(node)) {
592
+ dfs(node, []);
593
+ }
594
+ }
595
+ return cycles;
596
+ }
597
+ export async function getGdscriptNodeReferences(registry, input) {
598
+ const workspace = registry.getWorkspace(input.workspaceId);
599
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
600
+ const content = await readFile(absPath, "utf8");
601
+ const lines = content.split(/\r?\n/);
602
+ const results = [];
603
+ for (let i = 0; i < lines.length; i++) {
604
+ const line = lines[i];
605
+ const lineNum = i + 1;
606
+ // $Node or $"Path"
607
+ const dollar = line.match(/\$(?:"([^"]+)"|'([^']+)'|([a-zA-Z0-9_\/]+))/);
608
+ if (dollar) {
609
+ const p = dollar[1] || dollar[2] || dollar[3];
610
+ results.push({
611
+ path: p,
612
+ style: p.startsWith("%") ? "unique" : "dollar",
613
+ line: lineNum,
614
+ });
615
+ }
616
+ // get_node()
617
+ const get_node = line.match(/get_node\((?:"([^"]+)"|'([^']+)')\)/);
618
+ if (get_node) {
619
+ results.push({
620
+ path: get_node[1] || get_node[2],
621
+ style: "get_node",
622
+ line: lineNum,
623
+ });
624
+ }
625
+ }
626
+ return results;
627
+ }
628
+ // ─── Lifecycle & Await Heuristics ─────────────────────────────────────────────
629
+ export async function getGdscriptLifecycleMethods(registry, input) {
630
+ const workspace = registry.getWorkspace(input.workspaceId);
631
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
632
+ const content = await readFile(absPath, "utf8");
633
+ const lines = content.split(/\r?\n/);
634
+ const methods = ["_init", "_enter_tree", "_ready", "_process", "_physics_process", "_input", "_unhandled_input", "_exit_tree", "_draw"];
635
+ const results = [];
636
+ for (let i = 0; i < lines.length; i++) {
637
+ const line = lines[i].trim();
638
+ const lineNum = i + 1;
639
+ const m = line.match(/func\s+(_\w+)/);
640
+ if (m && methods.includes(m[1])) {
641
+ const name = m[1];
642
+ const warnings = [];
643
+ // Check delta usage or heavy logic in processes
644
+ if (name === "_process" || name === "_physics_process") {
645
+ if (!line.includes("delta")) {
646
+ warnings.push(`Lifecycle method ${name} does not reference 'delta'.`);
647
+ }
648
+ }
649
+ results.push({ method: name, line: lineNum, warnings });
650
+ }
651
+ }
652
+ return results;
653
+ }
654
+ export async function inspectGdscriptAwaitUsage(registry, input) {
655
+ const workspace = registry.getWorkspace(input.workspaceId);
656
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
657
+ const content = await readFile(absPath, "utf8");
658
+ const lines = content.split(/\r?\n/);
659
+ const results = [];
660
+ for (let i = 0; i < lines.length; i++) {
661
+ const line = lines[i].trim();
662
+ const lineNum = i + 1;
663
+ const m = line.match(/await\s+(.+)$/);
664
+ if (m) {
665
+ const expr = m[1];
666
+ let warning;
667
+ if (expr.includes("get_tree().create_timer") && expr.includes("timeout")) {
668
+ // Safe timer await
669
+ }
670
+ else if (!expr.includes(".") && !expr.includes("(")) {
671
+ warning = "Awaiting a symbol directly. Ensure it resolves to a signal or a Callable.";
672
+ }
673
+ results.push({ line: lineNum, expression: expr, warning });
674
+ }
675
+ }
676
+ return results;
677
+ }
678
+ export async function analyzeGdscriptTyping(registry, input) {
679
+ const workspace = registry.getWorkspace(input.workspaceId);
680
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
681
+ const content = await readFile(absPath, "utf8");
682
+ const lines = content.split(/\r?\n/);
683
+ let vars = 0;
684
+ let typedVars = 0;
685
+ let params = 0;
686
+ let typedParams = 0;
687
+ let returns = 0;
688
+ let typedReturns = 0;
689
+ for (const line of lines) {
690
+ const trimmed = line.trim();
691
+ // Variable check
692
+ if (trimmed.startsWith("var ") || trimmed.startsWith("@onready var ") || trimmed.startsWith("@export var ")) {
693
+ vars++;
694
+ if (trimmed.includes(":") || trimmed.includes(":=")) {
695
+ typedVars++;
696
+ }
697
+ }
698
+ // Function parameter & return check
699
+ if (trimmed.startsWith("func ")) {
700
+ returns++;
701
+ if (trimmed.includes("->")) {
702
+ typedReturns++;
703
+ }
704
+ const paramMatch = trimmed.match(/\((.*?)\)/);
705
+ if (paramMatch && paramMatch[1]) {
706
+ const pList = paramMatch[1].split(",").map(p => p.trim());
707
+ for (const p of pList) {
708
+ params++;
709
+ if (p.includes(":")) {
710
+ typedParams++;
711
+ }
712
+ }
713
+ }
714
+ }
715
+ }
716
+ return {
717
+ typedVariablesPercentage: vars ? Math.round((typedVars / vars) * 100) : 100,
718
+ typedParametersPercentage: params ? Math.round((typedParams / params) * 100) : 100,
719
+ typedReturnsPercentage: returns ? Math.round((typedReturns / returns) * 100) : 100,
720
+ };
721
+ }
722
+ // ─── Debugger & Testing ───────────────────────────────────────────────────────
723
+ export async function formatGdscript(registry, input) {
724
+ const workspace = registry.getWorkspace(input.workspaceId);
725
+ const file = input.scriptPath ? registry.resolvePath(workspace, input.scriptPath) : workspace.root;
726
+ // We check if 'gdformat' (official gdscript tool) is installed in PATH.
727
+ try {
728
+ const args = input.verifyOnly ? ["--check", file] : [file];
729
+ await execFileAsync("gdformat", args);
730
+ return { formatted: !input.verifyOnly, verified: true };
731
+ }
732
+ catch {
733
+ // If not installed, we format simple indentations or fallback gracefully without raising an error
734
+ return { formatted: false, verified: false };
735
+ }
736
+ }
737
+ export async function detectGdscriptTests(registry, input) {
738
+ const workspace = registry.getWorkspace(input.workspaceId);
739
+ const projectRoot = registry.resolvePath(workspace, input.projectPath);
740
+ const testDirectories = [];
741
+ const testScripts = [];
742
+ // Look for GUT (Godot Unit Testing) addon
743
+ const gutAddon = join(projectRoot, "addons", "gut");
744
+ const framework = existsSync(gutAddon) ? "gut" : "none";
745
+ const allFiles = await scanWorkspaceDir(projectRoot);
746
+ for (const f of allFiles) {
747
+ if (basename(f).startsWith("test_") && f.endsWith(".gd")) {
748
+ testScripts.push(relative(workspace.root, f).replace(/\\/g, "/"));
749
+ }
750
+ }
751
+ return { framework, testDirectories, testScripts };
752
+ }
753
+ export async function runGdscriptTests(registry, input) {
754
+ const workspace = registry.getWorkspace(input.workspaceId);
755
+ const projectRoot = registry.resolvePath(workspace, input.projectPath);
756
+ const godotExecutable = process.env.GODOT_EXECUTABLE || "godot";
757
+ // Execute test runner headlessly. For GUT, typical CLI run:
758
+ // godot --headless --path <projectRoot> -s addons/gut/gut_cmdline.gd
759
+ const args = ["--headless", "--path", projectRoot, "-s", "addons/gut/gut_cmdline.gd"];
760
+ if (input.testPath) {
761
+ args.push(`-gselect=${input.testPath}`);
762
+ }
763
+ const start = performance.now();
764
+ try {
765
+ const { stdout, stderr } = await execFileAsync(godotExecutable, args, { timeout: 30000 });
766
+ const logs = stdout.toString() + stderr.toString();
767
+ // Parse pass/fail counts from GUT stdout output
768
+ const passMatch = logs.match(/(\d+) passed/);
769
+ const failMatch = logs.match(/(\d+) failed/);
770
+ return {
771
+ passed: passMatch ? Number(passMatch[1]) : 0,
772
+ failed: failMatch ? Number(failMatch[1]) : 0,
773
+ skipped: 0,
774
+ duration: Math.round(performance.now() - start),
775
+ logs,
776
+ };
777
+ }
778
+ catch (e) {
779
+ return {
780
+ passed: 0,
781
+ failed: 0,
782
+ skipped: 0,
783
+ duration: Math.round(performance.now() - start),
784
+ logs: `Failed to execute test suite: ${e.message}`,
785
+ };
786
+ }
787
+ }
788
+ export async function reloadGdscript(registry, input) {
789
+ const client = getBridgeClient(input.workspaceId);
790
+ const res = await client.sendRequest("gdscript.reload", {
791
+ scriptPath: input.scriptPath,
792
+ });
793
+ return { reloaded: !!res?.reloaded };
794
+ }
795
+ // ─── Debugger breakpoint/step stubs ──────────────────────────────────────────
796
+ export async function setBreakpoint(registry, input) {
797
+ const client = getBridgeClient(input.workspaceId);
798
+ await client.sendRequest("debugger.set_breakpoint", {
799
+ scriptPath: input.scriptPath,
800
+ line: input.line,
801
+ });
802
+ return { success: true };
803
+ }
804
+ export async function removeBreakpoint(registry, input) {
805
+ const client = getBridgeClient(input.workspaceId);
806
+ await client.sendRequest("debugger.remove_breakpoint", {
807
+ scriptPath: input.scriptPath,
808
+ line: input.line,
809
+ });
810
+ return { success: true };
811
+ }
812
+ // ─── Language Server Protocol stubs (Editor must be active) ───────────────────
813
+ export async function lspFindSymbol(registry, input) {
814
+ const client = getBridgeClient(input.workspaceId);
815
+ return client.sendRequest("lsp.find_symbol", { symbol: input.symbol });
816
+ }
817
+ export async function lspGetDefinition(registry, input) {
818
+ const client = getBridgeClient(input.workspaceId);
819
+ return client.sendRequest("lsp.get_definition", {
820
+ scriptPath: input.scriptPath,
821
+ line: input.line,
822
+ character: input.character,
823
+ });
824
+ }