From 5af6936867fabd3104a380d63100cf91d6a9d6a9 Mon Sep 17 00:00:00 2001 From: Don Lee Date: Thu, 28 May 2026 19:32:43 -0700 Subject: [PATCH 1/3] fix(ci): staging verify-tombstone-testpypi handles dev-version dep mismatch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In staging.yml the agentops-accelerator package is built with setuptools-scm and published to TestPyPI as 0.2.3.devN, while the tombstone (agentops-toolkit) hardcodes 'agentops-accelerator>=0.3.0' in its pyproject.toml. A standard pip install of the tombstone then fails because TestPyPI carries no >=0.3.0 candidate for the main package — the version is only minted when release.yml runs against the real v0.3.0 tag. Restructure the verify job into two install steps: 1. agentops-toolkit== --no-deps from TestPyPI (installs the wheel for its metadata only; --no-deps preserves 'pip show Requires:' content so the redirect assertion still holds, verified empirically by Critic) 2. agentops-accelerator --pre from TestPyPI (satisfies the runtime dep so 'import agentops' resolves; --pre is required so pip accepts the dev versions present in staging) Both pre-existing assertions are preserved unchanged: - pip show agentops-toolkit lists agentops-accelerator under Requires - python -c 'import agentops' returns successfully release.yml is intentionally NOT modified: its verify-tombstone-testpypi works correctly because publish-testpypi (in release.yml) publishes agentops-accelerator at the real 0.3.0 tag version, so the tombstone dep resolves cleanly without --no-deps. --- .github/workflows/staging.yml | 46 ++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml index 43e18a7..2a647e0 100644 --- a/.github/workflows/staging.yml +++ b/.github/workflows/staging.yml @@ -220,6 +220,15 @@ jobs: echo "✅ agentops init succeeded" # Install the tombstone from TestPyPI and verify it redirects to agentops-accelerator. + # + # Staging-only divergence from release.yml: the main package (agentops-accelerator) + # is built with setuptools-scm and published to TestPyPI as 0.2.3.devN, while the + # tombstone (agentops-toolkit) hardcodes `agentops-accelerator>=0.3.0` in its + # pyproject.toml. In release.yml the two packages publish in lockstep at the + # same 0.3.x tag, so pip resolves the dep cleanly. In staging the dep can never + # resolve via a standard `pip install`, so we install the tombstone with + # `--no-deps` (to validate its wheel metadata) and then install the latest + # pre-release of agentops-accelerator separately (to satisfy `import agentops`). verify-tombstone-testpypi: needs: [build-pypi-tombstone, publish-tombstone-testpypi] runs-on: ubuntu-latest @@ -229,14 +238,45 @@ jobs: with: python-version: "3.12" - - name: Install agentops-toolkit==${{ needs.build-pypi-tombstone.outputs.tombstone_version }} from TestPyPI + - name: Install agentops-toolkit==${{ needs.build-pypi-tombstone.outputs.tombstone_version }} from TestPyPI (no deps) env: TOMBSTONE_VERSION: ${{ needs.build-pypi-tombstone.outputs.tombstone_version }} run: | + # --no-deps: in staging the tombstone's `agentops-accelerator>=0.3.0` + # requirement cannot be satisfied (staging publishes 0.2.3.devN). We + # install the wheel for its metadata only; the dep is provided by the + # next step. Retries cover TestPyPI replication lag for the wheel that + # `publish-tombstone-testpypi` just uploaded. for i in 1 2 3 4 5; do - echo "Attempt $i: installing agentops-toolkit==${TOMBSTONE_VERSION} from TestPyPI" + echo "Attempt $i: installing agentops-toolkit==${TOMBSTONE_VERSION} from TestPyPI (no deps)" if pip install \ "agentops-toolkit==${TOMBSTONE_VERSION}" \ + --no-deps \ + --index-url https://test.pypi.org/simple/; then + exit 0 + fi + if [ "$i" -lt 5 ]; then + echo "Not available yet, waiting 30s..." + sleep 30 + fi + done + echo "::error::agentops-toolkit==${TOMBSTONE_VERSION} was not available from TestPyPI after 5 attempts." + exit 1 + + - name: Install agentops-accelerator pre-release from TestPyPI + run: | + # Satisfies the tombstone's runtime dep so `import agentops` resolves + # to the real package. `--pre` is required because in staging TestPyPI + # only carries dev versions (0.2.3.devN); without it pip would refuse + # to install them. The extra-index-url lets transitive deps fall back + # to real PyPI. We don't pin a version here because the accelerator + # version is not exposed as a job output; the latest dev release is + # sufficient for an import smoke check. + for i in 1 2 3 4 5; do + echo "Attempt $i: installing agentops-accelerator (pre) from TestPyPI" + if pip install \ + --pre \ + "agentops-accelerator" \ --index-url https://test.pypi.org/simple/ \ --extra-index-url https://pypi.org/simple/; then exit 0 @@ -246,7 +286,7 @@ jobs: sleep 30 fi done - echo "::error::agentops-toolkit==${TOMBSTONE_VERSION} was not available from TestPyPI after 5 attempts." + echo "::error::agentops-accelerator was not available from TestPyPI after 5 attempts." exit 1 - name: Verify tombstone redirects to agentops-accelerator From 018cf7498a72fb83ddc2ea3109acde7a7e0abd73 Mon Sep 17 00:00:00 2001 From: DB Lee Date: Thu, 28 May 2026 19:58:17 -0700 Subject: [PATCH 2/3] fix(release): correct VSIX tombstone identity to AgentOpsToolkit.agentops-toolkit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The VSIX tombstone scaffolded in 2f128d9 mistakenly identified itself as AgentOpsToolkit.agentops-skills — an extension name that has never existed on the VS Code Marketplace. The actual deprecated extension is AgentOpsToolkit.agentops-toolkit (live since v0.1.4, latest v0.1.8). It also pointed users to AgentOpsAccelerator.agentops-skills as the migration target, but the new extension's real identity (per plugins/agentops/package.json) is AgentOpsAccelerator.agentops-accelerator. Without this fix, publishing the v0.3.0 tombstone would create a brand-new extension nobody has installed, and the ~5 versions of the legacy extension already in users' VS Code installs would never receive a deprecation prompt. Changes: tombstones/vscode/package.json - rename 'agentops-skills' to 'agentops-toolkit' so the published identity is AgentOpsToolkit.agentops-toolkit (republishes onto the existing listing, triggers in-place update for current users) tombstones/vscode/src/extension.ts - NEW_EXTENSION_ID points at AgentOpsAccelerator.agentops-accelerator - DEPRECATION_MESSAGE interpolates the constant instead of hardcoding the literal (prevents future drift) tombstones/vscode/README.md - corrected legacy ID + migration target tombstones/vscode/CHANGELOG.md - corrected legacy ID + migration target tombstones/vscode/CDN_DEPRECATION_REQUEST.md - corrected all subject lines, body IDs, and pre-flight checklist IDs CHANGELOG.md - corrected the [0.3.0] VS Code Marketplace tombstone bullet (flows into GitHub release body and PyPI tombstone long description) docs/verifying-tombstones.md - corrected all 10 publisher-prefixed identifiers in verification commands (vsce show, --install-extension, marketplace URLs) STORAGE_KEY ('agentops-toolkit.deprecation-prompt-shown') is unchanged — already aligned with the legacy namespace. Version 0.3.0 > existing 0.1.8 satisfies VSCE monotonicity. Legacy versions were declarative-only (no commands/keybindings/settings/views — only contributes.chatSkills), so replacing them with the tombstone manifest carries no user-binding break risk. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- CHANGELOG.md | 4 ++-- docs/verifying-tombstones.md | 20 ++++++++++---------- tombstones/vscode/CDN_DEPRECATION_REQUEST.md | 16 ++++++++-------- tombstones/vscode/CHANGELOG.md | 2 +- tombstones/vscode/README.md | 4 ++-- tombstones/vscode/package.json | 4 ++-- tombstones/vscode/src/extension.ts | 4 ++-- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a9737b..9b4d3f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,9 +50,9 @@ This format follows [Keep a Changelog](https://keepachangelog.com/) and adheres The package long-description on PyPI links to the migration instructions. - **VS Code Marketplace tombstone**: a final - `AgentOpsToolkit.agentops-skills` extension at `tombstones/vscode/` + `AgentOpsToolkit.agentops-toolkit` extension at `tombstones/vscode/` activates with a one-time prompt offering to install - `AgentOpsAccelerator.agentops-skills` (or open the Marketplace + `AgentOpsAccelerator.agentops-accelerator` (or open the Marketplace page in a browser). A per-install storage sentinel prevents re-prompts after the user resolves it. diff --git a/docs/verifying-tombstones.md b/docs/verifying-tombstones.md index 7fde7a8..74abaf9 100644 --- a/docs/verifying-tombstones.md +++ b/docs/verifying-tombstones.md @@ -2,9 +2,9 @@ This is the maintainer-facing checklist for proving that a release's two deprecation tombstones — the [`agentops-toolkit` PyPI metapackage](../tombstones/pypi/pyproject.toml) -and the [`AgentOpsToolkit.agentops-skills` VSIX](../tombstones/vscode/package.json) — +and the [`AgentOpsToolkit.agentops-toolkit` VSIX](../tombstones/vscode/package.json) — are live, intact, and redirecting users to the renamed -`agentops-accelerator` / `AgentOpsAccelerator.agentops-skills` artifacts. +`agentops-accelerator` / `AgentOpsAccelerator.agentops-accelerator` artifacts. The CI workflow runs a pre-publish smoke test against TestPyPI (see [`.github/workflows/release.yml`](../.github/workflows/release.yml) line @@ -78,7 +78,7 @@ venv created with `sys.executable` and then verifies: This mirrors the pre-publish CI verification but adds the shadow-free check and version-floor assertion that production needs. -**VSIX (`Check 2`)** — runs `vsce show AgentOpsToolkit.agentops-skills --json` +**VSIX (`Check 2`)** — runs `vsce show AgentOpsToolkit.agentops-toolkit --json` and verifies: 1. `vsce` is on `PATH` and the JSON parses. @@ -131,7 +131,7 @@ sentinel starts empty. ```bash code --profile fresh-toolkit-1 \ - --install-extension AgentOpsToolkit.agentops-skills@0.3.0 + --install-extension AgentOpsToolkit.agentops-toolkit@0.3.0 ``` Reload the window. Expected: an information notification appears reading: @@ -144,7 +144,7 @@ sentinel starts empty. 2. **`Install replacement` installs the new extension and suppresses the prompt.** In the `fresh-toolkit-1` profile, click `Install replacement`. Expected: - VS Code installs `AgentOpsAccelerator.agentops-skills` automatically. + VS Code installs `AgentOpsAccelerator.agentops-accelerator` automatically. Reload the window again — the prompt **must not** re-appear (the per-install sentinel suppresses it). @@ -152,7 +152,7 @@ sentinel starts empty. ```bash code --profile fresh-toolkit-2 \ - --install-extension AgentOpsToolkit.agentops-skills@0.3.0 + --install-extension AgentOpsToolkit.agentops-toolkit@0.3.0 ``` Reload, click `Dismiss`, reload again. Expected: prompt does **not** @@ -162,11 +162,11 @@ sentinel starts empty. ```bash code --profile fresh-toolkit-3 \ - --install-extension AgentOpsToolkit.agentops-skills@0.3.0 + --install-extension AgentOpsToolkit.agentops-toolkit@0.3.0 ``` Reload, click `Open in Marketplace`. Expected: the system browser opens to - . + . All four flows must pass before filing the CDN deprecation request. @@ -178,10 +178,10 @@ Once automated + manual verification are both green: [`tombstones/vscode/CDN_DEPRECATION_REQUEST.md`](../tombstones/vscode/CDN_DEPRECATION_REQUEST.md). 2. Wait 24–48 hours after Microsoft confirms receipt. 3. Verify: the legacy listing at - + now shows the standard **Deprecated** banner and a pointer to the recommended replacement extension - (`AgentOpsAccelerator.agentops-skills`). + (`AgentOpsAccelerator.agentops-accelerator`). 4. Update the tracking issue with the post-deprecation timestamp and a screenshot. diff --git a/tombstones/vscode/CDN_DEPRECATION_REQUEST.md b/tombstones/vscode/CDN_DEPRECATION_REQUEST.md index a9d94e4..0b6cb80 100644 --- a/tombstones/vscode/CDN_DEPRECATION_REQUEST.md +++ b/tombstones/vscode/CDN_DEPRECATION_REQUEST.md @@ -1,6 +1,6 @@ # VS Code Marketplace CDN Deprecation Request -After the tombstone VSIX (`AgentOpsToolkit.agentops-skills` v0.3.0) is published and live on the Marketplace, file a deprecation request with the VS Code Marketplace team so the legacy listing is officially marked as deprecated and points to the new extension. +After the tombstone VSIX (`AgentOpsToolkit.agentops-toolkit` v0.3.0) is published and live on the Marketplace, file a deprecation request with the VS Code Marketplace team so the legacy listing is officially marked as deprecated and points to the new extension. File the request as a new discussion in the VS Code Discussions repo (use the most current "Marketplace deprecation" thread if one already exists, otherwise open a new discussion): @@ -8,15 +8,15 @@ File the request as a new discussion in the VS Code Discussions repo (use the mo Copy-paste the block below into the discussion, filling in the publisher contact details: -> **Subject:** Mark `AgentOpsToolkit.agentops-skills` as deprecated; point users to `AgentOpsAccelerator.agentops-skills` +> **Subject:** Mark `AgentOpsToolkit.agentops-toolkit` as deprecated; point users to `AgentOpsAccelerator.agentops-accelerator` > -> **Legacy extension ID:** `AgentOpsToolkit.agentops-skills` -> **New extension ID:** `AgentOpsAccelerator.agentops-skills` +> **Legacy extension ID:** `AgentOpsToolkit.agentops-toolkit` +> **New extension ID:** `AgentOpsAccelerator.agentops-accelerator` > **Reason:** Publisher rename. The project rebranded from "AgentOps Toolkit" to "AgentOps Accelerator". Because the Marketplace cannot rename a publisher in place, the extension was republished under a new publisher identifier. A final v0.3.0 tombstone build of the legacy extension has been shipped that prompts existing installs to migrate. -> **Requested actions on the legacy listing (`AgentOpsToolkit.agentops-skills`):** +> **Requested actions on the legacy listing (`AgentOpsToolkit.agentops-toolkit`):** > > 1. Mark the extension as **deprecated** in the Marketplace UI. -> 2. Add a **migrate-to** pointer to `AgentOpsAccelerator.agentops-skills` so the Marketplace surfaces the replacement extension. +> 2. Add a **migrate-to** pointer to `AgentOpsAccelerator.agentops-accelerator` so the Marketplace surfaces the replacement extension. > 3. (Optional) Hide the legacy listing from search results once the migrate-to pointer is in place. > > **Tracking issue:** @@ -25,7 +25,7 @@ Copy-paste the block below into the discussion, filling in the publisher contact ## Pre-flight checklist -- [ ] Tombstone VSIX (`AgentOpsToolkit.agentops-skills` v0.3.0) is published to the Marketplace and the listing is live. -- [ ] New extension (`AgentOpsAccelerator.agentops-skills`) is published to the Marketplace and the listing is live. +- [ ] Tombstone VSIX (`AgentOpsToolkit.agentops-toolkit` v0.3.0) is published to the Marketplace and the listing is live. +- [ ] New extension (`AgentOpsAccelerator.agentops-accelerator`) is published to the Marketplace and the listing is live. - [ ] Tracking issue is up to date with the publish status of both extensions. - [ ] Publisher contact (email / Azure DevOps org admin) is filled in above before submitting. diff --git a/tombstones/vscode/CHANGELOG.md b/tombstones/vscode/CHANGELOG.md index 4e079cd..039ee94 100644 --- a/tombstones/vscode/CHANGELOG.md +++ b/tombstones/vscode/CHANGELOG.md @@ -10,4 +10,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated -- This extension (`AgentOpsToolkit.agentops-skills`) is deprecated. It has been renamed and republished as `AgentOpsAccelerator.agentops-skills` ("AgentOps Accelerator — Skills for GitHub Copilot"). This final build only prompts users to install the new extension and uninstall this one. See . +- This extension (`AgentOpsToolkit.agentops-toolkit`) is deprecated. It has been renamed and republished as `AgentOpsAccelerator.agentops-accelerator` ("AgentOps Accelerator — Skills for GitHub Copilot"). This final build only prompts users to install the new extension and uninstall this one. See . diff --git a/tombstones/vscode/README.md b/tombstones/vscode/README.md index 1755313..dbe9701 100644 --- a/tombstones/vscode/README.md +++ b/tombstones/vscode/README.md @@ -4,8 +4,8 @@ ## Migrate in two steps -1. **Install the new extension** from the Marketplace: [AgentOpsAccelerator.agentops-skills](https://marketplace.visualstudio.com/items?itemName=AgentOpsAccelerator.agentops-skills). -2. **Uninstall this extension** (`AgentOpsToolkit.agentops-skills`) from your Extensions view. +1. **Install the new extension** from the Marketplace: [AgentOpsAccelerator.agentops-accelerator](https://marketplace.visualstudio.com/items?itemName=AgentOpsAccelerator.agentops-accelerator). +2. **Uninstall this extension** (`AgentOpsToolkit.agentops-toolkit`) from your Extensions view. ## Why the rename? diff --git a/tombstones/vscode/package.json b/tombstones/vscode/package.json index 9a2a063..25de041 100644 --- a/tombstones/vscode/package.json +++ b/tombstones/vscode/package.json @@ -1,7 +1,7 @@ { - "name": "agentops-skills", + "name": "agentops-toolkit", "displayName": "[DEPRECATED] AgentOps Toolkit — Migrate to AgentOps Accelerator", - "description": "Deprecated. This extension was renamed to 'AgentOps Accelerator — Skills for GitHub Copilot' (AgentOpsAccelerator.agentops-skills). Please install the new extension and uninstall this one.", + "description": "Deprecated. This extension was renamed to 'AgentOps Accelerator — Skills for GitHub Copilot' (AgentOpsAccelerator.agentops-accelerator). Please install the new extension and uninstall this one.", "version": "0.3.0", "publisher": "AgentOpsToolkit", "license": "MIT", diff --git a/tombstones/vscode/src/extension.ts b/tombstones/vscode/src/extension.ts index 21fb115..d7bfd89 100644 --- a/tombstones/vscode/src/extension.ts +++ b/tombstones/vscode/src/extension.ts @@ -1,11 +1,11 @@ import * as vscode from 'vscode'; -const NEW_EXTENSION_ID = 'AgentOpsAccelerator.agentops-skills'; +const NEW_EXTENSION_ID = 'AgentOpsAccelerator.agentops-accelerator'; const STORAGE_KEY = 'agentops-toolkit.deprecation-prompt-shown'; const DEPRECATION_MESSAGE = 'The "AgentOps Toolkit" extension has been renamed to "AgentOps Accelerator". ' + - 'Please install the new extension (AgentOpsAccelerator.agentops-skills) and uninstall this one ' + + `Please install the new extension (${NEW_EXTENSION_ID}) and uninstall this one ` + 'to continue receiving updates.'; const INSTALL_ACTION = 'Install new extension'; From de0bf8ad3c0dd5274ab98caee641fc36ce9bd89d Mon Sep 17 00:00:00 2001 From: DB Lee Date: Thu, 28 May 2026 20:17:06 -0700 Subject: [PATCH 3/3] fix(ci): staging vsce publish must surface auth/network failures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The two staging VSIX publish steps (main extension at line 348 and tombstone at line 425) carried 'continue-on-error: true' which silently swallowed every failure mode — including an expired VSCE_PAT. This made staging look green when nothing was actually published to the Marketplace, hiding the auth issue for an extended period and producing zero pre-release versions for either AgentOpsAccelerator.agentops-accelerator or AgentOpsToolkit.agentops-toolkit. Replaces the blanket tolerance with the same conditional pattern release.yml already uses (lines 469-489): capture combined stdout+stderr, swallow the exit code ONLY when the output contains 'already exists' (re-run of an already-published pre-release version, the only benign failure mode), and propagate every other exit code so auth, network, validation, and marketplace errors fail the job and surface in CI. Also moves the PAT into an env: block as VSCE_PAT (out of the interpolated shell line) to match release.yml's pattern and avoid leaking the secret into command history or logs. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/staging.yml | 44 +++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml index 2a647e0..e3af55f 100644 --- a/.github/workflows/staging.yml +++ b/.github/workflows/staging.yml @@ -344,9 +344,27 @@ jobs: run: vsce package --pre-release -o agentops-skills.vsix - name: Publish pre-release to VS Code Marketplace - continue-on-error: true # Tolerate "already exists" for pre-release builds + # Tolerate ONLY the "already exists" case (re-run of the same pre-release + # version). Any other failure (auth, network, validation) must fail the job + # so staging surfaces real publish problems instead of silently green-lighting. working-directory: plugins/agentops - run: vsce publish --pre-release --packagePath agentops-skills.vsix -p "${{ secrets.VSCE_PAT }}" + env: + VSCE_PAT: ${{ secrets.VSCE_PAT }} + run: | + set -o pipefail + if OUTPUT=$(vsce publish --pre-release --packagePath agentops-skills.vsix -p "${VSCE_PAT}" 2>&1); then + RC=0 + else + RC=$? + fi + echo "$OUTPUT" + if [ "$RC" -ne 0 ]; then + if echo "$OUTPUT" | grep -qi "already exists"; then + echo "::warning::VSIX pre-release version already published. Treating as success." + exit 0 + fi + exit "$RC" + fi - name: Show VSIX info working-directory: plugins/agentops @@ -421,9 +439,27 @@ jobs: run: vsce package --pre-release -o "${VSIX_FILE}" - name: Publish pre-release tombstone to VS Code Marketplace - continue-on-error: true # Tolerate "already exists" for pre-release builds + # Tolerate ONLY the "already exists" case (re-run of the same pre-release + # version). Any other failure (auth, network, validation) must fail the job + # so staging surfaces real publish problems instead of silently green-lighting. working-directory: tombstones/vscode - run: vsce publish --pre-release --packagePath "${VSIX_FILE}" -p "${{ secrets.VSCE_PAT }}" + env: + VSCE_PAT: ${{ secrets.VSCE_PAT }} + run: | + set -o pipefail + if OUTPUT=$(vsce publish --pre-release --packagePath "${VSIX_FILE}" -p "${VSCE_PAT}" 2>&1); then + RC=0 + else + RC=$? + fi + echo "$OUTPUT" + if [ "$RC" -ne 0 ]; then + if echo "$OUTPUT" | grep -qi "already exists"; then + echo "::warning::Tombstone VSIX pre-release version already published. Treating as success." + exit 0 + fi + exit "$RC" + fi - name: Show tombstone VSIX info working-directory: tombstones/vscode