Skip to content

[finding] Measure whether os create and os init should converge — the shared surface is now four exports and one file map away #15531

Description

@os-litant

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions