feat: PR 审核流程 + 自动合并 + macOS 通知 + 订阅额度透传 + 归档详情
PR 流程(开发→提PR→CodeReview→安全审计→审核→通过即合并): - reviewer 拆分为 code review 与安全审计两个独立 CC run(kind=reviewer/security), TaskResult 四字段(summary/verdict + securitySummary/securityVerdict),闸上两节报告两枚结论徽章 - executor/merge.ts: 通过即合并——临时 worktree 内 merge --no-ff,绝不碰用户工作区/不 push; 冲突安全拒绝(报冲突文件);重复合并幂等;合并后回收执行 worktree + 删分支 - decide 路由 merge:false 逃生口 + 看板「仅通过」按钮(目标分支被工作区检出时用) 通知(daemon/notify.ts): - macOS 原生通知: 进审核闸(复审建议拒绝标⚠)/连续失败需人工/合并完成 - 同任务同类型 60s 抑制、osascript 转义截断、MAESTRO_NOTIFY=0 关闭 订阅额度透传(daemon/usage.ts): - OAuth usage API(与 Claude Code/claude-hud 同源),凭证 keychain→内存零泄漏 - 60s 成败双缓存+并发去重+5s 超时,失败降级 null - GET /api/agents 顶层 usage 字段;Agent 面板显示 5h/周用量条+重置倒计时(>80%琥珀/>95%红) 看板与生命周期: - 归档区: 深度1整树完成沉底,时间倒序分页(尺寸 chip 10/20/50/100 置底) - 归档详情对话框: 全属性/执行历史与时长/审批记录/状态流转时间线(GET /api/tasks/:id/events) - 容器收口: 已拆解 Hard 子任务全 done 自动 done(afterDone 逐级向上) - 同步按钮收进配置面板;执行白名单扩测试命令(npm/go/shellcheck/make/pytest) - Agent 面板显示调度模式与各复杂度模型;被依赖阻塞→被阻塞 测试: 74/74(新增 merge 6/notify 10/usage 7/容器收口/双复审适配) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -39,9 +39,10 @@ export function rowToProject(r: ProjectRow): Project {
|
||||
};
|
||||
}
|
||||
|
||||
/** 旧 result JSON 兜底:summary/verdict 是后加字段,老数据缺省补 null */
|
||||
/** 旧 result JSON 兜底:summary/verdict/securitySummary/securityVerdict 是后加字段,老数据缺省补 null */
|
||||
function parseResult(json: string): TaskResult {
|
||||
const raw = JSON.parse(json) as Partial<TaskResult>;
|
||||
const verdict = (v: unknown): TaskResult['verdict'] => (v === 'approve' || v === 'reject' ? v : null);
|
||||
return {
|
||||
branch: raw.branch ?? null,
|
||||
worktree: raw.worktree ?? null,
|
||||
@@ -49,7 +50,9 @@ function parseResult(json: string): TaskResult {
|
||||
commits: raw.commits ?? [],
|
||||
prUrl: raw.prUrl ?? null,
|
||||
summary: raw.summary ?? null,
|
||||
verdict: raw.verdict === 'approve' || raw.verdict === 'reject' ? raw.verdict : null,
|
||||
verdict: verdict(raw.verdict),
|
||||
securitySummary: raw.securitySummary ?? null,
|
||||
securityVerdict: verdict(raw.securityVerdict),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ CREATE INDEX IF NOT EXISTS idx_approvals_task ON approvals(task_id, at);
|
||||
CREATE TABLE IF NOT EXISTS runs (
|
||||
id TEXT PRIMARY KEY,
|
||||
task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
||||
kind TEXT NOT NULL, -- planner | executor
|
||||
kind TEXT NOT NULL, -- planner | executor | reviewer | security
|
||||
worktree TEXT,
|
||||
branch TEXT,
|
||||
status TEXT NOT NULL, -- started | succeeded | failed | cancelled
|
||||
|
||||
Reference in New Issue
Block a user