- 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>
All reviewdog actions in review.yml now use fail_level: error instead
of the deprecated fail_on_error parameter.
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 restart policy from unless-stopped to on-failure
so Windows shutdown stops the container instead of restarting
- Added RESTART_POLICY env variable to .env.modern and .env.legacy
- Compose files use ${RESTART_POLICY:-on-failure} for flexibility
- Updated WINCTL_GUIDE.md with restart policy documentation
- Updated readme.md with RESTART_POLICY setting
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>
- Changed USERNAME example from Docker to docker (lowercase)
- Added link to WINCTL_GUIDE.md for complete documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove base-legacy.yml and base-modern.yml (YAML anchors don't work with include)
- Make all compose files self-contained
- Add .env.modern (8G RAM, 4 CPU) for Win 10/11, Server 2016+
- Add .env.legacy (2G RAM, 2 CPU) for older systems
- Update README and .env.example documentation
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>
- Add compose/ folder with modular compose files for all Windows versions
- Organize by category: desktop, legacy, server, tiny
- Create data/ subfolders for each version's storage
- Update .gitignore to track folder structure via .gitkeep files
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>