@atelierai/uco 1.0.6 → 1.0.8

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 (280) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +7 -8
  3. package/bin/server.mjs +1 -1
  4. package/bin/stub-plugin.mjs +3 -3
  5. package/dist/codegen/coerce.js +1 -1
  6. package/dist/codegen/coerce.js.map +1 -1
  7. package/dist/codegen/emit.js +2 -2
  8. package/dist/codegen/emit.js.map +1 -1
  9. package/dist/codegen/refs.js +1 -1
  10. package/dist/codegen/refs.js.map +1 -1
  11. package/dist/codegen/types.js +1 -1
  12. package/dist/codegen/types.js.map +1 -1
  13. package/dist/commands/call.js +1 -1
  14. package/dist/commands/call.js.map +1 -1
  15. package/dist/commands/devops/configure.js +1 -1
  16. package/dist/commands/devops/configure.js.map +1 -1
  17. package/dist/commands/devops/index.js +0 -4
  18. package/dist/commands/devops/index.js.map +1 -1
  19. package/dist/commands/devops/install-plugin.js +1 -1
  20. package/dist/commands/devops/install-plugin.js.map +1 -1
  21. package/dist/commands/devops/open.js +7 -7
  22. package/dist/commands/devops/open.js.map +1 -1
  23. package/dist/commands/devops/status.js +3 -3
  24. package/dist/commands/devops/status.js.map +1 -1
  25. package/dist/commands/exec.js +1 -1
  26. package/dist/commands/exec.js.map +1 -1
  27. package/dist/commands/install.js +2 -2
  28. package/dist/commands/install.js.map +1 -1
  29. package/dist/commands/prompt.js +2 -2
  30. package/dist/commands/prompt.js.map +1 -1
  31. package/dist/commands/resource.js +2 -2
  32. package/dist/commands/resource.js.map +1 -1
  33. package/dist/commands/update.js +1 -26
  34. package/dist/commands/update.js.map +1 -1
  35. package/dist/config/port.js +2 -2
  36. package/dist/config/port.js.map +1 -1
  37. package/dist/config/resolve.d.ts +1 -2
  38. package/dist/config/resolve.js +0 -12
  39. package/dist/config/resolve.js.map +1 -1
  40. package/dist/devops/lib/configure.d.ts +1 -1
  41. package/dist/devops/lib/configure.js +2 -2
  42. package/dist/devops/lib/configure.js.map +1 -1
  43. package/dist/devops/lib/install-plugin.d.ts +1 -1
  44. package/dist/devops/lib/install-plugin.js +1 -1
  45. package/dist/devops/lib/install-plugin.js.map +1 -1
  46. package/dist/devops/lib/install.d.ts +2 -2
  47. package/dist/devops/lib/install.js +5 -5
  48. package/dist/devops/lib/install.js.map +1 -1
  49. package/dist/devops/lib/open.js +11 -32
  50. package/dist/devops/lib/open.js.map +1 -1
  51. package/dist/devops/lib/remove-plugin.d.ts +1 -1
  52. package/dist/devops/lib/remove-plugin.js +3 -3
  53. package/dist/devops/lib/remove-plugin.js.map +1 -1
  54. package/dist/devops/lib/run-tool.d.ts +2 -2
  55. package/dist/devops/lib/run-tool.js +2 -2
  56. package/dist/devops/lib/types.d.ts +17 -54
  57. package/dist/devops/lib/types.js +2 -2
  58. package/dist/devops/lib/types.js.map +1 -1
  59. package/dist/devops/lib/update.d.ts +0 -15
  60. package/dist/devops/lib/update.js +2 -91
  61. package/dist/devops/lib/update.js.map +1 -1
  62. package/dist/devops/utils/agents.d.ts +0 -28
  63. package/dist/devops/utils/agents.js +0 -462
  64. package/dist/devops/utils/agents.js.map +1 -1
  65. package/dist/devops/utils/config.d.ts +9 -18
  66. package/dist/devops/utils/config.js +7 -20
  67. package/dist/devops/utils/config.js.map +1 -1
  68. package/dist/devops/utils/editor-cache.js +1 -1
  69. package/dist/devops/utils/editor-cache.js.map +1 -1
  70. package/dist/devops/utils/launch-error-dismiss.d.ts +2 -2
  71. package/dist/devops/utils/launch-error-dismiss.js +5 -5
  72. package/dist/devops/utils/manifest.d.ts +2 -2
  73. package/dist/devops/utils/manifest.js +3 -3
  74. package/dist/devops/utils/manifest.js.map +1 -1
  75. package/dist/devops/utils/port.d.ts +1 -1
  76. package/dist/devops/utils/port.js +1 -1
  77. package/dist/devops/utils/probe.d.ts +1 -1
  78. package/dist/devops/utils/probe.js +1 -1
  79. package/dist/devops/utils/ui.js +2 -2
  80. package/dist/devops/utils/ui.js.map +1 -1
  81. package/dist/devops/utils/unity-editor.js +4 -4
  82. package/dist/devops/utils/unity-editor.js.map +1 -1
  83. package/dist/devops/utils/unity-hub.js +1 -1
  84. package/dist/devops/utils/unity-hub.js.map +1 -1
  85. package/dist/devops/utils/unity-shutdown.d.ts +1 -1
  86. package/dist/devops/utils/unity-shutdown.js +1 -1
  87. package/dist/devops/utils/update-check.js +3 -3
  88. package/dist/devops/utils/update-check.js.map +1 -1
  89. package/dist/devops/utils/vendor.d.ts +2 -2
  90. package/dist/devops/utils/vendor.js +4 -4
  91. package/dist/devops/utils/vendor.js.map +1 -1
  92. package/dist/generated/tools.js +1 -1
  93. package/dist/generated/tools.js.map +1 -1
  94. package/dist/program.js +3 -3
  95. package/dist/program.js.map +1 -1
  96. package/dist/server/app.d.ts +5 -5
  97. package/dist/server/app.js +3 -3
  98. package/dist/server/app.js.map +1 -1
  99. package/dist/server/index.d.ts +2 -2
  100. package/dist/server/index.js +2 -2
  101. package/dist/server/index.js.map +1 -1
  102. package/dist/server/rest/auth.d.ts +1 -1
  103. package/dist/server/rest/auth.js +3 -3
  104. package/dist/server/rest/auth.js.map +1 -1
  105. package/dist/server/rest/context.d.ts +2 -2
  106. package/dist/server/rest/forward.d.ts +2 -2
  107. package/dist/server/session/store.d.ts +3 -3
  108. package/dist/server/session/store.js +4 -4
  109. package/dist/server/session/store.js.map +1 -1
  110. package/dist/server/stub-client/scenarios.js +8 -8
  111. package/dist/server/stub-client/scenarios.js.map +1 -1
  112. package/dist/server/types.d.ts +11 -11
  113. package/dist/server/types.js +9 -9
  114. package/dist/server/types.js.map +1 -1
  115. package/dist/server/ws/hub.d.ts +8 -8
  116. package/dist/server/ws/hub.js +13 -13
  117. package/dist/server/ws/hub.js.map +1 -1
  118. package/dist/server/ws/rpc.d.ts +3 -3
  119. package/dist/server/ws/rpc.js +4 -4
  120. package/dist/server/ws/rpc.js.map +1 -1
  121. package/dist/transport/index.d.ts +1 -1
  122. package/dist/transport/index.js +3 -3
  123. package/dist/transport/index.js.map +1 -1
  124. package/dist/transport/rest.js +1 -1
  125. package/dist/transport/rest.js.map +1 -1
  126. package/docs/INSTALL.zh-CN.md +2 -3
  127. package/package.json +1 -1
  128. package/skills/uco-setup/SKILL.md +1 -1
  129. package/skills/unity-editor/references/diagnostics.md +24 -24
  130. package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetConfig.cs +132 -132
  131. package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDependencyResolver.cs +237 -237
  132. package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDownloader.cs +82 -82
  133. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/MenuItems.cs +247 -247
  134. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/ToolGroups.cs +153 -153
  135. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/SystemTool/Skills.Create.SkillBody.cs +155 -155
  136. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Console.GetLogs.cs +95 -95
  137. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Docs.HttpFetcher.cs +139 -139
  138. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Instance.ListAll.cs +72 -72
  139. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/PathReadHelper.cs +106 -106
  140. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Script.Validate.cs +252 -252
  141. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests/TestResultCollector.cs +537 -537
  142. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests.cs +400 -400
  143. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Branding/ProductInfo.cs +62 -62
  144. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/CopilotServerManager.cs +1034 -1034
  145. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Skills/Skill_InitialSetup.cs +197 -197
  146. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.Editor.cs +201 -201
  147. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.cs +67 -67
  148. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Components/ExtensionPanel.cs +379 -379
  149. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/MenuItems.cs +72 -72
  150. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/UnityCopilotProjectSettingsProvider.cs +64 -64
  151. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotListWindowBase.cs +393 -393
  152. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotWindowBase.cs +113 -113
  153. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.Connection.cs +3 -3
  154. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotFeatures.cs +195 -195
  155. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotServer.cs +372 -372
  156. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CreateGUI.cs +354 -354
  157. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.cs +78 -78
  158. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowInitializer.cs +47 -47
  159. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/SerializationCheckWindow.cs +190 -190
  160. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Build.cs +91 -91
  161. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Config.cs +298 -298
  162. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Static.cs +296 -296
  163. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.cs +69 -69
  164. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PackageUtils.cs +168 -168
  165. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PrefsKeyMigration.cs +119 -119
  166. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/SafeDefaultsGuard.cs +180 -180
  167. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ScriptUtils.cs +229 -229
  168. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ToolsManifestGenerator.cs +200 -200
  169. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringAdapters.cs +1467 -1467
  170. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringSafetyReloadGuard.cs +65 -65
  171. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityCopilotUpdateProjectSettings.cs +66 -66
  172. package/vendor/plugin/com.atelierai.unity.copilot/Plugins/ReflectorNet.dll +0 -0
  173. package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.Common.dll +0 -0
  174. package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.dll +0 -0
  175. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Converter/Json/Structures/EntityIdConverter.cs +120 -120
  176. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.cs +110 -110
  177. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.pre-Unity.6.5.cs +110 -110
  178. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Unity/Logs/FileLogStorage.cs +547 -547
  179. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Build.cs +243 -243
  180. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Config.cs +175 -175
  181. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.cs +295 -295
  182. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginBuilder.cs +105 -105
  183. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.Static.cs +155 -155
  184. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.cs +59 -59
  185. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Utils/EnvironmentUtils.cs +368 -368
  186. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/AtomicApiTestFixtures.cs +99 -99
  187. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/TryModifyAtTests.cs +227 -227
  188. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AuthoringSafetyPilotTests.cs +1050 -1050
  189. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetLegacyMigrationTests.cs +304 -304
  190. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Environment/EnvironmentUtilsTests.cs +4 -4
  191. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/BlacklistTypeTests.cs +416 -416
  192. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.cs +172 -172
  193. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.pre-Unity.6.5.cs +169 -169
  194. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.cs +182 -182
  195. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.pre-Unity.6.5.cs +179 -179
  196. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.cs +175 -175
  197. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.pre-Unity.6.5.cs +174 -174
  198. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.cs +171 -171
  199. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.pre-Unity.6.5.cs +170 -170
  200. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsCreateFolderTests.cs +243 -243
  201. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsMaterialTests.cs +101 -101
  202. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.cs +348 -348
  203. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.pre-Unity.6.5.cs +348 -348
  204. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsShaderTests.cs +194 -194
  205. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.cs +573 -573
  206. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.pre-Unity.6.5.cs +513 -513
  207. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.cs +154 -154
  208. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.pre-Unity.6.5.cs +154 -154
  209. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotGameViewTests.cs +164 -164
  210. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotSceneViewTests.cs +155 -155
  211. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolParameterTests.cs +56 -56
  212. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.cs +651 -651
  213. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.pre-Unity.6.5.cs +651 -651
  214. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ToolBatchExecutionIntegrationTests.cs +407 -407
  215. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/{McpPluginTests.cs → UcoPluginTests.cs} +105 -105
  216. package/vendor/plugin/com.atelierai.unity.copilot/package.json +1 -1
  217. package/dist/commands/devops/login.d.ts +0 -2
  218. package/dist/commands/devops/login.js +0 -29
  219. package/dist/commands/devops/login.js.map +0 -1
  220. package/dist/commands/devops/setup-mcp.d.ts +0 -2
  221. package/dist/commands/devops/setup-mcp.js +0 -41
  222. package/dist/commands/devops/setup-mcp.js.map +0 -1
  223. package/dist/devops/commands-upstream/bootstrap-local.d.ts +0 -17
  224. package/dist/devops/commands-upstream/bootstrap-local.js +0 -87
  225. package/dist/devops/commands-upstream/bootstrap-local.js.map +0 -1
  226. package/dist/devops/commands-upstream/close.d.ts +0 -57
  227. package/dist/devops/commands-upstream/close.js +0 -188
  228. package/dist/devops/commands-upstream/close.js.map +0 -1
  229. package/dist/devops/commands-upstream/configure.d.ts +0 -2
  230. package/dist/devops/commands-upstream/configure.js +0 -87
  231. package/dist/devops/commands-upstream/configure.js.map +0 -1
  232. package/dist/devops/commands-upstream/create-project.d.ts +0 -2
  233. package/dist/devops/commands-upstream/create-project.js +0 -43
  234. package/dist/devops/commands-upstream/create-project.js.map +0 -1
  235. package/dist/devops/commands-upstream/install-plugin.d.ts +0 -2
  236. package/dist/devops/commands-upstream/install-plugin.js +0 -64
  237. package/dist/devops/commands-upstream/install-plugin.js.map +0 -1
  238. package/dist/devops/commands-upstream/install-unity.d.ts +0 -2
  239. package/dist/devops/commands-upstream/install-unity.js +0 -72
  240. package/dist/devops/commands-upstream/install-unity.js.map +0 -1
  241. package/dist/devops/commands-upstream/login.d.ts +0 -2
  242. package/dist/devops/commands-upstream/login.js +0 -33
  243. package/dist/devops/commands-upstream/login.js.map +0 -1
  244. package/dist/devops/commands-upstream/open.d.ts +0 -32
  245. package/dist/devops/commands-upstream/open.js +0 -282
  246. package/dist/devops/commands-upstream/open.js.map +0 -1
  247. package/dist/devops/commands-upstream/remove-plugin.d.ts +0 -2
  248. package/dist/devops/commands-upstream/remove-plugin.js +0 -41
  249. package/dist/devops/commands-upstream/remove-plugin.js.map +0 -1
  250. package/dist/devops/commands-upstream/run-system-tool.d.ts +0 -1
  251. package/dist/devops/commands-upstream/run-system-tool.js +0 -13
  252. package/dist/devops/commands-upstream/run-system-tool.js.map +0 -1
  253. package/dist/devops/commands-upstream/run-tool-builder.d.ts +0 -25
  254. package/dist/devops/commands-upstream/run-tool-builder.js +0 -125
  255. package/dist/devops/commands-upstream/run-tool-builder.js.map +0 -1
  256. package/dist/devops/commands-upstream/run-tool.d.ts +0 -1
  257. package/dist/devops/commands-upstream/run-tool.js +0 -13
  258. package/dist/devops/commands-upstream/run-tool.js.map +0 -1
  259. package/dist/devops/commands-upstream/setup-mcp.d.ts +0 -2
  260. package/dist/devops/commands-upstream/setup-mcp.js +0 -68
  261. package/dist/devops/commands-upstream/setup-mcp.js.map +0 -1
  262. package/dist/devops/commands-upstream/setup-skills.d.ts +0 -2
  263. package/dist/devops/commands-upstream/setup-skills.js +0 -167
  264. package/dist/devops/commands-upstream/setup-skills.js.map +0 -1
  265. package/dist/devops/commands-upstream/status.d.ts +0 -2
  266. package/dist/devops/commands-upstream/status.js +0 -87
  267. package/dist/devops/commands-upstream/status.js.map +0 -1
  268. package/dist/devops/commands-upstream/update.d.ts +0 -2
  269. package/dist/devops/commands-upstream/update.js +0 -77
  270. package/dist/devops/commands-upstream/update.js.map +0 -1
  271. package/dist/devops/commands-upstream/wait-for-ready.d.ts +0 -2
  272. package/dist/devops/commands-upstream/wait-for-ready.js +0 -93
  273. package/dist/devops/commands-upstream/wait-for-ready.js.map +0 -1
  274. package/dist/devops/lib/setup-mcp.d.ts +0 -35
  275. package/dist/devops/lib/setup-mcp.js +0 -177
  276. package/dist/devops/lib/setup-mcp.js.map +0 -1
  277. package/dist/devops/utils/cloud-login.d.ts +0 -7
  278. package/dist/devops/utils/cloud-login.js +0 -56
  279. package/dist/devops/utils/cloud-login.js.map +0 -1
  280. /package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/{McpPluginTests.cs.meta → UcoPluginTests.cs.meta} +0 -0
@@ -1,379 +1,379 @@
1
- /*
2
- ┌──────────────────────────────────────────────────────────────────┐
3
- │ Author: Ivan Murzak (https://github.com/IvanMurzak) │
4
- │ Repository: GitHub (https://github.com/IvanMurzak/Unity-MCP) │
5
- │ Copyright (c) 2025 Ivan Murzak │
6
- │ Licensed under the Apache License, Version 2.0. │
7
- │ See the LICENSE file in the project root for more information. │
8
- └──────────────────────────────────────────────────────────────────┘
9
- */
10
-
11
- #nullable enable
12
- using System;
13
- using System.IO;
14
- using System.Linq;
15
- using System.Net.Http;
16
- using System.Text;
17
- using System.Text.Json;
18
- using System.Text.Json.Nodes;
19
- using System.Text.Json.Serialization.Metadata;
20
- using System.Threading.Tasks;
21
- using com.AtelierAI.Unity.Copilot.Editor.Utils;
22
- using UnityEditor;
23
- using UnityEditor.PackageManager;
24
- using UnityEngine;
25
- using UnityEngine.UIElements;
26
-
27
- namespace com.AtelierAI.Unity.Copilot.Editor.UI
28
- {
29
- /// <summary>
30
- /// Reusable extension item component backed by the ExtensionItem.uxml template.
31
- /// Displays an extension name, description, and install/update button with progress tracking.
32
- /// Installs packages via OpenUPM scoped registry in manifest.json.
33
- /// </summary>
34
- public class ExtensionPanel
35
- {
36
- private static readonly string[] TemplatePaths = EditorAssetLoader.GetEditorAssetPaths("Editor/UI/uxml/ExtensionItem.uxml");
37
-
38
- private const string RegistryName = "package.openupm.com";
39
- private const string RegistryUrl = "https://package.openupm.com";
40
- private static readonly string[] RequiredScopes =
41
- {
42
- "com.ivanmurzak",
43
- "extensions.unity",
44
- "org.nuget.com.ivanmurzak",
45
- "org.nuget.microsoft",
46
- "org.nuget.system",
47
- "org.nuget.r3"
48
- };
49
-
50
- private readonly Label _name;
51
- private readonly Label _description;
52
- private readonly Button _actionBtn;
53
- private readonly ExtensionData _data;
54
-
55
- /// <summary>
56
- /// The root visual element of the extension panel. Add this to a parent container.
57
- /// </summary>
58
- public VisualElement Root { get; }
59
-
60
- /// <summary>
61
- /// Creates a new extension panel from the UXML template.
62
- /// Button is hidden until <see cref="RefreshStatus"/> determines the correct state.
63
- /// </summary>
64
- /// <param name="data">The extension data including name, description, package ID, and tools list.</param>
65
- public ExtensionPanel(ExtensionData data)
66
- {
67
- _data = data;
68
-
69
- var template = EditorAssetLoader.LoadAssetAtPath<VisualTreeAsset>(TemplatePaths)
70
- ?? throw new NullReferenceException($"Failed to load ExtensionItem.uxml. Checked: {string.Join(", ", TemplatePaths)}");
71
-
72
- var tree = template.CloneTree();
73
- Root = tree.Q<VisualElement>("extension-item")
74
- ?? throw new NullReferenceException("VisualElement 'extension-item' not found in ExtensionItem.uxml.");
75
-
76
- _name = Root.Q<Label>("extension-name")
77
- ?? throw new NullReferenceException("Label 'extension-name' not found in ExtensionItem.uxml.");
78
- _description = Root.Q<Label>("extension-desc")
79
- ?? throw new NullReferenceException("Label 'extension-desc' not found in ExtensionItem.uxml.");
80
- _actionBtn = Root.Q<Button>("extension-install-btn")
81
- ?? throw new NullReferenceException("Button 'extension-install-btn' not found in ExtensionItem.uxml.");
82
-
83
- _name.text = data.Name;
84
- _description.text = data.Description;
85
-
86
- Root.tooltip = BuildTooltip(data);
87
-
88
- ShowAsChecking();
89
- }
90
-
91
- /// <summary>
92
- /// Determines the button state based on whether the package is installed
93
- /// and whether a newer version is available on OpenUPM.
94
- /// </summary>
95
- /// <param name="installedVersion">
96
- /// The currently installed version of this package, or null if not installed.
97
- /// </param>
98
- public void RefreshStatus(string? installedVersion)
99
- {
100
- _actionBtn.UnregisterCallback<ClickEvent>(OnActionClicked);
101
-
102
- if (installedVersion == null)
103
- {
104
- ShowAsInstall();
105
- return;
106
- }
107
-
108
- ShowAsChecking();
109
- _ = CheckForUpdateAsync(installedVersion);
110
- }
111
-
112
- private void ShowAsChecking()
113
- {
114
- _actionBtn.text = "Checking...";
115
- _actionBtn.tooltip = $"Checking status of {_data.Name} extension...";
116
- _actionBtn.RemoveFromClassList("btn-primary");
117
- _actionBtn.AddToClassList("btn-secondary");
118
- _actionBtn.style.display = DisplayStyle.Flex;
119
- _actionBtn.SetEnabled(false);
120
- }
121
-
122
- private void ShowAsInstall()
123
- {
124
- _actionBtn.text = "Install";
125
- _actionBtn.tooltip = $"Install {_data.Name} extension via OpenUPM.\nPackage: {_data.PackageId}";
126
- _actionBtn.RemoveFromClassList("btn-primary");
127
- _actionBtn.AddToClassList("btn-secondary");
128
- _actionBtn.style.display = DisplayStyle.Flex;
129
- _actionBtn.SetEnabled(true);
130
-
131
- _actionBtn.RegisterCallback<ClickEvent>(OnActionClicked);
132
- }
133
-
134
- private void ShowAsUpdate(string installedVersion, string latestVersion)
135
- {
136
- _actionBtn.text = "Update";
137
- _actionBtn.tooltip = $"Update {_data.Name} extension from {installedVersion} to {latestVersion}.\nPackage: {_data.PackageId}";
138
- _actionBtn.RemoveFromClassList("btn-secondary");
139
- _actionBtn.AddToClassList("btn-primary");
140
- _actionBtn.style.display = DisplayStyle.Flex;
141
- _actionBtn.SetEnabled(true);
142
-
143
- _actionBtn.RegisterCallback<ClickEvent>(OnActionClicked);
144
- }
145
-
146
- private async void OnActionClicked(ClickEvent evt)
147
- {
148
- _actionBtn.UnregisterCallback<ClickEvent>(OnActionClicked);
149
- await InstallOrUpdateAsync();
150
- }
151
-
152
- private async Task CheckForUpdateAsync(string installedVersion)
153
- {
154
- try
155
- {
156
- var latestVersion = await FetchLatestOpenUpmVersionAsync(_data.PackageId);
157
- if (latestVersion != null && UpdateChecker.IsNewerVersion(latestVersion, installedVersion))
158
- {
159
- EditorApplication.delayCall += () => ShowAsUpdate(installedVersion, latestVersion);
160
- return;
161
- }
162
- }
163
- catch
164
- {
165
- // Network failure is non-critical
166
- }
167
-
168
- EditorApplication.delayCall += () => ShowAsInstalled();
169
- }
170
-
171
- private void ShowAsInstalled()
172
- {
173
- _actionBtn.text = "Installed";
174
- _actionBtn.tooltip = $"{_data.Name} extension is installed and up to date.";
175
- _actionBtn.RemoveFromClassList("btn-primary");
176
- _actionBtn.AddToClassList("btn-secondary");
177
- _actionBtn.style.display = DisplayStyle.Flex;
178
- _actionBtn.SetEnabled(false);
179
- }
180
-
181
- private async Task InstallOrUpdateAsync()
182
- {
183
- var isUpdate = _actionBtn.text == "Update";
184
- _actionBtn.SetEnabled(false);
185
- _actionBtn.text = isUpdate ? "Updating..." : "Installing...";
186
-
187
- try
188
- {
189
- var version = await FetchLatestOpenUpmVersionAsync(_data.PackageId);
190
- if (version == null)
191
- {
192
- Debug.LogError($"[Unity Copilot] Failed to fetch latest version for '{_data.Name}' from OpenUPM.");
193
- ResetButton(isUpdate);
194
- return;
195
- }
196
-
197
- var manifestPath = Path.Combine(Application.dataPath, "../Packages/manifest.json");
198
- if (!AddToManifest(manifestPath, _data.PackageId, version))
199
- {
200
- ResetButton(isUpdate);
201
- return;
202
- }
203
-
204
- Debug.Log($"[Unity Copilot] Extension '{_data.Name}' ({_data.PackageId}@{version}) added to manifest.json. Resolving packages...");
205
- Client.Resolve();
206
- }
207
- catch (Exception ex)
208
- {
209
- Debug.LogError($"[Unity Copilot] Failed to {(isUpdate ? "update" : "install")} extension '{_data.Name}': {ex.Message}");
210
- ResetButton(isUpdate);
211
- }
212
- }
213
-
214
- private void ResetButton(bool isUpdate)
215
- {
216
- _actionBtn.SetEnabled(true);
217
- _actionBtn.text = isUpdate ? "Update" : "Install";
218
- _actionBtn.RegisterCallback<ClickEvent>(OnActionClicked);
219
- }
220
-
221
- /// <summary>
222
- /// Adds the OpenUPM scoped registry (if needed) and the package dependency to manifest.json.
223
- /// </summary>
224
- internal static bool AddToManifest(string manifestPath, string packageId, string version)
225
- {
226
- if (!File.Exists(manifestPath))
227
- {
228
- Debug.LogError($"[Unity Copilot] {manifestPath} not found.");
229
- return false;
230
- }
231
-
232
- var jsonText = File.ReadAllText(manifestPath);
233
- var manifest = JsonNode.Parse(jsonText)?.AsObject();
234
- if (manifest == null)
235
- {
236
- Debug.LogError($"[Unity Copilot] Failed to parse {manifestPath} as JSON.");
237
- return false;
238
- }
239
-
240
- EnsureScopedRegistry(manifest);
241
-
242
- var dependencies = manifest["dependencies"]?.AsObject();
243
- if (dependencies == null)
244
- {
245
- dependencies = new JsonObject();
246
- manifest["dependencies"] = dependencies;
247
- }
248
- dependencies[packageId] = version;
249
-
250
- var options = new JsonSerializerOptions
251
- {
252
- WriteIndented = true,
253
- TypeInfoResolver = new DefaultJsonTypeInfoResolver()
254
- };
255
- File.WriteAllText(manifestPath, manifest.ToJsonString(options));
256
- return true;
257
- }
258
-
259
- private static void EnsureScopedRegistry(JsonObject manifest)
260
- {
261
- var registries = manifest["scopedRegistries"]?.AsArray();
262
- if (registries == null)
263
- {
264
- registries = new JsonArray();
265
- manifest["scopedRegistries"] = registries;
266
- }
267
-
268
- JsonObject? openUpmEntry = null;
269
- foreach (var entry in registries)
270
- {
271
- if (entry?.AsObject() is JsonObject obj
272
- && obj["name"]?.GetValue<string>() == RegistryName)
273
- {
274
- openUpmEntry = obj;
275
- break;
276
- }
277
- }
278
-
279
- if (openUpmEntry == null)
280
- {
281
- openUpmEntry = new JsonObject
282
- {
283
- ["name"] = RegistryName,
284
- ["url"] = RegistryUrl,
285
- ["scopes"] = new JsonArray()
286
- };
287
- registries.Add(openUpmEntry);
288
- }
289
-
290
- var scopes = openUpmEntry["scopes"]?.AsArray();
291
- if (scopes == null)
292
- {
293
- scopes = new JsonArray();
294
- openUpmEntry["scopes"] = scopes;
295
- }
296
-
297
- var existingScopes = scopes
298
- .Select(s => s?.GetValue<string>())
299
- .Where(s => s != null)
300
- .ToHashSet();
301
-
302
- foreach (var scope in RequiredScopes)
303
- {
304
- if (!existingScopes.Contains(scope))
305
- scopes.Add(scope);
306
- }
307
- }
308
-
309
- /// <summary>
310
- /// Fetches the latest version of a package from the OpenUPM registry.
311
- /// </summary>
312
- private static async Task<string?> FetchLatestOpenUpmVersionAsync(string packageId)
313
- {
314
- using var client = new HttpClient();
315
- client.DefaultRequestHeaders.Add("User-Agent", "Unity-Copilot-ExtensionPanel");
316
- client.Timeout = TimeSpan.FromSeconds(10);
317
-
318
- var json = await client.GetStringAsync($"{RegistryUrl}/{packageId}");
319
- using var doc = JsonDocument.Parse(json);
320
-
321
- if (!doc.RootElement.TryGetProperty("dist-tags", out var distTags))
322
- return null;
323
-
324
- if (!distTags.TryGetProperty("latest", out var latest))
325
- return null;
326
-
327
- return latest.GetString();
328
- }
329
-
330
- private static string BuildTooltip(ExtensionData data)
331
- {
332
- var sb = new StringBuilder();
333
- sb.Append(data.Description);
334
- sb.AppendLine();
335
-
336
- if (data.Tools.Length > 0)
337
- {
338
- sb.AppendLine();
339
- sb.AppendLine("Tools:");
340
-
341
- var maxNameLen = 0;
342
- foreach (var (toolName, _) in data.Tools)
343
- {
344
- if (toolName.Length > maxNameLen)
345
- maxNameLen = toolName.Length;
346
- }
347
-
348
- foreach (var (toolName, toolDesc) in data.Tools)
349
- sb.AppendLine($" {toolName.PadRight(maxNameLen)} {toolDesc}");
350
- }
351
-
352
- sb.AppendLine();
353
- sb.Append($"Package: {data.PackageId}");
354
-
355
- return sb.ToString();
356
- }
357
-
358
- /// <summary>
359
- /// Data describing an extension: display info, package ID, and the MCP tools it provides.
360
- /// </summary>
361
- public readonly struct ExtensionData
362
- {
363
- public string Name { get; }
364
- public string Description { get; }
365
- public string PackageId { get; }
366
- public string GitUrl { get; }
367
- public (string name, string description)[] Tools { get; }
368
-
369
- public ExtensionData(string name, string description, string packageId, string gitUrl, (string name, string description)[] tools)
370
- {
371
- Name = name;
372
- Description = description;
373
- PackageId = packageId;
374
- GitUrl = gitUrl;
375
- Tools = tools;
376
- }
377
- }
378
- }
379
- }
1
+ /*
2
+ ┌──────────────────────────────────────────────────────────────────┐
3
+ │ Author: Ivan Murzak (https://github.com/IvanMurzak) │
4
+ │ Repository: GitHub (https://github.com/IvanMurzak/Unity-MCP) │
5
+ │ Copyright (c) 2025 Ivan Murzak │
6
+ │ Licensed under the Apache License, Version 2.0. │
7
+ │ See the LICENSE file in the project root for more information. │
8
+ └──────────────────────────────────────────────────────────────────┘
9
+ */
10
+
11
+ #nullable enable
12
+ using System;
13
+ using System.IO;
14
+ using System.Linq;
15
+ using System.Net.Http;
16
+ using System.Text;
17
+ using System.Text.Json;
18
+ using System.Text.Json.Nodes;
19
+ using System.Text.Json.Serialization.Metadata;
20
+ using System.Threading.Tasks;
21
+ using com.AtelierAI.Unity.Copilot.Editor.Utils;
22
+ using UnityEditor;
23
+ using UnityEditor.PackageManager;
24
+ using UnityEngine;
25
+ using UnityEngine.UIElements;
26
+
27
+ namespace com.AtelierAI.Unity.Copilot.Editor.UI
28
+ {
29
+ /// <summary>
30
+ /// Reusable extension item component backed by the ExtensionItem.uxml template.
31
+ /// Displays an extension name, description, and install/update button with progress tracking.
32
+ /// Installs packages via OpenUPM scoped registry in manifest.json.
33
+ /// </summary>
34
+ public class ExtensionPanel
35
+ {
36
+ private static readonly string[] TemplatePaths = EditorAssetLoader.GetEditorAssetPaths("Editor/UI/uxml/ExtensionItem.uxml");
37
+
38
+ private const string RegistryName = "package.openupm.com";
39
+ private const string RegistryUrl = "https://package.openupm.com";
40
+ private static readonly string[] RequiredScopes =
41
+ {
42
+ "com.ivanmurzak",
43
+ "extensions.unity",
44
+ "org.nuget.com.ivanmurzak",
45
+ "org.nuget.microsoft",
46
+ "org.nuget.system",
47
+ "org.nuget.r3"
48
+ };
49
+
50
+ private readonly Label _name;
51
+ private readonly Label _description;
52
+ private readonly Button _actionBtn;
53
+ private readonly ExtensionData _data;
54
+
55
+ /// <summary>
56
+ /// The root visual element of the extension panel. Add this to a parent container.
57
+ /// </summary>
58
+ public VisualElement Root { get; }
59
+
60
+ /// <summary>
61
+ /// Creates a new extension panel from the UXML template.
62
+ /// Button is hidden until <see cref="RefreshStatus"/> determines the correct state.
63
+ /// </summary>
64
+ /// <param name="data">The extension data including name, description, package ID, and tools list.</param>
65
+ public ExtensionPanel(ExtensionData data)
66
+ {
67
+ _data = data;
68
+
69
+ var template = EditorAssetLoader.LoadAssetAtPath<VisualTreeAsset>(TemplatePaths)
70
+ ?? throw new NullReferenceException($"Failed to load ExtensionItem.uxml. Checked: {string.Join(", ", TemplatePaths)}");
71
+
72
+ var tree = template.CloneTree();
73
+ Root = tree.Q<VisualElement>("extension-item")
74
+ ?? throw new NullReferenceException("VisualElement 'extension-item' not found in ExtensionItem.uxml.");
75
+
76
+ _name = Root.Q<Label>("extension-name")
77
+ ?? throw new NullReferenceException("Label 'extension-name' not found in ExtensionItem.uxml.");
78
+ _description = Root.Q<Label>("extension-desc")
79
+ ?? throw new NullReferenceException("Label 'extension-desc' not found in ExtensionItem.uxml.");
80
+ _actionBtn = Root.Q<Button>("extension-install-btn")
81
+ ?? throw new NullReferenceException("Button 'extension-install-btn' not found in ExtensionItem.uxml.");
82
+
83
+ _name.text = data.Name;
84
+ _description.text = data.Description;
85
+
86
+ Root.tooltip = BuildTooltip(data);
87
+
88
+ ShowAsChecking();
89
+ }
90
+
91
+ /// <summary>
92
+ /// Determines the button state based on whether the package is installed
93
+ /// and whether a newer version is available on OpenUPM.
94
+ /// </summary>
95
+ /// <param name="installedVersion">
96
+ /// The currently installed version of this package, or null if not installed.
97
+ /// </param>
98
+ public void RefreshStatus(string? installedVersion)
99
+ {
100
+ _actionBtn.UnregisterCallback<ClickEvent>(OnActionClicked);
101
+
102
+ if (installedVersion == null)
103
+ {
104
+ ShowAsInstall();
105
+ return;
106
+ }
107
+
108
+ ShowAsChecking();
109
+ _ = CheckForUpdateAsync(installedVersion);
110
+ }
111
+
112
+ private void ShowAsChecking()
113
+ {
114
+ _actionBtn.text = "Checking...";
115
+ _actionBtn.tooltip = $"Checking status of {_data.Name} extension...";
116
+ _actionBtn.RemoveFromClassList("btn-primary");
117
+ _actionBtn.AddToClassList("btn-secondary");
118
+ _actionBtn.style.display = DisplayStyle.Flex;
119
+ _actionBtn.SetEnabled(false);
120
+ }
121
+
122
+ private void ShowAsInstall()
123
+ {
124
+ _actionBtn.text = "Install";
125
+ _actionBtn.tooltip = $"Install {_data.Name} extension via OpenUPM.\nPackage: {_data.PackageId}";
126
+ _actionBtn.RemoveFromClassList("btn-primary");
127
+ _actionBtn.AddToClassList("btn-secondary");
128
+ _actionBtn.style.display = DisplayStyle.Flex;
129
+ _actionBtn.SetEnabled(true);
130
+
131
+ _actionBtn.RegisterCallback<ClickEvent>(OnActionClicked);
132
+ }
133
+
134
+ private void ShowAsUpdate(string installedVersion, string latestVersion)
135
+ {
136
+ _actionBtn.text = "Update";
137
+ _actionBtn.tooltip = $"Update {_data.Name} extension from {installedVersion} to {latestVersion}.\nPackage: {_data.PackageId}";
138
+ _actionBtn.RemoveFromClassList("btn-secondary");
139
+ _actionBtn.AddToClassList("btn-primary");
140
+ _actionBtn.style.display = DisplayStyle.Flex;
141
+ _actionBtn.SetEnabled(true);
142
+
143
+ _actionBtn.RegisterCallback<ClickEvent>(OnActionClicked);
144
+ }
145
+
146
+ private async void OnActionClicked(ClickEvent evt)
147
+ {
148
+ _actionBtn.UnregisterCallback<ClickEvent>(OnActionClicked);
149
+ await InstallOrUpdateAsync();
150
+ }
151
+
152
+ private async Task CheckForUpdateAsync(string installedVersion)
153
+ {
154
+ try
155
+ {
156
+ var latestVersion = await FetchLatestOpenUpmVersionAsync(_data.PackageId);
157
+ if (latestVersion != null && UpdateChecker.IsNewerVersion(latestVersion, installedVersion))
158
+ {
159
+ EditorApplication.delayCall += () => ShowAsUpdate(installedVersion, latestVersion);
160
+ return;
161
+ }
162
+ }
163
+ catch
164
+ {
165
+ // Network failure is non-critical
166
+ }
167
+
168
+ EditorApplication.delayCall += () => ShowAsInstalled();
169
+ }
170
+
171
+ private void ShowAsInstalled()
172
+ {
173
+ _actionBtn.text = "Installed";
174
+ _actionBtn.tooltip = $"{_data.Name} extension is installed and up to date.";
175
+ _actionBtn.RemoveFromClassList("btn-primary");
176
+ _actionBtn.AddToClassList("btn-secondary");
177
+ _actionBtn.style.display = DisplayStyle.Flex;
178
+ _actionBtn.SetEnabled(false);
179
+ }
180
+
181
+ private async Task InstallOrUpdateAsync()
182
+ {
183
+ var isUpdate = _actionBtn.text == "Update";
184
+ _actionBtn.SetEnabled(false);
185
+ _actionBtn.text = isUpdate ? "Updating..." : "Installing...";
186
+
187
+ try
188
+ {
189
+ var version = await FetchLatestOpenUpmVersionAsync(_data.PackageId);
190
+ if (version == null)
191
+ {
192
+ Debug.LogError($"[Unity Copilot] Failed to fetch latest version for '{_data.Name}' from OpenUPM.");
193
+ ResetButton(isUpdate);
194
+ return;
195
+ }
196
+
197
+ var manifestPath = Path.Combine(Application.dataPath, "../Packages/manifest.json");
198
+ if (!AddToManifest(manifestPath, _data.PackageId, version))
199
+ {
200
+ ResetButton(isUpdate);
201
+ return;
202
+ }
203
+
204
+ Debug.Log($"[Unity Copilot] Extension '{_data.Name}' ({_data.PackageId}@{version}) added to manifest.json. Resolving packages...");
205
+ Client.Resolve();
206
+ }
207
+ catch (Exception ex)
208
+ {
209
+ Debug.LogError($"[Unity Copilot] Failed to {(isUpdate ? "update" : "install")} extension '{_data.Name}': {ex.Message}");
210
+ ResetButton(isUpdate);
211
+ }
212
+ }
213
+
214
+ private void ResetButton(bool isUpdate)
215
+ {
216
+ _actionBtn.SetEnabled(true);
217
+ _actionBtn.text = isUpdate ? "Update" : "Install";
218
+ _actionBtn.RegisterCallback<ClickEvent>(OnActionClicked);
219
+ }
220
+
221
+ /// <summary>
222
+ /// Adds the OpenUPM scoped registry (if needed) and the package dependency to manifest.json.
223
+ /// </summary>
224
+ internal static bool AddToManifest(string manifestPath, string packageId, string version)
225
+ {
226
+ if (!File.Exists(manifestPath))
227
+ {
228
+ Debug.LogError($"[Unity Copilot] {manifestPath} not found.");
229
+ return false;
230
+ }
231
+
232
+ var jsonText = File.ReadAllText(manifestPath);
233
+ var manifest = JsonNode.Parse(jsonText)?.AsObject();
234
+ if (manifest == null)
235
+ {
236
+ Debug.LogError($"[Unity Copilot] Failed to parse {manifestPath} as JSON.");
237
+ return false;
238
+ }
239
+
240
+ EnsureScopedRegistry(manifest);
241
+
242
+ var dependencies = manifest["dependencies"]?.AsObject();
243
+ if (dependencies == null)
244
+ {
245
+ dependencies = new JsonObject();
246
+ manifest["dependencies"] = dependencies;
247
+ }
248
+ dependencies[packageId] = version;
249
+
250
+ var options = new JsonSerializerOptions
251
+ {
252
+ WriteIndented = true,
253
+ TypeInfoResolver = new DefaultJsonTypeInfoResolver()
254
+ };
255
+ File.WriteAllText(manifestPath, manifest.ToJsonString(options));
256
+ return true;
257
+ }
258
+
259
+ private static void EnsureScopedRegistry(JsonObject manifest)
260
+ {
261
+ var registries = manifest["scopedRegistries"]?.AsArray();
262
+ if (registries == null)
263
+ {
264
+ registries = new JsonArray();
265
+ manifest["scopedRegistries"] = registries;
266
+ }
267
+
268
+ JsonObject? openUpmEntry = null;
269
+ foreach (var entry in registries)
270
+ {
271
+ if (entry?.AsObject() is JsonObject obj
272
+ && obj["name"]?.GetValue<string>() == RegistryName)
273
+ {
274
+ openUpmEntry = obj;
275
+ break;
276
+ }
277
+ }
278
+
279
+ if (openUpmEntry == null)
280
+ {
281
+ openUpmEntry = new JsonObject
282
+ {
283
+ ["name"] = RegistryName,
284
+ ["url"] = RegistryUrl,
285
+ ["scopes"] = new JsonArray()
286
+ };
287
+ registries.Add(openUpmEntry);
288
+ }
289
+
290
+ var scopes = openUpmEntry["scopes"]?.AsArray();
291
+ if (scopes == null)
292
+ {
293
+ scopes = new JsonArray();
294
+ openUpmEntry["scopes"] = scopes;
295
+ }
296
+
297
+ var existingScopes = scopes
298
+ .Select(s => s?.GetValue<string>())
299
+ .Where(s => s != null)
300
+ .ToHashSet();
301
+
302
+ foreach (var scope in RequiredScopes)
303
+ {
304
+ if (!existingScopes.Contains(scope))
305
+ scopes.Add(scope);
306
+ }
307
+ }
308
+
309
+ /// <summary>
310
+ /// Fetches the latest version of a package from the OpenUPM registry.
311
+ /// </summary>
312
+ private static async Task<string?> FetchLatestOpenUpmVersionAsync(string packageId)
313
+ {
314
+ using var client = new HttpClient();
315
+ client.DefaultRequestHeaders.Add("User-Agent", "Unity-Copilot-ExtensionPanel");
316
+ client.Timeout = TimeSpan.FromSeconds(10);
317
+
318
+ var json = await client.GetStringAsync($"{RegistryUrl}/{packageId}");
319
+ using var doc = JsonDocument.Parse(json);
320
+
321
+ if (!doc.RootElement.TryGetProperty("dist-tags", out var distTags))
322
+ return null;
323
+
324
+ if (!distTags.TryGetProperty("latest", out var latest))
325
+ return null;
326
+
327
+ return latest.GetString();
328
+ }
329
+
330
+ private static string BuildTooltip(ExtensionData data)
331
+ {
332
+ var sb = new StringBuilder();
333
+ sb.Append(data.Description);
334
+ sb.AppendLine();
335
+
336
+ if (data.Tools.Length > 0)
337
+ {
338
+ sb.AppendLine();
339
+ sb.AppendLine("Tools:");
340
+
341
+ var maxNameLen = 0;
342
+ foreach (var (toolName, _) in data.Tools)
343
+ {
344
+ if (toolName.Length > maxNameLen)
345
+ maxNameLen = toolName.Length;
346
+ }
347
+
348
+ foreach (var (toolName, toolDesc) in data.Tools)
349
+ sb.AppendLine($" {toolName.PadRight(maxNameLen)} {toolDesc}");
350
+ }
351
+
352
+ sb.AppendLine();
353
+ sb.Append($"Package: {data.PackageId}");
354
+
355
+ return sb.ToString();
356
+ }
357
+
358
+ /// <summary>
359
+ /// Data describing an extension: display info, package ID, and the tools it provides.
360
+ /// </summary>
361
+ public readonly struct ExtensionData
362
+ {
363
+ public string Name { get; }
364
+ public string Description { get; }
365
+ public string PackageId { get; }
366
+ public string GitUrl { get; }
367
+ public (string name, string description)[] Tools { get; }
368
+
369
+ public ExtensionData(string name, string description, string packageId, string gitUrl, (string name, string description)[] tools)
370
+ {
371
+ Name = name;
372
+ Description = description;
373
+ PackageId = packageId;
374
+ GitUrl = gitUrl;
375
+ Tools = tools;
376
+ }
377
+ }
378
+ }
379
+ }