@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,304 +1,304 @@
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.IO;
13
- using System.Runtime.InteropServices;
14
- using System.Text.RegularExpressions;
15
- using NUnit.Framework;
16
- using UnityEngine.TestTools;
17
- using com.AtelierAI.Unity.Copilot.Editor.DependencyResolver;
18
-
19
- namespace com.AtelierAI.Unity.Copilot.Editor.Tests.DependencyResolverTests
20
- {
21
- /// <summary>
22
- /// Coverage for issue #733's mandatory legacy → flat-layout migration. Every
23
- /// existing user upgrading to the new resolver still has DLLs sitting under
24
- /// <c>Assets/Plugins/NuGet/{Id}.{Version}/</c> from a pre-fix install. The
25
- /// migration MUST delete those folders before any flat-layout DLL is
26
- /// written, in the same restore cycle, otherwise the project ends up with
27
- /// duplicate copies of every assembly and Unity's compiler errors with
28
- /// CS0436 / CS0433.
29
- /// </summary>
30
- [TestFixture]
31
- public class NuGetLegacyMigrationTests
32
- {
33
- string _installPath = string.Empty;
34
-
35
- [SetUp]
36
- public void SetUp()
37
- {
38
- _installPath = Path.Combine(
39
- Path.GetTempPath(),
40
- "UnityMcp-Migration-" + Path.GetRandomFileName());
41
- Directory.CreateDirectory(_installPath);
42
- }
43
-
44
- [TearDown]
45
- public void TearDown()
46
- {
47
- if (Directory.Exists(_installPath))
48
- {
49
- try { Directory.Delete(_installPath, recursive: true); }
50
- catch { /* best-effort cleanup */ }
51
- }
52
- }
53
-
54
- [Test]
55
- public void Run_NoLegacyState_ReturnsNoLegacyState_OnEmptyInstallPath()
56
- {
57
- var result = NuGetLegacyMigration.Run(_installPath);
58
-
59
- Assert.AreEqual(NuGetLegacyMigration.Outcome.NoLegacyState, result.Outcome);
60
- Assert.AreEqual(0, result.RemovedItems.Count);
61
- }
62
-
63
- [Test]
64
- public void Run_NoLegacyState_ReturnsNoLegacyState_OnUnversionedFlatInstall()
65
- {
66
- // Steady-state install in the unversioned flat layout: no legacy
67
- // {Id}.{Version}/ directories, no versioned-filename {stem}.{v}.dll
68
- // siblings — the migration must short-circuit and touch nothing.
69
- File.WriteAllText(Path.Combine(_installPath, "System.Memory.dll"), "dummy");
70
- File.WriteAllText(Path.Combine(_installPath, "System.Memory.dll.meta"), "meta");
71
- File.WriteAllText(Path.Combine(_installPath, ".nuget-installed.json"), "{}");
72
-
73
- var result = NuGetLegacyMigration.Run(_installPath);
74
-
75
- Assert.AreEqual(NuGetLegacyMigration.Outcome.NoLegacyState, result.Outcome);
76
- Assert.IsTrue(File.Exists(Path.Combine(_installPath, "System.Memory.dll")));
77
- }
78
-
79
- [Test]
80
- public void Run_HappyPath_RemovesLegacyDirectoriesAndMetas()
81
- {
82
- // Seed several legacy directories: single-DLL package and a multi-DLL package.
83
- CreateLegacyPackage("System.Text.Json", "8.0.5", "System.Text.Json.dll");
84
- CreateLegacyPackage("Microsoft.Bcl.Memory", "10.0.3",
85
- "System.Memory.dll", "System.Buffers.dll", "System.Runtime.CompilerServices.Unsafe.dll");
86
-
87
- var result = NuGetLegacyMigration.Run(_installPath);
88
-
89
- Assert.AreEqual(NuGetLegacyMigration.Outcome.Migrated, result.Outcome);
90
- Assert.AreEqual(2, result.RemovedItems.Count);
91
- Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5")));
92
- Assert.IsFalse(File.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5.meta")));
93
- Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "Microsoft.Bcl.Memory.10.0.3")));
94
- Assert.IsFalse(File.Exists(Path.Combine(_installPath, "Microsoft.Bcl.Memory.10.0.3.meta")));
95
- }
96
-
97
- [Test]
98
- public void Run_Idempotent_SecondRunIsNoOp()
99
- {
100
- CreateLegacyPackage("System.Text.Json", "8.0.5", "System.Text.Json.dll");
101
-
102
- var first = NuGetLegacyMigration.Run(_installPath);
103
- Assert.AreEqual(NuGetLegacyMigration.Outcome.Migrated, first.Outcome);
104
-
105
- var second = NuGetLegacyMigration.Run(_installPath);
106
- Assert.AreEqual(NuGetLegacyMigration.Outcome.NoLegacyState, second.Outcome);
107
- Assert.AreEqual(0, second.RemovedItems.Count);
108
- }
109
-
110
- [Test]
111
- public void Run_MixedLegacyState_MigratesLegacyDirsAndVersionedFiles_LeavesUnrelatedContent()
112
- {
113
- // Mixed install: a legacy {Id}.{Version}/ folder, a flat
114
- // versioned-filename DLL, and unrelated user content. The migration
115
- // sweeps both legacy artifacts in one pass and leaves the user's
116
- // directory + unversioned canonical untouched.
117
- CreateLegacyPackage("System.Text.Json", "8.0.5", "System.Text.Json.dll");
118
- File.WriteAllText(Path.Combine(_installPath, "Microsoft.Bcl.Memory.10.0.3.dll"), "flat-versioned-leftover");
119
- File.WriteAllText(Path.Combine(_installPath, "Microsoft.Bcl.Memory.dll"), "canonical");
120
- Directory.CreateDirectory(Path.Combine(_installPath, "ReadMe"));
121
- File.WriteAllText(Path.Combine(_installPath, "ReadMe", "notes.txt"), "user notes");
122
-
123
- var result = NuGetLegacyMigration.Run(_installPath);
124
-
125
- Assert.AreEqual(NuGetLegacyMigration.Outcome.Migrated, result.Outcome);
126
- Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5")));
127
- Assert.IsFalse(File.Exists(Path.Combine(_installPath, "Microsoft.Bcl.Memory.10.0.3.dll")),
128
- "Versioned-filename flat DLLs are now legacy and must be swept.");
129
- Assert.IsTrue(File.Exists(Path.Combine(_installPath, "Microsoft.Bcl.Memory.dll")),
130
- "Unversioned canonical filenames must not be touched by migration.");
131
- Assert.IsTrue(Directory.Exists(Path.Combine(_installPath, "ReadMe")),
132
- "Non-package directories must not be touched by migration.");
133
- }
134
-
135
- [Test]
136
- public void Run_VersionedFilenameDllsAtRoot_AreSwept()
137
- {
138
- // Migration from the pre-unversioned-filename resolver: any flat
139
- // {stem}.{numericVersion}.dll at the install root is by
140
- // definition stale once the canonical filename is just {stem}.dll.
141
- // The migration sweeps them in the same pass that removes
142
- // legacy {Id}.{Version}/ directories.
143
- File.WriteAllText(Path.Combine(_installPath, "McpPlugin.6.2.1.dll"), "stale");
144
- File.WriteAllText(Path.Combine(_installPath, "McpPlugin.6.2.1.dll.meta"), "meta");
145
- File.WriteAllText(Path.Combine(_installPath, "System.Text.Json.8.0.5.dll"), "stale");
146
- File.WriteAllText(Path.Combine(_installPath, "System.Text.Json.8.0.5.dll.meta"), "meta");
147
- // Unversioned canonicals must NOT be touched.
148
- File.WriteAllText(Path.Combine(_installPath, "ReadMe.dll"), "user-content");
149
- File.WriteAllText(Path.Combine(_installPath, "Foo.dll"), "canonical");
150
-
151
- var result = NuGetLegacyMigration.Run(_installPath);
152
-
153
- Assert.AreEqual(NuGetLegacyMigration.Outcome.Migrated, result.Outcome);
154
- Assert.IsFalse(File.Exists(Path.Combine(_installPath, "McpPlugin.6.2.1.dll")));
155
- Assert.IsFalse(File.Exists(Path.Combine(_installPath, "McpPlugin.6.2.1.dll.meta")),
156
- ".meta sidecar must be deleted alongside the DLL.");
157
- Assert.IsFalse(File.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5.dll")));
158
- Assert.IsTrue(File.Exists(Path.Combine(_installPath, "ReadMe.dll")),
159
- "Unversioned filenames are the new canonical and must be preserved.");
160
- Assert.IsTrue(File.Exists(Path.Combine(_installPath, "Foo.dll")));
161
- }
162
-
163
- [Test]
164
- public void Run_LegacyDirWithSemVerPrerelease_RemovedAsLegacy()
165
- {
166
- // NuGet folder names can contain SemVer prerelease / build-metadata
167
- // suffixes (e.g. `Microsoft.Extensions.Logging.8.0.1-preview`).
168
- // System.Version.TryParse rejects those tails, so an earlier version
169
- // of the migration silently left those folders on disk and the user
170
- // ended up with both the legacy nested DLL and the new flat-layout
171
- // DLL coexisting — duplicate-assembly compile errors. Pin the
172
- // SemVer-shape fallback in `ExtractPackageIdFromDirName` so the
173
- // migration removes them.
174
- CreateLegacyPackage("Foo.Bar", "1.0.0-preview", "Foo.Bar.dll");
175
- CreateLegacyPackage("Baz", "2.3.4+build.42", "Baz.dll");
176
- CreateLegacyPackage("Qux", "1.0.0-rc.1", "Qux.dll");
177
-
178
- var result = NuGetLegacyMigration.Run(_installPath);
179
-
180
- Assert.AreEqual(NuGetLegacyMigration.Outcome.Migrated, result.Outcome);
181
- Assert.AreEqual(3, result.RemovedItems.Count);
182
- Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "Foo.Bar.1.0.0-preview")));
183
- Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "Baz.2.3.4+build.42")));
184
- Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "Qux.1.0.0-rc.1")));
185
- }
186
-
187
- #if UNITY_EDITOR_WIN
188
- // Windows-only: simulates a `FileShare.None` lock that Unity holds on a
189
- // DLL it has loaded into the editor AppDomain. Linux/macOS use advisory
190
- // locking — `FileShare.None` does not prevent `File.Delete` there — so
191
- // gating on `UNITY_EDITOR_WIN` keeps the assertion honest. The
192
- // post-best-effort migration no longer aborts the entire restore on a
193
- // single locked file: the call returns `AbortedFileLock` to surface
194
- // that some directory is still on disk, but the caller may continue
195
- // safely (the locked file's PluginImporter is disabled so the next
196
- // domain reload unloads it and the next migration pass cleans it up).
197
- [Test]
198
- public void Run_FileLock_LeavesBlockedFolderIntactAndReportsAbortedFileLock()
199
- {
200
- CreateLegacyPackage("System.Text.Json", "8.0.5", "System.Text.Json.dll");
201
- var lockedDll = Path.Combine(_installPath, "System.Text.Json.8.0.5", "System.Text.Json.dll");
202
-
203
- // Best-effort migration logs a warning (not an error) for blocked folders.
204
- LogAssert.Expect(UnityEngine.LogType.Warning, new Regex(@"\[NuGet\] Could not fully remove legacy install directory"));
205
-
206
- using (var lockHandle = new FileStream(lockedDll, FileMode.Open, FileAccess.Read, FileShare.None))
207
- {
208
- var result = NuGetLegacyMigration.Run(_installPath);
209
-
210
- Assert.AreEqual(NuGetLegacyMigration.Outcome.AbortedFileLock, result.Outcome);
211
- Assert.IsNotNull(result.FirstFailedItem);
212
- Assert.IsNotNull(result.FirstFailureMessage);
213
- // Blocked folder still on disk — the next reload picks it back up.
214
- Assert.IsTrue(Directory.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5")));
215
- }
216
- }
217
-
218
- [Test]
219
- public void Run_FileLock_OneFolderBlocked_OtherFoldersAreStillRemoved()
220
- {
221
- // Mixed state: a blocked folder must NOT prevent unblocked folders
222
- // from being cleaned up — that's the whole point of best-effort.
223
- CreateLegacyPackage("System.Text.Json", "8.0.5", "System.Text.Json.dll");
224
- CreateLegacyPackage("R3", "1.3.0", "R3.dll");
225
- var lockedDll = Path.Combine(_installPath, "System.Text.Json.8.0.5", "System.Text.Json.dll");
226
-
227
- LogAssert.Expect(UnityEngine.LogType.Warning, new Regex(@"\[NuGet\] Could not fully remove legacy install directory"));
228
-
229
- using (var lockHandle = new FileStream(lockedDll, FileMode.Open, FileAccess.Read, FileShare.None))
230
- {
231
- var result = NuGetLegacyMigration.Run(_installPath);
232
-
233
- Assert.AreEqual(NuGetLegacyMigration.Outcome.AbortedFileLock, result.Outcome);
234
- Assert.AreEqual(1, result.RemovedItems.Count,
235
- "The unblocked folder must still be removed even though a sibling folder was locked.");
236
- Assert.IsTrue(Directory.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5")),
237
- "Blocked folder remains on disk for retry on the next pass.");
238
- Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "R3.1.3.0")),
239
- "Unblocked folder must have been removed.");
240
- }
241
- }
242
- #endif
243
-
244
- #if !UNITY_EDITOR_WIN
245
- // Unix counterpart of Run_FileLock_LeavesBlockedFolderIntactAndReportsAbortedFileLock.
246
- // The migration catches both `IOException` (Windows file-lock) and
247
- // `UnauthorizedAccessException` (Unix permission denial / antivirus /
248
- // read-only flags) inside its per-file delete loop. Here we deny write
249
- // on the install-path parent via `chmod 0o500`, which makes
250
- // `File.Delete` and the trailing `Directory.Delete` both throw
251
- // `UnauthorizedAccessException`. Self-skips when running as root.
252
- [Test]
253
- public void Run_PermissionDenied_LeavesBlockedFolderIntactAndReportsAbortedFileLock()
254
- {
255
- if (geteuid() == 0)
256
- Assert.Ignore("chmod-based permission denial is bypassed by the kernel for uid=0; run this test as a non-root user.");
257
-
258
- CreateLegacyPackage("System.Text.Json", "8.0.5", "System.Text.Json.dll");
259
-
260
- LogAssert.Expect(UnityEngine.LogType.Warning, new Regex(@"\[NuGet\] Could not fully remove legacy install directory"));
261
-
262
- const uint READ_EXEC_ONLY = 0b101_000_000; // 0o500 — r-x------
263
- const uint READ_WRITE_EXEC = 0b111_000_000; // 0o700 — rwx------ (TearDown-friendly)
264
- if (chmod(_installPath, READ_EXEC_ONLY) != 0)
265
- Assert.Inconclusive($"chmod {_installPath} -> 0o500 failed (errno={Marshal.GetLastWin32Error()})");
266
-
267
- try
268
- {
269
- var result = NuGetLegacyMigration.Run(_installPath);
270
-
271
- Assert.AreEqual(NuGetLegacyMigration.Outcome.AbortedFileLock, result.Outcome);
272
- Assert.IsNotNull(result.FirstFailedItem);
273
- Assert.IsNotNull(result.FirstFailureMessage);
274
- Assert.IsTrue(Directory.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5")));
275
- }
276
- finally
277
- {
278
- // Always restore so [TearDown]'s recursive delete of `_installPath` succeeds.
279
- chmod(_installPath, READ_WRITE_EXEC);
280
- }
281
- }
282
-
283
- [DllImport("libc", SetLastError = true)]
284
- static extern int chmod(string pathname, uint mode);
285
-
286
- [DllImport("libc", SetLastError = true)]
287
- static extern uint geteuid();
288
- #endif
289
-
290
- /// <summary>
291
- /// Creates a fake legacy <c>{Id}.{Version}/</c> directory with the
292
- /// given DLL filenames inside, plus the sibling <c>.meta</c>.
293
- /// </summary>
294
- void CreateLegacyPackage(string id, string version, params string[] dllNames)
295
- {
296
- var dirName = $"{id}.{version}";
297
- var dirPath = Path.Combine(_installPath, dirName);
298
- Directory.CreateDirectory(dirPath);
299
- foreach (var dll in dllNames)
300
- File.WriteAllText(Path.Combine(dirPath, dll), "dummy");
301
- File.WriteAllText(dirPath + ".meta", "fileFormatVersion: 2\nguid: 00000000000000000000000000000000\n");
302
- }
303
- }
304
- }
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.IO;
13
+ using System.Runtime.InteropServices;
14
+ using System.Text.RegularExpressions;
15
+ using NUnit.Framework;
16
+ using UnityEngine.TestTools;
17
+ using com.AtelierAI.Unity.Copilot.Editor.DependencyResolver;
18
+
19
+ namespace com.AtelierAI.Unity.Copilot.Editor.Tests.DependencyResolverTests
20
+ {
21
+ /// <summary>
22
+ /// Coverage for issue #733's mandatory legacy → flat-layout migration. Every
23
+ /// existing user upgrading to the new resolver still has DLLs sitting under
24
+ /// <c>Assets/Plugins/NuGet/{Id}.{Version}/</c> from a pre-fix install. The
25
+ /// migration MUST delete those folders before any flat-layout DLL is
26
+ /// written, in the same restore cycle, otherwise the project ends up with
27
+ /// duplicate copies of every assembly and Unity's compiler errors with
28
+ /// CS0436 / CS0433.
29
+ /// </summary>
30
+ [TestFixture]
31
+ public class NuGetLegacyMigrationTests
32
+ {
33
+ string _installPath = string.Empty;
34
+
35
+ [SetUp]
36
+ public void SetUp()
37
+ {
38
+ _installPath = Path.Combine(
39
+ Path.GetTempPath(),
40
+ "UnityMcp-Migration-" + Path.GetRandomFileName());
41
+ Directory.CreateDirectory(_installPath);
42
+ }
43
+
44
+ [TearDown]
45
+ public void TearDown()
46
+ {
47
+ if (Directory.Exists(_installPath))
48
+ {
49
+ try { Directory.Delete(_installPath, recursive: true); }
50
+ catch { /* best-effort cleanup */ }
51
+ }
52
+ }
53
+
54
+ [Test]
55
+ public void Run_NoLegacyState_ReturnsNoLegacyState_OnEmptyInstallPath()
56
+ {
57
+ var result = NuGetLegacyMigration.Run(_installPath);
58
+
59
+ Assert.AreEqual(NuGetLegacyMigration.Outcome.NoLegacyState, result.Outcome);
60
+ Assert.AreEqual(0, result.RemovedItems.Count);
61
+ }
62
+
63
+ [Test]
64
+ public void Run_NoLegacyState_ReturnsNoLegacyState_OnUnversionedFlatInstall()
65
+ {
66
+ // Steady-state install in the unversioned flat layout: no legacy
67
+ // {Id}.{Version}/ directories, no versioned-filename {stem}.{v}.dll
68
+ // siblings — the migration must short-circuit and touch nothing.
69
+ File.WriteAllText(Path.Combine(_installPath, "System.Memory.dll"), "dummy");
70
+ File.WriteAllText(Path.Combine(_installPath, "System.Memory.dll.meta"), "meta");
71
+ File.WriteAllText(Path.Combine(_installPath, ".nuget-installed.json"), "{}");
72
+
73
+ var result = NuGetLegacyMigration.Run(_installPath);
74
+
75
+ Assert.AreEqual(NuGetLegacyMigration.Outcome.NoLegacyState, result.Outcome);
76
+ Assert.IsTrue(File.Exists(Path.Combine(_installPath, "System.Memory.dll")));
77
+ }
78
+
79
+ [Test]
80
+ public void Run_HappyPath_RemovesLegacyDirectoriesAndMetas()
81
+ {
82
+ // Seed several legacy directories: single-DLL package and a multi-DLL package.
83
+ CreateLegacyPackage("System.Text.Json", "8.0.5", "System.Text.Json.dll");
84
+ CreateLegacyPackage("Microsoft.Bcl.Memory", "10.0.3",
85
+ "System.Memory.dll", "System.Buffers.dll", "System.Runtime.CompilerServices.Unsafe.dll");
86
+
87
+ var result = NuGetLegacyMigration.Run(_installPath);
88
+
89
+ Assert.AreEqual(NuGetLegacyMigration.Outcome.Migrated, result.Outcome);
90
+ Assert.AreEqual(2, result.RemovedItems.Count);
91
+ Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5")));
92
+ Assert.IsFalse(File.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5.meta")));
93
+ Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "Microsoft.Bcl.Memory.10.0.3")));
94
+ Assert.IsFalse(File.Exists(Path.Combine(_installPath, "Microsoft.Bcl.Memory.10.0.3.meta")));
95
+ }
96
+
97
+ [Test]
98
+ public void Run_Idempotent_SecondRunIsNoOp()
99
+ {
100
+ CreateLegacyPackage("System.Text.Json", "8.0.5", "System.Text.Json.dll");
101
+
102
+ var first = NuGetLegacyMigration.Run(_installPath);
103
+ Assert.AreEqual(NuGetLegacyMigration.Outcome.Migrated, first.Outcome);
104
+
105
+ var second = NuGetLegacyMigration.Run(_installPath);
106
+ Assert.AreEqual(NuGetLegacyMigration.Outcome.NoLegacyState, second.Outcome);
107
+ Assert.AreEqual(0, second.RemovedItems.Count);
108
+ }
109
+
110
+ [Test]
111
+ public void Run_MixedLegacyState_MigratesLegacyDirsAndVersionedFiles_LeavesUnrelatedContent()
112
+ {
113
+ // Mixed install: a legacy {Id}.{Version}/ folder, a flat
114
+ // versioned-filename DLL, and unrelated user content. The migration
115
+ // sweeps both legacy artifacts in one pass and leaves the user's
116
+ // directory + unversioned canonical untouched.
117
+ CreateLegacyPackage("System.Text.Json", "8.0.5", "System.Text.Json.dll");
118
+ File.WriteAllText(Path.Combine(_installPath, "Microsoft.Bcl.Memory.10.0.3.dll"), "flat-versioned-leftover");
119
+ File.WriteAllText(Path.Combine(_installPath, "Microsoft.Bcl.Memory.dll"), "canonical");
120
+ Directory.CreateDirectory(Path.Combine(_installPath, "ReadMe"));
121
+ File.WriteAllText(Path.Combine(_installPath, "ReadMe", "notes.txt"), "user notes");
122
+
123
+ var result = NuGetLegacyMigration.Run(_installPath);
124
+
125
+ Assert.AreEqual(NuGetLegacyMigration.Outcome.Migrated, result.Outcome);
126
+ Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5")));
127
+ Assert.IsFalse(File.Exists(Path.Combine(_installPath, "Microsoft.Bcl.Memory.10.0.3.dll")),
128
+ "Versioned-filename flat DLLs are now legacy and must be swept.");
129
+ Assert.IsTrue(File.Exists(Path.Combine(_installPath, "Microsoft.Bcl.Memory.dll")),
130
+ "Unversioned canonical filenames must not be touched by migration.");
131
+ Assert.IsTrue(Directory.Exists(Path.Combine(_installPath, "ReadMe")),
132
+ "Non-package directories must not be touched by migration.");
133
+ }
134
+
135
+ [Test]
136
+ public void Run_VersionedFilenameDllsAtRoot_AreSwept()
137
+ {
138
+ // Migration from the pre-unversioned-filename resolver: any flat
139
+ // {stem}.{numericVersion}.dll at the install root is by
140
+ // definition stale once the canonical filename is just {stem}.dll.
141
+ // The migration sweeps them in the same pass that removes
142
+ // legacy {Id}.{Version}/ directories.
143
+ File.WriteAllText(Path.Combine(_installPath, "UcoPlugin.6.2.1.dll"), "stale");
144
+ File.WriteAllText(Path.Combine(_installPath, "UcoPlugin.6.2.1.dll.meta"), "meta");
145
+ File.WriteAllText(Path.Combine(_installPath, "System.Text.Json.8.0.5.dll"), "stale");
146
+ File.WriteAllText(Path.Combine(_installPath, "System.Text.Json.8.0.5.dll.meta"), "meta");
147
+ // Unversioned canonicals must NOT be touched.
148
+ File.WriteAllText(Path.Combine(_installPath, "ReadMe.dll"), "user-content");
149
+ File.WriteAllText(Path.Combine(_installPath, "Foo.dll"), "canonical");
150
+
151
+ var result = NuGetLegacyMigration.Run(_installPath);
152
+
153
+ Assert.AreEqual(NuGetLegacyMigration.Outcome.Migrated, result.Outcome);
154
+ Assert.IsFalse(File.Exists(Path.Combine(_installPath, "UcoPlugin.6.2.1.dll")));
155
+ Assert.IsFalse(File.Exists(Path.Combine(_installPath, "UcoPlugin.6.2.1.dll.meta")),
156
+ ".meta sidecar must be deleted alongside the DLL.");
157
+ Assert.IsFalse(File.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5.dll")));
158
+ Assert.IsTrue(File.Exists(Path.Combine(_installPath, "ReadMe.dll")),
159
+ "Unversioned filenames are the new canonical and must be preserved.");
160
+ Assert.IsTrue(File.Exists(Path.Combine(_installPath, "Foo.dll")));
161
+ }
162
+
163
+ [Test]
164
+ public void Run_LegacyDirWithSemVerPrerelease_RemovedAsLegacy()
165
+ {
166
+ // NuGet folder names can contain SemVer prerelease / build-metadata
167
+ // suffixes (e.g. `Microsoft.Extensions.Logging.8.0.1-preview`).
168
+ // System.Version.TryParse rejects those tails, so an earlier version
169
+ // of the migration silently left those folders on disk and the user
170
+ // ended up with both the legacy nested DLL and the new flat-layout
171
+ // DLL coexisting — duplicate-assembly compile errors. Pin the
172
+ // SemVer-shape fallback in `ExtractPackageIdFromDirName` so the
173
+ // migration removes them.
174
+ CreateLegacyPackage("Foo.Bar", "1.0.0-preview", "Foo.Bar.dll");
175
+ CreateLegacyPackage("Baz", "2.3.4+build.42", "Baz.dll");
176
+ CreateLegacyPackage("Qux", "1.0.0-rc.1", "Qux.dll");
177
+
178
+ var result = NuGetLegacyMigration.Run(_installPath);
179
+
180
+ Assert.AreEqual(NuGetLegacyMigration.Outcome.Migrated, result.Outcome);
181
+ Assert.AreEqual(3, result.RemovedItems.Count);
182
+ Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "Foo.Bar.1.0.0-preview")));
183
+ Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "Baz.2.3.4+build.42")));
184
+ Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "Qux.1.0.0-rc.1")));
185
+ }
186
+
187
+ #if UNITY_EDITOR_WIN
188
+ // Windows-only: simulates a `FileShare.None` lock that Unity holds on a
189
+ // DLL it has loaded into the editor AppDomain. Linux/macOS use advisory
190
+ // locking — `FileShare.None` does not prevent `File.Delete` there — so
191
+ // gating on `UNITY_EDITOR_WIN` keeps the assertion honest. The
192
+ // post-best-effort migration no longer aborts the entire restore on a
193
+ // single locked file: the call returns `AbortedFileLock` to surface
194
+ // that some directory is still on disk, but the caller may continue
195
+ // safely (the locked file's PluginImporter is disabled so the next
196
+ // domain reload unloads it and the next migration pass cleans it up).
197
+ [Test]
198
+ public void Run_FileLock_LeavesBlockedFolderIntactAndReportsAbortedFileLock()
199
+ {
200
+ CreateLegacyPackage("System.Text.Json", "8.0.5", "System.Text.Json.dll");
201
+ var lockedDll = Path.Combine(_installPath, "System.Text.Json.8.0.5", "System.Text.Json.dll");
202
+
203
+ // Best-effort migration logs a warning (not an error) for blocked folders.
204
+ LogAssert.Expect(UnityEngine.LogType.Warning, new Regex(@"\[NuGet\] Could not fully remove legacy install directory"));
205
+
206
+ using (var lockHandle = new FileStream(lockedDll, FileMode.Open, FileAccess.Read, FileShare.None))
207
+ {
208
+ var result = NuGetLegacyMigration.Run(_installPath);
209
+
210
+ Assert.AreEqual(NuGetLegacyMigration.Outcome.AbortedFileLock, result.Outcome);
211
+ Assert.IsNotNull(result.FirstFailedItem);
212
+ Assert.IsNotNull(result.FirstFailureMessage);
213
+ // Blocked folder still on disk — the next reload picks it back up.
214
+ Assert.IsTrue(Directory.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5")));
215
+ }
216
+ }
217
+
218
+ [Test]
219
+ public void Run_FileLock_OneFolderBlocked_OtherFoldersAreStillRemoved()
220
+ {
221
+ // Mixed state: a blocked folder must NOT prevent unblocked folders
222
+ // from being cleaned up — that's the whole point of best-effort.
223
+ CreateLegacyPackage("System.Text.Json", "8.0.5", "System.Text.Json.dll");
224
+ CreateLegacyPackage("R3", "1.3.0", "R3.dll");
225
+ var lockedDll = Path.Combine(_installPath, "System.Text.Json.8.0.5", "System.Text.Json.dll");
226
+
227
+ LogAssert.Expect(UnityEngine.LogType.Warning, new Regex(@"\[NuGet\] Could not fully remove legacy install directory"));
228
+
229
+ using (var lockHandle = new FileStream(lockedDll, FileMode.Open, FileAccess.Read, FileShare.None))
230
+ {
231
+ var result = NuGetLegacyMigration.Run(_installPath);
232
+
233
+ Assert.AreEqual(NuGetLegacyMigration.Outcome.AbortedFileLock, result.Outcome);
234
+ Assert.AreEqual(1, result.RemovedItems.Count,
235
+ "The unblocked folder must still be removed even though a sibling folder was locked.");
236
+ Assert.IsTrue(Directory.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5")),
237
+ "Blocked folder remains on disk for retry on the next pass.");
238
+ Assert.IsFalse(Directory.Exists(Path.Combine(_installPath, "R3.1.3.0")),
239
+ "Unblocked folder must have been removed.");
240
+ }
241
+ }
242
+ #endif
243
+
244
+ #if !UNITY_EDITOR_WIN
245
+ // Unix counterpart of Run_FileLock_LeavesBlockedFolderIntactAndReportsAbortedFileLock.
246
+ // The migration catches both `IOException` (Windows file-lock) and
247
+ // `UnauthorizedAccessException` (Unix permission denial / antivirus /
248
+ // read-only flags) inside its per-file delete loop. Here we deny write
249
+ // on the install-path parent via `chmod 0o500`, which makes
250
+ // `File.Delete` and the trailing `Directory.Delete` both throw
251
+ // `UnauthorizedAccessException`. Self-skips when running as root.
252
+ [Test]
253
+ public void Run_PermissionDenied_LeavesBlockedFolderIntactAndReportsAbortedFileLock()
254
+ {
255
+ if (geteuid() == 0)
256
+ Assert.Ignore("chmod-based permission denial is bypassed by the kernel for uid=0; run this test as a non-root user.");
257
+
258
+ CreateLegacyPackage("System.Text.Json", "8.0.5", "System.Text.Json.dll");
259
+
260
+ LogAssert.Expect(UnityEngine.LogType.Warning, new Regex(@"\[NuGet\] Could not fully remove legacy install directory"));
261
+
262
+ const uint READ_EXEC_ONLY = 0b101_000_000; // 0o500 — r-x------
263
+ const uint READ_WRITE_EXEC = 0b111_000_000; // 0o700 — rwx------ (TearDown-friendly)
264
+ if (chmod(_installPath, READ_EXEC_ONLY) != 0)
265
+ Assert.Inconclusive($"chmod {_installPath} -> 0o500 failed (errno={Marshal.GetLastWin32Error()})");
266
+
267
+ try
268
+ {
269
+ var result = NuGetLegacyMigration.Run(_installPath);
270
+
271
+ Assert.AreEqual(NuGetLegacyMigration.Outcome.AbortedFileLock, result.Outcome);
272
+ Assert.IsNotNull(result.FirstFailedItem);
273
+ Assert.IsNotNull(result.FirstFailureMessage);
274
+ Assert.IsTrue(Directory.Exists(Path.Combine(_installPath, "System.Text.Json.8.0.5")));
275
+ }
276
+ finally
277
+ {
278
+ // Always restore so [TearDown]'s recursive delete of `_installPath` succeeds.
279
+ chmod(_installPath, READ_WRITE_EXEC);
280
+ }
281
+ }
282
+
283
+ [DllImport("libc", SetLastError = true)]
284
+ static extern int chmod(string pathname, uint mode);
285
+
286
+ [DllImport("libc", SetLastError = true)]
287
+ static extern uint geteuid();
288
+ #endif
289
+
290
+ /// <summary>
291
+ /// Creates a fake legacy <c>{Id}.{Version}/</c> directory with the
292
+ /// given DLL filenames inside, plus the sibling <c>.meta</c>.
293
+ /// </summary>
294
+ void CreateLegacyPackage(string id, string version, params string[] dllNames)
295
+ {
296
+ var dirName = $"{id}.{version}";
297
+ var dirPath = Path.Combine(_installPath, dirName);
298
+ Directory.CreateDirectory(dirPath);
299
+ foreach (var dll in dllNames)
300
+ File.WriteAllText(Path.Combine(dirPath, dll), "dummy");
301
+ File.WriteAllText(dirPath + ".meta", "fileFormatVersion: 2\nguid: 00000000000000000000000000000000\n");
302
+ }
303
+ }
304
+ }
@@ -15,7 +15,7 @@ using System.Text.Json;
15
15
  using System.Text.Json.Serialization;
16
16
  using com.AtelierAI.Unity.Copilot.Runtime.Utils;
17
17
  using NUnit.Framework;
18
- using static com.AtelierAI.Uco.Framework.Common.Consts.MCP.Server;
18
+ using static com.AtelierAI.Uco.Framework.Common.Consts.Uco.Server;
19
19
 
20
20
  namespace com.AtelierAI.Unity.Copilot.Editor.Tests
21
21
  {
@@ -107,14 +107,14 @@ namespace com.AtelierAI.Unity.Copilot.Editor.Tests
107
107
  EnvironmentUtils.ApplyEnvironmentOverrides(config, args, env);
108
108
 
109
109
  Assert.AreEqual("FLAG_TOKEN", config.LocalToken,
110
- "When both --token and UNITY_MCP_TOKEN are set, the flag must win.");
110
+ "When both --token and UNITY_COPILOT_TOKEN are set, the flag must win.");
111
111
  }
112
112
 
113
113
  [Test]
114
114
  public void Override_UnityMcpStyleFlag_BeatsEnvVar()
115
115
  {
116
- // CLI translates --token foo into UNITY_MCP_TOKEN env, but the plugin still
117
- // accepts --UNITY_MCP_TOKEN=foo style flags directly. They must beat env vars.
116
+ // CLI translates --token foo into UNITY_COPILOT_TOKEN env, but the plugin still
117
+ // accepts --UNITY_COPILOT_TOKEN=foo style flags directly. They must beat env vars.
118
118
  var config = BuildDiskConfig();
119
119
  var args = Args((EnvironmentUtils.EnvToken, "FLAG_VIA_FULL_NAME"));
120
120
  var env = Env((EnvironmentUtils.EnvToken, "ENV_TOKEN"));