refactor(catalog): import CLI metadata from its owner

This commit is contained in:
morluto 2026-10-10 00:48:49 +08:00
parent 4144e454f3
commit 8c96baab80
6 changed files with 18 additions and 53 deletions

View File

@ -0,0 +1,12 @@
export function createCliInventory(cli: unknown): {
readonly primary: readonly string[];
readonly aliases: readonly {
readonly name: string;
readonly target: string;
}[];
};
export function cliCommandOptionNames(
cli: unknown,
name: string,
): readonly string[];
export function cliCommandDescriptionIssues(cli: unknown): readonly string[];

View File

@ -26,10 +26,6 @@ export interface ProductCatalog {
readonly format: string;
readonly configuration: string;
}[];
readonly schemas: readonly {
readonly id: string;
readonly version: string | number;
}[];
readonly cli: {
readonly primary_count: number;
readonly commands: readonly string[];
@ -45,21 +41,6 @@ export interface ProductCatalog {
}
export function createProductCatalog(root: string): Promise<ProductCatalog>;
export function providerCatalogDigest(
providers: ProductCatalog["providers"],
): string;
export function createCliInventory(cli: unknown): {
readonly primary: readonly string[];
readonly aliases: readonly {
readonly name: string;
readonly target: string;
}[];
};
export function cliCommandOptionNames(
cli: unknown,
name: string,
): readonly string[];
export function cliCommandDescriptionIssues(cli: unknown): readonly string[];
export function serializeProductCatalog(
catalog: ProductCatalog,
): Promise<string>;

View File

@ -1,22 +1,9 @@
import { formatGeneratedFile } from "./format-generated-file.mjs";
import { assertSameNames, digest, loadSources } from "./catalog-core.mjs";
import {
createCliInventory,
cliCommandDescriptionIssues,
cliCommandOptionNames,
} from "./catalog-cli.mjs";
import { createCliInventory } from "./catalog-cli.mjs";
import { providerCatalog, toolFamilyCatalog } from "./catalog-builders.mjs";
export {
createCliInventory,
cliCommandDescriptionIssues,
cliCommandOptionNames,
};
/** Return the stable digest for the source-derived provider projection. */
export const providerCatalogDigest = (providers) => digest(providers);
/** Project current runtime contracts into deterministic, machine-readable facts. */
export const createProductCatalog = async (root) => {
const sources = await loadSources(root);
@ -59,7 +46,7 @@ export const createProductCatalog = async (root) => {
counts: sources.catalogIdentity.CATALOG_IDENTITY.counts,
digests: {
// Full runtime schema digests belong to server identity, not this facts projection.
providers_sha256: providerCatalogDigest(providers),
providers_sha256: digest(providers),
},
},
};

View File

@ -3,7 +3,7 @@ import { Cli, z } from "incur";
import { describe, expect, it } from "vitest";
import { createCli } from "../../../src/cli.js";
import { createCliInventory } from "../../../scripts/lib/product-catalog.mjs";
import { createCliInventory } from "../../../scripts/lib/catalog-cli.mjs";
type CliInstance = ReturnType<typeof createCli>;
type CommandMap = NonNullable<ReturnType<typeof Cli.toCommands.get>>;

View File

@ -1,7 +1,7 @@
import { describe, expect, it } from "vitest";
import { createCli } from "../../../src/cli.js";
import { createCliInventory } from "../../../scripts/lib/product-catalog.mjs";
import { createCliInventory } from "../../../scripts/lib/catalog-cli.mjs";
import { TOOL_CONTRACTS } from "../../../src/contracts/toolContracts.js";
import {
CLI_COMMAND_ALIASES,

View File

@ -27,8 +27,9 @@ import {
createCliInventory,
cliCommandDescriptionIssues,
cliCommandOptionNames,
} from "../../../scripts/lib/catalog-cli.mjs";
import {
createProductCatalog,
providerCatalogDigest,
serializeProductCatalog,
} from "../../../scripts/lib/product-catalog.mjs";
@ -77,9 +78,6 @@ describe("canonical product catalog", () => {
catalog.providers.find(({ id }) => id === GHIDRA_PROVIDER_IDENTITY.id)
?.capabilities,
).toEqual([...GHIDRA_OPERATIONS].sort());
expect(catalog.runtime_catalog.digests.providers_sha256).toBe(
providerCatalogDigest(catalog.providers),
);
expect(
JSON.parse(await readFile("docs/public/product-catalog.json", "utf8")),
).toEqual(catalog);
@ -207,19 +205,6 @@ describe("canonical product catalog drift", () => {
);
});
it("changes the provider projection digest when provider facts drift", async () => {
const catalog = await createProductCatalog(root);
const firstProvider = catalog.providers[0];
if (firstProvider === undefined) throw new TypeError("Missing provider");
const driftedProviders = [
{ ...firstProvider, name: `${firstProvider.name} drifted` },
...catalog.providers.slice(1),
];
expect(providerCatalogDigest(driftedProviders)).not.toBe(
catalog.runtime_catalog.digests.providers_sha256,
);
});
it("fails check mode without rewriting a stale generated artifact", async () => {
const directory = await createTestTempDirectory("rea-generated-check-");
temporaryRoots.push(directory);