--- name: release-easydict description: 编排 Easydict macOS 的 draft、publish、release 和 resume,整理英文 GitHub Release 内容,并处理发布后的 Issue 跟进及本地清理。不用于一般的发布流程设计讨论。 --- # 发布 Easydict 使用仓库脚本发布 Easydict,并整理英文 GitHub Release 内容、跟进关联 Issue。 ## 动作路由 Release 生命周期: - `draft `:创建或恢复经过验证的 Draft,整理英文 changelog,并将重点功能写成 changelog 首标题;GitHub Release 标题只使用版本号,然后停止。 - `draft --replace-draft`:从已同步并提交的本地 `dev` 安全重建最新且匹配的 未发布 Draft。 - `publish `:整理已有且经过验证的 Draft,发布并验证,然后运行内部 Issue 跟进的 `apply` 行为。 - `release `:依次执行本 skill 的 `draft` 和 `publish` 行为。 - `resume `:使用现有 skill 和 asc 状态,只继续未完成的 Release 生命周期阶段。 已发布版本的日志修订: - `sync-notes `:读取人工修改后的 `changelog/.md`,预览并(仅在显式 `--execute` 时)同步已发布 GitHub Release 正文、远程 `main`/`dev` 的 appcast 以及 本地分支。该动作不重建产物、不改 Tag/附件/版本号,也不替代 `resume`。 - `sync-notes` 默认只预览;执行时要求目标 Release 已发布、工作树干净,并使用 Release ETag、两个分支 head 和 Git push lease 做乐观并发校验。失败后可用同一命令重试,已 一致的目标会跳过写入。 执行这些动作时读取 [Release 生命周期](references/release-workflow.md)。`release` 始终表示 由本 Skill 编排 `draft` 和 `publish`,不直接调用仓库脚本的一次性 `release` 动作。 `resume` 只恢复 ASC 发布工作流;它不会把新的 changelog 自动传播到已发布 Release。 发布后的 Issue 跟进: - `issue-followup plan ` - `issue-followup apply ` - `issue-followup resume ` - `cleanup `:预览已完成版本的本地清理;`--execute` 才删除。 执行这些动作时阅读 [references/issue-followup.md](references/issue-followup.md) 和 [references/issue-followup-policy.md](references/issue-followup-policy.md)。 `issue-followup resume` 恢复 Issue 跟进;`resume` 恢复 Release 生命周期。 ## 授权边界 - 普通规划、解释、检查或“先给方案”请求保持只读,不因文中提到命令就运行它。 - 用户明确要求运行具体版本的 `issue-followup plan` 时,该命令会查询 GitHub 并写入 `.tmp/release//state/issue-followup/` 下被忽略的本地状态,不评论或关闭 Issue。 这属于获准的本地准备动作,不等于无副作用的 planning。用户禁止写文件时仅查询和 分析,不运行该命令;必要时说明缺少可持久化的计划状态。 - 只有当用户针对具体版本或运行明确请求 `draft`、`publish`、`release`、Release `resume`、`sync-notes --execute`、`issue-followup apply` 或 `issue-followup resume` 时,才执行远程修改。`sync-notes` 不带 `--execute` 始终保持 preview。 - 用户明确请求 `publish` 或 `release` 后,同一版本通过远程发布验证时,也同时授权其 内部 `issue-followup apply` 阶段。翻译、重点内容、评论或关闭已解决 Issue 不再另行 请求确认。 - Draft 通过隔离 worktree 发布已提交的本地 `dev`,先冻结 appcast 提交,再只推送指向 appcast 提交的临时 `release/sync-` 和指向版本提交的版本 Tag,不修改本地或远程 `dev`、`main`。 - Publish 使用隔离 worktree 先完成 merge 预检。当前 checkout 位于其他分支时保持 不变;当前 checkout 就是干净的 `dev` 时,发布提交验证后允许 fast-forward 更新。 不覆盖未提交修改,也不 rebase 已发布提交。 - GitHub Release 公开后,先验证 API 中唯一且已上传的 ZIP、DMG、checksum 的大小、类型和 SHA-256 digest,再验证匿名下载端点的状态、长度、类型、ZIP/DMG Range 和 checksum 内容; 这些检查通过前不得推进公开 appcast 所在的远程引用。 ## 默认值与完成条件 - 除非用户明确要求 `stable`,默认使用 `beta` channel,所有底层命令沿用同一 channel。 - `draft` 只有在 Draft、Tag、临时发布分支、changelog 和正文哈希全部验证后才完成;随后 停止,不发布也不处理 Issue。 - `publish` 和 `release` 只有在 Release 公开资产、完整目标 appcast 条目、Git 引用和 Issue 跟进都得到最终核验后才完成;Issue 阶段失败时不回滚已经发布的 Release 或已完成动作, 而是报告可恢复状态。 - 记录 Release URL、run ID 和 Issue 汇总后,执行 `cleanup ` 预览,再运行 `cleanup --execute`。`issue-followup resume` 最终成功时也执行相同步骤。 清理仅在成功的 Publish/Release 运行和已执行的 Issue 计划同时存在时允许;失败时 报告“发布成功,本地清理未完成”及可重试的 `cleanup` 命令,不重做远程发布或 Issue 动作。 - `resume` 只恢复现有运行的未完成阶段,不启动新的替换或发布。 - 最终报告 Release URL、标题、channel、notes 路径、Issue 摘要、底层 run ID 和本地清理 结果;未完成时给出可恢复状态路径及准确阶段。