Dev-Control is a modular Bash CLI that automates the repetitive parts of running many repositories: scaffolding repos to community standards, nested submodules, consolidated .tmp/.bak folders, rootless Podman devcontainers, VS Code MCP servers, signed GitHub releases (library tarballs, re-releases and automated version tagging) and multi-platform packages.
It aims to make awkward Git and CLI tasks — signing a worktree while preserving topology, or surgically dropping a commit — routine and reversible. Every command has a --dry-run mode. Issues and contributions are welcome.
# Install
git clone https://github.com/xaostech/dev-control.git && cd dev-control && ./install.sh
# Use
dc init # Set up a repo with templates, licence, docs
dc repo # Create a GitHub repo from your local project
dc pr # Open a pull request in seconds
dc fix # Rewrite/sign/clean commit history safely
dc modules # Manage nested submodules automatically
dc licences # Audit licence compliance across repos
dc mcp # Configure AI coding assistants (MCP servers)
dc contain # Generate devcontainer.json for VS Code
dc package # Build tarballs, Homebrew, Snap, Deb, Nix, Docker
dca-alias # Sync (all) new alias and reload bashrc
- Why Dev-Control?
- Features at a Glance
- Quick Start
- Core Commands
- Plugin System
- Configuration
- Documentation
- Contributing
- Roadmap
- Licence
Managing modern software projects involves a lot of repetitive housekeeping:
- Initialising repos with consistent templates, licences, and docs
- Keeping submodules in sync across complex monorepos
- Rewriting commit history to fix author dates or add GPG signatures
- Auditing licence compliance when you have dozens of dependencies
- Making devcontainers with the right mounts and settings and reusable category images
- Packaging your tool for multiple platforms (Homebrew, Snap, Nix, Docker…)
Dev-Control bundles all of this into a single, modular CLI. Each command is designed to be:
| Principle | How |
|---|---|
| Safe | Dry-run modes, automatic backup bundles, harness wrappers |
| Fast | Batch processing, parallel operations, minimal dependencies |
| Extensible | Plugin system, YAML config, themeable TUI |
| Portable | Pure Bash 4+, no exotic runtime, runs anywhere Git runs |
| Category | What You Get |
|---|---|
| Repo Setup | Template loading, licence selection, README/CONTRIBUTING/SECURITY scaffolding, GitHub Actions workflows |
| Git Ops | History rewriting with GPG signing, date preservation, conflict auto-resolution, worktree sync |
| Submodules | Auto-generated .gitmodules, temp-folder consolidation, symlink pruning |
| Licensing | SPDX detection, compatibility checking, bulk apply, JSON export |
| DevEx | Devcontainer generation, MCP server setup (GitHub, StackOverflow, Firecrawl) |
| Packaging | Tarball + SHA256, Homebrew formula, Snap YAML, Debian .deb, Nix flake, Docker + ttyd web terminal |
| TUI Themes | Matrix, Hacker, Cyber aesthetics powered by Charmbracelet Gum |
- Bash 4.0+ or Zsh
- Git 2.0+
- GitHub CLI (
gh) for repo/PR commands - Optional:
gumorfzffor interactive TUI; GPG for signing
git clone https://github.com/xaostech/dev-control.git
cd dev-control
./install.sh # Adds `dc` to your PATH and installs aliases
source ~/.bashrc # Or restart your shelldc --version # Print the installed version
dc --help # List all commandsRun dc <command> --help for full options.
| Command | Purpose |
|---|---|
dc alias |
Install shell aliases for Git, Docker and system monitoring |
dc init |
Populate a repo with docs, licence, workflows and GitHub templates |
dc repo |
Create a GitHub repo from the local project |
dc pr |
Open a pull request from the current branch |
dc fix |
Rewrite commits — edit messages, sign, fix dates, drop or combine |
dc modules |
Auto-generate .gitmodules; consolidate temp folders |
dc licences |
Detect, check compatibility and apply licences |
dc mcp |
Configure MCP servers for AI coding assistants |
dc contain |
Generate a .devcontainer/ setup |
dc package |
Build tarball, Homebrew, Snap, Deb, Nix and Docker packages |
Command examples ›
Add productivity aliases for Git, Docker, system monitoring, and more.
dc alias # Interactive category selection
source ~/.bashrcgpf # git push --force-with-lease
dca-alias # Apply and source all aliases
gcda # Stage, amend and push with preserved author date
gcda # Restore original author datePopulate a repo with docs, licence, workflows, and GitHub templates.
dc init # Interactive mode
dc init --defaults # Skip repo owner/slug and bot credentials (envVars) prompts
dc init -f docs/SECURITY.md # Update a specific file
dc init --batch /projects/* # Initialise multiple reposPush your local project to a new GitHub repo in one step. Defaults to repo config generated by dc-init.
dc repo # Interactive prompts
dc repo --private --topics cli,bashOpen a PR from your current branch with auto-detected metadata.
dc pr # Interactive
dc pr --draft --label bugSafely rewrite commits—edit messages, sign, fix dates, drop commits.
dc fix # Interactive (last 10 commits)
dc fix --sign --range HEAD=all # GPG-sign entire branch
dc fix --dry-run --range main..HEAD # Preview changes
dc fix --restore # Recover from backup bundle
dc fix --drop hash # Surgically drop commit by hash
dc fix --sign --atomic-preserve --auto-resolve --range HEAD=5 # Preserve merge topology and autoresolve merge conflictsAuto-generate .gitmodules for nested repos; consolidate temp folders.
dc modules /path/to/monorepo
dc modules --aggressive --dry-run # Preview symlink + .gitignore changesDetect, check compatibility, and apply licences across repos.
dc licences # Scan current repo
dc licences --deep # Include submodules
dc licences --check GPL-3.0 # Verify compatibility
dc licences --apply MIT # Apply licence templateConfigure Model Context Protocol servers for AI coding assistants.
dc mcp # Interactive server selection
dc mcp --test # Verify GitHub MCP connection
dc mcp --create-pat # Interactive Github PAT creation
dc mcp --config # Only generate .vscode/mcp.jsonGenerate a complete .devcontainer/ setup for VS Code.
dc contain # Interactive
dc contain --image mcr.microsoft.com/devcontainers/base:ubuntu
dc contain --base --dev-tools --defaults && \
cd subfolder && dc contain --img --dev-tools # Use the previous container image (tag=dev-tools) as a base
dc contain --nest <<< y # Discover, update and rebuild all containers recursively
dc contain --nest --regen # Agressively do same (remove config files and containers)
dc contain --nest --regen . # Include root in same
dc contain --nest --regen --dev-tools # Filter rebuild to one category; multiple categories supported (--web-dev --streaming)Git identity (
user.name/user.email) is sourced from~/.config/dev-control/container.yamlif present, falling back to the host's global git config — sogit config --global user.emailon the host is both the simplest and most resilient setup, with the YAML file as an optional explicit override.
Build distribution packages with a single command.
dc package --init # Create .dc-package.yaml
dc package --all # Build everything
dc package --docker --theme cyber # Docker image with ttyd + themeExtend Dev-Control with custom commands.
plugins/
└── my-plugin/
├── plugin.yaml # name, version, description, commands
└── commands/
└── greet.sh # becomes `dc greet`
dc plugin list # Show installed plugins
dc plugin install gh:user/repo # Install from GitHub
dc plugin remove my-pluginDev-Control uses a layered config system (highest priority first):
- Environment variables (
DC_*) - Project config (
.dc-init.yamlin repo root) - Global config (
~/.config/dev-control/config.yaml) - Built-in defaults
Example .dc-init.yaml:
project-name: my-project
default-licence: MIT
default-branch: main
auto-sign-commits: true
github-org: my-orgSee config/example.dc-init.yaml for all options.
| Document | Description |
|---|---|
| Installation Guide | Detailed install & upgrade instructions |
| Contributing | How to contribute |
| Code of Conduct | Community guidelines |
| Security Policy | Reporting vulnerabilities |
| Testing Guide | Running and writing tests |
| Script | Purpose |
|---|---|
| dev-control.sh | Interactive main menu |
| template-loading.sh | Template init logic |
| fix-history.sh | History rewriting engine |
| module-nesting.sh | Submodule management |
| licences.sh | Licence auditing |
| containerise.sh | Devcontainer generator |
| packaging.sh | Multi-platform packaging |
| mcp-setup.sh | MCP server configuration |
Located in scripts/lib/:
| Library | Purpose |
|---|---|
colours.sh |
ANSI terminal colours |
print.sh |
Formatted output (headers, boxes, spinners) |
config.sh |
YAML config parsing |
tui.sh |
Gum/fzf interactive prompts |
validation.sh |
Input validation |
git/*.sh |
Git utilities (dates, topology, worktrees, etc.) |
Contributions are welcome. Please read CONTRIBUTING.md first.
# Fork → Clone → Branch → Commit → PR
git checkout -b feature/amazing-feature
git commit -m "Add amazing feature"
git push origin feature/amazing-feature- Unified
dcCLI with command registry - Plugin system with GitHub install support
- Multi-platform packaging (tarball, Homebrew, Snap, Deb, Nix, Docker)
- MCP server configuration for AI assistants
- Licence auditing with SPDX detection
- Devcontainer generator
- Zsh compatibility layer
- Fish shell support
- GUI wrapper (Bubble Tea / Tauri)
- Remote plugin registry
See open issues for more.
GPL-3.0. See LICENCE.