From 1b83b5e0cb4f866466688d7b7cef0be009b634f4 Mon Sep 17 00:00:00 2001 From: upupming Date: Wed, 27 May 2026 17:15:51 +0800 Subject: [PATCH 1/7] ci: scope turbo cache by dependency graph to fix stale snapshot replay The turbo cache key was only namespaced by the Rust transform sources (packages/**/src/**/*.rs) and github.sha, with restore-keys that fell back to any cache for the same OS. Turbo's per-task hash does not fully capture the compiled ReactLynx snapshot output, so a PR that only changes the dependency graph (e.g. adding a package) without touching *.rs would inherit a base-branch .turbo and replay stale compiled snapshots. The main-thread snapshot registrations and background-thread references then came from different transform states, producing widespread 'BackgroundSnapshot not found: __snapshot_*' failures in the Vitest jobs. - Add hashFiles('pnpm-lock.yaml') to the cache key so caches are scoped by dependency graph as well. - Drop the over-broad restore-keys fallbacks (the *.rs-only and OS-only lines) that allowed inheriting a cache from an unrelated graph. - Align the glob in consumer workflows to packages/**/src/**/*.rs so the key stays byte-for-byte identical to workflow-build.yml (required by fail-on-cache-miss). - Bump turbo-v4 -> turbo-v5 to discard currently-poisoned caches. Change-Id: I5fe87bae2346ff379340410aad4cc25be8001d85 --- .github/workflows/workflow-bench.yml | 5 +++-- .github/workflows/workflow-build.yml | 18 +++++++++++------- .github/workflows/workflow-bundle-analysis.yml | 5 +++-- .github/workflows/workflow-test.yml | 7 +++++-- .github/workflows/workflow-website.yml | 4 +++- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/.github/workflows/workflow-bench.yml b/.github/workflows/workflow-bench.yml index dc2b26b098..0446782ef5 100644 --- a/.github/workflows/workflow-bench.yml +++ b/.github/workflows/workflow-bench.yml @@ -28,8 +28,9 @@ jobs: uses: lynx-infra/cache@5c6160a6a4c7fca80a2f3057bb9dfc9513fcb732 with: path: .turbo - # We have to be strict here to make sure getting the cache of build-all - key: turbo-v4-${{ runner.os }}-${{ hashFiles('**/packages/**/src/**/*.rs') }}-${{ github.sha }} + # We have to be strict here to make sure getting the cache of build-all. + # Must stay byte-for-byte identical to the key in workflow-build.yml. + key: turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }} fail-on-cache-miss: true - name: Install run: | diff --git a/.github/workflows/workflow-build.yml b/.github/workflows/workflow-build.yml index 29917a656a..e5180d92b5 100644 --- a/.github/workflows/workflow-build.yml +++ b/.github/workflows/workflow-build.yml @@ -95,15 +95,19 @@ jobs: uses: lynx-infra/cache@5c6160a6a4c7fca80a2f3057bb9dfc9513fcb732 with: path: .turbo - key: turbo-v4-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ github.sha }} - # We can restore caches from: + # The key is scoped by both the Rust transform sources (*.rs) and the + # dependency graph (pnpm-lock.yaml). Turbo's per-task hash does not + # fully capture the compiled snapshot output, so a cache built against + # a different dependency graph must NOT be replayed here. + key: turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }} + # We can only restore caches that share the same Rust transform sources + # AND the same dependency graph (same *.rs hash and pnpm-lock.yaml hash): # 1. Previous commit from base branch (merge base or base SHA) - # 2. Any cache + # 2. Any cache with a matching *.rs + lockfile hash restore-keys: | - turbo-v4-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ needs.get-merge-base.outputs.merge-base }} - turbo-v4-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || github.event.push.before }} - turbo-v4-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}- - turbo-v4-${{ runner.os }}- + turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ needs.get-merge-base.outputs.merge-base }} + turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || github.event.push.before }} + turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}- - name: Install run: | npm install -g corepack@latest diff --git a/.github/workflows/workflow-bundle-analysis.yml b/.github/workflows/workflow-bundle-analysis.yml index 60ce8f89bb..5fb440f322 100644 --- a/.github/workflows/workflow-bundle-analysis.yml +++ b/.github/workflows/workflow-bundle-analysis.yml @@ -42,8 +42,9 @@ jobs: uses: lynx-infra/cache@5c6160a6a4c7fca80a2f3057bb9dfc9513fcb732 with: path: .turbo - # We have to be strict here to make sure getting the cache of build-all - key: turbo-v4-${{ runner.os }}-${{ hashFiles('**/packages/**/src/**/*.rs') }}-${{ github.sha }} + # We have to be strict here to make sure getting the cache of build-all. + # Must stay byte-for-byte identical to the key in workflow-build.yml. + key: turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }} fail-on-cache-miss: true - name: Install run: | diff --git a/.github/workflows/workflow-test.yml b/.github/workflows/workflow-test.yml index 0fe2ddeee3..3f61f0566d 100644 --- a/.github/workflows/workflow-test.yml +++ b/.github/workflows/workflow-test.yml @@ -87,8 +87,11 @@ jobs: uses: lynx-infra/cache@5c6160a6a4c7fca80a2f3057bb9dfc9513fcb732 with: path: .turbo - # We have to be strict here to make sure getting the cache of build-all - key: turbo-v4-${{ runner.os }}-${{ hashFiles('**/packages/**/src/**/*.rs') }}-${{ github.sha }} + # We have to be strict here to make sure getting the cache of build-all. + # This key MUST stay byte-for-byte identical to the one in + # workflow-build.yml (same globs, same hash inputs) so that + # fail-on-cache-miss reliably restores that commit's build-all .turbo. + key: turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }} fail-on-cache-miss: true - name: Install run: | diff --git a/.github/workflows/workflow-website.yml b/.github/workflows/workflow-website.yml index b38e78cc6f..0e6078fb60 100644 --- a/.github/workflows/workflow-website.yml +++ b/.github/workflows/workflow-website.yml @@ -23,7 +23,9 @@ jobs: uses: lynx-infra/cache@5c6160a6a4c7fca80a2f3057bb9dfc9513fcb732 with: path: .turbo - key: turbo-v4-${{ runner.os }}-${{ hashFiles('**/packages/**/src/**/*.rs') }}-${{ github.sha }} + # Must stay byte-for-byte identical to the key in workflow-build.yml + # so fail-on-cache-miss restores that commit's build-all .turbo. + key: turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }} fail-on-cache-miss: true - name: Setup Pages id: pages From 1dc8e617f9778e5fa349ddef5c2d383d8927966c Mon Sep 17 00:00:00 2001 From: BitterGourd <91231822+gaoachao@users.noreply.github.com> Date: Mon, 25 May 2026 22:32:25 +0800 Subject: [PATCH 2/7] refactor(genui): add @lynx-js/genui --- packages/genui/.gitignore | 1 + packages/genui/README.md | 170 ++++++++ .../genui/a2ui-catalog-extractor/README.md | 32 +- .../genui/a2ui-catalog-extractor/package.json | 5 +- .../a2ui-catalog-extractor/readme.zh_cn.md | 32 +- .../tsconfig.build.json | 7 + packages/genui/a2ui-cli/AGENTS.md | 23 -- packages/genui/a2ui-cli/package.json | 26 -- packages/genui/a2ui-playground/AGENTS.md | 4 +- .../genui/a2ui-playground/examples/README.md | 2 +- .../examples/io-mock/mockAgent.ts | 4 +- .../a2ui-playground/lynx-src/a2ui/App.tsx | 42 +- .../a2ui-playground/lynx-src/openui/App.tsx | 4 +- packages/genui/a2ui-playground/package.json | 3 +- .../genui/a2ui-playground/src/catalog/a2ui.ts | 39 +- .../src/components/UsageSection.tsx | 6 +- packages/genui/a2ui-playground/src/styles.css | 2 +- packages/genui/a2ui-prompt/AGENTS.md | 2 +- packages/genui/a2ui-prompt/README.md | 8 +- packages/genui/a2ui-prompt/package.json | 3 +- packages/genui/a2ui-prompt/src/index.ts | 2 +- packages/genui/a2ui/AGENTS.md | 10 +- packages/genui/a2ui/README.md | 40 +- packages/genui/a2ui/package.json | 6 +- .../genui/a2ui/src/catalog/Button/index.tsx | 2 +- .../genui/a2ui/src/catalog/Card/index.tsx | 2 +- .../genui/a2ui/src/catalog/Column/index.tsx | 2 +- .../genui/a2ui/src/catalog/List/index.tsx | 2 +- .../genui/a2ui/src/catalog/Modal/index.tsx | 2 +- packages/genui/a2ui/src/catalog/README.md | 53 ++- packages/genui/a2ui/src/catalog/Row/index.tsx | 2 +- .../genui/a2ui/src/catalog/Tabs/index.tsx | 2 +- .../genui/a2ui/src/catalog/defineCatalog.ts | 10 +- packages/genui/a2ui/src/catalog/index.ts | 38 +- packages/genui/a2ui/src/index.ts | 2 +- packages/genui/a2ui/src/react/A2UI.tsx | 8 +- packages/genui/a2ui/src/react/index.ts | 6 +- .../genui/a2ui/src/react/useA2UIContext.ts | 4 +- packages/genui/a2ui/tsconfig.build.json | 1 + packages/genui/cli/AGENTS.md | 27 ++ packages/genui/{a2ui-cli => cli}/README.md | 50 ++- packages/genui/{a2ui-cli => cli}/bin/cli.js | 112 ++++- packages/genui/cli/package.json | 29 ++ packages/genui/index.ts | 114 +++++ packages/genui/openui/README.md | 21 +- packages/genui/openui/package.json | 3 +- packages/genui/openui/src/core/renderer.tsx | 2 - packages/genui/package.json | 120 ++++++ packages/genui/tsconfig.build.json | 10 + packages/genui/tsconfig.json | 2 +- packages/genui/turbo.json | 40 ++ .../helpers/playground-preview-server.ts | 2 +- pnpm-lock.yaml | 389 +++++++++++++++++- pnpm-workspace.yaml | 1 + 54 files changed, 1223 insertions(+), 308 deletions(-) create mode 100644 packages/genui/.gitignore create mode 100644 packages/genui/README.md delete mode 100644 packages/genui/a2ui-cli/AGENTS.md delete mode 100644 packages/genui/a2ui-cli/package.json create mode 100644 packages/genui/cli/AGENTS.md rename packages/genui/{a2ui-cli => cli}/README.md (56%) rename packages/genui/{a2ui-cli => cli}/bin/cli.js (60%) create mode 100644 packages/genui/cli/package.json create mode 100644 packages/genui/index.ts create mode 100644 packages/genui/package.json create mode 100644 packages/genui/tsconfig.build.json create mode 100644 packages/genui/turbo.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 ``. + +```tsx +import { A2UI, Button, Text, createMessageStore } from '@lynx-js/genui/a2ui'; + +const messageStore = createMessageStore(); + +export function GenUIScreen() { + return ( + { + // Send the action back to your agent, then push response messages + // into the same messageStore. + }} + /> + ); +} +``` + +Use the A2UI style entry when you want the packaged component styles: + +```ts +import '@lynx-js/genui/a2ui/styles/theme.css'; +``` + +See [`a2ui/README.md`](./a2ui/README.md) for catalog composition and custom +component details. + +## OpenUI + +OpenUI renders parsed OpenUI DSL through a configurable component library. + +```tsx +import { + OpenUiRenderer, + createOpenUiLibrary, + createStreamingParser, +} from '@lynx-js/genui/openui'; + +const library = createOpenUiLibrary(); +const parser = createStreamingParser(library.toJSONSchema()); +const result = parser.push('root = Stack([TextContent("Hello")])'); + +export function OpenUIScreen() { + return ; +} +``` + +Renderer styles are explicit: + +```ts +import '@lynx-js/genui/openui/styles/renderer.css'; +``` + +See [`openui/README.md`](./openui/README.md) for streaming and custom library +examples. + +## CLI + +The package installs the GenUI CLI and the low-level catalog extractor binary: + +```bash +genui --help +genui-cli --help +a2ui-catalog-extractor --help +``` + +`a2ui-cli` is also kept as a compatibility alias for existing A2UI scripts. New +scripts should prefer the namespace-first `genui a2ui ...` form so OpenUI +commands can be added under `genui openui ...` later. + +Generate catalog artifacts: + +```bash +genui a2ui generate catalog \ + --catalog-dir src/catalog \ + --source src/functions \ + --out-dir dist/catalog +``` + +Generate an A2UI system prompt: + +```bash +genui a2ui generate prompt \ + --catalog-dir dist/catalog \ + --out dist/a2ui-system-prompt.txt +``` + +## Published Package Layout + +Only `@lynx-js/genui` is intended to be published. The package contains compiled +JavaScript and declarations under `dist/` directories, plus CLI entry points, +README files, styles, and extractor skills. + +The root `index.ts` is compiled during build. Do not hand-write +`dist/index.js` or `dist/index.d.ts`; run: + +```bash +pnpm -C packages/genui build +``` + +Before publishing, verify the package contents: + +```bash +pnpm -C packages/genui pack --dry-run +``` + +## License + +Apache-2.0 diff --git a/packages/genui/a2ui-catalog-extractor/README.md b/packages/genui/a2ui-catalog-extractor/README.md index b75f09b5ab..9dcd55af3d 100644 --- a/packages/genui/a2ui-catalog-extractor/README.md +++ b/packages/genui/a2ui-catalog-extractor/README.md @@ -2,14 +2,14 @@ English | [简体中文](./readme.zh_cn.md) -`@lynx-js/a2ui-catalog-extractor` is the internal TypeDoc-powered extraction -engine behind `npx @lynx-js/a2ui-cli generate catalog`. It turns TypeScript component +`@lynx-js/genui/a2ui-catalog-extractor` is the internal TypeDoc-powered extraction +engine behind `genui a2ui generate catalog`. It turns TypeScript component interfaces into A2UI component catalog JSON. You write the public component contract once as a TypeScript `interface`, describe it with normal TypeDoc -comments, and run the public `npx @lynx-js/a2ui-cli` command to generate the JSON Schema +comments, and run the public `genui a2ui` command to generate the JSON Schema that an A2UI agent can read. -For user-facing scripts, use `npx @lynx-js/a2ui-cli generate catalog`. Treat +For user-facing scripts, use `genui a2ui generate catalog`. Treat this package as the implementation layer for extraction behavior and tests. ## What It Does @@ -58,10 +58,10 @@ the marked interface. ### Package manager -Run the public CLI package through `npx`: +Run the public CLI after installing `@lynx-js/genui`: ```bash -npx @lynx-js/a2ui-cli --help +genui a2ui --help ``` Then add a script to your package: @@ -69,7 +69,7 @@ Then add a script to your package: ```json { "scripts": { - "build:catalog": "npx @lynx-js/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" } } ``` @@ -132,7 +132,7 @@ extractor that this interface should become a catalog component named Run: ```bash -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 ``` The extractor scans the catalog directory, finds interfaces marked with @@ -391,13 +391,13 @@ export interface CardProps { ## CLI Reference The public CLI entry point is -`npx @lynx-js/a2ui-cli generate catalog`. It delegates to this package +`genui a2ui generate catalog`. It delegates to this package internally. ### Generate catalog artifacts ```bash -npx @lynx-js/a2ui-cli generate catalog [options] +genui a2ui generate catalog [options] ``` | Option | Description | Default | @@ -417,10 +417,10 @@ files. It ignores `.d.ts`, `node_modules`, `dist`, and `.turbo`. ## Repository-internal Programmatic API -These exports are documented for maintainers of `@lynx-js/a2ui-cli`, extractor +These exports are documented for maintainers of `@lynx-js/genui-cli`, extractor tests, and repository-internal tooling. They are not the external integration surface for product code. Product build scripts should call -`npx @lynx-js/a2ui-cli generate catalog` instead of importing this package +`genui a2ui generate catalog` instead of importing this package directly. ### Generate components from source files @@ -429,7 +429,7 @@ directly. import { extractCatalogComponents, writeComponentCatalogs, -} from '@lynx-js/a2ui-catalog-extractor'; +} from '@lynx-js/genui/a2ui-catalog-extractor'; const components = await extractCatalogComponents({ sourceFiles: ['src/catalog/QuickStartCard.tsx'], @@ -472,7 +472,7 @@ import * as fs from 'node:fs'; import { extractCatalogComponentsFromTypeDocJson, writeCatalogComponents, -} from '@lynx-js/a2ui-catalog-extractor'; +} from '@lynx-js/genui/a2ui-catalog-extractor'; const projectJson = JSON.parse( await fs.promises.readFile('typedoc.json', 'utf8'), @@ -487,7 +487,7 @@ writeCatalogComponents(components, { The equivalent CLI command is: ```bash -npx @lynx-js/a2ui-cli generate catalog --typedoc-json typedoc.json --out-dir dist/catalog +genui a2ui generate catalog --typedoc-json typedoc.json --out-dir dist/catalog ``` ### Create a full A2UI catalog object @@ -499,7 +499,7 @@ the other top-level A2UI catalog fields: import { createA2UICatalog, extractCatalogComponents, -} from '@lynx-js/a2ui-catalog-extractor'; +} from '@lynx-js/genui/a2ui-catalog-extractor'; const components = await extractCatalogComponents({ sourceFiles: ['src/catalog/QuickStartCard.tsx'], diff --git a/packages/genui/a2ui-catalog-extractor/package.json b/packages/genui/a2ui-catalog-extractor/package.json index b4a7ecb07d..65bd910d4f 100644 --- a/packages/genui/a2ui-catalog-extractor/package.json +++ b/packages/genui/a2ui-catalog-extractor/package.json @@ -1,6 +1,7 @@ { - "name": "@lynx-js/a2ui-catalog-extractor", + "name": "@lynx-js/genui-a2ui-catalog-extractor", "version": "0.0.0", + "private": true, "description": "TypeDoc-driven A2UI catalog extractor for TypeScript interfaces.", "repository": { "type": "git", @@ -31,7 +32,7 @@ "README.md" ], "scripts": { - "build": "rslib build", + "build": "tsc --project tsconfig.build.json", "test": "rstest" }, "dependencies": { diff --git a/packages/genui/a2ui-catalog-extractor/readme.zh_cn.md b/packages/genui/a2ui-catalog-extractor/readme.zh_cn.md index 49d1fcf689..7c534eac9e 100644 --- a/packages/genui/a2ui-catalog-extractor/readme.zh_cn.md +++ b/packages/genui/a2ui-catalog-extractor/readme.zh_cn.md @@ -2,13 +2,13 @@ [English](./README.md) | 简体中文 -`@lynx-js/a2ui-catalog-extractor` 是 -`npx @lynx-js/a2ui-cli generate catalog` 背后的内部 TypeDoc extraction engine。它会把 TypeScript 组件接口转换成 A2UI +`@lynx-js/genui/a2ui-catalog-extractor` 是 +`genui a2ui generate catalog` 背后的内部 TypeDoc extraction engine。它会把 TypeScript 组件接口转换成 A2UI 组件 catalog JSON。你只需要用 TypeScript `interface` 写一次组件的公开契约, -用普通 TypeDoc 注释描述字段,然后通过公开的 `npx @lynx-js/a2ui-cli` 命令生成 +用普通 TypeDoc 注释描述字段,然后通过公开的 `genui a2ui` 命令生成 A2UI agent 可以读取的 JSON Schema。 -用户脚本请使用 `npx @lynx-js/a2ui-cli generate catalog`。这个包主要作为 +用户脚本请使用 `genui a2ui generate catalog`。这个包主要作为 extraction 行为和测试的实现层。 ## 它解决什么问题 @@ -55,10 +55,10 @@ agent 哪些 props 合法、哪些 props 必填、哪些 enum 值可用,以及 ### 包管理器 -通过 `npx` 执行公开 CLI 包: +安装 `@lynx-js/genui` 后执行公开 CLI: ```bash -npx @lynx-js/a2ui-cli --help +genui a2ui --help ``` 然后在你的 package 中加入脚本: @@ -66,7 +66,7 @@ npx @lynx-js/a2ui-cli --help ```json { "scripts": { - "build:catalog": "npx @lynx-js/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" } } ``` @@ -127,7 +127,7 @@ export interface QuickStartCardProps { 运行: ```bash -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 ``` extractor 会扫描 catalog 目录,找到带 `@a2uiCatalog` 的 interface,并为每个 @@ -382,12 +382,12 @@ export interface CardProps { ## CLI 参考 -公开 CLI 入口是 `npx @lynx-js/a2ui-cli generate catalog`。它会在内部委托给这个包。 +公开 CLI 入口是 `genui a2ui generate catalog`。它会在内部委托给这个包。 ### 生成 catalog artifacts ```bash -npx @lynx-js/a2ui-cli generate catalog [options] +genui a2ui generate catalog [options] ``` | 选项 | 说明 | 默认值 | @@ -407,8 +407,8 @@ npx @lynx-js/a2ui-cli generate catalog [options] ## 仓库内部编程 API -这些导出主要面向 `@lynx-js/a2ui-cli` 维护者、extractor 测试和仓库内部工具;它们不是给产品代码接入的外部集成面。 -产品构建脚本应该调用 `npx @lynx-js/a2ui-cli generate catalog`,而不是直接 import 这个包。 +这些导出主要面向 `@lynx-js/genui-cli` 维护者、extractor 测试和仓库内部工具;它们不是给产品代码接入的外部集成面。 +产品构建脚本应该调用 `genui a2ui generate catalog`,而不是直接 import 这个包。 ### 从源码文件生成 components @@ -416,7 +416,7 @@ npx @lynx-js/a2ui-cli generate catalog [options] import { extractCatalogComponents, writeComponentCatalogs, -} from '@lynx-js/a2ui-catalog-extractor'; +} from '@lynx-js/genui/a2ui-catalog-extractor'; const components = await extractCatalogComponents({ sourceFiles: ['src/catalog/QuickStartCard.tsx'], @@ -458,7 +458,7 @@ import * as fs from 'node:fs'; import { extractCatalogComponentsFromTypeDocJson, writeCatalogComponents, -} from '@lynx-js/a2ui-catalog-extractor'; +} from '@lynx-js/genui/a2ui-catalog-extractor'; const projectJson = JSON.parse( await fs.promises.readFile('typedoc.json', 'utf8'), @@ -473,7 +473,7 @@ writeCatalogComponents(components, { 等价的 CLI 命令是: ```bash -npx @lynx-js/a2ui-cli generate catalog --typedoc-json typedoc.json --out-dir dist/catalog +genui a2ui generate catalog --typedoc-json typedoc.json --out-dir dist/catalog ``` ### 创建完整 A2UI catalog 对象 @@ -485,7 +485,7 @@ A2UI catalog 顶层字段: import { createA2UICatalog, extractCatalogComponents, -} from '@lynx-js/a2ui-catalog-extractor'; +} from '@lynx-js/genui/a2ui-catalog-extractor'; const components = await extractCatalogComponents({ sourceFiles: ['src/catalog/QuickStartCard.tsx'], diff --git a/packages/genui/a2ui-catalog-extractor/tsconfig.build.json b/packages/genui/a2ui-catalog-extractor/tsconfig.build.json index 6770be9b55..2164dd238c 100644 --- a/packages/genui/a2ui-catalog-extractor/tsconfig.build.json +++ b/packages/genui/a2ui-catalog-extractor/tsconfig.build.json @@ -1,5 +1,12 @@ { "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "noEmit": false, + "outDir": "./dist", + "rootDir": "./src", + "tsBuildInfoFile": "./dist/tsconfig.build.tsbuildinfo", + }, "include": ["src"], "exclude": ["test"], } diff --git a/packages/genui/a2ui-cli/AGENTS.md b/packages/genui/a2ui-cli/AGENTS.md deleted file mode 100644 index ab6dc09ada..0000000000 --- a/packages/genui/a2ui-cli/AGENTS.md +++ /dev/null @@ -1,23 +0,0 @@ -# a2ui-cli - -Keep this package as the single public CLI entry point for A2UI setup. It should -orchestrate other packages instead of implementing catalog extraction or prompt -construction itself. - -`generate catalog` should delegate to `@lynx-js/a2ui-catalog-extractor`. -`generate prompt` should delegate to `@lynx-js/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/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.a2ui-cli` pointed -at that path. - -When testing local CLI changes, run the bin directly with Node. If testing -changes in `@lynx-js/a2ui-prompt`, rebuild that package first because this CLI -imports it through package exports. diff --git a/packages/genui/a2ui-cli/package.json b/packages/genui/a2ui-cli/package.json deleted file mode 100644 index 671a72ae50..0000000000 --- a/packages/genui/a2ui-cli/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "@lynx-js/a2ui-cli", - "version": "0.0.0", - "description": "CLI for generating A2UI catalog artifacts and system prompts.", - "repository": { - "type": "git", - "url": "https://github.com/lynx-family/lynx-stack.git", - "directory": "packages/genui/a2ui-cli" - }, - "license": "Apache-2.0", - "type": "module", - "bin": { - "a2ui-cli": "./bin/cli.js" - }, - "files": [ - "bin", - "README.md" - ], - "dependencies": { - "@lynx-js/a2ui-catalog-extractor": "workspace:*", - "@lynx-js/a2ui-prompt": "workspace:*" - }, - "engines": { - "node": ">=22" - } -} diff --git a/packages/genui/a2ui-playground/AGENTS.md b/packages/genui/a2ui-playground/AGENTS.md index 07753663ea..57f4dfefed 100644 --- a/packages/genui/a2ui-playground/AGENTS.md +++ b/packages/genui/a2ui-playground/AGENTS.md @@ -1,6 +1,6 @@ # a2ui-playground (packages/genui/a2ui-playground) -This package is a playground app for `@lynx-js/a2ui-reactlynx`. +This package is a playground app for `@lynx-js/genui/a2ui`. It supports: @@ -42,7 +42,7 @@ The Lynx app entry is `lynx-src/index.tsx`, which renders `lynx-src/App.tsx`. Inside `lynx-src/App.tsx`: -- It imports `@lynx-js/a2ui-reactlynx/catalog/all` to register catalog components. +- It imports `@lynx-js/genui/a2ui/catalog/all` to register catalog components. - It reads `initData` via `useInitData()` (this is how `` passes data into the Lynx runtime). - It uses `BaseClient` + `client.processor.processMessages(...)` to replay the diff --git a/packages/genui/a2ui-playground/examples/README.md b/packages/genui/a2ui-playground/examples/README.md index 2fde5a855f..49a07c5d7e 100644 --- a/packages/genui/a2ui-playground/examples/README.md +++ b/packages/genui/a2ui-playground/examples/README.md @@ -1,7 +1,7 @@ # A2UI playground examples Reference implementations that intentionally live **outside** -`@lynx-js/a2ui-reactlynx`. The package itself ships only: +`@lynx-js/genui/a2ui`. The package itself ships only: - `` — the protocol-naive renderer. - `MessageStore` — a pure raw-message buffer. diff --git a/packages/genui/a2ui-playground/examples/io-mock/mockAgent.ts b/packages/genui/a2ui-playground/examples/io-mock/mockAgent.ts index 517cb873f0..0f8e1327a0 100644 --- a/packages/genui/a2ui-playground/examples/io-mock/mockAgent.ts +++ b/packages/genui/a2ui-playground/examples/io-mock/mockAgent.ts @@ -4,12 +4,12 @@ // // Reference mock IO module. Pushes a fixed initial stream into the store // and serves canned responses to user actions. NOT shipped from -// `@lynx-js/a2ui-reactlynx` — copy as a starting point for tests / demos. +// `@lynx-js/genui/a2ui` — copy as a starting point for tests / demos. import type { MessageStore, ServerToClientMessage, UserActionPayload, -} from '@lynx-js/a2ui-reactlynx'; +} from '@lynx-js/genui/a2ui'; export interface MockAgentOptions { /** Streamed once after `start()`. */ diff --git a/packages/genui/a2ui-playground/lynx-src/a2ui/App.tsx b/packages/genui/a2ui-playground/lynx-src/a2ui/App.tsx index 028b7402c6..d7ef0b5618 100644 --- a/packages/genui/a2ui-playground/lynx-src/a2ui/App.tsx +++ b/packages/genui/a2ui-playground/lynx-src/a2ui/App.tsx @@ -25,7 +25,7 @@ import { basicFunctions, createMessageStore, normalizePayloadToMessages as normalizeProtocolMessages, -} from '@lynx-js/a2ui-reactlynx'; +} from '@lynx-js/genui/a2ui'; import type { CatalogComponent, CatalogInput, @@ -33,26 +33,7 @@ import type { MessageStore, ServerToClientMessage, UserActionPayload, -} from '@lynx-js/a2ui-reactlynx'; -import buttonManifest from '@lynx-js/a2ui-reactlynx/catalog/Button/catalog.json'; -import cardManifest from '@lynx-js/a2ui-reactlynx/catalog/Card/catalog.json'; -import checkBoxManifest from '@lynx-js/a2ui-reactlynx/catalog/CheckBox/catalog.json'; -import choicePickerManifest from '@lynx-js/a2ui-reactlynx/catalog/ChoicePicker/catalog.json'; -import columnManifest from '@lynx-js/a2ui-reactlynx/catalog/Column/catalog.json'; -import dateTimeInputManifest from '@lynx-js/a2ui-reactlynx/catalog/DateTimeInput/catalog.json'; -import dividerManifest from '@lynx-js/a2ui-reactlynx/catalog/Divider/catalog.json'; -import iconManifest from '@lynx-js/a2ui-reactlynx/catalog/Icon/catalog.json'; -import imageManifest from '@lynx-js/a2ui-reactlynx/catalog/Image/catalog.json'; -import lineChartManifest from '@lynx-js/a2ui-reactlynx/catalog/LineChart/catalog.json'; -import listManifest from '@lynx-js/a2ui-reactlynx/catalog/List/catalog.json'; -import modalManifest from '@lynx-js/a2ui-reactlynx/catalog/Modal/catalog.json'; -import pieChartManifest from '@lynx-js/a2ui-reactlynx/catalog/PieChart/catalog.json'; -import radioGroupManifest from '@lynx-js/a2ui-reactlynx/catalog/RadioGroup/catalog.json'; -import rowManifest from '@lynx-js/a2ui-reactlynx/catalog/Row/catalog.json'; -import sliderManifest from '@lynx-js/a2ui-reactlynx/catalog/Slider/catalog.json'; -import tabsManifest from '@lynx-js/a2ui-reactlynx/catalog/Tabs/catalog.json'; -import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json'; -import textFieldManifest from '@lynx-js/a2ui-reactlynx/catalog/TextField/catalog.json'; +} from '@lynx-js/genui/a2ui'; import { useCallback, useEffect, @@ -64,6 +45,25 @@ import { useState, } from '@lynx-js/react'; +import buttonManifest from '../../.generated/a2ui/catalog/Button/catalog.json'; +import cardManifest from '../../.generated/a2ui/catalog/Card/catalog.json'; +import checkBoxManifest from '../../.generated/a2ui/catalog/CheckBox/catalog.json'; +import choicePickerManifest from '../../.generated/a2ui/catalog/ChoicePicker/catalog.json'; +import columnManifest from '../../.generated/a2ui/catalog/Column/catalog.json'; +import dateTimeInputManifest from '../../.generated/a2ui/catalog/DateTimeInput/catalog.json'; +import dividerManifest from '../../.generated/a2ui/catalog/Divider/catalog.json'; +import iconManifest from '../../.generated/a2ui/catalog/Icon/catalog.json'; +import imageManifest from '../../.generated/a2ui/catalog/Image/catalog.json'; +import lineChartManifest from '../../.generated/a2ui/catalog/LineChart/catalog.json'; +import listManifest from '../../.generated/a2ui/catalog/List/catalog.json'; +import modalManifest from '../../.generated/a2ui/catalog/Modal/catalog.json'; +import pieChartManifest from '../../.generated/a2ui/catalog/PieChart/catalog.json'; +import radioGroupManifest from '../../.generated/a2ui/catalog/RadioGroup/catalog.json'; +import rowManifest from '../../.generated/a2ui/catalog/Row/catalog.json'; +import sliderManifest from '../../.generated/a2ui/catalog/Slider/catalog.json'; +import tabsManifest from '../../.generated/a2ui/catalog/Tabs/catalog.json'; +import textManifest from '../../.generated/a2ui/catalog/Text/catalog.json'; +import textFieldManifest from '../../.generated/a2ui/catalog/TextField/catalog.json'; import { createMockAgent } from '../../examples/io-mock/mockAgent.js'; import type { MockAgentProgress } from '../../examples/io-mock/mockAgent.js'; diff --git a/packages/genui/a2ui-playground/lynx-src/openui/App.tsx b/packages/genui/a2ui-playground/lynx-src/openui/App.tsx index 83da91e58f..b59398abbb 100644 --- a/packages/genui/a2ui-playground/lynx-src/openui/App.tsx +++ b/packages/genui/a2ui-playground/lynx-src/openui/App.tsx @@ -5,8 +5,8 @@ import { OpenUiRenderer, createOpenUiLibrary, createStreamingParser, -} from '@lynx-js/openui-reactlynx'; -import type { ActionEvent, ParseResult } from '@lynx-js/openui-reactlynx'; +} from '@lynx-js/genui/openui'; +import type { ActionEvent, ParseResult } from '@lynx-js/genui/openui'; import { useCallback, useEffect, diff --git a/packages/genui/a2ui-playground/package.json b/packages/genui/a2ui-playground/package.json index c28a7c53b1..519549c067 100644 --- a/packages/genui/a2ui-playground/package.json +++ b/packages/genui/a2ui-playground/package.json @@ -13,10 +13,9 @@ }, "dependencies": { "@codemirror/lang-json": "^6.0.2", - "@lynx-js/a2ui-reactlynx": "workspace:*", + "@lynx-js/genui": "workspace:*", "@lynx-js/luna-styles": "0.1.0", "@lynx-js/lynx-core": "0.1.3", - "@lynx-js/openui-reactlynx": "workspace:*", "@lynx-js/react": "workspace:*", "@lynx-js/web-core": "workspace:*", "@lynx-js/web-elements": "workspace:*", diff --git a/packages/genui/a2ui-playground/src/catalog/a2ui.ts b/packages/genui/a2ui-playground/src/catalog/a2ui.ts index bbb535de1e..d63d6561d9 100644 --- a/packages/genui/a2ui-playground/src/catalog/a2ui.ts +++ b/packages/genui/a2ui-playground/src/catalog/a2ui.ts @@ -1,27 +1,26 @@ // 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 buttonManifest from '@lynx-js/a2ui-reactlynx/catalog/Button/catalog.json'; -import cardManifest from '@lynx-js/a2ui-reactlynx/catalog/Card/catalog.json'; -import checkBoxManifest from '@lynx-js/a2ui-reactlynx/catalog/CheckBox/catalog.json'; -import choicePickerManifest from '@lynx-js/a2ui-reactlynx/catalog/ChoicePicker/catalog.json'; -import columnManifest from '@lynx-js/a2ui-reactlynx/catalog/Column/catalog.json'; -import dateTimeInputManifest from '@lynx-js/a2ui-reactlynx/catalog/DateTimeInput/catalog.json'; -import dividerManifest from '@lynx-js/a2ui-reactlynx/catalog/Divider/catalog.json'; -import iconManifest from '@lynx-js/a2ui-reactlynx/catalog/Icon/catalog.json'; -import imageManifest from '@lynx-js/a2ui-reactlynx/catalog/Image/catalog.json'; -import lineChartManifest from '@lynx-js/a2ui-reactlynx/catalog/LineChart/catalog.json'; -import listManifest from '@lynx-js/a2ui-reactlynx/catalog/List/catalog.json'; -import modalManifest from '@lynx-js/a2ui-reactlynx/catalog/Modal/catalog.json'; -import pieChartManifest from '@lynx-js/a2ui-reactlynx/catalog/PieChart/catalog.json'; -import radioGroupManifest from '@lynx-js/a2ui-reactlynx/catalog/RadioGroup/catalog.json'; -import rowManifest from '@lynx-js/a2ui-reactlynx/catalog/Row/catalog.json'; -import sliderManifest from '@lynx-js/a2ui-reactlynx/catalog/Slider/catalog.json'; -import tabsManifest from '@lynx-js/a2ui-reactlynx/catalog/Tabs/catalog.json'; -import textManifest from '@lynx-js/a2ui-reactlynx/catalog/Text/catalog.json'; -import textFieldManifest from '@lynx-js/a2ui-reactlynx/catalog/TextField/catalog.json'; - import type { ProtocolName } from './utils/protocol.js'; +import buttonManifest from '../../.generated/a2ui/catalog/Button/catalog.json'; +import cardManifest from '../../.generated/a2ui/catalog/Card/catalog.json'; +import checkBoxManifest from '../../.generated/a2ui/catalog/CheckBox/catalog.json'; +import choicePickerManifest from '../../.generated/a2ui/catalog/ChoicePicker/catalog.json'; +import columnManifest from '../../.generated/a2ui/catalog/Column/catalog.json'; +import dateTimeInputManifest from '../../.generated/a2ui/catalog/DateTimeInput/catalog.json'; +import dividerManifest from '../../.generated/a2ui/catalog/Divider/catalog.json'; +import iconManifest from '../../.generated/a2ui/catalog/Icon/catalog.json'; +import imageManifest from '../../.generated/a2ui/catalog/Image/catalog.json'; +import lineChartManifest from '../../.generated/a2ui/catalog/LineChart/catalog.json'; +import listManifest from '../../.generated/a2ui/catalog/List/catalog.json'; +import modalManifest from '../../.generated/a2ui/catalog/Modal/catalog.json'; +import pieChartManifest from '../../.generated/a2ui/catalog/PieChart/catalog.json'; +import radioGroupManifest from '../../.generated/a2ui/catalog/RadioGroup/catalog.json'; +import rowManifest from '../../.generated/a2ui/catalog/Row/catalog.json'; +import sliderManifest from '../../.generated/a2ui/catalog/Slider/catalog.json'; +import tabsManifest from '../../.generated/a2ui/catalog/Tabs/catalog.json'; +import textManifest from '../../.generated/a2ui/catalog/Text/catalog.json'; +import textFieldManifest from '../../.generated/a2ui/catalog/TextField/catalog.json'; export interface ComponentProp { name: string; diff --git a/packages/genui/a2ui-playground/src/components/UsageSection.tsx b/packages/genui/a2ui-playground/src/components/UsageSection.tsx index a99ffd2bd1..b13cbb746f 100644 --- a/packages/genui/a2ui-playground/src/components/UsageSection.tsx +++ b/packages/genui/a2ui-playground/src/components/UsageSection.tsx @@ -14,7 +14,7 @@ export function UsageSection() {

             {`// 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..f8004e4ced 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/package.json b/packages/genui/a2ui/package.json
index abff77270f..da8ca8583a 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",
     "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/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..cadbfbab94 100755
--- a/packages/genui/a2ui/src/catalog/index.ts
+++ b/packages/genui/a2ui/src/catalog/index.ts
@@ -24,23 +24,23 @@ export type {
 // 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..00a55e0ae5 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,8 @@ function printPackageVersion() {
   const packageJson = require('../package.json');
   console.info(packageJson.version);
 }
+
+function isMain(moduleUrl) {
+  return process.argv[1] !== undefined
+    && moduleUrl === pathToFileURL(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..3ea44b266a
--- /dev/null
+++ b/packages/genui/package.json
@@ -0,0 +1,120 @@
+{
+  "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"
+  },
+  "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..1cdc5051cf 100644
--- a/packages/genui/tsconfig.json
+++ b/packages/genui/tsconfig.json
@@ -16,5 +16,5 @@
     { "path": "./ui-judge/tsconfig.json" },
     /** packages-end */
   ],
-  "include": [],
+  "include": ["index.ts"],
 }
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/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 1c889dd913..ec59404f84 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -596,6 +596,30 @@ 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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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: ^0.121.0
+        version: 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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
+
   packages/genui/a2ui:
     dependencies:
       '@a2ui/web_core':
@@ -605,9 +629,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 +661,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 +740,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':
@@ -4008,6 +4029,9 @@ packages:
       '@lynx-js/react': '*'
       '@lynx-js/types': '*'
 
+  '@lynx-js/internal-preact@10.29.1-20260424024911-12b794f':
+    resolution: {integrity: sha512-MQ+xjPL2f1P9/eCAdkT2h9cJRXl1qqhSJDX9GkPETt3UAepLo5N+HbGB8Qr3IUzqGDWMr3Mj76my1P0pLkKVDg==}
+
   '@lynx-js/internal-preact@10.29.1-20260519060144-e6da44c':
     resolution: {integrity: sha512-h2pRrt5oLK9LT1NkjyprtzJij/AdZGvv3CN6B5edL4chixqvITbxoCSdYy667Hl6+uKOBuxmCNZoDddgRfcLnw==}
 
@@ -4188,6 +4212,15 @@ packages:
     peerDependencies:
       '@lynx-js/react': '>=0.105.1'
 
+  '@lynx-js/react@0.121.0':
+    resolution: {integrity: sha512-V3/1+kRM7ugFZbhfldnPyJH65gZI06qa9E2/lGM8b+almHWzn+i9G1imMZiHROKlkOT495TauMOH4FiH1U47Fw==}
+    peerDependencies:
+      '@lynx-js/types': '*'
+      '@types/react': ^18
+    peerDependenciesMeta:
+      '@lynx-js/types':
+        optional: true
+
   '@lynx-js/tasm@0.0.39':
     resolution: {integrity: sha512-FNIV6Cc2K0wCKOHVMfpr3M6kpIZqHHNI02GpVl+h0ClyyK44jxEO+lf58gLFD5E3o0hJ1cp3H2OBIxSUJGkPDw==}
     hasBin: true
@@ -13698,17 +13731,35 @@ snapshots:
     dependencies:
       '@lukeed/csprng': 1.1.0
 
+  '@lynx-js/gesture-runtime@2.1.1(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)':
+    dependencies:
+      '@lynx-js/react': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@lynx-js/types': 3.7.0
+
   '@lynx-js/gesture-runtime@2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)':
     dependencies:
       '@lynx-js/react': link:packages/react
       '@lynx-js/types': 3.7.0
 
+  '@lynx-js/internal-preact@10.29.1-20260424024911-12b794f': {}
+
   '@lynx-js/internal-preact@10.29.1-20260519060144-e6da44c': {}
 
   '@lynx-js/luna-styles@0.1.0': {}
 
   '@lynx-js/lynx-core@0.1.3': {}
 
+  '@lynx-js/lynx-ui-button@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+      clsx: 2.1.1
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@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)':
     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)
@@ -13720,6 +13771,18 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-checkbox@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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 +13795,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-common@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)
+      '@lynx-js/react': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@lynx-js/react-use': 0.1.3(@lynx-js/react@0.121.0(@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/types': 3.7.0
+      '@types/react': 19.2.14
+    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 +13817,20 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-dialog@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+      clsx: 2.1.1
+    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 +13845,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-draggable@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@lynx-js/react-use': 0.1.3(@lynx-js/react@0.121.0(@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/types': 3.7.0
+      '@types/react': 19.2.14
+    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 +13867,18 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-feed-list@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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 +13891,21 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-form@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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 +13921,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-input@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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 +13943,16 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-lazy-component@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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 +13963,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-list@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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 +13985,16 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-overlay@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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 +14005,20 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-popover@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+      clsx: 2.1.1
+    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 +14033,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-presence@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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 +14055,18 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-radio-group@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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 +14079,18 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-scroll-view@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    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 +14103,22 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-sheet@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      '@lynx-js/react': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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-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 +14135,16 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-slider@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - 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 +14155,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-sortable@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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 +14177,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-swipe-action@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)
+      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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 +14199,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-swiper@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@lynx-js/react-use': 0.1.3(@lynx-js/react@0.121.0(@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/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 +14221,17 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui-switch@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+      clsx: 2.1.1
+    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 +14243,36 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/lynx-ui@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@lynx-js/types': 3.7.0
+      '@types/react': 19.2.14
+    transitivePeerDependencies:
+      - '@emotion/is-prop-valid'
+      - 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 +14303,19 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/motion@0.0.3(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
+    dependencies:
+      '@lynx-js/react': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      framer-motion: 12.34.1(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+      motion-dom: 12.23.12
+      motion-utils: 12.23.6
+    optionalDependencies:
+      '@lynx-js/types': 3.7.0
+    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
@@ -14004,6 +14334,16 @@ snapshots:
       errorstacks: 2.4.1
       htm: 3.1.1
 
+  '@lynx-js/react-use@0.1.3(@lynx-js/react@0.121.0(@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/react': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      immer: 10.1.1
+      nanoid: 5.1.11
+      react-use: 17.6.0(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+    transitivePeerDependencies:
+      - react
+      - react-dom
+
   '@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)':
     dependencies:
       '@lynx-js/react': link:packages/react
@@ -14014,6 +14354,13 @@ snapshots:
       - react
       - react-dom
 
+  '@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)':
+    dependencies:
+      '@types/react': 19.2.14
+      preact: '@lynx-js/internal-preact@10.29.1-20260424024911-12b794f'
+    optionalDependencies:
+      '@lynx-js/types': 3.7.0
+
   '@lynx-js/tasm@0.0.39': {}
 
   '@lynx-js/trace-processor@0.0.1':
@@ -14946,6 +15293,10 @@ snapshots:
     optionalDependencies:
       '@rsbuild/core': 2.0.6(core-js@3.48.0)
 
+  '@rsbuild/plugin-typed-css-modules@1.2.2(@rsbuild/core@2.0.0-beta.3(@module-federation/runtime-tools@0.22.0)(core-js@3.48.0))':
+    optionalDependencies:
+      '@rsbuild/core': 2.0.0-beta.3(@module-federation/runtime-tools@0.22.0)(core-js@3.48.0)
+
   '@rsdoctor/client@1.5.6': {}
 
   '@rsdoctor/core@1.5.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@rsbuild/core@2.0.6(core-js@3.48.0))(@rspack/core@2.0.3(@swc/helpers@0.5.21))(webpack@5.105.2(lightningcss@1.31.1)(postcss@8.5.14))':
@@ -21584,6 +21935,12 @@ snapshots:
     optionalDependencies:
       '@rsbuild/core': 2.0.6(core-js@3.48.0)
 
+  rsbuild-plugin-tailwindcss@0.2.4(@rsbuild/core@2.0.0-beta.3(@module-federation/runtime-tools@0.22.0)(core-js@3.48.0))(tailwindcss@4.2.1):
+    dependencies:
+      tailwindcss: 4.2.1
+    optionalDependencies:
+      '@rsbuild/core': 2.0.0-beta.3(@module-federation/runtime-tools@0.22.0)(core-js@3.48.0)
+
   rslog@1.3.2: {}
 
   rtl-css-js@1.16.1:
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 2cb6984010..eba57eedcb 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/*

From 687ab3a4a73cf27ae519fbbcc8cfcacbf4741763 Mon Sep 17 00:00:00 2001
From: BitterGourd <91231822+gaoachao@users.noreply.github.com>
Date: Tue, 26 May 2026 15:07:25 +0800
Subject: [PATCH 3/7] fix(genui): address CI failures

---
 eslint.config.js                              |  7 ++++
 .../bin/a2ui-catalog-extractor.js             |  1 -
 packages/genui/a2ui-playground/package.json   |  5 ++-
 packages/genui/a2ui/README.md                 |  4 +-
 packages/genui/a2ui/README_zh.md              | 42 +++++++++----------
 packages/genui/tsconfig.json                  | 12 +-----
 pnpm-lock.yaml                                | 22 +++-------
 website/package.json                          |  4 +-
 8 files changed, 43 insertions(+), 54 deletions(-)

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/a2ui-catalog-extractor/bin/a2ui-catalog-extractor.js b/packages/genui/a2ui-catalog-extractor/bin/a2ui-catalog-extractor.js
index 6a88a1d1e9..f9fa4f9860 100755
--- a/packages/genui/a2ui-catalog-extractor/bin/a2ui-catalog-extractor.js
+++ b/packages/genui/a2ui-catalog-extractor/bin/a2ui-catalog-extractor.js
@@ -2,5 +2,4 @@
 // 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.
-// eslint-disable-next-line import/no-unresolved -- Generated by the package build.
 import '../dist/cli.js';
diff --git a/packages/genui/a2ui-playground/package.json b/packages/genui/a2ui-playground/package.json
index 519549c067..097b019586 100644
--- a/packages/genui/a2ui-playground/package.json
+++ b/packages/genui/a2ui-playground/package.json
@@ -4,8 +4,9 @@
   "private": true,
   "type": "module",
   "scripts": {
-    "build": "rsbuild build",
-    "build:lynx": "rspeedy build",
+    "build": "pnpm run build:a2ui && rsbuild build",
+    "build:a2ui": "pnpm --dir ../a2ui-catalog-extractor build && pnpm --dir ../a2ui build",
+    "build:lynx": "pnpm run build:a2ui && rspeedy build",
     "dev": "pnpm run build:lynx && rsbuild dev",
     "dev:lynx": "rspeedy dev",
     "preview": "rsbuild preview",
diff --git a/packages/genui/a2ui/README.md b/packages/genui/a2ui/README.md
index f8004e4ced..186e8c240c 100644
--- a/packages/genui/a2ui/README.md
+++ b/packages/genui/a2ui/README.md
@@ -67,8 +67,8 @@ For a product app using A2UI, the important surfaces are:
 
 | Surface                       | Role                                                                                                                                       |
 | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
-| `@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.                      |
+| `@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. |
 
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/tsconfig.json b/packages/genui/tsconfig.json
index 1cdc5051cf..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 */
-  ],
-  "include": ["index.ts"],
+  "references": [],
+  "include": [],
 }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ec59404f84..e6263ab5ef 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -2312,12 +2312,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
@@ -2333,6 +2327,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
@@ -15293,10 +15293,6 @@ snapshots:
     optionalDependencies:
       '@rsbuild/core': 2.0.6(core-js@3.48.0)
 
-  '@rsbuild/plugin-typed-css-modules@1.2.2(@rsbuild/core@2.0.0-beta.3(@module-federation/runtime-tools@0.22.0)(core-js@3.48.0))':
-    optionalDependencies:
-      '@rsbuild/core': 2.0.0-beta.3(@module-federation/runtime-tools@0.22.0)(core-js@3.48.0)
-
   '@rsdoctor/client@1.5.6': {}
 
   '@rsdoctor/core@1.5.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@rsbuild/core@2.0.6(core-js@3.48.0))(@rspack/core@2.0.3(@swc/helpers@0.5.21))(webpack@5.105.2(lightningcss@1.31.1)(postcss@8.5.14))':
@@ -21935,12 +21931,6 @@ snapshots:
     optionalDependencies:
       '@rsbuild/core': 2.0.6(core-js@3.48.0)
 
-  rsbuild-plugin-tailwindcss@0.2.4(@rsbuild/core@2.0.0-beta.3(@module-federation/runtime-tools@0.22.0)(core-js@3.48.0))(tailwindcss@4.2.1):
-    dependencies:
-      tailwindcss: 4.2.1
-    optionalDependencies:
-      '@rsbuild/core': 2.0.0-beta.3(@module-federation/runtime-tools@0.22.0)(core-js@3.48.0)
-
   rslog@1.3.2: {}
 
   rtl-css-js@1.16.1:
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:*",

From 0b948da698928fc4570c97ef981605b08a081400 Mon Sep 17 00:00:00 2001
From: BitterGourd <91231822+gaoachao@users.noreply.github.com>
Date: Tue, 26 May 2026 18:21:46 +0800
Subject: [PATCH 4/7] fix: ci

---
 .../a2ui-playground/lynx-src/a2ui/App.tsx     | 68 ++++++-------------
 .../a2ui-playground/lynx-src/a2ui/index.css   |  2 +-
 packages/genui/a2ui-playground/package.json   |  5 +-
 .../genui/a2ui-playground/src/catalog/a2ui.ts | 59 ++++++----------
 packages/genui/a2ui/package.json              |  2 +-
 .../a2ui/scripts/writeCatalogManifestIndex.js | 39 +++++++++++
 packages/genui/a2ui/src/catalog/index.ts      |  4 ++
 packages/genui/ui-judge/package.json          |  1 +
 pnpm-lock.yaml                                |  3 +
 9 files changed, 92 insertions(+), 91 deletions(-)
 create mode 100644 packages/genui/a2ui/scripts/writeCatalogManifestIndex.js

diff --git a/packages/genui/a2ui-playground/lynx-src/a2ui/App.tsx b/packages/genui/a2ui-playground/lynx-src/a2ui/App.tsx
index d7ef0b5618..3383497289 100644
--- a/packages/genui/a2ui-playground/lynx-src/a2ui/App.tsx
+++ b/packages/genui/a2ui-playground/lynx-src/a2ui/App.tsx
@@ -34,6 +34,7 @@ import type {
   ServerToClientMessage,
   UserActionPayload,
 } from '@lynx-js/genui/a2ui';
+import { catalogManifests } from '@lynx-js/genui/a2ui/catalog';
 import {
   useCallback,
   useEffect,
@@ -45,40 +46,11 @@ import {
   useState,
 } from '@lynx-js/react';
 
-import buttonManifest from '../../.generated/a2ui/catalog/Button/catalog.json';
-import cardManifest from '../../.generated/a2ui/catalog/Card/catalog.json';
-import checkBoxManifest from '../../.generated/a2ui/catalog/CheckBox/catalog.json';
-import choicePickerManifest from '../../.generated/a2ui/catalog/ChoicePicker/catalog.json';
-import columnManifest from '../../.generated/a2ui/catalog/Column/catalog.json';
-import dateTimeInputManifest from '../../.generated/a2ui/catalog/DateTimeInput/catalog.json';
-import dividerManifest from '../../.generated/a2ui/catalog/Divider/catalog.json';
-import iconManifest from '../../.generated/a2ui/catalog/Icon/catalog.json';
-import imageManifest from '../../.generated/a2ui/catalog/Image/catalog.json';
-import lineChartManifest from '../../.generated/a2ui/catalog/LineChart/catalog.json';
-import listManifest from '../../.generated/a2ui/catalog/List/catalog.json';
-import modalManifest from '../../.generated/a2ui/catalog/Modal/catalog.json';
-import pieChartManifest from '../../.generated/a2ui/catalog/PieChart/catalog.json';
-import radioGroupManifest from '../../.generated/a2ui/catalog/RadioGroup/catalog.json';
-import rowManifest from '../../.generated/a2ui/catalog/Row/catalog.json';
-import sliderManifest from '../../.generated/a2ui/catalog/Slider/catalog.json';
-import tabsManifest from '../../.generated/a2ui/catalog/Tabs/catalog.json';
-import textManifest from '../../.generated/a2ui/catalog/Text/catalog.json';
-import textFieldManifest from '../../.generated/a2ui/catalog/TextField/catalog.json';
 import { createMockAgent } from '../../examples/io-mock/mockAgent.js';
 import type { MockAgentProgress } from '../../examples/io-mock/mockAgent.js';
 
 const DEFAULT_STREAM_DELAY_MS = 800;
 
-// Compose every built-in. There is intentionally no all-in-one aggregate
-// shipped from the package — this list makes the cost of "everything"
-// visible and lets the bundler tree-shake when you only need a few.
-//
-// Function entries are included because the gallery payloads use A2UI
-// basic-catalog calls such as `formatDate` in dynamic props and checks.
-//
-// To include component schemas, pair each component with its `catalog.json`
-// manifest — see
-// `packages/genui/a2ui/src/catalog/README.md`.
 function manifestEntry(
   component: unknown,
   manifest: CatalogManifest,
@@ -87,25 +59,25 @@ function manifestEntry(
 }
 
 const ALL_BUILTINS: readonly CatalogInput[] = [
-  manifestEntry(Text, textManifest),
-  manifestEntry(Image, imageManifest),
-  manifestEntry(Row, rowManifest),
-  manifestEntry(Column, columnManifest),
-  manifestEntry(List, listManifest),
-  manifestEntry(Card, cardManifest),
-  manifestEntry(Modal, modalManifest),
-  manifestEntry(Button, buttonManifest),
-  manifestEntry(Divider, dividerManifest),
-  manifestEntry(Icon, iconManifest),
-  manifestEntry(CheckBox, checkBoxManifest),
-  manifestEntry(ChoicePicker, choicePickerManifest),
-  manifestEntry(DateTimeInput, dateTimeInputManifest),
-  manifestEntry(LineChart, lineChartManifest),
-  manifestEntry(PieChart, pieChartManifest),
-  manifestEntry(RadioGroup, radioGroupManifest),
-  manifestEntry(Slider, sliderManifest),
-  manifestEntry(TextField, textFieldManifest),
-  manifestEntry(Tabs, tabsManifest),
+  manifestEntry(Text, catalogManifests.Text),
+  manifestEntry(Image, catalogManifests.Image),
+  manifestEntry(Row, catalogManifests.Row),
+  manifestEntry(Column, catalogManifests.Column),
+  manifestEntry(List, catalogManifests.List),
+  manifestEntry(Card, catalogManifests.Card),
+  manifestEntry(Modal, catalogManifests.Modal),
+  manifestEntry(Button, catalogManifests.Button),
+  manifestEntry(Divider, catalogManifests.Divider),
+  manifestEntry(Icon, catalogManifests.Icon),
+  manifestEntry(CheckBox, catalogManifests.CheckBox),
+  manifestEntry(ChoicePicker, catalogManifests.ChoicePicker),
+  manifestEntry(DateTimeInput, catalogManifests.DateTimeInput),
+  manifestEntry(LineChart, catalogManifests.LineChart),
+  manifestEntry(PieChart, catalogManifests.PieChart),
+  manifestEntry(RadioGroup, catalogManifests.RadioGroup),
+  manifestEntry(Slider, catalogManifests.Slider),
+  manifestEntry(TextField, catalogManifests.TextField),
+  manifestEntry(Tabs, catalogManifests.Tabs),
   ...basicFunctions,
 ];
 
diff --git a/packages/genui/a2ui-playground/lynx-src/a2ui/index.css b/packages/genui/a2ui-playground/lynx-src/a2ui/index.css
index 1a6a039f44..a792475233 100644
--- a/packages/genui/a2ui-playground/lynx-src/a2ui/index.css
+++ b/packages/genui/a2ui-playground/lynx-src/a2ui/index.css
@@ -1,5 +1,5 @@
 @import "@lynx-js/luna-styles/index.css";
-@import "@lynx-js/a2ui-reactlynx/styles/theme.css";
+@import "@lynx-js/genui/a2ui/styles/theme.css";
 
 :root {
   display: flex;
diff --git a/packages/genui/a2ui-playground/package.json b/packages/genui/a2ui-playground/package.json
index 097b019586..519549c067 100644
--- a/packages/genui/a2ui-playground/package.json
+++ b/packages/genui/a2ui-playground/package.json
@@ -4,9 +4,8 @@
   "private": true,
   "type": "module",
   "scripts": {
-    "build": "pnpm run build:a2ui && rsbuild build",
-    "build:a2ui": "pnpm --dir ../a2ui-catalog-extractor build && pnpm --dir ../a2ui build",
-    "build:lynx": "pnpm run build:a2ui && rspeedy build",
+    "build": "rsbuild build",
+    "build:lynx": "rspeedy build",
     "dev": "pnpm run build:lynx && rsbuild dev",
     "dev:lynx": "rspeedy dev",
     "preview": "rsbuild preview",
diff --git a/packages/genui/a2ui-playground/src/catalog/a2ui.ts b/packages/genui/a2ui-playground/src/catalog/a2ui.ts
index d63d6561d9..c6c4ab2d9d 100644
--- a/packages/genui/a2ui-playground/src/catalog/a2ui.ts
+++ b/packages/genui/a2ui-playground/src/catalog/a2ui.ts
@@ -1,26 +1,9 @@
 // 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 { catalogManifests } from '@lynx-js/genui/a2ui/catalog';
+
 import type { ProtocolName } from './utils/protocol.js';
-import buttonManifest from '../../.generated/a2ui/catalog/Button/catalog.json';
-import cardManifest from '../../.generated/a2ui/catalog/Card/catalog.json';
-import checkBoxManifest from '../../.generated/a2ui/catalog/CheckBox/catalog.json';
-import choicePickerManifest from '../../.generated/a2ui/catalog/ChoicePicker/catalog.json';
-import columnManifest from '../../.generated/a2ui/catalog/Column/catalog.json';
-import dateTimeInputManifest from '../../.generated/a2ui/catalog/DateTimeInput/catalog.json';
-import dividerManifest from '../../.generated/a2ui/catalog/Divider/catalog.json';
-import iconManifest from '../../.generated/a2ui/catalog/Icon/catalog.json';
-import imageManifest from '../../.generated/a2ui/catalog/Image/catalog.json';
-import lineChartManifest from '../../.generated/a2ui/catalog/LineChart/catalog.json';
-import listManifest from '../../.generated/a2ui/catalog/List/catalog.json';
-import modalManifest from '../../.generated/a2ui/catalog/Modal/catalog.json';
-import pieChartManifest from '../../.generated/a2ui/catalog/PieChart/catalog.json';
-import radioGroupManifest from '../../.generated/a2ui/catalog/RadioGroup/catalog.json';
-import rowManifest from '../../.generated/a2ui/catalog/Row/catalog.json';
-import sliderManifest from '../../.generated/a2ui/catalog/Slider/catalog.json';
-import tabsManifest from '../../.generated/a2ui/catalog/Tabs/catalog.json';
-import textManifest from '../../.generated/a2ui/catalog/Text/catalog.json';
-import textFieldManifest from '../../.generated/a2ui/catalog/TextField/catalog.json';
 
 export interface ComponentProp {
   name: string;
@@ -120,7 +103,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     name: 'Text',
     category: 'Display',
     description: 'Displays a text string with optional style variant.',
-    props: schemaToProps(textManifest),
+    props: schemaToProps(catalogManifests.Text),
     usage: {
       a2ui: {
         id: 'greeting',
@@ -184,7 +167,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     category: 'Display',
     description:
       'Renders a Material icon by name. Default icon names can be browsed at https://a2ui-composer.ag-ui.com/icons.',
-    props: schemaToProps(iconManifest),
+    props: schemaToProps(catalogManifests.Icon),
     usage: {
       a2ui: [
         {
@@ -375,7 +358,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     name: 'Image',
     category: 'Display',
     description: 'Displays an image from a URL or data binding.',
-    props: schemaToProps(imageManifest),
+    props: schemaToProps(catalogManifests.Image),
     usage: {
       a2ui: {
         id: 'hero-image',
@@ -426,7 +409,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     name: 'Divider',
     category: 'Display',
     description: 'A visual separator line used to divide content sections.',
-    props: schemaToProps(dividerManifest),
+    props: schemaToProps(catalogManifests.Divider),
     usage: {
       a2ui: [
         {
@@ -552,7 +535,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     category: 'Chart',
     description:
       'Plots one or more numeric series over category labels with native SVG rendering.',
-    props: schemaToProps(lineChartManifest),
+    props: schemaToProps(catalogManifests.LineChart),
     usage: {
       a2ui: {
         id: 'sales-chart',
@@ -628,7 +611,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     category: 'Chart',
     description:
       'Renders pie and donut slices with native SVG arcs and a responsive legend.',
-    props: schemaToProps(pieChartManifest),
+    props: schemaToProps(catalogManifests.PieChart),
     usage: {
       a2ui: {
         id: 'revenue-share',
@@ -690,7 +673,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     name: 'Card',
     category: 'Layout',
     description: 'A container that renders one child component inside a card.',
-    props: schemaToProps(cardManifest),
+    props: schemaToProps(catalogManifests.Card),
     usage: {
       a2ui: {
         id: 'profile-card',
@@ -827,7 +810,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     category: 'Layout',
     description:
       'A modal dialog that opens from a trigger component and displays one content component.',
-    props: schemaToProps(modalManifest),
+    props: schemaToProps(catalogManifests.Modal),
     usage: {
       a2ui: [
         {
@@ -878,7 +861,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     category: 'Layout',
     description:
       'A horizontal layout container that arranges children in a row.',
-    props: schemaToProps(rowManifest),
+    props: schemaToProps(catalogManifests.Row),
     usage: {
       a2ui: {
         id: 'action-row',
@@ -1012,7 +995,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     category: 'Layout',
     description:
       'A vertical layout container that arranges children in a column.',
-    props: schemaToProps(columnManifest),
+    props: schemaToProps(catalogManifests.Column),
     usage: {
       a2ui: {
         id: 'main-column',
@@ -1124,7 +1107,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     category: 'Data',
     description:
       'A scrollable list that renders children or uses a template for dynamic items.',
-    props: schemaToProps(listManifest),
+    props: schemaToProps(catalogManifests.List),
     usage: {
       a2ui: {
         id: 'item-list',
@@ -1217,7 +1200,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     name: 'Button',
     category: 'Input',
     description: 'An interactive button that triggers an action when pressed.',
-    props: schemaToProps(buttonManifest),
+    props: schemaToProps(catalogManifests.Button),
     usage: {
       a2ui: {
         id: 'submit-btn',
@@ -1272,7 +1255,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     category: 'Input',
     description:
       'A labeled text input with short text, long text, numeric, and obscured variants.',
-    props: schemaToProps(textFieldManifest),
+    props: schemaToProps(catalogManifests.TextField),
     usage: {
       a2ui: {
         id: 'name-input',
@@ -1350,7 +1333,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     name: 'CheckBox',
     category: 'Input',
     description: 'A toggleable checkbox with label and action support.',
-    props: schemaToProps(checkBoxManifest),
+    props: schemaToProps(catalogManifests.CheckBox),
     usage: {
       a2ui: {
         id: 'agree-checkbox',
@@ -1388,7 +1371,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     name: 'Slider',
     category: 'Input',
     description: 'A numeric range input backed by lynx-ui slider primitives.',
-    props: schemaToProps(sliderManifest),
+    props: schemaToProps(catalogManifests.Slider),
     usage: {
       a2ui: {
         id: 'volume-slider',
@@ -1433,7 +1416,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     category: 'Input',
     description:
       'A date and/or time input with a calendar panel and configurable output format.',
-    props: schemaToProps(dateTimeInputManifest),
+    props: schemaToProps(catalogManifests.DateTimeInput),
     usage: {
       a2ui: {
         id: 'date-input',
@@ -1495,7 +1478,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     category: 'Input',
     description:
       'A single- or multi-select choice picker with checkbox and chip styles.',
-    props: schemaToProps(choicePickerManifest),
+    props: schemaToProps(catalogManifests.ChoicePicker),
     usage: {
       a2ui: {
         id: 'city-picker',
@@ -1577,7 +1560,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     name: 'Tabs',
     category: 'Layout',
     description: 'A tab bar that switches between multiple child components.',
-    props: schemaToProps(tabsManifest),
+    props: schemaToProps(catalogManifests.Tabs),
     usage: {
       a2ui: {
         id: 'details-tabs',
@@ -1669,7 +1652,7 @@ export const COMPONENT_CATALOG: ComponentDoc[] = [
     category: 'Input',
     description:
       'A group of mutually exclusive radio options with selection support.',
-    props: schemaToProps(radioGroupManifest),
+    props: schemaToProps(catalogManifests.RadioGroup),
     usage: {
       a2ui: {
         id: 'size-picker',
diff --git a/packages/genui/a2ui/package.json b/packages/genui/a2ui/package.json
index da8ca8583a..adcfa1898d 100644
--- a/packages/genui/a2ui/package.json
+++ b/packages/genui/a2ui/package.json
@@ -133,7 +133,7 @@
   "types": "./dist/index.d.ts",
   "scripts": {
     "build": "tsc --project tsconfig.build.json && npm run build:catalog",
-    "build:catalog": "genui a2ui 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": {
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/index.ts b/packages/genui/a2ui/src/catalog/index.ts
index cadbfbab94..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,6 +23,8 @@ 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.
diff --git a/packages/genui/ui-judge/package.json b/packages/genui/ui-judge/package.json
index 8e1af0d382..c40b9131c6 100644
--- a/packages/genui/ui-judge/package.json
+++ b/packages/genui/ui-judge/package.json
@@ -23,6 +23,7 @@
     "test": "playwright test"
   },
   "dependencies": {
+    "@lynx-js/genui": "workspace:*",
     "@midscene/web": "^1.8.0",
     "@playwright/test": "^1.58.2"
   },
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e6263ab5ef..7f10f7df3d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -804,6 +804,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)

From 0480c3d8fda1b8badf68a8fc456f092e4a96f0f0 Mon Sep 17 00:00:00 2001
From: BitterGourd <91231822+gaoachao@users.noreply.github.com>
Date: Wed, 27 May 2026 17:35:43 +0800
Subject: [PATCH 5/7] fix: minimumReleaseAge temporarily

---
 pnpm-workspace.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index eba57eedcb..640f7ef0bc 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -35,7 +35,7 @@ optimisticRepeatInstall: true
 resolutionMode: "lowest-direct"
 
 # Match Renovate's npm minimum release age; pnpm also guards lockfile maintenance.
-minimumReleaseAge: 4320
+minimumReleaseAge: 0
 
 # Default catalogs
 catalog:

From 7cfaff51d89fd0acb5466cbda9dc0d92ebd08016 Mon Sep 17 00:00:00 2001
From: upupming 
Date: Wed, 27 May 2026 18:45:13 +0800
Subject: [PATCH 6/7] fix: dedupe @lynx-js/react to one copy; revert turbo
 cache-key change

Root cause of the 'BackgroundSnapshot not found' failures (51 test files):
packages/genui/a2ui depends on published @lynx-js/lynx-ui-*@3.133.0, which
peer-depend on @lynx-js/react@^0.121.0. pnpm pulled a published
@lynx-js/react@0.121.0 alongside the workspace copy (0.121.1), so the
ReactLynx runtime singleton 'snapshotManager' existed twice. Snapshots
registered in one copy were not found when looked up via the other, breaking
ReactLynx snapshot rendering across the whole monorepo (incl. unrelated tests
like lynx/gesture-runtime).

Verified locally with a clean, cache-free build: before -> 51 failed (197
'BackgroundSnapshot not found'); after the override -> 0 such failures on both
node 22 and node 24. (Remaining webpack/react and rspeedy/react failures are
pre-existing macOS-only rspack issues that also fail on main and pass in CI.)

- pnpm-workspace.yaml: add override "@lynx-js/react": "workspace:*" so the
  published lynx-ui peer resolves to the single workspace copy.
- Revert the turbo cache-key change (turbo-v5 + pnpm-lock hash) across the
  5 workflows: the failure was never a turbo cache staleness issue (a clean
  cache-free build reproduces it), so that change is unnecessary.
---
 .github/workflows/workflow-bench.yml          |   5 +-
 .github/workflows/workflow-build.yml          |  18 +-
 .../workflows/workflow-bundle-analysis.yml    |   5 +-
 .github/workflows/workflow-test.yml           |   7 +-
 .github/workflows/workflow-website.yml        |   4 +-
 pnpm-lock.yaml                                | 352 ++++++++----------
 pnpm-workspace.yaml                           |   6 +
 7 files changed, 172 insertions(+), 225 deletions(-)

diff --git a/.github/workflows/workflow-bench.yml b/.github/workflows/workflow-bench.yml
index 0446782ef5..dc2b26b098 100644
--- a/.github/workflows/workflow-bench.yml
+++ b/.github/workflows/workflow-bench.yml
@@ -28,9 +28,8 @@ jobs:
         uses: lynx-infra/cache@5c6160a6a4c7fca80a2f3057bb9dfc9513fcb732
         with:
           path: .turbo
-          # We have to be strict here to make sure getting the cache of build-all.
-          # Must stay byte-for-byte identical to the key in workflow-build.yml.
-          key: turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }}
+          # We have to be strict here to make sure getting the cache of build-all
+          key: turbo-v4-${{ runner.os }}-${{ hashFiles('**/packages/**/src/**/*.rs') }}-${{ github.sha }}
           fail-on-cache-miss: true
       - name: Install
         run: |
diff --git a/.github/workflows/workflow-build.yml b/.github/workflows/workflow-build.yml
index e5180d92b5..29917a656a 100644
--- a/.github/workflows/workflow-build.yml
+++ b/.github/workflows/workflow-build.yml
@@ -95,19 +95,15 @@ jobs:
         uses: lynx-infra/cache@5c6160a6a4c7fca80a2f3057bb9dfc9513fcb732
         with:
           path: .turbo
-          # The key is scoped by both the Rust transform sources (*.rs) and the
-          # dependency graph (pnpm-lock.yaml). Turbo's per-task hash does not
-          # fully capture the compiled snapshot output, so a cache built against
-          # a different dependency graph must NOT be replayed here.
-          key: turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }}
-          # We can only restore caches that share the same Rust transform sources
-          # AND the same dependency graph (same *.rs hash and pnpm-lock.yaml hash):
+          key: turbo-v4-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ github.sha }}
+          # We can restore caches from:
           #   1. Previous commit from base branch (merge base or base SHA)
-          #   2. Any cache with a matching *.rs + lockfile hash
+          #   2. Any cache
           restore-keys: |
-            turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ needs.get-merge-base.outputs.merge-base }}
-            turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || github.event.push.before }}
-            turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-
+            turbo-v4-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ needs.get-merge-base.outputs.merge-base }}
+            turbo-v4-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || github.event.push.before }}
+            turbo-v4-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-
+            turbo-v4-${{ runner.os }}-
       - name: Install
         run: |
           npm install -g corepack@latest
diff --git a/.github/workflows/workflow-bundle-analysis.yml b/.github/workflows/workflow-bundle-analysis.yml
index 5fb440f322..60ce8f89bb 100644
--- a/.github/workflows/workflow-bundle-analysis.yml
+++ b/.github/workflows/workflow-bundle-analysis.yml
@@ -42,9 +42,8 @@ jobs:
         uses: lynx-infra/cache@5c6160a6a4c7fca80a2f3057bb9dfc9513fcb732
         with:
           path: .turbo
-          # We have to be strict here to make sure getting the cache of build-all.
-          # Must stay byte-for-byte identical to the key in workflow-build.yml.
-          key: turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }}
+          # We have to be strict here to make sure getting the cache of build-all
+          key: turbo-v4-${{ runner.os }}-${{ hashFiles('**/packages/**/src/**/*.rs') }}-${{ github.sha }}
           fail-on-cache-miss: true
       - name: Install
         run: |
diff --git a/.github/workflows/workflow-test.yml b/.github/workflows/workflow-test.yml
index 3f61f0566d..0fe2ddeee3 100644
--- a/.github/workflows/workflow-test.yml
+++ b/.github/workflows/workflow-test.yml
@@ -87,11 +87,8 @@ jobs:
         uses: lynx-infra/cache@5c6160a6a4c7fca80a2f3057bb9dfc9513fcb732
         with:
           path: .turbo
-          # We have to be strict here to make sure getting the cache of build-all.
-          # This key MUST stay byte-for-byte identical to the one in
-          # workflow-build.yml (same globs, same hash inputs) so that
-          # fail-on-cache-miss reliably restores that commit's build-all .turbo.
-          key: turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }}
+          # We have to be strict here to make sure getting the cache of build-all
+          key: turbo-v4-${{ runner.os }}-${{ hashFiles('**/packages/**/src/**/*.rs') }}-${{ github.sha }}
           fail-on-cache-miss: true
       - name: Install
         run: |
diff --git a/.github/workflows/workflow-website.yml b/.github/workflows/workflow-website.yml
index 0e6078fb60..b38e78cc6f 100644
--- a/.github/workflows/workflow-website.yml
+++ b/.github/workflows/workflow-website.yml
@@ -23,9 +23,7 @@ jobs:
         uses: lynx-infra/cache@5c6160a6a4c7fca80a2f3057bb9dfc9513fcb732
         with:
           path: .turbo
-          # Must stay byte-for-byte identical to the key in workflow-build.yml
-          # so fail-on-cache-miss restores that commit's build-all .turbo.
-          key: turbo-v5-${{ runner.os }}-${{ hashFiles('packages/**/src/**/*.rs') }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }}
+          key: turbo-v4-${{ runner.os }}-${{ hashFiles('**/packages/**/src/**/*.rs') }}-${{ github.sha }}
           fail-on-cache-miss: true
       - name: Setup Pages
         id: pages
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7f10f7df3d..9913d62e89 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
@@ -603,10 +604,10 @@ importers:
         version: 0.9.1
       '@lynx-js/lynx-ui':
         specifier: ^3.133.0
-        version: 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
+        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: ^0.121.0
-        version: 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+        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)
@@ -1303,7 +1304,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:^
@@ -4029,12 +4030,9 @@ 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-20260424024911-12b794f':
-    resolution: {integrity: sha512-MQ+xjPL2f1P9/eCAdkT2h9cJRXl1qqhSJDX9GkPETt3UAepLo5N+HbGB8Qr3IUzqGDWMr3Mj76my1P0pLkKVDg==}
-
   '@lynx-js/internal-preact@10.29.1-20260519060144-e6da44c':
     resolution: {integrity: sha512-h2pRrt5oLK9LT1NkjyprtzJij/AdZGvv3CN6B5edL4chixqvITbxoCSdYy667Hl6+uKOBuxmCNZoDddgRfcLnw==}
 
@@ -4047,161 +4045,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':
@@ -4213,16 +4211,7 @@ packages:
   '@lynx-js/react-use@0.1.3':
     resolution: {integrity: sha512-48NX1DZfIqdpcFPKR3SdI/E0D2INJzgMDtl9IK0vbqWKPgj6LgUPZN0iqIDd7Juy3in5c2bv6E9jCpoq5ONeVw==}
     peerDependencies:
-      '@lynx-js/react': '>=0.105.1'
-
-  '@lynx-js/react@0.121.0':
-    resolution: {integrity: sha512-V3/1+kRM7ugFZbhfldnPyJH65gZI06qa9E2/lGM8b+almHWzn+i9G1imMZiHROKlkOT495TauMOH4FiH1U47Fw==}
-    peerDependencies:
-      '@lynx-js/types': '*'
-      '@types/react': ^18
-    peerDependenciesMeta:
-      '@lynx-js/types':
-        optional: true
+      '@lynx-js/react': workspace:*
 
   '@lynx-js/tasm@0.0.39':
     resolution: {integrity: sha512-FNIV6Cc2K0wCKOHVMfpr3M6kpIZqHHNI02GpVl+h0ClyyK44jxEO+lf58gLFD5E3o0hJ1cp3H2OBIxSUJGkPDw==}
@@ -13734,35 +13723,17 @@ snapshots:
     dependencies:
       '@lukeed/csprng': 1.1.0
 
-  '@lynx-js/gesture-runtime@2.1.1(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)':
-    dependencies:
-      '@lynx-js/react': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
-      '@lynx-js/types': 3.7.0
-
   '@lynx-js/gesture-runtime@2.1.1(@lynx-js/react@packages+react)(@lynx-js/types@3.7.0)':
     dependencies:
       '@lynx-js/react': link:packages/react
       '@lynx-js/types': 3.7.0
 
-  '@lynx-js/internal-preact@10.29.1-20260424024911-12b794f': {}
-
   '@lynx-js/internal-preact@10.29.1-20260519060144-e6da44c': {}
 
   '@lynx-js/luna-styles@0.1.0': {}
 
   '@lynx-js/lynx-core@0.1.3': {}
 
-  '@lynx-js/lynx-ui-button@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
-      '@lynx-js/types': 3.7.0
-      '@types/react': 19.2.14
-      clsx: 2.1.1
-    transitivePeerDependencies:
-      - react
-      - react-dom
-
   '@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)':
     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)
@@ -13774,11 +13745,10 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-checkbox@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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-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-button': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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
@@ -13798,13 +13768,14 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-common@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)
-      '@lynx-js/react': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
-      '@lynx-js/react-use': 0.1.3(@lynx-js/react@0.121.0(@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-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
@@ -13820,16 +13791,13 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-dialog@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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
-      clsx: 2.1.1
     transitivePeerDependencies:
       - react
       - react-dom
@@ -13848,13 +13816,16 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-draggable@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
-      '@lynx-js/react-use': 0.1.3(@lynx-js/react@0.121.0(@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-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
@@ -13870,12 +13841,11 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-feed-list@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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:
@@ -13894,15 +13864,12 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-form@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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:
@@ -13924,11 +13891,15 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-input@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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:
@@ -13946,10 +13917,11 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-lazy-component@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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:
@@ -13966,11 +13938,10 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-list@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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:
@@ -13988,10 +13959,11 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-overlay@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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:
@@ -14008,16 +13980,12 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-popover@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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
@@ -14036,10 +14004,13 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-presence@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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
@@ -14058,11 +14029,10 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-radio-group@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-button': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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
@@ -14082,14 +14052,14 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-scroll-view@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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
@@ -14106,19 +14076,15 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-sheet@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
-      '@lynx-js/react': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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
-      clsx: 2.1.1
     transitivePeerDependencies:
-      - '@emotion/is-prop-valid'
       - react
       - react-dom
 
@@ -14138,13 +14104,19 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-slider@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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
 
@@ -14158,11 +14130,10 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-sortable@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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:
@@ -14180,11 +14151,11 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-swipe-action@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/gesture-runtime': 2.1.1(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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:
@@ -14202,11 +14173,11 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-swiper@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
-      '@lynx-js/react-use': 0.1.3(@lynx-js/react@0.121.0(@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/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:
@@ -14224,13 +14195,13 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui-switch@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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)':
     dependencies:
-      '@lynx-js/lynx-ui-common': 3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+      '@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
-      clsx: 2.1.1
     transitivePeerDependencies:
       - react
       - react-dom
@@ -14246,33 +14217,14 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/lynx-ui@3.133.0(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@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': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
+  '@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:
-      - '@emotion/is-prop-valid'
       - react
       - react-dom
 
@@ -14306,14 +14258,31 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/motion@0.0.3(@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14))(@lynx-js/types@3.7.0)(react-dom@19.2.4(react@19.2.5))(react@19.2.5)':
-    dependencies:
-      '@lynx-js/react': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
-      framer-motion: 12.34.1(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
-      motion-dom: 12.23.12
-      motion-utils: 12.23.6
-    optionalDependencies:
+  '@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
@@ -14337,16 +14306,6 @@ snapshots:
       errorstacks: 2.4.1
       htm: 3.1.1
 
-  '@lynx-js/react-use@0.1.3(@lynx-js/react@0.121.0(@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/react': 0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)
-      immer: 10.1.1
-      nanoid: 5.1.11
-      react-use: 17.6.0(react-dom@19.2.4(react@19.2.5))(react@19.2.5)
-    transitivePeerDependencies:
-      - react
-      - react-dom
-
   '@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)':
     dependencies:
       '@lynx-js/react': link:packages/react
@@ -14357,13 +14316,6 @@ snapshots:
       - react
       - react-dom
 
-  '@lynx-js/react@0.121.0(@lynx-js/types@3.7.0)(@types/react@19.2.14)':
-    dependencies:
-      '@types/react': 19.2.14
-      preact: '@lynx-js/internal-preact@10.29.1-20260424024911-12b794f'
-    optionalDependencies:
-      '@lynx-js/types': 3.7.0
-
   '@lynx-js/tasm@0.0.39': {}
 
   '@lynx-js/trace-processor@0.0.1':
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 640f7ef0bc..79cca9b678 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -70,6 +70,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"

From ddcb5b3cc251ca9b93f0f824a3f1a764f3b048dc Mon Sep 17 00:00:00 2001
From: BitterGourd <91231822+gaoachao@users.noreply.github.com>
Date: Thu, 28 May 2026 00:54:24 +0800
Subject: [PATCH 7/7] fix(genui): generate catalog before ui judge tests

---
 .github/genui-tsconfig.instructions.md |  2 ++
 packages/genui/cli/bin/cli.js          |  7 +++++--
 packages/genui/package.json            |  7 +++++++
 packages/genui/ui-judge/package.json   |  4 +++-
 pnpm-lock.yaml                         | 22 ++++++++++++++++++++++
 5 files changed, 39 insertions(+), 3 deletions(-)

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/packages/genui/cli/bin/cli.js b/packages/genui/cli/bin/cli.js
index 00a55e0ae5..f6ecb62951 100755
--- a/packages/genui/cli/bin/cli.js
+++ b/packages/genui/cli/bin/cli.js
@@ -266,6 +266,9 @@ function printPackageVersion() {
 }
 
 function isMain(moduleUrl) {
-  return process.argv[1] !== undefined
-    && moduleUrl === pathToFileURL(process.argv[1]).href;
+  if (process.argv[1] === undefined) {
+    return false;
+  }
+
+  return moduleUrl === pathToFileURL(fs.realpathSync(process.argv[1])).href;
 }
diff --git a/packages/genui/package.json b/packages/genui/package.json
index 3ea44b266a..593e6a8d2d 100644
--- a/packages/genui/package.json
+++ b/packages/genui/package.json
@@ -102,6 +102,13 @@
     "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"
diff --git a/packages/genui/ui-judge/package.json b/packages/genui/ui-judge/package.json
index c40b9131c6..f875fe253b 100644
--- a/packages/genui/ui-judge/package.json
+++ b/packages/genui/ui-judge/package.json
@@ -20,7 +20,7 @@
   ],
   "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:*",
@@ -28,6 +28,8 @@
     "@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/pnpm-lock.yaml b/pnpm-lock.yaml
index 66b53d26b2..9774801763 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -620,6 +620,22 @@ importers:
       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:
@@ -815,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