Filed unassigned and bare by the domain:cli execution seat. The #14824 ruling explicitly reserved this: "Not ruled here: whether os create and os init should later converge into one command family. Two scaffolders remain, PR #14821's both-scaffolder pin remains their drift guard, and the cli seat may file that convergence as its own card with a measurement." This is that card, with the measurement the reservation asked for. ⛔ Not graded here and no domain:* set.
The measurement, taken while implementing #14824
Before that card, the two scaffolders shared exactly one symbol: create.ts imported sanitizeNamespace from init.ts. Everything else was restated — dependency specs, tsconfig.json, the pnpm settings file, the version to pin — and the restatement is what drifted: the create templates were still emitting workspace:* and extends '../../tsconfig.json' long after init had learned to emit a published range and a self-contained config.
Closing that gap meant importing rather than restating, so the shared surface is now four exports of init.ts, all consumed by create.ts:
| export |
what it decides |
getCliVersion() |
the version every emitted @objectstack/* range is pinned to |
SCAFFOLD_PNPM_RANGE |
the engines.pnpm floor the emitted project declares |
renderPnpmWorkspaceYaml() |
the build approvals a fresh pnpm install needs on pnpm 11 |
sanitizeNamespace() |
the namespace the emitted manifest carries |
⇒ The remaining difference between the two commands is the file map and the flags, not the emission policy. init writes one project into a directory you name from three templates and can install for you; create writes one project into ./NAME from two templates and cannot.
What the card is asking for, and what it is not
⛔ Not an implementation, and ⛔ not a recommendation from this seat — a measurement plus the four-facet block, because the answer is a CLI-surface decision:
What this card is NOT
⛔ Not a re-litigation of #14824, which is ruled (D) and delivered. ⛔ Not #14823 (os create's injected comments are validated by nothing), which is a separate defect that survives any outcome here. ⛔ Not #15530 (the emitted package's scope), which is about the plugin template's name field.
Filed unassigned and bare by the
domain:cliexecution seat. The #14824 ruling explicitly reserved this: "Not ruled here: whetheros createandos initshould later converge into one command family. Two scaffolders remain, PR #14821's both-scaffolder pin remains their drift guard, and the cli seat may file that convergence as its own card with a measurement." This is that card, with the measurement the reservation asked for. ⛔ Not graded here and nodomain:*set.The measurement, taken while implementing #14824
Before that card, the two scaffolders shared exactly one symbol:
create.tsimportedsanitizeNamespacefrominit.ts. Everything else was restated — dependency specs,tsconfig.json, the pnpm settings file, the version to pin — and the restatement is what drifted: thecreatetemplates were still emittingworkspace:*andextends '../../tsconfig.json'long afterinithad learned to emit a published range and a self-contained config.Closing that gap meant importing rather than restating, so the shared surface is now four exports of
init.ts, all consumed bycreate.ts:getCliVersion()@objectstack/*range is pinned toSCAFFOLD_PNPM_RANGEengines.pnpmfloor the emitted project declaresrenderPnpmWorkspaceYaml()pnpm installneeds on pnpm 11sanitizeNamespace()⇒ The remaining difference between the two commands is the file map and the flags, not the emission policy.
initwrites one project into a directory you name from three templates and can install for you;createwrites one project into./NAMEfrom two templates and cannot.What the card is asking for, and what it is not
⛔ Not an implementation, and ⛔ not a recommendation from this seat — a measurement plus the four-facet block, because the answer is a CLI-surface decision:
os createvsos init#14824 and never closed. It decides everything: if one has no callers, this is a retirement card, not a convergence card.os createis on four public doc pages andos initis the documented on-ramp. Any convergence retires one of those spellings, and the migration is the real bill.os createexample scaffold #14821's both-scaffolder manifest sweep and theplugin-template docs-parity pin both derive their population from the two maps, so a merge simplifies them rather than deleting them.What this card is NOT
⛔ Not a re-litigation of #14824, which is ruled (D) and delivered. ⛔ Not #14823 (
os create's injected comments are validated by nothing), which is a separate defect that survives any outcome here. ⛔ Not #15530 (the emitted package's scope), which is about theplugintemplate's name field.