AI 流程 · IDE 插件(coding-workflow-plugin)
在 IDE 里查看并推进 AI 编码工作流:本地 .coding-workflow/ 为真源,通过 cw serve 本地 HTTP 桥读写,
与 coding-workflow-server(管理端)弱同步。
宿主兼容性
| 宿主 |
版本 |
侧载 .vsix |
Webview 加载 |
Webview 内 fetch 本地回环 |
结论 |
| Trae CN |
1.107.1(commit 6d59237,x64) |
✅ trae-cn.cmd --install-extension <vsix> 成功,--list-extensions 可见 |
✅ 面板正常渲染 |
✅ 实测通过:fetch('http://127.0.0.1:57929/health') 返回 200,未被 CSP 拦截 |
支持 |
| TRAE CN Enterprise |
1.107.1(commit 48c81e5,x64) |
未实测(与 Trae CN 同源同版本) |
推断支持 |
推断支持 |
预期支持 |
| CodeBuddy CN |
1.100.0(commit 04507ac,x64) |
✅ buddycn.cmd --install-extension <vsix> 成功,--list-extensions 可见 |
未实测 |
未实测(用户决策:同为 VS Code 派生,Trae 系通过即可外推) |
预期支持 |
| codebuddy VPC 版(H3CAIWORK) |
— |
未实测 |
未实测 |
未实测 |
预期支持 |
| VS Code / VS Code Insiders |
≥ 1.85 |
预期支持(同源) |
— |
— |
预期支持 |
探针方法与原始证据(可复现):构造一个只注册一条命令的最小扩展,activate() 时把宿主信息写入
%TEMP%\cw-probe.log,并在 2.5s 后自动创建 WebviewPanel,其 CSP 声明
connect-src http://127.0.0.1:*,页面内 fetch('http://127.0.0.1:<随机端口>/health') 打回结果。
Trae CN 上的实测输出:
[2026-10-27T02:24:06.587Z] activate: vscode=1.107.1 appName=Trae CN appHost=desktop uiKind=1
[2026-10-27T02:24:20.514Z] probe server on http://127.0.0.1:57929
[2026-10-27T02:24:40.396Z] webview result: {"step":"fetch-ok","status":200,"body":"{\"ok\":true,\"from\":\"probe-server\",\"url\":\"/health\"}"}
结论:Webview 直接 fetch 本地回环端口可行,不需要退化为 postMessage → 宿主 → HTTP 代理
(代理通道仍保留在 hostBridge 里,供未来宿主受限时切换)。
这是什么
这是 AI 编码工作流的 IDE 客户端工作台:以工作区本地 .coding-workflow/ 为真源,经 cw serve
本地 HTTP 桥读写流程定义与节点运行状态,与 coding-workflow-server(管理端)弱同步;管理端不可达时
页面照常渲染(离线优先)。
插件提供两个容器:
编辑器标签页(宽版):由命令 AI Flow: 打开流程执行总览(或 AI Flow: 打开当前节点)在编辑器区
打开 WebviewPanel,适合浏览流程总览等宽内容;容器开启 retainContextWhenHidden,切走再回来不丢状态。
Activity Bar 侧边栏(紧凑版):点击左侧活动栏的「AI 流程」图标打开 WebviewView,适合长期驻留、
随手查看当前节点;不开 retainContextWhenHidden,改用 webview 原生 setState/getState 持久化状态。
两者共享同一份 webview UI(同一份 Vue bundle);布局由注入的 surface 与 480px 断点决定:
surface=sidebar 或容器宽度 < 480px 判为紧凑版,否则宽版;紧凑版只折叠区块、不删减信息项。
两者可互跳(标签页 ⇄ 侧边栏)且状态自动同步(本地状态文件变更或节点写操作后,宿主向其它容器广播刷新)。
两个容器的顶栏下方均有**「总览 / 接入 / 回传」三个 tab**,用于切换两个辅助页:13 项目接入(只读诊断 + 版本校验)与 16 交付物回传(产物登记回传 + 交付物回传:产物登记 + 真实文件按 5MB 分片上传(≤500MB),支持断点续传与离线补传 + 本地未回传队列 + 版本历史);节点执行页仍从总览或命令进入。
本期交付后,由使用者自行对比两种容器再决定下一期保留哪一个。
构建与安装
前置
- Node 18+(构建脚本依赖 esbuild 0.24)。
cw 可不在本机预装:插件启动后若未找到,可在引导页/状态页点「一键安装 cw」(经内网 npm 源);
手工安装可用 npm i -g @h3c/cw --registry <内网源>,cw version 可验证。
构建
npm install # 安装扩展开发依赖
cd webview && npm install # 安装 webview(UI 子工程)依赖
cd .. # 回到插件根目录
npm run build # 打包扩展(esbuild)+ 构建 webview(Vite)+ 同步产物到 dist/
npm run pack # 产出 coding-workflow-ai-flow-<version>.vsix
npm run build = build:extension + build:webview + sync-webview;npm run pack 会先 build,再优先用
vsce 打包,失败回退内置 ZIP 打包器。产出文件名形如 coding-workflow-ai-flow-0.2.11.vsix。
npm test 运行单元测试(vitest:cw 定位优先级/预检、serve 启动行解析、版本比较)。
安装(按宿主)
- VS Code / VS Code Insiders:
code --install-extension <vsix>
- Trae CN(已实测,下述为本机实测路径):
"D:\软件\Trae CN\bin\trae-cn.cmd" --install-extension <vsix>
- TRAE CN Enterprise:
trae-cn-enterprise.cmd --install-extension <vsix>
- CodeBuddy CN:
buddycn.cmd --install-extension <vsix>
- 任意宿主也可在 IDE 的「扩展」面板右上角菜单选「从 VSIX 安装…」。
除 Trae CN 外,各宿主命令按各自 CLI 约定给出、未逐一实测(见「宿主兼容性」)。
发布到 Open VSX
- 登录 https://open-vsx.org/login(GitHub 或 Eclipse 账号)。
- 打开 https://open-vsx.org/user-settings/tokens,点「Generate Access Token」,复制一次性 token。
- 打开 https://open-vsx.org/user-settings/namespaces,创建与
package.json 的 publisher 同名的命名空间 h3c;
若已被占用,把 publisher 改成唯一值(如 h3c-ai-flow)后重新打包。
- 认领命名空间:创建命名空间只会成为 contributor,命名空间仍处于 unverified;未认领时扩展页会显示
“not a verified publisher” 警告,版本可能被停用。按
Namespace Access 在
https://github.com/EclipseFdn/open-vsx.org/issues/new/choose 提交 ownership 申请。
- 发布(token 放环境变量,不要写进脚本或仓库):
$env:OVSX_PAT = "<token>"
npx ovsx@latest publish coding-workflow-ai-flow-0.2.11.vsix
发布成功后扩展页形如 https://open-vsx.org/extension/h3c/coding-workflow-ai-flow,
Trae / CodeBuddy 的扩展市场可直接搜索安装。
若 ovsx publish 在上传阶段报 write ECONNRESET(网关提前断流),可用 curl 直接调用同一接口:
curl.exe -X POST "https://open-vsx.org/api/-/publish" `
-H "Authorization: Bearer $env:OVSX_PAT" `
-H "Content-Type: application/octet-stream" `
--data-binary "@coding-workflow-ai-flow-0.2.11.vsix"
同一版本一经发布不可覆盖;需要修正时请提升版本号后重新发布。
注意:open-vsx.org 是公开注册表,发布后 vsix 内容(README、dist 中的 source map)与默认内网地址均对外可见。
若不允许公开,请改用自建 Open VSX(eclipse/openvsx),并让宿主指向内部实例。
开发调试
- 以 F5 等价方式加载本目录(无需打包):启动宿主时传
--extensionDevelopmentPath=<插件目录>。
- 让 webview 走 Vite dev server 热更新:先
cd webview && npm run dev,再以环境变量
AI_FLOW_DEV_SERVER=http://localhost:5173 启动宿主。
浏览器内调试 UI(不进 IDE)
cd webview && npm run dev
然后打开 http://localhost:5173/?baseUrl=http://127.0.0.1:<cw serve 端口>&token=<token>&surface=panel|sidebar&theme=dark。
baseUrl / token 取自 .coding-workflow/serve.json;
surface(panel / sidebar)与 theme(dark / deepblue)用于预览两种容器与配色。
配置项
| 配置 |
默认 |
说明 |
aiFlow.cwPath |
空 |
cw 可执行文件路径(显式覆盖)。留空时依次使用 npm 全局安装、PATH 与常见路径;每个候选都会先执行 cw version 预检 |
aiFlow.cwRegistry |
内网 Nexus |
一键安装 / 升级 cw 与最新版检测使用的 npm 源;留空则不检测最新版 |
aiFlow.serverUrl |
空 |
管理端地址覆盖项。留空 = 跟随 .coding-workflow/state.json 中 cw init 记录的 server,再回退到内置测试环境;也可在「插件与 cw 状态」页修改 |
未受信任的工作区(Workspace Trust)只读取以上配置的用户级值,忽略仓库内 .vscode/settings.json,
且不会自动启动本地服务。信任工作区后会自动恢复。
另有一个进程环境变量(非 IDE 配置项):CW_UPLOAD_CHUNK_KB 控制 cw serve 上传分片大小,单位 KB,默认 5120(5MB),取值会被钳制到 1~8192(即 1KB~8MB)。
命令清单
| 命令 ID |
标题 |
说明 |
aiFlow.openOverview |
AI Flow: 打开流程执行总览 |
在编辑器标签页打开流程执行总览(宽版) |
aiFlow.openSidebar |
AI Flow: 在侧边栏打开 |
聚焦 Activity Bar 的「AI 流程」视图(紧凑版) |
aiFlow.openCurrentNode |
AI Flow: 打开当前节点 |
打开/聚焦当前应执行的节点 |
aiFlow.openSetup |
AI Flow: 打开项目接入 |
打开 13 项目接入页(只读诊断 + 版本校验) |
aiFlow.openDelivery |
AI Flow: 打开交付物回传 |
打开 16 交付物回传页(产物登记回传 + 真实文件分片上传 + 本地队列) |
aiFlow.restartServe |
AI Flow: 重启本地服务 |
重启 cw serve 本地 HTTP 桥 |
aiFlow.showLogs |
AI Flow: 显示本地服务日志 |
打开 OutputChannel「AI Flow」 |
aiFlow.redetectCw |
AI Flow: 重新检测 cw |
重新定位 cw 并探活本地服务 |
首次使用
- 在项目根目录执行
cw init 接入工作流(生成 .coding-workflow/)。
- 用该目录作为工作区打开 IDE;扩展在
onStartupFinished 检测到 .coding-workflow/ 后自动定位 cw
并确保 cw serve 就绪(仅监听 127.0.0.1 随机端口)。若 .coding-workflow/serve.json 指向的实例存活
(GET /health 在 1.5s 内响应),直接复用;缺失或失活时才自行启动。
- 点击 Activity Bar 的「AI 流程」图标,或执行命令
AI Flow: 打开流程执行总览。
退出插件时只回收自己启动的 cw serve 实例;复用他人实例时不动它。
插件更新与 cw 版本要求
内网不走公共扩展市场,IDE 不会原生提示插件更新,故由管理端版本清单 + 插件本机检查承担。
接口契约(管理端):GET {aiFlow.serverUrl}/plugin/latest → { version, url, notes?, publishedAt?, minCwVersion? }。
未配置(data/plugin.json 不存在或为空)时返回 200 + { "version": null },插件据此静默忽略。
管理端首次启动会 seeds 一条当前已交付版本的记录(version 与插件 package.json 对齐,url 留空,发布时改成内网 vsix 地址)。
检查时机:插件激活后立即检查一次,此后每 6 小时一次(单次请求超时 10s)。
- 插件新版:清单
version 高于本地扩展版本 → 在两个容器顶部显示提示条「发现新版本 vX(当前 Y)」,并带「立即更新」与「手动下载」按钮:
「立即更新」由扩展下载清单 url 指向的 vsix 到临时目录并调起 workbench.extensions.installExtension 安装,完成后提示重新加载窗口;「手动下载」用系统浏览器打开 url。
原生信息提示(首次发现时弹出)同样带「立即更新」按钮。
- 版本变化提示:扩展激活时若检测到版本较上次运行发生变化(如手动安装 vsix 后),提示「重新加载窗口」,避免旧 webview 残留资源引用导致黑屏。
- cw 兼容性:读本地桥
cw serve 的 GET /health 的 version,若低于清单的 minCwVersion(清单缺省时用插件内置兜底 0.3.0)→ 提示「本地 cw 版本过低」。
- 关闭持久化:用户关闭过的提示按
kind + 版本 持久化,同一容器重建或切换容器后不再重复弹。
- 失败静默:任何检查失败(网络 / 超时 / 非 2xx / 非 JSON / 清单未配置)都不弹错、不阻断,只在 OutputChannel「AI Flow」写一行日志。
发布新版本的做法:改管理端 data/plugin.json 的 version 与 url(指向新 vsix 的内网地址)即可;minCwVersion 用于声明该插件版本要求的最低 cw 版本。
说明:若将来内网部署 Open VSX 实例并让各宿主指向它,可改用 IDE 原生的「检查更新」,本机制可退役。
故障排查
面板/侧边栏在「未初始化」「cw 缺失」「serve 起不来」三种情况下都会渲染明确的中文引导页,不会白屏。
| 现象 |
处理 |
| 面板提示「未找到 cw」并列出已尝试路径 |
安装 cw 后在设置里配置 aiFlow.cwPath(留空则走 PATH / 常见路径),再执行命令 AI Flow: 重新检测 cw;引导页会列出所有已尝试的路径 |
| 面板提示「未接入 AI 工作流」 |
工作区根目录缺 .coding-workflow/,先在项目根执行 cw init,再执行 AI Flow: 重新检测 cw |
| 面板提示「启动本地服务失败」 |
执行 AI Flow: 显示本地服务日志 查看 OutputChannel「AI Flow」里的 [cw] / [cw:stderr] 行;确认 cw serve 能独立运行,并确认端口未被安全软件拦截 |
| 版本一致性提示(本地快照 vs 管理端) |
仅为提示、不阻断操作;如需对齐,重新执行 cw init 拉取最新流程快照 |
| 提示「发现新版本」但「立即更新」失败 |
检查清单 url 是否为可访问的 vsix 地址、网络是否可达;失败提示会给出已下载路径与原链接,可手动安装。url 由维护者在管理端 data/plugin.json 配置,为空时只提示、不提供下载 |
| 升级插件后面板黑屏/空白 |
重载窗口(命令面板「开发者: 重新加载窗口」);扩展激活时会主动提示重载,避免旧 webview 残留资源引用 |
| 提示「本地 cw 版本过低」 |
升级 cw 到插件要求的最低版本,再执行命令 AI Flow: 重新检测 cw(随后每 6 小时的检查会重新判定) |
| 点回传产物后文件未上传 |
查看产物行状态:待上传 = 尚未联网,联网后自动续传;失败原因悬浮可见。点「全部补传」重试;确认 aiFlow.serverUrl 指向的管理端可达 |
| 上传大文件中断 |
自动断点续传,cw serve 重启后也会自动续传;分片大小可经环境变量 CW_UPLOAD_CHUNK_KB 调整(默认 5120,即 5MB) |
| 主题不对 |
插件跟随 IDE 主题:浅色 → light、深色 → dark;切换 IDE 主题后自动跟随 |
cw serve 接口清单
仅在 127.0.0.1 回环地址监听;除 /health 外均需请求头 Authorization: Bearer <token>。
| 方法 |
路径 |
用途 |
鉴权 |
| GET |
/health |
进程健康信息(ok / version / pid / dir),用于探活与实例复用判断 |
免鉴权 |
| GET |
/status |
项目/流程概览与各状态节点计数、未回传数、outbox 计数 |
Bearer |
| GET |
/nodes |
按 flow.json 顺序返回全部节点(定义 + 运行态合并视图) |
Bearer |
| GET |
/nodes/:id |
单节点详情(不存在返回 404) |
Bearer |
| POST |
/nodes/:id/state |
更新单节点状态(请求体 {"status": ...}) |
Bearer |
| GET |
/artifacts?nodeId=<id> |
指定节点的产物列表(含占位符展开与存在性探测) |
Bearer |
| POST |
/report |
触发一次节点事件回传(请求体 {"nodeId","event"};送达或入队均返回 200) |
Bearer |
| POST |
/upload/start |
创建/继续节点产物上传任务并异步开跑(请求体 {"nodeId"};节点不存在返回 400;返回 { ok, planned, skipped, tasks }) |
Bearer |
| GET |
/uploads |
上传任务与进度(?nodeId= 过滤;返回 { tasks: [{ receivedChunks, totalChunks, uploadedBytes, status, skipReason, lastError, storedPath, ... }], running }) |
Bearer |
| GET |
/outbox |
本地待补传队列({ count, entries: [{ file, event, nodeId, createdAt, retries, size }] },按 createdAt 升序;空队列时 entries 为 []) |
Bearer |
| POST |
/sync |
触发离线补传(复用 cw sync 的 ReportReporter.Sync()),报告补传后并触发上传续传,返回 { ok, sent, failed, uploadsPending } |
Bearer |
| GET |
/server/workflow |
代理查询上游工作流(上游不可达时返回 available=false) |
Bearer |
| GET |
/server/gate-results |
拉取上游历史门禁结果(上游不可达时返回 available=false) |
Bearer |
| GET |
/server/artifact-reports |
代理查询上游历史产物上报(版本历史):{ available, reports: [{ nodeId, artifactId, type, path, version, owner, missingReason, operator, reportedAt, receivedAt }], error };管理端不可达时 200 + available=false |
Bearer |
| POST |
/sync/pull |
从管理端拉取本项目节点状态并按「远端覆盖本地」合并(覆盖前自动备份 state.json.bak);上游不可达时 200 + ok=false |
Bearer |
安全
cw serve 仅绑定 127.0.0.1,默认使用随机空闲端口,不对局域网暴露。
- 鉴权用
Authorization: Bearer <token>:token 为启动时生成的 32 字节随机值,写入 .coding-workflow/serve.json。
.coding-workflow/serve.json 含 token,不应提交到版本库,建议加入 .gitignore(cw serve 退出时会自动删除该文件)。
- 扩展的 webview CSP 放行
connect-src http://127.0.0.1:*,并禁止 unsafe-eval。
- 遵循 IDE 的 Workspace Trust:未受信任的工作区不自动启动
cw serve,也不读取工作区级的
cwPath / cwRegistry / serverUrl,避免仓库内配置注入可执行文件或安装源。
- 管理端数据一律经
cw serve 代理(/server/workflow、/server/gate-results、/server/artifact-reports),webview 不直连管理端;CSP 因此仍只放行 http://127.0.0.1:*。
架构速览
IDE(VS Code 系) 本地
├─ 编辑器标签页(WebviewPanel · 宽版)┐
├─ 侧边栏视图(WebviewView · 紧凑版)┤ 同一份 Vue bundle
│ └─► fetch(Authorization: Bearer) ──► cw serve(127.0.0.1:随机端口)
└─ Extension Host(cw 定位 / serve 生命周期 / 单例注册表 / HostAdapter)
└─► 读 .coding-workflow/{flow,state}.json;写 state;回传 report