Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/nonlinear-xyz/factory-kit/factory-releasenpx skills add nonlinear-xyz/factory-kit --skill factory-releasegit clone --depth 1 https://github.com/nonlinear-xyz/factory-kitWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/nonlinear-xyz/factory-kit/factory-release)<a href="https://agentmods.dev/skills/nonlinear-xyz/factory-kit/factory-release"><img src="https://agentmods.dev/badge/skills/nonlinear-xyz/factory-kit/factory-release.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00058 | $0.03133 |
| Opus 5 | $0.00029 | $0.01566 |
| Sonnet 5 | $0.00012 | $0.00627 |
| Haiku 4.5 | $0.00006 | $0.00313 |
Grade A, and why
factory-release scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 4d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 150 lines — stays where its author put it; the contents beside it link to each section on GitHub.
You're cutting a new release. The user owns the final word at every gate and edits the release notes directly in their preferred editor.
A release is one atomic fact — package.json version, the VERSION file, the git tag, the GitHub Release, and the npm publish all name the same thing. This command's job is to advance them together. Letting any one of them move without the others is the drift this command exists to prevent.
Invocation input: patch, minor, or major. If empty, ask through the host's user-interaction capability or directly in chat.
What to do
-
Pre-flight. Run in parallel:
-
git status --porcelain— must be clean. If dirty, list the files and ask whether to abort or stash. -
git rev-parse --abbrev-ref HEAD— confirm we're on the default branch (typicallymain). If not, warn and ask before proceeding. -
Establish the current version from up to three sources, and detect drift between them:
package.jsonversion(if apackage.jsonexists) — the source npm publishes from.VERSIONfile at repo root (if present).- Latest git tag:
git describe --tags --abbrev=0(strip leadingv).
If these disagree, surface all of them explicitly and treat the highest (by semver) as the current base. Drift is exactly what this command exists to close — name it, don't silently pick one. If none exist, treat current as
0.0.0.
-
-
Compute the new version from the reconciled base:
patch:X.Y.Z → X.Y.(Z+1)minor:X.Y.Z → X.(Y+1).0major:X.Y.Z → (X+1).0.0
-
Check for tag collision.
git rev-parse v<new-version> 2>/dev/null— if it resolves, fail with a clear message and stop. Don't overwrite an existing tag. -
Establish the baseline and enumerate the version spans. The breakdown starts from the last published point, not merely the last tag — so versions that were tagged but never shipped still get a changelog entry.
- Baseline:
- If this is an npm package (
package.jsonwith aname, notprivate):npm view <name> version→ the last version on npm. The baseline ref is its tagv<published>if that tag exists; if the tag is missing, fall back togit describe --tags --abbrev=0and note the mismatch. - Otherwise: baseline = previous tag
git describe --tags --abbrev=0. If no tags exist at all, baseline = the initial commit.
- If this is an npm package (
- Enumerate every version boundary from the baseline to HEAD. List tags with
git tag --list 'v*' --sort=v:refname, keep those strictly greater than the baseline, and append the new version (v<new-version>, spanning the last existing tag → HEAD). This yields an ordered list of spans:(baseline → v_a), (v_a → v_b), …, (v_last → HEAD as v<new-version>). In the normal no-drift case the baseline IS the last tag, so there's exactly one span and the per-version breakdown collapses to a single block automatically. - For each span, gather deterministically (straight from git, no interpretation):
- Commits:
git log <from>..<to> --pretty=format:"%h %s", grouped by Conventional Commits type (feat,fix,refactor,chore,docs,test; anything non-conforming →**other:**with a flag for the user to rewrite). - Diffstat:
git diff --shortstat <from>..<to>→ "N files changed, +X / −Y". - Surface map:
git diff --name-status <from>..<to>, group changed paths by top-level directory and mark added (+), modified (~), deleted (−), renamed (→). For this kit,skills/,agents/,commands/, andbin/ARE the public API surface (see the README's Versioning section), so this line is the at-a-glance "what moved in the surface."
- Commits:
- Identify the dominant theme across the whole span (largest user-facing group,
feat>fix>refactor>chore) for the top-level Outcome line. - Extract any Linear IDs (
<TEAM>-<NUM>) across all spans for the Refs line.
- Baseline:
-
Write the draft to a file the user can actually edit. Use the host's filesystem-write capability to create
/tmp/factory-kit-release-notes-v<new-version>.md. Auto-fill everything you can; leave clearREFINEmarkers where judgment is needed. Order version blocks newest-first — this release at the top, older catch-up versions beneath. Shape:
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 4d ago First seen · 150 lines · 58 tokens per session scan A df0ddc7dd6d3
factory-release is a skill published in the GitHub repository nonlinear-xyz/factory-kit (9 stars, last pushed 1mo ago), licensed MIT. It adds 58 tokens to every session and 3,133 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
dev-finish
Close out a session — summarise what changed, capture what was learned, and prepare the commit.
dev-rc
The last gate before merge — QA, security audit, review and changelog, with objective pass conditions.
release-jetbrains
Use when releasing the Kilo JetBrains plugin -- resolve a version ("next rc" or explicit), run the prepare workflow, edit and commit a filtered human-readable changelog on the release PR, then watch publish to completion.
goal-release
Cut a release end to end: use the draft-release skill to open the release PR and draft GitHub release, wait for CI to turn green, run the merge-pr skill to merge the release PR, then update the Homebrew formula from the published release assets. Use when the user wants to draft and merge a release in one go, or…
release-archivist
Close out a spec-superflow change with verification, summary, and archive readiness. Invoke when implementation is complete, verification is underway, or the user asks for a final wrap-up.
draft-release
Draft a new release of the project.