用途
revdiff-plan 用于在终端浮层(TUI overlay)中审阅 Codex 最后一条助手消息,例如计划、分析或提案,并通过行内批注(inline annotations)给出反馈。它属于 revdiff 技能体系的一部分,配合 Codex 使用。
主要能力
- 从 Codex 的 rollout 会话文件中提取最近一条助手消息。
- 将提取内容写入临时 Markdown 文件。
- 通过 revdiff 启动脚本以 --only=<tempfile> 打开终端浮层进行审阅。
- 用户在浮层中阅读内容并在指定行添加批注。
- 退出时从标准输出捕获批注,交由 Codex 逐条处理。
- 支持循环:改动后可再次启动 revdiff 验证,并可继续追加批注。
使用方式
激活触发
可使用以下触发词:"revdiff-plan"、"review plan with revdiff"、"annotate plan"、"review last response"、"annotate codex output"。
脚本路径解析
先按仓库根目录解析脚本目录,失败则回退到 Codex home:
SCRIPT_DIR="$(git rev-parse --show-toplevel 2>/dev/null)/plugins/codex/skills/revdiff-plan/scripts" if [ ! -d "$SCRIPT_DIR" ]; then SCRIPT_DIR="${CODEX_HOME:-$HOME/.codex}/skills/revdiff-plan/scripts" fi
启动脚本目录来自 revdiff 技能:
LAUNCHER_DIR="$(git rev-parse --show-toplevel 2>/dev/null)/plugins/codex/skills/revdiff/scripts" if [ ! -d "$LAUNCHER_DIR" ]; then LAUNCHER_DIR="${CODEX_HOME:-$HOME/.codex}/skills/revdiff/scripts" fi
工作流程
- 提取最后一条助手消息:运行提取脚本,带 --skip-current 以避免选到当前会话自身输出:
$SCRIPT_DIR/extract-last-message.sh --skip-current
脚本采用尽力而为的启发式:从 ~/.codex/sessions/ 按修改时间选取第二新的 rollout JSONL 文件,假定最新文件属于当前活动会话;若存在并发的 Codex 会话可能选错文件。若只有一个会话则回退到最新文件。通过 jq 提取最后一条助手消息文本,将原始 Markdown 输出到标准输出。也可传入显式 rollout 文件路径以绕过自动检测。若脚本失败(无会话、无消息),告知用户并停止。若用户反馈提取内容有误,可要求其显式提供 rollout 文件路径:$SCRIPT_DIR/extract-last-message.sh /path/to/rollout.jsonl
随后把输出写入临时文件:
TMPBASE="${TMPDIR:-/tmp}" PLAN_FILE=$(mktemp "$TMPBASE/revdiff-plan-XXXXXX") mv "$PLAN_FILE" "${PLAN_FILE}.md" PLAN_FILE="${PLAN_FILE}.md" $SCRIPT_DIR/extract-last-message.sh --skip-current > "$PLAN_FILE"
- 启动审阅:运行启动脚本并传入 --only=<tempfile>:
$LAUNCHER_DIR/launch-revdiff.sh --only="$PLAN_FILE"
启动脚本会设置 REVDIFF_EXIT_CODE_ON_ANNOTATIONS;退出码 10 表示已捕获批注,并非启动失败,其他非零状态视为失败。注意这是长时间运行的命令:启动脚本会阻塞直到用户在 TUI 浮层完成审阅,应将 bash 超时设为允许的最大值(如 1800000 或更高),不要使用 run_in_background。若 bash 工具报告超时,告知用户“bash 工具超时,但 revdiff 可能仍然打开,完成后请告诉我”,等待用户回复,然后读取最近输出文件:
output_file="$(ls -t "${TMPDIR:-/tmp}"/revdiff-output-* 2>/dev/null | head -1)" if [ -n "$output_file" ] && [ -f "$output_file" ]; then cat "$output_file" fi
- 处理批注:若 bash 工具报告退出码 10,读取标准输出并按批注处理,不要视为失败。若启动脚本产生输出,说明用户添加了批注,输出格式如:
plan-XXXXXX.md:12 ( )
this section needs more detail about error handling
plan-XXXXXX.md:25 ( )
explain why we chose this approach over alternatives
每个批注块包含 ## filename:line (type) 指明文件与行号,下方注释文本说明用户想要修改或澄清的内容。
3.5 分类批注:分为两类。解释请求——批注匹配任一规则(不区分大小写):文本中任意位置包含两个或更多连续问号(??、??? 等),或以下列词开头:explain、remind、describe、what is、what are、how does、how do、clarify。这些是用户想得到回答的问题,而非计划改动。计划改动指令——其余全部,属于修改计划内容的指示。若存在解释请求:直接回答每个解释请求;若同时有改动指令,记下为待处理;进入解释循环:a. 将解释写入临时 Markdown 文件;b. 通过启动脚本以 --only=<explanation-file> 启动 revdiff;c. 若用户在无批注情况下退出——解释被接受,继续处理待办指令或进入第 5 步;d. 若用户批注——细化解释,回到 (b)。若无解释请求,直接进入第 4 步。
-
处理批注:对计划改动指令,按请求更新临时计划文件,重写 $PLAN_FILE。
-
循环:处理完批注后,用更新后的计划重新启动 revdiff:
$LAUNCHER_DIR/launch-revdiff.sh --only="$PLAN_FILE"
用户可追加批注(回到第 3 步)或无批注退出(审阅完成)。
- 完成:当启动脚本无输出时审阅完成。清理临时文件:
rm -f "$PLAN_FILE"
通知用户计划审阅完成;若审阅过程中计划被修改,呈现最终版本。
适用场景
- 需要审阅 Codex 生成的计划、分析或提案。
- 希望在终端以行内批注方式逐条给出反馈。
- 需要迭代式精化计划内容,并在改动后再次核对。
限制
- 提取逻辑为尽力而为的启发式:假设最新 rollout 文件属于当前活动会话,存在并发 Codex 会话时可能选错文件;需精确时应显式传入 rollout 文件路径。
- 依赖 repo 根目录或 Codex home 下的特定脚本路径。
- 启动脚本为长时间运行命令,需设置足够大的超时且不能后台运行。
- 退出码 10 表示捕获到批注而非失败,其他非零状态视为失败。
- 其他收费、价格、平台或效果信息暂未提供。