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
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@
*.yml text eol=lf
*.py text eol=lf
*.ps1 text eol=crlf
third_party/conpty/LICENSE text eol=lf
experiments/core/fixtures/*.bin binary
49 changes: 49 additions & 0 deletions .github/workflows/qt-cpp.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Qt C++ fixed ConPTY build and smoke

on:
push:
pull_request:
workflow_dispatch:

permissions:
contents: read

jobs:
qt-cpp-windows:
runs-on: windows-2025
timeout-minutes: 20
env:
PYTHONUTF8: '1'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with:
python-version: '3.12'
- name: Verify preparation failure contracts
run: python -m unittest tools.test_prepare_qt_build -v
- name: Prepare manifest-pinned Qt qtbase and Microsoft ConPTY
run: python -m tools.prepare_qt_build
- name: Preserve path-free dependency preparation identity
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: qt-cpp-dependency-preparation
retention-days: 14
if-no-files-found: warn
path: local/qt-build-preparation.json
- name: Configure explicit Qt product and test entries
run: |
$dependencyRoot = Join-Path $env:GITHUB_WORKSPACE 'local/qt-build-deps'
cmake -S . -B build/qt-cpp -G 'Visual Studio 18 2026' -A x64 `
-DTERMFORGE_BUILD_QT_SHELL=ON -DBUILD_TESTING=ON `
-DTERMFORGE_BUILD_CANDIDATE_ADAPTER=OFF `
"-DPython3_EXECUTABLE=$((Get-Command python).Source)" `
"-DQt6_DIR=$dependencyRoot/qt/lib/cmake/Qt6" `
"-DTERMFORGE_CONPTY_BACKEND_DIR=$dependencyRoot/conpty"
- name: Build Qt product and independent smoke
run: cmake --build build/qt-cpp --config Release --target termforge_qt_shell qt_cpp_shell_smoke --parallel 2
- name: Run Qt offscreen smoke in its owned Job
run: ctest --test-dir build/qt-cpp -C Release -R '^qt_cpp_shell$' --no-tests=error --verbose
# Keep this configuration independent from the default/system-backend and
# Alacritty reference jobs. SDKs, runtime folders and raw logs are not
# publication artifacts; this job does not produce a release package.
2 changes: 1 addition & 1 deletion 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, behavior, UI and performance parity. Windows 11 x64 first; Windows, Linux and macOS ultimately. Not affiliated with WindTerm or KingToolbox.

当前是有限 Windows 本地终端原型,**R1 基础文字交互已按限定合同验收,正在推进 R2 可靠本地终端与开发版**。已有 Win32 原型、有限多会话与配置恢复,以及独立 Alacritty 参考实验。正式路线已确定为自主 C++ 核心、当前采用 Qt Widgets GUI 与随包固定微软 ConPTY;新配置的最小整合、核心能力缺口、完整 TUI/输入、真实不同 DPI、性能预算和开发包仍需闭合。现状见[能力矩阵](docs/FEATURES.md),接续顺序见 [R2 交付路线与验收](docs/milestones/R2-local-terminal.md)。SSH/SFTP 属于 R3,完整 UI 与 WindTerm 性能等价均未验收。`TermForge` 是暂名。
当前是有限 Windows 本地终端原型,**R1 基础文字交互已按限定合同验收,正在推进 R2 可靠本地终端与开发版**。已有 Win32 原型、有限多会话与配置恢复,以及独立 Alacritty 参考实验。正式路线已确定为自主 C++ 核心、当前采用 Qt Widgets GUI 与随包固定微软 ConPTY;[最小单会话整合](https://github.com/JavaZeroo/termforge/issues/115)已合入 main,专用 CI、核心能力缺口、完整 TUI/输入、真实不同 DPI、性能预算和开发包仍需闭合。现状见[能力矩阵](docs/FEATURES.md),接续顺序见 [R2 交付路线与验收](docs/milestones/R2-local-terminal.md)。SSH/SFTP 属于 R3,完整 UI 与 WindTerm 性能等价均未验收。`TermForge` 是暂名。

方向已经用户确认,依据见 [ADR-0006](docs/adr/0006-confirmed-project-direction.md):原版行为优先,内部结构不强求一致,但认真研究、借鉴原版;用户已确认[自主 C++ 核心与当前 Qt Widgets GUI 路线](docs/adr/0008-cpp-core-qt-widgets.md),Windows 本地 Shell 后端采用[随包固定微软 ConPTY](docs/adr/0007-bundled-microsoft-conpty.md)。Alacritty 保留为参考,路线确认与实现验收分开。关键性能指标分别验收,具体允许波动范围后续与用户明确。

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 @@

| 配置 | 证据定位 |
|---|---|
| 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 失败保留。没有原生上屏、完整部署哈希或产品包验收 |
| 自主 C++ + Qt Widgets + 固定微软 ConPTY 正式目标 | [ADR-0007](adr/0007-bundled-microsoft-conpty.md) / [ADR-0008](adr/0008-cpp-core-qt-widgets.md) 记录用户确认;新组合的实现与验证另行留证,不引用旧默认或 Alacritty 通过结果代替 |
| 既有默认/Alpha:自主 C++ + 系统 ConPTY + Win32 | R1 限定总验收和有限 VT/Unicode 子集;与当前 Qt/固定后端目标组合分列 |
| Alacritty 历史参考:`termforge.4` + 系统 ConPTY | [固定来源/补丁台账](../experiments/candidates/alacritty/PROVENANCE.md)、[适配边界](../experiments/core/CANDIDATE.md)、[#39 字素合同](research/streaming-graphemes.md);结果仅证明其固定配置,不转为自主 C++ 能力 |
Expand Down
4 changes: 2 additions & 2 deletions docs/FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@

| 配置 | 当前定位 | 可以引用的证据与限制 |
|---|---|---|
| 正式目标:自主 C++ + Qt Widgets + 固定微软 ConPTY | [ADR-0007](adr/0007-bundled-microsoft-conpty.md) / [ADR-0008](adr/0008-cpp-core-qt-widgets.md) 已确认路线;先建立最小整合入口 | 新组合尚无完整工作流验收;核心能力与 Qt 交互按实际实现逐项验证,旧默认或 Alacritty 成果不自动继承 |
| 正式目标:自主 C++ + Qt Widgets + 固定微软 ConPTY | [ADR-0007](adr/0007-bundled-microsoft-conpty.md) / [ADR-0008](adr/0008-cpp-core-qt-widgets.md) 已确认路线;[最小单会话入口 #115](https://github.com/JavaZeroo/termforge/issues/115)已合入 main,另有[固定依赖的专用 hosted 构建](../experiments/shell/results/2026-10-28-qt-cpp-ci/README.md) | 新组合尚无完整工作流验收;核心能力与 Qt 交互按实际实现逐项验证,旧默认或 Alacritty 成果不自动继承 |
| 既有默认/Alpha:自主 C++ 核心 + 系统 ConPTY + Win32 | 现有原型与已发布体验包的固定路线,不需要 Rust;不等于新的正式组合已完成 | 已有 R1 限定验收;VT/Unicode 仍为有限子集,不能引用 Alacritty 参考的字素或 TUI 结果 |
| Alacritty 参考构建:`termforge.4` + 系统 ConPTY | `TERMFORGE_BUILD_CANDIDATE_ADAPTER=ON`;保留[历史核心比较](adr/0003-core-reference-and-reuse.md)与差分,不继续作为正式产品核心扩展 | [固定来源](../experiments/candidates/alacritty/PROVENANCE.md)、[适配边界](../experiments/core/CANDIDATE.md)与 [#39 字素合同](research/streaming-graphemes.md)均只证明其固定源码/配置 |
| 历史 Alacritty/固定后端整合分支:`termforge.5` + 固定官方 ConPTY | [PR #50(Draft)](https://github.com/JavaZeroo/termforge/pull/50),早期 `termforge.4` 联合源码 `3e5b96d` 的[原基线](research/joint-conpty-baseline.md)保留;后续限定修复已整合,尚未合入 main 或通过产品整体验收 | [#47](https://github.com/JavaZeroo/termforge/issues/47) 跟踪后端整合;终端 margin 与原生状态分列。[resize #51](https://github.com/JavaZeroo/termforge/issues/51) 与[工作区 #63](https://github.com/JavaZeroo/termforge/issues/63) 已在实验父分支限定闭合,完整 resize/历史由 [#29](https://github.com/JavaZeroo/termforge/issues/29) 接续;[GUI Vim #52](https://github.com/JavaZeroo/termforge/issues/52) 仍开放。[#53](https://github.com/JavaZeroo/termforge/issues/53) 的原 3MB/768B/16KiB 未完成粘贴取消/关闭、负例及八会话 data-only 两轮已限定验证并整合到实验父分支;同次真实 CF/IME 与完整官方矩阵未通过。fence 默认关闭;[ADR-0007](adr/0007-bundled-microsoft-conpty.md)已记录用户正式后端选择,接入成果须在自主 C++/Qt 路线重新整合并验证 |

正式目标组合为自主 C++ 核心 + Qt Widgets + 随包固定微软 ConPTY;Qt 客户端尚无完整产品能力或联合验收,当前先建立最小整合入口。以下保留既有实现与各固定证据;某个配置的通过结果不能转用于另一个配置。R1 的真实系统 CF/拼音验收属于固定自研核心配置,不外推到候选 `.4` 或实验后端联合配置。
正式目标组合为自主 C++ 核心 + Qt Widgets + 随包固定微软 ConPTY;Qt 最小单会话入口已有[限定本地验证](../experiments/shell/results/2026-10-28-qt-cpp-entry/README.md),尚无完整产品能力或联合验收。以下保留既有实现与各固定证据;某个配置的通过结果不能转用于另一个配置。R1 的真实系统 CF/拼音验收属于固定自研核心配置,不外推到候选 `.4` 或实验后端联合配置。

## 基础文字交互与本地终端

Expand Down
3 changes: 3 additions & 0 deletions docs/TRACKING.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@

| 工作 | 责任任务 | 硬前置或联合条件 |
|---|---|---|
| 正式路线最小单会话与专用 CI | [单会话 #115](https://github.com/JavaZeroo/termforge/issues/115)、[Qt CI #117](https://github.com/JavaZeroo/termforge/issues/117) | #115 已合入 main;#117 在固定依赖的干净 Windows 环境单独验证 Qt 入口,不由默认/参考 CI 代替 |
| 原版备用屏可观察合同 | [1049 取证 #118](https://github.com/JavaZeroo/termforge/issues/118) | 可独立调查;为 #27 提供原版证据,末端、local-shell transport 和未观察项分别记录 |
| 原版本地输出正确性自动化 | [小负载完整文本 #119](https://github.com/JavaZeroo/termforge/issues/119) | #3 的独立切片;生产事件、完整文本与回收绑定,尚不验收消费/呈现端点、扰动或正式 #4 基线 |
| 历史候选/官方后端联合基线 | [联合配置基线 #55](https://github.com/JavaZeroo/termforge/issues/55) | 保留原固定源码与红/绿结果;可复用输入和接入经验,不替代自主 C++/Qt/固定 ConPTY 的新配置验收 |
| 原生 API / VT 末端 margin 的处理路径 | [平台语义与方案 #56](https://github.com/JavaZeroo/termforge/issues/56) | 可用固定探针独立推进;不能以策略说明豁免 #41 原合同 |
| 实验后端连续 resize | [残尾与 Unicode 重放 #51](https://github.com/JavaZeroo/termforge/issues/51) | 原生 viewport 与原 GUI/Unicode 合同已由 PR #89 在实验父分支限定闭合;完整 resize 由 #29、最终官方配置由 #47 接续 |
Expand Down
4 changes: 2 additions & 2 deletions docs/milestones/R2-local-terminal.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

## 当前站位

R2 的平台调查、有限会话与恢复及 Alacritty 参考实验已有各自限定交付。当前正式路线为**自主 C++ 核心、Qt Widgets 与随包固定微软 ConPTY**,下一步先建立最小可构建整合,再补 C++ 核心能力和完整用户工作流。现有 C++ 核心仍是有限子集;候选的首批字素、TUI 与重排成功不转记为 C++ 能力。已有 Alpha、Win32 原型、Alacritty 和 Draft 后端保留固定身份,新组合需要自己的证据。
R2 的平台调查、有限会话与恢复及 Alacritty 参考实验已有各自限定交付。当前正式路线为**自主 C++ 核心、Qt Widgets 与随包固定微软 ConPTY**;[最小可构建单会话入口 #115](https://github.com/JavaZeroo/termforge/issues/115)已合入 main,并完成固定 80×24、本地 cmd 输入输出、错误和关闭回收的限定验证。接续补专用 CI、C++ 核心能力和完整用户工作流。现有 C++ 核心仍是有限子集;候选的首批字素、TUI 与重排成功不转记为 C++ 能力。已有 Alpha、Win32 原型、Alacritty 和 Draft 后端保留固定身份,新组合需要自己的证据。

历史联合源码 `3e5b96d` 的三配置[真实基线](../research/joint-conpty-baseline.md)及其后续限定修复继续用于复用输入、接入经验和复验原失败;它们不证明新的 C++/Qt/固定后端组合已通过。Draft #50 的后端成果接入当前路线后仍须验证原合同,路线确认不解除失败或跳过项。

Expand Down Expand Up @@ -43,7 +43,7 @@ flowchart LR

## 下一批的任务边界

1. **先建立正式 C++/Qt/固定后端最小整合,再复验后端成果。** 新组合先验证可构建、实际输出、尺寸、退出与回收,保留尚未支持的 C++ 核心模式和 Qt 交互缺口。 #55 已交付含红的真实基线;#51 原生 viewport resize、#63 工作区原生 viewport,以及 #62 的[真实 writer 持块、取消与停止夹具](../research/sender-fence.md)和 #53 原 UI/3MB/八会话 data-only 合同均已在各自范围验证并整合到实验父分支。接续 #52 GUI Vim 与 #47 的完整官方矩阵、同次真实 CF/IME;限定切片关闭不等于联合验收通过。未完成项可以用原冻结输入独立定位,最终修复验收须在联合配置重建;期限、负载和原失败保留,一次未复现不自动构成因果修复。
1. **从正式路线最小整合接续专用 CI 和后端复验。** #115 已限定验证固定 80×24 单会话;[#117](https://github.com/JavaZeroo/termforge/issues/117)接续固定依赖的干净 Windows CI。动态尺寸、C++ 核心模式和 Qt 交互缺口继续保留。#55 已交付含红的真实基线;#51 原生 viewport resize、#63 工作区原生 viewport,以及 #62 的[真实 writer 持块、取消与停止夹具](../research/sender-fence.md)和 #53 原 UI/3MB/八会话 data-only 合同均已在各自范围验证并整合到实验父分支。接续 #52 GUI Vim 与 #47 的完整官方矩阵、同次真实 CF/IME;限定切片关闭不等于联合验收通过。未完成项可以用原冻结输入独立定位,最终修复验收须在联合配置重建;期限、负载和原失败保留,一次未复现不自动构成因果修复。
2. **并行处理原版对照、平台语义与性能。** [原生语义处理路径 #56](https://github.com/JavaZeroo/termforge/issues/56)先明确 #41 原合同需要什么、哪些路径可支持;保留必要的上游或独立实现工作,不用“平台不同”豁免缺口。#3/#4 优先建立原版 Windows 本地终端基线;#54 现在冻结重复方法与完成端点并定位吞吐成本,数值预算作为提案交用户确认,不等到 #34 才补性能。
3. **按原版合同补自主 C++ 能力。** #29 核对极窄/极短、软硬行、历史/淘汰、选择/Find、连续 resize 和 child ack;#30 核对 IME 组合/提交/取消与输出/resize/切换、应用键盘/粘贴接收、实际复制及同次八会话。已验收的 #39 提供的是参考实现与固定场景;自主 C++ 是否具备同等字素能力必须独立实现和验证。
4. **补终端模式和应用矩阵。** #27 明确 DECOM/DECAWM、pending-wrap、保存恢复、异常序列与 margin×resize;#28 先固定应用版本/入口/动作及协议字节预期,再逐应用完成进入、操作、resize、退出、主屏恢复。Vim 的一个修复不替代完整 TUI 验收。
Expand Down
22 changes: 22 additions & 0 deletions experiments/shell/results/2026-10-28-qt-cpp-ci/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# 正式 C++ / Qt / 固定 ConPTY 的独立 hosted 构建

[#117](https://github.com/JavaZeroo/termforge/issues/117)在固定源码 `ecb559800e8146126117360ca24c519e08698ae6` 上完成专用 Windows CI;[验证身份](validation.json)分列输入、运行、原失败及限制。完整 R2 尚未完成。

## 实际结果

- [PR run 40700440118](https://github.com/JavaZeroo/termforge/actions/runs/40700440118)和[push run 40700431496](https://github.com/JavaZeroo/termforge/actions/runs/40700431496)均为 attempt 1、success。PR 实际检出 `5c3bea1ae05e5515d4cf7d6c36b1f098776be233`,与上述来源提交的 Git tree 完全一致。
- `windows-2025` 实际为 `windows-2025-vs2026/20261021.278.1`,编译器自报 MSVC 19.51.36260.0;固定 Qt SDK 仍是 Qt 6.10.3 的 MSVC 2022 x64 包。两个 Qt target 构建成功,候选核心关闭,后端固定为微软 ConPTY 1.25.260930003。
- 独立下载并审查 PR 的准备摘要:4358 项 SDK 文件的树哈希 `a35ab6fe76b62e4d9bd6d3c6b0d476c63583070cea5c9118ef5bb02042ffe266` 与本地两次不同目录的干净提取一致;归档、清单、SBOM 和 ConPTY 双文件另有固定哈希。仅新增相对 `qt.conf`,不修补 Qt 二进制或 `.prl`。
- PR 的 `qt_cpp_shell` 为 1/1,通过;真实 cmd 经程序化按键得到 750,子进程自然退出37,启动错误可见、窗口关闭回收均通过。外层 Job active=0、total=7、terminated=0。CTest 单项0.62秒、总0.68秒仅作诊断记录。

## 保留的失败与修复

首次 PR/push 的依赖准备失败于许可文件身份。真实 `git -c core.autocrlf=true checkout-index` 将该 LICENSE 转为 CRLF,复现了错误哈希;`.gitattributes` 明确该文件为 LF 后恢复清单哈希,许可内容和清单哈希未改。下一源码依赖准备通过,在 configure 处因 hosted 没有 VS 2022 实例失败;按实际映像改用 VS 2026 generator 后通过。两对失败 run 与各源码均保留,不重跑覆盖。

独立审查发现的摘要写入失败会泄露路径问题,已用公共 CLI 反例复现并修正:无法写摘要时仍输出固定错误码 JSON、退出1,保留准备阶段状态。最终准备测试6/6;Standards 与 Spec 复核均无剩余发现。

## 证据边界

详细回读的是 PR 的准备产物和 smoke 输出;push 的 success 只引用提供者元数据。现有默认/系统后端 CI、Alacritty 参考、原本地 VS 2022 验证与这次 hosted VS 2026 验证分别保留,不能合并为完整功能验收。

本工作流不导出运行二进制或完整部署目录哈希,不生成可分发包。offscreen 及程序化按键不证明原生上屏、物理输入、IME、真实不同 DPI、完整 TUI 或性能等价;`presented_done=null`,性能容差未评估。原始提供者日志、SDK 和部署目录不提交。
Loading