{"id":"2558c124-ab07-48a4-bec6-ce3352052d53","shortId":"gY7Tkf","kind":"skill","title":"agr-release","tagline":"Release process for the agr package. Handles version bumping (major/minor/patch/beta), changelog updates, pre-release quality checks, git tagging, and monitoring the GitHub Actions publish pipeline. Use this skill whenever the user wants to cut a release, bump the version, publis","description":"# agr Release Process\n\nThis skill walks through the full release process for the `agr` package. The release is\ntag-driven: pushing a `vX.Y.Z` tag triggers the GitHub Actions pipeline that runs quality\nchecks, builds the package, publishes to PyPI, and creates a GitHub Release.\n\nYour job is to prepare everything so that when the tag is pushed, the pipeline succeeds\non the first try.\n\n## Before you start\n\nVerify the preconditions. If any fail, stop and tell the user.\n\n1. **Clean working tree** — `git status` should show no uncommitted changes\n2. **On the `main` branch** — releases should only come from main\n3. **Up to date with remote** — `git pull` to make sure you're not behind\n\nAsk the user what kind of release this is:\n- **patch** (0.7.10 → 0.7.11) — bug fixes, small changes\n- **minor** (0.7.10 → 0.8.0) — new features, backwards-compatible\n- **major** (0.7.10 → 1.0.0) — breaking changes\n- **beta** (0.7.11b1) — pre-release for testing\n\nIf the user already said what type they want, don't ask again.\n\n## Step 1: Figure out what changed\n\nBefore touching any files, understand what's being released.\n\n```bash\n# See all commits since the last release tag\ngit log $(git describe --tags --abbrev=0)..HEAD --oneline\n```\n\nAlso check the `[Unreleased]` section in `CHANGELOG.md` — it may already have entries. Cross-reference with the git log to make sure nothing is missing. If there are commits that aren't reflected in the changelog, add them.\n\nGroup changes into the standard Keep a Changelog categories:\n- **Added** — new features\n- **Changed** — changes to existing functionality\n- **Fixed** — bug fixes\n- **Removed** — removed features\n- **Docs** — documentation-only changes\n\n## Step 2: Run quality checks\n\nRun all three locally before proceeding. These are the same checks the CI pipeline runs,\nso catching failures here saves a round-trip.\n\n```bash\nuv run ruff check .\nuv run ruff format --check .\nuv run pytest -m \"not e2e and not network and not slow\"\nuv run ty check\n```\n\nIf anything fails, fix it before continuing. The release commit should pass CI cleanly.\n\n## Step 3: Check if docs need updating\n\nNot every release needs doc changes — use judgement. Docs updates are warranted when:\n- A CLI command was added, removed, or its flags changed\n- A new module or public API was added\n- Behavior that users rely on changed in a way they'd notice\n\nThe docs to consider:\n- `README.md` — the primary entry point, should reflect current capabilities\n- `docs/docs/reference.md` — CLI command reference\n- `docs/docs/index.md` — landing page / getting started\n- Other files in `docs/docs/` as relevant (sdk.md, configuration.md, etc.)\n- Skills in `skills/` — if any exist and are affected by the changes\n\nIf nothing user-facing changed (internal refactors, test improvements, dependency bumps),\nskip this step and move on.\n\n## Step 4: Bump the version\n\nThe version lives in `pyproject.toml` (the single source of truth — `importlib.metadata` picks it up at runtime via `agr/__init__.py`):\n\n1. `pyproject.toml` line 7: `version = \"X.Y.Z\"`\n\nCalculate the new version based on the current version and the release type the user chose.\n\nFor beta releases, append `b1` (or increment the beta number if one already exists):\n- `0.7.10` → `0.7.11b1` (first beta of next patch)\n- `0.7.11b1` → `0.7.11b2` (next beta)\n- `0.7.11b2` → `0.7.11` (promote beta to stable)\n\n## Step 5: Update the changelog\n\nIn `CHANGELOG.md`:\n\n1. Replace `## [Unreleased]` with `## [X.Y.Z] - YYYY-MM-DD` (today's date)\n2. Make sure all changes from Step 1 are included under the right categories\n3. Add a new empty `## [Unreleased]` section at the top\n4. Review the entries — they should be concise but descriptive enough that a user\n   scanning the changelog understands what changed without reading the code\n\nThe changelog format matters because the GitHub Actions pipeline extracts the version's\nsection to use as release notes. Malformed entries = bad release notes.\n\n## Step 6: Commit, tag, and push\n\n```bash\n# Stage the changed files\ngit add pyproject.toml agr/__init__.py CHANGELOG.md\n# Plus any docs files you updated\n\n# Commit\ngit commit -m \"release: vX.Y.Z\"\n\n# Tag\ngit tag vX.Y.Z\n\n# Push commit and tag\ngit push origin main\ngit push origin vX.Y.Z\n```\n\n**Wait for the user to confirm before pushing.** Show them a summary of what will be pushed:\n- The version being released\n- The changelog entry\n- Which files were modified\n- The tag that will be created\n\n## Step 7: Monitor the pipeline\n\nAfter pushing the tag, monitor the GitHub Actions pipeline:\n\n```bash\n# Watch the workflow run\ngh run list --workflow=publish.yml --limit=1\ngh run watch $(gh run list --workflow=publish.yml --limit=1 --json databaseId -q '.[0].databaseId')\n```\n\nThe pipeline has four stages:\n1. **Quality Checks** — ruff + pytest\n2. **Build Package** — `uv build` + verify\n3. **Publish to PyPI** — trusted publishing via OIDC\n4. **Create GitHub Release** — extracts notes from CHANGELOG.md\n\nIf any stage fails, read the logs and help the user fix it:\n\n```bash\ngh run view <run-id> --log-failed\n```\n\nCommon failure modes:\n- Quality checks fail → something slipped past local checks, fix and re-tag\n- PyPI publish fails → usually a version conflict (version already exists on PyPI)\n- Release notes extraction fails → changelog format issue\n\n## Step 8: Verify the release\n\nOnce the pipeline succeeds, confirm:\n\n```bash\n# Check PyPI (may take a minute to propagate)\npip index versions agr\n\n# Check the GitHub release exists\ngh release view vX.Y.Z\n```\n\nTell the user the release is live and share the links:\n- PyPI: https://pypi.org/project/agr/X.Y.Z/\n- GitHub Release: the URL from `gh release view`\n\n## If something goes wrong after pushing\n\nIf the pipeline fails and you need to retry:\n\n1. Fix the issue\n2. Delete the tag locally and remotely: `git tag -d vX.Y.Z && git push origin :refs/tags/vX.Y.Z`\n3. Amend the release commit if needed, or create a new fix commit\n4. Re-tag and re-push\n\nThis is destructive — confirm with the user before deleting tags.","tags":["agr","release","computerlovetech","agent-skills","agentic-engineering","claude-code"],"capabilities":["skill","source-computerlovetech","skill-agr-release","topic-agent-skills","topic-agentic-engineering","topic-claude-code"],"categories":["agr"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/computerlovetech/agr/agr-release","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add computerlovetech/agr","source_repo":"https://github.com/computerlovetech/agr","install_from":"skills.sh"}},"qualityScore":"0.666","qualityRationale":"deterministic score 0.67 from registry signals: · indexed on github topic:agent-skills · 432 github stars · SKILL.md body (6,009 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T18:53:36.956Z","embedding":null,"createdAt":"2026-04-18T22:01:33.832Z","updatedAt":"2026-05-02T18:53:36.956Z","lastSeenAt":"2026-05-02T18:53:36.956Z","tsv":"'/project/agr/x.y.z/':913 '0':241,778 '0.7.10':171,178,186,549 '0.7.11':172,191,550,557,559,563,565 '0.8.0':179 '1':124,212,513,577,596,764,774,785,937 '1.0.0':187 '2':135,311,589,790,941 '3':146,380,603,796,956 '4':491,613,804,969 '5':571 '6':662 '7':516,740 '8':868 'abbrev':240 'action':27,73,644,751 'ad':291,403,416 'add':280,604,673 'affect':468 'agr':2,8,45,58,889 'agr-releas':1 'agr/__init__.py':512,675 'alreadi':201,253,547,856 'also':244 'amend':957 'anyth':366 'api':414 'append':538 'aren':274 'ask':161,209 'b1':192,539,551,558 'b2':560,564 'backward':183 'backwards-compat':182 'bad':658 'base':523 'bash':226,339,667,753,825,877 'behavior':417 'behind':160 'beta':190,536,543,553,562,567 'branch':139 'break':188 'bug':173,300 'build':79,791,794 'bump':12,41,483,492 'calcul':519 'capabl':441 'catch':331 'categori':290,602 'chang':134,176,189,216,283,294,295,309,391,408,422,471,477,593,632,670 'changelog':14,279,289,574,629,638,727,864 'changelog.md':250,576,676,811 'check':20,78,245,314,325,343,348,364,381,787,836,842,878,890 'chose':534 'ci':327,377 'clean':125,378 'cli':400,443 'code':636 'come':143 'command':401,444 'commit':229,272,374,663,683,685,694,960,968 'common':832 'compat':184 'concis':620 'configuration.md':458 'confirm':710,876,980 'conflict':854 'consid':432 'continu':371 'creat':86,738,805,964 'cross':257 'cross-refer':256 'current':440,526 'cut':38 'd':427,950 'databaseid':776,779 'date':149,588 'dd':585 'delet':942,985 'depend':482 'describ':238 'descript':622 'destruct':979 'doc':305,383,390,394,430,679 'docs/docs':454 'docs/docs/index.md':446 'docs/docs/reference.md':442 'document':307 'documentation-on':306 'driven':65 'e2e':354 'empti':607 'enough':623 'entri':255,436,616,657,728 'etc':459 'everi':387 'everyth':95 'exist':297,465,548,857,894 'extract':646,808,862 'face':476 'fail':118,367,815,831,837,850,863,931 'failur':332,833 'featur':181,293,304 'figur':213 'file':220,452,671,680,730 'first':108,552 'fix':174,299,301,368,823,843,938,967 'flag':407 'format':347,639,865 'four':783 'full':53 'function':298 'get':449 'gh':758,765,768,826,895,919 'git':21,128,152,235,237,261,672,684,690,697,701,948,952 'github':26,72,88,643,750,806,892,914 'goe':924 'group':282 'handl':10 'head':242 'help':820 'importlib.metadata':505 'improv':481 'includ':598 'increment':541 'index':887 'intern':478 'issu':866,940 'job':91 'json':775 'judgement':393 'keep':287 'kind':165 'land':447 'last':232 'limit':763,773 'line':515 'link':909 'list':760,770 'live':497,905 'local':318,841,945 'log':236,262,818,830 'log-fail':829 'm':352,686 'main':138,145,700 'major':185 'major/minor/patch/beta':13 'make':155,264,590 'malform':656 'matter':640 'may':252,880 'minor':177 'minut':883 'miss':268 'mm':584 'mode':834 'modifi':732 'modul':411 'monitor':24,741,748 'move':488 'need':384,389,934,962 'network':357 'new':180,292,410,521,606,966 'next':555,561 'note':655,660,809,861 'noth':266,473 'notic':428 'number':544 'oidc':803 'one':546 'onelin':243 'origin':699,703,954 'packag':9,59,81,792 'page':448 'pass':376 'past':840 'patch':170,556 'pick':506 'pip':886 'pipelin':29,74,104,328,645,743,752,781,874,930 'plus':677 'point':437 'pre':17,194 'pre-releas':16,193 'precondit':115 'prepar':94 'primari':435 'proceed':320 'process':5,47,55 'promot':566 'propag':885 'publi':44 'public':413 'publish':28,82,797,801,849 'publish.yml':762,772 'pull':153 'push':66,102,666,693,698,702,712,721,745,927,953,976 'pypi':84,799,848,859,879,910 'pypi.org':912 'pypi.org/project/agr/x.y.z/':911 'pyproject.toml':499,514,674 'pytest':351,789 'q':777 'qualiti':19,77,313,786,835 're':158,846,971,975 're-push':974 're-tag':845,970 'read':634,816 'readme.md':433 'refactor':479 'refer':258,445 'reflect':276,439 'refs/tags/vx.y.z':955 'releas':3,4,18,40,46,54,61,89,140,167,195,225,233,373,388,530,537,654,659,687,725,807,860,871,893,896,903,915,920,959 'relev':456 'reli':420 'remot':151,947 'remov':302,303,404 'replac':578 'retri':936 'review':614 'right':601 'round':337 'round-trip':336 'ruff':342,346,788 'run':76,312,315,329,341,345,350,362,757,759,766,769,827 'runtim':510 'said':202 'save':334 'scan':627 'sdk.md':457 'section':248,609,650 'see':227 'share':907 'show':131,713 'sinc':230 'singl':501 'skill':32,49,460,462 'skill-agr-release' 'skip':484 'slip':839 'slow':360 'small':175 'someth':838,923 'sourc':502 'source-computerlovetech' 'stabl':569 'stage':668,784,814 'standard':286 'start':112,450 'status':129 'step':211,310,379,486,490,570,595,661,739,867 'stop':119 'succeed':105,875 'summari':716 'sure':156,265,591 'tag':22,64,69,100,234,239,664,689,691,696,734,747,847,944,949,972,986 'tag-driven':63 'take':881 'tell':121,899 'test':197,480 'three':317 'today':586 'top':612 'topic-agent-skills' 'topic-agentic-engineering' 'topic-claude-code' 'touch':218 'tree':127 'tri':109 'trigger':70 'trip':338 'trust':800 'truth':504 'ty':363 'type':204,531 'uncommit':133 'understand':221,630 'unreleas':247,579,608 'updat':15,385,395,572,682 'url':917 'use':30,392,652 'user':35,123,163,200,419,475,533,626,708,822,901,983 'user-fac':474 'usual':851 'uv':340,344,349,361,793 'verifi':113,795,869 'version':11,43,494,496,517,522,527,648,723,853,855,888 'via':511,802 'view':828,897,921 'vx.y.z':68,688,692,704,898,951 'wait':705 'walk':50 'want':36,206 'warrant':397 'watch':754,767 'way':425 'whenev':33 'without':633 'work':126 'workflow':756,761,771 'wrong':925 'x.y.z':518,581 'yyyi':583 'yyyy-mm-dd':582","prices":[{"id":"baf220e7-4df8-4a7b-954a-34327042a143","listingId":"2558c124-ab07-48a4-bec6-ce3352052d53","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"computerlovetech","category":"agr","install_from":"skills.sh"},"createdAt":"2026-04-18T22:01:33.832Z"}],"sources":[{"listingId":"2558c124-ab07-48a4-bec6-ce3352052d53","source":"github","sourceId":"computerlovetech/agr/agr-release","sourceUrl":"https://github.com/computerlovetech/agr/tree/main/skills/agr-release","isPrimary":false,"firstSeenAt":"2026-04-18T22:01:33.832Z","lastSeenAt":"2026-05-02T18:53:36.956Z"}],"details":{"listingId":"2558c124-ab07-48a4-bec6-ce3352052d53","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"computerlovetech","slug":"agr-release","github":{"repo":"computerlovetech/agr","stars":432,"topics":["agent-skills","agentic-engineering","claude-code"],"license":"mit","html_url":"https://github.com/computerlovetech/agr","pushed_at":"2026-05-01T06:54:32Z","description":"A package manager for AI agents. Install agent skills from GitHub with a single command.","skill_md_sha":"8f87e72499b8e640ddde6f0c11a1ec167bfae204","skill_md_path":"skills/agr-release/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/computerlovetech/agr/tree/main/skills/agr-release"},"layout":"multi","source":"github","category":"agr","frontmatter":{"name":"agr-release","description":"Release process for the agr package. Handles version bumping (major/minor/patch/beta), changelog updates, pre-release quality checks, git tagging, and monitoring the GitHub Actions publish pipeline. Use this skill whenever the user wants to cut a release, bump the version, publish to PyPI, or asks about the release process — even if they just say \"let's ship it\" or \"time for a new version\"."},"skills_sh_url":"https://skills.sh/computerlovetech/agr/agr-release"},"updatedAt":"2026-05-02T18:53:36.956Z"}}