@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.
- package/README.md +909 -897
- package/dist/src/catalox/seed-preset-resolve.d.ts +24 -0
- package/dist/src/catalox/seed-preset-resolve.d.ts.map +1 -0
- package/dist/src/catalox/seed-preset-resolve.js +156 -0
- package/dist/src/catalox/seed-preset-resolve.js.map +1 -0
- package/dist/src/catalox/seed-preset.d.ts +8 -0
- package/dist/src/catalox/seed-preset.d.ts.map +1 -1
- package/dist/src/catalox/seed-preset.js +16 -1
- package/dist/src/catalox/seed-preset.js.map +1 -1
- package/dist/src/cli/index.js +145 -2
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/contracts/errors.d.ts.map +1 -1
- package/dist/src/contracts/errors.js +12 -1
- package/dist/src/contracts/errors.js.map +1 -1
- package/dist/src/embedder.d.ts +3 -0
- package/dist/src/embedder.d.ts.map +1 -1
- package/dist/src/embedder.js +3 -0
- package/dist/src/embedder.js.map +1 -1
- package/docs/cli-toolbox.md +148 -0
- package/package.json +2 -1
- package/presets/registry.json +4 -0
|
@@ -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;
|
|
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 =
|
|
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":"AAAA,OAAO,SAAS,MAAM,KAAK,CAAC;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"seed-preset.js","sourceRoot":"","sources":["../../../src/catalox/seed-preset.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -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
|
-
.
|
|
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 =
|
|
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);
|