Files
skills/scripts/sync-plugin-version.mjs
Matt PocockandClaude Opus 5 a16a2674bc refactor: flatten skills/ and adopt Agent Plugins 1.0
The Agent Plugins standard reads only the immediate children of
skills/ and cannot be pointed elsewhere, so a bucketed tree is
invisible to every conformant client.

Rather than generate a flat copy of the repo into a package
directory — a builder, a validator, an allowlist, a drift CI job,
and every skill committed twice — remove the buckets.

- skills/ is flat and holds exactly the promoted 25
- in-progress/ -> drafts/, misc/ -> extras/, deprecated/ deleted
- new root plugin.json (Agent Plugins 1.0)
- .claude-plugin/plugin.json loses its 25-entry skills array
- docs/ keeps its category folders; it is now the only place a
  skill's category lives

Reasoning in .agents/adr/0003.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 16:50:39 +01:00

56 lines
1.7 KiB
JavaScript

#!/usr/bin/env node
// Copies package.json's version into every plugin manifest:
// plugin.json — the Agent Plugins 1.0 manifest
// .claude-plugin/plugin.json — the Claude Code manifest
// Runs as part of `npm run version`, immediately after `changeset version`.
// With --check it changes nothing and exits 1 if any version differs.
import { readFileSync, writeFileSync } from "node:fs";
import { dirname, join, relative } from "node:path";
import { fileURLToPath } from "node:url";
const repo = join(dirname(fileURLToPath(import.meta.url)), "..");
const manifests = [
join(repo, "plugin.json"),
join(repo, ".claude-plugin", "plugin.json"),
];
const { version } = JSON.parse(readFileSync(join(repo, "package.json"), "utf8"));
const check = process.argv.includes("--check");
let failed = false;
for (const path of manifests) {
const name = relative(repo, path);
const source = readFileSync(path, "utf8");
const manifest = JSON.parse(source);
if (manifest.version === version) {
console.log(`${name} version is ${version} — already in sync`);
continue;
}
if (check) {
console.error(
`${name} version is ${manifest.version}, package.json is ${version}. Run \`node scripts/sync-plugin-version.mjs\`.`,
);
failed = true;
continue;
}
// Rewrite only the version line, to keep the key order and the formatting.
const updated = source.replace(
/("version"\s*:\s*")[^"]*(")/,
`$1${version}$2`,
);
if (JSON.parse(updated).version !== version) {
console.error(`Could not find a version field to replace in ${path}.`);
process.exit(1);
}
writeFileSync(path, updated);
console.log(`${name} version ${manifest.version} -> ${version}`);
}
process.exit(failed ? 1 : 0);