[0.1.12] - 2026-06-09
Fixed
- Ad-hoc project parameters now resolve correctly —
superposition.yml parameters:keys not
declared by any selected overlay (e.g.API_PORT,WEB_DEV_PORT) are now included in the
resolved parameter map and available for{{cs.KEY}}substitution inenv:values and
overlay file content. Previously they triggered a hardUnresolved parameter tokenerror.
Changed
-
Publish workflow release guidance — successful npm publish runs now render exact
npm installandnpx container-superposition@<version> regencommands in the workflow summary; prerelease runs do same, and final releases also comment on associated PRs when one is found -
Console output for unlisted parameters — the
⚠️ Unknown overlay parameters …warning
(yellow, comma-separated) is replaced by a neutral⚙️ Project-only parameters (not declared by any selected overlay):informational block using the sameKEY=VALUEper-line format as
overlay parameters. -
Doctor check 4 wording — renamed from "Unknown parameters in project file" to
"Project-only parameters (not declared by any selected overlay)";findingIdchanged to
project-only-parameters; guidance updated to explain these keys are resolved and valid,
rather than advising removal. -
validateEnvTokensResolved()error message — second line now reads
Resolved parameters: …instead ofDeclared parameters for selected overlays: …, accurately
reflecting that both overlay-declared and project-only keys appear in the resolved map.
Added
-
Parameter tokens (
{{cs.KEY}}) inenv:values —superposition.yml(and
superposition.local.yml)env:values now support{{cs.KEY}}parameter tokens.
Tokens are resolved in-memory at generation time using the fully resolvedparameters:map
(CLI > project parameters > overlay defaults). The project file is never modified.
Unknown tokens cause a hard error before any files are written, reporting theenv.KEYfield
and the list of declared parameters.
This eliminates duplication betweenparameters:andenv:— e.g.:env: DATABASE_URL: 'postgresql://{{cs.POSTGRES_USER}}:{{cs.POSTGRES_PORT}}/{{cs.POSTGRES_DB}}'
-
Doctor: sensitive parameter checks — new
doctorfindings:sensitive-params-project-file(warn) — fires when a parameter declaredsensitive: true
by an overlay has a literal (non-${VAR}) value insuperposition.yml parameters:. Suppressed
when the value equals the overlay default.sensitive-params-devcontainer-env(warn) — fires when a sensitive parameter appears as
plain text in.devcontainer/.envafter generation. Skipped when.devcontainer/.envis absent
(plain stack). Suppressed when value equals overlay default.
-
Doctor: first-class property promotion suggestions — new
doctorfindings suggest
migratingcustomizationsusage to first-class fields:customizations-env-promote—customizations.devcontainerPatch.remoteEnvset butenv:absentcustomizations-mounts-promote—customizations.devcontainerPatch.mountsset butmounts:absentcustomizations-ports-promote—customizations.dockerComposePatchcontains port bindings butports:absent
-
Docs: variable precedence and parameter token section —
docs/superposition-yml.mdnow
includes a "Parameter tokens ({{cs.KEY}})" section with syntax reference, supported fields
table, pass-through guarantee table, and worked examples. Theenv:section now documents
the two-tier generation-time vs runtime substitution model with a decision tree. -
Stable doctor finding IDs — internal
CheckResultgains an optionalfindingIdfield;
checksToFindings()prefers it over the name-slugified ID when present. Makesdoctor --fix
routing and test assertions stable across name changes. -
superposition.local.ymllocal config — optional repository-root local config for machine-specificenv,mounts,shell, andcustomizationsenrichment during generated devcontainer output creation, with schema support and Git safety warnings for unignored or already-tracked generated output. -
devcontainerGitignoreproject-file option — when enabled insuperposition.yml,
generation writesoutputPath/.gitignorewith:*
-
portsfield insuperposition.yml— first-class project port declarations with stack-specific semanticsstack: plain: write a container port expression (${VAR:-default}or a number, no colon); resolved at generation time withsuperposition.yml envtaking priority over root.env, then inline defaultstack: compose: write a fullHOST:CONTAINERbinding; written verbatim todocker-compose.yml(no${VAR}expansion — Compose resolves at container startup); container port extracted best-effort forforwardPortsportsAttributeskeyed by container port (not host port)- Superposition.yml
enventry simultaneously drivesremoteEnvand plain-stack port resolution — single source of truth - Project
portsentries are intentionally not shifted byportOffset
Changed
-
portssemantics corrected — BREAKING for anysuperposition.ymlthat usesportsonstack: compose- Plain stack:
valuemay be a bare container port expression (no colon) or aHOST:CONTAINERbinding (e.g."9001:8080"). When host ≠ container port, the tool adds-p HOST:CONTAINERtodevcontainer.json runArgs.${VAR}references are resolved at generation time. - Compose stack:
valueis now written verbatim todocker-compose.yml;${VAR}references are no longer expanded by the tool.portsAttributeskey is now the extracted container port, not the host port. - Migration for compose stacks: existing
"8080:8080"entries work as before. Bare port expressions on compose stacks (no colon) now throw an error — add the host side:"8080"→"8080:8080".
- Plain stack:
-
PR prerelease publishing — draft PRs publish npm prereleases only when labeled
publish-prerelease; ready-for-review PRs continue publishing automatically.
Fixed
fusekioverlay — addedhostname: fusekito the Docker Compose service to fix a startup failure where Fuseki could not resolve its own hostname