.agents/skills/release-easydict/SKILL.md
Use the existing release scripts as the build, notarization, packaging, Git, GitHub Release, appcast, and verification engine. This skill adds content and issue orchestration around those scripts.
draft, publish, release, or resume a concrete version.release action directly. For this skill,
release means draft, content curation, issue decision freeze, then
publish, so the public Release cannot precede curation.dev through isolated worktrees.draft <version>: create or recover the verified Draft, curate its English
body/title, freeze issue decisions, then stop.draft <version> --replace-draft: discard the latest matching unpublished
Draft and its Tag only after rebuilding the same version from synchronized
local dev; curate and freeze only the newly created Draft.publish <version>: curate and freeze an existing verified Draft, publish it,
refresh the frozen issue evidence, and apply verified issue notifications.release <version>: run the draft behavior followed by the publish
behavior.resume <version-or-run-id>: inspect skill state and the asc run state,
continue only the incomplete stage, and preserve idempotency markers.Default to the repository's beta channel unless the user explicitly requests
stable. Carry the same channel through every underlying command.
Read scripts/release/README.md and verify the requested action, version,
channel, current release state, and available .tmp/release/<version>/
state. Keep a record of the underlying asc run ID. Read
references/commands.md before invoking helpers.
For a new Draft, run:
./scripts/release/release-easydict.sh draft <version> [--channel <channel>]
If the Draft already exists, verify it instead of deleting or recreating it.
When the user explicitly requests --replace-draft, run:
./scripts/release/release-easydict.sh draft <version> \
--replace-draft [--channel <channel>]
Do not add this flag implicitly. It is valid only when the existing Release
is the newest GitHub Release entry, remains a Draft on the same channel, has
matching local and remote Tag identity, has matching local release state,
and is absent from the public appcast. Never combine it with
--build-number.
Capture the GitHub-generated body with
.agents/skills/release-easydict/scripts/release_content.py capture.
Create a curated JSON file that translates every change title into concise
English and selects one real PR as the highlight. Do not change PR numbers,
links, authors, contributors, or the changelog range.
Run .agents/skills/release-easydict/scripts/release_content.py render, then
apply the validated title and notes to the Draft with
.agents/skills/release-easydict/scripts/release_content.py apply --execute.
Fetch the Draft again and require an exact title/body match.
Run .agents/skills/release-easydict/scripts/release_issues.py collect to
discover same-repository issue candidates from every PR in the Release
Notes. Read
references/issue-decision-policy.md,
inspect the issue and PR evidence, and write one decision for every
candidate. Validate it with
.agents/skills/release-easydict/scripts/release_issues.py validate and
freeze both files under .tmp/release/<version>/state/.
For draft, report the curated Draft and frozen issue decision summary, then
stop without publishing or touching issues.
For publish or release, run:
./scripts/release/release-easydict.sh publish <version> [--channel <channel>]
Do not continue until this command and its remote verification succeed.
Refresh the live state and comments of only the frozen issue candidates.
Re-evaluate negative evidence and allow decisions only to remain unchanged
or be demoted to skip; never add a new issue after publish.
Validate the refreshed decisions with the frozen pre-publish decisions as
--previous-decisions. Preview
.agents/skills/release-easydict/scripts/release_issues.py apply, inspect the
machine-readable plan, then run it with --execute. Pass the frozen
decisions as --previous-decisions again. It comments once and closes only
open issues whose validated decision is notify_on_release.
Report the Release URL, title, channel, notes path, issue actions, skipped candidates with reasons, underlying run IDs, and any resumable state path.
Keep deterministic orchestration state in .tmp/release/<version>/state/:
release-content-source.json: captured GitHub Draft and exact PR entries.release-content-curated.json: English titles, highlight PR, and Release
title selected from the captured source.release-notes-en.md: validated rendered notes applied to the Draft.issue-candidates.json: frozen pre-publish weak-reference candidates.issue-decisions.json: frozen pre-publish two-gate decisions.issue-candidates-refreshed.json and issue-decisions-refreshed.json: the
post-publish snapshots; the decision file may only demote prior actions.issue-actions.json: per-issue comment and close progress for safe resume.Never overwrite the frozen candidate or decision files during refresh. Reuse
existing matching state on resume; reject mismatched repository, version,
source hash, PR set, or issue set instead of regenerating past a completed
stage.
For --replace-draft, old content and issue files are rollback data only. The
repository workflow temporarily moves the complete old state aside, chooses
max(old Draft build, current project build, public appcast build) + 1, and
rebuilds from synchronized committed local dev. Capture, curate, and freeze
content only after the new Draft is verified. Never copy old curated notes or
issue decisions into the new state. A new replacement request must stop when
an unfinished replacement exists; use the asc run ID with resume instead.
<version> <emoji> <type>: <concise English summary>, normally ✨ feat,
🐞 fix, 🔒 security, 🚀 perf, or 🔧 chore.--replace-draft build or notarization failure leaves the old remote Draft
and Tag untouched. A later transition failure preserves the temporary local
rollback backup and resumes only incomplete markers. After the new Draft is
verified, the workflow deletes that temporary backup automatically.