maestro
b51163ceed
merge: maestro/tsk_tqxHX6NRQ3iA [tsk_tqxHX6NRQ3iA]
2026-06-30 01:40:59 +08:00
maestro
65cd5add5c
maestro(tsk_tqxHX6NRQ3iA): 前端 NewTaskPanel:剪贴板粘贴图片 + 拖拽上传 + 统一 files 状态 + 缩略图预览 + 单个删除 + 客户端去重 + 5 语 i18n
2026-06-30 01:36:43 +08:00
maestro
bf2f7d8155
merge: maestro/tsk_tttdU3VLCy50 [tsk_tttdU3VLCy50]
2026-06-30 01:33:43 +08:00
wangjia
2500e3e779
后端:附件读取/下载端点 + 删除端点 + addAttachments 落库去重 (tsk_tttdU3VLCy50)
...
- store.addAttachments:按 path 去重(later-wins),消除重传产生的悬空元数据
- store.removeAttachment:按磁盘文件名(basename(path))移除元数据,返回 removed
- GET /api/tasks/:id/attachments/:name:inline 预览,?download=1 触发下载(RFC5987 文件名)
- DELETE /api/tasks/:id/attachments/:name:先删元数据再尽力删磁盘文件
- 只服务元数据登记过的附件 + resolve/startsWith 前缀校验,杜绝目录穿越
- 新增 test/attachments.test.ts(去重/读取/下载/删除/穿越/丢失/端到端上传去重)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-30 01:29:42 +08:00
wangjia
3ffdf411fc
docs(CLAUDE.md): 标明 app/+design 为在用 React 控制台、web/ 为遗留——纠正 planner 对前端目标的误判
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-30 01:01:24 +08:00
wangjia
b48d4d8135
Merge branch 'main' into worktree-tidy-jumping-shell
2026-06-29 23:32:40 +08:00
wangjia
5c68bb9324
docs(task-rules): 新增任务执行规则参考 HTML + 登记 docs/index 知识库分类
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 23:32:30 +08:00
wangjia
af690701bf
feat(web): Markdown 渲染器 + 拆解轨迹 + 需你处理区 + 复审报告折叠卡片
...
- RichDoc(marked+DOMPurify+highlight.js CDN)统一渲染 gate spec/复审报告/任务树 SPEC;- Transcript 组件:拆解评审「拆解轨迹」懒加载 planner run transcript;- 「审批闸」改名「需你处理」并并入 needs_attention(requeue/接管/取消 + 完整复审报告,按代码/安全分段折叠卡片、标裁决徽章);- 子任务显 scopeFiles 文件范围 + frozen「待拆解确认」标。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 23:32:30 +08:00
wangjia
5a609a8675
feat(retry+decompose): 范围型驳回不重试 + 拆解 prompt 补 scope 铁律
...
- ingest:复审 reject 时若任务有 scopeFiles 且理由命中越界/范围外/声明范围等标记 → 判为范围型驳回,调 store.failScopeReject 直接转 needs_attention(清退避、不进重试链),因 executor 碰不了范围外文件、重试必然同样被驳回;- store.failScopeReject:补记 failed run 承载原因 + 直转 needs_attention(带单测);- runner 拆解 prompt:加「files 范围铁律」——覆盖全跨层足迹 / 后端能力别塞前端范围 / 宁空勿窄 / 全或空。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 23:32:10 +08:00
maestro
8b494e92aa
merge: maestro/tsk_5dmtoHD_QVA3 [tsk_5dmtoHD_QVA3]
2026-06-29 19:57:46 +08:00
wangjia
aca8f1b18b
后端文件名加固:无名/无扩展名粘贴 blob 按 mimetype 生成安全文件名+扩展名 (tsk_5dmtoHD_QVA3)
...
附件上传接口对剪贴板粘贴等「无名/无扩展名」的 blob 加固落盘命名:
- 新增 extFromMime / safeAttachmentName 纯函数(可单测、已导出)
- 占位名(blob/image/file 等)或空名 → 生成唯一 paste-<ts>-<seq>,
扩展名优先按 mimetype 推断、其次保留原扩展名,避免多次粘贴同名覆盖
- 正常名缺扩展名 → 按 mimetype 补;路径穿越/非法字符净化,剥前导点
- name 字段在原名缺失时回退到生成名
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 19:54:58 +08:00
maestro
0569423b7d
merge: maestro/tsk_erQHNYdn6i9g [tsk_erQHNYdn6i9g]
2026-06-29 19:15:36 +08:00
wangjia
7884182d2b
feat: 编排器跨项目全局并发上限闸(tsk_erQHNYdn6i9g)
...
新增用户级设置项 globalConcurrency(settings 表,独立于新建项目默认值
来源 concurrency),缺省 0 = 不限,向后兼容无需 DB 迁移。
- store: UserSettings 加 globalConcurrency 字段 + 默认 0;新增
globalInflightCount()(跨所有项目 started run 总数,与 inflightTaskIds 同口径)
- orchestrator.claimTick: 叠加全局闸,与 per-project 闸串联(都过才领);
轮初查一次全局在途、轮内手动 ++,达上限即 return 跨所有项目停止领取
- api: PUT /api/settings 支持 globalConcurrency(空/null 归一为 0)
- web: 侧栏「全局设置」入口 + 模态,编辑/回显/校验(≥0 整数)
- test: 新增全局闸达上限跨项目阻止 / 未达上限正常领取 / 边界 / 轮初短路 用例
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 19:11:42 +08:00
wangjia
1c62059424
feat(web): 控制台 UI 批次——用量卡片精简+详情弹框、项目列表封顶 6、评审弹框增强、live 输出流、标题栏置顶
...
- 全局 AGENT 卡片精简为 2×2 概览(近 7 天窗口 + 真实运行数),删按项目列表,加「详情」弹框(按天/周/月柱状图 + 分项目下钻表);- 项目列表展开态封顶 6,多余折叠;- plan/exec 评审弹框:markdown 折叠卡片 + 点文件看 diff;- live 输出流提取 tool_use/tool_result;- Agent/审批闸/任务树/已归档标题栏滚动置顶。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 17:42:39 +08:00
wangjia
5198435ba0
feat(usage): 用量明细——/api/usage 加 week 窗口+runs 计数,新增 /api/usage/detail
...
costSummary 顶层补 runs 计数、period 扩 day|week|month;新增 usageDetail(day|week|month) 返回时间序列分桶 + 分项目下钻(token/花费/任务数/模型,model 维度沿用 usage JSON 近似口径)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 17:42:32 +08:00
wangjia
dc7c3030a5
feat(api): 任务改动 diff 端点——GET /api/tasks/:id/diff 按文件切分
...
结果评审需要看每个文件的具体改动。新增端点跑 git diff defaultBranch...branch,
按 diff --git 切分成 [{path, diff}],供前端点击文件展开查看。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 12:11:03 +08:00
wangjia
8765e61498
feat(console): 任务树筛选/折叠/统一标题 + 侧栏全局Agent卡片/拖拽排序/全局设置弹框/记忆项目 + 状态点真实化
...
任务树:四维多选下拉筛选(状态/复杂度/优先级/执行者)、已选置顶、新建任务按钮移右上角(0任务也能建)。
四块主区(Agent/审批闸/任务树/归档)统一标题组件(图标+名称+数量徽标)+ 折叠按钮(localStorage 记忆)。
侧栏:全局 Agent 弹层改常驻卡片(项目默认3+折叠+按活跃排序)、顶部项目拖拽排序、全局设置移入用户菜单弹框(保存/取消,落库)、记忆当前项目。
adaptProject 用后端 summary 的 running/attention 判状态点颜色(青/琥珀/灰)+ 紫色关注数徽标;agent 标题不再越界;i18n 5 语言补全。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 11:30:32 +08:00
wangjia
43fa1f7dbb
feat(ds): 表单输入/下拉文字改柔和灰——新增 --field-ink token 作单一真相源
...
输入/下拉文字此前用 --ink(近白)太刺眼且与正文耦合。新增 --field-ink token
(深 #a7b3a1 / 浅 #3c4838),Input/Select 组件引用之;改一个值即全改。
因项目无 DS 编译器,同步改 _ds_bundle.js(运行加载源)+ ambience.css 兜底,确保即时生效。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 11:30:17 +08:00
wangjia
f0f8f80425
fix(api): 项目状态点严格化——running 只数真实活跃 run(status=started)
...
之前 running 按任务状态(executing/analyzing/speccing)计,导致被冻结/排队的子任务
也让点变青。改为只数真实在途 run(runs.status='started' JOIN 本项目任务),只有活 agent 才青。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 11:18:02 +08:00
wangjia
2460b3f46c
feat(api): 项目任务状态摘要——侧栏状态点 + 需人工关注数
...
projectOut 此前不返 summary,前端拿到空 {} → 所有项目恒灰、无关注数。新增
store.projectSummary(projectId):running(executor+planner 在跑)/blocked/attention(待审批闸
+needs_attention)/executing/alive 计数,projectOut 带上。前端 adaptProject 用 running 判青点、
attention 进紫徽标。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 11:04:13 +08:00
wangjia
3780f1c064
fix(orchestrator): 拆解未批准前冻结子任务——父任务 plan_review/analyzing 期间子任务不可领取
...
修复 bug:auto-approved 项目里 planner 拆解后子任务立即被领取执行,而父任务还在
plan_review 等人审批,导致拆解若被驳回则子任务已白跑。claimable 加闸:子任务的父任务
处于 plan_review(待审拆解)或 analyzing(拆解中)时冻结,批准(decomposed)后放行。
仅冻结这两态,不影响 todo-sync 等其它带 parentId 的流程。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 10:57:24 +08:00
wangjia
f5ea32a600
feat(settings): 用户级全局默认配置(per-user 落库 + 新建项目套默认)
...
新增 settings 表(user_id PK,data JSON,单本地用户 'local')+ store.getSettings/putSettings
(内置默认=核心策略子集)+ GET/PUT /api/settings 端点;POST /api/projects 创建时以用户
默认填充未显式传的字段(body 优先,自动放行/预算经 patchProject 套用)。前端弹框另提交。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 09:19:18 +08:00
wangjia
a50e45baba
feat(app): 事件流时间加上日期——HH:MM:SS → MM-DD HH:MM:SS(本地时区,仅事件流)
...
新增 DATETIME 格式化器用于 adaptEvent,agent 面板的 TIME 保持不动。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-29 05:44:26 +08:00
wangjia
2009627eda
docs(规则12): 超时分层措辞对齐实际——agent跑共用 project.timeout_ms 可配,verify/复审/checks 为固定常量
...
核对发现「均可项目级配置」过度声明:实际仅 planner/executor/conflict 走可配的
project.timeout_ms(30min);verify(10min)/复审(15min)/分项checks(10min) 是硬编码
常量、无项目字段。改文档如实描述,不为无人调优的超时再加 3 个配置字段(YAGNI)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-28 23:15:34 +08:00
wangjia
04d9a0bf78
docs(③): 解冲突调度改「P0 最高优先级插队,不中断在途」——弃用真抢占
...
按用户决定(2026-06-25):解冲突补救任务以 P0 入队、rankByScore 即排队首、
名额空出时优先领取,但绝不 SIGTERM 在途 worker(维持 No-preemption 架构)。
代码本就如此(ensureMergeRemediationTask 建 P0 任务、orchestrator 无抢占逻辑),
本提交仅修正文档此前「优先抢占」的过度描述;附带修正 conflict 模型档过时表述
(已是项目可配置 + 默认 opus-4.8,非 fable-5)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-25 21:22:23 +08:00
wangjia
ec4345a4ae
docs(optimization-plan): ⑤状态机/⑥ER 改自包含 SVG + 补规则13边与新列
...
- ⑤ 状态机:mermaid → 内联 SVG(圆/椭圆节点,家族配色),含 executing→needs_attention 分歧重评估(规则13) 虚线边;移除 mermaid CDN script + initialize,文档全自包含
- ⑥ 数据库:补本轮已上线但漏登记的列 projects.models / projects.agent_rules / tasks.scope_files;新增「表关系 ER」内联 SVG(5 表主外键 + 基数)
- 规则13 状态条目标「✅ 已实现」并补实现说明
- 两张 SVG 经 xmllint 校验 well-formed
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-25 20:35:36 +08:00
wangjia
fa4ba3db28
feat(rule13): 执行前分歧重评估闸——main 撞声明范围→needs_attention 重评估
...
通用规则13的(B)半边:sync main 之前先跑 reevalScopeGate,
以 git diff HEAD...origin/main 取 main 自分支点以来改动的文件,
与任务 scopeFiles 求交集;非空即 emit needs-reeval →
daemon markReeval 直接转 needs_attention(不重试/不计失败/run收尾cancelled)。
- checks.ts: + reevalScopeGate / ReevalGateFn / ReevalGateResult
- pipeline.ts: createWorktree 后、syncMain 前插入重评估闸 + reevalGate 依赖注入
- protocol.ts: + needs-reeval OutboxRecord/Payload 事件
- ingest.ts: + case 'needs-reeval' → store.markReeval
- store.ts: + markReeval(executing→needs_attention,不进重试链)
- status.ts: executing 合法转移 + needs_attention
- 测试 +5:reevalScopeGate(命中/未命中/空/无前移/git错) · pipeline(命中emit/未命中续跑) · store.markReeval;全套 242 绿
- docs: optimization-plan.html 规则13 标 ✅ 已实现
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-25 20:15:02 +08:00
wangjia
6bf2b3619c
feat(web): 项目配置面板补全——checks/自动放行/agentRules/预算/角色模型编辑
...
此前 checks、autoApprovePlan/Exec、agentRules、budgetUsd、models 只能经 API 改,
看板无编辑口。现扩展项目「配置」面板:
- 分项检查:lint / typecheck / build 三命令(拼成 checks JSON,全空=null)
- 硬闸/自动放行:autoApprovePlan / autoApproveExec 两个勾选
- 角色模型:executor/planner/reviewer/conflict 四个输入(填模型 id 字符串,
或 {"easy":..,"hard":..} JSON;留空=默认 opus-4.8;非法 JSON 提示报错)
- 项目 Agent 规范(agentRules)textarea
- 成本预算:budgetUsd + budgetPeriod(按天/月)
toggle-config 回填全部新字段;save-config 一并 PATCH。新增 zh/en i18n 标签 +
.cfg-subhead/.cfg-check 样式。web/ 静态、无需 rebuild。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-25 07:34:49 +08:00
wangjia
e8fb2bc664
docs: 登记三类优化方案 HTML(含实现状态表)+ CLAUDE.md 模型档位更新
...
- docs/optimization-plan.html:纳入 worktree,顶部新增「★ 实现状态」章节
(优化点→实现→提交对照,2026-06-25 全部上线,含 3 个线上实测 bug 修复)
- docs/index.html:登记 optimization-plan.html 到「设计方案」分类
- CLAUDE.md:模型档位表改为「按项目可配置 + 默认 opus-4.8」的解析优先级说明,
回退链改 opus→sonnet→fable,注明 fable-5 不再是内置默认
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-25 07:08:19 +08:00
wangjia
59ce391ecc
feat(models+gate): 模型按项目可配置(默认 opus-4.8) + diff 声明外文件硬闸
...
① 模型可配置(项目维度,默认 opus-4.8)
- 新增 projects.models(JSON,按角色 executor/planner/reviewer/conflict
覆盖,值可为字符串=全复杂度统一 或 {easy,medium,hard} 分档)
- models.ts 重构 resolveModel:优先级 项目级 models > 旧 project.model
(仅 executor/planner) > env > 默认 DEFAULT_MODEL(opus-4.8)
- 取消内置 fable/sonnet 分档默认:所有角色默认 opus-4.8(彻底回避 fable-5
不可用问题,需要时项目级显式配置即可);回退链改 opus→sonnet→fable
- API PATCH /projects 透传 models;sanitizeModels 落库校验
② diff 声明外文件闸(task.scopeFiles)
- 新增 tasks.scope_files(JSON glob/路径数组)
- checks.ts: globToRegExp/matchesAnyGlob + scopeFileGate(改动文件越界=硬闸,
空声明跳过,git 出错不拦截);pipeline runApproveGates 接入
- planner 拆解新增每子任务 files 字段:prompt 要求 + parseDecompose 解析 +
ingest 落 scopeFiles,自动填充声明范围
- executor prompt 注入「声明文件范围约束」,让 agent 知边界(gate 才公平)
迁移:projects.models / tasks.scope_files 走 ensureColumn 幂等迁移(旧库补列)
测试:models 默认/配置/优先级、scope glob/gate、planner files 解析、
store 持久化往返、迁移补列 —— 237 通过
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-25 07:06:32 +08:00
wangjia
4c09186f36
fix(ingest): autoApproveExec 传错 id 致自动合并不触发(线上实测捕获)
...
condition 误把 taskId 传给 autoApproveExecOn(projectId) → getProject(taskId)=null
→ 永远 false,自动合并从不触发(任务卡 exec_review)。
重构为 shouldAutoApproveExec(store, task, codeV, secV),内部读 task.projectId 自取项目,
杜绝传错 id;补单测覆盖。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 23:51:07 +08:00
wangjia
a9c51021aa
fix(models): isModelError 识别「issue with the selected model」→ 触发回退链
...
线上实测:reviewer 用 fable-5 报「There's an issue with the selected model
(claude-fable-5)」(该档未对当前账号开通),但 isModelError 未命中此措辞 → 不回退 →
复审失败(verdict=null)。补正则后 fable-5 不可用会自动回退 opus 重试,复审正常。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 23:44:48 +08:00
wangjia
1bf3fecf42
fix(store): 补 checks/auto_approve_* 列的 ensureColumn 迁移(旧 DB 缺列 bug)
...
线上实测复现:既有 DB 的 projects 表早于这三列创建,schema.sql 的
CREATE TABLE IF NOT EXISTS 对已存在表是 no-op,故必须靠 ensureColumn 补列,
否则 createProject 的 INSERT 引用不存在的列报错「table projects has no column named checks」。
上个会话加列时漏了迁移,:memory: 测试走全新建表没暴露。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 23:41:10 +08:00
wangjia
1f318c2667
feat(agent): ② exec 自动放行(autoApproveExec)+ 抽出共享合并流程
...
- 新增 exec-merge.acceptAndMerge:封装 exec_review 通过并合并的完整流程
(merge→冲突建补救任务/成功 decide+收口+回收),API decide 与 ingest 复用同一逻辑
- server.ts decide 改调 acceptAndMerge(去重 ~40 行内联逻辑)
- ingest result:auto-approved + autoApproveExec + 双复审 approve → fire-and-forget
自动合并(git 异步不阻塞 tick);冲突则补救任务 + 留 exec_review 人审
- 测试:acceptAndMerge 可合并→done、冲突→补救+留审核闸(真实 git repo)
至此 plan ① ② ③ 三类优化 + 通用规则 + L1-L4 记忆注入代码侧全部落地
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 22:58:37 +08:00
wangjia
2d127698d1
feat(agent): ② approve 前硬闸——分项检查(lint/typecheck/build) + diff 体量闸
...
- checks.ts:runChecks 按 lint→typecheck→build 逐项跑(worktree 内,各 10min,
任一非0=硬失败报哪项挂);parseChecks 解析 project.checks JSON
- diffSizeGate:git diff --numstat 统计文件数+增删行数,超阈值=硬失败(提示拆解);
阈值 env 可配 MAESTRO_DIFF_MAX_FILES/LINES(默认 60/3000,0=不限);git 出错不拦截
- pipeline:verify 后插 checks+diff 闸,任一失败 emit failed 不进复审;
conflict 管线只跑 checks(diff 含整条原分支,体量闸会误伤)
- 注:diff「声明外文件」闸未做——task 无声明文件范围字段
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 22:53:56 +08:00
wangjia
ceb4f9e9d2
chore: gitignore todo/ 与 design/maestro-ds/
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 22:33:34 +08:00
wangjia
eef59830d6
chore: 不跟踪 todo/ 与 design/maestro-ds/(误入 git add -A,应保持未跟踪)
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 22:33:25 +08:00
wangjia
74be3ecec1
feat(agent): L3 记忆注入——子任务带父任务拆解意图 + 兄弟状态
...
- types.TaskContext + Task.context(daemon 装配、不持久化)
- store.taskContextOf(taskId):父 plan + 同层兄弟概览(标题/状态/复杂度,排除自身)
- orchestrator.claimOne:executor 子任务填充 context 下发(planner 跑在父任务上不需要)
- runner.buildPrompt 注入「## 拆解背景」段(顺序:规范→背景→任务内容)
- 仅 DB 读,不做 git/RAG 检索(成本控制)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 22:32:21 +08:00
wangjia
fe7923a618
feat(agent): L2/L4 记忆注入——项目规范 + 全局规范文件喂进 4 处 prompt
...
- L2 projects.agent_rules 列(schema+迁移+类型+mapper+patchProject+API 透传)
- L4 protocol.readGlobalAgentRules():worker 直接读 <data>/agent-global.md(非DB,
不读用户 ~/.claude/CLAUDE.md,避免个人习惯与受控执行冲突)
- runner.rulesHeaderLines 注入 executor/planner/conflict;reviewer 同注入
- 顺序:全局规范(L4)→项目规范(L2)→任务内容→上次失败(L1)→执行约束
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 22:29:29 +08:00
wangjia
ff2d7c22e7
feat(agent): 模型档位升 fable-5(复审/hard拆解/解冲突)+ 回退链 fable 置首
...
按 plan ①②③④ 定稿(用户确认):
- reviewer 三档统一 fable-5(不被 project.model 降档,保复审严格度)
- planner hard 拆解 opus→fable-5(最烧脑用最强档);medium=opus/easy=sonnet 不变
- conflict 固定 fable-5(解冲突恒用最强档)
- MODEL_FALLBACK_CHAIN: [fable-5, opus-4-8, sonnet-4-6](fable 置链首)
- executor 档不变(per plan ②);CLAUDE.md 档位表同步更正
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 22:24:30 +08:00
wangjia
73f80d27c9
feat(agent): 接通 plan 自动放行(autoApprovePlan)+ 项目配置可写
...
之前 auto_approve_plan/auto_approve_exec/checks 列与 Project 类型已存在,但
PatchProjectInput 不含它们 → 无法启用(dead config)。本次接通:
- PatchProjectInput + patchProject 支持 autoApprovePlan/autoApproveExec/checks
- API PATCH /projects 透传三字段
- ingest decompose-result:auto-approved + autoApprovePlan + 全 easy + 子任务≤5
→ store.decide(accept) 跳过 plan_review 直达 decomposed(默认关)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 22:13:18 +08:00
wangjia
ecea1ae9b6
feat(agent): L1 记忆注入——重试任务带上次失败原因喂回 prompt
...
- store.lastRunErrorOf(taskId):取最近一次失败 run 的 error(任意 kind)
- orchestrator.claimOne:写 job.json 时填充 task.lastRunError 下发 worker
- runner 三处 prompt(executor/planner/conflict)注入「## 上次失败原因」段(截断 2000 字符)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 22:09:06 +08:00
wangjia
7a6c826610
feat(app): 任务生命周期操作 UI(编辑/取消/重投/删除 + 复杂度落库)
...
补齐前端缺失的任务管理闭环(均接现有后端端点,无需后端改动):
- api.js:patchTask / cancelTask / requeueTask / deleteTask
- app.jsx:taskOps{patch,cancel,requeue,del},统一带刷新 + toast
- TaskDetail 操作工具条:✎编辑 / ⌨接管 / ↻重投 / ⊘取消 / 🗑删除(删除带确认;
重投/取消按状态显隐)
- 编辑表单:标题 + 优先级 + 依赖(点选其他任务)→ PATCH /tasks/:id
- 修复:行内复杂度选择器(CplxPicker)从「仅本地 state」改为真正 PATCH 落库
验证:build 通过;建临时任务实测——工具条/编辑表单渲染 0 错误、DELETE 成功
(deleted:1)、PATCH 在途守卫正确拒绝;测试残留已清理。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 17:26:29 +08:00
wangjia
638f2f64f0
feat: 人工接管任务(takeover)+ 任务详情展示附件
...
B-③ takeover(⑧ ★ POST /api/tasks/:id/takeover):
后端:
- POST /api/tasks/:id/takeover:准备(或复用 result.worktree)任务 worktree,
返回 {taskId, worktree, branch, console}——console 为用户在自己终端起交互式
claude 的命令(daemon 无 TTY,不在进程内起交互会话);在途 run 时拒绝
前端:
- api.takeover;TakeoverModal(展示命令 + 一键复制 + 分支提示)
- TaskDetail 加「⌨ 人工接管」按钮(onTakeover 经 TaskSection→TaskRow 线程下来)
- 顺带:TaskDetail 展示任务附件(📎 文件名,读 task._raw.attachments)
验证:typecheck 干净;206 测试通过;前端 build + dev 渲染 0 错误。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 17:06:35 +08:00
wangjia
a688b6977e
feat: agent 实时输出流(SSE)
...
B-② SSE 实时流(⑧ ★ GET /api/tasks/:id/stream):
后端:
- GET /api/tasks/:id/stream:SSE 跟随任务最近一条 run 的 transcript 文件,
新写入的 agent 消息逐行推送(活跃 run=实时;已结束=回放后 end);
500ms 轮询 tail(按 offset 增量读),run 转非 started 即结束流,客户端断开即停
前端:
- StreamModal(EventSource 消费 SSE,summarizeMessage 把 SDK 消息→可读行:
助手文本/⚙工具调用/■终态/·maestro 元事件,自动滚动到底)
- AgentSection agent 行可点击 → 打开实时流模态;adaptActiveAgents 带出 taskId
验证:typecheck 干净;前端 build 通过;dev 渲染 0 console 错误。
(实时效果需有运行中的 agent;端到端随 daemon 重启验证。)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 17:01:58 +08:00
wangjia
9b17d3e24f
feat: 任务附件上传(图片/文件随任务提交)
...
B-① 附件上传(⑧ ★ POST /api/tasks/:id/attachments):
后端:
- 加 @fastify/multipart;schema/db.ts tasks.attachments 列(幂等迁移)
- types.Attachment{name,type,path} + Task.attachments;mappers 映射
- store.addAttachments(追加元数据 + 广播 task.updated)
- POST /api/tasks/:id/attachments:multipart files[](单文件≤25MB/单次≤10),
落盘 <data>/tasks/<id>/attachments/,文件名消毒,返回全部附件
前端:
- api.uploadAttachments(FormData multipart)
- 新建任务表单加文件选择 + 已选列表;创建任务后自动上传附件
验证:typecheck 干净;206 测试通过;前端 build 通过。
(端到端需重启 daemon 加载新端点——与后续 SSE/takeover 一并重启。)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 16:58:14 +08:00
wangjia
6c9b05e575
feat: 项目级成本预算系统(按模型×token 精确计费 + 超额自动暂停)
...
精确到项目级的成本/预算护栏,成本按「模型 × token 用量」折算(⑧ ★ 新特性)。
定价(单源):
- src/model/pricing.ts:MODEL_PRICES(opus/sonnet/haiku,USD/1M token,分
input/output/cacheRead/cacheWrite)+ computeCost/addUsage,前缀容错、未知模型记 0
token 捕获链(worker → daemon):
- cc.ts:从 SDK result 消息抓 usage,跨 resume/回退累计;CCResult.usage
- runner/reviewer:结果对象带 usage + modelUsed
- protocol.ts:新增 'usage' outbox 记录;pipeline 每次 CC(executor/复审/planner/
conflict)后 emit usage(worker 侧写文件,不碰 DB)
- ingest.ts:'usage' → store.setRunUsage(累加、按模型折算)→ enforceBudget
存储 + 护栏:
- schema/db.ts:runs.usage/cost_usd、projects.budget_usd/budget_period(幂等迁移)
- store.ts:setRunUsage(累加)、projectSpend、costSummary(按项目/模型/总计)、
enforceBudget(超额 → 置 paused + 广播 budget.exceeded)
- 编排器天然停领:orchestrator 既有「跳过 paused 项目」即生效,无需改
API:
- GET /api/usage:并入成本明细 {session,weekly,cost:{period,total,byProject,byModel}},?period/?project
- GET /api/health:{ok,db,inflight,at}
- PATCH /api/projects:支持 budgetUsd/budgetPeriod
前端:
- adapt.js:agentSummary 用真实成本/token;adaptProject 透传预算字段
- app.jsx:budget.exceeded → 告警 toast
- ConfigPanel:预算 $ + 周期(day|month)受控输入
验证:typecheck 干净;206 测试通过(含新增 budget.test.ts 4 例:定价折算/累加/
costSummary/enforceBudget);前端 build + 截图确认预算输入渲染、0 错误。
注:生效需合并后重启 daemon(迁移幂等加列、向后兼容旧库)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 15:29:44 +08:00
wangjia
0a1f500c12
feat(app+ds): 阶段2 接前端写操作——任务创建/配置保存/新建项目
...
让原型里的视觉 mock 表单变为真正可写(附加式、向后兼容原型 index.html):
design/ui_kits/console(surface 功能化,DS 组件本就支持 onChange):
- NewTaskPanel:表单受控(title/complexity/priority/parentId),onCreate 出参;
父任务下拉扁平化含子任务
- TaskSection:暴露 onCreate prop(无则回退原 toast)
- ConfigPanel:受控(concurrency/autonomy/logo/verifyCmd/model),onSave 出参
app/:
- api.js:加 createProject
- app.jsx:createTask→POST /tasks、saveConfig→PATCH /projects、createProject→
POST /projects;新增 NewProjectModal(design 无现成 surface,用 DS 组件就地拼装,
zh/en 标签自含);接 Sidebar 新建项目入口
验证:dev + 生产构建双通过;Playwright 实测新建项目模态打开、受控输入捕获值
(["demo-app",".../demo-app","main"])、0 console 错误。写端点契约逐字段比对
server.ts(PATCH camelCase / POST tasks {title,complexity(auto),priority,parentId,deps})。
活写测试从略:maestro 为 auto-approved,建真实任务会触发 agent。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 14:44:46 +08:00
wangjia
d6ae4dbe13
feat(app): 阶段2 接真实数据——REST + WS 直连本地 daemon
...
前端从 mock 切换到真实数据源(按 ⑧ 前端 API 契约,复用现有 :4517 daemon API):
- src/api.js:REST 封装 + WS 单向订阅(断线指数退避重连)
- src/adapt.js:纯映射层,把 API 的 camelCase 行映射成各 surface 期望形状
(扁平任务→children 树、priority 整数→P0/1/2、complexity→cplx、终态→归档卡)
- src/app.jsx:改为 useEffect 拉取 + WS 增量刷新;decide/sync 走真实 POST;
审批闸收紧到 plan/spec/exec_review 三态(needs_attention 仍在任务树可见)
- vite.config.js:加 /api + /ws 反代到 :4517;去掉 jsxInject(surface 走全局
React,避免生产构建 rollup 从 design/ 解析 react 失败)
- main.jsx:移除 data.js mock 导入
验证:dev + 生产构建双通过;真实数据渲染(4 项目/审批闸带 diff/真实配额),
WS 已连接,0 console 错误。token/成本类(agentSummary)属 ⑧ ★ 新 /api/usage
(预算特性),暂留空待补。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 14:29:19 +08:00
wangjia
1fcd811c12
docs: maestro 后端重构 Phase1 设计文档(schedule_status × work_type)
...
8 章设计文档 HTML(架构决策/状态设计/DB Schema/记忆注入/Agent 规格/
运维护栏/安全沙箱/前端 API 契约),全图深色内联 SVG,附 docs/index.html 索引。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-24 13:52:53 +08:00