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.
- package/LICENSE +21 -0
- package/README.md +239 -0
- package/dist/blender-client.js +109 -0
- package/dist/blender-tools.js +930 -0
- package/dist/cli.js +370 -0
- package/dist/config.js +211 -0
- package/dist/connection-status.js +91 -0
- package/dist/db/client.js +22 -0
- package/dist/db/schema.js +29 -0
- package/dist/dotnet-tools.js +223 -0
- package/dist/git-worktrees.js +134 -0
- package/dist/git.js +41 -0
- package/dist/godot-animation-tilemap.js +82 -0
- package/dist/godot-csharp-build.js +93 -0
- package/dist/godot-csharp-project.js +157 -0
- package/dist/godot-csharp-runner.js +146 -0
- package/dist/godot-csharp-semantic.js +161 -0
- package/dist/godot-csharp-validate.js +71 -0
- package/dist/godot-dotnet-env.js +169 -0
- package/dist/godot-editor-bridge.js +140 -0
- package/dist/godot-gdscript.js +824 -0
- package/dist/godot-project-settings.js +223 -0
- package/dist/godot-runtime-testing.js +249 -0
- package/dist/godot-tools.js +183 -0
- package/dist/image-tools.js +157 -0
- package/dist/logger.js +76 -0
- package/dist/oauth-provider.js +266 -0
- package/dist/pi-tools.js +81 -0
- package/dist/processes.js +218 -0
- package/dist/review-checkpoints.js +142 -0
- package/dist/roots.js +53 -0
- package/dist/search-discovery.js +271 -0
- package/dist/serena-manager.js +443 -0
- package/dist/serena-tools.js +411 -0
- package/dist/server.js +2835 -0
- package/dist/skills.js +45 -0
- package/dist/ui/.vite/manifest.json +2520 -0
- package/dist/ui/assets/abap-CLvhMVsD.js +1 -0
- package/dist/ui/assets/actionscript-3--17pq3dv.js +1 -0
- package/dist/ui/assets/ada-C5qYipkI.js +1 -0
- package/dist/ui/assets/andromeeda-vGVdxbeo.js +1 -0
- package/dist/ui/assets/angular-html-BJqQFYI6.js +1 -0
- package/dist/ui/assets/angular-ts-CMJECO0Y.js +1 -0
- package/dist/ui/assets/apache-U0d_L8uA.js +1 -0
- package/dist/ui/assets/apex-CGTLDQj6.js +1 -0
- package/dist/ui/assets/apl-DWeXpBBr.js +1 -0
- package/dist/ui/assets/applescript-CCn79oCD.js +1 -0
- package/dist/ui/assets/ara-4CJ0cIlV.js +1 -0
- package/dist/ui/assets/asciidoc-DE70LPWp.js +1 -0
- package/dist/ui/assets/asm-Cmm7eHzH.js +1 -0
- package/dist/ui/assets/astro-CLbttLOq.js +1 -0
- package/dist/ui/assets/aurora-x-CDeNXAV0.js +1 -0
- package/dist/ui/assets/awk-BWXHIvNe.js +1 -0
- package/dist/ui/assets/ayu-dark-DluEY0Gj.js +1 -0
- package/dist/ui/assets/ayu-light-C3h-C4tm.js +1 -0
- package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +1 -0
- package/dist/ui/assets/ballerina-B7ZEbQpA.js +1 -0
- package/dist/ui/assets/bat-Bo4NYOV-.js +1 -0
- package/dist/ui/assets/beancount-D-usSTwE.js +1 -0
- package/dist/ui/assets/berry-DKpUyyne.js +1 -0
- package/dist/ui/assets/bibtex-Ci_nEsc7.js +1 -0
- package/dist/ui/assets/bicep-CUHmPFLl.js +1 -0
- package/dist/ui/assets/bird2-C2hNVINV.js +1 -0
- package/dist/ui/assets/blade-BOzY0P2V.js +1 -0
- package/dist/ui/assets/bsl-BkkzgIyY.js +1 -0
- package/dist/ui/assets/c-BG-8uJvh.js +1 -0
- package/dist/ui/assets/c3-CnJL0r0V.js +1 -0
- package/dist/ui/assets/cadence-CQ2zXKGN.js +1 -0
- package/dist/ui/assets/cairo-DLTphjLi.js +1 -0
- package/dist/ui/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
- package/dist/ui/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
- package/dist/ui/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
- package/dist/ui/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
- package/dist/ui/assets/clarity-SemFz856.js +1 -0
- package/dist/ui/assets/clojure-DqKBuwfJ.js +1 -0
- package/dist/ui/assets/cmake-Bj61d0ZC.js +1 -0
- package/dist/ui/assets/cobol-I_17IuGe.js +1 -0
- package/dist/ui/assets/codeowners-C8r90Shi.js +1 -0
- package/dist/ui/assets/codeql-oeQT6MSM.js +1 -0
- package/dist/ui/assets/coffee-C0B8hmok.js +1 -0
- package/dist/ui/assets/common-lisp-Cv5bFMCO.js +1 -0
- package/dist/ui/assets/coq-BrsZFFmf.js +1 -0
- package/dist/ui/assets/cpp-DDJXt6Vs.js +1 -0
- package/dist/ui/assets/crystal-Bexqace6.js +1 -0
- package/dist/ui/assets/csharp-Ct8U2NOr.js +1 -0
- package/dist/ui/assets/css-DSQhw_9R.js +1 -0
- package/dist/ui/assets/csv-Dx-8-gkx.js +1 -0
- package/dist/ui/assets/cue-CE9AQfxI.js +1 -0
- package/dist/ui/assets/cypher-ClKdZ_lG.js +1 -0
- package/dist/ui/assets/d-qD-0Kul2.js +1 -0
- package/dist/ui/assets/dark-plus-Cs2F2srj.js +1 -0
- package/dist/ui/assets/dart-DkHntEIa.js +1 -0
- package/dist/ui/assets/dax-BkyTk9wS.js +1 -0
- package/dist/ui/assets/desktop-Dlh5hvp9.js +1 -0
- package/dist/ui/assets/diff-woXpYk--.js +1 -0
- package/dist/ui/assets/docker-IyjqRm3v.js +1 -0
- package/dist/ui/assets/dotenv-_5a1GRtc.js +1 -0
- package/dist/ui/assets/dracula-BHWKrbxM.js +1 -0
- package/dist/ui/assets/dracula-soft-5eyTD99u.js +1 -0
- package/dist/ui/assets/dream-maker-DW3nJb8Q.js +1 -0
- package/dist/ui/assets/edge-Z8YYkHOr.js +1 -0
- package/dist/ui/assets/elixir-CG9uKtAF.js +1 -0
- package/dist/ui/assets/elm-GfWG2IfT.js +1 -0
- package/dist/ui/assets/emacs-lisp-C9PiwqqW.js +1 -0
- package/dist/ui/assets/erb-xe89e73J.js +1 -0
- package/dist/ui/assets/erlang-Cphh6RMH.js +1 -0
- package/dist/ui/assets/everforest-dark-sB-x3p7T.js +1 -0
- package/dist/ui/assets/everforest-light-Df2xbC6M.js +1 -0
- package/dist/ui/assets/fennel-DQxkIbk2.js +1 -0
- package/dist/ui/assets/fish-BJitypiv.js +1 -0
- package/dist/ui/assets/fluent-C03EYrpw.js +1 -0
- package/dist/ui/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
- package/dist/ui/assets/fortran-free-form-CYNrtFtB.js +1 -0
- package/dist/ui/assets/fsharp-D13ZGOAj.js +1 -0
- package/dist/ui/assets/gdresource-C0sCabJj.js +1 -0
- package/dist/ui/assets/gdscript-Cp2uCuqX.js +1 -0
- package/dist/ui/assets/gdshader-CBce3t8t.js +1 -0
- package/dist/ui/assets/genie-CV2tkWYe.js +1 -0
- package/dist/ui/assets/gherkin-DExj1W_8.js +1 -0
- package/dist/ui/assets/git-commit-BSykSTBG.js +1 -0
- package/dist/ui/assets/git-rebase-CoTL_uSE.js +1 -0
- package/dist/ui/assets/github-dark-C-LZuMrd.js +1 -0
- package/dist/ui/assets/github-dark-default-DXG-b-1a.js +1 -0
- package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
- package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
- package/dist/ui/assets/github-light-EUqPIrTm.js +1 -0
- package/dist/ui/assets/github-light-default-BXViO-2h.js +1 -0
- package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +1 -0
- package/dist/ui/assets/gleam-CSRkHgEL.js +1 -0
- package/dist/ui/assets/glimmer-js-DAn4UCSu.js +1 -0
- package/dist/ui/assets/glimmer-ts-Tjyi6Gh5.js +1 -0
- package/dist/ui/assets/glsl-CtTDZoqR.js +1 -0
- package/dist/ui/assets/gn-ilITqXS6.js +1 -0
- package/dist/ui/assets/gnuplot-7GGW24-e.js +1 -0
- package/dist/ui/assets/go-BJwz_mda.js +1 -0
- package/dist/ui/assets/graphql-D5gcC_Jk.js +1 -0
- package/dist/ui/assets/groovy-CacY0gHj.js +1 -0
- package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
- package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
- package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
- package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
- package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
- package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
- package/dist/ui/assets/hack-BJXY27dt.js +1 -0
- package/dist/ui/assets/haml-BLfFoZf7.js +1 -0
- package/dist/ui/assets/handlebars-Dw6CWkvN.js +1 -0
- package/dist/ui/assets/haskell-D8IpX4py.js +1 -0
- package/dist/ui/assets/haxe-OTjmBuCE.js +1 -0
- package/dist/ui/assets/hcl-Dh228itO.js +1 -0
- package/dist/ui/assets/heavy-payload-Dcg0-F-S.js +4 -0
- package/dist/ui/assets/hjson-CxZEssPk.js +1 -0
- package/dist/ui/assets/hlsl-Cvrh5tZx.js +1 -0
- package/dist/ui/assets/horizon-CE9ld1lL.js +1 -0
- package/dist/ui/assets/horizon-bright-Br1oVSNq.js +1 -0
- package/dist/ui/assets/houston-CsvMBhTu.js +1 -0
- package/dist/ui/assets/html-CAcAWvoN.js +1 -0
- package/dist/ui/assets/html-derivative-8aSW2E_7.js +1 -0
- package/dist/ui/assets/http-B2YR_3V1.js +1 -0
- package/dist/ui/assets/hurl-BnDJ9Zhf.js +1 -0
- package/dist/ui/assets/hxml-B0Qn7Nwc.js +1 -0
- package/dist/ui/assets/hy-CZbG8q4J.js +1 -0
- package/dist/ui/assets/imba-DsUTQ-LC.js +1 -0
- package/dist/ui/assets/ini-B5eOa1yu.js +1 -0
- package/dist/ui/assets/java-Doxi4W8u.js +1 -0
- package/dist/ui/assets/javascript-BbRdEqti.js +1 -0
- package/dist/ui/assets/jinja-CS3Tpv_Q.js +1 -0
- package/dist/ui/assets/jison-BkPGYVHR.js +1 -0
- package/dist/ui/assets/json-BMt1m3m8.js +1 -0
- package/dist/ui/assets/json5-BR5RXkoi.js +1 -0
- package/dist/ui/assets/jsonc-CYpm1nAK.js +1 -0
- package/dist/ui/assets/jsonl-CmCQp5Yx.js +1 -0
- package/dist/ui/assets/jsonnet-CJTPZ8u_.js +1 -0
- package/dist/ui/assets/jssm-DXw9l8Rf.js +1 -0
- package/dist/ui/assets/jsx-CQKrJXXY.js +1 -0
- package/dist/ui/assets/julia-BuN7i2du.js +1 -0
- package/dist/ui/assets/just-BswEPFPu.js +1 -0
- package/dist/ui/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
- package/dist/ui/assets/kanagawa-lotus-BN08jTvb.js +1 -0
- package/dist/ui/assets/kanagawa-wave-CTweb8Dz.js +1 -0
- package/dist/ui/assets/kdl-CsD5j6eV.js +1 -0
- package/dist/ui/assets/kotlin-DhhofPvG.js +1 -0
- package/dist/ui/assets/kusto-BUv0MjJC.js +1 -0
- package/dist/ui/assets/laserwave-C_8bwKvT.js +1 -0
- package/dist/ui/assets/latex-DU2VyFfA.js +1 -0
- package/dist/ui/assets/lean-CewbzKMR.js +1 -0
- package/dist/ui/assets/less-DVTAwKKz.js +1 -0
- package/dist/ui/assets/light-plus-DVQuIRkW.js +1 -0
- package/dist/ui/assets/liquid-Cmz1L3dq.js +1 -0
- package/dist/ui/assets/llvm-Cm23YOpf.js +1 -0
- package/dist/ui/assets/log-BNLmms1o.js +1 -0
- package/dist/ui/assets/logo-Cluzi2Zq.js +1 -0
- package/dist/ui/assets/lua-CfVXhkaJ.js +1 -0
- package/dist/ui/assets/luau-CNKltnaQ.js +1 -0
- package/dist/ui/assets/make-Dixweg8N.js +1 -0
- package/dist/ui/assets/markdown-BYOwaDjH.js +1 -0
- package/dist/ui/assets/marko-C5bfqGiA.js +1 -0
- package/dist/ui/assets/material-theme-Bm3Qr25_.js +1 -0
- package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +1 -0
- package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +1 -0
- package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +1 -0
- package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +1 -0
- package/dist/ui/assets/matlab-D7qyCx1q.js +1 -0
- package/dist/ui/assets/mdc-CVBXYfyq.js +1 -0
- package/dist/ui/assets/mdx-DQZ5AkYe.js +1 -0
- package/dist/ui/assets/mermaid-Bk4SNUv9.js +1 -0
- package/dist/ui/assets/min-dark-BSWPekZh.js +1 -0
- package/dist/ui/assets/min-light-DDpmG2fV.js +1 -0
- package/dist/ui/assets/mipsasm-BMqwQI7S.js +1 -0
- package/dist/ui/assets/mojo-BgCJLMeH.js +1 -0
- package/dist/ui/assets/monokai-CdkpiU2Y.js +1 -0
- package/dist/ui/assets/moonbit-CaWjb8XO.js +1 -0
- package/dist/ui/assets/move-B1IS1UjX.js +1 -0
- package/dist/ui/assets/narrat-_X_XdTYD.js +1 -0
- package/dist/ui/assets/nextflow-Bbiyy34d.js +1 -0
- package/dist/ui/assets/nextflow-groovy-Dc_ddanL.js +1 -0
- package/dist/ui/assets/nginx-CzJafxLa.js +1 -0
- package/dist/ui/assets/night-owl-DhmEMT88.js +1 -0
- package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +1 -0
- package/dist/ui/assets/nim-DABKtHtM.js +1 -0
- package/dist/ui/assets/nix-IvuFDN5E.js +1 -0
- package/dist/ui/assets/nord-Cb4Vim4T.js +1 -0
- package/dist/ui/assets/nushell-DcLAeLz5.js +1 -0
- package/dist/ui/assets/objective-c-D1A_Heim.js +1 -0
- package/dist/ui/assets/objective-cpp-BsSzOQcm.js +1 -0
- package/dist/ui/assets/ocaml-O90oeIOV.js +1 -0
- package/dist/ui/assets/odin-B1RWQWA5.js +1 -0
- package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +1 -0
- package/dist/ui/assets/one-light-D7Lr4KcI.js +1 -0
- package/dist/ui/assets/openscad-BUDT5pXO.js +1 -0
- package/dist/ui/assets/pascal-4ZHwLPI5.js +1 -0
- package/dist/ui/assets/perl-CBh7L3lZ.js +1 -0
- package/dist/ui/assets/php-DFbI9q5p.js +1 -0
- package/dist/ui/assets/pierre-dark-sU4Zdns8.js +1 -0
- package/dist/ui/assets/pierre-dark-soft-HXgun5vs.js +1 -0
- package/dist/ui/assets/pierre-light-DWBk51d8.js +1 -0
- package/dist/ui/assets/pierre-light-soft-CodEzPxf.js +1 -0
- package/dist/ui/assets/pkl-ot-7Btpt.js +1 -0
- package/dist/ui/assets/plastic-DQwYfKfQ.js +1 -0
- package/dist/ui/assets/plsql-DGHpHOYJ.js +1 -0
- package/dist/ui/assets/po-BiJDBrnU.js +1 -0
- package/dist/ui/assets/poimandres-DRFjx7u4.js +1 -0
- package/dist/ui/assets/polar-C7UOKdEL.js +1 -0
- package/dist/ui/assets/postcss-BXeXVLqQ.js +1 -0
- package/dist/ui/assets/powerquery-DNMTfnFr.js +1 -0
- package/dist/ui/assets/powershell-DshXNtvi.js +1 -0
- package/dist/ui/assets/prisma-BsRQq5mF.js +1 -0
- package/dist/ui/assets/prolog-iXnhIJG7.js +1 -0
- package/dist/ui/assets/proto-DB4EqR-F.js +1 -0
- package/dist/ui/assets/pug-C_PxC7gO.js +1 -0
- package/dist/ui/assets/puppet-CDv2pdJW.js +1 -0
- package/dist/ui/assets/purescript-9MfHhQsQ.js +1 -0
- package/dist/ui/assets/python-gzcpVVnB.js +1 -0
- package/dist/ui/assets/qml-DtngoFFK.js +1 -0
- package/dist/ui/assets/qmldir-DCQb3MpD.js +1 -0
- package/dist/ui/assets/qss-Fe1Jh2GI.js +1 -0
- package/dist/ui/assets/r-DohkcevW.js +1 -0
- package/dist/ui/assets/racket-DcIDlBhZ.js +1 -0
- package/dist/ui/assets/raku-B3gFvitq.js +1 -0
- package/dist/ui/assets/razor-C4t8J0_E.js +1 -0
- package/dist/ui/assets/red-CJ3rzSJv.js +1 -0
- package/dist/ui/assets/reg-CRGYupPL.js +1 -0
- package/dist/ui/assets/regexp-OGbTbjgY.js +1 -0
- package/dist/ui/assets/rel-BtDbiS_P.js +1 -0
- package/dist/ui/assets/review-payload-C5Qz60Kq.js +1 -0
- package/dist/ui/assets/riscv-Ckw8ddFX.js +1 -0
- package/dist/ui/assets/ron-VUp2lXgN.js +1 -0
- package/dist/ui/assets/rose-pine-BthvhNj6.js +1 -0
- package/dist/ui/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
- package/dist/ui/assets/rose-pine-moon-hon4tzzS.js +1 -0
- package/dist/ui/assets/rosmsg-CAekHB0j.js +1 -0
- package/dist/ui/assets/rst-CfBbbcvC.js +1 -0
- package/dist/ui/assets/ruby-Bw0mpxHY.js +1 -0
- package/dist/ui/assets/rust-Cfkwpbl8.js +1 -0
- package/dist/ui/assets/sas-Cs3s9JOf.js +1 -0
- package/dist/ui/assets/sass-DXrisJhu.js +1 -0
- package/dist/ui/assets/scala-DKOlJaKm.js +1 -0
- package/dist/ui/assets/scheme-DQCgrYNe.js +1 -0
- package/dist/ui/assets/scss-sRxNJS54.js +1 -0
- package/dist/ui/assets/sdbl-bTVj8UrX.js +1 -0
- package/dist/ui/assets/shaderlab-TOUzSsQk.js +1 -0
- package/dist/ui/assets/shellscript-B0X6wh0R.js +1 -0
- package/dist/ui/assets/shellsession-D2FdOioR.js +1 -0
- package/dist/ui/assets/slack-dark-DnToyrRv.js +1 -0
- package/dist/ui/assets/slack-ochin-B2OO5cIa.js +1 -0
- package/dist/ui/assets/smalltalk-B16xEiuN.js +1 -0
- package/dist/ui/assets/snazzy-light-4G7pJPwS.js +1 -0
- package/dist/ui/assets/solarized-dark-DV17i1UV.js +1 -0
- package/dist/ui/assets/solarized-light-DSh2HLQt.js +1 -0
- package/dist/ui/assets/solidity-CKzVLygQ.js +1 -0
- package/dist/ui/assets/soy-s6g9OjJ1.js +1 -0
- package/dist/ui/assets/sparql-D_iOobhT.js +1 -0
- package/dist/ui/assets/splunk-BC2Px7Mm.js +1 -0
- package/dist/ui/assets/sql-DVTnh5V-.js +1 -0
- package/dist/ui/assets/ssh-config-BgfXC-Er.js +1 -0
- package/dist/ui/assets/stata-DFIDiXF9.js +1 -0
- package/dist/ui/assets/stylus-B6D30XZt.js +1 -0
- package/dist/ui/assets/surrealql-DVfrsLyg.js +1 -0
- package/dist/ui/assets/svelte-D5GsxESq.js +1 -0
- package/dist/ui/assets/swift-DonLKvLd.js +1 -0
- package/dist/ui/assets/synthwave-84-nFMaYfgc.js +1 -0
- package/dist/ui/assets/system-verilog-DJ5XKQeo.js +1 -0
- package/dist/ui/assets/systemd-BxMlprV5.js +1 -0
- package/dist/ui/assets/talonscript-CohzipZa.js +1 -0
- package/dist/ui/assets/tasl-DMoTqEGO.js +1 -0
- package/dist/ui/assets/tcl-CZd0xW_V.js +1 -0
- package/dist/ui/assets/templ-DI-Zyqzd.js +1 -0
- package/dist/ui/assets/terraform-DswuEJGm.js +1 -0
- package/dist/ui/assets/tex-WHHmlbJI.js +1 -0
- package/dist/ui/assets/tokyo-night-oM2G3aXe.js +1 -0
- package/dist/ui/assets/toml-CcmNWLt0.js +1 -0
- package/dist/ui/assets/ts-tags-Dwpo2RFJ.js +1 -0
- package/dist/ui/assets/tsv-sltzmVWM.js +1 -0
- package/dist/ui/assets/tsx-ph_idaAW.js +1 -0
- package/dist/ui/assets/turtle-ByJddavk.js +1 -0
- package/dist/ui/assets/twig-YO17jFjR.js +1 -0
- package/dist/ui/assets/typescript-CbAxjhkl.js +1 -0
- package/dist/ui/assets/typespec-B88KGewJ.js +1 -0
- package/dist/ui/assets/typst-DI99ib-x.js +1 -0
- package/dist/ui/assets/useFileDiffInstance-B2DLX3Vg.js +244 -0
- package/dist/ui/assets/v-DETTlOr0.js +1 -0
- package/dist/ui/assets/vala-zf12oZj6.js +1 -0
- package/dist/ui/assets/vb-Djn5o6TS.js +1 -0
- package/dist/ui/assets/verilog-CiiDBU1e.js +1 -0
- package/dist/ui/assets/vesper-D5bVUKB1.js +1 -0
- package/dist/ui/assets/vhdl-BroJfC0k.js +1 -0
- package/dist/ui/assets/viml-DvXPmvsu.js +1 -0
- package/dist/ui/assets/vitesse-black-fwtXNY1n.js +1 -0
- package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +1 -0
- package/dist/ui/assets/vitesse-light-VbXTXTou.js +1 -0
- package/dist/ui/assets/vue-CraHL-Ps.js +1 -0
- package/dist/ui/assets/vue-html-e9tyZNtS.js +1 -0
- package/dist/ui/assets/vue-vine-CofmxaUb.js +1 -0
- package/dist/ui/assets/vyper-CgoNMtux.js +1 -0
- package/dist/ui/assets/wasm-BnjxR4X6.js +1 -0
- package/dist/ui/assets/wasm-ByWQv1Qj.js +1 -0
- package/dist/ui/assets/wenyan-C8pVoKbM.js +1 -0
- package/dist/ui/assets/wgsl-BsKzXJz4.js +1 -0
- package/dist/ui/assets/wikitext-ClFFjSW2.js +1 -0
- package/dist/ui/assets/wit-DdvCle-K.js +1 -0
- package/dist/ui/assets/wolfram-DLL8P-h_.js +1 -0
- package/dist/ui/assets/workspace-app-8--oTbCd.css +1 -0
- package/dist/ui/assets/workspace-app-C5QsE314.js +118 -0
- package/dist/ui/assets/xml-BWSdPZHm.js +1 -0
- package/dist/ui/assets/xsl-BtCt7Hx8.js +1 -0
- package/dist/ui/assets/yaml-BZiTw7cQ.js +1 -0
- package/dist/ui/assets/zenscript-BnlCZFoB.js +1 -0
- package/dist/ui/assets/zig-CMLA9XwU.js +1 -0
- package/dist/ui/workspace-app.html +15 -0
- package/dist/user-config.js +57 -0
- package/dist/view-image.js +104 -0
- package/dist/web-tools.js +200 -0
- package/dist/window-capture.js +74 -0
- package/dist/workspace-store.js +125 -0
- package/dist/workspaces.js +226 -0
- package/docs/DEVELOPMENT_TOOLS.md +95 -0
- package/docs/assets/auvrynt-logo-light.png +0 -0
- package/docs/assets/auvrynt-screenshot.png +0 -0
- package/docs/chatgpt-coding-workflow.md +143 -0
- package/docs/configuration.md +132 -0
- package/docs/gotchas.md +215 -0
- package/docs/security.md +100 -0
- package/docs/setup.md +132 -0
- package/package.json +70 -0
- package/scripts/dev-server.mjs +120 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { execFile } from "node:child_process";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { join, relative } from "node:path";
|
|
5
|
+
import { parseGodotProjectFile } from "./godot-tools.js";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
export async function inspectGodotDotnetProject(registry, input) {
|
|
8
|
+
const workspace = registry.getWorkspace(input.workspaceId);
|
|
9
|
+
const targetDir = input.projectPath
|
|
10
|
+
? registry.resolvePath(workspace, input.projectPath)
|
|
11
|
+
: workspace.root;
|
|
12
|
+
const projectGodotPath = join(targetDir, "project.godot");
|
|
13
|
+
let projectGodotContent = "";
|
|
14
|
+
try {
|
|
15
|
+
projectGodotContent = await readFile(projectGodotPath, "utf8");
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new Error(`project.godot not found in directory: ${input.projectPath ?? "."}`);
|
|
19
|
+
}
|
|
20
|
+
const parsedGodot = parseGodotProjectFile(projectGodotContent);
|
|
21
|
+
let csharpScriptCount = 0;
|
|
22
|
+
let gdscriptCount = 0;
|
|
23
|
+
let csprojFile;
|
|
24
|
+
let slnFile;
|
|
25
|
+
async function scanDir(dir) {
|
|
26
|
+
let entries;
|
|
27
|
+
try {
|
|
28
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
for (const entry of entries) {
|
|
34
|
+
if (entry.isDirectory()) {
|
|
35
|
+
if (entry.name === ".godot" || entry.name === "bin" || entry.name === "obj" || entry.name === "node_modules" || entry.name === ".git") {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
await scanDir(join(dir, entry.name));
|
|
39
|
+
}
|
|
40
|
+
else if (entry.isFile()) {
|
|
41
|
+
if (entry.name.endsWith(".cs"))
|
|
42
|
+
csharpScriptCount++;
|
|
43
|
+
else if (entry.name.endsWith(".gd"))
|
|
44
|
+
gdscriptCount++;
|
|
45
|
+
else if (entry.name.endsWith(".csproj"))
|
|
46
|
+
csprojFile = join(dir, entry.name);
|
|
47
|
+
else if (entry.name.endsWith(".sln"))
|
|
48
|
+
slnFile = join(dir, entry.name);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
await scanDir(targetDir);
|
|
53
|
+
let targetFrameworks = [];
|
|
54
|
+
let godotNetSdkVersion;
|
|
55
|
+
const packageReferences = [];
|
|
56
|
+
const projectReferences = [];
|
|
57
|
+
let nullable = "enable";
|
|
58
|
+
let implicitUsings = "enable";
|
|
59
|
+
let rootNamespace;
|
|
60
|
+
let assemblyName;
|
|
61
|
+
if (csprojFile) {
|
|
62
|
+
try {
|
|
63
|
+
const xml = await readFile(csprojFile, "utf8");
|
|
64
|
+
const tfmMatch = xml.match(/<TargetFrameworks?>(.*?)<\/TargetFrameworks?>/i);
|
|
65
|
+
if (tfmMatch)
|
|
66
|
+
targetFrameworks = tfmMatch[1].split(";").map((t) => t.trim());
|
|
67
|
+
const sdkMatch = xml.match(/Godot\.NET\.Sdk\/([0-9.]+)/i);
|
|
68
|
+
if (sdkMatch)
|
|
69
|
+
godotNetSdkVersion = sdkMatch[1];
|
|
70
|
+
const nsMatch = xml.match(/<RootNamespace>(.*?)<\/RootNamespace>/i);
|
|
71
|
+
if (nsMatch)
|
|
72
|
+
rootNamespace = nsMatch[1].trim();
|
|
73
|
+
const asmMatch = xml.match(/<AssemblyName>(.*?)<\/AssemblyName>/i);
|
|
74
|
+
if (asmMatch)
|
|
75
|
+
assemblyName = asmMatch[1].trim();
|
|
76
|
+
const pkgRegex = /<PackageReference\s+Include="([^"]+)"/g;
|
|
77
|
+
let m;
|
|
78
|
+
while ((m = pkgRegex.exec(xml)) !== null)
|
|
79
|
+
packageReferences.push(m[1]);
|
|
80
|
+
}
|
|
81
|
+
catch { }
|
|
82
|
+
}
|
|
83
|
+
const isMixedLanguage = csharpScriptCount > 0 && gdscriptCount > 0;
|
|
84
|
+
const requiresSolutionRegeneration = !slnFile || !csprojFile;
|
|
85
|
+
return {
|
|
86
|
+
projectGodotPath: relative(workspace.root, projectGodotPath).replace(/\\/g, "/"),
|
|
87
|
+
name: parsedGodot.name,
|
|
88
|
+
mainScene: parsedGodot.mainScene,
|
|
89
|
+
renderer: parsedGodot.renderer,
|
|
90
|
+
godotVersionFeatures: parsedGodot.features,
|
|
91
|
+
csprojPath: csprojFile ? relative(workspace.root, csprojFile).replace(/\\/g, "/") : undefined,
|
|
92
|
+
slnPath: slnFile ? relative(workspace.root, slnFile).replace(/\\/g, "/") : undefined,
|
|
93
|
+
targetFrameworks,
|
|
94
|
+
godotNetSdkVersion,
|
|
95
|
+
packageReferences,
|
|
96
|
+
projectReferences,
|
|
97
|
+
nullable,
|
|
98
|
+
implicitUsings,
|
|
99
|
+
rootNamespace,
|
|
100
|
+
assemblyName,
|
|
101
|
+
autoloads: parsedGodot.autoloads,
|
|
102
|
+
inputActions: parsedGodot.inputActions,
|
|
103
|
+
csharpScriptCount,
|
|
104
|
+
gdscriptCount,
|
|
105
|
+
isMixedLanguage,
|
|
106
|
+
requiresSolutionRegeneration,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
export async function godotBuildSolutions(registry, input) {
|
|
110
|
+
const workspace = registry.getWorkspace(input.workspaceId);
|
|
111
|
+
const targetDir = registry.resolvePath(workspace, input.projectPath);
|
|
112
|
+
const godotExe = process.env.GODOT_DOTNET_EXECUTABLE ?? process.env.GODOT_EXECUTABLE ?? "godot-mono";
|
|
113
|
+
const args = ["--headless", "--path", targetDir, "--build-solutions", "--quit"];
|
|
114
|
+
const start = Date.now();
|
|
115
|
+
try {
|
|
116
|
+
const { stdout, stderr } = await execFileAsync(godotExe, args, { cwd: targetDir });
|
|
117
|
+
const output = stdout + "\n" + stderr;
|
|
118
|
+
const details = await inspectGodotDotnetProject(registry, { workspaceId: input.workspaceId, projectPath: input.projectPath });
|
|
119
|
+
return {
|
|
120
|
+
success: true,
|
|
121
|
+
durationMs: Date.now() - start,
|
|
122
|
+
generatedSln: details.slnPath,
|
|
123
|
+
generatedCsproj: details.csprojPath,
|
|
124
|
+
output: output.slice(0, 1000),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
return {
|
|
129
|
+
success: false,
|
|
130
|
+
durationMs: Date.now() - start,
|
|
131
|
+
output: (err.stdout ?? "") + "\n" + (err.stderr ?? err.message),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export async function godotDotnetRestore(registry, input) {
|
|
136
|
+
const workspace = registry.getWorkspace(input.workspaceId);
|
|
137
|
+
const targetDir = registry.resolvePath(workspace, input.projectPath);
|
|
138
|
+
const args = ["restore", targetDir];
|
|
139
|
+
if (input.lockedMode)
|
|
140
|
+
args.push("--locked-mode");
|
|
141
|
+
const start = Date.now();
|
|
142
|
+
try {
|
|
143
|
+
const { stdout, stderr } = await execFileAsync("dotnet", args, { cwd: targetDir });
|
|
144
|
+
return {
|
|
145
|
+
success: true,
|
|
146
|
+
durationMs: Date.now() - start,
|
|
147
|
+
output: (stdout + "\n" + stderr).slice(0, 1000),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
return {
|
|
152
|
+
success: false,
|
|
153
|
+
durationMs: Date.now() - start,
|
|
154
|
+
output: (err.stdout ?? "") + "\n" + (err.stderr ?? err.message),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { inspectGodotDotnetProject } from "./godot-csharp-project.js";
|
|
2
|
+
export async function godotRunProject(registry, processManager, input) {
|
|
3
|
+
const workspace = registry.getWorkspace(input.workspaceId);
|
|
4
|
+
const projectDir = registry.resolvePath(workspace, input.projectPath);
|
|
5
|
+
const details = await inspectGodotDotnetProject(registry, { workspaceId: input.workspaceId, projectPath: input.projectPath });
|
|
6
|
+
const godotExe = process.env.GODOT_DOTNET_EXECUTABLE ?? process.env.GODOT_EXECUTABLE ?? "godot-mono";
|
|
7
|
+
const args = ["--path", `"${projectDir}"`];
|
|
8
|
+
if (input.debug ?? true)
|
|
9
|
+
args.push("-d");
|
|
10
|
+
if (input.windowed)
|
|
11
|
+
args.push("-w");
|
|
12
|
+
if (input.resolution)
|
|
13
|
+
args.push("--resolution", `${input.resolution.width}x${input.resolution.height}`);
|
|
14
|
+
if (input.additionalGodotArguments)
|
|
15
|
+
args.push(...input.additionalGodotArguments);
|
|
16
|
+
if (input.userArguments && input.userArguments.length > 0) {
|
|
17
|
+
args.push("--", ...input.userArguments);
|
|
18
|
+
}
|
|
19
|
+
const command = `${godotExe} ${args.join(" ")}`;
|
|
20
|
+
const result = processManager.startProcess({
|
|
21
|
+
workspaceId: input.workspaceId,
|
|
22
|
+
command,
|
|
23
|
+
workingDirectory: projectDir,
|
|
24
|
+
});
|
|
25
|
+
return {
|
|
26
|
+
processId: result.processId,
|
|
27
|
+
status: result.status,
|
|
28
|
+
windowDetected: !args.includes("--headless"),
|
|
29
|
+
projectName: details.name,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export async function godotRunScene(registry, processManager, input) {
|
|
33
|
+
const workspace = registry.getWorkspace(input.workspaceId);
|
|
34
|
+
const projectDir = registry.resolvePath(workspace, input.projectPath);
|
|
35
|
+
const absoluteScene = registry.resolvePath(workspace, input.scenePath);
|
|
36
|
+
if (!input.scenePath.endsWith(".tscn")) {
|
|
37
|
+
throw new Error(`Invalid scene file extension: ${input.scenePath}. Only .tscn text scenes are supported.`);
|
|
38
|
+
}
|
|
39
|
+
const godotExe = process.env.GODOT_DOTNET_EXECUTABLE ?? process.env.GODOT_EXECUTABLE ?? "godot-mono";
|
|
40
|
+
const args = ["--path", `"${projectDir}"`, `"${absoluteScene}"`];
|
|
41
|
+
if (input.debug ?? true)
|
|
42
|
+
args.push("-d");
|
|
43
|
+
const command = `${godotExe} ${args.join(" ")}`;
|
|
44
|
+
const result = processManager.startProcess({
|
|
45
|
+
workspaceId: input.workspaceId,
|
|
46
|
+
command,
|
|
47
|
+
workingDirectory: projectDir,
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
processId: result.processId,
|
|
51
|
+
status: result.status,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function parseStructuredRuntimeLogs(rawLines) {
|
|
55
|
+
const entries = [];
|
|
56
|
+
let currentEntry = null;
|
|
57
|
+
for (const line of rawLines) {
|
|
58
|
+
const trimmed = line.trim();
|
|
59
|
+
if (!trimmed)
|
|
60
|
+
continue;
|
|
61
|
+
// Detect C# exception
|
|
62
|
+
if (trimmed.includes("Exception:") || trimmed.startsWith("System.") || trimmed.includes("NullReferenceException") || trimmed.includes("InvalidCastException")) {
|
|
63
|
+
if (currentEntry)
|
|
64
|
+
entries.push(currentEntry);
|
|
65
|
+
currentEntry = {
|
|
66
|
+
severity: "error",
|
|
67
|
+
category: "csharp_exception",
|
|
68
|
+
message: trimmed,
|
|
69
|
+
stackFrames: [],
|
|
70
|
+
};
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
// Stack frame line: at Namespace.Class.Method(Type arg) in C:\path\File.cs:line 45
|
|
74
|
+
const stackMatch = trimmed.match(/^at\s+(.*?)(?:\s+in\s+(.*?):line\s+(\d+))?$/);
|
|
75
|
+
if (stackMatch && currentEntry && currentEntry.category === "csharp_exception") {
|
|
76
|
+
currentEntry.stackFrames = currentEntry.stackFrames ?? [];
|
|
77
|
+
currentEntry.stackFrames.push({
|
|
78
|
+
method: stackMatch[1],
|
|
79
|
+
path: stackMatch[2],
|
|
80
|
+
line: stackMatch[3] ? Number(stackMatch[3]) : undefined,
|
|
81
|
+
});
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
// Godot ERROR / WARNING / PRINT
|
|
85
|
+
if (trimmed.includes("ERROR:") || trimmed.includes("SCRIPT ERROR:")) {
|
|
86
|
+
if (currentEntry)
|
|
87
|
+
entries.push(currentEntry);
|
|
88
|
+
currentEntry = {
|
|
89
|
+
severity: "error",
|
|
90
|
+
category: "godot_error",
|
|
91
|
+
message: trimmed,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
else if (trimmed.includes("WARNING:")) {
|
|
95
|
+
if (currentEntry)
|
|
96
|
+
entries.push(currentEntry);
|
|
97
|
+
currentEntry = {
|
|
98
|
+
severity: "warning",
|
|
99
|
+
category: "godot_warning",
|
|
100
|
+
message: trimmed,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
if (currentEntry && currentEntry.category !== "print") {
|
|
105
|
+
entries.push(currentEntry);
|
|
106
|
+
currentEntry = null;
|
|
107
|
+
}
|
|
108
|
+
entries.push({
|
|
109
|
+
severity: "print",
|
|
110
|
+
category: "gd_print",
|
|
111
|
+
message: trimmed,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (currentEntry)
|
|
116
|
+
entries.push(currentEntry);
|
|
117
|
+
// Group repeated identical messages
|
|
118
|
+
const grouped = [];
|
|
119
|
+
for (const entry of entries) {
|
|
120
|
+
const prev = grouped[grouped.length - 1];
|
|
121
|
+
if (prev && prev.message === entry.message && prev.severity === entry.severity) {
|
|
122
|
+
prev.repeatCount = (prev.repeatCount ?? 1) + 1;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
grouped.push(entry);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return grouped;
|
|
129
|
+
}
|
|
130
|
+
export function getGodotRuntimeLogs(processManager, input) {
|
|
131
|
+
const logs = processManager.getProcessLogs({
|
|
132
|
+
workspaceId: input.workspaceId,
|
|
133
|
+
processId: input.processId,
|
|
134
|
+
lines: input.lines ?? 100,
|
|
135
|
+
});
|
|
136
|
+
const parsed = parseStructuredRuntimeLogs(logs.lines);
|
|
137
|
+
const severityFilter = input.severity ? new Set(input.severity) : null;
|
|
138
|
+
const filtered = severityFilter
|
|
139
|
+
? parsed.filter((e) => severityFilter.has(e.severity))
|
|
140
|
+
: parsed;
|
|
141
|
+
return {
|
|
142
|
+
processId: input.processId,
|
|
143
|
+
entries: filtered,
|
|
144
|
+
totalEntries: filtered.length,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
// Regex-based lightweight C# semantic search (for use without Roslyn LSP)
|
|
4
|
+
export async function findCsharpClasses(registry, input) {
|
|
5
|
+
const workspace = registry.getWorkspace(input.workspaceId);
|
|
6
|
+
const results = [];
|
|
7
|
+
async function scanDir(dir) {
|
|
8
|
+
let entries;
|
|
9
|
+
try {
|
|
10
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
for (const entry of entries) {
|
|
16
|
+
if (entry.isDirectory()) {
|
|
17
|
+
if ([".godot", "bin", "obj", "node_modules", ".git"].includes(entry.name))
|
|
18
|
+
continue;
|
|
19
|
+
await scanDir(join(dir, entry.name));
|
|
20
|
+
}
|
|
21
|
+
else if (entry.name.endsWith(".cs")) {
|
|
22
|
+
const filePath = join(dir, entry.name);
|
|
23
|
+
const content = await readFile(filePath, "utf8").catch(() => "");
|
|
24
|
+
const info = parseCsharpFile(content, relative(workspace.root, filePath).replace(/\\/g, "/"));
|
|
25
|
+
for (const cls of info) {
|
|
26
|
+
if (cls.className === input.className)
|
|
27
|
+
results.push(cls);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
await scanDir(workspace.root);
|
|
33
|
+
return results;
|
|
34
|
+
}
|
|
35
|
+
export function parseCsharpFile(content, filePath) {
|
|
36
|
+
const classes = [];
|
|
37
|
+
const lines = content.split(/\r?\n/);
|
|
38
|
+
let namespace;
|
|
39
|
+
const nsMatch = content.match(/^namespace\s+([\w.]+)/m);
|
|
40
|
+
if (nsMatch)
|
|
41
|
+
namespace = nsMatch[1];
|
|
42
|
+
const classRegex = /^(?:\[[\w,=\s"'.()[\]]*\]\s*)*\s*(public|internal|private|protected)?\s*(static|sealed|abstract)?\s*(partial\s+)?class\s+(\w+)(?:\s*:\s*([\w<>, ]+))?/gm;
|
|
43
|
+
let m;
|
|
44
|
+
while ((m = classRegex.exec(content)) !== null) {
|
|
45
|
+
const isPartial = !!m[3];
|
|
46
|
+
const className = m[4];
|
|
47
|
+
const inheritance = (m[5] ?? "").split(",").map((s) => s.trim()).filter(Boolean);
|
|
48
|
+
const baseClass = inheritance[0] ?? undefined;
|
|
49
|
+
const lineNumber = content.slice(0, m.index).split("\n").length;
|
|
50
|
+
// Extract [Export] properties
|
|
51
|
+
const exportedProperties = extractExportedProperties(content, className);
|
|
52
|
+
const signals = extractCsharpSignals(content);
|
|
53
|
+
const lifecycleOverrides = extractLifecycleOverrides(content);
|
|
54
|
+
classes.push({
|
|
55
|
+
className,
|
|
56
|
+
filePath,
|
|
57
|
+
line: lineNumber,
|
|
58
|
+
baseClass,
|
|
59
|
+
isPartial,
|
|
60
|
+
implementedInterfaces: inheritance.slice(1),
|
|
61
|
+
namespace,
|
|
62
|
+
exportedProperties,
|
|
63
|
+
signals,
|
|
64
|
+
lifecycleOverrides,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return classes;
|
|
68
|
+
}
|
|
69
|
+
function extractExportedProperties(content, _className) {
|
|
70
|
+
const props = [];
|
|
71
|
+
const exportRegex = /\[Export(?:Group|Subgroup|Category)?\(?"?(.*?)"?\)?\]\s+(?:public\s+)([\w?<>[\]]+)\s+(\w+)/g;
|
|
72
|
+
let m;
|
|
73
|
+
while ((m = exportRegex.exec(content)) !== null) {
|
|
74
|
+
props.push({
|
|
75
|
+
propertyName: m[3],
|
|
76
|
+
inspectorDisplayName: m[3].replace(/([A-Z])/g, " $1").trim(),
|
|
77
|
+
type: m[2],
|
|
78
|
+
exportAttribute: m[0].split("]")[0] + "]",
|
|
79
|
+
isNullable: m[2].endsWith("?"),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return props;
|
|
83
|
+
}
|
|
84
|
+
function extractCsharpSignals(content) {
|
|
85
|
+
const signals = [];
|
|
86
|
+
const delegateRegex = /\[Signal\]\s+public\s+delegate\s+void\s+(\w+)\((.*?)\)/g;
|
|
87
|
+
let m;
|
|
88
|
+
while ((m = delegateRegex.exec(content)) !== null) {
|
|
89
|
+
const name = m[1].replace(/EventHandler$/, "");
|
|
90
|
+
const params = m[2] ? m[2].split(",").map((p) => p.trim()) : [];
|
|
91
|
+
signals.push({ name, parameters: params, declaration: m[0] });
|
|
92
|
+
}
|
|
93
|
+
return signals;
|
|
94
|
+
}
|
|
95
|
+
function extractLifecycleOverrides(content) {
|
|
96
|
+
const lifecycles = [
|
|
97
|
+
"_Ready", "_Process", "_PhysicsProcess", "_Input", "_UnhandledInput",
|
|
98
|
+
"_Draw", "_EnterTree", "_ExitTree", "_Notification",
|
|
99
|
+
"_GetConfigurationWarnings",
|
|
100
|
+
];
|
|
101
|
+
return lifecycles.filter((lc) => new RegExp(`override.*void.*${lc}\\s*\\(`).test(content));
|
|
102
|
+
}
|
|
103
|
+
export async function getCsharpDiagnostics(registry, input) {
|
|
104
|
+
// Returns diagnostics by parsing .csproj build output
|
|
105
|
+
// Live diagnostics require a Roslyn LSP; this scans for known anti-patterns
|
|
106
|
+
const workspace = registry.getWorkspace(input.workspaceId);
|
|
107
|
+
const targetDir = registry.resolvePath(workspace, input.projectPath);
|
|
108
|
+
const errors = [];
|
|
109
|
+
const warnings = [];
|
|
110
|
+
async function scanDir(dir) {
|
|
111
|
+
let entries;
|
|
112
|
+
try {
|
|
113
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
for (const entry of entries) {
|
|
119
|
+
if (entry.isDirectory()) {
|
|
120
|
+
if ([".godot", "bin", "obj"].includes(entry.name))
|
|
121
|
+
continue;
|
|
122
|
+
await scanDir(join(dir, entry.name));
|
|
123
|
+
}
|
|
124
|
+
else if (entry.name.endsWith(".cs")) {
|
|
125
|
+
const content = await readFile(join(dir, entry.name), "utf8").catch(() => "");
|
|
126
|
+
const rel = relative(workspace.root, join(dir, entry.name)).replace(/\\/g, "/");
|
|
127
|
+
if (!content.includes("partial class") && content.includes("extends")) {
|
|
128
|
+
warnings.push(`${rel}: GDScript-style 'extends' found in .cs file - check syntax.`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
await scanDir(targetDir);
|
|
134
|
+
return { errors, warnings };
|
|
135
|
+
}
|
|
136
|
+
export async function getExportedProperties(registry, input) {
|
|
137
|
+
const workspace = registry.getWorkspace(input.workspaceId);
|
|
138
|
+
const absPath = registry.resolvePath(workspace, input.scriptPath);
|
|
139
|
+
const content = await readFile(absPath, "utf8");
|
|
140
|
+
return extractExportedProperties(content, "");
|
|
141
|
+
}
|
|
142
|
+
export async function generateCsharpScript(params) {
|
|
143
|
+
const base = params.baseType ?? "Node";
|
|
144
|
+
const nsOpen = params.namespace ? `namespace ${params.namespace}\n{\n` : "";
|
|
145
|
+
const nsClose = params.namespace ? `}\n` : "";
|
|
146
|
+
const indent = params.namespace ? " " : "";
|
|
147
|
+
return [
|
|
148
|
+
"using Godot;",
|
|
149
|
+
"",
|
|
150
|
+
nsOpen,
|
|
151
|
+
`${indent}public partial class ${params.className} : ${base}`,
|
|
152
|
+
`${indent}{`,
|
|
153
|
+
`${indent} public override void _Ready()`,
|
|
154
|
+
`${indent} {`,
|
|
155
|
+
`${indent} }`,
|
|
156
|
+
`${indent}}`,
|
|
157
|
+
nsClose,
|
|
158
|
+
]
|
|
159
|
+
.join("\n")
|
|
160
|
+
.trim() + "\n";
|
|
161
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { godotDotnetBuild } from "./godot-csharp-build.js";
|
|
4
|
+
import { parseStructuredRuntimeLogs } from "./godot-csharp-runner.js";
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
6
|
+
export async function godotValidateProject(registry, input) {
|
|
7
|
+
const workspace = registry.getWorkspace(input.workspaceId);
|
|
8
|
+
const targetDir = registry.resolvePath(workspace, input.projectPath);
|
|
9
|
+
const start = Date.now();
|
|
10
|
+
let csharpDiagnostics = undefined;
|
|
11
|
+
if (input.buildCsharpFirst ?? true) {
|
|
12
|
+
csharpDiagnostics = await godotDotnetBuild(registry, {
|
|
13
|
+
workspaceId: input.workspaceId,
|
|
14
|
+
projectPath: input.projectPath,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
const godotExe = process.env.GODOT_DOTNET_EXECUTABLE ?? process.env.GODOT_EXECUTABLE ?? "godot-mono";
|
|
18
|
+
const args = ["--headless", "--path", targetDir, "--editor", "--quit"];
|
|
19
|
+
let rawLogs = [];
|
|
20
|
+
try {
|
|
21
|
+
const { stdout, stderr } = await execFileAsync(godotExe, args, { cwd: targetDir });
|
|
22
|
+
rawLogs = (stdout + "\n" + stderr).split(/\r?\n/);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
rawLogs = ((err.stdout ?? "") + "\n" + (err.stderr ?? err.message)).split(/\r?\n/);
|
|
26
|
+
}
|
|
27
|
+
const godotDiagnostics = parseStructuredRuntimeLogs(rawLogs);
|
|
28
|
+
const missingResources = [];
|
|
29
|
+
const failedImports = [];
|
|
30
|
+
for (const entry of godotDiagnostics) {
|
|
31
|
+
if (entry.message.includes("Resource not found") || entry.message.includes("Failed loading resource")) {
|
|
32
|
+
missingResources.push(entry.message);
|
|
33
|
+
}
|
|
34
|
+
if (entry.message.includes("Import error") || entry.message.includes("Failed to import")) {
|
|
35
|
+
failedImports.push(entry.message);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const hasErrors = (csharpDiagnostics && !csharpDiagnostics.success) || godotDiagnostics.some((d) => d.severity === "error");
|
|
39
|
+
const hasWarnings = godotDiagnostics.some((d) => d.severity === "warning");
|
|
40
|
+
const status = hasErrors ? "invalid" : (hasWarnings ? "warnings" : "valid");
|
|
41
|
+
return {
|
|
42
|
+
status,
|
|
43
|
+
csharpDiagnostics,
|
|
44
|
+
godotDiagnostics,
|
|
45
|
+
missingResources,
|
|
46
|
+
failedImports,
|
|
47
|
+
durationMs: Date.now() - start,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export async function godotImportAssets(registry, input) {
|
|
51
|
+
const workspace = registry.getWorkspace(input.workspaceId);
|
|
52
|
+
const targetDir = registry.resolvePath(workspace, input.projectPath);
|
|
53
|
+
const godotExe = process.env.GODOT_DOTNET_EXECUTABLE ?? process.env.GODOT_EXECUTABLE ?? "godot-mono";
|
|
54
|
+
const args = ["--headless", "--path", targetDir, "--editor", "--quit"];
|
|
55
|
+
const start = Date.now();
|
|
56
|
+
try {
|
|
57
|
+
const { stdout, stderr } = await execFileAsync(godotExe, args, { cwd: targetDir });
|
|
58
|
+
return {
|
|
59
|
+
success: true,
|
|
60
|
+
durationMs: Date.now() - start,
|
|
61
|
+
output: (stdout + "\n" + stderr).slice(0, 1000),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
durationMs: Date.now() - start,
|
|
68
|
+
output: (err.stdout ?? "") + "\n" + (err.stderr ?? err.message),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|