|
|
@@ -0,0 +1,42 @@
|
|
|
+#!/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`);
|