Skip to content

types: declare the gantt block face on ObjectGanttSchema (fixes #6475) - #6704

Merged
os-sales merged 1 commit into
mainfrom
claude/issue-6475-gantt-block-face
Aug 28, 2026
Merged

types: declare the gantt block face on ObjectGanttSchema (fixes #6475)#6704
os-sales merged 1 commit into
mainfrom
claude/issue-6475-gantt-block-face

Conversation

@os-sales

Copy link
Copy Markdown
Collaborator

Fixes #6475

What changed

Declares the gantt block face on ObjectGanttSchema, on both declaration faces:

// packages/types/src/objectql.ts
gantt?: GanttConfig;

// packages/types/src/zod/objectql.zod.ts
gantt: SpecGanttConfigSchema.extend(GanttConfigExtensionFields).optional(),

GanttConfigExtensionFields (added by #6472) is reused unchanged, so both authoring faces (the nested block and the flattened top-level spelling) are built from one field map and cannot fork. This is the 28th and last of the keys objectui#6051's census found getGanttConfig reading off schema that ObjectGanttSchema did not declare — severed out of that PR because, unlike the other 27, it narrows the accept set rather than only naming a spelling.

Maintainer ruling followed exactly

Ruling of 2026-08-27 (以上同意), Option A: declare as-is, spec requiredness enforces immediately, no warning window.

  • C (a one-release warning window) — excluded by the standing startup-stage no-gradualism rule (objectstack#12668): no phased window without named external-user evidence, and none exists.
  • B (relaxing requiredness on the objectui face) — declined, forks the vocabulary from the spec.

Framing: this surfaces existing breakage, it does not create new breakage

A gantt block missing the required trio is already non-functional at runtime today: getGanttConfig's block branch (packages/plugin-gantt/src/ObjectGantt.tsx) already feeds the block to GanttConfigSchema.safeParse and logs [ObjectGantt] Invalid gantt configuration on failure. What changes is when the author is told — runtime console silence becomes an authoring-time refusal that names the missing field. This is a declared = enforced restoration; the spec has required startDateField/endDateField/titleField since rc.6, nothing here invents requiredness.

Clause-② — exactly what the CLI now refuses that it accepted before

ObjectGanttSchema is a member of AnyComponentSchema, so it reaches safeValidateSchema and therefore packages/cli/src/commands/{validate,check}.ts.

Before After
gantt block present, missing any of startDateField/endDateField/titleField Accepted (block rode through .passthrough() unvalidated) Refused, naming the missing field
gantt block present, all three fields present Accepted Accepted (unchanged)
No gantt block (flat spelling, or none) Accepted Accepted (unchanged)

Nothing else about ObjectGanttSchema's accept set moves.

Re-taken census on current main (post-#6472), populations kept separate

git ls-files | wc -l5641 tracked files today (the original 5095-file scan predated #6472's landing and the file count has grown since). A bare grep -n "gantt:" returns 121 hits across 56 files and conflates unrelated populations, per the card's own warning. Re-run with each population isolated and a positive control on every zero:

  1. i18n translation namespaces literally named ganttpackages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts (10 files, 20 gantt: { hits — a nested chrome-string namespace, e.g. gantt: { column: { taskName: … } }), plus prose describing that namespace (packages/plugin-gantt/docs/verification/README.md, packages/plugin-gantt/scripts/verify-i18n.mjs, packages/plugin-gantt/demo/main.tsx's own local zh pack). None reach ObjectGanttSchema.
  2. Prose — CHANGELOG entries and .changeset/*.md bodies referencing gantt: as a conventional-commit scope prefix or descriptive text (7 files). Not metadata.
  3. View-type discriminator/lookup maps keyed by the literal gantt (icon maps, label maps, the Create-View-Dialog per-view-type field-descriptor array, packages/cli/src/utils/known-schema-types.ts's 'plugin-gantt:object-gantt' registry string) — 7 files. These key a lookup table by the view-type string, not an authored ObjectGanttSchema.gantt value.
  4. as any-cast test fixtures that never reach the zod mirrorplugin-gantt's own 14 .test.tsx files (all schema={{ … } as any} props, including ObjectGantt.blockPrecedence.test.tsx's deliberately-incomplete { colorField: 'flat_color' } block used to test the renderer's own dev-mode warning, not CLI validation), plus packages/react/src/spec-bridge/__tests__/P1SpecBridge.test.ts (transformListView(spec: any), a pure pass-through with no validation) and packages/app-shell/src/views/ObjectView.titleFieldConvergence.test.tsx (mocks ListView to capture props.schema, never renders or parses it). Positive control: pnpm --filter @object-ui/plugin-gantt type-check — clean (0 errors) — proves these are not silently-any-typed; they are genuinely never parsed.
  5. ListViewSchema.gantt — a different schema (type: 'list-view'), unaffected by this PR: it already takes the spec's GanttConfigSchema unmodified (not .partial()'d, unlike kanban/calendar/gallery/timeline) via specFieldsExcept(...), so it already required the trio before this PR and continues unchanged. Two fixtures under this population (packages/plugin-list/src/__tests__/ListView.test.tsx:2696,2721, missing titleField) are pre-existing as unknown as ListViewSchema-cast render fixtures that never reach .safeParse — not a casualty of this PR, and not this PR's schema.
  6. Doc/prose code-fence examplescontent/docs/plugins/plugin-gantt.mdx (11 gantt: { blocks, all 11 trio-complete), packages/plugin-gantt/README.md (one commented+elided illustration // gantt: { startDateField: …, endDateField: …, … }, and one flat-face const gantt: ObjectGanttSchema = {...} — a variable named gantt, not a gantt: block key), skills/objectui/guides/page-builder.md (1 "gantt": { block, trio-complete — a different, pre-existing defect in the same example is already tracked at Published skill objectui/guides/page-builder.md presents six GanttConfig keys as top-level siblings of the gantt block — beside a block they are read by nothing #6508, not restated here). None of these are compiled or validated; all are trio-complete regardless.
  7. Real authored JSON metadata reaching ObjectGanttSchema's discriminatorexamples/schema-catalog/src/schemas/plugin-gantt/{construction-project-phases,project-timeline-with-dependencies,sprint-development-timeline}.json (3 files, type: "object-gantt", each with a "gantt": {...} block). This is the population closest to "what a human or AI author would actually write" in this repository. All 3 are trio-complete. (Not machine-validated by any CI workflow today — confirmed by grepping .github/workflows/** for schema-catalog, which returns only comments — so this PR does not newly break CI on them; the finding is that they would pass even if it did.)
  8. Unrelated substring false-positivespnpm-lock.yaml (packages/plugin-gantt: workspace path), packages/plugin-timeline/src/renderer.tsx + examples/schema-catalog/.../plugin-timeline/gantt-style-timeline.json + packages/components/src/renderers/complex/TIMELINE.md (all TimelineSchema's own variant: 'gantt', a different schema), content/docs/api/schema-reference.md (enum value list), packages/plugin-gantt/src/GanttView.tsx (an export-filename fallback string), packages/plugin-gantt/package.json (a keywords entry).

Net: zero blocks missing the trio in every population that can plausibly reach ObjectGanttSchema's parser — including the one population (examples/schema-catalog JSON) that is genuine authored metadata rather than a TS/TSX test fixture. This matches, and modestly strengthens, the original 5095-file scan's finding on the now-5641-file tree.

The out-of-tree question the ruling asked to be recorded rather than answered here: whether authored gantt block metadata missing titleField exists outside this repository (customer apps, objectstack fixtures) remains unmeasured by an in-repo census by construction — the maintainer ruled Option A anyway, per the standing no-gradualism rule.

The trio-missing pin, shown red before the fix (ablation)

packages/types/src/__tests__/gantt-flat-config-declared-keys.test.ts's test "the gantt BLOCK face is still undeclared, and today rides through UNVALIDATED" asserted the pre-fix state (gantt absent from ObjectGanttSchema.shape, a trio-missing block accepted). It has been rewritten to assert the post-fix state — renamed "the gantt BLOCK face is declared, and the spec trio now enforces at parse time" — asserting: gantt now in .shape; a block missing titleField is refused and names the missing field; an empty block is refused; a wrong-typed gantt value is refused; a trio-complete block is accepted.

Ablation, prediction before running:

  1. Mutategit checkout HEAD~1 -- packages/types/src/objectql.ts packages/types/src/zod/objectql.zod.ts (revert only the two production files to their pre-fix content, keeping the rewritten test at HEAD). Predicted: the rewritten pin test fails red on expect(Object.keys(ObjectGanttSchema.shape)).toContain('gantt'); the other 16 tests in the two files (the flat 27-key pins, zod-mirror-parity) stay green, since nothing else in this PR touches them.
    • Mutation confirmed on disk (anchored counts, not editor exit code): grep -c 'gantt?: GanttConfig;' objectql.ts 1→0; grep -c 'gantt: SpecGanttConfigSchema.extend(GanttConfigExtensionFields)' objectql.zod.ts 1→0; the old severed-state comment marker is DELIBERATELY still undeclared here reappeared (0→1).
    • Observed, matching the prediction exactly: Test Files 1 failed | 1 passed (2) / Tests 1 failed | 16 passed (17). The one failure is precisely the predicted assertion: AssertionError: expected [ Array(64) ] to include 'gantt' at the toContain('gantt') line.
  2. Restoregit checkout HEAD -- packages/types/src/objectql.ts packages/types/src/zod/objectql.zod.ts. Confirmed: git diff HEAD --stat empty; git hash-object on each of the two files equals git rev-parse HEAD: plus that file's path, for both files; the full pin suite (gantt-flat-config-declared-keys.test.ts + zod-mirror-parity.test.ts + gantt-declared-keys.test.ts) reruns green (26/26).

#6472's derived-pin family — untouched, verified still passing

FlatFaceGaps (in the same test file) — the type-level pin that Exclude of DeclaredKeys of GanttConfig, against DeclaredKeys of the flat ObjectGanttSchemaTS, must be never — is unmodified. Adding gantt to ObjectGanttSchema's own declared keys only grows the Exclude's target set (the flat face's declared-keys side), which cannot introduce residue on the source side. Still compiles clean, confirmed by the green type-check run below (which compiles every *.test.ts in the package, including the @ts-expect-error compile-time pins).

A second, unrelated fix this PR needed to stay green

zod-mirror-parity.test.ts's SPEC_DERIVED_PAIRS re-check scans raw text between export const boundaries in packages/types/src/zod/*.zod.ts for a \bSpec[A-Z]\w* token to detect which mirrors reference a spec schema. My first pass at the docstring above the private GanttConfigExtensionFields const — which sits textually between the ObjectTreeSchema and ObjectGanttSchema export boundaries — mentioned SpecGanttConfigSchema in prose, and that mention was misattributed to ObjectTreeSchema (which references no spec schema at all), flipping SPEC_DERIVED_PAIRS matches what the mirror sources actually do red. Fixed by rewording the docstring to avoid the literal token, with a comment recording the trap so the next editor of that docstring doesn't reintroduce it.

Gate table (all on commit 698685911, the current HEAD)

Gate Command Verdict
packages/types type-check (tsc --noEmit + examples + test projects — compiles every *.test.ts, including the @ts-expect-error compile-time pins) pnpm --filter @object-ui/types type-check ✅ exit 0, no output
packages/plugin-gantt type-check (consumer sweep, dependency closure built first) pnpm --filter @object-ui/plugin-gantt type-check ✅ exit 0, no output
packages/types full vitest (includes zod-mirror-parity, both gantt derived-pin files, base-schema parity) pnpm exec vitest run --root . packages/types/ Test Files 69 passed (69) / Tests 801 passed (801)
packages/plugin-gantt full vitest (consumer sweep) pnpm exec vitest run --root . packages/plugin-gantt/ Test Files 51 passed (51) / Tests 422 passed (422)
check:control-bytes node scripts/check-control-bytes.mjs scanned 5557 tracked text file(s)
check:spec-symbols (relevant: this PR derives from SpecGanttConfigSchema) node scripts/check-spec-symbol-derivation.mjs ✅ (unchanged counts)
changeset presence node scripts/check-changeset-presence.mjs 1 changeset(s) added
changeset no-major node scripts/check-changeset-no-major.mjs No changeset declares a major bump
packages/types lint, narrowed to the 3 touched files, --format json pnpm exec eslint src/objectql.ts src/zod/objectql.zod.ts src/__tests__/gantt-flat-config-declared-keys.test.ts --format json 0 errors, 19 warnings — all pre-existing: grep -c '\bany\b' on objectql.ts is identically 25 on origin/main and on this branch, and linting origin/main's copy of the file directly reproduces the same 19 no-explicit-any warnings byte-for-byte
packages/types lint, full package (canonical gate command) pnpm --filter @object-ui/types lint ✅ exit 0, 247 problems (0 errors, 247 warnings)

Narrowing proof (three legs, per the repo's own convention): ① the 247-warning population above is read from eslint's own --format json/text summary, not guessed; ② eslint.config.js has no parserOptions.project/projectService anywhere in this repo — type-aware linting is off, so nothing in this diff can move any judgment on a file this diff did not touch; ③ the direct A/B (lint origin/main's objectql.ts bytes vs. this branch's) reproduces the identical 19-warning population, proving the narrowed run and the full-package run agree and that this diff added zero lint findings.

objectui has no scripts/pm/os-verify-lock.sh or scripts/pm/dispatch-gates.mjs — that shared-lock/gate-derivation infrastructure lives only in objectstack. Gates above were run directly per this repo's own AGENTS.md testing conventions (root-relative pnpm exec vitest run plus a path, never pnpm --filter PKG test or cd packages/x), and the union above is the full set the dispatch named plus the one adjacent gate (check:spec-symbols) this PR's spec-derived declaration touches.

Fence held

Only packages/types/src/objectql.ts, packages/types/src/zod/objectql.zod.ts, packages/types/src/__tests__/gantt-flat-config-declared-keys.test.ts (updating the pin this PR's ruling directly obsoletes), and the changeset. packages/types/src/index.ts and its package.json exports map (held by #6527's B patch round) were not touched or read for editing purposes.

Generated by Claude Code


Generated by Claude Code

Declares `gantt?: GanttConfig` on both `ObjectGanttSchema` faces (TS
interface + zod mirror), closing the last of the 28 keys objectui#6051
measured that `ObjectGanttSchema` did not declare. Unlike the other 27,
this one narrows the accept set: a `gantt` block previously rode through
`.passthrough()` unvalidated, and is now parsed against the spec's
`GanttConfigSchema`, which requires `startDateField`/`endDateField`/
`titleField`. Maintainer ruling, objectui#6475 (2026-08-27), Option A:
enforce immediately, no warning window.

Also updates the gantt-flat-config-declared-keys.test.ts pin that
previously asserted the block face was undeclared, to assert the new
enforced behaviour (trio-missing refused, trio-complete accepted), and
fixes a zod-mirror-parity.test.ts false-positive triggered by a `Spec`
token in a docstring landing inside ObjectTreeSchema's export-boundary
scan window.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_8ca04858-ea8e-5b85-9182-de59aa49e00c
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 49 chunks) 3231.9 KB 3266.6 KB
Main entry chunk (gzip) 157.2 KB 350 KB
Entry file index-otkm5EOv.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 11.89KB 4.50KB
app-shell (runtime-config.js) 20.61KB 7.35KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
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) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 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.68KB 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) 509.32KB 115.60KB
core (index.js) 5.30KB 2.13KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 173.10KB 47.96KB
fields (index.js) 239.05KB 60.06KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.44KB 1.39KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 33.40KB 8.71KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.95KB 10.97KB
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.75KB
mobile (index.js) 1.55KB 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.72KB 0.42KB
mobile (useResponsiveConfig.js) 1.37KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 9.53KB 3.38KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 4.64KB 1.50KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 1.93KB 0.88KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 46.89KB 12.91KB
plugin-charts (index.js) 64.66KB 18.32KB
plugin-chatbot (index.js) 190.33KB 45.10KB
plugin-dashboard (index.js) 133.26KB 34.43KB
plugin-designer (index.js) 212.80KB 43.15KB
plugin-detail (index.js) 245.29KB 62.39KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.01KB 32.23KB
plugin-gantt (index.js) 165.20KB 40.37KB
plugin-grid (index.js) 201.51KB 54.54KB
plugin-kanban (index.js) 53.11KB 14.62KB
plugin-list (index.js) 113.01KB 27.57KB
plugin-map (index.js) 20.17KB 6.66KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 43.51KB 11.94KB
plugin-timeline (index.js) 26.44KB 7.59KB
plugin-tree (index.js) 8.91KB 3.05KB
plugin-view (index.js) 85.87KB 21.12KB
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.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 65.97KB 21.98KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 2.44KB 1.21KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
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) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 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-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.72KB 2.24KB
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 (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
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

@os-sales
os-sales added this pull request to the merge queue Aug 28, 2026
Merged via the queue into main with commit 713db46 Aug 28, 2026
30 checks passed
@os-sales
os-sales deleted the claude/issue-6475-gantt-block-face branch August 28, 2026 17:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants