@lynx-js/genui 0.0.1 → 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.
Files changed (236) hide show
  1. package/README.md +5 -9
  2. package/a2ui/AGENTS.md +167 -0
  3. package/a2ui/README.md +76 -780
  4. package/a2ui/README_zh.md +103 -0
  5. package/a2ui/dist/catalog/Button/{index.js → index.jsx} +12 -8
  6. package/a2ui/dist/catalog/Button/index.jsx.map +1 -0
  7. package/a2ui/dist/catalog/Card/{index.js → index.jsx} +5 -4
  8. package/a2ui/dist/catalog/Card/index.jsx.map +1 -0
  9. package/a2ui/dist/catalog/CheckBox/{index.js → index.jsx} +11 -6
  10. package/a2ui/dist/catalog/CheckBox/index.jsx.map +1 -0
  11. package/a2ui/dist/catalog/ChoicePicker/index.jsx +98 -0
  12. package/a2ui/dist/catalog/ChoicePicker/index.jsx.map +1 -0
  13. package/a2ui/dist/catalog/Column/{index.js → index.jsx} +10 -7
  14. package/a2ui/dist/catalog/Column/{index.js.map → index.jsx.map} +1 -1
  15. package/a2ui/dist/catalog/DateTimeInput/index.jsx +249 -0
  16. package/a2ui/dist/catalog/DateTimeInput/index.jsx.map +1 -0
  17. package/a2ui/dist/catalog/DateTimeInput/utils.d.ts +0 -1
  18. package/a2ui/dist/catalog/DateTimeInput/utils.js +0 -3
  19. package/a2ui/dist/catalog/DateTimeInput/utils.js.map +1 -1
  20. package/a2ui/dist/catalog/Divider/index.jsx +7 -0
  21. package/a2ui/dist/catalog/Divider/index.jsx.map +1 -0
  22. package/a2ui/dist/catalog/Icon/{index.js → index.jsx} +4 -3
  23. package/a2ui/dist/catalog/Icon/{index.js.map → index.jsx.map} +1 -1
  24. package/a2ui/dist/catalog/Image/{index.js → index.jsx} +2 -3
  25. package/a2ui/dist/catalog/Image/{index.js.map → index.jsx.map} +1 -1
  26. package/a2ui/dist/catalog/LineChart/{index.js → index.jsx} +50 -13
  27. package/a2ui/dist/catalog/LineChart/{index.js.map → index.jsx.map} +1 -1
  28. package/a2ui/dist/catalog/List/{index.js → index.jsx} +9 -6
  29. package/a2ui/dist/catalog/List/{index.js.map → index.jsx.map} +1 -1
  30. package/a2ui/dist/catalog/Loading/catalog.json +15 -0
  31. package/a2ui/dist/catalog/Loading/index.d.ts +10 -0
  32. package/a2ui/dist/catalog/Loading/index.jsx +11 -0
  33. package/a2ui/dist/catalog/Loading/index.jsx.map +1 -0
  34. package/a2ui/dist/catalog/Modal/{index.js → index.jsx} +18 -9
  35. package/a2ui/dist/catalog/Modal/index.jsx.map +1 -0
  36. package/a2ui/dist/catalog/PieChart/{index.js → index.jsx} +41 -15
  37. package/a2ui/dist/catalog/PieChart/{index.js.map → index.jsx.map} +1 -1
  38. package/a2ui/dist/catalog/RadioGroup/{index.js → index.jsx} +18 -5
  39. package/a2ui/dist/catalog/RadioGroup/index.jsx.map +1 -0
  40. package/a2ui/dist/catalog/Row/{index.js → index.jsx} +10 -7
  41. package/a2ui/dist/catalog/Row/index.jsx.map +1 -0
  42. package/a2ui/dist/catalog/Slider/{index.js → index.jsx} +22 -7
  43. package/a2ui/dist/catalog/Slider/{index.js.map → index.jsx.map} +1 -1
  44. package/a2ui/dist/catalog/Tabs/index.jsx +40 -0
  45. package/a2ui/dist/catalog/Tabs/index.jsx.map +1 -0
  46. package/a2ui/dist/catalog/Text/catalog.json +6 -2
  47. package/a2ui/dist/catalog/Text/index.d.ts +1 -1
  48. package/a2ui/dist/catalog/Text/index.jsx +16 -0
  49. package/a2ui/dist/catalog/Text/index.jsx.map +1 -0
  50. package/a2ui/dist/catalog/TextField/{index.js → index.jsx} +8 -5
  51. package/a2ui/dist/catalog/TextField/{index.js.map → index.jsx.map} +1 -1
  52. package/a2ui/dist/catalog/defineCatalog.d.ts +0 -4
  53. package/a2ui/dist/catalog/defineCatalog.js.map +1 -1
  54. package/a2ui/dist/catalog/index.d.ts +20 -19
  55. package/a2ui/dist/catalog/index.js +41 -21
  56. package/a2ui/dist/catalog/index.js.map +1 -1
  57. package/a2ui/dist/catalog.json +2548 -0
  58. package/a2ui/dist/index.d.ts +1 -1
  59. package/a2ui/dist/index.js +2 -2
  60. package/a2ui/dist/index.js.map +1 -1
  61. package/a2ui/dist/react/A2UI.d.ts +1 -1
  62. package/a2ui/dist/react/{A2UI.js → A2UI.jsx} +6 -5
  63. package/a2ui/dist/react/{A2UI.js.map → A2UI.jsx.map} +1 -1
  64. package/a2ui/dist/react/{A2UIProvider.js → A2UIProvider.jsx} +2 -3
  65. package/a2ui/dist/react/{A2UIProvider.js.map → A2UIProvider.jsx.map} +1 -1
  66. package/a2ui/dist/react/{A2UIRenderer.js → A2UIRenderer.jsx} +32 -32
  67. package/a2ui/dist/react/A2UIRenderer.jsx.map +1 -0
  68. package/a2ui/dist/react/index.d.ts +3 -3
  69. package/a2ui/dist/react/index.js +2 -2
  70. package/a2ui/dist/react/index.js.map +1 -1
  71. package/a2ui/dist/react/useA2UIContext.d.ts +1 -1
  72. package/a2ui/dist/react/useA2UIContext.js +1 -1
  73. package/a2ui/dist/react/useA2UIContext.js.map +1 -1
  74. package/a2ui/dist/tsconfig.build.tsbuildinfo +1 -1
  75. package/a2ui/docs/catalog-guide.md +401 -0
  76. package/a2ui/docs/catalog-guide_zh.md +373 -0
  77. package/a2ui/docs/overview.md +312 -0
  78. package/a2ui/docs/overview_zh.md +289 -0
  79. package/a2ui/docs/system-prompts.md +187 -0
  80. package/a2ui/docs/system-prompts_zh.md +187 -0
  81. package/a2ui/src/catalog/README.md +12 -0
  82. package/a2ui/src/catalog/index.ts +51 -0
  83. package/a2ui/src/catalog/readme_zh.md +11 -0
  84. package/a2ui/src/index.ts +115 -0
  85. package/a2ui/styles/catalog/Button.css +5 -5
  86. package/a2ui/styles/catalog/DateTimeInput.css +22 -30
  87. package/a2ui/styles/catalog/Loading.css +61 -0
  88. package/a2ui/styles/catalog/Modal.css +1 -0
  89. package/a2ui/styles/catalog/Text.css +2 -6
  90. package/a2ui-catalog-extractor/README.md +14 -7
  91. package/a2ui-catalog-extractor/dist/cli.d.ts +1 -0
  92. package/a2ui-catalog-extractor/dist/cli.js +15 -6
  93. package/a2ui-catalog-extractor/dist/cli.js.map +1 -1
  94. package/a2ui-catalog-extractor/dist/index.d.ts +9 -2
  95. package/a2ui-catalog-extractor/dist/index.js +52 -6
  96. package/a2ui-catalog-extractor/dist/index.js.map +1 -1
  97. package/a2ui-catalog-extractor/dist/tsconfig.build.tsbuildinfo +1 -1
  98. package/a2ui-catalog-extractor/skills/a2ui-catalog-extractor/SKILL.md +1 -1
  99. package/a2ui-prompt/README.md +3 -2
  100. package/a2ui-prompt/dist/index.d.ts +2 -0
  101. package/a2ui-prompt/dist/index.js +259 -184
  102. package/cli/README.md +26 -0
  103. package/cli/bin/cli.js +7 -265
  104. package/cli/dist/a2ui/create.d.ts +5 -0
  105. package/cli/dist/a2ui/create.js +178 -0
  106. package/cli/dist/a2ui/create.js.map +1 -0
  107. package/cli/dist/a2ui/index.d.ts +5 -0
  108. package/cli/dist/a2ui/index.js +170 -0
  109. package/cli/dist/a2ui/index.js.map +1 -0
  110. package/cli/dist/cli.d.ts +4 -0
  111. package/cli/dist/cli.js +40 -0
  112. package/cli/dist/cli.js.map +1 -0
  113. package/cli/dist/openui.d.ts +1 -0
  114. package/cli/dist/openui.js +21 -0
  115. package/cli/dist/openui.js.map +1 -0
  116. package/cli/dist/tsconfig.build.tsbuildinfo +1 -0
  117. package/cli/dist/utils.d.ts +2 -0
  118. package/cli/dist/utils.js +17 -0
  119. package/cli/dist/utils.js.map +1 -0
  120. package/cli/templates/default/lynx.config.ts +13 -0
  121. package/cli/templates/default/package.json +27 -0
  122. package/cli/templates/default/src/App.css +88 -0
  123. package/cli/templates/default/src/App.tsx +100 -0
  124. package/cli/templates/default/src/index.tsx +10 -0
  125. package/cli/templates/default/src/messages.ts +158 -0
  126. package/cli/templates/default/src/rspeedy-env.d.ts +14 -0
  127. package/cli/templates/default/src/tsconfig.json +17 -0
  128. package/cli/templates/default/tsconfig.json +15 -0
  129. package/cli/templates/default/tsconfig.node.json +16 -0
  130. package/dist/tsconfig.build.tsbuildinfo +1 -1
  131. package/openui/README.md +50 -46
  132. package/openui/dist/catalog/Action/{index.js → index.jsx} +1 -1
  133. package/openui/dist/catalog/Action/index.jsx.map +1 -0
  134. package/openui/dist/catalog/Button/index.d.ts +8 -8
  135. package/openui/dist/catalog/Button/{index.js → index.jsx} +28 -14
  136. package/openui/dist/catalog/Button/index.jsx.map +1 -0
  137. package/openui/dist/catalog/Card/index.d.ts +1 -1
  138. package/openui/dist/catalog/Card/{index.js → index.jsx} +5 -4
  139. package/openui/dist/catalog/Card/{index.js.map → index.jsx.map} +1 -1
  140. package/openui/dist/catalog/CardHeader/index.d.ts +1 -1
  141. package/openui/dist/catalog/CardHeader/index.jsx +20 -0
  142. package/openui/dist/catalog/CardHeader/index.jsx.map +1 -0
  143. package/openui/dist/catalog/CheckBox/index.d.ts +16 -0
  144. package/openui/dist/catalog/CheckBox/index.jsx +82 -0
  145. package/openui/dist/catalog/CheckBox/index.jsx.map +1 -0
  146. package/openui/dist/catalog/Icon/index.d.ts +44 -0
  147. package/openui/dist/catalog/Icon/index.jsx +66 -0
  148. package/openui/dist/catalog/Icon/index.jsx.map +1 -0
  149. package/openui/dist/catalog/Image/index.d.ts +19 -0
  150. package/openui/dist/catalog/Image/index.jsx +40 -0
  151. package/openui/dist/catalog/Image/index.jsx.map +1 -0
  152. package/openui/dist/catalog/Loading/index.d.ts +7 -0
  153. package/openui/dist/catalog/Loading/index.jsx +25 -0
  154. package/openui/dist/catalog/Loading/index.jsx.map +1 -0
  155. package/openui/dist/catalog/RadioGroup/index.d.ts +21 -0
  156. package/openui/dist/catalog/RadioGroup/index.jsx +99 -0
  157. package/openui/dist/catalog/RadioGroup/index.jsx.map +1 -0
  158. package/openui/dist/catalog/Separator/index.d.ts +1 -1
  159. package/openui/dist/catalog/Separator/{index.js → index.jsx} +3 -4
  160. package/openui/dist/catalog/Separator/index.jsx.map +1 -0
  161. package/openui/dist/catalog/Slider/index.d.ts +19 -0
  162. package/openui/dist/catalog/Slider/index.jsx +139 -0
  163. package/openui/dist/catalog/Slider/index.jsx.map +1 -0
  164. package/openui/dist/catalog/Stack/index.d.ts +1 -1
  165. package/openui/dist/catalog/Stack/{index.js → index.jsx} +3 -4
  166. package/openui/dist/catalog/Stack/{index.js.map → index.jsx.map} +1 -1
  167. package/openui/dist/catalog/Tag/index.d.ts +1 -1
  168. package/openui/dist/catalog/Tag/{index.js → index.jsx} +5 -4
  169. package/openui/dist/catalog/Tag/index.jsx.map +1 -0
  170. package/openui/dist/catalog/TextContent/index.d.ts +1 -1
  171. package/openui/dist/catalog/TextContent/{index.js → index.jsx} +5 -4
  172. package/openui/dist/catalog/TextContent/{index.js.map → index.jsx.map} +1 -1
  173. package/openui/dist/catalog/TextField/index.d.ts +23 -0
  174. package/openui/dist/catalog/TextField/index.jsx +132 -0
  175. package/openui/dist/catalog/TextField/index.jsx.map +1 -0
  176. package/openui/dist/catalog/index.d.ts +14 -7
  177. package/openui/dist/catalog/index.js +14 -7
  178. package/openui/dist/catalog/index.js.map +1 -1
  179. package/openui/dist/core/context.d.ts +17 -7
  180. package/openui/dist/core/{context.js → context.jsx} +8 -2
  181. package/openui/dist/core/context.jsx.map +1 -0
  182. package/openui/dist/core/createLibrary.d.ts +1 -1
  183. package/openui/dist/core/{createLibrary.js → createLibrary.jsx} +14 -3
  184. package/openui/dist/core/createLibrary.jsx.map +1 -0
  185. package/openui/dist/core/hooks/index.d.ts +1 -0
  186. package/openui/dist/core/hooks/index.js +1 -0
  187. package/openui/dist/core/hooks/index.js.map +1 -1
  188. package/openui/dist/core/hooks/useOpenUIState.d.ts +2 -2
  189. package/openui/dist/core/hooks/useOpenUIState.js +3 -1
  190. package/openui/dist/core/hooks/useOpenUIState.js.map +1 -1
  191. package/openui/dist/core/hooks/useStateField.js +1 -1
  192. package/openui/dist/core/hooks/useStateField.js.map +1 -1
  193. package/openui/dist/core/index.d.ts +13 -7
  194. package/openui/dist/core/index.js +7 -4
  195. package/openui/dist/core/index.js.map +1 -1
  196. package/openui/dist/core/{library.js → library.jsx} +1 -1
  197. package/openui/dist/core/library.jsx.map +1 -0
  198. package/openui/dist/core/renderer.css +527 -0
  199. package/openui/dist/core/renderer.d.ts +31 -4
  200. package/openui/dist/core/renderer.jsx +281 -0
  201. package/openui/dist/core/renderer.jsx.map +1 -0
  202. package/openui/dist/core/runtime/index.d.ts +1 -0
  203. package/openui/dist/core/runtime/index.js +5 -0
  204. package/openui/dist/core/runtime/index.js.map +1 -0
  205. package/openui/dist/core/runtime/reactive.d.ts +7 -0
  206. package/openui/dist/core/runtime/reactive.js +10 -0
  207. package/openui/dist/core/runtime/reactive.js.map +1 -0
  208. package/package.json +18 -8
  209. package/a2ui/dist/catalog/Button/index.js.map +0 -1
  210. package/a2ui/dist/catalog/Card/index.js.map +0 -1
  211. package/a2ui/dist/catalog/CheckBox/index.js.map +0 -1
  212. package/a2ui/dist/catalog/ChoicePicker/index.js +0 -66
  213. package/a2ui/dist/catalog/ChoicePicker/index.js.map +0 -1
  214. package/a2ui/dist/catalog/DateTimeInput/index.js +0 -147
  215. package/a2ui/dist/catalog/DateTimeInput/index.js.map +0 -1
  216. package/a2ui/dist/catalog/Divider/index.js +0 -8
  217. package/a2ui/dist/catalog/Divider/index.js.map +0 -1
  218. package/a2ui/dist/catalog/Modal/index.js.map +0 -1
  219. package/a2ui/dist/catalog/RadioGroup/index.js.map +0 -1
  220. package/a2ui/dist/catalog/Row/index.js.map +0 -1
  221. package/a2ui/dist/catalog/Tabs/index.js +0 -32
  222. package/a2ui/dist/catalog/Tabs/index.js.map +0 -1
  223. package/a2ui/dist/catalog/Text/index.js +0 -27
  224. package/a2ui/dist/catalog/Text/index.js.map +0 -1
  225. package/a2ui/dist/react/A2UIRenderer.js.map +0 -1
  226. package/openui/dist/catalog/Action/index.js.map +0 -1
  227. package/openui/dist/catalog/Button/index.js.map +0 -1
  228. package/openui/dist/catalog/CardHeader/index.js +0 -18
  229. package/openui/dist/catalog/CardHeader/index.js.map +0 -1
  230. package/openui/dist/catalog/Separator/index.js.map +0 -1
  231. package/openui/dist/catalog/Tag/index.js.map +0 -1
  232. package/openui/dist/core/context.js.map +0 -1
  233. package/openui/dist/core/createLibrary.js.map +0 -1
  234. package/openui/dist/core/library.js.map +0 -1
  235. package/openui/dist/core/renderer.js +0 -139
  236. package/openui/dist/core/renderer.js.map +0 -1
package/cli/README.md CHANGED
@@ -20,6 +20,12 @@ a compatibility alias for existing A2UI-only scripts.
20
20
 
21
21
  ## A2UI Commands
22
22
 
23
+ Create a new A2UI project:
24
+
25
+ ```bash
26
+ genui a2ui create my-a2ui-app
27
+ ```
28
+
23
29
  Generate a system prompt with the built-in A2UI basic catalog:
24
30
 
25
31
  ```bash
@@ -49,6 +55,26 @@ genui a2ui generate prompt \
49
55
  artifacts. When `--catalog-dir` is provided, the directory must contain files
50
56
  like `<Component>/catalog.json`.
51
57
 
58
+ ### `genui a2ui create`
59
+
60
+ Creates a new ReactLynx A2UI project from the bundled template.
61
+
62
+ ```bash
63
+ genui a2ui create my-a2ui-app
64
+ cd my-a2ui-app
65
+ pnpm install
66
+ pnpm run dev
67
+ ```
68
+
69
+ Useful options:
70
+
71
+ - `[project-name]`: target directory name. Defaults to `my-a2ui-app`.
72
+ - `--template <name>`: template to use. Defaults to `default`.
73
+
74
+ The target directory must be empty. The generated `package.json` replaces the
75
+ template workspace dependency placeholders with installable package versions
76
+ resolved from the parent `@lynx-js/genui` package metadata.
77
+
52
78
  ### `genui a2ui generate catalog`
53
79
 
54
80
  Delegates catalog extraction to `@lynx-js/genui/a2ui-catalog-extractor`.
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
- const usage = `Usage: genui <namespace> <command> [options]
7
+ import { runCli } from '../dist/cli.js';
11
8
 
12
- Namespaces:
13
- a2ui Generate A2UI catalog artifacts and system prompts.
14
- openui Reserved for future OpenUI workflows.
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
- if (options.out) {
201
- const outPath = path.resolve(cwd, options.out);
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,5 @@
1
+ interface CreateOptions {
2
+ programName: string;
3
+ }
4
+ export declare function runA2UICreateCli(args: string[], cwd: string, options: CreateOptions): number;
5
+ export {};
@@ -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,5 @@
1
+ interface A2UIOptions {
2
+ programName: string;
3
+ }
4
+ export declare function runA2UICli(args: string[], cwd: string, options: A2UIOptions): Promise<number>;
5
+ export {};
@@ -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