@x12i/catalox 4.0.2 → 4.0.4

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.
@@ -0,0 +1,24 @@
1
+ export declare class CataloxSeedPresetResolveError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ /**
5
+ * Locate the `presets/` directory shipped with `@x12i/catalox` (works from both `src/` and `dist/` layouts).
6
+ */
7
+ export declare function getBundledCataloxPresetsDir(): string;
8
+ export type ResolveCataloxSeedPresetPathOptions = {
9
+ /** Defaults to `process.cwd()` when defined. */
10
+ cwd?: string;
11
+ };
12
+ /**
13
+ * Resolve a logical preset selector to an absolute JSON manifest path.
14
+ *
15
+ * Resolution order:
16
+ * 1. `builtin:<id>` or `catalox:<id>` — bundled `presets/` (see `presets/registry.json`).
17
+ * 2. Filesystem path: absolute, or `./` / `../` / `.json` relative to `cwd`, when the file exists.
18
+ * 3. Registry alias (e.g. `native-map@v1`) against bundled `presets/registry.json`.
19
+ * 4. npm package `packageName` — read `package.json` and use `catalox.seedPreset` (relative to that package),
20
+ * defaulting to `catalox-seed-preset.json` at the package root.
21
+ * 5. Node resolution for a subpath ending in `.json` (e.g. `@scope/pkg/presets/v1.json`) from the nearest `package.json` walking up from `cwd`.
22
+ */
23
+ export declare function resolveCataloxSeedPresetPath(preset: string, options?: ResolveCataloxSeedPresetPathOptions): string;
24
+ //# sourceMappingURL=seed-preset-resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-preset-resolve.d.ts","sourceRoot":"","sources":["../../../src/catalox/seed-preset-resolve.ts"],"names":[],"mappings":"AAKA,qBAAa,6BAA8B,SAAQ,KAAK;gBAC1C,OAAO,EAAE,MAAM;CAI5B;AAiBD;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CASpD;AA6CD,MAAM,MAAM,mCAAmC,GAAG;IAChD,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mCAAmC,GAC5C,MAAM,CAkER"}
@@ -0,0 +1,156 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, isAbsolute, join, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ export class CataloxSeedPresetResolveError extends Error {
6
+ constructor(message) {
7
+ super(message);
8
+ this.name = "CataloxSeedPresetResolveError";
9
+ }
10
+ }
11
+ function readRegistry(presetsDir) {
12
+ const regPath = join(presetsDir, "registry.json");
13
+ if (!existsSync(regPath))
14
+ return {};
15
+ try {
16
+ const raw = readFileSync(regPath, "utf8");
17
+ const data = JSON.parse(raw);
18
+ if (data == null || typeof data !== "object" || Array.isArray(data))
19
+ return {};
20
+ return data;
21
+ }
22
+ catch {
23
+ return {};
24
+ }
25
+ }
26
+ /**
27
+ * Locate the `presets/` directory shipped with `@x12i/catalox` (works from both `src/` and `dist/` layouts).
28
+ */
29
+ export function getBundledCataloxPresetsDir() {
30
+ const here = dirname(fileURLToPath(import.meta.url));
31
+ const candidates = [join(here, "../../../presets"), join(here, "../../presets")];
32
+ for (const c of candidates) {
33
+ if (existsSync(join(c, "native-map-v1.json")))
34
+ return c;
35
+ }
36
+ throw new CataloxSeedPresetResolveError("Could not locate bundled Catalox presets/ directory (expected native-map-v1.json).");
37
+ }
38
+ function createRequireFromNearestPackage(startDir) {
39
+ let dir = resolve(startDir);
40
+ for (;;) {
41
+ const pj = join(dir, "package.json");
42
+ if (existsSync(pj)) {
43
+ return createRequire(pj);
44
+ }
45
+ const parent = dirname(dir);
46
+ if (parent === dir) {
47
+ return createRequire(fileURLToPath(import.meta.url));
48
+ }
49
+ dir = parent;
50
+ }
51
+ }
52
+ function tryResolveNpmPackageSeedPreset(packageName, cwd) {
53
+ try {
54
+ const req = createRequireFromNearestPackage(cwd);
55
+ const pkgJsonPath = req.resolve(`${packageName}/package.json`);
56
+ const root = dirname(pkgJsonPath);
57
+ const raw = readFileSync(pkgJsonPath, "utf8");
58
+ const pkg = JSON.parse(raw);
59
+ const rel = String(pkg.catalox?.seedPreset ?? "catalox-seed-preset.json").trim() || "catalox-seed-preset.json";
60
+ const candidate = isAbsolute(rel) ? rel : resolve(root, rel);
61
+ if (existsSync(candidate))
62
+ return candidate;
63
+ }
64
+ catch {
65
+ return undefined;
66
+ }
67
+ return undefined;
68
+ }
69
+ function tryResolveJsonSubpath(spec, cwd) {
70
+ if (!spec.includes("/"))
71
+ return undefined;
72
+ try {
73
+ const req = createRequireFromNearestPackage(cwd);
74
+ const resolved = req.resolve(spec);
75
+ if (resolved.endsWith(".json") && existsSync(resolved))
76
+ return resolved;
77
+ }
78
+ catch {
79
+ return undefined;
80
+ }
81
+ return undefined;
82
+ }
83
+ /**
84
+ * Resolve a logical preset selector to an absolute JSON manifest path.
85
+ *
86
+ * Resolution order:
87
+ * 1. `builtin:<id>` or `catalox:<id>` — bundled `presets/` (see `presets/registry.json`).
88
+ * 2. Filesystem path: absolute, or `./` / `../` / `.json` relative to `cwd`, when the file exists.
89
+ * 3. Registry alias (e.g. `native-map@v1`) against bundled `presets/registry.json`.
90
+ * 4. npm package `packageName` — read `package.json` and use `catalox.seedPreset` (relative to that package),
91
+ * defaulting to `catalox-seed-preset.json` at the package root.
92
+ * 5. Node resolution for a subpath ending in `.json` (e.g. `@scope/pkg/presets/v1.json`) from the nearest `package.json` walking up from `cwd`.
93
+ */
94
+ export function resolveCataloxSeedPresetPath(preset, options) {
95
+ const cwd = options?.cwd ?? (typeof process !== "undefined" ? process.cwd() : ".");
96
+ const id = preset.trim();
97
+ if (!id)
98
+ throw new CataloxSeedPresetResolveError("Empty preset selector.");
99
+ if (id.startsWith("@") && id.includes("/") && id.endsWith(".json")) {
100
+ const subEarly = tryResolveJsonSubpath(id, cwd);
101
+ if (subEarly)
102
+ return subEarly;
103
+ }
104
+ const builtinMatch = id.match(/^(?:builtin|catalox):(.+)$/i);
105
+ if (builtinMatch) {
106
+ const key = (builtinMatch[1] ?? "").trim();
107
+ if (!key)
108
+ throw new CataloxSeedPresetResolveError("Missing id after builtin: / catalox: prefix.");
109
+ const bundled = getBundledCataloxPresetsDir();
110
+ const reg = readRegistry(bundled);
111
+ const file = reg[key] ?? (key.endsWith(".json") ? key : `${key}.json`);
112
+ const abs = isAbsolute(file) ? file : join(bundled, file);
113
+ if (!existsSync(abs)) {
114
+ throw new CataloxSeedPresetResolveError(`Unknown builtin preset "${key}". See presets/registry.json under @x12i/catalox.`);
115
+ }
116
+ return abs;
117
+ }
118
+ const looksLikeFs = id.startsWith("./") ||
119
+ id.startsWith("../") ||
120
+ id.startsWith("/") ||
121
+ id.startsWith("file:") ||
122
+ (id.endsWith(".json") && !id.startsWith("@"));
123
+ if (looksLikeFs) {
124
+ const abs = id.startsWith("file:") ? fileURLToPath(new URL(id)) : isAbsolute(id) ? id : resolve(cwd, id);
125
+ if (existsSync(abs))
126
+ return abs;
127
+ if (id.endsWith(".json")) {
128
+ throw new CataloxSeedPresetResolveError(`Preset file not found: ${abs}`);
129
+ }
130
+ }
131
+ const bundled = getBundledCataloxPresetsDir();
132
+ const reg = readRegistry(bundled);
133
+ const mapped = reg[id];
134
+ if (mapped) {
135
+ const abs = join(bundled, mapped);
136
+ if (existsSync(abs))
137
+ return abs;
138
+ throw new CataloxSeedPresetResolveError(`Registry entry "${id}" points to missing file: ${mapped}`);
139
+ }
140
+ if (id.endsWith(".json")) {
141
+ const fromSubpath = tryResolveJsonSubpath(id, cwd);
142
+ if (fromSubpath)
143
+ return fromSubpath;
144
+ }
145
+ else {
146
+ const fromPkg = tryResolveNpmPackageSeedPreset(id, cwd);
147
+ if (fromPkg)
148
+ return fromPkg;
149
+ }
150
+ if (looksLikeFs) {
151
+ const abs = isAbsolute(id) ? id : resolve(cwd, id);
152
+ throw new CataloxSeedPresetResolveError(`Preset path not found: ${abs}`);
153
+ }
154
+ throw new CataloxSeedPresetResolveError(`Could not resolve preset "${id}". Try a path to a .json file, builtin:native-map-v1, a registry alias, or an npm package that sets catalox.seedPreset in package.json.`);
155
+ }
156
+ //# sourceMappingURL=seed-preset-resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-preset-resolve.js","sourceRoot":"","sources":["../../../src/catalox/seed-preset-resolve.ts"],"names":[],"mappings":"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"}
@@ -53,10 +53,18 @@ export declare function loadCataloxSeedManifestFromPath(presetPath: string): Pro
53
53
  * Idempotent apply: catalogs (create if missing) → descriptors → bindings → native items.
54
54
  * Descriptor steps require {@link CataloxContext.superAdmin}. Bindings default `canWrite` to `true`
55
55
  * when the manifest lists native `items` for that `catalogId` (so upserts succeed), unless overridden.
56
+ *
57
+ * Preset sources:
58
+ * - `{ presetPath }` — filesystem JSON manifest
59
+ * - `{ preset, cwd? }` — resolved via {@link resolveCataloxSeedPresetPath} (builtins, registry, npm `catalox.seedPreset`, or paths)
60
+ * - `{ manifest }` — in-memory object (validated)
56
61
  */
57
62
  export declare function applyCataloxSeedPreset(catalox: Catalox, context: CataloxContext, input: {
58
63
  manifest: CataloxSeedManifestV1;
59
64
  } | {
60
65
  presetPath: string;
66
+ } | {
67
+ preset: string;
68
+ cwd?: string;
61
69
  }): Promise<ApplyCataloxSeedPresetResult>;
62
70
  //# sourceMappingURL=seed-preset.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"seed-preset.d.ts","sourceRoot":"","sources":["../../../src/catalox/seed-preset.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAGvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAIrE,yEAAyE;AACzE,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAE/C,MAAM,MAAM,qBAAqB,GAAG;IAClC,aAAa,EAAE,8BAA8B,CAAC;IAC9C,sDAAsD;IACtD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,UAAU,EAAE,iBAAiB,CAAC;QAC9B,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;KAC5B,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;KACxE,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CACrE,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAExD,MAAM,MAAM,4BAA4B,GAAG;IACzC,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,uBAAuB,EAAE,MAAM,EAAE,CAAC;QAClC,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAOF,qBAAa,wBAAyB,SAAQ,KAAK;aAG/B,SAAS,CAAC,EAAE,WAAW,EAAE,GAAG,IAAI;gBADhD,OAAO,EAAE,MAAM,EACC,SAAS,CAAC,EAAE,WAAW,EAAE,GAAG,IAAI,YAAA;CAKnD;AAqFD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,qBAAqB,CAY7E;AAED,wBAAsB,+BAA+B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAUxG;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE;IAAE,QAAQ,EAAE,qBAAqB,CAAA;CAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAClE,OAAO,CAAC,4BAA4B,CAAC,CAgFvC"}
1
+ {"version":3,"file":"seed-preset.d.ts","sourceRoot":"","sources":["../../../src/catalox/seed-preset.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAGvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAMrE,yEAAyE;AACzE,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAE/C,MAAM,MAAM,qBAAqB,GAAG;IAClC,aAAa,EAAE,8BAA8B,CAAC;IAC9C,sDAAsD;IACtD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,UAAU,EAAE,iBAAiB,CAAC;QAC9B,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;KAC5B,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;KACxE,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CACrE,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAExD,MAAM,MAAM,4BAA4B,GAAG;IACzC,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,uBAAuB,EAAE,MAAM,EAAE,CAAC;QAClC,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAOF,qBAAa,wBAAyB,SAAQ,KAAK;aAG/B,SAAS,CAAC,EAAE,WAAW,EAAE,GAAG,IAAI;gBADhD,OAAO,EAAE,MAAM,EACC,SAAS,CAAC,EAAE,WAAW,EAAE,GAAG,IAAI,YAAA;CAKnD;AAqFD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,qBAAqB,CAY7E;AAED,wBAAsB,+BAA+B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAUxG;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE;IAAE,QAAQ,EAAE,qBAAqB,CAAA;CAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACrG,OAAO,CAAC,4BAA4B,CAAC,CAuFvC"}
@@ -1,5 +1,6 @@
1
1
  import AjvImport from "ajv";
2
2
  import { readFile } from "node:fs/promises";
3
+ import { resolveCataloxSeedPresetPath } from "./seed-preset-resolve.js";
3
4
  function formatAjvErrors(errors) {
4
5
  if (!errors?.length)
5
6
  return "validation failed";
@@ -119,9 +120,23 @@ export async function loadCataloxSeedManifestFromPath(presetPath) {
119
120
  * Idempotent apply: catalogs (create if missing) → descriptors → bindings → native items.
120
121
  * Descriptor steps require {@link CataloxContext.superAdmin}. Bindings default `canWrite` to `true`
121
122
  * when the manifest lists native `items` for that `catalogId` (so upserts succeed), unless overridden.
123
+ *
124
+ * Preset sources:
125
+ * - `{ presetPath }` — filesystem JSON manifest
126
+ * - `{ preset, cwd? }` — resolved via {@link resolveCataloxSeedPresetPath} (builtins, registry, npm `catalox.seedPreset`, or paths)
127
+ * - `{ manifest }` — in-memory object (validated)
122
128
  */
123
129
  export async function applyCataloxSeedPreset(catalox, context, input) {
124
- const manifest = "manifest" in input ? parseCataloxSeedManifest(input.manifest) : await loadCataloxSeedManifestFromPath(input.presetPath);
130
+ const manifest = await (async () => {
131
+ if ("manifest" in input)
132
+ return parseCataloxSeedManifest(input.manifest);
133
+ if ("presetPath" in input)
134
+ return loadCataloxSeedManifestFromPath(input.presetPath);
135
+ const path = input.cwd != null && input.cwd !== ""
136
+ ? resolveCataloxSeedPresetPath(input.preset, { cwd: input.cwd })
137
+ : resolveCataloxSeedPresetPath(input.preset);
138
+ return loadCataloxSeedManifestFromPath(path);
139
+ })();
125
140
  const warnings = [];
126
141
  const catalogsCreated = [];
127
142
  const catalogsSkippedExisting = [];
@@ -1 +1 @@
1
- {"version":3,"file":"seed-preset.js","sourceRoot":"","sources":["../../../src/catalox/seed-preset.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seed-preset.js","sourceRoot":"","sources":["../../../src/catalox/seed-preset.ts"],"names":[],"mappings":"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"}
@@ -252,12 +252,20 @@ seedCmd
252
252
  .command("apply")
253
253
  .description("Apply a JSON preset: catalogs, optional descriptors/bindings/items")
254
254
  .requiredOption("--app <appId>", "AppId context (CataloxContext.appId)")
255
- .requiredOption("--file <path>", "Path to preset JSON manifest")
255
+ .option("--file <path>", "Path to preset JSON manifest")
256
+ .option("--preset <id>", "Logical preset: builtin:native-map-v1, registry alias (native-map@v1), npm package name, or path to .json")
256
257
  .option("--god", "Super-admin context (required for descriptor section and bindings to other apps)", false)
257
258
  .action(async (opts) => {
259
+ const fileRaw = opts.file != null ? String(opts.file).trim() : "";
260
+ const presetRaw = opts.preset != null ? String(opts.preset).trim() : "";
261
+ if ((fileRaw !== "") === (presetRaw !== "")) {
262
+ throw new Error("Specify exactly one of --file <path> or --preset <id>");
263
+ }
258
264
  const catalox = createCatalox();
259
265
  const ctx = baseContext({ app: opts.app, god: opts.god });
260
- const res = await applyCataloxSeedPreset(catalox, ctx, { presetPath: String(opts.file) });
266
+ const res = presetRaw
267
+ ? await applyCataloxSeedPreset(catalox, ctx, { preset: presetRaw })
268
+ : await applyCataloxSeedPreset(catalox, ctx, { presetPath: fileRaw });
261
269
  await writeOrStdout(JSON.stringify(res, null, 2));
262
270
  });
263
271
  const firestoreCmd = program
@@ -773,6 +781,141 @@ catalogCmd
773
781
  if (!res.ok)
774
782
  process.exitCode = 1;
775
783
  });
784
+ const toolboxCmd = program
785
+ .command("toolbox")
786
+ .description("Operator helpers: diagnose app↔catalog access (bindings) and repair common mistakes");
787
+ toolboxCmd
788
+ .command("check-access")
789
+ .description("Read Firestore catalogBindings doc, catalog row, and run listCatalogItemsWithOutcome (same auth rules as runtime)")
790
+ .requiredOption("--app <appId>", "App id (must match CataloxContext.appId in your host)")
791
+ .requiredOption("--catalog <catalogId>", "Catalog id (e.g. entities)")
792
+ .option("--show-all-bindings", "List every catalogBindings row for this catalogId (who else is bound)", false)
793
+ .action(async (opts) => {
794
+ const { catalox, firestore } = createCataloxFromEnv();
795
+ const appId = String(opts.app).trim();
796
+ const catalogId = String(opts.catalog).trim();
797
+ const bindingDocId = `${appId}:${catalogId}`;
798
+ const bindingSnap = await firestore.collection("catalogBindings").doc(bindingDocId).get();
799
+ const catalog = await catalox.getCatalog({ appId }, catalogId);
800
+ const listSim = await catalox.listCatalogItemsWithOutcome({ appId }, catalogId, { limit: 1 });
801
+ const recommendations = [];
802
+ if (!catalog) {
803
+ recommendations.push("Catalog document missing under `catalogs` (typo in catalogId, or catalog never created in this project).");
804
+ }
805
+ if (!bindingSnap.exists) {
806
+ recommendations.push(`No binding document at catalogBindings/${bindingDocId}. Fix: catalox toolbox ensure-binding --app ${appId} --catalog ${catalogId} (use --god if your CLI context app differs from --app).`);
807
+ }
808
+ else {
809
+ const b = bindingSnap.data();
810
+ const status = b?.status;
811
+ const access = b?.access;
812
+ if (status !== "active") {
813
+ recommendations.push(`Binding status is "${String(status)}" (expected active). Fix: catalox toolbox repair-binding --god --app ${appId} --catalog ${catalogId}`);
814
+ }
815
+ if (!access?.canRead) {
816
+ recommendations.push("Binding has canRead false or missing; readers will be denied.");
817
+ }
818
+ }
819
+ if (listSim.outcome === "denied") {
820
+ recommendations.push("Simulated list returned denied — matches missing/inactive binding or insufficient access flags.");
821
+ }
822
+ if (listSim.outcome === "misconfigured") {
823
+ recommendations.push("Simulated list returned misconfigured (catalog/adapter/descriptor issue after authz).");
824
+ }
825
+ if (listSim.outcome === "mapping_blocked") {
826
+ recommendations.push("Simulated list returned mapping_blocked (mapping spec / adapter execution).");
827
+ }
828
+ let allBindingsForCatalog;
829
+ if (opts.showAllBindings) {
830
+ const q = await firestore.collection("catalogBindings").where("catalogId", "==", catalogId).get();
831
+ allBindingsForCatalog = q.docs.map((d) => ({ id: d.id, ...d.data() }));
832
+ }
833
+ const payload = {
834
+ appId,
835
+ catalogId,
836
+ bindingDocId,
837
+ bindingDocExists: bindingSnap.exists,
838
+ binding: bindingSnap.exists ? bindingSnap.data() : null,
839
+ catalogExists: Boolean(catalog),
840
+ ...(catalog ? { catalogMetadataStatus: catalog.metadata?.status } : {}),
841
+ simulatedListOutcome: listSim.outcome,
842
+ ...(listSim.outcome === "denied" && "error" in listSim
843
+ ? { deniedMessage: listSim.error?.message }
844
+ : {}),
845
+ ...(allBindingsForCatalog ? { allBindingsForCatalog } : {}),
846
+ recommendations,
847
+ };
848
+ await writeOrStdout(JSON.stringify(payload, null, 2));
849
+ if (listSim.outcome !== "ok" && listSim.outcome !== "empty")
850
+ process.exitCode = 1;
851
+ });
852
+ toolboxCmd
853
+ .command("ensure-binding")
854
+ .description("Create catalogBindings/{appId:catalogId} if absent (Catalox ensureBinding). Does not upgrade access if a row already exists.")
855
+ .requiredOption("--app <appId>", "App id that should receive catalog access")
856
+ .requiredOption("--catalog <catalogId>", "Catalog id")
857
+ .option("--write", "Set canWrite true (default false)", false)
858
+ .option("--admin", "Set canAdmin true", false)
859
+ .option("--god", "Super-admin context: required when CLI context app is not the same as --app (see ensureBinding rules)", false)
860
+ .action(async (opts) => {
861
+ const catalox = createCatalox();
862
+ const appId = String(opts.app).trim();
863
+ const ctx = baseContext({ app: appId, god: Boolean(opts.god) });
864
+ await catalox.ensureBinding(ctx, {
865
+ appId,
866
+ catalogId: String(opts.catalog).trim(),
867
+ access: {
868
+ canRead: true,
869
+ canWrite: Boolean(opts.write),
870
+ ...(opts.admin ? { canAdmin: true } : {}),
871
+ },
872
+ });
873
+ await writeOrStdout(JSON.stringify({
874
+ ok: true,
875
+ hint: "If a binding already existed, ensureBinding is a no-op (use toolbox repair-binding to change access or reactivate).",
876
+ }, null, 2));
877
+ });
878
+ toolboxCmd
879
+ .command("repair-binding")
880
+ .description("Merge-write catalogBindings doc to status=active and access flags (use when ensure-binding no-ops on a disabled or wrong-access row)")
881
+ .requiredOption("--app <appId>", "App id")
882
+ .requiredOption("--catalog <catalogId>", "Catalog id")
883
+ .option("--write", "Set canWrite true", false)
884
+ .option("--admin", "Set canAdmin true", false)
885
+ .option("--god", "Required: confirms operator intent (writes Firestore as Admin SDK)", false)
886
+ .action(async (opts) => {
887
+ if (!opts.god) {
888
+ // eslint-disable-next-line no-console
889
+ console.error("repair-binding requires --god");
890
+ process.exitCode = 1;
891
+ return;
892
+ }
893
+ const { firestore } = createCataloxFromEnv();
894
+ const appId = String(opts.app).trim();
895
+ const catalogId = String(opts.catalog).trim();
896
+ const bindingDocId = `${appId}:${catalogId}`;
897
+ const now = new Date().toISOString();
898
+ const snap = await firestore.collection("catalogBindings").doc(bindingDocId).get();
899
+ const prev = snap.exists ? snap.data() : {};
900
+ const createdAt = typeof prev.createdAt === "string" ? prev.createdAt : now;
901
+ await firestore
902
+ .collection("catalogBindings")
903
+ .doc(bindingDocId)
904
+ .set({
905
+ bindingId: bindingDocId,
906
+ appId,
907
+ catalogId,
908
+ access: {
909
+ canRead: true,
910
+ canWrite: Boolean(opts.write),
911
+ ...(opts.admin ? { canAdmin: true } : {}),
912
+ },
913
+ status: "active",
914
+ createdAt,
915
+ updatedAt: now,
916
+ }, { merge: true });
917
+ await writeOrStdout(JSON.stringify({ ok: true, bindingDocId, updatedAt: now }, null, 2));
918
+ });
776
919
  program.parseAsync(process.argv).catch((err) => {
777
920
  // eslint-disable-next-line no-console
778
921
  console.error(err instanceof Error ? err.message : err);