Announcing framework releases
Skill vemodalen-x/VEMO_SKILLS/skills/governance/announcing-framework-releases
Public reusable skill hub for agent workflows
npx -y skills add vemodalen-x/VEMO_SKILLS --skill announcing-framework-releasesAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Announce a governance framework's formal version release to the team chat as a Feishu (Lark) interactive card — framework name + code, old→new version, change-class summary (Added / Changed / ⚠️ BREAKING) extracted from its CHANGELOG, a one-line consumer-impact verdict (sync now? breaking?), repo + CHANGELOG links, maintainer, plus an optional 🏆 cumulative contribution leaderboard (instance-gated by include_leaderboard, computed from the same hub ledger as announcing-skills). Use after a framework release is tagged and push-verified. Identity-decoupled — group and the maintainer/contributor open_id maps are instance values; repo URL is resolved at runtime from the submodule remote.
SKILL.md
11.2 KB, as published. Nobody here has run it
Announcing Framework Releases
After a governance framework cuts a formal version release (a new version tag, pushed and verified), post a
version-update card to the team chat: which framework, old→new version, a change-class summary pulled from its
CHANGELOG, a one-line consumer-impact verdict, the repo / CHANGELOG links + maintainer, and — when the instance
opts in — an optional 🏆 cumulative contribution leaderboard. This is a governance-meta skill — it operates on
the framework ecosystem, alongside syncing-frameworks / announcing-skills / publishing-skills.
Boundary vs announcing-skills: announcing-skills celebrates skill-hub 上新 (新 skill); this skill
announces a framework version update (framework / version / change-class / consumer-impact). Different trigger,
data, and core payload. Both carry the same optional 🏆 leaderboard — a per-user ruling (2026-06-11): a
contribution shows up wherever it is announced, so the leaderboard rides both cards, computed from the one hub
ledger (contributors.yaml) and gated by the instance toggle. PR-sourced contributions count only once their PR is
merged (user ruling 2026-06-11); unmerged PRs are excluded from the ledger and the leaderboard. (This reverses the skill's original "no leaderboard"
design; see the CHANGELOG.) The leaderboard block is identical in shape to announcing-skills' — see
references/card-format.md.
Triggers
- Prompt / keyword, run post-release (after the framework's release tag is cut and push-verified): "公告框架版本更新" / "announce framework release" / "发框架升级公告" / "框架版本公告".
- Inputs from the caller: which framework released + its old→new version. Not automatic — it is a step run in the version-gate flow after a verified release.
Model (read first)
- Render, don't author. The change summary is extracted from the released framework's CHANGELOG top entry
(
## [X.Y.Z]… its### Added/Changed/Fixed/BREAKINGsections) — the CHANGELOG is the single source of the change text. This skill classifies + links; it never rewrites the change prose. - Framework-agnostic (decoupling — skill_spec §9). No framework name is hardcoded. Which framework released
comes from the caller's input; its repo / CHANGELOG URL is resolved at runtime from the pinned submodule's
remote (
git -C <submodule> remote get-url origin) — the same patternsyncing-frameworksuses. (Note the divergence fromannouncing-skills, which reads an instancerepo_urlfor the single hub; a framework announce targets many frameworks, so URL resolution is runtime, not instance.) - Two homes for identity. The group chat id and the maintainer→open_id map are org-instance facts
(
project_profile.yaml -> framework_announce, with the group reused fromskill_hub.announce.group_chat_id— single source, same group). Nothing identity-bearing is hardcoded in this skill. - Leaderboard reuses the hub's single ledger + maps (no second ledger). The optional leaderboard is computed from
the same hub
contributors.yamlasannouncing-skills, and resolves @-mentions via the same instance mapsskill_hub.announce.contributor_open_id+pr_account_map— not redeclared underframework_announce(single source, the same wayframework_announcereusesgroup_chat_id). A per-user ruling (2026-06-11): the leaderboard is "contributions made visible", not a taxonomy — so both cards read one ledger and may show the same ranking. Gated byframework_announce.include_leaderboard. - Card surface, not post. The change-class summary is a real table, so the message is a Lark interactive card
(
--msg-type interactive). The send mechanism (lark-cli,send_as, idempotency) is shared withannouncing-skills/publishing-deliverables; only the payload differs — seereferences/card-format.md(this skill's own card reference; the change-class table is this card's distinctive part, plus the same optional leaderboard block asannouncing-skills).
Inputs (all instance-read / runtime-resolved; zero hardcode)
- From the caller: the released framework (its code, e.g. the submodule id) + old→new version.
- From
project_profile.yaml -> framework_announce:send_as(user|bot) ·maintainer_open_id(framework code → open_id) ·include_leaderboard(bool — render the 🏆 leaderboard section or skip it). Group chat id: read at runtime fromskill_hub.announce.group_chat_id(same group, single source — not redeclared inframework_announce). - For the leaderboard (only if
include_leaderboard): the hubcontributors.yamlledger (same oneannouncing-skillsreads) + the instanceskill_hub.announce.contributor_open_idandpr_account_mapmaps (reused, not redeclared underframework_announce— single source). - Resolved at runtime: the framework's repo URL and CHANGELOG URL via
git -C <submodule> remote get-url origin(build the CHANGELOG link from the remote + the repo's CHANGELOG path). - From the framework: its CHANGELOG.md top
[X.Y.Z]entry (the released version's change text).
Procedure
- Read the released framework's CHANGELOG top entry (
## [<NEW_VER>]): collect its### Added/### Changed/### Fixed/### BREAKING(or⚠️ BREAKING) sections. This is the authoritative change text — extract, don't rewrite. - Classify the changes into the change-class table rows (one row per present class; ⚠️ BREAKING row first if present).
- Derive the consumer-impact verdict (deterministic rule — see below).
- Resolve repo + CHANGELOG URLs at runtime from the submodule remote.
- Resolve the maintainer:
maintainer_open_id[<framework-code>]→ou_xxxfor the card<at>. Missing (e.g. an external maintainer not in the group) → render the maintainer as plain text, skip the@(do not fail). - Compute the leaderboard (only if
include_leaderboardis true and thecontributor_open_idmap is non-empty — either condition unmet → skip this step and the leaderboard block in step 7; no error). Read (do not write) the hubcontributors.yaml: per contributor,count = len(contributions); sort by count desc; assign 🥇🥈🥉 to the top three (then4.,5., …); collect each person's item list. Resolve each label's<at>via the reusedskill_hub.announce.contributor_open_id(andpr_account_mapfor PR-sourced rows). This is the same ledger and same mapsannouncing-skillsuses — a single source, so the two cards' leaderboards may match. (Adding framework-contribution entries to the ledger is a separate ledger-maintenance step, not done by this skill.) - Build the card per
references/card-format.md(fill{FRAMEWORK}/{CODE}/{OLD_VER}/{NEW_VER}/{REPO_URL}/{CHANGELOG_URL}/{IMPACT}/{CHANGE_ROWS}/{MAINTAINER_AT}/{DATE}; if the leaderboard is on, also fill{RANKING}and include thehr+ ranking-heading + Table ② block; else omit that block; honor the field-tested hard constraints). - Confirm, then send (outward-facing — sending to a group publishes).
lark-cli im +messages-send --as <send_as> --chat-id <group_chat_id> --msg-type interactive --content '<card-json>' --idempotency-key <framework>-<NEW_VER>.--contentdoes not accept@file— inline the JSON. - Record. Write the announcement (framework + old→new version + group) into the consuming project's
flow_log.md.
Consumer-impact verdict (deterministic rule — checkable, not free prose)
Do not key "breaking" solely on a textual
⚠️ BREAKINGmarker — external frameworks' CHANGELOGs may not use it (e.g. one that only has### Added/Changed). Use a framework-agnostic fallback signal: a semver major bump.
IF CHANGELOG top entry contains "⚠️ BREAKING" / "### BREAKING" OR major-version bump (X increases, e.g. 1.x → 2.0)
→ IMPACT = "⚠️ 破坏性更新:sync 前请评估对本项目的影响,可能需要适配。"
ELIF only recognized non-breaking sections (Added / Changed / Fixed) AND not a major bump
→ IMPACT = "✅ 向后兼容:可在下一个版本门照常 sync 升级。"
ELSE (no recognized sections / unparseable)
→ IMPACT = "ℹ️ 变更类型待确认:请查阅 CHANGELOG 评估影响。" # do not guess
- Semver-major is the universal signal; the textual marker is a supplement, not the sole trigger.
Rules
- Decoupling red line (skill_spec §9): zero hardcoded framework name / repo / identity. Group + maintainer map are
instance-owned (
framework_announce, group reused fromskill_hub.announce); the leaderboard ledger + contributor maps are reused from the hub /skill_hub.announce(single source, not redeclared); repo/CHANGELOG URL resolved at runtime from the submodule remote. The CHANGELOG is the single source of change text. - Leaderboard is instance-gated, single-ledger — render the 🏆 section only when
include_leaderboardis true and thecontributor_open_idmap is non-empty; either unmet → omit silently (no error). It reads the one hub ledger (contributors.yaml) — it never writes a second one. The same block appears onannouncing-skills' card. - Card, not post — the change-class table needs the interactive surface;
<at>syntax is card-specific (references/card-format.md), distinct from a post's{"tag":"at"}. - Announce-after-push — run only after the release tag is cut and push-verified; never pre-announce.
- Outward-facing — sending to a group publishes; confirm with the user before sending.
Never touched
- The framework's repo / tags / CHANGELOG — read-only; this skill announces a release, it does not cut one.
- The
maintainer_open_id/contributor_open_id/pr_account_map/group_chat_id— instance values, read not written. - The hub
contributors.yamlledger — read-only here (this skill ranks from it; adding framework-contribution entries is a separate ledger-maintenance step, not this skill's job).
References
references/card-format.md— this skill's own Lark interactive-card reference (the version-update card: a change-class table + impact line + maintainer, plus the same optional 🏆 leaderboard block asannouncing-skills, instance-gated).