Skip to content

Epic: graduate the data layer to @gemstack/orm (+ adapters) #64

Description

@suleimansh

Summary

@gemstack/ai-sdk proved the graduation playbook: an engine matures inside a framework, proves it is framework-agnostic, then graduates to @gemstack/* while a thin binding stays behind. Architecture.md already ranks what comes next, and the data layer is the keystone:

@universal-orm/core (+ /drizzle / /memory / /rudder) -> @gemstack/orm (+ adapters). The ORM analog of @gemstack/ai-sdk. Mature, clearly agnostic. The strongest next candidate; move the core + its adapter family together.

Realized, GemStack becomes the unified home for agnostic engines: @gemstack/ai-sdk (AI), @gemstack/orm (data), @gemstack/schema (schema). This epic tracks the data-layer graduation. It is design-ready but execution-gated (see "The gate" below); nothing here lands before the brand-consolidation call with the Vike team.

The candidates (verified in vike-data today)

All four ORM packages are v0.1.0 and carry zero Vike imports (confirmed in their package.json deps + peers), which is exactly why they are the real candidates and the vike-* bindings are not.

Today Graduates to Notes
@universal-orm/core @gemstack/orm The engine. Agnostic, mature.
@universal-orm/drizzle @gemstack/orm-drizzle Adapter. Moves with the core.
@universal-orm/memory @gemstack/orm-memory Adapter. Moves with the core.
@universal-orm/rudder @gemstack/orm-rudder (or stays @rudderjs) Adapter; decide whether the Rudder adapter graduates or stays as the framework binding.
@vike-data/universal-schema @gemstack/schema Separate, lower-priority graduation. Agnostic but mis-scoped under @vike-data. Tracked here for sequencing only; can be its own epic.

The gate (the actual blocker, not a technicality)

Unlike ai-sdk — which graduated cleanly out of Rudder (a repo we own) — the ORM lives in the shared vike-data orbit and already ships under its own deliberate npm scope, @universal-orm. So this is not "where should orphaned code live." It is a brand question, quoting Architecture.md:

There are three agnostic-ish scopes in play (@gemstack, @universal-orm, @vike-data). The decision is not "where should this code live" but "do we consolidate the agnostic engines under one umbrella (@gemstack), or keep @universal-orm as a parallel brand?" Since @universal-orm is co-developed, this is a decide-with-the-Vike-team call, gated on brand traction.

Decision owners: GemStack + Vike maintainers, together. Not unilateral.

Three options to put to the Vike team:

  1. Consolidate — fold @universal-orm/* into @gemstack/orm*; one umbrella for all agnostic engines. (Cleanest story; the thesis of Architecture.md.)
  2. Parallel brands — keep @universal-orm as its own brand alongside @gemstack; document them as sibling agnostic-engine families.
  3. Defer — hold until brand traction is higher (docs site live + gemstack.land cutover Attach gemstack.land custom domain to the docs site #63 is the signal building now).

Graduation playbook (only after the gate clears)

Follow the @gemstack/ai-sdk path exactly:

  1. Copy @universal-orm/core source into packages/orm; rename to @gemstack/orm. Repeat for each adapter.
  2. Reset to a fresh 0.x line.
  3. Leave a re-export at each old name. Each old-name package takes one of two shapes (per Architecture.md):
    • Deprecated shim — pure re-export, slated for eventual removal (likely the core / drizzle / memory names).
    • Living framework binding — re-exports the agnostic core and keeps framework-coupled pieces that cannot graduate (e.g. the Rudder adapter's provider wiring / CLI), like @rudderjs/ai. Do not mislabel a binding as deprecated.
  4. Repoint internal dependents (vike-data ORM bindings, @rudderjs/orm, playground twins) to @gemstack/orm*.
  5. Update Architecture.md (move ORM from "candidate" to "shipped"), the root README package table, and the docs site.

Child issues (work top-down; #66 gates the rest)

Schema folded into #67 (not a separate later item) per the Phase 0 spike (#65): the ORM test suite couples to schema, so they graduate together.

Out of scope

  • @vike-data/kit does not graduate — it is the kit for authoring bindings, so it belongs with the binding ecosystem, not the engine umbrella (Architecture.md).
  • Any vike-* binding package. Bindings stay with their framework and consume the engine.

Decision needed before any code lands

Pick option 1 / 2 / 3 above with the Vike team. Until then this epic stays design-ready, execution-gated — the queued plan, ready the moment the brand call is made.

Metadata

Metadata

Assignees

Labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions