claude-code-best/src/utils/__tests__
IronRookieCoder 223b694965 fix(windows): prevent terminal startup failures
## Bug 详情
- issues.md #46:Windows MSYS2/UCRT64 下执行 csc,欢迎信息输出后在 stdin raw mode/终端输入初始化阶段崩溃,出现 native std::bad_weak_ptr 和后续 Bun mutex corrupt。
- issues.md #47:cmd.exe 可启动,但 PowerShell 运行 csc 会走 npm 生成的 csc.ps1;截图显示 node.exe 报错 "Input must be provided either through stdin or as a prompt argument when using --print",说明裸 csc 被误判成 print/non-interactive 模式。

## 根因
- MSYS2/Cygwin/mintty 等 Windows 终端对 Node/Bun stdin raw mode 和终端扩展控制序列兼容性不稳定,启动早期强行 setRawMode/查询终端能力会触发崩溃风险。
- npm 的 PowerShell shim 解析优先级高于 csc.cmd,且可能让 stdout TTY 状态不可用;原 main.tsx 只要 stdout 非 TTY 就自动进入 non-interactive/--print 路径,最终在没有 prompt/stdin 时触发 #47 的报错。

## 修复方案
- 为 Ink stdin raw mode 增加 Windows 风险终端检测,在 MSYS2/Cygwin/mintty 或显式禁用开关下跳过 raw mode,使用 cooked input fallback。
- early input 捕获在启动早期复用同类风险判断,避免 REPL 渲染前就触发 raw mode 崩溃。
- postinstall 在 Windows 上清理属于本包的 csc.ps1,让 PowerShell 回落到与 cmd.exe 一致的 csc.cmd 启动路径。
- 新增 non-interactive 判定工具,保留显式 -p/--print、--init-only、--sdk-url 的 headless 行为,但要求 stdin/stdout 都不是交互 TTY 才自动进入 non-interactive,避免 PowerShell shim 下裸 csc 被误判。

## 变更要点
- 新增 packages/@ant/ink/src/core/raw-mode-support.ts 及单元测试,覆盖普通 Windows shell、MSYS2/Cygwin/mintty 和禁用开关
- 调整 Ink App raw mode 生命周期,只在真正启用 raw mode 后写入/清理 bracketed paste、focus reporting、extended key 等终端控制序列
- 调整 component unmount/exit 清理逻辑,按 rawModeEnabledCount/rawModeActive 关闭实际启用的输入监听和 raw mode
- 调整 src/utils/earlyInput.ts,避免不安全 Windows 终端在启动阶段启用 stdin raw mode
- 调整 scripts/postinstall.cjs,立即和延迟清理 npm 生成的 csc.ps1 shim
- 调整 src/main.tsx 使用 shouldUseNonInteractiveSession,并新增对应测试覆盖 PowerShell shim 场景

## 自测
- bun test packages/@ant/ink/src/core/__tests__/raw-mode-support.test.ts src/utils/__tests__/earlyInput.test.ts src/utils/__tests__/nonInteractiveSession.test.ts
- node --check scripts/postinstall.cjs
- bun run src/entrypoints/cli.tsx --version
- bun run lint
- git diff --check

## 已知限制
- bun run typecheck 仍失败,错误来自仓库既有缺失声明/缺失模块和无关类型问题,不来自本次改动。
2026-05-14 17:07:51 +08:00
..
abortController.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
agentToolFilter.test.ts feat: 添加 LocalMemoryRecallTool 和 VaultHttpFetchTool 2026-05-09 23:04:12 +08:00
argumentSubstitution.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
array.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
autonomyAuthority.test.ts feat: harden autonomy lifecycle, OOM bounds, and provider-boundary finalization 2026-04-29 14:04:27 +08:00
autonomyCommandSpec.test.ts feat: 添加 autonomy 自主模式命令系统 2026-04-22 22:38:09 +08:00
autonomyFlows.test.ts feat: harden autonomy lifecycle, OOM bounds, and provider-boundary finalization 2026-04-29 14:04:27 +08:00
autonomyPersistence.test.ts feat: harden autonomy lifecycle, OOM bounds, and provider-boundary finalization 2026-04-29 14:04:27 +08:00
autonomyQueueLifecycle.test.ts feat: harden autonomy lifecycle, OOM bounds, and provider-boundary finalization 2026-04-29 14:04:27 +08:00
autonomyRuns.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
bufferedWriter.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
bunHashPolyfill.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
caCerts.test.ts feat: 添加代理和 CA 证书功能改进及测试 2026-05-12 16:24:02 +08:00
cacheStats.test.ts feat: 添加 Provider Registry、StatusLine、Cache Stats 和其他增强 2026-05-09 23:04:35 +08:00
CircularBuffer.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
claudemd.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
collapseHookSummaries.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
collapseTeammateShutdowns.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
configConstants.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
contentArray.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
context.test.ts feat(compact): add CoStrict model support and prevent infinite compaction loops 2026-05-12 20:07:24 +08:00
controlMessageCompat.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
cron.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
cronScheduler.baseline.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
cronTasks.baseline.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
Cursor.test.ts fix: protect tabs from wrap-ansi expansion in MeasuredText 2026-05-12 16:05:08 +08:00
detectRepository.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
diff.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
directMemberMessage.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
displayTags.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
earlyInput.test.ts feat: 重构供应商层次 (#286) 2026-04-17 09:33:14 +08:00
effort.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
envUtils.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
envValidation.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
errors.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
file.test.ts Revert "feat: 添加 GBK 编码自动检测支持,文件读写工具透明处理非 UTF-8 文件" 2026-05-10 22:57:30 +08:00
fileStateCache.test.ts fix: merge sub-agent readFileState to prevent cross-agent write conflicts 2026-05-13 16:36:46 +08:00
fingerprint.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
format.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
formatBriefTimestamp.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
frontmatterParser.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
generators.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
git.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
gitDiff.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
glob.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
groupToolUses.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
hash.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
horizontalScroll.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
hyperlink.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
imageResizer.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
json.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
lanBeacon.test.ts feat: 添加 Provider Registry、StatusLine、Cache Stats 和其他增强 2026-05-09 23:04:35 +08:00
language.test.ts Feat/integrate lint preview (#285) 2026-04-16 20:59:29 +08:00
lazySchema.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
localValidate.test.ts feat: 添加 Local Vault 加密存储服务 2026-05-09 23:04:07 +08:00
markdown.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
memoize.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
messageQueueManager.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
messages.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
modelCost.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
modifiers.test.ts feat: 添加工具类增强与状态管理改进 2026-04-22 22:38:10 +08:00
ndjsonFramer.test.ts fix: bound agent communication memory growth (#369) 2026-04-27 14:47:18 +08:00
nonInteractiveSession.test.ts fix(windows): prevent terminal startup failures 2026-05-14 17:07:51 +08:00
notebook.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
objectGroupBy.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
path.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
peerAddress.test.ts feat: 远程群控 (#243) 2026-04-11 23:22:55 +08:00
pipeMuteState.test.ts Feat/integrate lint preview (#285) 2026-04-16 20:59:29 +08:00
pipePermissionRelay.test.ts feat: 远程群控 (#243) 2026-04-11 23:22:55 +08:00
pipeStatus.test.ts feat: 添加工具类增强与状态管理改进 2026-04-22 22:38:10 +08:00
pipeTransport.test.ts feat: 远程群控 (#243) 2026-04-11 23:22:55 +08:00
privacyLevel.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
proxy.test.ts feat: 添加代理和 CA 证书功能改进及测试 2026-05-12 16:24:02 +08:00
queueProcessor.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
remoteControlStatus.test.ts feat: 添加工具类增强与状态管理改进 2026-04-22 22:38:10 +08:00
remoteTriggerAudit.test.ts feat: 添加工具类增强与状态管理改进 2026-04-22 22:38:10 +08:00
sanitization.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
semanticBoolean.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
semanticNumber.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
semver.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
sequential.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
sessionState.test.ts feat(remote-control): 优化 Web 展示、状态同步与桥接控制流程 (#288) 2026-04-17 16:21:27 +08:00
set.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
slashCommandParsing.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
sleep.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
sliceAnsi.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
stream.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
stringUtils.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
systemPrompt.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
taggedId.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
tasks.test.ts fix: 修复任务列表数字ID乱序和内存轮询导致滚动跳动 2026-05-13 16:44:13 +08:00
taskStateMessage.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
taskSummary.test.ts Feat/integrate lint preview (#285) 2026-04-16 20:59:29 +08:00
teamDiscovery.test.ts feat: 添加工具类增强与状态管理改进 2026-04-22 22:38:10 +08:00
teammateMailbox.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
textHighlighting.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
tokenBudget.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
tokens.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
treeify.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
truncate.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
udsMessaging.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
udsResponseReader.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
userPromptKeywords.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
uuid.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
windowsPaths.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
withResolvers.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
words.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
xdg.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
xml.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00
zodToJsonSchema.test.ts style: 完成所有文件的lint 2026-05-01 21:39:30 +08:00