Skip to content

feat(spec): defineX factories + XInput aliases for the 16 remaining writable domains (#2035)#2088

Merged
xuyushun441-sys merged 3 commits into
mainfrom
spec/define-x-factories
Jun 21, 2026
Merged

feat(spec): defineX factories + XInput aliases for the 16 remaining writable domains (#2035)#2088
xuyushun441-sys merged 3 commits into
mainfrom
spec/define-x-factories

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Closes #2035.

What

Gives every writable domain one type-safe authoring entry, closing the third (bare-literal) idiom that #2023 tripped over.

PR 1 — spec (feat(spec)): 16 new defineX factories + the 6 missing XInput aliases.

Added
Factories (16) defineDatasource · defineConnector · definePolicy · defineSharingRule · defineRole · definePermissionSet · defineEmailTemplateDefinition · defineReport · defineWebhook · defineObjectExtension · defineCube · defineMapping · defineTheme · defineTranslationBundle · definePage · defineAction
Input aliases (6) PolicyInput · CubeInput · MappingInput · ThemeInput · TranslationBundleInput · PageInput

Each is the canonical 3-line shape XSchema.parse(z.input<typeof XSchema>), mechanically identical to the 19 existing factories, re-exported from root index.ts (and already flowing through each subpath barrel via export *). Purely additive.

PR 2 — examples (refactor(examples)): migrated 36 authoring files across crm/showcase/todo from bare output-type literals (: Page, : UI.ActionInput, …) to the factory. Now every metadata object is .parse()-validated at module load.

PR 3 — lint guard (feat(lint)): an AST-only no-restricted-syntax rule that bans bare : DomainType exported-const literals in examples/**, turning the convention into an invariant. It earned its keep immediately — it surfaced 15 authoring files the *.{domain}.ts filename scan missed (reports/index.ts, actions/index.ts, security/sales-roles.ts, the connector/mapping/email/extension/policy/webhook files, …), all of which are migrated here.

Why

  • Makes the fix(examples): typecheck example apps clean + gate in CI #2023 class of bug structurally impossible: defineX is a value import — a broken import hard-errors instead of degrading to any.
  • One idiom for AI authors (the examples are the corpus AI learns from).
  • Field-level authoring errors at .parse() time instead of a structural TS wall.

Verification (local, worktree)

  • pnpm --filter './examples/*' typecheckgreen (all 3 apps)
  • pnpm lintgreen
  • @objectstack/spec tests → 6599 passed
  • Runtime smoke: dynamically imported all 58 factory-using example modules → 0 parse failures (confirms migrated metadata is valid, not just type-shaped)
  • @objectstack/spec tsc --noEmit → clean

Changeset: @objectstack/spec minor.

🤖 Generated with Claude Code

os-zhuang and others added 3 commits June 21, 2026 12:38
…ritable domains (#2035)

Adds one type-safe authoring entry per writable domain — defineDatasource,
defineConnector, definePolicy, defineSharingRule, defineRole, definePermissionSet,
defineEmailTemplateDefinition, defineReport, defineWebhook, defineObjectExtension,
defineCube, defineMapping, defineTheme, defineTranslationBundle, definePage,
defineAction — mirroring the 19 existing factories (XSchema.parse(z.input)).

Each factory is a *value* export: a broken import hard-errors instead of silently
degrading to `any` (the #2023 failure mode), and authoring errors surface at
.parse() time with field-level messages. Also backfills the six missing input
aliases: PolicyInput, CubeInput, MappingInput, ThemeInput, TranslationBundleInput,
PageInput. Purely additive — no existing exports change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Migrates every example authoring file across crm/showcase/todo from bare
output-type literals (`: Page`, `: UI.ActionInput`, …) to the corresponding
defineX factory. The factory accepts input-shape config and validates each
definition at module load, so a malformed metadata object now fails loudly at
authoring time instead of silently passing as `any` (#2023).

Covers 36 files / 16 domains — including files the *.{domain}.ts filename scan
missed (reports/index.ts, actions/index.ts, security/sales-roles.ts, …), which
the new lint guard surfaced.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds an AST-only no-restricted-syntax rule that flags exported consts in
examples/** annotated with a spec domain type (simple `Page` or qualified
`UI.Page`) instead of being wrapped in the defineX factory. Turns the authoring
convention into an invariant so the "pick by history" pattern cannot creep back
into the reference corpus AI learns from — it already caught 15 unmigrated
authoring files in this change. No type info required.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 21, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jun 21, 2026 4:41am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

89 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx (via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/implementation-status.mdx (via @objectstack/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/concepts/packages.mdx (via @objectstack/spec)
  • content/docs/concepts/setup-app.mdx (via @objectstack/spec)
  • content/docs/concepts/skills.mdx (via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx (via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx (via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx (via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx (via @objectstack/spec)
  • content/docs/guides/api-reference.mdx (via @objectstack/spec)
  • content/docs/guides/business-logic.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx (via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx (via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx (via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx (via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx (via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx (via packages/spec)
  • content/docs/guides/data-modeling.mdx (via @objectstack/spec)
  • content/docs/guides/deployment-vercel.mdx (via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx (via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/guides/formula.mdx (via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx (via packages/spec)
  • content/docs/guides/kernel-services.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx (via @objectstack/spec)
  • content/docs/guides/packages.mdx (via @objectstack/spec)
  • content/docs/guides/plugin-development.mdx (via @objectstack/spec)
  • content/docs/guides/plugins.mdx (via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx (via @objectstack/spec)
  • content/docs/guides/public-forms.mdx (via @objectstack/spec)
  • content/docs/guides/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/index.mdx (via packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/guides/security.mdx (via @objectstack/spec)
  • content/docs/guides/seed-data.mdx (via @objectstack/spec)
  • content/docs/guides/skills.mdx (via @objectstack/spec)
  • content/docs/guides/standards.mdx (via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@xuyushun441-sys
xuyushun441-sys merged commit 5f875fe into main Jun 21, 2026
17 checks passed
@xuyushun441-sys
xuyushun441-sys deleted the spec/define-x-factories branch June 21, 2026 04:48
xuyushun441-sys added a commit that referenced this pull request Jun 21, 2026
…2097)

The #2088 guard only covered examples/**. Broadens it to the platform's own apps
(account/setup/studio) so the "author metadata via defineX, never a bare
`: DomainType` literal" convention holds across every authoring surface, not just
the example corpus. Explicitly excludes packages/downstream-contract, whose bare
literals are an intentional frozen backward-compat fixture (#2089).

No migrations — apps author no bare-literal metadata today; this is future-
proofing. Verified the guard fires on a probe under packages/apps and that
`pnpm lint` is green.

Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
xuyushun441-sys added a commit that referenced this pull request Jun 21, 2026
…ates (#2035) (#2098)

Documents the layered strategy built across #2088/#2089/#2092/#2093/#2095/#2097
in one authoritative place: why in-repo consumers can't witness backward compat
(they co-evolve with the spec), the six gates and each one's job, and — crucially
— the FREEZE CONTRACT: a change that requires editing the fixtures or removing a
snapshot entry is by definition breaking (bump major), never a mechanical
test-update. Also formalizes `objectstack validate` as the third party's
authoritative self-gate.

Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
xuyushun441-sys added a commit that referenced this pull request Jun 21, 2026
…erals (#2035) (#2124)

The example apps were migrated to the `defineX` factories in #2088/#2095 and a
lint guard keeps them clean — but the skills and hand-written docs still taught
the old bare-literal pattern (`: Page = {}`, `: Action = {}`, `: PermissionSet
= {}`, …). Skills are the corpus AI authors from, so this directly undercut the
#2035 north star: leaving the unsafe pattern as the thing AI copies.

Converts every bare output/Input-type metadata literal for the 16 factory
domains to its `defineX(...)` factory call, across:
  - skills/objectstack-ui/SKILL.md (8: Page/Action/Report/Cube)
  - content/docs/guides/security.mdx (8: PermissionSet/SharingRule)
  - content/docs/{guides/standards,concepts/index,concepts/architecture,
    getting-started/architecture,protocol/objectui/record-alert}.* (7)

Imports are rewritten in place (preserving each block's import source — root vs
subpath) or injected where the snippet had none. Pre-existing `defineView` /
`defineFlow` examples are untouched. `check:skill-docs` stays green (generated
references come from frontmatter, unchanged).

Docs-only — no package code, no changeset. Code blocks in MDX/skills are not
type-checked by any gate, which is why they drifted; a lightweight MDX code-block
lint is noted as a separate follow-up.

Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spec: 为剩余 16 个可编写域补全 defineX 工厂 / XInput,统一编写入口

2 participants