v1.2.1
Added
- Windows 下的命令着色自愈(
route:forge:*观感与 Laravel 版对齐):包内五命令一直在用 think console 的<info>/<comment>/<error>标签(层级统计、别名黄行、撞车红行、失败提示),但在 Windows 上全部退化为纯文本。根因在框架而非本包:think\console\output\driver\Console::hasColorSupport()的 Windows 分支要求系统版本号精确等于10.0.10586(Win10 1511 的首发版号,symfony 2.x 时代抄来的写法),且只认TERM严格等于xterm,于是 Win11(如10.0.26200)与 Git Bash(TERM=xterm-256color)恒判「不支持颜色」,标签被Formatter剥掉却不写 ANSI 码;Linux/macOS 走posix_isatty分支所以正常。Laravel 侧之所以有颜色,是 symfony/console 早已把这条判据换成>=+WT_SESSION+ 主动启用 VT 模式。- 新增
src/Support/ConsoleColorDetector.php:Windows 下改为「版本号 ≥ 10.0.10586 且 PHP 成功开启控制台 VT 模式」,并识别 Windows Terminal(WT_SESSION)、mintty / Git Bash(MSYSCON)、ConEmu(ConEmuANSI=ON)、ansicon/cmder 与带后缀的TERM。VT 启用成功还兼作「背后是真控制台」的第二证据(管道/重定向下该调用必然失败,不会因此误染色)。判定核心decide()是纯函数(环境、控制台、os 家族、版本号、VT 状态全部注入),故 Windows 分支在任意平台上都可单测。 - 新增
src/Console/Concerns/EnsuresAnsiOutput.php并接入五命令的execute():时序上Console::run()的configureIO()先跑、之后才到execute(),所以覆盖setDecorated()安全且天然早于任何一次writeln()。只调框架公开 API,不重绑、不反射任何框架对象,零侵入约定不变。 - 取向偏保守:
stdout不是终端(管道、重定向、CI)时一律不上色,route:forge:list --json与route:forge:types的产物里不会混入 ANSI 转义码;遵守NO_COLOR与TERM=dumb;个别终端下 PHP 认不出控制台时宁可不上色,也不把←[32m这类乱码写进终端。 - 显式表态优先:命令带
--ansi/--no-ansi时本包完全不介入(框架的configureIO已处理),--ansi同时是自动判定过保守时的逃生舱。think 的Buffer/Nothing输出驱动压根没有setDecorated,此处静默降级,不牵动包内测试与非 console 输出场景。 - 验证:示例项目(
vendor/route-forge/thinkphp为符号链接,改动即时生效)在管道下实测 ANSI 转义序列计数——list/types默认0、--ansi26、--no-ansi0、--json(连--json --ansi也是)恒0且json_decode正常、clear/publish --ansi各2;包内 145 → 156 例全绿(检测器 8 例 + trait 契约 3 例)。「终端真出颜色」这层包内Buffer驱动验不到(它压根不过Formatter),由维护者在**主终端 PowerShell 7.6.5(Windows Terminal 宿主)**与 Git Bash、git-cmd、cmd 四类终端确认真实交互下stream_isatty(STDOUT)与sapi_windows_vt100_support(STDOUT, true)均为 true——即 conhost 路径与第三方终端路径各自独立成立,自愈必然放行(着色取决于控制台宿主是否支持 VT,与 PowerShell 版本无直接关系)。 - 命令选项、端点与摘要结构、错误码集合均无变化,JSON/TS 产物字节不变,故为补丁版本。文档同步于 README「终端着色」与「与 Laravel 版的差异」、
llms.txt。
- 新增
完整记录见 CHANGELOG.md。