diff --git a/.agents/skills/document-change/SKILL.md b/.agents/skills/document-change/SKILL.md new file mode 100644 index 0000000..059ed77 --- /dev/null +++ b/.agents/skills/document-change/SKILL.md @@ -0,0 +1,82 @@ +--- +name: document-change +description: Write the change file that every agentlink pull request must include. Use before opening a pull request, when CI fails the "Change documented" check, or when asked what version a change will release as. +--- + +# Documenting a change + +agentlink's changelog is never written by hand. Each pull request leaves a +**change file** in `.changeset/`, and the release compiles every pending file +into `CHANGELOG.md`, derives the version from them, and deletes them. + +CI fails a pull request that adds none. That check is the only thing standing +between a behaviour change and a release that cannot explain itself, so treat +"add the change file" as part of writing the code, not paperwork after it. + +## Write the file + +`knope document-change` prompts for the type and summary. Writing the file +directly is equally fine — it is `.changeset/.md`: + +```md +--- +default: minor +--- + +# `agentlink status` explains why a path is blocked + +Previously a blocked path reported only that it was blocked. It now names the +file it collided with and the command that resolves it. +``` + +The `#` heading is the entry a reader sees in the release notes; everything +below it is the detail. A heading with no body is rendered as a plain bullet, +which is the right shape for a one-line fix. + +## Choosing the type + +The front-matter key is the type. It picks both the changelog section and the +version bump: + +| Type | Section | Use for | +|---|---|---| +| `major` | Breaking changes | An existing workspace stops working, or needs a migration | +| `minor` | Added | A new command, flag, provider or capability | +| `changed` | Changed | Different behaviour that breaks nothing | +| `deprecated` | Deprecated | Still works, will be removed | +| `removed` | Removed | Gone | +| `patch` | Fixed | A bug fix | +| `security` | Security | A vulnerability or a hardening change | + +**agentlink is pre-1.0**, where semver treats the whole crate as unstable: +`minor` and below all land as a patch bump (0.0.2 → 0.0.3) and `major` moves the +minor (0.0.2 → 0.1.0). Pick the type that describes the change honestly and let +the version follow; do not inflate the type to force a version. + +A pull request may add several change files, and should when it makes more than +one change worth announcing. The release takes the largest bump among them. + +## When not to write one + +Refactors, tests, CI and documentation change nothing a user of the released +binary would notice. Those carry the **`no changelog`** label on the pull +request, which is what the CI check looks for. Reach for the label when the +answer to *"would someone reading the release notes care?"* is genuinely no — +not when writing the note is inconvenient. + +`feat(providers): add ` always needs one: a new provider is exactly the +kind of thing people upgrade to get. + +## Verifying + +`knope prepare-release --dry-run` prints the version and the changelog section +the pending files produce, without touching anything. CI runs the same command, +so malformed front matter fails on the pull request rather than at release. + +## What happens next + +Nothing else is manual. Merging to `main` opens a release pull request that +bumps the version, compiles `CHANGELOG.md` and empties `.changeset/`; merging +*that* tags the release and publishes binaries, the GitHub release, crates.io +and npm in one run. Never edit `CHANGELOG.md` or a version in `Cargo.toml` by +hand — the release pull request owns both, and a manual edit is overwritten. diff --git a/.changeset/.gitkeep b/.changeset/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/.changeset/knope-releases.md b/.changeset/knope-releases.md new file mode 100644 index 0000000..e30a383 --- /dev/null +++ b/.changeset/knope-releases.md @@ -0,0 +1,11 @@ +--- +default: changed +--- + +# Releases are cut from change files, not from hand-edited version numbers + +Every pull request now documents its own user-visible changes in a +`.changeset/` file, and CI refuses a pull request that adds none. Merging to +`main` opens a release pull request that compiles those files into +`CHANGELOG.md`, bumps the workspace version and empties `.changeset/`; merging +*that* tags the release and runs the whole publish pipeline in one go. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7e8dda9..d1fe04a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -96,6 +96,43 @@ jobs: - uses: Swatinem/rust-cache@v2 - run: cargo test -p agentlink-domain registry + # Releases are compiled from the change files in .changeset/, so a pull request + # that changes behaviour without leaving one ships invisibly — it would reach + # users with nothing in the changelog to explain it. This is the only thing + # standing between that and a release, so it is a required check. + # + # Work with genuinely nothing to announce (refactors, CI, tests, docs) carries + # the `no changelog` label instead. + change-file: + name: Change documented + if: >- + github.event_name == 'pull_request' + && github.head_ref != 'release' + && !contains(github.event.pull_request.labels.*.name, 'no changelog') + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + - name: Require a change file + run: | + git fetch --quiet origin "${{ github.base_ref }}" + added=$(git diff --name-only --diff-filter=A \ + "origin/${{ github.base_ref }}...HEAD" -- '.changeset/*.md') + if [ -z "$added" ]; then + echo "::error::This pull request adds no change file. Run 'knope document-change', or add the 'no changelog' label if it changes nothing a user would notice. See CONTRIBUTING.md#documenting-a-change." + exit 1 + fi + echo "Documented by:" + echo "$added" + - uses: knope-dev/action@v2.1.2 + with: + version: 0.23.0 + # Malformed front matter fails the release, long after the pull request + # that introduced it. Parsing it here reports it to the author instead. + - name: Check it parses + run: knope prepare-release --dry-run + deny: name: Licenses and advisories runs-on: ubuntu-latest diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml new file mode 100644 index 0000000..84c9c2c --- /dev/null +++ b/.github/workflows/prepare-release.yml @@ -0,0 +1,65 @@ +name: Prepare release + +# Every push to main refreshes the release pull request, so the next release is +# always visible as a diff: the version bump, the compiled changelog and the +# change files it consumed. Merging that pull request is what releases — see +# release.yml, which runs the whole pipeline in a single go. +on: + push: + branches: [main] + +permissions: + contents: read + +concurrency: + group: prepare-release + cancel-in-progress: false + +jobs: + prepare-release: + name: Refresh the release pull request + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + with: + # PrepareRelease reads tags and history to work out the last release. + fetch-depth: 0 + # Kept on deliberately: Knope pushes the `release` branch itself, so + # this job needs working git credentials, and they must outrank the + # default token for the reason given at the push step below. + token: ${{ secrets.RELEASE_PAT }} + + # Change files are the only source of a release, so their absence is the + # honest signal that there is nothing to prepare. Checking it here keeps + # Knope's own "nothing to release" case a real error rather than something + # routinely swallowed by continue-on-error. + - name: Is there anything to release? + id: pending + run: | + if ls .changeset/*.md >/dev/null 2>&1; then + echo "found=true" >> "$GITHUB_OUTPUT" + else + echo "No change files — nothing to release." + echo "found=false" >> "$GITHUB_OUTPUT" + fi + + - name: Configure git + if: steps.pending.outputs.found == 'true' + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + + - uses: knope-dev/action@v2.1.2 + if: steps.pending.outputs.found == 'true' + with: + version: 0.23.0 + + # Needs a token that can push a branch and open a pull request. It must be + # a PAT rather than GITHUB_TOKEN: GitHub deliberately does not run + # workflows on pull requests opened by GITHUB_TOKEN, which would leave the + # release pull request sitting with no CI on it. + - name: Open or refresh the release pull request + if: steps.pending.outputs.found == 'true' + run: knope prepare-release --verbose + env: + GITHUB_TOKEN: ${{ secrets.RELEASE_PAT }} diff --git a/.github/workflows/release-plz.yml b/.github/workflows/release-plz.yml deleted file mode 100644 index c4c4a4a..0000000 --- a/.github/workflows/release-plz.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Release-plz - -on: - push: - branches: [main] - -permissions: - contents: read - -jobs: - # Bumps Cargo.toml/Cargo.lock from Conventional Commits since the last tag - # and opens (or updates) a release PR. Never touches CHANGELOG.md — see - # release-plz.toml. - release-plz-pr: - name: Release-plz PR - runs-on: ubuntu-latest - if: github.repository_owner == 'fialhosoft' - permissions: - contents: write - pull-requests: write - concurrency: - group: release-plz-pr-${{ github.ref }} - cancel-in-progress: false - steps: - - uses: actions/checkout@v5 - with: - fetch-depth: 0 - persist-credentials: false - - uses: dtolnay/rust-toolchain@stable - - uses: release-plz/action@v0.5 - with: - command: release-pr - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - # Runs after the release PR is merged: the workspace version on main no - # longer matches the latest tag, so this creates and pushes `v{version}`. - # That tag push is what triggers release.yml to build and publish. - release-plz-tag: - name: Release-plz tag - runs-on: ubuntu-latest - if: github.repository_owner == 'fialhosoft' - permissions: - contents: write - steps: - - uses: actions/checkout@v5 - with: - fetch-depth: 0 - persist-credentials: false - - uses: dtolnay/rust-toolchain@stable - - uses: release-plz/action@v0.5 - with: - command: release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e3163be..ca17ba2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,13 +1,18 @@ name: Release +# Merging the release pull request that prepare-release.yml opened is the whole +# release. This workflow builds every target, then tags, publishes the GitHub +# release and pushes to crates.io and npm — in one run, from one merge. +# +# It deliberately does not trigger on a pushed tag. Knope creates the tag as +# part of this run, and a tag pushed by Actions does not start another workflow, +# so a tag trigger would silently never fire. on: - push: - tags: ["v*"] + pull_request: + types: [closed] + branches: [main] + # Re-running a release that failed partway, without merging anything. workflow_dispatch: - inputs: - tag: - description: Tag to release (e.g. v0.0.1) - required: true permissions: contents: read @@ -16,29 +21,11 @@ env: CARGO_TERM_COLOR: always jobs: - # Refuse to publish a tag whose version does not match the workspace, which is - # the most common way a release goes subtly wrong. - verify: - name: Verify tag matches Cargo.toml - runs-on: ubuntu-latest - outputs: - version: ${{ steps.check.outputs.version }} - steps: - - uses: actions/checkout@v5 - - id: check - run: | - tag="${{ github.event.inputs.tag || github.ref_name }}" - tag_version="${tag#v}" - cargo_version=$(grep -m1 '^version' Cargo.toml | cut -d'"' -f2) - if [ "$tag_version" != "$cargo_version" ]; then - echo "::error::tag $tag does not match workspace version $cargo_version" - exit 1 - fi - echo "version=$tag_version" >> "$GITHUB_OUTPUT" - build: name: Build ${{ matrix.target }} - needs: verify + if: >- + github.event_name == 'workflow_dispatch' + || (github.event.pull_request.merged == true && github.head_ref == 'release') runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -66,6 +53,11 @@ jobs: npm: win32-arm64 steps: - uses: actions/checkout@v5 + with: + # A pull_request event checks out a synthetic merge ref by default. + # Build the commit that actually landed on main, which is also the one + # the release gets tagged at. + ref: ${{ github.event.pull_request.merge_commit_sha || github.sha }} - uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} @@ -86,10 +78,13 @@ jobs: cargo build --release --target ${{ matrix.target }} -p agentlink-cli fi + # The version comes from the merge commit itself — the release pull + # request wrote it into Cargo.toml — so nothing has to be passed in or + # matched against a tag. - name: Package shell: bash run: | - version="${{ needs.verify.outputs.version }}" + version=$(grep -m1 '^version' Cargo.toml | cut -d'"' -f2) name="agentlink-$version-${{ matrix.target }}" mkdir -p "dist/$name" if [ "${{ runner.os }}" = "Windows" ]; then @@ -125,38 +120,40 @@ jobs: target/${{ matrix.target }}/release/agentlink.exe if-no-files-found: error + # Knope tags the merge commit, creates the GitHub release with the notes it + # compiled from the change files, and attaches everything in artifacts/. github-release: - name: Publish GitHub release - needs: [verify, build] + name: Tag and publish the GitHub release + needs: build runs-on: ubuntu-latest - permissions: - contents: write steps: - uses: actions/checkout@v5 + with: + # Tag the commit on main, not the synthetic pull_request merge ref. + ref: ${{ github.event.pull_request.merge_commit_sha || github.sha }} + fetch-depth: 0 + token: ${{ secrets.RELEASE_PAT }} - uses: actions/download-artifact@v5 with: pattern: dist-* merge-multiple: true - path: dist - - name: Extract this version's changelog section - run: | - awk '/^## \[${{ needs.verify.outputs.version }}\]/{f=1;next} /^## \[/{f=0} f' \ - CHANGELOG.md > release-notes.md - # Fall back to generated notes rather than shipping an empty release. - [ -s release-notes.md ] || echo "See CHANGELOG.md." > release-notes.md - - uses: softprops/action-gh-release@v2 + path: artifacts + - uses: knope-dev/action@v2.1.2 with: - files: dist/* - body_path: release-notes.md - generate_release_notes: true + version: 0.23.0 + - run: knope release --verbose + env: + GITHUB_TOKEN: ${{ secrets.RELEASE_PAT }} crates-io: name: Publish to crates.io - needs: [verify, build] + needs: github-release runs-on: ubuntu-latest environment: release steps: - uses: actions/checkout@v5 + with: + ref: ${{ github.event.pull_request.merge_commit_sha || github.sha }} - uses: dtolnay/rust-toolchain@stable # Order matters: dependencies must exist on the registry before dependents. - run: cargo publish -p agentlink-domain @@ -171,7 +168,7 @@ jobs: npm: name: Publish to npm - needs: [verify, build] + needs: github-release runs-on: ubuntu-latest environment: release permissions: @@ -179,6 +176,8 @@ jobs: id-token: write steps: - uses: actions/checkout@v5 + with: + ref: ${{ github.event.pull_request.merge_commit_sha || github.sha }} - uses: actions/setup-node@v5 with: node-version: 22 @@ -187,8 +186,11 @@ jobs: with: pattern: bin-* path: binaries + - name: Read the released version + id: version + run: echo "version=$(grep -m1 '^version' Cargo.toml | cut -d'"' -f2)" >> "$GITHUB_OUTPUT" - name: Assemble packages - run: node scripts/build-npm.mjs ${{ needs.verify.outputs.version }} binaries + run: node scripts/build-npm.mjs ${{ steps.version.outputs.version }} binaries - name: Publish # Provenance ties each published tarball to this workflow run. run: | diff --git a/AGENTS.md b/AGENTS.md index b593bc5..3cb92a3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -23,8 +23,25 @@ cargo test # unit + integration, ~1s cargo clippy --all-targets # must be clean cargo fmt # rustfmt.toml, 100 columns cargo run -p agentlink-cli -- status +knope document-change # the change file every pull request needs ``` +## Never open a pull request without a change file + +Every pull request that changes what a user sees adds a file to `.changeset/`. +CI fails without one, and the release is compiled from those files — so a +missing change file means a release that cannot explain itself. + +The [document-change skill](.agents/skills/document-change/SKILL.md) has the +format and the type table. In short: `.changeset/.md`, front matter +`default: `, a `#` heading that reads as the release note. + +Work that changes nothing observable — refactors, tests, CI, docs — takes the +`no changelog` label on the pull request instead. + +**Never hand-edit `CHANGELOG.md` or a version in `Cargo.toml`.** The release +pull request writes both from the change files, and a manual edit is discarded. + ## Architecture ```text diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c82a39..869a1d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,12 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Entries below v0.1.0 describe a pre-release API that may change. -## [Unreleased] +Nothing is written here by hand. Each pull request adds a change file under +[`.changeset/`](.changeset/), and the release compiles them into the section +below — so unreleased changes live in that directory, not in this file. See +[CONTRIBUTING.md](CONTRIBUTING.md#documenting-a-change) for how to write one. -## [0.0.2] — 2026-08-02 +## 0.0.2 (2026-08-02) ### Added @@ -24,7 +27,7 @@ Entries below v0.1.0 describe a pre-release API that may change. created for it, announced by `status` before `apply` performs it. A path that no longer matches what agentlink created is kept and simply disowned. -## [0.0.1] — 2026-08-01 +## 0.0.1 (2026-08-01) First release. Shares **instructions** and **skills** across six AI coding agents without copying a single file. @@ -62,7 +65,3 @@ without copying a single file. the workspace. - `#![forbid(unsafe_code)]` across every crate. - No network access, no code execution, no telemetry. - -[Unreleased]: https://github.com/fialhosoft/agentlink/compare/v0.0.2...HEAD -[0.0.2]: https://github.com/fialhosoft/agentlink/compare/v0.0.1...v0.0.2 -[0.0.1]: https://github.com/fialhosoft/agentlink/releases/tag/v0.0.1 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b0f3346..9c1cb1f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -131,27 +131,78 @@ not `test_apply_3`. A failing test name should tell a stranger what broke. ## Commits and pull requests -We use [Conventional Commits](https://www.conventionalcommits.org/). release-plz -derives the version bump from the prefix and opens the release PR, so it is -load-bearing. **We are pre-1.0**, where semver treats the whole crate as -unstable, so `feat` and `fix` both land as a patch bump and only a breaking -change moves the minor version: +We use [Conventional Commits](https://www.conventionalcommits.org/) — commit +subjects are for people reading the history. Provider additions are +`feat(providers): add `. -- `feat:`, `fix:` → patch bump (e.g. 0.1.2 → 0.1.3) -- `feat!:` or a `BREAKING CHANGE:` footer → minor bump (e.g. 0.1.2 → 0.2.0) -- `docs:`, `chore:`, `refactor:`, `test:`, `ci:` → no release +Release notes come from change files rather than commit subjects, so the prefix +carries no versioning weight. That is the next section. -Once agentlink reaches 1.0, this reverts to ordinary semver: `feat` → minor, -`fix` → patch, `feat!`/`BREAKING CHANGE` → major. +Small pull requests, please. Each one should leave the project working. -Provider additions are `feat(providers): add `. +## Documenting a change -CHANGELOG.md itself is still hand-written, under `## [Unreleased]`, as part of -the same pull request as the change — release-plz never touches it. Cutting a -release means renaming that heading to `## [x.y.z] — date` inside the release -PR before merging it. +**Every pull request that changes what a user sees adds a change file**, and CI +fails without one. `CHANGELOG.md` is never edited by hand; the release compiles +it from these files. -Small pull requests, please. Each one should leave the project working. +```console +knope document-change +``` + +That prompts for a type and a summary and writes `.changeset/.md`. Writing +the file yourself is equally fine: + +```md +--- +default: minor +--- + +# `agentlink status` explains why a path is blocked + +Previously a blocked path reported only that it was blocked. It now names the +file it collided with and the command that resolves it. +``` + +The `#` heading is what a reader sees in the release notes; the body is the +detail, and a heading with no body renders as a plain bullet. The type sets both +the changelog section and the version bump: + +| Type | Section | Use for | +|---|---|---| +| `major` | Breaking changes | An existing workspace stops working, or needs a migration | +| `minor` | Added | A new command, flag, provider or capability | +| `changed` | Changed | Different behaviour that breaks nothing | +| `deprecated` | Deprecated | Still works, will be removed | +| `removed` | Removed | Gone | +| `patch` | Fixed | A bug fix | +| `security` | Security | A vulnerability or a hardening change | + +We are **pre-1.0**, where semver treats the whole crate as unstable: `minor` and +below all land as a patch bump (0.0.2 → 0.0.3), and `major` moves the minor +(0.0.2 → 0.1.0). Describe the change honestly and let the version follow — +inflating the type to force a version helps nobody. + +`knope prepare-release --dry-run` prints the resulting version and changelog +section without changing anything. CI runs the same command, so malformed front +matter fails on the pull request rather than at release. + +Work that changes nothing observable — refactors, tests, CI, documentation — +takes the **`no changelog`** label on the pull request instead. Use it when +nobody reading the release notes would care, not when the note is inconvenient. + +## How a release happens + +Nothing here is manual, and no tag is ever pushed by hand: + +1. Merging to `main` opens (or refreshes) a **release pull request**. It bumps + the workspace version, compiles the pending change files into `CHANGELOG.md` + and empties `.changeset/`. +2. Merging *that* pull request tags the release and, in the same run, builds + every target and publishes the GitHub release, crates.io and npm. + +So a release is reviewable as a diff before it happens, and a maintainer merges +exactly twice: your pull request, then the release pull request. ## Reporting a bug diff --git a/knope.toml b/knope.toml new file mode 100644 index 0000000..8b24403 --- /dev/null +++ b/knope.toml @@ -0,0 +1,96 @@ +# Release automation. See CONTRIBUTING.md for the workflow this implements. +# +# Every user-visible change arrives with a change file in .changeset/. Knope +# compiles those files into CHANGELOG.md, derives the version bump from them, +# and deletes them — so the changelog is a product of the pull requests that +# made it, never something remembered at release time. + +[package] +# The version lives in [workspace.package]; the three crates inherit it with +# `version.workspace = true`, so this file is the only place it is written. +# The `dependency` entries keep the intra-workspace pins in lockstep with it — +# agentlink-cli depends on agentlink-fs depends on agentlink-domain, and a +# mismatch there is a broken publish to crates.io. +versioned_files = [ + "Cargo.toml", + { path = "Cargo.toml", dependency = "agentlink-domain" }, + { path = "Cargo.toml", dependency = "agentlink-fs" }, + { path = "Cargo.lock", dependency = "agentlink-domain" }, + { path = "Cargo.lock", dependency = "agentlink-fs" }, + { path = "Cargo.lock", dependency = "agentlink-cli" }, +] +changelog = "CHANGELOG.md" +# The build jobs download every archive and checksum into artifacts/, and the +# Release step attaches them. Knope creates the tag and the release together, +# so nothing has to infer a tag from the ref it happens to be running on. +assets = "artifacts/*" + +# Knope's built-in sections are named for semver impact (Breaking changes / +# Features / Fixes). CHANGELOG.md promises Keep a Changelog, so the sections are +# renamed to match it. The `types` are what you pick in `knope document-change` +# and write in a change file's front matter; everything below `major`/`minor` +# is a patch bump, which is what pre-1.0 semver wants anyway. +extra_changelog_sections = [ + { types = ["major"], name = "Breaking changes" }, + { types = ["minor"], name = "Added" }, + { types = ["changed"], name = "Changed" }, + { types = ["deprecated"], name = "Deprecated" }, + { types = ["removed"], name = "Removed" }, + { types = ["patch"], name = "Fixed" }, + { types = ["security"], name = "Security", footers = ["Security"] }, +] + +# Opens (or refreshes) the release pull request. Run from CI on every push to +# main; the branch is disposable, so the push is a force-push. +[[workflows]] +name = "prepare-release" + +[[workflows.steps]] +type = "Command" +command = "git switch -c release" + +[[workflows.steps]] +type = "PrepareRelease" + +[[workflows.steps]] +type = "Command" +command = "git commit -m \"chore: prepare release $version\"" + +[[workflows.steps]] +type = "Command" +command = "git push --force --set-upstream origin release" + +[[workflows.steps]] +type = "CreatePullRequest" +base = "main" + +[workflows.steps.title] +template = "chore: prepare release $version" + +[workflows.steps.body] +template = """Merging this pull request releases $version. + +Knope built it from the change files in `.changeset/`. Merging it tags the +release and runs the whole publish pipeline — binaries, GitHub release, +crates.io and npm — in a single run. Nothing else needs to be triggered. + +$changelog""" + +# Tags the merge commit and publishes the GitHub release. Runs once the release +# pull request above is merged. +[[workflows]] +name = "release" + +[[workflows.steps]] +type = "Release" + +[changes] +# Change files are the only source of release notes. Conventional commits still +# decide nothing here on purpose: a commit subject is written for reviewers of a +# diff, a change file is written for the person reading the release. Letting +# both feed the changelog would also list the same change twice. +ignore_conventional_commits = true + +[github] +owner = "fialhosoft" +repo = "agentlink" diff --git a/release-plz.toml b/release-plz.toml deleted file mode 100644 index 40252ca..0000000 --- a/release-plz.toml +++ /dev/null @@ -1,29 +0,0 @@ -# release-plz opens a PR that bumps the workspace version from Conventional -# Commits since the last tag. Merging it pushes a `v{version}` tag, which is -# what .github/workflows/release.yml actually builds and publishes from. -# -# CHANGELOG.md stays hand-written: agentlink's entries carry prose and ADR -# links that a commit-log-derived changelog can't produce, so release-plz is -# not allowed to touch it. Renaming "## [Unreleased]" to the release heading -# is still a manual edit made inside the release PR before merging it. -[workspace] -changelog_update = false -git_tag_enable = true -git_release_enable = false -publish = false -pr_name = "chore: release v{{ version }}" -pr_labels = ["release"] - -# All three crates are pinned to [workspace.package] version and always ship -# together, so they must bump in lockstep rather than independently. -[[package]] -name = "agentlink-domain" -version_group = "agentlink" - -[[package]] -name = "agentlink-fs" -version_group = "agentlink" - -[[package]] -name = "agentlink-cli" -version_group = "agentlink"