feat!: CodeKeeper repositioning——Agent 管线编排 + 项目智库工作台 - #13
Open
Windsander wants to merge 18 commits into
Open
Conversation
建立 MaintainerLocalJudge 抽象接口及保守桩实现, 用于后续在少数高杠杆语义判断点接入轻量判别辅助。 保持当前 Maintainer 行为不变:桩始终标记判定不可靠, runner 预留 localJudge 字段但未改变判定流。
- MaintainerRunner 构造器替换保守桩为 LlmMaintainerLocalJudge - recheckStaleFindingIfNeeded 中调用 assistAlreadyFixedCheck 辅助判别 - 辅助不可靠时回退到 brain.recheckAlreadyFixed 原逻辑 - 辅助可靠且建议已修复时仅在可靠命中时覆盖结论 本提交属于 feat/upgrade_maintainer 分支的阶段3最小接通。
- 扩展 MaintainerLocalJudge 接口,新增 preFilterScope 与
preFilterNonFindingDiscussion 方法签名及 PreFilterScopeVerdict /
PreFilterNonFindingVerdict 类型
- 保守桩实现新增两个方法的不可靠返回,不改变现有 Maintainer 行为
- LlmMaintainerLocalJudge 新增两个辅助方法实现:
- preFilterScope:辅助判定 finding 范围(trivial / local /
cross-file / needs-clarification),不可靠时回退
- preFilterNonFindingDiscussion:辅助判定 discussion 是否很可能
不是待逐条修复的代码问题,不可靠时回退
- 两个方法沿用已有实现风格:completeJson + 小 prompt/system +
parseSimpleJson + typeof 守卫 + 不可靠 fallback
- npm run build 与 npm run lint 均通过(0 errors)
回退原则:
- 不可靠时返回不可靠,调用方继续走原有逻辑
- 可靠但置信度不足或结论为“仍是 local / 仍是 finding”时不覆盖
- 输出需经调用方验证后使用
按 .prettierrc.json 对仓库做一次性格式化,并新增 .prettierignore 排除 dist/vendor/fixtures/prompts 等不应格式化的路径。 纯格式变更,无行为改动。
上一格式化提交遗漏了这些待 M1 改动的文件,单独补齐, 使 M1 提交只包含功能性改动。.prettierignore 排除 dist/vendor/node_modules/fixtures/prompts,保护 submodule 与 LLM prompt 资产不被格式化。
旧线清除(M1):
- 删除旧版代码线:src/review、src/learn、src/ast-grep、src/scheduler.ts、
src/index.ts、src/cli.ts、src/config-loader.ts、src/types.ts、
config/projects.example.yaml、.env.example(learn 循环与 ast-grep 预检
能力将在后续里程碑以新形态承接)
- 幸存者迁移入 advance:core/logger、core/platform → src/advance/core/;
gitlab/client → src/advance/gitlab/;全部 import 路径重写
- GitLabClient 构造函数简化为 {baseUrl, token, projectPath},
gitlab-provider 不再伪造占位 ProjectConfig
- package.json:main 重指向 dist/advance/cli-entry.js;keywords 去除
claude/gitlab(去品牌化);移除孤儿依赖 dotenv(lock 含 npm 版本
元数据差异)
- 安装脚本(launchd/systemd/windows/start.bat)入口改为
cli-entry.js start,删除失效的 CODEKEEPER_CONFIG/CODEKEEPER_LOG_DIR env;
windows 脚本清理旧任务名 CornReview
- README 中英双语移除 .env.example 兼容入口说明;DESIGN.md 标记废弃
顺带修复 HEAD 遗留问题:
- maintainer-runner already-fixed 辅助调用的类型错误
(finding.message、focusedContextToString、联合类型收窄),
移除指向错误模块的 ConservativeLocalJudgeStub 导入
(桩位于 maintainer-local-judge-stub.ts)
- graph-builder-maintainer 测试的时间炸弹(硬编码 2026-07-22
改为动态 UTC 日期)
- maintainer-local-judge.ts 与 model-label.test.ts 为 prettier
二次通过的纯格式残留
验证:build + vitest(942 通过)+ lint(含路径隔离检查)+ format 全绿
M2 管线核心(repositioning 地基): - pipeline/core/types.ts:管线图 zod schema(nodes/edges/端口引用/channel 绑定), 节点预留 subgraph 递归字段(M7 钻取层);NodeHandler/RunContext 接口, services 为服务注入通道(凭据禁入 params,明文落库约定已注释) - pipeline/core/topology.ts:图校验(重复 id/悬空边)+ Kahn 拓扑排序 + 环检测 - pipeline/core/loader.ts:pipeline.yaml 正本加载(zod 聚合报错) - pipeline/core/run-store.ts:pipeline_runs/stage_runs CRUD,节点边界落库 - pipeline/core/executor.ts:拓扑序顺序执行、失败即停、cancelled 状态、 resume 断点续跑(成功节点不重跑、产物回灌)、abort signal、ephemeral 模式 - store/schema.sql:新增 pipeline_runs/stage_runs 两表(纯增量,旧库兼容) - 28 个新单测(:memory:/临时目录,零真实路径) 对抗审核已修复:cancelled 状态接线、stage 排序 rowid 兜底、 beginStage/resume 语义注释。环节点误报(Tarjan 精确化)留待 M4。 验证:build + vitest(966 通过)+ lint 零警告 + format 全绿
M3 Role 节点化: - 新增 PipelineScheduler:加载/自动迁移 pipeline.yaml,按 trigger.cron 注册 node-cron,触发后经 PipelineExecutor startFrom 下游子图执行;接口表面兼容 旧 RoleServiceRegistry(start/stop/restartProject/getStatus) - 新增 RoleNodeRuntime:每 (项目,角色) 一个长驻子进程,ready/run/done/error IPC 协议;ready 超时 SIGKILL 清表、启动即崩立即报错、重入跳过(运行锁前移)、 SIGTERM+3s SIGKILL 兜底 - role-entry 重写为单项目指令模式(CK_PROJECT_ID,不再轮询不再自持 cron) - BaseRoleRunner 收敛为 runProjectOnce(保留运行锁/预检查/错误记录); 默认调度移至 DEFAULT_ROLE_SCHEDULES - 自动迁移:缺失时按角色配置生成 pipeline.yaml(带 codekeeper:generated 标记; 配置更新时重建生成件,人类编辑后不再回写) - 感知接线:role.config.update → regenerate+reloadProject;register → reloadProject;unregister → unloadProject;restart 语义按项目/整角色分流, 立即对账轮改为异步派发(不阻塞配置保存 IPC) - 删除死代码:role-service、role-service-registry、role-ipc-registry、 classic-config-builder 及对应测试;role-entry 测试改写为新契约 - executor 新增 startFrom 下游子图裁剪(多触发器管线分支隔离) - DESIGN.md 重写为新定位架构文档(分层管线图/运行时/智库/里程碑/RULES) 对抗审核两轮:首轮发现动态感知丢失、注册注销未接线等 2 阻断 4 主要, 已全部修复并经复审确认。验证:build + vitest(985 通过)+ lint 零警告 + format 全绿
M4 可视化画布: - daemon:PipelineScheduler 新增 getProjectPipeline(自动迁移+generated 标记)、 updateProjectPipeline(zod 校验+环检测+写回人类正本+热加载)、 listPipelineRuns(SQL 层按项目过滤、收窄传输形状);params 凭据键启发式拦截 - IPC:pipeline.get / pipeline.update / pipeline.runs - 渲染:PipelineGraph(vis-network;结构效应仅在连接关系/布局模式变化时重建, 呈现效应原地更新 label/坐标/运行状态,轮询不再打断缩放与连线)、 PipelineCanvas(草稿态编辑+模块级草稿缓存跨 tab 存活、节点调色板、检查器: trigger 编辑 cron、reviewer/maintainer 嵌入 RoleProjectConfig、 画布接管正本后的调度遮蔽提示)、ProjectDetail 新增 Pipeline 默认 tab - 编辑操作抽出纯函数 pipeline-edit.ts(端口映射/增删节点边/坐标全量固化/防碰撞 id) 对抗审核修复:5s 轮询整图重建、拖拽弹回、runs 全局过滤后缺失、 调度静默遮蔽提示缺失、跨项目草稿污染、tab 切换丢草稿、id 碰撞、 exists 语义自相矛盾。 待人工验收(桌面环境):编辑模式入口可发现性、连线/删除手感、 暗色主题、窄屏布局、运行状态边框实机刷新。 验证:build + vitest(992 通过)+ lint 零警告 + format + electron:build 全绿
M5 外部 Agent 接入: - agents/task-envelope.ts:A2A 词汇契约(TaskEnvelope/TaskResult/AgentArtifact/ AgentCapabilityCard),output 键与管线端口的对应关系已注释 - agents/transports.ts:subprocess(stdin/stdout JSON,EPIPE 收敛、输出上限、 超时 SIGKILL)/ a2a(POST /tasks + AgentCard 探测,端点归一化,如实标注 不与现网完整 A2A 互通)/ mcp(SSE callTool,超时包装);TaskResult zod 校验 - agents/registry.ts:注册表(daemon-config agents 数组,加载期逐条校验); agentId 引用时注册项优先(防 pipeline.yaml 投毒);agent.subprocess 强制 agentId 白名单,网络类传输允许内联 - agents/mcp-facade.ts:MCP 门面(127.0.0.1 + 启动期随机 token),工具 pipeline_list_runs / pipeline_submit(异步派发+角色校验)/ knowledge_recall; 会话级资源管理,stop 主动关闭 SSE 会话(daemon 可干净退出); 独立于 EverOS 启动(recall 自行降级) - 调度器:agent.* 节点处理器(信封 id=runId:nodeId,处理器获传当前节点) - daemon.status 暴露 mcpFacade 地址;SECURITY.md 声明本地信任模型; DESIGN.md 补 M5 章节 对抗审核修复:EPIPE 崩溃、关停挂起、门面泄漏、闭包节点 id 错、 合并方向投毒、submit 阻塞、TaskResult 零校验、MCP 传输无超时。 验证:build + vitest(1010 通过)+ lint 零警告 + format 全绿
M6 双正本智库: - knowledge-store.ts:策展正本层——共享 <project>/.codekeeper/knowledge/(入库) + 私有 ~/.codekeeper/memory/knowledge/<projectId>/(本地,测试可注入); Markdown+frontmatter zod 校验;容忍 BOM;inbox 草稿箱 - knowledge-projection.ts:正本→EverOS 投影,状态键含 root 维度 (双正本同 id 幂等正确),flush 失败回滚状态下轮重投 - knowledge-distill.ts:EverOS 经验 → LLM 候选(prompt 外置)→ knowledge-inbox/(source: distilled;与正本+草稿箱去重;UUID 兜底 id) - 召回闭环:recall_project_knowledge 扩展为 archiver + knowledge-projection 双 owner,投影的策展知识可被 Reviewer/Maintainer 召回 - 调度器:knowledge.project / knowledge.distill 节点处理器(daemon 进程内); 调度从按角色节点重构为按 trigger 节点拉分支——纯知识/Agent 分支可独立调度 - 默认管线:archiver 后链 knowledge.project - IPC:knowledge.list/approve/dismiss(knowledgeId slug 校验防路径穿越); UI:ProjectDetail 新增 Knowledge tab(草稿批准/驳回 + 正本列表) - 画布调色板加入知识节点;DESIGN.md 修复里程碑表并补智库章节 (含 knowledge-inbox 入库提示) 对抗审核+计划保真度审计:M1-M6 与计划一致;修复召回口径断裂、 双根幂等、IPC 路径穿越 3 个主要项及 BOM/flush 回滚/蒸馏去重等次要项。 README 双语能力章节更新留待 M7 收尾时统一刷新。 验证:build + vitest(1019 通过)+ lint 零警告 + format + electron:build 全绿
M7 钻取层: - executor:subgraph 递归执行(任意深度嵌套;带子图且无处理器的节点执行子图; 入口节点继承父输入,终态节点输出汇聚;stage 记录 parent/child 分层命名) - ast-grep/runner.ts:ast-grep 预检以 stage 形态回归(spawn 数组参数无 shell、 30s 超时、二进制缺失/Windows shim 优雅降级、JSON 解析兼容多形态) - classic/stage-handlers.ts:stage.role-run(复合 stage,包装 Runner 黑箱)+ stage.ast-grep(params.paths 相对路径按项目根归一) - role-entry:角色节点带 subgraph 时执行子图(接 PipelineRunStore, stage 记录落库分层可见),否则保持黑箱 runProjectOnce - 画布:钻取视图(面包屑返回)+ 检查器"钻取子图/展开为子图" (materializeRoleSubgraph 生成默认子图);discard 同步重置钻取路径 - 写回安全:updateProjectPipeline 改深度校验(validatePipelineDeep 逐层 结构校验+环检测);assertNoSecretParams 递归覆盖子图 params - README 双语能力表刷新(管线编排/外部 Agent/项目智库);DESIGN.md M7 勾选 对抗审核修复:子图凭据漏检(主要)、写回校验不递归、嵌套子图运行时误导、 discard 残留钻取路径、子图执行零落库、ast-grep 相对路径基准。 验证:build + vitest(1027 通过)+ lint 零警告 + format + electron:build 全绿
终局独立审计(对照目标逐项取证)发现的修复: - D1(M7 断线):role-entry 子图执行未传 projectId,stage 记录落库后 listRunsByProject 查不出——补传并加回归测试(子图运行记录按项目可查) - D2:MCP 门面 start() 返回完整 SSE 端点(含 /sse?token=),并在 ServiceStatusPanel 展示(外部 Agent 接入点 UI 可见) - D3:executor.resume 对含子图的 run 显式拒绝(跳过集失配防护,待支持后放开) - D4:role 节点处理器声明并产出 done 端口(默认管线 archiver→knowledge.project 边的产物语义补齐) - D5:DESIGN.md sink.* 标注预留 - D6:daemon.config 回退分支补 agents 字段(与运行态形状一致) 审计结论:M1-M7 全部通过,横切 RULES 9 项全过,目标级验收达成。 验证:build + vitest(1028 通过)+ lint 零警告 + format + electron:build 全绿
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
CodeKeeper Repositioning:Agent 管线编排 + 项目智库工作台
将 CodeKeeper 从"MR 审查机器人" repositioning 为本地优先的 Agent 管线编排 + 项目智库工作台:ComfyUI 式可视化编排为皮,持久化执行为骨,双正本智库为底。
里程碑
pipeline.yaml正本加载、顺序执行器(失败即停/resume 续跑/cancelled)、pipeline_runs/stage_runs落库pipeline.yaml,配置变更/注册/注销全链路感知knowledge/入库 + 本地私有)+ EverOS 投影(哈希幂等)+ 经验蒸馏人审闸门 + Knowledge tab过程质量
验证
npm run build+npm run test:vitest(1028 通过)+npm run lint(零警告)+npm run format+electron:build全绿待人工验收(需桌面/真实环境,不阻塞合入)
画布实机交互、Windows 平台复验、真实服务全链路、A2A 现网互联、ast-grep stage 实机效果。