Version Packages - #102
Merged
Merged
Version Packages#102
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
3 times, most recently
from
July 19, 2026 18:56
ba3077b to
bb8a583
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 27, 2026 18:26
bb8a583 to
d264041
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@ai-plugin-marketplace/cli@0.7.0
Minor Changes
#99
7efeba9Thanks @mike-north! - Makeaipm add-targetpreserve-or-warn instead of refusing an already-materialized target andgenerating a schema-invalid skeleton on retry.
Previously,
add-targetthrewRefusing to overwritewhen any file the target would writealready existed — including the common case where the target is already fully scaffolded — and
the printed remedy ("remove the file, then re-run") regenerated a placeholder with a blanked
description, which is schema-invalid for targets whose manifest requires a non-emptydescription(e.g. Vercel'sSKILL.md), immediately failingaipm build.no-op:
addTarget()resolves with{ status: 'already-present', written: [], preserved: [...] }and the CLI prints
'<target>' is already present in <plugin>; nothing to do.instead ofthrowing.
existing file(s) are preserved untouched and only the missing file(s) are written
(
status: 'partially-added'); the CLI reports which files were preserved so the author canreview them by hand.
addTarget()'s public return type changes fromPromise<void>toPromise<AddTargetOutcome>(new exported type:{ target, status, written, preserved }).SKILL.mddescription) are nowemitted as non-empty placeholder prose instead of a blank string, so add-target's own output
always passes
aipm build/aipm validate.#106
45d20f7Thanks @mike-north! - Warnaipm initabout an ancestor pnpm workspace instead of leaving newcomers to silentlycorrupt it, and sync the CLI's
README.md/docs quick start withaipm --help.A directory with no local
package.jsonthat sits under an ancestorpnpm-workspace.yamlhaspnpm add/pnpm installsilently target the ANCESTOR's manifest and lockfile instead of a newrepo's own — a first-time user following the old quick start verbatim could corrupt an unrelated
parent project with no warning.
init()'s public return type changes fromPromise<void>toPromise<InitOutcome>(newexported type:
{ ancestorWorkspace?: string }).ancestorWorkspaceis the absolute path to anancestor
pnpm-workspace.yaml, when one exists above the newly scaffolded directory.aipm initprints a warning to stderr whenancestorWorkspaceis set, before telling the userto run
pnpm install.packages/cli/README.md("GUIDE.md" in the published package) now: requiresnpm init -ybefore the install command, with an explicit workspace-hazard note; documents the
lintcommand and every subcommand's flags (previously undocumented, though implemented); includes
the quick start's install step; and replaces the dead
../../docs/specs/architecture.mdrelative link (only resolvable inside the monorepo checkout, not the published npm package)
with an absolute GitHub URL.
#107
9467da0Thanks @mike-north! - Removevercelfrom the default set of targets a freshaipm scaffold/core.scaffold()declares.vercel's only build artifact is an author-authoredskills/<name>/SKILL.md, which the scaffoldnever seeds — so a plugin created with the default target set declared
vercelbut emitted zeroartifacts for it anywhere on
aipm build, whileaipm list-targets/aipm check-supportreportedit as fully supported. A fresh scaffold now declares every known target except
vercel;vercelremains fully supported and can still be requested explicitly via
core.scaffold(name, { targets: [...] })or added to an existing plugin withaipm add-target <plugin> vercel.Patch Changes
#98
8a72630Thanks @mike-north! - Fixaipm validate/aipm buildsilently ignoring a plugin-shapedplugins/*directory (has atarget manifest and/or a skill) that is missing
aipm.config.ts. Discovery previously filteredrepo-root candidates on config presence alone, so such a directory never reached the plugin list —
validatereported green andbuildreported "Built 0 plugin(s)" with exit 0 even though theplugin was broken and unbuildable. Discovery now also includes plugin-shaped-but-configless
directories; downstream handling is unchanged (hard
envelope-invalidfromvalidate, a thrownerror naming the missing
aipm.config.tsfrombuild) — the same diagnostic a single-plugintarget missing its config already produced. A directory with neither a config nor any plugin-shape
marker is still correctly excluded from discovery.
#110
4e5f352Thanks @mike-north! - Fix three CLI output-wording/ordering defects that misled users during a normal build/validaterun (no behavior change — the same conditions are still detected, only how/when they are
reported changes):
missingwith a"run
aipm build" hint, instead ofstale.aipm build'sBuilt N plugin(s), M artifact(s).success line no longer prints when thepost-build
validatestep has a hard finding that fails the run.version-consistencyfinding now hints thataipm.config.tsis the source of truth forthe version, so the manifest — not the config — is the one to bump.
#104
fa00aaeThanks @mike-north! - Fixaipm init'sREADME.mdandaipm scaffold's KiroPOWER.mdemitting literalbackslash-backtick sequences (
\`, byte pair5c 60) instead of real backtick characters(
0x60), which rendered the generated Markdown visibly broken.Root cause: these templates are tagged with
String.raw(the project convention for multi-lineembedded Markdown, which disables escape-sequence interpretation), but their source still wrote an
escaped backtick (
\`) to embed a literal backtick character — the escape is only interpretedin an ordinary template literal, so under
String.rawit stayed as the two literal charactersbackslash + backtick. Both templates now interpolate a
bt = '`'constant instead of escapingthe backtick in the template source.
Also fixes Kiro's
POWER.md"Related Files" bullet, which presentedsteering/as an existingsibling file even though a freshly-scaffolded plugin has no
steering/directory (Kiro's scaffoldcontributes only
POWER.md) — it now reads`steering/` (optional, hand-authored) — add Kiro steering files here if needed.#100
dbc0e68Thanks @mike-north! - Fixaipm validateandaipm lintsilently accepting a Claudeplugin.jsonthat is valid JSON but omits a schema-required field (e.g.name) — this now emits a hardschema-invalidfinding /schema/target-conformancediagnostic, matching the other targets' behavior.aipm lint --format json'ssummary.fileCountnow reflects the files a run actually scanned (LintResult.scannedFiles) instead of the number of distinct files a diagnostic happened to be attached to, which previously stayed pinned regardless of manifest changes.#103
43db451Thanks @mike-north! - Fix-h/--helpon subcommands (build,validate,lint,scaffold,init,migrate,check-support,add-target,list-targets) executing the subcommand instead of printing usage —aipm build --helpran a real build, andaipm validate --helpmisparsed--helpas the target path.--help/-hnow short-circuits to usage and exits 0 before any argument parsing or side effect, for every subcommand.Updated dependencies [
7efeba9,5e45ad5,8a72630,4e5f352,fa00aae,dbc0e68,45d20f7,9467da0]:@ai-plugin-marketplace/core@0.10.0
Minor Changes
#99
7efeba9Thanks @mike-north! - Makeaipm add-targetpreserve-or-warn instead of refusing an already-materialized target andgenerating a schema-invalid skeleton on retry.
Previously,
add-targetthrewRefusing to overwritewhen any file the target would writealready existed — including the common case where the target is already fully scaffolded — and
the printed remedy ("remove the file, then re-run") regenerated a placeholder with a blanked
description, which is schema-invalid for targets whose manifest requires a non-emptydescription(e.g. Vercel'sSKILL.md), immediately failingaipm build.no-op:
addTarget()resolves with{ status: 'already-present', written: [], preserved: [...] }and the CLI prints
'<target>' is already present in <plugin>; nothing to do.instead ofthrowing.
existing file(s) are preserved untouched and only the missing file(s) are written
(
status: 'partially-added'); the CLI reports which files were preserved so the author canreview them by hand.
addTarget()'s public return type changes fromPromise<void>toPromise<AddTargetOutcome>(new exported type:{ target, status, written, preserved }).SKILL.mddescription) are nowemitted as non-empty placeholder prose instead of a blank string, so add-target's own output
always passes
aipm build/aipm validate.#113
5e45ad5Thanks @mike-north! - Reject a Claude manifesthooksreference to the auto-loadedhooks/hooks.jsonClaude Code auto-loads
<pluginDir>/hooks/hooks.jsonand refuses to load a plugin whose.claude-plugin/plugin.jsonhooksfield names that same file ("Duplicate hooks file detected …The standard hooks/hooks.json is loaded automatically, so manifest.hooks should only reference
additional hook files").
aipm validatenow emits a hardschema-invalidfinding when thehooksfield — a string, or any string entry when it is an array — normalizes to
hooks/hooks.json, witha hint to drop the reference. Claude's generated hooks artifact remains
hooks/claude.json.#106
45d20f7Thanks @mike-north! - Warnaipm initabout an ancestor pnpm workspace instead of leaving newcomers to silentlycorrupt it, and sync the CLI's
README.md/docs quick start withaipm --help.A directory with no local
package.jsonthat sits under an ancestorpnpm-workspace.yamlhaspnpm add/pnpm installsilently target the ANCESTOR's manifest and lockfile instead of a newrepo's own — a first-time user following the old quick start verbatim could corrupt an unrelated
parent project with no warning.
init()'s public return type changes fromPromise<void>toPromise<InitOutcome>(newexported type:
{ ancestorWorkspace?: string }).ancestorWorkspaceis the absolute path to anancestor
pnpm-workspace.yaml, when one exists above the newly scaffolded directory.aipm initprints a warning to stderr whenancestorWorkspaceis set, before telling the userto run
pnpm install.packages/cli/README.md("GUIDE.md" in the published package) now: requiresnpm init -ybefore the install command, with an explicit workspace-hazard note; documents the
lintcommand and every subcommand's flags (previously undocumented, though implemented); includes
the quick start's install step; and replaces the dead
../../docs/specs/architecture.mdrelative link (only resolvable inside the monorepo checkout, not the published npm package)
with an absolute GitHub URL.
#107
9467da0Thanks @mike-north! - Removevercelfrom the default set of targets a freshaipm scaffold/core.scaffold()declares.vercel's only build artifact is an author-authoredskills/<name>/SKILL.md, which the scaffoldnever seeds — so a plugin created with the default target set declared
vercelbut emitted zeroartifacts for it anywhere on
aipm build, whileaipm list-targets/aipm check-supportreportedit as fully supported. A fresh scaffold now declares every known target except
vercel;vercelremains fully supported and can still be requested explicitly via
core.scaffold(name, { targets: [...] })or added to an existing plugin withaipm add-target <plugin> vercel.Patch Changes
#98
8a72630Thanks @mike-north! - Fixaipm validate/aipm buildsilently ignoring a plugin-shapedplugins/*directory (has atarget manifest and/or a skill) that is missing
aipm.config.ts. Discovery previously filteredrepo-root candidates on config presence alone, so such a directory never reached the plugin list —
validatereported green andbuildreported "Built 0 plugin(s)" with exit 0 even though theplugin was broken and unbuildable. Discovery now also includes plugin-shaped-but-configless
directories; downstream handling is unchanged (hard
envelope-invalidfromvalidate, a thrownerror naming the missing
aipm.config.tsfrombuild) — the same diagnostic a single-plugintarget missing its config already produced. A directory with neither a config nor any plugin-shape
marker is still correctly excluded from discovery.
#110
4e5f352Thanks @mike-north! - Fix three CLI output-wording/ordering defects that misled users during a normal build/validaterun (no behavior change — the same conditions are still detected, only how/when they are
reported changes):
missingwith a"run
aipm build" hint, instead ofstale.aipm build'sBuilt N plugin(s), M artifact(s).success line no longer prints when thepost-build
validatestep has a hard finding that fails the run.version-consistencyfinding now hints thataipm.config.tsis the source of truth forthe version, so the manifest — not the config — is the one to bump.
#104
fa00aaeThanks @mike-north! - Fixaipm init'sREADME.mdandaipm scaffold's KiroPOWER.mdemitting literalbackslash-backtick sequences (
\`, byte pair5c 60) instead of real backtick characters(
0x60), which rendered the generated Markdown visibly broken.Root cause: these templates are tagged with
String.raw(the project convention for multi-lineembedded Markdown, which disables escape-sequence interpretation), but their source still wrote an
escaped backtick (
\`) to embed a literal backtick character — the escape is only interpretedin an ordinary template literal, so under
String.rawit stayed as the two literal charactersbackslash + backtick. Both templates now interpolate a
bt = '`'constant instead of escapingthe backtick in the template source.
Also fixes Kiro's
POWER.md"Related Files" bullet, which presentedsteering/as an existingsibling file even though a freshly-scaffolded plugin has no
steering/directory (Kiro's scaffoldcontributes only
POWER.md) — it now reads`steering/` (optional, hand-authored) — add Kiro steering files here if needed.#100
dbc0e68Thanks @mike-north! - Fixaipm validateandaipm lintsilently accepting a Claudeplugin.jsonthat is valid JSON but omits a schema-required field (e.g.name) — this now emits a hardschema-invalidfinding /schema/target-conformancediagnostic, matching the other targets' behavior.aipm lint --format json'ssummary.fileCountnow reflects the files a run actually scanned (LintResult.scannedFiles) instead of the number of distinct files a diagnostic happened to be attached to, which previously stayed pinned regardless of manifest changes.