mallard-release
Skill4 starsChanged 14 days agoMITView on GitHub
Workflow for adding skills/commands to mallard and shipping a new release. Use when the user asks how to release mallard, ship a new mallard version, add a skill or command to mallard, bump a mallard version, "publicar mallard", "subir mallard", "nueva versión de mallard", or anything involving editing this repo and getting the change to the team's machines.
- Pipes a download into a shell
- Commits and pushes
In this repository37 other files it gives its agents.
- blast-radiusSkill
- elementflow-kbSkill
- gitlab-changelog-releaseSkill
- gitlab-ci-quality-gatesSkill
- gitlab-project-bootstrapSkill
- gitlab-security-setupSkill
- gitlab-wiki-bootstrapSkill
- lando-checkSkill
- lando-img-placeholderSkill
- lando-mail-smtpSkill
- lando-setupSkill
- mr-flowSkill
- no-commentsSkill
- paginated-report-pdfSkill
- panda-kbSkill
- ploi-prestashop-deploySkill
- prestashop-kbSkill
- ps-consoleSkill
- ps-css-buildSkill
- ps-demo-userSkill
- ps-email-previewSkill
- ps-image-regenSkill
- ps-invoice-previewSkill
- ps-new-projectSkill
- ps-one-page-checkoutSkill
- ps-project-docSkill
- ps-security-auditSkill
- ps-storefront-polishSkill
- ps-theme-cacheSkill
- ps-translateSkill
- ps-view-transitionsSkill
- ps-watchSkill
- reflectSkill
- show-me-your-workSkill
- skill-authorSkill
- task-contextSkill
- verify-ps-projectSkill
The file
We split this skill into the rules it gives an agent
4 rules. About 0 are common, 2 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
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
- Very specific: line 58
Create skills/<skill-name>/SKILL.md with frontmatter:
- Distinctive: line 69
Write the skill body in markdown.
- Distinctive: line 141
If the changelog auto-text needs richer notes (highlights, breaking changes, etc.), edit the release after publish:
- Very specific: line 170
mallard updatemakes backups: before replacing files. If you blow something away, mallard update --list-backups and --restore <ts> will …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
mallard release workflow
Reference for adding/updating skills, commands, and shipping releases for mallard. The tool lives in your local clone of that repo. The path differs per machine, so resolve it instead of assuming one: dirname "$(dirname "$(readlink ~/.claude/skills/mallard-release)")" prints the repo root, because every mallard-managed skill is a symlink into <repo>/skills/<name>. Run the commands below from that directory.
When to use this skill
- "How do I add a skill to mallard?"
- "Release a new version of mallard" / "ship mallard" / "tag mallard vX.Y.Z"
- "Update mallard" / "bump the mallard version"
- Anything that involves editing files under
skills/,claude/commands/,claude/agents/, or shipping the change to other team members.
TL;DR
# 1. Edit the skill/command file
# 2. Bump its `version:` in frontmatter (semver, conservative)
# 3. Test locally
go build -o mallard .
./mallard update # re-link with backup
./mallard registry # confirm new version + ok status
# 4. Commit using Conventional Commits, in English
git add skills/<name>/ claude/commands/<name>.md
git commit -m "feat(skills): add <name>" # or fix:, refactor:, docs:, chore:
# 5. Push
git push
# 6. Tag a release (this is what propagates to the team)
git tag vX.Y.Z
git push origin vX.Y.Z
# GitHub Actions runs goreleaser → publishes binaries + auto-changelogTeam members pick it up with:
curl -fsSL https://raw.githubusercontent.com/educlopez/mallard/main/install.sh | bash
mallard updateAdding a new skill
- Create
skills/<skill-name>/SKILL.mdwith frontmatter:--- name: <skill-name> description: > When to trigger this skill. Be specific — Claude uses this to decide whether to invoke. Include keywords the user might say, project types, and contexts. version: "0.1.0" --- - Write the skill body in markdown. Sections, code blocks, tables — whatever helps Claude execute the skill. Reference existing skills in this repo for style.
- Locally:
go build -o mallard . && ./mallard update— the symlink will appear in~/.claude/skills/<skill-name>/. - Validate:
./mallard doctor(managed count goes up) and./mallard registry(entry showsv0.1.0 ok). - Skip to Shipping a release below.
Adding a new command
- Create
claude/commands/<command-name>.mdwith frontmatter:--- name: <command-name> description: One-line summary of what the command does. version: "0.1.0" --- - Body: instructions for the slash command. Available in Claude Code as
/<command-name>after install. - Locally:
./mallard update. - Skip to Shipping a release below.
Adding a new agent
Agents are written as Claude Code subagents. Claude gets the file as-is (~/.claude/agents/).
Codex, OpenCode and Cursor get a rendered copy (Codex TOML in ~/.codex/agents/, OpenCode
mode: subagent in ~/.config/opencode/agents/, Cursor model: inherit in ~/.cursor/agents/)
written to <source>/.generated/<agent>/agents/ and symlinked. model and color are dropped
for them; tools only decides readonly (Cursor) and edit/bash denies (OpenCode). Codex ignores
tools: an agent file cannot override its sandbox. Gemini, Windsurf and the
generic adapter skip agents.
- Create
claude/agents/<agent-name>.mdwith frontmatter:--- name: <agent-name> description: When Claude should route to this agent. tools: Read, Grep, Glob, Bash model: sonnet color: orange version: "0.1.0" --- - Body: the agent's system prompt. Optionally add a
/<name>command inclaude/commands/to invoke it explicitly. - Locally:
./mallard update— the symlink appears in~/.claude/agents/<agent-name>.md. - Skip to Shipping a release below.
Bumping an existing skill, command, or agent
- Edit the file.
- Bump
version:in the frontmatter. Semver guidance:- Patch (0.1.0 → 0.1.1): typo fixes, doc clarifications, no behavior change.
- Minor (0.1.0 → 0.2.0): new functionality inside the skill, backward-compatible.
- Major (0.1.0 → 1.0.0): breaking change in expected user-facing behavior (rare for a skill).
- Locally:
./mallard update && ./mallard registry— confirm new version showsok, olddriftif you also have an older symlink elsewhere.
Shipping a release
git add <files>
git commit -m "feat(skills): add <name>"
# Conventional Commit prefixes: feat, fix, refactor, docs, chore, ci, test
git push
git tag vX.Y.Z
git push origin vX.Y.ZVersion the mallard release, not the skill: skills carry their own versions inside frontmatter, the tag versions the binary + the set of skills shipped together.
GitHub Actions (.github/workflows/release.yml) runs goreleaser, which:
- Builds for darwin/linux/windows × amd64/arm64
- Uploads tarballs + checksums to the GitHub release
- Writes a release changelog grouped by Features / Bug Fixes / Refactor / Others (filters out
docs:,test:,ci:,chore:)
If the changelog auto-text needs richer notes (highlights, breaking changes, etc.), edit the release after publish:
gh release edit vX.Y.Z --notes "$(cat <<'EOF'
## Highlights
- ...
## Skills
- new: ...
- updated: ...
EOF
)"Team upgrade path
curl -fsSL https://raw.githubusercontent.com/educlopez/mallard/main/install.sh | bash
mallard update # re-symlinks skills + commands, backs up any conflicts
mallard doctor # verify
mallard registry # see what's installed per agent + versionsWindows: download the latest zip from https://github.com/educlopez/mallard/releases and replace mallard.exe on the PATH.
Gotchas
- NEVER skip the
version:field on skill/command frontmatter. Without it,mallard registryreportsunversioned. - Conventional Commits are mandatory — they drive the changelog grouping.
chore:commits get filtered out of release notes. mallard updatemakes backups before replacing files. If you blow something away,mallard update --list-backupsand--restore <ts>will recover it.- The first run on a new agent dir (Claude / Codex / OpenCode / Cursor / generic) appears as
missing → installedfor every entry. That's expected, not drift. - Run
updatefrom the repo, not a stray binary. A binary with no siblingskills/(for example one built into/tmp) materializes its embedded source into~/.mallard/source/<version>/and relinks every skill there. For local testing run./mallard updatefrom the repo root, or setMALLARD_DIR=<repo>. Check afterwards withls -la ~/.claude/skills/<name>: the link must point into the repo. - Skills only ship via tags. Pushing to
mainwithout tagging publishes nothing — GH Actions release workflow only fires onv*tags.
Useful commands
| Command | What |
./mallard | Interactive TUI (Install / Update / Doctor / Registry / Quit) |
./mallard update --dry-run | Show what update would change without touching disk |
./mallard update --restore <ts> | Recover from a backup batch |
./mallard registry --source | List what the repo ships (without scanning installed) |
./mallard registry --all | Include foreign / unmanaged entries from other tooling |
./mallard version | Print version (release tag injected at build time) |
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
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.

