feat(config): non-destructive opencode.jsonc.proposed sidecar (closes #8 batch item)
Completes the pi-devbox v1.1.4 "merge new defaults into preserved config" idea, adapted to opencode-devbox's env-generated, JSONC-with-comments config where an in-place merge would be destructive. generate-config.py keeps its "never touch an existing config" guarantee and adds a side-channel: when a live config exists, render the config it WOULD generate for the current env + image defaults and write it to a NON-loaded opencode.jsonc.proposed — but only when it differs from the live config; remove it once they match. opencode never loads .proposed files, so it is a pure manual-merge reference (e.g. surfacing a default MCP server added in a newer image). An unparseable live config surfaces the proposal rather than guessing equivalence. A one-line hint is logged on write. - render_config(): shared renderer so first-gen and proposed paths can't drift - _loads_jsonc(): string-aware //-comment strip (same approach as smoke-test; preserves https:// inside strings), raises on invalid JSON - write_proposed(): write-on-diff + stale removal + live untouched - smoke-test.sh: asserts write-on-diff, removal-on-match, live not clobbered - entrypoint-user.sh + module docstring: document the sidecar - CHANGELOG: moved from "Deferred" to "Added" Caveat (documented in the file header): the proposal reflects env + image defaults, so a diff may include the user's own past edits, not only new image defaults.
This commit is contained in:
+17
-9
@@ -89,16 +89,24 @@ editing the Dockerfile. Default unchanged. (Mirrors pi-devbox v1.1.6.)
|
||||
`OPENCODE_VERSION` ARG in `Dockerfile.variant`. `1.17.8` is the current npm
|
||||
`latest` stable. Only the variant layer rebuilds; the base is unaffected.
|
||||
|
||||
### Deferred (needs a decision): opencode.json merge-on-recreate
|
||||
### Added: opencode.json merge-on-recreate — non-destructive `.proposed` sidecar
|
||||
|
||||
pi-devbox v1.1.4 added a non-destructive deep-merge of new template keys into a
|
||||
preserved-volume `settings.json`. The direct analogue does **not** port cleanly
|
||||
here: opencode's config is *generated from env vars* and written as **JSONC
|
||||
with comments** (not a static image-owned template), and `generate-config.py`
|
||||
deliberately never touches an existing config (host bind-mount or persisted
|
||||
volume). A `jq`-style merge would strip the JSONC comments and risks clobbering
|
||||
or re-adding entries a user removed. Left for a separate, deliberate change —
|
||||
see discussion.
|
||||
The pi-devbox v1.1.4 deep-merge into a preserved `settings.json` does not port
|
||||
cleanly here: opencode's config is *generated from env vars* and written as
|
||||
JSONC with comments (not a static image-owned template), and overwriting or
|
||||
`jq`-merging a possibly-bind-mounted host config is destructive. Instead,
|
||||
`generate-config.py` keeps its "never touch an existing config" guarantee and
|
||||
adds a non-destructive side-channel: when a live config exists, it writes
|
||||
`opencode.jsonc.proposed` — the config it *would* generate for the current
|
||||
environment plus this image's defaults — **only when that differs** from the
|
||||
live config, and removes it once they match. opencode never loads a `.proposed`
|
||||
file, so it is purely a manual-merge reference (e.g. surfacing a default MCP
|
||||
server added in a newer image). A one-line hint is logged when one is written;
|
||||
an unparseable live config surfaces the proposal rather than guessing. The
|
||||
proposed config is regenerated from env + image defaults, so a diff may reflect
|
||||
your own past edits as well as new image defaults — the file header says so.
|
||||
Covered by a new `scripts/smoke-test.sh` assertion (write-on-diff, removal on
|
||||
match, live config never clobbered).
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user