From 280496182e9946cfb592f839a62e24e495d5684c Mon Sep 17 00:00:00 2001 From: Justin Merrell Date: Wed, 30 Sep 2026 15:01:59 +0000 Subject: [PATCH] fix(devcontainer): converge mise to its pin, drop the deprecated Copilot extension, and name volumes per DEVC-08 base_install_mise skipped whenever any mise was on PATH, so a container created before min_version moved kept an older mise that refused the config and installed none of the pinned CLIs. It now replaces any mise that is not the pinned release. github.copilot is deprecated since VS Code 1.109; github.copilot-chat provides the whole experience. The named volumes become musher-${devcontainerId}-, the form EC-0027 DEVC-08 checks from engineering-conventions 0.6.3. Co-Authored-By: Claude Opus 5.5 Signed-off-by: Justin Merrell --- .devcontainer/devcontainer.json | 7 +++---- .devcontainer/scripts/lib/base-setup.sh | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 5188531..3d5ead5 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -48,9 +48,9 @@ "runArgs": ["--env-file", "${localWorkspaceFolder}/.devcontainer/.env"], "mounts": [ - "source=musher-spec-${devcontainerId}-gh-config,target=/home/vscode/.config/gh,type=volume", - "source=musher-spec-${devcontainerId}-claude-config,target=/home/vscode/.claude,type=volume", - "source=musher-spec-${devcontainerId}-codex-config,target=/home/vscode/.codex,type=volume" + "source=musher-${devcontainerId}-gh-config,target=/home/vscode/.config/gh,type=volume", + "source=musher-${devcontainerId}-claude-config,target=/home/vscode/.claude,type=volume", + "source=musher-${devcontainerId}-codex-config,target=/home/vscode/.codex,type=volume" ], "containerEnv": { @@ -123,7 +123,6 @@ "timonwong.shellcheck", "eamodio.gitlens", "bierner.markdown-mermaid", - "github.copilot", "github.copilot-chat" ], "settings": { diff --git a/.devcontainer/scripts/lib/base-setup.sh b/.devcontainer/scripts/lib/base-setup.sh index 24048c6..10fd5d0 100644 --- a/.devcontainer/scripts/lib/base-setup.sh +++ b/.devcontainer/scripts/lib/base-setup.sh @@ -90,17 +90,27 @@ base_setup_path() { export PATH="${_MISE_SHIMS}:${_HOME}/.local/bin:${PATH}" } -# Installs the pinned mise release via the official installer if mise is not -# already present. +# Installs the pinned mise release via the official installer unless that +# exact release is already present. +# +# A mise of any other version is replaced, not kept: the volumes and home +# directory outlive a pin bump, and a container created before one kept its +# older mise, which then refused the config's min_version and left every +# mise-managed CLI uninstalled. # # Outputs: # Writes progress to stderr via log() # Returns: # 0 on success, non-zero on failure base_install_mise() { + local installed="" if has_cmd mise; then - log "mise already installed, skipping" - return 0 + installed="$(mise --version 2>/dev/null | awk 'NR == 1 { print $1 }')" + if [[ "${installed}" == "${_MISE_VERSION#v}" ]]; then + log "mise ${installed} already installed, skipping" + return 0 + fi + log "mise ${installed:-of unknown version} is not the pinned ${_MISE_VERSION}; replacing it" fi log "Installing mise ${_MISE_VERSION} (https://mise.run)..." # MISE_VERSION is the installer's own input: it fetches that release rather