agentleFS
coreprocesscoreprocess/loupe-mcp/.agents/skills/version/SKILL.md

version

Skill0 starsChanged 16 days agoMITView on GitHub

Cuts a new `v<major>.<minor>.<patch>` tag on the loupe-mcp repository, deciding the bump level (major / minor / patch) by analyzing the commits since the last tag. Use when the user asks to release, tag a version, cut a release, bump the version, or publish a new image.

  • Commits and pushes

10 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

4 rules. 0 are common, 2 are distinctive, and 2 are very specific to this project.

  • 0

    Common

    Most of the 9 edited versions we read keep these.

  • 2

    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:

    When the semantic table is ambiguous, fall back to the commit's [<type>] prefix:

    line 38
  2. Very specific:

    Always read the commit body (and the diff if needed) before classifying — a [refactor] or [fix] subject can hide a changed default, a …

    line 48
  3. Distinctive:

    Create the annotated tag at the chosen commit:

    line 108
  4. Distinctive:

    Do not push automatically.

    line 121

“Common” is measured: kept by at least 6 in 10 of the 9 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

Version

This project's version-tag rules are defined in PROJECT.md → "Names" and "Conventions → Version tags". Tags are the source of truth for versions: git describe --tags --candidates=100 --match='v[0-9]*' --abbrev=4 derives the version of any commit. No version file exists to bump; the release pipeline builds the version from the tag into the image (LOUPE_VERSION).

A pushed tag is the release: .github/workflows/release.yml builds and publishes ghcr.io/coreprocess/loupe-mcp:<major>.<minor>.<patch> and :<major>.<minor>. Projects then pick it up by changing the pinned image version in their infrastructure code.

Format

Tags MUST match ^v[0-9]+\.[0-9]+\.[0-9]+$ — three numeric components, prefixed with v. PROJECT.md allows the broader glob v[0-9]*; the strict three-segment form is the convention enforced here. Tags are annotated (git tag -a), never lightweight, so they carry a message and a timestamp.

The public contract

Loupe is consumed by deployments that pin an image version and by agents that call its tools. Its public contract is:

  • Configuration: environment variable names, accepted values and defaults (docs/configuration.md).
  • Tools: tool names, input parameters, and the shape of their responses (submit, get_job, read_result, …), including the quality levels.
  • Result formats: the manifest, the result file layout and page markup (docs/CONCEPT.md §2, §6), the upload and download URL schemes and their responses.
  • Terraform module: input variables and outputs (terraform/).
  • Accepted inputs: a file type or name that was accepted before but is refused now is a contract change for its users, even when it is the right change.

Deciding the bump level

Pick the highest applicable level from the table. If any commit since the last tag qualifies for major, the release is major, even if other commits in the range are minor or patch.

LevelBump from vX.Y.ZUse when at least one commit since the last tag...
majorv(X+1).0.0Breaks the public contract: a removed or renamed environment variable, a changed default that alters behavior, a removed or renamed tool or parameter, an incompatible change to the manifest or result format, a removed Terraform variable or output, or an input type that is no longer accepted.
minorvX.(Y+1).0Adds something without breaking existing usage: a new input type, a new tool or optional parameter, a new optional environment variable, a new Terraform input with a default, a new field in a response.
patchvX.Y.(Z+1)Backward-compatible polish only: bug fixes, upload-check fixes that close a gap without refusing legitimate files, internal refactors, dependency bumps, build/CI changes, doc edits, repo hygiene.

Mapping by commit type (fallback heuristic)

When the semantic table is ambiguous, fall back to the commit's [<type>] prefix:

Commit type(s) in the rangeDefault level
[feature] introducing a breaking changemajor
[feature] (additive)minor
[refactor] that changes a public contractmajor
[refactor] (internal only)patch
[fix] / [build] / [ci] / [docs] / [chore] onlypatch

Always read the commit body (and the diff if needed) before classifying — a [refactor] or [fix] subject can hide a changed default, a renamed variable or a stricter upload check.

Pre-1.0 mode

Apply this section whenever no tags exist yet or the latest tag's major is 0 (i.e. it matches v0.*):

  • The first tag is v0.1.0.
  • A major-class change bumps the minor segment instead: v0.(Y+1).0.
  • A minor-class change bumps the patch segment: v0.Y.(Z+1).
  • patch-class changes still bump the patch segment.
  • Bump to v1.0.0 only when the maintainer explicitly declares the system stable.

Once v1.0.0 exists, use the standard table above without adjustment.

Workflow

  1. Confirm the target commit is on main's canonical history (HEAD by default):

    git merge-base --is-ancestor "$COMMIT" main && echo "on main"
  2. Confirm CI passed for the target commit (both the check and integration jobs):

    gh run list --commit "$(git rev-parse "$COMMIT")" --workflow CI --json conclusion,status
  3. Find the last release tag, if any:

    git describe --tags --candidates=100 --match='v[0-9]*' --abbrev=0 2>/dev/null
  4. List the commits in scope. Read both subjects and bodies:

    git log "$LAST_TAG"..HEAD --no-merges                # if a tag exists
    git log --no-merges                                  # first release

    Inspect individual diffs when needed: git show <sha>. For the contract, diff the documents directly: git diff "$LAST_TAG"..HEAD -- docs/configuration.md terraform/variables.tf terraform/outputs.tf src/tools/ src/results/types.ts.

  5. Classify each commit using the semantic table; fall back to the type heuristic if unclear. Apply pre-1.0 mode if it applies.
  6. Compute the new version. Verify the tag is unused:

    git rev-parse --verify "refs/tags/vX.Y.Z" 2>/dev/null && echo "EXISTS"
  7. Present the maintainer with:

    • the previous tag (or "first release"),
    • the commits being released,
    • the chosen bump level and one-sentence rationale,
    • for a major-class change: what consumers must adapt (configuration, Terraform inputs, tool usage),
    • the proposed new tag.

    Wait for explicit confirmation before tagging — PROJECT.md requires tags to be created manually by the maintainer.

  8. Create the annotated tag at the chosen commit:

    git tag -a vX.Y.Z -m "Release vX.Y.Z" "$COMMIT"   # omit "$COMMIT" to tag HEAD
  9. Verify with git describe:

    git describe --tags --candidates=100 --match='v[0-9]*' --abbrev=4 "$COMMIT"
    # expected: vX.Y.Z (no -N-g<sha> suffix means the commit is exactly tagged)
  10. Do not push automatically. Show the maintainer the command instead:

    git push origin vX.Y.Z

    Pushing the tag starts the release pipeline; the image appears at ghcr.io/coreprocess/loupe-mcp:X.Y.Z when it succeeds.

Pre-tag checklist

  • Tag matches ^v[0-9]+\.[0-9]+\.[0-9]+$.
  • Tag does not already exist locally.
  • Target commit is on main's canonical history.
  • CI passed for the target commit.
  • Bump level matches the highest-applicable change since the last tag.
  • Pre-1.0 mode applied if the current major is 0 (or if no prior tag exists).
  • Tag is annotated (git tag -a), with a non-empty message and no AI attribution.
  • Maintainer has confirmed the proposal.

Common mistakes to avoid

  • Tagging a branch tip instead of a commit on main. Tags must live on main's canonical history.
  • Lightweight tags (git tag vX.Y.Z without -a). Always use annotated tags.
  • Bumping the major segment while pre-1.0. Apply the pre-1.0 shift instead.
  • Editing a version number in a file. There is none to edit; the tag is the version.
  • Re-tagging an existing commit because of a wrong version. Delete the local tag (git tag -d vX.Y.Z) and retag; if it was already pushed, the image is already published, so release a new version instead of moving the tag.
  • Pushing the tag in the same step as creating it. Confirmation and push are explicitly the maintainer's call.
  • Inferring a bump level from subjects alone. Read bodies and diffs.

Source of truth

PROJECT.md → "Names" (tag pattern) and "Conventions → Version tags" (discovery command, release pipeline) are authoritative for the format and mechanism. The major / minor / patch semantics above are defined by this skill; if PROJECT.md later specifies them, PROJECT.md wins and this skill should be updated to match.

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.