nccgs 1.0.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 (278) hide show
  1. package/.claude/agents/nccgs-accessibility-specialist.md +26 -0
  2. package/.claude/agents/nccgs-adversarial-reviewer.md +26 -0
  3. package/.claude/agents/nccgs-ai-programmer.md +26 -0
  4. package/.claude/agents/nccgs-analytics-engineer.md +26 -0
  5. package/.claude/agents/nccgs-art-direction-lead.md +26 -0
  6. package/.claude/agents/nccgs-audio-direction-lead.md +26 -0
  7. package/.claude/agents/nccgs-creative-director.md +26 -0
  8. package/.claude/agents/nccgs-documentation-manager.md +26 -0
  9. package/.claude/agents/nccgs-economy-designer.md +26 -0
  10. package/.claude/agents/nccgs-engine-programmer.md +26 -0
  11. package/.claude/agents/nccgs-game-design-lead.md +26 -0
  12. package/.claude/agents/nccgs-game-designer.md +26 -0
  13. package/.claude/agents/nccgs-gameplay-programmer.md +26 -0
  14. package/.claude/agents/nccgs-level-designer.md +26 -0
  15. package/.claude/agents/nccgs-live-ops-designer.md +26 -0
  16. package/.claude/agents/nccgs-localization-lead.md +26 -0
  17. package/.claude/agents/nccgs-narrative-lead.md +26 -0
  18. package/.claude/agents/nccgs-network-programmer.md +26 -0
  19. package/.claude/agents/nccgs-performance-analyst.md +26 -0
  20. package/.claude/agents/nccgs-producer.md +26 -0
  21. package/.claude/agents/nccgs-production-coordinator.md +23 -0
  22. package/.claude/agents/nccgs-programming-lead.md +26 -0
  23. package/.claude/agents/nccgs-prototyper.md +26 -0
  24. package/.claude/agents/nccgs-qa-engineer.md +26 -0
  25. package/.claude/agents/nccgs-qa-lead.md +26 -0
  26. package/.claude/agents/nccgs-release-engineer.md +26 -0
  27. package/.claude/agents/nccgs-release-lead.md +26 -0
  28. package/.claude/agents/nccgs-security-engineer.md +26 -0
  29. package/.claude/agents/nccgs-sound-designer.md +26 -0
  30. package/.claude/agents/nccgs-systems-designer.md +26 -0
  31. package/.claude/agents/nccgs-technical-architect.md +26 -0
  32. package/.claude/agents/nccgs-technical-artist.md +26 -0
  33. package/.claude/agents/nccgs-technical-director.md +26 -0
  34. package/.claude/agents/nccgs-tools-programmer.md +26 -0
  35. package/.claude/agents/nccgs-ui-programmer.md +26 -0
  36. package/.claude/agents/nccgs-unity-build-specialist.md +26 -0
  37. package/.claude/agents/nccgs-unity-content-specialist.md +26 -0
  38. package/.claude/agents/nccgs-unity-implementer.md +26 -0
  39. package/.claude/agents/nccgs-unity-rendering-specialist.md +26 -0
  40. package/.claude/agents/nccgs-unity-systems-specialist.md +26 -0
  41. package/.claude/agents/nccgs-unity-ui-specialist.md +26 -0
  42. package/.claude/agents/nccgs-ux-designer.md +26 -0
  43. package/.claude/agents/nccgs-verification-engineer.md +26 -0
  44. package/.claude/agents/nccgs-world-builder.md +26 -0
  45. package/.claude/agents/nccgs-writer.md +26 -0
  46. package/.claude/nccgs/THIRD_PARTY_NOTICES.md +13 -0
  47. package/.claude/nccgs/VERSION +1 -0
  48. package/.claude/nccgs/constitution.md +131 -0
  49. package/.claude/nccgs/hooks/agent-audit.mjs +10 -0
  50. package/.claude/nccgs/hooks/common.mjs +41 -0
  51. package/.claude/nccgs/hooks/post-compact.mjs +1 -0
  52. package/.claude/nccgs/hooks/pre-compact.mjs +8 -0
  53. package/.claude/nccgs/hooks/protect-git.mjs +22 -0
  54. package/.claude/nccgs/hooks/protect-write.mjs +17 -0
  55. package/.claude/nccgs/hooks/session-start.mjs +15 -0
  56. package/.claude/nccgs/hooks/session-stop.mjs +7 -0
  57. package/.claude/nccgs/protocols/agent-contract.md +34 -0
  58. package/.claude/nccgs/protocols/context-packets.md +13 -0
  59. package/.claude/nccgs/protocols/evidence.md +15 -0
  60. package/.claude/nccgs/protocols/model-routing.md +22 -0
  61. package/.claude/nccgs/protocols/orchestration.md +26 -0
  62. package/.claude/nccgs/protocols/unity-boundary.md +11 -0
  63. package/.claude/nccgs/settings.fragment.json +77 -0
  64. package/.claude/nccgs/studio.json +347 -0
  65. package/.claude/nccgs/tools/configure-models.mjs +39 -0
  66. package/.claude/nccgs/unity-skills-manifest.json +727 -0
  67. package/.claude/nccgs/workflow-catalog.json +317 -0
  68. package/.claude/rules/nccgs-canonical-docs.md +19 -0
  69. package/.claude/rules/nccgs-editor-tools.md +12 -0
  70. package/.claude/rules/nccgs-localization.md +12 -0
  71. package/.claude/rules/nccgs-networking.md +13 -0
  72. package/.claude/rules/nccgs-performance.md +14 -0
  73. package/.claude/rules/nccgs-rendering.md +16 -0
  74. package/.claude/rules/nccgs-security.md +13 -0
  75. package/.claude/rules/nccgs-tests.md +18 -0
  76. package/.claude/rules/nccgs-ui.md +14 -0
  77. package/.claude/rules/nccgs-unity-assets.md +21 -0
  78. package/.claude/rules/nccgs-unity-code.md +22 -0
  79. package/.claude/skills/accessibility-review/SKILL.md +14 -0
  80. package/.claude/skills/architecture-decision/SKILL.md +14 -0
  81. package/.claude/skills/asset-audit/SKILL.md +14 -0
  82. package/.claude/skills/audit/SKILL.md +16 -0
  83. package/.claude/skills/audit/references/dimensions.md +46 -0
  84. package/.claude/skills/balance-review/SKILL.md +14 -0
  85. package/.claude/skills/bug-triage/SKILL.md +14 -0
  86. package/.claude/skills/build-live-game/SKILL.md +317 -0
  87. package/.claude/skills/build-live-game/references/achievements.md +779 -0
  88. package/.claude/skills/build-live-game/references/apis.md +280 -0
  89. package/.claude/skills/build-live-game/references/authentication.md +437 -0
  90. package/.claude/skills/build-live-game/references/battlepass.md +860 -0
  91. package/.claude/skills/build-live-game/references/cloud-code.md +563 -0
  92. package/.claude/skills/build-live-game/references/cloud-save.md +474 -0
  93. package/.claude/skills/build-live-game/references/deployment.md +216 -0
  94. package/.claude/skills/build-live-game/references/player-account.md +813 -0
  95. package/.claude/skills/build-live-game/references/remote-config.md +96 -0
  96. package/.claude/skills/build-live-game/references/tooling.md +431 -0
  97. package/.claude/skills/closure/SKILL.md +14 -0
  98. package/.claude/skills/code-review/SKILL.md +14 -0
  99. package/.claude/skills/compatibility-review/SKILL.md +14 -0
  100. package/.claude/skills/context-pack/SKILL.md +14 -0
  101. package/.claude/skills/dependency-review/SKILL.md +14 -0
  102. package/.claude/skills/design/SKILL.md +20 -0
  103. package/.claude/skills/design-review/SKILL.md +14 -0
  104. package/.claude/skills/evidence-review/SKILL.md +14 -0
  105. package/.claude/skills/hotfix/SKILL.md +14 -0
  106. package/.claude/skills/implement-in-app-purchases/README.md +233 -0
  107. package/.claude/skills/implement-in-app-purchases/SKILL.md +158 -0
  108. package/.claude/skills/implement-in-app-purchases/references/api-notes.md +562 -0
  109. package/.claude/skills/implement-in-app-purchases/references/codeless-catalog.md +331 -0
  110. package/.claude/skills/implement-in-app-purchases/references/convert-adapty.md +268 -0
  111. package/.claude/skills/implement-in-app-purchases/references/convert-essentialkit.md +239 -0
  112. package/.claude/skills/implement-in-app-purchases/references/convert-revenuecat.md +275 -0
  113. package/.claude/skills/implement-in-app-purchases/references/convert-unipay.md +145 -0
  114. package/.claude/skills/implement-in-app-purchases/references/migration-v4-to-v5.md +204 -0
  115. package/.claude/skills/implement-in-app-purchases/references/path-add-iap-to-new-project.md +198 -0
  116. package/.claude/skills/implement-in-app-purchases/references/path-convert-native-google-billing.md +356 -0
  117. package/.claude/skills/implement-in-app-purchases/references/path-convert-native-storekit.md +446 -0
  118. package/.claude/skills/implement-in-app-purchases/references/path-implement-iap-d2c.md +680 -0
  119. package/.claude/skills/implement-in-app-purchases/references/platform-notes.md +204 -0
  120. package/.claude/skills/implement-in-app-purchases/references/pre-check.md +205 -0
  121. package/.claude/skills/incident-recovery/SKILL.md +14 -0
  122. package/.claude/skills/initialize-ai-navigation/SKILL.md +95 -0
  123. package/.claude/skills/initialize-ai-navigation/references/navigation-system.md +794 -0
  124. package/.claude/skills/levelplay-unity-integration/CHANGELOG.md +57 -0
  125. package/.claude/skills/levelplay-unity-integration/README.md +74 -0
  126. package/.claude/skills/levelplay-unity-integration/SKILL.md +1126 -0
  127. package/.claude/skills/levelplay-unity-integration/references/banner-api.md +920 -0
  128. package/.claude/skills/levelplay-unity-integration/references/best-practices.md +536 -0
  129. package/.claude/skills/levelplay-unity-integration/references/ilrd-api.md +337 -0
  130. package/.claude/skills/levelplay-unity-integration/references/initialization-api.md +630 -0
  131. package/.claude/skills/levelplay-unity-integration/references/interstitial-api.md +899 -0
  132. package/.claude/skills/levelplay-unity-integration/references/ios-setup.md +491 -0
  133. package/.claude/skills/levelplay-unity-integration/references/migration-sdk-9.md +666 -0
  134. package/.claude/skills/levelplay-unity-integration/references/privacy-settings.md +608 -0
  135. package/.claude/skills/levelplay-unity-integration/references/rewarded-api.md +902 -0
  136. package/.claude/skills/localization/SKILL.md +135 -0
  137. package/.claude/skills/localization/references/api-notes.md +76 -0
  138. package/.claude/skills/localization/resources/L10nBatchProcessor.cs +69 -0
  139. package/.claude/skills/localization/resources/LocalizedFontAsset.cs +18 -0
  140. package/.claude/skills/localize-game/SKILL.md +14 -0
  141. package/.claude/skills/migrate-project/SKILL.md +21 -0
  142. package/.claude/skills/migrate-project/references/procedure.md +63 -0
  143. package/.claude/skills/milestone-review/SKILL.md +14 -0
  144. package/.claude/skills/new-unity-project/SKILL.md +179 -0
  145. package/.claude/skills/optimize-audio/SKILL.md +199 -0
  146. package/.claude/skills/optimize-audio/resources/audio-import-api.md +146 -0
  147. package/.claude/skills/optimize-audio/resources/platform-settings.md +48 -0
  148. package/.claude/skills/optimize-text-mesh-pro/SKILL.md +182 -0
  149. package/.claude/skills/optimize-web/SKILL.md +393 -0
  150. package/.claude/skills/optimize-web/resources/WebOptimizer.cs +21 -0
  151. package/.claude/skills/optimize-web/resources/toktx-examples.sh +11 -0
  152. package/.claude/skills/performance-audit/SKILL.md +14 -0
  153. package/.claude/skills/physics-3d-collision/SKILL.md +442 -0
  154. package/.claude/skills/physics-3d-collision/references/troubleshooting.md +41 -0
  155. package/.claude/skills/physics-3d-collision/resources/CollisionDebugger.cs +33 -0
  156. package/.claude/skills/plan-feature/SKILL.md +14 -0
  157. package/.claude/skills/playtest/SKILL.md +14 -0
  158. package/.claude/skills/project-stage/SKILL.md +14 -0
  159. package/.claude/skills/prototype-feature/SKILL.md +14 -0
  160. package/.claude/skills/qa-plan/SKILL.md +14 -0
  161. package/.claude/skills/release/SKILL.md +18 -0
  162. package/.claude/skills/release-readiness/SKILL.md +14 -0
  163. package/.claude/skills/retrospective/SKILL.md +14 -0
  164. package/.claude/skills/review/SKILL.md +16 -0
  165. package/.claude/skills/security-audit/SKILL.md +14 -0
  166. package/.claude/skills/setup-multiplayer-services/SKILL.md +39 -0
  167. package/.claude/skills/setup-multiplayer-services/references/dgs-entrypoint.md +79 -0
  168. package/.claude/skills/setup-multiplayer-services/references/entrypoints.md +213 -0
  169. package/.claude/skills/setup-multiplayer-services/references/examples.md +33 -0
  170. package/.claude/skills/setup-multiplayer-services/references/implementation-fit.md +30 -0
  171. package/.claude/skills/setup-multiplayer-services/references/underlying-services.md +11 -0
  172. package/.claude/skills/setup-multiplayer-services/references/workflows-prerequisites.md +17 -0
  173. package/.claude/skills/setup-vivox-voice-chat/SKILL.md +118 -0
  174. package/.claude/skills/setup-vivox-voice-chat/evals/.env.example +6 -0
  175. package/.claude/skills/setup-vivox-voice-chat/evals/README.md +101 -0
  176. package/.claude/skills/setup-vivox-voice-chat/evals/promptfooconfig.yaml +32 -0
  177. package/.claude/skills/setup-vivox-voice-chat/evals/tests/init-and-login.yaml +76 -0
  178. package/.claude/skills/setup-vivox-voice-chat/evals/tests/text-chat.yaml +65 -0
  179. package/.claude/skills/setup-vivox-voice-chat/evals/tests/voice-channels.yaml +74 -0
  180. package/.claude/skills/setup-vivox-voice-chat/references/events-and-participants.md +79 -0
  181. package/.claude/skills/setup-vivox-voice-chat/references/init-and-login.md +92 -0
  182. package/.claude/skills/setup-vivox-voice-chat/references/text-chat.md +93 -0
  183. package/.claude/skills/setup-vivox-voice-chat/references/troubleshooting.md +47 -0
  184. package/.claude/skills/setup-vivox-voice-chat/references/voice-channels.md +90 -0
  185. package/.claude/skills/shader-graph-create-custom-node/SKILL.md +25 -0
  186. package/.claude/skills/shader-graph-create-custom-node/resources/all_hints.hlsl +182 -0
  187. package/.claude/skills/sprint-plan/SKILL.md +14 -0
  188. package/.claude/skills/sprite-editor/SKILL.md +66 -0
  189. package/.claude/skills/sprite-editor/references/api_reference.md +151 -0
  190. package/.claude/skills/sprite-editor/references/background.md +112 -0
  191. package/.claude/skills/sprite-editor/references/templates.md +72 -0
  192. package/.claude/skills/sprite-editor/scripts/AutomaticSliceTexture.cs +40 -0
  193. package/.claude/skills/sprite-editor/scripts/GenerateNewSpriteRects.cs +200 -0
  194. package/.claude/skills/sprite-editor/scripts/GetTextureSourceImageSize.cs +32 -0
  195. package/.claude/skills/sprite-editor/scripts/GetTextureToSlice.cs +55 -0
  196. package/.claude/skills/sprite-editor/scripts/GridSliceTexture.cs +40 -0
  197. package/.claude/skills/sprite-editor/scripts/IsometricSliceTexture.cs +141 -0
  198. package/.claude/skills/sprite-editor/scripts/README.md +134 -0
  199. package/.claude/skills/sprite-editor/scripts/SetPivotExample.cs +58 -0
  200. package/.claude/skills/sprite-editor/scripts/SpriteToPng.cs +88 -0
  201. package/.claude/skills/status/SKILL.md +16 -0
  202. package/.claude/skills/story-readiness/SKILL.md +14 -0
  203. package/.claude/skills/test/SKILL.md +16 -0
  204. package/.claude/skills/ui/SKILL.md +142 -0
  205. package/.claude/skills/ui-imgui/SKILL.md +186 -0
  206. package/.claude/skills/ui-imgui/references/gui-elements.md +156 -0
  207. package/.claude/skills/ui-imgui/references/templates.md +141 -0
  208. package/.claude/skills/ui-review/SKILL.md +14 -0
  209. package/.claude/skills/ui-ugui/SKILL.md +282 -0
  210. package/.claude/skills/ui-ugui/references/scrollview-setup.md +29 -0
  211. package/.claude/skills/ui-uitk/SKILL.md +235 -0
  212. package/.claude/skills/ui-uitk/references/common-issues.md +74 -0
  213. package/.claude/skills/ui-uitk/references/custom-elements.md +241 -0
  214. package/.claude/skills/ui-uitk/references/painter2d.md +282 -0
  215. package/.claude/skills/ui-uitk/references/pointermanipulator-guide.md +94 -0
  216. package/.claude/skills/ui-uitk/references/svg-icons.md +136 -0
  217. package/.claude/skills/ui-uitk/references/ui-runtime-binding.md +234 -0
  218. package/.claude/skills/ui-uitk/references/uss-guide.md +138 -0
  219. package/.claude/skills/unity-cli/CHANGELOG.md +233 -0
  220. package/.claude/skills/unity-cli/SECURITY.md +22 -0
  221. package/.claude/skills/unity-cli/SKILL.md +414 -0
  222. package/.claude/skills/unity-cli/references/auth-license-cloud.md +146 -0
  223. package/.claude/skills/unity-cli/references/build-run-test.md +349 -0
  224. package/.claude/skills/unity-cli/references/collaboration.md +472 -0
  225. package/.claude/skills/unity-cli/references/config-hub.md +103 -0
  226. package/.claude/skills/unity-cli/references/diagnostics-maintenance.md +326 -0
  227. package/.claude/skills/unity-cli/references/editors-install.md +327 -0
  228. package/.claude/skills/unity-cli/references/integration-advanced.md +472 -0
  229. package/.claude/skills/unity-cli/references/projects-templates.md +574 -0
  230. package/.claude/skills/unity-package-management/SKILL.md +304 -0
  231. package/.claude/skills/unity-package-management/references/select-packages.md +108 -0
  232. package/.claude/skills/urp-postprocessing/SKILL.md +188 -0
  233. package/.claude/skills/urp-postprocessing/references/code-templates.md +119 -0
  234. package/.claude/skills/urp-postprocessing/references/effect-reference.md +86 -0
  235. package/.claude/skills/validate-urp-render-graph-renderer-feature/SKILL.md +269 -0
  236. package/.claude/skills/work/SKILL.md +36 -0
  237. package/.claude/skills/work/references/classification.md +41 -0
  238. package/.claude/skills/work/references/closure.md +50 -0
  239. package/.claude/skills/work/references/feature-contracts.md +32 -0
  240. package/.claude/skills/work/references/verification.md +26 -0
  241. package/CLAUDE.md +6 -0
  242. package/LICENSE +21 -0
  243. package/README.md +162 -0
  244. package/THIRD_PARTY_NOTICES.md +23 -0
  245. package/UPGRADING.md +32 -0
  246. package/VERSION +1 -0
  247. package/docs/ARCHITECTURE.md +73 -0
  248. package/docs/HUONG-DAN-MIGRATE-VA-SU-DUNG.md +324 -0
  249. package/docs/MIGRATION-MATRIX.md +23 -0
  250. package/docs/PROJECT-POLICY.md +67 -0
  251. package/docs/WORKFLOWS.md +61 -0
  252. package/package-assets/setup-vivox-voice-chat-evals.gitignore +7 -0
  253. package/package.json +41 -0
  254. package/scaffold/.nccgs/bugs/.gitkeep +1 -0
  255. package/scaffold/.nccgs/closures/.gitkeep +1 -0
  256. package/scaffold/.nccgs/context/.gitkeep +1 -0
  257. package/scaffold/.nccgs/decisions/.gitkeep +1 -0
  258. package/scaffold/.nccgs/evidence/.gitkeep +1 -0
  259. package/scaffold/.nccgs/features/.gitkeep +1 -0
  260. package/scaffold/.nccgs/migrations/.gitkeep +1 -0
  261. package/scaffold/.nccgs/playtests/.gitkeep +1 -0
  262. package/scaffold/.nccgs/project.yaml +103 -0
  263. package/scaffold/.nccgs/requirements.yaml +10 -0
  264. package/scaffold/.nccgs/reviews/.gitkeep +1 -0
  265. package/scaffold/.nccgs/state.md +40 -0
  266. package/scaffold/.nccgs/templates/agent-handoff.md +25 -0
  267. package/scaffold/.nccgs/templates/architecture-decision.md +27 -0
  268. package/scaffold/.nccgs/templates/closure-record.md +51 -0
  269. package/scaffold/.nccgs/templates/context-packet.yaml +17 -0
  270. package/scaffold/.nccgs/templates/evidence-record.md +23 -0
  271. package/scaffold/.nccgs/templates/feature-contract.md +35 -0
  272. package/scaffold/.nccgs/templates/migration-plan.md +40 -0
  273. package/scaffold/.nccgs/templates/waiver.md +11 -0
  274. package/scripts/cli.mjs +56 -0
  275. package/scripts/install.mjs +267 -0
  276. package/scripts/sync-unity-skills.mjs +126 -0
  277. package/scripts/validate.mjs +205 -0
  278. package/tests/framework.test.mjs +121 -0
@@ -0,0 +1,472 @@
1
+ # Collaboration — 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`, `--proxy`, …) apply to every command below. **`--yes` is not a global flag** —
6
+ it is bound per-command elsewhere in the CLI and no collaboration command accepts it, so passing it
7
+ here is an unknown-option usage error (exit 2). Use `--non-interactive` to skip confirmations.
8
+
9
+ ---
10
+
11
+ `unity collaboration` (alias **`unity collab`** — both accepted everywhere; examples below use the
12
+ canonical name) manages Unity Collaboration resources: review **annotations** on project assets,
13
+ their **attachments** (files, sketches, spatial anchors), **Jira** integration, emoji
14
+ **reactions**, **thumbnails**, and per-thread read/notification state.
15
+
16
+ **In-Editor counterpart.** These commands operate on the same annotation data as the
17
+ [`com.unity.cloud.collaboration.tools`](https://packages.unity.com/com.unity.cloud.collaboration.tools)
18
+ package, which lets users view, create, and reply to annotations from inside the Unity Editor —
19
+ including the 3D pins and sketch overlays whose payloads are described under
20
+ [Data model](#data-model). Install it through the Package Manager in a cloud-linked project; it is
21
+ **experimental** (latest `0.2.0-exp.1`), needs **Unity 6000.0+**, and pulls in
22
+ `com.unity.cloud.collaboration` — the service SDK, a separate package id — as a dependency. The CLI
23
+ needs no package: it talks to the collaboration service directly, so it works with or without the
24
+ Editor open. Annotations created either way are visible to both.
25
+
26
+ ### Shared behavior
27
+
28
+ **Project scoping — `--project-id` OR an inferred project.** The project-scoped commands
29
+ (`annotations`, `attachments`, `reactions`, `thumbnail`, `read`, `subscribe`, `unsubscribe`, and
30
+ `jira issues create/get/link/unlink/search/types`) take both `--project-id <id>` (Unity Cloud project
31
+ id — find one with `unity cloud project list`, see [auth-license-cloud.md](auth-license-cloud.md))
32
+ and `--project-path <path>`. Neither is required: resolution order is
33
+
34
+ 1. explicit `--project-id`, else
35
+ 2. `--project-path` → `UNITY_PROJECT_PATH` env var → the current directory, reading
36
+ `ProjectSettings/PlayerSettings.asset` for the project's `cloudProjectId`.
37
+
38
+ If neither yields an id it fails with: `Could not determine the Unity Cloud project for '<path>'.
39
+ Pass --project-id explicitly, or --project-path to point at a project linked to Unity Cloud.` So
40
+ inside a cloud-linked Unity project you can drop the flag entirely. Most of `jira` is scoped
41
+ differently — see [Jira](#jira).
42
+
43
+ **`--all` — auto-paginate.** `annotations list`, `annotations replies`, and `jira issues list` accept
44
+ `--all` to stream every page instead of one. It is **mutually exclusive with `--next` and
45
+ `--limit`** — passing either alongside it is an error.
46
+
47
+ **`--full` and `--resolve-users`** (table output helpers): `--full` prints annotation/reply text
48
+ untruncated (whitespace still collapsed to one line); `--resolve-users` replaces user ids with
49
+ display names. `--resolve-users` is on `annotations list`/`replies`/`get`/`export` and
50
+ `attachments list`; `--full` only on `annotations list`/`replies`.
51
+
52
+ **Delete confirmations.** `annotations delete`, `annotations delete-fields`, `attachments delete`,
53
+ `jira server delete`, and `jira project delete` prompt for confirmation (default **No**) only when
54
+ all three hold: output format is `human`, `--non-interactive` was not passed, and both stdin and
55
+ stdout are TTYs. In scripts/CI (piped output, `--format json`, or `--non-interactive`) they delete
56
+ immediately without prompting.
57
+
58
+ **`key=value` flags — typed vs string.** Two repeatable pair collectors look identical but behave
59
+ differently:
60
+
61
+ - `--metadata k=v` (typed): each value goes through `JSON.parse`, so `count=3` becomes the number
62
+ `3`, `done=true` a boolean, `tags=["a","b"]` an array. Unparseable values stay strings. To force
63
+ a numeric-looking string to stay a string, quote it as JSON: `--metadata 'k="2"'`.
64
+ - `--target-context k=v` (string-only): values are always kept as raw strings.
65
+
66
+ Both split on the first `=` only (values may contain `=`); repeating a key means last value wins;
67
+ a pair without `=` or with an empty key fails with `Invalid key=value pair: <pair>`.
68
+
69
+ **Raw-JSON flags.** `--camera`, `--local-space` / `--local`, `--time`, `--position`,
70
+ `--attachments`, and `annotations list --query` take a JSON value and fail with
71
+ `Invalid JSON for --<flag>` when it doesn't parse. Shapes:
72
+
73
+ | Flag | JSON shape |
74
+ |---|---|
75
+ | `--camera` | `{"position":{"x":0,"y":0,"z":0},"rotation":{"x":0,"y":0,"z":0},"fieldOfView":60,"target":{...},"projection":"...","verticalSize":1}` — position + rotation required, rest optional |
76
+ | `--local-space` (annotations) / `--local` (attachments spatial) | `{"parentId":"...","position":{"x":0,"y":0,"z":0},"cameraPosition":{"x":0,"y":0,"z":0}}` — same shape, different flag name per group |
77
+ | `--time` | `{"timeScale":1,"timeStamp":0}` |
78
+ | `--position` (attachments spatial) | `{"x":0,"y":0,"z":0}` |
79
+ | `--attachments` (annotations create) | JSON array of `{"type":"...", ...}` attachment objects |
80
+
81
+ ---
82
+
83
+ ### Data model
84
+
85
+ #### Root vs reply
86
+
87
+ Every annotation — root or reply — is the same type. The distinguishing field is
88
+ `rootAnnotationId`:
89
+
90
+ | Field | Root thread | Reply |
91
+ |---|---|---|
92
+ | `rootAnnotationId` | `null` | ID of the root annotation |
93
+ | `target` | asset or project path | more specific path, often includes `/files/<filename>` |
94
+ | `replyCount` | populated | `null` |
95
+ | `replyUserIds` | populated | `null` |
96
+ | `threadAttachmentsCount` | populated (thread-wide; see caveat below) | `null` |
97
+ | `hasDraftReply` | populated | `null` |
98
+ | `integrations` | `{}` or populated (Jira lives here) | `null` |
99
+ | `resolved` / `resolvedBy` | meaningful (thread-level op) | `null` |
100
+ | `camera` / `metadata` | minimal | rich — full viewer state snapshot |
101
+
102
+ Thread-level operations (resolve/unresolve, subscribe/unsubscribe, Jira linking, thumbnails) act on
103
+ the root. Replies capture a richer viewport snapshot (`camera`, `metadata` with `materialOverride`,
104
+ lighting, grid state) because they usually represent a specific view at time of writing. Both root
105
+ and reply can independently hold `attachments`, `reactions`, and `hasThumbnail`.
106
+
107
+ #### Target paths
108
+
109
+ `target` always starts with `<prefix>/projects/<projectId>/...`. The prefix sets the context:
110
+
111
+ | Prefix | Context | Example |
112
+ |---|---|---|
113
+ | `assets/projects/<id>/...` | Asset Manager asset | `assets/projects/<projectId>/assets/<assetId>` |
114
+ | `assets/projects/<id>/.../files/<name>` | Specific file within an AM asset | `assets/projects/<projectId>/assets/<assetId>/files/mesh.fbx` |
115
+ | `unity/projects/<id>/...` | Unity Editor | `unity/projects/<projectId>/assets/<assetId>` |
116
+
117
+ `**` as a trailing segment matches all descendants (`annotations count` target arg).
118
+
119
+ The two prefixes are **separate trees, and no glob spans both.** A project routinely holds
120
+ annotations under each, so any count or listing is scoped to whichever prefix you name — see the
121
+ `count` caveat under [Annotations](#annotations).
122
+
123
+ #### Mention syntax in `--text`
124
+
125
+ | Type | Syntax | Example |
126
+ |---|---|---|
127
+ | User | `:user[Display Name]{#userId}` | `:user[Alex Rivera]{#2475297437902}` |
128
+ | Asset | `:asset[Asset Name]{#assetId}` | `:asset[Unity Tower]{#68de9f5d476ac89c752cbf88}` |
129
+
130
+ #### Attachment payload shapes
131
+
132
+ `threadAttachmentsCount` on the root counts the **whole thread**, while `attachments list <id>`
133
+ returns only the attachments owned by that one annotation. A root reporting 5 can list just its own
134
+ single sketch, with the other four hanging off replies — that mismatch is expected, not a bug. To
135
+ reach them, list the replies (`annotations replies <id>`) and call `attachments list` per reply id,
136
+ or read the `attachments` field directly via `annotations list --include-fields attachments`.
137
+
138
+ **Don't index it.** `threadAttachmentsCount` is normally a number (or `null`), but a per-type object
139
+ (`{ "sketch": 4, "spatial-3d": 3, "file": 1 }`) also shows up in real payloads. Guard the type
140
+ before reading it rather than assuming either shape.
141
+
142
+ Every attachment object also carries its type under **two** keys, `type` and `Type`, with the same
143
+ value — the API emits both and the CLI passes responses through verbatim. Key off lowercase `type`;
144
+ that is what the formatters use.
145
+
146
+ **`sketch`** — 2D drawing overlay captured over a 3D viewport. `sketchData` is a JSON *string*
147
+ (stroke/arrow records with positions, colors, widths):
148
+ ```json
149
+ {
150
+ "type": "sketch",
151
+ "attachmentId": "689f4236496f6d50dcbd6e20",
152
+ "sketchData": "<JSON string>",
153
+ "camera": { "position": {}, "rotation": {}, "fieldOfView": 60, "target": {}, "projection": "perspective" },
154
+ "preview": { "filePath": "..._preview.png", "fileSize": 42770, "contentType": "image/png", "status": "Uploaded" },
155
+ "sketchImage": { "filePath": "..._sketch.png", "fileSize": 42770, "contentType": "image/png", "status": "Uploaded" },
156
+ "metadata": { "materialOverride": "default", "wireframe": -1 },
157
+ "created": "2025-08-15T14:20:38.806Z",
158
+ "createdBy": "2475297437902"
159
+ }
160
+ ```
161
+
162
+ **`spatial-3d`** — numbered 3D pin on a mesh in world space. Multiple pins per annotation, each
163
+ with an incrementing `label`. `camera.target` points at the pin's `position`; no
164
+ `preview`/`sketchImage` (it's a point, not an image):
165
+ ```json
166
+ {
167
+ "type": "spatial-3d",
168
+ "attachmentId": "6a1effe63e164caf9cea8aee",
169
+ "label": "1",
170
+ "position": { "x": -0.403, "y": 2.763, "z": 0.066 },
171
+ "camera": { "position": {}, "rotation": {}, "fieldOfView": 60, "target": { "x": -0.403, "y": 2.763, "z": 0.066 } },
172
+ "metadata": { "materialOverride": "default", "wireframe": -1 },
173
+ "created": "2026-06-02T16:08:06.935Z",
174
+ "createdBy": "2475297437902"
175
+ }
176
+ ```
177
+
178
+ **`file`** — generic upload (image, document). The annotation's top-level `camera` is `null` for
179
+ these — not tied to a 3D viewport:
180
+ ```json
181
+ {
182
+ "type": "file",
183
+ "attachmentId": "6a1effcfe9693f7f4d84ad13",
184
+ "filePath": "qa_no_replies.jpg",
185
+ "fileSize": 348842,
186
+ "fileType": "image",
187
+ "contentType": "image/jpeg",
188
+ "status": "Uploaded",
189
+ "metadata": {},
190
+ "created": "2026-06-02T16:07:43.657Z",
191
+ "createdBy": "2475297437902"
192
+ }
193
+ ```
194
+
195
+ ---
196
+
197
+ ### Annotations
198
+
199
+ An annotation is a review comment anchored to a target path (e.g.
200
+ `unity/projects/<projectId>/assets/<assetId>`). A **reply** is an annotation whose
201
+ `rootAnnotationId` points at the thread root — `create --reply-to <id>` makes one, and
202
+ `replies <id>` lists a thread. Status lifecycle: `Draft` → `Sending` → `Active`.
203
+
204
+ Annotation objects returned by `get`/`list`/`replies` (`--format json`) carry: `annotationId`,
205
+ `messageType`, `target`, `targetContext`, `rootAnnotationId`, `status`, `text`, `created`/
206
+ `createdBy`, `updated`/`updatedBy`, `resolved`/`resolvedBy`, `metadata`, plus include-only fields
207
+ (below).
208
+
209
+ | Command | Args | Key options |
210
+ |---|---|---|
211
+ | `count` | `[target]` (glob `**` at end OK) — **defaults to `unity/projects/<id>/**` only**, see below | `--grouped` (per-target breakdown), `--offset <n>`, `--limit <n>` |
212
+ | `create` | `<target>` | `--text`, `--reply-to <id>`, `--status Active\|Draft`, `--metadata k=v`…, `--target-context k=v`…, `--camera`, `--local-space`, `--time`, `--attachments`, `--unresolve-root-annotation` |
213
+ | `delete` | `<annotationId>` | (confirmation — see Shared behavior) |
214
+ | `delete-fields` | `<annotationId> <field...>` | removes metadata fields; variadic; confirmation |
215
+ | `export` | — | `--target <path>` — **defaults to `assets/projects/<id>/**` only**, see below; `--out <file>` (else stdout), `--resolve-users`; the service returns `assetId` + `assetName` here that `list` does not — the CLI copies the response page verbatim, so treat those as service behavior |
216
+ | `get` | `<annotationId>` | `--fields a,b,c` or `--fields all` (table output only), `--resolve-users` |
217
+ | `list` | — | `--query <json>` (optional — defaults to root threads only), `--next <cursor>`, `--limit 1-100` (default 10), `--all`, `--sort Ascending\|Descending`, `--sort-field annotationId\|latestReply`, `--include-fields a,b`, `--fields a,b` or `--fields all` (table output only), `--full`, `--resolve-users` |
218
+ | `replies` | `<annotationId>` | `--next`, `--limit 1-100`, `--all`, `--sort`, `--status-filter All\|Active\|Sending\|Draft` (repeat flag), `--fields a,b` or `--fields all` (table output only), `--full`, `--resolve-users` |
219
+ | `resolve` / `unresolve` | `<annotationId>` | — (echoes only `annotationId`, see below) |
220
+ | `status` | `<annotationId> <Active\|Sending\|Draft>` | — |
221
+ | `update` | `<annotationId>` | `--text`, `--metadata k=v`…, `--camera`, `--local-space`, `--time` — at least one required |
222
+
223
+ ```bash
224
+ # Create a thread on an asset, with typed metadata (count is a number, build stays a string)
225
+ unity collaboration annotations create "unity/projects/$PROJ/assets/$ASSET" \
226
+ --project-id $PROJ --text "Texture seam visible here" \
227
+ --metadata severity=2 --metadata 'build="2024.1"' \
228
+ --camera '{"position":{"x":0,"y":1,"z":-5},"rotation":{"x":0,"y":0,"z":0}}'
229
+
230
+ # Reply to it
231
+ unity collaboration annotations create "unity/projects/$PROJ/assets/$ASSET" \
232
+ --project-id $PROJ --reply-to $ANNOTATION_ID --text "Fixed in latest import"
233
+
234
+ # List root threads (default query) from inside a cloud-linked project — no --project-id needed
235
+ unity collaboration annotations list --include-fields replyCount,latestReply --format json
236
+
237
+ # Custom query — must be a JSON ARRAY of clauses; the default is
238
+ # [{"type":"hasNot","field":"annotationParentId"}] (root threads only)
239
+ unity collaboration annotations list --project-id $PROJ \
240
+ --query '[{"type":"hasNot","field":"annotationParentId"}]' --all --format ndjson
241
+
242
+ # Export for offline analysis — ONE prefix tree per run; the bare command covers
243
+ # only assets/**, so an Editor-annotated project needs both invocations.
244
+ unity collaboration annotations export --project-id $PROJ \
245
+ --target "assets/projects/$PROJ/**" --out annotations-assets.json
246
+ unity collaboration annotations export --project-id $PROJ \
247
+ --target "unity/projects/$PROJ/**" --out annotations-editor.json
248
+ ```
249
+
250
+ **`export` is not a whole-project export.** With no `--target` the command defaults to
251
+ `assets/projects/<projectId>/**`, so annotations under the separate `unity/projects/<projectId>/**`
252
+ tree are silently absent from the archive — and nothing in the output says so. Always pass `--target`
253
+ explicitly, once per prefix, when completeness matters. (Note the default differs from
254
+ `annotations count`, which defaults to the `unity/**` tree instead.) The CLI's own `--target` help
255
+ text says "the whole project", which contradicts the actual default — trust the prefix above.
256
+
257
+ **`--query` shape.** A JSON *array* of clauses (a bare object is rejected:
258
+ `The --query value must be a JSON array of query clauses.`). Clause vocabulary is the
259
+ collaboration API's — e.g. `{"type":"hasNot","field":"annotationParentId"}`. Omitting `--query`
260
+ applies exactly that root-threads-only clause.
261
+
262
+ A supplied `--query` **replaces** that default rather than adding to it, so a lone filter clause
263
+ (e.g. `[{"type":"glob","field":"target","value":"assets/**"}]`) returns replies interleaved with
264
+ roots. Re-add `{"type":"hasNot","field":"annotationParentId"}` alongside your clause to keep
265
+ thread-roots-only results.
266
+
267
+ **Include-only fields.** `replyCount`, `replyUserIds`, `latestReply`, `attachments`,
268
+ `threadAttachmentsCount`, `replyLastReadTimestamp`, and `replyUnreadCount` come back null/absent
269
+ unless named in `--include-fields` on `list` (server omits them by default). If `replyCount` is
270
+ unexpectedly null, that's why.
271
+
272
+ **`delete-fields`** removes **`metadata` sub-keys**, not top-level annotation fields — the variadic
273
+ args are metadata key names (`delete-fields <id> severity build`). A name that isn't a metadata key
274
+ is a silent no-op (it is echoed back in `data.fields` and the command still exits 0), including
275
+ `metadata` itself: passing it does **not** clear the object.
276
+
277
+ **`count` with no target counts one prefix tree only.** It defaults to
278
+ `unity/projects/<projectId>/**`, so it reads like a project-wide total but omits everything under
279
+ `assets/projects/<projectId>/**` — in a project with annotations on both, the bare command can
280
+ report 16 while 34 more exist. Pass the target explicitly (once per prefix) when you want a real
281
+ total, and prefer `--grouped` to see which trees are populated.
282
+
283
+ **The mutators echo ids, not the annotation.** `resolve` and `unresolve` return just
284
+ `{ "annotationId": … }`; `status` adds `status`, and `delete-fields` adds the `fields` it was asked to
285
+ remove. None return a `resolved` timestamp or the updated object. A read-after-write therefore needs a follow-up `get`; an id-only response is success, not a
286
+ silent failure. Re-resolving an already-resolved thread is an error (`HTTP 409 … is already
287
+ resolved`), which is one way to confirm the first call landed.
288
+
289
+ ---
290
+
291
+ ### Attachments
292
+
293
+ Attachments hang off an annotation. Three kinds: **file** (uploaded blob), **sketch** (2D drawing
294
+ over a camera view), **spatial** (labeled 3D anchor) — payload shapes in
295
+ [Data model](#attachment-payload-shapes). All commands take `--project-id`.
296
+
297
+ | Command | Args | Key options |
298
+ |---|---|---|
299
+ | `list` | `<annotationId>` | `--resolve-users` |
300
+ | `delete` | `<annotationId> <attachmentId>` | (confirmation — see Shared behavior) |
301
+ | `download` | `<annotationId> <attachmentId>` | `--out <path>` (default: the attachment's original filename in CWD, falling back to `<attachmentId>` when it has no file path), `--force` (overwrite), `--width <px>` (resize image) |
302
+ | `upload` | `<annotationId> <file>` | `--name` (display name), `--content-type` (override inferred MIME) |
303
+ | `add file` | `<annotationId> <file>` | same options and **same handler** as `upload`; only the reported command label, the success message, and the JSON error code (`COLLAB_ATTACHMENTS_ADD_ERROR`) differ — use either |
304
+ | `add sketch` | `<annotationId>` | `--sketch-data <json>` **(required)**, `--camera <json>` **(required)**, `--time <json>`, `--preview <file>`, `--sketch-image <file>` |
305
+ | `add spatial` | `<annotationId>` | `--label` **(required)**, `--position <json>` **(required)**, `--camera <json>` **(required)**, `--time <json>`, `--local <json>` |
306
+ | `update [file]` | `<annotationId> <attachmentId>` | `--content-type`, `--metadata k=v`… — **at least one required**; `file` is the **default variant**: `update <ids…>` without a subcommand means `update file` |
307
+ | `update sketch` | `<annotationId> <attachmentId>` | `--sketch-data`, `--camera`, `--time`, `--metadata k=v`… — each individually optional, but **at least one required** |
308
+ | `update spatial` | `<annotationId> <attachmentId>` | `--label`, `--position`, `--camera`, `--time`, `--local`, `--metadata k=v`… — each individually optional, but **at least one required** |
309
+
310
+ ```bash
311
+ # Attach a screenshot (upload and `add file` are interchangeable)
312
+ unity collaboration attachments upload $ANNOTATION_ID ./screenshot.png --project-id $PROJ
313
+
314
+ # Add a labeled 3D anchor
315
+ unity collaboration attachments add spatial $ANNOTATION_ID --project-id $PROJ \
316
+ --label "Broken collider" --position '{"x":1.2,"y":0,"z":3.4}' \
317
+ --camera '{"position":{"x":0,"y":2,"z":-4},"rotation":{"x":15,"y":0,"z":0}}'
318
+
319
+ # Download; refuses to overwrite an existing file unless --force
320
+ unity collaboration attachments download $ANNOTATION_ID $ATTACHMENT_ID --project-id $PROJ \
321
+ --out ./shot.png --force
322
+ ```
323
+
324
+ Notes:
325
+
326
+ - `--sketch-data` is passed through as a raw string, not parsed as JSON — only `--camera`/`--time`/
327
+ `--position`/`--local` get JSON validation at the CLI layer.
328
+ - Options required on `add sketch`/`add spatial` become *individually* optional on the matching
329
+ `update` variant — but every variant, `file` included, rejects a flagless invocation with a
330
+ `NO_FIELDS` error. Pass at least one change flag.
331
+ - The spatial local-space flag is `--local` here, but `--local-space` on annotations (same JSON
332
+ shape).
333
+
334
+ ---
335
+
336
+ ### Reactions, thumbnails, read state
337
+
338
+ All use the same optional project resolution as `annotations` — `--project-id` or `--project-path`,
339
+ else inferred from the current project (see [Shared behavior](#shared-behavior)).
340
+
341
+ | Command | Args | Key options |
342
+ |---|---|---|
343
+ | `reactions add` / `reactions remove` | `<annotationId> <emoji>` | emoji is a single Unicode emoji, e.g. `👍` |
344
+ | `thumbnail upload` | `<annotationId> <file>` | image file; MIME inferred from extension (jpg/png/gif/webp) |
345
+ | `thumbnail download` | `<annotationId>` | `--out <path>` (default `./thumbnail`), `--width <pixels>`; **no `--force`** — errors if the file exists ("Delete it first") |
346
+ | `read` | `<annotationId>` | `--timestamp <iso8601>` (default now) — marks the thread read up to that time (per-user read receipt) |
347
+ | `subscribe` / `unsubscribe` | `<annotationId>` | per-thread notification subscription for the current user |
348
+
349
+ ```bash
350
+ unity collaboration reactions add $ANNOTATION_ID 👍 --project-id $PROJ
351
+ unity collaboration read $ANNOTATION_ID --project-id $PROJ # mark thread read as of now
352
+ ```
353
+
354
+ ---
355
+
356
+ ### Jira
357
+
358
+ Connects Collaboration annotations to Jira. Three layers, three id types — don't mix them up:
359
+
360
+ 1. **Server config** (`serverConfigId`): a Jira server + credentials, scoped to a Unity
361
+ **organization** (`--organization-id`).
362
+ 2. **Project config** (`projectConfigId`, flag `--jira-project-config-id`): a Jira project
363
+ (`--jira-project-id` — the Jira-side id) under a server config, linkable to Unity projects.
364
+ 3. **Issues**: created from / linked to annotations, scoped by Unity `--project-id`. The resulting
365
+ link lands in `annotation.integrations.jiraIssues[]` — see
366
+ [Jira integration payload](#jira-integration-payload) below.
367
+
368
+ **Scoping — most of `jira` does not use the project resolver** (no `--project-path`, no inference):
369
+
370
+ | Group | Scoping |
371
+ |---|---|
372
+ | `jira server *` | `--organization-id`, required (rejected at parse time) |
373
+ | `jira project add` / `delete` / `update` | `--organization-id`, required (validated by the handler) |
374
+ | `jira project link` / `unlink` | Unity project id is a **positional** (`<unityProjectId> <projectConfigId>`); no `--organization-id` at all |
375
+ | `jira issues list` | `--organization-id`, required (rejected at parse time) |
376
+ | `jira configs` | exactly **one** of `--organization-id` or `--project-id`, **no `--project-path`** and no inference |
377
+ | `jira issues create/get/link/unlink/search/types` | `--project-id` / `--project-path`, or inferred — see [Shared behavior](#shared-behavior) |
378
+
379
+ **`--help` never tells you which options are required.** No collaboration option is annotated as
380
+ required in help output, on any command — so the tables in this file are the only place that
381
+ distinction is written down. What *does* differ is where a missing option is caught, and therefore
382
+ which exit code you get:
383
+
384
+ | Enforcement | Commands | Behavior when omitted |
385
+ |---|---|---|
386
+ | Parse time | `jira server add/delete/update/test/users/projects/permissions`, `jira issues create/get/search/types`, `jira issues list --organization-id`, `attachments add sketch` / `add spatial` required flags | usage error, **exit 2** |
387
+ | Handler | `jira project add/delete/update --organization-id`, `jira configs` | command failure (error envelope), not a usage error |
388
+
389
+ `jira project link` / `unlink` take positionals instead, so a missing id is always a parse-time
390
+ usage error.
391
+
392
+ #### `jira server` — server configurations
393
+
394
+ | Command | Args | Key options |
395
+ |---|---|---|
396
+ | `add` | — | `--organization-id`, `--url`, `--username`, `--key` (API token), `--name` — all required |
397
+ | `delete` | `<serverConfigId>` | `--organization-id` (required); confirmation |
398
+ | `update` | `<serverConfigId>` | `--organization-id` (required) + at least one of `--url`/`--username`/`--key`/`--name` |
399
+ | `test` | — | `--organization-id`, `--url`, `--username`, `--key` — all required; validates credentials **without persisting** |
400
+ | `users` | `<serverConfigId>` | `--organization-id` (required), `--query <text>` — search Jira users |
401
+ | `projects` | `<serverConfigId>` | `--organization-id` (required) — lists **Jira-side** projects on the server |
402
+ | `permissions` | `<serverConfigId>` | `--organization-id`, `--jira-project-id` — both required; checks required Jira permissions |
403
+
404
+ #### `jira project` — project configurations
405
+
406
+ | Command | Args | Key options |
407
+ |---|---|---|
408
+ | `add` | `<serverConfigId>` | `--organization-id`, `--jira-project-id`, `--default-reporter-id` — all required, though `--help` doesn't say so (fallback reporter when an annotation author has no Jira match) |
409
+ | `delete` | `<projectConfigId>` | `--organization-id` (required, not marked in `--help`); confirmation |
410
+ | `link` / `unlink` | `<unityProjectId> <projectConfigId>` | — (Unity project id is positional here, not a flag) |
411
+ | `update` | `<projectConfigId>` | `--organization-id` (required, not marked in `--help`), `--default-reporter-id`, `--linked-unity-project-id <id>` (repeatable — **replaces** the whole linked list), `--clear-linked-unity-projects` (mutually exclusive with the previous flag); at least one change flag required |
412
+
413
+ #### `jira issues`
414
+
415
+ | Command | Args | Key options |
416
+ |---|---|---|
417
+ | `create` | `<annotationId>` | `--jira-project-config-id`, `--summary`, `--type <issueTypeId>` — required; `--project-id`/`--project-path` optional (inferred); `--description`, `--assignee-user-id`, `--reporter-user-id`, `--parent-issue-id` (sub-task) |
418
+ | `get` | `<jiraIssueId>` | `--jira-project-config-id` required; `--project-id`/`--project-path` optional (inferred) |
419
+ | `link` / `unlink` | `<annotationId> <jiraIssueId>` | `--project-id`/`--project-path` optional (inferred); `link` also takes optional `--jira-project-config-id`. `unlink` does **not** delete the issue in Jira |
420
+ | `list` | — | `--organization-id` **(required, org-scoped — no `--project-id`/`--project-path` here)**, `--profile all\|active\|resolved\|unresolved\|draft\|sending` (repeat flag), `--next <token>`, `--limit 1-100` (default 10), `--all`, `--sort Ascending\|Descending` |
421
+ | `search` | — | `--jira-project-config-id` required; `--project-id`/`--project-path` optional (inferred); `--query <text>` (plain text, **not JQL**), `--include-subtasks` |
422
+ | `types` | — | `--jira-project-config-id` required; `--project-id`/`--project-path` optional (inferred); lists issue type ids for `create --type` |
423
+
424
+ #### `jira configs`
425
+
426
+ `unity collaboration jira configs` — single command. Pass **exactly one** of `--organization-id` (all
427
+ configs in the org) or `--project-id` (configs available to that Unity project).
428
+
429
+ ```bash
430
+ # One-time setup: validate credentials, persist server, add a Jira project, link Unity project
431
+ unity collaboration jira server test --organization-id $ORG \
432
+ --url https://jira.example.com --username bot@example.com --key $JIRA_TOKEN
433
+ unity collaboration jira server add --organization-id $ORG \
434
+ --url https://jira.example.com --username bot@example.com --key $JIRA_TOKEN --name "Main Jira"
435
+ unity collaboration jira project add $SERVER_CONFIG_ID --organization-id $ORG \
436
+ --jira-project-id 10042 --default-reporter-id $JIRA_ACCOUNT_ID
437
+ unity collaboration jira project link $PROJ $PROJECT_CONFIG_ID
438
+
439
+ # File an issue from an annotation (get valid type ids from `issues types` first)
440
+ unity collaboration jira issues create $ANNOTATION_ID --project-id $PROJ \
441
+ --jira-project-config-id $PROJECT_CONFIG_ID --summary "Texture seam" --type 10001
442
+ ```
443
+
444
+ #### Jira integration payload
445
+
446
+ Lives in `annotation.integrations.jiraIssues[]` on the root (`integrations` is `null` on replies).
447
+ Multiple issues can be linked to one thread.
448
+
449
+ ```json
450
+ {
451
+ "integrations": {
452
+ "jiraIssues": [
453
+ {
454
+ "type": "Jira",
455
+ "jiraIssueId": "18955",
456
+ "jiraProjectConfigId": "6997204de238d85bc249625b",
457
+ "jiraIssueKey": "PROJ-1",
458
+ "jiraIssueUrl": "https://yourcompany.atlassian.net/browse/PROJ-1",
459
+ "sourceAnnotationId": "698e04cb85335d04c814ea67",
460
+ "createdBy": "2474131300352"
461
+ }
462
+ ]
463
+ }
464
+ }
465
+ ```
466
+
467
+ - `jiraIssueKey` — human-readable key (e.g. `PROJ-1`); use for display.
468
+ - `jiraIssueUrl` — direct link to the issue.
469
+ - `sourceAnnotationId` — the annotation the issue was created/linked from; may differ from the
470
+ annotation carrying the integration when linked from a reply.
471
+
472
+ ---
@@ -0,0 +1,103 @@
1
+ # Config & Hub — 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
+ ---
8
+
9
+ ### Config — persisted CLI configuration
10
+
11
+ The `config` command group manages settings that persist across invocations.
12
+
13
+ #### config proxy
14
+
15
+ View or change the configured HTTP/HTTPS/SOCKS/PAC proxy. The persisted value is read by every CLI command that issues outbound HTTP (releases, install, auth, telemetry, etc.).
16
+
17
+ ```bash
18
+ # Show the effective proxy configuration (resolution source + auth source)
19
+ unity config proxy
20
+ unity config proxy --json
21
+
22
+ # Persist a proxy URL
23
+ unity config proxy http://proxy.example.com:8080
24
+
25
+ # Embedded userinfo (user:password@host) is supported and redacted in echo
26
+ # output, but prefer leaving credentials out of the URL — the CLI looks them
27
+ # up in the OS keyring instead (see Resolution priority below).
28
+
29
+ # Persist with bypass list (hosts that should NOT go through the proxy)
30
+ unity config proxy http://proxy.example.com:8080 --bypass "localhost,127.0.0.1,*.internal"
31
+
32
+ # SOCKS / PAC variants
33
+ unity config proxy socks5://proxy.example.com:1080
34
+ unity config proxy pac+http://wpad.example.com/proxy.pac
35
+ unity config proxy pac+file:///etc/proxy.pac
36
+
37
+ # Clear the persisted proxy
38
+ unity config proxy --unset
39
+ ```
40
+
41
+ **Supported schemes:** `http://`, `https://`, `socks://`, `socks4://`, `socks4a://`, `socks5://`, `socks5h://`, `pac+http://`, `pac+https://`, `pac+file://`.
42
+
43
+ **Resolution priority** (highest → lowest):
44
+ 1. `--proxy <url>` global flag (one-shot override for the current invocation)
45
+ 2. `UNITY_PROXY` env var
46
+ 3. Standard env vars: `HTTPS_PROXY`, `HTTP_PROXY`, `ALL_PROXY`, `NO_PROXY`
47
+ 4. Persisted `proxy.json` (`unity config proxy <url>`)
48
+ 5. System proxy settings (where supported)
49
+
50
+ Credentials missing from the URL are looked up in the OS keyring (shared with the GUI Hub); Kerberos/SPNEGO-authenticated proxies are supported. `--proxy-disable` short-circuits all of the above for the current invocation, which is the recommended way to diagnose a misconfigured proxy without clearing it.
51
+
52
+ #### config update-check
53
+
54
+ New in `0.1.0-beta.8`. Enable or disable the background check for a newer CLI version (the unobtrusive "update available" notice; interactive sessions only, never delays a command). Equivalent to the `UNITY_NO_UPDATE_CHECK` env var.
55
+
56
+ ```bash
57
+ unity config update-check # show the current setting
58
+ unity config update-check off # disable
59
+ unity config update-check on # enable
60
+ unity config update-check --json
61
+ ```
62
+
63
+ ---
64
+
65
+ ### Hub — install the Unity Hub application
66
+
67
+ Bootstrap Unity Hub on a clean machine from the command line.
68
+
69
+ ```bash
70
+ # Install the latest stable Hub for the current OS + architecture
71
+ unity hub install
72
+
73
+ # Install a specific Hub version
74
+ unity hub install --hub-version 3.17.0
75
+
76
+ # Force reinstall even when Hub is already detected
77
+ unity hub install --force
78
+
79
+ # Run the installer silently (Windows only)
80
+ unity hub install --headless
81
+
82
+ # Override architecture (e.g. x64 Hub on Apple Silicon via Rosetta)
83
+ unity hub install --architecture x64
84
+
85
+ # Skip the installer code-signature check (unsigned/local builds — not recommended)
86
+ unity hub install --skip-signature-check
87
+ ```
88
+
89
+ Options: `-f` / `--force`, `--headless` (silent installer, Windows only), `-a` / `--architecture x64|arm64` (env `UNITY_ARCHITECTURE`), `--hub-version <version>` (default latest), `--skip-signature-check`.
90
+
91
+ **Integrity & signature verification** — every download is checked against the SHA-512 from the HTTPS manifest, then the installer's **code signature** is verified before it runs with elevation: on macOS via `codesign` (signer `Developer ID Application: Unity Technologies`), on Windows via Authenticode (signer subject `Unity Technologies`), checked *before* the UAC prompt. Verification is **fail-closed** — if it fails or the verifier is unavailable, the command aborts with exit 6 and does not run the installer. Linux `.AppImage` has no standard verifier, so it is SHA-512-only. Pass `--skip-signature-check` to bypass (prints a warning; not recommended).
92
+
93
+ **`--hub-version` behaviour** — fetches the version-specific manifest from the CDN; if that version does not exist, the command exits with code 6 (no fallback to latest).
94
+
95
+ ```bash
96
+ # JSON output
97
+ unity hub install --format json
98
+ ```
99
+
100
+ Emits `{ "success": true, "command": "hub install", "data": { "version": "3.x.x", "installed": true } }` on success, or an `{ "alreadyInstalled": true, "installedPath": "…" }` payload when Hub was already present.
101
+
102
+ ---
103
+