@aqian0/dsh-unity 0.0.0-stage → 0.1.0

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 (360) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/LICENSE-UNITY-COMPANION.md +122 -0
  3. package/LICENSE.md +31 -0
  4. package/NOTICE.md +90 -0
  5. package/README.md +273 -2
  6. package/cordis.patch.yml +22 -0
  7. package/docs/design.md +297 -0
  8. package/icon.svg +16 -0
  9. package/lib/frontmatter.js +392 -0
  10. package/lib/gating.js +105 -0
  11. package/lib/harness.js +16 -0
  12. package/lib/index.js +171 -0
  13. package/lib/project.js +210 -0
  14. package/lib/registry.js +268 -0
  15. package/lib/requirements.js +214 -0
  16. package/lib/skills.js +191 -0
  17. package/lib/types/frontmatter.d.ts +84 -0
  18. package/lib/types/gating.d.ts +80 -0
  19. package/lib/types/harness.d.ts +152 -0
  20. package/lib/types/index.d.ts +75 -0
  21. package/lib/types/project.d.ts +93 -0
  22. package/lib/types/registry.d.ts +96 -0
  23. package/lib/types/requirements.d.ts +67 -0
  24. package/lib/types/skills.d.ts +54 -0
  25. package/lib/types/watch.d.ts +34 -0
  26. package/lib/watch.js +84 -0
  27. package/locale/en.json +6 -0
  28. package/locale/zh.json +6 -0
  29. package/package.json +70 -4
  30. package/skills/2d-pixel-perfect/SKILL.md +208 -0
  31. package/skills/2d-pixel-perfect/references/api-reference.md +81 -0
  32. package/skills/2d-pixel-perfect/references/camera-setup-builtin.cs +40 -0
  33. package/skills/2d-pixel-perfect/references/camera-setup-urp.cs +49 -0
  34. package/skills/2d-pixel-perfect/references/pipeline-detection.cs +50 -0
  35. package/skills/2d-pixel-perfect/references/sprite-settings.cs +37 -0
  36. package/skills/asset-transformer-toolkit/SECURITY.md +15 -0
  37. package/skills/asset-transformer-toolkit/SKILL.md +39 -0
  38. package/skills/asset-transformer-toolkit/references/create-importer.md +121 -0
  39. package/skills/asset-transformer-toolkit/references/lods.md +61 -0
  40. package/skills/asset-transformer-toolkit/references/rule-api.md +154 -0
  41. package/skills/asset-transformer-toolkit/references/ruleblock-api.md +37 -0
  42. package/skills/asset-transformer-toolkit/references/ruleset-api.md +138 -0
  43. package/skills/asset-transformer-toolkit/references/rulesets-and-actions.md +227 -0
  44. package/skills/audio-setup-mixers/SECURITY.md +16 -0
  45. package/skills/audio-setup-mixers/SKILL.md +127 -0
  46. package/skills/audio-setup-mixers/references/api.md +162 -0
  47. package/skills/build-gtk/SECURITY.md +16 -0
  48. package/skills/build-gtk/SKILL.md +200 -0
  49. package/skills/build-gtk/references/api-reference.md +33 -0
  50. package/skills/build-gtk/references/graph-api-gaps.md +96 -0
  51. package/skills/build-gtk/references/runtime-and-visualization.md +191 -0
  52. package/skills/build-gtk/references/state-machine-api.md +270 -0
  53. package/skills/build-gtk/references/where-the-docs-stop.md +49 -0
  54. package/skills/build-live-game/SKILL.md +159 -0
  55. package/skills/build-live-game/references/achievements.md +757 -0
  56. package/skills/build-live-game/references/apis.md +271 -0
  57. package/skills/build-live-game/references/authentication.md +431 -0
  58. package/skills/build-live-game/references/battlepass.md +904 -0
  59. package/skills/build-live-game/references/blueprints-and-samples.md +75 -0
  60. package/skills/build-live-game/references/cloud-code-cloudbehaviours.md +1111 -0
  61. package/skills/build-live-game/references/cloud-code-modules.md +1276 -0
  62. package/skills/build-live-game/references/cloud-code.md +58 -0
  63. package/skills/build-live-game/references/cloud-save.md +464 -0
  64. package/skills/build-live-game/references/deployment.md +231 -0
  65. package/skills/build-live-game/references/orientation.md +30 -0
  66. package/skills/build-live-game/references/player-account.md +821 -0
  67. package/skills/build-live-game/references/remote-config.md +96 -0
  68. package/skills/build-live-game/references/services-overview.md +76 -0
  69. package/skills/build-live-game/references/tooling.md +375 -0
  70. package/skills/build-live-game/references/ugs-cli.md +86 -0
  71. package/skills/craft-game-floors/SECURITY.md +23 -0
  72. package/skills/craft-game-floors/SKILL.md +134 -0
  73. package/skills/craft-game-floors/references/art-direction.md +85 -0
  74. package/skills/craft-game-floors/references/camera-rigs.md +51 -0
  75. package/skills/craft-game-floors/references/character-motion.md +35 -0
  76. package/skills/craft-game-floors/references/game-audio.md +47 -0
  77. package/skills/craft-game-floors/references/game-feel.md +68 -0
  78. package/skills/craft-game-floors/references/game-shell.md +45 -0
  79. package/skills/craft-game-floors/references/live-floor.md +35 -0
  80. package/skills/craft-game-floors/references/placeholder-assets.md +35 -0
  81. package/skills/craft-game-floors/references/scene-lighting.md +52 -0
  82. package/skills/craft-game-floors/references/toon-shading.md +34 -0
  83. package/skills/craft-game-floors/references/vfx.md +40 -0
  84. package/skills/craft-game-floors/references/visual-scorecard.md +43 -0
  85. package/skills/create-2d-physics/SECURITY.md +16 -0
  86. package/skills/create-2d-physics/SKILL.md +128 -0
  87. package/skills/create-2d-physics/references/2d-physics-core.md +155 -0
  88. package/skills/create-2d-physics/references/legacy-2d-physics.md +45 -0
  89. package/skills/create-tile-palette-or-rule-tiles/SKILL.md +95 -0
  90. package/skills/create-tile-palette-or-rule-tiles/references/hexagonalruletile.md +71 -0
  91. package/skills/create-tile-palette-or-rule-tiles/references/palette-create.md +38 -0
  92. package/skills/create-tile-palette-or-rule-tiles/references/ruletile-createempty.md +37 -0
  93. package/skills/create-tile-palette-or-rule-tiles/references/ruletile-createfromsegment.md +219 -0
  94. package/skills/create-tile-palette-or-rule-tiles/references/ruletile.md +95 -0
  95. package/skills/create-tile-palette-or-rule-tiles/scripts/CreatePaletteTemplate.cs +148 -0
  96. package/skills/create-tile-palette-or-rule-tiles/scripts/ManualWorkflowExample.cs +63 -0
  97. package/skills/create-tile-palette-or-rule-tiles/scripts/RuleTileGenerator.cs +61 -0
  98. package/skills/create-tile-palette-or-rule-tiles/scripts/TilemapRuleTileCreateFromSegment.cs +225 -0
  99. package/skills/fix-3d-physics-collisions/SECURITY.md +17 -0
  100. package/skills/fix-3d-physics-collisions/SKILL.md +139 -0
  101. package/skills/fix-3d-physics-collisions/references/collision-checklist.md +80 -0
  102. package/skills/fix-3d-physics-collisions/references/collision-debugger.md +18 -0
  103. package/skills/fix-3d-physics-collisions/references/console-errors-table.md +9 -0
  104. package/skills/fix-3d-physics-collisions/references/kinematic-trigger-facts.md +18 -0
  105. package/skills/fix-3d-physics-collisions/references/other-symptoms.md +29 -0
  106. package/skills/fix-3d-physics-collisions/references/raycast-checklist.md +8 -0
  107. package/skills/fix-3d-physics-collisions/references/topic-map.md +42 -0
  108. package/skills/fix-3d-physics-collisions/references/trigger-checklist.md +9 -0
  109. package/skills/fix-3d-physics-collisions/scripts/CollisionDebugger.cs +561 -0
  110. package/skills/generate-editor-search-query/SECURITY.md +17 -0
  111. package/skills/generate-editor-search-query/SKILL.md +117 -0
  112. package/skills/generate-editor-search-query/references/open-search-window.md +70 -0
  113. package/skills/generate-editor-search-query/references/query-patterns.md +124 -0
  114. package/skills/implement-in-app-purchases/SKILL.md +82 -0
  115. package/skills/implement-in-app-purchases/references/api-details.md +41 -0
  116. package/skills/implement-in-app-purchases/references/api-notes.md +105 -0
  117. package/skills/implement-in-app-purchases/references/codeless-catalog.md +197 -0
  118. package/skills/implement-in-app-purchases/references/convert-adapty.md +270 -0
  119. package/skills/implement-in-app-purchases/references/convert-essentialkit.md +239 -0
  120. package/skills/implement-in-app-purchases/references/convert-revenuecat.md +277 -0
  121. package/skills/implement-in-app-purchases/references/convert-unipay.md +145 -0
  122. package/skills/implement-in-app-purchases/references/migration-v4-to-v5.md +46 -0
  123. package/skills/implement-in-app-purchases/references/path-add-iap-to-new-project.md +197 -0
  124. package/skills/implement-in-app-purchases/references/path-convert-native-google-billing.md +302 -0
  125. package/skills/implement-in-app-purchases/references/path-convert-native-storekit.md +357 -0
  126. package/skills/implement-in-app-purchases/references/path-implement-iap-d2c.md +253 -0
  127. package/skills/implement-in-app-purchases/references/platform-notes.md +55 -0
  128. package/skills/implement-in-app-purchases/references/pre-check.md +207 -0
  129. package/skills/implement-in-app-purchases/references/topic-map.md +46 -0
  130. package/skills/initialize-ai-navigation/SKILL.md +109 -0
  131. package/skills/initialize-ai-navigation/references/navigation-system.md +793 -0
  132. package/skills/initialize-ai-navigation/references/topic-map.md +66 -0
  133. package/skills/levelplay-unity-integration/SKILL.md +122 -0
  134. package/skills/levelplay-unity-integration/references/adding-more-ad-formats.md +15 -0
  135. package/skills/levelplay-unity-integration/references/banner-api.md +927 -0
  136. package/skills/levelplay-unity-integration/references/best-practices.md +604 -0
  137. package/skills/levelplay-unity-integration/references/dependency-resolution.md +94 -0
  138. package/skills/levelplay-unity-integration/references/examples.md +10 -0
  139. package/skills/levelplay-unity-integration/references/ilrd-api.md +337 -0
  140. package/skills/levelplay-unity-integration/references/initialization-api.md +851 -0
  141. package/skills/levelplay-unity-integration/references/interstitial-api.md +907 -0
  142. package/skills/levelplay-unity-integration/references/ios-setup.md +463 -0
  143. package/skills/levelplay-unity-integration/references/migration-sdk-9.md +666 -0
  144. package/skills/levelplay-unity-integration/references/privacy-settings.md +593 -0
  145. package/skills/levelplay-unity-integration/references/production-release-checklist.md +22 -0
  146. package/skills/levelplay-unity-integration/references/rewarded-api.md +918 -0
  147. package/skills/levelplay-unity-integration/references/step-0-new-or-migration.md +8 -0
  148. package/skills/levelplay-unity-integration/references/step-1-verify-environment.md +4 -0
  149. package/skills/levelplay-unity-integration/references/step-10-testing.md +15 -0
  150. package/skills/levelplay-unity-integration/references/step-2-business-goals.md +12 -0
  151. package/skills/levelplay-unity-integration/references/step-3-install-sdk.md +55 -0
  152. package/skills/levelplay-unity-integration/references/step-4-native-dependencies.md +22 -0
  153. package/skills/levelplay-unity-integration/references/step-5-app-key-and-ad-units.md +18 -0
  154. package/skills/levelplay-unity-integration/references/step-6-5-privacy-and-regulation.md +51 -0
  155. package/skills/levelplay-unity-integration/references/step-6-admob-keys.md +16 -0
  156. package/skills/levelplay-unity-integration/references/step-7-initialize.md +50 -0
  157. package/skills/levelplay-unity-integration/references/step-8-ad-unit-strategy.md +16 -0
  158. package/skills/levelplay-unity-integration/references/step-9-implement-ad-units.md +66 -0
  159. package/skills/levelplay-unity-integration/references/testing-and-validation.md +222 -0
  160. package/skills/levelplay-unity-integration/references/troubleshooting.md +99 -0
  161. package/skills/localize-unity-project/SKILL.md +159 -0
  162. package/skills/localize-unity-project/references/api-notes.md +15 -0
  163. package/skills/localize-unity-project/references/cjk-fonts.md +83 -0
  164. package/skills/localize-unity-project/references/docs-map.md +42 -0
  165. package/skills/localize-unity-project/references/documentation-lookup.md +33 -0
  166. package/skills/localize-unity-project/references/locale-switching.md +17 -0
  167. package/skills/localize-unity-project/references/table-completeness-check.md +47 -0
  168. package/skills/localize-unity-project/references/translating-existing-project.md +47 -0
  169. package/skills/localize-unity-project/references/translation-strategy.md +41 -0
  170. package/skills/localize-unity-project/references/troubleshooting.md +12 -0
  171. package/skills/localize-unity-project/scripts/L10nBatchProcessor.cs +191 -0
  172. package/skills/localize-unity-project/scripts/LocalizedFontAsset.cs +18 -0
  173. package/skills/manage-sprite-atlas/SKILL.md +202 -0
  174. package/skills/manage-sprite-atlas/references/addressables-delivery.md +58 -0
  175. package/skills/manage-sprite-atlas/references/advanced-manual-authoring.md +19 -0
  176. package/skills/manage-sprite-atlas/references/api.md +382 -0
  177. package/skills/manage-sprite-atlas/references/best-practices.md +183 -0
  178. package/skills/manage-sprite-atlas/references/common-errors.md +123 -0
  179. package/skills/manage-sprite-atlas/references/complete-workflow.md +61 -0
  180. package/skills/manage-sprite-atlas/references/custom-packing.md +147 -0
  181. package/skills/manage-sprite-atlas/references/delivery-mechanism.md +30 -0
  182. package/skills/manage-sprite-atlas/references/key-requirements.md +21 -0
  183. package/skills/manage-sprite-atlas/references/manual-authoring.md +39 -0
  184. package/skills/manage-sprite-atlas/references/namespaces.md +15 -0
  185. package/skills/manage-sprite-atlas/references/v2-architecture.md +21 -0
  186. package/skills/manage-sprite-atlas/resources/authoringvsruntime.cs +176 -0
  187. package/skills/manage-sprite-atlas/resources/buildaddressablespostprocess.cs +59 -0
  188. package/skills/manage-sprite-atlas/resources/cacheloadedatlases.cs +145 -0
  189. package/skills/manage-sprite-atlas/resources/cleanupbatchoperations.cs +119 -0
  190. package/skills/manage-sprite-atlas/resources/createandconfiguremasteratlas.cs +57 -0
  191. package/skills/manage-sprite-atlas/resources/custompackersetup.cs +88 -0
  192. package/skills/manage-sprite-atlas/resources/deprecatedmethods.cs +142 -0
  193. package/skills/manage-sprite-atlas/resources/dontmodifywithoutsaving.cs +120 -0
  194. package/skills/manage-sprite-atlas/resources/dontpackinruntimebuilds.cs +190 -0
  195. package/skills/manage-sprite-atlas/resources/dontscriptspriteatlasineditor.cs +114 -0
  196. package/skills/manage-sprite-atlas/resources/editorconfiguration.cs +95 -0
  197. package/skills/manage-sprite-atlas/resources/enablespritepacking.cs +172 -0
  198. package/skills/manage-sprite-atlas/resources/gridspritepacker.cs +50 -0
  199. package/skills/manage-sprite-atlas/resources/handlelatebinding.cs +147 -0
  200. package/skills/manage-sprite-atlas/resources/handlenullcases.cs +141 -0
  201. package/skills/manage-sprite-atlas/resources/migratev1tov2.cs +335 -0
  202. package/skills/manage-sprite-atlas/resources/multipagepacker.cs +80 -0
  203. package/skills/manage-sprite-atlas/resources/optimizetexturesettings.cs +191 -0
  204. package/skills/manage-sprite-atlas/resources/packerdebugging.cs +158 -0
  205. package/skills/manage-sprite-atlas/resources/packtransform.cs +51 -0
  206. package/skills/manage-sprite-atlas/resources/platformnames.cs +127 -0
  207. package/skills/manage-sprite-atlas/resources/queryspritesefficiently.cs +222 -0
  208. package/skills/manage-sprite-atlas/resources/registercallbacks.cs +152 -0
  209. package/skills/manage-sprite-atlas/resources/runtimeatlasloader.cs +15 -0
  210. package/skills/manage-sprite-atlas/resources/runtimespriteaccess.cs +19 -0
  211. package/skills/manage-sprite-atlas/resources/savespriteatlasasset.cs +107 -0
  212. package/skills/manage-sprite-atlas/resources/scriptablepacker.cs +81 -0
  213. package/skills/manage-sprite-atlas/resources/setincludeinbuild.cs +164 -0
  214. package/skills/manage-sprite-atlas/resources/sizeoptimizedpacker.cs +88 -0
  215. package/skills/manage-sprite-atlas/resources/spriteatlaslatebinding.cs +123 -0
  216. package/skills/manage-sprite-atlas/resources/spriteatlasprebuildgenerator.cs +219 -0
  217. package/skills/manage-sprite-atlas/resources/spritedata.cs +35 -0
  218. package/skills/manage-sprite-atlas/resources/spritepack.cs +39 -0
  219. package/skills/manage-sprite-atlas/resources/texturedata.cs +15 -0
  220. package/skills/manage-sprite-atlas/resources/updatebuildscripts.cs +357 -0
  221. package/skills/manage-sprite-atlas/resources/updatesettingsconfiguration.cs +135 -0
  222. package/skills/manage-sprite-atlas/resources/usevariantswisely.cs +179 -0
  223. package/skills/manage-sprite-atlas/resources/variantatlas.cs +39 -0
  224. package/skills/migrate-birp-to-urp/SECURITY.md +16 -0
  225. package/skills/migrate-birp-to-urp/SKILL.md +167 -0
  226. package/skills/migrate-birp-to-urp/references/capturing-the-editor.md +66 -0
  227. package/skills/migrate-birp-to-urp/references/complex-shader-situations.md +272 -0
  228. package/skills/migrate-birp-to-urp/references/conversion-and-rendering-triage.md +113 -0
  229. package/skills/migrate-birp-to-urp/references/custom-shader-triage.md +123 -0
  230. package/skills/migrate-birp-to-urp/references/implementation-patterns.md +529 -0
  231. package/skills/migrate-birp-to-urp/references/migration-workflow.md +265 -0
  232. package/skills/migrate-birp-to-urp/references/parity-validation-and-troubleshooting.md +114 -0
  233. package/skills/migrate-birp-to-urp/references/preflight-and-urp-setup.md +195 -0
  234. package/skills/migrate-birp-to-urp/references/quality-settings-map.md +69 -0
  235. package/skills/new-unity-project/SECURITY.md +26 -0
  236. package/skills/new-unity-project/SKILL.md +171 -0
  237. package/skills/new-unity-project/references/checklist.md +18 -0
  238. package/skills/new-unity-project/references/common-mistakes.md +15 -0
  239. package/skills/new-unity-project/references/skill-setup.md +66 -0
  240. package/skills/new-unity-project/references/step-1-concept.md +13 -0
  241. package/skills/new-unity-project/references/step-2-platforms-and-create.md +31 -0
  242. package/skills/new-unity-project/references/step-3-join-and-reconcile.md +16 -0
  243. package/skills/new-unity-project/references/step-4-source-control.md +9 -0
  244. package/skills/new-unity-project/references/step-5-packages.md +18 -0
  245. package/skills/new-unity-project/references/step-6-identity-and-floors.md +20 -0
  246. package/skills/new-unity-project/references/step-7-visual-baseline.md +75 -0
  247. package/skills/new-unity-project/references/step-8-first-commit.md +21 -0
  248. package/skills/new-unity-project/references/step-9-handoff.md +23 -0
  249. package/skills/optimize-audio/SECURITY.md +16 -0
  250. package/skills/optimize-audio/SKILL.md +120 -0
  251. package/skills/optimize-audio/references/diagnostics.md +42 -0
  252. package/skills/optimize-audio/references/troubleshooting.md +41 -0
  253. package/skills/optimize-audio/resources/audio-import-api.md +149 -0
  254. package/skills/optimize-audio/resources/platform-settings.md +48 -0
  255. package/skills/optimize-text-mesh-pro/SKILL.md +181 -0
  256. package/skills/optimize-text-mesh-pro/references/dynamic-atlas-and-profiling.md +28 -0
  257. package/skills/optimize-text-mesh-pro/references/topic-map.md +36 -0
  258. package/skills/optimize-web/SECURITY.md +16 -0
  259. package/skills/optimize-web/SKILL.md +157 -0
  260. package/skills/optimize-web/references/editor-csharp.md +120 -0
  261. package/skills/optimize-web/references/topic-map.md +49 -0
  262. package/skills/optimize-web/references/troubleshooting.md +45 -0
  263. package/skills/optimize-web/references/understand-request.md +19 -0
  264. package/skills/optimize-web/references/web-assets-quality.md +59 -0
  265. package/skills/optimize-web/references/web-player-settings.md +39 -0
  266. package/skills/optimize-web/references/web-profiling-memory.md +71 -0
  267. package/skills/optimize-web/scripts/WebOptimizer.cs +46 -0
  268. package/skills/optimize-web/scripts/toktx-examples.sh +11 -0
  269. package/skills/setup-multiplayer-services/SKILL.md +36 -0
  270. package/skills/setup-multiplayer-services/references/dgs-entrypoint.md +79 -0
  271. package/skills/setup-multiplayer-services/references/entrypoints.md +213 -0
  272. package/skills/setup-multiplayer-services/references/examples.md +33 -0
  273. package/skills/setup-multiplayer-services/references/implementation-fit.md +30 -0
  274. package/skills/setup-multiplayer-services/references/underlying-services.md +11 -0
  275. package/skills/setup-multiplayer-services/references/workflows-prerequisites.md +17 -0
  276. package/skills/setup-vivox-voice-chat/SECURITY.md +16 -0
  277. package/skills/setup-vivox-voice-chat/SKILL.md +166 -0
  278. package/skills/setup-vivox-voice-chat/references/api-reference-lookup.md +28 -0
  279. package/skills/setup-vivox-voice-chat/references/docs-topic-map.md +13 -0
  280. package/skills/setup-vivox-voice-chat/references/events-and-participants.md +79 -0
  281. package/skills/setup-vivox-voice-chat/references/init-and-login.md +92 -0
  282. package/skills/setup-vivox-voice-chat/references/text-chat.md +93 -0
  283. package/skills/setup-vivox-voice-chat/references/troubleshooting.md +47 -0
  284. package/skills/setup-vivox-voice-chat/references/voice-channels.md +92 -0
  285. package/skills/shader-graph-create-custom-node/SKILL.md +25 -0
  286. package/skills/shader-graph-create-custom-node/resources/all_hints.hlsl +182 -0
  287. package/skills/sprite-editor/SECURITY.md +16 -0
  288. package/skills/sprite-editor/SKILL.md +66 -0
  289. package/skills/sprite-editor/references/api_reference.md +151 -0
  290. package/skills/sprite-editor/references/background.md +112 -0
  291. package/skills/sprite-editor/references/templates.md +72 -0
  292. package/skills/sprite-editor/scripts/AutomaticSliceTexture.cs +40 -0
  293. package/skills/sprite-editor/scripts/GenerateNewSpriteRects.cs +200 -0
  294. package/skills/sprite-editor/scripts/GetTextureSourceImageSize.cs +32 -0
  295. package/skills/sprite-editor/scripts/GetTextureToSlice.cs +55 -0
  296. package/skills/sprite-editor/scripts/GridSliceTexture.cs +40 -0
  297. package/skills/sprite-editor/scripts/IsometricSliceTexture.cs +141 -0
  298. package/skills/sprite-editor/scripts/README.md +134 -0
  299. package/skills/sprite-editor/scripts/SetPivotExample.cs +58 -0
  300. package/skills/sprite-editor/scripts/SpriteToPng.cs +88 -0
  301. package/skills/sprite-segment-3x3grid/SKILL.md +177 -0
  302. package/skills/sprite-segment-3x3grid/references/topic-map.md +37 -0
  303. package/skills/sprite-segment-3x3grid/scripts/SpriteGridAnalysis.cs +119 -0
  304. package/skills/ui/SKILL.md +142 -0
  305. package/skills/ui-imgui/SKILL.md +180 -0
  306. package/skills/ui-imgui/references/gui-elements.md +156 -0
  307. package/skills/ui-imgui/references/templates.md +141 -0
  308. package/skills/ui-ugui/SKILL.md +217 -0
  309. package/skills/ui-ugui/references/layout-and-anchors.md +61 -0
  310. package/skills/ui-ugui/references/scrollview-setup.md +29 -0
  311. package/skills/ui-uitk/SKILL.md +229 -0
  312. package/skills/ui-uitk/references/common-issues.md +74 -0
  313. package/skills/ui-uitk/references/custom-elements.md +241 -0
  314. package/skills/ui-uitk/references/painter2d.md +282 -0
  315. package/skills/ui-uitk/references/pointermanipulator-guide.md +94 -0
  316. package/skills/ui-uitk/references/svg-icons.md +136 -0
  317. package/skills/ui-uitk/references/ui-runtime-binding.md +234 -0
  318. package/skills/ui-uitk/references/uss-guide.md +138 -0
  319. package/skills/unity-cli/CHANGELOG.md +524 -0
  320. package/skills/unity-cli/SECURITY.md +68 -0
  321. package/skills/unity-cli/SKILL.md +160 -0
  322. package/skills/unity-cli/references/auth-license-cloud.md +318 -0
  323. package/skills/unity-cli/references/bootstrap-project.md +177 -0
  324. package/skills/unity-cli/references/build-run-test.md +555 -0
  325. package/skills/unity-cli/references/catalog-plugins.md +86 -0
  326. package/skills/unity-cli/references/ci-recipes.md +76 -0
  327. package/skills/unity-cli/references/cloud-automation.md +819 -0
  328. package/skills/unity-cli/references/cloud-workflows.md +19 -0
  329. package/skills/unity-cli/references/collaboration.md +533 -0
  330. package/skills/unity-cli/references/config-hub.md +239 -0
  331. package/skills/unity-cli/references/diagnostics-maintenance.md +718 -0
  332. package/skills/unity-cli/references/docs-workflow.md +179 -0
  333. package/skills/unity-cli/references/editor-targeting.md +29 -0
  334. package/skills/unity-cli/references/editors-install.md +490 -0
  335. package/skills/unity-cli/references/environment-variables.md +42 -0
  336. package/skills/unity-cli/references/exit-codes.md +47 -0
  337. package/skills/unity-cli/references/global-flags.md +32 -0
  338. package/skills/unity-cli/references/integration-advanced.md +1130 -0
  339. package/skills/unity-cli/references/notes.md +20 -0
  340. package/skills/unity-cli/references/notifications.md +39 -0
  341. package/skills/unity-cli/references/playmode-verification-loop.md +279 -0
  342. package/skills/unity-cli/references/projects-templates.md +997 -0
  343. package/skills/unity-cli/references/scene-editing-preflight.md +25 -0
  344. package/skills/unity-cli/references/setup-and-help.md +54 -0
  345. package/skills/unity-cli/references/version-control.md +612 -0
  346. package/skills/unity-package-management/SKILL.md +169 -0
  347. package/skills/unity-package-management/references/discovering-packages.md +66 -0
  348. package/skills/unity-package-management/references/headless-run.md +31 -0
  349. package/skills/unity-package-management/references/installer-script.md +92 -0
  350. package/skills/unity-package-management/references/select-packages.md +126 -0
  351. package/skills/unity-pipeline/SECURITY.md +17 -0
  352. package/skills/unity-pipeline/SKILL.md +205 -0
  353. package/skills/unity-pipeline/references/csharp-eval.md +23 -0
  354. package/skills/unity-pipeline/references/multiplayer-play-mode.md +103 -0
  355. package/skills/urp-postprocessing/SECURITY.md +16 -0
  356. package/skills/urp-postprocessing/SKILL.md +188 -0
  357. package/skills/urp-postprocessing/references/code-templates.md +150 -0
  358. package/skills/urp-postprocessing/references/effect-reference.md +86 -0
  359. package/skills/validate-urp-render-graph-renderer-feature/SKILL.md +92 -0
  360. package/skills/validate-urp-render-graph-renderer-feature/references/validation-checklist.md +179 -0
@@ -0,0 +1,997 @@
1
+ # Projects, releases & templates — unity-cli command reference
2
+
3
+ Part of the **`unity-cli`** skill. See that skill's `SKILL.md` for CLI install, global flags,
4
+ environment variables, exit codes, and common workflows. All global flags (`--format json`,
5
+ `--non-interactive`, `--yes`, `--proxy`, …) apply to every command below.
6
+
7
+ Relative links in this file resolve to the skill directory's `references/` folder, so `../SKILL.md` is the skill's main page.
8
+
9
+ ### Contents
10
+
11
+ - Projects — list, open, create, register, clone, link
12
+ - Assets: inspect or export a `.unitypackage`
13
+ - Assets — export a `.unitypackage`
14
+ - Assets — import a `.unitypackage` into a project
15
+ - Assets — export project assets to a `.unitypackage`
16
+ - Releases — browse Unity versions
17
+ - Templates
18
+
19
+ ---
20
+
21
+ ### Projects — list, open, create, register, clone, link
22
+
23
+ ```bash
24
+ # List registered projects
25
+ unity projects --format json
26
+
27
+ # Opt extra columns into the listing (repeatable, human/TSV output)
28
+ unity projects --editor-version --modified --pipeline --cloud --vcs
29
+
30
+ # Register an existing project
31
+ unity projects add /path/to/MyProject
32
+
33
+ # Remove from registry (does not delete files)
34
+ unity projects remove /path/to/MyProject
35
+
36
+ # Show project details
37
+ unity projects info /path/to/MyProject --format json
38
+
39
+ # Open a project in the editor
40
+ unity open /path/to/MyProject
41
+
42
+ # Close the editor that has a project open (exits WITHOUT saving)
43
+ unity close /path/to/MyProject
44
+ unity close /path/to/MyProject --timeout 60
45
+ unity close /path/to/MyProject --force
46
+
47
+ # Same command, under the projects umbrella
48
+ unity projects close /path/to/MyProject
49
+ unity projects close /path/to/MyProject --timeout 60
50
+ unity projects close /path/to/MyProject --force
51
+
52
+ # Block until the Editor exits and report its real outcome — macOS/Linux only (exit 0 clean, 6 failed)
53
+ unity open /path/to/MyProject --wait
54
+
55
+ # Unattended open: accept the upgrade dialogs (upgrades the project, lets Unity rewrite scripts)
56
+ unity open /path/to/MyProject --accept-upgrades
57
+
58
+ # Return once the Editor is ready for commands; fail fast if a dialog stops it
59
+ unity open /path/to/MyProject --until-ready --timeout 600 --format json
60
+
61
+ # Start a headless batch-mode Editor and return once it is ready; stop it with unity close
62
+ unity open /path/to/MyProject --batchmode --until-ready --format json
63
+
64
+ # Open with a specific editor version
65
+ unity open /path/to/MyProject --editor-version 6000.0.47f1
66
+
67
+ # Pass extra Unity arguments
68
+ unity open /path/to/MyProject --args "-logFile output.log"
69
+
70
+ # Pass a build target (forwarded to Unity as -buildTarget / -buildTargetGroup)
71
+ unity open /path/to/MyProject --build-target StandaloneOSX
72
+ unity open /path/to/MyProject --build-target-group Standalone
73
+
74
+ # Version shorthand (equivalent to open with --editor-version)
75
+ unity 6000.0.47f1 /path/to/MyProject
76
+ ```
77
+
78
+ The project argument is matched against the Hub registry first (exact name or path opens immediately; a glob like `"My Game*"` prompts when multiple match); with no registry match it falls back to treating the argument as a filesystem path. Path matching is tolerant of casing, separator direction, and a trailing slash — resolved against real filesystem path identity — so a registered project is found even when the path is spelled differently, while two genuinely distinct case-variant folders on a case-sensitive volume stay distinct. `unity open` forwards `--args` to the Editor correctly on all platforms (including Windows).
79
+
80
+ **Signed-in Editor, no Hub required.** `unity open` starts a small background identity helper that answers the Editor's account lookup with the session `unity auth login` stored — your account, organization list (so Package Manager entitlements resolve), and the service addresses for your resolved `--cloudEnvironment` — so a Hub-less machine gets a signed-in Editor instead of an anonymous one. It steps aside whenever a real Hub is running or starting, exits on its own a few minutes after the Editor stops using it, and can be disabled with `UNITY_NO_EDITOR_IDENTITY_SERVER`. Signed out, the Editor just starts anonymous, as before.
81
+
82
+ **`open` on a project that is already open is not an error.** Before it launches anything, `unity open` and `unity projects open` check whether an Editor already holds the project, the check `unity run` and `unity test` refuse on, with a stale `EditorInstance.json` left by an exited Editor not counted. If one does, nothing launches and the command exits `0` with one line naming the project's version and the Editor's process id. Under `--format json` or `ndjson`, `data.alreadyOpen` is `true`, `data.pid` is the process id (`null` when only the project's lock file shows it is held), and `data.editorVersion` is the project's saved version. A launch's `data` has `launchedPid` and `editorPath` instead, so branch on `data.alreadyOpen`. The Editor's window is not brought forward, and `--wait` returns at once, because it waits for the Editor this command launched and there is none. Run `unity status --until-ready --project-path <project>` to wait for that Editor to be ready.
83
+
84
+ **`open --until-ready` waits for a ready Editor, and names the dialog that stops it.** A plain `unity open` returns right after the launch. With `--until-ready`, it keeps checking until the Editor's Pipeline server answers ready, the same check `unity status` makes, and no dialog is showing (exit 0). A modal can hold the Editor while its server still answers ready or stops answering, so the dialog check runs in those states too. It fails fast instead of hanging when a dialog stops the Editor, including dialogs that appear before the Pipeline server starts, which `unity status` also lists (as a row with no `port`). `--timeout <seconds>` sets the budget (default 300). The Editor keeps running whatever the outcome, waiting on whoever answers it. Under `--format json` or `ndjson`, `data.ready` carries `outcome` (`ready`, `dialog`, `exited`, `timeout`), `elapsedSeconds`, and either `dialog` (`title`, `kind`, `buttons`) or `lastSeen` (`noServer`, `starting`, `unreachable`). Read `errors[0].code`:
85
+
86
+ | Code | Exit | What to do |
87
+ |---|---|---|
88
+ | `OPEN_BLOCKED_BY_DIALOG` (and `OPEN_BLOCKED_BY_DIALOG_SAFE_MODE`, `_GRAPHICS_API`, `_SOFTWARE_TERMS`, the same codes `unity status` names with `STATUS_` for those three, so match the `OPEN_BLOCKED_BY_DIALOG` prefix) | 6 | `data.ready.dialog.kind` names the remedy. `projectUpgrade` and `scriptUpdating`: the project needs an upgrade for this Editor, so ask the user to answer the dialog, or to quit that Editor and reopen with `--accept-upgrades` (accepts the upgrade without asking) or run the `unity projects upgrade <project> --to <version>` command the message names. `safeMode`: the project has compile errors; fix them, then open it again. `softwareTerms`: the user must open this Editor once themselves and accept the terms. `graphicsApi` or `other`: ask the user to answer it in the Editor. |
89
+ | `OPEN_EDITOR_EXITED_BEFORE_READY` | 6 | The Editor quit while starting; its `Editor.log` says why. |
90
+ | `OPEN_READY_TIMEOUT` | 10 | Not ready in time, and still running. Check `unity status --project-path <project>`, or wait longer with a bigger `--timeout`. |
91
+
92
+ Dialogs are matched by their English titles, so an Editor in another UI language is only stopped on dialogs the Editor itself reports, and otherwise times out. On macOS, dialog titles in the window list need the Screen Recording permission for the terminal; without it, only the Project Upgrade Required dialog (which the Editor also writes to its log) is seen before the Pipeline server starts. `--timeout` without `--until-ready` is rejected (exit 2, `OPEN_TIMEOUT_REQUIRES_UNTIL_READY`), and so is `--until-ready` with `--wait` (exit 2, `OPEN_UNTIL_READY_CONFLICTS_WITH_WAIT`). An Editor that already holds the project is reported at once, as above, without waiting.
93
+
94
+ **`command editor dialog` reads and answers the dialog an Editor waits on.** `unity command editor dialog` prints the dialog on top: its id, title, message and buttons. `unity command editor dialog answer <id> <button>` presses a button by its label, in any case. The Editor answers these itself, so they work while the dialog blocks it, but only an Editor that reports its dialogs to the CLI does (any other Editor gets them through the Pipeline package, which fails them as unknown commands). With several Editors open, name one with `--project-path`, `--pid`, `--port` or `--instance`, or run it from inside its project. It exits `6` when the dialog is gone or cannot be answered from outside, and `2` for wrong arguments. `unity pipeline list` shows the same dialog under its Editor, with the phase the Editor is in (`loading project`, `ready`).
95
+
96
+ **`open --batchmode` starts a headless Editor.** It launches the Editor with `-batchmode`: no window, and it keeps running until `unity close <project>` stops it. On a project without the Pipeline package the Editor has no graceful channel to close it through, so use `unity close <project> --force` there. It refuses to open the project with another Editor version than the one it was saved with (exit 2, `OPEN_BATCHMODE_VERSION_CHANGE`), because a batch-mode Editor changes the project's version without showing the dialog a windowed open stops on. A `-batchmode` passed through `--args` gets the same check. Pass `--accept-upgrades` to allow the change. Add `--until-ready` to wait for its Pipeline server: the outcomes and codes are the ones in the table above. `unity status` lists the Editor with `batchmode: true` under `--format json` or `ndjson`, and a `Mode: batchmode` line in its human output. An Editor started with `-batchmode` some other way is marked the same.
97
+
98
+ **`open` never moves a project onto Unity 6.7 or later.** When the Editor that `unity open` or `unity projects open` would use is 6.7 or later and the project was saved with an older version, the command exits `2` with `PROJECT_UPGRADE_REQUIRED` before it installs or launches anything. That covers `--editor-version` (a partial version such as `6.7` included), the `unity <version> <project>` shorthand, and an Editor picked at the missing-Editor prompt. Use `unity projects upgrade <project> --to <version>` instead, which asks for the Unity Cloud link choice and, when the project ends up linked, turns on build profile diagnostics (see the upgrade section below). Under `--format json` or `ndjson` the refusal carries one `notifications` entry, `OPEN_UPGRADE_WITH_PROJECTS_UPGRADE`, whose `remediation.command` is that `projects upgrade` command with `requiresUserApproval: true`, so ask the user before running it. Opening a project already on 6.7 or later, with the same version, or with an Editor below 6.7 is unchanged.
99
+
100
+ **Extra listing columns are opt-in.** `projects` shows a compact set by default; `--editor-version`, `--modified` (last modified), `--cloud` (Unity Cloud project id), `--pipeline` (render pipeline), and `--vcs` (provider and repository) each add one to the human table. Piped TSV always prints all of them, as `name path version modified cloudProjectId pipeline vcs`, with empty cells for the columns you did not ask for, so a column's position never depends on the flags. They affect the human and TSV tables only — `--format json` and `ndjson` always carry the full record.
101
+
102
+ **Is Developer Data diagnostics on?** `projects info` answers from the project on disk, and `projects create` includes the same answer for the project it just created. New projects ship with diagnostics on, and turning it off disables all other Developer Data collection. In JSON, `data.diagnostics` has three parts:
103
+
104
+ - `buildDefault`: `state` is `enabled`, `disabled`, or `unknown`, and `source` names the file it was read from (`ProjectSettings/UnityConnectSettings.asset`). `unknown` always comes with a `reason`: `missing`, `unreadable`, `notSet` (older Editors don’t write the setting), or `unrecognized`. Never treat `unknown` as off.
105
+ - `buildProfiles`: each `.asset` in `searched` (`Assets/Settings/Build Profiles`) with its `state`: `enabled`, `disabled`, `inherit` (uses the build default), or `unknown`. Profiles saved elsewhere aren’t read. If the folder can’t be read safely (for example, it’s a symbolic link), `buildProfiles.reason` is set and the empty list means “not read,” not “no profiles.”
106
+ - `cloud`: `linked`, `cloudProjectId`, and `organizationId`.
107
+
108
+ **`projects info` takes the Unity Cloud link from the project's own file.** When the file says what the link is, `cloudProjectId`, `organizationId` and `data.diagnostics.cloud` come from `ProjectSettings/ProjectSettings.asset`, the file the Editor loads, and `genesisOrgId` is shown only when the two agree. `data.linkConsistency` says how the registry's record compares: `ok`, `registry-stale` (the registry lists a link the file doesn't have, or another one), `asset-only` (the file links a project and the registry's record is blank) or `unknown` (the registry lists a link, but the file is missing, unreadable, has no `cloudProjectId` line under its one `PlayerSettings` block, names `cloudProjectId` or `organizationId` twice, writes either one as anything but a one-line scalar entry (no space after the colon, a value that is not a scalar, a value that goes on past its line, a tab as indentation or a document marker anywhere), or is one git left conflicted, so nothing was checked and the registry's values are shown as they are). A row that holds an organization and no project also keeps its organization when the file links none. Anything but `ok` adds a plain warning to `warnings` (on stderr in human output): it says the registry and the file disagree and that the output follows the file, and names no command. For `unknown` it says the registry's link was not checked.
109
+
110
+ **`projects info` names the organization when you are signed in.** `organizationId` is whatever the file stores: a Genesis ID from the Hub or the CLI, or a cloud UUID or the organization's name from the Editor. Signed in, `projects info` looks it up once and adds `organizationName`, `organizationGenesisId` and `organizationUuid` right after it in JSON, and the human `Organization` row reads `Name (genesis / uuid)`. Signed out, offline, with no auth broker running (macOS and Linux), or with no match, the three fields are absent and the row shows the raw value. The lookup never starts the auth broker, and the exit code never changes.
111
+
112
+ This reports only what’s on disk. It can’t tell you whether Unity’s servers accept or receive the data.
113
+
114
+ **`unity close <project>` exits the editor WITHOUT saving.** It waits up to `--timeout <seconds>` (default 30) for a graceful exit. `--force` terminates the process (SIGTERM, then SIGKILL) when the editor offers no graceful channel, or once the wait runs out. Unsaved work is lost either way, so ask the user before running it. `unity projects close <project>` is the same command under the `projects` umbrella; pick whichever mount reads better in context. A windowed Editor that `unity open` started on a project without the Pipeline package has no graceful channel either: `close` leaves it running and exits 6 with `PROJECTS_CLOSE_PIPELINE_MISSING` (`reason: pipeline_missing` under `--format json`, an `Error:` line on stderr under the human and `tsv` formats). Run `unity pipeline install` before opening the project, or use `--force`; once the Editor has exited, the project is free for `unity build`.
115
+
116
+ **`--wait` — a real exit code from an interactive open.** By default `unity open`, `unity projects open` and `unity projects upgrade` return once the hand-off to the Editor completes, watching it only briefly for an instant failure. `--wait` blocks for as long as the Editor runs and exits `0` when it exits cleanly or `6` (`OPEN_EDITOR_EXITED`, or the licensing diagnosis for a 198) when it fails. The Editor runs in its own process group: Ctrl-C is absorbed, the wait always runs to completion, and the Editor is never touched. macOS and Linux only for now — Windows refuses `--wait` with exit `2` rather than falling back to the bounded watch. Without `--wait`, the CLI watches the Editor for only about 150 ms after launch, so an Editor killed by a signal is reported as a failure only when that happens inside the startup window; once the command has returned, nothing further can be reported. `--wait` is what covers the Editor’s whole lifetime, and it reports a signal death as a failure too. `projects create --open` does not take `--wait`.
117
+
118
+ **`--accept-upgrades` — answer yes to the Editor's upgrade dialogs.** `unity open` and `unity projects open` take it to pass `-skipUpgradeDialogs` to the Editor, which clears the "Project Upgrade Required" dialog and the API Updater's "Script Updating Consent" dialog that would otherwise leave an unattended open hanging. It says yes to both: the project is upgraded to the Editor's version and Unity rewrites scripts that use obsolete APIs, with no backup prompt. That changes the project's files, so it is never a default: pass it only when the user or the task has chosen it, and prefer a version-control checkpoint first. To upgrade as a deliberate step, use `unity projects upgrade` instead (`--to <version>`). `--accept-upgrades` does not move a project onto Unity 6.7 or later: opening a project saved with an older version in a 6.7+ Editor still exits `2` with `PROJECT_UPGRADE_REQUIRED`, because that move needs the Unity Cloud link choice that `unity projects upgrade` asks for. `unity projects upgrade`, `unity run` and `unity test` do not take the flag. It does not clear every dialog: on Windows an upgraded project can still show an "Auto Graphics API Notice". `unity status` reports it as `STATUS_BLOCKED_BY_DIALOG_GRAPHICS_API`; ask the user to choose Confirm in the Editor, since no launch flag answers it.
119
+
120
+ **First windowed open on a new machine: the Unity Editor Software Terms.** The Editor stops at its "Unity Editor Software Terms" dialog (Accept and Continue / Decline) on its first windowed open until the terms are accepted for that Editor. A headless open (`--non-interactive`, `UNITY_NON_INTERACTIVE`, a machine `--format`, redirected output, CI) still passes `-acceptSoftwareTermsForThisRunOnly`, but current Editors ignore that flag, so it does not prevent the dialog. `--args` cannot remove it, and passing it yourself does nothing. `unity status` reports the dialog as `STATUS_BLOCKED_BY_DIALOG_SOFTWARE_TERMS`, and `unity open --until-ready` as `OPEN_BLOCKED_BY_DIALOG_SOFTWARE_TERMS`. Accepting is the user's decision: ask them to accept once in the Editor, or to run `unity terms accept <version>` (it shows the terms and asks; see [editors-install.md](editors-install.md#software-terms--unity-terms)), which also prepares a container image or a provisioning script before the Editor first opens. Unity skips the dialog after that. Never click it for them, and never run `unity terms accept --yes` unless the user has agreed to the terms.
121
+
122
+ **Reserved flags — do NOT pass these via `--args`.** `-projectPath` is managed by the command (Unity's parser is last-wins, so forwarding it would silently redirect the open to a different project), and `-useHub`/`-hubIPC` are deliberately never passed — they tell the Editor a Unity Hub manages its session, which the CLI is not. Passing any of them fails fast, before launch, with exit code 6:
123
+
124
+ ```
125
+ Error: Forwarded argument '-useHub' conflicts with a reserved Unity flag managed by this command. Remove it from `--args`.
126
+ ```
127
+
128
+ All three spellings Unity accepts are rejected (`-useHub`, `--useHub`, `-useHub=1`, case-insensitively). Everything else — `-logFile <path>`, `-nographics`, custom flags your project reads — is forwarded verbatim.
129
+
130
+ #### projects create
131
+
132
+ Create a project. On a TTY, prompts for any missing options (parent directory, editor version, template) and then asks whether to link the project to a Unity Cloud project. That last question defaults to **Yes**, so pressing Enter links the project. Pass `--no-cloud` to decline without being asked, or answer `No` at the prompt to create an unlinked project instead. Piping stdin (a non-interactive terminal) suppresses every prompt and falls back to stored defaults, including the cloud default, so an unattended run still links unless `--no-cloud` (or `UNITY_NO_CLOUD`) says otherwise. On a real TTY, `--non-interactive` alone suppresses only the cloud question; the parent-directory, editor-version, and template prompts still fire (see below for the fully unattended recipe). The first positional argument is the project **name**; `--path` sets the parent directory:
133
+
134
+ ```bash
135
+ unity projects create MyGame --editor-version 6000.0.47f1 --template com.unity.template.urp-blank
136
+
137
+ # Place the project in a specific directory
138
+ unity projects create MyGame --path /path/to/projects --editor-version 6000.0.47f1
139
+
140
+ # --template also accepts a .tgz file path or a directory, not just a registered template id
141
+ unity projects create MyGame --template /path/to/template.tgz
142
+ ```
143
+
144
+ **The project folder must be new or empty.** `create` and `new` make `<path>/<name>`, or use it when it is an empty folder. A folder that holds anything (hidden files and `.git` included), a file at that path, or a folder that can't be read fails with `Project path already exists`, exit `6`, and nothing is written.
145
+
146
+ **Default template: URP.** Without `--template`, create uses the Editor version's own blank URP template, `com.unity.template.urp-blank`. `--template 3d` names the same template and `--template 2d` names `com.unity.template.universal-2d`. URP is the render pipeline going forward, so create never falls back to a Built-in Render Pipeline template. When the version doesn't offer the URP template, create fails with exit `6` and code `TEMPLATE_NOT_FOUND`, and `data.offered` lists the template ids it does offer; pass one of them with `--template`.
147
+
148
+ **Which Editor version create uses.** `--editor-version` wins; `latest` and `lts` there mean the newest official or LTS release in Unity's release list, not the newest installed Editor, and offline they fall back to the release list bundled with the CLI. Without it, create uses the default set with `unity editors default` (or the Hub's "set as default"), else the newest installed Editor, else, when no Editor is installed, the latest release. A version with no installed Editor fails with exit `6` and code `ENGINE_NOT_INSTALLED`, and `data.engineVersion` names it. Under `--format json` or `ndjson` the envelope's `notifications` then carries an `ENGINE_NOT_INSTALLED` entry whose `remediation.command` is the same `projects create` command with `--install-editor` added (a `--git-token` value shows as `<pat>`), with `requiresUserApproval: true`.
149
+
150
+ **Prerequisites, checked first.** Before create asks anything, downloads a template or starts the Editor, it checks the machine. An active Unity license is always required: with none, create fails with code `LICENSE_CHOICE_REQUIRED`, exit `4`. While the project links to Unity Cloud (the default, `--bare` included), create also needs you signed in (it fails with `NOT_SIGNED_IN`, exit `3`), the Unity services reachable (`NETWORK_UNREACHABLE`, exit `7`), and, when you belong to several organizations with no default, a chosen one (`ORGANIZATION_CHOICE_REQUIRED`, exit `4`; pass `--cloud-org`). `--no-cloud` removes the Unity Cloud prerequisites. Under `--format json` or `ndjson`, each unmet prerequisite is a `notifications` entry (`AUTH_REQUIRED`, `LICENSE_CHOICE_REQUIRED`, `ORGANIZATION_CHOICE_REQUIRED`, `NETWORK_UNREACHABLE`) whose `remediation.command` fixes it, with `requiresUserApproval: true`, so read them all before retrying. A state the CLI can't read (no licensing client running, for example) never blocks.
151
+
152
+ **Install a missing Editor with `--install-editor`.** When the version create resolved isn't installed, `--install-editor` installs it, waits for the install to finish, then creates the project. `--module <id...>` adds modules to that install and `--accept-eula` accepts their license agreements, as on `unity install`. They apply only when the run installs the Editor: for an Editor that's already installed, add modules with `unity install-modules`; either one without `--install-editor` is a usage error, exit `2`. Name, location, Unity Cloud and source-control checks still run before the install, so a bad flag fails in seconds, not after the download. A failed install creates no project and fails as `unity install` would. The envelope's `data.editorInstalled` says whether this run installed the Editor. The install takes minutes, so an agent runs the command in the background and keeps working:
153
+
154
+ ```bash
155
+ unity projects create MyGame --install-editor --module android --accept-eula --no-cloud --format json
156
+ ```
157
+
158
+ **Newer release notice.** When create picked the version from the default or the newest installed Editor and a newer official release exists, the json or ndjson envelope carries an `ENGINE_UPDATE_AVAILABLE` notification: `data.engineVersion` is the version used, `data.latestVersion` the newer one, and `data.resolvedFrom` is `default` or `installed`. Its `remediation.command` is `unity install latest`, or `unity install latest --set-default` when the stored default held the run back. When the stored default held it back but the latest release is already installed, the message says so and the remediation is `unity editors default latest` alone. Both remediations have `requiresUserApproval: true`, so ask the user before running one. The check is best effort: with the release list unreachable there's no notice, and create carries on. There's none when `--editor-version` was passed.
159
+
160
+ **Cloud linking during creation:**
161
+
162
+ ```bash
163
+ # Create and link a NEW Unity Cloud project as part of creation
164
+ unity projects create MyGame --cloud --cloud-org <id-or-name>
165
+
166
+ # Link an EXISTING cloud project instead
167
+ unity projects create MyGame --cloud-project <id-or-name>
168
+
169
+ # Create without Unity Cloud, and without being asked about it
170
+ unity projects create MyGame --no-cloud
171
+ ```
172
+
173
+ `--no-cloud` is the explicit negative answer: it creates the project unlinked and skips the cloud question. Reach for it in a scripted run on a terminal, where the question would otherwise stop the command.
174
+
175
+ **`projects create` links to Unity Cloud by DEFAULT, and not being able to ask does not change that.** Passing any of `--cloud`, `--cloud-project`, `--coppa`, `--no-cloud`, or `--cloud-org` answers the cloud question up front, so it is not asked. The question is also skipped in every machine output mode (`--json`, `--format tsv|ndjson`, `--quiet`), under `--non-interactive` (or `UNITY_NON_INTERACTIVE`), and when stdout is not a TTY — but a run that cannot show the prompt still **links**, because the default answer does not depend on whether anyone is watching. `--no-cloud` is the only way to decline without being asked.
176
+
177
+ That makes authentication a **precondition** of `projects create`, not a capability it discovers late: without `--no-cloud`, a signed-out run fails with `NOT_SIGNED_IN` and a service-account run with `CLOUD_PROJECT_REQUIRES_OAUTH`, both exit `3`, before any scaffolding happens. So in CI, pass `--no-cloud` unless you have an interactive (OAuth) session and actually want the link.
178
+
179
+ Unlike the other three questions, the cloud one can fire even when every option was supplied on the command line, so `--non-interactive` is what keeps a fully-specified scripted run from stopping on it. Be aware that the global currently gates **only** this question: the parent-directory, editor-version, and template questions still gate on terminal interactivity alone, so `--non-interactive` on a TTY does not make them fall back to stored defaults. For a fully unattended run on a terminal, pass `--path`, `--editor-version`, and `--template` as well.
180
+
181
+ Once the command is past that precondition, a link that then fails never costs you the project: if it cannot be set up (expired session, no resolvable organization), the project is still created unlinked and the reason is reported as a warning, exit 0. Two cases fail instead, because the flag named something specific: `--cloud` fails outright, and so does `--cloud-project <query>` when the query matches no project of the organization or more than one (exit `6`, `PROJECTS_CREATE_CLOUD_PROJECT_UNKNOWN` or `PROJECTS_CREATE_CLOUD_PROJECT_AMBIGUOUS`, no `steps` in the envelope). That failure keeps the local project, unlinked: the error's `data` carries its `path` and `cloudLinked: false`, and the message names where it is. An explicit flag is a contract, not a suggestion.
182
+
183
+ When a project is created without a cloud link, human output ends with a line pointing at `unity projects link cloud`. It is human-format only: `json`, `ndjson`, and `tsv` output is unchanged.
184
+
185
+ For machine consumers, cloud state is reported by the presence of the `cloudLinked`, `cloudProject`, and `cloudOrgSource` fields on the result payload — they are emitted **only when a cloud link was requested**. Their absence is itself the signal that the project is unlinked; do not read `cloudLinked` expecting a `false`.
186
+
187
+ **The Pipeline package is part of every create.** `unity projects create MyGame` adds `com.unity.pipeline` (latest from the Unity registry) to the new project's `Packages/manifest.json` right after scaffolding, before any `--vcs` initial commit and before `--open`, so the Editor resolves it on first open and `unity command` works without a separate `unity pipeline install`. `--bare` is the only way to leave it out. A template that already ships the package is left as it is. It never fails the create: an unreachable registry or a manifest it cannot write leaves the project created without the package, prints a warning (stderr in every format but json), and exits 0, and `unity pipeline install --project-path <path>` retries. An engine version older than Unity 6, which the package does not support, is not attempted: nothing is added or printed. Unity 6000.5.0 to 6000.5.2 is not attempted either: the package can't start its server on those Editors, so create leaves it out (the `pipeline` block carries `skipped: "UNSUPPORTED_VERSION"`) and says to update the Editor to 6000.5.3f1 or later, open the project in it, and run `unity pipeline install --project-path <path>`. In json and ndjson that is a `PIPELINE_EDITOR_UNSUPPORTED` notification with `data.engineVersion`, `data.fixedIn` and the remediation `unity install latest`; in the other formats it is a warning on stderr. A template that already ships the package keeps it, and the notice is raised all the same. The result payload carries `pipeline`: `{ "requested": true, "installed": true, "packageId": "com.unity.pipeline", "version": "<v>", "alreadyInstalled": false }` on success (`alreadyInstalled: true` when the template already shipped it), `installed: false` with `error` set to `PIPELINE_INSTALL_FAILED` on a failure, or `installed: false` with `skipped: "UNSUPPORTED_VERSION"` on an older engine. `--with-pipeline`, which used to opt in, is still accepted and does nothing.
188
+
189
+ **Anonymous player sign-in is part of every linked create.** When the cloud link succeeds, create adds `com.unity.services.authentication` (the newest release that supports the project's engine version) to `Packages/manifest.json` and writes `Assets/PlayerAuthentication/` (`PlayerAuthentication.cs` and its own assembly definition), which signs the player in anonymously before the first scene loads, so cloud save, telemetry and other services have a player ID. Await `PlayerAuthentication.SignedIn` before calling another Unity Gaming Service: it is `true` once the player is signed in and `false` when sign-in failed. Code in an assembly definition adds `PlayerAuthentication` to that asmdef's `references` first; code in the default `Assembly-CSharp` sees it as is. Nothing is configured server-side: anonymous sign-in works for any linked cloud project. A template that already pins the package and has a runtime script (not in an `Editor` folder) whose code calls `SignInAnonymouslyAsync` is left as it is. With `--no-cloud`, or when the link failed, nothing is added. Like the Pipeline package it never fails the create: a failure prints a warning and the payload's `playerAuth` block carries `error: "PLAYER_AUTH_SETUP_FAILED"`. `--bare` leaves it out.
190
+
191
+ **A Remote Config kill switch and a Cloud Save slot come with every linked create.** When the cloud link succeeds, create sets a boolean `liveops_enabled` to `true` in the cloud project's default environment on the server (never in a `.rc` file, and never changing one that already exists), adds `com.unity.remote-config`, and writes `Assets/LiveOps/` (`LiveOps.cs` and its assembly definition): `await LiveOps.IsEnabledAsync()` reads the switch and is `true` when it is missing or Remote Config can't be reached. Turn the switch off in the Unity Dashboard to switch live features off without a build. The CLI only creates the switch with a new `settings` config: when the environment already has one without `liveops_enabled`, nothing is written there (a write replaces the whole config and could undo a dashboard edit), the flag is `notAdded`, and a warning asks you to add `liveops_enabled` (Boolean, `true`) in the dashboard; the package and script are still added. Keep `liveops_enabled` out of any `.rc` file you add: a deploy of the file would turn it back on. Create also adds `com.unity.services.cloudsave` and `Assets/PlayerSave/` (`PlayerSave.cs` and its assembly definition), one save slot (Cloud Save key `progress`) for the signed-in player: `await PlayerSave.SaveAsync(data)` and `await PlayerSave.LoadAsync(fallback)`. Both wait for `PlayerAuthentication.SignedIn`, so code in an assembly definition adds `LiveOps` or `PlayerSave` to its `references`. The payload's `remoteConfig` and `cloudSave` blocks have the same shape as `playerAuth` (`remoteConfig` adds `key` and `flag`: `created`, `present` or `notAdded`), and failures carry `REMOTE_CONFIG_SETUP_FAILED` and `CLOUD_SAVE_SETUP_FAILED`. With `--no-cloud`, when the link failed, or under `--bare`, neither is added. Both also skip with `NOT_APPLICABLE` when the project has no `Assets/PlayerAuthentication/` sign-in script and assembly definition (the sign-in step failed or was skipped, or the template signs in its own way); a template that already reads `liveops_enabled` still gets the switch created on the server, and Remote Config skips with `UNSUPPORTED_VERSION` before Unity 2021.3. The scripts only answer in Play mode.
192
+
193
+ **Cinemachine is part of every 3D create.** Create adds `com.unity.cinemachine` (the newest release that supports the project's engine version) to `Packages/manifest.json`, so the camera rigs are there on first open. A 2D project does not get it: create reads the mode from `m_DefaultBehaviorMode` in `ProjectSettings/EditorSettings.asset`, or from a `2d` word in the template name when the file has no such key, and the step is skipped with `NOT_APPLICABLE`. A template that already ships the package, 2D or not, is left as it is. With no release for the engine version it is skipped with `UNSUPPORTED_VERSION`. The payload's `cinemachine` block has the same shape as `playerAuth`, and a failure carries `error: "CINEMACHINE_SETUP_FAILED"`.
194
+
195
+ **Play mode keeps running in the background.** Create sets `runInBackground: 1` in `ProjectSettings/ProjectSettings.asset`, so Play mode keeps ticking while the Editor is not focused, as when an agent drives it from a terminal. Only that one value changes; the rest of the file stays byte for byte as the Editor wrote it. A file that cannot be read, or that does not have exactly one `runInBackground` line set to `0` or `1`, is left as it is with a warning. The payload's `runInBackground` block is `{ "enabled": true, "alreadySet": false }` when create turned it on (`alreadySet: true` when the template already had it), or `{ "enabled": false, "error": "RUN_IN_BACKGROUND_FAILED" }`.
196
+
197
+ **The first open shows no URP material upgrade dialog.** In a URP project, create sets `m_LastMaterialVersion` in `ProjectSettings/URPProjectSettings.asset` to the number of material upgraders the project's URP package has, which is what URP itself writes after its upgrade. Without it, a project created on Unity 6000.5 opens on a modal "URP Material upgrade" dialog that blocks every pipeline command until someone clicks OK. Only that one value changes. A project that is not URP is skipped (`NOT_APPLICABLE`), and so is one whose `Assets` folder already holds materials (`MATERIALS_PRESENT`): the Editor upgrades those itself, with its dialog. The payload's `urpMaterials` block is `{ "materialVersion": 10, "alreadySet": false }` when create set it (`alreadySet: true` when the template already matched), `{ "skipped": "<reason>" }`, or `{ "error": "URP_MATERIALS_FAILED" }` with a warning.
198
+
199
+ None of the scaffolding steps writes a cloud project id, an organization id or a project name. A cloud-linked create does write them (`cloudProjectId`, `organizationId`, `projectName`) to `ProjectSettings/ProjectSettings.asset`, and `unity templates create --keep-project-settings` preserves that file as is, so a template saved from a cloud-linked project that way carries the cloud linkage. Without the flag, or from a project created with `--no-cloud`, the template carries no account.
200
+
201
+ **A project without the default scaffolding (`--bare`).** `unity projects create MyGame --bare` creates the project from the template without the default project scaffolding; today that is the Pipeline package, Cinemachine, Run In Background, the URP material version (so a bare URP project on Unity 6000.3 or 6000.5 opens on the URP Material upgrade dialog) and anonymous player sign-in. The Unity Cloud link and source control are not scaffolding: they behave as without the flag, so the cloud link (and its sign-in) still happens unless you pass `--no-cloud`, and `--vcs`, `--cloud`, `--cloud-org`, `--cloud-project` and `--coppa` all work beside `--bare`. Only `--with-pipeline` is refused beside it, with exit `2` and `BARE_ARGS_CONFLICT`. `--bare --no-cloud` creates a project from the template alone, offline. To drive a bare project from an agent, run `unity pipeline install --project-path <path>` afterwards.
202
+
203
+ **What create did (`steps`).** The result payload carries `steps`, each setup step create ran in order: the scaffolding steps and the links (`cloudLink`, `vcs`). Each has an `id` and a `status`: `done`, `present` (the template already had it, so nothing was changed), `skipped` with a `reason` (`BARE` for scaffolding under `--bare`, `UNSUPPORTED_VERSION` for an engine version a step does not support, `NOT_APPLICABLE` for a step that has no place in the project, such as Cinemachine in a 2D one, `MATERIALS_PRESENT` for the URP material version in a project that already has its own materials, `NOT_REQUESTED`, `NO_CLOUD` for the cloud link and player sign-in, or `CLOUD_LINK_FAILED` for player sign-in or a UVCS repository the failed cloud link kept from being created), or `failed` with an `error` code: the step block's own code where it has one (`PIPELINE_INSTALL_FAILED`, `CINEMACHINE_SETUP_FAILED`, `RUN_IN_BACKGROUND_FAILED`, `URP_MATERIALS_FAILED`, `PLAYER_AUTH_SETUP_FAILED`, a `cloudLinkError` code, or a `uvcsError` code other than `UVCS_SKIPPED_CLOUD_FAILED`), otherwise `CLOUD_LINK_FAILED`, `VCS_LINK_FAILED` or `UVCS_LINK_FAILED`. A failed step does not fail the create: the command still exits `0`, as it does today, and the project is left usable. The exception is a `--cloud-project <query>` that matches no project or more than one, which fails with exit `6` and returns no `steps` (see the cloud-link paragraph above). Read `steps` rather than the individual blocks to tell what was set up; the list of steps grows as more of the scaffolding moves into create.
204
+
205
+ When a link was requested, `cloudLinked: false` next to a `cloudProject` means the Unity Cloud project exists but the link could not be saved to the project's `ProjectSettings/ProjectSettings.asset`, so the Editor sees no link. `cloudLinkError.code` says why (`PROJECT_SETTINGS_MISSING`, `PROJECT_SETTINGS_LINK_FIELDS_MISSING` when the file has no `cloudProjectId`/`organizationId` entries, `PROJECT_NOT_TRACKED`, `CLOUD_PROJECT_ID_INVALID`, or `LOCAL_WRITE_FAILED`), and a warning names the fix: `unity projects link cloud <path> --cloud-project <id>`, which saves the link to that project rather than creating another one. `unity projects link cloud` itself fails with `PROJECTS_LINK_CLOUD_LOCAL_WRITE_FAILED` (exit `1`) in the same situation.
206
+
207
+ **COPPA declaration.** Creating a Unity Cloud project declares its COPPA status, and the CLI sends `not_compliant` unless told otherwise — the same value the Hub sends. `--coppa <status>` sets it on every command that can create a cloud project (`projects create`, `projects link cloud`, `projects link vcs`, `vcs setup`); the accepted values are `not_compliant` (default), `compliant`, and `unspecified`, and anything else is a usage error (exit `2`). Pass `--coppa compliant` when the game is directed at children under 13. Whenever a run creates the project, the result payload carries `coppa` with the value requested (`unspecified` is sent to the service as `not_compliant`, because the Cloud request refuses that value with HTTP 400; the payload still reads `unspecified`) (beside `cloudProject` on `create` / `link cloud`, beside `linked` on `link vcs` / `vcs setup`) and human output names it. **Linking an existing project never changes its COPPA setting**: `--coppa` together with `--cloud-project` (or `--no-cloud`) is refused with `COPPA_ARGS_CONFLICT`, exit `2`, and a run that links an existing project or finds one already linked sends nothing and reports no `coppa`. When `--coppa` was given but the run created no cloud project (a git `--vcs` provider, or a project that was already cloud-linked), a warning on stderr says it was not applied; in JSON the absent `coppa` field is the signal. Change an existing project’s COPPA setting in the Unity Cloud dashboard instead. On `create`, `--coppa` alone also counts as asking for a cloud project, like `--cloud`.
208
+
209
+ **Source-control during creation** — publish the new project to a fresh repository:
210
+
211
+ ```bash
212
+ unity projects create MyGame \
213
+ --vcs github \
214
+ --git-namespace my-org \
215
+ --git-repo my-game \
216
+ --git-visibility private \
217
+ --git-default-branch main \
218
+ --git-token-from-stdin
219
+ ```
220
+
221
+ Source-control flags (shared with `projects link vcs`): `--vcs github|gitlab|uvcs|<host>`, `--git-namespace <name>`, `--git-repo <name>`, `--git-visibility private|public|internal` (default private), `--git-default-branch <name>`, `--git-remote-protocol https|ssh` (default https), `--git-description <text>`, `--git-token <pat>` / `--git-token-from-stdin`, `--no-initial-commit`, `--git-lfs`, and `--vcs-region <name>` for Unity Version Control.
222
+
223
+ **Flag names differ by subcommand:** `projects create` and `projects link vcs` use `--git-namespace` / `--git-repo`, while `projects clone` (below) uses `--vcs-namespace` / `--vcs-repo`. Copy the names for the exact command you're running, and confirm with `--help` if unsure.
224
+
225
+ **`--git-remote-protocol ssh` attaches the created repository's SSH remote instead of its HTTPS one.** The provider REST call that creates the repository still needs the resolved PAT — SSH has no equivalent for that API call — but the local `origin` remote and the initial push then use the repository's `git@<host>:<owner>/<repo>.git` form with pure ambient SSH auth (the running ssh-agent, a repository-local `core.sshCommand`, or an `~/.ssh/config` host alias — whichever the machine already has configured; the CLI never handles keys itself). Passing `--git-token`/`--git-token-from-stdin` alongside `--git-remote-protocol ssh` is fine: the token still authenticates the repository-creation API call, it's only the git transport that switches.
226
+
227
+ **Self-hosted hosts create through a provider CLI, not REST.** `--vcs` also accepts a bare host (e.g. `--vcs gitea.example.com`) for anything other than github.com/gitlab.com — there is no built-in REST client for those, so the repository is created through `gh`, `glab`, or `tea`, whichever is installed and already signed in for that host (checked in that order). The same fallback covers github/gitlab themselves when no REST token can be resolved: the matching CLI (`gh` for github, `glab` for gitlab) steps in if it is signed in, before the command gives up. No PAT is ever read, stored, or forwarded on a provider-CLI path. When a provider CLI created the repository, the machine-readable result carries `vcs.mechanism` (`gh` | `glab` | `tea`) naming which one — omitted for the REST path and for a `[url]`-form link, so existing scripted consumers see no change on github.com/gitlab.com. If nothing can create it — no REST token and no signed-in provider CLI for that host — the error explains creating the repository yourself and linking it with `unity projects link vcs <path> <url>`.
228
+
229
+ **Where the Git token comes from.** Resolution order, first hit wins: `--git-token-from-stdin` → `--git-token` → `UNITY_GITHUB_TOKEN` / `UNITY_GITLAB_TOKEN` → `git credential fill` (the user's credential helper) → an interactive masked prompt. The first three are explicit per-command overrides and always beat the helper. `projects create`, `projects link vcs` (flag and URL forms) and `vcs setup` with `--git-token-from-stdin` never reach the helper or a provider CLI: an empty stdin (or a terminal) with no variable set is exit 4 (`VCS_TOKEN_REQUIRED`). **The CLI stores no Git token** at any tier, including one typed at the prompt.
230
+
231
+ **Whether anyone is there to answer is decided up front.** On a real terminal, a configured credential helper is free to run its own sign-in — including Git Credential Manager's browser and device-code flows — and its instructions are relayed to you rather than swallowed. Without a terminal, in CI, under a machine-readable `--format`, or with `--non-interactive`, nothing prompts at all: the command fails immediately with **exit 4**, naming the credential it needed and how to supply it out of band (`--git-token[-stdin]` or the env vars above). Interaction is judged on all three standard streams, so redirecting stderr alone can no longer leave a password prompt writing into a file while waiting on a keystroke you were never shown.
232
+
233
+ The credential lookup passes the full repository URL, so a helper that keeps one account per URL can return a different token per organization, but only when `credential.useHttpPath` is set, since git otherwise withholds the path from helpers:
234
+
235
+ ```bash
236
+ git config --global credential.useHttpPath true
237
+ ```
238
+
239
+ Per-project identity instead lives in the repository's own config (`credential.useHttpPath`, `credential.username` in its `.git/config`); `projects link vcs` runs the lookup inside the project, so the Hub, the CLI, and plain `git` all resolve the same credential. For a CI pipeline spanning several organizations, pass `--git-token-from-stdin` per invocation: the env vars hold one token per provider, and there is no per-org variant.
240
+
241
+ Per-organization scoping needs the organization to be known before the credential is looked up. `projects clone` always requires `--vcs-namespace`, so it is always scoped. `projects create` and `projects link vcs` take `--git-namespace`, and when it is omitted the lookup stays host-scoped, because the namespace cannot be resolved until you are authenticated and you cannot authenticate without a credential. Pass `--git-namespace` to target a specific organization's credential.
242
+
243
+ #### projects clone
244
+
245
+ Clone a remote repository and register the Unity project it contains. Works across providers:
246
+
247
+ ```bash
248
+ # Clone by provider + namespace + repo
249
+ unity projects clone --vcs github --vcs-namespace my-org --vcs-repo my-game --path ./MyGame
250
+
251
+ # Check out a specific ref (branch, sha, or UVCS changeset)
252
+ unity projects clone --vcs uvcs --vcs-namespace my-org --vcs-repo my-game --ref main
253
+
254
+ # Authenticate with a personal access token (prefer stdin)
255
+ unity projects clone --vcs gitlab --vcs-namespace my-org --vcs-repo my-game --git-token-from-stdin
256
+
257
+ # Project lives in a subdirectory of the repo
258
+ unity projects clone --vcs github --vcs-namespace my-org --vcs-repo monorepo \
259
+ --path ./repo --subpath packages/MyGame
260
+
261
+ # Clone an arbitrary git URL instead (HTTPS, or SSH via the standard
262
+ # git user@host:path shorthand) — no --vcs/--vcs-namespace/--vcs-repo needed
263
+ unity projects clone https://github.com/my-org/my-game.git
264
+ unity projects clone --ref develop <ssh-clone-url-for-your-host>
265
+ ```
266
+
267
+ Options: `--vcs github|gitlab|uvcs`, `--vcs-namespace <name>`, `--vcs-repo <name>`, `--ref <branch|sha|changeset>` (an all-digit ref is treated as a Unity Version Control changeset; for git, a branch or tag, or a commit id that is checked out after the clone), `--path <dest>` (clone destination), `--subpath <subpath>` (the project's folder, when the repository holds more than one), `--git-token <pat>` / `--git-token-from-stdin`, `--json`. Git LFS assets are fetched as pointer files only.
268
+
269
+ **The `[url]` form is an alternative to `--vcs`/`--vcs-namespace`/`--vcs-repo`, not an addition to them** — passing a URL alongside any of those three flags is a bad-arguments error. `--ref`, `--path`, `--subpath`, `--no-lfs` always apply. `--git-token`/`--git-token-from-stdin` only apply when the URL is an **explicit HTTPS** URL whose host is github.com or gitlab.com — passing a token for any other host (an SSH-form or SCP-style URL, or a host that isn't github.com/gitlab.com) is a bad-arguments error, since there's nowhere for that credential to go. No token is required: with none supplied, the clone runs with whatever git auth is already set up on the machine (SSH agent, a configured credential helper, `.netrc`, or userinfo embedded in the URL itself) — this includes every SSH-form clone, even against github.com/gitlab.com, since the provider credential helper is HTTPS-only. Unity-project detection is **always** a post-clone scan of the downloaded tree for the URL form (never a provider API call, regardless of host or token) — only Git LFS credentials differ by tier: an HTTPS URL to github.com/gitlab.com with a token uses the provider-scoped LFS credential helper, everything else uses the machine's own git auth for the LFS pull too. A malformed URL, an unreachable host, a rejected/unknown SSH host key, and an authentication failure are reported as distinct errors (exit 2, 7, 3, and 3 respectively).
270
+
271
+ **SSH transport policy.** No SSH URL is ever rewritten to HTTPS, and no key handling happens in the CLI — a key held by a running ssh-agent is used automatically, and a repository-local `core.sshCommand` or an `~/.ssh/config` host alias behaves identically to plain `git`, because the CLI only supplies its own SSH defaults when none of those (nor `GIT_SSH_COMMAND`/`GIT_SSH`) are already set — and it supplies none of them at all on an interactive terminal, deferring entirely to ssh's own prompts (a real fingerprint prompt for an unfamiliar host, a real passphrase prompt for a protected key with no agent), since a person at the terminal can answer them. Only in a non-interactive invocation (no TTY, or `--non-interactive`/`UNITY_NON_INTERACTIVE`), where no prompt could ever be answered, does the CLI supply its own defaults: an unknown host is trusted on first connect and pinned (so a *later* change to that host's key still fails loudly — this is not silenced), and a passphrase-protected key with no agent fails fast with an actionable error instead of hanging.
272
+
273
+ #### Working in a Unity Version Control workspace
274
+
275
+ Two reads are wrapped, because Unity-aware wrapping adds something, and code reviews get their own
276
+ subgroup because `cm` cannot reach them at all. Everything else forwards to `cm` unchanged, because
277
+ wrapping it would add nothing.
278
+
279
+ ```bash
280
+ # Wrapped: the lock listing joined to YOUR pending changes. This is the one thing cm cannot
281
+ # do for you, since it has no single command that knows both.
282
+ unity vcs uvcs locks # who holds what, and what collides with your work
283
+ unity vcs uvcs locks --format json # stable envelope: asOf, inLocalChanges, unlockCommand
284
+
285
+ # Wrapped: recent history in a shape a script or an agent can rely on.
286
+ unity vcs uvcs changesets --limit 50
287
+ unity vcs uvcs changesets --format json
288
+
289
+ # Straight through to cm: partial checkout, shelves, and lock mutations. cm's own flags,
290
+ # cm's own output, cm's own --help. This is the supported route, not a workaround.
291
+ unity uvcs partial configure
292
+ unity uvcs partial update /Assets/Levels
293
+ unity uvcs shelve -c "wip: lighting pass"
294
+ unity uvcs shelve --apply sh:12
295
+ unity uvcs lock list
296
+ unity uvcs lock unlock itemid:42@my-game
297
+ unity uvcs --help # cm's own help, forwarded verbatim
298
+ ```
299
+
300
+ `unity vcs uvcs --help` says the same thing at the point of confusion: anything it does not list
301
+ forwards straight to `cm`. `unity cm <args>` is the identical passthrough under cm's own name.
302
+
303
+ **Lock state is shared and racy.** `unity vcs uvcs locks` reports the state as of the moment it
304
+ read it, and says so in both the human output and the `asOf` field. Do not cache a reading or treat
305
+ one as authoritative; read again before you act. The wrapper never mutates a lock for the same
306
+ reason it never paraphrases cm's flags: releasing someone else's lock is a decision about shared
307
+ team state, so it stays an explicit `unity uvcs lock unlock` the user types.
308
+
309
+ #### Code review comments
310
+
311
+ `unity vcs uvcs review` reads the review comments a person left in the Unity Version Control GUI,
312
+ and answers them. This is the one UVCS surface with no `cm` route at all — `cm codereview` manages
313
+ review objects but has no comment verbs — so without these commands a reviewer's feedback is
314
+ invisible to anything outside the GUI, and a human has to restate every comment in the prompt.
315
+
316
+ ```bash
317
+ # Find a review. Any of --changeset, --branch or --status narrows it server-side.
318
+ unity vcs uvcs reviews --branch /main --format json
319
+
320
+ # Read its comments, with the file and line each one is anchored to.
321
+ unity vcs uvcs review comments --review 42 --format json
322
+ unity vcs uvcs review comments --changeset 118 # the review attached to a changeset
323
+ unity vcs uvcs review comments --review 42 --all-activity
324
+
325
+ # Answer one, then record which change addressed it.
326
+ unity vcs uvcs review reply --review 42 --comment 7 --body "Fixed in the next changeset."
327
+ unity vcs uvcs review resolve --review 42 --comment 7 --changeset 118
328
+ ```
329
+
330
+ All four take the usual optional `[path]` operand; everything else is an option. `--limit` defaults
331
+ to 50 and caps at 500, and the envelope's `truncated` tells you when there was more.
332
+
333
+ **Unity Cloud only.** The reviews service resolves a per-organization cloud region, so a
334
+ self-hosted workspace has no reviews API — those commands refuse with
335
+ `VCS_UVCS_REVIEW_SELF_HOSTED` and point at the GUI rather than failing obscurely.
336
+
337
+ **They need a signed-in session, and the three auth-shaped failures mean different things.**
338
+ `unity auth login` is all you have to do; the short-lived gateway token these commands
339
+ authenticate with is obtained for you. `NOT_SIGNED_IN` and `SESSION_EXPIRED` (both exit 3) mean
340
+ sign in again. `UVCS_TOKEN_UNAVAILABLE` (exit 6) means that token could not be obtained at all —
341
+ a connectivity or service problem, not a credential one, so re-running sign-in will not help.
342
+ `VCS_UVCS_REVIEW_REQUIRE_AUTH` (exit 3) is the reviews service itself refusing a credential the
343
+ CLI did obtain. Do not treat them as one condition: only the first two are worth a login retry.
344
+
345
+ **`line` is one-based, and may be absent.** The service anchors a comment with a zero-based line in
346
+ a string field whose `-1` means "not anchored to a line". The CLI does that arithmetic once: `line`
347
+ in the envelope matches what the dashboard shows, and is `null` — never `0` — for a comment that
348
+ is not tied to a line. Do not add one yourself.
349
+
350
+ **The default is file comments, not the whole feed.** The service's comments route is an activity
351
+ feed of fourteen types, only four of which (`Comment`, `Change`, `Question`, `Conversation`) are
352
+ things a person wrote against a file. `comments` returns those four; `--all-activity` adds the
353
+ status changes, reviewer requests and timeline entries. Read `activityRead` alongside `returned` to
354
+ tell "no comments" from "activity, but nothing to act on".
355
+
356
+ **Resolving means naming a changeset, and is not idempotent.** There is no resolved flag on the
357
+ wire — the state IS the changeset the comment was applied in — so `--changeset` is required and is
358
+ never inferred from whatever the workspace happens to be sitting on. A comment that is already
359
+ resolved is refused (`VCS_UVCS_REVIEW_ALREADY_RESOLVED`) rather than silently re-pointed, because
360
+ overwriting it would lose which change actually addressed the comment. The service performs no
361
+ already-resolved check of its own, so that guard is entirely client-side: on a review with more
362
+ activity than one page, where the comment falls outside the window, `resolve` **refuses**
363
+ (`VCS_UVCS_REVIEW_STATE_UNKNOWN`) rather than writing blind — resolve those from the GUI. The guard
364
+ is not atomic either: another writer can resolve between the read and the write, and the service
365
+ offers no conditional write to close that window.
366
+
367
+ **Writes name both ids explicitly.** `reply` and `resolve` take `--review` and `--comment` and
368
+ accept no `--changeset`/`--branch` selector, unlike the read leaves: they write a durable record
369
+ other people read, and an indirect selector resolving to the wrong review would post into a
370
+ conversation nobody looked at. Both ids come straight out of `review comments`. A reply body
371
+ carrying control characters is refused rather than stripped, so what lands in the review is exactly
372
+ what was written.
373
+
374
+ The `cm` client is needed for all of this. `unity plugin install plastic` installs it; a command
375
+ that needs it and cannot find it says so and names that command.
376
+
377
+ #### Connecting to a self-hosted or enterprise host
378
+
379
+ GitHub Enterprise Server, self-managed GitLab, and self-hosted Gitea/Forgejo all work with the URL form of `projects clone` and `projects link vcs` (not `projects create --vcs`, which accepts only `github`, `gitlab`, and `uvcs`), but **each host signs in separately**: being signed in to github.com grants nothing on `ghe.example.com`. The first attempt against a new host fails to authenticate (exit 3) until you sign in to that host specifically; the CLI then prints the exact command for whichever mechanism your machine has.
380
+
381
+ Three ways in, any one is enough:
382
+
383
+ ```bash
384
+ # 1. The provider's own CLI, scoped to the host (enables repo browsing/creation)
385
+ gh auth login --hostname ghe.example.com
386
+ glab auth login --hostname gitlab.example.com
387
+ tea login add --name work --url https://gitea.example.com
388
+
389
+ # 2. Git Credential Manager: one credential per host, no per-host setup,
390
+ # picked up once `git credential approve` has stored one for that host
391
+
392
+ # 3. SSH: needs neither of the above; uses your SSH agent
393
+ unity projects clone <ssh-clone-url-for-your-host>
394
+ ```
395
+
396
+ `gh` and `glab` hold one session per host and can be signed in to several simultaneously, which is why the sign-in commands are host-scoped rather than bare. `tea` has no default host at all: every login is a named entry for one instance URL.
397
+
398
+ The CLI reads and stores no token on any of these paths. It asks each installed provider CLI whether it holds a session for that specific host, with credential-bearing environment variables stripped from the child process: `gh` otherwise applies `GH_ENTERPRISE_TOKEN` to any non-cloud host and dials it to validate, which would leak the token to a host that merely appeared in a failing URL. Stripped, `gh` answers from its own config: an unconfigured host is never contacted. Side effect: authenticating purely via `GH_ENTERPRISE_TOKEN` (no `gh auth login` entry) reads as signed out, so you may be offered a sign-in you do not need. A host with no provider CLI available is not a dead end: plain git still clones and pushes, with credentials from the credential manager or the SSH agent. Note `--git-token`/`--git-token-from-stdin` still only apply to github.com and gitlab.com over HTTPS; for any other host, rely on one of the three paths above.
399
+
400
+ #### projects pin / unpin
401
+
402
+ ```bash
403
+ # Pin a project to the top of the list
404
+ unity projects pin /path/to/MyProject
405
+
406
+ # Unpin
407
+ unity projects unpin /path/to/MyProject
408
+ ```
409
+
410
+ #### projects size
411
+
412
+ Report a project's on-disk footprint broken down by top-level folder (Assets, Library, Packages, …) with a total, so you can see how much is regenerable build state (Library, Temp) versus source and assets:
413
+
414
+ ```bash
415
+ # Size of one project (defaults to the current project when the argument is omitted)
416
+ unity projects size /path/to/MyProject
417
+
418
+ # Summarize every registered project, largest first
419
+ unity projects size --all
420
+
421
+ # Machine output — raw bytes instead of readable KB/MB/GB units
422
+ unity projects size --all --json
423
+ ```
424
+
425
+ Human output uses readable units; `--json` (and `--format ndjson`) emit raw byte counts.
426
+
427
+ #### projects clean
428
+
429
+ The counterpart to `projects size`: deletes the **regenerable** folders (`Library`, `Temp`, `Logs`, …) to reclaim disk space. Unity rebuilds them on the next open — at the cost of a slow first import.
430
+
431
+ ```bash
432
+ # Preview: what would be deleted, with sizes — deletes nothing
433
+ unity projects clean --dry-run
434
+
435
+ # Clean the current project (prompts to confirm)
436
+ unity projects clean
437
+
438
+ # Clean a project by path or registered name
439
+ unity projects clean ./MyGame
440
+
441
+ # Non-interactive: --yes is REQUIRED in a script or CI
442
+ unity projects clean MyGame --yes
443
+ ```
444
+
445
+ The project argument defaults to the current directory and accepts a path or a registered project name. Guardrails worth relying on:
446
+
447
+ - **It refuses while the project is open in a running editor**, naming the PID — cleaning `Library` under a live editor corrupts the session. If the CLI cannot determine whether an editor has it open, it warns and proceeds, so close editors first in automation.
448
+ - **It refuses to delete unprompted.** In a non-interactive shell without `-y, --yes` it stops rather than deleting.
449
+ - A path that isn't a Unity project (no `ProjectVersion.txt`) is rejected outright, so a mistyped path can't delete anything.
450
+
451
+ `--dry-run` is the safe way to size the win first; it reports what it *would* reclaim and exits without touching the filesystem.
452
+
453
+ #### projects verify
454
+
455
+ An Editor-free integrity check on the **project**, meant as the first step of a CI job. `unity doctor` answers "can this machine build?"; this answers "is this project sound?" — the version-control damage that otherwise surfaces after the expensive build step, as a confusing import error or an artifact that is wrong rather than missing:
456
+
457
+ ```bash
458
+ # Verify the current project
459
+ unity projects verify
460
+
461
+ # Verify a project by path or registered name
462
+ unity projects verify ./MyGame
463
+
464
+ # CI gate: warnings fail the job too
465
+ unity projects verify --strict
466
+
467
+ # Only the checks you care about (either spelling works)
468
+ unity projects verify --check meta-missing,guid-duplicate
469
+
470
+ # Confirm the project targets the version the pipeline pins
471
+ unity projects verify --expect-editor 6000.0.30f1
472
+
473
+ # Inline annotations on the job, anchored to the offending file and line
474
+ unity projects verify --format github
475
+ ```
476
+
477
+ Exits `0` when nothing error-severity is found, `6` otherwise. Warnings alone still exit `0` — `--strict` promotes them. Every finding carries a stable code, a severity, a project-relative path, and a remediation hint:
478
+
479
+ | Code | Severity | Detects |
480
+ |---|---|---|
481
+ | `META_MISSING` | error | An asset under `Assets/` with no sibling `.meta`. Unity assigns a fresh guid, silently breaking every reference to it. |
482
+ | `META_ORPHAN` | warning | A `.meta` whose asset no longer exists. |
483
+ | `GUID_DUPLICATE` | error | Two `.meta` files claiming the same `guid` — typically two branches that each added one. |
484
+ | `CONFLICT_MARKERS` | error | Unresolved merge markers in a `.meta`, `ProjectSettings/*.asset`, `Packages/manifest.json`, or `packages-lock.json`. |
485
+ | `MANIFEST_INVALID` | error | `Packages/manifest.json` does not parse, or a dependency version is not a string. |
486
+ | `EDITOR_VERSION_DRIFT` | warning | `ProjectVersion.txt` disagrees with `--expect-editor`. |
487
+ | `PATH_UNVERIFIABLE` | warning | A path the scan did not inspect, named so you know which subtree went unchecked. Always on — not selectable via `--check`. |
488
+
489
+ Worth knowing:
490
+
491
+ - **Editor-version drift is opt-in.** Nothing in the CLI stores a pinned version, so the check only runs when you pass `--expect-editor <version>` — the version your pipeline pins.
492
+ - **`--format json` returns the full report** (findings plus an errors/warnings/filesScanned summary); **`--format ndjson` emits one `type: "finding"` record per finding** as it is found, then a terminal result frame. Piped stdout defaults to `tsv`, like the rest of the CLI.
493
+ - **Safe to paste into a public log.** Finding paths are project-relative, terminal-escape-stripped, and the project root has its home directory masked.
494
+ - **It is built to scan an untrusted repository** — a fork, an unreviewed pull-request branch, a third-party template. So it refuses to follow a symlinked `Assets/`, `ProjectSettings/`, or `Packages/` (exit 6, `PROJECTS_VERIFY_UNSCANNABLE_DIR`), which would otherwise make it enumerate or read a tree outside the project into your CI log, and it bounds every file read at 16 MiB. A symlink **deeper** in the tree is not refused — it is skipped and reported (next bullet), since one link inside `Assets/` should not fail the whole scan.
495
+ - **`summary.unverifiable` tells you whether the pass is complete, and each skipped path is named.** Anything the scan could not inspect — a symlinked directory or file at any depth, an unreadable subtree, a walk past the depth cap, an over-budget file, a missing `Assets/` — is counted there and reported as a `PATH_UNVERIFIABLE` warning carrying the path, so you can see which subtree went unchecked instead of only how many did. Under `--strict` those warnings promote to errors like any other, so a project cannot satisfy the gate by making verification impossible rather than by being sound.
496
+ - **`--expect-editor` must be a real Unity version.** A typo like `6000.x` exits 2 rather than becoming a drift warning that passes — otherwise a misconfigured pipeline would silently satisfy its own version gate.
497
+ - **`data.checks` lists what actually ran.** `EDITOR_VERSION_DRIFT` is absent unless you passed `--expect-editor`, since without a version to compare against there is nothing to check.
498
+ - **No Editor, no license, no network, no installed editor** — and it does not read asset bodies, so it stays fast on a large project.
499
+ - **Detection only.** It does not repair anything; fixing meta/guid divergence needs the Editor's own asset database.
500
+ - Names Unity's importer ignores (dot-prefixed, `~`-suffixed, `.tmp`, `cvs`) are skipped, so a `.gitignore` or a `Documentation~` folder never reports a missing `.meta`.
501
+
502
+ #### projects require
503
+
504
+ Ensure the editor version required by a project is installed, installing it if needed:
505
+
506
+ ```bash
507
+ unity projects require /path/to/MyProject --yes
508
+ ```
509
+
510
+ On a TTY with no path, prompts interactively.
511
+
512
+ #### projects report
513
+
514
+ Group every registered project by the editor version its `ProjectVersion.txt`
515
+ asks for, flagging a version that isn't installed and a version whose stream
516
+ isn't LTS:
517
+
518
+ ```bash
519
+ unity projects report
520
+ unity projects report --format json
521
+ ```
522
+
523
+ Read-only: it never installs, removes, or changes anything. It pairs with
524
+ two follow-up commands rather than doing their job itself: `unity projects
525
+ require <path>` installs a missing version, and `unity editors prune` reviews
526
+ installed editors no registered project asks for. The LTS/non-LTS distinction
527
+ is the offline classification the installed `lts` upgrade alias already uses
528
+ (no network call); this codebase has no end-of-support date for any stream,
529
+ so the report never claims one, a non-LTS flag is the whole signal.
530
+
531
+ #### projects upgrade
532
+
533
+ Upgrade a project to a different Unity editor version. `--to` is required:
534
+
535
+ ```bash
536
+ unity projects upgrade --to 6000.0.47f1
537
+ unity projects upgrade /path/to/MyProject --to 6000.0.47f1 --yes
538
+ ```
539
+
540
+ **An Editor must not have the project open.** The upgrade ends by opening the project in the target
541
+ Editor, so on a project an Editor already holds it exits `6` with "already open in a running Editor"
542
+ and the Editor's process id, and launches nothing. Ask the user to close that Editor, then run the
543
+ upgrade again.
544
+
545
+ **Into Unity 6.7 or later, an unlinked project needs a Unity Cloud choice.** Unity 6.7 turns
546
+ diagnostics on by default for projects linked to Unity Cloud, so the upgrade takes one of:
547
+
548
+ | Option | Effect |
549
+ |---|---|
550
+ | `--cloud` | Create a new Unity Cloud project and link it (`--coppa <status>` declares its COPPA status) |
551
+ | `--cloud-project <id-or-name>` | Link an existing Unity Cloud project |
552
+ | `--no-cloud` (or `UNITY_NO_CLOUD`) | Upgrade without linking |
553
+ | `--cloud-org <id-or-name>` | The organization for `--cloud` or `--cloud-project`, as on `projects create` |
554
+
555
+ Without a choice the command exits `2` with `CLOUD_CHOICE_REQUIRED` before installing or opening
556
+ anything. Under `--format json` or `ndjson` it lists one `notifications` entry per choice, each
557
+ with a `remediation.command` that repeats the invocation with that flag and
558
+ `requiresUserApproval: true`, so ask the user which one to run. The existing-project entry's
559
+ command contains the literal placeholder `<id-or-name>` (also in its `data.placeholder`): replace
560
+ it with the project's ID or name, quoted for the shell (a name can hold spaces or shell
561
+ metacharacters), before running it, because a shell reads an unquoted `<...>` as an input
562
+ redirect. A project already linked needs no choice; `--cloud` or `--cloud-project` on a
563
+ linked project, or on an upgrade below 6.7, is reported in `warnings` as not applied. When the
564
+ project ends the upgrade linked (already linked, or linked by `--cloud` / `--cloud-project`), the
565
+ upgrade also sets each build profile whose diagnostics setting was the project default to enabled;
566
+ `data.diagnostics.buildProfiles.profiles` lists every profile with its resulting `state` and
567
+ whether it was `updated`. On a project that isn't linked, `--no-cloud` leaves every build profile
568
+ as it was and reports no `data.diagnostics`, because diagnostics only defaults on for linked
569
+ projects. On a project that is already linked, `--no-cloud` keeps the link and the profiles are
570
+ still enabled. `data.cloud.outcome`
571
+ reports the link (`alreadyLinked`, `linkedNew`, `linkedExisting`, `notLinked`).
572
+
573
+ ```bash
574
+ unity projects upgrade ./MyGame --to 6000.7.0f1 --yes --cloud
575
+ unity projects upgrade ./MyGame --to 6000.7.0f1 --yes --no-cloud --json
576
+ ```
577
+
578
+ #### projects audit
579
+
580
+ `unity projects audit` gets Project Auditor ready in the project's running Editor and opens its window on one workflow's page, so the user can run the analysis from there. It never runs the analysis itself. The project must be open in a Unity 6 or later Editor with `com.unity.pipeline` installed.
581
+
582
+ <!-- unity-example: skip (Rust-only) -->
583
+ ```bash
584
+ # Open Project Auditor on the Upgrade page (the default)
585
+ unity projects audit
586
+
587
+ # Open it on another workflow's page: upgrade, optimization, urp or coreclr
588
+ unity projects audit --workflow urp
589
+
590
+ # Open a saved report on that page
591
+ unity projects audit --report ./Library/projectauditor-report-autosave.projectauditor
592
+
593
+ # The Editor that has a given project open, with a longer wait for the install
594
+ unity projects audit --project-path ./MyGame --timeout 3600 --json
595
+ ```
596
+
597
+ - **Packages first.** In Unity 6.0 to 6.3 Project Auditor is the `com.unity.project-auditor` package; in later Editors it is built in. The command adds or updates that package (when needed) and `com.unity.project-auditor-rules` to the newest versions the Editor supports, then waits for the Editor to reload. A package that is embedded, local or from git is left alone. When the registry can't be read it warns and lets the Package Manager pick a version.
598
+ - **The window.** It opens and focuses the Project Auditor window on the workflow's page. When the page can't be reached without a report, the window still opens and the result carries a `note` saying why: `{code, detail}` with code `pageUnavailable`, `viewUnavailable` or `failed` (`detail` holds the Editor's message).
599
+ - **Exit codes.** `0` once the window is open. `2` for a bad option or a `--report` file that doesn't exist (`PROJECTS_AUDIT_REPORT_NOT_FOUND`). `10` when Project Auditor did not load within `--timeout` seconds (default 1800, `PROJECTS_AUDIT_TIMED_OUT`). `6` for an Editor older than Unity 6 (`PROJECTS_AUDIT_EDITOR_TOO_OLD`), a failed install (`PROJECTS_AUDIT_INSTALL_FAILED`), scripts that don't compile (`PROJECTS_AUDIT_COMPILE_FAILED`), Project Auditor not loading (`PROJECTS_AUDIT_NOT_LOADED`) or a step the Editor could not run (`PROJECTS_AUDIT_SCRIPT_FAILED`). No running Editor gives the same error as the other commands that drive the Editor through Pipeline.
600
+ - **`--json` data:** `unityVersion`, `projectPath`, `projectAuditor` (`builtIn`, `assembly`, `packageVersion`, `rulesVersion`), `packagesAdded`, `workflow`, `reportPath` (`null` without `--report`) and `window` (`windowAssembly`, `reportLoaded` (`null` when Project Auditor can't tell), `reportIssue`, `navigated`, `note`). A report the window would refuse is not handed to it, so no dialog opens: `reportIssue` says why (`incompatible` for another Project Auditor version or an unreadable file, `empty`, `otherProject`) and `warnings` carries the same sentence the human output prints.
601
+
602
+ #### projects export / import
603
+
604
+ ```bash
605
+ # Export the project registry to a file (or stdout if -o is omitted)
606
+ unity projects export -o projects.json
607
+
608
+ # Import a previously exported registry
609
+ unity projects import projects.json
610
+ unity projects import --input projects.json
611
+ ```
612
+
613
+ #### projects exec — run a command across every registered project
614
+
615
+ Run one command in each registered project. The command runs in that project's own directory, with `UNITY_PROJECT_PATH` and `UNITY_EDITOR_VERSION` set in its environment. Everything after `--` is the command:
616
+
617
+ ```bash
618
+ # Every registered project
619
+ unity projects exec -- git status --short
620
+
621
+ # Only pinned projects
622
+ unity projects exec --filter pinned -- git pull
623
+
624
+ # Only Unity 6 projects, four at a time, without stopping on failures
625
+ unity projects exec --filter 'version:6000.*' --parallel 4 --continue-on-error -- npm test
626
+
627
+ # See what would run, without running it
628
+ unity projects exec --dry-run --filter 'name:My*' -- ./build.sh
629
+
630
+ # Machine-readable per-project results
631
+ unity projects exec --json -- git rev-parse HEAD
632
+ ```
633
+
634
+ `--filter` is repeatable and every term must match (AND):
635
+
636
+ | Term | Matches |
637
+ |---|---|
638
+ | `name:<glob>` | project name or path — a bare glob (`My*`) is shorthand for this |
639
+ | `version:<glob>` | the project's required editor version (`6000.*`) |
640
+ | `pinned` / `pinned:false` | pin state; bare `pinned` means pinned |
641
+
642
+ Globs are path-aware, so use `**/` to match inside a path: `name:My*` matches by project name, `name:**/work/*` by location.
643
+
644
+ Behavior worth knowing:
645
+
646
+ - Projects run **one at a time** and the run **stops at the first failure**. Raise `--parallel <n>` for concurrency, or pass `--continue-on-error` to run the whole fleet regardless. With `--parallel > 1`, each project's output is buffered and flushed when it finishes so runs can't interleave; "stop" then means no *new* projects start — those already running finish.
647
+ - Buffered output is capped at **4 MiB per project**, after which it is cut short and the run warns. Sequential mode (`--parallel 1`) streams live and is never capped, so use it when you need the full output of a chatty command.
648
+ - **Ctrl-C** stops scheduling *and* terminates the projects already running, then exits **130**.
649
+ - Exit code is **6** if any project failed, **2** for a usage error (unknown filter key, bad `--parallel`, a command not on your `PATH`), **0** otherwise. No matching projects is a success (exit 0) with a warning.
650
+ - Arguments are passed to the command **verbatim, not through a shell** — pipes, `&&`, and shell globbing are not available. Put that logic in a script and exec the script.
651
+ - In `--json` / `--format ndjson` / `--format tsv`, the child's own output goes to **stderr** so stdout stays machine-parseable.
652
+ - `--format ndjson` streams one `{"type":"project",…}` frame per project as it settles and always closes with the standard `{"type":"result",…}` envelope (`success`, `command`, `data`, `errors`, `warnings`) — including under `--dry-run`.
653
+
654
+ #### projects open / link / unlink
655
+
656
+ ```bash
657
+ # Open a registered project by name, fuzzy title match, or path
658
+ unity projects open MyProject
659
+ # (the top-level `unity open` is the same thing)
660
+
661
+ # --- Cloud links ---
662
+ # Connect an existing local project to a Unity Cloud project
663
+ unity projects link cloud /path/to/MyProject --cloud-org <id-or-name>
664
+ # ...to a specific existing Unity Cloud project, by id or name
665
+ unity projects link cloud /path/to/MyProject --cloud-project <id-or-name>
666
+ # Switch an already linked project to another Unity Cloud project, in one step (no unlink first)
667
+ unity projects link cloud /path/to/MyProject --cloud-project <id> --replace
668
+ # Disconnect from its Unity Cloud project (always name the path: UNITY_PROJECT_PATH is not read here)
669
+ unity projects unlink cloud /path/to/MyProject
670
+ # Also remove the Unity Version Control workspace bound to this project
671
+ unity projects unlink cloud /path/to/MyProject --cascade-vcs
672
+ # ...when that workspace is SHARED (rooted above the project), confirm it explicitly
673
+ unity projects unlink cloud /path/to/MyProject --cascade-vcs --unlink-workspace
674
+
675
+ # --- Version-control links ---
676
+ # Publish a local project to a NEW GitHub / GitLab / Unity Version Control repository
677
+ unity projects link vcs /path/to/MyProject \
678
+ --vcs github --git-namespace my-org --git-repo my-game --git-token-from-stdin
679
+ # Attach to an ALREADY-EXISTING remote instead of creating one — pass its URL
680
+ unity projects link vcs /path/to/MyProject https://github.com/my-org/my-game.git
681
+ # Undo a half-finished link instead of resuming it
682
+ unity projects link vcs /path/to/MyProject --rollback
683
+ # ...and delete the repository it created, if nothing has been pushed to it yet
684
+ # (asks first on a terminal; a script or agent confirms with --yes)
685
+ unity projects link vcs /path/to/MyProject --rollback --delete-remote --yes
686
+ # Remove a project's git remotes (the remote repositories are NOT deleted)
687
+ unity projects unlink vcs /path/to/MyProject
688
+ # Also detach the Unity Version Control workspace
689
+ unity projects unlink vcs /path/to/MyProject --unlink-workspace
690
+ ```
691
+
692
+ With piped or redirected stdout and no `--format` (so `tsv`), `link cloud` and `unlink cloud` print one row with six tab-separated columns: result (`linked`, `already-linked`, `unlinked`, `not-linked`), project path, cloud project ID, project name, organization ID, and `true`/`false` for whether a cloud project was created. For `link cloud` the name is the cloud project's. `unlink cloud` reports the link the project held before it was removed, with the name saved alongside it (the local project's title when the CLI made the link), and `not-linked` leaves the three cloud columns empty. For `link cloud`, `--format json` has the full payload (`cloudProject`, `cloudOrgSource`, `coppa`). `unlink cloud` JSON reports only `path` and `unlinked`, so read the removed link from its TSV row.
693
+
694
+ `link vcs` shares the source-control flag set documented under `projects create`. `link cloud` / `link vcs` accept `--cloud-org <id-or-name>` (env `UNITY_CLOUD_ORG`), and `--coppa <status>` for the cloud project they create (see the COPPA declaration note under `projects create`).
695
+
696
+ **`UNITY_NO_CLOUD` is the environment form of `--no-cloud`.** Any value counts, including `0`. It declines the cloud link on `projects create` and `projects upgrade` without editing every invocation in a pipeline. On `projects create` and `projects upgrade` it yields to a command that names a cloud flag (`--cloud`, `--cloud-project`, `--cloud-org`, `--coppa`), which then requests the cloud project, while `--no-cloud` on the same command line as one of those is refused. `projects create --vcs uvcs` is refused when the variable is set and no cloud flag overrides it, because UVCS needs a cloud project. `projects create` never reads the saved default project: it creates one unless `--cloud-project` names it.
697
+
698
+ **`link cloud` links an existing Unity Cloud project when one is named, and creates one only when none is.** The project comes from `--cloud-project <id-or-name>`, then `UNITY_CLOUD_PROJECT` (an id or a name), then the saved default project of the active organization (`unity cloud project set-default`), and only when none of them names a project does it create one, named after the project's folder. Every mode follows that order. On a terminal, a run with no `--cloud-project` that found a project asks whether to use it or create a new one, with the project the other modes would use preselected, so Enter does what a script would do; `--non-interactive`, `--quiet` and a machine format never ask. A project that the variable or the default names but the organization does not list fails with exit `6` and a message naming the setting, and never falls through to creating one. A saved default that is not a usable project id (a name, a number, an empty or missing value) fails the same way, and so does a `user-settings.json` the CLI cannot read (`SETTINGS_STORE_UNREADABLE` or `SETTINGS_STORE_DUPLICATE_KEYS`), because a default it cannot see might be the project you meant. A `link cloud` run on a project that is already linked fails with `ALREADY_LINKED` (exit `2`) unless `--cloud-project` names the project it is linked to (a no-op success) or `--replace` is passed.
699
+
700
+ **Switch with `--replace`, not unlink then link.** `ALREADY_LINKED` names the current link (with the project and organization names when a signed-in session can look them up; otherwise the ids) and ends with the one command that switches it: `unity projects link cloud <path> --cloud-project <id> --replace`, with the id the run resolved, or the `<cloud-project-id>` placeholder to fill in. JSON carries it as `data.suggestedCommand`, beside `data.currentLink` (`cloudProjectId`, `organizationId`, `genesisOrgId`, `cloudProjectName`, `organizationName`; names are `null` when unknown). `--replace` finds its target as a plain `link cloud` does (`--cloud-project`, then `UNITY_CLOUD_PROJECT`, then the organization's saved default project) but never creates a cloud project and never asks which project to use, even on a terminal: when none of them names one it fails with `REPLACE_NEEDS_CLOUD_PROJECT` (exit `2`; offline when nothing could, otherwise after the organization lookup and before any create), and a named project that doesn't exist stays not found. It writes the new link over the old one in both `ProjectSettings.asset` and the Hub's project list, with no unlink in between. Human output adds a line naming the link it replaced; JSON adds `data.previousLink` (`cloudProjectId`, `organizationId`, `genesisOrgId`). Naming the project it is already linked to is still a no-op success, and `--replace` on a project with no link links it as usual. Before writing anything, `--replace` refuses a project with a Unity Version Control workspace (`VCS_DEPENDS_ON_CLOUD`, exit `2`: run `unity projects unlink vcs` first) and a `ProjectSettings.asset` that can't take the new link, being read-only or having no Unity Cloud fields (`PROJECTS_LINK_CLOUD_LOCAL_WRITE_FAILED`, exit `6`, nothing changed).
701
+
702
+ **Creating is never silent.** Human output says `Created Unity Cloud project "<name>" (id <id>) in organization <genesis id> and linked it.`, and a run that linked an existing project says `Linked Unity Cloud project ...` and what chose it. `--format json` and `ndjson` report `created` (`true` or `false`) in `data`, beside `cloudProject` with the id, name and organization ids, and `coppa` when a project was created. `--format tsv`, the default when stdout is redirected, keeps its one `path` row on stdout and prints the same sentence on stderr when a project was created, and so does human output under `--quiet`.
703
+
704
+ **A taken name stops the run.** When the folder's name is already used by a project in the organization, nothing is created and the command fails with `CLOUD_PROJECT_NAME_TAKEN` (exit `6`). The message names the project that holds the name and the exact command that links it, `unity projects link cloud <path> --cloud-project <id>`, and in JSON `data.cloudProject` is that project. The name is never retried with a timestamp, and an existing project is never picked by name for you, because other people's projects share the organization. `--coppa` applies only when a project is created: with a project named by the variable or the default it is not applied, and a warning says so (`--coppa` beside `--cloud-project` is still refused with `COPPA_ARGS_CONFLICT`). `projects create` is unchanged: it always creates a new project unless `--cloud-project` is passed, and does not read `UNITY_CLOUD_PROJECT` or the saved default.
705
+
706
+ **Close the Editor before relinking.** An open Editor reads the cloud link only when it opens the project, so after `link cloud` or `unlink cloud` it keeps the old link, and its next settings save can write that link back over the change. When an Editor has the project open, both commands still succeed but warn (stderr; `warnings` in `json`/`ndjson`) and add `data.editor: {"open": true, "updated": false, "restartRequired": true}`. Save your work and run `unity close <path>`, then reopen the project. With no Editor open, `data.editor` is absent.
707
+
708
+ **`--cascade-vcs` alone will not remove a SHARED Unity Version Control workspace.** When the recorded workspace is rooted in a directory ABOVE the project — so sibling projects may live in it too — removing it affects all of them. On a terminal the command asks; in any non-prompting context (a machine format, `--non-interactive`, redirected stdout) it refuses with `UVCS_WORKSPACE_SCOPED` and exit `2` rather than quietly wiping a shared workspace in CI. Add `--unlink-workspace` alongside `--cascade-vcs` to confirm, which is exactly what the error message itself says.
709
+
710
+ **A link that failed part-way is resumed by default; `--rollback` unwinds it instead.** `--delete-remote` extends a rollback to the repository the command created, and only when that repository still has no commits — so a rollback can never discard work somebody has already pushed. It does nothing without `--rollback`. The CLI can't tell a repository the link created from one you created yourself and attached, so the delete is always confirmed: on a terminal it asks (default no), and where it can't ask (a machine format, `--non-interactive`, no terminal on stdin, CI) `--delete-remote` without `--yes` fails with `LINK_VCS_DELETE_REMOTE_REQUIRES_YES` (exit `2`) before anything is read or detached. `--yes` deletes without asking.
711
+
712
+ The `[url]` second operand attaches to a remote that already exists, instead of creating one — the one thing the flag form of `link vcs` cannot do. It is mutually exclusive with `--vcs`, `--git-namespace`, `--git-repo`, `--git-visibility`, `--git-default-branch`, `--git-remote-protocol`, `--git-description`, `--cloud-org`, `--cloud-project`, and `--coppa` (all meaningless without a repository to create — the URL's own scheme already says which transport to use). `--git-token[-stdin]`, `--no-initial-commit`, and `--git-lfs` still apply, and the same ambient-auth / Tier A rules as `projects clone [url]` govern whether the push uses a supplied token or the machine's own git auth.
713
+
714
+ ### Assets: inspect or export a `.unitypackage`
715
+
716
+ ```bash
717
+ # List a package’s contents: asset path, GUID, payload size, and whether a preview image is bundled
718
+ unity assets inspect ./MyPackage.unitypackage
719
+ unity assets inspect ./MyPackage.unitypackage --format json
720
+ ```
721
+
722
+ Works offline, with no Editor installed and no open project. The archive is streamed rather than read into memory, so a multi-gigabyte package is inspected in constant memory. `--format json` / `tsv` / `ndjson` carry the raw byte size and a boolean preview flag for scripts; the human table shows readable sizes and ends with a summary of entry count and total size. A missing file fails with `ASSET_PACKAGE_NOT_FOUND` (exit 6).
723
+
724
+ `--format json` / `ndjson` also carry `signed`: `true` when the package holds a signature (its first archive entry is the attestation a signed export writes), and the human output ends with a `Signed:` line. The CLI only checks that a signature is there; it does not verify it, so `signed: true` does not prove who published the package or that it was not changed. `--format tsv` is unchanged.
725
+
726
+ ### Assets — export a `.unitypackage`
727
+
728
+ ```bash
729
+ # Export one or more asset/folder paths, plus everything they depend on, to a .unitypackage
730
+ unity assets export Assets/Art --output Art.unitypackage
731
+ unity assets export Assets/Art Assets/Prefabs/Player.prefab -o Player.unitypackage --project-path /path/to/MyProject
732
+ # Leave dependencies out: export only the named paths
733
+ unity assets export Assets/Art --output Art.unitypackage --no-dependencies
734
+ # Unity 6.6+: sign for a specific organization, or skip signing
735
+ unity assets export Assets/Art --output Art.unitypackage --cloud-org my-studio
736
+ unity assets export Assets/Art --output Art.unitypackage --no-sign
737
+ ```
738
+
739
+ `export` is the write-side companion to `inspect`, and needs an Editor: it runs `UnityEditor.AssetPackage.Package.Export` (Unity 6.6+) or `AssetDatabase.ExportPackage` (earlier) in a batchmode Editor (`--project-path`, else `UNITY_PROJECT_PATH`, defaults to the current directory, resolved through the Hub registry), so expect the same startup cost as `unity build`/`unity test` and, in CI, a license seat. Dependencies are included by default, matching the Editor's own Export Package dialog; `--no-dependencies` opts out. Every asset path is validated **before** the Editor starts, so a typo never buys a batchmode boot: a missing path (`ASSET_PATH_NOT_FOUND`), a path outside the project, or a path outside the two AssetDatabase-addressable roots (`Assets/`, `Packages/`, both reported as `ASSET_PATH_OUTSIDE_PROJECT`) all fail immediately with exit `6`. `--format json` / `ndjson` carry `output` (the written file's path), `size` (its raw byte count), `count`, `includeDependencies`, and the resolved `assets` array, plus `signed` and `signingOrganizationId`; `--format tsv` prints the output path, count, and size as three columns.
740
+
741
+ On Unity 6.6 and later the package is **signed by default** for an organization, resolved like `projects create`: `--cloud-org <id-or-name>`, then `UNITY_CLOUD_ORG`, then the stored default (`unity cloud org set-default`). Signing needs a signed-in session. A numeric organization id is used as given; a service account must pass one, since it can't look up an organization by name (`CLOUD_ORG_NAME_NEEDS_OAUTH`, exit `2`). When the CLI can't sign (signed out, or no organization), it fails before the Editor starts: exit `3` (`NOT_SIGNED_IN`) or `4` (`CLOUD_NEEDS_ACTIVE_ORG`). Pass `--no-sign` to export unsigned. If the Editor writes the package without a signature, the CLI deletes the file and fails with `ASSETS_EXPORT_SIGNING_FAILED`. If the written package can't be read back to check, the CLI keeps it and fails with `ASSETS_EXPORT_SIGNING_UNVERIFIED`. Editors older than 6.6 can't sign, so their packages are always unsigned.
742
+
743
+ ### Assets — import a `.unitypackage` into a project
744
+
745
+ ```bash
746
+ # Import into the project in the current directory
747
+ unity assets import ./MyPackage.unitypackage
748
+
749
+ # Import into a specific project
750
+ unity assets import ./MyPackage.unitypackage --project-path /path/to/MyProject
751
+
752
+ # Import only part of the package (repeat --include to select more)
753
+ unity assets import ./MyPackage.unitypackage --include "Assets/Art/**" --include Assets/Scripts/Player.cs
754
+
755
+ # Refuse a package that has no signature
756
+ unity assets import ./MyPackage.unitypackage --require-signed
757
+ ```
758
+
759
+ Wraps the Editor's own `-importPackage` batchmode argument — `--project-path` (else `UNITY_PROJECT_PATH`) defaults to the current directory the same way `run`/`build`/`test` resolve their project, and the project must not already be open in another Editor (it holds the project lock). The package is read locally first, the same streaming pass `assets inspect` uses, so a missing or unreadable archive is rejected in milliseconds rather than after a 30-300s Editor boot; an archive that reads cleanly but declares no importable entry is refused the same way, under its own `ASSET_PACKAGE_EMPTY` code. `--format json`/`ndjson`/`tsv` all emit a result row (project, package, entry count) on success — nothing is silently swallowed on a redirected/piped run.
760
+
761
+ `--include <glob>` imports only part of the package. Each pattern is matched against the entry paths `unity assets inspect` lists, one `/`-separated segment at a time and case-sensitively: `*` and `?` stay inside one folder, a `**` segment spans any number of folders, and a plain path selects that asset or that folder. A pattern that matches a folder selects everything under it, and the folders above every selected entry come along so they keep the package's GUIDs. Repeat `--include` for more; the selection is their union. Dependencies are not followed: a selected prefab whose material you leave out imports without it. Every pattern must match at least one entry, or the import stops before the Editor starts with `ASSET_PACKAGE_INCLUDE_NO_MATCH` (exit `6`), naming each pattern that matched nothing. The CLI writes the selected entries to a temporary package, has the Editor import that, and deletes it afterwards, whatever the outcome. With `--include`, `--format json`/`ndjson` add `include` (the patterns), `selectedEntries` (the count) and `selected` (one row per entry, the `path`, `guid`, `size`, `hasPreview` rows `assets inspect` prints) beside `packageEntries`, and `--format tsv` prints one row per selected entry, with the project, package and entry count repeated on each.
762
+
763
+ An unsigned package still imports (exit 0) with a warning: on stderr in human and tsv (not under `--quiet`), in the envelope's `warnings` under `--format json` / `ndjson`, where `data.signed` is also `false`. `--require-signed` refuses an unsigned package before the Editor starts, with `ASSET_PACKAGE_UNSIGNED` (exit 6). As with `inspect`, the CLI checks only that a signature is present and does not verify it. Packages exported by Editors older than Unity 6.6, or with `--no-sign`, are unsigned.
764
+
765
+
766
+ ---
767
+
768
+ ### Assets — export project assets to a `.unitypackage`
769
+
770
+ ```bash
771
+ # Export a folder and everything it depends on (the default)
772
+ unity assets export Assets/Art --output ./Art.unitypackage
773
+
774
+ # Export only the named paths — leave out the assets they depend on
775
+ unity assets export Assets/Art/Logo.png Assets/Art/Icon.png --output ./Logo.unitypackage --no-dependencies
776
+
777
+ # Export from a project other than the current directory
778
+ unity assets export Assets/Art --output ./Art.unitypackage --project-path /path/to/MyProject
779
+
780
+ # Unity 6.6+: choose the signing organization, or opt out of signing
781
+ unity assets export Assets/Art --output ./Art.unitypackage --cloud-org 1234567
782
+ unity assets export Assets/Art --output ./Art.unitypackage --no-sign
783
+ ```
784
+
785
+ Unlike `assets inspect`, this drives a real batchmode Editor: `UnityEditor.AssetPackage.Package.Export` (Unity 6.6+, which also signs) and `AssetDatabase.ExportPackage` (earlier Editors) are the only APIs that can select individual asset paths and control dependency inclusion, and Unity's own `-exportPackage` batchmode argument accepts whole folders only. Every asset path is validated — inside `Assets/` or `Packages/`, and present on disk or in the package cache — BEFORE the Editor spawns, so a typo in a path fails immediately instead of after a batchmode boot. Dependencies are included by default; `--no-dependencies` exports only the paths you name. The project must not already be open in another Editor instance, and a matching Editor version must be installed (`unity install`).
786
+
787
+ ---
788
+
789
+ ### Releases — browse Unity versions
790
+
791
+ ```bash
792
+ # List recent releases
793
+ unity releases --format json
794
+
795
+ # Filter by stream (alpha, beta, lts, tech)
796
+ unity releases --stream lts --format json
797
+ unity releases --stream tech --format json
798
+ unity releases --stream beta --format json
799
+
800
+ # LTS only shorthand
801
+ unity releases --lts --format json
802
+
803
+ # Filter from a year onward
804
+ unity releases --from-year 2023 --format json
805
+
806
+ # Paginate: pass .data.nextPage as the next --offset (null on the last page)
807
+ unity releases --limit 10 --offset 20 --format json
808
+ ```
809
+
810
+ ---
811
+
812
+ ### Templates
813
+
814
+ **Choosing a core template.** Pick by render pipeline, not just by 2D/3D. Default to the URP
815
+ templates; the Built-in Render Pipeline templates are deprecated from Unity 6.5 and removed in
816
+ 6.7, so use them only when the user explicitly asks for Built-in. Verify with
817
+ `templates --brief --format json` for the target Editor. Ids below are as of Unity 6000.3
818
+ to 6000.7:
819
+
820
+ | Brief | Template id | Display name | Pipeline |
821
+ |---|---|---|---|
822
+ | 3D (default) | `com.unity.template.urp-blank` | Universal 3D | URP |
823
+ | 2D (default) | `com.unity.template.universal-2d` | Universal 2D | URP + `com.unity.2d.*` packages (the JSON `renderPipeline` field is blank for this one — match by id) |
824
+ | High-fidelity PC/console 3D | `com.unity.template.hdrp-blank` | High Definition 3D | HDRP |
825
+ | VR / MR / AR | `com.unity.template.vr` / `.mixed-reality` / `.ar-mobile` | VR, Mixed Reality (MR), AR Mobile | URP |
826
+ | Built-in, only on request | `com.unity.template.3d` / `com.unity.template.2d` | 3D / 2D (Built-In Render Pipeline) | Built-in; absent from 6.7+ |
827
+
828
+ `--editor-version` picks the Editor whose templates you see, else `UNITY_EDITOR_VERSION`, else the
829
+ default Editor. `lts` and `latest` resolve through the release catalog, as `install` resolves them.
830
+ The old `--editor` and `-e` spellings still work, with a deprecation warning.
831
+
832
+ ```bash
833
+ # List templates for an editor version (uses the default editor if --editor-version is omitted)
834
+ unity templates --editor-version 6000.0.47f1 --format json
835
+
836
+ # --brief: trim the json data to the same name/displayName/type/version/status
837
+ # columns the table shows. Use this when the only thing you need out of the
838
+ # list is a template id to pass to `projects create --template`: the
839
+ # untrimmed payload above carries every raw field (icons, package lists,
840
+ # previous versions, …) and can run into the hundreds of KB for the default
841
+ # catalog, most of which a template lookup never uses.
842
+ unity templates --editor-version 6000.0.47f1 --brief --format json
843
+
844
+ # List only locally installed templates
845
+ unity templates --editor-version 6000.0.47f1 --installed --format json
846
+
847
+ # Filter by type (core, learning, sample, custom, new, all) — case-insensitive
848
+ unity templates --editor-version 6000.0.47f1 --type core --format json
849
+ unity templates --editor-version 6000.0.47f1 --type learning --format json
850
+ unity templates --editor-version 6000.0.47f1 --type sample --format json
851
+ unity templates --editor-version 6000.0.47f1 --type new --format json
852
+ unity templates --editor-version 6000.0.47f1 --type all --format json # no-op, returns everything
853
+
854
+ # List only user-generated (custom) templates
855
+ unity templates --editor-version 6000.0.47f1 --custom --format json
856
+ # --type custom is an alias for --custom
857
+ unity templates --editor-version 6000.0.47f1 --type custom --format json
858
+
859
+ # --custom and --type are mutually exclusive — using both is an error (exit 1)
860
+
861
+ # Show template details
862
+ unity templates info com.unity.template.urp-blank --editor-version 6000.0.47f1 --format json
863
+
864
+ # Create a custom template from an existing Unity project
865
+ # --name and --display-name are REQUIRED
866
+ unity templates create /path/to/MyProject \
867
+ --name com.myorg.template.mytemplate \
868
+ --display-name "My Template"
869
+
870
+ # With all optional options
871
+ unity templates create /path/to/MyProject \
872
+ --name com.myorg.template.mytemplate \
873
+ --display-name "My Template" \
874
+ --description "A starting point for our projects" \
875
+ --version 1.0.0 \
876
+ --output /path/to/templates/dir \
877
+ --keep-embedded-packages \
878
+ --keep-project-settings \
879
+ --overwrite
880
+
881
+ # JSON output (includes path to created .tgz archive)
882
+ unity templates create /path/to/MyProject \
883
+ --name com.myorg.template.mytemplate \
884
+ --display-name "My Template" \
885
+ --json
886
+
887
+ # NDJSON streaming — emits progress frames then a result frame
888
+ unity templates create /path/to/MyProject \
889
+ --name com.myorg.template.mytemplate \
890
+ --display-name "My Template" \
891
+ --format ndjson
892
+ ```
893
+
894
+ **`templates create` key notes:**
895
+ - The project is the path argument, `--project-path <path>`, or `UNITY_PROJECT_PATH`, in that order (same for `templates pack`, `projects link` and `projects unlink vcs`); giving both the argument and the flag is a usage error. `projects unlink cloud` never reads `UNITY_PROJECT_PATH`: pass its path as the argument or `--project-path`
896
+ - `--name` must be a valid npm package name (e.g. `com.myorg.template.mytemplate`)
897
+ - `--output` overrides the Hub-configured user templates directory
898
+ - `--overwrite` replaces an existing archive of the same name without error
899
+ - On success, prints the path to the created `.tgz` archive
900
+ - Created templates appear in `unity templates --editor-version <v> --custom`
901
+
902
+ **`templates pack` — portable archive, not a registered template.** `create` installs into the Hub-configured user templates directory so the template shows up in `templates --custom`; `pack` writes a standalone `.tgz` to a file path you choose and registers nothing. Reach for `pack` when the archive is an artifact to check in, attach to a release, or hand to someone else.
903
+
904
+ ```bash
905
+ # Pack a project into a portable template archive (--output is REQUIRED)
906
+ unity templates pack ./MyProject \
907
+ --output ./my-template.tgz \
908
+ --name com.myorg.template.mytemplate \
909
+ --display-name "My Template"
910
+
911
+ # Minimal form — prompts for name and display name on a TTY
912
+ unity templates pack ./MyProject --output ./my-template.tgz
913
+
914
+ # Replace an existing archive, with machine output
915
+ unity templates pack ./MyProject --output ./my-template.tgz --overwrite --json
916
+ ```
917
+
918
+ **`templates pack` key notes:**
919
+ - `--output <file>` is a **file path**, not a directory, and is required
920
+ - `--name` and `--display-name` are required; on a TTY they're prompted for when omitted, so pass both in CI
921
+ - `--version` is the template's own version
922
+ - The output path may not be **inside** the project being packed; that's rejected, so the archive can't include itself
923
+ - An existing output file is an error unless `--overwrite` is passed
924
+ - `--keep-embedded-packages` and `--keep-project-settings` retain content that is otherwise stripped
925
+ - Consumable directly by project creation: `unity projects create MyGame --template ./my-template.tgz`
926
+
927
+ ```bash
928
+ # Delete a user-generated custom template (prompts for confirmation)
929
+ unity templates delete com.myorg.template.mytemplate --editor-version 6000.0.47f1
930
+
931
+ # Skip the confirmation prompt (CI-friendly)
932
+ unity templates delete com.myorg.template.mytemplate --editor-version 6000.0.47f1 --yes
933
+
934
+ # JSON output
935
+ unity templates delete com.myorg.template.mytemplate --editor-version 6000.0.47f1 --yes --json
936
+ ```
937
+
938
+ **`templates delete` key notes:**
939
+ - Only user-generated templates (created via Hub UI or `templates create`) can be deleted
940
+ - Attempting to delete a built-in Unity template exits with a descriptive error (exit 6)
941
+ - Attempting to delete a template that doesn't exist exits with a descriptive error (exit 6)
942
+ - In interactive mode, prompts for confirmation before deleting; use `--yes` to skip
943
+ - On success, the template no longer appears in `unity templates --editor-version <v> --custom`
944
+
945
+ ```bash
946
+ # Get/set/reset the default storage path for custom templates
947
+ # Print current configured templates location
948
+ unity templates location
949
+
950
+ # Set a new default templates directory (must exist as a directory)
951
+ unity templates location --set /path/to/templates
952
+
953
+ # Reset templates location to the Hub default
954
+ unity templates location --reset
955
+
956
+ # JSON output for any variant
957
+ unity templates location --json
958
+ unity templates location --set /path/to/templates --json
959
+ unity templates location --reset --json
960
+ ```
961
+
962
+ **`templates location` key notes:**
963
+ - `--set` and `--reset` are mutually exclusive (using both is an error)
964
+ - `--set` validates that the path exists and is a directory (exits 2 if not)
965
+ - `--reset` restores the Hub default templates path
966
+ - JSON output: `{ "path": "..." }` inside the standard envelope
967
+
968
+ ```bash
969
+ # Edit a user-generated (custom) template's metadata
970
+ # At least one of --display-name, --description, --version,
971
+ # --preview-image, --remove-preview-image is required
972
+ unity templates edit com.myorg.template.mytemplate --editor-version 6000.0.47f1 --display-name "My Updated Template"
973
+
974
+ # Update multiple fields at once
975
+ unity templates edit com.myorg.template.mytemplate \
976
+ --editor-version 6000.0.47f1 \
977
+ --display-name "My Updated Template" \
978
+ --description "A new description for the template" \
979
+ --version 1.1.0
980
+
981
+ # Replace / remove preview image
982
+ unity templates edit com.myorg.template.mytemplate --editor-version 6000.0.47f1 --preview-image /path/to/image.png
983
+ unity templates edit com.myorg.template.mytemplate --editor-version 6000.0.47f1 --remove-preview-image
984
+
985
+ # JSON / NDJSON output (--yes required because these are non-interactive)
986
+ unity templates edit com.myorg.template.mytemplate --editor-version 6000.0.47f1 --display-name "Updated" --yes --json
987
+ ```
988
+
989
+ **`templates edit` key notes:**
990
+ - Only works on user-generated (custom) templates; built-in templates cannot be edited
991
+ - Use `--editor` to specify which editor version's template list to search, or omit to use the stored default
992
+ - `--preview-image <path>` resolves to an absolute path before passing to the service
993
+ - `--remove-preview-image` is only applied when no valid `--preview-image` path is given; if both are passed with a valid image path, the new image wins and `--remove-preview-image` is ignored
994
+ - On success (human format), prints the updated template's display name
995
+
996
+ ---
997
+