name: feature-creator description: Guide for creating DevContainer features. Use when creating a new feature for devcontainer, implementing install.sh scripts (npm package, binary download, source build, dotnet tool, or directory setup patterns), or configuring devcontainer-feature.json metadata. Triggers on phrases like "create a feature", "add devcontainer feature", "install.sh template", or "devcontainer-feature.json".
DevContainer Feature Creator
Create DevContainer features efficiently using proven patterns from this repository.
Feature Structure
Every feature consists of exactly two files:
features/<feature-name>/
├── devcontainer-feature.json # Metadata definition
└── install.sh # Installation script
devcontainer-feature.json Schema
Required Fields
{
"id": "<feature-name>", // kebab-case, matches folder name
"version": "1.0.0", // semver format
"name": "Human Readable Name",
"description": "Brief description of what this feature installs"
}
Optional Fields
{
"options": {
"version": {
"type": "string",
"default": "latest",
"description": "Version to install"
}
},
"installsAfter": [
"ghcr.io/devcontainers/features/node" // Dependencies
],
"postStartCommand": "command to run after container starts"
}
install.sh Patterns
Five proven patterns exist. See references/install-patterns.md for complete templates.
| Pattern | Use Case | Example |
|---|---|---|
| npm | Node.js packages | claude-code, editorconfig-prettier |
| binary | Pre-built binaries from GitHub | lazygit, copilot-cli, yazi |
| source | Build from source | luarocks |
| dotnet | .NET global tools | easydotnet |
| setup | Directory/config setup | vimcontainer-setup |
Creation Workflow
Step 1: Initialize Feature
Run the initialization script:
python3 scripts/init_feature.py <feature-name> <pattern>
Patterns: npm, binary, source, dotnet, setup
Step 2: Edit devcontainer-feature.json
- Update
nameanddescription - Add
optionsif configurable (e.g., version) - Add
installsAfterif dependencies exist
Step 3: Edit install.sh
- Replace placeholder values
- Add error handling
- Test installation
Step 4: Test Feature
# Build and test locally
devcontainer features test -f <feature-name> .
Best Practices
install.sh Guidelines
- Always start with:
#!/bin/bashandset -e - Version handling:
VERSION="${VERSION:-default}" - Architecture detection (for binaries):
ARCH=$(dpkg --print-architecture) case "$ARCH" in amd64) TARGET_ARCH="x86_64" ;; arm64) TARGET_ARCH="arm64" ;; *) echo "Unsupported: $ARCH"; exit 1 ;; esac - Dependency checks: Verify required tools before use
- Cleanup: Remove temp files and apt cache
- Verification: Confirm installation succeeded
Error Handling
- Check command availability before use
- Provide clear error messages
- Exit with non-zero code on failure
- Validate downloaded files (check gzip magic bytes)
User Context
For user-specific installations:
INSTALL_USER="${_REMOTE_USER:-${USERNAME:-vscode}}"
USER_HOME=$(getent passwd "${INSTALL_USER}" | cut -d: -f6)
Resources
- Initialization script:
scripts/init_feature.py- Generate feature scaffolding - Pattern templates:
references/install-patterns.md- Detailed templates for each pattern