mirror of
https://github.com/mattpocock/skills.git
synced 2026-09-12 10:28:06 +07:00
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>
56 lines
1.7 KiB
JavaScript
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);
|