Fix #4345 (2/4): patch-bump drifted bundled extension versions and sync the catalog - #4394
CrazyBaran wants to merge 7 commits into
Conversation
…xt, git 1.1.0; assess 1.0.1) The bundled agent-context and git extensions have carried version 1.0.0 since they were created while their content kept changing - including fixes for failures that made them unusable on some platforms (agent-context: 15 commits, +1,120/-169 across 7 of its 8 files; git: 23 commits, +2,191/-567 across all 21 files). Because `specify extension update` compares semver only, every installed copy is reported "Up to date (v1.0.0)" forever and never receives those fixes (github#4345). Bump both manifests to 1.1.0 and sync extensions/catalog.json so existing installs finally see an available update. assess also drifted (one docs-only change to a shipped command file since its version was set), so it gets a patch bump to 1.0.1; bug has no drift and stays at 1.0.0. Refs github#4345 Assisted-by: Claude Code (model: claude-fable-5, autonomous) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…em in fixtures Copilot review round 3 on github#4351: the agent-context bump left every checked-in bundle pinned to 1.0.0. BundleExtensionPrimitive enforces exact pins against the bundled manifest, so the offline installs in tests/integration/test_bundler_local_install.py and test_bundler_init_install.py failed, and all four examples/bundles/*/bundle.yml examples stopped being installable. - examples/bundles/{business-analyst,developer,product-manager, security-researcher}/bundle.yml: agent-context pin 1.0.0 -> 1.1.0 (exact pins are the point of the example format, so they stay literal). - The two integration-test fixtures now resolve the pin through a new tests/bundler_helpers.bundled_extension_version() helper, which reads the version via the same _locate_bundled_extension lookup the primitive enforces against - so the fixtures test the bundler's pin mechanics rather than a frozen version literal, and the next legitimate extension bump cannot silently break them again. The git and assess extensions are not pinned by any checked-in bundle; tests/contract/test_bundle_cli.py's 1.0.0 pin feeds `bundle validate`, which checks existence only, and keeps passing unchanged. Refs github#4345 Assisted-by: Claude Code (model: claude-fable-5, autonomous) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
🔵 Needs a closer look
Catalog publication must wait until #4351 is merged and shipped, and that prerequisite remains open.
Pull request overview
Synchronizes bundled extension versions so updates can detect and deliver previously drifted content.
Changes:
- Bumps
agent-contextandgitto 1.1.0, andassessto 1.0.1. - Synchronizes the built-in catalog and example bundle pins.
- Derives test fixture pins from bundled manifests.
File summaries
| File | Description |
|---|---|
extensions/agent-context/extension.yml |
Bumps agent-context version. |
extensions/assess/extension.yml |
Bumps assess version. |
extensions/git/extension.yml |
Bumps git version. |
extensions/catalog.json |
Synchronizes catalog versions and timestamp. |
examples/bundles/business-analyst/bundle.yml |
Updates agent-context pin. |
examples/bundles/developer/bundle.yml |
Updates agent-context pin. |
examples/bundles/product-manager/bundle.yml |
Updates agent-context pin. |
examples/bundles/security-researcher/bundle.yml |
Updates agent-context pin. |
tests/bundler_helpers.py |
Adds bundled-version lookup helper. |
tests/integration/test_bundler_init_install.py |
Uses the current bundled version. |
tests/integration/test_bundler_local_install.py |
Uses the current bundled version. |
tests/extensions/git/test_git_extension.py |
Updates the expected git version. |
Review details
- Files reviewed: 12/12 changed files
- Comments generated: 0
- Review effort level: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
|
@mnriem — all the other parts of the #4345 series have now landed, and this is the last piece.
Merging this is what actually triggers the update: until the catalog advertises the new versions, Happy to rebase if you'd like it on top of the latest 🤖 Generated with Claude Code |
…45-version-bumps-catalog-sync # Conflicts: # tests/integration/test_bundler_local_install.py
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Publishing the catalog before a release contains these bumped manifests leaves released clients unable to install the advertised updates.
Get a fresh assessment by requesting another Copilot review.
Review effort: Balanced
Findings: 1
Address Copilot review on github#4394. The version bumps are only useful if a copy installed before them is actually offered an update, and until now nothing proved that with the real data: unit tests drive the local-package update route with synthetic extensions, and the version contract only checks catalog/manifest equality. Add tests/contract/test_bundled_extension_update_delivery.py, which installs each bundled extension's real source with its manifest rewritten to the pre-bump 1.0.0, runs `extension update` against the real catalog entry and the real bundled copy (download must never be attempted), and asserts the install reaches the catalog version. The three extensions that had drifted at 1.0.0 when github#4345 was filed (agent-context, git, assess) must stay bumped past it - reverting one is a failure, not a skip - while an unbumped extension (bug) skips. A companion test asserts an install already at the bundled version is reported up to date, so fresh installs cannot loop. Fixtures now derive their pins from the bundled manifest, so the four changed examples/bundles/*/bundle.yml pins were no longer exercised by any test even though BundleExtensionPrimitive enforces exact pins. Add a contract test that parses every example bundle and checks each bundled extension pin against its manifest version; it fails when an example is left on a previous version. Refs github#4345 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
The delivery regression suite can silently omit a previously drifted extension from its parameterized coverage.
Get a fresh assessment by requesting another Copilot review.
Review effort: Balanced
Findings: 1
…he delivery tests Address Copilot review round 2 on github#4394. The update-delivery tests draw their parametrized cases from the live catalog, so an extension that lost its `bundled` flag, its catalog entry, or its in-repo manifest silently dropped out of both tests, and the DRIFTED_BEFORE_BUMP guard inside them never ran for it. The previous presence test only asserted the case list was non-empty. Replace it with test_drifted_extensions_are_covered, which asserts every extension in DRIFTED_BEFORE_BUMP is still a bundled, in-repo catalog entry. De-bundling one of them is a deliberate decision that should update that set rather than silently shrink coverage. Verified: clearing the bundled flag on `assess` drops its cases from the parametrized tests and this test is the only one that fails. Refs github#4345 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
mnriem
left a comment
There was a problem hiding this comment.
Any extension, preset, workflow or bundle that is delivered inside of the core is still versioned separately. There is no lock step here with the version of the CLI itself. So please unless the actual extension warrants a minor release it should only really rev the patch version if that was missed
…45-version-bumps-catalog-sync
…rst-party assess bundle pin Review on github#4394: bundled extensions, presets, workflows and bundles are versioned independently of the CLI, so correcting a missed bump should rev the patch version unless the component itself warrants a minor release. Move agent-context and git from the proposed 1.1.0 to 1.0.1 (assess was already 1.0.1) in the manifests, extensions/catalog.json, the four example bundle pins and the git manifest test. Any version above 1.0.0 delivers the full current content, so the step size does not change what installed copies receive. Merging current main also brings in the new first-party bundles/ directory, whose assess bundle pins the extension at an exact 1.0.0; BundleExtensionPrimitive enforces exact pins and test_firstparty_bundle_catalog_consistency.py requires them to match the shipped manifest, so the pin moves to 1.0.1 with the extension. The bundle's own version stays 1.0.0: manifests are fetched live and `bundle update` always re-resolves and refreshes components, so nothing version-gates that change. Refs github#4345 Assisted-by: Claude Code (model: claude-fable-5-1) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Fair point, and done in 0825351 — all three extensions are now at 1.0.1. For the record, why the original proposal was 1.1.0 for That said, your framing is the more useful one: this PR corrects a missed bump rather than cutting a release of those features, and any version above 1.0.0 delivers the full current content to installed copies either way, so the step size changes nothing for users. Patch it is. Two things the merge of current 🤖 Generated with Claude Code |


Fixes the version-drift half of #4345: the bundled
agent-context,gitandassessextensions have carried1.0.0since they were created while their content kept changing, sospecify extension updatecompared equal semvers and reported "Up to date" forever on already-installed copies — the shipped changes were never delivered.Scope (part 2 of the split requested in review)
Following @mnriem's request to split the original #4351 into four parts, this PR carries part 2 — version/catalog bumps and bundle-pin updates, brought up to date with current
main:extensions/agent-context/extension.yml,extensions/git/extension.yml,extensions/assess/extension.yml→ 1.0.1extensions/catalog.jsonsynced to the same versions — the catalog is whatextension updatecompares against, and its preflight rejects a manifest whose version differs from the catalog's, so the two must move togetherbundles/assess/bundle.yml(assesspin) and the fourexamples/bundles/*/bundle.yml(agent-contextpin) → 1.0.1.BundleExtensionPrimitiveenforces exact pins, andtest_firstparty_bundle_catalog_consistency.pyrequires them to equal the shipped version. The assess bundle's own version stays1.0.0: bundle manifests are fetched live andbundle updatealways re-resolves and refreshes components, so nothing version-gates that change.tests/bundler_helpers.py), so the next legitimate bump cannot silently break them; plus thegitmanifest version pin in its testWhy patch bumps
Per the review on this PR: bundled extensions are versioned independently of the CLI, and this change corrects a missed bump rather than cutting a feature release, so all three move by one patch step. The step size does not change what users receive — any version above
1.0.0delivers the full current content of the extension.Sequencing
The ordering constraint from the review is satisfied: #4351 (local bundled-update support) merged on Sep 1 and has shipped in every release from v1.0.6 through v1.0.9, so this PR can land whenever it is approved. Upgraded CLIs install the bumped extensions from their local package; CLIs older than v1.0.6 predate #4351 and will see the offered update fail with a download error until they upgrade — the trade-off accepted in the review sequence.
The version guard from #4395 (merged) passes against this branch:
check_extension_version_bump.py origin/main HEAD→ "all invariants hold".The other parts
feat/4345-content-staleness-detection, to be rebased ontomainand opened as a PRRefs #4345.
🤖 Generated with Claude Code