Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/core-candidate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ jobs:
- name: Compare common native traces
run: python experiments/differential/compare_candidate.py --out build/test-artifacts/candidate-common
- name: Test common comparison and failure gates
run: python -m unittest discover -s experiments/differential -p test_candidate_compare.py -v
run: python -m unittest discover -s experiments/differential -p 'test_candidate*.py' -v
- name: Compare extended capability traces
run: python experiments/differential/capability_matrix.py --trace "${{ env.TERMFORGE_TRACE }}" --candidate "${{ env.TERMFORGE_ALACRITTY_TRACE }}" --out build/test-artifacts/candidate-capabilities-cli
- name: Test extended capabilities and unsupported gates
Expand Down
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,10 @@ add_executable(buffer_state_test experiments/core/buffer_state_test.cpp)
target_link_libraries(buffer_state_test PRIVATE termforge_core)
termforge_warnings(buffer_state_test)

add_executable(alternate_mode_test experiments/core/alternate_mode_test.cpp)
target_link_libraries(alternate_mode_test PRIVATE termforge_core)
termforge_warnings(alternate_mode_test)

add_executable(paste_test experiments/shell/paste_test.cpp)
termforge_warnings(paste_test)
add_executable(clipboard_policy_test experiments/shell/clipboard_policy_test.cpp)
Expand Down Expand Up @@ -279,6 +283,7 @@ if(BUILD_TESTING)
add_test(NAME selection_core COMMAND selection_test)
add_test(NAME search_core COMMAND search_test)
add_test(NAME buffer_state_core COMMAND buffer_state_test)
add_test(NAME alternate_mode_core COMMAND alternate_mode_test)
add_test(NAME paste COMMAND paste_test)
add_test(NAME clipboard_policy COMMAND clipboard_policy_test)
add_test(NAME keyboard COMMAND keyboard_test)
Expand Down
1 change: 1 addition & 0 deletions docs/EVIDENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

| 配置 | 证据定位 |
|---|---|
| 自主 C++ 限定 1049 协议 | [固定结果](../experiments/core/results/2026-10-29-cpp-1049/README.md)、[验证身份](../experiments/core/results/2026-10-29-cpp-1049/validation.json):文字/光标/颜色及 pending-wrap、重复进入与读者失效;55项中Qt1项分列,13条内部skip及旧负例判据失败保留。未验收非颜色属性/全网格背景、其他模式、真实TUI/IME/DPI、呈现或性能 |
| 自主 C++ 双缓冲存储与文档 epoch 基础 | [固定结果](../experiments/core/results/2026-10-29-buffer-state-r2/README.md)、[验证身份](../experiments/core/results/2026-10-29-buffer-state-r2/validation.json):拥有状态、共享 ID、隐藏帧 resize 回滚与跨缓冲句柄失效;Qt/candidate 关闭配置的完整 50 项及 12 条内部 skip 分列。未接 private CSI,不是原版模式、Qt 产品路线或完整 #27 验收 |
| Qt cmd 标签与退出前回收 | [固定结果](../experiments/shell/results/2026-10-28-qt-tabs/README.md)、[验证身份](../experiments/shell/results/2026-10-28-qt-tabs/validation.json):双 cmd 隔离、失败页、关闭与四个实际事件循环边界;Qt 1 项和其他 49 项诊断及内部跳过分列,旧中断轮不拼接 |
| Qt 正式入口的独立 hosted 构建 | [固定结果](../experiments/shell/results/2026-10-28-qt-cpp-ci/README.md)、[验证身份](../experiments/shell/results/2026-10-28-qt-cpp-ci/validation.json):固定 SDK、VS 2026 hosted 与真实 cmd 的 offscreen / OwnedJob 检查;原依赖换行和 generator 失败保留。没有原生上屏、完整部署哈希或产品包验收 |
Expand Down
2 changes: 1 addition & 1 deletion docs/FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
|---|---|---|---|
| 自主 C++ / Qt / 固定微软 ConPTY | **实现中,未验收**:[显式 Qt 入口](../src/qt/README.md)提供固定 80×24 的 cmd 标签、基本 ASCII/16 色及各会话独立有界队列;双 cmd 输入、关闭和错误隔离及真实事件循环退出前回收有[限定验证](../experiments/shell/results/2026-10-28-qt-tabs/README.md)。Qt 1 项与其余 49 项既有/独立诊断分列 | 分屏、其他 shell、工作区恢复、动态 resize、历史/选择/Find、Unicode/IME、真实 DPI、应用兼容与性能仍需实现或迁移;应用/标签退出策略沿原型合同,完整 WindTerm 标签行为对照未完成;当前不是可发布开发包 | R2 |

自主 C++ 核心的 [#130 双缓冲存储基础](../experiments/core/results/2026-10-29-buffer-state-r2/README.md)已在独立模块边界实现拥有状态、交换激活、共享行 ID、双帧物理 resize 与文档 epoch 隔离,旧位置、选择、搜索及 viewport 不会在切换返回后复活。该基础尚未接入 private CSI;1049 的样式、重复进入清空及历史文档策略与完整 [#27](https://github.com/JavaZeroo/termforge/issues/27)另行验收,不表示产品已支持备用屏或 Qt 交互已迁移。
自主 C++ 核心已有 [#130 双缓冲存储基础](../experiments/core/results/2026-10-29-buffer-state-r2/README.md),并接入 [#135 限定 1049 协议](../experiments/core/results/2026-10-29-cpp-1049/README.md):strict/recovery 识别 `?1049h/l`,重复进入归首格、清旧备用文本和复位写入颜色,返回恢复主屏文字/光标/颜色及 pending-wrap。共享行 ID、双帧物理 resize 与逻辑 epoch 防止旧位置、选择、搜索及 viewport 复活,包括清屏后重写相同文字。原版完整网格/背景、非颜色属性及其他模式仍未知;本地55项中 Qt1项与其余54项诊断分列,13条内部跳过保留,不表示完整 [#27](https://github.com/JavaZeroo/termforge/issues/27)、真实 TUI/Qt 交互或系统剪贴板已验收。

官方参考的基础文字行为已按 [R1-01 合同](research/windterm-r1-text-contract.md)完成两组各两轮的自动取证;这为独立实现提供行为依据,产品能力仍按下表分别验收。

Expand Down
5 changes: 3 additions & 2 deletions experiments/core/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 最小终端状态回放与有界恢复

本说明描述**默认自研 C++17 核心**:把分块字节流变成可检查的屏幕、光标和有界历史状态,供离线回放、接收实验和[本地 shell 工作区](../shell/README.md)使用,不依赖 WindTerm、Qt 或私有实现。显式候选构建的 Term/Processor 能力与 [C ABI / C++ 拥有值适配](CANDIDATE.md)另列,不受下表的自研支持范围约束;产品核心路线见 [ADR-0003](../../docs/adr/0003-core-reference-and-reuse.md)。
本说明描述**默认自研 C++17 核心**:把分块字节流变成可检查的屏幕、光标和有界历史状态,供离线回放、接收实验和[本地 shell 工作区](../shell/README.md)使用,不依赖 WindTerm、Qt 或私有实现。显式候选构建的 Term/Processor 能力与 [C ABI / C++ 拥有值适配](CANDIDATE.md)另列,不受下表的自研支持范围约束;已确认的产品核心路线见 [ADR-0008](../../docs/adr/0008-cpp-core-qt-widgets.md)。

解析器提供默认 `strict` 和显式 `ParseMode::recovery` 两种模式。replay/receive、trace 默认值和共同子集差分使用严格模式,本地 shell 选择恢复模式;测试 trace 可用第七个参数 `--recovery` 比较恢复行为,或 `--resize=RxC` 在输入结束点 resize 并追加检查点。[恢复策略](RECOVERY.md)定义未知控制序列、非法 UTF-8、超长输入、取消及 EOF 的有界处理;下表未支持输入的失败规则适用于严格模式。

Expand All @@ -21,12 +21,13 @@
| `CSI n X` | 擦除当前位置起 n 格;省略或 0 为 1,裁剪到本行右边界,不移动光标,清除待换行;[来源与 More 回归](../../docs/research/more-capture-ech.md) |
| UTF-8 | 跨块解码 1–4 字节;严格拒绝过长编码、代理区、越界、孤立续字节及截断输入 |
| `CSI m` | 0 重置、1/22 粗体开关;30–37/40–47 和 90–97/100–107 前景/背景色;39/49 恢复默认色 |
| `CSI ?1049h/l` | [限定文字/光标/颜色合同](results/2026-10-29-cpp-1049/README.md):进入/重复进入归首格、清旧备用文本及复位前景/背景,退出恢复主屏与 pending-wrap;重复进入的逻辑世代使旧读者失效。原版完整网格背景、非颜色属性及其他模式未知 |

状态 JSON 使用 0 起始 `row/column`,每行保留尾部空格,记录 `wrap_pending`、完整可见行、保留的历史行和已淘汰行数。滚动按物理行保存历史,默认 24×80、最多 100 行历史;没有逻辑行重排。搜索由独立只读投影模块执行,解析器不持有查询。清除显示不是清除历史。

解析器在 `feed` 调用之间保留 ESC/CSI 和 UTF-8 状态。SGR 参数最多 16 个,其他命令按语义限制为 1 或 2 个;数值最多 99,999、CSI 参数到终止字符最多 32 字节。尺寸限制为 1–200 行、1–500 列,历史容量 0–10,000;容量为零时只累计淘汰数。

**明确未支持:** 完整字素簇和文字整形、ZWJ/变体选择符/旗帜/肤色修饰序列、256 色/真彩色及其他 SGR 属性、OSC/DCS 的功能、备用屏幕、滚动区域、插入删除、逻辑行 reflow、模式切换、回复查询及其他控制字节。严格模式下,未支持输入、非法参数或 EOF 时截断的序列使运行失败;不静默忽略,也不输出成功快照。严格模式不支持控制序列内部的 C0 中断/取消;错误后不得继续复用该解析器对象。Recovery 可消费这些未实现功能,但不会执行它们。
**明确未支持:** 完整字素簇和文字整形、ZWJ/变体选择符/旗帜/肤色修饰序列、256 色/真彩色及其他 SGR 属性、OSC/DCS 的功能、完整备用屏关联模式、滚动区域、插入删除、逻辑行 reflow、1049 以外的模式切换、回复查询及其他控制字节。严格模式下,未支持输入、非法参数或 EOF 时截断的序列使运行失败;不静默忽略,也不输出成功快照。严格模式不支持控制序列内部的 C0 中断/取消;错误后不得继续复用该解析器对象。Recovery 可消费这些未实现功能,但不会执行它们。

## 字符宽度与单元格契约

Expand Down
Loading
Loading