caasi 0.1.0__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.
Files changed (121) hide show
  1. caasi-0.1.0/.gitignore +26 -0
  2. caasi-0.1.0/LICENSE +21 -0
  3. caasi-0.1.0/PKG-INFO +178 -0
  4. caasi-0.1.0/README.md +147 -0
  5. caasi-0.1.0/docs/.nojekyll +0 -0
  6. caasi-0.1.0/docs/assets/copy.js +98 -0
  7. caasi-0.1.0/docs/assets/sidebar.js +151 -0
  8. caasi-0.1.0/docs/assets/style.css +537 -0
  9. caasi-0.1.0/docs/assets/theme.js +106 -0
  10. caasi-0.1.0/docs/configuration.html +257 -0
  11. caasi-0.1.0/docs/data.html +257 -0
  12. caasi-0.1.0/docs/environment.html +283 -0
  13. caasi-0.1.0/docs/index.html +283 -0
  14. caasi-0.1.0/docs/native.html +290 -0
  15. caasi-0.1.0/docs/projects.html +246 -0
  16. caasi-0.1.0/docs/remote.html +359 -0
  17. caasi-0.1.0/docs/review.html +164 -0
  18. caasi-0.1.0/docs/ros.html +364 -0
  19. caasi-0.1.0/docs/runs.html +248 -0
  20. caasi-0.1.0/docs/simulation.html +212 -0
  21. caasi-0.1.0/docs/training.html +188 -0
  22. caasi-0.1.0/examples/navigation.yaml +28 -0
  23. caasi-0.1.0/pyproject.toml +49 -0
  24. caasi-0.1.0/src/caasi/__init__.py +7 -0
  25. caasi-0.1.0/src/caasi/checks/__init__.py +96 -0
  26. caasi-0.1.0/src/caasi/checks/containers.py +35 -0
  27. caasi-0.1.0/src/caasi/checks/graphics.py +50 -0
  28. caasi-0.1.0/src/caasi/checks/hardware.py +47 -0
  29. caasi-0.1.0/src/caasi/checks/isaac.py +99 -0
  30. caasi-0.1.0/src/caasi/checks/ml.py +42 -0
  31. caasi-0.1.0/src/caasi/checks/nvidia.py +70 -0
  32. caasi-0.1.0/src/caasi/checks/python_env.py +51 -0
  33. caasi-0.1.0/src/caasi/checks/robotics.py +54 -0
  34. caasi-0.1.0/src/caasi/checks/ros.py +63 -0
  35. caasi-0.1.0/src/caasi/checks/simulators.py +41 -0
  36. caasi-0.1.0/src/caasi/checks/storage.py +39 -0
  37. caasi-0.1.0/src/caasi/checks/system.py +40 -0
  38. caasi-0.1.0/src/caasi/checks/vision.py +41 -0
  39. caasi-0.1.0/src/caasi/cli/__init__.py +1 -0
  40. caasi-0.1.0/src/caasi/cli/benchmark_cmd.py +111 -0
  41. caasi-0.1.0/src/caasi/cli/config_cmd.py +126 -0
  42. caasi-0.1.0/src/caasi/cli/container_cmd.py +107 -0
  43. caasi-0.1.0/src/caasi/cli/control_cmd.py +132 -0
  44. caasi-0.1.0/src/caasi/cli/dataset_cmd.py +195 -0
  45. caasi-0.1.0/src/caasi/cli/definitions.py +114 -0
  46. caasi-0.1.0/src/caasi/cli/doctor.py +98 -0
  47. caasi-0.1.0/src/caasi/cli/gpu.py +165 -0
  48. caasi-0.1.0/src/caasi/cli/init_cmd.py +37 -0
  49. caasi-0.1.0/src/caasi/cli/lab.py +47 -0
  50. caasi-0.1.0/src/caasi/cli/main.py +126 -0
  51. caasi-0.1.0/src/caasi/cli/misc.py +120 -0
  52. caasi-0.1.0/src/caasi/cli/moveit_cmd.py +151 -0
  53. caasi-0.1.0/src/caasi/cli/native_cmd.py +119 -0
  54. caasi-0.1.0/src/caasi/cli/nav_cmd.py +177 -0
  55. caasi-0.1.0/src/caasi/cli/project_cmd.py +67 -0
  56. caasi-0.1.0/src/caasi/cli/remote_cmd.py +114 -0
  57. caasi-0.1.0/src/caasi/cli/replay_cmd.py +75 -0
  58. caasi-0.1.0/src/caasi/cli/ros_cmd.py +217 -0
  59. caasi-0.1.0/src/caasi/cli/run_cmd.py +207 -0
  60. caasi-0.1.0/src/caasi/cli/sensor_cmd.py +105 -0
  61. caasi-0.1.0/src/caasi/cli/setup_cmd.py +103 -0
  62. caasi-0.1.0/src/caasi/cli/shell_cmd.py +53 -0
  63. caasi-0.1.0/src/caasi/cli/sim.py +167 -0
  64. caasi-0.1.0/src/caasi/cli/system.py +148 -0
  65. caasi-0.1.0/src/caasi/cli/train_cmd.py +94 -0
  66. caasi-0.1.0/src/caasi/cli/view_cmd.py +93 -0
  67. caasi-0.1.0/src/caasi/cli/vision_cmd.py +121 -0
  68. caasi-0.1.0/src/caasi/core/__init__.py +1 -0
  69. caasi-0.1.0/src/caasi/core/benchmark.py +46 -0
  70. caasi-0.1.0/src/caasi/core/config.py +240 -0
  71. caasi-0.1.0/src/caasi/core/containers.py +56 -0
  72. caasi-0.1.0/src/caasi/core/dataset.py +196 -0
  73. caasi-0.1.0/src/caasi/core/experiment.py +178 -0
  74. caasi-0.1.0/src/caasi/core/nvidia.py +133 -0
  75. caasi-0.1.0/src/caasi/core/project.py +187 -0
  76. caasi-0.1.0/src/caasi/core/remotes.py +89 -0
  77. caasi-0.1.0/src/caasi/core/ros.py +89 -0
  78. caasi-0.1.0/src/caasi/core/runs.py +369 -0
  79. caasi-0.1.0/src/caasi/core/sensors.py +130 -0
  80. caasi-0.1.0/src/caasi/core/viewers.py +99 -0
  81. caasi-0.1.0/src/caasi/core/vision.py +58 -0
  82. caasi-0.1.0/src/caasi/i18n/__init__.py +78 -0
  83. caasi-0.1.0/src/caasi/i18n/en.py +678 -0
  84. caasi-0.1.0/src/caasi/state.py +69 -0
  85. caasi-0.1.0/src/caasi/utils/__init__.py +1 -0
  86. caasi-0.1.0/src/caasi/utils/output.py +64 -0
  87. caasi-0.1.0/src/caasi/utils/pydist.py +18 -0
  88. caasi-0.1.0/src/caasi/utils/shell.py +57 -0
  89. caasi-0.1.0/src/caasi/utils/sysinfo.py +120 -0
  90. caasi-0.1.0/tests/__init__.py +1 -0
  91. caasi-0.1.0/tests/conftest.py +115 -0
  92. caasi-0.1.0/tests/test_benchmark_cmd.py +107 -0
  93. caasi-0.1.0/tests/test_config.py +159 -0
  94. caasi-0.1.0/tests/test_container_cmd.py +189 -0
  95. caasi-0.1.0/tests/test_control_cmd.py +133 -0
  96. caasi-0.1.0/tests/test_dataset_cmd.py +189 -0
  97. caasi-0.1.0/tests/test_definitions_cmd.py +101 -0
  98. caasi-0.1.0/tests/test_doctor.py +63 -0
  99. caasi-0.1.0/tests/test_experiment.py +189 -0
  100. caasi-0.1.0/tests/test_gpu.py +84 -0
  101. caasi-0.1.0/tests/test_i18n.py +76 -0
  102. caasi-0.1.0/tests/test_lab.py +50 -0
  103. caasi-0.1.0/tests/test_misc.py +42 -0
  104. caasi-0.1.0/tests/test_moveit_cmd.py +110 -0
  105. caasi-0.1.0/tests/test_native_cmd.py +104 -0
  106. caasi-0.1.0/tests/test_nav_cmd.py +120 -0
  107. caasi-0.1.0/tests/test_project.py +106 -0
  108. caasi-0.1.0/tests/test_project_cmd.py +89 -0
  109. caasi-0.1.0/tests/test_remote_cmd.py +159 -0
  110. caasi-0.1.0/tests/test_replay_cmd.py +154 -0
  111. caasi-0.1.0/tests/test_ros_cmd.py +277 -0
  112. caasi-0.1.0/tests/test_run_cmd.py +153 -0
  113. caasi-0.1.0/tests/test_runs.py +114 -0
  114. caasi-0.1.0/tests/test_sensors_cmd.py +103 -0
  115. caasi-0.1.0/tests/test_setup_cmd.py +64 -0
  116. caasi-0.1.0/tests/test_sim.py +121 -0
  117. caasi-0.1.0/tests/test_system.py +67 -0
  118. caasi-0.1.0/tests/test_train_cmd.py +76 -0
  119. caasi-0.1.0/tests/test_view_cmd.py +138 -0
  120. caasi-0.1.0/tests/test_vision_cmd.py +108 -0
  121. caasi-0.1.0/uv.lock +296 -0
caasi-0.1.0/.gitignore ADDED
@@ -0,0 +1,26 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ build/
6
+ dist/
7
+ .eggs/
8
+
9
+ # Environments
10
+ .venv/
11
+ venv/
12
+ .env
13
+
14
+ # Tooling caches
15
+ .pytest_cache/
16
+ .mypy_cache/
17
+ .ruff_cache/
18
+
19
+ # Caasi runtime artifacts
20
+ runs/
21
+ datasets/
22
+
23
+ # Editors / OS
24
+ .idea/
25
+ .vscode/
26
+ .DS_Store
caasi-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 a6y3ap (https://github.com/a6y3ap)
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.
caasi-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,178 @@
1
+ Metadata-Version: 2.5
2
+ Name: caasi
3
+ Version: 0.1.0
4
+ Summary: A lightweight, CLI-first orchestration layer for NVIDIA Isaac Sim, Isaac Lab and the robotics ecosystem.
5
+ Project-URL: Homepage, https://github.com/a6y3ap/caasi
6
+ Project-URL: Repository, https://github.com/a6y3ap/caasi
7
+ Project-URL: Documentation, https://a6y3ap.github.io/caasi/
8
+ Project-URL: Issues, https://github.com/a6y3ap/caasi/issues
9
+ Author: a6y3ap
10
+ License: MIT
11
+ License-File: LICENSE
12
+ Keywords: caasi,cli,isaac,isaac-lab,isaac-sim,robotics,ros2,simulation
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Intended Audience :: Science/Research
17
+ Classifier: License :: OSI Approved :: MIT License
18
+ Classifier: Operating System :: POSIX :: Linux
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Topic :: Scientific/Engineering
24
+ Requires-Python: >=3.10
25
+ Requires-Dist: pyyaml>=6.0
26
+ Requires-Dist: rich>=13.7
27
+ Requires-Dist: typer>=0.12
28
+ Provides-Extra: dev
29
+ Requires-Dist: pytest>=8.0; extra == 'dev'
30
+ Description-Content-Type: text/markdown
31
+
32
+ # Caasi
33
+
34
+ A lightweight, **CLI-first orchestration layer** for NVIDIA Isaac Sim, Isaac Lab and the
35
+ wider robotics ecosystem (ROS 2, Nav2, MoveIt 2, ros2\_control, ...).
36
+
37
+ Headless-first. CLI-first. Process-oriented. Visualization-independent.
38
+
39
+ **Documentation:** <https://a6y3ap.github.io/caasi/>
40
+
41
+ > **Note:** Caasi is an independent open-source project. It is not affiliated with,
42
+ > endorsed by, or an official product of NVIDIA.
43
+
44
+ ## Philosophy
45
+
46
+ - **Use existing software. Don't reinvent it.** Caasi discovers, configures, launches,
47
+ connects, monitors and manages tools that already exist.
48
+ - **Simulation is not visualization.** Run headless by default; attach a viewer only when needed.
49
+ - **Minimum required stack.** The Caasi process itself stays lightweight and never imports the
50
+ heavy Isaac stack, PyTorch or rclpy — it only delegates to them.
51
+ - **Don't become another ROS.** ROS orchestration is delegated to the real `ros2` tooling.
52
+ - **Unix-friendly.** Small commands, `--json` output, sensible exit codes.
53
+
54
+ ## Install
55
+
56
+ Requires Python 3.10+ on Linux. The Isaac stack, ROS 2 and PyTorch are *discovered*, not
57
+ installed, by Caasi.
58
+
59
+ ```bash
60
+ pip install caasi
61
+ ```
62
+
63
+ Or from source:
64
+
65
+ ```bash
66
+ git clone https://github.com/a6y3ap/caasi.git
67
+ cd caasi
68
+ pip install -e . # add pytest as well: pip install -e ".[dev]"
69
+ ```
70
+
71
+ Either way this installs the `caasi` command. Shell completion is available:
72
+
73
+ ```bash
74
+ caasi --install-completion
75
+ ```
76
+
77
+ ## Quickstart
78
+
79
+ ```bash
80
+ caasi doctor # diagnose the whole environment
81
+ caasi doctor --component nvidia # one section only
82
+ caasi gpu status # GPU overview via nvidia-smi
83
+ caasi system status # OS / CPU / RAM / disk summary
84
+ caasi info # CLI + configured/detected ecosystem versions
85
+ caasi config show # effective configuration
86
+ caasi config set tools.isaacsim.default "6.0"
87
+ ```
88
+
89
+ Every command supports `--help`. Data commands support `--json` for scripting:
90
+
91
+ ```bash
92
+ caasi gpu status --json | jq '.gpus[0]["memory.used"]'
93
+ if caasi doctor --quiet; then echo "environment ready"; fi
94
+ ```
95
+
96
+ Simulations, training jobs and ROS launches start **detached** and are tracked as *runs* —
97
+ the CLI returns immediately and the work survives your terminal:
98
+
99
+ ```bash
100
+ caasi sim run experiments/wave.yaml
101
+ caasi run list
102
+ caasi logs latest --follow # Ctrl+C stops following, the run keeps going
103
+ caasi run status latest
104
+ ```
105
+
106
+ ## Command surface
107
+
108
+ | Group | Commands | Reference |
109
+ | ------------------- | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
110
+ | Environment | `doctor`, `gpu status\|info\|memory\|test`, `system status\|memory\|processes`, `info`, `version` | [environment.html](https://a6y3ap.github.io/caasi/environment.html) |
111
+ | Configuration | `config show\|get\|set\|path\|tools` | [configuration.html](https://a6y3ap.github.io/caasi/configuration.html) |
112
+ | Projects | `init`, `setup`, `project info\|validate`, `robot`, `scene`, `task` | [projects.html](https://a6y3ap.github.io/caasi/projects.html) |
113
+ | Runs & logs | `run list\|status\|logs\|stop\|pause\|resume\|delete\|inspect`, `logs` | [runs.html](https://a6y3ap.github.io/caasi/runs.html) |
114
+ | Simulation | `sim run\|status\|check\|stop\|pause\|resume`, `lab status` | [simulation.html](https://a6y3ap.github.io/caasi/simulation.html) |
115
+ | Training | `train`, `benchmark start\|report` | [training.html](https://a6y3ap.github.io/caasi/training.html) |
116
+ | Data & sensors | `dataset generate\|inspect\|convert\|validate`, `sensor list\|inspect\|test`, `vision status\|inspect\|test` | [data.html](https://a6y3ap.github.io/caasi/data.html) |
117
+ | Review | `replay`, `view rviz\|foxglove\|open3d\|attach` | [review.html](https://a6y3ap.github.io/caasi/review.html) |
118
+ | ROS ecosystem | `ros status\|doctor\|list\|launch\|topic\|node\|graph`, `nav status\|launch\|inspect\|test`, `moveit status\|launch\|plan\|test`, `control status\|list\|check` | [ros.html](https://a6y3ap.github.io/caasi/ros.html) |
119
+ | Native & shell | `native run\|sim\|lab\|ros`, `shell` | [native.html](https://a6y3ap.github.io/caasi/native.html) |
120
+ | Remote & containers | `remote list\|connect\|run`, `container list\|check\|run` | [remote.html](https://a6y3ap.github.io/caasi/remote.html) |
121
+
122
+ More examples:
123
+
124
+ ```bash
125
+ caasi train experiments/ant.yaml --steps 500000 --envs 4096
126
+ caasi ros status && caasi nav launch --map maps/warehouse.yaml
127
+ caasi container run nvcr.io/nvidia/isaac-sim:5.1.0 ./runheadless.sh
128
+ caasi remote run gpu-box python train.py --steps 1000
129
+ ```
130
+
131
+ ## Configuration
132
+
133
+ Global config lives at `~/.config/caasi/config.yaml`; a project-local `./caasi.yaml`
134
+ is merged on top. Override the global file with `CAASI_CONFIG` or `--config`;
135
+ `CAASI_LANG` overrides the language.
136
+
137
+ ```yaml
138
+ language: en
139
+ tools:
140
+ isaacsim:
141
+ default: "6.0"
142
+ versions:
143
+ "6.0": { path: /opt/isaac-sim-6.0 }
144
+ "5.1": { path: /opt/isaac-sim-5.1 }
145
+ remotes:
146
+ gpu-box:
147
+ host: 10.0.0.5
148
+ user: robot
149
+ port: 2222
150
+ identity: ~/.ssh/id_ed25519
151
+ path: ~/experiments
152
+ ```
153
+
154
+ Manage it with `caasi config show|get|set|path|tools`.
155
+
156
+ ## Examples
157
+
158
+ [`examples/navigation.yaml`](examples/navigation.yaml) is a commented experiment config —
159
+ the input format shared by `sim run`, `train`, `benchmark start` and `dataset generate`:
160
+
161
+ ```bash
162
+ caasi sim run examples/navigation.yaml --dry-run # print the launch command, start nothing
163
+ ```
164
+
165
+ ## Tests
166
+
167
+ ```bash
168
+ pytest
169
+ ```
170
+
171
+ ## Documentation
172
+
173
+ Read it at <https://a6y3ap.github.io/caasi/> or open
174
+ [`docs/index.html`](docs/index.html) directly in a browser.
175
+
176
+ ## License
177
+
178
+ MIT © [a6y3ap](https://github.com/a6y3ap) — see [LICENSE](LICENSE).
caasi-0.1.0/README.md ADDED
@@ -0,0 +1,147 @@
1
+ # Caasi
2
+
3
+ A lightweight, **CLI-first orchestration layer** for NVIDIA Isaac Sim, Isaac Lab and the
4
+ wider robotics ecosystem (ROS 2, Nav2, MoveIt 2, ros2\_control, ...).
5
+
6
+ Headless-first. CLI-first. Process-oriented. Visualization-independent.
7
+
8
+ **Documentation:** <https://a6y3ap.github.io/caasi/>
9
+
10
+ > **Note:** Caasi is an independent open-source project. It is not affiliated with,
11
+ > endorsed by, or an official product of NVIDIA.
12
+
13
+ ## Philosophy
14
+
15
+ - **Use existing software. Don't reinvent it.** Caasi discovers, configures, launches,
16
+ connects, monitors and manages tools that already exist.
17
+ - **Simulation is not visualization.** Run headless by default; attach a viewer only when needed.
18
+ - **Minimum required stack.** The Caasi process itself stays lightweight and never imports the
19
+ heavy Isaac stack, PyTorch or rclpy — it only delegates to them.
20
+ - **Don't become another ROS.** ROS orchestration is delegated to the real `ros2` tooling.
21
+ - **Unix-friendly.** Small commands, `--json` output, sensible exit codes.
22
+
23
+ ## Install
24
+
25
+ Requires Python 3.10+ on Linux. The Isaac stack, ROS 2 and PyTorch are *discovered*, not
26
+ installed, by Caasi.
27
+
28
+ ```bash
29
+ pip install caasi
30
+ ```
31
+
32
+ Or from source:
33
+
34
+ ```bash
35
+ git clone https://github.com/a6y3ap/caasi.git
36
+ cd caasi
37
+ pip install -e . # add pytest as well: pip install -e ".[dev]"
38
+ ```
39
+
40
+ Either way this installs the `caasi` command. Shell completion is available:
41
+
42
+ ```bash
43
+ caasi --install-completion
44
+ ```
45
+
46
+ ## Quickstart
47
+
48
+ ```bash
49
+ caasi doctor # diagnose the whole environment
50
+ caasi doctor --component nvidia # one section only
51
+ caasi gpu status # GPU overview via nvidia-smi
52
+ caasi system status # OS / CPU / RAM / disk summary
53
+ caasi info # CLI + configured/detected ecosystem versions
54
+ caasi config show # effective configuration
55
+ caasi config set tools.isaacsim.default "6.0"
56
+ ```
57
+
58
+ Every command supports `--help`. Data commands support `--json` for scripting:
59
+
60
+ ```bash
61
+ caasi gpu status --json | jq '.gpus[0]["memory.used"]'
62
+ if caasi doctor --quiet; then echo "environment ready"; fi
63
+ ```
64
+
65
+ Simulations, training jobs and ROS launches start **detached** and are tracked as *runs* —
66
+ the CLI returns immediately and the work survives your terminal:
67
+
68
+ ```bash
69
+ caasi sim run experiments/wave.yaml
70
+ caasi run list
71
+ caasi logs latest --follow # Ctrl+C stops following, the run keeps going
72
+ caasi run status latest
73
+ ```
74
+
75
+ ## Command surface
76
+
77
+ | Group | Commands | Reference |
78
+ | ------------------- | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
79
+ | Environment | `doctor`, `gpu status\|info\|memory\|test`, `system status\|memory\|processes`, `info`, `version` | [environment.html](https://a6y3ap.github.io/caasi/environment.html) |
80
+ | Configuration | `config show\|get\|set\|path\|tools` | [configuration.html](https://a6y3ap.github.io/caasi/configuration.html) |
81
+ | Projects | `init`, `setup`, `project info\|validate`, `robot`, `scene`, `task` | [projects.html](https://a6y3ap.github.io/caasi/projects.html) |
82
+ | Runs & logs | `run list\|status\|logs\|stop\|pause\|resume\|delete\|inspect`, `logs` | [runs.html](https://a6y3ap.github.io/caasi/runs.html) |
83
+ | Simulation | `sim run\|status\|check\|stop\|pause\|resume`, `lab status` | [simulation.html](https://a6y3ap.github.io/caasi/simulation.html) |
84
+ | Training | `train`, `benchmark start\|report` | [training.html](https://a6y3ap.github.io/caasi/training.html) |
85
+ | Data & sensors | `dataset generate\|inspect\|convert\|validate`, `sensor list\|inspect\|test`, `vision status\|inspect\|test` | [data.html](https://a6y3ap.github.io/caasi/data.html) |
86
+ | Review | `replay`, `view rviz\|foxglove\|open3d\|attach` | [review.html](https://a6y3ap.github.io/caasi/review.html) |
87
+ | ROS ecosystem | `ros status\|doctor\|list\|launch\|topic\|node\|graph`, `nav status\|launch\|inspect\|test`, `moveit status\|launch\|plan\|test`, `control status\|list\|check` | [ros.html](https://a6y3ap.github.io/caasi/ros.html) |
88
+ | Native & shell | `native run\|sim\|lab\|ros`, `shell` | [native.html](https://a6y3ap.github.io/caasi/native.html) |
89
+ | Remote & containers | `remote list\|connect\|run`, `container list\|check\|run` | [remote.html](https://a6y3ap.github.io/caasi/remote.html) |
90
+
91
+ More examples:
92
+
93
+ ```bash
94
+ caasi train experiments/ant.yaml --steps 500000 --envs 4096
95
+ caasi ros status && caasi nav launch --map maps/warehouse.yaml
96
+ caasi container run nvcr.io/nvidia/isaac-sim:5.1.0 ./runheadless.sh
97
+ caasi remote run gpu-box python train.py --steps 1000
98
+ ```
99
+
100
+ ## Configuration
101
+
102
+ Global config lives at `~/.config/caasi/config.yaml`; a project-local `./caasi.yaml`
103
+ is merged on top. Override the global file with `CAASI_CONFIG` or `--config`;
104
+ `CAASI_LANG` overrides the language.
105
+
106
+ ```yaml
107
+ language: en
108
+ tools:
109
+ isaacsim:
110
+ default: "6.0"
111
+ versions:
112
+ "6.0": { path: /opt/isaac-sim-6.0 }
113
+ "5.1": { path: /opt/isaac-sim-5.1 }
114
+ remotes:
115
+ gpu-box:
116
+ host: 10.0.0.5
117
+ user: robot
118
+ port: 2222
119
+ identity: ~/.ssh/id_ed25519
120
+ path: ~/experiments
121
+ ```
122
+
123
+ Manage it with `caasi config show|get|set|path|tools`.
124
+
125
+ ## Examples
126
+
127
+ [`examples/navigation.yaml`](examples/navigation.yaml) is a commented experiment config —
128
+ the input format shared by `sim run`, `train`, `benchmark start` and `dataset generate`:
129
+
130
+ ```bash
131
+ caasi sim run examples/navigation.yaml --dry-run # print the launch command, start nothing
132
+ ```
133
+
134
+ ## Tests
135
+
136
+ ```bash
137
+ pytest
138
+ ```
139
+
140
+ ## Documentation
141
+
142
+ Read it at <https://a6y3ap.github.io/caasi/> or open
143
+ [`docs/index.html`](docs/index.html) directly in a browser.
144
+
145
+ ## License
146
+
147
+ MIT © [a6y3ap](https://github.com/a6y3ap) — see [LICENSE](LICENSE).
File without changes
@@ -0,0 +1,98 @@
1
+ /* Caasi CLI documentation — copy buttons for caasi commands.
2
+ * Injects a small "copy" button next to every command that invokes caasi:
3
+ * • each `$ caasi …` input line of a terminal example (pre.term .in),
4
+ * • each synopsis block (pre.syn) whose signature starts with caasi.
5
+ * Output lines, YAML/JSON samples and non-caasi shell lines are left alone.
6
+ * The async clipboard API is tried first, with an execCommand fallback
7
+ * because the docs are also read straight off disk (file://), where
8
+ * navigator.clipboard is frequently unavailable.
9
+ */
10
+ (function () {
11
+ "use strict";
12
+
13
+ var LABEL = "copy";
14
+
15
+ // caasi counts as "the command" when it starts the line or follows a shell
16
+ // separator (&&, ||, ;, |, (, $(, sudo) — not when it is merely an argument
17
+ // or a path component (`cd caasi`, `~/.caasi/runs`).
18
+ var CAASI_CALL = /(?:^|&&|\|\||[;|(]|\$\(|\bsudo)\s*caasi(?:\s|$)/;
19
+
20
+ function legacyCopy(text) {
21
+ var area = document.createElement("textarea");
22
+ area.value = text;
23
+ area.setAttribute("readonly", "");
24
+ area.style.cssText = "position:fixed;top:0;left:-9999px;opacity:0";
25
+ document.body.appendChild(area);
26
+ area.select();
27
+ var ok = false;
28
+ try {
29
+ ok = document.execCommand("copy");
30
+ } catch (e) {
31
+ ok = false;
32
+ }
33
+ document.body.removeChild(area);
34
+ return ok ? Promise.resolve() : Promise.reject(new Error("copy failed"));
35
+ }
36
+
37
+ function writeClipboard(text) {
38
+ if (navigator.clipboard && navigator.clipboard.writeText) {
39
+ return navigator.clipboard.writeText(text).catch(function () {
40
+ return legacyCopy(text);
41
+ });
42
+ }
43
+ return legacyCopy(text);
44
+ }
45
+
46
+ /* host — the element the button is appended to (styled absolute in CSS). */
47
+ function attach(host, text) {
48
+ var button = document.createElement("button");
49
+ var timer = 0;
50
+
51
+ button.type = "button";
52
+ button.className = "copy-cmd";
53
+ button.textContent = LABEL;
54
+ button.title = "Copy: " + text.split("\n")[0];
55
+ button.setAttribute("aria-label", "Copy command to clipboard");
56
+
57
+ function flash(message, cls) {
58
+ window.clearTimeout(timer);
59
+ button.textContent = message;
60
+ button.classList.add(cls);
61
+ timer = window.setTimeout(function () {
62
+ button.textContent = LABEL;
63
+ button.classList.remove("done", "fail");
64
+ }, 1400);
65
+ }
66
+
67
+ button.addEventListener("click", function () {
68
+ writeClipboard(text).then(
69
+ function () {
70
+ flash("copied", "done");
71
+ },
72
+ function () {
73
+ flash("failed", "fail");
74
+ }
75
+ );
76
+ });
77
+
78
+ host.appendChild(button);
79
+ }
80
+
81
+ function install() {
82
+ var lines = document.querySelectorAll("pre.term .in");
83
+ Array.prototype.forEach.call(lines, function (line) {
84
+ var text = line.textContent.replace(/\s+$/, "");
85
+ if (CAASI_CALL.test(text)) attach(line, text);
86
+ });
87
+
88
+ var synopses = document.querySelectorAll("pre.syn");
89
+ Array.prototype.forEach.call(synopses, function (pre) {
90
+ var code = pre.querySelector("code");
91
+ if (!code) return;
92
+ var text = code.textContent.replace(/\s+$/, "");
93
+ if (/^caasi(?:\s|$)/m.test(text)) attach(pre, text);
94
+ });
95
+ }
96
+
97
+ document.addEventListener("DOMContentLoaded", install);
98
+ })();
@@ -0,0 +1,151 @@
1
+ /* Caasi CLI documentation — shared sidebar navigation.
2
+ * Every page includes this script; it renders the nav into <aside id="sidebar">
3
+ * and marks the current page/section as active.
4
+ */
5
+ (function () {
6
+ "use strict";
7
+
8
+ var NAV = [
9
+ {
10
+ title: "Getting Started",
11
+ items: [
12
+ { href: "index.html", label: "Overview" },
13
+ { href: "index.html#architecture", label: "Architecture", sub: true },
14
+ { href: "index.html#installation", label: "Installation", sub: true },
15
+ { href: "index.html#quickstart", label: "Quickstart", sub: true },
16
+ { href: "index.html#conventions", label: "Global options & conventions", sub: true },
17
+ { href: "index.html#command-map", label: "Command map", sub: true }
18
+ ]
19
+ },
20
+ {
21
+ title: "Fundamentals",
22
+ items: [
23
+ { href: "environment.html", label: "Environment" },
24
+ { href: "environment.html#doctor", label: "doctor", sub: true },
25
+ { href: "environment.html#gpu", label: "gpu", sub: true },
26
+ { href: "environment.html#system", label: "system", sub: true },
27
+ { href: "environment.html#info", label: "info & version", sub: true },
28
+ { href: "configuration.html", label: "Configuration" },
29
+ { href: "configuration.html#files", label: "Files & precedence", sub: true },
30
+ { href: "configuration.html#tools", label: "Tool registry", sub: true },
31
+ { href: "configuration.html#config-cmd", label: "caasi config", sub: true },
32
+ { href: "configuration.html#env-vars", label: "Environment variables", sub: true },
33
+ { href: "runs.html", label: "Runs & Logs" },
34
+ { href: "runs.html#model", label: "The run model", sub: true },
35
+ { href: "runs.html#run", label: "caasi run", sub: true },
36
+ { href: "runs.html#logs", label: "caasi logs", sub: true }
37
+ ]
38
+ },
39
+ {
40
+ title: "Projects",
41
+ items: [
42
+ { href: "projects.html", label: "Project workflow" },
43
+ { href: "projects.html#init", label: "init", sub: true },
44
+ { href: "projects.html#setup", label: "setup", sub: true },
45
+ { href: "projects.html#project", label: "project", sub: true },
46
+ { href: "projects.html#definitions", label: "robot / scene / task", sub: true }
47
+ ]
48
+ },
49
+ {
50
+ title: "Simulation & Training",
51
+ items: [
52
+ { href: "simulation.html", label: "sim & lab" },
53
+ { href: "simulation.html#experiment", label: "Experiment YAML", sub: true },
54
+ { href: "simulation.html#sim-run", label: "sim run", sub: true },
55
+ { href: "simulation.html#sim-control", label: "sim status/check/stop", sub: true },
56
+ { href: "simulation.html#lab", label: "lab status", sub: true },
57
+ { href: "training.html", label: "train & benchmark" },
58
+ { href: "training.html#train", label: "train", sub: true },
59
+ { href: "training.html#benchmark", label: "benchmark", sub: true }
60
+ ]
61
+ },
62
+ {
63
+ title: "Data & Review",
64
+ items: [
65
+ { href: "data.html", label: "dataset / sensor / vision" },
66
+ { href: "data.html#dataset", label: "dataset", sub: true },
67
+ { href: "data.html#sensor", label: "sensor", sub: true },
68
+ { href: "data.html#vision", label: "vision", sub: true },
69
+ { href: "review.html", label: "replay & view" },
70
+ { href: "review.html#replay", label: "replay", sub: true },
71
+ { href: "review.html#view", label: "view", sub: true }
72
+ ]
73
+ },
74
+ {
75
+ title: "ROS Ecosystem",
76
+ items: [
77
+ { href: "ros.html", label: "ros / nav / moveit / control" },
78
+ { href: "ros.html#ros", label: "ros", sub: true },
79
+ { href: "ros.html#nav", label: "nav (Nav2)", sub: true },
80
+ { href: "ros.html#moveit", label: "moveit (MoveIt 2)", sub: true },
81
+ { href: "ros.html#control", label: "control (ros2_control)", sub: true }
82
+ ]
83
+ },
84
+ {
85
+ title: "Advanced",
86
+ items: [
87
+ { href: "native.html", label: "native & shell" },
88
+ { href: "native.html#native", label: "native", sub: true },
89
+ { href: "native.html#shell", label: "shell", sub: true },
90
+ { href: "remote.html", label: "remote & container" },
91
+ { href: "remote.html#remote", label: "remote", sub: true },
92
+ { href: "remote.html#container", label: "container", sub: true }
93
+ ]
94
+ }
95
+ ];
96
+
97
+ function currentFile() {
98
+ var path = window.location.pathname;
99
+ var file = path.substring(path.lastIndexOf("/") + 1);
100
+ return file === "" ? "index.html" : file;
101
+ }
102
+
103
+ function render() {
104
+ var sidebar = document.getElementById("sidebar");
105
+ if (!sidebar) return;
106
+ var here = currentFile();
107
+ var hash = window.location.hash;
108
+ var html = "";
109
+
110
+ NAV.forEach(function (group) {
111
+ html += '<div class="nav-group"><div class="nav-title">' + group.title + "</div>";
112
+ group.items.forEach(function (item) {
113
+ var file = item.href.split("#")[0];
114
+ var anchor = item.href.indexOf("#") >= 0 ? item.href.split("#")[1] : "";
115
+ var active =
116
+ file === here &&
117
+ (anchor === "" ? hash === "" || hash === "#" + (item.sub ? "" : anchor) : hash === "#" + anchor);
118
+ if (file === here && anchor !== "" && hash === "#" + anchor) active = true;
119
+ var cls = (item.sub ? "sub" : "") + (active ? " active" : "");
120
+ html += '<a class="' + cls.trim() + '" href="' + item.href + '">' + item.label + "</a>";
121
+ });
122
+ html += "</div>";
123
+ });
124
+
125
+ sidebar.innerHTML = html;
126
+
127
+ // If only the page (no hash) matches, highlight the top-level entry.
128
+ if (!hash) {
129
+ var links = sidebar.querySelectorAll('a:not(.sub)');
130
+ links.forEach(function (a) {
131
+ if (a.getAttribute("href").split("#")[0] === here) a.classList.add("active");
132
+ });
133
+ }
134
+ }
135
+
136
+ function installToggle() {
137
+ var toggle = document.getElementById("nav-toggle");
138
+ if (!toggle) return;
139
+ toggle.addEventListener("click", function () {
140
+ document.body.classList.toggle("nav-open");
141
+ });
142
+ document.getElementById("sidebar").addEventListener("click", function (e) {
143
+ if (e.target.tagName === "A") document.body.classList.remove("nav-open");
144
+ });
145
+ }
146
+
147
+ document.addEventListener("DOMContentLoaded", function () {
148
+ render();
149
+ installToggle();
150
+ });
151
+ })();