Skip to content
Merged
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@ if(WIN32)
add_executable(conpty_ctrl_c_probe experiments/conpty/ctrl_c_probe.cpp)
termforge_warnings(conpty_ctrl_c_probe)
target_compile_definitions(conpty_ctrl_c_probe PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN _WIN32_WINNT=0x0A00)
add_executable(conpty_margin_probe experiments/conpty/margin_probe.cpp)
termforge_warnings(conpty_margin_probe)
target_compile_definitions(conpty_margin_probe PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN _WIN32_WINNT=0x0A00)
target_link_libraries(conpty_margin_probe PRIVATE user32 bcrypt)
add_executable(presentation_probe experiments/presentation/presentation.cpp)
termforge_warnings(presentation_probe)
target_compile_definitions(presentation_probe PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN UNICODE _UNICODE)
Expand Down Expand Up @@ -307,6 +311,7 @@ if(BUILD_TESTING)
termforge_add_python_test(receive -m unittest experiments.receive.test_receive -v)
termforge_add_python_test(conpty -m unittest experiments.conpty.test_conpty -v)
termforge_add_python_test(conpty_ctrl_c -m unittest experiments.conpty.test_ctrl_c -v)
termforge_add_python_test(conpty_margin -m unittest experiments.conpty.test_margin_run -v)
termforge_add_python_test(presentation -m unittest experiments.presentation.test_presentation -v)
termforge_add_python_test(shell -m unittest experiments.shell.test_shell -v)
termforge_add_python_test(selection_bytes -m unittest experiments.shell.test_selection_bytes -v)
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

An independent, fully open-source terminal project targeting WindTerm 2.7.0 feature, interaction and performance parity. Not affiliated with WindTerm or KingToolbox.

当前是有限 Windows 本地终端原型,**R1 基础文字交互已按限定合同验收**:真实 cmd/ConPTY、两个区域共最多8个会话、有界历史/选择复制/粘贴/查找、固定Microsoft拼音,以及同次八会话完整文字流程和有限资源回收均有[重复运行与独立审计](experiments/shell/results/2026-10-24-r1-system-workflow/validation.json)。接下来进入R2的可靠本地终端准备;常用TUI、配置恢复、SSH/SFTP和日常开发包尚未完成,UI也尚未全面等价。没有与WindTerm性能等价的结论。`TermForge` 是暂名。
当前是有限 Windows 本地终端原型,**R1 基础文字交互已按限定合同验收**:真实 cmd/ConPTY、两个区域共最多8个会话、有界历史/选择复制/粘贴/查找、固定Microsoft拼音,以及同次八会话完整文字流程和有限资源回收均有[重复运行与独立审计](experiments/shell/results/2026-10-24-r1-system-workflow/validation.json)。当前推进 R2,显式候选已验证固定 Vim 工作流,配置与工作区恢复已有受限验收;完整终端模式、复杂文字、真实不同 DPI 和日常开发包仍待完成,见 [R2 出口检查表](docs/milestones/R2-local-terminal.md)。SSH/SFTP 留在 R3,UI也尚未全面等价。没有与WindTerm性能等价的结论。`TermForge` 是暂名。

## 开始使用

Expand All @@ -25,7 +25,7 @@ An independent, fully open-source terminal project targeting WindTerm 2.7.0 feat
| 已经做了什么、还缺什么 | [当前能力与目标矩阵](docs/FEATURES.md) |
| 最终目标与五个路标(从远到近) | [总体计划](docs/PLAN.md) |
| 官方发行平台、架构与声明的最低系统边界 | [2.7.0 平台范围台账](research/windterm-2.7.0-platform-scope.md) |
| 下一路标的工作包与前置 | [R2 可靠本地终端](docs/PLAN.md#r2可靠本地终端持久化与可发布开发版) |
| 当前路标的验收、剩余工作与前置 | [R2 出口检查表](docs/milestones/R2-local-terminal.md) · [执行项](docs/TRACKING.md) |
| 已验收的基础文字交互合同 | [R1 基础文字交互](docs/milestones/R1-local-text.md) |
| GitHub milestones、issues 和执行顺序 | [任务跟踪](docs/TRACKING.md) |
| 结论依据、复现命令和全部文档 | [证据索引](docs/EVIDENCE.md) · [文档导航](docs/README.md) |
Expand Down
4 changes: 3 additions & 1 deletion docs/EVIDENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@

| 结论 | 实现/命令入口 | 已有结果与限制 |
|---|---|---|
| 原 10 秒纯夹具超时的阶段保留(#40 未关闭) | [限定合同](research/inventory-timeout-checkpoints.md)、[正常与受控超时对照](../research/ime/results/2026-10-26-inventory-timeout-checkpoints/validation.json) | GO 后即使最终 JSON 尚未返回,也可读取有界白名单阶段;实际同一 Try AST 在 ended 回调挂起仍抛原 TimeoutExpired,保留 progress-ended、回收与 Job0,不补造 failed/complete。旧父 runner 对同生产端丢观察的反事实成立;54 项原套件通过不回填历史 CI 的未知阶段或原因 |
| ConPTY 系统/固定官方后端的同源 margin A/B(#41、#47 未关闭) | [合同与第一方来源](research/conpty-margin-backends.md)、[固定 175B 与 16 case 结果](../experiments/conpty/results/2026-10-26-margin-backends/validation.json) | 系统后端末端 REGION_CIXED;官方固定 1.25 同包双文件保留 DECSTBM,候选末端恢复正确。禁用 VT processing 路线被合法窄屏反例拒绝;源 CHAR_INFO 仍错,末端正确不等于原生 API 正确。全部 child37/EOF109/Job0;这里只建立后端可行路径,默认产品后端未改,实际 GUI、resize、粘贴及 R1 整合另由 #47 验收 |
| 拒绝负例的读取前停止(#46 夹具修正) | [原记录、反事实及 fresh 验证](../experiments/shell/results/2026-10-26-receiver-stop/validation.json)、[公开空数据夹具](../experiments/shell/fixtures/rejected-order-before-read.json) | F2 预期拒绝可先于首读完成停止;旧 oracle 误要求至少读过并成功取消一次。仅拒绝路径接受已证明的零读/空数据/停止并 join/无错误状态,正常读取门槛保留。原记录及 fresh 再现的同一零读字节在旧判定失败、新判定通过;12 项纯测试含字段反例,原模块14/14通过,native EXE身份未变且所有Job0。原完整回归红保留,#44 的退出根因仍未知 |
| 候选 GUI 合法空标题(#45) | [真实 GUI 前后对照](../experiments/shell/results/2026-10-26-empty-title/validation.json)、[转换入口](../experiments/presentation/render.hpp)、[持续回归](../experiments/shell/candidate_title_test.cpp) | 自有 console 实际发出完整空 OSC 标题后,旧转换抛出 invalid text;空 UTF-8 合法转换为空 UTF-16 后,两 fresh GUI 存活且正常回收。混合 Unicode 与四类非法非空反例保留,旧二进制反事实仍失败。首次未观察到空 OSC 的尝试不算复现;旧候选 normal-1 的异常调用点和载荷未知,不能由新复现回填其根因;不是完整 R2 或 WindTerm 等价验收 |
| 工作区恢复的运输完成端点(#38 夹具修正) | [限定合同](research/workspace-restore-transport-oracle.md)、[原失败及默认/候选验证](../experiments/shell/results/2026-10-26-workspace-transport-oracle/validation.json) | 完整 OSC 标题重复标记使旧 rfind 取错位置;真实 ConPTY 另有完整输出后以 column-one CUP 返回提示符的分支。独立判定保留 UTF-8、排除标题和命令回显,32 条断言及默认/候选原场景均通过;12 个样本的哈希、三会话关闭、Job0 与 desktop 删除另经复核。原期限/负载/恢复断言保留,原失败不回填;这是测试端点修正,不是产品恢复故障修复 |
| 持续 cmd 输出与原始 Ctrl-C 回归(#36 未关闭) | [受监督入口](../experiments/conpty/README.md#持续-cmd-输出与-ctrlc-独立回归)、[三次 fresh 公开记录及本地字节复核](../experiments/conpty/results/2026-10-26-ctrl-c-retest/validation.json) | 完整一百万次循环、一次洪流 ETX、立即后续命令、原五秒期限及退出 37;三次原始输入/输出哈希、独立标记与 Job0 已本地重算。cmd 固定版本 9278、conhost 9444;旧失败与本次成功原因未知,未修改产品 Ctrl-C 路径。原始运输仅本地保留,公开哈希不能单独复核全部原始断言;未验原生控制处理函数、独立构建或性能,不能关闭 #36 |
| controller B 正常结束后 cmd 退出未验收(#44) | [原失败脱敏记录](../experiments/shell/results/2026-10-26-controller-exit/validation.json)、[待补诊断及关闭合同](https://github.com/JavaZeroo/termforge/issues/44) | child 精确接收32字节、正常退出0且已join,内外Job0;cmd仅记录close后的0xC000013A,wait_exit布尔和close前状态未知。随后同合同两轮通过不能覆盖原失败;probe未链接候选适配器,根因与候选关联均未证明,继续阻塞#38 |
| controller B 正常结束后 cmd 退出未验收(#44) | [原失败脱敏记录](../experiments/shell/results/2026-10-26-controller-exit/validation.json)、[新退出诊断及有界重放](../experiments/shell/results/2026-10-26-controller-exit-observation/validation.json)、[关闭合同](https://github.com/JavaZeroo/termforge/issues/44) | 原件中 child 精确接收32字节、正常退出0且已join,内外Job0;cmd仅记录close后的0xC000013A,原 wait/close前状态仍未知。新诊断分列实际写入、原生wait结果/错误、close前码及清理;失败先保留固定scalar白名单。基线10轮、新观察50轮未复现;最终两个配置的workflow各16项通过、各两fresh控制轮,不能覆盖原失败或关闭#44。probe不链接候选适配器,未证明候选关联或产品修复,继续阻塞#38 |
| 候选文字观测与回显端点(#38 夹具修正) | [同源码前后对照及反事实](../experiments/shell/results/2026-10-26-native-observation/validation.json)、[标准文本投影](../experiments/core/text_projection.hpp) | 候选零宽spacer原被原生观测拼成空格,四类场景稳定卡在中文行;统一project_line后原四类各3fresh通过。运行观测另捕获写完但回显未到时先全选,迟到12字节使选区合法失效;原同一次五秒等待加严为完整实时回显后选择,5fresh/10个窗口通过,原assert保留。原no-echo对照的间歇红与后续绿均保留,因果解释按时序和选区合同推断;不宣称产品选择策略修复、全候选等价或完整R2验收 |
| R1完整文字工作流与总出口(限定) | [同次系统组合及独立审计](../experiments/shell/results/2026-10-24-r1-system-workflow/validation.json)、[同源码既有回归](../experiments/shell/results/2026-10-24-r1-system-workflow/regression.json)、[协议与复现](../experiments/shell/WORKFLOW.md) | `ce9b24d`;[主CI 40045678550](https://github.com/JavaZeroo/termforge/actions/runs/40045678550) Windows38/Ubuntu24,本地38/38且内部8项skip另列;[显式verify 40045686776](https://github.com/JavaZeroo/termforge/actions/runs/40045686776)实际八会话两fresh,各26主点/13系统点/28动作、409/512观测、18实例回收。独立核191文件、58源码/5二进制身份、B原件51→57→58及目标隔离、两次actual revision绑定滚动、8夹测/19阶段窗/5短驻留,21真实产物反例全拒、两个最终帧已查看;同源码E2两轮与旧12组24轮/五组IME另审。结合R1-01–07满足限定总出口;无EXE独立重哈希/源到二进制证明,main内部skip未知,presented_done=null,不构成日常版、长期无泄漏或WindTerm性能等价 |
| R1 八会话 E2 数据工作流与运行观测 | [协议/自动入口](../experiments/shell/WORKFLOW.md)、[固定源码审计](../experiments/shell/results/2026-10-24-r1-eight-sessions/validation.json)、[既有能力复验](../experiments/shell/results/2026-10-24-r1-eight-sessions/regression.json) | 固定源码与独立复核:`72fe231` / [主CI](https://github.com/JavaZeroo/termforge/actions/runs/40040980384),本地及同源码hosted各两轮。本地35/35(内部8项skip),主CI Windows35/Ubuntu21;[同源码真实IME复验](https://github.com/JavaZeroo/termforge/actions/runs/40040994121)为五模式28检查点。验收范围为每轮26检查点、18会话身份、235/256有界观测,覆盖五路洪流、阅读/Find/输入/缩放/淘汰、5次8→6→8和合成粘贴取消/关闭;实际窗口创建、字节/日志、worker/Job及非输入desktop回收分别复核。此历史data-only批次不等于同次真实CF/IME;完整组合见本表最新总验收 |
Expand Down
2 changes: 1 addition & 1 deletion docs/PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@

**硬门槛:** [ADR-0003](adr/0003-core-reference-and-reuse.md) 的候选构建与核心路线重审不能因 UI 已投入开发而跳过。[#20](https://github.com/JavaZeroo/termforge/issues/20) 分两个节点推进:R1 期间可并行检查候选版本/许可、构建、共同子集和历史投影适配的可行性;R2 扩大终端模式与常用 TUI 的实现投入前,完成实际候选与共同轨迹比较并作路线决定。核心与 GUI 的产品路线决定须使用 [#19](https://github.com/JavaZeroo/termforge/issues/19) 的平台切片 [#23](https://github.com/JavaZeroo/termforge/issues/23) 已冻结的平台/架构/最低系统边界,明确候选的支持缺口;#19 的其余全量功能取证不阻塞候选构建或本决策。不要求先自研补齐候选的全部功能,也不等待正式 WindTerm 性能基线。产品架构需要后续明确决策;现有局部 ADR 和原型验证不自动成为完整产品架构的结论。

**出口条件:** 固定本地真实任务、TUI、文字输入、配置恢复、真实 DPI 和干净环境发布全部通过;实际支持与已知差异进入功能矩阵。仅普通命令可运行不等同于可靠本地终端。
**出口条件:** 固定本地真实任务、TUI、文字输入、配置恢复、真实 DPI 和干净环境发布全部通过;实际支持与已知差异进入功能矩阵。详细验收、证据边界与近期执行顺序见 [R2 出口检查表](milestones/R2-local-terminal.md)。仅普通命令可运行不等同于可靠本地终端。

## R1:基础文字交互闭环

Expand Down
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
|---|---|
| 已经能做什么,离目标差在哪里? | [功能与差异矩阵](FEATURES.md) |
| 最终目标是什么,如何分阶段完成? | [五个路标,远到近](PLAN.md) |
| 下一阶段具体做哪些事情? | [R2工作包与前置](PLAN.md)、[当前执行项](TRACKING.md) |
| R2 还需完成什么、怎样验收? | [R2 出口检查表](milestones/R2-local-terminal.md)、[当前执行项](TRACKING.md) |
| 已验收的基础文字交互合同是什么? | [R1 基础文字交互](milestones/R1-local-text.md) |
| 字体、网格和真实显示如何验收? | [R2 字体与显示合同](milestones/R2-font-display.md) |
| 哪项可开工,谁阻塞谁? | [GitHub 跟踪索引](TRACKING.md) |
Expand Down
3 changes: 2 additions & 1 deletion docs/TRACKING.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ R1已按[限定合同](milestones/R1-local-text.md)验收,[完整组合证据]

## R2执行切片

以下覆盖[总项#7](https://github.com/JavaZeroo/termforge/issues/7)的全部工作包;详细范围、验收清单和实时状态只在对应 issue 维护。原生 sub-issue / blocked-by 是依赖关系的权威记录。
以下覆盖[总项#7](https://github.com/JavaZeroo/termforge/issues/7)的全部工作包;出口与联合验收见 [R2 检查表](milestones/R2-local-terminal.md),单项范围和实时状态在对应 issue 维护。原生 sub-issue / blocked-by 是依赖关系的权威记录。

| 切片 | GitHub | 可验收交付 | 真实前置 |
|---|---|---|---|
Expand All @@ -56,6 +56,7 @@ R1已按[限定合同](milestones/R1-local-text.md)验收,[完整组合证据]
| Windows 回归 | [#38](https://github.com/JavaZeroo/termforge/issues/38) | 定位工作区、交互及 CI 的真实失败 | 无;#35 的出口依赖,不能以局部几何结果代替修复 |
| Windows CI 回归 | [#40](https://github.com/JavaZeroo/termforge/issues/40) | 复核 `ime_inventory` 原 10 秒超时根因,保留 AST/最终进度与 OwnedJob 回收证据 | 无;作为 #38 的子项阻塞 #38,不能用本机或单次 CI 通过冒充修复 |
| ConPTY margin 差异 | [#41](https://github.com/JavaZeroo/termforge/issues/41) | 裁决宿主/传输的每缓冲区 margin,保留原场景和独立实现证据 | #26;作为 #27 的子项阻塞 #27,不能以模型切片或差异观察代替产品验收 |
| 显式官方 ConPTY 实验后端 | [#47](https://github.com/JavaZeroo/termforge/issues/47) | 固定同包 DLL/EXE 来源与身份,通过同一 Backend 验证实际 Session、GUI 和回收;不改变默认系统后端 | #41 的实现子项;仍需处理原生 API 与末端语义、resize、粘贴和完整工作流差异,不代表 #34 产品决定或 R2 出口 |
| More 尾部 ECH 与捕获时序 | [#42](https://github.com/JavaZeroo/termforge/issues/42) | [限定合同](research/more-capture-ech.md):默认 ECH、完整 More 提示、q/退出/真实 EOF;候选 pending-wrap 差异保留给 #27 | 无;#38 的子项,与 margin 修复分开;完整原始输入和旧失败保留,不静默降级为 match |
| controller 正常退出观测缺口 | [#44](https://github.com/JavaZeroo/termforge/issues/44) | 记录 wait_exit 与 close 前 cmd 状态,定位真实 child→cmd/close 转换 | 无;#38 的子项与出口阻塞;后续同合同重跑成功不覆盖原失败 |
| 候选 GUI 合法空标题 | [#45](https://github.com/JavaZeroo/termforge/issues/45) | 修正空 UTF-8 转换,使用真实 console 标题事件验证 GUI 存活,并保留非法非空输入拒绝 | 无;#38 的子项;新最小复现与旧 normal-1 未定位异常分列 |
Expand Down
Loading