@duro-app/cli 1.0.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/LICENSE +21 -0
  2. package/README.md +48 -0
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +91 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/commands/list.d.ts +4 -0
  8. package/dist/commands/list.d.ts.map +1 -0
  9. package/dist/commands/list.js +38 -0
  10. package/dist/commands/list.js.map +1 -0
  11. package/dist/commands/lookup.d.ts +13 -0
  12. package/dist/commands/lookup.d.ts.map +1 -0
  13. package/dist/commands/lookup.js +52 -0
  14. package/dist/commands/lookup.js.map +1 -0
  15. package/dist/commands/manifest.d.ts +5 -0
  16. package/dist/commands/manifest.d.ts.map +1 -0
  17. package/dist/commands/manifest.js +33 -0
  18. package/dist/commands/manifest.js.map +1 -0
  19. package/dist/commands/mcp.d.ts +61 -0
  20. package/dist/commands/mcp.d.ts.map +1 -0
  21. package/dist/commands/mcp.js +155 -0
  22. package/dist/commands/mcp.js.map +1 -0
  23. package/dist/format.d.ts +13 -0
  24. package/dist/format.d.ts.map +1 -0
  25. package/dist/format.js +186 -0
  26. package/dist/format.js.map +1 -0
  27. package/dist/index.d.ts +5 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +4 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/manifest.d.ts +46 -0
  32. package/dist/manifest.d.ts.map +1 -0
  33. package/dist/manifest.js +86 -0
  34. package/dist/manifest.js.map +1 -0
  35. package/dist/registry-types.d.ts +93 -0
  36. package/dist/registry-types.d.ts.map +1 -0
  37. package/dist/registry-types.js +2 -0
  38. package/dist/registry-types.js.map +1 -0
  39. package/dist/registry.d.ts +32 -0
  40. package/dist/registry.d.ts.map +1 -0
  41. package/dist/registry.js +57 -0
  42. package/dist/registry.js.map +1 -0
  43. package/dist/search.d.ts +16 -0
  44. package/dist/search.d.ts.map +1 -0
  45. package/dist/search.js +75 -0
  46. package/dist/search.js.map +1 -0
  47. package/package.json +73 -0
  48. package/registry.json +6991 -0
package/dist/format.js ADDED
@@ -0,0 +1,186 @@
1
+ const useColor = process.env.NO_COLOR === undefined &&
2
+ process.stdout.isTTY === true &&
3
+ !process.argv.includes('--no-color');
4
+ const bold = (text) => (useColor ? `\u001b[1m${text}\u001b[22m` : text);
5
+ const dim = (text) => (useColor ? `\u001b[2m${text}\u001b[22m` : text);
6
+ function wrap(text, indent, width = 88) {
7
+ const words = text.split(/\s+/);
8
+ const lines = [];
9
+ let line = '';
10
+ for (const word of words) {
11
+ if (line.length + word.length + 1 > width - indent.length && line) {
12
+ lines.push(line);
13
+ line = word;
14
+ }
15
+ else {
16
+ line = line ? `${line} ${word}` : word;
17
+ }
18
+ }
19
+ if (line)
20
+ lines.push(line);
21
+ return lines.map((l) => indent + l).join('\n');
22
+ }
23
+ function propLines(props, indent = ' ') {
24
+ const ordered = [...props].sort((a, b) => Number(b.required) - Number(a.required));
25
+ const nameWidth = Math.max(...ordered.map((prop) => prop.name.length + (prop.required ? 1 : 0)), 8);
26
+ const typeWidth = Math.max(...ordered.map((prop) => Math.min(prop.type.length, 40)), 8);
27
+ const lines = [];
28
+ for (const prop of ordered) {
29
+ const name = (prop.name + (prop.required ? '*' : '')).padEnd(nameWidth + 2);
30
+ const type = prop.type.length > 40 ? prop.type.slice(0, 37) + '...' : prop.type;
31
+ const def = prop.default !== undefined ? ` = ${prop.default}` : '';
32
+ const deprecated = prop.deprecated ? ' (deprecated)' : '';
33
+ lines.push(`${indent}${name}${type.padEnd(typeWidth + 2)}${def}${deprecated}`);
34
+ if (prop.union)
35
+ lines.push(dim(`${indent}${' '.repeat(nameWidth + 2)}${prop.union.map((u) => `'${u}'`).join(' | ')}`));
36
+ if (prop.description)
37
+ lines.push(dim(wrap(prop.description, indent + ' '.repeat(nameWidth + 2))));
38
+ }
39
+ return lines.join('\n');
40
+ }
41
+ function metaBlocks(entry) {
42
+ const blocks = [];
43
+ const meta = entry.meta;
44
+ if (!meta)
45
+ return blocks;
46
+ blocks.push(wrap(meta.description, ''));
47
+ if (meta.whenToUse.length > 0) {
48
+ blocks.push(`${bold('USE WHEN')}\n${meta.whenToUse.map((w) => ` · ${w}`).join('\n')}`);
49
+ }
50
+ if (meta.whenNotToUse.length > 0) {
51
+ blocks.push(`${bold("DON'T USE WHEN")}\n${meta.whenNotToUse.map((w) => ` · ${w}`).join('\n')}`);
52
+ }
53
+ return blocks;
54
+ }
55
+ export function renderComponent(registry, key, entry, options = {}) {
56
+ const blocks = [];
57
+ const compound = entry.kind === 'compound' ? ' (compound)' : '';
58
+ blocks.push(`${bold(key)} — import {${entry.name}} from '${entry.importPath}'${compound}`);
59
+ if (entry.deprecated)
60
+ blocks.push(`DEPRECATED: ${entry.deprecated}`);
61
+ if (!options.propsOnly)
62
+ blocks.push(...metaBlocks(entry));
63
+ const meta = entry.meta;
64
+ if (meta?.anatomy && !options.propsOnly && !options.part) {
65
+ const optional = meta.anatomy.optional?.length
66
+ ? ` optional: ${meta.anatomy.optional.join(' · ')}`
67
+ : '';
68
+ blocks.push(`${bold('ANATOMY')} required: ${meta.anatomy.required.join(' > ')}${optional}`);
69
+ }
70
+ if (entry.parts) {
71
+ const parts = options.part
72
+ ? Object.entries(entry.parts).filter(([name]) => name === options.part)
73
+ : Object.entries(entry.parts);
74
+ if (options.part && parts.length === 0) {
75
+ const available = Object.keys(entry.parts).join(', ');
76
+ throw Object.assign(new Error(`${key} has no part "${options.part}" — parts: ${available}`), {
77
+ exitCode: 1,
78
+ });
79
+ }
80
+ for (const [name, part] of parts) {
81
+ const deprecated = part.deprecated ? ` ${dim(`(deprecated: ${part.deprecated})`)}` : '';
82
+ blocks.push(`${bold(`${entry.name}.${name}`)}${deprecated}${part.props.length > 0 ? '\n' + propLines(part.props) : dim('\n (no props)')}`);
83
+ }
84
+ }
85
+ else if (entry.props && entry.props.length > 0) {
86
+ blocks.push(`${bold('PROPS')}\n${propLines(entry.props)}`);
87
+ }
88
+ if (!options.propsOnly && meta?.example) {
89
+ blocks.push(`${bold('EXAMPLE')}\n${meta.example
90
+ .split('\n')
91
+ .map((line) => ` ${line}`)
92
+ .join('\n')}`);
93
+ }
94
+ if (!options.propsOnly && meta?.relatedTo?.length) {
95
+ const width = Math.max(...meta.relatedTo.map((related) => related.component.length));
96
+ blocks.push(`${bold('RELATED')}\n${meta.relatedTo.map((related) => ` ${related.component.padEnd(width + 2)}${related.relationship}`).join('\n')}`);
97
+ }
98
+ if (!options.propsOnly) {
99
+ const recipesUsing = Object.values(registry.recipes)
100
+ .filter((recipe) => recipe.usesComponents.includes(entry.name))
101
+ .map((recipe) => recipe.name);
102
+ if (recipesUsing.length > 0)
103
+ blocks.push(dim(`Recipes using this: ${recipesUsing.join(', ')}`));
104
+ }
105
+ return blocks.join('\n\n');
106
+ }
107
+ export function renderRecipe(entry, options = {}) {
108
+ if (options.sourceOnly)
109
+ return entry.source;
110
+ const blocks = [
111
+ `${bold(entry.name)} — ${entry.title}`,
112
+ ...metaBlocks(entry),
113
+ `Uses: ${entry.usesComponents.join(', ')}${entry.peerDeps.length > 0 ? `\nPeer deps: ${entry.peerDeps.join(', ')}` : ''}`,
114
+ `${dim(`--- source (${entry.name}.recipe.tsx) ---`)}\n${entry.source}`,
115
+ ];
116
+ return blocks.join('\n\n');
117
+ }
118
+ export function renderTokenGroup(key, group) {
119
+ const lines = [
120
+ `${bold(key)} — import {${group.exportName}} from '${group.importPath}'`,
121
+ '',
122
+ ];
123
+ const hasThemes = group.entries.some((entry) => entry.values);
124
+ if (hasThemes) {
125
+ const keyWidth = Math.max(...group.entries.map((entry) => entry.key.length)) + 2;
126
+ lines.push(` ${'token'.padEnd(keyWidth)}${'dark'.padEnd(28)}${'light'.padEnd(28)}high-contrast`);
127
+ for (const entry of group.entries) {
128
+ const themed = entry.values ?? {};
129
+ lines.push(` ${entry.key.padEnd(keyWidth)}${(themed.dark ?? '').padEnd(28)}${(themed.light ?? '').padEnd(28)}${themed.highContrast ?? ''}`);
130
+ }
131
+ }
132
+ else {
133
+ for (const entry of group.entries) {
134
+ lines.push(` ${entry.key.padEnd(14)}${entry.value !== undefined ? String(entry.value) : ''}`);
135
+ }
136
+ }
137
+ return lines.join('\n');
138
+ }
139
+ export function renderIcons(icons) {
140
+ const lines = [
141
+ `${bold('icons')} — <Icon name="..." size="sm|md|lg|xl|xxl" /> (${Object.entries(icons.sizes)
142
+ .map(([token, px]) => `${token} ${px}px`)
143
+ .join(' · ')})`,
144
+ ];
145
+ for (const group of icons.groups) {
146
+ lines.push('', ` ${group.label ?? 'Core'}`, wrap(group.names.join(' · '), ' '));
147
+ }
148
+ return lines.join('\n');
149
+ }
150
+ export function renderRules(rules) {
151
+ const lint = rules.lint
152
+ .map((rule) => {
153
+ const fix = rule.fixable === 'none' ? '' : ` (${rule.fixable})`;
154
+ return ` ${rule.severity.padEnd(6)}${rule.id}${fix}\n${dim(wrap(rule.description, ' '))}`;
155
+ })
156
+ .join('\n');
157
+ return [
158
+ `${bold('CRITICAL RULES')} ${dim('(source: CLAUDE.md)')}\n\n${rules.critical}`,
159
+ `${bold('ENFORCED BY @duro-app/eslint-plugin')} ${dim('(duro.configs.recommended)')}\n${lint}`,
160
+ ].join('\n\n');
161
+ }
162
+ export function renderList(registry, kind) {
163
+ const sections = [];
164
+ const nameWidth = Math.max(...Object.keys(registry.components).map((name) => name.length), 12) + 2;
165
+ if (!kind || kind === 'components') {
166
+ const rows = Object.entries(registry.components)
167
+ .map(([key, entry]) => ` ${key.padEnd(nameWidth)}${entry.meta?.description.split('. ')[0] ?? dim(`(${entry.kind})`)}`)
168
+ .join('\n');
169
+ sections.push(`${bold('COMPONENTS')} (${Object.keys(registry.components).length})\n${rows}`);
170
+ }
171
+ if (!kind || kind === 'recipes') {
172
+ const rows = Object.entries(registry.recipes)
173
+ .map(([key, entry]) => ` ${key.padEnd(nameWidth)}${entry.meta.description}`)
174
+ .join('\n');
175
+ sections.push(`${bold('RECIPES')} (${Object.keys(registry.recipes).length})\n${rows}`);
176
+ }
177
+ if (!kind || kind === 'tokens') {
178
+ const rows = Object.entries(registry.tokens.groups)
179
+ .map(([key, group]) => ` ${key.padEnd(nameWidth)}${group.entries.length} tokens — ${group.importPath}`)
180
+ .join('\n');
181
+ sections.push(`${bold('TOKENS')}\n${rows}\n ${'icons'.padEnd(nameWidth)}${registry.icons.names.length} names — duro icons`);
182
+ }
183
+ sections.push(dim(`duro <name> for details · duro rules · duro manifest`));
184
+ return sections.join('\n\n');
185
+ }
186
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type * from './registry-types.js';
2
+ export { loadRegistry, lookup, lookupNames } from './registry.js';
3
+ export { search, suggestions } from './search.js';
4
+ export { buildManifest, COMMANDS } from './manifest.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,qBAAqB,CAAA;AACxC,OAAO,EAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAC,MAAM,eAAe,CAAA;AAC/D,OAAO,EAAC,MAAM,EAAE,WAAW,EAAC,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { loadRegistry, lookup, lookupNames } from './registry.js';
2
+ export { search, suggestions } from './search.js';
3
+ export { buildManifest, COMMANDS } from './manifest.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAC,MAAM,eAAe,CAAA;AAC/D,OAAO,EAAC,MAAM,EAAE,WAAW,EAAC,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAA"}
@@ -0,0 +1,46 @@
1
+ import type { Registry } from './registry-types.js';
2
+ /**
3
+ * The single command spec. CLI dispatch, --help text, and MCP tool
4
+ * registration all derive from this object — one place to add a command.
5
+ */
6
+ export interface CommandSpec {
7
+ name: string;
8
+ summary: string;
9
+ args: Array<{
10
+ name: string;
11
+ required: boolean;
12
+ description: string;
13
+ valuesFrom?: string;
14
+ }>;
15
+ flags: Array<{
16
+ name: string;
17
+ type: 'boolean' | 'string';
18
+ description: string;
19
+ }>;
20
+ returns: {
21
+ shape: string;
22
+ description: string;
23
+ };
24
+ examples: string[];
25
+ mcpTool?: string;
26
+ }
27
+ export declare const COMMANDS: CommandSpec[];
28
+ export declare function buildManifest(registry: Registry, version: string): {
29
+ name: string;
30
+ bin: string;
31
+ version: string;
32
+ schemaVersion: 1;
33
+ description: string;
34
+ usage: string;
35
+ globalFlags: {
36
+ name: string;
37
+ type: string;
38
+ description: string;
39
+ }[];
40
+ commands: CommandSpec[];
41
+ enums: {
42
+ names: string[];
43
+ kinds: string[];
44
+ };
45
+ };
46
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,qBAAqB,CAAA;AAGjD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC,CAAA;IACxF,KAAK,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,CAAC,CAAA;IAC7E,OAAO,EAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,CAAA;IAC7C,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,eAAO,MAAM,QAAQ,EAAE,WAAW,EAmEjC,CAAA;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;;;EAkBhE"}
@@ -0,0 +1,86 @@
1
+ import { lookupNames } from './registry.js';
2
+ export const COMMANDS = [
3
+ {
4
+ name: 'lookup',
5
+ summary: 'Docs for anything by name: a component (props, usage, example), a recipe (runnable source), a token group, or the rules. Unknown names fall back to full-text search over the usage metadata.',
6
+ args: [
7
+ {
8
+ name: 'name',
9
+ required: true,
10
+ description: 'Component (Button), recipe (login-form), token group (spacing), icons, rules — or free text to search',
11
+ valuesFrom: 'names',
12
+ },
13
+ ],
14
+ flags: [
15
+ { name: 'part', type: 'string', description: 'Narrow a compound component to one part' },
16
+ { name: 'props', type: 'boolean', description: 'Prop table only' },
17
+ { name: 'source-only', type: 'boolean', description: 'Recipes: emit just the source file' },
18
+ ],
19
+ returns: {
20
+ shape: 'ComponentEntry | RecipeEntry | TokenGroup | IconRegistry | RulesRegistry | SearchHit[]',
21
+ description: 'The registry entry, or ranked search hits when the name did not match',
22
+ },
23
+ examples: [
24
+ 'duro Button',
25
+ 'duro Select --part Root',
26
+ 'duro login-form --source-only',
27
+ 'duro "tags that wrap"',
28
+ ],
29
+ mcpTool: 'duro_lookup',
30
+ },
31
+ {
32
+ name: 'list',
33
+ summary: 'One-line index of everything documented',
34
+ args: [
35
+ {
36
+ name: 'kind',
37
+ required: false,
38
+ description: 'components | recipes | tokens (default: all)',
39
+ valuesFrom: 'kinds',
40
+ },
41
+ ],
42
+ flags: [],
43
+ returns: { shape: 'ListEntry[]', description: '{name, kind, importPath?, description}' },
44
+ examples: ['duro list', 'duro list recipes --json'],
45
+ mcpTool: 'duro_list',
46
+ },
47
+ {
48
+ name: 'manifest',
49
+ summary: 'This command spec plus all valid lookup names — the one-call agent bootstrap',
50
+ args: [],
51
+ flags: [],
52
+ returns: { shape: 'Manifest', description: 'Commands, flags, shapes, and enums of valid names' },
53
+ examples: ['duro manifest --json'],
54
+ mcpTool: 'duro_manifest',
55
+ },
56
+ {
57
+ name: 'mcp',
58
+ summary: 'Run a stdio MCP server exposing duro_lookup / duro_list / duro_manifest',
59
+ args: [],
60
+ flags: [],
61
+ returns: { shape: 'never', description: 'Serves until stdin closes' },
62
+ examples: [
63
+ 'claude mcp add duro -- npx -y -p @duro-app/cli -p @modelcontextprotocol/sdk duro mcp',
64
+ ],
65
+ },
66
+ ];
67
+ export function buildManifest(registry, version) {
68
+ return {
69
+ name: '@duro-app/cli',
70
+ bin: 'duro',
71
+ version,
72
+ schemaVersion: registry.schemaVersion,
73
+ description: 'Machine-queryable docs for the Duro design system.',
74
+ usage: 'duro <name|command> [flags] [--json]',
75
+ globalFlags: [
76
+ { name: 'json', type: 'boolean', description: 'Emit JSON on stdout' },
77
+ { name: 'no-color', type: 'boolean', description: 'Disable ANSI styling' },
78
+ ],
79
+ commands: COMMANDS,
80
+ enums: {
81
+ names: lookupNames(registry),
82
+ kinds: ['components', 'recipes', 'tokens'],
83
+ },
84
+ };
85
+ }
86
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAA;AAgBzC,MAAM,CAAC,MAAM,QAAQ,GAAkB;IACrC;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EACL,+LAA+L;QACjM,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,IAAI;gBACd,WAAW,EACT,uGAAuG;gBACzG,UAAU,EAAE,OAAO;aACpB;SACF;QACD,KAAK,EAAE;YACL,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yCAAyC,EAAC;YACtF,EAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAC;YAChE,EAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,oCAAoC,EAAC;SAC1F;QACD,OAAO,EAAE;YACP,KAAK,EACH,wFAAwF;YAC1F,WAAW,EAAE,uEAAuE;SACrF;QACD,QAAQ,EAAE;YACR,aAAa;YACb,yBAAyB;YACzB,+BAA+B;YAC/B,uBAAuB;SACxB;QACD,OAAO,EAAE,aAAa;KACvB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,yCAAyC;QAClD,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,8CAA8C;gBAC3D,UAAU,EAAE,OAAO;aACpB;SACF;QACD,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,EAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,wCAAwC,EAAC;QACtF,QAAQ,EAAE,CAAC,WAAW,EAAE,0BAA0B,CAAC;QACnD,OAAO,EAAE,WAAW;KACrB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,8EAA8E;QACvF,IAAI,EAAE,EAAE;QACR,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,EAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,mDAAmD,EAAC;QAC9F,QAAQ,EAAE,CAAC,sBAAsB,CAAC;QAClC,OAAO,EAAE,eAAe;KACzB;IACD;QACE,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,yEAAyE;QAClF,IAAI,EAAE,EAAE;QACR,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,EAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,2BAA2B,EAAC;QACnE,QAAQ,EAAE;YACR,sFAAsF;SACvF;KACF;CACF,CAAA;AAED,MAAM,UAAU,aAAa,CAAC,QAAkB,EAAE,OAAe;IAC/D,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,GAAG,EAAE,MAAM;QACX,OAAO;QACP,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,WAAW,EAAE,oDAAoD;QACjE,KAAK,EAAE,sCAAsC;QAC7C,WAAW,EAAE;YACX,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,qBAAqB,EAAC;YACnE,EAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,sBAAsB,EAAC;SACzE;QACD,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE;YACL,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC;YAC5B,KAAK,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC;SAC3C;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,93 @@
1
+ import type { ComponentMeta } from '@duro-app/ui/component-meta';
2
+ export type { ComponentMeta };
3
+ export interface Registry {
4
+ /** Incompatible-shape counter. Consumers should refuse unknown versions. */
5
+ schemaVersion: 1;
6
+ components: Record<string, ComponentEntry>;
7
+ recipes: Record<string, RecipeEntry>;
8
+ tokens: TokenRegistry;
9
+ icons: IconRegistry;
10
+ rules: RulesRegistry;
11
+ /** Exported string-literal unions: ButtonVariant -> ['primary', ...]. */
12
+ unions: Record<string, string[]>;
13
+ }
14
+ export type ComponentKind = 'component' | 'compound' | 'provider' | 'hook';
15
+ export interface ComponentEntry {
16
+ name: string;
17
+ kind: ComponentKind;
18
+ importPath: string;
19
+ /** Repo-relative POSIX path of the defining source file. */
20
+ sourcePath: string;
21
+ meta: ComponentMeta | null;
22
+ /** null for compound components — see `parts`. */
23
+ props: PropEntry[] | null;
24
+ parts?: Record<string, PartEntry>;
25
+ deprecated?: string;
26
+ }
27
+ export interface PartEntry {
28
+ name: string;
29
+ sourcePath: string;
30
+ props: PropEntry[];
31
+ deprecated?: string;
32
+ }
33
+ export interface PropEntry {
34
+ name: string;
35
+ /** Syntactic type text — the name a consumer should actually write. */
36
+ type: string;
37
+ required: boolean;
38
+ /** Verbatim initializer from the destructuring default. */
39
+ default?: string;
40
+ /** JSDoc description, collapsed to one paragraph. */
41
+ description?: string;
42
+ deprecated?: string;
43
+ /** Resolved members when `type` names an exported string-literal union. */
44
+ union?: string[];
45
+ }
46
+ export interface RecipeEntry {
47
+ name: string;
48
+ title: string;
49
+ /** The exported component function name. */
50
+ export: string;
51
+ meta: ComponentMeta;
52
+ /** Full source with imports rewritten to publishable specifiers. */
53
+ source: string;
54
+ sourcePath: string;
55
+ usesComponents: string[];
56
+ peerDeps: string[];
57
+ }
58
+ export interface TokenRegistry {
59
+ groups: Record<string, TokenGroup>;
60
+ }
61
+ export interface TokenGroup {
62
+ /** The deep import a consumer must copy. */
63
+ importPath: string;
64
+ exportName: string;
65
+ entries: TokenEntry[];
66
+ }
67
+ export interface TokenEntry {
68
+ key: string;
69
+ value?: string | number;
70
+ /** Per-theme values (colors group). */
71
+ values?: Record<string, string>;
72
+ }
73
+ export interface IconRegistry {
74
+ names: string[];
75
+ sizes: Record<string, number>;
76
+ groups: Array<{
77
+ label: string | null;
78
+ names: string[];
79
+ }>;
80
+ }
81
+ export interface RulesRegistry {
82
+ /** Markdown slice lifted verbatim from CLAUDE.md's duro:rules region. */
83
+ critical: string;
84
+ lint: LintRule[];
85
+ }
86
+ export interface LintRule {
87
+ id: string;
88
+ severity: 'error' | 'warn' | 'off';
89
+ description: string;
90
+ fixable: 'autofix' | 'suggestion' | 'none';
91
+ messages: Record<string, string>;
92
+ }
93
+ //# sourceMappingURL=registry-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-types.d.ts","sourceRoot":"","sources":["../src/registry-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=registry-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-types.js","sourceRoot":"","sources":["../src/registry-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import type { Registry } from './registry-types.js';
2
+ /**
3
+ * Load the registry shipped next to dist/. readFileSync + JSON.parse rather
4
+ * than a JSON import — import attributes aren't stable across the supported
5
+ * Node range.
6
+ */
7
+ export declare function loadRegistry(): Registry;
8
+ export type LookupResult = {
9
+ kind: 'component';
10
+ key: string;
11
+ entry: Registry['components'][string];
12
+ } | {
13
+ kind: 'recipe';
14
+ key: string;
15
+ entry: Registry['recipes'][string];
16
+ } | {
17
+ kind: 'tokens';
18
+ key: string;
19
+ entry: Registry['tokens']['groups'][string];
20
+ } | {
21
+ kind: 'icons';
22
+ key: string;
23
+ entry: Registry['icons'];
24
+ } | {
25
+ kind: 'rules';
26
+ key: string;
27
+ entry: Registry['rules'];
28
+ };
29
+ /** All lookup names, for suggestions and the manifest's enums. */
30
+ export declare function lookupNames(registry: Registry): string[];
31
+ export declare function lookup(registry: Registry, name: string): LookupResult | null;
32
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,qBAAqB,CAAA;AAIjD;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,QAAQ,CAkBvC;AAED,MAAM,MAAM,YAAY,GACpB;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;CAAC,GACvE;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;CAAC,GACjE;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;CAAC,GAC1E;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;CAAC,GACtD;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;CAAC,CAAA;AAE1D,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,CAQxD;AAED,wBAAgB,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAe5E"}
@@ -0,0 +1,57 @@
1
+ import { readFileSync } from 'node:fs';
2
+ let cached = null;
3
+ /**
4
+ * Load the registry shipped next to dist/. readFileSync + JSON.parse rather
5
+ * than a JSON import — import attributes aren't stable across the supported
6
+ * Node range.
7
+ */
8
+ export function loadRegistry() {
9
+ if (cached)
10
+ return cached;
11
+ const url = new URL('../registry.json', import.meta.url);
12
+ let parsed;
13
+ try {
14
+ parsed = JSON.parse(readFileSync(url, 'utf8'));
15
+ }
16
+ catch (error) {
17
+ process.stderr.write(`duro: cannot read registry at ${url.pathname}: ${String(error)}\n`);
18
+ process.exit(3);
19
+ }
20
+ if (parsed.schemaVersion !== 1) {
21
+ process.stderr.write(`duro: registry schemaVersion ${String(parsed.schemaVersion)} is not supported by this CLI — update @duro-app/cli\n`);
22
+ process.exit(3);
23
+ }
24
+ cached = parsed;
25
+ return parsed;
26
+ }
27
+ /** All lookup names, for suggestions and the manifest's enums. */
28
+ export function lookupNames(registry) {
29
+ return [
30
+ ...Object.keys(registry.components),
31
+ ...Object.keys(registry.recipes),
32
+ ...Object.keys(registry.tokens.groups),
33
+ 'icons',
34
+ 'rules',
35
+ ];
36
+ }
37
+ export function lookup(registry, name) {
38
+ if (name === 'rules')
39
+ return { kind: 'rules', key: name, entry: registry.rules };
40
+ if (name === 'icons')
41
+ return { kind: 'icons', key: name, entry: registry.icons };
42
+ if (registry.components[name]) {
43
+ return { kind: 'component', key: name, entry: registry.components[name] };
44
+ }
45
+ if (registry.recipes[name])
46
+ return { kind: 'recipe', key: name, entry: registry.recipes[name] };
47
+ if (registry.tokens.groups[name]) {
48
+ return { kind: 'tokens', key: name, entry: registry.tokens.groups[name] };
49
+ }
50
+ // Case-insensitive exact fallback (duro button).
51
+ const lower = name.toLowerCase();
52
+ const ciKey = lookupNames(registry).find((candidate) => candidate.toLowerCase() === lower);
53
+ if (ciKey && ciKey !== name)
54
+ return lookup(registry, ciKey);
55
+ return null;
56
+ }
57
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Registry } from './registry-types.js';
2
+ export declare function levenshtein(a: string, b: string): number;
3
+ /** Closest names for "did you mean" — distance <= 2, best first. */
4
+ export declare function suggestions(registry: Registry, query: string): string[];
5
+ export interface SearchHit {
6
+ kind: 'component' | 'recipe';
7
+ key: string;
8
+ description: string;
9
+ score: number;
10
+ }
11
+ /**
12
+ * Full-text need-search over metas: agents rarely know the name — they know
13
+ * the need, and whenToUse text is exactly need-phrased.
14
+ */
15
+ export declare function search(registry: Registry, query: string): SearchHit[];
16
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,qBAAqB,CAAA;AAGjD,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAgBxD;AAED,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAOvE;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,WAAW,GAAG,QAAQ,CAAA;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAwCrE"}