You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@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 sharedvike-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:
Consolidate — fold @universal-orm/* into @gemstack/orm*; one umbrella for all agnostic engines. (Cleanest story; the thesis of Architecture.md.)
Parallel brands — keep @universal-orm as its own brand alongside @gemstack; document them as sibling agnostic-engine families.
Copy @universal-orm/core source into packages/orm; rename to @gemstack/orm. Repeat for each adapter.
Reset to a fresh 0.x line.
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.
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.
Summary
@gemstack/ai-sdkproved 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.mdalready ranks what comes next, and the data layer is the keystone: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-datatoday)All four ORM packages are
v0.1.0and carry zero Vike imports (confirmed in theirpackage.jsondeps + peers), which is exactly why they are the real candidates and thevike-*bindings are not.@universal-orm/core@gemstack/orm@universal-orm/drizzle@gemstack/orm-drizzle@universal-orm/memory@gemstack/orm-memory@universal-orm/rudder@gemstack/orm-rudder(or stays@rudderjs)@vike-data/universal-schema@gemstack/schema@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 sharedvike-dataorbit 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, quotingArchitecture.md:Decision owners: GemStack + Vike maintainers, together. Not unilateral.
Three options to put to the Vike team:
@universal-orm/*into@gemstack/orm*; one umbrella for all agnostic engines. (Cleanest story; the thesis ofArchitecture.md.)@universal-ormas its own brand alongside@gemstack; document them as sibling agnostic-engine families.gemstack.landcutover 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-sdkpath exactly:@universal-orm/coresource intopackages/orm; rename to@gemstack/orm. Repeat for each adapter.0.xline.Architecture.md):core/drizzle/memorynames).@rudderjs/ai. Do not mislabel a binding as deprecated.vike-dataORM bindings,@rudderjs/orm, playground twins) to@gemstack/orm*.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)
@gemstack/orm+@gemstack/schema(core, together)@gemstack/orm-memory+@gemstack/orm-drizzle(adapters)@gemstack/orm*Out of scope
@vike-data/kitdoes not graduate — it is the kit for authoring bindings, so it belongs with the binding ecosystem, not the engine umbrella (Architecture.md).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.