pixi-ros 0.2.0__tar.gz → 0.4.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 (52) hide show
  1. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/.github/workflows/ci.yml +1 -1
  2. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/PKG-INFO +118 -25
  3. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/README.md +116 -24
  4. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/pixi.lock +134 -1
  5. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/pixi.toml +2 -1
  6. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/pyproject.toml +2 -1
  7. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/src/pixi_ros/cli.py +44 -31
  8. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/src/pixi_ros/data/conda-forge.yaml +6 -0
  9. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/src/pixi_ros/init.py +395 -206
  10. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/src/pixi_ros/mappings.py +39 -26
  11. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/src/pixi_ros/package_xml.py +69 -8
  12. pixi_ros-0.4.0/src/pixi_ros/validator.py +245 -0
  13. pixi_ros-0.4.0/tests/examples/ws1/README_PIXI.md +125 -0
  14. pixi_ros-0.4.0/tests/examples/ws1/pixi.toml +37 -0
  15. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/examples/ws1/src/package-a/package.xml +4 -2
  16. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/examples/ws1/src/package-b/package.xml +3 -0
  17. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/test_init.py +206 -2
  18. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/test_mappings.py +54 -0
  19. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/test_package_xml.py +92 -0
  20. pixi_ros-0.4.0/tests/test_validator.py +324 -0
  21. pixi_ros-0.2.0/tests/examples/ws1/pixi.toml +0 -39
  22. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/.gitattributes +0 -0
  23. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/.github/workflows/publish-pypi.yml +0 -0
  24. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/.gitignore +0 -0
  25. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/LICENSE +0 -0
  26. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/src/pixi_ros/__init__.py +0 -0
  27. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/src/pixi_ros/config.py +0 -0
  28. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/src/pixi_ros/data/README.md +0 -0
  29. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/src/pixi_ros/data/README_PIXI.md.template +0 -0
  30. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/src/pixi_ros/utils.py +0 -0
  31. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/src/pixi_ros/workspace.py +0 -0
  32. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/examples/ws1/pixi.lock +0 -0
  33. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/examples/ws1/src/package-a/CMakeLists.txt +0 -0
  34. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/examples/ws1/src/package-a/LICENSE +0 -0
  35. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/examples/ws1/src/package-b/package-b/__init__.py +0 -0
  36. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/examples/ws1/src/package-b/setup.cfg +0 -0
  37. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/examples/ws1/src/package-b/setup.py +0 -0
  38. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/examples/ws1/src/package-b/test/test_copyright.py +0 -0
  39. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/examples/ws1/src/package-b/test/test_flake8.py +0 -0
  40. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/examples/ws1/src/package-b/test/test_pep257.py +0 -0
  41. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/fixtures/mock_workspace/README.md +0 -0
  42. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/fixtures/mock_workspace/src/legacy_pkg/package.xml +0 -0
  43. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/fixtures/mock_workspace/src/my_cpp_pkg/CMakeLists.txt +0 -0
  44. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/fixtures/mock_workspace/src/my_cpp_pkg/package.xml +0 -0
  45. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/fixtures/mock_workspace/src/my_mixed_pkg/package.xml +0 -0
  46. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/fixtures/mock_workspace/src/my_python_pkg/package.xml +0 -0
  47. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/fixtures/mock_workspace/src/my_python_pkg/setup.py +0 -0
  48. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/test_cli.py +0 -0
  49. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/test_config.py +0 -0
  50. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/test_gateway_availability.py +0 -0
  51. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/test_utils.py +0 -0
  52. {pixi_ros-0.2.0 → pixi_ros-0.4.0}/tests/test_workspace.py +0 -0
@@ -15,7 +15,7 @@ jobs:
15
15
  - uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3
16
16
 
17
17
  - name: Format
18
- run: pixi run format --check
18
+ run: pixi run fmt --check
19
19
  - name: Lint
20
20
  run: pixi run lint
21
21
  - name: Test
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pixi-ros
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: Pixi extension for ROS package management
5
5
  Project-URL: Homepage, https://github.com/ruben-arts/pixi-ros
6
6
  Project-URL: Repository, https://github.com/ruben-arts/pixi-ros
@@ -13,6 +13,7 @@ Requires-Dist: pathspec>=0.11.0
13
13
  Requires-Dist: py-rattler>=0.6.0
14
14
  Requires-Dist: pyyaml>=6.0
15
15
  Requires-Dist: rich>=13.0.0
16
+ Requires-Dist: rosdistro>=0.9.0
16
17
  Requires-Dist: tomlkit>=0.12.0
17
18
  Requires-Dist: typer>=0.12.0
18
19
  Description-Content-Type: text/markdown
@@ -63,10 +64,16 @@ pixi-ros init --distro humble
63
64
  This will:
64
65
  1. Discover all ROS packages in your workspace (by finding `package.xml` files)
65
66
  2. Read dependencies from each `package.xml`
66
- 3. Map ROS package names to conda packages
67
+ 3. **Validate and resolve** each dependency using the priority system:
68
+ - Skip workspace packages (built locally)
69
+ - Use custom mappings from YAML files
70
+ - Query ROS distro index for ROS packages
71
+ - Auto-detect packages on conda-forge
72
+ - Flag packages that can't be found
67
73
  4. Generate/update `pixi.toml` with proper channels and dependencies
68
- 5. Check package availability and warn about missing packages
74
+ 5. Check package availability in conda channels for each platform
69
75
  6. Create helpful build/test/clean tasks
76
+ 7. Display detailed validation results with source information
70
77
 
71
78
  ### Install and Build
72
79
 
@@ -88,26 +95,66 @@ pixi shell
88
95
 
89
96
  ## How It Works
90
97
 
91
- ### Dependency Mapping
98
+ ### Dependency Mapping & Validation
92
99
 
93
- `pixi-ros` reads all dependency types from `package.xml` files.
94
- It then does a best effort mapping of ROS package names to conda packages.
100
+ `pixi-ros` reads all dependency types from `package.xml` files and intelligently resolves them to conda packages using a **priority-based validation system**.
95
101
 
96
- - **ROS packages**: `ros-{distro}-{package}` from robostack channels (e.g., `ros-humble-rclcpp`)
97
- - **System packages**: Mapped to conda-forge equivalents (e.g., `cmake`, `eigen`)
98
- - **Platform-specific packages**: Different mappings per platform (e.g., OpenGL → `libgl-devel` on Linux, X11 packages on macOS)
102
+ #### Validation Priority Order
103
+
104
+ When resolving a ROS package dependency, `pixi-ros` checks sources in this order:
105
+
106
+ 1. **Workspace packages** (local source) → Skipped, won't be added to dependencies
107
+ 2. **Mapping files** → Use custom conda package mappings from the embedded mapping.
108
+ 3. **ROS distribution** → Query the official ROS distro index for `ros-{distro}-{package}` packages
109
+ 4. **conda-forge** (auto-detection) → Search conda-forge for packages without ros-distro prefix
110
+ 5. **NOT FOUND** → Mark as unavailable and comment out in `pixi.toml`
111
+
112
+ #### Package Sources
113
+
114
+ The dependency tables show where each package comes from:
115
+
116
+ - **ROS {distro}**: Official ROS distribution packages from robostack (e.g., `ros-humble-rclcpp`)
117
+ - **Mapping**: Custom mappings from YAML files (e.g., `cmake` → `cmake`, `udev` → `libusb + libudev`)
118
+ - **conda-forge**: Auto-detected packages available directly on conda-forge
119
+ - **Workspace**: Local packages in your workspace (skipped from dependencies)
120
+ - **NOT FOUND**: Packages that couldn't be resolved (commented out in `pixi.toml`)
99
121
 
100
122
  The mapping rules are defined in YAML files (see `src/pixi_ros/data/conda-forge.yaml`) and can be customized by placing your own mapping files in `pixi-ros/*.yaml` or `~/.pixi-ros/*.yaml`.
101
123
 
102
- After the mapping, it validates package availability in the configured channels for each target platform. This starts a connection with `https://prefix.dev` to check if packages exist.
124
+ After dependency resolution, `pixi-ros` validates package availability in the configured channels for each target platform by connecting to `https://prefix.dev`.
125
+
126
+ ### Example Output
103
127
 
104
- ### Example
128
+ When you run `pixi-ros init --distro humble`, you'll see validation results:
129
+
130
+ ```
131
+ Found 2 package(s): my_package, other_package
132
+ Initializing ROS humble distribution validator...
133
+
134
+ ╭─────────────────── Package: my_package ───────────────────╮
135
+ │ ROS Dependency │ Type │ Conda Packages │ Source │
136
+ ├────────────────┼─────────┼─────────────────────────┼──────────────┤
137
+ │ rclcpp │ Build │ ros-humble-rclcpp │ ROS humble │
138
+ │ std_msgs │ Runtime │ ros-humble-std-msgs │ ROS humble │
139
+ │ cmake │ Build │ cmake │ Mapping │
140
+ │ eigen │ Build │ eigen │ conda-forge │
141
+ ╰────────────────┴─────────┴─────────────────────────┴──────────────╯
142
+
143
+ Validation Summary:
144
+ ✓ 2 workspace packages (skipped)
145
+ ✓ 1 packages from mappings
146
+ ✓ 5 packages from ROS humble distro
147
+ ✓ 1 packages from conda-forge (auto-detected)
148
+
149
+ Total external dependencies: 7
150
+ ```
105
151
 
106
152
  Given a `package.xml` with:
107
153
 
108
154
  ```xml
109
155
  <depend>rclcpp</depend>
110
156
  <build_depend>ament_cmake</build_depend>
157
+ <build_depend>cmake</build_depend>
111
158
  <exec_depend>std_msgs</exec_depend>
112
159
  ```
113
160
 
@@ -115,17 +162,57 @@ Given a `package.xml` with:
115
162
 
116
163
  ```toml
117
164
  [dependencies]
118
- ros-humble-ament-cmake = "*"
119
- ros-humble-rclcpp = "*"
120
- ros-humble-std-msgs = "*"
165
+ # Base ROS dependencies
166
+ ros-humble-ros-base = "*"
167
+ pkg-config = "*"
168
+ compilers = "*"
169
+ make = "*"
170
+ ninja = "*"
171
+
172
+ # Build tools
173
+ colcon-common-extensions = "*"
174
+
175
+ # Workspace dependencies
176
+ cmake = "*" # From mapping
177
+ ros-humble-ament-cmake = "*" # From ROS humble
178
+ ros-humble-rclcpp = "*" # From ROS humble
179
+ ros-humble-std-msgs = "*" # From ROS humble
121
180
  ```
122
181
 
123
- ## Supported ROS Distributions
182
+ ### Version Constraints
183
+
184
+ `pixi-ros` supports version constraints from `package.xml` files and automatically applies them to the generated `pixi.toml`.
185
+
186
+ #### Supported Version Attributes
124
187
 
125
- - ROS 2 Humble: https://prefix.dev/robostack-humble
126
- - ROS 2 Iron: https://prefix.dev/robostack-iron
127
- - ROS 2 Jazzy: https://prefix.dev/robostack-jazzy
128
- - ROS 2 Rolling: https://prefix.dev/robostack-rolling
188
+ You can specify version requirements in your `package.xml` using standard ROS version attributes:
189
+
190
+ | package.xml attribute | pixi.toml constraint | Description |
191
+ |----------------------|----------------------|-------------|
192
+ | `version_eq="X.Y.Z"` | `==X.Y.Z` | Exactly version X.Y.Z |
193
+ | `version_gte="X.Y.Z"` | `>=X.Y.Z` | Version X.Y.Z or newer |
194
+ | `version_gt="X.Y.Z"` | `>X.Y.Z` | Newer than version X.Y.Z |
195
+ | `version_lte="X.Y.Z"` | `<=X.Y.Z` | Version X.Y.Z or older |
196
+ | `version_lt="X.Y.Z"` | `<X.Y.Z` | Older than version X.Y.Z |
197
+
198
+ Multiple constraints can be combined on the same dependency and will be joined with commas in the output.
199
+
200
+ Given a `package.xml` with version constraints:
201
+
202
+ ```xml
203
+ <depend version_gte="3.12.4">cmake</depend>
204
+ <build_depend version_gte="3.3.0" version_lt="4.0.0">eigen</build_depend>
205
+ <exec_depend version_eq="1.2.3">boost</exec_depend>
206
+ ```
207
+
208
+ `pixi-ros init` generates:
209
+
210
+ ```toml
211
+ [dependencies]
212
+ cmake = ">=3.12.4"
213
+ eigen = ">=3.3.0,<4.0.0"
214
+ boost = "==1.2.3"
215
+ ```
129
216
 
130
217
  ## Command Reference
131
218
 
@@ -147,13 +234,16 @@ pixi-ros init
147
234
 
148
235
  **What it does:**
149
236
  - Scans workspace for `package.xml` files
150
- - Reads all dependency types (build, exec, test)
237
+ - Reads all dependency types (build, exec, test) and version constraints
238
+ - **Validates dependencies** using the priority-based system (workspace → mapping → ROS distro → conda-forge)
151
239
  - Maps ROS dependencies to conda packages for each platform
240
+ - Applies version constraints from package.xml to pixi.toml dependencies
152
241
  - Configures robostack channels
153
242
  - Checks package availability per platform
154
243
  - Creates build tasks using colcon
155
244
  - Generates helpful `README_PIXI.md`
156
245
  - Sets up platform-specific dependencies in `pixi.toml`
246
+ - **Displays validation results** showing where each dependency was found
157
247
 
158
248
  **Running multiple times:**
159
249
  The command is idempotent - you can run it multiple times to update dependencies as your workspace changes.
@@ -261,12 +351,15 @@ workspace/
261
351
 
262
352
  ### Package Not Found
263
353
 
264
- If pixi-ros marks packages as "NOT FOUND":
354
+ If pixi-ros marks packages as "NOT FOUND" (shown in red in the validation output):
355
+
356
+ 1. **Check the ROS distro**: Verify the package exists in robostack: https://prefix.dev/channels/robostack-{distro}
357
+ 2. **Check for typos**: Review your `package.xml` for spelling errors
358
+ 3. **Check conda-forge**: Some packages may be available directly on conda-forge without the `ros-distro-` prefix
359
+ 4. **Create a mapping**: Add a custom mapping in `pixi-ros/*.yaml` if the package has a different conda name
360
+ 5. **Add to workspace**: Consider including the package source in your workspace instead of depending on it
265
361
 
266
- 1. Check if the package exists in robostack: https://prefix.dev/channels/robostack-{distro}
267
- 2. Check for typos in `package.xml`
268
- 3. Some packages may have different names - check mapping files
269
- 4. Consider adding the package to your workspace instead of depending on it
362
+ The validation table shows exactly where each dependency was checked, making it easier to diagnose issues.
270
363
 
271
364
  ### Different Package Names
272
365
 
@@ -44,10 +44,16 @@ pixi-ros init --distro humble
44
44
  This will:
45
45
  1. Discover all ROS packages in your workspace (by finding `package.xml` files)
46
46
  2. Read dependencies from each `package.xml`
47
- 3. Map ROS package names to conda packages
47
+ 3. **Validate and resolve** each dependency using the priority system:
48
+ - Skip workspace packages (built locally)
49
+ - Use custom mappings from YAML files
50
+ - Query ROS distro index for ROS packages
51
+ - Auto-detect packages on conda-forge
52
+ - Flag packages that can't be found
48
53
  4. Generate/update `pixi.toml` with proper channels and dependencies
49
- 5. Check package availability and warn about missing packages
54
+ 5. Check package availability in conda channels for each platform
50
55
  6. Create helpful build/test/clean tasks
56
+ 7. Display detailed validation results with source information
51
57
 
52
58
  ### Install and Build
53
59
 
@@ -69,26 +75,66 @@ pixi shell
69
75
 
70
76
  ## How It Works
71
77
 
72
- ### Dependency Mapping
78
+ ### Dependency Mapping & Validation
73
79
 
74
- `pixi-ros` reads all dependency types from `package.xml` files.
75
- It then does a best effort mapping of ROS package names to conda packages.
80
+ `pixi-ros` reads all dependency types from `package.xml` files and intelligently resolves them to conda packages using a **priority-based validation system**.
76
81
 
77
- - **ROS packages**: `ros-{distro}-{package}` from robostack channels (e.g., `ros-humble-rclcpp`)
78
- - **System packages**: Mapped to conda-forge equivalents (e.g., `cmake`, `eigen`)
79
- - **Platform-specific packages**: Different mappings per platform (e.g., OpenGL → `libgl-devel` on Linux, X11 packages on macOS)
82
+ #### Validation Priority Order
83
+
84
+ When resolving a ROS package dependency, `pixi-ros` checks sources in this order:
85
+
86
+ 1. **Workspace packages** (local source) → Skipped, won't be added to dependencies
87
+ 2. **Mapping files** → Use custom conda package mappings from the embedded mapping.
88
+ 3. **ROS distribution** → Query the official ROS distro index for `ros-{distro}-{package}` packages
89
+ 4. **conda-forge** (auto-detection) → Search conda-forge for packages without ros-distro prefix
90
+ 5. **NOT FOUND** → Mark as unavailable and comment out in `pixi.toml`
91
+
92
+ #### Package Sources
93
+
94
+ The dependency tables show where each package comes from:
95
+
96
+ - **ROS {distro}**: Official ROS distribution packages from robostack (e.g., `ros-humble-rclcpp`)
97
+ - **Mapping**: Custom mappings from YAML files (e.g., `cmake` → `cmake`, `udev` → `libusb + libudev`)
98
+ - **conda-forge**: Auto-detected packages available directly on conda-forge
99
+ - **Workspace**: Local packages in your workspace (skipped from dependencies)
100
+ - **NOT FOUND**: Packages that couldn't be resolved (commented out in `pixi.toml`)
80
101
 
81
102
  The mapping rules are defined in YAML files (see `src/pixi_ros/data/conda-forge.yaml`) and can be customized by placing your own mapping files in `pixi-ros/*.yaml` or `~/.pixi-ros/*.yaml`.
82
103
 
83
- After the mapping, it validates package availability in the configured channels for each target platform. This starts a connection with `https://prefix.dev` to check if packages exist.
104
+ After dependency resolution, `pixi-ros` validates package availability in the configured channels for each target platform by connecting to `https://prefix.dev`.
105
+
106
+ ### Example Output
84
107
 
85
- ### Example
108
+ When you run `pixi-ros init --distro humble`, you'll see validation results:
109
+
110
+ ```
111
+ Found 2 package(s): my_package, other_package
112
+ Initializing ROS humble distribution validator...
113
+
114
+ ╭─────────────────── Package: my_package ───────────────────╮
115
+ │ ROS Dependency │ Type │ Conda Packages │ Source │
116
+ ├────────────────┼─────────┼─────────────────────────┼──────────────┤
117
+ │ rclcpp │ Build │ ros-humble-rclcpp │ ROS humble │
118
+ │ std_msgs │ Runtime │ ros-humble-std-msgs │ ROS humble │
119
+ │ cmake │ Build │ cmake │ Mapping │
120
+ │ eigen │ Build │ eigen │ conda-forge │
121
+ ╰────────────────┴─────────┴─────────────────────────┴──────────────╯
122
+
123
+ Validation Summary:
124
+ ✓ 2 workspace packages (skipped)
125
+ ✓ 1 packages from mappings
126
+ ✓ 5 packages from ROS humble distro
127
+ ✓ 1 packages from conda-forge (auto-detected)
128
+
129
+ Total external dependencies: 7
130
+ ```
86
131
 
87
132
  Given a `package.xml` with:
88
133
 
89
134
  ```xml
90
135
  <depend>rclcpp</depend>
91
136
  <build_depend>ament_cmake</build_depend>
137
+ <build_depend>cmake</build_depend>
92
138
  <exec_depend>std_msgs</exec_depend>
93
139
  ```
94
140
 
@@ -96,17 +142,57 @@ Given a `package.xml` with:
96
142
 
97
143
  ```toml
98
144
  [dependencies]
99
- ros-humble-ament-cmake = "*"
100
- ros-humble-rclcpp = "*"
101
- ros-humble-std-msgs = "*"
145
+ # Base ROS dependencies
146
+ ros-humble-ros-base = "*"
147
+ pkg-config = "*"
148
+ compilers = "*"
149
+ make = "*"
150
+ ninja = "*"
151
+
152
+ # Build tools
153
+ colcon-common-extensions = "*"
154
+
155
+ # Workspace dependencies
156
+ cmake = "*" # From mapping
157
+ ros-humble-ament-cmake = "*" # From ROS humble
158
+ ros-humble-rclcpp = "*" # From ROS humble
159
+ ros-humble-std-msgs = "*" # From ROS humble
102
160
  ```
103
161
 
104
- ## Supported ROS Distributions
162
+ ### Version Constraints
163
+
164
+ `pixi-ros` supports version constraints from `package.xml` files and automatically applies them to the generated `pixi.toml`.
165
+
166
+ #### Supported Version Attributes
105
167
 
106
- - ROS 2 Humble: https://prefix.dev/robostack-humble
107
- - ROS 2 Iron: https://prefix.dev/robostack-iron
108
- - ROS 2 Jazzy: https://prefix.dev/robostack-jazzy
109
- - ROS 2 Rolling: https://prefix.dev/robostack-rolling
168
+ You can specify version requirements in your `package.xml` using standard ROS version attributes:
169
+
170
+ | package.xml attribute | pixi.toml constraint | Description |
171
+ |----------------------|----------------------|-------------|
172
+ | `version_eq="X.Y.Z"` | `==X.Y.Z` | Exactly version X.Y.Z |
173
+ | `version_gte="X.Y.Z"` | `>=X.Y.Z` | Version X.Y.Z or newer |
174
+ | `version_gt="X.Y.Z"` | `>X.Y.Z` | Newer than version X.Y.Z |
175
+ | `version_lte="X.Y.Z"` | `<=X.Y.Z` | Version X.Y.Z or older |
176
+ | `version_lt="X.Y.Z"` | `<X.Y.Z` | Older than version X.Y.Z |
177
+
178
+ Multiple constraints can be combined on the same dependency and will be joined with commas in the output.
179
+
180
+ Given a `package.xml` with version constraints:
181
+
182
+ ```xml
183
+ <depend version_gte="3.12.4">cmake</depend>
184
+ <build_depend version_gte="3.3.0" version_lt="4.0.0">eigen</build_depend>
185
+ <exec_depend version_eq="1.2.3">boost</exec_depend>
186
+ ```
187
+
188
+ `pixi-ros init` generates:
189
+
190
+ ```toml
191
+ [dependencies]
192
+ cmake = ">=3.12.4"
193
+ eigen = ">=3.3.0,<4.0.0"
194
+ boost = "==1.2.3"
195
+ ```
110
196
 
111
197
  ## Command Reference
112
198
 
@@ -128,13 +214,16 @@ pixi-ros init
128
214
 
129
215
  **What it does:**
130
216
  - Scans workspace for `package.xml` files
131
- - Reads all dependency types (build, exec, test)
217
+ - Reads all dependency types (build, exec, test) and version constraints
218
+ - **Validates dependencies** using the priority-based system (workspace → mapping → ROS distro → conda-forge)
132
219
  - Maps ROS dependencies to conda packages for each platform
220
+ - Applies version constraints from package.xml to pixi.toml dependencies
133
221
  - Configures robostack channels
134
222
  - Checks package availability per platform
135
223
  - Creates build tasks using colcon
136
224
  - Generates helpful `README_PIXI.md`
137
225
  - Sets up platform-specific dependencies in `pixi.toml`
226
+ - **Displays validation results** showing where each dependency was found
138
227
 
139
228
  **Running multiple times:**
140
229
  The command is idempotent - you can run it multiple times to update dependencies as your workspace changes.
@@ -242,12 +331,15 @@ workspace/
242
331
 
243
332
  ### Package Not Found
244
333
 
245
- If pixi-ros marks packages as "NOT FOUND":
334
+ If pixi-ros marks packages as "NOT FOUND" (shown in red in the validation output):
335
+
336
+ 1. **Check the ROS distro**: Verify the package exists in robostack: https://prefix.dev/channels/robostack-{distro}
337
+ 2. **Check for typos**: Review your `package.xml` for spelling errors
338
+ 3. **Check conda-forge**: Some packages may be available directly on conda-forge without the `ros-distro-` prefix
339
+ 4. **Create a mapping**: Add a custom mapping in `pixi-ros/*.yaml` if the package has a different conda name
340
+ 5. **Add to workspace**: Consider including the package source in your workspace instead of depending on it
246
341
 
247
- 1. Check if the package exists in robostack: https://prefix.dev/channels/robostack-{distro}
248
- 2. Check for typos in `package.xml`
249
- 3. Some packages may have different names - check mapping files
250
- 4. Consider adding the package to your workspace instead of depending on it
342
+ The validation table shows exactly where each dependency was checked, making it easier to diagnose issues.
251
343
 
252
344
  ### Different Package Names
253
345