@metaobjectsdev/cli 0.12.0 → 0.12.1
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 +25 -0
- package/dist/src/commands/types.d.ts +2 -0
- package/dist/src/commands/types.d.ts.map +1 -0
- package/dist/src/commands/types.js +171 -0
- package/dist/src/commands/types.js.map +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -1
- package/package.json +9 -9
- package/src/commands/types.ts +186 -0
- package/src/index.ts +5 -0
package/README.md
CHANGED
|
@@ -103,6 +103,31 @@ Flags:
|
|
|
103
103
|
|
|
104
104
|
Positional args filter entities by name. All other knobs (`outDir`, `targets`, `dialect`, `dbImport`, `extStyle`, `apiPrefix`, generator list) live in `metaobjects.config.ts`.
|
|
105
105
|
|
|
106
|
+
### `meta types [<query>]`
|
|
107
|
+
|
|
108
|
+
Searches the metadata vocabulary (types, subtypes, `@attrs`) without loading it all into context — apropos + `kubectl explain` over the live registry. Use it to find the declarative construct for a piece of data logic instead of hand-writing it.
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
meta types relationship # subtypes/attrs whose name matches "relationship"
|
|
112
|
+
meta types --all money # search names AND descriptions ("find by what it does")
|
|
113
|
+
meta types --type field --kind subtype # all field subtypes (terse)
|
|
114
|
+
meta types field.enum --detail # one construct: description + when-to-use + valid @attrs
|
|
115
|
+
meta types --type origin --json # machine-readable subtree
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`QUERY` is a case-insensitive substring matched on the name (`type.subType` / `@attr`).
|
|
119
|
+
|
|
120
|
+
Flags:
|
|
121
|
+
- `--desc` / `--all` — also match `QUERY` against descriptions + when-to-use guidance (not just names)
|
|
122
|
+
- `--kind <type|subtype|attr>` — filter by category (comma-list ok)
|
|
123
|
+
- `--type <name>` — scope to one top-level type (e.g. `--type field`)
|
|
124
|
+
- `--detail` — drill in: full description, when-to-use, and valid `@attrs`
|
|
125
|
+
- `--json` — emit the matching registry subtree verbatim (stable-sorted)
|
|
126
|
+
- `--limit <N>` — cap results (default 20; `0` = unlimited)
|
|
127
|
+
- `--no-headers` — omit the `N of M`/match-count footer (parse-friendly)
|
|
128
|
+
|
|
129
|
+
Default output is one terse line per match.
|
|
130
|
+
|
|
106
131
|
### `meta migrate`
|
|
107
132
|
|
|
108
133
|
Diffs `metaobjects/` metadata against a live DB and emits paired migration SQL files (per-migration subdirectories with `up.sql` and `down.sql`).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/types.ts"],"names":[],"mappings":"AAmFA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAiGlE"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// `meta types [QUERY]` — search the metadata vocabulary (types, subtypes, @attrs)
|
|
2
|
+
// without loading it all into context. apropos + `kubectl explain` over the live
|
|
3
|
+
// registry, tuned for an agent's token budget: terse names-first default, opt-in
|
|
4
|
+
// description search, drill-in `--detail`, machine-readable `--json`.
|
|
5
|
+
import { TypeRegistry, registerCoreTypes, buildRegistryManifest, } from "@metaobjectsdev/metadata";
|
|
6
|
+
import { registerForgeTypes } from "@metaobjectsdev/sdk";
|
|
7
|
+
import { log } from "../lib/log.js";
|
|
8
|
+
const HELP = `meta types [QUERY] — search the metadata vocabulary without loading it all into context.
|
|
9
|
+
|
|
10
|
+
meta types relationship # subtypes/attrs whose name matches "relationship"
|
|
11
|
+
meta types --all money # search names AND descriptions ("find by what it does")
|
|
12
|
+
meta types --type field --kind subtype # all field subtypes (terse)
|
|
13
|
+
meta types field.enum --detail # one construct: description + when-to-use + valid @attrs
|
|
14
|
+
meta types --type origin --json # machine-readable subtree
|
|
15
|
+
|
|
16
|
+
QUERY is a case-insensitive substring, matched on the name (type.subType / @attr).
|
|
17
|
+
Add --desc (or --all) to also match descriptions + when-to-use guidance.
|
|
18
|
+
|
|
19
|
+
--desc also search descriptions + whenToUse (not just names)
|
|
20
|
+
--all alias for: match name OR description
|
|
21
|
+
--kind <k> filter by category: type | subtype | attr (comma-list ok)
|
|
22
|
+
--type <name> scope to one top-level type (e.g. --type field)
|
|
23
|
+
--detail drill in: full description, when-to-use, and valid @attrs
|
|
24
|
+
--json emit the matching registry subtree verbatim (stable-sorted)
|
|
25
|
+
--limit <N> cap results (default 20; 0 = unlimited)
|
|
26
|
+
--no-headers omit headers (parse-friendly)
|
|
27
|
+
|
|
28
|
+
Default output is one terse line per match. Reach for metaobjects metadata
|
|
29
|
+
(declare it, regenerate) instead of hand-writing data logic — this finds the
|
|
30
|
+
construct.`;
|
|
31
|
+
function parse(args) {
|
|
32
|
+
const f = {
|
|
33
|
+
query: null, desc: false, kind: new Set(), type: null,
|
|
34
|
+
detail: false, json: false, noHeaders: false, limit: 20, help: false,
|
|
35
|
+
};
|
|
36
|
+
for (let i = 0; i < args.length; i++) {
|
|
37
|
+
const a = args[i];
|
|
38
|
+
if (a === "--help" || a === "-h")
|
|
39
|
+
f.help = true;
|
|
40
|
+
else if (a === "--desc" || a === "--all")
|
|
41
|
+
f.desc = true;
|
|
42
|
+
else if (a === "--detail")
|
|
43
|
+
f.detail = true;
|
|
44
|
+
else if (a === "--json")
|
|
45
|
+
f.json = true;
|
|
46
|
+
else if (a === "--no-headers")
|
|
47
|
+
f.noHeaders = true;
|
|
48
|
+
else if (a === "--limit")
|
|
49
|
+
f.limit = Math.max(0, Number(args[++i] ?? "20") || 0);
|
|
50
|
+
else if (a === "--type")
|
|
51
|
+
f.type = (args[++i] ?? "").toLowerCase() || null;
|
|
52
|
+
else if (a === "--kind") {
|
|
53
|
+
for (const k of (args[++i] ?? "").split(","))
|
|
54
|
+
if (k === "type" || k === "subtype" || k === "attr")
|
|
55
|
+
f.kind.add(k);
|
|
56
|
+
}
|
|
57
|
+
else if (a.startsWith("-"))
|
|
58
|
+
throw new Error(`unknown flag: ${a}`);
|
|
59
|
+
else if (f.query === null)
|
|
60
|
+
f.query = a;
|
|
61
|
+
else
|
|
62
|
+
throw new Error(`unexpected argument: ${a}`);
|
|
63
|
+
}
|
|
64
|
+
return f;
|
|
65
|
+
}
|
|
66
|
+
export async function typesCommand(args) {
|
|
67
|
+
let f;
|
|
68
|
+
try {
|
|
69
|
+
f = parse(args);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
log.error(err.message);
|
|
73
|
+
return 2;
|
|
74
|
+
}
|
|
75
|
+
if (f.help) {
|
|
76
|
+
log.info(HELP);
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
const registry = new TypeRegistry();
|
|
80
|
+
registerCoreTypes(registry);
|
|
81
|
+
registerForgeTypes(registry);
|
|
82
|
+
const manifest = buildRegistryManifest(registry);
|
|
83
|
+
// Flatten the manifest into searchable entries.
|
|
84
|
+
const entries = [];
|
|
85
|
+
for (const mt of manifest.types) {
|
|
86
|
+
const tsName = `${mt.type}.${mt.subType}`;
|
|
87
|
+
entries.push({
|
|
88
|
+
kind: "subtype", name: tsName, owner: tsName, type: mt.type,
|
|
89
|
+
description: mt.description, whenToUse: mt.whenToUse,
|
|
90
|
+
attrNames: mt.attrs.map((a) => `@${a.name}`), raw: mt,
|
|
91
|
+
});
|
|
92
|
+
for (const at of mt.attrs) {
|
|
93
|
+
entries.push({
|
|
94
|
+
kind: "attr", name: `${tsName} @${at.name}`, owner: tsName, type: mt.type,
|
|
95
|
+
description: at.description, whenToUse: at.whenToUse, attrNames: [], raw: at,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const q = (f.query ?? "").toLowerCase();
|
|
100
|
+
const wantKind = (e) => f.kind.size === 0
|
|
101
|
+
? true
|
|
102
|
+
: (f.kind.has("attr") && e.kind === "attr") ||
|
|
103
|
+
((f.kind.has("subtype") || f.kind.has("type")) && e.kind === "subtype");
|
|
104
|
+
const matches = entries.filter((e) => {
|
|
105
|
+
if (f.type && e.type !== f.type)
|
|
106
|
+
return false;
|
|
107
|
+
if (!wantKind(e))
|
|
108
|
+
return false;
|
|
109
|
+
if (!q)
|
|
110
|
+
return true;
|
|
111
|
+
if (e.name.toLowerCase().includes(q))
|
|
112
|
+
return true;
|
|
113
|
+
if (f.desc && (e.description.toLowerCase().includes(q) ||
|
|
114
|
+
(e.whenToUse ?? "").toLowerCase().includes(q)))
|
|
115
|
+
return true;
|
|
116
|
+
return false;
|
|
117
|
+
});
|
|
118
|
+
// Stable sort by (type, name).
|
|
119
|
+
matches.sort((a, b) => a.type.localeCompare(b.type) || a.name.localeCompare(b.name));
|
|
120
|
+
if (matches.length === 0) {
|
|
121
|
+
log.info(q ? `No vocabulary matches "${f.query}". Try --all to search descriptions, or drop --kind/--type filters.`
|
|
122
|
+
: "No matching vocabulary.");
|
|
123
|
+
return 0;
|
|
124
|
+
}
|
|
125
|
+
const total = matches.length;
|
|
126
|
+
const shown = f.limit > 0 ? matches.slice(0, f.limit) : matches;
|
|
127
|
+
if (f.json) {
|
|
128
|
+
log.info(JSON.stringify(shown.map((e) => e.raw), null, 2));
|
|
129
|
+
return 0;
|
|
130
|
+
}
|
|
131
|
+
if (f.detail) {
|
|
132
|
+
for (const e of shown) {
|
|
133
|
+
const head = e.kind === "subtype" ? e.name : e.name;
|
|
134
|
+
log.info(`\n${head} (${e.kind})`);
|
|
135
|
+
if (e.description)
|
|
136
|
+
log.info(` ${e.description}`);
|
|
137
|
+
if (e.whenToUse)
|
|
138
|
+
log.info(` → reach for it when: ${e.whenToUse}`);
|
|
139
|
+
if (e.kind === "subtype") {
|
|
140
|
+
const mt = e.raw;
|
|
141
|
+
if (mt.attrs.length) {
|
|
142
|
+
log.info(" @attrs:");
|
|
143
|
+
for (const at of mt.attrs)
|
|
144
|
+
log.info(` @${at.name} ${at.valueType ?? "any"}${at.required ? " REQUIRED" : ""} ${at.description}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
// Terse: one line per match. Subtypes get attr-name hints; attrs get a short desc.
|
|
151
|
+
for (const e of shown) {
|
|
152
|
+
if (e.kind === "subtype") {
|
|
153
|
+
const hint = e.attrNames.length ? ` (${e.attrNames.slice(0, 6).join(", ")}${e.attrNames.length > 6 ? ", …" : ""})` : "";
|
|
154
|
+
log.info(`${e.name.padEnd(28)} ${oneLine(e.description)}${hint}`);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
log.info(`${e.name.padEnd(28)} ${oneLine(e.description)}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (!f.noHeaders && shown.length < total)
|
|
162
|
+
log.info(`\n${shown.length} of ${total} shown — narrow with QUERY/--type/--kind or raise --limit.`);
|
|
163
|
+
else if (!f.noHeaders)
|
|
164
|
+
log.info(`\n${total} match${total === 1 ? "" : "es"}.`);
|
|
165
|
+
return 0;
|
|
166
|
+
}
|
|
167
|
+
function oneLine(s) {
|
|
168
|
+
const t = s.replace(/\s+/g, " ").trim();
|
|
169
|
+
return t.length > 90 ? t.slice(0, 88) + "…" : t;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/types.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,iFAAiF;AACjF,iFAAiF;AACjF,sEAAsE;AACtE,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAcpC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;WAsBF,CAAC;AAEZ,SAAS,KAAK,CAAC,IAAc;IAC3B,MAAM,CAAC,GAAe;QACpB,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI;QACrD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK;KACrE,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QAC5B,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;aAC3C,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,OAAO;YAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;aACnD,IAAI,CAAC,KAAK,UAAU;YAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;aACtC,IAAI,CAAC,KAAK,QAAQ;YAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;aAClC,IAAI,CAAC,KAAK,cAAc;YAAE,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;aAC7C,IAAI,CAAC,KAAK,SAAS;YAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;aAC3E,IAAI,CAAC,KAAK,QAAQ;YAAE,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC;aACrE,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;gBAC1C,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,MAAM;oBAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;aAAM,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;aAC/D,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI;YAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;;YAClC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,IAAI,CAAa,CAAC;IAClB,IAAI,CAAC;QACH,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IACpC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5B,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAEjD,gDAAgD;IAChD,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI;YAC3D,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS;YACpD,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE;SACtD,CAAC,CAAC;QACH,KAAK,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI;gBACzE,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;aAC7E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QAC9C,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;YACzC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACnC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpB,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAClD,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,+BAA+B;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAErF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,KAAK,qEAAqE;YACvG,CAAC,CAAC,yBAAyB,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAEhE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACpD,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,CAAC,WAAW;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAClD,IAAI,CAAC,CAAC,SAAS;gBAAE,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAsG,CAAC;gBACpH,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBACpB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBACtB,KAAK,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK;wBACvB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,SAAS,IAAI,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC/G,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,mFAAmF;QACnF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzH,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK;QACtC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,OAAO,KAAK,4DAA4D,CAAC,CAAC;SACjG,IAAI,CAAC,CAAC,CAAC,SAAS;QACnB,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAC1D,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,OAAO,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC"}
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAuKvE,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8JzD"}
|
package/dist/src/index.js
CHANGED
|
@@ -14,6 +14,7 @@ COMMANDS:
|
|
|
14
14
|
init --refresh-docs Refresh .metaobjects/AGENTS.md + CLAUDE.md after CLI upgrades
|
|
15
15
|
agent-docs Scaffold only the agent-context (.metaobjects/ + .claude/skills/) — canonical redirect target for all language ports
|
|
16
16
|
gen [<entity>...] Codegen TS targets from metaobjects/ entities
|
|
17
|
+
types [query] Search the metadata vocabulary (types, subtypes, @attrs) by name or description
|
|
17
18
|
export Flatten loaded metadata to one canonical JSON artifact
|
|
18
19
|
docs <metadata> --out <dir> Generate neutral metadata documentation (entity + template pages)
|
|
19
20
|
verify Drift gate — subverbs: --templates / --db / --codegen (bare = --templates)
|
|
@@ -297,6 +298,10 @@ export async function run(argv) {
|
|
|
297
298
|
const { exportCommand } = await import("./commands/export.js");
|
|
298
299
|
return exportCommand(rest, cwd);
|
|
299
300
|
}
|
|
301
|
+
case "types": {
|
|
302
|
+
const { typesCommand } = await import("./commands/types.js");
|
|
303
|
+
return typesCommand(rest);
|
|
304
|
+
}
|
|
300
305
|
case "docs": {
|
|
301
306
|
const { docsCommand } = await import("./commands/docs.js");
|
|
302
307
|
return docsCommand(rest, cwd);
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAE7B,MAAM,SAAS,GAAG,4BAA4B,OAAO
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metaobjectsdev/cli",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.1",
|
|
4
4
|
"description": "CLI for MetaObjects: scaffold, codegen, migrate, and drift-detection commands.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/src/index.js",
|
|
@@ -49,14 +49,14 @@
|
|
|
49
49
|
],
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@libsql/kysely-libsql": "^0.4.0",
|
|
52
|
-
"@metaobjectsdev/codegen-ts": "0.12.
|
|
53
|
-
"@metaobjectsdev/codegen-ts-react": "0.12.
|
|
54
|
-
"@metaobjectsdev/codegen-ts-tanstack": "0.12.
|
|
55
|
-
"@metaobjectsdev/metadata": "0.12.
|
|
56
|
-
"@metaobjectsdev/migrate-ts": "0.12.
|
|
57
|
-
"@metaobjectsdev/render": "0.12.
|
|
58
|
-
"@metaobjectsdev/runtime-ts": "0.12.
|
|
59
|
-
"@metaobjectsdev/sdk": "0.12.
|
|
52
|
+
"@metaobjectsdev/codegen-ts": "0.12.1",
|
|
53
|
+
"@metaobjectsdev/codegen-ts-react": "0.12.1",
|
|
54
|
+
"@metaobjectsdev/codegen-ts-tanstack": "0.12.1",
|
|
55
|
+
"@metaobjectsdev/metadata": "0.12.1",
|
|
56
|
+
"@metaobjectsdev/migrate-ts": "0.12.1",
|
|
57
|
+
"@metaobjectsdev/render": "0.12.1",
|
|
58
|
+
"@metaobjectsdev/runtime-ts": "0.12.1",
|
|
59
|
+
"@metaobjectsdev/sdk": "0.12.1",
|
|
60
60
|
"@toon-format/toon": "^2.3.0",
|
|
61
61
|
"jiti": "^2.4.0"
|
|
62
62
|
},
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// `meta types [QUERY]` — search the metadata vocabulary (types, subtypes, @attrs)
|
|
2
|
+
// without loading it all into context. apropos + `kubectl explain` over the live
|
|
3
|
+
// registry, tuned for an agent's token budget: terse names-first default, opt-in
|
|
4
|
+
// description search, drill-in `--detail`, machine-readable `--json`.
|
|
5
|
+
import {
|
|
6
|
+
TypeRegistry,
|
|
7
|
+
registerCoreTypes,
|
|
8
|
+
buildRegistryManifest,
|
|
9
|
+
} from "@metaobjectsdev/metadata";
|
|
10
|
+
import { registerForgeTypes } from "@metaobjectsdev/sdk";
|
|
11
|
+
import { log } from "../lib/log.js";
|
|
12
|
+
|
|
13
|
+
interface TypesFlags {
|
|
14
|
+
query: string | null;
|
|
15
|
+
desc: boolean; // also match QUERY against descriptions/whenToUse
|
|
16
|
+
kind: Set<"type" | "subtype" | "attr">;
|
|
17
|
+
type: string | null; // scope to one top-level type
|
|
18
|
+
detail: boolean;
|
|
19
|
+
json: boolean;
|
|
20
|
+
noHeaders: boolean;
|
|
21
|
+
limit: number; // 0 = unlimited
|
|
22
|
+
help: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const HELP = `meta types [QUERY] — search the metadata vocabulary without loading it all into context.
|
|
26
|
+
|
|
27
|
+
meta types relationship # subtypes/attrs whose name matches "relationship"
|
|
28
|
+
meta types --all money # search names AND descriptions ("find by what it does")
|
|
29
|
+
meta types --type field --kind subtype # all field subtypes (terse)
|
|
30
|
+
meta types field.enum --detail # one construct: description + when-to-use + valid @attrs
|
|
31
|
+
meta types --type origin --json # machine-readable subtree
|
|
32
|
+
|
|
33
|
+
QUERY is a case-insensitive substring, matched on the name (type.subType / @attr).
|
|
34
|
+
Add --desc (or --all) to also match descriptions + when-to-use guidance.
|
|
35
|
+
|
|
36
|
+
--desc also search descriptions + whenToUse (not just names)
|
|
37
|
+
--all alias for: match name OR description
|
|
38
|
+
--kind <k> filter by category: type | subtype | attr (comma-list ok)
|
|
39
|
+
--type <name> scope to one top-level type (e.g. --type field)
|
|
40
|
+
--detail drill in: full description, when-to-use, and valid @attrs
|
|
41
|
+
--json emit the matching registry subtree verbatim (stable-sorted)
|
|
42
|
+
--limit <N> cap results (default 20; 0 = unlimited)
|
|
43
|
+
--no-headers omit headers (parse-friendly)
|
|
44
|
+
|
|
45
|
+
Default output is one terse line per match. Reach for metaobjects metadata
|
|
46
|
+
(declare it, regenerate) instead of hand-writing data logic — this finds the
|
|
47
|
+
construct.`;
|
|
48
|
+
|
|
49
|
+
function parse(args: string[]): TypesFlags {
|
|
50
|
+
const f: TypesFlags = {
|
|
51
|
+
query: null, desc: false, kind: new Set(), type: null,
|
|
52
|
+
detail: false, json: false, noHeaders: false, limit: 20, help: false,
|
|
53
|
+
};
|
|
54
|
+
for (let i = 0; i < args.length; i++) {
|
|
55
|
+
const a = args[i] as string;
|
|
56
|
+
if (a === "--help" || a === "-h") f.help = true;
|
|
57
|
+
else if (a === "--desc" || a === "--all") f.desc = true;
|
|
58
|
+
else if (a === "--detail") f.detail = true;
|
|
59
|
+
else if (a === "--json") f.json = true;
|
|
60
|
+
else if (a === "--no-headers") f.noHeaders = true;
|
|
61
|
+
else if (a === "--limit") f.limit = Math.max(0, Number(args[++i] ?? "20") || 0);
|
|
62
|
+
else if (a === "--type") f.type = (args[++i] ?? "").toLowerCase() || null;
|
|
63
|
+
else if (a === "--kind") {
|
|
64
|
+
for (const k of (args[++i] ?? "").split(","))
|
|
65
|
+
if (k === "type" || k === "subtype" || k === "attr") f.kind.add(k);
|
|
66
|
+
} else if (a.startsWith("-")) throw new Error(`unknown flag: ${a}`);
|
|
67
|
+
else if (f.query === null) f.query = a;
|
|
68
|
+
else throw new Error(`unexpected argument: ${a}`);
|
|
69
|
+
}
|
|
70
|
+
return f;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
interface Entry {
|
|
74
|
+
kind: "subtype" | "attr";
|
|
75
|
+
name: string; // "field.string" or "field.string @maxLength"
|
|
76
|
+
owner: string; // the type.subType this belongs to (= name for subtypes)
|
|
77
|
+
type: string; // top-level type
|
|
78
|
+
description: string;
|
|
79
|
+
whenToUse: string | undefined;
|
|
80
|
+
attrNames: string[]; // attr-name hints (for subtype terse lines)
|
|
81
|
+
raw: unknown; // the manifest node, for --json
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export async function typesCommand(args: string[]): Promise<number> {
|
|
85
|
+
let f: TypesFlags;
|
|
86
|
+
try {
|
|
87
|
+
f = parse(args);
|
|
88
|
+
} catch (err) {
|
|
89
|
+
log.error((err as Error).message);
|
|
90
|
+
return 2;
|
|
91
|
+
}
|
|
92
|
+
if (f.help) {
|
|
93
|
+
log.info(HELP);
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const registry = new TypeRegistry();
|
|
98
|
+
registerCoreTypes(registry);
|
|
99
|
+
registerForgeTypes(registry);
|
|
100
|
+
const manifest = buildRegistryManifest(registry);
|
|
101
|
+
|
|
102
|
+
// Flatten the manifest into searchable entries.
|
|
103
|
+
const entries: Entry[] = [];
|
|
104
|
+
for (const mt of manifest.types) {
|
|
105
|
+
const tsName = `${mt.type}.${mt.subType}`;
|
|
106
|
+
entries.push({
|
|
107
|
+
kind: "subtype", name: tsName, owner: tsName, type: mt.type,
|
|
108
|
+
description: mt.description, whenToUse: mt.whenToUse,
|
|
109
|
+
attrNames: mt.attrs.map((a) => `@${a.name}`), raw: mt,
|
|
110
|
+
});
|
|
111
|
+
for (const at of mt.attrs) {
|
|
112
|
+
entries.push({
|
|
113
|
+
kind: "attr", name: `${tsName} @${at.name}`, owner: tsName, type: mt.type,
|
|
114
|
+
description: at.description, whenToUse: at.whenToUse, attrNames: [], raw: at,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const q = (f.query ?? "").toLowerCase();
|
|
120
|
+
const wantKind = (e: Entry) => f.kind.size === 0
|
|
121
|
+
? true
|
|
122
|
+
: (f.kind.has("attr") && e.kind === "attr") ||
|
|
123
|
+
((f.kind.has("subtype") || f.kind.has("type")) && e.kind === "subtype");
|
|
124
|
+
const matches = entries.filter((e) => {
|
|
125
|
+
if (f.type && e.type !== f.type) return false;
|
|
126
|
+
if (!wantKind(e)) return false;
|
|
127
|
+
if (!q) return true;
|
|
128
|
+
if (e.name.toLowerCase().includes(q)) return true;
|
|
129
|
+
if (f.desc && (e.description.toLowerCase().includes(q) ||
|
|
130
|
+
(e.whenToUse ?? "").toLowerCase().includes(q))) return true;
|
|
131
|
+
return false;
|
|
132
|
+
});
|
|
133
|
+
// Stable sort by (type, name).
|
|
134
|
+
matches.sort((a, b) => a.type.localeCompare(b.type) || a.name.localeCompare(b.name));
|
|
135
|
+
|
|
136
|
+
if (matches.length === 0) {
|
|
137
|
+
log.info(q ? `No vocabulary matches "${f.query}". Try --all to search descriptions, or drop --kind/--type filters.`
|
|
138
|
+
: "No matching vocabulary.");
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const total = matches.length;
|
|
143
|
+
const shown = f.limit > 0 ? matches.slice(0, f.limit) : matches;
|
|
144
|
+
|
|
145
|
+
if (f.json) {
|
|
146
|
+
log.info(JSON.stringify(shown.map((e) => e.raw), null, 2));
|
|
147
|
+
return 0;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (f.detail) {
|
|
151
|
+
for (const e of shown) {
|
|
152
|
+
const head = e.kind === "subtype" ? e.name : e.name;
|
|
153
|
+
log.info(`\n${head} (${e.kind})`);
|
|
154
|
+
if (e.description) log.info(` ${e.description}`);
|
|
155
|
+
if (e.whenToUse) log.info(` → reach for it when: ${e.whenToUse}`);
|
|
156
|
+
if (e.kind === "subtype") {
|
|
157
|
+
const mt = e.raw as { attrs: { name: string; valueType: string | null; required: boolean; description: string }[] };
|
|
158
|
+
if (mt.attrs.length) {
|
|
159
|
+
log.info(" @attrs:");
|
|
160
|
+
for (const at of mt.attrs)
|
|
161
|
+
log.info(` @${at.name} ${at.valueType ?? "any"}${at.required ? " REQUIRED" : ""} ${at.description}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
} else {
|
|
166
|
+
// Terse: one line per match. Subtypes get attr-name hints; attrs get a short desc.
|
|
167
|
+
for (const e of shown) {
|
|
168
|
+
if (e.kind === "subtype") {
|
|
169
|
+
const hint = e.attrNames.length ? ` (${e.attrNames.slice(0, 6).join(", ")}${e.attrNames.length > 6 ? ", …" : ""})` : "";
|
|
170
|
+
log.info(`${e.name.padEnd(28)} ${oneLine(e.description)}${hint}`);
|
|
171
|
+
} else {
|
|
172
|
+
log.info(`${e.name.padEnd(28)} ${oneLine(e.description)}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (!f.noHeaders && shown.length < total)
|
|
177
|
+
log.info(`\n${shown.length} of ${total} shown — narrow with QUERY/--type/--kind or raise --limit.`);
|
|
178
|
+
else if (!f.noHeaders)
|
|
179
|
+
log.info(`\n${total} match${total === 1 ? "" : "es"}.`);
|
|
180
|
+
return 0;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function oneLine(s: string): string {
|
|
184
|
+
const t = s.replace(/\s+/g, " ").trim();
|
|
185
|
+
return t.length > 90 ? t.slice(0, 88) + "…" : t;
|
|
186
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -17,6 +17,7 @@ COMMANDS:
|
|
|
17
17
|
init --refresh-docs Refresh .metaobjects/AGENTS.md + CLAUDE.md after CLI upgrades
|
|
18
18
|
agent-docs Scaffold only the agent-context (.metaobjects/ + .claude/skills/) — canonical redirect target for all language ports
|
|
19
19
|
gen [<entity>...] Codegen TS targets from metaobjects/ entities
|
|
20
|
+
types [query] Search the metadata vocabulary (types, subtypes, @attrs) by name or description
|
|
20
21
|
export Flatten loaded metadata to one canonical JSON artifact
|
|
21
22
|
docs <metadata> --out <dir> Generate neutral metadata documentation (entity + template pages)
|
|
22
23
|
verify Drift gate — subverbs: --templates / --db / --codegen (bare = --templates)
|
|
@@ -303,6 +304,10 @@ export async function run(argv: string[]): Promise<number> {
|
|
|
303
304
|
const { exportCommand } = await import("./commands/export.js");
|
|
304
305
|
return exportCommand(rest, cwd);
|
|
305
306
|
}
|
|
307
|
+
case "types": {
|
|
308
|
+
const { typesCommand } = await import("./commands/types.js");
|
|
309
|
+
return typesCommand(rest);
|
|
310
|
+
}
|
|
306
311
|
case "docs": {
|
|
307
312
|
const { docsCommand } = await import("./commands/docs.js");
|
|
308
313
|
return docsCommand(rest, cwd);
|