29a12bb102
- Add expand_container_path() helper that resolves ~/ and $HOME/ prefixes
- Add get_manifest_home_dir() to compute /home/{user.name} or /root from manifest
- Set ENV HOME=... and ENV USER=... in generated Dockerfile for runtime compatibility
- Pass home_dir through instance creation and startup pipeline
- Expand mount targets in apply_resolved_profile() for regular profile mounts
- Expand mapping targets in _resolve_git_mount_mappings() for git mounts
- Expand working_directory and volume targets in _modify_compose_file()
- Update _prepare_manifest_instance to return home_dir alongside image tag
- Fetch tool_type early in start_instance to determine home_dir before profile application
Quality gates: pytest 188 passed, frontend typecheck clean
Addresses: home-path-expansion
76 lines
2.9 KiB
Markdown
76 lines
2.9 KiB
Markdown
# Tasks: ~ / $HOME Expansion in Mount Paths
|
|
|
|
## T1: Backend — Core helpers and pipeline
|
|
|
|
### T1.1: Add `expand_container_path` helper
|
|
**File**: `apps/api/src/services/config_profile_resolver.py`
|
|
- Add `expand_container_path(path: str, home_dir: str) -> str`
|
|
- Handle `~/`, `~`, `$HOME/`, `$HOME` patterns
|
|
- Must not expand if path doesn't start with these patterns
|
|
|
|
### T1.2: Add `get_manifest_home_dir` helper
|
|
**File**: `apps/api/src/services/manifest_compiler.py`
|
|
- Add `get_manifest_home_dir(manifest: dict) -> str`
|
|
- Returns `/home/{user.name}` if user block exists, else `/root`
|
|
|
|
### T1.3: Set `HOME` and `USER` env vars in Dockerfile
|
|
**File**: `apps/api/src/services/manifest_compiler.py`
|
|
- In `compile_dockerfile()`, after user creation block, add `ENV HOME=...` and `ENV USER=...`
|
|
- Update existing manifest compiler tests
|
|
|
|
### T1.4: Update `apply_resolved_profile` to expand paths
|
|
**File**: `apps/api/src/services/config_profile_resolver.py`
|
|
- Add `home_dir: str = "/root"` parameter
|
|
- Expand mount targets before creating mount directories and volume entries
|
|
|
|
### T1.5: Update git mount resolution to expand paths
|
|
**File**: `apps/api/src/api/tool_instances.py`
|
|
- Add `home_dir: str = "/root"` parameter to `_resolve_git_mount_mappings()`
|
|
- Expand mapping target paths before resolving
|
|
- Add `home_dir` parameter to `_resolve_git_mounts()` and `_resolve_single_git_mount()`
|
|
|
|
### T1.6: Determine home_dir in instance lifecycle
|
|
**File**: `apps/api/src/api/tool_instances.py`
|
|
- In `create_instance`: determine `home_dir` from tool type + manifest (if manifest), pass to `_modify_compose_file`
|
|
- In `start_instance`: determine `home_dir` from tool type + resolved manifest, pass to `apply_resolved_profile` and `_resolve_git_mounts`
|
|
- In `_prepare_manifest_instance`: return `home_dir` alongside image_tag and compose_content
|
|
|
|
### T1.7: Update `_modify_compose_file` to expand paths
|
|
**File**: `apps/api/src/api/tool_instances.py`
|
|
- Add `home_dir: str = "/root"` parameter
|
|
- Expand `working_directory` and any mount targets in extra_volumes
|
|
|
|
### T1.8: Unit tests
|
|
**File**: `apps/api/tests/unit/test_home_path_expansion.py` (new)
|
|
- Test `expand_container_path` with `~`, `~/foo`, `$HOME`, `$HOME/foo`, `/abs/path`, `rel/path`
|
|
- Test `get_manifest_home_dir` with user, without user
|
|
|
|
**File**: `apps/api/tests/unit/test_manifest_compiler.py`
|
|
- Test Dockerfile contains `ENV HOME=...` for user-based manifests
|
|
- Test Dockerfile contains `ENV HOME=/root` for root manifests
|
|
|
|
---
|
|
|
|
## T2: Verification
|
|
|
|
### T2.1: Run all affected tests
|
|
```bash
|
|
cd apps/api && pytest tests/unit/test_home_path_expansion.py tests/unit/test_manifest_compiler.py tests/unit/test_config_profile_resolver.py tests/unit/test_git_mounts.py -xvs
|
|
```
|
|
|
|
### T2.2: Frontend typecheck
|
|
```bash
|
|
cd apps/web && npm run typecheck
|
|
```
|
|
|
|
---
|
|
|
|
## Estimation
|
|
|
|
| Task | Effort | Files |
|
|
|------|--------|-------|
|
|
| T1.1-T1.7 | 2h | 3 |
|
|
| T1.8 | 1h | 2 |
|
|
| T2.1-T2.2 | 0.5h | — |
|
|
| **Total** | **3.5h** | **5** |
|