用途:hogli ci:preflight 是 hogli ci:insights(查看 master 上已损坏项)的推送前对应工具,将一组精选检查限定到本分支改动的文件,每一项对应一类曾导致 master 挂掉的 CI 失败,并附带始终开启的分支新鲜度检查。pre-push 钩子会自动运行 ci:preflight --strict,检查失败即阻止推送;不要用 --no-verify 绕过,应修复报告的问题。典型做法是先运行 hogli ci:preflight --fix(格式化、lint 并自动修复安全项),再逐行阅读输出:✓ 通过、✗ 失败、⚠ 警告(非阻塞发现)、→ 建议(需自己处理)、· 跳过(缺少能力)。所有 ✗ 必须解决,它们会阻止推送;→ 建议不阻塞但应处理,否则失败会进入 CI,包括并非自己引入的漂移。反复运行至干净后再推送。
主要能力:type-check 只是提示而非执行,因为只有仓库级 mypy 才与 CI 一致,冷启动耗时数分钟,故只给出命令由用户判断是否类型风险高并自行运行。complexity 仅警告,改动文件中圈复杂度超过 10 显示为 ⚠ 且从不阻塞。semgrep-devex 针对本分支引入的发现给出建议,在 15 秒预算内扫描改动文件及其 merge-base 副本,使用 ci-security.yaml 中 SEMGREP_IMAGE 固定的缓存版本并禁用网络;缺少工具时跳过并在后台下载以便下次扫描,云端任务或 CI 不会触发该下载,需在那里带网络运行 hogli ci:preflight --prepare-semgrep;扫描不完整会带原因跳过,master 上已有的发现不报告,CI 会阻塞新发现。snapshot-baselines 在 frontend/snapshots.yml 丢失本分支未改动 story 的条目时给出建议,提示可能是坏的冲突解决,可按打印的 git diff 恢复;同一分支中删除、重命名或改标题的 story 条目可通过。merge-queue-lane 仅警告且 pre-push 钩子会跳过,当少数横切文件使整个 PR 占用全部 merge queue 通道、导致队列串行合并时触发。Staleness 基于风险,在合并 master 会真正破坏内容时触发(文本冲突、双方都新增迁移、双方都改动生成文件输入、master 上 CI 工作流变化),外加落后/时间兜底(默认 5 个提交或 2 天,可通过 HOGLI_PREFLIGHT_STALE_COMMITS/HOGLI_PREFLIGHT_STALE_DAYS 调整),仅建议、从不自动合并。
可选参数:--against <ref> 指定对比基线;--json 输出机器可读摘要。kill switch:HOGLI_PREFLIGHT_DISABLED=1 使命令与钩子成为退出码 0 的空操作,属于发布/应急开关,不得取消它以强制运行。
限制:· skipped(needs …)在裸检出版本或沙箱中属正常,needs stack/needs clickhouse 需要 hogli start 运行开发栈,needs node 需要 pnpm install,needs desktop-node 需要 pnpm --dir products/desktop install,needs agent-node 需要 pnpm --dir packages/agent install(两个嵌套工作区从根安装排除、各有 lockfile),needs python-env 需要 uv sync。环境中无钩子(无 node_modules)时应自行在推送前运行该循环。严格模式只对 ✗ 失败返回非零;干净退出意味着“没有待修复项”而非“CI 一定通过”,CI 仍是权威关卡。