Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions .github/workflows/pr-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,9 @@ jobs:
- features: bitwarden-secrets-manager
baseImage: mcr.microsoft.com/devcontainers/base:ubuntu
- features: angular-dev
baseImage: mcr.microsoft.com/devcontainers/javascript-node:20
baseImage: mcr.microsoft.com/devcontainers/javascript-node:26
- features: package-auto-install
baseImage: mcr.microsoft.com/devcontainers/javascript-node:20
baseImage: mcr.microsoft.com/devcontainers/javascript-node:26
- features: helpers4-common
baseImage: mcr.microsoft.com/devcontainers/base:debian
- features: helpers4-common
Expand All @@ -145,17 +145,17 @@ jobs:
# named-volume EACCES regression.
baseImage: mcr.microsoft.com/devcontainers/base:ubuntu
- features: pnpm-store
baseImage: mcr.microsoft.com/devcontainers/typescript-node:20
baseImage: mcr.microsoft.com/devcontainers/typescript-node:26
- features: pnpm-store
baseImage: ubuntu:latest
- features: vite-plus
baseImage: mcr.microsoft.com/devcontainers/typescript-node:20
baseImage: mcr.microsoft.com/devcontainers/typescript-node:26
- features: playwright-dev
baseImage: mcr.microsoft.com/devcontainers/typescript-node:20
baseImage: mcr.microsoft.com/devcontainers/typescript-node:26
- features: nub
baseImage: mcr.microsoft.com/devcontainers/typescript-node:20
baseImage: mcr.microsoft.com/devcontainers/typescript-node:26
- features: typescript-dev
baseImage: mcr.microsoft.com/devcontainers/typescript-node:20
baseImage: mcr.microsoft.com/devcontainers/typescript-node:26
- features: auto-header
baseImage: mcr.microsoft.com/devcontainers/base:ubuntu
- features: dotfiles-sync
Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,33 +68,33 @@ jobs:

# angular-dev - requires Node.js
- features: angular-dev
baseImage: mcr.microsoft.com/devcontainers/javascript-node:20
baseImage: mcr.microsoft.com/devcontainers/javascript-node:26

# package-auto-install - requires Node.js
- features: package-auto-install
baseImage: mcr.microsoft.com/devcontainers/javascript-node:20
baseImage: mcr.microsoft.com/devcontainers/javascript-node:26

# pnpm-store - config only; test with and without pnpm in the image
- features: pnpm-store
baseImage: mcr.microsoft.com/devcontainers/typescript-node:20
baseImage: mcr.microsoft.com/devcontainers/typescript-node:26
- features: pnpm-store
baseImage: ubuntu:latest

# vite-plus - requires Node.js
- features: vite-plus
baseImage: mcr.microsoft.com/devcontainers/typescript-node:20
baseImage: mcr.microsoft.com/devcontainers/typescript-node:26

# playwright-dev — requires Node.js (dependsOn typescript-dev)
- features: playwright-dev
baseImage: mcr.microsoft.com/devcontainers/typescript-node:20
baseImage: mcr.microsoft.com/devcontainers/typescript-node:26

# nub — requires Node.js (dependsOn the official node feature)
- features: nub
baseImage: mcr.microsoft.com/devcontainers/typescript-node:20
baseImage: mcr.microsoft.com/devcontainers/typescript-node:26

# typescript-dev — depends on essential-dev:1 via dependsOn (hard dep)
- features: typescript-dev
baseImage: mcr.microsoft.com/devcontainers/typescript-node:20
baseImage: mcr.microsoft.com/devcontainers/typescript-node:26

# claude-dev — IDE-config-only feature
- features: claude-dev
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,11 @@ OS-level dependencies for headless Chromium, Firefox, and WebKit, a browser-bina

### package-auto-install

Automatically detects and runs npm/yarn/pnpm install in non-interactive mode after container creation. Handles corepack setup for Node 24+ and intelligently detects the package manager from package.json or lockfiles.
Automatically detects and runs npm/yarn/pnpm install in non-interactive mode after container creation. Handles corepack setup for Node 25+ and intelligently detects the package manager from package.json or lockfiles.

**Key benefits:**
- Automatic package manager detection from package.json or lockfiles
- Corepack support for Node 24+ (auto-installs if needed)
- Corepack support for Node 25+ (auto-installs if needed)
- Non-interactive mode (CI=true) prevents prompts
- Smart command selection (npm ci, pnpm --frozen-lockfile, yarn --immutable)
- Eliminates need for manual postCreateCommand
Expand Down Expand Up @@ -337,7 +337,7 @@ Features from this repository are available via GitHub Container Registry. Refer
| [auto-header](./src/auto-header) | Automatic file headers with customizable templates (simple or custom) | [README](./src/auto-header/README.md) |
| [vite-plus](./src/vite-plus) | Complete Vite+ toolchain with Oxc, Vitest, and VS Code integration | [README](./src/vite-plus/README.md) |
| [playwright-dev](./src/playwright-dev) | Playwright OS deps (Chromium/Firefox/WebKit) + shared browser-binary volume + VS Code extension | [README](./src/playwright-dev/README.md) |
| [package-auto-install](./src/package-auto-install) | Automatic package installation with corepack support for Node 24+ | [README](./src/package-auto-install/README.md) |
| [package-auto-install](./src/package-auto-install) | Automatic package installation with corepack support for Node 25+ | [README](./src/package-auto-install/README.md) |
| [pnpm-store](./src/pnpm-store) | Shared pnpm store on the same filesystem as your code — no stray .pnpm-store in repos | [README](./src/pnpm-store/README.md) |
| [typescript-dev](./src/typescript-dev) | TypeScript/JavaScript dev with indexing and web tools (requires essential-dev) | [README](./src/typescript-dev/README.md) |
| [angular-dev](./src/angular-dev) | Angular development environment with extensions and CLI autocompletion | [README](./src/angular-dev/README.md) |
Expand Down
4 changes: 2 additions & 2 deletions src/angular-dev/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ If you want to install Angular CLI as part of this feature:
```json
{
"features": {
"ghcr.io/devcontainers/features/node:1": {
"version": "20"
"ghcr.io/devcontainers/features/node:2": {
"version": "26"
},
"ghcr.io/helpers4/devcontainer/angular-dev:1": {
"installCli": true
Expand Down
1 change: 1 addition & 0 deletions src/graphite-dev/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ Get your token at <https://app.graphite.com/activate> and export it on the host
## How it works

- **Install via npm.** Graphite publishes no standalone binary, and its Homebrew formula only wraps `npm install` on brew's own Node. So the feature `dependsOn` the official `node` feature and runs `npm install -g @withgraphite/graphite-cli@<version>`.
- **Bare `debian` / `ubuntu` images need `libatomic1`.** The `node` feature installs the Node LTS. From Node 26, its build needs `libatomic1`, which bare `debian` / `ubuntu` images don't have, and the `node` feature doesn't install it: the build stops with `libatomic.so.1: cannot open shared object file`. Use a `mcr.microsoft.com/devcontainers/base:*` image (it has it), or add `libatomic1` to your image before the features run.
- **Auth at start, not at build.** `postStartCommand` runs `gt auth --token "$GRAPHITE_TOKEN"`. The token never enters the image. A missing or rejected token prints a warning and never blocks the container start.
- **No volume.** `gt` keeps its config in `~/.config/graphite`; since the token is re-applied on every start, there is nothing worth persisting.
- **git 2.38+.** `gt` 1.x needs it. The install warns if the container's git is older.
Expand Down
6 changes: 6 additions & 0 deletions src/nub/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@ No VS Code extension — nub doesn't have one. This feature is CLI tooling only.
- **Does not install the `nub` npm/pnpm shims** (`nub pm shim`, which hardlinks `~/.nub/shims/{npm,npx,…}` to transparently intercept package-manager calls). That's a deeper, PATH-wide interception decision left to the consuming project to opt into explicitly — this feature only makes the `nub`/`nubx` binaries available.
- **Does not manage Node versions.** See "Why this feature exists" above.

## Troubleshooting

### `node` fails to install on a bare image

The official `node` feature installs the Node LTS. From Node 26, its build needs `libatomic1`, which bare `debian` / `ubuntu` images don't have, and the `node` feature doesn't install it: the build stops with `libatomic.so.1: cannot open shared object file`. Use a `mcr.microsoft.com/devcontainers/base:*` image (it has it), or add `libatomic1` to your image before the features run.

## Links

- **nub**: https://nubjs.com/
Expand Down
6 changes: 3 additions & 3 deletions src/package-auto-install/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Automatically detects and runs npm/yarn/pnpm install in non-interactive mode aft
## Features

- **Automatic detection**: Detects package manager based on lockfile (pnpm-lock.yaml, yarn.lock, package-lock.json)
- **Corepack support**: Automatically installs and enables corepack if `packageManager` field is found in package.json (required for Node 24+)
- **Corepack support**: Automatically installs and enables corepack if `packageManager` field is found in package.json (required for Node 25+)
- **Non-interactive mode**: Sets `CI=true` to avoid prompts (e.g., pnpm won't ask to delete node_modules)
- **Smart command selection**: Uses `npm ci`, `pnpm install --frozen-lockfile`, or `yarn install --immutable` when lockfiles exist
- **Flexible configuration**: Override package manager, command, and working directory
Expand Down Expand Up @@ -166,7 +166,7 @@ For any IDE that does not have a parseable workspace file (Zed, Neovim, etc.) or

## How It Works

### Corepack Support (Node 24+)
### Corepack Support (Node 25+)

If your `package.json` contains a `packageManager` field (e.g., `"packageManager": "pnpm@9.0.0"`):

Expand All @@ -175,7 +175,7 @@ If your `package.json` contains a `packageManager` field (e.g., `"packageManager
3. Enables corepack with `corepack enable`
4. Corepack then automatically installs and uses the exact package manager version specified

Node 24+ dropped corepack from the default install, so this step is what makes the
Node 25+ no longer ships corepack (Node 24 still does), so this step is what makes the
`packageManager` field still work there without you installing corepack yourself.

### Package Manager Detection
Expand Down
4 changes: 4 additions & 0 deletions src/playwright-dev/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,10 @@ The guard script needs network access at `postCreateCommand` time. Re-run it man
npx playwright install
```

### `node` fails to install on a bare image

The official `node` feature installs the Node LTS. From Node 26, its build needs `libatomic1`, which bare `debian` / `ubuntu` images don't have, and the `node` feature doesn't install it: the build stops with `libatomic.so.1: cannot open shared object file`. Use a `mcr.microsoft.com/devcontainers/base:*` image (it has it), or add `libatomic1` to your image before the features run.

### `install-deps` fails on an unsupported base image

`playwright install-deps` only knows the apt package names for the Debian/Ubuntu versions Playwright officially supports. Pin your base image to one of those, or set `installDeps: false` and install the equivalent packages yourself.
Expand Down
2 changes: 1 addition & 1 deletion test/cline-dev/scenarios.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"with_cli": {
"image": "mcr.microsoft.com/devcontainers/typescript-node:22",
"image": "mcr.microsoft.com/devcontainers/typescript-node:26",
"features": {
"cline-dev": {
"installCli": true
Expand Down
Loading