diff --git a/.github/workflows/java-publish-maven.yml b/.github/workflows/java-publish-maven.yml
index e293d9127..f80b38f76 100644
--- a/.github/workflows/java-publish-maven.yml
+++ b/.github/workflows/java-publish-maven.yml
@@ -37,6 +37,10 @@ on:
type: boolean
required: false
default: false
+ outputs:
+ mavenPublished:
+ description: "Whether the Java package was published to Maven Central"
+ value: ${{ jobs.publish-maven.outputs.published }}
secrets:
JAVA_RELEASE_TOKEN:
required: true
@@ -80,39 +84,6 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.JAVA_RELEASE_TOKEN }}
- - name: Verify JAVA_RELEASE_GITHUB_TOKEN can trigger workflows
- run: |
- # JAVA_RELEASE_GITHUB_TOKEN is used for:
- # - gh workflow run release-changelog.lock.yml (requires actions:write)
- # Check the token's OAuth scopes for 'workflow' (classic PAT) or
- # attempt a workflow dispatch with a non-existent ref to verify write access
- # (fine-grained PAT β these don't expose scopes via X-OAuth-Scopes).
- SCOPES=$(gh api -i user 2>&1 | grep -i '^x-oauth-scopes:' | tr '[:upper:]' '[:lower:]' || true)
- if echo "$SCOPES" | grep -q 'workflow'; then
- echo "JAVA_RELEASE_GITHUB_TOKEN has 'workflow' scope (classic PAT)"
- elif [ -z "$SCOPES" ]; then
- # Fine-grained PAT: no X-OAuth-Scopes header returned.
- # Attempt a workflow dispatch against a non-existent ref. If the token
- # has actions:write, the API returns 422 (validation failed on ref).
- # If it lacks the permission, the API returns 403.
- HTTP_CODE=$(gh api -X POST \
- "repos/${{ github.repository }}/actions/workflows/release-changelog.lock.yml/dispatches" \
- -f ref="preflight-check-nonexistent-ref" \
- -f 'inputs[tag]=preflight-check' \
- --silent -i 2>&1 | head -1 | grep -oE '[0-9]{3}' || echo "000")
- if [ "$HTTP_CODE" = "403" ] || [ "$HTTP_CODE" = "000" ]; then
- echo "::error::JAVA_RELEASE_GITHUB_TOKEN lacks actions:write permission on ${{ github.repository }}. It cannot trigger the changelog generation workflow."
- exit 1
- fi
- # 422 = has write access but ref doesn't exist (expected), 204 would mean it dispatched (shouldn't happen with fake ref)
- echo "JAVA_RELEASE_GITHUB_TOKEN actions:write access OK (fine-grained PAT, dispatch returned HTTP ${HTTP_CODE})"
- else
- echo "::error::JAVA_RELEASE_GITHUB_TOKEN lacks 'workflow' scope. Found scopes: ${SCOPES}. It needs this scope to trigger changelog generation via gh workflow run."
- exit 1
- fi
- env:
- GITHUB_TOKEN: ${{ secrets.JAVA_RELEASE_GITHUB_TOKEN }}
-
publish-maven:
name: Publish Java SDK to Maven Central
needs: preflight
@@ -123,6 +94,7 @@ jobs:
working-directory: ./java
outputs:
version: ${{ steps.versions.outputs.release_version }}
+ published: ${{ steps.publish-maven.outcome == 'success' }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
@@ -227,6 +199,7 @@ jobs:
JAVA_GPG_PASSPHRASE: ${{ secrets.JAVA_GPG_PASSPHRASE }}
- name: Perform Release and Deploy to Maven Central
+ id: publish-maven
working-directory: ./java
run: |
mvn -B release:perform \
@@ -248,68 +221,9 @@ jobs:
# Also run Maven release:rollback to clean up any partial release state
mvn -B release:rollback || true
- github-release:
- name: Create GitHub Release
- needs: [preflight, publish-maven]
- if: github.ref == 'refs/heads/main'
- runs-on: ubuntu-latest
- defaults:
- run:
- shell: bash
- working-directory: ./java
- steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- with:
- fetch-depth: 0
- - name: Create GitHub Release
- run: |
- VERSION="${{ needs.publish-maven.outputs.version }}"
- GROUP_ID="com.github"
- ARTIFACT_ID="copilot-sdk-java"
- CURRENT_TAG="java/v${VERSION}"
-
- if gh release view "${CURRENT_TAG}" >/dev/null 2>&1; then
- echo "Release ${CURRENT_TAG} already exists. Skipping creation."
- exit 0
- fi
-
- # Generate release notes from template
- export VERSION GROUP_ID ARTIFACT_ID
- RELEASE_NOTES=$(envsubst < $GITHUB_WORKSPACE/.github/workflows/java.notes.template)
-
- # Get the previous tag for generating notes
- # grep returns exit 1 when no lines match (first release), so
- # append "|| true" to prevent pipefail from aborting the script.
- PREV_TAG=$(git tag --list 'java/v*' --sort=-version:refname \
- | grep -Fxv "${CURRENT_TAG}" \
- | head -n 1 || true)
-
- echo "Current tag: ${CURRENT_TAG}"
- echo "Previous tag: ${PREV_TAG}"
-
- # Build the gh release command
- GH_ARGS=("${CURRENT_TAG}")
- GH_ARGS+=("--title" "GitHub Copilot SDK for Java ${VERSION}")
- GH_ARGS+=("--notes" "${RELEASE_NOTES}")
- GH_ARGS+=("--generate-notes")
-
- if [ -n "$PREV_TAG" ]; then
- GH_ARGS+=("--notes-start-tag" "$PREV_TAG")
- fi
-
- ${{ inputs.prerelease == true && 'GH_ARGS+=("--prerelease")' || '' }}
-
- gh release create "${GH_ARGS[@]}"
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- - name: Trigger changelog generation
- run: gh workflow run release-changelog.lock.yml -f tag="java/v${{ needs.publish-maven.outputs.version }}"
- env:
- GITHUB_TOKEN: ${{ secrets.JAVA_RELEASE_GITHUB_TOKEN }}
-
deploy-site:
name: Deploy Documentation Site
- needs: [preflight, publish-maven, github-release]
+ needs: [preflight, publish-maven]
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
diff --git a/.github/workflows/java.notes.template b/.github/workflows/java.notes.template
deleted file mode 100644
index e209a110b..000000000
--- a/.github/workflows/java.notes.template
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-# Installation
-
-β οΈ **Artifact versioning plan:** Releases of this implementation track releases of the reference implementation. For each release of the reference implementation, there may follow a corresponding release of this implementation with the same number as the reference implementation. Release identifiers of the reference implementation are in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding maven version for the release will be `Maj.Min.Micro-java.N`, where `Maj`, `Min` and `Micro` are the corresponding numbers for the reference implementation release, and `N` is a monotonically increasing sequence number starting with 0 for each release. See the corresponding architectural decision record for more information in the `docs/adr` directory of the source code.
-
-π¦ [View on Maven Central](https://central.sonatype.com/artifact/${GROUP_ID}/${ARTIFACT_ID}/${VERSION})
-
-π [Documentation](https://github.github.io/copilot-sdk-java/${VERSION}/) Β· [Javadoc](https://github.github.io/copilot-sdk-java/${VERSION}/apidocs/index.html)
-
-
-## Maven
-```xml
-
- ${GROUP_ID}
- ${ARTIFACT_ID}
- ${VERSION}
-
-```
-
-## Gradle (Kotlin DSL)
-```kotlin
-implementation("${GROUP_ID}:${ARTIFACT_ID}:${VERSION}")
-```
-
-## Gradle (Groovy DSL)
-```groovy
-implementation '${GROUP_ID}:${ARTIFACT_ID}:${VERSION}'
-```
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index b44fd582a..98bf23690 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -379,7 +379,8 @@ jobs:
needs.publish-nodejs.result == 'success' &&
needs.publish-dotnet.result == 'success' &&
needs.publish-python.result == 'success' &&
- needs.publish-rust.result == 'success'
+ needs.publish-rust.result == 'success' &&
+ needs.publish-java.outputs.mavenPublished == 'true'
runs-on: ubuntu-latest
permissions:
actions: write
@@ -434,11 +435,9 @@ jobs:
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- - name: Tag Rust SDK and create Rust GitHub Release
- # Rust gets its own version-scoped GitHub Release with notes
- # derived from PR titles since the previous Rust tag. The
- # cross-language `vX.Y.Z` release above still exists; this one
- # is the canonical reference for Rust users.
+ - name: Tag Rust SDK
+ # Keep a language-scoped source tag for traceability. Rust is
+ # included in the cross-language `vX.Y.Z` GitHub Release.
if: github.event.inputs.dist-tag == 'latest' || github.event.inputs.dist-tag == 'prerelease'
run: |
set -e
@@ -453,26 +452,5 @@ jobs:
else
echo "Tag $TAG_NAME already exists, skipping tag push"
fi
- # Find the previous Rust tag for note generation. Prefer rust/v*,
- # fall back to the historical rust-v* tags from the release-plz era.
- PREV_TAG=$(git tag --list 'rust/v*' --sort=-v:refname | grep -vFx "$TAG_NAME" | head -n1)
- if [ -z "$PREV_TAG" ]; then
- PREV_TAG=$(git tag --list 'rust-v*' --sort=-v:refname | head -n1)
- fi
- NOTES_FLAG=""
- if [ -n "$PREV_TAG" ]; then
- NOTES_FLAG="--notes-start-tag $PREV_TAG"
- echo "Generating notes from $PREV_TAG..$TAG_NAME"
- else
- echo "No previous Rust tag found; generating notes from full history"
- fi
- PRERELEASE_FLAG=""
- if [ "${{ github.event.inputs.dist-tag }}" = "prerelease" ]; then
- PRERELEASE_FLAG="--prerelease"
- fi
- gh release create "$TAG_NAME" \
- --title "$TAG_NAME" \
- --generate-notes $NOTES_FLAG $PRERELEASE_FLAG \
- --target ${{ github.sha }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/release-changelog.lock.yml b/.github/workflows/release-changelog.lock.yml
index 781f41b22..23b19d9b8 100644
--- a/.github/workflows/release-changelog.lock.yml
+++ b/.github/workflows/release-changelog.lock.yml
@@ -1,4 +1,4 @@
-# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"9342b428009e6a3b47258c08b78735a89fc72714b73a44b72c4714e310d60006","body_hash":"89e26ed929f440bd6af57d1da92b06dbf1739b4a1d34b9923286919d00f272d1","compiler_version":"v0.83.1","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.73"}}
+# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"a4a0859e0103be270433c7fe1926a346c46271b4b530b2c08fa5d606d0ab75c4","body_hash":"490b25b529910b1b087df624fd59eaef52e142e84b9503ca1cf87631f4c36b53","compiler_version":"v0.83.1","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.73"}}
# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_CI_TRIGGER_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","version":"v7"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"373c709c69115d41ff229c7e5df9f8788daa9553","version":"v9"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"8bdba8075360648fe6802302a5b4e016361dc6ac","version":"v0.83.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.38","digest":"sha256:cb928eb62d9139a013c2d278dab19af232d35a2d83dca71a3d98eb431f786243","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.38@sha256:cb928eb62d9139a013c2d278dab19af232d35a2d83dca71a3d98eb431f786243"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.38","digest":"sha256:cd6145620d96acee46e1ede25180a13aa36002467e663db0caa453a8bc8eb60c","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.38@sha256:cd6145620d96acee46e1ede25180a13aa36002467e663db0caa453a8bc8eb60c"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.38","digest":"sha256:6c19094d95aad5f9f128ad5e583f0f2b894b158aa66c3b86dd9bcc90970a2917","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.38@sha256:6c19094d95aad5f9f128ad5e583f0f2b894b158aa66c3b86dd9bcc90970a2917"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.3","digest":"sha256:3c744710ea275cd5ee65db92a1099e0d980754bd9fafda9ce67704c67004dc83","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.3@sha256:3c744710ea275cd5ee65db92a1099e0d980754bd9fafda9ce67704c67004dc83"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b","pinned_image":"ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b"},{"image":"ghcr.io/github/github-mcp-server:v1.6.0","digest":"sha256:2b0c48b070f61e9d3969269ead600f62d00fb237b60ac849ef3d166ee7de9ad3","pinned_image":"ghcr.io/github/github-mcp-server:v1.6.0@sha256:2b0c48b070f61e9d3969269ead600f62d00fb237b60ac849ef3d166ee7de9ad3"}]}
# This file was automatically generated by gh-aw (v0.83.1). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md
#
@@ -62,7 +62,7 @@ on:
required: false
type: string
tag:
- description: Release tag to generate changelog for (e.g., v0.1.30, /v1.0.0)
+ description: Release tag to generate changelog for (e.g., v1.0.0)
required: true
type: string
diff --git a/.github/workflows/release-changelog.md b/.github/workflows/release-changelog.md
index 7a682c56d..c846b0dd3 100644
--- a/.github/workflows/release-changelog.md
+++ b/.github/workflows/release-changelog.md
@@ -4,7 +4,7 @@ on:
workflow_dispatch:
inputs:
tag:
- description: "Release tag to generate changelog for (e.g., v0.1.30, /v1.0.0)"
+ description: "Release tag to generate changelog for (e.g., v1.0.0)"
required: true
type: string
permissions:
@@ -55,9 +55,8 @@ Use the GitHub API to fetch the release corresponding to `${{ github.event.input
2. The **new version** is the release tag: `${{ github.event.inputs.tag }}`
3. Fetch the release metadata to determine if this is a **stable** or **prerelease** release.
4. Determine the **previous version** to diff against:
- - **Scoped tags**: If the tag has a language prefix (e.g., `java/v1.0.0` or `rust/v0.2.0`), the previous tag must use the **same prefix**. List tags matching that prefix (e.g., `java/v*` or `rust/v*`) sorted by version and pick the one immediately before the current tag. Only compare within the same scope.
- - **For stable releases**: find the previous **stable** release (skip prereleases). Check `CHANGELOG.md` for the most recent version heading matching this scope (`## [vX.Y.Z](...)` for unscoped, `## [java/vX.Y.Z](...)` for Java, `## [rust/vX.Y.Z](...)` for Rust), or fall back to listing releases via the API. This means stable changelogs include ALL changes since the last stable release, even if some were already mentioned in prerelease notes.
- - **For prerelease releases**: find the most recent release of **any kind** (stable or prerelease) that precedes this one within the same tag scope. This way prerelease notes only cover what's new since the last release.
+ - **For stable releases**: find the previous **stable** release (skip prereleases). Check `CHANGELOG.md` for the most recent `## [vX.Y.Z](...)` heading, or fall back to listing releases via the API. This means stable changelogs include ALL changes since the last stable release, even if some were already mentioned in prerelease notes.
+ - **For prerelease releases**: find the most recent release of **any kind** (stable or prerelease) that precedes this one. This way prerelease notes only cover what's new since the last release.
5. If no previous release exists at all, use the first commit in the repo as the starting point.
6. After identifying the range, verify it by listing the commits in `PREVIOUS_TAG..NEW_TAG`. If the local result still looks suspiciously small or inconsistent, do **not** proceed based on local git alone β use the GitHub tools as the source of truth for the commits and PRs in the release.
@@ -68,8 +67,7 @@ Use the GitHub API to fetch the release corresponding to `${{ github.event.input
- PR number and title
- The PR author
- Which SDK(s) were affected (look for prefixes like `[C#]`, `[Python]`, `[Go]`, `[Node]`, `[Java]`, `[Rust]` in the title, or infer from changed files)
-3. **For scoped tags** (e.g., `java/v*`, `rust/v*`): only include changes that touch the corresponding language directory (`java/`, `rust/`). Ignore changes to other languages unless they directly affect the scoped SDK.
-4. Ignore:
+3. Ignore:
- Dependabot/bot PRs that only bump internal dependencies (like `Update @github/copilot to ...`) unless they bring user-facing changes
- Merge commits with no meaningful content
- Preview/prerelease-only changes that were already documented
@@ -81,6 +79,10 @@ Separate the changes into two groups:
1. **Highlighted features**: Any interesting new feature or significant improvement that deserves its own section with a description and code snippet(s). Read the PR diff and source code to understand the feature well enough to write about it.
2. **Other changes**: Bug fixes, minor improvements, and smaller features that can be summarized in a single bullet each.
+**Format for each highlighted feature** β use an `### Feature:` or `### Fix:` heading, a 1-2 sentence description explaining what it does and why it matters, and at least one short code snippet (max 3 lines). Cover all six SDKsβTypeScript, C#, Go, Python, Java, and Rustβin the combined release notes. Show code examples in the languages whose APIs best illustrate the change, and ensure every user-visible language-specific change appears either as a highlighted feature or under other changes.
+
+**Format for other changes** β use a single `### Other changes` section with a flat bulleted list. Each bullet has a lowercase prefix (`feature:`, `bugfix:`, `improvement:`) and a one-line description linking to the PR. **However, if there are no highlighted features above it, omit the `### Other changes` heading.**
+
Only include changes that are **user-visible in the published SDK packages**. Skip anything that only affects docs, CI, build tooling, GitHub workflows, test infrastructure, or other internal-only concerns.
Additionally, identify **new contributors** β anyone whose first merged PR to this repo falls within this release range. You can determine this by checking whether the author has any earlier merged PRs in the repository.
@@ -90,11 +92,7 @@ Additionally, identify **new contributors** β anyone whose first merged PR to
**Skip this step entirely for prerelease releases.**
1. Read the current `CHANGELOG.md` file.
-2. Add the new version entry **at the top** of the file, right after the title/header. Use the **full tag** as the version in the heading β e.g., `## [v0.2.3](...)` for unscoped tags, `## [java/v1.0.0](...)` for Java-scoped tags, `## [rust/v0.2.3](...)` for Rust-scoped tags.
-
-**Format for each highlighted feature** β use an `### Feature:` or `### Fix:` heading, a 1-2 sentence description explaining what it does and why it matters, and at least one short code snippet (max 3 lines). For unscoped releases, focus on **TypeScript** and **C#** as the primary languages; only show Go/Python when giving a list of one-liner equivalents across all languages, or when their usage pattern is meaningfully different. For **scoped releases** (e.g., `java/v*`), show code snippets in the scoped language only (e.g., Java for `java/v*`, Rust for `rust/v*`).
-
-**Format for other changes** β a single `### Other changes` section with a flat bulleted list. Each bullet has a lowercase prefix (`feature:`, `bugfix:`, `improvement:`) and a one-line description linking to the PR. **However, if there are no highlighted features above it, omit the `### Other changes` heading entirely** β just list the bullets directly under the version heading.
+2. Add the new version entry **at the top** of the file, right after the title/header. Use the full tag as the version in the heading, for example `## [v1.0.0](...)`.
3. Use the release's publish date (from the GitHub Release metadata), not today's date. For `workflow_dispatch` runs, fetch the release by tag to get the date.
4. If there are new contributors, add a `### New contributors` section at the end listing each with a link to their first PR:
@@ -118,11 +116,6 @@ Use the `create-pull-request` output to submit your changes. The PR should:
Use the `update-release` output to replace the auto-generated release notes with your nicely formatted changelog. **Do not include the version heading** (`## [vX.Y.Z](...) (date)`) in the release notes β the release already has a title showing the version. Start directly with the feature sections or other changes list.
-**IMPORTANT β Preserving the Installation section:**
-The release body may contain an Installation section delimited by `` and `` HTML comments. In the case of Java, this section includes Maven/Gradle dependency snippets and a "View on Maven Central" link. You **MUST** preserve this entire section (from the opening comment through the closing comment, inclusive) exactly as it appears in the existing release body. Place your generated changelog content **after** the Installation section.
-
-**URL reconstruction:** If the Maven Central URL in the Installation section appears corrupted or contains the word "redacted", reconstruct it. Extract the version from the release tag (e.g., `java/v1.0.0` β `1.0.0`), and rebuild the URL as: `https://central.sonatype.com/artifact/com.github/copilot-sdk-java/{VERSION}`. The `` HTML comment in the section contains the intended URL pattern.
-
## Example Output
Here is an example of what a changelog entry should look like, based on real commits from this repo. **Follow this style exactly.**
@@ -154,6 +147,8 @@ While `session.rpc.models.setModel()` already worked, there is now a convenience
- C#: `session.SetModel("gpt-4o")`
- Python: `session.set_model("gpt-4o")`
- Go: `session.SetModel("gpt-4o")`
+- Java: `session.setModel("gpt-4o").get()`
+- Rust: `session.set_model("gpt-4o", None).await?`
### Other changes
@@ -171,7 +166,7 @@ While `session.rpc.models.setModel()` already worked, there is now a convenience
**Key rules visible in the example:**
- Highlighted features get their own `### Feature:` heading, a short description, and code snippets
-- Code snippets are TypeScript and C# primarily; Go/Python only when listing one-liner equivalents or when meaningfully different
+- Code snippets use whichever of TypeScript, C#, Go, Python, Java, and Rust best illustrate the change; list all affected languages when showing equivalents
- The `### Other changes` section is a flat bulleted list with lowercase `bugfix:` / `feature:` / `improvement:` prefixes
- PR numbers are linked inline, not at the end with author attribution (keep it clean)
diff --git a/docs/developer-docs/secrets.md b/docs/developer-docs/secrets.md
index 15788bbe5..573f4f22e 100644
--- a/docs/developer-docs/secrets.md
+++ b/docs/developer-docs/secrets.md
@@ -50,7 +50,7 @@ These secrets are used by the Java SDK Maven Central publishing workflow (`java-
* **`JAVA_RELEASE_TOKEN`**: GitHub token with **push** permission on the repository. Used by the release workflow for `actions/checkout`, pushing release commits and tags to `main`, and running `mvn release:prepare -DpushChanges=true`.
* Workflows: `java-publish-maven.yml`
-* **`JAVA_RELEASE_GITHUB_TOKEN`**: GitHub token with **workflow dispatch** (actions:write) permission on this repository and `github/copilot-sdk-java`. Used to trigger the `release-changelog.lock.yml` workflow and the documentation site deployment after a release is published.
+* **`JAVA_RELEASE_GITHUB_TOKEN`**: GitHub token with **workflow dispatch** (actions:write) permission on `github/copilot-sdk-java`. Used to trigger the documentation site deployment after a release is published.
* Workflows: `java-publish-maven.yml`
## Rust publishing secret
diff --git a/rust/README.md b/rust/README.md
index 314090044..29fe67355 100644
--- a/rust/README.md
+++ b/rust/README.md
@@ -4,7 +4,7 @@ A Rust SDK for programmatic access to the GitHub Copilot CLI.
See [github/copilot-sdk](https://github.com/github/copilot-sdk) for the equivalent SDKs in TypeScript, Python, Go, .NET, and Java. The Rust SDK seeks parity with those SDKs; see [Differences From Other SDKs](#differences-from-other-sdks) below for the small set of intentional divergences.
-**Releases:** [github.com/github/copilot-sdk/releases?q=rust%2F](https://github.com/github/copilot-sdk/releases?q=rust%2F) β per-version release notes for the Rust crate.
+**Releases:** [github.com/github/copilot-sdk/releases](https://github.com/github/copilot-sdk/releases) β combined release notes for all SDK languages.
## Prerequisites
diff --git a/rust/RELEASING.md b/rust/RELEASING.md
index de0252de8..06e362f54 100644
--- a/rust/RELEASING.md
+++ b/rust/RELEASING.md
@@ -1,8 +1,7 @@
# Releasing `github-copilot-sdk`
-The Rust crate ships through the same unified `publish.yml` workflow
-as the Node, .NET, and Python SDKs. There is no Rust-specific release
-workflow.
+The Rust crate ships through the unified `publish.yml` workflow
+alongside the other SDKs. There is no Rust-specific release workflow.
## TL;DR
@@ -16,9 +15,11 @@ workflow.
prerelease version requirement to install it.
- `unstable` β skipped for Rust (Cargo doesn't have a clean
equivalent of npm's `unstable` dist-tag).
-4. The workflow publishes all four SDKs at the shared computed
- version, tags `rust/vX.Y.Z`, and creates a Rust-scoped GitHub
- Release with auto-generated notes since the previous Rust tag.
+4. For `latest` and `prerelease`, the workflow publishes all SDKs at
+ the shared computed version, tags `rust/vX.Y.Z` for source
+ traceability, and creates one combined `vX.Y.Z` GitHub Release.
+ The `unstable` channel publishes only the Node.js SDK and does not
+ create a GitHub Release.
## Version, tag, and release notes
@@ -26,14 +27,11 @@ workflow.
as a placeholder. CI overrides it at publish time with the version
computed by `publish.yml` (or an explicit `version` workflow input).
- **Tag:** `rust/vX.Y.Z` (matches the `go/vX.Y.Z` style used elsewhere
- in this repo). The historical `rust-v0.1.0` tag from the
- release-plz era stays valid as a starting point for auto-generated
- release notes.
-- **Release notes:** auto-generated by `gh release --generate-notes`
- from PR titles between the previous Rust tag and the new one.
- Write descriptive PR titles for any change that touches the Rust
- surface; that's the only place those changes will be visible to
- Rust users.
+ in this repo). The tag identifies the source used for that crate
+ version.
+- **Release notes:** generated for the combined `vX.Y.Z` GitHub
+ Release. Write descriptive PR titles for changes that touch the Rust
+ surface so they are represented accurately in the shared notes.
## Cargo prerelease semantics
@@ -59,8 +57,8 @@ cargo yank --version X.Y.Z github-copilot-sdk
Yanking does *not* delete the version β existing `Cargo.lock` files
keep working β but it stops new resolutions from picking it. Follow
-up with a patch release that fixes the bug, and add a note to the
-yanked version's GitHub Release explaining why.
+up with a patch release that fixes the bug, and update the combined
+GitHub Release notes to explain why.
Reverse with `cargo yank --undo --version X.Y.Z github-copilot-sdk`
if the yank was a mistake.
@@ -90,6 +88,5 @@ git push origin rust/vX.Y.Z
perl -i -pe 's/^version = ".*"$/version = "0.0.0-dev"/' Cargo.toml
```
-Manual publishes skip the auto-generated GitHub Release. Run
-`gh release create rust/vX.Y.Z --generate-notes` after pushing the
-tag.
+Manual publishes skip the combined GitHub Release. Create or update the
+matching `vX.Y.Z` release after pushing the tag.