Skip to content

Commit be33da4

Browse files
committed
release: CodeFlow Desktop v2.9.24
1 parent 2185baa commit be33da4

17 files changed

Lines changed: 966 additions & 312 deletions

File tree

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
name: 发布 CodeFlow Desktop EXE
2+
3+
# 推送 v* tag 时自动触发,在 Windows 上打包并上传 EXE 到 GitHub Releases
4+
# 使用方式:
5+
# git tag v2.9.20 && git push origin v2.9.20
6+
on:
7+
push:
8+
tags:
9+
- "v*"
10+
11+
jobs:
12+
build-and-release:
13+
name: 打包并发布
14+
runs-on: windows-latest
15+
16+
steps:
17+
- name: Checkout 代码
18+
uses: actions/checkout@v4
19+
20+
- name: 设置 Python 3.12
21+
uses: actions/setup-python@v5
22+
with:
23+
python-version: "3.12"
24+
25+
- name: 安装依赖
26+
working-directory: codeflow-desktop
27+
run: |
28+
python -m pip install --upgrade pip
29+
pip install pyinstaller pyautogui pyperclip pywin32 websockets winocr Pillow watchdog psutil
30+
31+
- name: 打包 EXE
32+
working-directory: codeflow-desktop
33+
run: python -m PyInstaller build.spec --noconfirm --clean
34+
35+
- name: 确认产物
36+
working-directory: codeflow-desktop
37+
run: dir dist\CodeFlow-Desktop.exe
38+
39+
- name: 提取 CHANGELOG 当前版本说明
40+
id: changelog
41+
shell: python
42+
run: |
43+
import re, os
44+
tag = os.environ.get("GITHUB_REF_NAME", "").lstrip("v")
45+
text = open("CHANGELOG.md", encoding="utf-8").read()
46+
# 匹配当前版本到下一个版本之间的内容
47+
pattern = rf"## \[{re.escape(tag)}\].*?\n(.*?)(?=\n## \[|\Z)"
48+
m = re.search(pattern, text, re.DOTALL)
49+
body = m.group(1).strip() if m else "详见 CHANGELOG.md"
50+
# 写入 GITHUB_OUTPUT(多行)
51+
with open(os.environ["GITHUB_OUTPUT"], "a", encoding="utf-8") as f:
52+
f.write("body<<EOF\n")
53+
f.write(body + "\n")
54+
f.write("EOF\n")
55+
56+
- name: 发布到 GitHub Releases
57+
uses: softprops/action-gh-release@v2
58+
with:
59+
name: "CodeFlow Desktop v${{ github.ref_name }}"
60+
tag_name: ${{ github.ref_name }}
61+
body: |
62+
## 码流(CodeFlow)Desktop ${{ github.ref_name }}
63+
64+
> 下载 `CodeFlow-Desktop.exe`,双击运行,无需安装。已安装旧版的用户程序会**自动检测并提示更新**。
65+
66+
---
67+
68+
${{ steps.changelog.outputs.body }}
69+
70+
---
71+
72+
### 系统要求
73+
- Windows 10 / 11(64位)
74+
- 已安装 [Cursor IDE](https://www.cursor.com/)
75+
76+
### 快速开始
77+
1. 双击 `CodeFlow-Desktop.exe` 启动
78+
2. 按引导选择项目目录和团队模板
79+
3. 手机打开 [码流 PWA](https://joinwell52-ai.github.io/codeflow-pwa/) 扫码绑定
80+
81+
### 更新日志
82+
完整历史见 [CHANGELOG.md](https://github.com/${{ github.repository }}/blob/main/CHANGELOG.md)
83+
files: codeflow-desktop/dist/CodeFlow-Desktop.exe
84+
draft: false
85+
prerelease: false
86+
env:
87+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,22 @@ _rebuild*.py
8282
*.bak
8383
_commit_msg*.txt
8484

85+
# ── 含 Token 的一次性脚本(勿提交)──
86+
_check_repo.py
87+
_push_pwa_direct.py
88+
_push_pwa_ghpages.py
89+
_reset_pwa_repo.py
90+
_set_github_secret.py
91+
_set_secret_fix.py
92+
_set_secret_main_repo.py
93+
_trigger_deploy.py
94+
8595
# ── 本地快照 / 多人杂项(勿提交)──
8696
_pages_tmp/
8797

8898
# ── codeflow-desktop 调试与测试产物 ──
99+
codeflow-desktop/build_snap/
100+
codeflow-desktop/_*.py
89101
codeflow-desktop/_*.png
90102
codeflow-desktop/test_*.png
91103
codeflow-desktop/cursor_screenshot.png

CHANGELOG.md

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,152 @@
88

99
---
1010

11+
## [2.9.24] - 2026-04-13
12+
13+
### 桌面端(`codeflow-desktop`
14+
15+
#### 修复:引导完成后进程彻底退出
16+
17+
- 引导完成(填写完 Cursor 路径、团队、项目目录并保存)后,后端进程 1 秒内自动退出
18+
- 前端引导页显示"配置已保存"后 3 秒自动关闭页面
19+
- 不再打开任何额外浏览器标签、不再启动 Cursor、不再尝试嵌入面板
20+
- 用户需要手动重新启动 CodeFlow 进入正常使用模式
21+
22+
#### 修复:引导阶段不再尝试嵌入 Cursor Simple Browser
23+
24+
- 引导期间只用系统浏览器打开引导页,完全移除对 `_schedule_embed_panel` 的调用
25+
- 消除了引导期间可能触发 Cursor 自动启动的根源
26+
27+
---
28+
29+
## [2.9.22] - 2026-04-13
30+
31+
### 桌面端(`codeflow-desktop`
32+
33+
#### 改进:引导页实时显示启动版本检查状态
34+
35+
- 引导页打开 0.5 秒后立即轮询 `/api/update/check`
36+
- 启动时版本检查进行中 → 显示「**正在检查版本,请稍候…**
37+
- 无新版本 → 提示栏自动隐藏,不打扰用户
38+
- 发现新版本正在下载 → 显示「**发现新版本 vX.X.X,正在下载… XX%**
39+
- 下载完成 → 显示「**↺ 退出并重启安装新版本**」按钮
40+
- 网络失败静默处理,不显示错误,不影响正常使用
41+
42+
---
43+
44+
## [2.9.21] - 2026-04-13
45+
46+
### 桌面端(`codeflow-desktop`
47+
48+
#### 改进:启动时按需进入引导页
49+
50+
- 有新版本 → 启动阶段快速检查(超时 5 秒),发现新版本立即进引导页,后台同步开始下载,引导页 2 秒后轮询即可看到下载进度和重启按钮
51+
- 无新版本 / 检测超时 → 走原有逻辑(已配置项目直接进主面板,未配置走引导)
52+
- 引导页不再需要等待 10 秒,因为启动时已触发检查,状态更新更快
53+
54+
---
55+
56+
## [2.9.20] - 2026-04-13
57+
58+
### 桌面端(`codeflow-desktop`
59+
60+
#### 改进:引导页支持更新检测与一键重启
61+
62+
引导页左侧版本号区域新增更新提示卡片:
63+
- 打开引导页 **10 秒后**自动检测新版本(早于主面板的 20 秒)
64+
- 下载中显示进度百分比
65+
- 下载完成后显示「**↺ 退出并重启安装新版本**」按钮
66+
- 点击后调用 `/api/update/apply`,batch 脚本热替换 EXE 并重启
67+
- 引导页与主面板横幅状态同步,不重复下载
68+
69+
---
70+
71+
## [2.9.19] - 2026-04-13
72+
73+
### 桌面端(`codeflow-desktop`
74+
75+
#### 新增:EXE 自动更新
76+
77+
新增 `updater.py` 模块,实现完整的自动更新流程:
78+
79+
- **启动后 15 秒**自动后台检查 GitHub Releases 最新版本(不阻塞启动)
80+
- 发现新版本后**静默后台下载**新 EXE 到临时目录,显示下载进度
81+
- 下载完成后面板**顶部绿色横幅**提示用户,点击「立即重启更新」
82+
- 点击后写入 batch 替换脚本:等旧进程退出 → 复制新 EXE → 启动新版本 → 清理临时文件
83+
- 新增 API:`GET /api/update/check`(状态轮询)、`POST /api/update/apply`(触发替换)
84+
- 前端每 15 秒轮询一次更新状态,启动 20 秒后开始轮询
85+
86+
---
87+
88+
## [2.9.18] - 2026-04-13
89+
90+
### 桌面端(`codeflow-desktop`
91+
92+
#### 修复:引导阶段指定 Cursor 路径后不再自动拉起 Cursor
93+
94+
`_schedule_embed_panel` 新增 `auto_launch_cursor` 参数。引导阶段(首次设置 `cursor_exe_path`、引导完成回调)一律传 `False`,只嵌入已运行的 Cursor 窗口,不会自动把 Cursor 打开。正常启动路径(已有项目目录)保持原有行为(`True`,Cursor 未运行时第 1 次允许拉起)。
95+
96+
---
97+
98+
## [2.9.17] - 2026-04-13
99+
100+
### 桌面端(`codeflow-desktop`
101+
102+
#### 修复:初始化指定 Cursor 路径后不再触发重启
103+
104+
`wizSelectCursor()` 保存路径成功后直接更新引导界面状态并解锁「下一步」,不再调用 `/api/restart`,初始化流程在当前进程内连续完成。
105+
106+
#### 修复:启动时只打开一个面板页
107+
108+
删除引导阶段多余的 `webbrowser.open(url)` 直接调用,面板打开逻辑统一由 `_schedule_embed_panel` 负责(优先嵌入 Cursor Simple Browser,连续失败 3 次后才降级系统浏览器,且只打开一次)。
109+
110+
#### 修复:打包脚本 `pack.cmd` 移除 `>NUL` 重定向
111+
112+
Windows 安全策略在某些机器上把 `>nul`/`>NUL` 重定向拦截为文件操作并弹出警告,改为直接输出,消除误报弹窗。
113+
114+
#### 修复:`config.py` 移除 `from __future__ import annotations`
115+
116+
Python 3.12 + PyInstaller 冻结环境下,`@dataclass``from __future__ import annotations` 共存可能触发 `typing.ClassVar` 循环初始化错误,删除该导入(3.12 原生支持 `tuple[float, float]` 写法,不需要此声明)。
117+
118+
#### 打包环境升级
119+
120+
`pack.cmd` 打包解释器从 `py -3.10` 升级为 `py -3.12`,与运行环境保持一致。
121+
122+
---
123+
124+
## [2.9.16] - 2026-04-10
125+
126+
### 桌面端(`codeflow-desktop`
127+
128+
#### 彻底废弃快捷键机制
129+
130+
OCR 视觉模式下切换 Agent 全程通过侧栏坐标点击完成,快捷键没有任何实际作用,本版本将其完全移除。
131+
132+
**删除的代码/字段:**
133+
- `config.py`:删除 `hotkeys` 字段(含默认值 `{"PM": ["ctrl","alt","1"], ...}`
134+
- `nudger.py`:删除 `_hotkey_from_label()``_resolve_role()``_switch_and_send_blind()``check_keybindings()``ensure_keybindings()` 函数
135+
- `nudger.py``_switch_and_send_with_vision()` 删除"降级用热键"分支
136+
- `nudger.py``switch_and_send()` 移除 `hotkeys` 参数,删除 `_resolve_role` 调用,直接规范化 role 名称
137+
- `main.py`:删除 `check_keybindings` import、启动时快捷键检查日志、从 codeflow.json 构造 `new_hotkeys` 的逻辑、`codeflow-nudger.json``hotkeys` 键的解析
138+
- `web_panel.py`:删除"回退到 nudger hotkeys 里的角色"兜底逻辑
139+
140+
**greet_all_roles 角色来源变更:**
141+
- 原来从 `config.hotkeys.keys()` 读取要打招呼的角色列表
142+
- 现在从 `_UI_LABELS`(预检时注册的侧栏标签映射)读取,无则从 tasks/ 收件人推断
143+
144+
---
145+
146+
## [2.9.15] - 2026-04-10
147+
148+
### 桌面端(`codeflow-desktop`
149+
150+
#### 预检与快捷键说明修正
151+
- **删除预检里的无用 `check_keybindings` import**`_api_preflight` 只 import 了该函数但从未调用,删除死代码,避免误导。
152+
- **预检不再要求配置快捷键**:EXE 内置 `winocr``HAS_VISION` 始终为 `True`;切换 Agent 的主路径是 OCR 识别侧栏坐标后鼠标点击,快捷键仅为 OCR 失败时的降级备用,预检无需检查。
153+
- **文档更新**`docs/config-reference.md``codeflow-desktop/BUILD.md` 中的快捷键"必须配置"描述已更正。
154+
155+
---
156+
11157
## [2.8.75] - 2026-04-10
12158

13159
### 桌面端(`codeflow-desktop`

codeflow-desktop/BUILD.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ Reload 完成后等待 `reload_window_wait_s`(默认 12s),重新获取窗
203203

204204
- **CodeFlow 控制台**:管项目下 `docs/agents/` 任务文件、巡检、预检与轨迹。
205205
- **Cursor**:当作多 Agent 聊天终端(侧栏 Agent 列表 + 对话);编辑器区域按个人习惯即可。
206-
- **环境预检**面板读 `keybindings` + OCR 等项自检**须全部通过后才能启动巡检**若有未通过项,请在 Cursor / 项目中按预检说明逐项改对(如 **Agent 显示名****Ctrl+Alt+1~4**、侧栏映射等),再点「环境预检」直至「全部通过」。另含 **Agent 切换实测**:依次发出快捷键并 OCR 验证焦点,确认窗口可见且能切换
206+
- **环境预检**面板检查项目目录、目录结构、团队配置、角色文件、Cursor 窗口、OCR Agent 坐标映射等**须全部通过后才能启动巡检**v2.9.16 起**快捷键机制已完全移除**,切换 Agent 全程通过 OCR 识别侧栏坐标后鼠标点击完成,无需配置任何快捷键
207207

208208
## 常见问题
209209

codeflow-desktop/_release_notes.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
## 码流(CodeFlow)Desktop v2.9.24
2+
3+
> 下载 \CodeFlow-Desktop.exe\,双击运行,无需安装。
4+
> 已安装旧版的用户程序会**自动检测并提示更新**,无需手动下载。
5+
6+
---
7+
8+
### 桌面端(`codeflow-desktop`
9+
10+
#### 修复:引导完成后进程彻底退出
11+
12+
- 引导完成(填写完 Cursor 路径、团队、项目目录并保存)后,后端进程 1 秒内自动退出
13+
- 前端引导页显示"配置已保存"后 3 秒自动关闭页面
14+
- 不再打开任何额外浏览器标签、不再启动 Cursor、不再尝试嵌入面板
15+
- 用户需要手动重新启动 CodeFlow 进入正常使用模式
16+
17+
#### 修复:引导阶段不再尝试嵌入 Cursor Simple Browser
18+
19+
- 引导期间只用系统浏览器打开引导页,完全移除对 `_schedule_embed_panel` 的调用
20+
- 消除了引导期间可能触发 Cursor 自动启动的根源
21+
22+
---
23+
24+
---
25+
26+
### 系统要求
27+
- Windows 10 / 11(64 位)
28+
- 已安装 [Cursor IDE](https://www.cursor.com/)
29+
30+
### 快速开始
31+
1. 双击 \CodeFlow-Desktop.exe\ 启动
32+
2. 按引导选择项目目录和团队模板
33+
3. 手机打开 [码流 PWA](https://joinwell52-ai.github.io/codeflow-pwa/) 扫码绑定
34+
35+
### 完整更新日志
36+
[CHANGELOG.md](https://github.com/joinwell52-AI/codeflow-pwa/blob/main/CHANGELOG.md)

codeflow-desktop/build.spec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ a = Analysis(
104104
"win_snap",
105105
"cursor_acp",
106106
"cursor_embed",
107+
"updater",
107108
"watchdog",
108109
"watchdog.observers",
109110
"watchdog.events",

codeflow-desktop/build_snap/snap_click.spec

Lines changed: 0 additions & 38 deletions
This file was deleted.

codeflow-desktop/config.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
"""
22
CodeFlow Nudger 配置模块
33
"""
4-
from __future__ import annotations
5-
64
from dataclasses import dataclass, field
75
from pathlib import Path
86

@@ -53,13 +51,6 @@ class NudgerConfig:
5351
launch_cursor_if_absent: bool = True
5452
cursor_exe_path: str = ""
5553

56-
hotkeys: dict[str, tuple] = field(default_factory=lambda: {
57-
"PM": ("ctrl", "alt", "1"),
58-
"DEV": ("ctrl", "alt", "2"),
59-
"QA": ("ctrl", "alt", "3"),
60-
"OPS": ("ctrl", "alt", "4"),
61-
})
62-
6354
input_offset: tuple[float, float] = (0.80, 55)
6455

6556
@property
-26 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)