Skip to main content

Contributing to DevContainer Toolbox

Thank you for your interest in contributing! This guide will help you get started.

Ways to Contribute​

ContributionDescription
Add a toolCreate install scripts for new languages, frameworks, or tools
Fix bugsFix issues in existing scripts
Improve docsEnhance documentation or add examples
Report issuesFile bug reports or feature requests on GitHub

Quick Start​

1. Fork and Clone​

# Fork on GitHub, then clone your fork
git clone https://github.com/YOUR-USERNAME/devcontainer-toolbox.git
cd devcontainer-toolbox

2. Open in Devcontainer​

Note: Opening this repo in a devcontainer uses .devcontainer/devcontainer.json — the build-mode file that builds from Dockerfile.base. This is for toolbox development only. User projects use devcontainer-user-template.json (the image-mode template) via install.sh/install.ps1. See Two Deployment Modes for details.

code .
# Click "Reopen in Container" when prompted

3. Enable the Pre-commit Hook​

git config core.hooksPath .githooks

The pre-commit hook does two things automatically when you commit:

  1. Validates staged addition scripts (install-*.sh, config-*.sh, service-*.sh):
    • Syntax check (bash -n)
    • Required metadata fields (see below)
    • Shellcheck errors (shellcheck --severity=error)
  2. Auto-bumps the SCRIPT_VER patch version (e.g., 1.0.2 → 1.0.3) — you don't need to update it manually

If validation fails, the commit is blocked with a clear error message showing what needs to be fixed.

Required metadata fields for install scripts (all fields below must be present):

FieldPurpose
SCRIPT_IDUnique identifier
SCRIPT_VERScript version (auto-bumped)
SCRIPT_NAMEDisplay name (2-4 words)
SCRIPT_DESCRIPTIONOne-line description
SCRIPT_CATEGORYCategory for grouping
SCRIPT_CHECK_COMMANDHow to verify installation
SCRIPT_TAGSSearch keywords
SCRIPT_ABSTRACTBrief description for tool cards
SCRIPT_SUMMARYDetailed overview for tool detail page
SCRIPT_LOGOLogo filename (e.g., tool-name-logo.webp)
SCRIPT_WEBSITEOfficial website URL

Config and service scripts require the same fields except SCRIPT_WEBSITE. Install scripts additionally require SCRIPT_WEBSITE.

4. Create a Branch​

git checkout -b feature/my-contribution

5. Make Your Changes​

  • Add scripts to .devcontainer/additions/
  • Run tests: dev-test
  • Preview docs: dev-docs

6. Submit a Pull Request​

git add .
git commit -m "feat: add my contribution"
git push -u origin feature/my-contribution

Then create a Pull Request on GitHub.


Documentation​

Getting Started​

GuideDescription
Adding ToolsOverview of adding new tools
TestingRunning and writing tests
CI/CD PipelineGitHub Actions workflows and pipeline overview
ReleasingVersion bumping and releases
Documentation WebsiteWorking with this Docusaurus site

Creating Scripts​

GuideDescription
Creating Install ScriptsComplete guide to install-*.sh scripts

Architecture & Reference​

GuideDescription
System ArchitectureDesign patterns and data flow
Categories ReferenceValid tool categories
Libraries ReferenceShared library functions
Menu SystemDialog TUI reference

Services​

GuideDescription
Services OverviewBuilt-in services documentation

Contribution Guidelines​

Code Style​

  • Use shellcheck for all bash scripts
  • Follow existing patterns in the codebase
  • Include proper metadata in all scripts

Commit Messages​

Use conventional commit format:

feat: add Elixir development environment
fix: correct Python path in install script
docs: update getting started guide
chore: bump version to 1.2.0

Pull Request Process​

  1. Tests must pass - CI runs automatically on your PR
  2. One feature per PR - Keep PRs focused
  3. Update docs if needed - CI auto-updates generated docs after merge
  4. Version bump - If your change should reach users, bump version.txt

Getting Help​

  • Questions? Open a GitHub Discussion
  • Found a bug? Open an Issue
  • Want to chat? Comment on an existing issue or discussion

Recognition​

All contributors are appreciated! Your contributions help make development environments better for everyone.