feat: install Claude Code CLI via pinned native installer instead of the devcontainer feature - #10
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
feat: migrate Claude Code installation from npm to native installer
What
Replaces the
ghcr.io/anthropics/devcontainer-features/claude-codedev container Feature with a pinned install of the Claude Code CLI directly in thenodetemplate's Dockerfile.Why
Applying the template surfaced
@undefinedin VS Code's Feature trust/review prompt. Root cause: the external claude-code Feature declaresinstallsAfter: ["ghcr.io/devcontainers/features/node"]with no version tag, so the extension renders that ordering reference as…/node@undefined. It's cosmetic (the node Feature isn't actually installed — this template gets Node from the digest-pinned base image), but there's no way to fix it from our config while the Feature is in use.Dropping the Feature removes the
installsAfterreference entirely, so the@undefineddisappears.How
[stable|latest|VERSION]argument (ARG CLAUDE_CODE_VERSION=2.1.218). Runs asnode(the installer refuses sudo and installs into~/.local), with~/.local/binonPATH. No npm dependency and no unpinnedcurl | bash @latest— the version is fixed here and frozen at runtime byDISABLE_AUTOUPDATER=1. Annotated for Renovate (npmdatasource on@anthropic-ai/claude-code).featuresblock; addedanthropic.claude-codetoextensions(previously supplied by the Feature's customizations).check "claude" claude --versionsmoke assertion.README.mdis intentionally untouched — theupdate-documentationworkflow regenerates it from the manifest +NOTES.md.Notes for review
curl … | bash -s <version>line does fetch the installer over the network (pinned version, not pinned script). This is a deliberate tradeoff vs. the repo's usual full-provenance stance — the installed version is pinned, but the installer script itself is served fromclaude.ai.CLAUDE_CODE_VERSIONdepends on the sharedandykenward/renovate-configpreset recognizing the inline# renovate:annotation; a matcher may need adding there.🤖 Generated with Claude Code