From 4b5534cd58a0c6f01f138a72dc903c6278815432 Mon Sep 17 00:00:00 2001 From: Amp Date: Fri, 18 Sep 2026 15:14:52 +0000 Subject: [PATCH 1/2] Update first release notes and release preparation Amp-Thread-ID: https://ampcode.com/threads/T-01a0b136-a9ee-71f8-ab99-951c7396e2b8 Co-authored-by: Yoel Rosenthal <2001053@pm.me> --- .github/workflows/release.yml | 39 ++++++++++++++++++++--------- CHANGELOG.md | 18 +++++++++++--- Cargo.toml | 2 +- README.md | 46 ++++++++++++++++++++++++++++++++--- 4 files changed, 86 insertions(+), 19 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e60178c..0b0a014 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -40,6 +40,28 @@ jobs: - run: cargo fmt --all -- --check - run: cargo clippy --all-targets -- -D warnings - run: cargo test --all --locked + - name: Extract release notes from changelog + shell: python + run: | + import os + import re + from pathlib import Path + + version = os.environ["GITHUB_REF_NAME"].removeprefix("v") + changelog = Path("CHANGELOG.md").read_text() + sections = re.findall( + rf"^## \[{re.escape(version)}\] - \d{{4}}-\d{{2}}-\d{{2}}\n(.*?)(?=^## |\Z)", + changelog, + re.MULTILINE | re.DOTALL, + ) + if len(sections) != 1 or not sections[0].strip(): + raise SystemExit(f"Expected one nonempty CHANGELOG.md entry for {version}") + Path("RELEASE_NOTES.md").write_text(sections[0].strip() + "\n") + - uses: actions/upload-artifact@v7 + with: + name: release-notes + path: RELEASE_NOTES.md + if-no-files-found: error build-binaries: name: Build ${{ matrix.target }} @@ -61,7 +83,7 @@ jobs: archive: tar.gz cross: true - target: x86_64-apple-darwin - os: macos-13 + os: macos-15-intel archive: tar.gz cross: false - target: aarch64-apple-darwin @@ -132,20 +154,13 @@ jobs: needs: build-binaries runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7 - with: - fetch-depth: 0 - - - name: Install git-cliff - uses: taiki-e/install-action@v2.87.12 + - uses: actions/download-artifact@v8 with: - tool: git-cliff - - - name: Generate release notes - run: git-cliff --current --strip header --output RELEASE_NOTES.md + name: release-notes - uses: actions/download-artifact@v8 with: + pattern: agent-p-* path: artifacts merge-multiple: true @@ -183,6 +198,7 @@ jobs: steps: - uses: actions/download-artifact@v8 with: + pattern: agent-p-* path: artifacts merge-multiple: true @@ -271,6 +287,7 @@ jobs: steps: - uses: actions/download-artifact@v8 with: + pattern: agent-p-* path: artifacts merge-multiple: true diff --git a/CHANGELOG.md b/CHANGELOG.md index b185ea0..81e6e16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,19 @@ All notable changes to this project will be documented in this file. ## [Unreleased] -## [0.1.0] - 2026-09-15 +## [0.1.0] - 2026-09-18 -### Changes +Initial public release of AgentP, a podcast downloader with an interactive terminal interface and a scriptable CLI. -- Initial public release: download and tag podcast episodes from a TUI or CLI. -- Initial release flow setup: CI, release workflow, cargo-release and git-cliff configs, packaging metadata, LICENSE, README, CHANGELOG. +### Added + +- Browse RSS podcast feeds, preview the latest episode, and select episodes for download in a Dracula-themed terminal interface. +- Add podcasts manually or prepopulate their name, album, and artist from feed metadata; edit, reorder, and delete podcasts from the library. +- Download selected episodes, the latest or oldest episodes, or an entire feed through the CLI, using podcast names or 1-based indices. +- Customize ID3 title, album, artist, and album-artist tags; remove existing tags or artwork; rename files and add zero-padded episode-number prefixes. +- Organize downloads into per-podcast folders with a configurable download location and reusable defaults for new podcasts. +- Override the audio-download User-Agent per podcast for hosts that reject the default client. +- Search actions through the command palette, navigate lists with keyboard shortcuts, and paste into text fields from the clipboard. +- Choose TUI or CLI as the default mode and select a joined or ASCII banner for terminal compatibility. +- Save configuration as JSON, seed new installations with demo podcasts, and accept legacy podcast option names. +- Provide release archives for Linux (x86_64 GNU, x86_64 musl, and ARM64), macOS (Intel and Apple Silicon), and Windows (x86_64), with Cargo, Homebrew, and Scoop distribution workflows. diff --git a/Cargo.toml b/Cargo.toml index d9db72d..3a93529 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "agent-p" version = "0.1.0" edition = "2024" -rust-version = "1.87" +rust-version = "1.88" authors = ["ByteMagic Inc "] description = "A fast podcast downloader with customizable ID3 tagging" license = "GPL-3.0-only" diff --git a/README.md b/README.md index b69eac3..ba7e58b 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ |---|---| | **Homebrew** · macOS and Linux | `brew install ByteMagicInc/tap/agent-p` | | **Scoop** · Windows | `scoop bucket add bytemagicinc https://github.com/ByteMagicInc/scoop-bucket`
`scoop install agent-p` | -| **Cargo** · Rust 1.87+ | `cargo install agent-p` | +| **Cargo** · Rust 1.88+ | `cargo install agent-p --locked` | | **Pre-built binary** | Download an archive from [GitHub Releases](https://github.com/ByteMagicInc/AgentP/releases) and place `agentp` on your `PATH`. | > [!TIP] @@ -60,6 +60,8 @@ The first launch creates your configuration, seeds a set of demo podcasts, and p Press `c` to add your own feeds, change the download folder, and set the defaults for new podcasts. +AgentP comes with my favorite podcasts so you can see how different per-podcast configs are applied. + ### Scriptable CLI ```sh @@ -322,12 +324,12 @@ When `overwrite_tags` is on, AgentP writes the title, album, and artist plus alb ## Building from source -Requires Rust 1.87+ (edition 2024). The binary lands at `target/release/agentp`. +Requires Rust 1.88+ (edition 2024). The binary lands at `target/release/agentp`. ```sh git clone https://github.com/ByteMagicInc/AgentP.git cd AgentP -cargo build --release +cargo build --release --locked ``` Before opening a pull request, run what CI runs: @@ -340,6 +342,44 @@ cargo fmt --all -- --check && cargo clippy --all-targets -- -D warnings && cargo Issues and PRs welcome at . See [AGENTS.md](AGENTS.md) for architecture details. Start commit messages with `Fix`, `Add`, `Refactor`, or `Update` so the changelog groups them correctly. +## Releasing (maintainers) + +Pushing a `v*` tag starts the release workflow: it verifies the version and changelog, runs checks, builds six platform archives, creates a public GitHub release using the matching `CHANGELOG.md` entry, publishes to crates.io, and updates Homebrew and Scoop for stable versions. + +Before the first release: + +1. Configure the repository Actions secret `CARGO_REGISTRY_TOKEN` with permission to publish `agent-p` on crates.io; confirm the crate name is available or owned by the publishing account. +2. Ensure `ByteMagicInc/homebrew-tap` and `ByteMagicInc/scoop-bucket` exist with initialized default branches. Configure `TAP_GITHUB_TOKEN` with contents read/write access to both repositories. +3. Confirm Actions can create releases in this repository and that CI passes on the exact commit being released. +4. Review the `0.1.0` changelog entry and set its date to the actual release date. Keep `Cargo.toml` and `Cargo.lock` at `0.1.0`. +5. Run the local checks and packaging verification: + + ```sh + cargo fmt --all -- --check + cargo clippy --all-targets --all-features --locked -- -D warnings + cargo test --all --locked + cargo package --locked + ``` + +Once the release preparation is committed and pushed to `master`, tag that commit directly for the first release: + +```sh +git switch master +git pull --ff-only +git tag -a v0.1.0 -m "Release 0.1.0" +git push origin v0.1.0 +``` + +**The tag push publishes externally.** Do it only when ready to ship, then check every release job, the attached archives, and the package-manager installs. Do not run `cargo release` for this first tag: `0.1.0` is already versioned and has its own changelog entry. + +For later releases, record changes under **Unreleased**, preview `cargo release patch` (or `minor`/`major`), and use `--execute` only after reviewing the dry run. `release.toml` updates the version and changelog, tags, and pushes; the GitHub workflow handles publishing. `git-cliff` can help draft notes, but the reviewed changelog is the source for published release notes. + +### Drafting the changelog + +Install the maintainer tools with `cargo install cargo-release git-cliff --locked`. Run `git-cliff --unreleased --strip header` to print a draft from commits since the latest release tag, grouped by the rules in `cliff.toml`. Review and copy the relevant bullets into the existing **Unreleased** section; do not overwrite the curated changelog or remove its `` marker. + +On later releases, `cargo release` turns **Unreleased** into the versioned, dated entry and inserts a new empty **Unreleased** section. The GitHub workflow extracts that version's entry verbatim rather than regenerating notes from commits, and rejects missing, empty, or duplicate entries. + ## License [GPL-3.0-only](LICENSE) © 2026 ByteMagic Inc. From 5efe3db02b883f0059f1b9afc843f8f704e11e2c Mon Sep 17 00:00:00 2001 From: Amp Date: Fri, 18 Sep 2026 15:18:17 +0000 Subject: [PATCH 2/2] Update release documentation to a short standalone guide Amp-Thread-ID: https://ampcode.com/threads/T-01a0b136-a9ee-71f8-ab99-951c7396e2b8 Co-authored-by: Yoel Rosenthal <2001053@pm.me> --- README.md | 38 +------------------------------------- docs/releasing.md | 10 ++++++++++ 2 files changed, 11 insertions(+), 37 deletions(-) create mode 100644 docs/releasing.md diff --git a/README.md b/README.md index ba7e58b..e707727 100644 --- a/README.md +++ b/README.md @@ -342,43 +342,7 @@ cargo fmt --all -- --check && cargo clippy --all-targets -- -D warnings && cargo Issues and PRs welcome at . See [AGENTS.md](AGENTS.md) for architecture details. Start commit messages with `Fix`, `Add`, `Refactor`, or `Update` so the changelog groups them correctly. -## Releasing (maintainers) - -Pushing a `v*` tag starts the release workflow: it verifies the version and changelog, runs checks, builds six platform archives, creates a public GitHub release using the matching `CHANGELOG.md` entry, publishes to crates.io, and updates Homebrew and Scoop for stable versions. - -Before the first release: - -1. Configure the repository Actions secret `CARGO_REGISTRY_TOKEN` with permission to publish `agent-p` on crates.io; confirm the crate name is available or owned by the publishing account. -2. Ensure `ByteMagicInc/homebrew-tap` and `ByteMagicInc/scoop-bucket` exist with initialized default branches. Configure `TAP_GITHUB_TOKEN` with contents read/write access to both repositories. -3. Confirm Actions can create releases in this repository and that CI passes on the exact commit being released. -4. Review the `0.1.0` changelog entry and set its date to the actual release date. Keep `Cargo.toml` and `Cargo.lock` at `0.1.0`. -5. Run the local checks and packaging verification: - - ```sh - cargo fmt --all -- --check - cargo clippy --all-targets --all-features --locked -- -D warnings - cargo test --all --locked - cargo package --locked - ``` - -Once the release preparation is committed and pushed to `master`, tag that commit directly for the first release: - -```sh -git switch master -git pull --ff-only -git tag -a v0.1.0 -m "Release 0.1.0" -git push origin v0.1.0 -``` - -**The tag push publishes externally.** Do it only when ready to ship, then check every release job, the attached archives, and the package-manager installs. Do not run `cargo release` for this first tag: `0.1.0` is already versioned and has its own changelog entry. - -For later releases, record changes under **Unreleased**, preview `cargo release patch` (or `minor`/`major`), and use `--execute` only after reviewing the dry run. `release.toml` updates the version and changelog, tags, and pushes; the GitHub workflow handles publishing. `git-cliff` can help draft notes, but the reviewed changelog is the source for published release notes. - -### Drafting the changelog - -Install the maintainer tools with `cargo install cargo-release git-cliff --locked`. Run `git-cliff --unreleased --strip header` to print a draft from commits since the latest release tag, grouped by the rules in `cliff.toml`. Review and copy the relevant bullets into the existing **Unreleased** section; do not overwrite the curated changelog or remove its `` marker. - -On later releases, `cargo release` turns **Unreleased** into the versioned, dated entry and inserts a new empty **Unreleased** section. The GitHub workflow extracts that version's entry verbatim rather than regenerating notes from commits, and rejects missing, empty, or duplicate entries. +Maintainers: see the short [release guide](docs/releasing.md). ## License diff --git a/docs/releasing.md b/docs/releasing.md new file mode 100644 index 0000000..4d7bd0e --- /dev/null +++ b/docs/releasing.md @@ -0,0 +1,10 @@ +# Releasing + +Install the tools with `cargo install cargo-release git-cliff --locked`. + +1. Update **Unreleased** in `CHANGELOG.md`. Optionally draft notes with `git-cliff --unreleased --strip header`; review and copy the relevant bullets without replacing the file or its `` marker. +2. Commit the notes, ensure CI passes, and start from a clean, up-to-date `master`. +3. Preview `cargo release patch` (use `minor` or `major` as appropriate). Review the version and changelog changes. +4. Run `cargo release patch --execute` with the same version level when ready to publish. + +`cargo release` runs tests, updates the version and changelog, creates a fresh **Unreleased** section, then commits, tags, and pushes. The tag triggers GitHub Actions to build archives, publish the reviewed changelog entry as release notes, publish to crates.io, and update Homebrew and Scoop for stable releases. Check that all release jobs succeed.