mirror of
https://github.com/anthropics/claude-plugins-official.git
synced 2026-03-19 23:23:07 +00:00
Compare commits
93 Commits
claude/rem
...
staging
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
20a2871e28 | ||
|
|
eea770ef4b | ||
|
|
5b4fbc76a5 | ||
|
|
af77fc06ec | ||
|
|
7348f7db8b | ||
|
|
13c07be30f | ||
|
|
0858040989 | ||
|
|
a60f3967f7 | ||
|
|
2d086a4d92 | ||
|
|
f0cdcea882 | ||
|
|
54c3ce9309 | ||
|
|
00c3276192 | ||
|
|
bc3e363023 | ||
|
|
087bd50cb5 | ||
|
|
458ca6044b | ||
|
|
9fd5306294 | ||
|
|
d324d0b053 | ||
|
|
c60b1dc6e7 | ||
|
|
d35bfa9984 | ||
|
|
e0db9f39c6 | ||
|
|
a376d6d6f6 | ||
|
|
da3d0c3a47 | ||
|
|
7fe4d1ef04 | ||
|
|
d413067b7e | ||
|
|
a4f11db462 | ||
|
|
665abc68a1 | ||
|
|
ed0e76e6cb | ||
|
|
da050f2a1a | ||
|
|
2d4680c1e7 | ||
|
|
b9c6471ce1 | ||
|
|
f07b4b257f | ||
|
|
967638e1b5 | ||
|
|
296cd3b36c | ||
|
|
239340ab3d | ||
|
|
01d24623f9 | ||
|
|
35bc952efe | ||
|
|
862eec6a3d | ||
|
|
42c5575a7c | ||
|
|
388d631c99 | ||
|
|
d16f2a3c99 | ||
|
|
5945a539b3 | ||
|
|
76fda83633 | ||
|
|
987d0f4b2e | ||
|
|
f48826bbfb | ||
|
|
4a928b7b6d | ||
|
|
39ca503ef1 | ||
|
|
223b51d705 | ||
|
|
59d0e2cae4 | ||
|
|
b1cf7acbbe | ||
|
|
b099ab559c | ||
|
|
5c3ffee84f | ||
|
|
e3b83daacd | ||
|
|
761dc5c59f | ||
|
|
b79f313ad5 | ||
|
|
0a74043170 | ||
|
|
121ca90c08 | ||
|
|
e1706ebd52 | ||
|
|
6e4cf38fe2 | ||
|
|
cc9555bb90 | ||
|
|
79bed4d3b0 | ||
|
|
fefdd738be | ||
|
|
0c1407ea30 | ||
|
|
adeb0436c2 | ||
|
|
28ebfe4135 | ||
|
|
3d0d05576d | ||
|
|
124fcfaa1e | ||
|
|
cccd8b3ea2 | ||
|
|
478ea5b46a | ||
|
|
fd805b5e4b | ||
|
|
fd8defbb34 | ||
|
|
328a0a7190 | ||
|
|
3f3d3daeb8 | ||
|
|
f59c36423d | ||
|
|
e97b983948 | ||
|
|
db1e313270 | ||
|
|
c91a334747 | ||
|
|
4f0a09875b | ||
|
|
f3f13c4499 | ||
|
|
a5bd1097e8 | ||
|
|
8a25030d01 | ||
|
|
1086e0cc1a | ||
|
|
c554ce45e3 | ||
|
|
acd3701274 | ||
|
|
cd89e41cf4 | ||
|
|
42d7afb1f0 | ||
|
|
085871e8e7 | ||
|
|
32f2cdbe0c | ||
|
|
24cec23cf1 | ||
|
|
c7ba9d4c43 | ||
|
|
72fa7b63ed | ||
|
|
a5604c1355 | ||
|
|
8e7c0615e6 | ||
|
|
aab3f1ba3f |
File diff suppressed because it is too large
Load Diff
42
.github/scripts/check-marketplace-sorted.ts
vendored
42
.github/scripts/check-marketplace-sorted.ts
vendored
@@ -1,42 +0,0 @@
|
||||
#!/usr/bin/env bun
|
||||
/**
|
||||
* Checks that marketplace.json plugins are alphabetically sorted by name.
|
||||
*
|
||||
* Usage:
|
||||
* bun check-marketplace-sorted.ts # check, exit 1 if unsorted
|
||||
* bun check-marketplace-sorted.ts --fix # sort in place
|
||||
*/
|
||||
|
||||
import { readFileSync, writeFileSync } from "fs";
|
||||
import { join } from "path";
|
||||
|
||||
const MARKETPLACE = join(import.meta.dir, "../../.claude-plugin/marketplace.json");
|
||||
|
||||
type Plugin = { name: string; [k: string]: unknown };
|
||||
type Marketplace = { plugins: Plugin[]; [k: string]: unknown };
|
||||
|
||||
const raw = readFileSync(MARKETPLACE, "utf8");
|
||||
const mp: Marketplace = JSON.parse(raw);
|
||||
|
||||
const cmp = (a: Plugin, b: Plugin) =>
|
||||
a.name.toLowerCase().localeCompare(b.name.toLowerCase());
|
||||
|
||||
if (process.argv.includes("--fix")) {
|
||||
mp.plugins.sort(cmp);
|
||||
writeFileSync(MARKETPLACE, JSON.stringify(mp, null, 2) + "\n");
|
||||
console.log(`sorted ${mp.plugins.length} plugins`);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
for (let i = 1; i < mp.plugins.length; i++) {
|
||||
if (cmp(mp.plugins[i - 1], mp.plugins[i]) > 0) {
|
||||
console.error(
|
||||
`marketplace.json plugins are not sorted: ` +
|
||||
`'${mp.plugins[i - 1].name}' should come after '${mp.plugins[i].name}' (index ${i})`,
|
||||
);
|
||||
console.error(` run: bun .github/scripts/check-marketplace-sorted.ts --fix`);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`ok: ${mp.plugins.length} plugins sorted`);
|
||||
77
.github/scripts/validate-marketplace.ts
vendored
77
.github/scripts/validate-marketplace.ts
vendored
@@ -1,77 +0,0 @@
|
||||
#!/usr/bin/env bun
|
||||
/**
|
||||
* Validates marketplace.json: well-formed JSON, plugins array present,
|
||||
* each entry has required fields, and no duplicate plugin names.
|
||||
*
|
||||
* Usage:
|
||||
* bun validate-marketplace.ts <path-to-marketplace.json>
|
||||
*/
|
||||
|
||||
import { readFile } from "fs/promises";
|
||||
|
||||
async function main() {
|
||||
const filePath = process.argv[2];
|
||||
if (!filePath) {
|
||||
console.error("Usage: validate-marketplace.ts <path-to-marketplace.json>");
|
||||
process.exit(2);
|
||||
}
|
||||
|
||||
const content = await readFile(filePath, "utf-8");
|
||||
|
||||
let parsed: unknown;
|
||||
try {
|
||||
parsed = JSON.parse(content);
|
||||
} catch (err) {
|
||||
console.error(
|
||||
`ERROR: ${filePath} is not valid JSON: ${err instanceof Error ? err.message : err}`
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
||||
console.error(`ERROR: ${filePath} must be a JSON object`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const marketplace = parsed as Record<string, unknown>;
|
||||
if (!Array.isArray(marketplace.plugins)) {
|
||||
console.error(`ERROR: ${filePath} missing "plugins" array`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const errors: string[] = [];
|
||||
const seen = new Set<string>();
|
||||
const required = ["name", "description", "source"] as const;
|
||||
|
||||
marketplace.plugins.forEach((p, i) => {
|
||||
if (!p || typeof p !== "object") {
|
||||
errors.push(`plugins[${i}]: must be an object`);
|
||||
return;
|
||||
}
|
||||
const entry = p as Record<string, unknown>;
|
||||
for (const field of required) {
|
||||
if (!entry[field]) {
|
||||
errors.push(`plugins[${i}] (${entry.name ?? "?"}): missing required field "${field}"`);
|
||||
}
|
||||
}
|
||||
if (typeof entry.name === "string") {
|
||||
if (seen.has(entry.name)) {
|
||||
errors.push(`plugins[${i}]: duplicate plugin name "${entry.name}"`);
|
||||
}
|
||||
seen.add(entry.name);
|
||||
}
|
||||
});
|
||||
|
||||
if (errors.length) {
|
||||
console.error(`ERROR: ${filePath} has ${errors.length} validation error(s):`);
|
||||
for (const e of errors) console.error(` - ${e}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log(`OK: ${marketplace.plugins.length} plugins, no duplicates, all required fields present`);
|
||||
}
|
||||
|
||||
main().catch((err) => {
|
||||
console.error("Fatal error:", err);
|
||||
process.exit(2);
|
||||
});
|
||||
20
.github/workflows/validate-marketplace.yml
vendored
20
.github/workflows/validate-marketplace.yml
vendored
@@ -1,20 +0,0 @@
|
||||
name: Validate Marketplace JSON
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.claude-plugin/marketplace.json'
|
||||
|
||||
jobs:
|
||||
validate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: oven-sh/setup-bun@v2
|
||||
|
||||
- name: Validate marketplace.json
|
||||
run: bun .github/scripts/validate-marketplace.ts .claude-plugin/marketplace.json
|
||||
|
||||
- name: Check plugins sorted
|
||||
run: bun .github/scripts/check-marketplace-sorted.ts
|
||||
Reference in New Issue
Block a user