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.
- package/.claude/agents/nccgs-accessibility-specialist.md +26 -0
- package/.claude/agents/nccgs-adversarial-reviewer.md +26 -0
- package/.claude/agents/nccgs-ai-programmer.md +26 -0
- package/.claude/agents/nccgs-analytics-engineer.md +26 -0
- package/.claude/agents/nccgs-art-direction-lead.md +26 -0
- package/.claude/agents/nccgs-audio-direction-lead.md +26 -0
- package/.claude/agents/nccgs-creative-director.md +26 -0
- package/.claude/agents/nccgs-documentation-manager.md +26 -0
- package/.claude/agents/nccgs-economy-designer.md +26 -0
- package/.claude/agents/nccgs-engine-programmer.md +26 -0
- package/.claude/agents/nccgs-game-design-lead.md +26 -0
- package/.claude/agents/nccgs-game-designer.md +26 -0
- package/.claude/agents/nccgs-gameplay-programmer.md +26 -0
- package/.claude/agents/nccgs-level-designer.md +26 -0
- package/.claude/agents/nccgs-live-ops-designer.md +26 -0
- package/.claude/agents/nccgs-localization-lead.md +26 -0
- package/.claude/agents/nccgs-narrative-lead.md +26 -0
- package/.claude/agents/nccgs-network-programmer.md +26 -0
- package/.claude/agents/nccgs-performance-analyst.md +26 -0
- package/.claude/agents/nccgs-producer.md +26 -0
- package/.claude/agents/nccgs-production-coordinator.md +23 -0
- package/.claude/agents/nccgs-programming-lead.md +26 -0
- package/.claude/agents/nccgs-prototyper.md +26 -0
- package/.claude/agents/nccgs-qa-engineer.md +26 -0
- package/.claude/agents/nccgs-qa-lead.md +26 -0
- package/.claude/agents/nccgs-release-engineer.md +26 -0
- package/.claude/agents/nccgs-release-lead.md +26 -0
- package/.claude/agents/nccgs-security-engineer.md +26 -0
- package/.claude/agents/nccgs-sound-designer.md +26 -0
- package/.claude/agents/nccgs-systems-designer.md +26 -0
- package/.claude/agents/nccgs-technical-architect.md +26 -0
- package/.claude/agents/nccgs-technical-artist.md +26 -0
- package/.claude/agents/nccgs-technical-director.md +26 -0
- package/.claude/agents/nccgs-tools-programmer.md +26 -0
- package/.claude/agents/nccgs-ui-programmer.md +26 -0
- package/.claude/agents/nccgs-unity-build-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-content-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-implementer.md +26 -0
- package/.claude/agents/nccgs-unity-rendering-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-systems-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-ui-specialist.md +26 -0
- package/.claude/agents/nccgs-ux-designer.md +26 -0
- package/.claude/agents/nccgs-verification-engineer.md +26 -0
- package/.claude/agents/nccgs-world-builder.md +26 -0
- package/.claude/agents/nccgs-writer.md +26 -0
- package/.claude/nccgs/THIRD_PARTY_NOTICES.md +13 -0
- package/.claude/nccgs/VERSION +1 -0
- package/.claude/nccgs/constitution.md +131 -0
- package/.claude/nccgs/hooks/agent-audit.mjs +10 -0
- package/.claude/nccgs/hooks/common.mjs +41 -0
- package/.claude/nccgs/hooks/post-compact.mjs +1 -0
- package/.claude/nccgs/hooks/pre-compact.mjs +8 -0
- package/.claude/nccgs/hooks/protect-git.mjs +22 -0
- package/.claude/nccgs/hooks/protect-write.mjs +17 -0
- package/.claude/nccgs/hooks/session-start.mjs +15 -0
- package/.claude/nccgs/hooks/session-stop.mjs +7 -0
- package/.claude/nccgs/protocols/agent-contract.md +34 -0
- package/.claude/nccgs/protocols/context-packets.md +13 -0
- package/.claude/nccgs/protocols/evidence.md +15 -0
- package/.claude/nccgs/protocols/model-routing.md +22 -0
- package/.claude/nccgs/protocols/orchestration.md +26 -0
- package/.claude/nccgs/protocols/unity-boundary.md +11 -0
- package/.claude/nccgs/settings.fragment.json +77 -0
- package/.claude/nccgs/studio.json +347 -0
- package/.claude/nccgs/tools/configure-models.mjs +39 -0
- package/.claude/nccgs/unity-skills-manifest.json +727 -0
- package/.claude/nccgs/workflow-catalog.json +317 -0
- package/.claude/rules/nccgs-canonical-docs.md +19 -0
- package/.claude/rules/nccgs-editor-tools.md +12 -0
- package/.claude/rules/nccgs-localization.md +12 -0
- package/.claude/rules/nccgs-networking.md +13 -0
- package/.claude/rules/nccgs-performance.md +14 -0
- package/.claude/rules/nccgs-rendering.md +16 -0
- package/.claude/rules/nccgs-security.md +13 -0
- package/.claude/rules/nccgs-tests.md +18 -0
- package/.claude/rules/nccgs-ui.md +14 -0
- package/.claude/rules/nccgs-unity-assets.md +21 -0
- package/.claude/rules/nccgs-unity-code.md +22 -0
- package/.claude/skills/accessibility-review/SKILL.md +14 -0
- package/.claude/skills/architecture-decision/SKILL.md +14 -0
- package/.claude/skills/asset-audit/SKILL.md +14 -0
- package/.claude/skills/audit/SKILL.md +16 -0
- package/.claude/skills/audit/references/dimensions.md +46 -0
- package/.claude/skills/balance-review/SKILL.md +14 -0
- package/.claude/skills/bug-triage/SKILL.md +14 -0
- package/.claude/skills/build-live-game/SKILL.md +317 -0
- package/.claude/skills/build-live-game/references/achievements.md +779 -0
- package/.claude/skills/build-live-game/references/apis.md +280 -0
- package/.claude/skills/build-live-game/references/authentication.md +437 -0
- package/.claude/skills/build-live-game/references/battlepass.md +860 -0
- package/.claude/skills/build-live-game/references/cloud-code.md +563 -0
- package/.claude/skills/build-live-game/references/cloud-save.md +474 -0
- package/.claude/skills/build-live-game/references/deployment.md +216 -0
- package/.claude/skills/build-live-game/references/player-account.md +813 -0
- package/.claude/skills/build-live-game/references/remote-config.md +96 -0
- package/.claude/skills/build-live-game/references/tooling.md +431 -0
- package/.claude/skills/closure/SKILL.md +14 -0
- package/.claude/skills/code-review/SKILL.md +14 -0
- package/.claude/skills/compatibility-review/SKILL.md +14 -0
- package/.claude/skills/context-pack/SKILL.md +14 -0
- package/.claude/skills/dependency-review/SKILL.md +14 -0
- package/.claude/skills/design/SKILL.md +20 -0
- package/.claude/skills/design-review/SKILL.md +14 -0
- package/.claude/skills/evidence-review/SKILL.md +14 -0
- package/.claude/skills/hotfix/SKILL.md +14 -0
- package/.claude/skills/implement-in-app-purchases/README.md +233 -0
- package/.claude/skills/implement-in-app-purchases/SKILL.md +158 -0
- package/.claude/skills/implement-in-app-purchases/references/api-notes.md +562 -0
- package/.claude/skills/implement-in-app-purchases/references/codeless-catalog.md +331 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-adapty.md +268 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-essentialkit.md +239 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-revenuecat.md +275 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-unipay.md +145 -0
- package/.claude/skills/implement-in-app-purchases/references/migration-v4-to-v5.md +204 -0
- package/.claude/skills/implement-in-app-purchases/references/path-add-iap-to-new-project.md +198 -0
- package/.claude/skills/implement-in-app-purchases/references/path-convert-native-google-billing.md +356 -0
- package/.claude/skills/implement-in-app-purchases/references/path-convert-native-storekit.md +446 -0
- package/.claude/skills/implement-in-app-purchases/references/path-implement-iap-d2c.md +680 -0
- package/.claude/skills/implement-in-app-purchases/references/platform-notes.md +204 -0
- package/.claude/skills/implement-in-app-purchases/references/pre-check.md +205 -0
- package/.claude/skills/incident-recovery/SKILL.md +14 -0
- package/.claude/skills/initialize-ai-navigation/SKILL.md +95 -0
- package/.claude/skills/initialize-ai-navigation/references/navigation-system.md +794 -0
- package/.claude/skills/levelplay-unity-integration/CHANGELOG.md +57 -0
- package/.claude/skills/levelplay-unity-integration/README.md +74 -0
- package/.claude/skills/levelplay-unity-integration/SKILL.md +1126 -0
- package/.claude/skills/levelplay-unity-integration/references/banner-api.md +920 -0
- package/.claude/skills/levelplay-unity-integration/references/best-practices.md +536 -0
- package/.claude/skills/levelplay-unity-integration/references/ilrd-api.md +337 -0
- package/.claude/skills/levelplay-unity-integration/references/initialization-api.md +630 -0
- package/.claude/skills/levelplay-unity-integration/references/interstitial-api.md +899 -0
- package/.claude/skills/levelplay-unity-integration/references/ios-setup.md +491 -0
- package/.claude/skills/levelplay-unity-integration/references/migration-sdk-9.md +666 -0
- package/.claude/skills/levelplay-unity-integration/references/privacy-settings.md +608 -0
- package/.claude/skills/levelplay-unity-integration/references/rewarded-api.md +902 -0
- package/.claude/skills/localization/SKILL.md +135 -0
- package/.claude/skills/localization/references/api-notes.md +76 -0
- package/.claude/skills/localization/resources/L10nBatchProcessor.cs +69 -0
- package/.claude/skills/localization/resources/LocalizedFontAsset.cs +18 -0
- package/.claude/skills/localize-game/SKILL.md +14 -0
- package/.claude/skills/migrate-project/SKILL.md +21 -0
- package/.claude/skills/migrate-project/references/procedure.md +63 -0
- package/.claude/skills/milestone-review/SKILL.md +14 -0
- package/.claude/skills/new-unity-project/SKILL.md +179 -0
- package/.claude/skills/optimize-audio/SKILL.md +199 -0
- package/.claude/skills/optimize-audio/resources/audio-import-api.md +146 -0
- package/.claude/skills/optimize-audio/resources/platform-settings.md +48 -0
- package/.claude/skills/optimize-text-mesh-pro/SKILL.md +182 -0
- package/.claude/skills/optimize-web/SKILL.md +393 -0
- package/.claude/skills/optimize-web/resources/WebOptimizer.cs +21 -0
- package/.claude/skills/optimize-web/resources/toktx-examples.sh +11 -0
- package/.claude/skills/performance-audit/SKILL.md +14 -0
- package/.claude/skills/physics-3d-collision/SKILL.md +442 -0
- package/.claude/skills/physics-3d-collision/references/troubleshooting.md +41 -0
- package/.claude/skills/physics-3d-collision/resources/CollisionDebugger.cs +33 -0
- package/.claude/skills/plan-feature/SKILL.md +14 -0
- package/.claude/skills/playtest/SKILL.md +14 -0
- package/.claude/skills/project-stage/SKILL.md +14 -0
- package/.claude/skills/prototype-feature/SKILL.md +14 -0
- package/.claude/skills/qa-plan/SKILL.md +14 -0
- package/.claude/skills/release/SKILL.md +18 -0
- package/.claude/skills/release-readiness/SKILL.md +14 -0
- package/.claude/skills/retrospective/SKILL.md +14 -0
- package/.claude/skills/review/SKILL.md +16 -0
- package/.claude/skills/security-audit/SKILL.md +14 -0
- package/.claude/skills/setup-multiplayer-services/SKILL.md +39 -0
- package/.claude/skills/setup-multiplayer-services/references/dgs-entrypoint.md +79 -0
- package/.claude/skills/setup-multiplayer-services/references/entrypoints.md +213 -0
- package/.claude/skills/setup-multiplayer-services/references/examples.md +33 -0
- package/.claude/skills/setup-multiplayer-services/references/implementation-fit.md +30 -0
- package/.claude/skills/setup-multiplayer-services/references/underlying-services.md +11 -0
- package/.claude/skills/setup-multiplayer-services/references/workflows-prerequisites.md +17 -0
- package/.claude/skills/setup-vivox-voice-chat/SKILL.md +118 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/.env.example +6 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/README.md +101 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/promptfooconfig.yaml +32 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/tests/init-and-login.yaml +76 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/tests/text-chat.yaml +65 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/tests/voice-channels.yaml +74 -0
- package/.claude/skills/setup-vivox-voice-chat/references/events-and-participants.md +79 -0
- package/.claude/skills/setup-vivox-voice-chat/references/init-and-login.md +92 -0
- package/.claude/skills/setup-vivox-voice-chat/references/text-chat.md +93 -0
- package/.claude/skills/setup-vivox-voice-chat/references/troubleshooting.md +47 -0
- package/.claude/skills/setup-vivox-voice-chat/references/voice-channels.md +90 -0
- package/.claude/skills/shader-graph-create-custom-node/SKILL.md +25 -0
- package/.claude/skills/shader-graph-create-custom-node/resources/all_hints.hlsl +182 -0
- package/.claude/skills/sprint-plan/SKILL.md +14 -0
- package/.claude/skills/sprite-editor/SKILL.md +66 -0
- package/.claude/skills/sprite-editor/references/api_reference.md +151 -0
- package/.claude/skills/sprite-editor/references/background.md +112 -0
- package/.claude/skills/sprite-editor/references/templates.md +72 -0
- package/.claude/skills/sprite-editor/scripts/AutomaticSliceTexture.cs +40 -0
- package/.claude/skills/sprite-editor/scripts/GenerateNewSpriteRects.cs +200 -0
- package/.claude/skills/sprite-editor/scripts/GetTextureSourceImageSize.cs +32 -0
- package/.claude/skills/sprite-editor/scripts/GetTextureToSlice.cs +55 -0
- package/.claude/skills/sprite-editor/scripts/GridSliceTexture.cs +40 -0
- package/.claude/skills/sprite-editor/scripts/IsometricSliceTexture.cs +141 -0
- package/.claude/skills/sprite-editor/scripts/README.md +134 -0
- package/.claude/skills/sprite-editor/scripts/SetPivotExample.cs +58 -0
- package/.claude/skills/sprite-editor/scripts/SpriteToPng.cs +88 -0
- package/.claude/skills/status/SKILL.md +16 -0
- package/.claude/skills/story-readiness/SKILL.md +14 -0
- package/.claude/skills/test/SKILL.md +16 -0
- package/.claude/skills/ui/SKILL.md +142 -0
- package/.claude/skills/ui-imgui/SKILL.md +186 -0
- package/.claude/skills/ui-imgui/references/gui-elements.md +156 -0
- package/.claude/skills/ui-imgui/references/templates.md +141 -0
- package/.claude/skills/ui-review/SKILL.md +14 -0
- package/.claude/skills/ui-ugui/SKILL.md +282 -0
- package/.claude/skills/ui-ugui/references/scrollview-setup.md +29 -0
- package/.claude/skills/ui-uitk/SKILL.md +235 -0
- package/.claude/skills/ui-uitk/references/common-issues.md +74 -0
- package/.claude/skills/ui-uitk/references/custom-elements.md +241 -0
- package/.claude/skills/ui-uitk/references/painter2d.md +282 -0
- package/.claude/skills/ui-uitk/references/pointermanipulator-guide.md +94 -0
- package/.claude/skills/ui-uitk/references/svg-icons.md +136 -0
- package/.claude/skills/ui-uitk/references/ui-runtime-binding.md +234 -0
- package/.claude/skills/ui-uitk/references/uss-guide.md +138 -0
- package/.claude/skills/unity-cli/CHANGELOG.md +233 -0
- package/.claude/skills/unity-cli/SECURITY.md +22 -0
- package/.claude/skills/unity-cli/SKILL.md +414 -0
- package/.claude/skills/unity-cli/references/auth-license-cloud.md +146 -0
- package/.claude/skills/unity-cli/references/build-run-test.md +349 -0
- package/.claude/skills/unity-cli/references/collaboration.md +472 -0
- package/.claude/skills/unity-cli/references/config-hub.md +103 -0
- package/.claude/skills/unity-cli/references/diagnostics-maintenance.md +326 -0
- package/.claude/skills/unity-cli/references/editors-install.md +327 -0
- package/.claude/skills/unity-cli/references/integration-advanced.md +472 -0
- package/.claude/skills/unity-cli/references/projects-templates.md +574 -0
- package/.claude/skills/unity-package-management/SKILL.md +304 -0
- package/.claude/skills/unity-package-management/references/select-packages.md +108 -0
- package/.claude/skills/urp-postprocessing/SKILL.md +188 -0
- package/.claude/skills/urp-postprocessing/references/code-templates.md +119 -0
- package/.claude/skills/urp-postprocessing/references/effect-reference.md +86 -0
- package/.claude/skills/validate-urp-render-graph-renderer-feature/SKILL.md +269 -0
- package/.claude/skills/work/SKILL.md +36 -0
- package/.claude/skills/work/references/classification.md +41 -0
- package/.claude/skills/work/references/closure.md +50 -0
- package/.claude/skills/work/references/feature-contracts.md +32 -0
- package/.claude/skills/work/references/verification.md +26 -0
- package/CLAUDE.md +6 -0
- package/LICENSE +21 -0
- package/README.md +162 -0
- package/THIRD_PARTY_NOTICES.md +23 -0
- package/UPGRADING.md +32 -0
- package/VERSION +1 -0
- package/docs/ARCHITECTURE.md +73 -0
- package/docs/HUONG-DAN-MIGRATE-VA-SU-DUNG.md +324 -0
- package/docs/MIGRATION-MATRIX.md +23 -0
- package/docs/PROJECT-POLICY.md +67 -0
- package/docs/WORKFLOWS.md +61 -0
- package/package-assets/setup-vivox-voice-chat-evals.gitignore +7 -0
- package/package.json +41 -0
- package/scaffold/.nccgs/bugs/.gitkeep +1 -0
- package/scaffold/.nccgs/closures/.gitkeep +1 -0
- package/scaffold/.nccgs/context/.gitkeep +1 -0
- package/scaffold/.nccgs/decisions/.gitkeep +1 -0
- package/scaffold/.nccgs/evidence/.gitkeep +1 -0
- package/scaffold/.nccgs/features/.gitkeep +1 -0
- package/scaffold/.nccgs/migrations/.gitkeep +1 -0
- package/scaffold/.nccgs/playtests/.gitkeep +1 -0
- package/scaffold/.nccgs/project.yaml +103 -0
- package/scaffold/.nccgs/requirements.yaml +10 -0
- package/scaffold/.nccgs/reviews/.gitkeep +1 -0
- package/scaffold/.nccgs/state.md +40 -0
- package/scaffold/.nccgs/templates/agent-handoff.md +25 -0
- package/scaffold/.nccgs/templates/architecture-decision.md +27 -0
- package/scaffold/.nccgs/templates/closure-record.md +51 -0
- package/scaffold/.nccgs/templates/context-packet.yaml +17 -0
- package/scaffold/.nccgs/templates/evidence-record.md +23 -0
- package/scaffold/.nccgs/templates/feature-contract.md +35 -0
- package/scaffold/.nccgs/templates/migration-plan.md +40 -0
- package/scaffold/.nccgs/templates/waiver.md +11 -0
- package/scripts/cli.mjs +56 -0
- package/scripts/install.mjs +267 -0
- package/scripts/sync-unity-skills.mjs +126 -0
- package/scripts/validate.mjs +205 -0
- 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
|
+
|