diff --git a/.github/genui-tsconfig.instructions.md b/.github/genui-tsconfig.instructions.md
index 4d0be8dcb3..c76d5f6f6c 100644
--- a/.github/genui-tsconfig.instructions.md
+++ b/.github/genui-tsconfig.instructions.md
@@ -3,3 +3,5 @@ applyTo: "packages/genui/**/*"
---
When adding a new package under `packages/genui`, add a package-level `tsconfig.json` and wire it into `packages/genui/tsconfig.json` references in the same change. Root type-aware ESLint uses the TypeScript project service, so new GenUI source files that are not reachable from those references will fail pre-commit parsing before code linting even starts.
+
+When maintaining hand-written ESM CLI bin files under `packages/genui`, make entrypoint detection resolve `process.argv[1]` through `fs.realpathSync()` before comparing it with `import.meta.url`. pnpm `.bin` shims invoke workspace bins through symlink paths, and a raw path comparison can load the module without executing the CLI, making build scripts appear successful while generated artifacts are missing.
diff --git a/eslint.config.js b/eslint.config.js
index 2089ad4ebe..0e9b3389de 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -269,6 +269,12 @@ export default tseslint.config(
reportUnusedDisableDirectives: true,
},
},
+ {
+ files: ['packages/genui/index.ts'],
+ rules: {
+ 'import/no-unresolved': 'off',
+ },
+ },
// TypeScript-related
{
files: ['**/*.ts', '**/*.tsx'],
@@ -293,6 +299,7 @@ export default tseslint.config(
'rslib.config.ts',
'vitest.config.ts',
'rstest.config.ts',
+ 'packages/genui/index.ts',
],
defaultProject: './tsconfig.json',
},
diff --git a/packages/genui/.gitignore b/packages/genui/.gitignore
new file mode 100644
index 0000000000..178135c2b2
--- /dev/null
+++ b/packages/genui/.gitignore
@@ -0,0 +1 @@
+/dist/
diff --git a/packages/genui/README.md b/packages/genui/README.md
new file mode 100644
index 0000000000..1ad48fc3b5
--- /dev/null
+++ b/packages/genui/README.md
@@ -0,0 +1,170 @@
+# @lynx-js/genui
+
+Generative UI primitives for Lynx applications.
+
+`@lynx-js/genui` is the single npm package for the GenUI toolchain. It exposes
+A2UI rendering, OpenUI rendering, A2UI prompt/catalog utilities, and the CLI
+from one package while keeping implementation directories private to this
+monorepo.
+
+## Installation
+
+```bash
+pnpm add @lynx-js/genui @lynx-js/react
+```
+
+`@lynx-js/react` is a peer dependency. Some built-in A2UI catalog components
+also use `@lynx-js/lynx-ui`; install it when your app renders those components.
+
+## Entry Points
+
+```ts
+import {
+ A2UI,
+ createMessageStore,
+ createOpenUiLibrary,
+ createStreamingParser,
+ buildA2UISystemPrompt,
+ extractCatalogComponents,
+} from '@lynx-js/genui';
+```
+
+The root entry point exports the stable APIs most applications and tools need:
+
+- A2UI ReactLynx renderer and data-store helpers.
+- OpenUI parser, library, and renderer APIs.
+- A2UI prompt builders.
+- A2UI catalog extraction utilities.
+
+Focused subpaths are also available:
+
+```ts
+import { A2UI, Text, Button } from '@lynx-js/genui/a2ui';
+import { createMessageStore } from '@lynx-js/genui/a2ui/store';
+import { createOpenUiLibrary } from '@lynx-js/genui/openui';
+import { buildA2UISystemPrompt } from '@lynx-js/genui/a2ui-prompt';
+import { extractCatalogComponents } from '@lynx-js/genui/a2ui-catalog-extractor';
+```
+
+Catalog manifests are exported through a single public catalog entry:
+
+```ts
+import { Text, Button } from '@lynx-js/genui/a2ui/catalog';
+```
+
+## A2UI
+
+A2UI renders agent-generated UI messages that follow the A2UI v0.9 protocol.
+Create a message store, push protocol messages into it from your transport, and
+render the latest surface with `
{`// Import the v0.9 protocol
-import { Conversation } from '@lynx-js/a2ui-reactlynx/0.9';
+import { Conversation } from '@lynx-js/genui/a2ui/0.9';
export default function App() {
return (
@@ -30,7 +30,7 @@ export default function App() {
Build a custom chat UI with full control over layout and state.
- {`import { A2UIRender, useLynxClient } from '@lynx-js/a2ui-reactlynx/0.9';
+ {`import { A2UIRender, useLynxClient } from '@lynx-js/genui/a2ui/0.9';
export function CustomChat() {
const { messages, sendMessage } = useLynxClient("https://api.com/chat");
@@ -69,7 +69,7 @@ export function CustomChat() {
{`import { useState } from 'react';
-import { A2UIRender, useLynxClient } from '@lynx-js/a2ui-reactlynx/0.9';
+import { A2UIRender, useLynxClient } from '@lynx-js/genui/a2ui/0.9';
export function SingleRequest() {
const { sendMessage } = useLynxClient("https://api.com/chat", { keepHistory: false });
diff --git a/packages/genui/a2ui-playground/src/styles.css b/packages/genui/a2ui-playground/src/styles.css
index a276836a38..27006177cc 100644
--- a/packages/genui/a2ui-playground/src/styles.css
+++ b/packages/genui/a2ui-playground/src/styles.css
@@ -1,4 +1,4 @@
-@import "@lynx-js/a2ui-reactlynx/styles/theme.css";
+@import "@lynx-js/genui/a2ui/styles/theme.css";
/* ── Geist Design System Tokens ── */
:root {
diff --git a/packages/genui/a2ui-prompt/AGENTS.md b/packages/genui/a2ui-prompt/AGENTS.md
index 8a1c32d111..5666c71a69 100644
--- a/packages/genui/a2ui-prompt/AGENTS.md
+++ b/packages/genui/a2ui-prompt/AGENTS.md
@@ -9,7 +9,7 @@ This package may contain thin package-specific adapters such as
behavior should live in the server agent source and be re-exported from here.
The server package must remain self-contained for package-root Vercel
-deployments. Do not make `packages/genui/server` depend on `@lynx-js/a2ui-prompt`
+deployments. Do not make `packages/genui/server` depend on `@lynx-js/genui/a2ui-prompt`
at runtime.
When editing exported functions or constants reachable through this package,
diff --git a/packages/genui/a2ui-prompt/README.md b/packages/genui/a2ui-prompt/README.md
index ca524dcb35..017f57e5a5 100644
--- a/packages/genui/a2ui-prompt/README.md
+++ b/packages/genui/a2ui-prompt/README.md
@@ -1,6 +1,6 @@
# A2UI Prompt
-`@lynx-js/a2ui-prompt` provides A2UI system prompt construction utilities for
+`@lynx-js/genui/a2ui-prompt` provides A2UI system prompt construction utilities for
CLI and backend usage.
The source of truth for the built-in prompt and catalog is
@@ -14,7 +14,7 @@ package.
Build a prompt with the built-in A2UI basic catalog:
```ts
-import { buildA2UISystemPrompt } from '@lynx-js/a2ui-prompt';
+import { buildA2UISystemPrompt } from '@lynx-js/genui/a2ui-prompt';
const prompt = buildA2UISystemPrompt();
```
@@ -25,7 +25,7 @@ Read generated catalog artifacts and build a prompt for a custom catalog:
import {
buildA2UISystemPrompt,
readA2UICatalogFromDirectory,
-} from '@lynx-js/a2ui-prompt';
+} from '@lynx-js/genui/a2ui-prompt';
const catalog = readA2UICatalogFromDirectory({
catalogDir: 'dist/catalog',
@@ -37,7 +37,7 @@ const prompt = buildA2UISystemPrompt({ catalog });
`readA2UICatalogFromDirectory` expects generated files such as
`/catalog.json` and optional function definitions under `functions/`.
-Use `npx @lynx-js/a2ui-cli generate catalog` to create those artifacts.
+Use `genui a2ui generate catalog` to create those artifacts.
## Exports
diff --git a/packages/genui/a2ui-prompt/package.json b/packages/genui/a2ui-prompt/package.json
index 8a0994f2b6..95ef840352 100644
--- a/packages/genui/a2ui-prompt/package.json
+++ b/packages/genui/a2ui-prompt/package.json
@@ -1,6 +1,7 @@
{
- "name": "@lynx-js/a2ui-prompt",
+ "name": "@lynx-js/genui-a2ui-prompt",
"version": "0.0.0",
+ "private": true,
"description": "A2UI prompt and catalog rendering utilities for CLI prompt generation.",
"repository": {
"type": "git",
diff --git a/packages/genui/a2ui-prompt/src/index.ts b/packages/genui/a2ui-prompt/src/index.ts
index 77b5d3005c..18c2aa6917 100644
--- a/packages/genui/a2ui-prompt/src/index.ts
+++ b/packages/genui/a2ui-prompt/src/index.ts
@@ -54,7 +54,7 @@ export function readA2UICatalogFromDirectory(
}
if (componentManifests.length === 0) {
throw new Error(
- `[a2ui-prompt] No component catalog files found in ${options.catalogDir}. Expected files like /catalog.json. Run "a2ui-cli generate catalog" first or pass --catalog-dir to the generated catalog directory.`,
+ `[a2ui-prompt] No component catalog files found in ${options.catalogDir}. Expected files like /catalog.json. Run "genui a2ui generate catalog" first or pass --catalog-dir to the generated catalog directory.`,
);
}
diff --git a/packages/genui/a2ui/AGENTS.md b/packages/genui/a2ui/AGENTS.md
index 6aceaadcc3..474ca24fee 100644
--- a/packages/genui/a2ui/AGENTS.md
+++ b/packages/genui/a2ui/AGENTS.md
@@ -1,6 +1,6 @@
# a2ui (packages/genui/a2ui)
-This package (`@lynx-js/a2ui-reactlynx`) is a **headless** ReactLynx
+This package (`@lynx-js/genui/a2ui`) is a **headless** ReactLynx
renderer for the A2UI v0.9 protocol.
## How It Works (High Level)
@@ -122,13 +122,13 @@ User interactions are reported as `userAction` events:
Run from repo root:
```bash
-pnpm -F @lynx-js/a2ui-reactlynx build
+pnpm -C packages/genui/a2ui build
```
Notes:
- The package's `build` script runs the
- `@lynx-js/a2ui-catalog-extractor` to produce
+ `@lynx-js/genui/a2ui-catalog-extractor` to produce
`dist/catalog//catalog.json` manifests.
- The root `tsc --build` (registered as `//#build`) is what produces
`dist//index.{js,d.ts}` for each catalog component (project
@@ -138,7 +138,7 @@ Notes:
The build generates JSON schemas for catalog components:
-- Tool: `@lynx-js/a2ui-catalog-extractor` (TypeDoc-driven).
+- Tool: `@lynx-js/genui/a2ui-catalog-extractor` (TypeDoc-driven).
- Inputs: `src/catalog//index.tsx` files annotated with
`@a2uiCatalog ` JSDoc tags on the props interface.
- Outputs: `dist/catalog//catalog.json`.
@@ -163,5 +163,5 @@ When adding `src/catalog//index.tsx`:
3. Re-export the component from `src/catalog/index.ts`.
4. Add `./catalog/` and `./catalog//catalog.json` entries
to the `exports` map in `package.json`.
-5. Run `pnpm -F @lynx-js/a2ui-reactlynx build` and confirm
+5. Run `pnpm -C packages/genui/a2ui build` and confirm
`dist/catalog//catalog.json` is generated.
diff --git a/packages/genui/a2ui/README.md b/packages/genui/a2ui/README.md
index 697369e5cc..186e8c240c 100644
--- a/packages/genui/a2ui/README.md
+++ b/packages/genui/a2ui/README.md
@@ -1,4 +1,4 @@
-# Lynx GenUI
+# @lynx-js/genui/a2ui
English | [简体中文](./README_zh.md)
@@ -67,8 +67,8 @@ For a product app using A2UI, the important surfaces are:
| Surface | Role |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
-| `@lynx-js/a2ui-reactlynx` | ReactLynx renderer for A2UI v0.9. It provides ``, `MessageStore`, catalog APIs, built-in components, and protocol helpers. |
-| `npx @lynx-js/a2ui-cli` | Build-time command for generating catalog artifacts from TypeScript contracts and A2UI system prompts for your agent. |
+| `@lynx-js/genui/a2ui` | ReactLynx renderer for A2UI v0.9. It provides ``, `MessageStore`, catalog APIs, built-in components, and protocol helpers. |
+| `genui a2ui` | Build-time command for generating catalog artifacts from TypeScript contracts and A2UI system prompts for your agent. |
| Your agent service | A backend you own. It receives user prompts/actions, calls a model with the A2UI prompt and catalog, validates output, and returns A2UI. |
| Your transport implementation | Client code that calls your agent service, handles REST or streaming responses, pushes messages into `MessageStore`, and forwards actions. |
@@ -119,12 +119,12 @@ subscribes to it and updates the rendered surface as messages arrive.
## Quickstart
-In your ReactLynx app, install the renderer package and keep the CLI as an
-`npx` command. The CLI requires Node.js 22 or newer.
+In your ReactLynx app, install the GenUI package. The CLI requires Node.js 22
+or newer and is exposed by the same package.
```sh
-pnpm add @lynx-js/a2ui-reactlynx
-npx @lynx-js/a2ui-cli --help
+pnpm add @lynx-js/genui
+genui a2ui --help
```
The rest of the flow is app-local: define catalog-facing component contracts,
@@ -167,7 +167,7 @@ ProductTile.displayName = 'ProductTile';
Generate a schema for the agent:
```sh
-npx @lynx-js/a2ui-cli generate catalog --catalog-dir src/catalog --out-dir dist/catalog
+genui a2ui generate catalog --catalog-dir src/catalog --out-dir dist/catalog
```
Then pair the component with its manifest:
@@ -180,12 +180,12 @@ import {
createMessageStore,
defineCatalog,
serializeCatalog,
-} from '@lynx-js/a2ui-reactlynx';
-import buttonManifest from '@lynx-js/a2ui-reactlynx/catalog/Button/catalog.json'
+} from '@lynx-js/genui/a2ui';
+import buttonManifest from '@lynx-js/genui/a2ui/catalog/Button/catalog.json'
with { type: 'json' };
-import columnManifest from '@lynx-js/a2ui-reactlynx/catalog/Column/catalog.json'
+import columnManifest from '@lynx-js/genui/a2ui/catalog/Column/catalog.json'
with { type: 'json' };
-import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json'
+import textManifest from '@lynx-js/genui/a2ui/catalog/Text/catalog.json'
with { type: 'json' };
import productTileManifest from './dist/catalog/ProductTile/catalog.json'
with { type: 'json' };
@@ -228,22 +228,22 @@ it when you want repeatable artifacts instead of hand-maintained JSON:
Run the published CLI package through `npx`:
```sh
-npx @lynx-js/a2ui-cli generate catalog \
+genui a2ui generate catalog \
--catalog-dir src/catalog \
--source src/functions \
--out-dir dist/catalog
-npx @lynx-js/a2ui-cli generate prompt \
+genui a2ui generate prompt \
--catalog-dir dist/catalog \
--catalog-id https://example.com/catalogs/custom/v1/catalog.json \
--out dist/a2ui-system-prompt.txt
```
When your build already produces TypeDoc JSON, keep the same
-`npx @lynx-js/a2ui-cli` command prefix and pass that file to `generate catalog`:
+`genui a2ui` command prefix and pass that file to `generate catalog`:
```sh
-npx @lynx-js/a2ui-cli generate catalog \
+genui a2ui generate catalog \
--typedoc-json typedoc.json \
--out-dir dist/catalog
```
@@ -302,7 +302,7 @@ artifacts with your app package so agent and client deployments stay in sync.
Your agent service is a backend route in your product, not browser code. It
should:
-- Load the A2UI system prompt generated by `npx @lynx-js/a2ui-cli generate
+- Load the A2UI system prompt generated by `genui a2ui generate
prompt`.
- Add conversation history, user intent, and any product state the model needs.
- Call your model provider from the server.
@@ -398,8 +398,8 @@ import {
Column,
Text,
createMessageStore,
-} from '@lynx-js/a2ui-reactlynx';
-import type { UserActionPayload } from '@lynx-js/a2ui-reactlynx';
+} from '@lynx-js/genui/a2ui';
+import type { UserActionPayload } from '@lynx-js/genui/a2ui';
const store = createMessageStore();
const catalogs = [Text, Column, Button];
@@ -485,7 +485,7 @@ It should not own:
Keep the transport small and explicit:
```ts
-import type { MessageStore, UserActionPayload } from '@lynx-js/a2ui-reactlynx';
+import type { MessageStore, UserActionPayload } from '@lynx-js/genui/a2ui';
interface ConversationContext {
history: Array<{ role: 'user' | 'assistant' | 'system'; content: string }>;
diff --git a/packages/genui/a2ui/README_zh.md b/packages/genui/a2ui/README_zh.md
index 0097293418..e6ad0b3b2d 100644
--- a/packages/genui/a2ui/README_zh.md
+++ b/packages/genui/a2ui/README_zh.md
@@ -56,12 +56,12 @@ function WeatherCard(props: WeatherCardProps) {
对于正在接入 A2UI 的产品应用,真正需要关注的是这些对外使用面:
-| 使用面 | 作用 |
-| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
-| `@lynx-js/a2ui-reactlynx` | 面向 A2UI v0.9 的 ReactLynx 渲染器,提供 ``、`MessageStore`、Catalog API、内置组件和协议辅助能力。 |
-| `npx @lynx-js/a2ui-cli` | 构建期命令,用来从 TypeScript 契约生成 catalog artifacts,并为你的 Agent 生成 A2UI system prompt。 |
-| 你的 Agent 服务 | 你自己维护的后端。它接收用户 prompt/action,带着 A2UI prompt 和 Catalog 请求模型,校验输出,然后返回 A2UI messages。 |
-| 你的传输层实现 | Client 侧调用 Agent 服务的适配层,负责处理 REST 或流式响应,把 messages 写入 `MessageStore`,并转发 generated UI 中触发的 actions。 |
+| 使用面 | 作用 |
+| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
+| `@lynx-js/genui/a2ui` | 面向 A2UI v0.9 的 ReactLynx 渲染器,提供 ``、`MessageStore`、Catalog API、内置组件和协议辅助能力。 |
+| `genui a2ui` | 构建期命令,用来从 TypeScript 契约生成 catalog artifacts,并为你的 Agent 生成 A2UI system prompt。 |
+| 你的 Agent 服务 | 你自己维护的后端。它接收用户 prompt/action,带着 A2UI prompt 和 Catalog 请求模型,校验输出,然后返回 A2UI messages。 |
+| 你的传输层实现 | Client 侧调用 Agent 服务的适配层,负责处理 REST 或流式响应,把 messages 写入 `MessageStore`,并转发 generated UI 中触发的 actions。 |
## 三个核心部分
@@ -107,8 +107,8 @@ Client 负责传输和渲染。它从 Agent 获取消息,把消息写入 `Mess
在你的 ReactLynx 应用中安装渲染器包,并通过 `npx` 使用 CLI。CLI 需要 Node.js 22 或更新版本。
```sh
-pnpm add @lynx-js/a2ui-reactlynx
-npx @lynx-js/a2ui-cli --help
+pnpm add @lynx-js/genui
+genui a2ui --help
```
后续流程都发生在你的应用里:定义面向 Catalog 的组件契约,生成 catalog artifacts,把生成的 prompt 交给你的 Agent 服务,并在
@@ -149,7 +149,7 @@ ProductTile.displayName = 'ProductTile';
为 Agent 生成 schema:
```sh
-npx @lynx-js/a2ui-cli generate catalog --catalog-dir src/catalog --out-dir dist/catalog
+genui a2ui generate catalog --catalog-dir src/catalog --out-dir dist/catalog
```
然后把组件和 manifest 配对:
@@ -162,12 +162,12 @@ import {
createMessageStore,
defineCatalog,
serializeCatalog,
-} from '@lynx-js/a2ui-reactlynx';
-import buttonManifest from '@lynx-js/a2ui-reactlynx/catalog/Button/catalog.json'
+} from '@lynx-js/genui/a2ui';
+import buttonManifest from '@lynx-js/genui/a2ui/catalog/Button/catalog.json'
with { type: 'json' };
-import columnManifest from '@lynx-js/a2ui-reactlynx/catalog/Column/catalog.json'
+import columnManifest from '@lynx-js/genui/a2ui/catalog/Column/catalog.json'
with { type: 'json' };
-import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json'
+import textManifest from '@lynx-js/genui/a2ui/catalog/Text/catalog.json'
with { type: 'json' };
import productTileManifest from './dist/catalog/ProductTile/catalog.json'
with { type: 'json' };
@@ -204,22 +204,22 @@ CLI 是 React 源码和 Agent 之间的构建期桥梁。需要稳定、可重
通过 `npx` 执行公开 CLI 包:
```sh
-npx @lynx-js/a2ui-cli generate catalog \
+genui a2ui generate catalog \
--catalog-dir src/catalog \
--source src/functions \
--out-dir dist/catalog
-npx @lynx-js/a2ui-cli generate prompt \
+genui a2ui generate prompt \
--catalog-dir dist/catalog \
--catalog-id https://example.com/catalogs/custom/v1/catalog.json \
--out dist/a2ui-system-prompt.txt
```
如果你的构建流程已经产出 TypeDoc JSON,仍然使用同一个
-`npx @lynx-js/a2ui-cli` 命令前缀,把该文件传给 `generate catalog`:
+`genui a2ui` 命令前缀,把该文件传给 `generate catalog`:
```sh
-npx @lynx-js/a2ui-cli generate catalog \
+genui a2ui generate catalog \
--typedoc-json typedoc.json \
--out-dir dist/catalog
```
@@ -265,7 +265,7 @@ Catalog 编写细节:
你的 Agent 服务应该是产品自己的后端路由,而不是浏览器代码。它应该:
-- 读取 `npx @lynx-js/a2ui-cli generate prompt` 生成的 A2UI system prompt。
+- 读取 `genui a2ui generate prompt` 生成的 A2UI system prompt。
- 加入 conversation history、用户意图,以及模型需要的产品状态。
- 在服务端请求模型供应商。
- 校验或修复模型输出,再把 A2UI messages 返回给 Client。
@@ -355,8 +355,8 @@ import {
Column,
Text,
createMessageStore,
-} from '@lynx-js/a2ui-reactlynx';
-import type { UserActionPayload } from '@lynx-js/a2ui-reactlynx';
+} from '@lynx-js/genui/a2ui';
+import type { UserActionPayload } from '@lynx-js/genui/a2ui';
const store = createMessageStore();
const catalogs = [Text, Column, Button];
@@ -438,7 +438,7 @@ GenUI 不限定传输方式。协议消息可以通过 REST、SSE、WebSocket、
让传输层保持小而明确:
```ts
-import type { MessageStore, UserActionPayload } from '@lynx-js/a2ui-reactlynx';
+import type { MessageStore, UserActionPayload } from '@lynx-js/genui/a2ui';
interface ConversationContext {
history: Array<{ role: 'user' | 'assistant' | 'system'; content: string }>;
diff --git a/packages/genui/a2ui/package.json b/packages/genui/a2ui/package.json
index abff77270f..adcfa1898d 100644
--- a/packages/genui/a2ui/package.json
+++ b/packages/genui/a2ui/package.json
@@ -1,5 +1,5 @@
{
- "name": "@lynx-js/a2ui-reactlynx",
+ "name": "@lynx-js/genui-a2ui",
"version": "0.0.0",
"private": true,
"license": "Apache-2.0",
@@ -133,7 +133,7 @@
"types": "./dist/index.d.ts",
"scripts": {
"build": "tsc --project tsconfig.build.json && npm run build:catalog",
- "build:catalog": "a2ui-cli generate catalog --catalog-dir src/catalog --out-dir dist/catalog",
+ "build:catalog": "genui a2ui generate catalog --catalog-dir src/catalog --out-dir dist/catalog && node scripts/writeCatalogManifestIndex.js",
"test": "rstest"
},
"dependencies": {
@@ -141,7 +141,7 @@
"@preact/signals": "^2.5.1"
},
"devDependencies": {
- "@lynx-js/a2ui-cli": "workspace:*",
+ "@lynx-js/genui-cli": "workspace:*",
"@lynx-js/lynx-ui": "^3.133.0",
"@lynx-js/react": "workspace:*",
"@lynx-js/types": "3.7.0",
diff --git a/packages/genui/a2ui/scripts/writeCatalogManifestIndex.js b/packages/genui/a2ui/scripts/writeCatalogManifestIndex.js
new file mode 100644
index 0000000000..456afc7665
--- /dev/null
+++ b/packages/genui/a2ui/scripts/writeCatalogManifestIndex.js
@@ -0,0 +1,39 @@
+// Copyright 2026 The Lynx Authors. All rights reserved.
+// Licensed under the Apache License Version 2.0 that can be found in the
+// LICENSE file in the root directory of this source tree.
+import fs from 'node:fs';
+import path from 'node:path';
+
+const catalogDir = path.resolve('dist/catalog');
+const indexPath = path.join(catalogDir, 'index.js');
+const marker = 'export const catalogManifests = {};';
+
+const manifests = {};
+for (const entry of fs.readdirSync(catalogDir, { withFileTypes: true })) {
+ if (!entry.isDirectory() || entry.name === 'functions') continue;
+
+ const manifestPath = path.join(catalogDir, entry.name, 'catalog.json');
+ if (!fs.existsSync(manifestPath)) continue;
+
+ manifests[entry.name] = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
+}
+
+const source = fs.readFileSync(indexPath, 'utf8');
+const replacement = `export const catalogManifests = ${
+ JSON.stringify(manifests, null, 2)
+};\n`;
+const generatedManifestRe =
+ /export const catalogManifests = [\s\S]*?;\n+(?=\/\/ Per-component re-exports|export \{ Button \})/;
+const hasGeneratedManifest = generatedManifestRe.test(source);
+
+if (!source.includes(marker) && !hasGeneratedManifest) {
+ throw new Error(
+ `[a2ui] Could not find catalog manifest marker in ${indexPath}.`,
+ );
+}
+
+const nextSource = source.includes(marker)
+ ? source.replace(marker, replacement)
+ : source.replace(generatedManifestRe, replacement);
+
+fs.writeFileSync(indexPath, nextSource);
diff --git a/packages/genui/a2ui/src/catalog/Button/index.tsx b/packages/genui/a2ui/src/catalog/Button/index.tsx
index 3ee11b6649..0c1bcf4819 100644
--- a/packages/genui/a2ui/src/catalog/Button/index.tsx
+++ b/packages/genui/a2ui/src/catalog/Button/index.tsx
@@ -1,7 +1,7 @@
// Copyright 2026 The Lynx Authors. All rights reserved.
// Licensed under the Apache License Version 2.0 that can be found in the
// LICENSE file in the root directory of this source tree.
-import { A2UIRenderer } from '../../react/A2UIRenderer.jsx';
+import { A2UIRenderer } from '../../react/A2UIRenderer.js';
import { useChecks } from '../../react/useChecks.js';
import type { CheckLike } from '../../react/useChecks.js';
import type { GenericComponentProps } from '../../store/types.js';
diff --git a/packages/genui/a2ui/src/catalog/Card/index.tsx b/packages/genui/a2ui/src/catalog/Card/index.tsx
index 169495244d..d2cf6b25e2 100644
--- a/packages/genui/a2ui/src/catalog/Card/index.tsx
+++ b/packages/genui/a2ui/src/catalog/Card/index.tsx
@@ -1,7 +1,7 @@
// Copyright 2026 The Lynx Authors. All rights reserved.
// Licensed under the Apache License Version 2.0 that can be found in the
// LICENSE file in the root directory of this source tree.
-import { NodeRenderer } from '../../react/A2UIRenderer.jsx';
+import { NodeRenderer } from '../../react/A2UIRenderer.js';
import type { GenericComponentProps } from '../../store/types.js';
import '../../../styles/catalog/Card.css';
diff --git a/packages/genui/a2ui/src/catalog/Column/index.tsx b/packages/genui/a2ui/src/catalog/Column/index.tsx
index ec815535ca..ee50dfc0c8 100644
--- a/packages/genui/a2ui/src/catalog/Column/index.tsx
+++ b/packages/genui/a2ui/src/catalog/Column/index.tsx
@@ -1,7 +1,7 @@
// Copyright 2026 The Lynx Authors. All rights reserved.
// Licensed under the Apache License Version 2.0 that can be found in the
// LICENSE file in the root directory of this source tree.
-import { NodeRenderer } from '../../react/A2UIRenderer.jsx';
+import { NodeRenderer } from '../../react/A2UIRenderer.js';
import { useDataBinding } from '../../react/useDataBinding.js';
import type {
ComponentInstance,
diff --git a/packages/genui/a2ui/src/catalog/List/index.tsx b/packages/genui/a2ui/src/catalog/List/index.tsx
index e458b76285..d57d62c98f 100755
--- a/packages/genui/a2ui/src/catalog/List/index.tsx
+++ b/packages/genui/a2ui/src/catalog/List/index.tsx
@@ -3,7 +3,7 @@
// LICENSE file in the root directory of this source tree.
import type * as v0_9 from '@a2ui/web_core/v0_9';
-import { NodeRenderer } from '../../react/A2UIRenderer.jsx';
+import { NodeRenderer } from '../../react/A2UIRenderer.js';
import { useDataBinding } from '../../react/useDataBinding.js';
import type { GenericComponentProps } from '../../store/types.js';
diff --git a/packages/genui/a2ui/src/catalog/Modal/index.tsx b/packages/genui/a2ui/src/catalog/Modal/index.tsx
index 0ed6f72125..cc89682b4a 100644
--- a/packages/genui/a2ui/src/catalog/Modal/index.tsx
+++ b/packages/genui/a2ui/src/catalog/Modal/index.tsx
@@ -9,7 +9,7 @@ import {
} from '@lynx-js/lynx-ui';
import { useState } from '@lynx-js/react';
-import { NodeRenderer } from '../../react/A2UIRenderer.jsx';
+import { NodeRenderer } from '../../react/A2UIRenderer.js';
import type {
ComponentInstance,
GenericComponentProps,
diff --git a/packages/genui/a2ui/src/catalog/README.md b/packages/genui/a2ui/src/catalog/README.md
index 1d697e43fd..9b4e1fc651 100644
--- a/packages/genui/a2ui/src/catalog/README.md
+++ b/packages/genui/a2ui/src/catalog/README.md
@@ -18,12 +18,7 @@ the protocol name comes from `displayName ?? component.name`.
> using the tuple form below — the manifest key is authoritative.
```tsx
-import {
- A2UI,
- Text,
- Button,
- createMessageStore,
-} from '@lynx-js/a2ui-reactlynx';
+import { A2UI, Text, Button, createMessageStore } from '@lynx-js/genui/a2ui';
const store = createMessageStore();
@@ -51,8 +46,8 @@ If you want `serializeCatalog(...)` to emit JSON Schema for each component
JSON the extractor emitted at `dist/catalog//catalog.json`:
```tsx
-import { Text } from '@lynx-js/a2ui-reactlynx/catalog/Text';
-import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json'
+import { Text } from '@lynx-js/genui/a2ui/catalog/Text';
+import textManifest from '@lynx-js/genui/a2ui/catalog/Text/catalog.json'
with { type: 'json' };
const catalog = defineCatalog([[Text, textManifest]]);
@@ -86,62 +81,62 @@ import {
Tabs,
Text,
TextField,
-} from '@lynx-js/a2ui-reactlynx';
-import buttonManifest from '@lynx-js/a2ui-reactlynx/catalog/Button/catalog.json' with {
+} from '@lynx-js/genui/a2ui';
+import buttonManifest from '@lynx-js/genui/a2ui/catalog/Button/catalog.json' with {
type: 'json',
};
-import cardManifest from '@lynx-js/a2ui-reactlynx/catalog/Card/catalog.json' with {
+import cardManifest from '@lynx-js/genui/a2ui/catalog/Card/catalog.json' with {
type: 'json',
};
-import checkBoxManifest from '@lynx-js/a2ui-reactlynx/catalog/CheckBox/catalog.json' with {
+import checkBoxManifest from '@lynx-js/genui/a2ui/catalog/CheckBox/catalog.json' with {
type: 'json',
};
-import choicePickerManifest from '@lynx-js/a2ui-reactlynx/catalog/ChoicePicker/catalog.json' with {
+import choicePickerManifest from '@lynx-js/genui/a2ui/catalog/ChoicePicker/catalog.json' with {
type: 'json',
};
-import dateTimeInputManifest from '@lynx-js/a2ui-reactlynx/catalog/DateTimeInput/catalog.json' with {
+import dateTimeInputManifest from '@lynx-js/genui/a2ui/catalog/DateTimeInput/catalog.json' with {
type: 'json',
};
-import columnManifest from '@lynx-js/a2ui-reactlynx/catalog/Column/catalog.json' with {
+import columnManifest from '@lynx-js/genui/a2ui/catalog/Column/catalog.json' with {
type: 'json',
};
-import dividerManifest from '@lynx-js/a2ui-reactlynx/catalog/Divider/catalog.json' with {
+import dividerManifest from '@lynx-js/genui/a2ui/catalog/Divider/catalog.json' with {
type: 'json',
};
-import iconManifest from '@lynx-js/a2ui-reactlynx/catalog/Icon/catalog.json' with {
+import iconManifest from '@lynx-js/genui/a2ui/catalog/Icon/catalog.json' with {
type: 'json',
};
-import imageManifest from '@lynx-js/a2ui-reactlynx/catalog/Image/catalog.json' with {
+import imageManifest from '@lynx-js/genui/a2ui/catalog/Image/catalog.json' with {
type: 'json',
};
-import lineChartManifest from '@lynx-js/a2ui-reactlynx/catalog/LineChart/catalog.json' with {
+import lineChartManifest from '@lynx-js/genui/a2ui/catalog/LineChart/catalog.json' with {
type: 'json',
};
-import pieChartManifest from '@lynx-js/a2ui-reactlynx/catalog/PieChart/catalog.json' with {
+import pieChartManifest from '@lynx-js/genui/a2ui/catalog/PieChart/catalog.json' with {
type: 'json',
};
-import listManifest from '@lynx-js/a2ui-reactlynx/catalog/List/catalog.json' with {
+import listManifest from '@lynx-js/genui/a2ui/catalog/List/catalog.json' with {
type: 'json',
};
-import modalManifest from '@lynx-js/a2ui-reactlynx/catalog/Modal/catalog.json' with {
+import modalManifest from '@lynx-js/genui/a2ui/catalog/Modal/catalog.json' with {
type: 'json',
};
-import radioGroupManifest from '@lynx-js/a2ui-reactlynx/catalog/RadioGroup/catalog.json' with {
+import radioGroupManifest from '@lynx-js/genui/a2ui/catalog/RadioGroup/catalog.json' with {
type: 'json',
};
-import rowManifest from '@lynx-js/a2ui-reactlynx/catalog/Row/catalog.json' with {
+import rowManifest from '@lynx-js/genui/a2ui/catalog/Row/catalog.json' with {
type: 'json',
};
-import sliderManifest from '@lynx-js/a2ui-reactlynx/catalog/Slider/catalog.json' with {
+import sliderManifest from '@lynx-js/genui/a2ui/catalog/Slider/catalog.json' with {
type: 'json',
};
-import tabsManifest from '@lynx-js/a2ui-reactlynx/catalog/Tabs/catalog.json' with {
+import tabsManifest from '@lynx-js/genui/a2ui/catalog/Tabs/catalog.json' with {
type: 'json',
};
-import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json' with {
+import textManifest from '@lynx-js/genui/a2ui/catalog/Text/catalog.json' with {
type: 'json',
};
-import textFieldManifest from '@lynx-js/a2ui-reactlynx/catalog/TextField/catalog.json' with {
+import textFieldManifest from '@lynx-js/genui/a2ui/catalog/TextField/catalog.json' with {
type: 'json',
};
@@ -188,7 +183,7 @@ MyChart.displayName = 'MyChart';
```
If you want schema introspection for a custom component, generate the
-manifest with `@lynx-js/a2ui-catalog-extractor` against your interface and
+manifest with `@lynx-js/genui/a2ui-catalog-extractor` against your interface and
pair it the same way:
```tsx
diff --git a/packages/genui/a2ui/src/catalog/Row/index.tsx b/packages/genui/a2ui/src/catalog/Row/index.tsx
index 9e7ac4c60f..e20dea931b 100755
--- a/packages/genui/a2ui/src/catalog/Row/index.tsx
+++ b/packages/genui/a2ui/src/catalog/Row/index.tsx
@@ -1,7 +1,7 @@
// Copyright 2026 The Lynx Authors. All rights reserved.
// Licensed under the Apache License Version 2.0 that can be found in the
// LICENSE file in the root directory of this source tree.
-import { NodeRenderer } from '../../react/A2UIRenderer.jsx';
+import { NodeRenderer } from '../../react/A2UIRenderer.js';
import type { GenericComponentProps } from '../../store/types.js';
import '../../../styles/catalog/Row.css';
diff --git a/packages/genui/a2ui/src/catalog/Tabs/index.tsx b/packages/genui/a2ui/src/catalog/Tabs/index.tsx
index 10f69a2528..0957f77159 100644
--- a/packages/genui/a2ui/src/catalog/Tabs/index.tsx
+++ b/packages/genui/a2ui/src/catalog/Tabs/index.tsx
@@ -3,7 +3,7 @@
// LICENSE file in the root directory of this source tree.
import { useState } from '@lynx-js/react';
-import { NodeRenderer } from '../../react/A2UIRenderer.jsx';
+import { NodeRenderer } from '../../react/A2UIRenderer.js';
import type { GenericComponentProps, Surface } from '../../store/types.js';
import '../../../styles/catalog/Tabs.css';
diff --git a/packages/genui/a2ui/src/catalog/defineCatalog.ts b/packages/genui/a2ui/src/catalog/defineCatalog.ts
index a79c744d8d..0add07a7e7 100644
--- a/packages/genui/a2ui/src/catalog/defineCatalog.ts
+++ b/packages/genui/a2ui/src/catalog/defineCatalog.ts
@@ -12,7 +12,7 @@ import type { GenericComponentProps } from '../store/types.js';
/**
* JSON Schema fragment describing a component's props. Produced at build time
- * by `@lynx-js/a2ui-catalog-extractor` from the component's TypeScript
+ * by `@lynx-js/genui/a2ui-catalog-extractor` from the component's TypeScript
* interface marked with `@a2uiCatalog `. Optional at runtime — entries
* that ship without a schema serialize to just `{ name }`.
*/
@@ -199,10 +199,10 @@ function resolveComponentInput(input: CatalogInput): ResolvedCatalogEntry {
* so any `executeFunctionCall` after `defineCatalog` can route to them.
*
* @example
- * import { Text, Button } from '@lynx-js/a2ui-reactlynx';
- * import { defineCatalog, defineFunction } from '@lynx-js/a2ui-reactlynx';
- * import { required } from '@lynx-js/a2ui-reactlynx/functions';
- * import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json'
+ * import { Text, Button } from '@lynx-js/genui/a2ui';
+ * import { defineCatalog, defineFunction } from '@lynx-js/genui/a2ui';
+ * import { required } from '@lynx-js/genui/a2ui/functions';
+ * import textManifest from '@lynx-js/genui/a2ui/catalog/Text/catalog.json'
* with { type: 'json' };
*
* const catalog = defineCatalog([
diff --git a/packages/genui/a2ui/src/catalog/index.ts b/packages/genui/a2ui/src/catalog/index.ts
index c6c2567966..c4942874ec 100755
--- a/packages/genui/a2ui/src/catalog/index.ts
+++ b/packages/genui/a2ui/src/catalog/index.ts
@@ -1,6 +1,8 @@
// Copyright 2026 The Lynx Authors. All rights reserved.
// Licensed under the Apache License Version 2.0 that can be found in the
// LICENSE file in the root directory of this source tree.
+import type { CatalogManifest } from './defineCatalog.js';
+
export {
defineCatalog,
defineFunction,
@@ -21,26 +23,28 @@ export type {
SerializedCatalog,
} from './defineCatalog.js';
+export const catalogManifests: Record = {};
+
// Per-component re-exports so consumers can pick exactly what they need.
// Each is an independently tree-shakeable ESM re-export — pulling `Text`
// does not drag `Button` into the bundle.
-export { Button } from './Button/index.jsx';
-export { Card } from './Card/index.jsx';
-export { CheckBox } from './CheckBox/index.jsx';
-export { ChoicePicker } from './ChoicePicker/index.jsx';
-export { DateTimeInput } from './DateTimeInput/index.jsx';
-export { LineChart } from './LineChart/index.jsx';
-export { PieChart } from './PieChart/index.jsx';
-export { Column } from './Column/index.jsx';
-export { Divider } from './Divider/index.jsx';
-export { Icon } from './Icon/index.jsx';
-export { Image } from './Image/index.jsx';
-export { List } from './List/index.jsx';
-export { Modal } from './Modal/index.jsx';
-export { RadioGroup } from './RadioGroup/index.jsx';
-export { Row } from './Row/index.jsx';
-export { Slider } from './Slider/index.jsx';
-export { Tabs } from './Tabs/index.jsx';
-export { Text } from './Text/index.jsx';
-export { TextField } from './TextField/index.jsx';
+export { Button } from './Button/index.js';
+export { Card } from './Card/index.js';
+export { CheckBox } from './CheckBox/index.js';
+export { ChoicePicker } from './ChoicePicker/index.js';
+export { DateTimeInput } from './DateTimeInput/index.js';
+export { LineChart } from './LineChart/index.js';
+export { PieChart } from './PieChart/index.js';
+export { Column } from './Column/index.js';
+export { Divider } from './Divider/index.js';
+export { Icon } from './Icon/index.js';
+export { Image } from './Image/index.js';
+export { List } from './List/index.js';
+export { Modal } from './Modal/index.js';
+export { RadioGroup } from './RadioGroup/index.js';
+export { Row } from './Row/index.js';
+export { Slider } from './Slider/index.js';
+export { Tabs } from './Tabs/index.js';
+export { Text } from './Text/index.js';
+export { TextField } from './TextField/index.js';
export { DEFAULT_CHART_COLORS, escapeXml, formatValue } from './utils/chart.js';
diff --git a/packages/genui/a2ui/src/index.ts b/packages/genui/a2ui/src/index.ts
index 5ab55e7624..c1b574965b 100644
--- a/packages/genui/a2ui/src/index.ts
+++ b/packages/genui/a2ui/src/index.ts
@@ -80,7 +80,7 @@ export type {
// Built-in components — re-exported individually so apps can pick exactly
// what they need:
//
-// import { Text, Button } from '@lynx-js/a2ui-reactlynx';
+// import { Text, Button } from '@lynx-js/genui/a2ui';
//
//
// There is intentionally no all-in-one aggregate — see
diff --git a/packages/genui/a2ui/src/react/A2UI.tsx b/packages/genui/a2ui/src/react/A2UI.tsx
index a586be08b7..0b988dc31f 100644
--- a/packages/genui/a2ui/src/react/A2UI.tsx
+++ b/packages/genui/a2ui/src/react/A2UI.tsx
@@ -13,9 +13,9 @@ import {
} from '@lynx-js/react';
import type { ReactNode } from '@lynx-js/react';
-import { A2UIProvider } from './A2UIProvider.jsx';
-import { A2UIRenderer } from './A2UIRenderer.jsx';
-import type { UnsupportedInfo } from './A2UIRenderer.jsx';
+import { A2UIProvider } from './A2UIProvider.js';
+import { A2UIRenderer } from './A2UIRenderer.js';
+import type { UnsupportedInfo } from './A2UIRenderer.js';
import type { Catalog, CatalogInput } from '../catalog/defineCatalog.js';
import { defineCatalog } from '../catalog/defineCatalog.js';
import { MessageProcessor } from '../store/MessageProcessor.js';
@@ -258,7 +258,7 @@ function A2UIImpl(props: A2UIProps): import('@lynx-js/react').ReactNode {
return renderEmpty?.() ?? null;
}
- const rendererProps: import('./A2UIRenderer.jsx').A2UIRendererProps = {
+ const rendererProps: import('./A2UIRenderer.js').A2UIRendererProps = {
resource: activeResource,
};
if (className !== undefined) rendererProps.className = className;
diff --git a/packages/genui/a2ui/src/react/index.ts b/packages/genui/a2ui/src/react/index.ts
index df107c2f3e..ea9115c020 100644
--- a/packages/genui/a2ui/src/react/index.ts
+++ b/packages/genui/a2ui/src/react/index.ts
@@ -15,9 +15,9 @@
// that aggregates input validity — exporting the context now would
// pre-commit the package to a Provider-based API before there's a real
// consumer to validate it.
-export { A2UI } from './A2UI.jsx';
-export type { A2UIProps } from './A2UI.jsx';
-export { NodeRenderer } from './A2UIRenderer.jsx';
+export { A2UI } from './A2UI.js';
+export type { A2UIProps } from './A2UI.js';
+export { NodeRenderer } from './A2UIRenderer.js';
export { useAction } from './useAction.js';
export type { ActionProps } from './useAction.js';
export { useDataBinding, useResolvedProps } from './useDataBinding.js';
diff --git a/packages/genui/a2ui/src/react/useA2UIContext.ts b/packages/genui/a2ui/src/react/useA2UIContext.ts
index 2f238992ff..76936f11ba 100644
--- a/packages/genui/a2ui/src/react/useA2UIContext.ts
+++ b/packages/genui/a2ui/src/react/useA2UIContext.ts
@@ -3,8 +3,8 @@
// LICENSE file in the root directory of this source tree.
import { useContext } from '@lynx-js/react';
-import { A2UIContext } from './A2UIProvider.jsx';
-import type { A2UIInternalContext } from './A2UIProvider.jsx';
+import { A2UIContext } from './A2UIProvider.js';
+import type { A2UIInternalContext } from './A2UIProvider.js';
/**
* Internal helper used by catalog-component hooks (`useAction`, the
diff --git a/packages/genui/a2ui/tsconfig.build.json b/packages/genui/a2ui/tsconfig.build.json
index f46b0dea72..3ae81e2906 100644
--- a/packages/genui/a2ui/tsconfig.build.json
+++ b/packages/genui/a2ui/tsconfig.build.json
@@ -3,6 +3,7 @@
"compilerOptions": {
"noEmit": false,
"rootDir": "./src",
+ "jsx": "react-jsx",
"tsBuildInfoFile": "./dist/tsconfig.build.tsbuildinfo",
},
"include": ["src"],
diff --git a/packages/genui/cli/AGENTS.md b/packages/genui/cli/AGENTS.md
new file mode 100644
index 0000000000..33dcfe8547
--- /dev/null
+++ b/packages/genui/cli/AGENTS.md
@@ -0,0 +1,27 @@
+# GenUI CLI
+
+Keep this package as the single public CLI entry point for GenUI setup. It should
+orchestrate other packages instead of implementing catalog extraction, prompt
+construction, or future OpenUI workflows itself.
+
+Use namespace-first commands. A2UI commands live under `genui a2ui ...`; future
+OpenUI commands should live under `genui openui ...`.
+
+`genui a2ui generate catalog` should delegate to
+`@lynx-js/genui/a2ui-catalog-extractor`. `genui a2ui generate prompt` should
+delegate to `@lynx-js/genui/a2ui-prompt`.
+
+Do not require users to pass `--catalog-dir` for the common prompt path. A prompt
+without `--catalog-dir` should use the built-in A2UI basic catalog from
+`@lynx-js/genui/a2ui-prompt`; use `--catalog-dir` only for custom generated catalog
+artifacts.
+
+When `--catalog-dir` is provided, empty catalog directories should fail clearly
+instead of producing a prompt with an empty component catalog.
+
+The executable file is `bin/cli.js`; keep `package.json` `bin.genui`,
+`bin.genui-cli`, and compatibility `bin.a2ui-cli` pointed at that path.
+
+When testing local CLI changes, run the bin directly with Node. If testing
+changes in `@lynx-js/genui/a2ui-prompt`, rebuild that package first because this CLI
+imports it through package exports.
diff --git a/packages/genui/a2ui-cli/README.md b/packages/genui/cli/README.md
similarity index 56%
rename from packages/genui/a2ui-cli/README.md
rename to packages/genui/cli/README.md
index 33bc2db4bc..2648c3030a 100644
--- a/packages/genui/a2ui-cli/README.md
+++ b/packages/genui/cli/README.md
@@ -1,21 +1,35 @@
-# A2UI CLI
+# GenUI CLI
-`@lynx-js/a2ui-cli` provides one command line entry point for A2UI agent setup.
-It can generate catalog artifacts from TypeScript catalog definitions and build
-a system prompt for an A2UI generation agent.
+`@lynx-js/genui-cli` is the command line entry point for GenUI workflows. It is
+structured by namespace so A2UI commands can live beside future OpenUI commands
+without adding another package or binary.
## Usage
+```bash
+genui [options]
+```
+
+Available namespaces:
+
+- `a2ui`: generate A2UI catalog artifacts and system prompts.
+- `openui`: reserved for future OpenUI workflows.
+
+The package also exposes `genui-cli` as an alias. `a2ui-cli` remains available as
+a compatibility alias for existing A2UI-only scripts.
+
+## A2UI Commands
+
Generate a system prompt with the built-in A2UI basic catalog:
```bash
-npx @lynx-js/a2ui-cli generate prompt --out dist/a2ui-system-prompt.txt
+genui a2ui generate prompt --out dist/a2ui-system-prompt.txt
```
Generate catalog artifacts for a custom catalog:
```bash
-npx @lynx-js/a2ui-cli generate catalog \
+genui a2ui generate catalog \
--catalog-dir src/catalog \
--source src/functions \
--out-dir dist/catalog
@@ -24,7 +38,7 @@ npx @lynx-js/a2ui-cli generate catalog \
Generate a system prompt for a custom catalog:
```bash
-npx @lynx-js/a2ui-cli generate prompt \
+genui a2ui generate prompt \
--catalog-dir dist/catalog \
--catalog-id https://example.com/catalogs/custom/v1/catalog.json \
--out dist/a2ui-system-prompt.txt
@@ -35,12 +49,9 @@ npx @lynx-js/a2ui-cli generate prompt \
artifacts. When `--catalog-dir` is provided, the directory must contain files
like `/catalog.json`.
-## Commands
+### `genui a2ui generate catalog`
-### `generate catalog`
-
-Uses the internal `@lynx-js/a2ui-catalog-extractor` engine. Keep user-facing
-scripts on `npx @lynx-js/a2ui-cli generate catalog`.
+Delegates catalog extraction to `@lynx-js/genui/a2ui-catalog-extractor`.
Useful options:
@@ -52,9 +63,9 @@ Useful options:
- `--out-dir `: output directory for generated catalog artifacts. Defaults
to `dist/catalog`.
-### `generate prompt`
+### `genui a2ui generate prompt`
-Delegates prompt construction to `@lynx-js/a2ui-prompt`.
+Delegates prompt construction to `@lynx-js/genui/a2ui-prompt`.
Useful options:
@@ -64,3 +75,14 @@ Useful options:
Defaults to the built-in A2UI basic catalog id.
- `--out `: write the prompt to a file instead of stdout.
- `--appendix `: append extra instructions to the generated prompt.
+
+## Compatibility
+
+Existing A2UI commands still work:
+
+```bash
+a2ui-cli generate catalog --catalog-dir src/catalog --out-dir dist/catalog
+a2ui-cli generate prompt --out dist/a2ui-system-prompt.txt
+```
+
+New scripts should prefer `genui a2ui ...`.
diff --git a/packages/genui/a2ui-cli/bin/cli.js b/packages/genui/cli/bin/cli.js
similarity index 60%
rename from packages/genui/a2ui-cli/bin/cli.js
rename to packages/genui/cli/bin/cli.js
index 4b233ecae0..f6ecb62951 100755
--- a/packages/genui/a2ui-cli/bin/cli.js
+++ b/packages/genui/cli/bin/cli.js
@@ -5,15 +5,33 @@
import * as fs from 'node:fs';
import { createRequire } from 'node:module';
import * as path from 'node:path';
+import { pathToFileURL } from 'node:url';
-const usage = `Usage: a2ui-cli generate [options]
+const usage = `Usage: genui [options]
+
+Namespaces:
+ a2ui Generate A2UI catalog artifacts and system prompts.
+ openui Reserved for future OpenUI workflows.
+
+Examples:
+ genui a2ui generate catalog --catalog-dir src/catalog --out-dir dist/catalog
+ genui a2ui generate prompt --out dist/a2ui-system-prompt.txt
+`;
+
+const a2uiUsage = `Usage: genui a2ui generate [options]
Targets:
catalog Generate A2UI component and function catalog files.
prompt Generate an A2UI system prompt from catalog files.
`;
-const generateCatalogUsage = `Usage: a2ui-cli generate catalog [options]
+const openuiUsage = `Usage: genui openui [options]
+
+OpenUI CLI commands are reserved for future GenUI workflows.
+`;
+
+function createGenerateCatalogUsage(programName) {
+ return `Usage: ${programName} generate catalog [options]
Options:
--catalog-dir Directory to scan for TypeScript catalog interfaces.
@@ -29,8 +47,10 @@ Defaults:
--catalog-dir src/catalog
--out-dir dist/catalog
`;
+}
-const generatePromptUsage = `Usage: a2ui-cli generate prompt [options]
+function createGeneratePromptUsage(programName) {
+ return `Usage: ${programName} generate prompt [options]
Options:
--catalog-dir Directory containing generated catalog files. When
@@ -44,15 +64,25 @@ Options:
Defaults:
--catalog-id built-in A2UI basic catalog id
`;
+}
-try {
- process.exitCode = await runCli(process.argv.slice(2));
-} catch (error) {
- console.error(error instanceof Error ? error.message : String(error));
- process.exitCode = 1;
+if (isMain(import.meta.url)) {
+ try {
+ process.exitCode = await runCli(process.argv.slice(2), process.cwd(), {
+ binName: path.basename(process.argv[1] ?? 'genui'),
+ });
+ } catch (error) {
+ console.error(error instanceof Error ? error.message : String(error));
+ process.exitCode = 1;
+ }
}
-async function runCli(args, cwd = process.cwd()) {
+export async function runCli(args, cwd = process.cwd(), cliOptions = {}) {
+ const binName = cliOptions.binName ?? 'genui';
+ if (binName === 'a2ui-cli') {
+ return await runA2UICli(args, cwd, { programName: 'a2ui-cli' });
+ }
+
const command = args[0];
if (command === undefined || command === '--help' || command === '-h') {
console.info(usage);
@@ -62,14 +92,35 @@ async function runCli(args, cwd = process.cwd()) {
printPackageVersion();
return 0;
}
- if (command !== 'generate') {
- throw new Error(`Unknown command: ${command}`);
+
+ if (command === 'a2ui') {
+ return await runA2UICli(args.slice(1), cwd, { programName: 'genui a2ui' });
}
+ if (command === 'openui') {
+ return runOpenUICli(args.slice(1));
+ }
+
+ throw new Error(`Unknown namespace: ${command}`);
+}
+async function runA2UICli(args, cwd, options) {
+ const programName = options.programName;
+ const command = args[0];
+ if (command === undefined || command === '--help' || command === '-h') {
+ console.info(programName === 'a2ui-cli' ? legacyA2UIUsage : a2uiUsage);
+ return 0;
+ }
+ if (command === '--version' || command === '-v') {
+ printPackageVersion();
+ return 0;
+ }
+ if (command !== 'generate') {
+ throw new Error(`Unknown A2UI command: ${command}`);
+ }
const target = args[1];
const targetArgs = args.slice(2);
if (target === undefined || target === '--help' || target === '-h') {
- console.info(usage);
+ console.info(programName === 'a2ui-cli' ? legacyA2UIUsage : a2uiUsage);
return 0;
}
if (target === '--version' || target === '-v') {
@@ -78,24 +129,42 @@ async function runCli(args, cwd = process.cwd()) {
}
if (target === 'catalog') {
if (targetArgs.includes('--help') || targetArgs.includes('-h')) {
- console.info(generateCatalogUsage);
+ console.info(createGenerateCatalogUsage(programName));
return 0;
}
const { runCli: runCatalogExtractorCli } = await import(
- '@lynx-js/a2ui-catalog-extractor/cli'
+ '../../a2ui-catalog-extractor/dist/cli.js'
);
return await runCatalogExtractorCli(targetArgs, cwd);
}
if (target === 'prompt') {
- return runGeneratePromptCli(targetArgs, cwd);
+ return runGeneratePromptCli(targetArgs, cwd, { programName });
}
throw new Error(`Unknown generate target: ${target}`);
}
-async function runGeneratePromptCli(args, cwd = process.cwd()) {
+const legacyA2UIUsage = a2uiUsage.replaceAll('genui a2ui', 'a2ui-cli');
+
+function runOpenUICli(args) {
+ const command = args[0];
+ if (command === undefined || command === '--help' || command === '-h') {
+ console.info(openuiUsage);
+ return 0;
+ }
+ if (command === '--version' || command === '-v') {
+ printPackageVersion();
+ return 0;
+ }
+ throw new Error(
+ `Unknown OpenUI command: ${command}. OpenUI CLI commands are not available yet.`,
+ );
+}
+
+async function runGeneratePromptCli(args, cwd, cliOptions) {
+ const programName = cliOptions.programName;
const options = parseGeneratePromptArgs(args);
if (options.help) {
- console.info(generatePromptUsage);
+ console.info(createGeneratePromptUsage(programName));
return 0;
}
if (options.version) {
@@ -108,7 +177,7 @@ async function runGeneratePromptCli(args, cwd = process.cwd()) {
BASIC_CATALOG_ID,
buildA2UISystemPrompt,
readA2UICatalogFromDirectory,
- } = await import('@lynx-js/a2ui-prompt');
+ } = await import('../../a2ui-prompt/dist/index.js');
const catalog = options.catalogDir
? readA2UICatalogFromDirectory({
catalogDir: options.catalogDir,
@@ -120,7 +189,7 @@ async function runGeneratePromptCli(args, cwd = process.cwd()) {
: undefined);
if (options.catalogDir && catalog && isEmptyCatalog(catalog)) {
throw new Error(
- `[a2ui-cli] No components or functions found in generated catalog directory: ${options.catalogDir}`,
+ `[${programName}] No components or functions found in generated catalog directory: ${options.catalogDir}`,
);
}
const systemPrompt = buildA2UISystemPrompt({
@@ -195,3 +264,11 @@ function printPackageVersion() {
const packageJson = require('../package.json');
console.info(packageJson.version);
}
+
+function isMain(moduleUrl) {
+ if (process.argv[1] === undefined) {
+ return false;
+ }
+
+ return moduleUrl === pathToFileURL(fs.realpathSync(process.argv[1])).href;
+}
diff --git a/packages/genui/cli/package.json b/packages/genui/cli/package.json
new file mode 100644
index 0000000000..b5daf31d63
--- /dev/null
+++ b/packages/genui/cli/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "@lynx-js/genui-cli",
+ "version": "0.0.0",
+ "private": true,
+ "description": "CLI for GenUI workflows.",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/lynx-family/lynx-stack.git",
+ "directory": "packages/genui/cli"
+ },
+ "license": "Apache-2.0",
+ "type": "module",
+ "bin": {
+ "a2ui-cli": "./bin/cli.js",
+ "genui": "./bin/cli.js",
+ "genui-cli": "./bin/cli.js"
+ },
+ "files": [
+ "bin",
+ "README.md"
+ ],
+ "dependencies": {
+ "@lynx-js/genui-a2ui-catalog-extractor": "workspace:*",
+ "@lynx-js/genui-a2ui-prompt": "workspace:*"
+ },
+ "engines": {
+ "node": ">=22"
+ }
+}
diff --git a/packages/genui/index.ts b/packages/genui/index.ts
new file mode 100644
index 0000000000..0ab8d46522
--- /dev/null
+++ b/packages/genui/index.ts
@@ -0,0 +1,114 @@
+// Copyright 2026 The Lynx Authors. All rights reserved.
+// Licensed under the Apache License Version 2.0 that can be found in the
+// LICENSE file in the root directory of this source tree.
+
+export {
+ A2UI,
+ NodeRenderer,
+ useAction,
+ useChecks,
+ useDataBinding,
+ useResolvedProps,
+} from '@lynx-js/genui/a2ui/react';
+export type {
+ A2UIProps,
+ ActionProps,
+ CheckLike,
+} from '@lynx-js/genui/a2ui/react';
+export {
+ createFallbackMessagesFromPlainText,
+ createMessageStore,
+ createResource,
+ createTextCardMessages,
+ executeFunctionCall,
+ FunctionRegistry,
+ functionRegistry,
+ isDataBinding,
+ isFunctionCall,
+ MessageProcessor,
+ normalizePayloadToMessages,
+ prepareMessagesForProcessing,
+ resolveDynamicValue,
+ resolveFunctionArguments,
+ SignalStore,
+} from '@lynx-js/genui/a2ui/store';
+export type {
+ A2UIClientEventMessage,
+ A2UIEvent,
+ ComponentInstance,
+ FunctionCallContext,
+ FunctionEntry,
+ FunctionImpl,
+ GenericComponentProps,
+ MessageStore,
+ MessageStoreOptions,
+ RawResource,
+ ResolveFunctionOptions,
+ Resource,
+ ResourceInfo,
+ ResourceStatus,
+ ServerToClientMessage,
+ Surface,
+ SurfaceId,
+ UserActionPayload,
+} from '@lynx-js/genui/a2ui/store';
+export {
+ basicFunctions,
+ registerBasicFunctions,
+} from '@lynx-js/genui/a2ui/functions';
+export * from '@lynx-js/genui/openui';
+export {
+ A2UI_PROTOCOL_VERSION,
+ A2UI_SYSTEM_PROMPT,
+ BASIC_CATALOG,
+ BASIC_CATALOG_EXAMPLES,
+ BASIC_CATALOG_ID,
+ buildA2UISystemPrompt,
+ createA2UICatalogFromManifests,
+ readA2UICatalogFromDirectory,
+ renderCatalogReference,
+} from '@lynx-js/genui/a2ui-prompt';
+export type {
+ A2UICatalog as A2UIPromptCatalog,
+ A2UIComponentProp,
+ A2UIComponentSpec,
+ A2UIExample,
+ A2UIFunctionSpec,
+ BuildSystemPromptOptions,
+ JsonSchema as A2UIPromptJsonSchema,
+ ReadA2UICatalogDirectoryOptions,
+} from '@lynx-js/genui/a2ui-prompt';
+export {
+ createA2UICatalog,
+ extractCatalogComponents,
+ extractCatalogComponentsFromTypeDocJson,
+ extractCatalogComponentsFromTypeDocProject,
+ extractCatalogFunctions,
+ extractCatalogFunctionsFromTypeDocJson,
+ extractCatalogFunctionsFromTypeDocProject,
+ findCatalogSourceFiles,
+ writeCatalogArtifacts,
+ writeCatalogComponents,
+ writeCatalogFunctionDefinitions,
+ writeCatalogFunctions,
+ writeComponentCatalogs,
+} from '@lynx-js/genui/a2ui-catalog-extractor';
+export type {
+ A2UICatalog as ExtractedA2UICatalog,
+ CatalogArtifacts,
+ CatalogComponent as ExtractedCatalogComponent,
+ CatalogFunction,
+ ExtractCatalogFromTypeDocOptions,
+ ExtractCatalogOptions,
+ FunctionDefinition,
+ JsonSchema as ExtractedJsonSchema,
+ TypeDocComment,
+ TypeDocCommentDisplayPart,
+ TypeDocCommentTag,
+ TypeDocProject,
+ TypeDocReflection,
+ TypeDocSignature,
+ TypeDocSource,
+ TypeDocType,
+ WriteComponentCatalogOptions,
+} from '@lynx-js/genui/a2ui-catalog-extractor';
diff --git a/packages/genui/openui/README.md b/packages/genui/openui/README.md
index 0f8969cceb..6a2b8e201f 100644
--- a/packages/genui/openui/README.md
+++ b/packages/genui/openui/README.md
@@ -1,4 +1,4 @@
-# @lynx-js/openui-reactlynx
+# @lynx-js/genui/openui
ReactLynx renderer for the [OpenUI DSL](https://www.openui.com/). Parses
OpenUI functional notation into a renderable tree and renders it via a
@@ -17,9 +17,9 @@ This package includes:
## Exports
-- `@lynx-js/openui-reactlynx`: `createOpenUiLibrary`, `defineComponent`,
+- `@lynx-js/genui/openui`: `createOpenUiLibrary`, `defineComponent`,
`OpenUiRenderer`, parser utilities, and all core types.
-- `@lynx-js/openui-reactlynx/catalog`: re-exports of built-in catalog
+- `@lynx-js/genui/openui/catalog`: re-exports of built-in catalog
components for tree-shake-friendly subpath access.
## Installation
@@ -29,7 +29,7 @@ Make sure your app provides the peer dependencies:
- `@lynx-js/react`
```bash
-pnpm add @lynx-js/openui-reactlynx
+pnpm add @lynx-js/genui
```
## Quick Start
@@ -44,8 +44,8 @@ import {
createOpenUiLibrary,
createStreamingParser,
OpenUiRenderer,
-} from '@lynx-js/openui-reactlynx';
-import type { ParseResult } from '@lynx-js/openui-reactlynx';
+} from '@lynx-js/genui/openui';
+import type { ParseResult } from '@lynx-js/genui/openui';
import { useEffect, useMemo, useState } from '@lynx-js/react';
const library = createOpenUiLibrary();
@@ -95,8 +95,8 @@ import {
createOpenUiLibrary,
createStreamingParser,
OpenUiRenderer,
-} from '@lynx-js/openui-reactlynx';
-import type { ParseResult } from '@lynx-js/openui-reactlynx';
+} from '@lynx-js/genui/openui';
+import type { ParseResult } from '@lynx-js/genui/openui';
import { useEffect, useMemo, useRef, useState } from '@lynx-js/react';
const CHUNK_SIZE = 8;
@@ -151,10 +151,7 @@ object. Provided `components` and `componentGroups` are **merged** with
the built-in defaults (appended after the defaults):
```tsx
-import {
- createOpenUiLibrary,
- defineComponent,
-} from '@lynx-js/openui-reactlynx';
+import { createOpenUiLibrary, defineComponent } from '@lynx-js/genui/openui';
import { z } from 'zod/v4';
const MyBanner = defineComponent({
diff --git a/packages/genui/openui/package.json b/packages/genui/openui/package.json
index f8ff189b68..9e8e10f52c 100644
--- a/packages/genui/openui/package.json
+++ b/packages/genui/openui/package.json
@@ -1,6 +1,7 @@
{
- "name": "@lynx-js/openui-reactlynx",
+ "name": "@lynx-js/genui-openui",
"version": "0.0.1",
+ "private": true,
"repository": {
"type": "git",
"url": "git+https://github.com/lynx-family/lynx-stack.git",
diff --git a/packages/genui/openui/src/core/renderer.tsx b/packages/genui/openui/src/core/renderer.tsx
index cfa054c7ab..1af2a30699 100644
--- a/packages/genui/openui/src/core/renderer.tsx
+++ b/packages/genui/openui/src/core/renderer.tsx
@@ -25,8 +25,6 @@ import type { Library, RenderOutput } from './library.js';
import { keyFrom } from './utils.js';
import type { LegacyActionConfig } from '../catalog/Action/index.jsx';
-import './renderer.css';
-
export type { Library, RenderOutput };
interface FieldEntry {
diff --git a/packages/genui/package.json b/packages/genui/package.json
new file mode 100644
index 0000000000..593e6a8d2d
--- /dev/null
+++ b/packages/genui/package.json
@@ -0,0 +1,127 @@
+{
+ "name": "@lynx-js/genui",
+ "version": "0.0.1",
+ "description": "Generative UI for Lynx.",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/lynx-family/lynx-stack.git",
+ "directory": "packages/genui"
+ },
+ "license": "Apache-2.0",
+ "sideEffects": [
+ "**/*.css"
+ ],
+ "type": "module",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.js"
+ },
+ "./a2ui/styles/theme.css": "./a2ui/styles/theme.css",
+ "./a2ui": {
+ "types": "./a2ui/dist/index.d.ts",
+ "default": "./a2ui/dist/index.js"
+ },
+ "./a2ui/0.9": {
+ "types": "./a2ui/dist/index.d.ts",
+ "default": "./a2ui/dist/index.js"
+ },
+ "./a2ui/store": {
+ "types": "./a2ui/dist/store/index.d.ts",
+ "default": "./a2ui/dist/store/index.js"
+ },
+ "./a2ui/catalog": {
+ "types": "./a2ui/dist/catalog/index.d.ts",
+ "default": "./a2ui/dist/catalog/index.js"
+ },
+ "./a2ui/react": {
+ "types": "./a2ui/dist/react/index.d.ts",
+ "default": "./a2ui/dist/react/index.js"
+ },
+ "./a2ui/functions": {
+ "types": "./a2ui/dist/functions/index.d.ts",
+ "default": "./a2ui/dist/functions/index.js"
+ },
+ "./genui-cli": "./cli/bin/cli.js",
+ "./a2ui-prompt": {
+ "types": "./a2ui-prompt/dist/index.d.ts",
+ "default": "./a2ui-prompt/dist/index.js"
+ },
+ "./a2ui-catalog-extractor": {
+ "types": "./a2ui-catalog-extractor/dist/index.d.ts",
+ "default": "./a2ui-catalog-extractor/dist/index.js"
+ },
+ "./a2ui-catalog-extractor/cli": {
+ "types": "./a2ui-catalog-extractor/dist/cli.d.ts",
+ "default": "./a2ui-catalog-extractor/dist/cli.js"
+ },
+ "./a2ui-catalog-extractor/skill": "./a2ui-catalog-extractor/skills/a2ui-catalog-extractor/SKILL.md",
+ "./openui": {
+ "types": "./openui/dist/core/index.d.ts",
+ "default": "./openui/dist/core/index.js"
+ },
+ "./openui/catalog": {
+ "types": "./openui/dist/catalog/index.d.ts",
+ "default": "./openui/dist/catalog/index.js"
+ },
+ "./openui/styles/renderer.css": "./openui/dist/core/renderer.css"
+ },
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "bin": {
+ "a2ui-catalog-extractor": "./a2ui-catalog-extractor/bin/a2ui-catalog-extractor.js",
+ "a2ui-cli": "./cli/bin/cli.js",
+ "genui": "./cli/bin/cli.js",
+ "genui-cli": "./cli/bin/cli.js"
+ },
+ "files": [
+ "index.ts",
+ "dist",
+ "a2ui/dist",
+ "a2ui/styles",
+ "a2ui/README.md",
+ "cli/bin",
+ "cli/README.md",
+ "a2ui-prompt/dist",
+ "a2ui-prompt/README.md",
+ "a2ui-catalog-extractor/bin",
+ "a2ui-catalog-extractor/dist",
+ "a2ui-catalog-extractor/skills",
+ "a2ui-catalog-extractor/README.md",
+ "openui/dist",
+ "openui/README.md"
+ ],
+ "scripts": {
+ "build": "pnpm run clean && pnpm --dir a2ui-catalog-extractor build && pnpm --dir a2ui-prompt build && pnpm --dir openui build && pnpm --dir a2ui build && tsc --project tsconfig.build.json",
+ "clean": "node -e \"const fs=require('node:fs'); for (const path of ['dist','a2ui/dist','a2ui/tsconfig.build.tsbuildinfo','a2ui-catalog-extractor/dist','a2ui-prompt/dist','openui/dist','openui/tsconfig.build.tsbuildinfo']) fs.rmSync(path,{recursive:true,force:true});\""
+ },
+ "dependencies": {
+ "@a2ui/web_core": "0.9.1",
+ "@openuidev/lang-core": "^0.2.4",
+ "@preact/signals": "^2.5.1",
+ "typedoc": "^0.28.19",
+ "zod": "^3.25.76"
+ },
+ "devDependencies": {
+ "@lynx-js/genui-a2ui": "workspace:*",
+ "@lynx-js/genui-a2ui-catalog-extractor": "workspace:*",
+ "@lynx-js/genui-a2ui-prompt": "workspace:*",
+ "@lynx-js/genui-cli": "workspace:*",
+ "@lynx-js/genui-openui": "workspace:*"
+ },
+ "peerDependencies": {
+ "@lynx-js/lynx-ui": "^3.133.0",
+ "@lynx-js/react": "^0.121.0"
+ },
+ "peerDependenciesMeta": {
+ "@lynx-js/lynx-ui": {
+ "optional": true
+ }
+ },
+ "engines": {
+ "node": ">=22"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/genui/tsconfig.build.json b/packages/genui/tsconfig.build.json
new file mode 100644
index 0000000000..4fc1c3e0ec
--- /dev/null
+++ b/packages/genui/tsconfig.build.json
@@ -0,0 +1,10 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "noEmit": false,
+ "declaration": true,
+ "outDir": "./dist",
+ "rootDir": ".",
+ },
+ "include": ["index.ts"],
+}
diff --git a/packages/genui/tsconfig.json b/packages/genui/tsconfig.json
index ad7396c501..9a2dd5d6d6 100644
--- a/packages/genui/tsconfig.json
+++ b/packages/genui/tsconfig.json
@@ -7,14 +7,6 @@
"lib": ["DOM", "ESNext"],
"moduleResolution": "Bundler",
},
- "references": [
- /** packages-start */
- { "path": "./a2ui-catalog-extractor/tsconfig.json" },
- { "path": "./a2ui-prompt/tsconfig.json" },
- { "path": "./a2ui/tsconfig.build.json" },
- { "path": "./openui/tsconfig.json" },
- { "path": "./ui-judge/tsconfig.json" },
- /** packages-end */
- ],
+ "references": [],
"include": [],
}
diff --git a/packages/genui/turbo.json b/packages/genui/turbo.json
new file mode 100644
index 0000000000..6c7c8c96e9
--- /dev/null
+++ b/packages/genui/turbo.json
@@ -0,0 +1,40 @@
+{
+ "$schema": "https://turbo.build/schema.json",
+ "extends": ["//"],
+ "tasks": {
+ "build": {
+ "inputs": [
+ "index.ts",
+ "package.json",
+ "tsconfig.json",
+ "tsconfig.build.json",
+ "a2ui/src/**",
+ "a2ui/styles/**",
+ "a2ui/package.json",
+ "a2ui/tsconfig.json",
+ "a2ui/tsconfig.build.json",
+ "a2ui-catalog-extractor/src/**",
+ "a2ui-catalog-extractor/bin/**",
+ "a2ui-catalog-extractor/package.json",
+ "a2ui-catalog-extractor/tsconfig.json",
+ "a2ui-catalog-extractor/tsconfig.build.json",
+ "a2ui-prompt/src/**",
+ "a2ui-prompt/package.json",
+ "a2ui-prompt/rslib.config.ts",
+ "a2ui-prompt/tsconfig.json",
+ "a2ui-prompt/tsconfig.build.json",
+ "openui/src/**",
+ "openui/package.json",
+ "openui/tsconfig.json",
+ "openui/tsconfig.build.json"
+ ],
+ "outputs": [
+ "dist/**",
+ "a2ui/dist/**",
+ "a2ui-catalog-extractor/dist/**",
+ "a2ui-prompt/dist/**",
+ "openui/dist/**"
+ ]
+ }
+ }
+}
diff --git a/packages/genui/ui-judge/package.json b/packages/genui/ui-judge/package.json
index 8e1af0d382..f875fe253b 100644
--- a/packages/genui/ui-judge/package.json
+++ b/packages/genui/ui-judge/package.json
@@ -20,13 +20,16 @@
],
"scripts": {
"build": "rslib build",
- "test": "playwright test"
+ "test": "pnpm --dir ../a2ui-catalog-extractor build && pnpm --dir ../a2ui build && playwright test"
},
"dependencies": {
+ "@lynx-js/genui": "workspace:*",
"@midscene/web": "^1.8.0",
"@playwright/test": "^1.58.2"
},
"devDependencies": {
+ "@lynx-js/genui-a2ui": "workspace:*",
+ "@lynx-js/genui-a2ui-catalog-extractor": "workspace:*",
"@types/node": "^24.10.13"
},
"engines": {
diff --git a/packages/genui/ui-judge/tests/helpers/playground-preview-server.ts b/packages/genui/ui-judge/tests/helpers/playground-preview-server.ts
index 41e4e63287..1b3dcffa4a 100644
--- a/packages/genui/ui-judge/tests/helpers/playground-preview-server.ts
+++ b/packages/genui/ui-judge/tests/helpers/playground-preview-server.ts
@@ -152,7 +152,7 @@ function assertPlaygroundPrerequisites(): void {
const formatted = missing.map((artifact) => `- ${artifact}`).join('\n');
throw new Error(
- `Missing A2UI catalog artifacts required by the playground preview server:\n${formatted}\n\nRun \`pnpm --filter @lynx-js/a2ui-reactlynx build\` before starting @lynx-js/ui-judge model-backed tests.`,
+ `Missing A2UI catalog artifacts required by the playground preview server:\n${formatted}\n\nRun \`pnpm -C packages/genui/a2ui build\` before starting @lynx-js/ui-judge model-backed tests.`,
);
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4563f3c2fe..9774801763 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -36,6 +36,7 @@ catalogs:
version: 0.2.0
overrides:
+ '@lynx-js/react': workspace:*
'@rspack/core': 2.0.3
'@rsbuild/core>@rspack/core': 2.0.3
'@rsdoctor/rspack-plugin>@rspack/core': 2.0.3
@@ -596,6 +597,46 @@ importers:
packages/background-only: {}
+ packages/genui:
+ dependencies:
+ '@a2ui/web_core':
+ specifier: 0.9.1
+ version: 0.9.1
+ '@lynx-js/lynx-ui':
+ specifier: ^3.133.0
+ version: 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react':
+ specifier: workspace:*
+ version: link:../react
+ '@openuidev/lang-core':
+ specifier: ^0.2.4
+ version: 0.2.4(@modelcontextprotocol/sdk@1.25.2(hono@4.12.12)(zod@3.25.76))(zod@3.25.76)
+ '@preact/signals':
+ specifier: ^2.5.1
+ version: 2.5.1(preact@10.29.1)
+ typedoc:
+ specifier: ^0.28.19
+ version: 0.28.19(typescript@5.9.3)
+ zod:
+ specifier: ^3.25.76
+ version: 3.25.76
+ devDependencies:
+ '@lynx-js/genui-a2ui':
+ specifier: workspace:*
+ version: link:a2ui
+ '@lynx-js/genui-a2ui-catalog-extractor':
+ specifier: workspace:*
+ version: link:a2ui-catalog-extractor
+ '@lynx-js/genui-a2ui-prompt':
+ specifier: workspace:*
+ version: link:a2ui-prompt
+ '@lynx-js/genui-cli':
+ specifier: workspace:*
+ version: link:cli
+ '@lynx-js/genui-openui':
+ specifier: workspace:*
+ version: link:openui
+
packages/genui/a2ui:
dependencies:
'@a2ui/web_core':
@@ -605,9 +646,9 @@ importers:
specifier: ^2.5.1
version: 2.5.1(preact@10.29.1)
devDependencies:
- '@lynx-js/a2ui-cli':
+ '@lynx-js/genui-cli':
specifier: workspace:*
- version: link:../a2ui-cli
+ version: link:../cli
'@lynx-js/lynx-ui':
specifier: ^3.133.0
version: 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -637,32 +678,20 @@ importers:
specifier: ^24.10.13
version: 24.10.13
- packages/genui/a2ui-cli:
- dependencies:
- '@lynx-js/a2ui-catalog-extractor':
- specifier: workspace:*
- version: link:../a2ui-catalog-extractor
- '@lynx-js/a2ui-prompt':
- specifier: workspace:*
- version: link:../a2ui-prompt
-
packages/genui/a2ui-playground:
dependencies:
'@codemirror/lang-json':
specifier: ^6.0.2
version: 6.0.2
- '@lynx-js/a2ui-reactlynx':
+ '@lynx-js/genui':
specifier: workspace:*
- version: link:../a2ui
+ version: link:..
'@lynx-js/luna-styles':
specifier: 0.1.0
version: 0.1.0
'@lynx-js/lynx-core':
specifier: 0.1.3
version: 0.1.3
- '@lynx-js/openui-reactlynx':
- specifier: workspace:*
- version: link:../openui
'@lynx-js/react':
specifier: workspace:*
version: link:../../react
@@ -728,6 +757,15 @@ importers:
specifier: ^24.10.13
version: 24.10.13
+ packages/genui/cli:
+ dependencies:
+ '@lynx-js/genui-a2ui-catalog-extractor':
+ specifier: workspace:*
+ version: link:../a2ui-catalog-extractor
+ '@lynx-js/genui-a2ui-prompt':
+ specifier: workspace:*
+ version: link:../a2ui-prompt
+
packages/genui/openui:
dependencies:
'@openuidev/lang-core':
@@ -783,6 +821,9 @@ importers:
packages/genui/ui-judge:
dependencies:
+ '@lynx-js/genui':
+ specifier: workspace:*
+ version: link:..
'@midscene/web':
specifier: ^1.8.0
version: 1.8.0(@playwright/test@1.58.2)(playwright@1.58.2)
@@ -790,6 +831,12 @@ importers:
specifier: ^1.58.2
version: 1.58.2
devDependencies:
+ '@lynx-js/genui-a2ui':
+ specifier: workspace:*
+ version: link:../a2ui
+ '@lynx-js/genui-a2ui-catalog-extractor':
+ specifier: workspace:*
+ version: link:../a2ui-catalog-extractor
'@types/node':
specifier: ^24.10.13
version: 24.10.13
@@ -1279,7 +1326,7 @@ importers:
specifier: workspace:^
version: link:../plugin-qrcode
'@lynx-js/react':
- specifier: workspace:^
+ specifier: workspace:*
version: link:../../react
'@lynx-js/react-rsbuild-plugin':
specifier: workspace:^
@@ -2291,12 +2338,6 @@ importers:
specifier: 19.2.4
version: 19.2.4(react@19.2.4)
devDependencies:
- '@lynx-js/a2ui-cli':
- specifier: workspace:*
- version: link:../packages/genui/a2ui-cli
- '@lynx-js/a2ui-reactlynx':
- specifier: workspace:*
- version: link:../packages/genui/a2ui
'@lynx-js/chunk-loading-webpack-plugin':
specifier: workspace:*
version: link:../packages/webpack/chunk-loading-webpack-plugin
@@ -2312,6 +2353,12 @@ importers:
'@lynx-js/externals-loading-webpack-plugin':
specifier: workspace:*
version: link:../packages/webpack/externals-loading-webpack-plugin
+ '@lynx-js/genui':
+ specifier: workspace:*
+ version: link:../packages/genui
+ '@lynx-js/genui-cli':
+ specifier: workspace:*
+ version: link:../packages/genui/cli
'@lynx-js/lynx-bundle-rslib-config':
specifier: workspace:*
version: link:../packages/rspeedy/lynx-bundle-rslib-config
@@ -4005,7 +4052,7 @@ packages:
'@lynx-js/gesture-runtime@2.1.1':
resolution: {integrity: sha512-zBDOHakuePjw5wPCButExNgcllyFPGqYzqP2CWCWcQaX4gqJmCmYeRKguihyxH6ma6ExxlH/J2x5CHD91ed3bQ==}
peerDependencies:
- '@lynx-js/react': '*'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@lynx-js/internal-preact@10.29.1-20260519060144-e6da44c':
@@ -4020,161 +4067,161 @@ packages:
'@lynx-js/lynx-ui-button@3.133.0':
resolution: {integrity: sha512-JH/iD5TQawHgEweBQYmj+H5ELLNLtLbs3fCUdqvVTdsBOsg6sbUxohzFWCy0SXgvC99+GghGtKu95rD3Jadrzg==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-checkbox@3.133.0':
resolution: {integrity: sha512-iOYXrClq5ejiUeHMTIXteG63CXCMUAbSyapWgxxX568llrN+YM778tedopM5WmoCTmkuPYIYO7MEPUqRXyl3xg==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-common@3.133.0':
resolution: {integrity: sha512-gnSyc+RvqmsnOH8LJDT05O30KNFU4X0u1ymqukTeR/metW7sjKBO5mf3W7nJPSmyCtxcwU3qbnw6gV5MVB+p1Q==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-dialog@3.133.0':
resolution: {integrity: sha512-st5Pitj3qz5KUfDbpVWgI6TWQgRWUqK6l2mixphITgZaY517Hsoyj2yWOLmdqgv2pYby95ltdeB4jlA9CJJx5g==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-draggable@3.133.0':
resolution: {integrity: sha512-Qs74k+/1HGgxNtXWdAhTfuxBgydLemE4+MK4rzZJQLUgXxUAh/Cj6hEgvMwxSKbG3LTuzU/Mei2njg9oANzgMg==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-feed-list@3.133.0':
resolution: {integrity: sha512-8Q3pLVXxrcxiqR6fTFDm8z6yBHgiCQnVhblXA0ut75JnxSN7yhxFvkBWfifPZ0iHxorwQTM81KYvTXsKfCw8CQ==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-form@3.133.0':
resolution: {integrity: sha512-qye6w7sM/VJyFce324j7u5tHSXAjugkQ7BOJB9CMTUsMZ9LHVbslEq/nOzhKd8IjM96KUDdFAsPkgwNt05GQgg==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-input@3.133.0':
resolution: {integrity: sha512-adkpMXd/rYkmkEsXrcwwiiGw7kLDA4+h1qbVLfHlF2bIB9Tm40vUEKhmdQwSqMdNaNjV8Tt4+FB2TwDiXsMkhw==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-lazy-component@3.133.0':
resolution: {integrity: sha512-lH32PwEVnS3EBoz01G1tNygXwUjzitPwfWLRFXpN0SBiWsiZzlKDRUFftalbQR7ss/ydzMixYJqQeNbDAW6itA==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-list@3.133.0':
resolution: {integrity: sha512-U9pe2p7QrA+ULEJeRccu4qdcxVECpVel8aWHfx/g2SNDqEColE4sCVN+9QfYlE7G0FVJkASVaupJCHG9lrpb+g==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-overlay@3.133.0':
resolution: {integrity: sha512-wzkjF7XDUSJgQLgsKZk8iS5xMhIhxqZjGo0cZuHGXiLMuKedVhVklwEMF+4veOByHEK3C6JU8gkp36FuC4FqBg==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-popover@3.133.0':
resolution: {integrity: sha512-cwP9QXAur7bDKVhsK+BRjX/zTUruFi9gg/CeLZ/giCGIrAWCJTevQKa3Hj8nZ9H6uq+EkK8X4J18yELqODWEOQ==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-presence@3.133.0':
resolution: {integrity: sha512-SVcMrGn46JNbxegxj/mQO9cfKxO2aG5QwhxCCTo9/lDfGDT5WtPzlDLiDcJH8+7rpQLLVm0BLX1hcfoHKmlahg==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-radio-group@3.133.0':
resolution: {integrity: sha512-1Mq4BlpwRaNhoPRgsLtGU9dOIrjr7T4//KvsXFDh4pUfMmzgHSq2lWkuLTijLepJJlGyOELuISoNmK7CVej04g==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-scroll-view@3.133.0':
resolution: {integrity: sha512-M22qAdw+XrRNVw15b0TKSm+D+eLRmnd4LGT+FRnSQOR1LQwd0w6uZvqX14w+I9+mnVRYyGSl3lg76ycmFrm9MQ==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-sheet@3.133.0':
resolution: {integrity: sha512-OQHhjSgR7QXQV45lJ2fAgv0iaFE1v3ycoey9zZtoUltPipwxzvJi19OHJZCFGr8VnGdmiiMtrj1tsTQrhGPW7w==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-slider@3.133.0':
resolution: {integrity: sha512-KE9d1zH57f2uvxoZt0jisUqCrnUZ+buNyBD0EYNs62wRpkyuZg7kLeJ1DTzKiKA8+zlENL88x9kIB0kDABGcFA==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-sortable@3.133.0':
resolution: {integrity: sha512-6X+Gm5CeZQMTR0FRorpSb9sq6UHdsDcZpxqiNRYKdVPgBiSDoMci/Bp0HnV436Bi6ORg3ORv9JgDRQRFUijh1w==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-swipe-action@3.133.0':
resolution: {integrity: sha512-icz6xaY1XtGV32kisLiOprHULWj4q4p6SpASHtRYI2jHpXLO9rSueUvoOTQrieQ1kjBJqw8nRRAQp3rHfT2Q6Q==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-swiper@3.133.0':
resolution: {integrity: sha512-myXHkI7TYUvhxNV/ho4L4zu9/VgvNRYoA6w2w5MhtB4M31JLeoKxoBUJTFOHGgvRSU/Crj9FbWMUsTnsp7PZwA==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui-switch@3.133.0':
resolution: {integrity: sha512-PzNHscudM4+FYJKlQCBhHV6Lw40/yppu9AgIJzksT6oVhrge/gpf/ujzqpHWXIvX1BUk7/kx+AAovjjf3LRDpg==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/lynx-ui@3.133.0':
resolution: {integrity: sha512-IJwhaJU/sw1qgyJYbrgkTCPoH46JSbMfYok+b4e5fwr2rNxLb+aJdsnQ4ayUiXNmb+q9FizHf3YoxI3W6q2xSw==}
peerDependencies:
- '@lynx-js/react': '>=0.100.0'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
'@types/react': ^18
'@lynx-js/motion@0.0.3':
resolution: {integrity: sha512-Kujwj1grxFTPjwr3IEO4Qca5YRsoJCeTctsEaUcVFYC5Ekb52LuUavJicMqUuswzW/HrARpJw9npLSiTjfcwYQ==}
peerDependencies:
- '@lynx-js/react': '*'
+ '@lynx-js/react': workspace:*
'@lynx-js/types': '*'
peerDependenciesMeta:
'@lynx-js/types':
@@ -4186,7 +4233,7 @@ packages:
'@lynx-js/react-use@0.1.3':
resolution: {integrity: sha512-48NX1DZfIqdpcFPKR3SdI/E0D2INJzgMDtl9IK0vbqWKPgj6LgUPZN0iqIDd7Juy3in5c2bv6E9jCpoq5ONeVw==}
peerDependencies:
- '@lynx-js/react': '>=0.105.1'
+ '@lynx-js/react': workspace:*
'@lynx-js/tasm@0.0.39':
resolution: {integrity: sha512-FNIV6Cc2K0wCKOHVMfpr3M6kpIZqHHNI02GpVl+h0ClyyK44jxEO+lf58gLFD5E3o0hJ1cp3H2OBIxSUJGkPDw==}
@@ -13720,6 +13767,17 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-button@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ clsx: 2.1.1
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-checkbox@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13732,6 +13790,18 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-checkbox@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ clsx: 2.1.1
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-common@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
@@ -13743,6 +13813,17 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-common@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/react-use': 0.1.3(@lynx-js/react@packages+react)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-dialog@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13757,6 +13838,20 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-dialog@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-overlay': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-presence': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ clsx: 2.1.1
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-draggable@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13768,6 +13863,17 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-draggable@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/react-use': 0.1.3(@lynx-js/react@packages+react)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-feed-list@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
@@ -13780,6 +13886,18 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-feed-list@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-list': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-form@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13795,6 +13913,21 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-form@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-checkbox': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-input': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-radio-group': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-switch': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-input@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13806,6 +13939,17 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-input@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-scroll-view': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-lazy-component@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13816,6 +13960,16 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-lazy-component@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-list@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
@@ -13827,6 +13981,17 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-list@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-overlay@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13837,6 +14002,16 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-overlay@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-popover@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13851,6 +14026,20 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-popover@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-overlay': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-presence': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ clsx: 2.1.1
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-presence@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13862,6 +14051,17 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-presence@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ clsx: 2.1.1
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-radio-group@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13874,6 +14074,18 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-radio-group@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ clsx: 2.1.1
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-scroll-view@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
@@ -13886,6 +14098,18 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-scroll-view@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-lazy-component': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-sheet@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13902,6 +14126,22 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-sheet@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-dialog': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-overlay': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-presence': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/motion': 0.0.3(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ clsx: 2.1.1
+ transitivePeerDependencies:
+ - '@emotion/is-prop-valid'
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-slider@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13912,6 +14152,16 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-slider@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-sortable@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13923,6 +14173,17 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-sortable@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-draggable': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-swipe-action@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
@@ -13934,6 +14195,17 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-swipe-action@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-swiper@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13945,6 +14217,17 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-swiper@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/react-use': 0.1.3(@lynx-js/react@packages+react)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui-switch@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13956,6 +14239,17 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui-switch@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ clsx: 2.1.1
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
'@lynx-js/lynx-ui@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@18.3.28)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
@@ -13986,6 +14280,36 @@ snapshots:
- react
- react-dom
+ '@lynx-js/lynx-ui@3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+ dependencies:
+ '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-checkbox': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-dialog': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-draggable': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-feed-list': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-form': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-input': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-lazy-component': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-list': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-popover': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-presence': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-radio-group': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-scroll-view': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-sheet': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-slider': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-sortable': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-swipe-action': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-swiper': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/lynx-ui-switch': 3.133.0(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+ '@lynx-js/react': link:packages/react
+ '@lynx-js/types': 3.7.0
+ '@types/react': 19.2.14
+ transitivePeerDependencies:
+ - '@emotion/is-prop-valid'
+ - react
+ - react-dom
+
'@lynx-js/motion@0.0.3(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
dependencies:
'@lynx-js/react': link:packages/react
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 104f4e3300..7b7909530b 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -2,6 +2,7 @@ packages:
- benchmark/react
- examples/*
- packages/background-only
+ - packages/genui
- packages/genui/*
- packages/i18n/*
- packages/lynx/*
@@ -79,6 +80,12 @@ catalogs:
"@rstest/core": "0.8.1"
overrides:
+ # Published @lynx-js/lynx-ui-* (pulled in by packages/genui/a2ui) peer-depend on
+ # @lynx-js/react@^0.121.0 and would otherwise drag a published @lynx-js/react copy
+ # into the workspace alongside the workspace one. Two copies = two snapshotManager
+ # singletons, which breaks ReactLynx snapshot registration ("BackgroundSnapshot not
+ # found"). Force every @lynx-js/react to the single workspace copy.
+ "@lynx-js/react": "workspace:*"
"@rspack/core": "$@rspack/core"
"@rsbuild/core>@rspack/core": "$@rspack/core"
"@rsdoctor/rspack-plugin>@rspack/core": "$@rspack/core"
diff --git a/website/package.json b/website/package.json
index 3b44605cf2..0e0c3866f0 100644
--- a/website/package.json
+++ b/website/package.json
@@ -19,13 +19,13 @@
"react-dom": "19.2.4"
},
"devDependencies": {
- "@lynx-js/a2ui-cli": "workspace:*",
- "@lynx-js/a2ui-reactlynx": "workspace:*",
"@lynx-js/chunk-loading-webpack-plugin": "workspace:*",
"@lynx-js/config-rsbuild-plugin": "workspace:*",
"@lynx-js/css-extract-webpack-plugin": "workspace:*",
"@lynx-js/external-bundle-rsbuild-plugin": "workspace:*",
"@lynx-js/externals-loading-webpack-plugin": "workspace:*",
+ "@lynx-js/genui": "workspace:*",
+ "@lynx-js/genui-cli": "workspace:*",
"@lynx-js/lynx-bundle-rslib-config": "workspace:*",
"@lynx-js/qrcode-rsbuild-plugin": "workspace:*",
"@lynx-js/react": "workspace:*",