Skip to content

CEXT-6367: implement skills release process and promotion workflow#540

Merged
obarcelonap merged 16 commits into
mainfrom
skills-publication-impl
Jul 10, 2026
Merged

CEXT-6367: implement skills release process and promotion workflow#540
obarcelonap merged 16 commits into
mainfrom
skills-publication-impl

Conversation

@obarcelonap

Copy link
Copy Markdown
Member

Description

Implements the skills release process defined in the spec PR. Plugin packages gain package.json files so changesets can version them, the publish-public.yml workflow gains a promotion step that opens a PR in adobe/skills on release, and a shared sync script keeps tile.json and .claude-plugin/plugin.json in sync with the authoritative package.json version.

Related Issue

https://jira.corp.adobe.com/browse/CEXT-6367

Motivation and Context

Commerce plugins in adobe/aio-commerce-sdk have no automated path to adobe/skills. Without this, production consumers cannot install them through the stable channel and promotion requires manual file copying with no traceability.

How Has This Been Tested?

Unit tests cover the full promotion script: plugin version detection, artifact preparation, the full git path (checkout → copy → commit → push → PR create/update), and idempotent reruns. A version-consistency regression test asserts that package.json, tile.json, and .claude-plugin/plugin.json all carry the same version for every plugin.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • I have signed the Adobe Open Source CLA.
  • My code follows the code style of this project.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have read the CONTRIBUTING document.
  • I have read the DEVELOPMENT document.
  • I have added tests to cover my changes.
  • All new and existing tests passed.

@changeset-bot

changeset-bot Bot commented Jun 25, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: d5e5f4f

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
Name Type
@adobe/aio-commerce-plugin-app-management Minor
@adobe/aio-commerce-plugin-app-migration Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions github-actions Bot added with-changeset The PR contains a Changeset file. scripts Includes changes in `scripts` spec Includes changes in `specs/features` labels Jun 25, 2026
Base automatically changed from worktree-CEXT-6367-spec to main June 30, 2026 15:32
@obarcelonap obarcelonap force-pushed the skills-publication-impl branch from 9e30f3d to d4a0809 Compare June 30, 2026 15:32
# Conflicts:
#	plugins/commerce/app-management/skills/commerce-app-admin-ui/SKILL.md

@iivvaannxx iivvaannxx left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I have a feeling many logic in the promote-skills script can probably be removed and repalced by one of the many packages that changesets offers to work with their files. See their packages (many are published to npm and you can pull them in as deps in the scripts workspace)

Comment thread .github/DEVELOPMENT.md
Comment thread scripts/source/ci/release/promote-skills.ts Outdated
Comment thread .github/workflows/publish-public.yml
Comment thread scripts/source/ci/release/promote-skills.ts
Comment thread scripts/source/ci/release/promote-skills.ts Outdated
Comment thread plugins/commerce/scripts/sync-plugin-version.mjs Outdated
Comment thread scripts/source/ci/release/promote-skills.ts Outdated
@iivvaannxx

Copy link
Copy Markdown
Collaborator

Also, do we want to handle promotion/publish to the Tessl registry?

@obarcelonap

Copy link
Copy Markdown
Member Author

Also, do we want to handle promotion/publish to the Tessl registry?

Only one set of skills in adobe/skills is published in Tessl registry. From my perspective, the tool is under evaluation, I'd keep it to asses if is useful for us for testing without wasting much effort.
In any case, you can also install directly from a gh repo using tessl install github:owner/repo

@obarcelonap

Copy link
Copy Markdown
Member Author

I have a feeling many logic in the promote-skills script can probably be removed and repalced by one of the many packages that changesets offers to work with their files. See their packages (many are published to npm and you can pull them in as deps in the scripts workspace)

Looked into this TLDR; none of the packages under changesets actually cover what this script needs.

The core issue: plugins/commerce/app-management and plugins/commerce/app-migration are both "private": true, and changesets' publish path explicitly filters private packages out before publishing (publicPackages = packages.filter(pkg => !pkg.packageJson.private) in @changesets/cli). So there's no changesets output — job output or library — that reports version changes for these plugins; the detection has to happen independently, which is what getChangedPluginPackagePaths/packageVersionChanged does.

I did consider @changesets/git's getChangedPackagesSinceRef as a drop-in for the git-diff part, but it shells out to real git directly rather than going through the injected exec we use everywhere else in scripts/source/ci/release/*, which would mean rewriting the tests to use real git repos instead of the current mocked-exec fixtures. snapshot.ts already made the same call elsewhere in this directory — shelling out to changesets' documented CLI/action outputs rather than depending on its internal helper packages (which the @changesets/git README itself says aren't meant to be a stable public surface).

obarcelonap and others added 5 commits July 6, 2026 11:25
- derive TARGET_REPOSITORY_URL from TARGET_OWNER/TARGET_REPO
- collapse promotion cp calls into a loop over PROMOTED_ENTRIES
- explain why the changed-plugins workflow step gates on hasChangesets
- move sync-plugin-version.mjs into scripts/ as an sdk-sync-plugin-version
  bin, wired the same way as sdk-prepack/sdk-postpack, and dedupe its
  readJson/writeJson helpers with promote-skills.ts via ci/release/utils.ts
# Conflicts:
#	plugins/commerce/app-management/skills/commerce-app-storage/SKILL.md
writeJson wrote plain JSON.stringify output, which always expands arrays
onto multiple lines. Biome collapses short arrays onto one line, so any
plugin version bump touching a manifest with an array field (e.g.
tile.json/plugin.json keywords) failed the pre-commit hook. writeJson now
runs biome check --write on the file after writing it.

Also fixes plugins/commerce/app-management's package.json version, which
was left at 1.1.2 after merging main: main directly bumped tile.json and
.claude-plugin/plugin.json to 1.1.3 for #553 before this branch introduced
package.json as the source of truth.

@iivvaannxx iivvaannxx left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approving. Regarding the Changesets utility packages, I did run Opus to check and it did actually find one potential replacement. Find below what it said.

Review: new scripts/ code vs. Changesets built-ins

I read the three new source files against the upstream Changesets v3 clone in changesets/. One clear reinvention, a couple of weak/partial overlaps, and one thing that is not reinventable. Details:

  1. Solid replacement — readChangelogEntries → getChangelogEntry

promote-skills.ts:295-324 hand-rolls a changelog parser: indexOf("## " + version), slice to the next ## , keep lines starting with - .

Changesets already ships this as getChangelogEntry(changelog, version) from @changesets/release-utils (changesets/packages/release-utils/src/utils.ts:33), and it's exported from the package root. It's strictly more robust than the local version — it skips fenced code blocks so it won't match ## headings inside example snippets, and it matches the closing heading by depth instead of any ## .

  • Drop: readChangelogEntries (30 lines).
  • Replace with: import { getChangelogEntry } from "@changesets/release-utils" (add it as a devDependency — it's not in the lockfile yet, only @changesets/git is present transitively).
  • Caveat (behavior change): the local fn returns only - bullet lines as string[]; getChangelogEntry returns { content, highestLevel } where content is the full markdown block (including ### Minor Changes sub-headings). Your buildPromotionPullRequestBody (promote-skills.ts:227) would need to embed content instead of joining a bullet array. The resulting PR body is arguably better (keeps the bump-level subheadings), but it's a visible format change — worth a glance at the promote-skills test snapshots.

@obarcelonap

Copy link
Copy Markdown
Member Author

Approving. Regarding the Changesets utility packages, I did run Opus to check and it did actually find one potential replacement. Find below what it said.

@iivvaannxx looked into this, the mentioned function it is not stable yet and is part of a major changesets upgrade (3.0.0). Therefore, I just added a note in our function so when the new changesets version is released we revaluate if we can change the impl to rely on the changesets' counterpart.

promote-skills.ts and sync-plugin-version.ts only exist on this branch, so
the aa985d5 lint fixup missed them. Parallelize the independent
per-item loops with Promise.all to satisfy noAwaitInLoops, and let
biome sort the object keys it flagged.
…f tile.json

The tessl migration (353577d) replaced tile.json with .tessl-plugin/plugin.json
for app-management and app-migration but never updated the code and docs that
still pointed at the old path, breaking version-consistency.test.ts.

That migration also manually bumped the manifest versions (1.1.3->1.1.4 for
app-management, 1.0.0->1.1.1 for app-migration) without bumping package.json,
which is supposed to be the authoritative source. Bump package.json to match
since the manifest versions are the ones already reflected downstream.
@obarcelonap obarcelonap merged commit 6382582 into main Jul 10, 2026
5 checks passed
@obarcelonap obarcelonap deleted the skills-publication-impl branch July 10, 2026 13:45
obarcelonap added a commit that referenced this pull request Jul 10, 2026
* CEXT-6367: extract MAINTAINERS.md from DEVELOPMENT.md

Move maintainer-only release execution steps (triggering promote.yml,
hotfixes, deploy key rotation, ADOBE_SKILLS_TOKEN provisioning) out of
the contributor-facing DEVELOPMENT.md into a dedicated MAINTAINERS.md,
per discussion on PR #540.

* CEXT-6367: add labeler entries for commerce plugin packages

plugins/commerce/* was registered as a workspace member for the skills
release process, but the PR labeler never got matching entries, so PRs
touching plugin packages received no package-specific label. Also note
in AGENTS.md that new packages need a labeler-config.yml entry, since
the create-package generator doesn't add one automatically.

* CEXT-6367: move /snapshot PR command to MAINTAINERS.md

The docs claimed any open PR could request a snapshot via /snapshot,
but the workflow that handles the comment requires admin permission
on the repo, making it a maintainer-only action.

* Update .github/labeler-config.yml

Co-authored-by: Ivan Porto Wigner <iporto@adobe.com>

* Update .github/CONTRIBUTING.md

Co-authored-by: Ivan Porto Wigner <iporto@adobe.com>

* CEXT-6367: move Back-sync section to MAINTAINERS.md

---------

Co-authored-by: Ivan Porto Wigner <iporto@adobe.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

scripts Includes changes in `scripts` spec Includes changes in `specs/features` with-changeset The PR contains a Changeset file.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants