The container's genisoimage rebuilds ISOs with a duplicate boot catalog
entry that 7z cannot re-extract ("Break signaled"). This caused cache
restore to fail for new instances.
- Add `cache download <version>` command to download original ISOs
directly using the container's download logic
- Add `_is_rebuilt_iso()` helper to detect rebuilt ISOs (magic byte 0x16)
- Skip rebuilt ISOs in `cache save` and `auto_cache_save` with warning
- Remove magic byte manipulation from restore paths (originals work as-is)
- Update WINCTL_GUIDE.md and readme.md with new cache workflow
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add AUTO_CACHE=Y/N setting in .env to auto-cache ISOs on stop
- Fix cache restore to copy metadata files (windows.base, windows.ver,
windows.mode, windows.type, windows.args) alongside ISOs so the
container recognizes them as already processed and skips re-download
- Refactor show_usage() into topic-based help with interactive menu
(commands, instances, cache, examples, config) and aligned columns
- Fix clean --data to unregister instances and remove compose files
- Update WINCTL_GUIDE.md and readme.md with all changes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The data directories contain .gitkeep files, so the empty-directory
check (ls -A) always returned non-empty and cache restore never
triggered. Now checks for *.iso files specifically, which is the
actual condition that determines whether a download is needed.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The container marks processed ISOs with byte 0x16 at offset 0. Restoring
a cached ISO with this byte into an empty data directory caused the
container to skip installation and try to boot a nonexistent disk,
dropping into a UEFI shell. Now resets byte 0 to 0x00 after copying so
the container re-processes the ISO (driver injection, answer file, etc.)
without re-downloading it. Also adds cache auto-restore to cmd_start()
for base versions, not just cmd_new() instances.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Cache downloaded ISOs so new instances of the same Windows version skip
the 3-6 GB download. Adds `winctl cache` subcommands (save/list/rm/flush)
and auto-restores cached ISOs when creating new instances with --new.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Auto-detect machine architecture via uname and use the correct Docker
image (dockurr/windows for x86, dockurr/windows-arm for ARM64). Block
unsupported versions on ARM with a clear error message, and show
[x86 only] tags in the list command. Compose files now use a
configurable WINDOWS_IMAGE variable with a default fallback.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Changed color definitions from '\033[...]' to $'\033[...]'
(actual escape bytes instead of literal strings)
- Replaced all display echo -e/echo -n/echo with printf
- Kept echo only for function return values and JSON output
- Fixes ANSI escape codes showing as raw text in list/inspect/monitor
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ./winctl.sh stop all finds and stops all running containers
- Updated help, WINCTL_GUIDE.md, and readme.md
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Changed post-increment to pre-increment in cmd_monitor
((total_count++)) → ((++total_count)) to avoid set -e exit on ((0))
- Added invalidate_cache for accurate real-time status updates
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace echo with printf '%b' in select_category and select_versions
to properly interpret ANSI escape sequences.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Cache container statuses in ~/.cache/winctl/status.json
- Auto-refresh if cache older than 7 days or data is stale
- Add 'refresh' command to force cache refresh
- Dramatically faster menus (single Docker call vs 44 calls)
- Bump version to 1.1.0
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Send menu prompts to stderr so they display in terminal
- Read user input from /dev/tty for proper interactive mode
- Add status cache to fetch all container states in one Docker call
- Handle interactive_select errors properly in all callers
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use printf '%b' instead of cat heredoc to properly interpret
ANSI escape sequences in the show_usage function.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add winctl.sh with 12 commands for managing Windows Docker containers:
- start, stop, restart, status, logs, shell, stats
- build, rebuild, list, inspect, monitor, check
- Interactive menus, prerequisites checking, color output
- Support for 22 Windows versions across 4 categories
Multi-version compose structure:
- Split base.yml into base-modern.yml (8G) and base-legacy.yml (2G)
- Add .env.example for configuration
- Update all compose files to use env_file
- Add unique port mappings per version
- Update README with winctl.sh documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>