What changed
Hotfix for two Windows-specific bugs reported by user testing on v3.1.1.
Bug 1 — soul.py subcommands produced empty output on Windows Git Bash
Symptom: Commands like soul status / soul init returned exit code 0 with no visible output. The script ran, but nothing reached the terminal.
Root cause: os.execvp() on Windows (especially under Git Bash / MSYS) does not reliably propagate the child process's stdout back to the parent shell. The current process gets replaced, but the new process's stdout doesn't always re-bind to the parent shell's pipe.
Fix: replace os.execvp() with subprocess.run() + sys.exit(result.returncode). File descriptors stay stable across the call; signal propagation handled correctly. Cross-platform identical behavior.
Bug 2 — soul_paths.py raised UnicodeEncodeError when run directly on Chinese Windows
Symptom:
UnicodeEncodeError: 'gbk' codec can't encode character '\\U0001f9ec'
Root cause: soul_paths.py was the only script not given the UTF-8 stdout/stderr reconfigure guard introduced in v3.1.1, because it was classified as a 'library module' rather than an entrypoint. But its __main__ diagnostic block prints the 🧬 emoji (U+1F9EC), which the default Chinese Windows console codec (cp936) cannot encode.
Fix: apply the same 5-line UTF-8 reconfigure guard at module top, matching the pattern already used by the 8 sibling entrypoints. The guard is idempotent — calling reconfigure again from an importer is a no-op.
Files
scripts/soul.py—os.execvp→subprocess.runscripts/soul_paths.py— UTF-8 reconfigure guard added at module top
Backwards compatibility
No data format change, no API change, no behavior change on macOS / Linux. v3.1.1 remains usable on those platforms; this release is only required for Windows users.
License: MIT.