SPB Git

spb/rareindex

Public
1.8 KB · 35 lines typescript
1/**2 * Assemble connectors/registry.json from every connectors/<engine>/<id>/meta.json.3 * Per-connector meta files avoid merge conflicts; registry.json stays the machine-readable4 * registry required by CLAUDE.md §106. Run: pnpm tsx scripts/build-registry.ts5 */6import { readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';7import path from 'node:path';8import { fileURLToPath } from 'node:url';9import { RegistrySchema, ConnectorMetaSchema } from '../packages/connectors/src/types.ts';1011const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');12const dir = path.join(root, 'connectors');13const metas: unknown[] = [];14for (const engine of readdirSync(dir)) {15  const p = path.join(dir, engine);16  if (!statSync(p).isDirectory() || engine === 'node_modules') continue;17  for (const id of readdirSync(p)) {18    if (!statSync(path.join(p, id)).isDirectory()) continue;19    const metaPath = path.join(p, id, 'meta.json');20    try {21      const meta = JSON.parse(readFileSync(metaPath, 'utf8'));22      const parsed = ConnectorMetaSchema.parse({ ...meta, module: meta.module ?? `${engine}/${id}` });23      if (parsed.id !== id) throw new Error(`meta.id ${parsed.id} ≠ folder ${id}`);24      metas.push(parsed);25    } catch (err) {26      if ((err as NodeJS.ErrnoException).code === 'ENOENT') continue;27      throw new Error(`${metaPath}: ${err instanceof Error ? err.message : String(err)}`);28    }29  }30}31metas.sort((a, b) => ((a as { id: string }).id < (b as { id: string }).id ? -1 : 1));32const registry = RegistrySchema.parse({ version: '1.0', connectors: metas });33writeFileSync(path.join(dir, 'registry.json'), JSON.stringify(registry, null, 2) + '\n');34console.log(`[registry] ${registry.connectors.length} connectors written to connectors/registry.json`);35
Files · f9a634ec80792524177fc3e5fba5c7953d672423
Menu

Theme