From 37c7385e8882fb0015cd31f28e51cef46ae11a1a Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 6 Jul 2026 17:28:09 +0000 Subject: [PATCH 1/5] ci: add changelog workflow to run changelog-generator skill on release Fires on release:published (after release-please cuts a release) and runs the shared changelog-generator plugin skill via the Claude Code Action. The skill reads Linear issues, opens an auto-merging PR to the Fern docs repo, posts to Slack, and drafts a Discord announcement into the private review channel. Reuses the existing APP_CLIENT_ID/APP_PRIVATE_KEY GitHub App; the token is scoped to the source, Fern docs, and (private) marketplace repos. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_0149AsooRHGtpNo4NA5eNUwW --- .github/workflows/changelog.yml | 73 +++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 .github/workflows/changelog.yml diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml new file mode 100644 index 000000000..707a88722 --- /dev/null +++ b/.github/workflows/changelog.yml @@ -0,0 +1,73 @@ +name: Changelog + +# Publishes the release changelog when a GitHub Release is published (i.e. after +# release-please's release PR is merged on main). Runs the shared +# `changelog-generator` skill via the Claude Code Action, which: +# - reads merged Linear issues for the version (Linear GraphQL API) +# - opens a PR to the Fern docs repo and enables auto-merge +# - posts the announcement to Slack (incoming webhook) +# - drafts the announcement into the private Discord review channel (webhook) +# - writes back a Linear Release + release notes (Linear GraphQL API) + +on: + release: + types: [published] + workflow_dispatch: + inputs: + tag: + description: "Release tag to generate the changelog for (defaults to latest release)" + required: false + type: string + +# Never run two changelog jobs for the same ref at once. +concurrency: + group: changelog-${{ github.ref }} + cancel-in-progress: false + +permissions: + contents: read + +jobs: + changelog: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 # full history so the skill can diff the release range + + - name: Generate GitHub App token + id: app-token + uses: actions/create-github-app-token@v3 + with: + client-id: ${{ secrets.APP_CLIENT_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + owner: band-ai + # Scope the token to exactly the repos the skill touches. The App must + # be installed on every repo listed here. + repositories: | + band-sdk-python + fern-config # TODO(devops): replace with the real Fern docs repo name + claude-plugins # only required while the marketplace repo is private + + - name: Generate and publish changelog + uses: anthropics/claude-code-action@v1 + with: + anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} + github_token: ${{ steps.app-token.outputs.token }} + plugin_marketplaces: "https://github.com/band-ai/claude-plugins.git" + plugins: "changelog-generator@band-plugins" + prompt: "/changelog-generator:generate ${{ github.event.release.tag_name || inputs.tag }}" + claude_args: | + --allowedTools "Bash,Read,Write,Edit,Glob,Grep" + --max-turns 30 + env: + # gh CLI + git use this token for the source repo and the Fern docs repo. + GH_TOKEN: ${{ steps.app-token.outputs.token }} + # Slack: posted live to the announcement channel. + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + # Discord: drafted into the private review channel for a human to forward. + DISCORD_DRAFT_WEBHOOK_URL: ${{ secrets.DISCORD_DRAFT_WEBHOOK_URL }} + # Linear: read issues + write the Release entry via GraphQL. + LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }} From 66397820b290fc9de26feffc4b89c60d6233c4ea Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 7 Jul 2026 07:55:45 +0000 Subject: [PATCH 2/5] ci: point changelog workflow at real repos + add per-repo config Use the private marketplace repo band-ai/private-agent-skills (marketplace name private-agent-skills) and the Fern docs repo band-ai/fern. Add .band/changelog.yml holding the non-secret per-repo config the skill reads (Fern repo/path, Linear team filter). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_0149AsooRHGtpNo4NA5eNUwW --- .band/changelog.yml | 17 +++++++++++++++++ .github/workflows/changelog.yml | 8 ++++---- 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 .band/changelog.yml diff --git a/.band/changelog.yml b/.band/changelog.yml new file mode 100644 index 000000000..3f43e3666 --- /dev/null +++ b/.band/changelog.yml @@ -0,0 +1,17 @@ +# Per-repo config for the changelog-generator skill +# (changelog-generator@private-agent-skills), read from this repo's working tree +# at run time. NON-SECRET values only — secrets come from the workflow env: +# LINEAR_API_KEY, SLACK_WEBHOOK_URL, DISCORD_DRAFT_WEBHOOK_URL. + +# Fern docs repo that receives the changelog PR (auto-merged after Fern CI passes). +fern_repo: band-ai/fern +# Path within the Fern repo where changelog entries live. Match the layout of the +# newest existing entry in that repo. +fern_changelog_path: fern/pages/changelog # TODO: confirm against band-ai/fern + +# Linear: how to find the issues that belong to this SDK's releases. The skill +# queries the Linear GraphQL API and also matches issue identifiers (e.g. SDK-123) +# found in the release's merged PRs. Set at least the team key. +linear: + team_key: SDK # TODO: confirm this repo's Linear team key + # project: "Python SDK" # optional: narrow further by project name diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 707a88722..3024dc11b 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -48,16 +48,16 @@ jobs: # be installed on every repo listed here. repositories: | band-sdk-python - fern-config # TODO(devops): replace with the real Fern docs repo name - claude-plugins # only required while the marketplace repo is private + fern # Fern docs repo (github.com/band-ai/fern) + private-agent-skills # private marketplace repo the skill is installed from - name: Generate and publish changelog uses: anthropics/claude-code-action@v1 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} github_token: ${{ steps.app-token.outputs.token }} - plugin_marketplaces: "https://github.com/band-ai/claude-plugins.git" - plugins: "changelog-generator@band-plugins" + plugin_marketplaces: "https://github.com/band-ai/private-agent-skills.git" + plugins: "changelog-generator@private-agent-skills" prompt: "/changelog-generator:generate ${{ github.event.release.tag_name || inputs.tag }}" claude_args: | --allowedTools "Bash,Read,Write,Edit,Glob,Grep" From fdcd68b744d0406a3b714b377f4c31cf0648abb3 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 7 Jul 2026 07:57:05 +0000 Subject: [PATCH 3/5] ci: authenticate git for the private marketplace clone The action clones band-ai/private-agent-skills to install the plugin; since that repo is private, rewrite its URL to use the scoped App token so the clone works. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_0149AsooRHGtpNo4NA5eNUwW --- .github/workflows/changelog.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 3024dc11b..e45bb6328 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -51,6 +51,15 @@ jobs: fern # Fern docs repo (github.com/band-ai/fern) private-agent-skills # private marketplace repo the skill is installed from + # The marketplace repo is private, so the action needs credentials to clone + # it. Rewrite only that repo's URL to use the App token (scoped narrowly so + # other github.com fetches are unaffected). + - name: Allow cloning the private marketplace repo + run: | + git config --global \ + url."https://x-access-token:${{ steps.app-token.outputs.token }}@github.com/band-ai/private-agent-skills".insteadOf \ + "https://github.com/band-ai/private-agent-skills" + - name: Generate and publish changelog uses: anthropics/claude-code-action@v1 with: From af311fc8c6934d41d0e9caf56913af3fa5ae538d Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 8 Jul 2026 12:14:32 +0000 Subject: [PATCH 4/5] ci: open a draft Fern PR instead of auto-merging For the first iteration, the skill opens a draft PR to the Fern docs repo for a human to review and merge, rather than enabling auto-merge. Drops the need for "Allow auto-merge" and branch protection on the Fern repo. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_0149AsooRHGtpNo4NA5eNUwW --- .band/changelog.yml | 2 +- .github/workflows/changelog.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.band/changelog.yml b/.band/changelog.yml index 3f43e3666..aebdedb33 100644 --- a/.band/changelog.yml +++ b/.band/changelog.yml @@ -3,7 +3,7 @@ # at run time. NON-SECRET values only — secrets come from the workflow env: # LINEAR_API_KEY, SLACK_WEBHOOK_URL, DISCORD_DRAFT_WEBHOOK_URL. -# Fern docs repo that receives the changelog PR (auto-merged after Fern CI passes). +# Fern docs repo that receives the changelog PR (opened as a DRAFT for a human to review and merge). fern_repo: band-ai/fern # Path within the Fern repo where changelog entries live. Match the layout of the # newest existing entry in that repo. diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index e45bb6328..d15efb111 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -4,7 +4,7 @@ name: Changelog # release-please's release PR is merged on main). Runs the shared # `changelog-generator` skill via the Claude Code Action, which: # - reads merged Linear issues for the version (Linear GraphQL API) -# - opens a PR to the Fern docs repo and enables auto-merge +# - opens a DRAFT PR to the Fern docs repo for a human to review and merge # - posts the announcement to Slack (incoming webhook) # - drafts the announcement into the private Discord review channel (webhook) # - writes back a Linear Release + release notes (Linear GraphQL API) From f55bc7df8d1a7b38ecd0d173f9deed13ab01702e Mon Sep 17 00:00:00 2001 From: Nir Singher Date: Wed, 8 Jul 2026 22:28:20 +0300 Subject: [PATCH 5/5] docs: confirm fern changelog path and Linear team key (#417) Resolves the TODOs left in .band/changelog.yml: the docs entries live under fern/changelog/sdks, and this repo's Linear team is INT. --- .band/changelog.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.band/changelog.yml b/.band/changelog.yml index aebdedb33..df4c918b1 100644 --- a/.band/changelog.yml +++ b/.band/changelog.yml @@ -7,11 +7,11 @@ fern_repo: band-ai/fern # Path within the Fern repo where changelog entries live. Match the layout of the # newest existing entry in that repo. -fern_changelog_path: fern/pages/changelog # TODO: confirm against band-ai/fern +fern_changelog_path: fern/changelog/sdks # Linear: how to find the issues that belong to this SDK's releases. The skill # queries the Linear GraphQL API and also matches issue identifiers (e.g. SDK-123) # found in the release's merged PRs. Set at least the team key. linear: - team_key: SDK # TODO: confirm this repo's Linear team key + team_key: INT # project: "Python SDK" # optional: narrow further by project name