cyclo-manager 0.1.0.dev2__tar.gz → 0.1.1.dev0__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.
- cyclo_manager-0.1.1.dev0/PKG-INFO +138 -0
- cyclo_manager-0.1.1.dev0/README.md +127 -0
- cyclo_manager-0.1.1.dev0/cyclo_manager.egg-info/PKG-INFO +138 -0
- cyclo_manager-0.1.1.dev0/cyclo_manager_cli/__init__.py +21 -0
- {cyclo_manager-0.1.0.dev2 → cyclo_manager-0.1.1.dev0}/cyclo_manager_cli/cli.py +23 -45
- {cyclo_manager-0.1.0.dev2 → cyclo_manager-0.1.1.dev0}/cyclo_manager_cli/docker/docker-compose.yml +2 -4
- {cyclo_manager-0.1.0.dev2 → cyclo_manager-0.1.1.dev0}/pyproject.toml +1 -1
- {cyclo_manager-0.1.0.dev2 → cyclo_manager-0.1.1.dev0}/setup.cfg +1 -1
- cyclo_manager-0.1.0.dev2/PKG-INFO +0 -107
- cyclo_manager-0.1.0.dev2/README.md +0 -96
- cyclo_manager-0.1.0.dev2/cyclo_manager.egg-info/PKG-INFO +0 -107
- cyclo_manager-0.1.0.dev2/cyclo_manager_cli/__init__.py +0 -3
- {cyclo_manager-0.1.0.dev2 → cyclo_manager-0.1.1.dev0}/cyclo_manager.egg-info/SOURCES.txt +0 -0
- {cyclo_manager-0.1.0.dev2 → cyclo_manager-0.1.1.dev0}/cyclo_manager.egg-info/dependency_links.txt +0 -0
- {cyclo_manager-0.1.0.dev2 → cyclo_manager-0.1.1.dev0}/cyclo_manager.egg-info/entry_points.txt +0 -0
- {cyclo_manager-0.1.0.dev2 → cyclo_manager-0.1.1.dev0}/cyclo_manager.egg-info/requires.txt +0 -0
- {cyclo_manager-0.1.0.dev2 → cyclo_manager-0.1.1.dev0}/cyclo_manager.egg-info/top_level.txt +0 -0
- {cyclo_manager-0.1.0.dev2 → cyclo_manager-0.1.1.dev0}/cyclo_manager_cli/config/config.yml +0 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cyclo-manager
|
|
3
|
+
Version: 0.1.1.dev0
|
|
4
|
+
Summary: cyclo_manager CLI: pip-installable launcher for cyclo_manager server and UI containers. Run 'cyclo_manager up' to start Docker stack.
|
|
5
|
+
License-Expression: Apache-2.0
|
|
6
|
+
Requires-Python: >=3.10
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Provides-Extra: dev
|
|
9
|
+
Requires-Dist: pytest; extra == "dev"
|
|
10
|
+
Requires-Dist: ruff; extra == "dev"
|
|
11
|
+
|
|
12
|
+
# cyclo_manager CLI
|
|
13
|
+
|
|
14
|
+
**PyPI package:** `cyclo-manager`
|
|
15
|
+
**Console command:** `cyclo_manager` (underscore)
|
|
16
|
+
|
|
17
|
+
This package is a **thin launcher**: it runs **`docker compose`** against a **bundled** [`cyclo_manager_cli/docker/docker-compose.yml`](cyclo_manager_cli/docker/docker-compose.yml) so you can start the **cyclo_manager API** and **web UI** without cloning the monorepo. Optional services (**Zenoh**, **noVNC**) are **created** but **not started** by default. It can also **`pip install -U`** itself and bring the stack back up.
|
|
18
|
+
|
|
19
|
+
Implementation: [`cyclo_manager_cli/cli.py`](cyclo_manager_cli/cli.py).
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Table of contents
|
|
24
|
+
|
|
25
|
+
- [cyclo\_manager CLI](#cyclo_manager-cli)
|
|
26
|
+
- [Table of contents](#table-of-contents)
|
|
27
|
+
- [Prerequisites](#prerequisites)
|
|
28
|
+
- [Install](#install)
|
|
29
|
+
- [Commands](#commands)
|
|
30
|
+
- [Compose: services and behavior](#compose-services-and-behavior)
|
|
31
|
+
- [Config and environment](#config-and-environment)
|
|
32
|
+
- [Bundled `config.yml`](#bundled-configyml)
|
|
33
|
+
- [URLs (packaged stack)](#urls-packaged-stack)
|
|
34
|
+
- [Dependencies](#dependencies)
|
|
35
|
+
- [License](#license)
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Prerequisites
|
|
40
|
+
|
|
41
|
+
- **Docker** with **Compose v2** (`docker compose` — the legacy `docker-compose` binary alone is not enough)
|
|
42
|
+
- **Python 3.10+**
|
|
43
|
+
- For **`cyclo_manager update`:** **`pip`** or **`pip3`** on `PATH`
|
|
44
|
+
- On the **host:** agent sockets are expected under **`/var/run/robotis/agent_sockets`** and are mounted into the API container as **`/agents`** (see the bundled Compose file). Adjust only if you maintain a custom setup.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Install
|
|
49
|
+
|
|
50
|
+
Install from **PyPI**:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pip install cyclo-manager
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
If `cyclo_manager` is not on `PATH`, add the user script directory, e.g.:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
export PATH="$HOME/.local/bin:$PATH"
|
|
60
|
+
cyclo_manager up
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
If the entry point is still missing:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
python3 -m cyclo_manager_cli.cli --help
|
|
67
|
+
python3 -m cyclo_manager_cli.cli up
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Commands
|
|
73
|
+
|
|
74
|
+
| Command | Behavior |
|
|
75
|
+
|--------|----------|
|
|
76
|
+
| `cyclo_manager up` | `docker compose up -d` for **`cyclo_manager`** and **`ui`**, then `docker compose create --no-recreate` for **`rmw_zenoh`** and **`novnc-server`** so those containers **exist** but stay **stopped**. Sets **`CYCLO_MANAGER_CONFIG_FILE`** to the **bundled** [`cyclo_manager_cli/config/config.yml`](cyclo_manager_cli/config/config.yml) (no CLI flag to use another file). |
|
|
77
|
+
| `cyclo_manager up --pull` | Runs `docker compose pull` first, then the same as `up`. |
|
|
78
|
+
| `cyclo_manager down` | `docker compose down` using the **packaged** compose file. Stops and removes **all** services defined in that file for this Compose project (not only API + UI). |
|
|
79
|
+
| `cyclo_manager update` | Runs `cyclo_manager down`, `pip install -U cyclo-manager`, then `cyclo_manager up`. Optional `--pull` is passed through to the final `up`. Requires **`cyclo_manager`** and **`pip`** on `PATH`. |
|
|
80
|
+
| `cyclo_manager --help` | Subcommand overview |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Compose: services and behavior
|
|
85
|
+
|
|
86
|
+
| Compose service | Container name (typical) | `cyclo_manager up` |
|
|
87
|
+
|-----------------|-------------------------|--------------------|
|
|
88
|
+
| `cyclo_manager` | `cyclo_manager` | **Started** |
|
|
89
|
+
| `ui` | `cyclo_manager_ui` | **Started** |
|
|
90
|
+
| `rmw_zenoh` | `zenoh_daemon` | **Created only** (start e.g. from the Control UI or `docker start zenoh_daemon`) |
|
|
91
|
+
| `novnc-server` | `novnc-server` | **Created only** (start when needed, e.g. `docker start novnc-server`) |
|
|
92
|
+
|
|
93
|
+
The bundled stack uses **`network_mode: host`** (see the Compose file). Image names and tags (e.g. `robotis/cyclo-manager`, `robotis/cyclo-manager-ui`) are defined in [`cyclo_manager_cli/docker/docker-compose.yml`](cyclo_manager_cli/docker/docker-compose.yml).
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Config and environment
|
|
98
|
+
|
|
99
|
+
- **`CYCLO_MANAGER_CONFIG_FILE`**: set automatically by the CLI to the absolute path of the **bundled** [`cyclo_manager_cli/config/config.yml`](cyclo_manager_cli/config/config.yml) on the host, and consumed by Compose as the mount for `/app/config.yml` in the API container. `up` and `down` both set this.
|
|
100
|
+
- **`ROS_DOMAIN_ID`**: **not** set by the CLI. Set DDS domain in each container’s environment (e.g. `~/.bashrc` inside the image) so it matches your robots, then restart as needed.
|
|
101
|
+
- For a **custom** config file, different mounts, or local source builds, use the repository’s **`docker-compose.dev.yml`** at the [project root](../README.md#how-to-run) instead of the pip-bundled workflow.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Bundled `config.yml`
|
|
106
|
+
|
|
107
|
+
Path: [`cyclo_manager_cli/config/config.yml`](cyclo_manager_cli/config/config.yml)
|
|
108
|
+
|
|
109
|
+
It only defines **which containers cyclo_manager knows about** and the **agent Unix socket path** (as seen from the API process, under `/agents` in the default Compose setup), for example:
|
|
110
|
+
|
|
111
|
+
- `ai_worker` → `/agents/ai_worker/s6_agent.sock`
|
|
112
|
+
- `physical_ai_server` → `/agents/physical_ai_server/s6_agent.sock`
|
|
113
|
+
|
|
114
|
+
**s6 service names** are **not** listed here; the agent in each container reports them at runtime.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## URLs (packaged stack)
|
|
119
|
+
|
|
120
|
+
With `network_mode: host` and the defaults in Compose:
|
|
121
|
+
|
|
122
|
+
| What | URL |
|
|
123
|
+
|------|-----|
|
|
124
|
+
| cyclo_manager API | http://127.0.0.1:8081 |
|
|
125
|
+
| OpenAPI (Swagger) | http://127.0.0.1:8081/docs |
|
|
126
|
+
| Web UI | http://127.0.0.1:3000 |
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Dependencies
|
|
131
|
+
|
|
132
|
+
The **`cyclo-manager`** package declares **no** Python runtime dependencies in [`pyproject.toml`](pyproject.toml). It invokes **`docker compose`** and, for **`update`**, **`pip`**.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## License
|
|
137
|
+
|
|
138
|
+
SPDX: **Apache-2.0** (see [pyproject.toml](pyproject.toml) and the repository [LICENSE](../LICENSE)).
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# cyclo_manager CLI
|
|
2
|
+
|
|
3
|
+
**PyPI package:** `cyclo-manager`
|
|
4
|
+
**Console command:** `cyclo_manager` (underscore)
|
|
5
|
+
|
|
6
|
+
This package is a **thin launcher**: it runs **`docker compose`** against a **bundled** [`cyclo_manager_cli/docker/docker-compose.yml`](cyclo_manager_cli/docker/docker-compose.yml) so you can start the **cyclo_manager API** and **web UI** without cloning the monorepo. Optional services (**Zenoh**, **noVNC**) are **created** but **not started** by default. It can also **`pip install -U`** itself and bring the stack back up.
|
|
7
|
+
|
|
8
|
+
Implementation: [`cyclo_manager_cli/cli.py`](cyclo_manager_cli/cli.py).
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Table of contents
|
|
13
|
+
|
|
14
|
+
- [cyclo\_manager CLI](#cyclo_manager-cli)
|
|
15
|
+
- [Table of contents](#table-of-contents)
|
|
16
|
+
- [Prerequisites](#prerequisites)
|
|
17
|
+
- [Install](#install)
|
|
18
|
+
- [Commands](#commands)
|
|
19
|
+
- [Compose: services and behavior](#compose-services-and-behavior)
|
|
20
|
+
- [Config and environment](#config-and-environment)
|
|
21
|
+
- [Bundled `config.yml`](#bundled-configyml)
|
|
22
|
+
- [URLs (packaged stack)](#urls-packaged-stack)
|
|
23
|
+
- [Dependencies](#dependencies)
|
|
24
|
+
- [License](#license)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Prerequisites
|
|
29
|
+
|
|
30
|
+
- **Docker** with **Compose v2** (`docker compose` — the legacy `docker-compose` binary alone is not enough)
|
|
31
|
+
- **Python 3.10+**
|
|
32
|
+
- For **`cyclo_manager update`:** **`pip`** or **`pip3`** on `PATH`
|
|
33
|
+
- On the **host:** agent sockets are expected under **`/var/run/robotis/agent_sockets`** and are mounted into the API container as **`/agents`** (see the bundled Compose file). Adjust only if you maintain a custom setup.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Install
|
|
38
|
+
|
|
39
|
+
Install from **PyPI**:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
pip install cyclo-manager
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
If `cyclo_manager` is not on `PATH`, add the user script directory, e.g.:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
export PATH="$HOME/.local/bin:$PATH"
|
|
49
|
+
cyclo_manager up
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
If the entry point is still missing:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
python3 -m cyclo_manager_cli.cli --help
|
|
56
|
+
python3 -m cyclo_manager_cli.cli up
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Commands
|
|
62
|
+
|
|
63
|
+
| Command | Behavior |
|
|
64
|
+
|--------|----------|
|
|
65
|
+
| `cyclo_manager up` | `docker compose up -d` for **`cyclo_manager`** and **`ui`**, then `docker compose create --no-recreate` for **`rmw_zenoh`** and **`novnc-server`** so those containers **exist** but stay **stopped**. Sets **`CYCLO_MANAGER_CONFIG_FILE`** to the **bundled** [`cyclo_manager_cli/config/config.yml`](cyclo_manager_cli/config/config.yml) (no CLI flag to use another file). |
|
|
66
|
+
| `cyclo_manager up --pull` | Runs `docker compose pull` first, then the same as `up`. |
|
|
67
|
+
| `cyclo_manager down` | `docker compose down` using the **packaged** compose file. Stops and removes **all** services defined in that file for this Compose project (not only API + UI). |
|
|
68
|
+
| `cyclo_manager update` | Runs `cyclo_manager down`, `pip install -U cyclo-manager`, then `cyclo_manager up`. Optional `--pull` is passed through to the final `up`. Requires **`cyclo_manager`** and **`pip`** on `PATH`. |
|
|
69
|
+
| `cyclo_manager --help` | Subcommand overview |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Compose: services and behavior
|
|
74
|
+
|
|
75
|
+
| Compose service | Container name (typical) | `cyclo_manager up` |
|
|
76
|
+
|-----------------|-------------------------|--------------------|
|
|
77
|
+
| `cyclo_manager` | `cyclo_manager` | **Started** |
|
|
78
|
+
| `ui` | `cyclo_manager_ui` | **Started** |
|
|
79
|
+
| `rmw_zenoh` | `zenoh_daemon` | **Created only** (start e.g. from the Control UI or `docker start zenoh_daemon`) |
|
|
80
|
+
| `novnc-server` | `novnc-server` | **Created only** (start when needed, e.g. `docker start novnc-server`) |
|
|
81
|
+
|
|
82
|
+
The bundled stack uses **`network_mode: host`** (see the Compose file). Image names and tags (e.g. `robotis/cyclo-manager`, `robotis/cyclo-manager-ui`) are defined in [`cyclo_manager_cli/docker/docker-compose.yml`](cyclo_manager_cli/docker/docker-compose.yml).
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Config and environment
|
|
87
|
+
|
|
88
|
+
- **`CYCLO_MANAGER_CONFIG_FILE`**: set automatically by the CLI to the absolute path of the **bundled** [`cyclo_manager_cli/config/config.yml`](cyclo_manager_cli/config/config.yml) on the host, and consumed by Compose as the mount for `/app/config.yml` in the API container. `up` and `down` both set this.
|
|
89
|
+
- **`ROS_DOMAIN_ID`**: **not** set by the CLI. Set DDS domain in each container’s environment (e.g. `~/.bashrc` inside the image) so it matches your robots, then restart as needed.
|
|
90
|
+
- For a **custom** config file, different mounts, or local source builds, use the repository’s **`docker-compose.dev.yml`** at the [project root](../README.md#how-to-run) instead of the pip-bundled workflow.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Bundled `config.yml`
|
|
95
|
+
|
|
96
|
+
Path: [`cyclo_manager_cli/config/config.yml`](cyclo_manager_cli/config/config.yml)
|
|
97
|
+
|
|
98
|
+
It only defines **which containers cyclo_manager knows about** and the **agent Unix socket path** (as seen from the API process, under `/agents` in the default Compose setup), for example:
|
|
99
|
+
|
|
100
|
+
- `ai_worker` → `/agents/ai_worker/s6_agent.sock`
|
|
101
|
+
- `physical_ai_server` → `/agents/physical_ai_server/s6_agent.sock`
|
|
102
|
+
|
|
103
|
+
**s6 service names** are **not** listed here; the agent in each container reports them at runtime.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## URLs (packaged stack)
|
|
108
|
+
|
|
109
|
+
With `network_mode: host` and the defaults in Compose:
|
|
110
|
+
|
|
111
|
+
| What | URL |
|
|
112
|
+
|------|-----|
|
|
113
|
+
| cyclo_manager API | http://127.0.0.1:8081 |
|
|
114
|
+
| OpenAPI (Swagger) | http://127.0.0.1:8081/docs |
|
|
115
|
+
| Web UI | http://127.0.0.1:3000 |
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Dependencies
|
|
120
|
+
|
|
121
|
+
The **`cyclo-manager`** package declares **no** Python runtime dependencies in [`pyproject.toml`](pyproject.toml). It invokes **`docker compose`** and, for **`update`**, **`pip`**.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## License
|
|
126
|
+
|
|
127
|
+
SPDX: **Apache-2.0** (see [pyproject.toml](pyproject.toml) and the repository [LICENSE](../LICENSE)).
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cyclo-manager
|
|
3
|
+
Version: 0.1.1.dev0
|
|
4
|
+
Summary: cyclo_manager CLI: pip-installable launcher for cyclo_manager server and UI containers. Run 'cyclo_manager up' to start Docker stack.
|
|
5
|
+
License-Expression: Apache-2.0
|
|
6
|
+
Requires-Python: >=3.10
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Provides-Extra: dev
|
|
9
|
+
Requires-Dist: pytest; extra == "dev"
|
|
10
|
+
Requires-Dist: ruff; extra == "dev"
|
|
11
|
+
|
|
12
|
+
# cyclo_manager CLI
|
|
13
|
+
|
|
14
|
+
**PyPI package:** `cyclo-manager`
|
|
15
|
+
**Console command:** `cyclo_manager` (underscore)
|
|
16
|
+
|
|
17
|
+
This package is a **thin launcher**: it runs **`docker compose`** against a **bundled** [`cyclo_manager_cli/docker/docker-compose.yml`](cyclo_manager_cli/docker/docker-compose.yml) so you can start the **cyclo_manager API** and **web UI** without cloning the monorepo. Optional services (**Zenoh**, **noVNC**) are **created** but **not started** by default. It can also **`pip install -U`** itself and bring the stack back up.
|
|
18
|
+
|
|
19
|
+
Implementation: [`cyclo_manager_cli/cli.py`](cyclo_manager_cli/cli.py).
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Table of contents
|
|
24
|
+
|
|
25
|
+
- [cyclo\_manager CLI](#cyclo_manager-cli)
|
|
26
|
+
- [Table of contents](#table-of-contents)
|
|
27
|
+
- [Prerequisites](#prerequisites)
|
|
28
|
+
- [Install](#install)
|
|
29
|
+
- [Commands](#commands)
|
|
30
|
+
- [Compose: services and behavior](#compose-services-and-behavior)
|
|
31
|
+
- [Config and environment](#config-and-environment)
|
|
32
|
+
- [Bundled `config.yml`](#bundled-configyml)
|
|
33
|
+
- [URLs (packaged stack)](#urls-packaged-stack)
|
|
34
|
+
- [Dependencies](#dependencies)
|
|
35
|
+
- [License](#license)
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Prerequisites
|
|
40
|
+
|
|
41
|
+
- **Docker** with **Compose v2** (`docker compose` — the legacy `docker-compose` binary alone is not enough)
|
|
42
|
+
- **Python 3.10+**
|
|
43
|
+
- For **`cyclo_manager update`:** **`pip`** or **`pip3`** on `PATH`
|
|
44
|
+
- On the **host:** agent sockets are expected under **`/var/run/robotis/agent_sockets`** and are mounted into the API container as **`/agents`** (see the bundled Compose file). Adjust only if you maintain a custom setup.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Install
|
|
49
|
+
|
|
50
|
+
Install from **PyPI**:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pip install cyclo-manager
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
If `cyclo_manager` is not on `PATH`, add the user script directory, e.g.:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
export PATH="$HOME/.local/bin:$PATH"
|
|
60
|
+
cyclo_manager up
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
If the entry point is still missing:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
python3 -m cyclo_manager_cli.cli --help
|
|
67
|
+
python3 -m cyclo_manager_cli.cli up
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Commands
|
|
73
|
+
|
|
74
|
+
| Command | Behavior |
|
|
75
|
+
|--------|----------|
|
|
76
|
+
| `cyclo_manager up` | `docker compose up -d` for **`cyclo_manager`** and **`ui`**, then `docker compose create --no-recreate` for **`rmw_zenoh`** and **`novnc-server`** so those containers **exist** but stay **stopped**. Sets **`CYCLO_MANAGER_CONFIG_FILE`** to the **bundled** [`cyclo_manager_cli/config/config.yml`](cyclo_manager_cli/config/config.yml) (no CLI flag to use another file). |
|
|
77
|
+
| `cyclo_manager up --pull` | Runs `docker compose pull` first, then the same as `up`. |
|
|
78
|
+
| `cyclo_manager down` | `docker compose down` using the **packaged** compose file. Stops and removes **all** services defined in that file for this Compose project (not only API + UI). |
|
|
79
|
+
| `cyclo_manager update` | Runs `cyclo_manager down`, `pip install -U cyclo-manager`, then `cyclo_manager up`. Optional `--pull` is passed through to the final `up`. Requires **`cyclo_manager`** and **`pip`** on `PATH`. |
|
|
80
|
+
| `cyclo_manager --help` | Subcommand overview |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Compose: services and behavior
|
|
85
|
+
|
|
86
|
+
| Compose service | Container name (typical) | `cyclo_manager up` |
|
|
87
|
+
|-----------------|-------------------------|--------------------|
|
|
88
|
+
| `cyclo_manager` | `cyclo_manager` | **Started** |
|
|
89
|
+
| `ui` | `cyclo_manager_ui` | **Started** |
|
|
90
|
+
| `rmw_zenoh` | `zenoh_daemon` | **Created only** (start e.g. from the Control UI or `docker start zenoh_daemon`) |
|
|
91
|
+
| `novnc-server` | `novnc-server` | **Created only** (start when needed, e.g. `docker start novnc-server`) |
|
|
92
|
+
|
|
93
|
+
The bundled stack uses **`network_mode: host`** (see the Compose file). Image names and tags (e.g. `robotis/cyclo-manager`, `robotis/cyclo-manager-ui`) are defined in [`cyclo_manager_cli/docker/docker-compose.yml`](cyclo_manager_cli/docker/docker-compose.yml).
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Config and environment
|
|
98
|
+
|
|
99
|
+
- **`CYCLO_MANAGER_CONFIG_FILE`**: set automatically by the CLI to the absolute path of the **bundled** [`cyclo_manager_cli/config/config.yml`](cyclo_manager_cli/config/config.yml) on the host, and consumed by Compose as the mount for `/app/config.yml` in the API container. `up` and `down` both set this.
|
|
100
|
+
- **`ROS_DOMAIN_ID`**: **not** set by the CLI. Set DDS domain in each container’s environment (e.g. `~/.bashrc` inside the image) so it matches your robots, then restart as needed.
|
|
101
|
+
- For a **custom** config file, different mounts, or local source builds, use the repository’s **`docker-compose.dev.yml`** at the [project root](../README.md#how-to-run) instead of the pip-bundled workflow.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Bundled `config.yml`
|
|
106
|
+
|
|
107
|
+
Path: [`cyclo_manager_cli/config/config.yml`](cyclo_manager_cli/config/config.yml)
|
|
108
|
+
|
|
109
|
+
It only defines **which containers cyclo_manager knows about** and the **agent Unix socket path** (as seen from the API process, under `/agents` in the default Compose setup), for example:
|
|
110
|
+
|
|
111
|
+
- `ai_worker` → `/agents/ai_worker/s6_agent.sock`
|
|
112
|
+
- `physical_ai_server` → `/agents/physical_ai_server/s6_agent.sock`
|
|
113
|
+
|
|
114
|
+
**s6 service names** are **not** listed here; the agent in each container reports them at runtime.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## URLs (packaged stack)
|
|
119
|
+
|
|
120
|
+
With `network_mode: host` and the defaults in Compose:
|
|
121
|
+
|
|
122
|
+
| What | URL |
|
|
123
|
+
|------|-----|
|
|
124
|
+
| cyclo_manager API | http://127.0.0.1:8081 |
|
|
125
|
+
| OpenAPI (Swagger) | http://127.0.0.1:8081/docs |
|
|
126
|
+
| Web UI | http://127.0.0.1:3000 |
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Dependencies
|
|
131
|
+
|
|
132
|
+
The **`cyclo-manager`** package declares **no** Python runtime dependencies in [`pyproject.toml`](pyproject.toml). It invokes **`docker compose`** and, for **`update`**, **`pip`**.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## License
|
|
137
|
+
|
|
138
|
+
SPDX: **Apache-2.0** (see [pyproject.toml](pyproject.toml) and the repository [LICENSE](../LICENSE)).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2026 ROBOTIS CO., LTD.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
# Author: Hyungyu Kim
|
|
18
|
+
|
|
19
|
+
"""cyclo_manager CLI - pip-installable launcher for cyclo_manager server and UI containers."""
|
|
20
|
+
|
|
21
|
+
__version__ = "0.1.1.dev0"
|
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2026 ROBOTIS CO., LTD.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
# Author: Hyungyu Kim
|
|
18
|
+
|
|
1
19
|
"""CLI for pip-installed cyclo_manager_cli: cyclo_manager up, cyclo_manager down, cyclo_manager update. Launches cyclo_manager server and UI via Docker."""
|
|
2
20
|
|
|
3
21
|
import argparse
|
|
@@ -24,30 +42,22 @@ def _config_dir() -> Path:
|
|
|
24
42
|
|
|
25
43
|
|
|
26
44
|
def _packaged_config_path() -> Path:
|
|
27
|
-
"""Path to the bundled config (config/config.yml). Used
|
|
45
|
+
"""Path to the bundled config (config/config.yml). Used for cyclo_manager up/down."""
|
|
28
46
|
return _config_dir() / "config.yml"
|
|
29
47
|
|
|
30
48
|
|
|
31
49
|
def cmd_up(args: argparse.Namespace) -> int:
|
|
32
50
|
"""Run docker compose: start API + UI; create zenoh + noVNC containers without starting them."""
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if not config_path.exists():
|
|
38
|
-
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
39
|
-
shutil.copy2(_packaged_config_path(), config_path)
|
|
40
|
-
print(f"Created default config at {config_path}", file=sys.stderr)
|
|
41
|
-
if not config_path.is_file():
|
|
42
|
-
print(f"Config file not found: {config_path}", file=sys.stderr)
|
|
43
|
-
return 1
|
|
51
|
+
config_path = _packaged_config_path()
|
|
52
|
+
if not config_path.is_file():
|
|
53
|
+
print(f"Bundled config not found: {config_path}", file=sys.stderr)
|
|
54
|
+
return 1
|
|
44
55
|
compose_path = _docker_dir() / "docker-compose.yml"
|
|
45
56
|
if not compose_path.is_file():
|
|
46
57
|
print(f"Compose file not found: {compose_path}", file=sys.stderr)
|
|
47
58
|
return 1
|
|
48
59
|
env = os.environ.copy()
|
|
49
60
|
env["CYCLO_MANAGER_CONFIG_FILE"] = str(config_path)
|
|
50
|
-
env["ROS_DOMAIN_ID"] = str(args.ros_domain_id)
|
|
51
61
|
base = ["docker", "compose", "-f", str(compose_path)]
|
|
52
62
|
try:
|
|
53
63
|
if args.pull:
|
|
@@ -132,12 +142,8 @@ def cmd_update(args: argparse.Namespace) -> int:
|
|
|
132
142
|
|
|
133
143
|
print("Starting containers (cyclo_manager up)...")
|
|
134
144
|
up_args = [cyclo_manager_exe, "up"]
|
|
135
|
-
if getattr(args, "config", None) is not None:
|
|
136
|
-
up_args.extend(["-c", str(args.config)])
|
|
137
145
|
if getattr(args, "pull", False):
|
|
138
146
|
up_args.append("--pull")
|
|
139
|
-
if getattr(args, "ros_domain_id", None) is not None:
|
|
140
|
-
up_args.extend(["-r", str(args.ros_domain_id)])
|
|
141
147
|
try:
|
|
142
148
|
subprocess.run(up_args, check=True)
|
|
143
149
|
except subprocess.CalledProcessError as e:
|
|
@@ -155,20 +161,6 @@ def main() -> int:
|
|
|
155
161
|
sub = parser.add_subparsers(dest="command", help="Commands")
|
|
156
162
|
|
|
157
163
|
up_parser = sub.add_parser("up", help="Start cyclo_manager stack (docker compose)")
|
|
158
|
-
up_parser.add_argument(
|
|
159
|
-
"-c",
|
|
160
|
-
"--config",
|
|
161
|
-
metavar="PATH",
|
|
162
|
-
help="Config file path (default: use bundled config from package)",
|
|
163
|
-
)
|
|
164
|
-
up_parser.add_argument(
|
|
165
|
-
"-r",
|
|
166
|
-
"--ros-domain-id",
|
|
167
|
-
type=int,
|
|
168
|
-
default=30,
|
|
169
|
-
metavar="ID",
|
|
170
|
-
help="ROS2 domain ID for cyclo_manager server (default: 30)",
|
|
171
|
-
)
|
|
172
164
|
up_parser.add_argument(
|
|
173
165
|
"--pull",
|
|
174
166
|
action="store_true",
|
|
@@ -183,20 +175,6 @@ def main() -> int:
|
|
|
183
175
|
"update",
|
|
184
176
|
help="Down containers, pip install -U cyclo-manager, then up again",
|
|
185
177
|
)
|
|
186
|
-
update_parser.add_argument(
|
|
187
|
-
"-c",
|
|
188
|
-
"--config",
|
|
189
|
-
metavar="PATH",
|
|
190
|
-
help="Config file path for cyclo_manager up (default: use bundled config)",
|
|
191
|
-
)
|
|
192
|
-
update_parser.add_argument(
|
|
193
|
-
"-r",
|
|
194
|
-
"--ros-domain-id",
|
|
195
|
-
type=int,
|
|
196
|
-
default=30,
|
|
197
|
-
metavar="ID",
|
|
198
|
-
help="ROS2 domain ID for cyclo_manager up (default: 30)",
|
|
199
|
-
)
|
|
200
178
|
update_parser.add_argument(
|
|
201
179
|
"--pull",
|
|
202
180
|
action="store_true",
|
{cyclo_manager-0.1.0.dev2 → cyclo_manager-0.1.1.dev0}/cyclo_manager_cli/docker/docker-compose.yml
RENAMED
|
@@ -11,7 +11,7 @@ services:
|
|
|
11
11
|
|
|
12
12
|
cyclo_manager:
|
|
13
13
|
container_name: cyclo_manager
|
|
14
|
-
image: robotis/cyclo-manager:0.1.
|
|
14
|
+
image: robotis/cyclo-manager:0.1.1-test
|
|
15
15
|
restart: always
|
|
16
16
|
network_mode: host
|
|
17
17
|
volumes:
|
|
@@ -22,11 +22,10 @@ services:
|
|
|
22
22
|
- /var/run/docker.sock:/var/run/docker.sock # For Docker API access
|
|
23
23
|
environment:
|
|
24
24
|
- CONFIG_FILE=/app/config.yml
|
|
25
|
-
- ROS_DOMAIN_ID=${ROS_DOMAIN_ID:-30}
|
|
26
25
|
|
|
27
26
|
ui:
|
|
28
27
|
container_name: cyclo_manager_ui
|
|
29
|
-
image: robotis/cyclo-manager-ui:0.1.0
|
|
28
|
+
image: robotis/cyclo-manager-ui:0.1.0-test
|
|
30
29
|
restart: always
|
|
31
30
|
network_mode: host
|
|
32
31
|
environment:
|
|
@@ -45,7 +44,6 @@ services:
|
|
|
45
44
|
memlock: 8428281856
|
|
46
45
|
network_mode: host
|
|
47
46
|
environment:
|
|
48
|
-
- ROS_DOMAIN_ID=${ROS_DOMAIN_ID:-30}
|
|
49
47
|
- DISPLAY=:99
|
|
50
48
|
- DISPLAY_WIDTH=1920
|
|
51
49
|
- DISPLAY_HEIGHT=1080
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "cyclo-manager"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.1.dev0"
|
|
8
8
|
description = "cyclo_manager CLI: pip-installable launcher for cyclo_manager server and UI containers. Run 'cyclo_manager up' to start Docker stack."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: cyclo-manager
|
|
3
|
-
Version: 0.1.0.dev2
|
|
4
|
-
Summary: cyclo_manager CLI: pip-installable launcher for cyclo_manager server and UI containers. Run 'cyclo_manager up' to start Docker stack.
|
|
5
|
-
License-Expression: Apache-2.0
|
|
6
|
-
Requires-Python: >=3.10
|
|
7
|
-
Description-Content-Type: text/markdown
|
|
8
|
-
Provides-Extra: dev
|
|
9
|
-
Requires-Dist: pytest; extra == "dev"
|
|
10
|
-
Requires-Dist: ruff; extra == "dev"
|
|
11
|
-
|
|
12
|
-
# cyclo_manager CLI
|
|
13
|
-
|
|
14
|
-
`cyclo-manager` is a small **pip-installable CLI** that brings up the cyclo_manager stack using **Docker Compose v2**. It runs the packaged [`docker-compose.yml`](cyclo_manager_cli/docker/docker-compose.yml): starts the API and web UI, **creates** (but does not start) optional Zenoh and noVNC containers, and can **self-update** via PyPI.
|
|
15
|
-
|
|
16
|
-
The console script name is **`cyclo_manager`** (underscore).
|
|
17
|
-
|
|
18
|
-
## Prerequisites
|
|
19
|
-
|
|
20
|
-
- **Docker** with **Compose v2** (`docker compose`, not only legacy `docker-compose`)
|
|
21
|
-
- **Python 3.10+**
|
|
22
|
-
- For **`cyclo_manager update`**: **`pip`** / **`pip3`** on `PATH`
|
|
23
|
-
|
|
24
|
-
## Installation
|
|
25
|
-
|
|
26
|
-
Build and install a wheel (package name on PyPI / `pyproject.toml` is **`cyclo-manager`**):
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
python -m build --wheel
|
|
30
|
-
pip install dist/cyclo_manager-*.whl
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
If `cyclo_manager` is not found, add the user scripts directory to `PATH`:
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
export PATH="$HOME/.local/bin:$PATH"
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
After install, use the CLI by name:
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
cyclo_manager --help
|
|
43
|
-
cyclo_manager up
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
(If the script is still missing from `PATH`, you can run the same subcommands via `python3 -m cyclo_manager_cli.cli`, e.g. `python3 -m cyclo_manager_cli.cli up`.)
|
|
47
|
-
|
|
48
|
-
## Commands
|
|
49
|
-
|
|
50
|
-
| Command | What it does |
|
|
51
|
-
|--------|----------------|
|
|
52
|
-
| `cyclo_manager up` | `docker compose up -d` for **`cyclo_manager`** and **`ui`**; then `docker compose create --no-recreate` for **`rmw_zenoh`** and **`novnc-server`** so those containers exist but stay **stopped** |
|
|
53
|
-
| `cyclo_manager up -c /path/to/config.yml` | Same as `up`, but mounts this file into the API container as config. If the path does not exist, the CLI **copies** the bundled default config there first |
|
|
54
|
-
| `cyclo_manager up -r 35` | Sets **`ROS_DOMAIN_ID`** for the stack (default: **30**) |
|
|
55
|
-
| `cyclo_manager up --pull` | Runs `docker compose pull` before up/create |
|
|
56
|
-
| `cyclo_manager down` | `docker compose down` for the **packaged** compose file (stops/removes containers for that project) |
|
|
57
|
-
| `cyclo_manager update` | Runs `cyclo_manager down`, then `pip install -U cyclo-manager`, then `cyclo_manager up` again (optional `-c`, `-r`, `--pull` are forwarded to `up`) |
|
|
58
|
-
| `cyclo_manager --help` | Top-level help |
|
|
59
|
-
|
|
60
|
-
Implementation reference: [`cyclo_manager_cli/cli.py`](cyclo_manager_cli/cli.py).
|
|
61
|
-
|
|
62
|
-
### Compose services vs container names
|
|
63
|
-
|
|
64
|
-
| Compose service | Typical container name | `up` behavior |
|
|
65
|
-
|-----------------|------------------------|---------------|
|
|
66
|
-
| `cyclo_manager` | `cyclo_manager` | Started |
|
|
67
|
-
| `ui` | `cyclo_manager_ui` | Started |
|
|
68
|
-
| `rmw_zenoh` | `zenoh_daemon` | **Created only** (start from Control UI or `docker start zenoh_daemon`) |
|
|
69
|
-
| `novnc-server` | `novnc-server` | **Created only** (start when needed, e.g. `docker start novnc-server`) |
|
|
70
|
-
|
|
71
|
-
### Environment passed into Compose
|
|
72
|
-
|
|
73
|
-
- **`CYCLO_MANAGER_CONFIG_FILE`**: absolute path to the YAML config used on the host (default: bundled [`config/config.yml`](cyclo_manager_cli/config/config.yml))
|
|
74
|
-
- **`ROS_DOMAIN_ID`**: from `-r` / `--ros-domain-id` (default **30**)
|
|
75
|
-
|
|
76
|
-
`cyclo_manager down` always sets `CYCLO_MANAGER_CONFIG_FILE` to the **bundled** config path when invoking Compose (see `cmd_down` in `cli.py`).
|
|
77
|
-
|
|
78
|
-
## Bundled config
|
|
79
|
-
|
|
80
|
-
Default file: [`cyclo_manager_cli/config/config.yml`](cyclo_manager_cli/config/config.yml).
|
|
81
|
-
|
|
82
|
-
It lists **managed containers** and **agent Unix socket paths** (host paths mounted under `/agents` in the API container), for example:
|
|
83
|
-
|
|
84
|
-
- `ai_worker` → `/agents/ai_worker/s6_agent.sock`
|
|
85
|
-
- `physical_ai_server` → `/agents/physical_ai_server/s6_agent.sock`
|
|
86
|
-
|
|
87
|
-
Service names inside each container come from the agent, not from this file.
|
|
88
|
-
|
|
89
|
-
## URLs (packaged compose, `network_mode: host`)
|
|
90
|
-
|
|
91
|
-
After `cyclo_manager up`:
|
|
92
|
-
|
|
93
|
-
| Service | URL |
|
|
94
|
-
|---------|-----|
|
|
95
|
-
| cyclo_manager API | http://127.0.0.1:8081 |
|
|
96
|
-
| OpenAPI docs | http://127.0.0.1:8081/docs |
|
|
97
|
-
| Web UI | http://127.0.0.1:3000 |
|
|
98
|
-
|
|
99
|
-
Images and tags are defined in [`docker/docker-compose.yml`](cyclo_manager_cli/docker/docker-compose.yml) (e.g. `robotis/cyclo-manager`, `robotis/cyclo-manager-ui`).
|
|
100
|
-
|
|
101
|
-
## Development from the repository root
|
|
102
|
-
|
|
103
|
-
To run against **local** images and mounts (not the pip-bundled compose), use the root compose and config — see the main [project README](../README.md) and `docker-compose.dev.yml`.
|
|
104
|
-
|
|
105
|
-
## Dependencies
|
|
106
|
-
|
|
107
|
-
The CLI package itself declares **no** Python dependencies (`pyproject.toml`); it shells out to **`docker compose`** and optionally **`pip`**.
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
# cyclo_manager CLI
|
|
2
|
-
|
|
3
|
-
`cyclo-manager` is a small **pip-installable CLI** that brings up the cyclo_manager stack using **Docker Compose v2**. It runs the packaged [`docker-compose.yml`](cyclo_manager_cli/docker/docker-compose.yml): starts the API and web UI, **creates** (but does not start) optional Zenoh and noVNC containers, and can **self-update** via PyPI.
|
|
4
|
-
|
|
5
|
-
The console script name is **`cyclo_manager`** (underscore).
|
|
6
|
-
|
|
7
|
-
## Prerequisites
|
|
8
|
-
|
|
9
|
-
- **Docker** with **Compose v2** (`docker compose`, not only legacy `docker-compose`)
|
|
10
|
-
- **Python 3.10+**
|
|
11
|
-
- For **`cyclo_manager update`**: **`pip`** / **`pip3`** on `PATH`
|
|
12
|
-
|
|
13
|
-
## Installation
|
|
14
|
-
|
|
15
|
-
Build and install a wheel (package name on PyPI / `pyproject.toml` is **`cyclo-manager`**):
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
python -m build --wheel
|
|
19
|
-
pip install dist/cyclo_manager-*.whl
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
If `cyclo_manager` is not found, add the user scripts directory to `PATH`:
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
export PATH="$HOME/.local/bin:$PATH"
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
After install, use the CLI by name:
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
cyclo_manager --help
|
|
32
|
-
cyclo_manager up
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
(If the script is still missing from `PATH`, you can run the same subcommands via `python3 -m cyclo_manager_cli.cli`, e.g. `python3 -m cyclo_manager_cli.cli up`.)
|
|
36
|
-
|
|
37
|
-
## Commands
|
|
38
|
-
|
|
39
|
-
| Command | What it does |
|
|
40
|
-
|--------|----------------|
|
|
41
|
-
| `cyclo_manager up` | `docker compose up -d` for **`cyclo_manager`** and **`ui`**; then `docker compose create --no-recreate` for **`rmw_zenoh`** and **`novnc-server`** so those containers exist but stay **stopped** |
|
|
42
|
-
| `cyclo_manager up -c /path/to/config.yml` | Same as `up`, but mounts this file into the API container as config. If the path does not exist, the CLI **copies** the bundled default config there first |
|
|
43
|
-
| `cyclo_manager up -r 35` | Sets **`ROS_DOMAIN_ID`** for the stack (default: **30**) |
|
|
44
|
-
| `cyclo_manager up --pull` | Runs `docker compose pull` before up/create |
|
|
45
|
-
| `cyclo_manager down` | `docker compose down` for the **packaged** compose file (stops/removes containers for that project) |
|
|
46
|
-
| `cyclo_manager update` | Runs `cyclo_manager down`, then `pip install -U cyclo-manager`, then `cyclo_manager up` again (optional `-c`, `-r`, `--pull` are forwarded to `up`) |
|
|
47
|
-
| `cyclo_manager --help` | Top-level help |
|
|
48
|
-
|
|
49
|
-
Implementation reference: [`cyclo_manager_cli/cli.py`](cyclo_manager_cli/cli.py).
|
|
50
|
-
|
|
51
|
-
### Compose services vs container names
|
|
52
|
-
|
|
53
|
-
| Compose service | Typical container name | `up` behavior |
|
|
54
|
-
|-----------------|------------------------|---------------|
|
|
55
|
-
| `cyclo_manager` | `cyclo_manager` | Started |
|
|
56
|
-
| `ui` | `cyclo_manager_ui` | Started |
|
|
57
|
-
| `rmw_zenoh` | `zenoh_daemon` | **Created only** (start from Control UI or `docker start zenoh_daemon`) |
|
|
58
|
-
| `novnc-server` | `novnc-server` | **Created only** (start when needed, e.g. `docker start novnc-server`) |
|
|
59
|
-
|
|
60
|
-
### Environment passed into Compose
|
|
61
|
-
|
|
62
|
-
- **`CYCLO_MANAGER_CONFIG_FILE`**: absolute path to the YAML config used on the host (default: bundled [`config/config.yml`](cyclo_manager_cli/config/config.yml))
|
|
63
|
-
- **`ROS_DOMAIN_ID`**: from `-r` / `--ros-domain-id` (default **30**)
|
|
64
|
-
|
|
65
|
-
`cyclo_manager down` always sets `CYCLO_MANAGER_CONFIG_FILE` to the **bundled** config path when invoking Compose (see `cmd_down` in `cli.py`).
|
|
66
|
-
|
|
67
|
-
## Bundled config
|
|
68
|
-
|
|
69
|
-
Default file: [`cyclo_manager_cli/config/config.yml`](cyclo_manager_cli/config/config.yml).
|
|
70
|
-
|
|
71
|
-
It lists **managed containers** and **agent Unix socket paths** (host paths mounted under `/agents` in the API container), for example:
|
|
72
|
-
|
|
73
|
-
- `ai_worker` → `/agents/ai_worker/s6_agent.sock`
|
|
74
|
-
- `physical_ai_server` → `/agents/physical_ai_server/s6_agent.sock`
|
|
75
|
-
|
|
76
|
-
Service names inside each container come from the agent, not from this file.
|
|
77
|
-
|
|
78
|
-
## URLs (packaged compose, `network_mode: host`)
|
|
79
|
-
|
|
80
|
-
After `cyclo_manager up`:
|
|
81
|
-
|
|
82
|
-
| Service | URL |
|
|
83
|
-
|---------|-----|
|
|
84
|
-
| cyclo_manager API | http://127.0.0.1:8081 |
|
|
85
|
-
| OpenAPI docs | http://127.0.0.1:8081/docs |
|
|
86
|
-
| Web UI | http://127.0.0.1:3000 |
|
|
87
|
-
|
|
88
|
-
Images and tags are defined in [`docker/docker-compose.yml`](cyclo_manager_cli/docker/docker-compose.yml) (e.g. `robotis/cyclo-manager`, `robotis/cyclo-manager-ui`).
|
|
89
|
-
|
|
90
|
-
## Development from the repository root
|
|
91
|
-
|
|
92
|
-
To run against **local** images and mounts (not the pip-bundled compose), use the root compose and config — see the main [project README](../README.md) and `docker-compose.dev.yml`.
|
|
93
|
-
|
|
94
|
-
## Dependencies
|
|
95
|
-
|
|
96
|
-
The CLI package itself declares **no** Python dependencies (`pyproject.toml`); it shells out to **`docker compose`** and optionally **`pip`**.
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: cyclo-manager
|
|
3
|
-
Version: 0.1.0.dev2
|
|
4
|
-
Summary: cyclo_manager CLI: pip-installable launcher for cyclo_manager server and UI containers. Run 'cyclo_manager up' to start Docker stack.
|
|
5
|
-
License-Expression: Apache-2.0
|
|
6
|
-
Requires-Python: >=3.10
|
|
7
|
-
Description-Content-Type: text/markdown
|
|
8
|
-
Provides-Extra: dev
|
|
9
|
-
Requires-Dist: pytest; extra == "dev"
|
|
10
|
-
Requires-Dist: ruff; extra == "dev"
|
|
11
|
-
|
|
12
|
-
# cyclo_manager CLI
|
|
13
|
-
|
|
14
|
-
`cyclo-manager` is a small **pip-installable CLI** that brings up the cyclo_manager stack using **Docker Compose v2**. It runs the packaged [`docker-compose.yml`](cyclo_manager_cli/docker/docker-compose.yml): starts the API and web UI, **creates** (but does not start) optional Zenoh and noVNC containers, and can **self-update** via PyPI.
|
|
15
|
-
|
|
16
|
-
The console script name is **`cyclo_manager`** (underscore).
|
|
17
|
-
|
|
18
|
-
## Prerequisites
|
|
19
|
-
|
|
20
|
-
- **Docker** with **Compose v2** (`docker compose`, not only legacy `docker-compose`)
|
|
21
|
-
- **Python 3.10+**
|
|
22
|
-
- For **`cyclo_manager update`**: **`pip`** / **`pip3`** on `PATH`
|
|
23
|
-
|
|
24
|
-
## Installation
|
|
25
|
-
|
|
26
|
-
Build and install a wheel (package name on PyPI / `pyproject.toml` is **`cyclo-manager`**):
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
python -m build --wheel
|
|
30
|
-
pip install dist/cyclo_manager-*.whl
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
If `cyclo_manager` is not found, add the user scripts directory to `PATH`:
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
export PATH="$HOME/.local/bin:$PATH"
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
After install, use the CLI by name:
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
cyclo_manager --help
|
|
43
|
-
cyclo_manager up
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
(If the script is still missing from `PATH`, you can run the same subcommands via `python3 -m cyclo_manager_cli.cli`, e.g. `python3 -m cyclo_manager_cli.cli up`.)
|
|
47
|
-
|
|
48
|
-
## Commands
|
|
49
|
-
|
|
50
|
-
| Command | What it does |
|
|
51
|
-
|--------|----------------|
|
|
52
|
-
| `cyclo_manager up` | `docker compose up -d` for **`cyclo_manager`** and **`ui`**; then `docker compose create --no-recreate` for **`rmw_zenoh`** and **`novnc-server`** so those containers exist but stay **stopped** |
|
|
53
|
-
| `cyclo_manager up -c /path/to/config.yml` | Same as `up`, but mounts this file into the API container as config. If the path does not exist, the CLI **copies** the bundled default config there first |
|
|
54
|
-
| `cyclo_manager up -r 35` | Sets **`ROS_DOMAIN_ID`** for the stack (default: **30**) |
|
|
55
|
-
| `cyclo_manager up --pull` | Runs `docker compose pull` before up/create |
|
|
56
|
-
| `cyclo_manager down` | `docker compose down` for the **packaged** compose file (stops/removes containers for that project) |
|
|
57
|
-
| `cyclo_manager update` | Runs `cyclo_manager down`, then `pip install -U cyclo-manager`, then `cyclo_manager up` again (optional `-c`, `-r`, `--pull` are forwarded to `up`) |
|
|
58
|
-
| `cyclo_manager --help` | Top-level help |
|
|
59
|
-
|
|
60
|
-
Implementation reference: [`cyclo_manager_cli/cli.py`](cyclo_manager_cli/cli.py).
|
|
61
|
-
|
|
62
|
-
### Compose services vs container names
|
|
63
|
-
|
|
64
|
-
| Compose service | Typical container name | `up` behavior |
|
|
65
|
-
|-----------------|------------------------|---------------|
|
|
66
|
-
| `cyclo_manager` | `cyclo_manager` | Started |
|
|
67
|
-
| `ui` | `cyclo_manager_ui` | Started |
|
|
68
|
-
| `rmw_zenoh` | `zenoh_daemon` | **Created only** (start from Control UI or `docker start zenoh_daemon`) |
|
|
69
|
-
| `novnc-server` | `novnc-server` | **Created only** (start when needed, e.g. `docker start novnc-server`) |
|
|
70
|
-
|
|
71
|
-
### Environment passed into Compose
|
|
72
|
-
|
|
73
|
-
- **`CYCLO_MANAGER_CONFIG_FILE`**: absolute path to the YAML config used on the host (default: bundled [`config/config.yml`](cyclo_manager_cli/config/config.yml))
|
|
74
|
-
- **`ROS_DOMAIN_ID`**: from `-r` / `--ros-domain-id` (default **30**)
|
|
75
|
-
|
|
76
|
-
`cyclo_manager down` always sets `CYCLO_MANAGER_CONFIG_FILE` to the **bundled** config path when invoking Compose (see `cmd_down` in `cli.py`).
|
|
77
|
-
|
|
78
|
-
## Bundled config
|
|
79
|
-
|
|
80
|
-
Default file: [`cyclo_manager_cli/config/config.yml`](cyclo_manager_cli/config/config.yml).
|
|
81
|
-
|
|
82
|
-
It lists **managed containers** and **agent Unix socket paths** (host paths mounted under `/agents` in the API container), for example:
|
|
83
|
-
|
|
84
|
-
- `ai_worker` → `/agents/ai_worker/s6_agent.sock`
|
|
85
|
-
- `physical_ai_server` → `/agents/physical_ai_server/s6_agent.sock`
|
|
86
|
-
|
|
87
|
-
Service names inside each container come from the agent, not from this file.
|
|
88
|
-
|
|
89
|
-
## URLs (packaged compose, `network_mode: host`)
|
|
90
|
-
|
|
91
|
-
After `cyclo_manager up`:
|
|
92
|
-
|
|
93
|
-
| Service | URL |
|
|
94
|
-
|---------|-----|
|
|
95
|
-
| cyclo_manager API | http://127.0.0.1:8081 |
|
|
96
|
-
| OpenAPI docs | http://127.0.0.1:8081/docs |
|
|
97
|
-
| Web UI | http://127.0.0.1:3000 |
|
|
98
|
-
|
|
99
|
-
Images and tags are defined in [`docker/docker-compose.yml`](cyclo_manager_cli/docker/docker-compose.yml) (e.g. `robotis/cyclo-manager`, `robotis/cyclo-manager-ui`).
|
|
100
|
-
|
|
101
|
-
## Development from the repository root
|
|
102
|
-
|
|
103
|
-
To run against **local** images and mounts (not the pip-bundled compose), use the root compose and config — see the main [project README](../README.md) and `docker-compose.dev.yml`.
|
|
104
|
-
|
|
105
|
-
## Dependencies
|
|
106
|
-
|
|
107
|
-
The CLI package itself declares **no** Python dependencies (`pyproject.toml`); it shells out to **`docker compose`** and optionally **`pip`**.
|
|
File without changes
|
{cyclo_manager-0.1.0.dev2 → cyclo_manager-0.1.1.dev0}/cyclo_manager.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{cyclo_manager-0.1.0.dev2 → cyclo_manager-0.1.1.dev0}/cyclo_manager.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|