Skip to content

fix(studio): authorable Automations + Interfaces-nav in a fresh package - #2198

Merged
os-zhuang merged 1 commit into
mainfrom
feat/journey-polish
Jul 3, 2026
Merged

fix(studio): authorable Automations + Interfaces-nav in a fresh package#2198
os-zhuang merged 1 commit into
mainfrom
feat/journey-polish

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

What

Dogfooding a brand-new package end-to-end in the browser (design objects → automations → interfaces → publish → use) surfaced two blocking dead-ends in the pillar Studio. Both are fixed here, plus a small i18n gap.

1. Automations pillar couldn't create a flow

A package with zero flows rendered an endless 加载中… (loading conflated with empty) and had no create affordance — automations could never be authored.

  • Track a listed flag → real empty state 还没有自动化 — 点「新建」开始.
  • Add a + 新建 inline creator (label + identifier) that saves a minimal, valid start → end autolaunched flow skeleton as a draft and opens it in the flow designer.

2. Interfaces nav items couldn't be bound to a target — and silently failed to save

Selecting a nav item showed no inspector, and the shape the editor produced ({ label, object }, no id/type) failed the app spec's navigation union (navigation.N: Invalid input), so the draft never persisted and the published app navigation stayed empty.

  • Render a StudioNavItemInspector in the right panel for navSel, with a business-friendly object picker populated from the package's published ∪ draft objects.
  • Emit a spec-valid ObjectNavItem{ id (snake_case), type: 'object', objectName, label }.
  • doNavSave drops still-unbound placeholders and backfills a snake_case id, so one blank item can't fail the whole save.

3. Home builder-cover i18n

Fills in home.build.* / home.template.* (en/zh) so the "Build an app" / "Start with a template" cards resolve real strings.

Verification

  • Browser E2E: designed 3 related objects (with select + lookup fields) → created a flow → bound nav to objects → user-initiated atomic publish → standalone /apps/recruiting_app renders a 3-item sidebar (申请/职位/候选人) and the application list with resolved lookups (张三 / 高级前端工程师 / 投递).
  • @object-ui/app-shell type-check clean; 964/964 app-shell tests pass.

🤖 Generated with Claude Code

Dogfooding a brand-new package end-to-end surfaced two blocking dead-ends in
the pillar Studio:
- Automations pillar could not create a flow — a zero-flow package showed an
endless '加载中…' (loading conflated with empty) and had no create button.
Add a listed-state flag (real '还没有自动化' empty state) + a '+ 新建' inline
creator that saves a minimal start→end autolaunched skeleton draft and opens
it in the flow designer.
- Interfaces nav items could not be bound to a target AND silently failed to
save: the editor produced { label, object } (no id/type), which fails the
app spec's navigation union ('navigation.N: Invalid input'), so drafts never
persisted and published nav stayed empty. Render a StudioNavItemInspector
(right panel) with an object picker from the package's published ∪ draft
objects, emitting a spec-valid ObjectNavItem { id, type:'object',
objectName, label }; nav save drops unbound placeholders + backfills a
snake_case id.
Also fills in home.build.* / home.template.* i18n (en/zh) for the Home
builder-cover cards.
Verified end-to-end in the browser: designed 3 related objects → created a
flow → bound nav to objects → atomic publish → standalone app renders a
3-item sidebar with the application list and resolved lookups.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 3, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredJul 3, 2026 8:01pm

Request Review

@os-zhuang
os-zhuang merged commit 790558b into mainJul 3, 2026
10 checks passed
@os-zhuang
os-zhuang deleted the feat/journey-polish branch July 3, 2026 20:02
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)59.3 KB350 KB
Entry fileindex-OdKxe61A.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)7.51KB2.72KB
app-shell (runtime-config.js)4.72KB1.69KB
app-shell (types.js)0.01KB0.04KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)17.90KB3.67KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)4.79KB1.88KB
auth (LoginForm.js)9.55KB3.36KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.63KB2.15KB
auth (SocialSignInButtons.js)8.89KB3.61KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)26.07KB6.30KB
auth (createAuthenticatedFetch.js)3.93KB1.55KB
auth (index.js)1.75KB0.76KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.29KB0.82KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)18.38KB4.49KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)3.65KB1.42KB
collaboration (PresenceProvider.js)2.42KB0.96KB
collaboration (index.js)1.25KB0.53KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)435.62KB93.55KB
core (index.js)1.65KB0.59KB
create-plugin (index.js)9.28KB2.98KB
data-objectstack (index.js)109.24KB26.96KB
fields (index.js)184.79KB45.10KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.46KB0.96KB
i18n (pickLocalized.js)1.31KB0.67KB
i18n (provider.js)5.37KB1.72KB
i18n (useObjectLabel.js)21.15KB4.68KB
i18n (useSafeTranslation.js)2.68KB0.98KB
layout (index.js)36.30KB10.04KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)4.42KB1.27KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)1.77KB0.77KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)5.09KB1.84KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.46KB1.03KB
permissions (evaluator.js)4.00KB1.23KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.50KB0.70KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)45.10KB12.33KB
plugin-charts (index.js)46.11KB12.99KB
plugin-chatbot (index.js)172.75KB41.13KB
plugin-dashboard (index.js)108.28KB26.86KB
plugin-designer (index.js)213.48KB42.95KB
plugin-detail (index.js)201.40KB48.47KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)99.18KB24.14KB
plugin-gantt (index.js)136.67KB33.88KB
plugin-grid (index.js)164.23KB43.35KB
plugin-kanban (index.js)48.15KB12.94KB
plugin-list (index.js)97.89KB23.09KB
plugin-map (index.js)16.02KB4.98KB
plugin-markdown (index.js)13.65KB4.67KB
plugin-report (index.js)37.83KB9.97KB
plugin-timeline (index.js)25.37KB7.20KB
plugin-tree (index.js)8.21KB2.76KB
plugin-view (index.js)84.50KB20.37KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.55KB0.67KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)3.19KB1.38KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)18.23KB5.97KB
react (index.js)0.76KB0.42KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)2.16KB0.94KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
tenant (TenantContext.js)0.31KB0.25KB
tenant (TenantGuard.js)1.04KB0.43KB
tenant (TenantProvider.js)2.76KB0.98KB
tenant (TenantScopedQuery.js)0.77KB0.44KB
tenant (index.js)0.75KB0.38KB
tenant (resolver.js)2.64KB0.76KB
tenant (useTenant.js)0.50KB0.32KB
tenant (useTenantBranding.js)0.62KB0.39KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)0.77KB0.41KB
types (disclosure.js)0.20KB0.18KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (index.js)1.54KB0.68KB
types (layout.js)0.20KB0.18KB
types (mobile.js)0.20KB0.18KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.26KB1.96KB
types (tenant.js)0.20KB0.18KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)0.75KB0.46KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@os-zhuang