DS (Delivery Station)

A plugin-based CLI meta-application that serves as a wrapper and infrastructure manager for OCI artifact tools.
Overview
DS is a plugin manager and infrastructure provider - it does not directly handle artifacts. Instead, it:
- Manages plugins: Discovers, installs, updates, and executes plugin binaries
- Provides shared infrastructure: Configuration, cache, registry client, event bus
- Delegates operations: All artifact operations (pull, push, list, cache management) are handled by plugins
Features
- π Plugin Management: Install, update, sign, and manage plugins from OCI registries
- βοΈ Unified Configuration: Share configuration across all plugins via YAML, environment variables, or CLI flags
- π Authentication: Support for Docker config.json and explicit credentials (available to plugins)
- πΎ Shared Cache: Artifact caching infrastructure accessible by all plugins
- π Inter-Plugin Communication: Event bus and state store for plugin coordination
- π Cross-Platform: Support for Linux, macOS, and Windows
- π¦ OCI Registry Client: Shared registry client library for plugins
Note: DS itself does not perform artifact operations (pull, push, list, etc.). These are delegated to plugins.
Installation
Download Pre-built Binaries
Download the latest release for your platform from the releases page:
Build from Source
Requirements:
# Clone the repository
git clone https://github.com/delivery-station/ds.git
cd ds
# Build
make build
# Install to $GOPATH/bin
make install
Quick Start
Basic Usage
# Check version
ds version
# View help
ds --help
# Show configuration
ds config show
ds config validate
# Plugin management
ds plugin list
ds plugin info porter
ds plugin install porter
ds plugin update porter
ds plugin sign <binary>
> DS installs plugins from multi-architecture OCI indexes. Ensure the published reference includes manifests for each supported OS/architecture.
# Use a plugin (artifact operations delegated to plugins)
ds porter fetch ghcr.io/org/app:v1.0.0
ds porter deliver ghcr.io/org/app:v1.0.0
Configuration
DS supports multiple configuration sources with the following precedence:
CLI Flags > Environment Variables > Config File > Defaults
Config File Locations
- Linux/macOS:
~/.config/ds/config.yaml
- Windows:
%APPDATA%\ds\config.yaml
- Project-local:
./config.yaml
Example Configuration
# Registry configuration
registry:
# The default entry can include a namespace (e.g. ghcr.io/delivery-station)
default: "ghcr.io/delivery-station"
mirrors:
- "registry.example.com"
insecure_registries: []
# Authentication
auth:
docker_config: "~/.docker/config.json"
# Cache settings
cache:
dir: "~/.cache/ds"
max_size: "10GB"
ttl: "7d"
# Logging
logging:
level: "info"
format: "text"
# Plugin management
plugins:
dir: "~/.config/ds/plugins"
sources:
- registry: "ghcr.io/delivery-station"
Environment Variables
All configuration values can be set via environment variables with the DS_ prefix:
export DS_REGISTRY_DEFAULT=ghcr.io/delivery-station
export DS_AUTH_DOCKER_CONFIG=~/.docker/config.json
export DS_CACHE_DIR=~/.cache/ds
export DS_LOGGING_LEVEL=debug
Global Flags
--config string Config file path (default: ~/.config/ds/config.yaml)
--log-level string Log level: debug, info, warn, error (default: info)
--plugin-dir string Plugin directory (default: ~/.config/ds/plugins)
--no-color Disable colored output
Development
Prerequisites
Building
# Download dependencies
make deps
# Build the binary
make build
# Run tests
make test
# Run linters
make lint
# Build with coverage
make test-coverage
# Clean build artifacts
make clean
Project Structure
ds/
βββ cmd/
β βββ ds/ # Main entry point
βββ internal/
β βββ cmd/ # Command implementations
β βββ config/ # Configuration management (Agent 2)
β βββ plugin/ # Plugin management (Agent 3-4, 6)
β βββ registry/ # OCI registry client (Agent 5)
β βββ cache/ # Artifact caching (Agent 7)
βββ pkg/
β βββ types/ # Shared types
β βββ client/ # DS client library for plugins (Agent 8)
βββ docs/ # Documentation (Agent 10)
βββ Makefile
βββ go.mod
βββ README.md
Architecture
DS is a wrapper/manager that provides infrastructure for plugins:
βββββββββββββββββββββββββββββββββββββββββββ
β User CLI β
β $ ds porter fetch <artifact> β
ββββββββββββββββββββ¬βββββββββββββββββββββββ
β
ββββββββββββββββββββΌβββββββββββββββββββββββ
β DS Core (Wrapper/Manager) β
β β Plugin Discovery & Execution β
β β Configuration Management β
β β Shared Cache Infrastructure β
β β OCI Registry Client (for plugins) β
β β Inter-Plugin Communication β
β β No built-in artifact operations β
ββββββββββββββββββββ¬βββββββββββββββββββββββ
β (delegates to plugin)
ββββββββββββββββββββΌβββββββββββββββββββββββ
β Plugin: Porter (Go) β
β Uses DS Client Library β
β Fetch β Analyze β Deliver β
βββββββββββββββββββββββββββββββββββββββββββ
Key Point: DS provides the infrastructure (config, cache, registry client) but delegates all artifact operations to plugins.
Plugin Development
Plugins are independent binaries that follow a simple contract:
- Naming: Binary must be named
ds-<plugin-name> (e.g., ds-porter)
- Configuration: Read from
DS_* environment variables
- Inter-plugin calls: Use
ds <other-plugin> <command> to call other plugins
See the Plugin Development Guide and plugin template for detailed instructions.
Documentation
Contributing
We welcome contributions! Here's how you can help:
- Report Bugs: Use the bug report template
- Request Features: Use the feature request template
- Submit Pull Requests: See CONTRIBUTING.md for guidelines
- Improve Documentation: Documentation improvements are always appreciated
- Create Plugins: Extend DS functionality by creating new plugins
Please read our Code of Conduct before contributing.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
Acknowledgments
Built with:
- Cobra - CLI framework
- Viper - Configuration management
- ORAS Go - OCI registry client library