@rm30/stack
v0.1.0
Published
The RM30 stack manifest — pinned versions by package class, read by rm doctor and rm new.
Maintainers
Readme
@rm30/stack
The RM30 version manifest, as data. One JSON of pinned versions per package class, read
by rm doctor (to grade a project) and rm new (to create one). Bumping the workspace
stack is one PR to one file.
Install
pnpm add -D @rm30/stackUse
import stack, { classOf, versionOf, bannedReason } from '@rm30/stack'
classOf('expo') // 'platform'
versionOf('next') // '16.3.4'
bannedReason('mobx') // 'Zustand only. The one project still on it is migrating.'
stack.updated // '2026-09-08'The raw file is exported too, for tooling that would rather not import JS:
import manifest from '@rm30/stack/stack.json' with { type: 'json' }The three classes
A single "must be latest" gate over every dependency produces false alarms and then gets ignored. So packages are graded by class:
| Class | Examples | Rule | rm doctor |
|---|---|---|---|
| platform | expo, react-native, next, react, expo-router | Version is set by the SDK, not chosen per package. Upgrade as one atomic move, at most one major behind. Never mix. | error |
| toolchain | typescript, @biomejs/biome, pnpm, turbo, vitest | Latest minor always. Latest major after a deliberate check — these break plugins. | warning, with the upgrade path named |
| library | zod, zustand, drizzle-orm, viem, wagmi, firebase* | Latest minor always, no ceremony. Majors reviewed. | info |
banned
Packages that must not enter an RM30 project, each with the reason. Some are paradigm
calls (redux, mobx, nativewind, styled-components); the rest are the concrete
blockers to TypeScript 7 — everything that consumes the TypeScript programmatic API,
which TS 7.0 does not ship.
Keeping it current
Versions were read from the npm registry on the date in updated. There is no automated
refresh yet; rm doctor will grow one.
