Dev Build / cleanup (push) Waiting to run
Dev Build / typecheck (push) Waiting to run
Publish MCP to npm / Build, test, and publish MCP (push) Waiting to run
Publish SDK to npm / Build, test, and publish SDK (push) Waiting to run
Sync action catalog to docs / sync (push) Waiting to run
Publish UI to npm / Build and publish UI (push) Waiting to run
Build and Release / preflight (push) Waiting to run
43 lines
2.0 KiB
TypeScript
43 lines
2.0 KiB
TypeScript
// Catalog generator. Runs under vitest (so @snowluma/onebot/action-docs resolves
|
|
// via the proton plugin, exactly as onebot's own tests do) and writes a build-time
|
|
// snapshot of the OneBot action catalog into src/generated/catalog.ts.
|
|
//
|
|
// This is the whole "auto-track Action 增减" mechanic: the snapshot is regenerated
|
|
// from the live specs on every build, so it can never describe a stale action set.
|
|
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
import { it, expect } from 'vitest';
|
|
import { collectActionDocs, collectCategories } from '@snowluma/onebot/action-docs';
|
|
|
|
it('generates src/generated/catalog.ts from the live action specs', () => {
|
|
const actions = collectActionDocs();
|
|
const categories = collectCategories();
|
|
|
|
expect(actions.length).toBeGreaterThan(100);
|
|
|
|
// every action must carry a composed input schema (the MCP's payoff)
|
|
for (const a of actions) {
|
|
expect(a.inputSchema).toBeTypeOf('object');
|
|
expect(a.name).toBeTruthy();
|
|
expect(a.returnsSchema, `${a.name} result schema`).toBeTypeOf('object');
|
|
expect(a.examples?.length, `${a.name} invocation examples`).toBeGreaterThan(0);
|
|
}
|
|
|
|
const body =
|
|
'// GENERATED by scripts/gen-catalog.test.ts — do not edit. Run `pnpm gen`.\n' +
|
|
'/* eslint-disable */\n' +
|
|
"import type { CatalogAction, CatalogCategory } from '../types.js';\n\n" +
|
|
`export const ACTIONS: CatalogAction[] = ${JSON.stringify(actions, null, 2)};\n\n` +
|
|
`export const CATEGORIES: CatalogCategory[] = ${JSON.stringify(categories, null, 2)};\n`;
|
|
|
|
const dir = new URL('../src/generated/', import.meta.url);
|
|
mkdirSync(dir, { recursive: true });
|
|
writeFileSync(new URL('../src/generated/catalog.ts', import.meta.url), body);
|
|
|
|
// Plain-JSON twin of the catalog, consumed by the docs site (SnowLumaDocs)
|
|
// via the sync-docs-catalog workflow. Same data as catalog.ts.
|
|
writeFileSync(
|
|
new URL('../src/generated/catalog.json', import.meta.url),
|
|
JSON.stringify({ actions, categories }, null, 2) + '\n',
|
|
);
|
|
});
|