用途
issue-harvester 用于建立并维护一份详尽的 Slate/Plate issue 关闭台账(closure ledger),覆盖包括早于 AI 生成测试的已关闭 issue。它把一句简短调用展开为逐 issue 的完整处理循环,用户无需重复粘贴冗长的台账提示词。
适用对象包括 Slate/Plate issue 历史,以及 Lexical、ProseMirror、CodeMirror、Tiptap、Monaco、Quill 等外部编辑器项目的 issue 历史;默认处理全部状态(--state all),也支持续跑已有台账,以及仅为未勾选的相关 issue 补充缺失的本地测试。
主要能力
- 台账自动发现:由 owner/repo、路径或台账路径推导 repo_key,产物默认位于 docs/editor-issue-harvester/<repo_key>/full/ 与 .tmp/editor-issue-harvester/<repo_key>/raw/。docs 目录是可续跑/勾选的工作区,只存紧凑的 TSV/Markdown/JSON 状态,不存放原始 issue 正文与评论;.tmp 仅作原始缓存。
- 刷新命令:优先使用 gitcrawl 获取存档输入(doctor、status、sync、search issues 等),不可用时回退到 gh search issues、本地存档或既有 scratch issues,并记录回退方式、状态覆盖、上限与新鲜度;采样或设上限的语料不得称为完整。
- --refresh-only:仅刷新当前 issue 清单而不进入逐 issue 循环,保留已勾选/人工决策,新增 issue 记为未勾选,标记有实质变化的元数据待复查,记录刷新时间、提供方、覆盖范围、上限、新增数、变化数与剩余未勾选数。
- 已关闭 issue 的 PR/测试溯源:检查关联 PR 是否新增测试,查找 Fixes #、Closes #、Resolves # 等引用、PR 改动文件、上游测试名称与现有本地覆盖;外部仓库的 PR diff 与上游测试仅作溯源,只借用行为不复制代码。
- 逐 issue 循环:按 issue 编号升序处理,读取标题、正文、评论、标签、状态与台账行,判定跳过或相关,分类 owner(slate、plate、external-framework、docs-support-release、needs-plan、unknown),查找精确本地覆盖,缺失时按最小回归/契约/浏览器测试原则补写,运行聚焦验证并回写 overrides 与重新生成台账。
- 覆盖搜索:用 rg 搜索具体行为描述、issue 编号或上游测试标签,覆盖须证明同一行为类别而非仅同一功能区域,并链接文件路径与行号、测试名、验证命令及结果。
使用方式
调用形式如 issue-harvester prosemirror 或 issue-harvester facebook/lexical --state all。技能据此展开完整循环。台账行包含 issue_number、state、title、classification、owner、status、reason、linked_prs、upstream_test_provenance、local_coverage、local_test、verification_command、last_checked_at、next_action 等字段;已有台账按表头名解析而非列位置,存在 lexical/prosemirror、prosekit/wordgard、slate 三种表头族。status 取值包括 unchecked、invalid-skip、covered-by-existing-test、test-written、plate-owned-covered、deferred-with-owner、needs-repro、blocked。
适用场景与限制
适用于需要穷尽式 issue 历史覆盖、断点续跑台账、或为已关闭 issue 核实测试溯源的维护工作。限制与约束:不得因外部存在 issue 就直接改运行时,须先有本地失败证明或缺失测试证明契约缺口;仅 Slate 范围运行时不得写 Plate 测试,应标记 deferred-with-owner 并写明所有者与解除条件;生成文件保持生成,人工决策写入 issue-closure-overrides.json,不得在生成台账中新增列。停止条件为:目标下所有相关行已勾选、出现真实阻塞、API/运行时决策归属其他流程,或时间盒到期;不得仅凭集群摘要或前十条就停止。具体生成器脚本如缺失,需以最小可靠方式更新 TSV/MD 并记录该工作流缺口。