vuer-cli 0.0.1__tar.gz

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.
@@ -0,0 +1,41 @@
1
+ # OS
2
+ .DS_Store
3
+ # PyCharm project files
4
+ .idea
5
+ # since this is public
6
+ .run
7
+ # IDE files
8
+ .eggs
9
+ .tox
10
+ # Setuptools distribution and build folders.
11
+ dist
12
+ build
13
+ *.egg-info
14
+
15
+ __pycache__
16
+
17
+
18
+ # Python egg metadata, regenerated from source files by setuptools.
19
+ .ipynb_checkpoints
20
+ .cache
21
+ MUJOCO_LOG.txt
22
+
23
+ # uv
24
+ .venv
25
+ uv.lock
26
+
27
+ *out
28
+ *.npy
29
+ *.csv
30
+ *.p
31
+
32
+ *.swp
33
+ *.gz
34
+ *.npy
35
+ *.pyc
36
+ *.py~
37
+
38
+ output
39
+ pcds
40
+
41
+ .pytest_cache
vuer_cli-0.0.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Ge Yang
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,180 @@
1
+ Metadata-Version: 2.4
2
+ Name: vuer-cli
3
+ Version: 0.0.1
4
+ Summary: A Python CLI for Vuer, a real-time 3D visualization library
5
+ License: MIT
6
+ License-File: LICENSE
7
+ Classifier: Development Status :: 3 - Alpha
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Operating System :: OS Independent
10
+ Classifier: Programming Language :: Python
11
+ Classifier: Programming Language :: Python :: 3.8
12
+ Classifier: Programming Language :: Python :: 3.9
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Requires-Python: >=3.8
17
+ Requires-Dist: params-proto>=3.0.0rc3
18
+ Provides-Extra: all
19
+ Provides-Extra: example
20
+ Description-Content-Type: text/markdown
21
+
22
+ # Vuer Hub Environment Manager
23
+
24
+ Vuer HUB and the vuer command line tool enable you to manage, version-control, and distribute physical simulation environments the same way you manage software packages.
25
+
26
+ ## Overview
27
+
28
+ The CLI maintains a local environment list in `vuer.json`.
29
+
30
+ **Commands:**
31
+ - `sync` - pull all included environments
32
+ - `add` - add an environment to the vuer.json
33
+ - `remove` - remove an environment
34
+ - `upgrade` - upgrade environments
35
+
36
+ **Environment Commands:**
37
+ - `envs-create` – create a workspace for an environment
38
+ - `envs-publish` - publish an environment to the workspace
39
+ - `envs-pull` – download an environment by `environmentId`
40
+ - `envs-push` – upload a packaged environment
41
+
42
+ ## Installation
43
+
44
+ ```bash
45
+ pip install vuer-cli
46
+ ```
47
+
48
+ ## Environment Variables
49
+
50
+ | Variable | Required | Description |
51
+ |-------------------|----------|--------------------------------------------------------------------------|
52
+ | `VUER_AUTH_TOKEN` | ✅ | JWT token used for all authenticated requests |
53
+ | `VUER_HUB` | ❌ | Base URL of the Vuer Hub API backend (defaults to `https://hub.vuer.ai/api`) |
54
+
55
+ ```bash
56
+ export VUER_AUTH_TOKEN="your-jwt-token"
57
+ export VUER_HUB="https://hub.vuer.ai/api"
58
+ ```
59
+
60
+ ## Usage Overview
61
+
62
+ ```bash
63
+ # Sync all environments
64
+ vuer sync
65
+
66
+ # Add an environment
67
+ vuer add --command.env <environmentId>
68
+
69
+ # Pull an environment
70
+ vuer envs-pull --command.id <environmentId>
71
+
72
+ # Push an environment
73
+ vuer envs-push --command.file ./build/my-env.zip --command.name demo-env --command.version 1.2.3
74
+ ```
75
+
76
+ ## Push Command
77
+
78
+ Upload a packaged environment:
79
+
80
+ ```bash
81
+ vuer envs-push \
82
+ --command.file ./build/my-env.zip \
83
+ --command.name demo-env \
84
+ --command.version 1.2.3 \
85
+ --command.description "Demo package" \
86
+ --command.env-type isaac \
87
+ --command.visibility PUBLIC \
88
+ --command.push-timeout 600
89
+ ```
90
+
91
+ ### Push Flags
92
+
93
+ | Flag | Required | Description |
94
+ |---------------------------------|----------|------------------------------------------------------------|
95
+ | `--command.file PATH` | ✅ | Path to the package file (zip/tar/etc.) |
96
+ | `--command.name NAME` | ✅ | Environment name without spaces |
97
+ | `--command.version SEMVER` | ✅ | Semver-compliant version string (`1.2.3`, `2.0.0-beta`, …) |
98
+ | `--command.description TEXT` | ❌ | Optional text |
99
+ | `--command.env-type TYPE` | ❌ | Example: `isaac`, `mujoco` |
100
+ | `--command.visibility VIS` | ❌ | `PUBLIC` (default), `PRIVATE`, or `ORG_MEMBERS` |
101
+ | `--command.push-timeout SECONDS`| ❌ | Request timeout in seconds (default: 300) |
102
+
103
+ ## Pull Command
104
+
105
+ Download an environment by ID:
106
+
107
+ ```bash
108
+ vuer envs-pull \
109
+ --command.id 252454509945688064 \
110
+ --command.output ./downloads \
111
+ --command.filename demo-env.zip \
112
+ --command.timeout 600
113
+ ```
114
+
115
+ If `--command.filename` is omitted, the tool will try to derive the original filename
116
+ from the server's `Content-Disposition` header. Files are stored under the `downloads/` directory by default.
117
+
118
+ ### Pull Flags
119
+
120
+ | Flag | Required | Description |
121
+ |----------------------------|----------|---------------------------------------------|
122
+ | `--command.id ENV_ID` | ✅ | Target environment's `environmentId` |
123
+ | `--command.output DIR` | ❌ | Destination directory (default `downloads`) |
124
+ | `--command.filename NAME` | ❌ | Override for the saved filename |
125
+ | `--command.timeout SECONDS`| ❌ | Request timeout in seconds (default: 300) |
126
+
127
+ ## Hub Configuration
128
+
129
+ You can also configure Hub settings via CLI options:
130
+
131
+ ```bash
132
+ vuer sync --hub.url https://custom-hub.example.com/api --hub.auth-token your-token
133
+ ```
134
+
135
+ ## Error Handling
136
+
137
+ All network and file-system errors are surfaced as readable messages (prefixed
138
+ with `[ERROR]`). Typical causes:
139
+
140
+ - Invalid JWT → ensure `VUER_AUTH_TOKEN` is set and not expired.
141
+ - Missing backend endpoint → ensure `VUER_HUB` is set.
142
+ - Duplicate name/version on `push` → server enforces `(name, versionId)` uniqueness.
143
+ - Missing file path on `push` or invalid target directory on `pull`.
144
+ - Timeout errors → increase `--command.push-timeout` or `--command.timeout` for large files.
145
+
146
+ ## Development
147
+
148
+ 1. Clone the main repository and navigate into the CLI folder.
149
+ 2. Install dependencies:
150
+ ```bash
151
+ pip install -e .
152
+ ```
153
+ 3. Run the CLI locally using `vuer ...`.
154
+
155
+ ### Running with uv
156
+
157
+ Use `uv run` to execute the CLI without installing it globally:
158
+
159
+ ```bash
160
+ # Create a new environment workspace
161
+ uv run vuer envs-create --command.name my-environment
162
+
163
+ # Pull an environment by ID
164
+ uv run vuer envs-pull --command.id 252454509945688064 --command.output ./downloads
165
+
166
+ # Push an environment package
167
+ uv run vuer envs-push \
168
+ --command.file ./build/my-env.zip \
169
+ --command.name demo-env \
170
+ --command.version 1.2.3 \
171
+ --command.description "Demo package" \
172
+ --command.env-type isaac \
173
+ --command.visibility PUBLIC
174
+
175
+ # Sync all environments in vuer.json
176
+ uv run vuer sync
177
+
178
+ # Add an environment to vuer.json
179
+ uv run vuer add --command.env <environmentId>
180
+ ```
@@ -0,0 +1,159 @@
1
+ # Vuer Hub Environment Manager
2
+
3
+ Vuer HUB and the vuer command line tool enable you to manage, version-control, and distribute physical simulation environments the same way you manage software packages.
4
+
5
+ ## Overview
6
+
7
+ The CLI maintains a local environment list in `vuer.json`.
8
+
9
+ **Commands:**
10
+ - `sync` - pull all included environments
11
+ - `add` - add an environment to the vuer.json
12
+ - `remove` - remove an environment
13
+ - `upgrade` - upgrade environments
14
+
15
+ **Environment Commands:**
16
+ - `envs-create` – create a workspace for an environment
17
+ - `envs-publish` - publish an environment to the workspace
18
+ - `envs-pull` – download an environment by `environmentId`
19
+ - `envs-push` – upload a packaged environment
20
+
21
+ ## Installation
22
+
23
+ ```bash
24
+ pip install vuer-cli
25
+ ```
26
+
27
+ ## Environment Variables
28
+
29
+ | Variable | Required | Description |
30
+ |-------------------|----------|--------------------------------------------------------------------------|
31
+ | `VUER_AUTH_TOKEN` | ✅ | JWT token used for all authenticated requests |
32
+ | `VUER_HUB` | ❌ | Base URL of the Vuer Hub API backend (defaults to `https://hub.vuer.ai/api`) |
33
+
34
+ ```bash
35
+ export VUER_AUTH_TOKEN="your-jwt-token"
36
+ export VUER_HUB="https://hub.vuer.ai/api"
37
+ ```
38
+
39
+ ## Usage Overview
40
+
41
+ ```bash
42
+ # Sync all environments
43
+ vuer sync
44
+
45
+ # Add an environment
46
+ vuer add --command.env <environmentId>
47
+
48
+ # Pull an environment
49
+ vuer envs-pull --command.id <environmentId>
50
+
51
+ # Push an environment
52
+ vuer envs-push --command.file ./build/my-env.zip --command.name demo-env --command.version 1.2.3
53
+ ```
54
+
55
+ ## Push Command
56
+
57
+ Upload a packaged environment:
58
+
59
+ ```bash
60
+ vuer envs-push \
61
+ --command.file ./build/my-env.zip \
62
+ --command.name demo-env \
63
+ --command.version 1.2.3 \
64
+ --command.description "Demo package" \
65
+ --command.env-type isaac \
66
+ --command.visibility PUBLIC \
67
+ --command.push-timeout 600
68
+ ```
69
+
70
+ ### Push Flags
71
+
72
+ | Flag | Required | Description |
73
+ |---------------------------------|----------|------------------------------------------------------------|
74
+ | `--command.file PATH` | ✅ | Path to the package file (zip/tar/etc.) |
75
+ | `--command.name NAME` | ✅ | Environment name without spaces |
76
+ | `--command.version SEMVER` | ✅ | Semver-compliant version string (`1.2.3`, `2.0.0-beta`, …) |
77
+ | `--command.description TEXT` | ❌ | Optional text |
78
+ | `--command.env-type TYPE` | ❌ | Example: `isaac`, `mujoco` |
79
+ | `--command.visibility VIS` | ❌ | `PUBLIC` (default), `PRIVATE`, or `ORG_MEMBERS` |
80
+ | `--command.push-timeout SECONDS`| ❌ | Request timeout in seconds (default: 300) |
81
+
82
+ ## Pull Command
83
+
84
+ Download an environment by ID:
85
+
86
+ ```bash
87
+ vuer envs-pull \
88
+ --command.id 252454509945688064 \
89
+ --command.output ./downloads \
90
+ --command.filename demo-env.zip \
91
+ --command.timeout 600
92
+ ```
93
+
94
+ If `--command.filename` is omitted, the tool will try to derive the original filename
95
+ from the server's `Content-Disposition` header. Files are stored under the `downloads/` directory by default.
96
+
97
+ ### Pull Flags
98
+
99
+ | Flag | Required | Description |
100
+ |----------------------------|----------|---------------------------------------------|
101
+ | `--command.id ENV_ID` | ✅ | Target environment's `environmentId` |
102
+ | `--command.output DIR` | ❌ | Destination directory (default `downloads`) |
103
+ | `--command.filename NAME` | ❌ | Override for the saved filename |
104
+ | `--command.timeout SECONDS`| ❌ | Request timeout in seconds (default: 300) |
105
+
106
+ ## Hub Configuration
107
+
108
+ You can also configure Hub settings via CLI options:
109
+
110
+ ```bash
111
+ vuer sync --hub.url https://custom-hub.example.com/api --hub.auth-token your-token
112
+ ```
113
+
114
+ ## Error Handling
115
+
116
+ All network and file-system errors are surfaced as readable messages (prefixed
117
+ with `[ERROR]`). Typical causes:
118
+
119
+ - Invalid JWT → ensure `VUER_AUTH_TOKEN` is set and not expired.
120
+ - Missing backend endpoint → ensure `VUER_HUB` is set.
121
+ - Duplicate name/version on `push` → server enforces `(name, versionId)` uniqueness.
122
+ - Missing file path on `push` or invalid target directory on `pull`.
123
+ - Timeout errors → increase `--command.push-timeout` or `--command.timeout` for large files.
124
+
125
+ ## Development
126
+
127
+ 1. Clone the main repository and navigate into the CLI folder.
128
+ 2. Install dependencies:
129
+ ```bash
130
+ pip install -e .
131
+ ```
132
+ 3. Run the CLI locally using `vuer ...`.
133
+
134
+ ### Running with uv
135
+
136
+ Use `uv run` to execute the CLI without installing it globally:
137
+
138
+ ```bash
139
+ # Create a new environment workspace
140
+ uv run vuer envs-create --command.name my-environment
141
+
142
+ # Pull an environment by ID
143
+ uv run vuer envs-pull --command.id 252454509945688064 --command.output ./downloads
144
+
145
+ # Push an environment package
146
+ uv run vuer envs-push \
147
+ --command.file ./build/my-env.zip \
148
+ --command.name demo-env \
149
+ --command.version 1.2.3 \
150
+ --command.description "Demo package" \
151
+ --command.env-type isaac \
152
+ --command.visibility PUBLIC
153
+
154
+ # Sync all environments in vuer.json
155
+ uv run vuer sync
156
+
157
+ # Add an environment to vuer.json
158
+ uv run vuer add --command.env <environmentId>
159
+ ```
@@ -0,0 +1,146 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "vuer-cli"
7
+ version = "0.0.1"
8
+ description = "A Python CLI for Vuer, a real-time 3D visualization library"
9
+ readme = "README.md"
10
+ license = { text = "MIT" }
11
+ requires-python = ">=3.8"
12
+ classifiers = [
13
+ "Development Status :: 3 - Alpha",
14
+ "Programming Language :: Python",
15
+ "Programming Language :: Python :: 3.8",
16
+ "Programming Language :: Python :: 3.9",
17
+ "Programming Language :: Python :: 3.10",
18
+ "Programming Language :: Python :: 3.11",
19
+ "Programming Language :: Python :: 3.12",
20
+ "License :: OSI Approved :: MIT License",
21
+ "Operating System :: OS Independent",
22
+ ]
23
+ dependencies = [
24
+ "params-proto>=3.0.0rc3",
25
+ ]
26
+
27
+ [project.optional-dependencies]
28
+ all = [
29
+ ]
30
+ example = [
31
+ ]
32
+
33
+ [project.scripts]
34
+ vuer = "vuer_cli:entrypoint"
35
+
36
+ [tool.hatch.metadata]
37
+ allow-direct-references = true
38
+
39
+ [tool.hatch.build]
40
+ packages = ["src/vuer_cli"]
41
+
42
+ [tool.hatch.build.targets.wheel]
43
+
44
+ [tool.hatch.build.targets.sdist]
45
+ include = [
46
+ "src",
47
+ "*.md",
48
+ "*.toml",
49
+ "LICENSE",
50
+ ]
51
+
52
+ [dependency-groups]
53
+ dev = [
54
+ "pytest",
55
+ "pytest-xdist",
56
+ "ruff",
57
+ "twine",
58
+ "roman",
59
+ ]
60
+
61
+ [tool.uv]
62
+ override-dependencies = [
63
+ "multidict>=6.0",
64
+ ]
65
+
66
+ [tool.pytest.ini_options]
67
+ pythonpath = ["src"]
68
+ testpaths = ["tests"]
69
+
70
+ [tool.ruff]
71
+ line-length = 140
72
+ indent-width = 4
73
+ target-version = "py311"
74
+ exclude = [
75
+ ".bzr",
76
+ ".direnv",
77
+ ".eggs",
78
+ ".git",
79
+ ".git-rewrite",
80
+ ".hg",
81
+ ".ipynb_checkpoints",
82
+ ".mypy_cache",
83
+ ".nox",
84
+ ".pants.d",
85
+ ".pyenv",
86
+ ".pytest_cache",
87
+ ".pytype",
88
+ ".ruff_cache",
89
+ ".svn",
90
+ ".tox",
91
+ ".venv",
92
+ ".vscode",
93
+ "__pypackages__",
94
+ "_build",
95
+ "buck-out",
96
+ "build",
97
+ "dist",
98
+ "node_modules",
99
+ "site-packages",
100
+ "venv",
101
+ ]
102
+
103
+ [tool.ruff.lint]
104
+ select = ["E4", "E7", "E9", "F"]
105
+ ignore = []
106
+ fixable = ["ALL"]
107
+ unfixable = []
108
+ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
109
+
110
+ [tool.ruff.format]
111
+ quote-style = "double"
112
+ indent-style = "space"
113
+ skip-magic-trailing-comma = false
114
+ line-ending = "auto"
115
+ docstring-code-format = false
116
+ docstring-code-line-length = "dynamic"
117
+
118
+ [tool.black]
119
+ line-length = 120
120
+
121
+ [tool.pylint.messages_control]
122
+ max-line-length = 120
123
+ generated-members = []
124
+ good-names-rgxs = "^[_a-zA-Z][_a-z0-9]?$"
125
+ ignore-paths = []
126
+ jobs = 0
127
+ ignored-classes = ["TensorDataclass"]
128
+ disable = [
129
+ "duplicate-code",
130
+ "fixme",
131
+ "logging-fstring-interpolation",
132
+ "too-many-arguments",
133
+ "too-many-branches",
134
+ "too-many-instance-attributes",
135
+ "too-many-locals",
136
+ "unnecessary-ellipsis",
137
+ ]
138
+
139
+ [tool.pyright]
140
+ include = ["src/vuer_cli"]
141
+ exclude = ["**/node_modules", "**/__pycache__"]
142
+ defineConstant = { DEBUG = true }
143
+ reportMissingImports = true
144
+ reportMissingTypeStubs = false
145
+ reportPrivateImportUsage = false
146
+ reportUndefinedVariable = false
@@ -0,0 +1,115 @@
1
+ """Vuer CLI - Environment Manager for Vuer Hub."""
2
+
3
+ import os
4
+ from dataclasses import dataclass
5
+ from typing import Optional
6
+
7
+ from params_proto import proto
8
+
9
+
10
+ # -- Configuration with environment variable defaults --
11
+
12
+ @proto.prefix
13
+ class Hub:
14
+ """Vuer Hub connection settings."""
15
+ url: str = os.environ.get("VUER_HUB", "https://hub.vuer.ai/api") # Base URL of the Vuer Hub API
16
+ auth_token: str = os.environ.get("VUER_AUTH_TOKEN", "") # JWT token for authentication
17
+
18
+
19
+ # -- Subcommand dataclasses for top-level commands --
20
+
21
+ @dataclass
22
+ class Sync:
23
+ """Pull all included environments from vuer.json."""
24
+ output: str = "downloads" # Destination directory for downloaded environments
25
+ timeout: int = 300 # Request timeout in seconds
26
+
27
+
28
+ @dataclass
29
+ class Add:
30
+ """Add an environment to vuer.json."""
31
+ env: str = "" # Environment ID to add
32
+ name: Optional[str] = None # Optional name for the environment
33
+ version: str = "latest" # Version to track
34
+
35
+
36
+ @dataclass
37
+ class Remove:
38
+ """Remove an environment from vuer.json."""
39
+ env: str = "" # Environment ID to remove
40
+
41
+
42
+ @dataclass
43
+ class Upgrade:
44
+ """Upgrade environments in vuer.json."""
45
+ env: Optional[str] = None # Specific environment ID to upgrade (all if not specified)
46
+ version: Optional[str] = None # New version to set
47
+
48
+
49
+ # -- Subcommand dataclasses for `vuer envs` --
50
+
51
+ @dataclass
52
+ class EnvsCreate:
53
+ """Create a workspace for a new environment."""
54
+ name: str = "" # Environment name (slug format, no spaces)
55
+ timeout: int = 300 # Request timeout in seconds
56
+
57
+
58
+ @dataclass
59
+ class EnvsPublish:
60
+ """Publish a new version of an environment."""
61
+ env_id: str = "" # Environment ID to publish to
62
+ file: str = "" # Path to the package file (zip/tar/etc.)
63
+ version: str = "" # Semver-compliant version string
64
+ description: str = "" # Optional description
65
+ env_type: str = "" # Environment type (isaac, mujoco, etc.)
66
+ visibility: str = "PUBLIC" # Visibility (PUBLIC, PRIVATE, ORG_MEMBERS)
67
+ timeout: int = 300 # Request timeout in seconds
68
+
69
+
70
+ @dataclass
71
+ class EnvsPull:
72
+ """Download an environment by ID."""
73
+ id: str = "" # Environment ID to download
74
+ output: str = "downloads" # Destination directory
75
+ filename: Optional[str] = None # Override for saved filename
76
+ version: Optional[str] = None # Specific version to download
77
+ timeout: int = 300 # Request timeout in seconds
78
+
79
+
80
+ @dataclass
81
+ class EnvsPush:
82
+ """Upload a packaged environment (creates env if needed, then publishes)."""
83
+ file: str = "" # Path to the package file (zip/tar/etc.)
84
+ name: str = "" # Environment name without spaces
85
+ version: str = "" # Semver-compliant version string
86
+ description: str = "" # Optional description
87
+ env_type: str = "" # Environment type (isaac, mujoco, etc.)
88
+ visibility: str = "PUBLIC" # Visibility (PUBLIC, PRIVATE, ORG_MEMBERS)
89
+ push_timeout: int = 300 # Request timeout in seconds
90
+
91
+
92
+ @proto.cli(prog="vuer")
93
+ def entrypoint(
94
+ command: Sync | Add | Remove | Upgrade | EnvsCreate | EnvsPublish | EnvsPull | EnvsPush,
95
+ ):
96
+ """Vuer Hub Environment Manager.
97
+
98
+ Manage, version-control, and distribute physical simulation environments.
99
+
100
+ Commands:
101
+ sync Pull all included environments from vuer.json
102
+ add Add an environment to vuer.json
103
+ remove Remove an environment from vuer.json
104
+ upgrade Upgrade environments in vuer.json
105
+ envs-create Create a workspace for an environment
106
+ envs-publish Publish an environment version
107
+ envs-pull Download an environment by ID
108
+ envs-push Upload a packaged environment
109
+
110
+ Environment Variables:
111
+ VUER_HUB Base URL of the Vuer Hub API (default: https://hub.vuer.ai/api)
112
+ VUER_AUTH_TOKEN JWT token for authentication
113
+ """
114
+ # Dispatch based on command type
115
+ pass