name: releng-next
description: Switch all GLSP repositories from their release version to the next nightly (-next) version after a release — fresh-clones every repo, runs releng prepare next to open "Switch to nightly" PRs, and optionally polls CI and squash-merges each PR once green.
disable-model-invocation: true
Releng: Switch to Next
Switch every GLSP repository from its release version to the next nightly (-next) version by running releng prepare next in a fresh clone of each repo, opening one "Switch to nightly" PR per repo, and (optionally) auto-merging each PR after its CI passes.
This skill operates entirely on fresh clones in a temp directory — it never touches the user's existing working clones, so no git hygiene (branch/dirty/stale checks) is required.
Inputs
All inputs are taken from the user's prompt. Use the defaults below for anything not mentioned.
- target repos (optional): the user may name one or more specific repos to operate on (e.g. "just
glsp-eclipse-integration", "only the npm repos"). Only those repos are cloned and processed; everything else is left untouched. This is the mechanism for a partial run — most importantly, re-runningglsp-eclipse-integrationon its own onceglsp-server's nightly P2 is published (see Dependency ordering in Conventions). Default: all 8 repos. auto-merge(optional): after all PRs are created, poll each PR's checks and squash-merge it once green. Withauto-mergethe run also goes end-to-end — afterglsp-servermerges it waits for the server nightly P2 to publish, then retries and merges the deferredglsp-eclipse-integration(Phase 4b). Default: off.- no-push (optional): if the user asks to not push / run locally / dry-run, pass
--no-pushtoprepare next. The version bump andnightly-<version>commit are made in the temp clone but nothing is pushed and no PR is created. Default: push enabled. - draft (optional): if the user asks for draft PRs, pass
--drafttoprepare nextso the PRs are created as drafts. Only meaningful when pushing. Default: non-draft. - Poll interval (default
60s) and overall timeout (default60min): only relevant withauto-merge. The user may override these.
Input interactions
- no-push + auto-merge is contradictory — no PRs exist to merge. If both are requested, honor no-push and skip the auto-merge phase, telling the user why.
- draft + auto-merge is contradictory — a draft PR signals "not ready to merge". If both are requested, create the draft PRs but do not auto-merge them; leave them as drafts for manual review and say so.
- no-push + draft: draft has no effect (nothing is pushed). Just proceed with no-push.
Conventions
- Always use the local CLI built from this tooling repo:
yarn glsp …(nevernpx @eclipse-glsp/cli). The maintainer wants the behavior of the code as it currently stands. releng prepare nextandreleng versionaccept-r/--repoDir <dir>andcdinto it internally, so stay in the tooling repo and point-rat each temp clone — do not run from inside each repo.- Continue-on-error. Never abort the whole run because one repo failed. Collect outcomes and report them at the end in the four buckets.
- The 8 GLSP repos are:
glsp,glsp-client,glsp-server-node,glsp-theia-integration,glsp-vscode-integration,glsp-eclipse-integration,glsp-server,glsp-playwright. - Java repos (version lives in a
pom.xml, notpackage.json):glsp-serverandglsp-eclipse-integration. All others are npm repos. - Dependency ordering —
glsp-eclipse-integrationdepends onglsp-serveralready being on next. The Eclipse integration's server module builds (Tycho) against a P2 target platform that points athttps://download.eclipse.org/glsp/server/p2/nightly/<major>.<minor>/(e.g.…/nightly/2.8/). That P2 site only exists onceglsp-serveris on the matching next version and its nightly CI has deployed the new P2 repository — which happens only afterglsp-server's "Switch to nightly" PR is merged. So runningprepare nextforglsp-eclipse-integrationbefore that P2 is live fails at the build step withNo repository found at …/p2/nightly/<major>.<minor>. Therefore: always processglsp-eclipse-integrationlast, and treat that specific error as ⏸️ deferred, not ❌ failed (Phase 2). Withauto-merge, the skill unblocks it end-to-end (Phase 4b); without it, the user re-runs the skill forglsp-eclipse-integrationalone once the P2 is up.
Phase 0: Preconditions
Run from the tooling repo root (glsp/glsp).
Verify the GitHub CLI is authenticated:
gh auth statusIf this fails, stop and tell the user to authenticate
ghfirst (they need push rights to theeclipse-glsporg).Build the local CLI so
dist/cli.jsis current:yarnConfirm
yarn glsp --helpworks before continuing.
Phase 1: Fresh checkout
Create a dedicated, timestamped temp directory and record its path as
WORKDIR:WORKDIR="${TMPDIR:-/tmp}/glsp-release-next-$(date +%Y%m%d-%H%M%S)" mkdir -p "$WORKDIR" echo "$WORKDIR"Remember
WORKDIR— it is printed again at cleanup time and referenced throughout.Clone the target repos fresh into
WORKDIR, from the real upstream (no fork, soorigin = eclipse-glspand pushes/PRs target upstream):# full run (default): all 8 repos yarn glsp repo clone --preset all -d "$WORKDIR" # partial run: only the repos the user named (repo clone takes positional names) yarn glsp repo clone <repo> [<repo> …] -d "$WORKDIR"Each repo lands at
$WORKDIR/<repo>on its default branch. If any clone fails, record it as a failure for that repo but continue.
Phase 2: Per-repo prepare-next
Process each cloned repo independently. Track each repo's outcome in one of four buckets: ✅ PR created · ⏭️ skipped (already on next) · ⏸️ deferred (blocked on glsp-server nightly P2) · ❌ failed (reason).
Processing order: always process glsp-eclipse-integration last (after all other targeted repos), because its build depends on glsp-server's next P2 being published — see Dependency ordering in Conventions.
For each repo at $WORKDIR/<repo>:
Step 2.1: Precondition — must be on a release version, not already on next
Read the current version directly from the appropriate file:
- npm repos → root
package.json→version glsp-server→pom.xml→ first<version>glsp-eclipse-integration→server/pom.xml→ first<version>
If the version ends with -next or .SNAPSHOT, the repo is already on next → ⏭️ skip it (do not run prepare, do not push anything) and record the reason. Otherwise continue.
Step 2.2: Run prepare next
Build the command from the resolved inputs:
yarn glsp releng prepare next -r "$WORKDIR/<repo>" [--no-push] [--draft]
Add --no-push if no-push was requested, and --draft if draft was requested (draft is ignored by prepare when --no-push is also set).
This is atomic: version-bump → build → commit a nightly-<version> branch → (unless --no-push) push → open the "Switch to nightly" PR. The build step is the verification — there is no separate verify step.
- If the command throws (e.g. build failure, push rejected) → nothing was pushed:
- Special case —
glsp-eclipse-integrationwhose error containsNo repository found at …/p2/nightly/<major>.<minor>→ this is the expected upstream-ordering block (theglsp-servernext P2 is not published yet), not a real failure → record ⏸️ deferred, capture the missing P2 URL and the<major>.<minor>. Then:- with
auto-merge→ it will be unblocked end-to-end in Phase 4b. - without
auto-merge→ remediation: merge theglsp-server"Switch to nightly" PR, wait for its nightly CI to deploy…/p2/nightly/<major>.<minor>/, then re-run this skill targeting onlyglsp-eclipse-integration.
- with
- Any other throw → record ❌ failed with the error reason.
- Continue to the next repo either way.
- Special case —
- If it succeeds:
- push enabled → record ✅ PR created and capture the PR URL (from the command output, or
gh pr list --repo eclipse-glsp/<repo> --head nightly-<version> --json url). Note whether it is a draft. - no-push → record ✅ branch prepared (local, not pushed) with the
nightly-<version>branch name and the temp-clone path.
- push enabled → record ✅ PR created and capture the PR URL (from the command output, or
Phase 3: Listing checkpoint
After all repos have been processed, print a clear summary with the four buckets:
✅ PR created (or, with no-push: "Branch prepared (local)")
- <repo>: <pr-url> (draft PRs marked "(draft)")
... (no-push: "<repo>: nightly-<version> @ <temp-path>")
⏭️ Skipped (already on next)
- <repo>: version <x.y.z-next>
...
⏸️ Deferred (blocked on glsp-server nightly P2)
- glsp-eclipse-integration: needs .../p2/nightly/<major>.<minor>/
...
❌ Failed
- <repo>: <reason>
...
This listing always happens, regardless of auto-merge / no-push / draft.
If glsp-eclipse-integration landed in ⏸️ deferred and auto-merge is off, spell out the remediation in the report: merge the glsp-server "Switch to nightly" PR, wait for its nightly CI to publish …/p2/nightly/<major>.<minor>/, then re-run this skill targeting only glsp-eclipse-integration. (With auto-merge on, Phase 4b handles this automatically.)
Phase 4: Auto-merge (only if auto-merge)
Skip this phase entirely (and tell the user why) if no-push was used (no PRs exist) or if draft was used (drafts are left for manual review) — see Input interactions.
Operate per-PR and independently — merge each PR as soon as its own checks are green; do not wait for the others. Only ever act on the ✅ PR created bucket here; the ⏸️ deferred glsp-eclipse-integration is handled afterward in Phase 4b (which depends on the glsp-server PR merging first).
Loop every 60s (or the user-specified interval) until every ✅-PR has reached a terminal state or the 60min (or user-specified) overall timeout elapses. For each not-yet-resolved PR:
gh pr checks <pr-url>
- All checks green → squash-merge and delete the branch:
(No approval step — GLSP repos have no required-review rule.) Mark merged.gh pr merge <pr-url> --squash --delete-branch - No checks registered yet (just pushed) → treat as still pending; keep waiting. Never merge a PR before CI has attached.
- A check failed → stop watching it; mark CI failed (not merged).
- Timeout reached → leave any still-pending PRs open; mark them timed out (not merged).
Never force-merge and never bypass checks.
After the loop, print a final report listing every PR with its terminal state: merged / CI failed / timed out / pending.
Phase 4b: Unblock deferred glsp-eclipse-integration (auto-merge only)
Run this only when auto-merge is on and glsp-eclipse-integration is in the ⏸️ deferred bucket. It is what lets a full auto-merge run finish the entire switch end-to-end.
Preconditions inside this phase:
- The
glsp-serverPR must have merged in Phase 4. If it endedCI failed/timed out/pending, eclipse-integration stays deferred (its P2 will never appear) — report that and stop here.
Steps (share the same overall timeout as Phase 4):
- Wait for the server nightly P2 to publish. After
glsp-servermerges, its nightly CI deploys…/p2/nightly/<major>.<minor>/. Poll that URL every poll-interval until it resolves to a real repository (not a 404):
The nightly deploy is not instant — it may take many minutes after merge. If the overall timeout elapses first, leave eclipse-integration deferred and report it.curl -sfI "https://download.eclipse.org/glsp/server/p2/nightly/<major>.<minor>/p2.index" >/dev/null && echo up - Retry prepare next for eclipse-integration (same flags as the original run, push enabled):
yarn glsp releng prepare next -r "$WORKDIR/glsp-eclipse-integration"- Throws again with the same P2 error → P2 not actually ready; keep polling (step 1) until timeout.
- Other throw → record ❌ failed.
- Succeeds → record ✅ PR created, capture the PR URL.
- Auto-merge the new PR using the same green-checks →
gh pr merge --squash --delete-branchlogic as Phase 4, within the remaining timeout.
Fold the eclipse-integration outcome into the final Phase 4 report.
Phase 5: Cleanup (always — final step)
Ask the user whether to delete WORKDIR. Timing:
- No
auto-merge→ ask right after the Phase 3 listing. auto-merge→ ask after the Phase 4 merge loop (and Phase 4b, if it ran) finishes.
Always print the WORKDIR path so the user can inspect it. If the user declines, leave it in place.
If no-push was used, warn before deleting: the prepared nightly-<version> branches exist only in WORKDIR and have not been pushed anywhere — deleting it discards them.
rm -rf "$WORKDIR" # only if the user confirms