Skip to content

fix(cli): 生成的临时 app 补齐 lucide-react 与七个 plugin 声明,两处清单区间锚到仓内 - #3854

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-3827-cli-appgen-manifest
Aug 8, 2026
Merged

fix(cli): 生成的临时 app 补齐 lucide-react 与七个 plugin 声明,两处清单区间锚到仓内#3854
yinlianghui merged 1 commit into
mainfrom
claude/issue-3827-cli-appgen-manifest

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes #3827

方向 1(PM 缺省)。前置核实先做,结论决定了 lucide 的处置方向与 #3755 相反。

1. LucideIcons 活性核实:两处 import 都活,故补声明而非删 import

issue 方向 3 问 import * as LucideIcons(:591)与具名 { Moon, Sun }(:592)是否真被生成代码用到。逐一核到使用点(行号为生成的 src/Layout.tsx 内偏移):

import 使用点 结论
import * as LucideIcons LucideIcons[name](DynamicIcon 动态查表)、LucideIcons.ChevronsUpDownLucideIcons.SunLucideIcons.MoonLucideIcons.Monitor ,5 处
import { Moon, Sun } 主题开关 trigger 里的 < Sun /> 与 < Moon />(两个 className 带 rotate/scale 过渡) ,2 处

所以这里与 #3755相反的处置:那单删掉了一条无人 import 的 lucide-react 声明,本单补上一条被 import 却没声明的。同一条规则(声明面与 import 面必须对齐)在两个方向上的两种落法 —— 这点写进了测试注释,避免下一个 agent 误以为"lucide 一律该删"。

commands/dev.ts 里本来有一段消费侧兜底:把 lucide-react alias 到从 packages/components 解析出的路径,注释原话是 "avoid dependency not found in temp app"。但那段只在 monorepo 分支跑,serve.ts / build.ts 完全没有。按 contract-first,缺声明的账要记在生产者(生成的清单)上,alias 退回成 workspace 便利。

2. 越界量到的:未声明集合是八个包,不是一个

src/App.tsx(两个生成器都有)以副作用 import 拉七个插件注册组件:@object-ui/plugin-charts / -editor / -kanban / -markdown / -form / -grid / -view,两处清单都从未声明。issue 正文说"作者核对过一次 import 与声明的对应关系,只漏掉紧邻下一行的 lucide-react" —— 实测这个判断偏乐观:漏的是八个。

这不算扩面:同一个函数、同一张清单、同一类缺陷,而且移植进来的闸门在这七个包还没声明时根本无法变绿(见下方反向验证输出)。修一个留七个会让新闸门只能靠豁免名单活着。

3. 锚定对照表(生成值 ↔ 仓内锚源)

锚源均为实测,扫 46 个仓内 manifest 的 dependencies + devDependencies(排除 peer —— peer 说的是"能接受什么",与"本仓实际装哪个"是两回事):

原生成值 新生成值 锚源 一致性
@object-ui/react 等 9 个平台包 ^0.1.0(仅 2 个被声明) ^17.3.0 由 CLI 自身版本推导 fixed 组 + 各包实测版本
lucide-react (未声明) ^1.28.0 23 个仓内 manifest 一致 一致
react / react-dom ^18.3.1 19.2.8 仓根(14 / 9 处一致) 一致
@types/react ^18.3.12 19.2.18 仓根(30 处) 一致
@types/react-dom ^18.3.1 19.2.4 仓根(25 处) 一致
react-router-dom ^7.12.0 ^7.18.2 仓根(5 处) 一致
vite ^5.0.0 ^8.2.0 仓根(28 处) 一致
typescript ~5.7.3 ^6.0.3 仓根(38 处) 一致
@vitejs/plugin-react ^4.2.1 ^6.0.5 仓内 27 处(含 cli 自身),根未声明 一致
postcss ^8.5.6 ^8.5.26 仓内 5 处,根未声明 一致
autoprefixer ^10.4.23 ^10.5.4 仓根(4 处) 一致
tailwindcss ^3.4.19 ^3.4.19(有意不动) 见下

为什么 @object-ui/* 改成推导而不是写死字面量。 .changeset/config.json@object-ui/cli 与全部平台包放进同一个 fixed,永远同版本发布;于是 ^<自身版本> 既是当前值,又保证在 registry 上存在(用户手里的 cli 是哪版,兄弟包就在那版一起发过)。反过来说,写死字面量在这里不只是"可能变化石",而是化石发生器 —— fixed 组每次发布都换版本,任何硬编码区间隔天就旧。这正是 ^0.1.0 能落后 16 个 major 的机制。registry 实测:@object-ui/react latest=17.3.0、76 个版本、没有 0.1.0,所以 ^0.1.0 不是"落后",是解析不到任何已发布版本 —— issue 的判断在这点上完全站得住。

推导的前提(fixed 组不被拆)被单独断言,不是默认成立:见测试 pins the release lockstep that lets the platform range be derived,同时校验各包当前版本确实等于 cli 版本(配置写了 ≠ 事实如此)。

tailwindcss 有意留在 v3 并钉成显式 deferred。 仓内是 Tailwind 4(根 ^4.3.3,6 个 postcss.config.* 全用 @tailwindcss/postcss),而 @object-ui/components 的 peer 写 tailwindcss: ^4.2.1 —— 所以 ^3.4.19 不只是落后,是冲突。但抬区间不是版本编辑:生成的 index.css 是 v3 指令、postcss.config.js 用的是 v4 已迁走的 tailwindcss 插件键、tailwind.config.js 是 v3 config。只抬区间会得到"装得上、渲染不出样式"的 app,比现状更糟(看起来像修好了)。已带实测证据另开 #3852(含"仓内 objectui dev 今天就静默无样式"的复现),本 PR 把它钉成 TAILWIND_V3_DEFERRED 显式记账,并断言 components 的 peer 值,免得读成漏改。

4. 两条规则的移植与自检

生成器改为先产出 Record<路径, 内容> 再由 writer 落盘,测试因此断言在 CLI 真正写出的产物上(#3733/#3826 定的形状)。三条闸门,每条都配"种回缺陷"自检:

闸门 来源 今天判定的输入 自检
bare import 必须被清单声明 #3733(#3827 是其盲区) 非空(两个生成器全部 src/**) 内联 pre-fix 清单,断言点名全部 8 个
不得声明无人 import 的 versioned 依赖 #3755 / #3826 非空(routed 13 条、plain 9 条运行时区间) 把 lucide 种进 plain 清单(那边确实没人 import)→ 必须点名
src/** 不得从 entry 不可达 #3759 / #3826 非空(5–6 个生成文件) 抽掉 App.tsx./Layout import → 必须点名 src/Layout.tsx;另加"孤立 schema JSON"用例

移植时踩到的一处真陷阱(写下来给下一个搬这套规则的人):create-plugin 的 import 扫描正则只认单引号,因为它守的模板全是单引号。本处模板混用 —— 生成的 layout 写 from "lucide-react"src/theme-provider.tsxfrom "react"。照抄那个正则,闸门会正好瞎在 issue 报的两行之一(:592)。所以 importedPackagesOf 做成引号无关,并有一条测试专门钉住它能看见双引号形式与副作用形式。

unreachableGeneratedFilessrc/** 全部文件而非只判 .tsx?:生成的 schema JSON 写出来却没有对应 import,等于路由里不存在的页面 —— 这也是一类死产物。今天没有产物触发它,所以配了自检。

5. 反向验证(方向先判后跑)

预判(跑之前写下):把源码里的清单还原成 pre-#3827 → ① import 闸门、点名 lucide-react + 7 插件;② 锚表完整性(8 个键不再被声明);③ 区间锚定与落盘断言;④ "不得声明无人 import 的依赖"保持绿 —— pre-fix 缺陷是"import 了没声明的",不是"声明了没人 import 的",这条守的是反方向;⑤ 两条可达性闸门保持绿 —— 改清单动不了模块图。

实跑结果:五项全部与预判一致,4 failed | 15 passed:

× declares every package the generated sources import
  AssertionError: expected { plain: [], routed: [ …(8) ], …(1) } to deeply equal { plain: [], routed: [], …(1) }
  + "routed": [
  +   "@object-ui/plugin-charts", "@object-ui/plugin-editor", "@object-ui/plugin-form",
  +   "@object-ui/plugin-grid",   "@object-ui/plugin-kanban", "@object-ui/plugin-markdown",
  +   "@object-ui/plugin-view",   "lucide-react",
  + ]
× keeps both generated dependency maps under one anchor table
× sources every range from this repo instead of inventing one
  → @object-ui/components must track this CLI's own version: expected '^0.1.0' to be '^17.3.0'
× writes a manifest whose @object-ui ranges name this CLI version
  → @object-ui/react in the written manifest: expected '^0.1.0' to be '^17.3.0'
✓ declares no versioned runtime dependency the generated sources never import   ← 预判绿,实际绿
✓ writes no file unreachable from the entry index.html loads                     ← 预判绿,实际绿

第一轮反向验证时这条红只点了 7 个(plain 的断言先失败,vitest 就地停,routed 那条没跑到,lucide 只在锚表 diff 里露出来)。这是诊断质量问题而非闸门问题,已把三种形态合成一次断言,现在红会直接点名 8 个 —— 上面的输出就是改完之后重跑的。

6. 重构等价性:逐字节 before/after

先产出映射再落盘是重构,风险是悄悄改了生成内容。用同一份输入在改动前后各生成三种形态(plain / routed 无 appConfig / routed 有 appConfig)× 两种 cwd(仓内 monorepo、仓外),逐文件比对:package.json 外全部字节一致,package.json 的 diff 恰好就是上面那张锚定表。

顺带删掉 createTempApp 里一个死变量(第一份 tailwindConfig 被后面的 finalTailwindConfig 完全遮蔽,从未写盘),对产物零影响 —— 由上面的字节比对背书。

7. 生成产物冒烟

用真实入口 createTempApp / createTempAppWithRouting 生成到 mkdtempSync 目录,断言盘上每个文件与映射逐字节相等且没有多余文件,含嵌套 src/schemas/page0.json 真落地;finallyrmSync 清干净。故意不装依赖:仓内 hoist 会兜住缺声明,装成功什么也证明不了 —— 这正是本单的教训,所以断言面是清单结构,不是安装成功。

验证

  • pnpm exec vitest run packages/cli/Test Files 3 passed, Tests 57 passed(新增文件 19 条)
  • pnpm exec turbo run type-check --concurrency=2(仓根全量,CI 同命令)→ 78 successful, 78 total
  • pnpm exec eslint 两个改动文件 → 0 error;1 warning 是 (appConfig as any)?.title,与 origin/main 同,非本 PR 引入
  • node scripts/check-control-bytes.mjs → OK(3758 个文件);另做闸门外自扫 grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]' 两个改动文件 → 零命中

越界发现(均已单独立单,未在本 PR 修)


Generated by Claude Code

`createTempAppWithRouting` 生成的 layout 两处 import lucide-react(`import * as
LucideIcons` 喂 DynamicIcon 与四个 LucideIcons.* 图标,具名 `{ Moon, Sun }` 渲染主题
开关)—— 两处都活,但生成的 package.json 从未声明它。核实时又量到:两个生成器的
src/App.tsx 都以副作用 import 拉七个 @object-ui/plugin-*,同样从未声明;未声明集合是
八个包,不是 issue 报的一个。

@object-ui/* 的区间改为由本 CLI 自身版本推导:.changeset/config.json 把 @object-ui/cli
与全部平台包放在同一 fixed 组,永远同版本发布,故 `^<自身版本>` 既是当前值又保证在
registry 上存在。原先的 `^0.1.0` 对已发布到 17.x 的包解析不到任何版本(registry 无
0.1.0),而写死字面量本身就是化石发生器 —— fixed 组每次发布都换版本。

工具链区间锚到仓内实测值:vite ^5.0.0 -> ^8.2.0、typescript ~5.7.3 -> ^6.0.3、
@vitejs/plugin-react ^4.2.1 -> ^6.0.5、react/react-dom ^18.3.1 -> 19.2.8(@types/* 同
步)、react-router-dom ^7.12.0 -> ^7.18.2、postcss ^8.5.6 -> ^8.5.26、autoprefixer
^10.4.23 -> ^10.5.4。tailwindcss 有意留在 ^3.4.19 并钉成显式 deferred:生成的
index.css/postcss.config.js/tailwind.config.js 是 v3 全套,只抬区间会得到装得上但无样式
的 app,已另开 #3852。

两个生成器改为先产出文件映射再由 writer 落盘,测试因此断言在 CLI 真正写出的产物上。
移植三条结构性闸门(每条都配"种回缺陷"自检):bare import 必须被声明、不得声明无人
import 的 versioned 依赖、src/** 不得存在从 src/main.tsx 不可达的文件。移植提示:
create-plugin 的 import 扫描只认单引号,而本处模板混用引号,照抄会正好漏掉
`from "lucide-react"`。
@vercel

vercel Bot commented Aug 8, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Aug 8, 2026 9:24pm

Request Review

@github-actions github-actions Bot added the tests label Aug 8, 2026
@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.1 KB 350 KB
Entry file index-C--YVudt.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.66KB 3.13KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.65KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 482.41KB 106.35KB
core (index.js) 2.96KB 1.13KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 139.61KB 35.99KB
fields (index.js) 230.82KB 56.70KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.65KB 1.06KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 9.48KB 3.27KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 4.52KB 1.96KB
layout (index.js) 38.53KB 10.71KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.74KB
mobile (index.js) 1.50KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 44.98KB 12.37KB
plugin-charts (index.js) 61.04KB 17.31KB
plugin-chatbot (index.js) 180.33KB 42.79KB
plugin-dashboard (index.js) 117.21KB 30.27KB
plugin-designer (index.js) 210.51KB 42.51KB
plugin-detail (index.js) 236.14KB 58.81KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 112.10KB 27.10KB
plugin-gantt (index.js) 162.55KB 39.57KB
plugin-grid (index.js) 187.63KB 49.66KB
plugin-kanban (index.js) 48.30KB 13.28KB
plugin-list (index.js) 105.12KB 25.48KB
plugin-map (index.js) 16.81KB 5.24KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.58KB 10.58KB
plugin-timeline (index.js) 25.76KB 7.33KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.03KB 20.55KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 19.28KB 6.38KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.02KB 0.55KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 2.71KB 1.34KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Copy link
Copy Markdown
Collaborator Author

补一条本体之外的验证:已构建产物(dist 布局)里的版本推导也核过了。

platformPackageRange() 靠从 import.meta.url 逐级向上找 name@object-ui/clipackage.json 来拿自身版本,而不是拼一个固定相对深度 —— 因为同一份源码在仓内位于 src/utils/,发布后被 tsup 打进 dist/,任何写死的 ../package.json 只可能在其中一边对。这个差异值得实测,不能只靠推理,tsup 实际还把它打进了 dist/chunk-*.js(不是直接进 dist/cli.js)。

于是直接调构建后的产物,并且把 cwd 放在仓库之外:

$ pnpm --filter @object-ui/cli build     # ESM dist/chunk-OI7XSDR7.js 44.52 KB, DTS Build success
$ cd /tmp/<仓外目录> && node -e "import('.../packages/cli/dist/chunk-OI7XSDR7.js').then(m =>
    m.createTempAppWithRouting('./built-probe', [ ...一条路由... ], {title:'P',menu:[]}))"

=== manifest written by the BUILT (dist) artifact, cwd outside the repo ===
{
  "react": "19.2.8",
  "react-dom": "19.2.8",
  "react-router-dom": "^7.18.2",
  "lucide-react": "^1.28.0",
  "@object-ui/react": "^17.3.0",
  "@object-ui/components": "^17.3.0",
  "@object-ui/plugin-charts": "^17.3.0",
  "@object-ui/plugin-editor": "^17.3.0",
  "@object-ui/plugin-kanban": "^17.3.0",
  "@object-ui/plugin-markdown": "^17.3.0",
  "@object-ui/plugin-form": "^17.3.0",
  "@object-ui/plugin-grid": "^17.3.0",
  "@object-ui/plugin-view": "^17.3.0"
}

两点由此坐实:dist 与 src 深度不同但推导结果一致;仓外 cwd 也照样拿到 ^17.3.0 而不是回落成什么默认值。探针目录已删。

顺带说明该函数在解析不到时的取向:抛错,不猜。写出一份区间是编的清单,正是本单要修的那类缺陷,所以宁可让命令响亮地失败,也不静默产出一份装不上的 package.json


Generated by Claude Code


Generated by Claude Code

Copy link
Copy Markdown
Collaborator Author

✅ 验收(PM,session session_01GTRjn8xBqp75dk7kFupVRt)

实物核验:origin/claude/issue-3827-cli-appgen-manifestb22e0759f,单提交,3 文件 +1140/−363(生成器 + 测试 + changeset),不碰 content/docs/releases/**,与在飞任务文件面零相交;trailer 自查 0 命中。
CI 终态:19 检查全部 completed —— 17 success + 2 skipped(coverage / dependabot 按设计跳过),含 Type Check、Lint、Build & E2E、四个 Test shard、Bundle Analysis、Control Byte Scan、三个 Changeset 闸门全绿。

裁定要点:

转 ready 并挂 auto-merge。越界三单 #3852/#3853/#3855 已立,归分诊席。


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

packages/cli 的 createTempAppWithRouting 生成的 app import 了未声明的 lucide-react,且其工具链区间落后仓内一到三个 major

2 participants