Claude-skill-registry feature-creator
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".
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/feature-creator" ~/.claude/skills/majiayu000-claude-skill-registry-feature-creator && rm -rf "$T"
manifest:
skills/data/feature-creator/SKILL.mdsource content
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
andnamedescription - Add
if configurable (e.g., version)options - Add
if dependencies existinstallsAfter
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:
and#!/bin/bashset -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:
- Generate feature scaffoldingscripts/init_feature.py - Pattern templates:
- Detailed templates for each patternreferences/install-patterns.md