Files
headquarter/openspec/tasks/home-path-expansion.md
Alex Blank 29a12bb102 feat: expand ~ and $HOME in mount target paths
- 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
2026-05-29 00:01:04 +02:00

2.9 KiB

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

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

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