Todo Archive 分片:M2 / M3 / M4 / M4.5 / M4.6 / M5 / M5.5(2026-08-14 从主归档迁出)
本文件为
todo-archive.md的早期阶段分片(按 archive/index.md 分片规则,主窗口保留最近 3-5 个阶段)。 迁移背景:2026-08-14 归档 T711 时主文档超窗口,执行 backlog T906 分片迁移;原始归档日期见各阶段块头。
M2: GitHub Action 接入(已归档)
归档日期: 2026-08-05 阶段摘要: 参见 roadmap.md §M2 状态: 已完成(含 M2 增强批次) 最终提交:
c97fe2bdocs: 同步 T213 完成状态(评估发现状态滞后)
阶段成果: 消费者仓库可通过 uses: dependfix/dependfix@v1 一行接入安全告警自动修复(fix-and-pr 默认、PR 去重、分支清理、分组升级)。M2 全部 13 个任务完成(11 个 ✅ + T205/T206 骨架按设计完成,M5 联调)。G2 处置闭环(T-G2-1~5)。448 tests。
T201 创建 Composite Action(action.yml)✅
- 交付物:
action.yml+.github/workflows/security-auto-fix.yml(dogfooding) - 实现内容: composite action 6 步(setup pnpm → Node → install+build → run CLI → upload artifact → summary)、
uses: ./薄封装、每周一 UTC 6:00 定时 - 验收: 消费者
uses: dependfix/dependfix@v1可引用、dispatch + schedule 双触发
T202 Action 输入输出参数对齐 ✅
- 实现内容:
repos输入(留空默认github.repository)、CLI 完整映射、报告写入$GITHUB_STEP_SUMMARY
T203 报告 Artifact 输出 ✅
- 实现内容:
writeReport()文件名dependfix-report-YYYYMMDD-HHmmss-{runId尾段}.md|.json、upload-artifact 上传./dependfix-reports/
T204 分支与 PR 创建能力 ✅
- 交付物:
packages/cli/src/github/pr-creator.ts+ fix-and-pr 模式 - 实现内容:
createFixBranch/stageAndCommit/pushBranch/createPullRequest/generatePRBody/hasGitChanges;workflow permissionscontents: write+pull-requests: write
T205 AI Token 支持(🔶 骨架,M5 T502 联调)
- 实现内容: action.yml 预留
ai-api-token/ai-api-base-url输入,经 env 传递(不出现在日志/summary);AI 引擎联调延后 M5
T206 Prompt 注入防护(🔶 骨架,M5 联调)
- 实现内容: 触发仅 dispatch/schedule(不接受 comment trigger)、触发者权限由消费者 workflow 控制;system prompt 硬编码与输入清洗 M5 落地
T207 fix 模式本地提交(--commit)✅
- 实现内容:
--commit/AUTO_FIX_GITHUB_SECURITY_COMMIT、互斥校验(dry-run/create-pr/非 fix)、ensureGitignore前置、提交失败记COMMIT_FAILED不影响报告
T208 Action workDir 语义修正 ✅
- 实现内容: 首步
actions/checkout(消费者仓库到$GITHUB_WORKSPACE)、Run 在 workspace 执行、CLI 从 action_path 调用、build 冒烟检查
T209 Action 默认 fix-and-pr ✅
- 实现内容: action.yml
mode默认fix-and-pr、dry-run默认false;CLI 本地默认 report-only(两场景语义分离);文档标注破坏性变更
T210 PR 去重:内容指纹 + 查重跳过 + 关旧开新 ✅
- 实现内容:
computeFixFingerprint(结构化升级集 sha256 前 8 位)、extractFingerprintFromBranch、computeFixAndPrPlan(skip/supersede)、先建新后关旧;测试 +23
T211 清理模式(cleanup-branches)✅
- 实现内容: 独立模式(清单分类 + 交互 y/N 非 TTY 拒绝)、只删
dependfix/前缀且仅 merged/closed、FixAction.type扩展branch-cleanup、action 仅报告清单不删除
T212 分支清理增强(supersede 删旧分支 + cleanup-branches-auto)✅
- 实现内容:
closeSupersededPRs关 PR 后回收 head 分支、--cleanup-branches-auto非交互自动删除(dry-run 仅列)、双 flag 并存跳过报告清单
T213 依赖分组升级(Dependency Grouping)✅
- 交付物:
packages/cli/src/grouping/index.ts(原 fix-grouping.ts)+ app 组级循环 + CLI 参数 + 设计稿 - 实现内容: dependabot.yml groups 解析 + @types 归并/孤儿检测 + scope/前缀启发式 + 显式分组
--upgrade-groups;组级验证 → 整组回滚 → 拆组兜底;buildUpgradeGroups/parseDependabotGroups;测试 +43(33 分组 + 6 app 集成 + 4 config);两轮 Review Gate APPROVE
M2 完成判定(全部通过)
- [x]
action.yml可通过uses: dependfix/dependfix@v1被其他仓库引用 - [x] Action 在消费者仓库上下文中运行(
github.repository= 消费者) - [x] 定时运行自动产出报告 artifact + workflow summary
- [x]
fix-and-pr模式下能在目标仓库创建可审查的 PR - [x] 工作流参数与本地 CLI 保持一致
- [x] T205 / T206 骨架设计完成(AI 引擎联调延后到 M5)
- [x]
pnpm typecheck+pnpm lint+pnpm test全部通过
M2 阶段治理记录(2026-08-04 ~ 2026-08-05)
G2 处置记录(GITHUB_TOKEN 无法访问 Dependabot alerts)
- G2 处置闭环: T-G2-1 fetch 401/403 硬失败(a9e61b8)→ T-G2-2 Code Scanning 探针验证(GITHUB_TOKEN 可访问,HTTP 200)→ T-G2-3 双 token 方案(alertsToken +
dependabot-alerts-tokeninput)→ T-G2-4 pnpm audit fallback(--alerts-source pnpm-audit,d9fef68)→ T-G2-5 规划文档闭环(b6d04ad) - G3 处理: 同包收敛 + 不降级保护 + 逐包验证回滚(9de0fad)→ T213 分组升级(b962374)→ manifest 归属防护(640fe8c 修复跨 manifest 降级 + pnpm v11 lockfile 解析)→ P0 误伤修正(7b0fbb6,lockfile manifest 的间接依赖回归修复)
- 运行复盘: run 30929090403(vite 降级 + lockfile 解析失效)与 run 30933266831(P0 误伤全 skip)两轮复盘修复
- 质量治理: 代码质量 Q1-Q3(eslint 升级、max-lines 约束、严格化规则)、目录结构收敛(bb24ef0)、覆盖率统计 + Codecov 上报(1d76c24)
- 遗留观察点: G1(PIN_TOOLCHAIN stub,承接 M3 T305)、G3 报告统计口径(alertsConverged)、major overrides 确认机制评估(暂不实现)
M3: Code Scanning 扩展(已归档)
归档日期: 2026-08-06 阶段摘要: 参见 roadmap.md §M3 状态: 已完成(含 M3 收尾修复批次 + 反馈修复) 最终提交:
a82f6580feat: PR body 新增 ✅ Fixed Alerts 告警级明细(用户反馈 PR #27)
阶段成果: Code Scanning alerts 与 Dependabot 并行采集(--code-scanning / DEPENDFIX_CODE_SCANNING / action code-scanning input),A/B/C 三级规则分层(自动修复 / 建议修复 / 仅报告),eol-last 自动修复闭环,无法自动修复问题输出报告 + PR body 建议区块,G1 工具链固定(PIN_TOOLCHAIN + corepack + 漂移检测)。574 tests。
T301 接入 Code Scanning Alerts 拉取 ✅
- 交付物:
packages/cli/src/github/code-scanning-fetcher.ts - 实现内容: octokit.paginate 分页拉取 open 告警;标准模型(
source: 'code-scanning'、ruleId、mapCodeScanningSeverity安全级别优先);默认不可自动修复(fixable: false,由 T303 规则模板按规则启用);与 Dependabot 并行展示 - 验收: report-only / fix 模式并行展示互不覆盖;拉取失败(401/403)硬失败 + hint
- 演进项: per-source 错误隔离(warn + 弃该源,暂缓);fix 模式 code-scanning 告警统计口径与 G3 alertsConverged 一并处理
T302 规则分层与白名单机制 ✅
- 交付物:
packages/cli/src/code-scanning/rule-classifier.ts - 实现内容: A/B/C 三级规则分层;A 类白名单(eol-last);B 类建议列表(CodeQL js/py/java 安全类 + no-unused-vars);C 类仅报告兜底;分类结果报告 §4 Class 列可见
- 历史决策: no-unused-vars 因删除变量副作用归 B(Review Gate 认可);no-trailing-spaces 模板字符串词法歧义 3 轮评审移除(M4+ 词法扫描后恢复);jsdoc/check-alignment 模板未实现
- 演进项: B 类覆盖真实仓库样本核对(规则 id 格式与变体分布);规则分类配置化(M4+ 扩展点)
T303 实现可模板化规则修复器 ✅
- 交付物:
packages/cli/src/fixers/code-scanning/首批修复模板(替换 M0 stub) - 实现内容: eol-last 模板;
FixAction.type扩展'code-scanning-fix'(noOp 三态语义);复用 verification-runner;失败回退建议模式(不静默、可审计) - 验收: eol-last 自动修复闭环(修复 → quickVerify → 报告/PR)
- 遗留: app 层非 dry-run 验证/回滚缺 e2e(组件单测兜底);多 cs 告警逐告警全项目 lint 性能观察项;报告 Fix Actions 表 noOp 动作显示 ✅ 图标(观感,error 文本可审计)
T304 实现建议型输出 ✅
- 交付物: 报告 §Code Scanning Suggestions 区块 + PR body 区块
- 实现内容: 规则 ID / 位置(文件:行)/ 摘要 / 建议方向(fetcher 注入 suggestionFor);未修复原因区分(B/C 类 / noOp / 修复失败,reason 优先级链)
- 遗留: summary 字段已收集未渲染;endLine 死字段(供后续多行范围展示,报告字段清理候选);大仓库建议区块行数可能使 PR body 接近 64KB 上限
T305 工具链固定(G1 承接)✅
- 交付物:
packages/cli/src/fixers/pnpm/index.ts的 PIN_TOOLCHAIN 策略接线 + config 输入 - 实现内容:
toolchainPnpmVersion(CLI/env,缺省 packageManager 解析,semver 白名单防注入——Review Gate P1);corepack pnpm@<version> install --lockfile-only(corepack 失败 → 裸命令 → REGENERATE 兜底);lockfileVersion 前后对比漂移标注;测试 +12 - 遗留: verifyFrozenLockfile 仍用裸 pnpm 验证(可能架空 PIN_TOOLCHAIN);漂移检测为相对对比弱代理
M3 完成判定(全部通过)
- [x] report-only / fix 模式并行展示 Dependabot + Code Scanning 告警(Rule/Advisory 列语义化)
- [x] A/B/C 三层规则分类落地:自动修复 / 建议修复 / 仅报告
- [x] 至少一类 Code Scanning 问题自动修复闭环(eol-last)
- [x] 无法自动修复的问题不静默丢失(报告 + PR body 建议区块)
- [x] G1 工具链固定落地(PIN_TOOLCHAIN + corepack + 漂移检测)
- [x]
pnpm typecheck+pnpm lint+pnpm test全部通过;Review Gate 放行
M3 阶段治理记录(2026-08-05 ~ 2026-08-06)
- 主交付: T301~T305 五轮提交(7b8feb3 / 5b3e076 / aebf258+a7fa3a0 / dead17e / 486fea7),每任务独立 Review Gate(T303 经历 4 轮、T305 经历 2 轮),最终全量审查 APPROVE;配套 ed6c7737(action code-scanning input 接线)
- 收尾修复批次(e1aad1e + c20218e,用户确认批次): PR 标题动态生成(cs-only 不再误标 "N upgrades")、partition 限定依赖源告警(cs 噪音)、'unknown' 严重级 cs 源透传、report-only 措辞按模式区分、maxAlertsPerRepository 截断进报告、app/index.ts 行数拆分(helpers.ts + branch-cleanup.ts)
- 环境变量前缀迁移(38722c5,方案 B):
AUTO_FIX_GITHUB_SECURITY_→DEPENDFIX_(15 变量 16 处读取),config 抽取 ENV_PREFIX + readEnv 防再漏 - 多版本共存分别 overrides(89d8c508,run 31021398673 复盘): readLockfileVersions 多实例读取、applyVersionedOverrides 批量写 + 回滚、partition 根/lockfile 多版本路由、
__fixtures__/lockfile-drift/死资产删除;测试 +17 - 版本化 overrides 大版本 key(06843b9d,run 31028234123 复盘): 按 major 分组取各线最高推荐(
vite@5: ^5.4.21)、存在脆弱实例门槛(替代 hasMultipleMajorVersions)、18 条 Skipped 全转可修复 - 反馈修复(a82f6580,PR #27 用户反馈): PR body 新增 ✅ Fixed Alerts 告警级明细;buildFixedKeys 单一事实源(依赖升级包级 repo/pkg 匹配——同包多 GHSA + 多目标 toVersion 不漏列;CS 实例级 + noOp 排除);测试 +4
- 治理基建: Session Wisdom 蒸馏机制(062ce9ef)+ 首次蒸馏(e6827785)+ 压缩抽象与日期命名规范(3b1bf7f8)+ momei http 引用(6690ed02)
- 遗留登记(转入 backlog): pnpm 11 不读 package.json#pnpm.overrides 假成功风险、verifyFrozenLockfile 裸 pnpm、漂移检测弱代理、resolveWithinWorkDir 符号链接逃逸、PR body 64KB 上限、app/helpers ↔ cli/helpers 循环依赖、G3 统计口径与覆盖盲区观察点
M4: 多仓库治理增强(已归档)
归档日期: 2026-08-06 阶段摘要: 参见 roadmap.md §M4 状态: 已完成(含收尾批次 + 增强候选) 最终提交:
cf12e381(增强候选 C2+C6+C7 批次)
阶段成果: owner 级仓库自动发现 + 并发控制与失败隔离 + 名单策略 + 报告归档与趋势统计。650 tests。
T401 实现 owner 级仓库自动发现 ✅
- 交付物:
packages/cli/src/github/repository-discovery.ts - 实现内容: owner/org 分页拉取(octokit.paginate)+ archived/fork 剔除 + topic 过滤(AND)+ dependabot.yml 存在性探测(仅候选仓库,404 视为不支持)+ 显式列表合并去重(显式优先)+ 排序确定性(runId/指纹稳定)
- 验收: 同输入多次运行结果一致;探测请求数量受控
- Review Gate: PASS(P2 测试缺口当场补齐:config 校验 5 例 + app 接线 2 例)
- 非目标: 全量内容扫描判断技术栈(登记 backlog C17)
T402 并发控制与失败隔离 ✅
- 交付物:
packages/cli/src/multirepo/scheduler.ts - 实现内容:
--max-concurrency/DEPENDFIX_MAX_CONCURRENCY(1-16 默认 1,>1 警告;fix/fix-and-pr 因共享 workDir 禁并发)+ 仓库级失败隔离(单仓库失败记录 failed 不中断)+ 429/403 限流指数退避重试(octokit hook 统一包装,写请求不重试)+ 聚合 RunResult - 验收: 注入失败仓库不影响其余;并发配置生效;429 退避重试不丢数据
- Review Gate: 首轮 REJECT(P1 并发写共享 workDir 数据竞争 → 修复 maxConcurrency>1 仅 report-only + fail-fast 校验;P2 scheduler 兜底静默吞错 → 补 onError 记录)→ 复审 PASS;残余 R1-R8 处置见 backlog
- 非目标: 跨进程/分布式调度(M7 BullMQ + Redis)
T403 仓库白名单 / 黑名单策略 ✅
- 交付物: discovery 过滤链扩展(include/exclude 合并)
- 实现内容:
--repo-include/--repo-excludeglob(多次传入)+ 优先级语义(显式列表受 exclude 约束、不受 include 影响;发现结果受两者约束;include 与 exclude 冲突时 exclude 胜出)+ topic 黑名单 + 优先级矩阵写入 configuration.md - 验收: 组合矩阵结果确定可预期
- Review Gate: PASS(P2 仅 todo 状态同步;P3 topics 大小写敏感/ReDoS 面登记)
- 非目标: 正则引擎(登记 backlog C18)
T404 报告归档与趋势统计 ✅
- 交付物:
packages/cli/src/report/archiver.ts+ 归档索引 - 实现内容:
dependfix-reports/{YYYY-MM}/{runId}/多仓库各自 md/json + 汇总 json +index.json(runId/时间/仓库/计数/时长)+--history <repo>仓库级历史(repoStats 口径)+ 与 RunSummary 同字段口径 - 验收: 连续 2 次运行 index.json 可查按仓库趋势;现有报告输出与 action artifact 不破坏
- Review Gate: 首轮 REJECT(P1 --history 多仓库输出全局计数 → 改 repoStats 仓库级口径;P2 grouping.test.ts 污染 cwd → reportOutputDir 隔离)→ 复审 PASS
- 非目标: 图表/仪表板(M6 平台);报告保留策略(登记 backlog C19)
M4 完成判定(全部通过)
- [x]
--owner一次拉取多仓库处理清单 - [x] 显式 + 发现 + 名单组合结果可预期
- [x] 多仓库失败隔离 + 并发可控
- [x] 历史归档可查趋势
- [x] typecheck + lint + 650 tests 全部通过;Review Gate 放行
M4 阶段治理记录(2026-08-05 ~ 2026-08-06)
- 主交付: T401-T404 四轮提交(cb801b60 / fedb7200 / 5860fb4d / 2a7fed00),T402/T404 首轮 REJECT 后修复复审 PASS,每任务独立 Review Gate
- Action 接入(7c39db00): owner / repo-* / max-concurrency / max-retries 输入接线;建议每仓库单独配置 action 控制权限范围
- backlog 修复批次(3d19d499 / ac8ce5c7): R1 写请求 429 不重试、R2
--max-backoff-ms可配、R3 Retry-After 解析、R5 topics 大小写归一、R6 glob ReDoS 加固(>200 字符拒绝)、R7 损坏 index 备份重建;P3 五项(小数截断拒绝、merge 大小写去重、repoSlug 碰撞后缀、cleanup-branches 空归档跳过、cleanup-branches maxConcurrency fail-fast) - 全 ESM(965e68f3): 两包单格式 esm(R4 消除),Node 22.12+ 原生 require(ESM) 兜底未来 CJS 消费者
- 增强候选批次: C5+C1(12af197d,resolveWithinWorkDir 符号链接防护 + pnpm 11 overrides 假成功警告)、C10+C11(10927851,lockfile 告警版本关系细化 + workspace 成员直接依赖识别)、C8(67157985,per-source 错误隔离保留待评估)、C2+C6+C7(cf12e381,toolchainPnpmVersion 验证链 + PR body 64KB 截断 + alertsConverged 口径拆分)
- 编号标记清理(3c714cc1): 60 处编号标记清理 + development.md §3 立规(教训 §十六/§十七)
- 遗留登记(转入 backlog): C3/C4/C9/C13-C19 等增强候选
M4.5: 跨线升级显式授权(已归档)
归档日期: 2026-08-07 阶段摘要: 参见 roadmap.md §M4.5 状态: 已完成(含编号标记治理闭环) 最终提交:
528d1aae(编号标记残留清理 + Review Gate 必查项)
阶段成果: --allow-major-upgrade 跨线告警显式授权自动升级(仅 CLI,无 env 通道、Action 结构性禁用)。720 tests。
T405 实现 --allow-major-upgrade 跨线显式授权 ✅
- 交付物:
packages/cli/src/app/index.ts2.0.2 跨线链路 + CLI 参数 - 实现内容: 三态布尔 CLI 参数(无 env 通道;action.yml 不暴露 input → Action 结构性禁用)+ config 直通;跨线分流(仅根直接依赖 + lockfile 单版本进入自动跨线);2.0.2 链路(快照 → upgradeDependency → 升级后实例复核 → 强制完整验证 install+lint+build → 失败 restoreTrackedFiles 回滚);同包多跨线告警按包聚合取最高目标;报告
strategy='major-upgrade'+isMajor=true - 验收: 默认行为与 PR #28 完全一致(跨线 skipped 不误标);开启后仅根直接依赖单版本跨线自动升级;间接依赖/成员独占/多版本共存维持人工;dry-run 不写盘;验证动作入报告
- Review Gate: 首轮 REJECT(P1-1 实例残留误标 + P2-1 同包多告警目标选择 + P2-2 成员独占必然失败 + P2-3 验证证据缺失)→ 全部修复复审 PASS
- 残余风险登记(转入 backlog 跟踪): 理论降级边(跨线升级后仍可能被未来推荐版本降级?)/ 合并告警计数(同包多告警合并后 skipped/fixed 计数口径)/ node_modules 不回滚(回滚仅 manifest + lockfile,node_modules 残留旧包)/ 自定义 commands 时验证链为用户链(verifyCommands 自定义时完整验证语义由用户命令决定)
- 后续治理: 用户指出编号标记问题(与 3c714cc1 同类)→ 528d1aae 清理 10 处残留 + code-auditor 必查项 + code-reviewer checklist(教训 §十五/§十六)
M4.5 完成判定(全部通过)
- [x]
--allow-major-upgrade仅 CLI 可用(Action 结构性禁用) - [x] 开启后仅「根 package.json 直接依赖 + lockfile 单版本」跨线自动升级
- [x] 升级后实例复核 + 强制完整验证,失败/残留回滚计 failed 不误标
- [x] 间接依赖 / 成员独占 / 多版本共存跨线维持人工
- [x] typecheck + lint + 720 tests + build 通过;Review Gate 复审 PASS
M4.6: Monorepo 成员级修复增强(已归档)
归档日期: 2026-08-07 阶段摘要: 参见 roadmap.md §M4.6 状态: 已完成 最终提交:
7fb264e3feat(cli): 支持 workspace 成员级直接依赖自动升级
阶段成果: workspace 成员包直接依赖告警自动升级(成员级修复器 + 三桶化分流 + app 2.0.3 链路 + 报告/指纹 manifest 维度)。755 tests。
方案细化(2026-08-07 落盘,三项用户决策)
- D1 修复器扩展:
UpgradeDependencyParams.manifestDir?(缺省 = 根 manifest 现状回归);install 仍在根 workDir 执行(workspace 解析语义);非 semver 声明 failResult - D2 快照扩展:
snapshotTrackedFiles(workDir, extraPaths?)支持成员 manifest 相对路径 - D3 partition 三桶化:
{ root, member, sub }——member 准入 = 成员白名单 + 成员直接声明 + fixable + lockfile 单版本 + 推荐>=锁定 + 非跨线 - D4 app 2.0.3 链路: 按「包名 + manifestDir」聚合取最高推荐 → 快照 → 升级 → 实例复核(残留回滚)→ lint-only 验证(用户决策 1)→ 失败回滚
- D5 报告: FixAction 复用
filePath+strategy='member-upgrade'(用户决策 3);多版本共存成员告警维持 sub(用户决策 2)
T406 成员级直接依赖升级修复器 ✅
- 交付物:
packages/cli/src/fixers/dependency/index.ts扩展 - 实现内容:
manifestDir参数(成员 manifest 解析 / 备份 / install 失败回滚成员 manifest + lockfile);isNonSemverDeclaration协议防护(workspace/catalog/link/file/npm/github/gitlab/bitbucket/gist/git+ssh/git+https/git+http/git+file/git/http/ssh/portal/patch 等,全集见源码正则);fromVersion/toVersion保留成员声明前缀 - 验收: 根直接依赖行为零变化;成员升级成功 / install 失败回滚 / 非 semver failResult(不写盘、不触发 install)
T407 成员告警分流与 app 接线 ✅
- 交付物: partition 三桶化 + 快照扩展 + app 2.0.3 链路 + 报告渲染
- 实现内容:
snapshotTrackedFiles(extraPaths);partitionSubmanifestAlerts返回{ root, member, sub }(member 桶准入见 D3);app 2.0.3(聚合 / dry-run / 快照 / 实例复核 / lint-only / 回滚,残留回滚日志含"其他成员 pin / 根 override"归因);markdown actionDetails filePath 展示 + PR bodymember upgrade策略与成员路径列 +computeFixFingerprint纳入 manifest 维度(防根/成员升级指纹碰撞) - 验收: 成员直接依赖安全场景自动升级且报告可见成员路径;降级风险 / 无版本信息 / 多版本共存 / 跨线维持人工;失败 / 残留回滚计 failed 不误标 fixed/converged
M4.6 完成判定(全部通过)
- [x] T406/T407 交付并通过 Review Gate(三审 PASS)
- [x] typecheck + lint + 755 tests + build 通过
- [x] 根直接依赖行为回归无损
- [x] 方案细化三项决策已确认落盘
M4.6 阶段治理记录(2026-08-07)
- 提交: 立项(2607b665)+ 方案细化(c19bf091)+ 实现(7fb264e3)
- Review Gate 三审: 首轮 REJECT(P1-1 协议正则漏 git+ssh 等 / P2-1 PR 聚合丢成员路径 / P2-2 同包多成员 pin 复核互斥 / P2-3 todo 状态未同步)→ 修复复审 PASS(新增 P2-1 指纹未含 filePath / P2-2 正则漏 gitlab 变体)→ 修复终审 PASS
- 经验沉淀: 归档 §十八(防护正则按全集核对 + 同类扫描)/ §十九(维度字段传播检查)/ §二十(断言精确到链路身份)/ §二十一(脚本化编辑验证文件内容)+ code-reviewer checklist 新增「协议/枚举全集核对」「维度字段传播检查」两小节
- 残余风险: 成员验证 lint-only(演进项:成员独立 lint 脚本);明细表 action 查找粒度;同包多成员精确 pin 场景需人工介入;
latest/*等 range 的^归约行为未纳入防护 - 遗留登记: 无阻塞项,M5 可启动
M5: AI Breaking Change 研判(已归档)
归档日期: 2026-08-07 阶段摘要: 参见 roadmap.md §M5 状态: 已完成 最终提交:
61929613fix(action): ai-api-key description 去除 secrets 表达式示例(CI 链式修复收口)
阶段成果: AI 对依赖升级 breaking change 的自动研判闭环——Changelog 双源采集 → 多 provider 研判 → 结构化 patch 应用 → 安全门 + 完整验证 → app 触发接线 + 报告 aiUsage 聚合。903 tests(38 files)。
规划决策(2026-08-07 已确认,用户确认内容)
- D1 AI 提供商: OpenAI 兼容端点优先 + Anthropic 双 provider(fetch 封装无 SDK;DeepSeek 等走
--ai-base-url;anthropic 模式支持--ai-api-url自定义兼容端点) - D2 触发时机: 验证失败 + major 升级触发,
--ai-trigger可配(both / failure / major) - D3 Token 来源与凭据安全: CLI
DEPENDFIX_AI_API_KEYenv(优先)/--ai-api-key(泄露面文档警示);actionai-api-keyinput(composite 不支持secret属性 → 经 env 传递自动打码);apiKey 不落盘 + maskSecrets 脱敏 + action input 声明;M6 T602 统一凭据管理 - D4 成本默认关闭 + token 消耗展示:
--aiopt-in;每次调用记录 usage(input/output tokens),聚合展示(日志每次调用 + 报告 aiUsage 段 + console run 总计 + 内置单价表标注"估算仅供参考")
T501 实现 Changelog / Release Notes 采集 ✅
- 交付物:
packages/cli/src/ai/changelog-fetcher.ts(npm registry packument → GitHub Releases 双源) - 实现内容: packument 解析 repository 字段 → octokit
repos.listReleases取 release body;breaking 段落启发式提取(Breaking changes / ⚠️ / Migration / BREAKING CHANGE);run 内 Map 缓存(单测断言请求次数);双源失败降级 null + 原因(不静默) - 验收: 双源失败降级路径可测试;缓存命中不重复请求
T502 实现 AI 研判引擎 ✅
- 交付物:
packages/cli/src/ai/(provider / prompt / schema / usage / secrets) - 实现内容:
AiProvider接口 +OpenAICompatibleProvider(/chat/completions)+AnthropicProvider(/v1/messages,x-api-key + anthropic-version header)+ factory;system prompt 硬编码(用户内容仅 data 注入,prompt 注入防护);Zod 输出 schema(classification / summary / changes / confidence / rationale),校验失败重试 1 次 → 降级建议模式;usage 聚合 + 单价表成本估算;maskSecrets脱敏(provider 层 + 编排层防御纵深) - 验收: 非法输出可检测不静默;apiKey 不进报告/日志(含响应体回显 key 场景)
T503 实现修复方案生成器 ✅
- 交付物:
packages/cli/src/ai/patch-applier.ts - 实现内容: 结构化 changes 应用(search 精确匹配 + 唯一性校验 → 失败回退建议模式);快照/回滚(snapshotTrackedFiles + 新文件登记);version-lock → override 生成;wait-upstream → 说明文档
- 验收: patch 应用成功/失败/冲突(search 不唯一)矩阵可测;失败可审计回退;默认不自动合并
- 承接登记: PR 提交由 app 集成(T506)承接
T504 AI 输出安全校验与质量门 ✅
- 交付物:
packages/cli/src/ai/safety-gate.ts - 实现内容: patch 范围限制(≤5 文件,超限拒绝可审计);路径穿越(resolveWithinWorkDir)/ 命令注入(结构化数据不执行 shell,检查危险模式)/ 敏感信息泄露(sk- / ghp_ / private key 模式)检查;完整验证链(install+lint+build,对齐 T405 跨线语义)
- 验收: 恶意/异常 patch 样本拒绝矩阵(安全单测);失败回滚 + 记录原因回退建议模式
- 承接登记: 质量门动态验证接线由 app 集成(T506)承接
T505 CLI 解耦重构(平台化前置)✅
- 交付物:
packages/cli/src/app/pipeline.ts(createPipeline(deps)抽象) - 实现内容: runCli() 中 process.env / console.log 紧耦合抽离为可注入依赖(logger / config resolver / io);local 与 platform 模式共用同一编排核心;C13 循环依赖(app/helpers ↔ cli/helpers)解环
- 验收: 本地 CLI 行为不变(全量回归);platform 模式可注入不同 logger / config resolver 复用编排逻辑
T506 AI 链路 app 接线(收口 M5)✅
- 交付物: config 接线 + app 触发接入 + 报告展示 + action 输入
- 实现内容: config(--ai / --ai-provider / --ai-model 默认 deepseek-v4-flash / --ai-base-url 默认 https://api.deepseek.com / --ai-api-key / --ai-trigger / --ai-api-url;开启时 apiKey 缺失 → CONFIG_VALIDATION_ERROR 清晰报错);app 2.0.2 触发接入(验证失败带 failureLog / major 预防性;ai-patch 成功 → majorOk 升级保留;dry-run 不触发不产生费用);
runAiIntegration分流闭环(code-change → safety-gate → applyChanges → 完整验证 → 回滚;version-lock / wait-upstream / 降级 → 建议 noOp);计数语义(ai 辅助动作不计 fixed/failed,主动作代表;指纹排除 noOp 防漂移);报告 aiUsage 聚合段(RunResult.aiUsage / Markdown AI Usage 节 / JSON / console run 总计);action.yml ai 系列 inputs + DEPENDFIX_AI_* env(api-key 经 env 传递自动打码) - 验收: --ai 开启 + apiKey 配置后自动触发研判并产出可审计结果;code-change 通过质量门才提交;未开启 --ai 行为与现状完全一致(回归);dry-run 不触发
M5 完成判定(全部通过)
- [x] T501-T506 交付并通过 Review Gate(每任务独立审计,T503 三审 / 其余 PASS + 复审)
- [x] 4 项规划决策已确认落盘(2026-08-07)
- [x]
pnpm typecheck+pnpm lint+ 全量测试(903/903)+pnpm build通过 - [x] 本地 CLI 模式行为回归无损(T505 全量回归 + T506 回归断言)
M5 阶段治理记录(2026-08-07)
- 提交序列: T501(21c07b67)→ T502(3475e6e5)→ T503(f9affe5f)→ T504(31997adc)→ T505(e30f2a3e)→ flaky 修复(451cdcc5)→ T506 主实现(7509e3e2)+ 测试补充(9f62a34f)+ 状态回链(1db75efc)→ aiUsage 聚合段(a7530299)→ roadmap 锚点修复(ae93bd2a)→ action.yml manifest 修复(61929613)→ 经验沉淀 docs(governance)(a4dfd884)
- Review Gate: T501-T506 每任务独立审计 PASS;T503 三审(首轮 REJECT 写盘回滚/schema 契约/todo 状态 → 二轮 REJECT 编号标记 → 终审 PASS);T506 复审 PASS(F1 指纹口径 / F2 场景 C exit 语义 / F3 todo 标注);aiUsage 聚合段独立审查 PASS
- CI 链式修复(剥洋葱): ① lint:md:check 穿透 node_modules(.lintmdrc 显式空排除覆盖工具默认)→ 修复;② check:links roadmap 锚点指向已归档标题 → 修复(改指 todo-archive);③ Security Scan dogfood workflow 暴露 action.yml description 内嵌
${{ secrets.DEEPSEEK_API_KEY }}manifest 模板校验失败 → 修复。教训沉淀归档 §二十二 / §二十三 - 经验沉淀: 归档 §二十二(CI 链式暴露 + 本地不可测陷阱)/ §二十三(行尾方向检测 + 特殊字符脚本写临时文件);规范 ai-collaboration 4.2(剥洋葱)/ 4.3(本地不可测配置纪律)/ 1.2-6(行尾 + 脚本纪律)、documentation 链接检查(归档锚点联动)
- 残余风险: AI 调用失败路径的 token 计费盲区(provider 响应无 usage);本地无法完全模拟 CI 环境(依赖 CI 端到端裁决,推送后复跑);10 个 lint warning 存量临界(max-warnings 顶格)
- 遗留登记: 报告 aiUsage 聚合段已交付;PR body 展示 AI 消耗登记 M6 增强候选;无阻塞项,M5.5 可启动
M5.5: Skill 编排(CLI 先行)(已归档)
归档日期: 2026-08-07 阶段摘要: 参见 roadmap.md §M5.5 状态: 已完成 最终提交:
ba5be12brefactor(skills): @dependfix/skills 包精简与同步脚本仓库化
阶段成果: 产品 skill(dependfix-remediator)权威源与 CLI 编排(T506)、npx skills 生态主通道 + 自研兜底安装器(T507)、MCP 双后端扩展点(T508);@dependfix/skills 纳入发布与 CHANGELOG 体系。929 tests(38 files)。
编号说明:M5.5 T506-T508 与已归档 M5 的 T506 编号重叠,归档后仍以"阶段 + 编号"全称(如 M5.5 T506)区分。
规划决策(2026-08-07 用户确认)
- D1 CLI 先行、MCP 为增强后端: CLI 能力面(report/fix/fix-and-pr/cleanup-branches + 多仓库 + 双源 + PR 链路)已覆盖 MCP 规划的 4 个 tool(fetch_alerts / run_scan / fix_dependency / get_last_report);skill 编排不依赖 MCP,MCP Server 本体随 M6 T605/T606 交付
- D2 生态主通道:
npx skills(vercel-labs/skills)为主安装通道(发布 = git push 仓库根skills/目录);自研dependfix skills install仅离线兜底 - D3 内部 skill 防发现: 10 个内部开发 skill 以
metadata.internal: true标记(.github/skills 权威源),不进入生态正常发现(实测矩阵:正常 1 个产品 skill /INSTALL_INTERNAL_SKILLS=111 个)
T506 产品 Skill 权威源与 CLI 编排 ✅
- 交付物:
packages/skills/dependfix-remediator/(SKILL.md + REFERENCES.md)+ 仓库根skills/分发目录(npx skills 生态发现) - 实现内容: SKILL.md(frontmatter
name/description+ 编排步骤 + 决策树);执行后端 = CLI 命令映射表(report →dependfix report-only;fix →dependfix fix/fix-and-pr;告警查询 →--history/ 归档);能力契约解耦预留 MCP tool 映射位;skill 放置规范落盘(skill-distribution.md:packages/skills 权威源 / 根 skills/ 生态分发 / .github/skills 内部开发,职责分离) - 验收: 本机冒烟通过(npx skills 生态发现 + 安装到 opencode 全局目录);SKILL.md 无 MCP 依赖
- Review Gate: 两轮闭环 PASS
T507 npx skills 生态接入 + 自研兜底安装器 ✅
- 交付物: npx skills 主通道 +
dependfix skills install(兜底)/ doctor + README 安装指引 - 实现内容: 主通道本地源实证(
npx skills add <source> -s dependfix-remediator -g发现 + copied 安装,发布 = git push);内部 skill 防发现(10 个 metadata.internal: true,可见性矩阵 1/11 实测);兜底安装器(agent 目录约定检测 → 复制产品 skill → 安装清单;非 TTY 默认拒绝覆盖,--force 强制;幂等可重跑);doctor(目录约定漂移 + 安装状态/内容一致性 + internal 标记完整性检查) - 验收: 兜底本机 3 agent 实测 installed/up-to-date + doctor 0 error;主通道与兜底均幂等可重跑
- Review Gate: 首轮 PASS + 复审
- 已知边界: GitHub 源端到端(
npx skills add dependfix/dependfix)待推送后 CI 复验(本机 clone github.com 网络受限)
T508 MCP 双后端扩展点(衔接 T606/T706)✅
- 交付物: SKILL.md MCP 探测与双后端指引 + REFERENCES.md 一致性断言清单
- 实现内容: 执行后端探测步骤(Claude Code
claude mcp list/.mcp.json,OpenCode mcp 字段 → MCP tool 优先 / CLI 回退 / MCP 调用失败降级 CLI);能力契约映射表补齐 MCP tool 列(fetch_alerts / run_scan / fix_dependency / get_last_report 入参要点 + CLI 对应);双后端一致性断言清单(以 @dependfix/core RunResult / ArchiveRunEntry 契约为基准,4 条能力逐项断言) - 验收: 探测/决策/降级规则落 SKILL.md;一致性断言清单已定义(MCP Server 交付后按清单验证,当前无法实测属已知边界)
- Review Gate: PASS
M5.5 完成判定(全部通过)
- [x] T506-T508 交付并通过 Review Gate(每任务独立审计:T506 两轮闭环、T507 首轮 PASS+复审、T508 PASS)
- [x] npx skills 主通道 + 兜底安装器双路径验证通过(主通道本地源实证 + 兜底本机 3 agent 实测;GitHub 源端到端待推送后复验)
- [x] 内部开发 skill 生态不可见(可见性矩阵实测:正常 1 个 / INSTALL_INTERNAL_SKILLS=1 11 个)
- [x]
pnpm typecheck+pnpm lint+ 全量测试 +pnpm build通过(串行 929/929;并行 2 个已知 Windows flaky 与本次改动无关) - [x] CLI 现状行为回归无损(主命令 positional 命令面 + --help 实测正常)
M5.5 阶段治理记录(2026-08-07)
- 提交序列: 规划决策(56a91446 + d177e3b3)→ T506(21fae4d4 + da7d4c95)→ T507(6f9e5eea + 480497b9 + ba5be12b)→ T508(1837f21e)→ 完成判定勾选(84809da4)→ 发布体系(24e5c097 + 1c5bc3c1)
- Review Gate: T506 两轮闭环 / T507 首轮 PASS + 复审 / T508 PASS
- 发布体系:
@dependfix/skills纳入发布包清单与 CHANGELOG 体系(24e5c097,release.md 同步);changeset 自动生成脚本(1c5bc3c1,semantic-release 规则从 git log 推导 bump 级别) - 已知边界(归档时点): GitHub 源端到端复验(主通道 + 全链质量门)依赖 CI 端到端裁决(本地网络受限),推送后复跑确认
- 遗留登记: MCP Server 本体(M6 T605/T606);org 增强候选(C22-C24);无阻塞项