Compare commits

..

1 Commits

Author SHA1 Message Date
Kenneth Lien
a14d338753 Register telegram, discord, fakechat channel plugins
Adds marketplace entries for the three channel plugins landing in
external_plugins/ via #735, #736, #738. iMessage (#737) is intentionally
held back from registration.

telegram and discord go under productivity; fakechat goes under
development since it's a localhost testing harness, not an end-user
messaging bridge.
2026-03-18 16:47:05 -07:00
4 changed files with 821 additions and 942 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -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`);

View File

@@ -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);
});

View File

@@ -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