@openprd/cli 0.1.18 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.openprd/changes/openprd-generated-change/.openprd.yaml +2 -0
- package/.openprd/changes/openprd-generated-change/design.md +50 -0
- package/.openprd/changes/openprd-generated-change/proposal.md +37 -0
- package/.openprd/changes/openprd-generated-change/specs/agent-requirements/spec.md +16 -0
- package/.openprd/changes/openprd-generated-change/task-events.jsonl +21 -0
- package/.openprd/changes/openprd-generated-change/tasks.md +357 -0
- package/.openprd/engagements/active/prd.md +99 -77
- package/README.md +20 -0
- package/README_EN.md +25 -0
- package/package.json +1 -1
- package/src/agent-canonical-content.js +2 -0
- package/src/canvas-app-client-app.js +838 -0
- package/src/canvas-app-client-helpers.js +1138 -0
- package/src/canvas-app-styles.js +898 -0
- package/src/canvas-app.html.js +6 -2781
- package/src/canvas-binding.js +414 -0
- package/src/canvas-codex-relay.js +430 -0
- package/src/canvas-i18n.js +8 -0
- package/src/canvas-scene.js +377 -0
- package/src/canvas-session-store.js +148 -0
- package/src/canvas-workspace.js +59 -1066
- package/src/codex-hook-runner-template.mjs +22 -0
|
@@ -1,48 +1,54 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 画布协同闭环:标注改图、双向结构化工具、尺寸契约与唤起机制
|
|
2
2
|
> 语言规则:用户可见说明、PRD、spec 和 tasks 跟随用户当前主语言;无法判断时才使用简体中文兜底。PRD、OpenPrd、OpenSpec、API、SDK、CLI、TypeScript、JSON、HTTP、WebSocket、字段 key、命令名、品牌名、产品名和协议名等必要专有名词保留原文。
|
|
3
|
-
- 版本:
|
|
4
|
-
- 负责人:
|
|
3
|
+
- 版本: v0014
|
|
4
|
+
- 负责人: OpenPrd
|
|
5
5
|
- 产品场景: 以 Agent 为主要使用场景
|
|
6
6
|
- 场景模板: 以 Agent 为主要使用场景
|
|
7
7
|
- 状态: synthesized
|
|
8
|
-
- 生成时间: 2026-07-
|
|
8
|
+
- 生成时间: 2026-07-06 22:49:20
|
|
9
9
|
## 元信息
|
|
10
10
|
|
|
11
|
-
- 标题:
|
|
12
|
-
- 负责人:
|
|
13
|
-
- 状态:
|
|
14
|
-
- 版本:
|
|
11
|
+
- 标题: 画布协同闭环:标注改图、双向结构化工具、尺寸契约与唤起机制
|
|
12
|
+
- 负责人: OpenPrd
|
|
13
|
+
- 状态: synthesized
|
|
14
|
+
- 版本: v0014
|
|
15
15
|
- 产品场景: 以 Agent 为主要使用场景
|
|
16
|
-
- 日期: 2026-07-
|
|
16
|
+
- 日期: 2026-07-06
|
|
17
17
|
|
|
18
18
|
## 问题
|
|
19
19
|
|
|
20
|
-
- 问题陈述: OpenPrd
|
|
21
|
-
- 为什么是现在:
|
|
20
|
+
- 问题陈述: OpenPrd 画布目前只有单向的“发送给 Codex”整体交接:Agent 不能结构化读取用户在画布上的选区与标注,不能把生成图片精准放回画布锚点旁,标注修改意图靠用户口述或手动截图传递,协同链路断在“人标注完之后”这一步。
|
|
21
|
+
- 为什么是现在: 对标 Cowart 已验证“标注改图闭环 + 画布双向结构化工具 + 生图尺寸契约 + 具名 skill 唤起”四件能力能显著降低人机视觉协同成本;OpenPrd 0.1.18 刚落地生图路由,正好把尺寸契约与路由串起来。
|
|
22
22
|
- 证据:
|
|
23
|
-
-
|
|
23
|
+
- Cowart 的 get_cowart_selection / insert_cowart_image / annotation-edit 元数据闭环已被 DeepWiki 调研确认
|
|
24
|
+
- OpenPrd 画布现状只有 placeholderId 回填和整体 handoff,无结构化选区读取
|
|
25
|
+
- 用户已确认按对标建议落地四项能力
|
|
24
26
|
|
|
25
27
|
## 用户与相关方
|
|
26
28
|
|
|
27
29
|
- 主要用户:
|
|
28
|
-
-
|
|
30
|
+
- 使用 OpenPrd 画布做视觉协同的开发者与产品设计协作者
|
|
29
31
|
- 次要用户:
|
|
30
32
|
- 待补充
|
|
31
33
|
- 相关方:
|
|
32
34
|
- OpenPrd 维护者
|
|
33
|
-
-
|
|
35
|
+
- Codex/Cursor 上的 Vibe Coding 用户
|
|
34
36
|
|
|
35
37
|
## 目标与成功标准
|
|
36
38
|
|
|
37
39
|
- 目标:
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
+
- 用户在画布上标注后,一句话就能让 Agent 读懂标注并生成修订图放回原图旁
|
|
41
|
+
- Agent 能结构化读取画布选区并把图片锚定回填
|
|
42
|
+
- 生图请求自动携带占位卡尺寸契约
|
|
43
|
+
- 用户能用自然语言稳定唤起画布协同
|
|
40
44
|
- 成功指标:
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
45
|
+
- 标注改图闭环端到端可走通并有测试覆盖
|
|
46
|
+
- selection/insert-image API 有集成测试
|
|
47
|
+
- 尺寸契约出现在生图指引与占位卡 handoff 记录中
|
|
44
48
|
- 验收目标:
|
|
45
|
-
-
|
|
49
|
+
- canvas 服务新增 GET /api/selection 与 POST /api/insert-image 且测试通过
|
|
50
|
+
- 标注导出带 annotationEdit 元数据并能被 hook 指引消费
|
|
51
|
+
- hook 对画布协同意图注入引导语
|
|
46
52
|
|
|
47
53
|
## 验证与创业闭环
|
|
48
54
|
|
|
@@ -61,7 +67,7 @@
|
|
|
61
67
|
- 待补充
|
|
62
68
|
- 承诺信号:
|
|
63
69
|
- 待补充
|
|
64
|
-
- 首个低成本验证:
|
|
70
|
+
- 首个低成本验证: 生成 change 与任务拆解后按序实现
|
|
65
71
|
- 先活下来方案:
|
|
66
72
|
- 待补充
|
|
67
73
|
- 付费验证信号:
|
|
@@ -85,25 +91,32 @@
|
|
|
85
91
|
## 范围与非目标
|
|
86
92
|
|
|
87
93
|
- 范围内:
|
|
88
|
-
-
|
|
89
|
-
-
|
|
90
|
-
-
|
|
94
|
+
- canvas-workspace.js 新增选区状态持久化与查询 API
|
|
95
|
+
- canvas-workspace.js 新增锚定插图 API(anchorShapeId/placement/replaceHolder)
|
|
96
|
+
- canvas-app.html.js 标注修改请求导出(带元数据)与选区上报
|
|
97
|
+
- 生图占位卡尺寸契约写入 handoff 与生图指引
|
|
98
|
+
- codex-hook-runner-template.mjs 画布协同意图识别与引导注入
|
|
99
|
+
- agent-canonical-content.js 画布协同指引
|
|
100
|
+
- docs/basic 与 README 同步
|
|
91
101
|
- 范围外:
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
102
|
+
- 不迁移 tldraw、不做 Codex widget 内嵌
|
|
103
|
+
- 不新建独立 MCP stdio server,复用画布本地 HTTP 服务
|
|
104
|
+
- 不改变现有发送给 Codex 的 app-server 桥接协议
|
|
95
105
|
|
|
96
106
|
## 场景与流程
|
|
97
107
|
|
|
98
108
|
- 主流程:
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
-
|
|
109
|
+
- 用户在画布圈选原图并批注,点“标注修改请求”,Agent 读标注生成修订图并放回原图右侧
|
|
110
|
+
- Agent 调 GET /api/selection 读取选中图形结构化数据
|
|
111
|
+
- Agent 调 POST /api/insert-image 把生成图锚定到指定图形旁
|
|
112
|
+
- 用户说“打开画布一起改图”即唤起画布协同
|
|
102
113
|
- 边界情况:
|
|
103
|
-
-
|
|
104
|
-
-
|
|
114
|
+
- 无选区时 selection API 返回空且 Agent 收到明确提示
|
|
115
|
+
- 锚点图形不存在时 insert-image 报错不写脏数据
|
|
116
|
+
- 占位卡无宽高时尺寸契约退化为默认比例
|
|
105
117
|
- 失败模式:
|
|
106
|
-
-
|
|
118
|
+
- 画布服务未启动时 API 调用失败要提示先运行 openprd canvas
|
|
119
|
+
- 回填图片文件缺失时保持画布 scene 不变
|
|
107
120
|
|
|
108
121
|
## 可视化图表
|
|
109
122
|
|
|
@@ -111,30 +124,30 @@
|
|
|
111
124
|
|
|
112
125
|
```mermaid
|
|
113
126
|
flowchart LR
|
|
114
|
-
entry["入口触发<br
|
|
115
|
-
experience["产品内步骤<br/>
|
|
116
|
-
decision{"决策点<br
|
|
117
|
-
success(["成功结果<br
|
|
118
|
-
failure[["失败与恢复<br
|
|
119
|
-
entry -->|"
|
|
120
|
-
experience -->|"
|
|
121
|
-
decision -->|"
|
|
122
|
-
decision -.->|"
|
|
127
|
+
entry["入口触发<br/>用户在画布圈选原图并批注,点“标注修改请求”,Agent 读标注生成修订图并放回原图右侧"]
|
|
128
|
+
experience["产品内步骤<br/>Agent 调 GET /api/selection 读取选中图形结构化数据"]
|
|
129
|
+
decision{"决策点<br/>无选区时 selection API 返回空且 Agent 收到明确提示"}
|
|
130
|
+
success(["成功结果<br/>标注改图闭环端到端可走通并有测试覆盖"])
|
|
131
|
+
failure[["失败与恢复<br/>画布服务未启动时 API 调用失败要提示先运行 openprd canvas"]]
|
|
132
|
+
entry -->|"用户在画布圈选原图并批注,点“标注修改请求”,Agent 读标注生成修订图并放回原…"| experience
|
|
133
|
+
experience -->|"Agent 调 GET /api/selection 读取选中图形结构化数据"| decision
|
|
134
|
+
decision -->|"用户在画布上标注后,一句话就能让 Agent 读懂标注并生成修订图放回原图旁"| success
|
|
135
|
+
decision -.->|"画布服务未启动时 API 调用失败要提示先运行 openprd canvas"| failure
|
|
123
136
|
```
|
|
124
137
|
|
|
125
138
|
### 架构
|
|
126
139
|
|
|
127
140
|
```mermaid
|
|
128
141
|
flowchart LR
|
|
129
|
-
users["主要用户<br
|
|
142
|
+
users["主要用户<br/>使用 OpenPrd 画布做视觉协同的开发者与产品设计协作者"]
|
|
130
143
|
subgraph solution["方案边界"]
|
|
131
|
-
experience["Agent 使用场景层<br
|
|
132
|
-
core["核心产品逻辑<br/>OpenPrd
|
|
133
|
-
integrations["依赖与集成<br
|
|
134
|
-
governance[["约束与可靠性<br
|
|
135
|
-
delivery["验证与交接<br
|
|
144
|
+
experience["Agent 使用场景层<br/>用户在画布圈选原图并批注,点“标注修改请求”,Agent 读标注生成修订图并放回原图右侧 · Agent 调 GET /api…"]
|
|
145
|
+
core["核心产品逻辑<br/>OpenPrd 画布目前只有单向的“发送给 Codex”整体交接:Agent 不能结构化读取用户在画布上的选区与标注,不能把生…"]
|
|
146
|
+
integrations["依赖与集成<br/>依赖 openprd canvas 本地服务 · 依赖 0.1.18 生图路由协议"]
|
|
147
|
+
governance[["约束与可靠性<br/>不写入敏感信息 · 画布数据留在本地项目目录"]]
|
|
148
|
+
delivery["验证与交接<br/>标注改图闭环端到端可走通并有测试覆盖 · selection/insert-image API 有集成测试 · 尺寸契约出现在…"]
|
|
136
149
|
end
|
|
137
|
-
users -->|"
|
|
150
|
+
users -->|"用户在画布圈选原图并批注,点“标注修改请求”,Agent 读标注生成修订图并放…"| experience
|
|
138
151
|
experience -->|"产品动作与编排"| core
|
|
139
152
|
core -->|"依赖与外部服务"| integrations
|
|
140
153
|
core -.->|"策略、可靠性与合规"| governance
|
|
@@ -146,58 +159,67 @@ flowchart LR
|
|
|
146
159
|
## 需求
|
|
147
160
|
|
|
148
161
|
- 功能需求:
|
|
149
|
-
-
|
|
150
|
-
-
|
|
151
|
-
-
|
|
152
|
-
-
|
|
162
|
+
- 选区状态随画布保存并可查询
|
|
163
|
+
- 插图 API 支持 left/right/below 摆放与 holder 替换
|
|
164
|
+
- 标注导出携带 annotationEdit 与源图形 ID 元数据
|
|
165
|
+
- 生图占位卡 handoff 记录携带宽高与比例契约
|
|
166
|
+
- hook 识别画布协同意图并注入闭环指引
|
|
153
167
|
- 非功能需求:
|
|
154
|
-
-
|
|
155
|
-
-
|
|
156
|
-
-
|
|
168
|
+
- 界面文案面向普通用户
|
|
169
|
+
- API 只监听本地回环地址
|
|
170
|
+
- 新增代码有集成测试覆盖
|
|
157
171
|
- 业务规则:
|
|
158
|
-
-
|
|
172
|
+
- 只做已确认四项能力,不扩 UI 引擎替换
|
|
173
|
+
- 生图仍走 0.1.18 生图路由,不擅用付费 API
|
|
159
174
|
|
|
160
175
|
## 业务护栏
|
|
161
176
|
|
|
162
177
|
- 成本来源:
|
|
163
|
-
-
|
|
178
|
+
- 主要成本是生图调用次数与画布服务本地资源
|
|
164
179
|
- 额度与限制:
|
|
165
|
-
-
|
|
180
|
+
- 首版按单画布会话协同,不开放批量自动改图
|
|
166
181
|
- 滥用防护:
|
|
167
|
-
-
|
|
182
|
+
- insert-image 校验锚点与文件存在性,避免脏写
|
|
183
|
+
- API 仅本地回环访问
|
|
168
184
|
- 监控信号:
|
|
169
|
-
-
|
|
185
|
+
- ops.json handoff 记录数、回填成功率、API 错误率
|
|
170
186
|
- 报警阈值:
|
|
171
|
-
-
|
|
187
|
+
- 回填连续失败时提示用户检查画布服务状态
|
|
172
188
|
- 止损动作:
|
|
173
|
-
-
|
|
189
|
+
- 异常时停止自动回填,保留原画布快照并回退到手动流程
|
|
174
190
|
|
|
175
191
|
## 约束、依赖与风险
|
|
176
192
|
|
|
177
193
|
- 技术约束:
|
|
178
|
-
-
|
|
194
|
+
- 沿用 Excalidraw embed 与现有 canvas-sessions 文件存储
|
|
195
|
+
- Node 内置测试框架
|
|
196
|
+
- 不新增外部依赖
|
|
179
197
|
- 合规要求:
|
|
180
|
-
-
|
|
198
|
+
- 不写入敏感信息
|
|
199
|
+
- 画布数据留在本地项目目录
|
|
181
200
|
- 依赖:
|
|
182
|
-
-
|
|
201
|
+
- 依赖 openprd canvas 本地服务
|
|
202
|
+
- 依赖 0.1.18 生图路由协议
|
|
183
203
|
- 假设:
|
|
184
|
-
-
|
|
204
|
+
- 用户接受标注截图作为修改指令载体
|
|
205
|
+
- Excalidraw selection 数据足以表达锚定需求
|
|
185
206
|
- 风险:
|
|
186
|
-
-
|
|
207
|
+
- Excalidraw 与 tldraw 数据模型差异导致锚定语义需要适配
|
|
208
|
+
- 标注文字识别依赖 Agent 视觉能力
|
|
187
209
|
- 开放问题:
|
|
188
|
-
-
|
|
210
|
+
- 后续是否把画布协同扩展为独立 MCP server 另行评估
|
|
189
211
|
|
|
190
212
|
## 类型专项模块
|
|
191
213
|
|
|
192
214
|
- 类型: Agent 使用场景专项
|
|
193
|
-
- humanAgentContract:
|
|
194
|
-
- autonomyBoundary: Agent
|
|
195
|
-
- toolBoundary:
|
|
196
|
-
- stateModel:
|
|
197
|
-
- evalPlan:
|
|
215
|
+
- humanAgentContract: 标注意图由人给出,修订图生成与回填由 Agent 自动完成;替换原图等破坏性动作仍需人确认。
|
|
216
|
+
- autonomyBoundary: Agent 可自动读选区、生成并旁位回填;不得覆盖或删除用户原图与标注。
|
|
217
|
+
- toolBoundary: 使用画布本地 HTTP API、生图路由选定的内置生图工具与 OpenPrd CLI。
|
|
218
|
+
- stateModel: 画布 scene/selection/ops 文件保存在 .openprd/harness/canvas-sessions/<session-key>/。
|
|
219
|
+
- evalPlan: 集成测试覆盖 selection/insert-image/标注导出元数据/hook 引导注入,最终跑 dev-check 与发布前四项验证。
|
|
198
220
|
|
|
199
221
|
## 交接
|
|
200
222
|
|
|
201
|
-
- 负责人:
|
|
202
|
-
- 下一步:
|
|
203
|
-
- 目标系统:
|
|
223
|
+
- 负责人: OpenPrd
|
|
224
|
+
- 下一步: 生成 change 与任务拆解后按序实现
|
|
225
|
+
- 目标系统: OpenPrd CLI 画布子系统
|
package/README.md
CHANGED
|
@@ -469,6 +469,26 @@ OpenPrd 生成的 change 会包含标准化维护任务,change 校验也会检
|
|
|
469
469
|
付费生图 API(例如 OpenAI / Stability key)。路由协议由 install manifest 和
|
|
470
470
|
`.openprd/harness/runtime-environment.json` 的 `imageGenerationRouting` 字段承载。
|
|
471
471
|
|
|
472
|
+
## 画布协同:标注改图闭环
|
|
473
|
+
|
|
474
|
+
`openprd canvas .` 打开与当前对话绑定的本地 Excalidraw 画布后,AI 生成的图会
|
|
475
|
+
直接落到画布上,你可以在图上直接画圈、写字做标注,然后点击“发送给 Codex”,
|
|
476
|
+
剩下的交给 Agent:
|
|
477
|
+
|
|
478
|
+
1. **标注即指令**:画布检测到选区里同时有原图和你的手绘标注时,会把这次交接
|
|
479
|
+
标记为标注改图请求,把标注截图和结构化元数据(原图 ID、标注 ID)一起交给
|
|
480
|
+
Agent,Agent 把标注当作修改指令生成新图。
|
|
481
|
+
2. **旁位回填,不覆盖原图**:Agent 通过 `POST /api/insert-image` 用原图作 anchor
|
|
482
|
+
把新图放到旁边(右/左/上/下可选),你可以左右对比原图和新版,再继续在新图
|
|
483
|
+
上标注,形成多轮迭代闭环。
|
|
484
|
+
3. **结构化读画布**:Agent 通过 `GET /api/selection` 读到你正在圈选哪些元素的
|
|
485
|
+
ID、坐标、尺寸和文本,不再只靠截图猜。
|
|
486
|
+
4. **尺寸契约**:AI 生图占位卡的宽高和比例会作为 `sizeContract` 写进生图提示,
|
|
487
|
+
生成的图片按占位卡比例出图,回填不变形。
|
|
488
|
+
|
|
489
|
+
唤起方式:在对话里自然地说“打开画布一起看”“我在画布上标注了,按标注改图”
|
|
490
|
+
这类话,hook 会自动注入画布协同指引;也可以直接运行 `openprd canvas . --daemon --open`。
|
|
491
|
+
|
|
472
492
|
## 效果图与截图拼图对比,自动优化
|
|
473
493
|
|
|
474
494
|
当界面任务已经有效果图、设计稿、用户给图或 Agent 自己生成的 mock 时,Agent
|
package/README_EN.md
CHANGED
|
@@ -537,6 +537,31 @@ Cost guardrail: OpenPrd never silently calls the user’s own paid image APIs
|
|
|
537
537
|
The routing contract ships in the install manifest and
|
|
538
538
|
`.openprd/harness/runtime-environment.json` under `imageGenerationRouting`.
|
|
539
539
|
|
|
540
|
+
## Canvas collaboration: the annotation-to-revision loop
|
|
541
|
+
|
|
542
|
+
`openprd canvas .` opens a local Excalidraw canvas bound to the current
|
|
543
|
+
conversation. AI-generated images land on the canvas, you draw circles and
|
|
544
|
+
notes directly on top of them, click “Send to Codex”, and the agent takes over:
|
|
545
|
+
|
|
546
|
+
1. **Annotations become edit instructions**: when a selection contains both an
|
|
547
|
+
image and hand-drawn annotations, the handoff is tagged as an
|
|
548
|
+
annotation-edit request with structured metadata (source image IDs,
|
|
549
|
+
annotation IDs), and the agent treats the marks as revision instructions.
|
|
550
|
+
2. **Side-by-side insertion, never overwriting**: the agent calls
|
|
551
|
+
`POST /api/insert-image` with the original image as the anchor to place the
|
|
552
|
+
revised image beside it (right/left/above/below), so you can compare both
|
|
553
|
+
versions and annotate the new one for another round.
|
|
554
|
+
3. **Structured canvas reads**: `GET /api/selection` gives the agent the IDs,
|
|
555
|
+
coordinates, sizes, and text of whatever you selected — no more guessing
|
|
556
|
+
from screenshots.
|
|
557
|
+
4. **Size contract**: placeholder card width/height/aspect ratio travel as a
|
|
558
|
+
`sizeContract` inside the generation prompt, so images come back at the
|
|
559
|
+
right ratio without distortion.
|
|
560
|
+
|
|
561
|
+
To invoke it, just say things like “open the canvas” or “I annotated the image
|
|
562
|
+
on the canvas, revise it accordingly” — the hook injects the collaboration
|
|
563
|
+
guidance automatically. You can also run `openprd canvas . --daemon --open`.
|
|
564
|
+
|
|
540
565
|
## Auto-optimized reference-to-screenshot comparison
|
|
541
566
|
|
|
542
567
|
When UI work already has a reference effect image, design image, user-provided
|
package/package.json
CHANGED
|
@@ -751,6 +751,8 @@ export function renderCommandCatalog() {
|
|
|
751
751
|
'- `openprd canvas . --thread <id> --thread-title <name> --daemon --open --open-target codex-browser`:持久开启对话协同画布,本地页面按当前 thread/session ID 保存到 `.openprd/harness/canvas-sessions/<session-key>/`,title/name 只用于右侧“当前对话”展示和 daemon 透传,避免多个 Codex / Claude / Cursor 窗口串用同一块画布。若 `runtime-environment.json` 已有当前 hook/session 证据,可省略 `--thread`,若证据里有 `threadTitle/conversationTitle/sessionTitle` 会自动显示;证据不足时必须显式传 `--thread` 或 `--session`,知道标题时同步传 `--thread-title` 或 `--session-title`。`--open-target codex-browser` 表示不要调用系统 `open`,由 Codex Agent 使用右侧 Browser 工具打开返回地址;已验证的 Agent 侧最小路径是 Browser plugin + `node_repl`:`setupBrowserRuntime -> agent.browsers.get("iab") -> visibility.set(true) -> browser.tabs.new() -> tab.goto(url)`。缺少 Codex Browser 证据时 `auto` 会回退系统浏览器。用户点击“发送给 Codex”会在 `ops.json` 里保存 `handoff` 记录,并默认通过本机 Codex app-server `thread/resume -> turn/start` 自动投递到绑定 thread,同时在 `relays/` 留 payload/status/log;只有自动投递被关闭、明确失败或长时间未启动时,才追加 `agent-foreground-relay` 待发送项,由当前 Agent 用 `openprd canvas . --bridge-outbox --claim next` 领取后调用线程工具发送,并用 `--bridge-sent` 或 `--bridge-failed` 回写状态。浏览器网页不能直接调用 Codex Agent 工具;OpenPrd 不提供自己的生图 API,AI 生图仍由 Codex 原生 Image 2/imagegen 完成。不带 `--daemon` 是前台调试模式,会随当前命令结束而停止;停止后台服务使用 `openprd canvas . --thread <id> --stop`。',
|
|
752
752
|
'- Codex 画布协同模式:用户可在画布拖动空白卡片,Agent 可把 Image 2 生成图或本地图片通过本地 canvas service 推入画布并替换选中卡片;用户圈选、标注或选择元素后,可导出图片到该 session 的 `exports/`,并由默认 app-server relay 把文本和本地图片路径提交到绑定线程;Agent 前台接力队列只作为自动投递不可用时的兜底。OpenPrd 不提供自己的生图 API,AI 生图仍由 Codex 原生 `imagegen` / Image 2 完成。',
|
|
753
753
|
'- 画布评审协同:画布右栏顶部“评审协同”区显示当前 7 步流程位置(读取 `/api/guide`),“导入评审方向”按钮会把当前 review 的 designDirections 交互方向连图带说明摆上画布(读取 `/api/review-directions`,已选定方向会标出);用户可直接在方向图上圈选、批注,再用“发送给 Codex”把反馈回传当前对话。引导用户对交互稿做视觉级反馈时优先走这条路径。',
|
|
754
|
+
'- 画布结构化协同接口:Agent 不要只靠截图猜画布状态。要知道用户正在圈哪些元素时用 `GET /api/selection` 读取选中元素的 ID、类型、坐标、尺寸、文本和整体 bounds;要把新图放到指定元素旁边时用 `POST /api/insert-image` 带 `anchorElementId` + `placement`(right/left/below/above),不要覆盖原图;回填 AI 生图占位卡仍用 `POST /api/images` 带 `placeholderId`。',
|
|
755
|
+
'- 画布标注改图闭环:handoff 的 `selection` 为 `annotation-edit` 或带 `sourceImageElementIds` / `annotationElementIds` 时,说明用户在原图上画了标注要求改图。把截图里的标注当修改指令,生成修改后的新图,再用 `POST /api/insert-image` 以原图为 anchor 放到旁边,方便用户对比原图与新版并继续下一轮标注迭代。handoff 或占位卡带 `sizeContract`(width/height/aspectRatio)时,生成图片必须按该宽高比出图,避免回填变形。',
|
|
754
756
|
'- `openprd change . --generate --change <id>`:把 PRD 转成 change。',
|
|
755
757
|
'- `openprd change . --validate --change <id>`:校验 change 结构。',
|
|
756
758
|
'- `openprd tasks . --change <id>`:查看当前 dependency-ready 任务。',
|