Skip to content

Conversation

@juanpprieto
Copy link
Contributor

@juanpprieto juanpprieto commented Oct 1, 2025

WHY are these changes introduced?

Related to #3233

When merging changesets for only semver packages (cli-hydrogen, mini-oxygen, create-hydrogen), the CalVer enforcement script ran unconditionally and created phantom version bumps for CalVer packages (hydrogen, hydrogen-react, skeleton). This forced maintainers to manually revert changeset commits.

The script checked for changeset files that had already been deleted by changeset version, causing it to skip enforcement for ALL releases including legitimate CalVer releases.

WHAT is this pull request doing?

Primary fix: Guard check now compares actual version changes instead of checking for deleted changeset files.

Additional improvements:

  • Enables independent patch versioning for CalVer packages
  • Keeps major versions synchronized across all CalVer packages
  • Makes CI tests dynamic instead of hardcoded for specific quarters
Change File Impact
Version comparison guard .changeset/enforce-calver-ci.js Skips when no CalVer changes, runs when CalVer packages bumped
Independent patches .changeset/enforce-calver-ci.js CalVer packages can have different patch versions
Synced majors .changeset/enforce-calver-ci.js All CalVer packages advance to same quarter for majors
Dynamic test expectations .github/workflows/test-calver.yml Tests work for any quarter, any year
Full pipeline test .github/workflows/test-calver.yml Test 8 validates complete version script flow
Documentation docs/CALVER.md Documents independent patches behavior

Before:

npm run version:changeset (bumps CLI)
   ↓
enforce-calver-ci.js checks for .md files (deleted)
   ↓
Skips for ALL releases
   ↓
CalVer releases broken, semver creates phantom bumps

After:

npm run version:changeset
   ↓
enforce-calver-ci.js compares versions
   ↓
No CalVer changes → Skip (semver-only)
CalVer changed → Run enforcement
   ↓
Patches: Independent
Majors: Synced to same quarter

HOW to test your changes?

Verify semver-only skips CalVer enforcement

cat > .changeset/test-cli.md << 'EOF'
---
'@shopify/cli-hydrogen': patch
---
Test
EOF

npm run version:changeset
node .changeset/enforce-calver-ci.js
# Expected: "No CalVer package changes detected. Skipping CalVer enforcement."

# Verify
node -p "require('./packages/hydrogen/package.json').version"  # 2025.7.0 (unchanged)

git restore .

Verify CalVer releases run enforcement

cat > .changeset/test-hydrogen.md << 'EOF'
---
'@shopify/hydrogen': patch
---
Test
EOF

npm run version:changeset
node .changeset/enforce-calver-ci.js
# Expected: "Starting CalVer enforcement..."

# Verify
node -p "require('./packages/hydrogen/package.json').version"  # 2025.7.1 (bumped)

git restore .

Verify independent patches

cat > .changeset/test-skeleton.md << 'EOF'
---
'skeleton': patch
---
Test
EOF

npm run version:changeset
node .changeset/enforce-calver-ci.js

# Verify only skeleton changed
node -p "require('./packages/hydrogen/package.json').version"  # 2025.7.0
node -p "require('./templates/skeleton/package.json').version"  # 2025.7.1

git restore .

Verify synced majors

cat > .changeset/test-major.md << 'EOF'
---
'@shopify/hydrogen': major
---
Test
EOF

npm run version:changeset
node .changeset/enforce-calver-ci.js

# Verify all synced
node -p "require('./packages/hydrogen/package.json').version"  # 2025.10.0
node -p "require('./packages/hydrogen-react/package.json').version"  # 2025.10.0
node -p "require('./templates/skeleton/package.json').version"  # 2025.10.0

git restore .

Checklist

  • I've read the Contributing Guidelines
  • I've considered possible cross-platform impacts (Mac, Linux, Windows)
  • I've added a changeset if this PR contains user-facing or noteworthy changes
  • I've added tests to cover my changes
  • I've added or updated the documentation

Previously, enforce-calver-ci.js would unconditionally run for all CalVer
packages (hydrogen, hydrogen-react, skeleton) even when only semver packages
(cli, mini-oxygen, create-hydrogen) had changesets. This caused phantom
version bumps and CHANGELOG entries for CalVer packages with no actual changes.

The fix adds an early exit check that skips CalVer enforcement when no CalVer
changesets are detected, ensuring semver-only releases don't touch CalVer packages.

Fixes the issue seen in PR #3233 where a CLI-only release incorrectly bumped
hydrogen/hydrogen-react/skeleton.
@juanpprieto juanpprieto requested a review from a team as a code owner October 1, 2025 03:21
@shopify
Copy link
Contributor

shopify bot commented Oct 1, 2025

Oxygen deployed a preview of your juanpprieto/fix-calver-semver-only branch. Details:

Storefront Status Preview link Deployment details Last update (UTC)
Skeleton (skeleton.hydrogen.shop) ✅ Successful (Logs) Preview deployment Inspect deployment October 2, 2025 3:47 AM

Learn more about Hydrogen's GitHub integration.

@juanpprieto juanpprieto marked this pull request as draft October 1, 2025 03:28
The guard check was using hasCalVerChangesets() which checks for .md files
in .changeset/ directory. But this runs AFTER 'changeset version' has already
deleted those files, causing the check to always return false and skip
enforcement for ALL releases (including CalVer releases).

Fix: Compare actual version changes by checking if pkg.version differs from
git baseline (oldVersion). This correctly:
- Skips when only semver packages change (no CalVer version changes)
- Runs when any CalVer package version changes
- Works regardless of whether changeset files still exist

The readPackageVersions() function already provides both values for comparison.
enforce-calver-ci.js: Compare version changes instead of checking deleted changeset files
test-calver.yml: Calculate expected branches from actual hydrogen version instead of hardcoding 2025-05
Patches/minors: Each CalVer package uses its own git baseline for independent versioning
Majors: All CalVer packages sync to same quarter using hydrogen's baseline

This allows hydrogen, hydrogen-react, and skeleton to have different patch versions
while ensuring all majors stay synchronized to the same quarter.
When calculating new versions, preserve unchanged packages instead of bumping them.
This enables truly independent patch versioning while maintaining major sync.
Tests complete version script flow for:
- Semver-only releases (validates guard check skips CalVer enforcement)
- CalVer releases (validates enforcement runs and version.ts updates)

This catches regressions in the full pipeline, not just isolated scripts.
CalVer packages now support:
- Independent patch/minor versions (hydrogen@2025.7.2, react@2025.7.0)
- Synchronized major versions (all at 2025.10.0 for Q4)
@juanpprieto juanpprieto marked this pull request as ready for review October 1, 2025 21:28
Creates a dummy patch changeset for cli-hydrogen to validate that:
- Version PR is titled "[ci] release semver" (not CalVer date)
- Only cli-hydrogen is bumped (no CalVer packages touched)
- enforce-calver-ci.js correctly skips CalVer enforcement
@juanpprieto juanpprieto merged commit 0511444 into main Oct 2, 2025
13 checks passed
@juanpprieto juanpprieto deleted the juanpprieto/fix-calver-semver-only branch October 2, 2025 03:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant