agentleFS
GrinvGrinv/mal-mcp/.agents/skills/release/SKILL.md

release

Skill2 starsChanged 2 months agoMITView on GitHub

Cut a release of mal-mcp — draft CHANGELOG entries, check docs/metadata consistency, then bump/tag/push. Use when asked to release, cut a version, or publish a new version of this package.

  • Commits and pushes

We split this skill into the rules it gives an agent

3 rules. 0 are common, 1 is distinctive, and 2 are very specific to this project.

  • 0

    Common

    Most of the 183 edited versions we read keep these.

  • 1

    Distinctive

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Unpushed-tag race: if the current package.json version already has a local git tag, it blocks unless that tag is also on origin — this is …

    line 23
  2. Very specific:

    Run the docs-consistency-check skill.

    line 45
  3. Distinctive:

    Commit all of the above.

    line 46

“Common” is measured: kept by at least 6 in 10 of the 183 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Releasing

package.json is the single source of truth for the version. The npm version lifecycle hook runs scripts/sync-version.mjs, which propagates it to src/version.ts, manifest.json, server.json (incl. the .mcpb release-asset URL), and CHANGELOG.md — it renames ## [Unreleased] to ## [<version>] - <date> and reopens a fresh, empty ## [Unreleased] above it, rolling the trailing compare-link block forward the same way; version.test.ts guards that the derived files never drift, and unit-tests the CHANGELOG rename directly (renderChangelogRelease). You do not need to rename the heading yourself — don't hand-edit it back to [Unreleased] after running npm version.

A preversion hook (scripts/preversion-check.mjs) runs first — it's a presence-only safety net, not a substitute for actually running the skill below as a real judgment step. It runs two checks, in order:

  • Unpushed-tag race: if the current package.json version already has a local git tag, it blocks unless that tag is also on origin — this is the exact race that once orphaned a version in a sibling repo (npm version run twice within minutes, the first tag/commit never pushed, silently buried under the second). Push the dangling tag (git push origin vX.Y.Z) or delete it if it was a mistake (git tag -d vX.Y.Z), then retry.
  • Empty changelog: it blocks npm version if CHANGELOG.md's [Unreleased] section is empty: run the changelog-style skill against the commits since the last tag first — it's what actually makes the entries short, self-describing, free of implementation detail, and linked to their commits; the hook only confirms something is there, not that it follows that style. (Or re-run with CONFIRM_EMPTY_CHANGELOG=1 if this release genuinely has no user-facing changes, e.g. a pure dependency bump.)

When invoked as this skill, run these as explicit steps, not optional — don't rely on the preversion hook alone to catch a skipped one:

  1. Invoke the changelog-style skill against the commits since the last tag; write/fix the [Unreleased] entries per its style rules (heading rename happens later, automatically — see above).
  2. Run the docs-consistency-check skill.
  3. Commit all of the above.
  4. npm version <patch|minor|major> — preversion gate, then bumps + syncs every file (including the CHANGELOG rename) + commits "release: vX.Y.Z"
    • tags vX.Y.Z.
  5. git push --follow-tags — pushing the tag triggers .github/workflows/release.yml. Verify the tag actually reached the remote: git ls-remote --tags origin | grep vX.Y.Z. --follow-tags only pushes annotated tags (npm version's default) reachable from what's being pushed — if you ever re-tag by hand (e.g. git tag -f vX.Y.Z <commit> to fix something before pushing), that recreates it as a lightweight tag, which --follow-tags silently skips; push it explicitly instead (git push origin vX.Y.Z) and re-verify with git ls-remote. (Confirmed live 2026-07-29: a git tag -f without -a produced exactly this silent no-op.)

The tag push (v*) runs the Release workflow: check:api gate → build → test → pack .mcpb → GitHub Release → npm publish (OIDC trusted publishing, with provenance — no token) → publish to the official MCP Registry (mcp-publisher, GitHub OIDC; the binary is pinned to an exact version + verified SHA-256 rather than latest). The workflow's CHANGELOG-extraction step fails loudly (not silently) if it can't find a ## [<version>] section, as a backstop if the heading rename above is somehow bypassed. The npm publish step is itself pinned to an exact verified-good npm version — no token — and is skipped without failing the job if this version is already on npm, so a re-run after a partial failure doesn't abort. The .mcpb SHA-256 injection into server.json likewise fails loudly if the injection didn't actually match a package, instead of silently leaving a stale hash. Never hand-edit the version in the derived files; bump package.json via npm version and let the hook sync the rest.

MCP Registry

The server is listed at registry.modelcontextprotocol.io as io.github.Grinv/mal-mcp (server.json), exposing both packages: the npm package (mal-mcp, run via npx) and the .mcpb GitHub-release bundle. Ownership is verified per package type:

  • npm → the mcpName field in package.json must equal server.json's name (guarded by version.test.ts). It ships in the published package, so it is set once and every release just works.
  • mcpb → server.json needs the artifact's fileSha256. Because .mcpb (a zip) isn't byte-reproducible, the release workflow recomputes it from the just-packed bundle and injects it before mcp-publisher publish — no committed value is kept. The asset URL must contain "mcp" (it does).

The namespace io.github.Grinv/* is authorized by GitHub OIDC from this repo, so no registry token/secret is needed. To publish manually instead: mcp-publisher login github && mcp-publisher publish.

Keep config in three places in sync. A user-facing env var is declared in config.ts's CREDENTIAL_ENV_VARS (the source of truth — a satisfies clause ties it to EnvSchema's real keys, so a typo/rename fails tsc --noEmit), manifest.json user_config (the .mcpb install form), and server.json packages[].environmentVariables (the registry entry). When you add/rename/ remove a credential var, update CREDENTIAL_ENV_VARS plus the descriptor in both JSON files — version.test.ts guards that all three agree (not just manifest.json against server.json), so a mismatch fails a test instead of only surfacing as a stale install form. Keep server.json descriptions ≤ 100 chars (registry schema cap). Purely internal tunables (timeouts, cache, rate limits, LOG_LEVEL) stay env-only — they don't belong in CREDENTIAL_ENV_VARS or in the install form/registry entry. MAL_TOKEN_STORE/MAL_OAUTH_PORT are the same category (rare, advanced overrides) even though README documents them in the main table alongside the credential vars — don't add them to CREDENTIAL_ENV_VARS/manifest.json/server.json just because they're in config.ts's EnvSchema.

Download now (ZIP)

  • Other versions194 projects use a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 194

    1. paperclipai/paperclip★ 107ksame name
    2. modelcontextprotocol/servers★ 92ksame name
    3. remotion-dev/remotion★ 67ksame name
    4. traefik/traefik★ 65ksame name
    5. usememos/memos★ 64ksame name
    6. tw93/Pake★ 62ksame name
    7. Yeachan-Heo/oh-my-claudecode★ 40ksame name
    8. Yeachan-Heo/oh-my-claude-sisyphus★ 40ksame name
    9. tobi/qmd★ 30ksame name
    10. jlowin/fastmcp★ 28ksame name

    184 more not listed

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

  • Used alongsideProjects with it also use create-agent-adapter, pr-report and 5 more.

    Other files people use alongside this one.

    Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
    • MicrosoftSkill

      create-agent-adapter

      Technical guide for creating a new Paperclip agent adapter. Use when building a new adapter package, adding support for a new AI coding tool (e.g. a new CLI agent, API-based agent, or custom process), or when modifying the adapter system. Covers the required interfaces, module structure, registration points, and conventions derived from the existing claude-local and codex-local adapters.

      Also in 5 projects that use this

    • MicrosoftSkill

      pr-report

      Review a pull request or contribution deeply, explain it tutorial-style for a maintainer, and produce a polished report artifact such as HTML or Markdown. Use when asked to analyze a PR, explain a contributor's design decisions, compare it with similar systems, or prepare a merge recommendation.

      Also in 5 projects that use this

    • Microsoft AzureSkill

      documentation-consistency

      Keeps GPT-RAG MCP service and umbrella documentation aligned with shipped behavior. Use for capabilities, configuration keys, deployment steps, endpoints, defaults, operations, or breaking changes.

      Also in 6 projects that use this

    • parcadeiSkill

      agent-context-isolation

      Agent Context Isolation

      Also in 3 projects that use this

    • parcadeiSkill

      agentica-infrastructure

      Reference guide for Agentica multi-agent infrastructure APIs

      Also in 3 projects that use this

    • +2 more from parcadei
  • In this repository9 other files it gives its agents.

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.