Migrate state.go: - os.ReadFile → io.Local.Read - os.MkdirAll → io.Local.EnsureDir - os.WriteFile → io.Local.Write Migrate templates.go: - os.Stat → io.Local.IsFile/IsDir - os.ReadFile → io.Local.Read - os.ReadDir → io.Local.List Part of #101 (io.Medium migration tracking issue). Closes #108 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Return copies of Container structs instead of pointers to the map entries. This prevents data races when containers are modified concurrently by waitForExit and Stop. Fixes #76 Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Add pkg/container for running LinuxKit VMs: - Manager interface with Run, Stop, List, Logs, Exec - Hypervisor abstraction (QEMU, Hyperkit) - Auto-detect available hypervisor and image format - State persistence in ~/.core/containers.json - Log management in ~/.core/logs/ CLI commands: - core run <image> - run LinuxKit image (-d for detach) - core ps - list containers (-a for all) - core stop <id> - stop container - core logs <id> - view logs (-f to follow) - core exec <id> <cmd> - execute via SSH Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>