@x12i/sdk 0.4.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +62 -0
  2. package/dist/admin-import.d.ts +6 -0
  3. package/dist/admin-import.js +127 -0
  4. package/dist/admin-import.js.map +1 -0
  5. package/dist/admin-mcp.d.ts +3 -0
  6. package/dist/admin-mcp.js +95 -0
  7. package/dist/admin-mcp.js.map +1 -0
  8. package/dist/admin.d.ts +156 -0
  9. package/dist/admin.js +369 -0
  10. package/dist/admin.js.map +1 -0
  11. package/dist/cli.d.ts +2 -0
  12. package/dist/cli.js +68 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/client.d.ts +74 -195
  15. package/dist/client.js +187 -695
  16. package/dist/client.js.map +1 -1
  17. package/dist/identity.d.ts +8 -0
  18. package/dist/identity.js +34 -0
  19. package/dist/identity.js.map +1 -0
  20. package/dist/index.d.ts +6 -22
  21. package/dist/index.js +6 -12
  22. package/dist/index.js.map +1 -1
  23. package/dist/init.d.ts +18 -0
  24. package/dist/init.js +147 -0
  25. package/dist/init.js.map +1 -0
  26. package/dist/maturity.d.ts +65 -0
  27. package/dist/maturity.js +138 -0
  28. package/dist/maturity.js.map +1 -0
  29. package/dist/mcp.d.ts +27 -0
  30. package/dist/mcp.js +168 -0
  31. package/dist/mcp.js.map +1 -0
  32. package/dist/protocol.d.ts +38 -0
  33. package/dist/protocol.js +168 -0
  34. package/dist/protocol.js.map +1 -0
  35. package/dist/rank.d.ts +19 -0
  36. package/dist/rank.js +82 -0
  37. package/dist/rank.js.map +1 -0
  38. package/dist/runner.d.ts +22 -0
  39. package/dist/runner.js +99 -0
  40. package/dist/runner.js.map +1 -0
  41. package/package.json +66 -61
  42. package/LICENSE +0 -21
  43. package/dist/client.d.ts.map +0 -1
  44. package/dist/index.d.ts.map +0 -1
  45. package/dist/registry.d.ts +0 -8
  46. package/dist/registry.d.ts.map +0 -1
  47. package/dist/registry.js +0 -21
  48. package/dist/registry.js.map +0 -1
package/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # @x12i/sdk
2
+
3
+ Version 1.0.0 is the catalog SDK. The earlier web client remains installable as `@x12i/sdk@0.4.0`.
4
+
5
+ Find an `@x12i` package that fits a task, read its README and maturity, and file a signed review other code agents can see.
6
+
7
+ The catalog and the ratings come from the x12i SDK service. A README is shown from the catalog cache first. When that cache is older than the publish time the catalog knows, the SDK fetches the current README and returns both. Listing and README text can also be read straight from the npm registry through `@x12i/npm-core` when that service is unreachable. Those registry matches are labeled unranked.
8
+
9
+ ```bash
10
+ npx @x12i/sdk init
11
+ npx @x12i/sdk init --all
12
+ npx @x12i/sdk init --global
13
+ npx @x12i/sdk mcp
14
+ npx @x12i/sdk readme @x12i/sdk
15
+ ```
16
+
17
+ `init` with no host flags writes Cursor's `.cursor/mcp.json` and `.cursor/rules/x12i-sdk.mdc`. `--claude` and `--codex` add Claude Code and Codex. `--all` writes all three. Existing MCP servers are left in place. The first run also creates an Ed25519 install key under `%LOCALAPPDATA%\x12i\sdk` on Windows (or the platform config directory). The private key stays there. There is no shared API key in this package.
18
+
19
+ The rule tells the agent to call `x12i_search` before adding a dependency x12i might already publish, and `x12i_review` after trying one.
20
+
21
+ The service is `https://x12i-sdk.x12i.com`. `X12I_SDK_URL` overrides it. Use `http://127.0.0.1:8789` for the local service.
22
+
23
+ Search, README, reviews, and MCP are the regular SDK. Admin is separate and is not added to the MCP server:
24
+
25
+ ```bash
26
+ x12i-sdk admin catalog
27
+ x12i-sdk admin refresh
28
+ x12i-sdk admin refresh @x12i/sdk
29
+ ```
30
+
31
+ `admin catalog` prints every package as JSON, newest publish first. `admin refresh` updates the org listing, READMEs, and vulnerability scans. Set `X12I_SDK_ADMIN_KEY` for a remote service. The local service on `127.0.0.1` accepts its dev key when that variable is unset. `import { X12iAdmin } from "@x12i/sdk/admin"` is the same client.
32
+
33
+ Managed catalog commands mint a scoped capability and never print it:
34
+
35
+ ```bash
36
+ x12i-sdk admin import --from C:\path\to\x12i-catalog --dry-run
37
+ x12i-sdk admin export
38
+ x12i-sdk admin gaps
39
+ x12i-sdk admin lineage
40
+ x12i-sdk admin reconcile
41
+ x12i-sdk admin npm-links
42
+ x12i-sdk admin examples
43
+ x12i-sdk admin runner path\to\usage-repo
44
+ x12i-sdk admin mcp
45
+ ```
46
+
47
+ Edit a package or product. Each save is one catalog revision that the audit page can revert:
48
+
49
+ ```bash
50
+ x12i-sdk admin package @x12i/memorix
51
+ x12i-sdk admin edit @x12i/memorix --reason "Maintainer review" \
52
+ --description "Scoped Mongo tier for Memorix entity collections." \
53
+ --use-case "Read or write scoped entity collections." --use-case "Discover registered collections." \
54
+ --add-tag "Mongo" --tiers data --primary data --product memorix
55
+ x12i-sdk admin product memorix --reason "Review" --use-case "Store and retrieve scoped records."
56
+ x12i-sdk admin products
57
+ x12i-sdk admin tags
58
+ ```
59
+
60
+ `--use-case` and `--tags` replace the current lists. `--add-tag` and `--remove-tag` adjust them. A tag name that does not exist yet is created. `--preview` saves nothing. The same edits are on the service at `/admin/packages` and `/admin/products`, and in `X12iAdmin` as `editPackage` and `editProduct`.
61
+
62
+ `admin mcp` is a second stdio server for catalog edits, example preparation, and publish. The public `x12i-sdk mcp` server does not receive it. Publish tools dry-run unless the caller sets `dryRun` to false on a token that includes `examples:publish`. The App private key stays on the service. See `packages/sdk-service/ADMIN.md`.
@@ -0,0 +1,6 @@
1
+ import { X12iAdmin } from "./admin.js";
2
+ export declare function verifyCheckpoint(root: string): Promise<{
3
+ checked: number;
4
+ }>;
5
+ export declare function planImport(root: string): Promise<Record<string, number>>;
6
+ export declare function runImport(root: string, admin: X12iAdmin, dryRun: boolean): Promise<Record<string, unknown>>;
@@ -0,0 +1,127 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readdir, readFile, stat } from "node:fs/promises";
3
+ import { join, relative } from "node:path";
4
+ const SKIP = new Set(["node_modules", ".git", "dist", ".vite"]);
5
+ export async function verifyCheckpoint(root) {
6
+ const status = JSON.parse(await readFile(join(root, "research", "handover-status.json"), "utf8"));
7
+ const hashes = status.artifactSha256 ?? {};
8
+ let checked = 0;
9
+ for (const [name, expected] of Object.entries(hashes)) {
10
+ const actual = createHash("sha256").update(await readFile(join(root, name))).digest("hex");
11
+ if (actual !== expected)
12
+ throw new Error(`Checkpoint hash differs for ${name}`);
13
+ checked += 1;
14
+ }
15
+ return { checked };
16
+ }
17
+ export async function planImport(root) {
18
+ const catalog = JSON.parse(await readFile(join(root, "catalog.json"), "utf8"));
19
+ const evidence = JSON.parse(await readFile(join(root, "research", "enriched-evidence-index.json"), "utf8"));
20
+ const tasks = JSON.parse(await readFile(join(root, "todo.json"), "utf8"));
21
+ const receipts = JSON.parse(await readFile(join(root, "research", "usage-publish-receipts.json"), "utf8"));
22
+ return {
23
+ packages: catalog.packages.length,
24
+ families: catalog.families.length,
25
+ evidence: evidence.length,
26
+ tasks: tasks.tasks.length,
27
+ receipts: Object.keys(receipts).length,
28
+ };
29
+ }
30
+ export async function runImport(root, admin, dryRun) {
31
+ const checked = await verifyCheckpoint(root);
32
+ const plan = await planImport(root);
33
+ if (dryRun)
34
+ return { dryRun: true, ...checked, ...plan, uploaded: false };
35
+ const catalog = JSON.parse(await readFile(join(root, "catalog.json"), "utf8"));
36
+ const tokenAdmin = admin;
37
+ let applied = 0;
38
+ applied += await chunks(tokenAdmin, "packages", catalog.packages, (item) => String(item.name));
39
+ applied += await chunks(tokenAdmin, "families", catalog.families, (item) => String(item.id));
40
+ const evidence = JSON.parse(await readFile(join(root, "research", "enriched-evidence-index.json"), "utf8"));
41
+ applied += await chunks(tokenAdmin, "evidence", evidence, (item) => String(item.id));
42
+ const tasks = JSON.parse(await readFile(join(root, "todo.json"), "utf8"));
43
+ applied += await chunks(tokenAdmin, "tasks", tasks.tasks, (item) => String(item.id));
44
+ const findings = JSON.parse(await readFile(join(root, "research", "manual-findings.json"), "utf8"));
45
+ applied += await chunks(tokenAdmin, "findings", findings, (item) => String(item.title));
46
+ const receipts = JSON.parse(await readFile(join(root, "research", "usage-publish-receipts.json"), "utf8"));
47
+ applied += await chunks(tokenAdmin, "receipts", Object.entries(receipts).map(([slug, receipt]) => ({ slug, ...receipt })), (item) => String(item.slug));
48
+ const validation = JSON.parse(await readFile(join(root, "research", "usage-validation.json"), "utf8"));
49
+ applied += await chunks(tokenAdmin, "validations", validation, (item) => String(item.package));
50
+ const repositoryPlan = JSON.parse(await readFile(join(root, "research", "usage-repository-plan.json"), "utf8"));
51
+ applied += await chunks(tokenAdmin, "repositories", repositoryPlan.repositories, (item) => String(item.name));
52
+ const patches = JSON.parse(await readFile(join(root, "source-link-patches", "index.json"), "utf8"));
53
+ const links = patches.repositories.flatMap((repository) => repository.packages.map((pkg) => ({ ...pkg, repository: repository.repository, patch: repository.patch })));
54
+ applied += await chunks(tokenAdmin, "source-links", links, (item) => String(item.package));
55
+ applied += await importUsageFiles(root, tokenAdmin);
56
+ const current = await tokenAdmin.exportCatalog();
57
+ const finished = await tokenAdmin.finishImport(Number(current.revision ?? 0));
58
+ return { dryRun: false, ...checked, ...plan, chunks: applied, revision: finished.revision };
59
+ }
60
+ async function sendChunk(admin, chunk) {
61
+ for (let attempt = 0; attempt < 5; attempt += 1) {
62
+ try {
63
+ await admin.importChunk(chunk);
64
+ return;
65
+ }
66
+ catch (error) {
67
+ const status = error instanceof Error && "status" in error ? Number(error.status) : 0;
68
+ if (attempt === 4 || (status > 0 && status < 500))
69
+ throw error;
70
+ await new Promise((resolve) => setTimeout(resolve, 1000 * (attempt + 1)));
71
+ }
72
+ }
73
+ }
74
+ async function chunks(admin, kind, items, idOf) {
75
+ const size = 25;
76
+ let count = 0;
77
+ for (let index = 0; index < items.length; index += size) {
78
+ const slice = items.slice(index, index + size);
79
+ const chunkId = `${kind}-${index / size}`;
80
+ const digest = createHash("sha256").update(JSON.stringify(slice)).digest("hex");
81
+ await sendChunk(admin, { kind, chunkId, digest, items: slice.map((item) => ({ ...item, chunkKey: idOf(item) })) });
82
+ count += 1;
83
+ }
84
+ return count;
85
+ }
86
+ async function importUsageFiles(root, admin) {
87
+ const base = join(root, "usage-repos");
88
+ let count = 0;
89
+ let entries = [];
90
+ try {
91
+ entries = await readdir(base);
92
+ }
93
+ catch {
94
+ return 0;
95
+ }
96
+ for (const slug of entries) {
97
+ const directory = join(base, slug);
98
+ if (!(await stat(directory)).isDirectory())
99
+ continue;
100
+ const files = {};
101
+ await walk(directory, directory, files);
102
+ if (Object.keys(files).length === 0)
103
+ continue;
104
+ await sendChunk(admin, { kind: "usage-files", chunkId: slug, digest: createHash("sha256").update(JSON.stringify(files)).digest("hex"), items: [{ slug, files, state: "imported-draft" }] });
105
+ count += 1;
106
+ }
107
+ return count;
108
+ }
109
+ async function walk(root, directory, files) {
110
+ for (const name of await readdir(directory)) {
111
+ if (SKIP.has(name))
112
+ continue;
113
+ const path = join(directory, name);
114
+ const info = await stat(path);
115
+ if (info.isDirectory()) {
116
+ await walk(root, path, files);
117
+ continue;
118
+ }
119
+ if (info.size > 2_000_000)
120
+ continue;
121
+ const relativePath = relative(root, path).replaceAll("\\", "/");
122
+ if (!/^(README\.md|package\.json|package-lock\.json|\.gitignore|usage\.json|src\/.*)$/.test(relativePath))
123
+ continue;
124
+ files[relativePath] = await readFile(path, "utf8");
125
+ }
126
+ }
127
+ //# sourceMappingURL=admin-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-import.js","sourceRoot":"","sources":["../src/admin-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { X12iAdmin } from "./admin.js";
2
+ export declare function runAdminMcp(admin: X12iAdmin): Promise<void>;
3
+ export declare function handleAdminMcp(line: string, admin: X12iAdmin): Promise<string | undefined>;
@@ -0,0 +1,95 @@
1
+ import { createInterface } from "node:readline";
2
+ const object = (properties, required) => ({ type: "object", properties, required, additionalProperties: false });
3
+ const str = (description) => ({ type: "string", description });
4
+ const list = (description) => ({ type: "array", items: { type: "string" }, description });
5
+ const TOOLS = [
6
+ { name: "x12i_admin_package", description: "Read one package: description, use cases, product, tags, tiers, lifecycle, and the current catalog revision.", inputSchema: object({ name: str("Exact npm name") }, ["name"]), run: (admin, args) => admin.getPackage(String(args.name ?? "")) },
7
+ {
8
+ name: "x12i_admin_edit_package",
9
+ description: "Edit a package in one revision. Send only the fields to change. useCases and tags replace the current lists; addTags and removeTags adjust them. An unknown tag name creates the tag. Use preview to check without saving.",
10
+ inputSchema: object({
11
+ name: str("Exact npm name"),
12
+ reason: str("Why this edit is being made"),
13
+ description: str("New package description"),
14
+ useCases: list("Every use case, one scenario per entry"),
15
+ tags: list("Every tag, by label or id"),
16
+ addTags: list("Tags to add"),
17
+ removeTags: list("Tags to remove"),
18
+ tiers: list("data, intelligence, presentation, or logic"),
19
+ primary: str("Primary tier, one of tiers"),
20
+ product: str("Product id, such as memorix"),
21
+ lifecycle: str("active, experimental, deprecated, superseded, or archived"),
22
+ preview: { type: "boolean" },
23
+ }, ["name", "reason"]),
24
+ run: (admin, args) => {
25
+ const { name, reason, preview, ...edit } = args;
26
+ return admin.editPackage(String(name ?? ""), edit, String(reason ?? ""), { preview: preview === true });
27
+ },
28
+ },
29
+ { name: "x12i_admin_products", description: "List products with their description, use cases, tags, and package counts.", inputSchema: object({}, []), run: (admin) => admin.products() },
30
+ {
31
+ name: "x12i_admin_edit_product",
32
+ description: "Edit a product's description, use cases, or tags in one revision. useCases and tags replace the current lists.",
33
+ inputSchema: object({ id: str("Product id"), reason: str("Why this edit is being made"), description: str("New description"), useCases: list("Every use case"), tags: list("Every tag, by label or id"), preview: { type: "boolean" } }, ["id", "reason"]),
34
+ run: (admin, args) => {
35
+ const { id, reason, preview, ...edit } = args;
36
+ return admin.editProduct(String(id ?? ""), edit, String(reason ?? ""), { preview: preview === true });
37
+ },
38
+ },
39
+ { name: "x12i_admin_tags", description: "List tags with their package counts.", inputSchema: object({}, []), run: (admin) => admin.tags() },
40
+ { name: "x12i_admin_gaps", description: "List packages that still need a confirmed tier or tag. Suggested rows are not confirmed.", inputSchema: object({}, []), run: (admin) => admin.gaps() },
41
+ { name: "x12i_admin_lineage", description: "Read the Memorix lineage report. Spelling collisions are not confirmed replacements.", inputSchema: object({}, []), run: (admin) => admin.lineage() },
42
+ { name: "x12i_admin_taxonomy", description: "Low-level batch edit. Change types: set-tiers, set-tags, set-family-tags, set-lifecycle, edit-family, merge-tags, edit-package, set-family, create-tag. Send expectedRevision.", inputSchema: object({ expectedRevision: { type: "integer" }, reason: str("Why this edit is being made"), preview: { type: "boolean" }, changes: { type: "array" } }, ["expectedRevision", "reason", "changes"]), run: (admin, args) => admin.taxonomy(args) },
43
+ { name: "x12i_admin_propose_replacement", description: "Propose a rename, successor, split, or merge. This does not hide the source package.", inputSchema: object({ expectedRevision: { type: "integer" }, source: { type: "array" }, target: { type: "array" }, kind: str("rename, successor, split, or merge"), migrationNotes: str("What a consumer should do") }, ["expectedRevision", "source", "target", "kind", "migrationNotes"]), run: (admin, args) => admin.proposeReplacement(args) },
44
+ { name: "x12i_admin_confirm_replacement", description: "Confirm a proposed replacement and mark its sources superseded.", inputSchema: object({ expectedRevision: { type: "integer" }, proposalId: str("Proposal id") }, ["expectedRevision", "proposalId"]), run: (admin, args) => admin.confirmReplacement(String(args.proposalId ?? ""), Number(args.expectedRevision)) },
45
+ { name: "x12i_admin_reconcile", description: "Compare the catalog, receipts, and drafts. Historical inventory and published coverage are separate.", inputSchema: object({}, []), run: (admin) => admin.reconcile() },
46
+ { name: "x12i_admin_npm_links", description: "List source link patches that are ready for review. This does not open a pull request or publish npm.", inputSchema: object({}, []), run: (admin) => admin.npmLinks() },
47
+ { name: "x12i_admin_prepare_example", description: "Store a usage draft. dryRun writes nothing.", inputSchema: object({ packageName: str("Exact npm name"), version: str("Exact version"), scenario: str("What the example demonstrates"), dryRun: { type: "boolean" }, files: { type: "object" } }, ["packageName", "version", "scenario"]), run: (admin, args) => admin.prepareDraft(args) },
48
+ { name: "x12i_admin_publish_example", description: "Publish a validated usage draft. dryRun is the default and creates nothing on GitHub.", inputSchema: object({ draftId: str("Draft id"), validationId: str("Validation id"), idempotencyKey: str("Retry key"), expectedRemoteHead: str("Remote commit the update must replace"), dryRun: { type: "boolean", description: "Defaults to true" } }, ["draftId", "validationId", "idempotencyKey"]), run: (admin, args) => admin.publishExample({ ...args, dryRun: args.dryRun !== false }) },
49
+ ];
50
+ export async function runAdminMcp(admin) {
51
+ const token = process.env.X12I_SDK_ADMIN_TOKEN;
52
+ const scopes = (process.env.X12I_SDK_ADMIN_SCOPES ?? "catalog:read,metadata:write,examples:prepare,release:prepare").split(",").map((scope) => scope.trim()).filter(Boolean);
53
+ const scoped = token ? admin.withToken(token) : admin.withToken((await admin.mint(scopes, "admin-mcp")).token);
54
+ const lines = createInterface({ input: process.stdin });
55
+ for await (const line of lines) {
56
+ if (!line.trim())
57
+ continue;
58
+ const response = await handleAdminMcp(line, scoped);
59
+ if (response)
60
+ process.stdout.write(`${response}\n`);
61
+ }
62
+ }
63
+ export async function handleAdminMcp(line, admin) {
64
+ let message;
65
+ try {
66
+ message = JSON.parse(line);
67
+ }
68
+ catch {
69
+ return JSON.stringify({ jsonrpc: "2.0", id: null, error: { code: -32700, message: "Parse error" } });
70
+ }
71
+ if (message.id === undefined)
72
+ return undefined;
73
+ const id = message.id ?? null;
74
+ const params = message.params ?? {};
75
+ if (message.method === "initialize") {
76
+ return JSON.stringify({ jsonrpc: "2.0", id, result: { protocolVersion: "2025-06-18", capabilities: { tools: { listChanged: false } }, serverInfo: { name: "x12i-admin", version: "0.1.0" }, instructions: "Use these tools for catalog administration. Publishing defaults to a dry run. You do not receive the GitHub App key." } });
77
+ }
78
+ if (message.method === "tools/list") {
79
+ return JSON.stringify({ jsonrpc: "2.0", id, result: { tools: TOOLS.map(({ run: _run, ...tool }) => tool) } });
80
+ }
81
+ if (message.method === "tools/call") {
82
+ const tool = TOOLS.find((item) => item.name === params.name);
83
+ if (!tool)
84
+ return JSON.stringify({ jsonrpc: "2.0", id, error: { code: -32602, message: "Unknown tool" } });
85
+ try {
86
+ const value = await tool.run(admin, (params.arguments ?? {}));
87
+ return JSON.stringify({ jsonrpc: "2.0", id, result: { content: [{ type: "text", text: JSON.stringify(value) }], structuredContent: value, isError: false } });
88
+ }
89
+ catch (error) {
90
+ return JSON.stringify({ jsonrpc: "2.0", id, result: { content: [{ type: "text", text: error instanceof Error ? error.message : String(error) }], isError: true } });
91
+ }
92
+ }
93
+ return JSON.stringify({ jsonrpc: "2.0", id, error: { code: -32601, message: "Method not found" } });
94
+ }
95
+ //# sourceMappingURL=admin-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-mcp.js","sourceRoot":"","sources":["../src/admin-mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ /** Dev key the local catalog accepts when SDK_ADMIN_KEY is unset. Never sent to a remote host. */
2
+ export declare const LOCAL_ADMIN_KEY = "dev-only-x12i-sdk-admin-key";
3
+ export type AdminOptions = {
4
+ baseUrl?: string;
5
+ adminKey?: string;
6
+ fetch?: typeof fetch;
7
+ };
8
+ export type AdminRefreshTarget = "listing" | "readmes" | "audits" | "package";
9
+ type CatalogPage = {
10
+ total?: number;
11
+ packages?: unknown[];
12
+ next?: string | null;
13
+ order?: string;
14
+ maturity?: unknown;
15
+ };
16
+ export type PackageEdit = {
17
+ description?: string;
18
+ useCases?: string[];
19
+ /** Replaces every tag. Labels or ids; an unknown label creates a tag. */
20
+ tags?: string[];
21
+ addTags?: string[];
22
+ removeTags?: string[];
23
+ /** data, intelligence, presentation, logic */
24
+ tiers?: string[];
25
+ primary?: string;
26
+ /** Product id, such as memorix. */
27
+ product?: string;
28
+ lifecycle?: "active" | "experimental" | "deprecated" | "superseded" | "archived";
29
+ };
30
+ export type ManagedPackageView = {
31
+ name: string;
32
+ version: string;
33
+ description: string;
34
+ useCases: string[];
35
+ product: string;
36
+ productTitle: string;
37
+ role: string;
38
+ tags: Array<{
39
+ id: string;
40
+ label: string;
41
+ reviewState: string;
42
+ }>;
43
+ tiers: Array<{
44
+ id: string;
45
+ primary: boolean;
46
+ reviewState: string;
47
+ }>;
48
+ lifecycle: {
49
+ state: string;
50
+ reviewState: string;
51
+ reason: string;
52
+ } | null;
53
+ };
54
+ export type ProductView = {
55
+ id: string;
56
+ title: string;
57
+ description: string;
58
+ useCases: string[];
59
+ tags: Array<{
60
+ id: string;
61
+ label: string;
62
+ }>;
63
+ packages: number;
64
+ };
65
+ export declare class X12iAdmin {
66
+ readonly baseUrl: string;
67
+ readonly adminKey: string;
68
+ private readonly fetchImpl;
69
+ constructor(options?: AdminOptions);
70
+ /** Every catalog package, newest publish first, without README bodies. */
71
+ catalog(): Promise<CatalogPage>;
72
+ status(): Promise<unknown>;
73
+ refresh(target: Exclude<AdminRefreshTarget, "package">, budget?: number): Promise<Record<string, unknown>>;
74
+ refreshPackage(name: string): Promise<Record<string, unknown>>;
75
+ /** Refresh the org listing, then READMEs, then vulnerability scans, until each queue is caught up. */
76
+ refreshAll(onBatch?: (kind: string, batch: Record<string, unknown>) => void): Promise<Record<string, unknown>>;
77
+ private untilQuiet;
78
+ mint(scopes: string[], label?: string, limits?: {
79
+ packageScope?: string[];
80
+ repoScope?: string[];
81
+ }): Promise<{
82
+ id: string;
83
+ token: string;
84
+ scopes: string[];
85
+ }>;
86
+ importChunk(chunk: {
87
+ kind: string;
88
+ chunkId: string;
89
+ digest: string;
90
+ items: unknown[];
91
+ }): Promise<unknown>;
92
+ finishImport(expectedRevision: number, reason?: string): Promise<unknown>;
93
+ exportCatalog(part?: "overrides"): Promise<unknown>;
94
+ taxonomy(body: Record<string, unknown>): Promise<unknown>;
95
+ /** One package as the admin sees it, with the catalog revision an edit must name. */
96
+ getPackage(name: string): Promise<{
97
+ revision: number;
98
+ package: ManagedPackageView;
99
+ }>;
100
+ /** Change any of a package's fields in one revision. Reads the current revision when it is not given. */
101
+ editPackage(name: string, edit: PackageEdit, reason: string, options?: {
102
+ expectedRevision?: number;
103
+ preview?: boolean;
104
+ }): Promise<Record<string, unknown>>;
105
+ products(): Promise<{
106
+ revision: number;
107
+ products: ProductView[];
108
+ }>;
109
+ getProduct(id: string): Promise<{
110
+ revision: number;
111
+ product: ProductView;
112
+ }>;
113
+ editProduct(id: string, edit: {
114
+ description?: string;
115
+ useCases?: string[];
116
+ tags?: string[];
117
+ }, reason: string, options?: {
118
+ expectedRevision?: number;
119
+ preview?: boolean;
120
+ }): Promise<Record<string, unknown>>;
121
+ tags(): Promise<{
122
+ tags: Array<{
123
+ id: string;
124
+ label: string;
125
+ category: string;
126
+ replacedBy: string | null;
127
+ packages: number;
128
+ }>;
129
+ }>;
130
+ proposeReplacement(body: Record<string, unknown>): Promise<unknown>;
131
+ confirmReplacement(proposalId: string, expectedRevision: number): Promise<unknown>;
132
+ gaps(): Promise<unknown>;
133
+ lineage(): Promise<unknown>;
134
+ reconcile(): Promise<unknown>;
135
+ npmLinks(): Promise<unknown>;
136
+ prepareDraft(body: Record<string, unknown>): Promise<unknown>;
137
+ recordValidation(body: Record<string, unknown>): Promise<unknown>;
138
+ publishExample(body: Record<string, unknown>): Promise<unknown>;
139
+ withToken(token: string): X12iAdmin;
140
+ operation(id: string): Promise<unknown>;
141
+ cancelOperation(id: string): Promise<unknown>;
142
+ resumeOperation(id: string): Promise<unknown>;
143
+ exampleBacklog(): Promise<unknown>;
144
+ private send;
145
+ }
146
+ export declare function runAdminCli(args: string[]): Promise<void>;
147
+ type Flags = {
148
+ has(name: string): boolean;
149
+ single(name: string): string | undefined;
150
+ many(name: string): string[] | undefined;
151
+ list(name: string): string[] | undefined;
152
+ useCases(): string[] | undefined;
153
+ };
154
+ /** --name value pairs. Repeated flags collect; --tags and --tiers take comma lists. */
155
+ export declare function parseFlags(args: string[]): Flags;
156
+ export {};