agentsclimarketplace

Announcing skills

Skill vemodalen-x/VEMO_SKILLS/skills/governance/announcing-skills

Announce newly-registered skill(s) to a team chat as a celebratory Feishu (Lark) interactive card — a 上新表 (version / category / summary / @contributor) plus an optional 🏆 cumulative contribution leaderboard read from the hub's contribution ledger (instance-gated by include_leaderboard). Use after a skill-hub release adds skills. Identity-decoupled — group, repo URL, and open_id map are instance values.From its SKILL.md

Install
npx -y skills add vemodalen-x/VEMO_SKILLS --skill announcing-skills

Assembled 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.

SKILL.md

6.6 KB, ~1.7k tokens by cl100k_base, as published. Nobody here has run it

Skill Announce

After a skill-hub release adds one or more skills, post a celebratory announcement card to a team chat: a table of what's new (hub version · category · summary · @'d contributor) and a cumulative contribution leaderboard (🏆 ranked by how many contributions each person has made to the hub). This is a governance-meta skill — it operates on the skill hub itself, alongside publishing-skills / syncing-frameworks / contributing-framework-changes.

Triggers

  • Prompt / keyword, run post-release (after publishing-skills registered the skills and the hub released): "公告一下新 skill" / "announce the new skills" / "发上新公告" / "skill 上新通知".
  • Inputs: the new-skill set (this release's added skills) + the released hub version. Not automatic — it is a step you run after a release, mirroring how publishing-deliverables notifies after a publish.

Model (read first)

  • Two facts, two homes (decoupling — skill_spec §9):
    • The contribution ledger is a hub fact: contributors.yaml in the hub repo root — identity-FREE, keyed by a contributor label, listing each contribution (item + source + date). The leaderboard is computed from it. PR-sourced contributions count only once their PR is merged (user ruling 2026-06-11) — open or rejected PRs are excluded from the ledger and the leaderboard.
    • The label→open_id map, the group chat id, the send identity, and the repo URL are org-instance facts: read from the consuming project's instance skill_hub.announce at runtime. Nothing identity-bearing is hardcoded in this skill.
  • Card surface, not post. Real tables need a Lark interactive card (--msg-type interactive). The send mechanism (lark-cli, send_as, idempotency) is shared with publishing-deliverables; only the payload differs. Card <at id=ou_xxx></at> syntax is different from post's {"tag":"at"} — see references/card-format.md, do not mix.

Inputs (all instance-read; zero hardcode)

From the consuming project's project_profile.yaml -> skill_hub.announce:

  • send_as (user|bot) · group_chat_id · hub (which home) · repo_url (hub git link, D10) · include_leaderboard (bool — render the 🏆 leaderboard section or skip it) · contributor_open_id (label → open_id) · pr_account_map (PR login → open_id, for PR-sourced contributions). From the hub: contributors.yaml (the ledger). From the caller: the new-skill set + released version.

Procedure

  1. Update the ledger. For each newly-added skill/contribution, append an entry to the hub contributors.yaml (label, item, source = feishu|pr, date). Keyed by contributor label (identity-free).
  2. Resolve contributor identity.
    • Source = Feishu: the contributor's open_id is the message sender (arrives at invocation); map its label via contributor_open_id for any other render needs.
    • Source = repo PR: map the PR account → open_id via pr_account_map.
    • For each label, look up contributor_open_id[label]ou_xxx for the card <at>.
  3. Compute the leaderboard (only if include_leaderboard is true and the contributor_open_id map is non-empty — either condition unmet → skip this step and the Table ② / ranking-heading block in step 4; no error). Aggregate contributors.yaml: per contributor, count = len(contributions); sort by count desc; assign 🥇🥈🥉 to the top three (then 4., 5., …). Collect each person's item list.
  4. Build the card per references/card-format.md: turquoise header; opener div with <at id=all></at> + **Skill Hub 版本:<version>** + [📦 Skill Hub 仓库](<repo_url>); Table ① 上新表 (Skill/分类/简介/贡献人 🏅 <at id=ou_xxx></at>(来源)); if the leaderboard is on (include_leaderboard true + non-empty contributor_open_id map): hr; ranking heading; Table ② 排行榜 (名次/贡献人 <at>/累计贡献/贡献内容); else omit that whole block; closing 感谢 div. Fill {VERSION} / {REPO_URL} / {ROWS} / {RANKING} from the resolved inputs. Honor the hard constraints (config wide_screen_mode+width_mode:fill; row_height high; no column width; @ only in lark_md).
  5. Send. lark-cli im +messages-send --as <send_as> --chat-id <group_chat_id> --msg-type interactive --content '<card-json>' --idempotency-key <release-version>. --content does not accept @file — inline the JSON.
  6. Identity preconditions (surface, don't fail silently): send_as: user needs im:message.send_as_user (missing → emit the auth link, pause the send, keep the ledger update); send_as: bot needs the bot to be a group member.
  7. Record. Write the announcement (group + version + @'d contributors) into the consuming project's flow_log.md when run there.

Rules

  • Decoupling red line (skill_spec §9): this body is generic. Group, identity, repo URL, and the open_id maps are instance-owned (skill_hub.announce); the ledger is hub-owned and identity-free. Zero hardcode.
  • Leaderboard is instance-gated — render the 🏆 section only when include_leaderboard is true and the contributor_open_id map is non-empty; either condition unmet → omit the section silently (no error). Whether to celebrate contributions is an instance choice, not a hub default.
  • Card, not post — tables require the interactive surface; <at> syntax is card-specific (references/card-format.md).
  • Outward-facing — sending to a group is outward; confirm with the user when unsure before sending.
  • Post-release step — run after the skills are registered (publishing-skills) and released; it announces a real release.

Never touched

  • Skill adoption into a project toolset (user-consent red line, skill_spec §6) — this only announces what landed.
  • The contributor_open_id / pr_account_map / group_chat_id — those are instance values, read not written.

References

  • references/card-format.md — Lark interactive-card constraints + the v6 template (placeholders, the card-vs-post <at> distinction, the field-tested hard constraints).

What ships with it: 1 file

5.7 KB alongside SKILL.md

references/

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.