auvrynt 1.0.2 → 1.0.5

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 (550) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +366 -233
  3. package/addons/auvrynt_bridge/auvrynt_bridge.gd +500 -0
  4. package/addons/auvrynt_bridge/plugin.cfg +7 -0
  5. package/bin/auvrynt-launcher.cjs +77 -0
  6. package/dist/artifact-registry.js +1 -0
  7. package/dist/aseprite-tools.js +1 -0
  8. package/dist/auth/connection-registry.js +145 -0
  9. package/dist/auth/connection-status.js +176 -0
  10. package/dist/auth/oauth-provider.js +617 -0
  11. package/dist/auth/room-registry.js +131 -0
  12. package/dist/auth/session-registry.js +531 -0
  13. package/dist/background-lifecycle.js +1 -0
  14. package/dist/blender-client.js +1 -109
  15. package/dist/blender-tools.js +1 -930
  16. package/dist/browser-stability.js +1 -0
  17. package/dist/cli/commands/help-command.js +10 -0
  18. package/dist/cli/commands/init-command.js +190 -0
  19. package/dist/cli/commands/integration-commands.js +88 -0
  20. package/dist/cli/commands/serve-command.js +83 -0
  21. package/dist/cli/commands/setup-command.js +81 -0
  22. package/dist/cli/commands/status-commands.js +166 -0
  23. package/dist/cli/commands/tunnel-command.js +127 -0
  24. package/dist/cli/commands/user-config-commands.js +105 -0
  25. package/dist/cli/dashboard-actions.js +516 -0
  26. package/dist/cli/dashboard-native-actions.js +282 -0
  27. package/dist/cli/foreground-server.js +270 -0
  28. package/dist/cli/instance-control.js +21 -0
  29. package/dist/cli/instance-lock.js +123 -0
  30. package/dist/cli/integration-bootstrap.js +206 -0
  31. package/dist/cli/lifecycle-manager.js +493 -0
  32. package/dist/cli/runtime-support.js +74 -0
  33. package/dist/cli/serena-detected-default.js +27 -0
  34. package/dist/cli/tunnel-health-monitor.js +182 -0
  35. package/dist/cli.js +82 -739
  36. package/dist/config.js +1 -243
  37. package/dist/connection-registry.js +1 -73
  38. package/dist/connection-status.js +1 -139
  39. package/dist/control-retry.js +1 -0
  40. package/dist/crash-recovery.js +1 -0
  41. package/dist/db/client.js +16 -3
  42. package/dist/db/schema.js +30 -0
  43. package/dist/dotnet-tools.js +1 -223
  44. package/dist/git-worktrees.js +1 -134
  45. package/dist/git.js +1 -41
  46. package/dist/godot-animation-tilemap.js +1 -82
  47. package/dist/godot-csharp-build.js +1 -93
  48. package/dist/godot-csharp-project.js +1 -157
  49. package/dist/godot-csharp-runner.js +1 -146
  50. package/dist/godot-csharp-semantic.js +1 -161
  51. package/dist/godot-csharp-validate.js +1 -71
  52. package/dist/godot-dotnet-env.js +1 -169
  53. package/dist/godot-editor-bridge.js +1 -140
  54. package/dist/godot-gdscript.js +1 -824
  55. package/dist/godot-project-settings.js +1 -223
  56. package/dist/godot-runtime-testing.js +1 -249
  57. package/dist/godot-tools.js +1 -183
  58. package/dist/http-rate-limit.js +1 -0
  59. package/dist/http-server-hardening.js +1 -0
  60. package/dist/image-tools.js +1 -157
  61. package/dist/infrastructure/command-reference.js +32 -0
  62. package/dist/infrastructure/config.js +424 -0
  63. package/dist/infrastructure/context7-auth.js +55 -0
  64. package/dist/infrastructure/http-rate-limit.js +42 -0
  65. package/dist/infrastructure/http-server-hardening.js +23 -0
  66. package/dist/infrastructure/integration-queue.js +46 -0
  67. package/dist/infrastructure/logger.js +129 -0
  68. package/dist/infrastructure/mcp-event-store.js +103 -0
  69. package/dist/infrastructure/ngrok-auth-pool.js +208 -0
  70. package/dist/infrastructure/request-context.js +14 -0
  71. package/dist/infrastructure/shutdown.js +37 -0
  72. package/dist/infrastructure/sse-heartbeat.js +47 -0
  73. package/dist/infrastructure/tool-capabilities.js +67 -0
  74. package/dist/infrastructure/tool-result-budget.js +175 -0
  75. package/dist/infrastructure/user-config.js +167 -0
  76. package/dist/integration-discovery.js +1 -98
  77. package/dist/integration-queue.js +1 -0
  78. package/dist/integrations/agent-reach/agent-reach-tools.js +196 -0
  79. package/dist/integrations/agent-reach/native-channels.js +468 -0
  80. package/dist/integrations/aseprite/aseprite-analysis-tools.js +368 -0
  81. package/dist/integrations/aseprite/aseprite-editing-tools.js +647 -0
  82. package/dist/integrations/aseprite/aseprite-live-tools.js +297 -0
  83. package/dist/integrations/aseprite/aseprite-safety-tools.js +594 -0
  84. package/dist/integrations/aseprite/aseprite-specialized-tools.js +289 -0
  85. package/dist/integrations/aseprite/aseprite-tools.js +837 -0
  86. package/dist/integrations/blender/blender-catalog-mesh.js +593 -0
  87. package/dist/integrations/blender/blender-catalog-object.js +906 -0
  88. package/dist/integrations/blender/blender-catalog-scene.js +266 -0
  89. package/dist/integrations/blender/blender-catalog-select.js +581 -0
  90. package/dist/integrations/blender/blender-catalog-stubs.js +7512 -0
  91. package/dist/integrations/blender/blender-catalog.js +165 -0
  92. package/dist/integrations/blender/blender-client.js +105 -0
  93. package/dist/integrations/blender/blender-tools.js +2243 -0
  94. package/dist/integrations/context7/context7-tools.js +106 -0
  95. package/dist/integrations/dotnet/dotnet-tools.js +195 -0
  96. package/dist/integrations/godot/godot-animation-tilemap.js +74 -0
  97. package/dist/integrations/godot/godot-csharp-build.js +91 -0
  98. package/dist/integrations/godot/godot-csharp-project.js +155 -0
  99. package/dist/integrations/godot/godot-csharp-runner.js +118 -0
  100. package/dist/integrations/godot/godot-csharp-semantic.js +146 -0
  101. package/dist/integrations/godot/godot-csharp-validate.js +71 -0
  102. package/dist/integrations/godot/godot-dotnet-env.js +134 -0
  103. package/dist/integrations/godot/godot-editor-bridge.js +328 -0
  104. package/dist/integrations/godot/godot-gdscript.js +536 -0
  105. package/dist/integrations/godot/godot-project-settings.js +178 -0
  106. package/dist/integrations/godot/godot-runtime-testing.js +263 -0
  107. package/dist/integrations/godot/godot-tools.js +193 -0
  108. package/dist/integrations/images/image-tools.js +414 -0
  109. package/dist/integrations/images/png-codec.js +251 -0
  110. package/dist/integrations/images/view-image.js +99 -0
  111. package/dist/integrations/images/window-capture.js +148 -0
  112. package/dist/integrations/integration-discovery.js +185 -0
  113. package/dist/integrations/obsidian/obsidian-tools.js +205 -0
  114. package/dist/integrations/playwright/browser-session.js +516 -0
  115. package/dist/integrations/playwright/browser-stability.js +36 -0
  116. package/dist/integrations/playwright/playwright-runtime.js +105 -0
  117. package/dist/integrations/playwright/web-tools.js +504 -0
  118. package/dist/integrations/roblox/roblox-helpers.js +381 -0
  119. package/dist/integrations/roblox/roblox-studio-client.js +112 -0
  120. package/dist/integrations/roblox/roblox-tools.js +106 -0
  121. package/dist/integrations/serena/serena-manager.js +464 -0
  122. package/dist/integrations/serena/serena-tools.js +411 -0
  123. package/dist/logger.js +1 -76
  124. package/dist/mcp-event-store.js +1 -0
  125. package/dist/oauth-provider.js +1 -377
  126. package/dist/pi-tools.js +1 -81
  127. package/dist/playwright-runtime.js +1 -0
  128. package/dist/process/background-lifecycle.js +189 -0
  129. package/dist/process/control-retry.js +42 -0
  130. package/dist/process/crash-recovery.js +23 -0
  131. package/dist/process/processes.js +456 -0
  132. package/dist/processes.js +1 -218
  133. package/dist/request-context.js +1 -0
  134. package/dist/review-checkpoints.js +1 -142
  135. package/dist/room-registry.js +1 -0
  136. package/dist/roots.js +1 -53
  137. package/dist/search-discovery.js +1 -271
  138. package/dist/serena-manager.js +1 -443
  139. package/dist/serena-tools.js +1 -411
  140. package/dist/server/dashboard-page-styles.js +331 -0
  141. package/dist/server/dashboard-page.js +1509 -0
  142. package/dist/server/dashboard-routes.js +46 -0
  143. package/dist/server/dashboard.js +240 -0
  144. package/dist/server/http-helpers.js +30 -0
  145. package/dist/server/integration-profile-update.js +37 -0
  146. package/dist/server/mcp-policy.js +169 -0
  147. package/dist/server/mcp-server-factory.js +127 -0
  148. package/dist/server/mcp-tool-registrar.js +182 -0
  149. package/dist/server/openai-session-hint.js +14 -0
  150. package/dist/server/tool-groups.js +29 -0
  151. package/dist/server/tool-logging.js +33 -0
  152. package/dist/server/tool-registration-shared.js +59 -0
  153. package/dist/server/tools/aseprite-advanced-tools-registration.js +547 -0
  154. package/dist/server/tools/aseprite-tools-registration.js +213 -0
  155. package/dist/server/tools/blender-tools-registration.js +690 -0
  156. package/dist/server/tools/core-file-tools-registration.js +459 -0
  157. package/dist/server/tools/dotnet-godot-window-tools-registration.js +120 -0
  158. package/dist/server/tools/godot-csharp-tools-registration.js +252 -0
  159. package/dist/server/tools/godot-gdscript-tools-registration.js +189 -0
  160. package/dist/server/tools/process-project-tools-registration.js +155 -0
  161. package/dist/server/tools/roblox-tools-registration.js +514 -0
  162. package/dist/server/tools/web-image-tools-registration.js +326 -0
  163. package/dist/server/tools/workspace-lifecycle-tools-registration.js +130 -0
  164. package/dist/server/ui-assets.js +97 -0
  165. package/dist/server/workspace-analytics.js +92 -0
  166. package/dist/server.js +453 -2713
  167. package/dist/session-registry.js +1 -0
  168. package/dist/shutdown.js +1 -0
  169. package/dist/skills.js +1 -45
  170. package/dist/sse-heartbeat.js +1 -0
  171. package/dist/tool-capabilities.js +1 -0
  172. package/dist/tool-result-budget.js +1 -0
  173. package/dist/tools/pi-tools.js +81 -0
  174. package/dist/tunnels/cloudflare-tunnel.js +217 -0
  175. package/dist/tunnels/cloudflared-service.js +174 -0
  176. package/dist/tunnels/ngrok-tunnel.js +220 -0
  177. package/dist/tunnels/tunnel-manager.js +186 -0
  178. package/dist/tunnels/tunnel-types.js +1 -0
  179. package/dist/tunnels/tunnel-utils.js +62 -0
  180. package/dist/ui/.vite/manifest.json +9 -2487
  181. package/dist/ui/assets/heavy-payload-D42A9ceL.js +1 -0
  182. package/dist/ui/assets/lightweight-diff-Cv4g9Hdr.js +13 -0
  183. package/dist/ui/assets/review-payload-DKIg1cKF.js +1 -0
  184. package/dist/ui/assets/workspace-app-CeK3NhmB.css +1 -0
  185. package/dist/ui/assets/{workspace-app-C5QsE314.js → workspace-app-CkUXnpl4.js} +6 -6
  186. package/dist/ui/brand-theme.js +23 -0
  187. package/dist/ui/workspace-app.html +15 -15
  188. package/dist/user-config.js +1 -57
  189. package/dist/view-image.js +1 -104
  190. package/dist/web-tools.js +1 -200
  191. package/dist/window-capture.js +1 -74
  192. package/dist/workspace/artifact-registry.js +69 -0
  193. package/dist/workspace/git-worktrees.js +141 -0
  194. package/dist/workspace/git.js +42 -0
  195. package/dist/workspace/review-checkpoints.js +142 -0
  196. package/dist/workspace/roots.js +56 -0
  197. package/dist/workspace/search-discovery.js +264 -0
  198. package/dist/workspace/skills.js +45 -0
  199. package/dist/workspace/workspace-store.js +219 -0
  200. package/dist/workspace/workspaces.js +314 -0
  201. package/dist/workspace-store.js +1 -125
  202. package/dist/workspaces.js +1 -226
  203. package/docs/CREATOR_STORE_FREE_ASSETS.md +162 -0
  204. package/docs/DEVELOPMENT_TOOLS.md +136 -93
  205. package/docs/assets/auvrynt-icon.png +0 -0
  206. package/docs/assets/auvrynt-icon.svg +20 -0
  207. package/docs/chatgpt-coding-workflow.md +143 -143
  208. package/docs/configuration.md +156 -124
  209. package/docs/diagnostics.md +79 -0
  210. package/docs/gotchas.md +244 -202
  211. package/docs/multi-agent-and-long-projects.md +91 -0
  212. package/docs/security.md +138 -100
  213. package/docs/setup.md +171 -131
  214. package/docs/source-layout.md +60 -0
  215. package/extensions/auvrynt_bridge/auvrynt_bridge.lua +594 -0
  216. package/extensions/auvrynt_bridge/live_analysis.lua +181 -0
  217. package/extensions/auvrynt_bridge/live_animation.lua +134 -0
  218. package/extensions/auvrynt_bridge/live_commands.lua +24 -0
  219. package/extensions/auvrynt_bridge/live_common.lua +130 -0
  220. package/extensions/auvrynt_bridge/live_document.lua +78 -0
  221. package/extensions/auvrynt_bridge/live_drawing.lua +125 -0
  222. package/extensions/auvrynt_bridge/live_effects.lua +91 -0
  223. package/extensions/auvrynt_bridge/live_palette_template.lua +167 -0
  224. package/extensions/auvrynt_bridge/live_selection.lua +110 -0
  225. package/extensions/auvrynt_bridge/live_structure.lua +129 -0
  226. package/extensions/auvrynt_bridge/package.json +17 -0
  227. package/guides/ASEPRITE_AGENT_GUIDE.md +133 -0
  228. package/guides/BLENDER_AGENT_GUIDE.md +472 -0
  229. package/guides/GODOT_AGENT_GUIDE.md +298 -0
  230. package/guides/PROJECT_ROUTER.md +165 -0
  231. package/guides/ROBLOX_AGENT_GUIDE.md +75 -0
  232. package/guides/SOFTWARE_AGENT_GUIDE.md +104 -0
  233. package/guides/WEB_AGENT_GUIDE.md +287 -0
  234. package/package.json +78 -70
  235. package/scripts/dev-server.mjs +121 -120
  236. package/scripts/live-tunnel-smoke.mjs +538 -0
  237. package/scripts/repo-hygiene.mjs +74 -0
  238. package/scripts/restart-after-crash.mjs +49 -0
  239. package/scripts/run-tests.mjs +166 -0
  240. package/dist/ui/assets/abap-CLvhMVsD.js +0 -1
  241. package/dist/ui/assets/actionscript-3--17pq3dv.js +0 -1
  242. package/dist/ui/assets/ada-C5qYipkI.js +0 -1
  243. package/dist/ui/assets/andromeeda-vGVdxbeo.js +0 -1
  244. package/dist/ui/assets/angular-html-BJqQFYI6.js +0 -1
  245. package/dist/ui/assets/angular-ts-CMJECO0Y.js +0 -1
  246. package/dist/ui/assets/apache-U0d_L8uA.js +0 -1
  247. package/dist/ui/assets/apex-CGTLDQj6.js +0 -1
  248. package/dist/ui/assets/apl-DWeXpBBr.js +0 -1
  249. package/dist/ui/assets/applescript-CCn79oCD.js +0 -1
  250. package/dist/ui/assets/ara-4CJ0cIlV.js +0 -1
  251. package/dist/ui/assets/asciidoc-DE70LPWp.js +0 -1
  252. package/dist/ui/assets/asm-Cmm7eHzH.js +0 -1
  253. package/dist/ui/assets/astro-CLbttLOq.js +0 -1
  254. package/dist/ui/assets/aurora-x-CDeNXAV0.js +0 -1
  255. package/dist/ui/assets/awk-BWXHIvNe.js +0 -1
  256. package/dist/ui/assets/ayu-dark-DluEY0Gj.js +0 -1
  257. package/dist/ui/assets/ayu-light-C3h-C4tm.js +0 -1
  258. package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +0 -1
  259. package/dist/ui/assets/ballerina-B7ZEbQpA.js +0 -1
  260. package/dist/ui/assets/bat-Bo4NYOV-.js +0 -1
  261. package/dist/ui/assets/beancount-D-usSTwE.js +0 -1
  262. package/dist/ui/assets/berry-DKpUyyne.js +0 -1
  263. package/dist/ui/assets/bibtex-Ci_nEsc7.js +0 -1
  264. package/dist/ui/assets/bicep-CUHmPFLl.js +0 -1
  265. package/dist/ui/assets/bird2-C2hNVINV.js +0 -1
  266. package/dist/ui/assets/blade-BOzY0P2V.js +0 -1
  267. package/dist/ui/assets/bsl-BkkzgIyY.js +0 -1
  268. package/dist/ui/assets/c-BG-8uJvh.js +0 -1
  269. package/dist/ui/assets/c3-CnJL0r0V.js +0 -1
  270. package/dist/ui/assets/cadence-CQ2zXKGN.js +0 -1
  271. package/dist/ui/assets/cairo-DLTphjLi.js +0 -1
  272. package/dist/ui/assets/catppuccin-frappe-3VR1Za6u.js +0 -1
  273. package/dist/ui/assets/catppuccin-latte-DwIHMF0Q.js +0 -1
  274. package/dist/ui/assets/catppuccin-macchiato-DYnBP6_5.js +0 -1
  275. package/dist/ui/assets/catppuccin-mocha-DYhrFGRu.js +0 -1
  276. package/dist/ui/assets/clarity-SemFz856.js +0 -1
  277. package/dist/ui/assets/clojure-DqKBuwfJ.js +0 -1
  278. package/dist/ui/assets/cmake-Bj61d0ZC.js +0 -1
  279. package/dist/ui/assets/cobol-I_17IuGe.js +0 -1
  280. package/dist/ui/assets/codeowners-C8r90Shi.js +0 -1
  281. package/dist/ui/assets/codeql-oeQT6MSM.js +0 -1
  282. package/dist/ui/assets/coffee-C0B8hmok.js +0 -1
  283. package/dist/ui/assets/common-lisp-Cv5bFMCO.js +0 -1
  284. package/dist/ui/assets/coq-BrsZFFmf.js +0 -1
  285. package/dist/ui/assets/cpp-DDJXt6Vs.js +0 -1
  286. package/dist/ui/assets/crystal-Bexqace6.js +0 -1
  287. package/dist/ui/assets/csharp-Ct8U2NOr.js +0 -1
  288. package/dist/ui/assets/css-DSQhw_9R.js +0 -1
  289. package/dist/ui/assets/csv-Dx-8-gkx.js +0 -1
  290. package/dist/ui/assets/cue-CE9AQfxI.js +0 -1
  291. package/dist/ui/assets/cypher-ClKdZ_lG.js +0 -1
  292. package/dist/ui/assets/d-qD-0Kul2.js +0 -1
  293. package/dist/ui/assets/dark-plus-Cs2F2srj.js +0 -1
  294. package/dist/ui/assets/dart-DkHntEIa.js +0 -1
  295. package/dist/ui/assets/dax-BkyTk9wS.js +0 -1
  296. package/dist/ui/assets/desktop-Dlh5hvp9.js +0 -1
  297. package/dist/ui/assets/diff-woXpYk--.js +0 -1
  298. package/dist/ui/assets/docker-IyjqRm3v.js +0 -1
  299. package/dist/ui/assets/dotenv-_5a1GRtc.js +0 -1
  300. package/dist/ui/assets/dracula-BHWKrbxM.js +0 -1
  301. package/dist/ui/assets/dracula-soft-5eyTD99u.js +0 -1
  302. package/dist/ui/assets/dream-maker-DW3nJb8Q.js +0 -1
  303. package/dist/ui/assets/edge-Z8YYkHOr.js +0 -1
  304. package/dist/ui/assets/elixir-CG9uKtAF.js +0 -1
  305. package/dist/ui/assets/elm-GfWG2IfT.js +0 -1
  306. package/dist/ui/assets/emacs-lisp-C9PiwqqW.js +0 -1
  307. package/dist/ui/assets/erb-xe89e73J.js +0 -1
  308. package/dist/ui/assets/erlang-Cphh6RMH.js +0 -1
  309. package/dist/ui/assets/everforest-dark-sB-x3p7T.js +0 -1
  310. package/dist/ui/assets/everforest-light-Df2xbC6M.js +0 -1
  311. package/dist/ui/assets/fennel-DQxkIbk2.js +0 -1
  312. package/dist/ui/assets/fish-BJitypiv.js +0 -1
  313. package/dist/ui/assets/fluent-C03EYrpw.js +0 -1
  314. package/dist/ui/assets/fortran-fixed-form-DEKoE2YW.js +0 -1
  315. package/dist/ui/assets/fortran-free-form-CYNrtFtB.js +0 -1
  316. package/dist/ui/assets/fsharp-D13ZGOAj.js +0 -1
  317. package/dist/ui/assets/gdresource-C0sCabJj.js +0 -1
  318. package/dist/ui/assets/gdscript-Cp2uCuqX.js +0 -1
  319. package/dist/ui/assets/gdshader-CBce3t8t.js +0 -1
  320. package/dist/ui/assets/genie-CV2tkWYe.js +0 -1
  321. package/dist/ui/assets/gherkin-DExj1W_8.js +0 -1
  322. package/dist/ui/assets/git-commit-BSykSTBG.js +0 -1
  323. package/dist/ui/assets/git-rebase-CoTL_uSE.js +0 -1
  324. package/dist/ui/assets/github-dark-C-LZuMrd.js +0 -1
  325. package/dist/ui/assets/github-dark-default-DXG-b-1a.js +0 -1
  326. package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +0 -1
  327. package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +0 -1
  328. package/dist/ui/assets/github-light-EUqPIrTm.js +0 -1
  329. package/dist/ui/assets/github-light-default-BXViO-2h.js +0 -1
  330. package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +0 -1
  331. package/dist/ui/assets/gleam-CSRkHgEL.js +0 -1
  332. package/dist/ui/assets/glimmer-js-DAn4UCSu.js +0 -1
  333. package/dist/ui/assets/glimmer-ts-Tjyi6Gh5.js +0 -1
  334. package/dist/ui/assets/glsl-CtTDZoqR.js +0 -1
  335. package/dist/ui/assets/gn-ilITqXS6.js +0 -1
  336. package/dist/ui/assets/gnuplot-7GGW24-e.js +0 -1
  337. package/dist/ui/assets/go-BJwz_mda.js +0 -1
  338. package/dist/ui/assets/graphql-D5gcC_Jk.js +0 -1
  339. package/dist/ui/assets/groovy-CacY0gHj.js +0 -1
  340. package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +0 -1
  341. package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +0 -1
  342. package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +0 -1
  343. package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +0 -1
  344. package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +0 -1
  345. package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +0 -1
  346. package/dist/ui/assets/hack-BJXY27dt.js +0 -1
  347. package/dist/ui/assets/haml-BLfFoZf7.js +0 -1
  348. package/dist/ui/assets/handlebars-Dw6CWkvN.js +0 -1
  349. package/dist/ui/assets/haskell-D8IpX4py.js +0 -1
  350. package/dist/ui/assets/haxe-OTjmBuCE.js +0 -1
  351. package/dist/ui/assets/hcl-Dh228itO.js +0 -1
  352. package/dist/ui/assets/heavy-payload-Dcg0-F-S.js +0 -4
  353. package/dist/ui/assets/hjson-CxZEssPk.js +0 -1
  354. package/dist/ui/assets/hlsl-Cvrh5tZx.js +0 -1
  355. package/dist/ui/assets/horizon-CE9ld1lL.js +0 -1
  356. package/dist/ui/assets/horizon-bright-Br1oVSNq.js +0 -1
  357. package/dist/ui/assets/houston-CsvMBhTu.js +0 -1
  358. package/dist/ui/assets/html-CAcAWvoN.js +0 -1
  359. package/dist/ui/assets/html-derivative-8aSW2E_7.js +0 -1
  360. package/dist/ui/assets/http-B2YR_3V1.js +0 -1
  361. package/dist/ui/assets/hurl-BnDJ9Zhf.js +0 -1
  362. package/dist/ui/assets/hxml-B0Qn7Nwc.js +0 -1
  363. package/dist/ui/assets/hy-CZbG8q4J.js +0 -1
  364. package/dist/ui/assets/imba-DsUTQ-LC.js +0 -1
  365. package/dist/ui/assets/ini-B5eOa1yu.js +0 -1
  366. package/dist/ui/assets/java-Doxi4W8u.js +0 -1
  367. package/dist/ui/assets/javascript-BbRdEqti.js +0 -1
  368. package/dist/ui/assets/jinja-CS3Tpv_Q.js +0 -1
  369. package/dist/ui/assets/jison-BkPGYVHR.js +0 -1
  370. package/dist/ui/assets/json-BMt1m3m8.js +0 -1
  371. package/dist/ui/assets/json5-BR5RXkoi.js +0 -1
  372. package/dist/ui/assets/jsonc-CYpm1nAK.js +0 -1
  373. package/dist/ui/assets/jsonl-CmCQp5Yx.js +0 -1
  374. package/dist/ui/assets/jsonnet-CJTPZ8u_.js +0 -1
  375. package/dist/ui/assets/jssm-DXw9l8Rf.js +0 -1
  376. package/dist/ui/assets/jsx-CQKrJXXY.js +0 -1
  377. package/dist/ui/assets/julia-BuN7i2du.js +0 -1
  378. package/dist/ui/assets/just-BswEPFPu.js +0 -1
  379. package/dist/ui/assets/kanagawa-dragon-CXtmUGW6.js +0 -1
  380. package/dist/ui/assets/kanagawa-lotus-BN08jTvb.js +0 -1
  381. package/dist/ui/assets/kanagawa-wave-CTweb8Dz.js +0 -1
  382. package/dist/ui/assets/kdl-CsD5j6eV.js +0 -1
  383. package/dist/ui/assets/kotlin-DhhofPvG.js +0 -1
  384. package/dist/ui/assets/kusto-BUv0MjJC.js +0 -1
  385. package/dist/ui/assets/laserwave-C_8bwKvT.js +0 -1
  386. package/dist/ui/assets/latex-DU2VyFfA.js +0 -1
  387. package/dist/ui/assets/lean-CewbzKMR.js +0 -1
  388. package/dist/ui/assets/less-DVTAwKKz.js +0 -1
  389. package/dist/ui/assets/light-plus-DVQuIRkW.js +0 -1
  390. package/dist/ui/assets/liquid-Cmz1L3dq.js +0 -1
  391. package/dist/ui/assets/llvm-Cm23YOpf.js +0 -1
  392. package/dist/ui/assets/log-BNLmms1o.js +0 -1
  393. package/dist/ui/assets/logo-Cluzi2Zq.js +0 -1
  394. package/dist/ui/assets/lua-CfVXhkaJ.js +0 -1
  395. package/dist/ui/assets/luau-CNKltnaQ.js +0 -1
  396. package/dist/ui/assets/make-Dixweg8N.js +0 -1
  397. package/dist/ui/assets/markdown-BYOwaDjH.js +0 -1
  398. package/dist/ui/assets/marko-C5bfqGiA.js +0 -1
  399. package/dist/ui/assets/material-theme-Bm3Qr25_.js +0 -1
  400. package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +0 -1
  401. package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +0 -1
  402. package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +0 -1
  403. package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +0 -1
  404. package/dist/ui/assets/matlab-D7qyCx1q.js +0 -1
  405. package/dist/ui/assets/mdc-CVBXYfyq.js +0 -1
  406. package/dist/ui/assets/mdx-DQZ5AkYe.js +0 -1
  407. package/dist/ui/assets/mermaid-Bk4SNUv9.js +0 -1
  408. package/dist/ui/assets/min-dark-BSWPekZh.js +0 -1
  409. package/dist/ui/assets/min-light-DDpmG2fV.js +0 -1
  410. package/dist/ui/assets/mipsasm-BMqwQI7S.js +0 -1
  411. package/dist/ui/assets/mojo-BgCJLMeH.js +0 -1
  412. package/dist/ui/assets/monokai-CdkpiU2Y.js +0 -1
  413. package/dist/ui/assets/moonbit-CaWjb8XO.js +0 -1
  414. package/dist/ui/assets/move-B1IS1UjX.js +0 -1
  415. package/dist/ui/assets/narrat-_X_XdTYD.js +0 -1
  416. package/dist/ui/assets/nextflow-Bbiyy34d.js +0 -1
  417. package/dist/ui/assets/nextflow-groovy-Dc_ddanL.js +0 -1
  418. package/dist/ui/assets/nginx-CzJafxLa.js +0 -1
  419. package/dist/ui/assets/night-owl-DhmEMT88.js +0 -1
  420. package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +0 -1
  421. package/dist/ui/assets/nim-DABKtHtM.js +0 -1
  422. package/dist/ui/assets/nix-IvuFDN5E.js +0 -1
  423. package/dist/ui/assets/nord-Cb4Vim4T.js +0 -1
  424. package/dist/ui/assets/nushell-DcLAeLz5.js +0 -1
  425. package/dist/ui/assets/objective-c-D1A_Heim.js +0 -1
  426. package/dist/ui/assets/objective-cpp-BsSzOQcm.js +0 -1
  427. package/dist/ui/assets/ocaml-O90oeIOV.js +0 -1
  428. package/dist/ui/assets/odin-B1RWQWA5.js +0 -1
  429. package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +0 -1
  430. package/dist/ui/assets/one-light-D7Lr4KcI.js +0 -1
  431. package/dist/ui/assets/openscad-BUDT5pXO.js +0 -1
  432. package/dist/ui/assets/pascal-4ZHwLPI5.js +0 -1
  433. package/dist/ui/assets/perl-CBh7L3lZ.js +0 -1
  434. package/dist/ui/assets/php-DFbI9q5p.js +0 -1
  435. package/dist/ui/assets/pierre-dark-sU4Zdns8.js +0 -1
  436. package/dist/ui/assets/pierre-dark-soft-HXgun5vs.js +0 -1
  437. package/dist/ui/assets/pierre-light-DWBk51d8.js +0 -1
  438. package/dist/ui/assets/pierre-light-soft-CodEzPxf.js +0 -1
  439. package/dist/ui/assets/pkl-ot-7Btpt.js +0 -1
  440. package/dist/ui/assets/plastic-DQwYfKfQ.js +0 -1
  441. package/dist/ui/assets/plsql-DGHpHOYJ.js +0 -1
  442. package/dist/ui/assets/po-BiJDBrnU.js +0 -1
  443. package/dist/ui/assets/poimandres-DRFjx7u4.js +0 -1
  444. package/dist/ui/assets/polar-C7UOKdEL.js +0 -1
  445. package/dist/ui/assets/postcss-BXeXVLqQ.js +0 -1
  446. package/dist/ui/assets/powerquery-DNMTfnFr.js +0 -1
  447. package/dist/ui/assets/powershell-DshXNtvi.js +0 -1
  448. package/dist/ui/assets/prisma-BsRQq5mF.js +0 -1
  449. package/dist/ui/assets/prolog-iXnhIJG7.js +0 -1
  450. package/dist/ui/assets/proto-DB4EqR-F.js +0 -1
  451. package/dist/ui/assets/pug-C_PxC7gO.js +0 -1
  452. package/dist/ui/assets/puppet-CDv2pdJW.js +0 -1
  453. package/dist/ui/assets/purescript-9MfHhQsQ.js +0 -1
  454. package/dist/ui/assets/python-gzcpVVnB.js +0 -1
  455. package/dist/ui/assets/qml-DtngoFFK.js +0 -1
  456. package/dist/ui/assets/qmldir-DCQb3MpD.js +0 -1
  457. package/dist/ui/assets/qss-Fe1Jh2GI.js +0 -1
  458. package/dist/ui/assets/r-DohkcevW.js +0 -1
  459. package/dist/ui/assets/racket-DcIDlBhZ.js +0 -1
  460. package/dist/ui/assets/raku-B3gFvitq.js +0 -1
  461. package/dist/ui/assets/razor-C4t8J0_E.js +0 -1
  462. package/dist/ui/assets/red-CJ3rzSJv.js +0 -1
  463. package/dist/ui/assets/reg-CRGYupPL.js +0 -1
  464. package/dist/ui/assets/regexp-OGbTbjgY.js +0 -1
  465. package/dist/ui/assets/rel-BtDbiS_P.js +0 -1
  466. package/dist/ui/assets/review-payload-C5Qz60Kq.js +0 -1
  467. package/dist/ui/assets/riscv-Ckw8ddFX.js +0 -1
  468. package/dist/ui/assets/ron-VUp2lXgN.js +0 -1
  469. package/dist/ui/assets/rose-pine-BthvhNj6.js +0 -1
  470. package/dist/ui/assets/rose-pine-dawn-Dg85fqjY.js +0 -1
  471. package/dist/ui/assets/rose-pine-moon-hon4tzzS.js +0 -1
  472. package/dist/ui/assets/rosmsg-CAekHB0j.js +0 -1
  473. package/dist/ui/assets/rst-CfBbbcvC.js +0 -1
  474. package/dist/ui/assets/ruby-Bw0mpxHY.js +0 -1
  475. package/dist/ui/assets/rust-Cfkwpbl8.js +0 -1
  476. package/dist/ui/assets/sas-Cs3s9JOf.js +0 -1
  477. package/dist/ui/assets/sass-DXrisJhu.js +0 -1
  478. package/dist/ui/assets/scala-DKOlJaKm.js +0 -1
  479. package/dist/ui/assets/scheme-DQCgrYNe.js +0 -1
  480. package/dist/ui/assets/scss-sRxNJS54.js +0 -1
  481. package/dist/ui/assets/sdbl-bTVj8UrX.js +0 -1
  482. package/dist/ui/assets/shaderlab-TOUzSsQk.js +0 -1
  483. package/dist/ui/assets/shellscript-B0X6wh0R.js +0 -1
  484. package/dist/ui/assets/shellsession-D2FdOioR.js +0 -1
  485. package/dist/ui/assets/slack-dark-DnToyrRv.js +0 -1
  486. package/dist/ui/assets/slack-ochin-B2OO5cIa.js +0 -1
  487. package/dist/ui/assets/smalltalk-B16xEiuN.js +0 -1
  488. package/dist/ui/assets/snazzy-light-4G7pJPwS.js +0 -1
  489. package/dist/ui/assets/solarized-dark-DV17i1UV.js +0 -1
  490. package/dist/ui/assets/solarized-light-DSh2HLQt.js +0 -1
  491. package/dist/ui/assets/solidity-CKzVLygQ.js +0 -1
  492. package/dist/ui/assets/soy-s6g9OjJ1.js +0 -1
  493. package/dist/ui/assets/sparql-D_iOobhT.js +0 -1
  494. package/dist/ui/assets/splunk-BC2Px7Mm.js +0 -1
  495. package/dist/ui/assets/sql-DVTnh5V-.js +0 -1
  496. package/dist/ui/assets/ssh-config-BgfXC-Er.js +0 -1
  497. package/dist/ui/assets/stata-DFIDiXF9.js +0 -1
  498. package/dist/ui/assets/stylus-B6D30XZt.js +0 -1
  499. package/dist/ui/assets/surrealql-DVfrsLyg.js +0 -1
  500. package/dist/ui/assets/svelte-D5GsxESq.js +0 -1
  501. package/dist/ui/assets/swift-DonLKvLd.js +0 -1
  502. package/dist/ui/assets/synthwave-84-nFMaYfgc.js +0 -1
  503. package/dist/ui/assets/system-verilog-DJ5XKQeo.js +0 -1
  504. package/dist/ui/assets/systemd-BxMlprV5.js +0 -1
  505. package/dist/ui/assets/talonscript-CohzipZa.js +0 -1
  506. package/dist/ui/assets/tasl-DMoTqEGO.js +0 -1
  507. package/dist/ui/assets/tcl-CZd0xW_V.js +0 -1
  508. package/dist/ui/assets/templ-DI-Zyqzd.js +0 -1
  509. package/dist/ui/assets/terraform-DswuEJGm.js +0 -1
  510. package/dist/ui/assets/tex-WHHmlbJI.js +0 -1
  511. package/dist/ui/assets/tokyo-night-oM2G3aXe.js +0 -1
  512. package/dist/ui/assets/toml-CcmNWLt0.js +0 -1
  513. package/dist/ui/assets/ts-tags-Dwpo2RFJ.js +0 -1
  514. package/dist/ui/assets/tsv-sltzmVWM.js +0 -1
  515. package/dist/ui/assets/tsx-ph_idaAW.js +0 -1
  516. package/dist/ui/assets/turtle-ByJddavk.js +0 -1
  517. package/dist/ui/assets/twig-YO17jFjR.js +0 -1
  518. package/dist/ui/assets/typescript-CbAxjhkl.js +0 -1
  519. package/dist/ui/assets/typespec-B88KGewJ.js +0 -1
  520. package/dist/ui/assets/typst-DI99ib-x.js +0 -1
  521. package/dist/ui/assets/useFileDiffInstance-B2DLX3Vg.js +0 -244
  522. package/dist/ui/assets/v-DETTlOr0.js +0 -1
  523. package/dist/ui/assets/vala-zf12oZj6.js +0 -1
  524. package/dist/ui/assets/vb-Djn5o6TS.js +0 -1
  525. package/dist/ui/assets/verilog-CiiDBU1e.js +0 -1
  526. package/dist/ui/assets/vesper-D5bVUKB1.js +0 -1
  527. package/dist/ui/assets/vhdl-BroJfC0k.js +0 -1
  528. package/dist/ui/assets/viml-DvXPmvsu.js +0 -1
  529. package/dist/ui/assets/vitesse-black-fwtXNY1n.js +0 -1
  530. package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +0 -1
  531. package/dist/ui/assets/vitesse-light-VbXTXTou.js +0 -1
  532. package/dist/ui/assets/vue-CraHL-Ps.js +0 -1
  533. package/dist/ui/assets/vue-html-e9tyZNtS.js +0 -1
  534. package/dist/ui/assets/vue-vine-CofmxaUb.js +0 -1
  535. package/dist/ui/assets/vyper-CgoNMtux.js +0 -1
  536. package/dist/ui/assets/wasm-BnjxR4X6.js +0 -1
  537. package/dist/ui/assets/wasm-ByWQv1Qj.js +0 -1
  538. package/dist/ui/assets/wenyan-C8pVoKbM.js +0 -1
  539. package/dist/ui/assets/wgsl-BsKzXJz4.js +0 -1
  540. package/dist/ui/assets/wikitext-ClFFjSW2.js +0 -1
  541. package/dist/ui/assets/wit-DdvCle-K.js +0 -1
  542. package/dist/ui/assets/wolfram-DLL8P-h_.js +0 -1
  543. package/dist/ui/assets/workspace-app-8--oTbCd.css +0 -1
  544. package/dist/ui/assets/xml-BWSdPZHm.js +0 -1
  545. package/dist/ui/assets/xsl-BtCt7Hx8.js +0 -1
  546. package/dist/ui/assets/yaml-BZiTw7cQ.js +0 -1
  547. package/dist/ui/assets/zenscript-BnlCZFoB.js +0 -1
  548. package/dist/ui/assets/zig-CMLA9XwU.js +0 -1
  549. package/docs/assets/auvrynt-logo-light.png +0 -0
  550. package/docs/assets/auvrynt-screenshot.png +0 -0
@@ -0,0 +1,106 @@
1
+ import * as z from "zod/v4";
2
+ import { registerAppTool } from "../../server/mcp-tool-registrar.js";
3
+ import { resolveContext7ApiKey, summarizeContext7Auth, } from "../../infrastructure/context7-auth.js";
4
+ const READ_ONLY = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true };
5
+ function text(payload, isError = false) {
6
+ return {
7
+ content: [{ type: "text", text: typeof payload === "string" ? payload : JSON.stringify(payload, null, 2) }],
8
+ ...(isError ? { isError: true } : {}),
9
+ };
10
+ }
11
+ async function context7Get(path, params) {
12
+ const key = resolveContext7ApiKey();
13
+ if (!key) {
14
+ throw new Error("Context7 API key is not configured. Add it in the Secrets tab or set AUVRYNT_CONTEXT7_API_KEY.");
15
+ }
16
+ const url = new URL(`https://context7.com${path}`);
17
+ for (const [param, value] of Object.entries(params)) {
18
+ if (value)
19
+ url.searchParams.set(param, value);
20
+ }
21
+ const response = await fetch(url, {
22
+ headers: {
23
+ Authorization: `Bearer ${key}`,
24
+ Accept: "application/json",
25
+ },
26
+ signal: AbortSignal.timeout(30_000),
27
+ });
28
+ const body = await response.text();
29
+ let parsed = body;
30
+ try {
31
+ parsed = JSON.parse(body);
32
+ }
33
+ catch {
34
+ // keep raw text
35
+ }
36
+ if (!response.ok) {
37
+ const message = typeof parsed === "object" && parsed && "message" in parsed
38
+ ? String(parsed.message)
39
+ : body.slice(0, 500);
40
+ throw new Error(`Context7 HTTP ${response.status}: ${message}`);
41
+ }
42
+ return parsed;
43
+ }
44
+ export function registerContext7Tools(server) {
45
+ registerAppTool(server, "context7_resolve_library", {
46
+ title: "Resolve Context7 library",
47
+ description: "Search Context7 for a library by name and return matching library IDs (e.g. /vercel/next.js). Use before context7_query_docs when the exact ID is unknown.",
48
+ inputSchema: {
49
+ libraryName: z.string().min(1).describe("Library or package name to search for (e.g. next.js, react, zod)."),
50
+ query: z.string().optional().describe("Optional task/question used to rank matches by relevance."),
51
+ },
52
+ annotations: READ_ONLY,
53
+ _meta: {},
54
+ }, async ({ libraryName, query }) => {
55
+ try {
56
+ const data = await context7Get("/api/v2/libs/search", {
57
+ libraryName,
58
+ query: query ?? libraryName,
59
+ });
60
+ return text(data);
61
+ }
62
+ catch (error) {
63
+ return text(error instanceof Error ? error.message : String(error), true);
64
+ }
65
+ });
66
+ registerAppTool(server, "context7_query_docs", {
67
+ title: "Query Context7 docs",
68
+ description: "Fetch up-to-date documentation snippets for a Context7 library ID. Prefer resolve_library first when the ID is unknown.",
69
+ inputSchema: {
70
+ libraryId: z
71
+ .string()
72
+ .min(2)
73
+ .describe("Exact Context7 library ID such as /vercel/next.js or /mongodb/docs."),
74
+ query: z.string().min(1).describe("Natural-language question or task to retrieve relevant docs for."),
75
+ type: z.enum(["json", "txt"]).optional().describe("Response type. Defaults to json."),
76
+ },
77
+ annotations: READ_ONLY,
78
+ _meta: {},
79
+ }, async ({ libraryId, query, type }) => {
80
+ try {
81
+ const data = await context7Get("/api/v2/context", {
82
+ libraryId,
83
+ query,
84
+ type: type ?? "json",
85
+ });
86
+ return text(data);
87
+ }
88
+ catch (error) {
89
+ return text(error instanceof Error ? error.message : String(error), true);
90
+ }
91
+ });
92
+ registerAppTool(server, "context7_status", {
93
+ title: "Context7 status",
94
+ description: "Report whether a Context7 API key is configured (fingerprint only; the key is never returned).",
95
+ inputSchema: {},
96
+ annotations: READ_ONLY,
97
+ _meta: {},
98
+ }, async () => {
99
+ const summary = summarizeContext7Auth();
100
+ return text({
101
+ configured: summary.configured,
102
+ fingerprint: summary.fingerprint ?? null,
103
+ environmentOverride: summary.environmentOverride,
104
+ });
105
+ });
106
+ }
@@ -0,0 +1,195 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { execFile } from "node:child_process";
3
+ import { promisify } from "node:util";
4
+ import { dirname } from "node:path";
5
+ const execFileAsync = promisify(execFile);
6
+ export function parseDotnetBuildOutput(output) {
7
+ const errors = [];
8
+ const warnings = [];
9
+ const lines = output.split(/\r?\n/);
10
+ const diagRegex = /^(.*?)\((\d+),(\d+)\):\s*(error|warning)\s*([A-Z0-9]+)?:\s*(.*?)(?:\[.*\])?$/;
11
+ for (const line of lines) {
12
+ const match = line.trim().match(diagRegex);
13
+ if (match) {
14
+ const [, filePath, lineNum, colNum, severity, code, message] = match;
15
+ const diag = {
16
+ path: filePath,
17
+ line: Number(lineNum),
18
+ column: Number(colNum),
19
+ code: code ?? undefined,
20
+ message: message.trim(),
21
+ };
22
+ if (severity.toLowerCase() === "error")
23
+ errors.push(diag);
24
+ else
25
+ warnings.push(diag);
26
+ }
27
+ }
28
+ const success = errors.length === 0 && !output.includes("Build FAILED");
29
+ return { success, errors, warnings };
30
+ }
31
+ export function parseDotnetTestOutput(output) {
32
+ let passed = 0;
33
+ let failed = 0;
34
+ let skipped = 0;
35
+ const failedTestNames = [];
36
+ const assertionMessages = [];
37
+ const summaryMatch = output.match(/Failed:\s*(\d+),\s*Passed:\s*(\d+),\s*Skipped:\s*(\d+)/i);
38
+ if (summaryMatch) {
39
+ failed = Number(summaryMatch[1]);
40
+ passed = Number(summaryMatch[2]);
41
+ skipped = Number(summaryMatch[3]);
42
+ }
43
+ const lines = output.split(/\r?\n/);
44
+ for (const line of lines) {
45
+ if (line.includes("Failed ") || line.includes("Failed:")) {
46
+ const nameMatch = line.match(/Failed\s+([A-Za-z0-9_.]+)/);
47
+ if (nameMatch && !failedTestNames.includes(nameMatch[1]))
48
+ failedTestNames.push(nameMatch[1]);
49
+ }
50
+ if (line.includes("Assert.") || line.includes("Expected:") || line.includes("Actual:")) {
51
+ assertionMessages.push(line.trim());
52
+ }
53
+ }
54
+ return { passed, failed, skipped, failedTestNames, assertionMessages };
55
+ }
56
+ export async function inspectDotnetProject(registry, input) {
57
+ const workspace = registry.getWorkspace(input.workspaceId);
58
+ const absolutePath = registry.resolvePath(workspace, input.projectPath);
59
+ let xmlContent = "";
60
+ try {
61
+ xmlContent = await readFile(absolutePath, "utf8");
62
+ }
63
+ catch {
64
+ throw new Error(`Unable to read .NET project file: ${input.projectPath}`);
65
+ }
66
+ const sdkStyle = xmlContent.includes('<Project Sdk=') || xmlContent.includes('Sdk="Microsoft.NET.Sdk');
67
+ const tfmMatch = xmlContent.match(/<TargetFrameworks?>(.*?)<\/TargetFrameworks?>/i);
68
+ const targetFrameworks = tfmMatch ? tfmMatch[1].split(";").map((t) => t.trim()) : [];
69
+ const outputTypeMatch = xmlContent.match(/<OutputType>(.*?)<\/OutputType>/i);
70
+ const outputType = outputTypeMatch ? outputTypeMatch[1].trim() : "Exe";
71
+ const nullableMatch = xmlContent.match(/<Nullable>(.*?)<\/Nullable>/i);
72
+ const nullable = nullableMatch ? nullableMatch[1].trim() : "enable";
73
+ const implicitUsingsMatch = xmlContent.match(/<ImplicitUsings>(.*?)<\/ImplicitUsings>/i);
74
+ const implicitUsings = implicitUsingsMatch ? implicitUsingsMatch[1].trim() : "enable";
75
+ const packageReferences = [];
76
+ const pkgRegex = /<PackageReference\s+Include="([^"]+)"/g;
77
+ let pkgMatch;
78
+ while ((pkgMatch = pkgRegex.exec(xmlContent)) !== null)
79
+ packageReferences.push(pkgMatch[1]);
80
+ const projectReferences = [];
81
+ const projRefRegex = /<ProjectReference\s+Include="([^"]+)"/g;
82
+ let projRefMatch;
83
+ while ((projRefMatch = projRefRegex.exec(xmlContent)) !== null)
84
+ projectReferences.push(projRefMatch[1]);
85
+ let testFramework;
86
+ if (packageReferences.some((p) => p.includes("xunit")))
87
+ testFramework = "xUnit";
88
+ else if (packageReferences.some((p) => p.includes("nunit")))
89
+ testFramework = "NUnit";
90
+ else if (packageReferences.some((p) => p.includes("MSTest")))
91
+ testFramework = "MSTest";
92
+ return {
93
+ projectPath: input.projectPath,
94
+ sdkStyle,
95
+ targetFrameworks,
96
+ outputType,
97
+ nullable,
98
+ implicitUsings,
99
+ packageReferences,
100
+ projectReferences,
101
+ testFramework,
102
+ };
103
+ }
104
+ export async function dotnetRestore(registry, input) {
105
+ const workspace = registry.getWorkspace(input.workspaceId);
106
+ const absolutePath = registry.resolvePath(workspace, input.projectPath);
107
+ const cwd = dirname(absolutePath);
108
+ const start = Date.now();
109
+ try {
110
+ const { stdout, stderr } = await execFileAsync("dotnet", ["restore", absolutePath], { cwd, windowsHide: true });
111
+ return { success: true, durationMs: Date.now() - start, output: (stdout + "\n" + stderr).slice(0, 1000) };
112
+ }
113
+ catch (err) {
114
+ return {
115
+ success: false,
116
+ durationMs: Date.now() - start,
117
+ output: (err.stdout ?? "") + "\n" + (err.stderr ?? err.message),
118
+ };
119
+ }
120
+ }
121
+ export async function dotnetBuild(registry, input) {
122
+ const workspace = registry.getWorkspace(input.workspaceId);
123
+ const absolutePath = registry.resolvePath(workspace, input.projectPath);
124
+ const cwd = dirname(absolutePath);
125
+ const args = ["build", absolutePath];
126
+ if (input.configuration)
127
+ args.push("-c", input.configuration);
128
+ if (input.noRestore)
129
+ args.push("--no-restore");
130
+ const start = Date.now();
131
+ try {
132
+ const { stdout, stderr } = await execFileAsync("dotnet", args, { cwd, windowsHide: true });
133
+ const parsed = parseDotnetBuildOutput(stdout + "\n" + stderr);
134
+ return { success: parsed.success, durationMs: Date.now() - start, errors: parsed.errors, warnings: parsed.warnings };
135
+ }
136
+ catch (err) {
137
+ const parsed = parseDotnetBuildOutput((err.stdout ?? "") + "\n" + (err.stderr ?? err.message));
138
+ return {
139
+ success: false,
140
+ durationMs: Date.now() - start,
141
+ errors: parsed.errors.length > 0 ? parsed.errors : [{ message: err.message }],
142
+ warnings: parsed.warnings,
143
+ };
144
+ }
145
+ }
146
+ export async function dotnetTest(registry, input) {
147
+ const workspace = registry.getWorkspace(input.workspaceId);
148
+ const absolutePath = registry.resolvePath(workspace, input.projectPath);
149
+ const cwd = dirname(absolutePath);
150
+ const args = ["test", absolutePath];
151
+ if (input.configuration)
152
+ args.push("-c", input.configuration);
153
+ if (input.filter)
154
+ args.push("--filter", input.filter);
155
+ if (input.noBuild)
156
+ args.push("--no-build");
157
+ const start = Date.now();
158
+ try {
159
+ const { stdout, stderr } = await execFileAsync("dotnet", args, { cwd, windowsHide: true });
160
+ return { ...parseDotnetTestOutput(stdout + "\n" + stderr), durationMs: Date.now() - start };
161
+ }
162
+ catch (err) {
163
+ return {
164
+ ...parseDotnetTestOutput((err.stdout ?? "") + "\n" + (err.stderr ?? err.message)),
165
+ durationMs: Date.now() - start,
166
+ };
167
+ }
168
+ }
169
+ export async function dotnetRun(registry, processManager, input) {
170
+ const workspace = registry.getWorkspace(input.workspaceId);
171
+ const absolutePath = registry.resolvePath(workspace, input.projectPath);
172
+ const configArg = input.configuration ? `-c ${input.configuration}` : "";
173
+ const extraArgs = input.arguments?.length ? `-- ${input.arguments.join(" ")}` : "";
174
+ const command = `dotnet run --project "${absolutePath}" ${configArg} ${extraArgs}`.trim();
175
+ const result = processManager.startProcess({
176
+ workspaceId: input.workspaceId,
177
+ command,
178
+ environment: input.environment,
179
+ });
180
+ return { processId: result.processId, status: result.status, detectedUrls: result.detectedUrls };
181
+ }
182
+ export async function dotnetFormat(registry, input) {
183
+ const workspace = registry.getWorkspace(input.workspaceId);
184
+ const absolutePath = registry.resolvePath(workspace, input.projectPath);
185
+ const args = ["format", absolutePath];
186
+ if (input.verifyOnly)
187
+ args.push("--verify-no-changes");
188
+ try {
189
+ const { stdout, stderr } = await execFileAsync("dotnet", args, { cwd: dirname(absolutePath), windowsHide: true });
190
+ return { success: true, output: (stdout + "\n" + stderr).slice(0, 1000) };
191
+ }
192
+ catch (err) {
193
+ return { success: false, output: (err.stdout ?? "") + "\n" + (err.stderr ?? err.message) };
194
+ }
195
+ }
@@ -0,0 +1,74 @@
1
+ export async function listAnimations(input, bridgeClient) {
2
+ if (!bridgeClient.status)
3
+ throw new Error("Godot Editor Bridge is not connected.");
4
+ const result = await bridgeClient.sendRequest("animation.list", { nodePath: input.animationPlayerNodePath });
5
+ return result.animations ?? [];
6
+ }
7
+ export async function getAnimation(input, bridgeClient) {
8
+ if (!bridgeClient.status)
9
+ throw new Error("Godot Editor Bridge is not connected.");
10
+ return bridgeClient.sendRequest("animation.get", {
11
+ nodePath: input.animationPlayerNodePath,
12
+ animationName: input.animationName,
13
+ });
14
+ }
15
+ export async function createAnimation(input, bridgeClient) {
16
+ if (!bridgeClient.status)
17
+ throw new Error("Godot Editor Bridge is not connected.");
18
+ await bridgeClient.sendRequest("animation.create", {
19
+ nodePath: input.animationPlayerNodePath,
20
+ animationName: input.animationName,
21
+ length: input.lengthSeconds ?? 1,
22
+ loop: input.loop ?? false,
23
+ });
24
+ return { created: true, name: input.animationName };
25
+ }
26
+ export async function validateAnimation(input, bridgeClient) {
27
+ if (!bridgeClient.status)
28
+ throw new Error("Godot Editor Bridge is not connected.");
29
+ const animation = await getAnimation(input, bridgeClient);
30
+ const issues = [];
31
+ if (animation.lengthSeconds === 0)
32
+ issues.push("Animation length is zero.");
33
+ for (const track of animation.tracks) {
34
+ if (track.keys.length === 0)
35
+ issues.push(`Track '${track.targetPath}' has no keys.`);
36
+ }
37
+ return { valid: issues.length === 0, issues };
38
+ }
39
+ export async function getTileLayers(input, bridgeClient) {
40
+ if (!bridgeClient.status)
41
+ throw new Error("Godot Editor Bridge is not connected.");
42
+ const result = await bridgeClient.sendRequest("tilemap.get_layers", { nodePath: input.tileMapNodePath });
43
+ return result.layers ?? [];
44
+ }
45
+ export async function inspectTileset(input, bridgeClient) {
46
+ if (!bridgeClient.status)
47
+ throw new Error("Godot Editor Bridge is not connected.");
48
+ return bridgeClient.sendRequest("tilemap.inspect_tileset", { nodePath: input.tileMapNodePath });
49
+ }
50
+ export async function validateTilemap(input, bridgeClient) {
51
+ if (!bridgeClient.status)
52
+ throw new Error("Godot Editor Bridge is not connected.");
53
+ return bridgeClient.sendRequest("tilemap.validate", { nodePath: input.tileMapNodePath });
54
+ }
55
+ export async function getPhysicsConfiguration(input, bridgeClient) {
56
+ if (!bridgeClient.status)
57
+ throw new Error("Godot Editor Bridge is not connected.");
58
+ return bridgeClient.sendRequest("physics.get_configuration", { nodePath: input.nodePath ?? "/" });
59
+ }
60
+ export async function validateCollisions(input, bridgeClient) {
61
+ if (!bridgeClient.status)
62
+ throw new Error("Godot Editor Bridge is not connected.");
63
+ return bridgeClient.sendRequest("physics.validate_collisions", { nodePath: input.nodePath ?? "/" });
64
+ }
65
+ export async function getCameraState(input, bridgeClient) {
66
+ if (!bridgeClient.status)
67
+ throw new Error("Godot Editor Bridge is not connected.");
68
+ return bridgeClient.sendRequest("camera.get_state", { nodePath: input.cameraNodePath });
69
+ }
70
+ export async function validateCamera(input, bridgeClient) {
71
+ if (!bridgeClient.status)
72
+ throw new Error("Godot Editor Bridge is not connected.");
73
+ return bridgeClient.sendRequest("camera.validate", { nodePath: input.cameraNodePath });
74
+ }
@@ -0,0 +1,91 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { dirname } from "node:path";
4
+ import { parseDotnetBuildOutput } from "../../dotnet-tools.js";
5
+ import { inspectGodotDotnetProject } from "./godot-csharp-project.js";
6
+ const execFileAsync = promisify(execFile);
7
+ export function parseGodotBuildDiagnostics(output) {
8
+ const base = parseDotnetBuildOutput(output);
9
+ const mapDiag = (d) => {
10
+ let source = "csharp";
11
+ if (d.code?.startsWith("CS"))
12
+ source = "csharp";
13
+ else if (d.code?.startsWith("MSB"))
14
+ source = "msbuild";
15
+ else if (d.code?.startsWith("NU"))
16
+ source = "nuget";
17
+ else if (d.message.toLowerCase().includes("godot"))
18
+ source = "godot";
19
+ return {
20
+ source,
21
+ code: d.code,
22
+ message: d.message,
23
+ path: d.path,
24
+ line: d.line,
25
+ column: d.column,
26
+ };
27
+ };
28
+ return {
29
+ success: base.success,
30
+ errors: base.errors.map(mapDiag),
31
+ warnings: base.warnings.map(mapDiag),
32
+ };
33
+ }
34
+ export async function godotDotnetBuild(registry, input) {
35
+ const workspace = registry.getWorkspace(input.workspaceId);
36
+ const targetDir = registry.resolvePath(workspace, input.projectPath);
37
+ const details = await inspectGodotDotnetProject(registry, { workspaceId: input.workspaceId, projectPath: input.projectPath });
38
+ const buildTarget = details.slnPath ? registry.resolvePath(workspace, details.slnPath) : (details.csprojPath ? registry.resolvePath(workspace, details.csprojPath) : targetDir);
39
+ const config = input.configuration ?? "Debug";
40
+ const args = ["build", buildTarget, "-c", config];
41
+ if (input.noRestore)
42
+ args.push("--no-restore");
43
+ const start = Date.now();
44
+ try {
45
+ const { stdout, stderr } = await execFileAsync("dotnet", args, { cwd: dirname(buildTarget), windowsHide: true });
46
+ const parsed = parseGodotBuildDiagnostics(stdout + "\n" + stderr);
47
+ return {
48
+ success: parsed.success,
49
+ configuration: config,
50
+ targetFrameworks: details.targetFrameworks,
51
+ outputAssemblies: details.assemblyName ? [`${details.assemblyName}.dll`] : [],
52
+ errors: parsed.errors,
53
+ warnings: parsed.warnings,
54
+ durationMs: Date.now() - start,
55
+ };
56
+ }
57
+ catch (err) {
58
+ const parsed = parseGodotBuildDiagnostics((err.stdout ?? "") + "\n" + (err.stderr ?? err.message));
59
+ return {
60
+ success: false,
61
+ configuration: config,
62
+ targetFrameworks: details.targetFrameworks,
63
+ outputAssemblies: [],
64
+ errors: parsed.errors.length > 0 ? parsed.errors : [{ source: "csharp", message: err.message }],
65
+ warnings: parsed.warnings,
66
+ durationMs: Date.now() - start,
67
+ };
68
+ }
69
+ }
70
+ export async function godotDotnetClean(registry, input) {
71
+ const workspace = registry.getWorkspace(input.workspaceId);
72
+ const targetDir = registry.resolvePath(workspace, input.projectPath);
73
+ const config = input.configuration ?? "Debug";
74
+ const args = ["clean", targetDir, "-c", config];
75
+ const start = Date.now();
76
+ try {
77
+ const { stdout, stderr } = await execFileAsync("dotnet", args, { cwd: targetDir, windowsHide: true });
78
+ return {
79
+ success: true,
80
+ durationMs: Date.now() - start,
81
+ output: (stdout + "\n" + stderr).slice(0, 1000),
82
+ };
83
+ }
84
+ catch (err) {
85
+ return {
86
+ success: false,
87
+ durationMs: Date.now() - start,
88
+ output: (err.stdout ?? "") + "\n" + (err.stderr ?? err.message),
89
+ };
90
+ }
91
+ }
@@ -0,0 +1,155 @@
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 ([".godot", "bin", "obj", "node_modules", ".git"].includes(entry.name))
36
+ continue;
37
+ await scanDir(join(dir, entry.name));
38
+ }
39
+ else if (entry.isFile()) {
40
+ if (entry.name.endsWith(".cs"))
41
+ csharpScriptCount++;
42
+ else if (entry.name.endsWith(".gd"))
43
+ gdscriptCount++;
44
+ else if (entry.name.endsWith(".csproj"))
45
+ csprojFile = join(dir, entry.name);
46
+ else if (entry.name.endsWith(".sln"))
47
+ slnFile = join(dir, entry.name);
48
+ }
49
+ }
50
+ }
51
+ await scanDir(targetDir);
52
+ let targetFrameworks = [];
53
+ let godotNetSdkVersion;
54
+ const packageReferences = [];
55
+ const projectReferences = [];
56
+ const nullable = "enable";
57
+ const implicitUsings = "enable";
58
+ let rootNamespace;
59
+ let assemblyName;
60
+ if (csprojFile) {
61
+ try {
62
+ const xml = await readFile(csprojFile, "utf8");
63
+ const tfmMatch = xml.match(/<TargetFrameworks?>(.*?)<\/TargetFrameworks?>/i);
64
+ if (tfmMatch)
65
+ targetFrameworks = tfmMatch[1].split(";").map((t) => t.trim());
66
+ const sdkMatch = xml.match(/Godot\.NET\.Sdk\/([0-9.]+)/i);
67
+ if (sdkMatch)
68
+ godotNetSdkVersion = sdkMatch[1];
69
+ const nsMatch = xml.match(/<RootNamespace>(.*?)<\/RootNamespace>/i);
70
+ if (nsMatch)
71
+ rootNamespace = nsMatch[1].trim();
72
+ const asmMatch = xml.match(/<AssemblyName>(.*?)<\/AssemblyName>/i);
73
+ if (asmMatch)
74
+ assemblyName = asmMatch[1].trim();
75
+ const pkgRegex = /<PackageReference\s+Include="([^"]+)"/g;
76
+ let match;
77
+ while ((match = pkgRegex.exec(xml)) !== null)
78
+ packageReferences.push(match[1]);
79
+ }
80
+ catch { }
81
+ }
82
+ const isMixedLanguage = csharpScriptCount > 0 && gdscriptCount > 0;
83
+ const requiresSolutionRegeneration = !slnFile || !csprojFile;
84
+ return {
85
+ projectGodotPath: relative(workspace.root, projectGodotPath).replace(/\\/g, "/"),
86
+ name: parsedGodot.name,
87
+ mainScene: parsedGodot.mainScene,
88
+ renderer: parsedGodot.renderer,
89
+ godotVersionFeatures: parsedGodot.features,
90
+ csprojPath: csprojFile ? relative(workspace.root, csprojFile).replace(/\\/g, "/") : undefined,
91
+ slnPath: slnFile ? relative(workspace.root, slnFile).replace(/\\/g, "/") : undefined,
92
+ targetFrameworks,
93
+ godotNetSdkVersion,
94
+ packageReferences,
95
+ projectReferences,
96
+ nullable,
97
+ implicitUsings,
98
+ rootNamespace,
99
+ assemblyName,
100
+ autoloads: parsedGodot.autoloads,
101
+ inputActions: parsedGodot.inputActions,
102
+ csharpScriptCount,
103
+ gdscriptCount,
104
+ isMixedLanguage,
105
+ requiresSolutionRegeneration,
106
+ };
107
+ }
108
+ export async function godotBuildSolutions(registry, input) {
109
+ const workspace = registry.getWorkspace(input.workspaceId);
110
+ const targetDir = registry.resolvePath(workspace, input.projectPath);
111
+ const godotExe = process.env.GODOT_DOTNET_EXECUTABLE ?? process.env.GODOT_EXECUTABLE ?? "godot-mono";
112
+ const args = ["--headless", "--path", targetDir, "--build-solutions", "--quit"];
113
+ const start = Date.now();
114
+ try {
115
+ const { stdout, stderr } = await execFileAsync(godotExe, args, { cwd: targetDir, windowsHide: true });
116
+ const details = await inspectGodotDotnetProject(registry, { workspaceId: input.workspaceId, projectPath: input.projectPath });
117
+ return {
118
+ success: true,
119
+ durationMs: Date.now() - start,
120
+ generatedSln: details.slnPath,
121
+ generatedCsproj: details.csprojPath,
122
+ output: (stdout + "\n" + stderr).slice(0, 1000),
123
+ };
124
+ }
125
+ catch (err) {
126
+ return {
127
+ success: false,
128
+ durationMs: Date.now() - start,
129
+ output: (err.stdout ?? "") + "\n" + (err.stderr ?? err.message),
130
+ };
131
+ }
132
+ }
133
+ export async function godotDotnetRestore(registry, input) {
134
+ const workspace = registry.getWorkspace(input.workspaceId);
135
+ const targetDir = registry.resolvePath(workspace, input.projectPath);
136
+ const args = ["restore", targetDir];
137
+ if (input.lockedMode)
138
+ args.push("--locked-mode");
139
+ const start = Date.now();
140
+ try {
141
+ const { stdout, stderr } = await execFileAsync("dotnet", args, { cwd: targetDir, windowsHide: true });
142
+ return {
143
+ success: true,
144
+ durationMs: Date.now() - start,
145
+ output: (stdout + "\n" + stderr).slice(0, 1000),
146
+ };
147
+ }
148
+ catch (err) {
149
+ return {
150
+ success: false,
151
+ durationMs: Date.now() - start,
152
+ output: (err.stdout ?? "") + "\n" + (err.stderr ?? err.message),
153
+ };
154
+ }
155
+ }