@lynx-js/genui 0.0.2 → 0.0.3
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 +5 -9
- package/a2ui/AGENTS.md +167 -0
- package/a2ui/README.md +76 -780
- package/a2ui/README_zh.md +103 -0
- package/a2ui/dist/catalog/DateTimeInput/index.jsx +1 -10
- package/a2ui/dist/catalog/DateTimeInput/index.jsx.map +1 -1
- package/a2ui/dist/catalog/DateTimeInput/utils.d.ts +0 -1
- package/a2ui/dist/catalog/DateTimeInput/utils.js +0 -3
- package/a2ui/dist/catalog/DateTimeInput/utils.js.map +1 -1
- package/a2ui/dist/catalog/Loading/catalog.json +15 -0
- package/a2ui/dist/catalog/Loading/index.d.ts +10 -0
- package/a2ui/dist/catalog/Loading/index.jsx +11 -0
- package/a2ui/dist/catalog/Loading/index.jsx.map +1 -0
- package/a2ui/dist/catalog/defineCatalog.d.ts +0 -4
- package/a2ui/dist/catalog/defineCatalog.js.map +1 -1
- package/a2ui/dist/catalog/index.d.ts +1 -0
- package/a2ui/dist/catalog/index.js +16 -0
- package/a2ui/dist/catalog/index.js.map +1 -1
- package/a2ui/dist/catalog.json +2548 -0
- package/a2ui/dist/index.d.ts +1 -1
- package/a2ui/dist/index.js +2 -2
- package/a2ui/dist/index.js.map +1 -1
- package/a2ui/dist/react/A2UIRenderer.jsx +3 -13
- package/a2ui/dist/react/A2UIRenderer.jsx.map +1 -1
- package/a2ui/dist/tsconfig.build.tsbuildinfo +1 -1
- package/a2ui/docs/catalog-guide.md +401 -0
- package/a2ui/docs/catalog-guide_zh.md +373 -0
- package/a2ui/docs/overview.md +312 -0
- package/a2ui/docs/overview_zh.md +289 -0
- package/a2ui/docs/system-prompts.md +187 -0
- package/a2ui/docs/system-prompts_zh.md +187 -0
- package/a2ui/src/catalog/README.md +12 -0
- package/a2ui/src/catalog/index.ts +51 -0
- package/a2ui/src/catalog/readme_zh.md +11 -0
- package/a2ui/src/index.ts +115 -0
- package/a2ui/styles/catalog/Button.css +5 -5
- package/a2ui/styles/catalog/DateTimeInput.css +22 -30
- package/a2ui/styles/catalog/Loading.css +61 -0
- package/a2ui-catalog-extractor/README.md +14 -7
- package/a2ui-catalog-extractor/dist/cli.d.ts +1 -0
- package/a2ui-catalog-extractor/dist/cli.js +15 -6
- package/a2ui-catalog-extractor/dist/cli.js.map +1 -1
- package/a2ui-catalog-extractor/dist/index.d.ts +9 -2
- package/a2ui-catalog-extractor/dist/index.js +52 -6
- package/a2ui-catalog-extractor/dist/index.js.map +1 -1
- package/a2ui-catalog-extractor/dist/tsconfig.build.tsbuildinfo +1 -1
- package/a2ui-catalog-extractor/skills/a2ui-catalog-extractor/SKILL.md +1 -1
- package/a2ui-prompt/README.md +3 -2
- package/a2ui-prompt/dist/index.d.ts +2 -0
- package/a2ui-prompt/dist/index.js +159 -84
- package/cli/README.md +26 -0
- package/cli/bin/cli.js +7 -265
- package/cli/dist/a2ui/create.d.ts +5 -0
- package/cli/dist/a2ui/create.js +178 -0
- package/cli/dist/a2ui/create.js.map +1 -0
- package/cli/dist/a2ui/index.d.ts +5 -0
- package/cli/dist/a2ui/index.js +170 -0
- package/cli/dist/a2ui/index.js.map +1 -0
- package/cli/dist/cli.d.ts +4 -0
- package/cli/dist/cli.js +40 -0
- package/cli/dist/cli.js.map +1 -0
- package/cli/dist/openui.d.ts +1 -0
- package/cli/dist/openui.js +21 -0
- package/cli/dist/openui.js.map +1 -0
- package/cli/dist/tsconfig.build.tsbuildinfo +1 -0
- package/cli/dist/utils.d.ts +2 -0
- package/cli/dist/utils.js +17 -0
- package/cli/dist/utils.js.map +1 -0
- package/cli/templates/default/lynx.config.ts +13 -0
- package/cli/templates/default/package.json +27 -0
- package/cli/templates/default/src/App.css +88 -0
- package/cli/templates/default/src/App.tsx +100 -0
- package/cli/templates/default/src/index.tsx +10 -0
- package/cli/templates/default/src/messages.ts +158 -0
- package/cli/templates/default/src/rspeedy-env.d.ts +14 -0
- package/cli/templates/default/src/tsconfig.json +17 -0
- package/cli/templates/default/tsconfig.json +15 -0
- package/cli/templates/default/tsconfig.node.json +16 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/openui/README.md +50 -46
- package/openui/dist/catalog/Action/{index.js → index.jsx} +1 -1
- package/openui/dist/catalog/Action/index.jsx.map +1 -0
- package/openui/dist/catalog/Button/index.d.ts +8 -8
- package/openui/dist/catalog/Button/{index.js → index.jsx} +28 -14
- package/openui/dist/catalog/Button/index.jsx.map +1 -0
- package/openui/dist/catalog/Card/index.d.ts +1 -1
- package/openui/dist/catalog/Card/{index.js → index.jsx} +5 -4
- package/openui/dist/catalog/Card/{index.js.map → index.jsx.map} +1 -1
- package/openui/dist/catalog/CardHeader/index.d.ts +1 -1
- package/openui/dist/catalog/CardHeader/index.jsx +20 -0
- package/openui/dist/catalog/CardHeader/index.jsx.map +1 -0
- package/openui/dist/catalog/CheckBox/index.d.ts +16 -0
- package/openui/dist/catalog/CheckBox/index.jsx +82 -0
- package/openui/dist/catalog/CheckBox/index.jsx.map +1 -0
- package/openui/dist/catalog/Icon/index.d.ts +44 -0
- package/openui/dist/catalog/Icon/index.jsx +66 -0
- package/openui/dist/catalog/Icon/index.jsx.map +1 -0
- package/openui/dist/catalog/Image/index.d.ts +19 -0
- package/openui/dist/catalog/Image/index.jsx +40 -0
- package/openui/dist/catalog/Image/index.jsx.map +1 -0
- package/openui/dist/catalog/Loading/index.d.ts +7 -0
- package/openui/dist/catalog/Loading/index.jsx +25 -0
- package/openui/dist/catalog/Loading/index.jsx.map +1 -0
- package/openui/dist/catalog/RadioGroup/index.d.ts +21 -0
- package/openui/dist/catalog/RadioGroup/index.jsx +99 -0
- package/openui/dist/catalog/RadioGroup/index.jsx.map +1 -0
- package/openui/dist/catalog/Separator/index.d.ts +1 -1
- package/openui/dist/catalog/Separator/{index.js → index.jsx} +3 -4
- package/openui/dist/catalog/Separator/index.jsx.map +1 -0
- package/openui/dist/catalog/Slider/index.d.ts +19 -0
- package/openui/dist/catalog/Slider/index.jsx +139 -0
- package/openui/dist/catalog/Slider/index.jsx.map +1 -0
- package/openui/dist/catalog/Stack/index.d.ts +1 -1
- package/openui/dist/catalog/Stack/{index.js → index.jsx} +3 -4
- package/openui/dist/catalog/Stack/{index.js.map → index.jsx.map} +1 -1
- package/openui/dist/catalog/Tag/index.d.ts +1 -1
- package/openui/dist/catalog/Tag/{index.js → index.jsx} +5 -4
- package/openui/dist/catalog/Tag/index.jsx.map +1 -0
- package/openui/dist/catalog/TextContent/index.d.ts +1 -1
- package/openui/dist/catalog/TextContent/{index.js → index.jsx} +5 -4
- package/openui/dist/catalog/TextContent/{index.js.map → index.jsx.map} +1 -1
- package/openui/dist/catalog/TextField/index.d.ts +23 -0
- package/openui/dist/catalog/TextField/index.jsx +132 -0
- package/openui/dist/catalog/TextField/index.jsx.map +1 -0
- package/openui/dist/catalog/index.d.ts +14 -7
- package/openui/dist/catalog/index.js +14 -7
- package/openui/dist/catalog/index.js.map +1 -1
- package/openui/dist/core/context.d.ts +17 -7
- package/openui/dist/core/{context.js → context.jsx} +8 -2
- package/openui/dist/core/context.jsx.map +1 -0
- package/openui/dist/core/createLibrary.d.ts +1 -1
- package/openui/dist/core/{createLibrary.js → createLibrary.jsx} +14 -3
- package/openui/dist/core/createLibrary.jsx.map +1 -0
- package/openui/dist/core/hooks/index.d.ts +1 -0
- package/openui/dist/core/hooks/index.js +1 -0
- package/openui/dist/core/hooks/index.js.map +1 -1
- package/openui/dist/core/hooks/useOpenUIState.d.ts +2 -2
- package/openui/dist/core/hooks/useOpenUIState.js +3 -1
- package/openui/dist/core/hooks/useOpenUIState.js.map +1 -1
- package/openui/dist/core/hooks/useStateField.js +1 -1
- package/openui/dist/core/hooks/useStateField.js.map +1 -1
- package/openui/dist/core/index.d.ts +13 -7
- package/openui/dist/core/index.js +7 -4
- package/openui/dist/core/index.js.map +1 -1
- package/openui/dist/core/{library.js → library.jsx} +1 -1
- package/openui/dist/core/library.jsx.map +1 -0
- package/openui/dist/core/renderer.css +527 -0
- package/openui/dist/core/renderer.d.ts +31 -4
- package/openui/dist/core/renderer.jsx +281 -0
- package/openui/dist/core/renderer.jsx.map +1 -0
- package/openui/dist/core/runtime/index.d.ts +1 -0
- package/openui/dist/core/runtime/index.js +5 -0
- package/openui/dist/core/runtime/index.js.map +1 -0
- package/openui/dist/core/runtime/reactive.d.ts +7 -0
- package/openui/dist/core/runtime/reactive.js +10 -0
- package/openui/dist/core/runtime/reactive.js.map +1 -0
- package/package.json +17 -7
- package/openui/dist/catalog/Action/index.js.map +0 -1
- package/openui/dist/catalog/Button/index.js.map +0 -1
- package/openui/dist/catalog/CardHeader/index.js +0 -18
- package/openui/dist/catalog/CardHeader/index.js.map +0 -1
- package/openui/dist/catalog/Separator/index.js.map +0 -1
- package/openui/dist/catalog/Tag/index.js.map +0 -1
- package/openui/dist/core/context.js.map +0 -1
- package/openui/dist/core/createLibrary.js.map +0 -1
- package/openui/dist/core/library.js.map +0 -1
- package/openui/dist/core/renderer.js +0 -139
- package/openui/dist/core/renderer.js.map +0 -1
package/cli/bin/cli.js
CHANGED
|
@@ -2,273 +2,15 @@
|
|
|
2
2
|
// Copyright 2026 The Lynx Authors. All rights reserved.
|
|
3
3
|
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
4
4
|
// LICENSE file in the root directory of this source tree.
|
|
5
|
-
import * as fs from 'node:fs';
|
|
6
|
-
import { createRequire } from 'node:module';
|
|
7
5
|
import * as path from 'node:path';
|
|
8
|
-
import { pathToFileURL } from 'node:url';
|
|
9
6
|
|
|
10
|
-
|
|
7
|
+
import { runCli } from '../dist/cli.js';
|
|
11
8
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
Examples:
|
|
17
|
-
genui a2ui generate catalog --catalog-dir src/catalog --out-dir dist/catalog
|
|
18
|
-
genui a2ui generate prompt --out dist/a2ui-system-prompt.txt
|
|
19
|
-
`;
|
|
20
|
-
|
|
21
|
-
const a2uiUsage = `Usage: genui a2ui generate <target> [options]
|
|
22
|
-
|
|
23
|
-
Targets:
|
|
24
|
-
catalog Generate A2UI component and function catalog files.
|
|
25
|
-
prompt Generate an A2UI system prompt from catalog files.
|
|
26
|
-
`;
|
|
27
|
-
|
|
28
|
-
const openuiUsage = `Usage: genui openui <command> [options]
|
|
29
|
-
|
|
30
|
-
OpenUI CLI commands are reserved for future GenUI workflows.
|
|
31
|
-
`;
|
|
32
|
-
|
|
33
|
-
function createGenerateCatalogUsage(programName) {
|
|
34
|
-
return `Usage: ${programName} generate catalog [options]
|
|
35
|
-
|
|
36
|
-
Options:
|
|
37
|
-
--catalog-dir <dir> Directory to scan for TypeScript catalog interfaces.
|
|
38
|
-
--source <path> Source file or directory to scan. Repeatable.
|
|
39
|
-
--typedoc-json <file>
|
|
40
|
-
Read an existing TypeDoc JSON project instead of
|
|
41
|
-
running TypeDoc conversion.
|
|
42
|
-
--out-dir <dir> Output directory for component catalog.json files.
|
|
43
|
-
--version Print the package version.
|
|
44
|
-
--help Print this help message.
|
|
45
|
-
|
|
46
|
-
Defaults:
|
|
47
|
-
--catalog-dir src/catalog
|
|
48
|
-
--out-dir dist/catalog
|
|
49
|
-
`;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function createGeneratePromptUsage(programName) {
|
|
53
|
-
return `Usage: ${programName} generate prompt [options]
|
|
54
|
-
|
|
55
|
-
Options:
|
|
56
|
-
--catalog-dir <dir> Directory containing generated catalog files. When
|
|
57
|
-
omitted, use the built-in A2UI basic catalog.
|
|
58
|
-
--catalog-id <id> Catalog id to require in createSurface messages.
|
|
59
|
-
--out <file> Write the prompt to a file instead of stdout.
|
|
60
|
-
--appendix <text> Append extra instructions to the generated prompt.
|
|
61
|
-
--version Print the package version.
|
|
62
|
-
--help Print this help message.
|
|
63
|
-
|
|
64
|
-
Defaults:
|
|
65
|
-
--catalog-id built-in A2UI basic catalog id
|
|
66
|
-
`;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (isMain(import.meta.url)) {
|
|
70
|
-
try {
|
|
71
|
-
process.exitCode = await runCli(process.argv.slice(2), process.cwd(), {
|
|
72
|
-
binName: path.basename(process.argv[1] ?? 'genui'),
|
|
73
|
-
});
|
|
74
|
-
} catch (error) {
|
|
75
|
-
console.error(error instanceof Error ? error.message : String(error));
|
|
76
|
-
process.exitCode = 1;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export async function runCli(args, cwd = process.cwd(), cliOptions = {}) {
|
|
81
|
-
const binName = cliOptions.binName ?? 'genui';
|
|
82
|
-
if (binName === 'a2ui-cli') {
|
|
83
|
-
return await runA2UICli(args, cwd, { programName: 'a2ui-cli' });
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const command = args[0];
|
|
87
|
-
if (command === undefined || command === '--help' || command === '-h') {
|
|
88
|
-
console.info(usage);
|
|
89
|
-
return 0;
|
|
90
|
-
}
|
|
91
|
-
if (command === '--version' || command === '-v') {
|
|
92
|
-
printPackageVersion();
|
|
93
|
-
return 0;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (command === 'a2ui') {
|
|
97
|
-
return await runA2UICli(args.slice(1), cwd, { programName: 'genui a2ui' });
|
|
98
|
-
}
|
|
99
|
-
if (command === 'openui') {
|
|
100
|
-
return runOpenUICli(args.slice(1));
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
throw new Error(`Unknown namespace: ${command}`);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
async function runA2UICli(args, cwd, options) {
|
|
107
|
-
const programName = options.programName;
|
|
108
|
-
const command = args[0];
|
|
109
|
-
if (command === undefined || command === '--help' || command === '-h') {
|
|
110
|
-
console.info(programName === 'a2ui-cli' ? legacyA2UIUsage : a2uiUsage);
|
|
111
|
-
return 0;
|
|
112
|
-
}
|
|
113
|
-
if (command === '--version' || command === '-v') {
|
|
114
|
-
printPackageVersion();
|
|
115
|
-
return 0;
|
|
116
|
-
}
|
|
117
|
-
if (command !== 'generate') {
|
|
118
|
-
throw new Error(`Unknown A2UI command: ${command}`);
|
|
119
|
-
}
|
|
120
|
-
const target = args[1];
|
|
121
|
-
const targetArgs = args.slice(2);
|
|
122
|
-
if (target === undefined || target === '--help' || target === '-h') {
|
|
123
|
-
console.info(programName === 'a2ui-cli' ? legacyA2UIUsage : a2uiUsage);
|
|
124
|
-
return 0;
|
|
125
|
-
}
|
|
126
|
-
if (target === '--version' || target === '-v') {
|
|
127
|
-
printPackageVersion();
|
|
128
|
-
return 0;
|
|
129
|
-
}
|
|
130
|
-
if (target === 'catalog') {
|
|
131
|
-
if (targetArgs.includes('--help') || targetArgs.includes('-h')) {
|
|
132
|
-
console.info(createGenerateCatalogUsage(programName));
|
|
133
|
-
return 0;
|
|
134
|
-
}
|
|
135
|
-
const { runCli: runCatalogExtractorCli } = await import(
|
|
136
|
-
'../../a2ui-catalog-extractor/dist/cli.js'
|
|
137
|
-
);
|
|
138
|
-
return await runCatalogExtractorCli(targetArgs, cwd);
|
|
139
|
-
}
|
|
140
|
-
if (target === 'prompt') {
|
|
141
|
-
return runGeneratePromptCli(targetArgs, cwd, { programName });
|
|
142
|
-
}
|
|
143
|
-
throw new Error(`Unknown generate target: ${target}`);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
const legacyA2UIUsage = a2uiUsage.replaceAll('genui a2ui', 'a2ui-cli');
|
|
147
|
-
|
|
148
|
-
function runOpenUICli(args) {
|
|
149
|
-
const command = args[0];
|
|
150
|
-
if (command === undefined || command === '--help' || command === '-h') {
|
|
151
|
-
console.info(openuiUsage);
|
|
152
|
-
return 0;
|
|
153
|
-
}
|
|
154
|
-
if (command === '--version' || command === '-v') {
|
|
155
|
-
printPackageVersion();
|
|
156
|
-
return 0;
|
|
157
|
-
}
|
|
158
|
-
throw new Error(
|
|
159
|
-
`Unknown OpenUI command: ${command}. OpenUI CLI commands are not available yet.`,
|
|
160
|
-
);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
async function runGeneratePromptCli(args, cwd, cliOptions) {
|
|
164
|
-
const programName = cliOptions.programName;
|
|
165
|
-
const options = parseGeneratePromptArgs(args);
|
|
166
|
-
if (options.help) {
|
|
167
|
-
console.info(createGeneratePromptUsage(programName));
|
|
168
|
-
return 0;
|
|
169
|
-
}
|
|
170
|
-
if (options.version) {
|
|
171
|
-
printPackageVersion();
|
|
172
|
-
return 0;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
const {
|
|
176
|
-
BASIC_CATALOG,
|
|
177
|
-
BASIC_CATALOG_ID,
|
|
178
|
-
buildA2UISystemPrompt,
|
|
179
|
-
readA2UICatalogFromDirectory,
|
|
180
|
-
} = await import('../../a2ui-prompt/dist/index.js');
|
|
181
|
-
const catalog = options.catalogDir
|
|
182
|
-
? readA2UICatalogFromDirectory({
|
|
183
|
-
catalogDir: options.catalogDir,
|
|
184
|
-
catalogId: options.catalogId ?? BASIC_CATALOG_ID,
|
|
185
|
-
cwd,
|
|
186
|
-
})
|
|
187
|
-
: (options.catalogId
|
|
188
|
-
? { ...BASIC_CATALOG, id: options.catalogId }
|
|
189
|
-
: undefined);
|
|
190
|
-
if (options.catalogDir && catalog && isEmptyCatalog(catalog)) {
|
|
191
|
-
throw new Error(
|
|
192
|
-
`[${programName}] No components or functions found in generated catalog directory: ${options.catalogDir}`,
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
const systemPrompt = buildA2UISystemPrompt({
|
|
196
|
-
...(catalog ? { catalog } : {}),
|
|
197
|
-
...(options.appendix ? { appendix: options.appendix } : {}),
|
|
9
|
+
try {
|
|
10
|
+
process.exitCode = await runCli(process.argv.slice(2), process.cwd(), {
|
|
11
|
+
binName: path.basename(process.argv[1] ?? 'genui'),
|
|
198
12
|
});
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
fs.mkdirSync(path.dirname(outPath), { recursive: true });
|
|
203
|
-
fs.writeFileSync(outPath, systemPrompt);
|
|
204
|
-
console.info(`Generated A2UI system prompt at ${options.out}.`);
|
|
205
|
-
} else {
|
|
206
|
-
process.stdout.write(systemPrompt);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
return 0;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
function parseGeneratePromptArgs(args) {
|
|
213
|
-
const options = {
|
|
214
|
-
help: false,
|
|
215
|
-
version: false,
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
for (let index = 0; index < args.length; index += 1) {
|
|
219
|
-
const arg = args[index];
|
|
220
|
-
switch (arg) {
|
|
221
|
-
case '--catalog-dir':
|
|
222
|
-
options.catalogDir = readValue(args, ++index, arg);
|
|
223
|
-
break;
|
|
224
|
-
case '--catalog-id':
|
|
225
|
-
options.catalogId = readValue(args, ++index, arg);
|
|
226
|
-
break;
|
|
227
|
-
case '--out':
|
|
228
|
-
options.out = readValue(args, ++index, arg);
|
|
229
|
-
break;
|
|
230
|
-
case '--appendix':
|
|
231
|
-
options.appendix = readValue(args, ++index, arg);
|
|
232
|
-
break;
|
|
233
|
-
case '--help':
|
|
234
|
-
case '-h':
|
|
235
|
-
options.help = true;
|
|
236
|
-
break;
|
|
237
|
-
case '--version':
|
|
238
|
-
case '-v':
|
|
239
|
-
options.version = true;
|
|
240
|
-
break;
|
|
241
|
-
default:
|
|
242
|
-
throw new Error(`Unknown option: ${arg}`);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
return options;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
function isEmptyCatalog(catalog) {
|
|
250
|
-
return (!Array.isArray(catalog.components) || catalog.components.length === 0)
|
|
251
|
-
&& (!Array.isArray(catalog.functions) || catalog.functions.length === 0);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
function readValue(args, index, option) {
|
|
255
|
-
const value = args[index];
|
|
256
|
-
if (!value || value.startsWith('-')) {
|
|
257
|
-
throw new Error(`Missing value for ${option}.`);
|
|
258
|
-
}
|
|
259
|
-
return value;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
function printPackageVersion() {
|
|
263
|
-
const require = createRequire(import.meta.url);
|
|
264
|
-
const packageJson = require('../package.json');
|
|
265
|
-
console.info(packageJson.version);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
function isMain(moduleUrl) {
|
|
269
|
-
if (process.argv[1] === undefined) {
|
|
270
|
-
return false;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
return moduleUrl === pathToFileURL(fs.realpathSync(process.argv[1])).href;
|
|
13
|
+
} catch (error) {
|
|
14
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
15
|
+
process.exitCode = 1;
|
|
274
16
|
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// Copyright 2026 The Lynx Authors. All rights reserved.
|
|
2
|
+
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
|
+
// LICENSE file in the root directory of this source tree.
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import { createRequire } from 'node:module';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import { readValue } from '../utils.js';
|
|
9
|
+
const createUsage = `Usage: genui a2ui create [project-name] [options]
|
|
10
|
+
|
|
11
|
+
Options:
|
|
12
|
+
--template <name> Template to use (default: "default").
|
|
13
|
+
--help Print this help message.
|
|
14
|
+
`;
|
|
15
|
+
const AVAILABLE_TEMPLATES = ['default'];
|
|
16
|
+
export function runA2UICreateCli(args, cwd, options) {
|
|
17
|
+
const programName = options.programName;
|
|
18
|
+
const parsed = parseCreateArgs(args);
|
|
19
|
+
if (parsed.help) {
|
|
20
|
+
console.info(createUsage);
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
const projectName = parsed.projectName ?? 'my-a2ui-app';
|
|
24
|
+
const template = parsed.template ?? 'default';
|
|
25
|
+
if (!AVAILABLE_TEMPLATES.includes(template)) {
|
|
26
|
+
throw new Error(`[${programName}] Unknown template: "${template}". Available templates: ${AVAILABLE_TEMPLATES.join(', ')}`);
|
|
27
|
+
}
|
|
28
|
+
const targetDir = path.resolve(cwd, projectName);
|
|
29
|
+
if (fs.existsSync(targetDir) && fs.readdirSync(targetDir).length > 0) {
|
|
30
|
+
throw new Error(`[${programName}] Target directory "${projectName}" is not empty. Please choose a different name or remove the existing directory.`);
|
|
31
|
+
}
|
|
32
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
33
|
+
const templateDir = path.resolve(__dirname, '../../templates', template);
|
|
34
|
+
copyDir(templateDir, targetDir);
|
|
35
|
+
// Replace {{projectName}} and resolve workspace:* versions in package.json
|
|
36
|
+
const pkgName = path.basename(targetDir);
|
|
37
|
+
const pkgJsonPath = path.join(targetDir, 'package.json');
|
|
38
|
+
if (fs.existsSync(pkgJsonPath)) {
|
|
39
|
+
const require = createRequire(import.meta.url);
|
|
40
|
+
const versionMap = resolveVersionMap([loadPackageManifest(require, '../../../package.json')], require);
|
|
41
|
+
let content = fs.readFileSync(pkgJsonPath, 'utf-8');
|
|
42
|
+
content = content.replaceAll('{{projectName}}', pkgName);
|
|
43
|
+
content = replaceWorkspaceVersions(content, versionMap, require);
|
|
44
|
+
fs.writeFileSync(pkgJsonPath, content);
|
|
45
|
+
}
|
|
46
|
+
console.info(`\nProject created at ${projectName}/\n`);
|
|
47
|
+
console.info(`Next steps:\n`);
|
|
48
|
+
console.info(` cd ${projectName}`);
|
|
49
|
+
console.info(` pnpm install`);
|
|
50
|
+
console.info(` pnpm run dev\n`);
|
|
51
|
+
return 0;
|
|
52
|
+
}
|
|
53
|
+
function parseCreateArgs(args) {
|
|
54
|
+
const options = { help: false };
|
|
55
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
56
|
+
const arg = args[index];
|
|
57
|
+
if (arg === '--help' || arg === '-h') {
|
|
58
|
+
options.help = true;
|
|
59
|
+
}
|
|
60
|
+
else if (arg === '--template') {
|
|
61
|
+
options.template = readValue(args, ++index, arg);
|
|
62
|
+
}
|
|
63
|
+
else if (arg.startsWith('-')) {
|
|
64
|
+
throw new Error(`Unknown option: ${arg}`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
options.projectName = arg;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return options;
|
|
71
|
+
}
|
|
72
|
+
function copyDir(src, dest) {
|
|
73
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
74
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
const srcPath = path.join(src, entry.name);
|
|
77
|
+
const destPath = path.join(dest, entry.name);
|
|
78
|
+
if (entry.isDirectory()) {
|
|
79
|
+
copyDir(srcPath, destPath);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
fs.copyFileSync(srcPath, destPath);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function replaceWorkspaceVersions(content, versionMap, requireFn) {
|
|
87
|
+
const pkg = JSON.parse(content);
|
|
88
|
+
for (const field of ['dependencies', 'devDependencies']) {
|
|
89
|
+
const deps = pkg[field];
|
|
90
|
+
if (!deps)
|
|
91
|
+
continue;
|
|
92
|
+
for (const name of Object.keys(deps)) {
|
|
93
|
+
if (deps[name] === 'workspace:*') {
|
|
94
|
+
const resolved = versionMap[name]
|
|
95
|
+
?? resolvePackageVersion(name, requireFn);
|
|
96
|
+
if (resolved) {
|
|
97
|
+
deps[name] = resolved;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return JSON.stringify(pkg, null, 2) + '\n';
|
|
103
|
+
}
|
|
104
|
+
function resolvePackageVersion(name, requireFn) {
|
|
105
|
+
try {
|
|
106
|
+
const pkg = requireFn(`${name}/package.json`);
|
|
107
|
+
return `^${pkg.version}`;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Package might have strict exports; try resolving via main entry
|
|
111
|
+
try {
|
|
112
|
+
const mainPath = requireFn.resolve(name);
|
|
113
|
+
// Walk up to find package.json
|
|
114
|
+
let dir = path.dirname(mainPath);
|
|
115
|
+
while (dir !== path.dirname(dir)) {
|
|
116
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
117
|
+
if (fs.existsSync(pkgPath)) {
|
|
118
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
119
|
+
if (pkg.name === name && pkg.version) {
|
|
120
|
+
return `^${pkg.version}`;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
dir = path.dirname(dir);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Cannot resolve package at all
|
|
128
|
+
}
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Resolve workspace:^ / workspace:* values to real versions.
|
|
134
|
+
* The CLI is also shipped inside @lynx-js/genui, where cli/package.json is a
|
|
135
|
+
* nested workspace manifest that pnpm does not rewrite on publish. Use the
|
|
136
|
+
* parent package manifest as the generated app's dependency version source.
|
|
137
|
+
*/
|
|
138
|
+
function resolveVersionMap(manifests, requireFn) {
|
|
139
|
+
const resolved = {};
|
|
140
|
+
for (const manifest of manifests) {
|
|
141
|
+
if (manifest.name && manifest.version && !resolved[manifest.name]) {
|
|
142
|
+
resolved[manifest.name] = `^${manifest.version}`;
|
|
143
|
+
}
|
|
144
|
+
for (const deps of getManifestDependencyFields(manifest)) {
|
|
145
|
+
for (const [name, version] of Object.entries(deps)) {
|
|
146
|
+
if (resolved[name])
|
|
147
|
+
continue;
|
|
148
|
+
if (version.startsWith('workspace:')) {
|
|
149
|
+
const resolvedVersion = resolvePackageVersion(name, requireFn);
|
|
150
|
+
if (resolvedVersion) {
|
|
151
|
+
resolved[name] = resolvedVersion;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else if (!version.startsWith('catalog:')) {
|
|
155
|
+
resolved[name] = version;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return resolved;
|
|
161
|
+
}
|
|
162
|
+
function loadPackageManifest(requireFn, id) {
|
|
163
|
+
try {
|
|
164
|
+
return requireFn(id);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return {};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function getManifestDependencyFields(manifest) {
|
|
171
|
+
return [
|
|
172
|
+
manifest.dependencies,
|
|
173
|
+
manifest.devDependencies,
|
|
174
|
+
manifest.optionalDependencies,
|
|
175
|
+
manifest.peerDependencies,
|
|
176
|
+
].filter((deps) => deps !== undefined);
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/a2ui/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// Copyright 2026 The Lynx Authors. All rights reserved.
|
|
2
|
+
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
|
+
// LICENSE file in the root directory of this source tree.
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import { runA2UICreateCli } from './create.js';
|
|
7
|
+
import { printPackageVersion, readValue } from '../utils.js';
|
|
8
|
+
const a2uiUsage = `Usage: genui a2ui <command> [options]
|
|
9
|
+
|
|
10
|
+
Commands:
|
|
11
|
+
create [project-name] Create a new A2UI project from a template.
|
|
12
|
+
generate <target> Generate catalog artifacts or system prompts.
|
|
13
|
+
|
|
14
|
+
Targets (for generate):
|
|
15
|
+
catalog Generate A2UI component and function catalog files.
|
|
16
|
+
prompt Generate an A2UI system prompt from catalog files.
|
|
17
|
+
`;
|
|
18
|
+
const legacyA2UIUsage = a2uiUsage.replaceAll('genui a2ui', 'a2ui-cli');
|
|
19
|
+
function createGenerateCatalogUsage(programName) {
|
|
20
|
+
return `Usage: ${programName} generate catalog [options]
|
|
21
|
+
|
|
22
|
+
Options:
|
|
23
|
+
--catalog-dir <dir> Directory to scan for TypeScript catalog interfaces.
|
|
24
|
+
--source <path> Source file or directory to scan. Repeatable.
|
|
25
|
+
--typedoc-json <file>
|
|
26
|
+
Read an existing TypeDoc JSON project instead of
|
|
27
|
+
running TypeDoc conversion.
|
|
28
|
+
--out-dir <dir> Output directory for component catalog.json files.
|
|
29
|
+
--version Print the package version.
|
|
30
|
+
--help Print this help message.
|
|
31
|
+
|
|
32
|
+
Defaults:
|
|
33
|
+
--catalog-dir src/catalog
|
|
34
|
+
--out-dir dist/catalog
|
|
35
|
+
`;
|
|
36
|
+
}
|
|
37
|
+
function createGeneratePromptUsage(programName) {
|
|
38
|
+
return `Usage: ${programName} generate prompt [options]
|
|
39
|
+
|
|
40
|
+
Options:
|
|
41
|
+
--catalog-dir <dir> Directory containing generated catalog files. When
|
|
42
|
+
omitted, use the built-in A2UI basic catalog.
|
|
43
|
+
--catalog-id <id> Catalog id to require in createSurface messages.
|
|
44
|
+
--out <file> Write the prompt to a file instead of stdout.
|
|
45
|
+
--appendix <text> Append extra instructions to the generated prompt.
|
|
46
|
+
--version Print the package version.
|
|
47
|
+
--help Print this help message.
|
|
48
|
+
|
|
49
|
+
Defaults:
|
|
50
|
+
--catalog-id built-in A2UI basic catalog id
|
|
51
|
+
`;
|
|
52
|
+
}
|
|
53
|
+
export async function runA2UICli(args, cwd, options) {
|
|
54
|
+
const programName = options.programName;
|
|
55
|
+
const command = args[0];
|
|
56
|
+
if (command === undefined || command === '--help' || command === '-h') {
|
|
57
|
+
console.info(programName === 'a2ui-cli' ? legacyA2UIUsage : a2uiUsage);
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
if (command === '--version' || command === '-v') {
|
|
61
|
+
printPackageVersion();
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
if (command === 'create') {
|
|
65
|
+
return runA2UICreateCli(args.slice(1), cwd, { programName });
|
|
66
|
+
}
|
|
67
|
+
if (command !== 'generate') {
|
|
68
|
+
throw new Error(`Unknown A2UI command: ${command}`);
|
|
69
|
+
}
|
|
70
|
+
const target = args[1];
|
|
71
|
+
const targetArgs = args.slice(2);
|
|
72
|
+
if (target === undefined || target === '--help' || target === '-h') {
|
|
73
|
+
console.info(programName === 'a2ui-cli' ? legacyA2UIUsage : a2uiUsage);
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
if (target === '--version' || target === '-v') {
|
|
77
|
+
printPackageVersion();
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
if (target === 'catalog') {
|
|
81
|
+
if (targetArgs.includes('--help') || targetArgs.includes('-h')) {
|
|
82
|
+
console.info(createGenerateCatalogUsage(programName));
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
85
|
+
const { runCli: runCatalogExtractorCli } = await import('../../../a2ui-catalog-extractor/dist/cli.js');
|
|
86
|
+
return await runCatalogExtractorCli(targetArgs, cwd);
|
|
87
|
+
}
|
|
88
|
+
if (target === 'prompt') {
|
|
89
|
+
return runGeneratePromptCli(targetArgs, cwd, { programName });
|
|
90
|
+
}
|
|
91
|
+
throw new Error(`Unknown generate target: ${target}`);
|
|
92
|
+
}
|
|
93
|
+
async function runGeneratePromptCli(args, cwd, cliOptions) {
|
|
94
|
+
const programName = cliOptions.programName;
|
|
95
|
+
const options = parseGeneratePromptArgs(args);
|
|
96
|
+
if (options.help) {
|
|
97
|
+
console.info(createGeneratePromptUsage(programName));
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
if (options.version) {
|
|
101
|
+
printPackageVersion();
|
|
102
|
+
return 0;
|
|
103
|
+
}
|
|
104
|
+
const { BASIC_CATALOG, BASIC_CATALOG_ID, buildA2UISystemPrompt, readA2UICatalogFromDirectory, } = await import('../../../a2ui-prompt/dist/index.js');
|
|
105
|
+
const catalog = options.catalogDir
|
|
106
|
+
? readA2UICatalogFromDirectory({
|
|
107
|
+
catalogDir: options.catalogDir,
|
|
108
|
+
catalogId: options.catalogId ?? BASIC_CATALOG_ID,
|
|
109
|
+
cwd,
|
|
110
|
+
})
|
|
111
|
+
: (options.catalogId
|
|
112
|
+
? { ...BASIC_CATALOG, id: options.catalogId }
|
|
113
|
+
: undefined);
|
|
114
|
+
if (options.catalogDir && catalog && isEmptyCatalog(catalog)) {
|
|
115
|
+
throw new Error(`[${programName}] No components or functions found in generated catalog directory: ${options.catalogDir}`);
|
|
116
|
+
}
|
|
117
|
+
const systemPrompt = buildA2UISystemPrompt({
|
|
118
|
+
...(catalog ? { catalog } : {}),
|
|
119
|
+
...(options.appendix ? { appendix: options.appendix } : {}),
|
|
120
|
+
});
|
|
121
|
+
if (options.out) {
|
|
122
|
+
const outPath = path.resolve(cwd, options.out);
|
|
123
|
+
fs.mkdirSync(path.dirname(outPath), { recursive: true });
|
|
124
|
+
fs.writeFileSync(outPath, systemPrompt);
|
|
125
|
+
console.info(`Generated A2UI system prompt at ${options.out}.`);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
process.stdout.write(systemPrompt);
|
|
129
|
+
}
|
|
130
|
+
return 0;
|
|
131
|
+
}
|
|
132
|
+
function parseGeneratePromptArgs(args) {
|
|
133
|
+
const options = {
|
|
134
|
+
help: false,
|
|
135
|
+
version: false,
|
|
136
|
+
};
|
|
137
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
138
|
+
const arg = args[index];
|
|
139
|
+
switch (arg) {
|
|
140
|
+
case '--catalog-dir':
|
|
141
|
+
options.catalogDir = readValue(args, ++index, arg);
|
|
142
|
+
break;
|
|
143
|
+
case '--catalog-id':
|
|
144
|
+
options.catalogId = readValue(args, ++index, arg);
|
|
145
|
+
break;
|
|
146
|
+
case '--out':
|
|
147
|
+
options.out = readValue(args, ++index, arg);
|
|
148
|
+
break;
|
|
149
|
+
case '--appendix':
|
|
150
|
+
options.appendix = readValue(args, ++index, arg);
|
|
151
|
+
break;
|
|
152
|
+
case '--help':
|
|
153
|
+
case '-h':
|
|
154
|
+
options.help = true;
|
|
155
|
+
break;
|
|
156
|
+
case '--version':
|
|
157
|
+
case '-v':
|
|
158
|
+
options.version = true;
|
|
159
|
+
break;
|
|
160
|
+
default:
|
|
161
|
+
throw new Error(`Unknown option: ${arg}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return options;
|
|
165
|
+
}
|
|
166
|
+
function isEmptyCatalog(catalog) {
|
|
167
|
+
return (!Array.isArray(catalog.components) || catalog.components.length === 0)
|
|
168
|
+
&& (!Array.isArray(catalog.functions) || catalog.functions.length === 0);
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/a2ui/index.ts"],"names":[],"mappings":"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"}
|