Skip to content

refactor(ci): scope stable bundle to CLI/SDK/MCP and split wrappers#3070

Merged
caio-pizzol merged 2 commits into
mainfrom
caio/release-bundle-cli-sdk-mcp
May 1, 2026
Merged

refactor(ci): scope stable bundle to CLI/SDK/MCP and split wrappers#3070
caio-pizzol merged 2 commits into
mainfrom
caio/release-bundle-cli-sdk-mcp

Conversation

@caio-pizzol
Copy link
Copy Markdown
Contributor

The previous stable orchestrator released seven packages in one queue slot. A transient fetch failed on esign's recovery probe halted CLI/SDK/MCP and the wrappers. Splitting the surface stops a wrapper hiccup from blocking the tooling release.

  • release-stable.yml is now CLI → SDK → MCP only, with its own concurrency group and id-token: write for PyPI OIDC. MCP added to the orchestrator with the correct pnpm publish form (cwd, not --prefix, which errors EUSAGE).
  • SDK Python publish gates on orchestrator outputs instead of git tag --points-at HEAD — HEAD lands on MCP's commit after the bundle, so the old gate skipped Python every run.
  • superdoc/react/esign/template-builder/vscode-ext have their own stable triggers and per-workflow concurrency groups, so multi-trigger pushes can't cancel pending peers (GitHub allows only one running + one pending per group).
  • promote-stable-docs.yml is new: SuperDoc-only, listens on workflow_run completion, and gates on a real v* tag appearing between the run's head_sha and origin/stable before pushing docs-stable. Wrappers and the tooling bundle do not advance docs.
  • Hardening: stable recovery filters *-next.* tags so a prerelease reachable through a merge commit can't resume as @latest; fetchWithRetry wraps every release-state probe (GitHub, PyPI) with bounded exponential backoff and surfaces the underlying cause instead of swallowing fetch failed.

Semantic-release remains the version authority for all three; the OIDC step on PyPI uses the version semantic-release wrote to pyproject.toml.

Considered an alternative workflow_call chain (SuperDoc → CLI → SDK → MCP) per the impact map's "test broad, release narrow" principle. Three GitHub Actions semantics made it worse than the bundle in practice: shared concurrency cancels pending peers, id-token: write doesn't propagate through nested callees, and overlapping path filters double-fire. The bundle keeps one queue slot, one permission context, deterministic order, and centralized partial-publish recovery.

Verified:

  • node --check scripts/release-local-stable.mjs → OK
  • node --test scripts/__tests__/release-local.test.mjs → 22/24 (the 2 fails — SSH preview URL rewrite and release-esign.yml shared workspace coverage — are pre-existing on main)
  • All 10 release-related YAML files parse via yaml

Review: ignore the two pre-existing test failures listed above; everything else is in scope.

The previous stable orchestrator released seven packages in one queue
slot, so a transient fetch failure during esign's recovery probe halted
CLI/SDK/MCP and the wrappers. Split the surface so a wrapper hiccup can
no longer block the tooling release.

- release-stable.yml is now CLI -> SDK -> MCP only, with its own
  concurrency group (release-stable-tooling) and id-token: write for
  PyPI OIDC. Added MCP to the orchestrator's package list with the
  correct `pnpm publish` form (cwd, not --prefix, which errors EUSAGE).
- SDK Python publish gates on orchestrator outputs instead of
  `git tag --points-at HEAD` - HEAD lands on MCP's commit after the
  bundle, so the old gate skipped Python every time.
- superdoc/react/esign/template-builder/vscode-ext gain their own
  stable triggers and per-workflow concurrency groups so multi-trigger
  pushes don't cancel pending peers.
- promote-stable-docs.yml is new: SuperDoc-only, listens on
  workflow_run completion, and gates on a real v* tag appearing
  between the run's head_sha and origin/stable before pushing
  docs-stable.
- Hardening: stable recovery filters *-next.* tags so a prerelease
  reachable through a merge commit can't resume as @latest;
  fetchWithRetry wraps every release-state probe (GitHub, PyPI) with
  3-attempt exponential backoff and surfaces the underlying cause.

Semantic-release remains the version authority for all three; the
PyPI OIDC publish step uses the version semantic-release wrote to
pyproject.toml.
@caio-pizzol caio-pizzol requested a review from a team as a code owner May 1, 2026 21:52
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 90e0a87cc3

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread .github/workflows/release-react.yml Outdated
@codecov-commenter
Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

Two issues from PR review:

- The tooling bundle's `pnpm run build` only runs build:superdoc and
  type-check; it does not produce apps/mcp/dist. MCP's publish would
  ship a tarball with the declared `dist/index.js` bin missing. Add
  `prepareCmd: 'pnpm run build'` to apps/mcp/.releaserc.cjs so
  semantic-release builds MCP before publish, in any workflow.

- Per-workflow concurrency groups on stable let multiple stable
  release workflows publish in parallel and race on
  `git push origin stable` via @semantic-release/git. The first push
  wins; the rest get non-fast-forward errors after their npm/PyPI
  artifacts already published, leaving orphan releases. Restore the
  shared `release-stable` group across the bundle, superdoc, and the
  four wrapper workflows so semantic-release pushes serialize. The
  cancel-pending behavior on multi-trigger pushes is the lesser evil
  vs. orphaned partial publishes; missed releases recover via
  workflow_dispatch.
@caio-pizzol caio-pizzol merged commit fde6898 into main May 1, 2026
19 checks passed
@caio-pizzol caio-pizzol deleted the caio/release-bundle-cli-sdk-mcp branch May 1, 2026 22:27
@superdoc-bot
Copy link
Copy Markdown
Contributor

superdoc-bot Bot commented May 1, 2026

🎉 This PR is included in @superdoc-dev/mcp v0.3.0

The release is available on GitHub release

@superdoc-bot
Copy link
Copy Markdown
Contributor

superdoc-bot Bot commented May 2, 2026

🎉 This PR is included in @superdoc-dev/mcp v0.3.0-next.33

The release is available on GitHub release

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants