14 files, 39 occurrences of platform-specific macros/conditionals outside src/platform/.
Migrate all raw popen/pclose calls to platform::process::capture() / run_streaming() / run_silent().
Files: cli.cppm, ninja_backend.cppm, msvc.cppm, stdmod.cppm, pack/pack.cppm, pm/publisher.cppm, modgraph/p1689.cppm
Replace manual '...' vs "..." with platform::shell::quote().
Lines: 1954, 1965, 2527, 2620, 3178
Create platform/terminal.cppm for isatty, terminal width detection.
Lines: 8-9, 149, 329
Move to platform::common as a constant.
Line: 30
Add supports_full_static, supports_rpath, needs_explicit_libcxx to platform::common.
Lines: 162, 175, 183
Abstract Windows env-setting vs POSIX shell-prefix into platform layer.
Lines: 401, 612, 739
Abstract $toolenv prefix and shell syntax differences.
Lines: 178, 207, 231, 243, 254, 287, 297, 548, 560