baa-conductor

git clone 

commit
f315292
parent
eadee69
author
im_wower
date
2026-03-29 02:40:13 +0800 CST
docs: add next wave requirements and task cards T-S046 through T-S051

- NEXT_WAVE_REQUIREMENTS.md: 9 requirements from discussion (P0-P3)
- T-S046: ingest logging + files/read kind fix
- T-BUG-029: ChatGPT thinking mode final-message extraction bug
- T-S047: cross-session continuity entry point
- T-S048: Gemini delivery adapter
- T-S049: open browser.chatgpt and browser.gemini targets
- T-S050: stagit git static pages
- T-S051: code file direct serving
- Update TASK_OVERVIEW with execution order and dependencies

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
9 files changed,  +967, -4
A plans/NEXT_WAVE_REQUIREMENTS.md
+200, -0
  1@@ -0,0 +1,200 @@
  2+# 下一波需求清单
  3+
  4+日期:`2026-03-29`
  5+
  6+## 状态
  7+
  8+- `当前需求`
  9+- 基线:`main@eadee69`
 10+
 11+## 关联文档
 12+
 13+- [`./ARTIFACT_STATIC_SERVICE.md`](./ARTIFACT_STATIC_SERVICE.md)
 14+- [`./STATUS_SUMMARY.md`](./STATUS_SUMMARY.md)
 15+- [`./BAA_INSTRUCTION_SYSTEM.md`](./BAA_INSTRUCTION_SYSTEM.md)
 16+
 17+## 背景
 18+
 19+Artifact 静态服务主线(T-S039~T-S045)已完成。手动验证 ChatGPT 闭环时发现若干阻塞和缺失。本文档整理所有已讨论但未落地的需求。
 20+
 21+## 1. ChatGPT final-message 提取 bug(P0)
 22+
 23+### 问题
 24+
 25+ChatGPT 使用思考模式(o3/o4)时,SSE 流先发 "Thought for a few seconds" 思考标记,再发真正的 assistant 回复。当前 `final-message.js` 的 `extractChatgptCandidateFromText` 只提取到思考标记,漏掉了包含 baa 指令的正文。
 26+
 27+### 影响
 28+
 29+ChatGPT 闭环完全断裂——conductor 收到的 raw_text 是 "Thought for a couple of seconds",无法提取 baa 指令。
 30+
 31+### 修复方向
 32+
 33+- 修改 `extractChatgptCandidateFromText` 和 `extractChatgptCandidateFromChunk`
 34+- 跳过 thinking/reasoning 类型的消息,只提取 role=assistant 且 content 非空的最终回复
 35+- 参考 ChatGPT SSE 响应中的 `message.metadata.is_complete` 或 `message.status` 字段区分
 36+
 37+### 需要日志支持
 38+
 39+修复前需要先能看到 ChatGPT 的原始 SSE 流数据,否则只能盲改。建议先完成需求 2(日志落盘),再修此 bug。
 40+
 41+## 2. 请求/响应日志落盘(P1)
 42+
 43+### 问题
 44+
 45+当前无论插件还是 conductor,都没有把原始请求/响应数据写到文件。排查任何问题都要猜。
 46+
 47+- 插件:日志在内存循环缓冲区,重载即丢
 48+- conductor:stdout 只有启动/停止状态行,`browser.final_message` 的完整 payload 不记录
 49+
 50+### 需求
 51+
 52+**conductor 侧:**
 53+
 54+- 每次收到 `browser.final_message` 时,把完整 payload 写到日志文件
 55+- 日志目录:`logs/baa-ingest/`
 56+- 按天轮转:`YYYY-MM-DD.jsonl`(每行一个 JSON)
 57+- 包含:timestamp、platform、conversation_id、assistant_message_id、raw_text 全文、ingest 结果摘要
 58+
 59+**插件侧(可选,优先级较低):**
 60+
 61+- 把拦截到的 SSE chunk 原始数据通过 WS 发给 conductor 落盘
 62+- 或者插件本地写到 `browser.storage.local`(有大小限制)
 63+
 64+### 实现方式
 65+
 66+conductor 侧只需在 `firefox-ws.ts` 的 `handleBrowserFinalMessage` 和 `ingest.ts` 的 `ingestAssistantFinalMessage` 中加 `appendFileSync` 写 JSONL 即可。
 67+
 68+## 3. `/v1/files/read` kind 标记 bug(P1)
 69+
 70+### 问题
 71+
 72+`local-api.ts` 中 `/v1/files/read` 路由的 kind 被标记为 `"write"`,导致 `/v1/capabilities` 将它归入 write 端点。
 73+
 74+### 修复
 75+
 76+一行改动:`kind: "write"` → `kind: "read"`。
 77+
 78+## 4. 跨会话接续入口(P2)
 79+
 80+### 问题
 81+
 82+Artifact 静态服务已经把消息和执行结果持久化并生成了 URL,但新 AI 对话没有入口发现这些 URL。
 83+
 84+### 需求
 85+
 86+`@conductor::describe` 的回复中应包含:
 87+
 88+- 最近活跃会话的 URL:`https://conductor.makefile.so/artifact/session/latest.txt`
 89+- 或最近 N 条消息/执行的 URL 列表
 90+
 91+这样新对话的 AI 可以 fetch 这个 URL 获取历史上下文。
 92+
 93+### 实现方式
 94+
 95+修改 `/describe` 或 `/describe/business` 的响应,加入 `recent_sessions_url` 字段。
 96+
 97+## 5. Gemini 投递适配器(P2)
 98+
 99+### 问题
100+
101+`plugins/baa-firefox/delivery-adapters.js` 只有 Claude 和 ChatGPT 的适配器,缺 Gemini。执行结果无法回送到 Gemini 对话。
102+
103+### 需求
104+
105+补充 Gemini 平台的 DOM 选择器:
106+
107+- readinessSelectors:Gemini 页面就绪标识
108+- composerSelectors:输入框选择器
109+- sendButtonSelectors:发送按钮选择器
110+- sendingSelectors:发送中状态选择器
111+
112+### 前置条件
113+
114+需要在 Gemini 页面上实际观察 DOM 结构,确认选择器。
115+
116+## 6. 开放 `@browser.chatgpt` / `@browser.gemini` target(P2)
117+
118+### 问题
119+
120+当前 policy 白名单只有 `conductor`、`system`、`browser.claude`。AI 不能向 ChatGPT/Gemini 对话发消息。
121+
122+### 需求
123+
124+- `policy.ts`:SUPPORTED_TARGET_TOOLS 加入 `browser.chatgpt` 和 `browser.gemini`,tools 同 `browser.claude`(`current`、`send`)
125+- `router.ts`:加对应的路由映射
126+- `local-api.ts`:加对应的端点(如 `/v1/browser/chatgpt/send`)
127+
128+### 前置条件
129+
130+- ChatGPT 需要先修复 final-message bug(需求 1)
131+- Gemini 需要先补投递适配器(需求 5)
132+
133+## 7. stagit 生成 git 静态页面(P3)
134+
135+### 需求
136+
137+用 stagit 把 git 仓库生成纯静态 HTML,conductor serve,AI 通过 URL 浏览 git 历史、diff、文件。
138+
139+### 实现方式
140+
141+- `brew install stagit`
142+- 写一个 shell 脚本 `scripts/git-snapshot.sh`,生成到 `state/artifacts/repo/{repo-name}/`
143+- conductor 的 `/artifact/repo/` 路由 serve
144+- post-commit hook 或 cron 触发重新生成
145+
146+### 优先级
147+
148+低。AI 可以通过 `@conductor::exec:::"git log"` 等指令获取 git 信息,结果已经通过 artifact 持久化为 URL。stagit 是锦上添花。
149+
150+## 8. 代码文件直读映射(P3)
151+
152+### 需求
153+
154+conductor 的 `/code/{repo}/...` 路由直接 serve 磁盘上的代码文件,AI 通过 URL 读取任意源文件。
155+
156+### 实现方式
157+
158+- conductor 加 `/code/` 路由,alias 到 `/Users/george/code/`
159+- `autoindex` 功能(列出目录内容)
160+- 安全:排除 `.env`、`.credentials`、`.git/objects`
161+- Content-Type:统一 `text/plain; charset=utf-8`
162+
163+### 优先级
164+
165+低。AI 可以通过 `@conductor::files/read` 读文件,结果已经 artifact 化。直读映射是便利性优化。
166+
167+## 9. 签名 URL 鉴权(P3,暂不做)
168+
169+### 需求
170+
171+后续给 `/artifact/` 路由加签名 URL 鉴权:`?sig=xxx&exp=xxx`。
172+
173+### 设计要点(已与 ChatGPT / Gemini 确认)
174+
175+- AI 无法带自定义 Header,只能用 URL 参数
176+- 签名 URL 比纯 token 更安全(可过期、可绑定路径)
177+- 当前暂不实现,保持公开访问
178+
179+## 优先级总览
180+
181+| 优先级 | 需求 | 工作量 |
182+|---|---|---|
183+| P0 | #1 ChatGPT final-message 提取 bug | M |
184+| P1 | #2 请求/响应日志落盘 | S |
185+| P1 | #3 files/read kind bug | S(一行) |
186+| P2 | #4 跨会话接续入口 | S |
187+| P2 | #5 Gemini 投递适配器 | M |
188+| P2 | #6 开放 chatgpt/gemini target | S |
189+| P3 | #7 stagit | M |
190+| P3 | #8 代码文件直读 | S |
191+| P3 | #9 签名 URL | 暂不做 |
192+
193+## 建议执行顺序
194+
195+```
196+#2 日志落盘 → #1 ChatGPT bug(需要日志辅助排查) → #3 files/read bug
197+    ↓
198+#4 跨会话接续 → #5 Gemini 适配器 → #6 开放 target
199+    ↓
200+#7 stagit → #8 代码直读
201+```
A tasks/T-BUG-029.md
+125, -0
  1@@ -0,0 +1,125 @@
  2+# Task T-BUG-029:修复 ChatGPT 思考模式下 final-message 提取遗漏
  3+
  4+## 状态
  5+
  6+- 当前状态:`待开始`
  7+- 规模预估:`M`
  8+- 依赖任务:`T-S046`(需要日志辅助排查 ChatGPT SSE 原始数据)
  9+- 建议执行者:`Claude`(需要理解 ChatGPT SSE 流结构和 final-message 提取逻辑)
 10+
 11+## 直接给对话的提示词
 12+
 13+读 `/Users/george/code/baa-conductor/tasks/T-BUG-029.md` 任务文档,完成开发任务。
 14+
 15+如需补背景,再读:
 16+
 17+- `/Users/george/code/baa-conductor/plans/NEXT_WAVE_REQUIREMENTS.md`(需求 1)
 18+- `/Users/george/code/baa-conductor/plugins/baa-firefox/final-message.js`
 19+- `/Users/george/code/baa-conductor/logs/baa-ingest/`(T-S046 完成后有日志可看)
 20+
 21+## 当前基线
 22+
 23+- 仓库:`/Users/george/code/baa-conductor`
 24+- 分支基线:`main`(T-S046 合并后)
 25+- 提交:`<T-S046 合并后的提交>`
 26+
 27+## 分支与 worktree(强制)
 28+
 29+- 分支名:`bug/chatgpt-thinking-final-message`
 30+- worktree 路径:`/Users/george/code/baa-conductor-chatgpt-thinking-final-message`
 31+
 32+开工步骤:
 33+
 34+1. `cd /Users/george/code/baa-conductor`
 35+2. `git worktree add ../baa-conductor-chatgpt-thinking-final-message -b bug/chatgpt-thinking-final-message main`
 36+3. `cd ../baa-conductor-chatgpt-thinking-final-message`
 37+
 38+完成后提交与推送(由执行者完成,不要合并):
 39+
 40+1. 在 worktree 里提交所有变更(包括更新后的任务文档)
 41+2. `git push -u origin bug/chatgpt-thinking-final-message`
 42+
 43+## 目标
 44+
 45+修复 ChatGPT 使用思考模式(o3/o4 模型)时,final-message 提取器只捕获到 "Thought for a few seconds" 思考标记,漏掉真正 assistant 回复的问题。
 46+
 47+## 背景
 48+
 49+手动验证 ChatGPT 闭环时发现:ChatGPT 回复包含 baa 指令块,但 conductor 收到的 raw_text 是 "Thought for a couple of seconds"。
 50+
 51+ChatGPT 的思考模式 SSE 流结构:
 52+- 先发 thinking/reasoning 相关的 message(status 为 in_progress)
 53+- 再发真正的 assistant 回复(status 为 finished_successfully 或 completed)
 54+
 55+`extractChatgptCandidateFromText` 可能把 thinking 标记当成了最终回复。
 56+
 57+## 涉及仓库
 58+
 59+- `/Users/george/code/baa-conductor`
 60+
 61+## 允许修改的目录
 62+
 63+- `/Users/george/code/baa-conductor/plugins/baa-firefox/final-message.js`
 64+- `/Users/george/code/baa-conductor/plugins/baa-firefox/` (如需加测试)
 65+
 66+## 尽量不要修改
 67+
 68+- `/Users/george/code/baa-conductor/apps/`
 69+- `/Users/george/code/baa-conductor/packages/`
 70+
 71+## 必须完成
 72+
 73+### 1. 排查
 74+
 75+- 先看 `logs/baa-ingest/` 的日志,了解 conductor 收到了什么
 76+- 在 ChatGPT 页面用浏览器 DevTools 观察 SSE 流的原始数据,确认思考模式下的消息结构
 77+- 确认 `extractChatgptCandidateFromText` 和 `extractChatgptCandidateFromChunk` 的当前行为
 78+
 79+### 2. 修复
 80+
 81+- 修改 `extractChatgptCandidateFromText` / `extractChatgptCandidateFromChunk`
 82+- 确保跳过 thinking/reasoning 类型的消息
 83+- 只提取 status 为 `finished_successfully` / `completed` 且 content 非空的 assistant 回复
 84+- 评分逻辑应优先选择更长、有实际内容的 candidate
 85+
 86+### 3. 验证
 87+
 88+- ChatGPT 思考模式下回复含 baa 指令 → conductor 收到完整回复(不是 "Thought for...")
 89+- ChatGPT 非思考模式下回复 → 行为不变
 90+- Claude 和 Gemini 的 final-message 不受影响
 91+
 92+## 验收标准
 93+
 94+- ChatGPT 思考模式回复 `@conductor::status` → conductor 提取到指令并执行
 95+- `logs/baa-ingest/` 日志中 raw_text 是完整回复内容
 96+- Claude final-message 不受影响
 97+
 98+## 推荐验证命令
 99+
100+- `cd /Users/george/code/baa-conductor-chatgpt-thinking-final-message && pnpm build`
101+- 实际在 ChatGPT 中触发一轮 baa 指令闭环验证
102+
103+## 执行记录
104+
105+> 以下内容由执行任务的 AI 填写,创建任务时留空。
106+
107+### 开始执行
108+
109+- 执行者:
110+- 开始时间:
111+- 状态变更:`待开始` → `进行中`
112+
113+### 完成摘要
114+
115+- 完成时间:
116+- 状态变更:`进行中` → `已完成`
117+- 修改了哪些文件:
118+- 核心实现思路:
119+- 跑了哪些测试:
120+
121+### 执行过程中遇到的问题
122+
123+> 记录执行过程中遇到的阻塞、环境问题、临时绕过方案等。合并时由合并者判断是否需要修复或建新任务。
124+
125+### 剩余风险
126+
A tasks/T-S046.md
+118, -0
  1@@ -0,0 +1,118 @@
  2+# Task T-S046:请求/响应日志落盘 + 修复 files/read kind 标记
  3+
  4+## 状态
  5+
  6+- 当前状态:`待开始`
  7+- 规模预估:`S`
  8+- 依赖任务:无
  9+- 建议执行者:`Claude`(需要理解 firefox-ws 和 ingest 数据流)
 10+
 11+## 直接给对话的提示词
 12+
 13+读 `/Users/george/code/baa-conductor/tasks/T-S046.md` 任务文档,完成开发任务。
 14+
 15+如需补背景,再读:
 16+
 17+- `/Users/george/code/baa-conductor/plans/NEXT_WAVE_REQUIREMENTS.md`(需求 2 和 3)
 18+
 19+## 当前基线
 20+
 21+- 仓库:`/Users/george/code/baa-conductor`
 22+- 分支基线:`main`
 23+- 提交:`eadee69`
 24+
 25+## 分支与 worktree(强制)
 26+
 27+- 分支名:`feat/ingest-logging`
 28+- worktree 路径:`/Users/george/code/baa-conductor-ingest-logging`
 29+
 30+开工步骤:
 31+
 32+1. `cd /Users/george/code/baa-conductor`
 33+2. `git worktree add ../baa-conductor-ingest-logging -b feat/ingest-logging main`
 34+3. `cd ../baa-conductor-ingest-logging`
 35+
 36+完成后提交与推送(由执行者完成,不要合并):
 37+
 38+1. 在 worktree 里提交所有变更(包括更新后的任务文档)
 39+2. `git push -u origin feat/ingest-logging`
 40+
 41+## 目标
 42+
 43+让 conductor 把每次收到的 `browser.final_message` 完整 payload 和 ingest 结果写到日志文件,方便事后排查。顺便修复 `/v1/files/read` 的 kind 标记 bug。
 44+
 45+## 必须完成
 46+
 47+### 1. ingest 日志落盘
 48+
 49+- 日志目录:`logs/baa-ingest/`(conductor 启动时自动创建)
 50+- 文件名:`YYYY-MM-DD.jsonl`(按天轮转,每行一个 JSON)
 51+- 每次 `browser.final_message` 到达时写一行,包含:
 52+  - `ts`:ISO 时间戳
 53+  - `event`:`"final_message_received"`
 54+  - `platform`
 55+  - `conversation_id`
 56+  - `assistant_message_id`
 57+  - `raw_text`:完整原文(不截断)
 58+  - `raw_text_length`:字符数
 59+- 每次 ingest 处理完成后写一行,包含:
 60+  - `ts`:ISO 时间戳
 61+  - `event`:`"ingest_completed"`
 62+  - `platform`
 63+  - `conversation_id`
 64+  - `blocks_count`:提取到的 baa block 数量
 65+  - `executions_count`:执行的指令数量
 66+  - `status`:ingest 结果状态
 67+- 写入失败只 log 到 stderr,不影响主流程
 68+- 使用 `appendFileSync`,不需要复杂的日志框架
 69+
 70+### 2. 修复 files/read kind
 71+
 72+- `apps/conductor-daemon/src/local-api.ts` 中 `/v1/files/read` 路由的 `kind: "write"` 改为 `kind: "read"`
 73+
 74+## 允许修改的目录
 75+
 76+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/` (firefox-ws.ts、ingest.ts、local-api.ts、index.ts)
 77+
 78+## 尽量不要修改
 79+
 80+- `/Users/george/code/baa-conductor/packages/`
 81+- `/Users/george/code/baa-conductor/plugins/`
 82+
 83+## 验收标准
 84+
 85+- ChatGPT 发一条消息后,`logs/baa-ingest/2026-03-29.jsonl` 存在且包含完整 raw_text
 86+- 日志文件每行是合法 JSON
 87+- `/v1/capabilities` 中 `/v1/files/read` 归类到 read 端点
 88+- 所有现有测试通过
 89+
 90+## 推荐验证命令
 91+
 92+- `cd /Users/george/code/baa-conductor-ingest-logging && pnpm build`
 93+- `cd /Users/george/code/baa-conductor-ingest-logging && pnpm test`
 94+- 重启 conductor 后触发一次 ChatGPT 对话,检查 `logs/baa-ingest/` 下的日志文件
 95+
 96+## 执行记录
 97+
 98+> 以下内容由执行任务的 AI 填写,创建任务时留空。
 99+
100+### 开始执行
101+
102+- 执行者:
103+- 开始时间:
104+- 状态变更:`待开始` → `进行中`
105+
106+### 完成摘要
107+
108+- 完成时间:
109+- 状态变更:`进行中` → `已完成`
110+- 修改了哪些文件:
111+- 核心实现思路:
112+- 跑了哪些测试:
113+
114+### 执行过程中遇到的问题
115+
116+> 记录执行过程中遇到的阻塞、环境问题、临时绕过方案等。合并时由合并者判断是否需要修复或建新任务。
117+
118+### 剩余风险
119+
A tasks/T-S047.md
+87, -0
 1@@ -0,0 +1,87 @@
 2+# Task T-S047:跨会话接续入口
 3+
 4+## 状态
 5+
 6+- 当前状态:`待开始`
 7+- 规模预估:`S`
 8+- 依赖任务:无
 9+- 建议执行者:`Codex` 或 `Claude`(改动小,边界清晰)
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S047.md` 任务文档,完成开发任务。
14+
15+## 当前基线
16+
17+- 仓库:`/Users/george/code/baa-conductor`
18+- 分支基线:`main`
19+- 提交:`eadee69`
20+
21+## 分支与 worktree(强制)
22+
23+- 分支名:`feat/describe-sessions-url`
24+- worktree 路径:`/Users/george/code/baa-conductor-describe-sessions-url`
25+
26+开工步骤:
27+
28+1. `cd /Users/george/code/baa-conductor`
29+2. `git worktree add ../baa-conductor-describe-sessions-url -b feat/describe-sessions-url main`
30+3. `cd ../baa-conductor-describe-sessions-url`
31+
32+完成后提交与推送(由执行者完成,不要合并):
33+
34+1. 在 worktree 里提交所有变更(包括更新后的任务文档)
35+2. `git push -u origin feat/describe-sessions-url`
36+
37+## 目标
38+
39+在 `@conductor::describe` 的回复中加入最近会话 URL,让新 AI 对话可以 fetch 历史上下文。
40+
41+## 必须完成
42+
43+### 1. 修改 /describe 响应
44+
45+在 `/describe` 或 `/describe/business` 的响应中新增字段:
46+
47+```json
48+{
49+  "recent_sessions_url": "https://conductor.makefile.so/artifact/session/latest.txt",
50+  "recent_sessions_json_url": "https://conductor.makefile.so/artifact/session/latest.json"
51+}
52+```
53+
54+### 2. 确保 URL 基于 publicBaseUrl 配置
55+
56+URL 通过 `publicBaseUrl` 拼接,不硬编码域名。
57+
58+## 允许修改的目录
59+
60+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
61+
62+## 验收标准
63+
64+- `curl http://100.71.210.78:4317/describe` 返回中包含 `recent_sessions_url` 字段
65+- URL 是 exact URL,可直接 fetch
66+
67+## 执行记录
68+
69+> 以下内容由执行任务的 AI 填写,创建任务时留空。
70+
71+### 开始执行
72+
73+- 执行者:
74+- 开始时间:
75+- 状态变更:`待开始` → `进行中`
76+
77+### 完成摘要
78+
79+- 完成时间:
80+- 状态变更:`进行中` → `已完成`
81+- 修改了哪些文件:
82+- 核心实现思路:
83+- 跑了哪些测试:
84+
85+### 执行过程中遇到的问题
86+
87+### 剩余风险
88+
A tasks/T-S048.md
+100, -0
  1@@ -0,0 +1,100 @@
  2+# Task T-S048:Gemini 投递适配器
  3+
  4+## 状态
  5+
  6+- 当前状态:`待开始`
  7+- 规模预估:`M`
  8+- 依赖任务:无
  9+- 建议执行者:`Claude`(需要在 Gemini 页面观察 DOM 结构确认选择器)
 10+
 11+## 直接给对话的提示词
 12+
 13+读 `/Users/george/code/baa-conductor/tasks/T-S048.md` 任务文档,完成开发任务。
 14+
 15+## 当前基线
 16+
 17+- 仓库:`/Users/george/code/baa-conductor`
 18+- 分支基线:`main`
 19+- 提交:`eadee69`
 20+
 21+## 分支与 worktree(强制)
 22+
 23+- 分支名:`feat/gemini-delivery-adapter`
 24+- worktree 路径:`/Users/george/code/baa-conductor-gemini-delivery-adapter`
 25+
 26+开工步骤:
 27+
 28+1. `cd /Users/george/code/baa-conductor`
 29+2. `git worktree add ../baa-conductor-gemini-delivery-adapter -b feat/gemini-delivery-adapter main`
 30+3. `cd ../baa-conductor-gemini-delivery-adapter`
 31+
 32+完成后提交与推送(由执行者完成,不要合并):
 33+
 34+1. 在 worktree 里提交所有变更(包括更新后的任务文档)
 35+2. `git push -u origin feat/gemini-delivery-adapter`
 36+
 37+## 目标
 38+
 39+在 `delivery-adapters.js` 中补充 Gemini 平台的 DOM 投递适配器,使执行结果可以回送到 Gemini 对话。
 40+
 41+## 必须完成
 42+
 43+### 1. 添加 Gemini 适配器
 44+
 45+在 `plugins/baa-firefox/delivery-adapters.js` 的 `PLATFORM_ADAPTERS` 中新增 `gemini` 配置:
 46+
 47+- `readinessSelectors`:Gemini 页面就绪标识
 48+- `composerSelectors`:输入框选择器
 49+- `sendButtonSelectors`:发送按钮选择器
 50+- `sendingSelectors`:发送中状态选择器
 51+
 52+### 2. 确认选择器
 53+
 54+需要在 Firefox 中打开 `https://gemini.google.com/`,用 DevTools 观察:
 55+
 56+- 输入框的 DOM 结构(contentEditable div? textarea? rich-text-field?)
 57+- 发送按钮的定位方式
 58+- 发送中的状态变化
 59+
 60+### 3. 验证
 61+
 62+- 在 Gemini 对话中触发 baa 指令
 63+- 执行结果通过 DOM 注入回送到 Gemini 对话
 64+
 65+## 允许修改的目录
 66+
 67+- `/Users/george/code/baa-conductor/plugins/baa-firefox/delivery-adapters.js`
 68+
 69+## 尽量不要修改
 70+
 71+- `/Users/george/code/baa-conductor/apps/`
 72+- `/Users/george/code/baa-conductor/packages/`
 73+- `/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`(除非 Gemini 需要特殊处理)
 74+
 75+## 验收标准
 76+
 77+- Gemini 对话中发 baa 指令 → 执行结果通过 DOM 注入出现在对话中
 78+- Claude 和 ChatGPT 的投递不受影响
 79+
 80+## 执行记录
 81+
 82+> 以下内容由执行任务的 AI 填写,创建任务时留空。
 83+
 84+### 开始执行
 85+
 86+- 执行者:
 87+- 开始时间:
 88+- 状态变更:`待开始` → `进行中`
 89+
 90+### 完成摘要
 91+
 92+- 完成时间:
 93+- 状态变更:`进行中` → `已完成`
 94+- 修改了哪些文件:
 95+- 核心实现思路:
 96+- 跑了哪些测试:
 97+
 98+### 执行过程中遇到的问题
 99+
100+### 剩余风险
101+
A tasks/T-S049.md
+95, -0
 1@@ -0,0 +1,95 @@
 2+# Task T-S049:开放 @browser.chatgpt 和 @browser.gemini target
 3+
 4+## 状态
 5+
 6+- 当前状态:`待开始`
 7+- 规模预估:`S`
 8+- 依赖任务:`T-BUG-029`(ChatGPT final-message bug)、`T-S048`(Gemini 适配器)
 9+- 建议执行者:`Codex` 或 `Claude`(加白名单 + 路由,边界清晰)
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S049.md` 任务文档,完成开发任务。
14+
15+## 当前基线
16+
17+- 仓库:`/Users/george/code/baa-conductor`
18+- 分支基线:`main`(T-BUG-029 和 T-S048 合并后)
19+- 提交:`<合并后的提交>`
20+
21+## 分支与 worktree(强制)
22+
23+- 分支名:`feat/browser-chatgpt-gemini-targets`
24+- worktree 路径:`/Users/george/code/baa-conductor-browser-chatgpt-gemini-targets`
25+
26+开工步骤:
27+
28+1. `cd /Users/george/code/baa-conductor`
29+2. `git worktree add ../baa-conductor-browser-chatgpt-gemini-targets -b feat/browser-chatgpt-gemini-targets main`
30+3. `cd ../baa-conductor-browser-chatgpt-gemini-targets`
31+
32+完成后提交与推送(由执行者完成,不要合并):
33+
34+1. 在 worktree 里提交所有变更(包括更新后的任务文档)
35+2. `git push -u origin feat/browser-chatgpt-gemini-targets`
36+
37+## 目标
38+
39+在 BAA 指令系统中正式开放 `@browser.chatgpt` 和 `@browser.gemini` 作为合法 target。
40+
41+## 必须完成
42+
43+### 1. policy.ts 加白名单
44+
45+```typescript
46+SUPPORTED_TARGET_TOOLS["browser.chatgpt"] = ["current", "send"];
47+SUPPORTED_TARGET_TOOLS["browser.gemini"] = ["current", "send"];
48+```
49+
50+### 2. router.ts 加路由映射
51+
52+参照 `browser.claude` 的路由,为 `browser.chatgpt` 和 `browser.gemini` 加对应映射:
53+
54+- `send` → `POST /v1/browser/chatgpt/send` / `POST /v1/browser/gemini/send`
55+- `current` → `GET /v1/browser/chatgpt/current` / `GET /v1/browser/gemini/current`
56+
57+### 3. local-api.ts 加端点
58+
59+参照 `/v1/browser/claude/send` 和 `/v1/browser/claude/current` 的实现,为 chatgpt 和 gemini 加对应端点。
60+
61+## 允许修改的目录
62+
63+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/policy.ts`
64+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/router.ts`
65+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
66+
67+## 验收标准
68+
69+- `@browser.chatgpt::send:::"hello"` 不被 policy deny
70+- `@browser.gemini::send:::"hello"` 不被 policy deny
71+- 路由正确映射到对应端点
72+- Claude 的 `@browser.claude` 行为不受影响
73+- 所有现有测试通过
74+
75+## 执行记录
76+
77+> 以下内容由执行任务的 AI 填写,创建任务时留空。
78+
79+### 开始执行
80+
81+- 执行者:
82+- 开始时间:
83+- 状态变更:`待开始` → `进行中`
84+
85+### 完成摘要
86+
87+- 完成时间:
88+- 状态变更:`进行中` → `已完成`
89+- 修改了哪些文件:
90+- 核心实现思路:
91+- 跑了哪些测试:
92+
93+### 执行过程中遇到的问题
94+
95+### 剩余风险
96+
A tasks/T-S050.md
+97, -0
 1@@ -0,0 +1,97 @@
 2+# Task T-S050:stagit 生成 git 静态页面
 3+
 4+## 状态
 5+
 6+- 当前状态:`待开始`
 7+- 规模预估:`M`
 8+- 依赖任务:无
 9+- 建议执行者:`Codex` 或 `Claude`
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S050.md` 任务文档,完成开发任务。
14+
15+## 当前基线
16+
17+- 仓库:`/Users/george/code/baa-conductor`
18+- 分支基线:`main`
19+- 提交:`eadee69`
20+
21+## 分支与 worktree(强制)
22+
23+- 分支名:`feat/stagit-integration`
24+- worktree 路径:`/Users/george/code/baa-conductor-stagit-integration`
25+
26+开工步骤:
27+
28+1. `cd /Users/george/code/baa-conductor`
29+2. `git worktree add ../baa-conductor-stagit-integration -b feat/stagit-integration main`
30+3. `cd ../baa-conductor-stagit-integration`
31+
32+完成后提交与推送(由执行者完成,不要合并):
33+
34+1. 在 worktree 里提交所有变更(包括更新后的任务文档)
35+2. `git push -u origin feat/stagit-integration`
36+
37+## 目标
38+
39+用 stagit 把 git 仓库生成纯静态 HTML,conductor serve,AI 通过 URL 浏览 git 历史、diff、文件。
40+
41+## 必须完成
42+
43+### 1. 安装 stagit
44+
45+- 确认 `brew install stagit` 或手动编译可用
46+- 验证 `stagit` 命令存在
47+
48+### 2. 生成脚本
49+
50+- 新建 `scripts/git-snapshot.sh`
51+- 参数:`<repo_path> <output_dir>`
52+- 调用 stagit 生成静态 HTML 到 output_dir
53+- 支持缓存(stagit -c)加速增量生成
54+
55+### 3. conductor 路由
56+
57+- 在 local-api.ts 加 `/artifact/repo/:repo_name/*` 路由
58+- serve `state/artifacts/repo/{repo_name}/` 目录的静态 HTML
59+- Content-Type 根据文件扩展名设置(.html → text/html)
60+
61+### 4. 首次生成
62+
63+- 为 `baa-conductor` 仓库生成一次 stagit 输出
64+- 验证 `https://conductor.makefile.so/artifact/repo/baa-conductor/log.html` 可访问
65+
66+## 允许修改的目录
67+
68+- `/Users/george/code/baa-conductor/scripts/`
69+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
70+
71+## 验收标准
72+
73+- `scripts/git-snapshot.sh /Users/george/code/baa-conductor state/artifacts/repo/baa-conductor` 生成成功
74+- `curl http://100.71.210.78:4317/artifact/repo/baa-conductor/log.html` 返回 HTML
75+- 页面包含最近的 git 提交历史
76+
77+## 执行记录
78+
79+> 以下内容由执行任务的 AI 填写,创建任务时留空。
80+
81+### 开始执行
82+
83+- 执行者:
84+- 开始时间:
85+- 状态变更:`待开始` → `进行中`
86+
87+### 完成摘要
88+
89+- 完成时间:
90+- 状态变更:`进行中` → `已完成`
91+- 修改了哪些文件:
92+- 核心实现思路:
93+- 跑了哪些测试:
94+
95+### 执行过程中遇到的问题
96+
97+### 剩余风险
98+
A tasks/T-S051.md
+94, -0
 1@@ -0,0 +1,94 @@
 2+# Task T-S051:代码文件直读映射
 3+
 4+## 状态
 5+
 6+- 当前状态:`待开始`
 7+- 规模预估:`S`
 8+- 依赖任务:无
 9+- 建议执行者:`Codex` 或 `Claude`
10+
11+## 直接给对话的提示词
12+
13+读 `/Users/george/code/baa-conductor/tasks/T-S051.md` 任务文档,完成开发任务。
14+
15+## 当前基线
16+
17+- 仓库:`/Users/george/code/baa-conductor`
18+- 分支基线:`main`
19+- 提交:`eadee69`
20+
21+## 分支与 worktree(强制)
22+
23+- 分支名:`feat/code-file-serving`
24+- worktree 路径:`/Users/george/code/baa-conductor-code-file-serving`
25+
26+开工步骤:
27+
28+1. `cd /Users/george/code/baa-conductor`
29+2. `git worktree add ../baa-conductor-code-file-serving -b feat/code-file-serving main`
30+3. `cd ../baa-conductor-code-file-serving`
31+
32+完成后提交与推送(由执行者完成,不要合并):
33+
34+1. 在 worktree 里提交所有变更(包括更新后的任务文档)
35+2. `git push -u origin feat/code-file-serving`
36+
37+## 目标
38+
39+conductor 的 `/code/` 路由直接 serve 磁盘上的代码文件,AI 通过 URL 读取任意源文件。
40+
41+## 必须完成
42+
43+### 1. 路由实现
44+
45+- `/code/:path*` 路由,映射到可配置的根目录(默认 `/Users/george/code/`)
46+- Content-Type 统一 `text/plain; charset=utf-8`
47+- 文件不存在返回 404
48+- 根目录可通过环境变量配置:`BAA_CODE_ROOT_DIR`
49+
50+### 2. 安全限制
51+
52+- 路径中不允许 `..`(防止目录遍历)
53+- 排除敏感文件:`.env`、`.credentials`、`.git/objects`
54+- 排除二进制文件(可选,根据扩展名判断)
55+- 不允许访问配置的根目录之外的路径
56+
57+### 3. 目录列表(可选)
58+
59+- 如果请求的是目录,返回文件列表(纯文本,每行一个文件名)
60+- 或者返回 JSON 数组
61+
62+## 允许修改的目录
63+
64+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
65+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.ts`(配置项)
66+
67+## 验收标准
68+
69+- `curl http://100.71.210.78:4317/code/baa-conductor/package.json` 返回文件内容
70+- `curl http://100.71.210.78:4317/code/baa-conductor/.env` 返回 403 或 404
71+- 路径遍历攻击 `../../../etc/passwd` 返回 403 或 404
72+- 不存在的文件返回 404
73+
74+## 执行记录
75+
76+> 以下内容由执行任务的 AI 填写,创建任务时留空。
77+
78+### 开始执行
79+
80+- 执行者:
81+- 开始时间:
82+- 状态变更:`待开始` → `进行中`
83+
84+### 完成摘要
85+
86+- 完成时间:
87+- 状态变更:`进行中` → `已完成`
88+- 修改了哪些文件:
89+- 核心实现思路:
90+- 跑了哪些测试:
91+
92+### 执行过程中遇到的问题
93+
94+### 剩余风险
95+
M tasks/TASK_OVERVIEW.md
+51, -4
 1@@ -2,8 +2,8 @@
 2 
 3 ## 当前基线
 4 
 5-- 日期:`2026-03-28`
 6-- 主分支基线:`main@3c85eaf`
 7+- 日期:`2026-03-29`
 8+- 主分支基线:`main@eadee69`
 9 - canonical local API:`http://100.71.210.78:4317`
10 - canonical public host:`https://conductor.makefile.so`
11 - 当前活跃任务卡保留在本目录;已完成任务卡已归档到 [`./archive/README.md`](./archive/README.md)
12@@ -50,11 +50,58 @@
13 |---|---|---|---|---|---|
14 | [`T-S045`](./T-S045.md) | 串联 artifact-db 写入与 D1 同步队列 | S | T-S040, T-S042 | Claude | 待开始 |
15 
16-### 独立任务
17+### 已完成
18+
19+| 任务 | 标题 | 状态 |
20+|---|---|---|
21+| T-S039 | Artifact 基础层 | ✅ |
22+| T-S040 | 接入主链路 | ✅ |
23+| T-S041 | 查询路由 | ✅ |
24+| T-S042 | D1 适配器 | ✅ |
25+| T-S043 | Claude Code CLI | ✅ |
26+| T-S044 | pnpm 环境 | ✅ |
27+| T-S045 | D1 同步串联 | ✅ |
28+| T-BUG-026 | 测试修复 | ✅ |
29+| T-BUG-027 | 安全+资源泄漏 | ✅ |
30+| T-BUG-028 | 查询路由+超时 | ✅ |
31+
32+## 下一波需求
33+
34+需求文档:[`../plans/NEXT_WAVE_REQUIREMENTS.md`](../plans/NEXT_WAVE_REQUIREMENTS.md)
35+
36+### P0/P1(优先)
37+
38+| 任务 | 标题 | 规模 | 依赖 | 建议 AI | 状态 |
39+|---|---|---|---|---|---|
40+| [`T-S046`](./T-S046.md) | 日志落盘 + files/read kind 修复 | S | 无 | Claude | 待开始 |
41+| [`T-BUG-029`](./T-BUG-029.md) | ChatGPT 思考模式 final-message bug | M | T-S046 | Claude | 待开始 |
42+
43+### P2(中等)
44+
45+| 任务 | 标题 | 规模 | 依赖 | 建议 AI | 状态 |
46+|---|---|---|---|---|---|
47+| [`T-S047`](./T-S047.md) | 跨会话接续入口 | S | 无 | Codex / Claude | 待开始 |
48+| [`T-S048`](./T-S048.md) | Gemini 投递适配器 | M | 无 | Claude | 待开始 |
49+| [`T-S049`](./T-S049.md) | 开放 chatgpt/gemini target | S | T-BUG-029, T-S048 | Codex / Claude | 待开始 |
50+
51+### P3(后续)
52 
53 | 任务 | 标题 | 规模 | 依赖 | 建议 AI | 状态 |
54 |---|---|---|---|---|---|
55-| [`T-S043`](./T-S043.md) | 接入 Claude Code CLI 双工模式 | M | 无(独立于 artifact 主线) | Claude | 待开始 |
56+| [`T-S050`](./T-S050.md) | stagit git 静态页面 | M | 无 | Codex / Claude | 待开始 |
57+| [`T-S051`](./T-S051.md) | 代码文件直读映射 | S | 无 | Codex / Claude | 待开始 |
58+
59+### 执行顺序
60+
61+```
62+T-S046 (日志) → T-BUG-029 (ChatGPT bug)
63+                      ↓
64+T-S047 (接续入口)     T-S048 (Gemini 适配器)  ← 可并行
65+                      ↓           ↓
66+                   T-S049 (开放 target)
67+                      ↓
68+              T-S050 / T-S051 (后续)
69+```
70 
71 ### P1(并行优化)
72