Caution
jig doesn't actually do any of these things yet. This README is a design document. Please don't be fooled.
jig is a comprehensive CLI toolbox that consolidates various utilities into a single, unified command-line interface.
Built with Rust, it provides a consistent experience for common development, security, and administrative tasks.
It's a collection of things I felt like implementing. It's not a framework, it's not a library, it's just a bunch of utilities.
Enjoy the chaos.
jig can be installed as a standalone binary.
The shell plugin is strongly recommended. It is required for:
- Automatic
jiginstallation and updates - Automatic
$PATHconfiguration - Automatic template updates
jig workspacecommands
For additional features, install it åusing your preferred package manager. The following shell plugin managers are tested and supported:
Fish Shell:
fisheroh-my-fishfundlefisherman
Zsh:
antigenantidoteantibodyzplugzpluginoh-my-zsh
Bash:
bash-itoh-my-bash
Other shell plugin managers may work, but are not explicitly tested.
When you run jig init, it will tell you how to install the plugin for your shell. You don't strictly have to, of
course.
- Automatic directory creation and management
- Seamless
jig workspace hookintegration - Automatic
$PATH/$fish_user_pathsconfiguration - Maintains supporting artifacts in
~/.local/share/jig - Shell completion support (via
clap)
# Install using Cargo if you have Rust installed
cargo install jig-cli
# Or install with Homebrew on macOS
brew install daveio/tap/jig
# Or just grab the latest release
# <https://github.com/daveio/jig/releases/latest>
# Initialize configuration
jig init
# View help
jig --helpMulti-architecture container images are automatically built and published to GitHub Container Registry for every tagged release.
ghcr.io/daveio/jig:latest- Latest releaseghcr.io/daveio/jig:x.y.z- Specific version
linux/amd64(x86_64)linux/arm64(aarch64)
# Run the latest version
docker run --rm ghcr.io/daveio/jig:latest --help
# Run a specific version
docker run --rm ghcr.io/daveio/jig:1.0.0 --version
# Mount current directory and run with config
docker run --rm -v "$(pwd):/workspace" -w /workspace \
-v "$HOME/.jig.yaml:/root/.jig.yaml:ro" \
ghcr.io/daveio/jig:latest crypto encrypt file.txtThe container build process is optimized for speed and efficiency:
- Native Binary Building: Rust binaries are compiled natively on Ubuntu runners using cross-compilation targets
- Multi-stage Docker Build: A lightweight Alpine-based image selects the appropriate precompiled binary for each architecture
- Artifact Caching: GitHub Actions caches Rust dependencies and build artifacts between runs
- Parallel Builds: Both architectures are built simultaneously for maximum efficiency
This approach significantly reduces build times compared to compiling Rust code inside Docker containers.
┌─────────────────┐ ┌─────────────────┐
│ build-binaries│ │ build-binaries│
│ (x86_64) │ │ (aarch64) │
│ │ │ │
│ • Rust cache │ │ • Rust cache │
│ • Native build │ │ • Cross compile │
│ • Upload binary │ │ • Upload binary │
└─────────┬───────┘ └─────────┬───────┘
│ │
└──────────┬───────────┘
│
┌────────▼────────┐
│ build-container │
│ │
│ • Download bins │
│ • Multi-arch │
│ • Fast build │
└─────────────────┘
---
config:
layout: elk
theme: dark
---
graph LR
jig[jig]
jig --> init(init)
jig --> crypto(crypto)
crypto --> cryptoEncrypt(encrypt)
crypto --> cryptoDecrypt(decrypt)
crypto --> cryptoPublic(public)
jig --> generate(generate)
generate --> generateHex(hex)
generate --> generatePassword(password)
generate --> generateKey(key)
generateKey --> generateKeyCrypto(crypto)
generateKey --> generateKeyWireguard(wireguard)
generate --> generateJwt(jwt)
jig --> network(network)
network --> networkDns(dns)
networkDns --> networkDnsFlush(flush)
networkDns --> networkDnsLookup(lookup)
networkDns --> networkDnsSec(sec)
jig --> domain(domain)
domain --> domainCheck(check)
domain --> domainExpiry(expiry)
domain --> domainNs(ns)
jig --> tls(tls)
tls --> tlsCert(cert)
tls --> tlsCiphers(ciphers)
jig --> api(api)
api --> apiTicket(ticket)
apiTicket --> apiTicketTitle(title)
apiTicket --> apiTicketDescription(description)
apiTicket --> apiTicketEnrich(enrich)
api --> apiImage(image)
apiImage --> apiImageAlt(alt)
apiImage --> apiImageOptimise(optimise)
api --> apiToken(token)
apiToken --> apiTokenInfo(info)
apiToken --> apiTokenRevoke(revoke)
apiToken --> apiTokenUsage(usage)
api --> apiPing(ping)
jig --> mcp(mcp)
mcp --> mcpProxy(proxy)
mcp --> mcpServe(serve)
jig --> dance(dance)
jig --> terminal(terminal)
terminal --> terminalSysinfo(sysinfo)
terminal --> terminalXKCD(xkcd)
jig --> project(project)
project --> projectNew(new)
project --> projectUpdate(update)
project --> projectBump(bump)
project --> projectDependabot(dependabot)
project --> projectTemplate(template)
projectTemplate --> projectTemplateList(list)
projectTemplate --> projectTemplateNew(new)
projectTemplate --> projectTemplateUpdate(update)
jig --> git(git)
git --> gitClone(clone)
git --> gitBinary(binary)
gitBinary --> gitBinaryGet(get)
gitBinary --> gitBinaryUpdate(update)
gitBinary --> gitBinaryShow(show)
gitBinary --> gitBinaryRemove(remove)
git --> gitSecrets(secrets)
git --> gitCommit(commit)
git --> gitYank(yank)
git --> gitLatest(latest)
jig --> workspace(workspace)
workspace --> workspaceSwitch(switch)
workspace --> workspaceList(list)
workspace --> workspaceHook(hook)
jig --> ai(ai)
ai --> aiRename(rename)
aiRename --> aiRenameImage(image)
style dance stroke-dasharray: 2 3, stroke-width: 5px
jig uses YAML configuration files for its configuration. The configuration system is built with saphyr and serde
for robust YAML operations.
- Primary:
~/.jig.yaml - Secrets (optional):
~/.jig.secret.yaml(configurable viasecret.file)
The bare minimum configuration requires only an encryption key:
secret:
key: AGE-SECRET-KEY-[...]dns:
nameserver: 8.8.8.8
generate:
password:
emoji: true
git:
commit:
after: null
before: null
prefixes:
- docs
- feat
- fix
- perf
- refactor
- style
- test
internal: true
github:
user: daveio
mcp:
clients:
example-client:
length: 40
servers:
- example-http
- example-sse
- example-stdio
servers:
example-stdio:
command: uvx some-mcp-server
env:
MCP_ENV_VAR: value
type: stdio
example-sse:
type: sse
url: https://mcp.example.com/sse
example-http:
type: http
url: https://mcp.example.com/http
nextdns:
profiles:
home: ff33bb
work: bbff33
project:
dependabot:
schedule:
interval: daily
open-pull-requests-limit: 100
assignees:
- daveio
groups:
all-dependencies:
patterns:
- "*"
secret:
file: ~/.jig.secret.yaml # ignores all other secret configuration if set, even if the file doesn't exist
domainr:
env: DOMAINR_API_KEY
file: ~/.jig.domainr.key
key: xxxxxxx
order:
- env
- file
- key
github:
env: GITHUB_API_KEY
file: ~/.jig.github.key
key: xxxxxxx
order:
- env
- file
- key
nextdns:
env: NEXTDNS_API_KEY
file: ~/.jig.nextdns.key
key: xxxxxxx
order:
- env
- file
- key
main:
env: JIG_SECRET_KEY
file: ~/.jig.secret.key
key: AGE-SECRET-KEY-[...]
order:
- env
- file
- key
jwt:
env: JIG_JWT_SECRET
file: ~/.jig.jwt.key
key: JWT_SECRET_VALUE
order:
- env
- file
- key
template:
branch: template
repository: daveio/jig
workspace:
current: example
create: false
hooks:
before-up: []
after-up:
- echo "hello example"
before-down: []
after-down:
- echo "bye example"
workspaces:
example:
up:
- gcloud config configurations activate example
- gcloud config set project example_project
- kubectx example_cluster
down: []
env:
EXAMPLE_VAR: abc123
ANOTHER_VAR: "true"
YET_ANOTHER_VAR: "12345"
yank:
dir: ~/src
fetch: --prune --tags --prune-tags --recurse-submodules=yes
pull: --all --tags --prune --jobs=8 --recurse-submodules=yesFor a quick start, use this minimal configuration:
secret:
key: AGE-SECRET-KEY-[...]All jig commands support these universal options:
| Option | Short | Description |
|---|---|---|
--version |
-V |
Display version information |
--help |
-h |
Show help for a command |
--yes |
-y |
Skip all confirmations |
--json |
-j |
Output structured JSON (formatted with stringify_pretty) |
--verbose |
-v |
Detailed output to STDERR (incompatible with --json) |
--quiet |
-q |
Minimal output to STDERR (incompatible with --json) |
--silent |
-s |
No output to STDOUT/STDERR (incompatible with --json) |
Note: Commands support abbreviation to the point of disambiguation via
clap.
Initialize jig configuration and set up the environment.
Summary: Creates necessary directories, fetches templates, generates configuration with encryption keys, and sets up shell integration.
Parameters:
-c,--clobber: Overwrite existing configuration without confirmation
Configuration: None.
Flow:
- Create required directories:
~/.local/share/jig~/.local/share/jig/bin~/.local/share/jig/templates
- Clone template repository from GitHub
- Generate new encryption key if creating config
- Create configuration file (prompts if exists unless
--clobber) - Check shell integration status
- Provide setup instructions if integration inactive
Notes:
- Uses
gitCLI orgixlibrary based ongit.internalconfig - Templates default to
templatesbranch ofjigrepository - Can be customized via
template.repositoryandtemplate.branch
AI-powered utilities for various automation tasks.
AI-powered renaming operations.
Automatically rename image files using AI-generated descriptive names.
Summary: Analyzes image content and generates descriptive filenames following a standardized format.
Parameters:
[FILENAME_OR_GLOB]: File or glob pattern to rename (defaults to all*.jpg,*.jpeg,*.png,*.webpin current directory)- Multiple filenames/globs can be specified
Configuration: None.
Flow:
- Process each image file through
prepare_image_for_claudeutility - Send image to Claude for content analysis
- Generate filename using format:
descriptive_words-YYYYMMDD-HHMMss.ext - Rename file with generated name
- Clean up temporary files
Notes: Uses internal ask_claude utility for AI processing.
Interact with the dave.io API services.
Base URL: https://dave.io/
Check API health and connectivity.
Summary: Performs a simple health check against the API endpoint.
Parameters: None.
Configuration: None.
Flow:
- Send GET request to
/api/ping - Display JSON response data
Image processing and AI operations.
Generate AI-powered alt text for accessibility.
Summary: Analyzes images and generates descriptive alt text for web accessibility.
Parameters:
[FILENAME]: Image file to process
Configuration: None.
Flow:
- Process image through
prepare_image_for_claudeutility - Send processed image to
/api/ai/altvia POST - Return generated alt text
Optimize images for web delivery.
Summary: Reduces image file size while maintaining quality.
Parameters:
[FILENAME]: Image file to optimize
Configuration: None.
Flow:
- Send image to
/api/images/optimisevia POST - Receive and save optimized image
AI-powered ticket management utilities.
Generate concise ticket titles from descriptions.
Summary: Creates well-formatted ticket titles from detailed descriptions.
Parameters:
[DESCRIPTION]: Ticket description text (required)-i,--input: Read description from file-S,--stdin: Read description from stdin
Configuration: None.
Flow:
- Send description to
/api/tickets/title - Return generated title
Generate detailed descriptions from titles.
Summary: Expands ticket titles into comprehensive descriptions.
Parameters:
[TITLE]: Ticket title text (required)-i,--input: Read title from file-S,--stdin: Read title from stdin
Configuration: None.
Flow:
- Send title to
/api/tickets/description - Return generated description
Enhance ticket information with additional context.
Summary: Adds metadata and context to existing tickets.
Parameters: None.
Configuration: None.
Flow: None.
API token management operations.
Retrieve token details and metadata.
Summary: Displays information about a specific API token.
Parameters:
[UUID]: Token UUID (required)
Configuration: None.
Flow:
- Send GET request to
/api/tokens/$UUID - Display token information
Revoke an active API token.
Summary: Permanently invalidates a token.
Parameters:
[UUID]: Token UUID to revoke (required)
Configuration: None.
Flow:
- Send POST request to
/api/tokens/$UUID/revoke - Confirm revocation
View token usage statistics.
Summary: Shows usage metrics and limits for a token.
Parameters:
[UUID]: Token UUID (required)
Configuration: None.
Flow:
- Send GET request to
/api/tokens/$UUID/usage - Display usage statistics
Encryption and decryption operations using age encryption.
Encrypt data using age encryption.
Summary: Encrypts files or stdin data using the age encryption standard.
Parameters:
-i,--input: Input file to encrypt (reads stdin if omitted)-o,--output: Output file for ciphertext (writes to stdout if omitted)-k,--key [KEY]: Override default encryption key
Configuration:
secret.main.key: Default encryption keysecret.main.env: Environment variable for keysecret.main.file: File containing key
Flow:
- Read input data from file or stdin
- Load encryption key (parameter > env > file > config)
- Encrypt using age encryption
- Write ciphertext to file or stdout
Notes: Supports binary input. Information messages sent to stderr.
Decrypt age-encrypted data.
Summary: Decrypts files or stdin data encrypted with age.
Parameters:
-i,--input: Input file to decrypt (reads stdin if omitted)-o,--output: Output file for plaintext (writes to stdout if omitted)-k,--key [KEY]: Override default decryption key
Configuration:
secret.main.key: Default decryption keysecret.main.env: Environment variable for keysecret.main.file: File containing key
Flow:
- Read ciphertext from file or stdin
- Load decryption key (parameter > env > file > config)
- Decrypt using age
- Write plaintext to file or stdout
Notes: Supports binary output. Information messages sent to stderr.
Display public key for encryption.
Summary: Shows the public key (recipient) associated with a private key.
Parameters:
-k,--key [KEY]: Private key to process (uses configured key if omitted)
Configuration:
secret.main.key: Default private key
Flow:
- Load private key
- Derive and display public recipient key
Notes: Public key is used as recipient in age encryption.
Easter egg command with animated terminal effects.
Summary: Hidden command that displays animated terminal effects and ASCII art.
Parameters: None.
Configuration: None.
Flow:
- Initialize terminal effects engine
- Display animated sequences
- Clean up and restore terminal
Notes:
- Not shown in
--helpoutput - Not exposed via MCP
- See "Easter Egg Nonsense" section for implementation details
Domain management and information tools.
Check domain name availability across TLDs.
Summary: Searches for available domain names using the Domainr API, filtered to Cloudflare-supported TLDs.
Parameters:
[QUERY]: Domain name to check (required)-d,--domaincheck: Use externaldomainchecktool instead
Configuration:
api.domainr: Domainr API key
Flow:
- Query Domainr API with search term
- Filter results to Cloudflare TLD list
- Display availability status for each TLD
Notes:
- Requires Domainr API key in configuration
- Limited to Cloudflare-supported TLDs:
acacademyaccountantaccountantsactoradultagencyaiairforceapartmentsapparmyassociatesattorneyauctionaudiobabybandbarbargainsbeerbetbidbikebingobizblackblogblueboobostonboutiquebrokerbuildbuildersbusinesscabcafecamcameracampcapitalcardscarecareerscasacashcasinocateringcccenterceochatcheapchristmaschurchcityclaimscleaningclinicclothingcloudclubcoco.ukcoachcodescoffeecollegecomcom.aicom.cocommunitycompanycomparecomputercondosconstructionconsultingcontactcontractorscookingcoolcouponscreditcreditcardcricketcruisesdaddancedatedatingdaydealerdealsdegreedeliverydemocratdentaldentistdesigndevdiamondsdietdigitaldirectdirectorydiscountdoctordogdomainsdownloadeducationemailenergyengineerengineeringenterprisesequipmentesqestateeventsexchangeexpertexposedexpressfailfaithfamilyfanfansfarmfashionfeedbackfinancefinancialfishfishingfitfitnessflightsfloristflowersfmfoofootballforexforsaleforumfoundationfunfundfurniturefutbolfyigallerygamegamesgardengiftsgivesglassglobalgmbhgoldgolfgraphicsgratisgreengripegroupguideguitarsguruhaushealthhealthcarehelphockeyholdingsholidayhorsehospitalhosthostinghousehowicuimmoimmobilienincindustriesinfoinkinstituteinsureinternationalinvestmentsioirishjetztjewelrykaufenkimkitchenlandlawyerleaselegallgbtlifelightinglimitedlimolinkliveloanloanslolloveltdluxemaisonmanagementmarketmarketingmarketsmbameme.ukmediamemorialmenmiamimobimodamommoneymonstermortgagemovmovienavynetnet.ainet.conet.uknetworknewnewsnexusngoninjanom.coobserveroff.aiongonlineorgorg.aiorg.ukorganicpagepartnerspartspartypetphdphotographyphotospicspicturespinkpizzaplaceplumbingpluspornpressproproductionsprofpromopropertiesprotectionpubracingrealtyrecipesredrehabreisereisenrentrentalsrepairreportrepublicanrestrestaurantreviewreviewsriprocksrodeorsvprunsalesalonsarlschoolschulesciencesecurityselectservicessexshshoesshopshoppingshowsinglessiteskisoccersocialsoftwaresolarsolutionssoyspacestoragestorestreamstudiostylesuppliessupplysupportsurfsurgerysystemstaxtaxiteamtechtechnologytennistheatertheatretiendatipstirestodaytoolstourstowntoystradetradingtrainingtraveltvukuniversityunousvacationsventuresvetviajesvideovillasvinvipvisionvodkavoyagewatchwebcamwebsiteweddingwikiwinwineworkworksworldwtfxxxxyzyogazone - Can we fetch this list programmatically?
Check domain expiration dates.
Summary: Retrieves domain registration expiry information via RDAP.
Parameters:
[DOMAIN]: Domain name to check (required)
Configuration: None.
Flow:
- Query RDAP server for domain info
- Extract expiration date from response
- Display days until expiry
- If RDAP fails, provide WHOIS lookup URL
Notes: Uses rdap-icann-client for RDAP queries.
Retrieve nameserver information.
Summary: Displays authoritative nameservers for a domain.
Parameters:
[DOMAIN]: Domain name to check (required)
Configuration: None.
Flow:
- Query RDAP for nameserver data
- If RDAP fails, perform DNS NS record lookup
- Display nameserver list
Notes: Falls back to DNS lookup if RDAP unavailable.
Cryptographically secure generation utilities.
Global Options for Deterministic Generation:
-k,--keyed [name]: Generate deterministic output using encryption key + name-d,--seed [value]: Use custom seed instead of encryption key (processed with argon2)
Generate random hexadecimal strings.
Summary: Creates cryptographically secure random hex values for IDs, tokens, or secrets.
Parameters:
[LENGTH]: Number of bytes (default: 16 bytes = 32 hex chars)
Configuration: None.
Flow:
- Generate random bytes
- Convert to hexadecimal string
- Output lowercase hex
Generate secure passwords with customizable complexity.
Summary: Creates strong passwords with entropy validation and character set requirements.
Parameters:
[LENGTH]: Password length (default: 16, or word count in xkcd mode)-e,--emoji: Include emoji characters-x,--xkcd: Generate passphrase using word list
Configuration:
generate.password.emoji: Enable emoji by default
Flow:
- Select character sets based on options
- Generate password ensuring one char from each set
- Check entropy with
zxcvbn(minimum score: 3) - Regenerate if entropy too low
- Display password with security metrics
Notes:
- Base alphabet:
A-Z,a-z,0-9,@%^-_,.~ - Emoji alphabet:
😀😃😄😁😆😅😂🤣😊😇🙂🙃😉😌😍🥰😘😗😙😚😋😛😜🤪😝🤑🤗🤭🤫🤔🤐🤨😐😑😶😏😒🙄😬🤥😌😔😪🤤😴😷🤒🤕🤢🤮🤧🥵🥶🥴😵🤯🤠🥳😎🤓🧐😕😟🙁
☹️ 😮😯😲😳🥺😦😧😨😰😥😢😭😱😖😣😞😓😩😫🥱😤😡😠🤬😈👿💀☠️💩🤡👹👺👻
Generate various types of cryptographic keys.
Generate age encryption keys.
Summary: Creates private keys for age-based encryption.
Parameters:
-w,--write: Save key to configuration file
Configuration:
secret.main.key: Where to store the key
Flow:
- Generate age private key
- Display private and public keys
- Optionally save to config
Generate WireGuard VPN keys.
Summary: Creates WireGuard private and public key pairs.
Parameters: None.
Configuration: None.
Flow:
- Generate WireGuard private key
- Derive public key
- Display both keys
Generate JSON Web Tokens with claims.
Summary: Creates signed JWTs for API authentication.
Parameters:
--subject [subject]: Token subject (required, e.g., "ai:alt")--description [text]: Human-readable description--expiry [duration]: Expiration time (default: "1h")--claim [key=value]: Custom claims (repeatable)--secret [secret]: Signing secret--algorithm [alg]: Algorithm (default: HS256)
Configuration:
secret.jwt.key: Default JWT secretsecret.jwt.env: Environment variable for secretsecret.jwt.file: File containing secret
Flow:
- Generate UUID for token ID
- Build claims with subject and custom data
- Load signing secret (parameter > config > error)
- Sign token with specified algorithm
- Output JWT
graph LR
A[Start] --> B{Secret Source?}
B -->|Parameter| C[Use --secret]
B -->|Config| D[Load from config]
B -->|None| E[Error]
C --> F[Build Claims]
D --> F
F --> G[Sign JWT]
G --> H[Output Token]
Git and GitHub utilities for repository and release management.
Manage binary releases from GitHub repositories.
Storage: ~/.local/share/jig/binaries.yaml (metadata), ~/.local/share/jig/bin (binaries)
Install binary releases from GitHub.
Summary: Downloads and installs the latest binary release for your platform.
Aliases: install, add
Parameters:
[USERNAME]/[REPO]: GitHub repository (required)
Configuration: None.
Flow:
- Query GitHub API for latest release
- Find binary matching current OS/architecture
- Download to
~/.local/share/jig/bin - Make executable
- Save metadata with hash to
binaries.yaml - Display installation path
Notes: PATH integration handled by shell hook.
Display information about installed binaries.
Summary: Shows installation path and optional hash information.
Parameters:
[USERNAME]/[REPO]: GitHub repository-H,--hashes: Include file hashes
Configuration: None.
Flow:
- Read metadata from
binaries.yaml - Display path and optional hash
Update installed binaries to latest versions.
Summary: Checks for and installs newer releases.
Parameters:
[USERNAME]/[REPO]: Specific repository to update[BINARY_NAME]: Update by binary name-a,--all: Update all installed binaries
Configuration: None.
Flow:
- Check current version hash
- Query GitHub for latest release
- Compare hashes to detect changes
- Download and replace if newer
- Update metadata
Remove installed binaries.
Summary: Uninstalls binaries and cleans up metadata.
Aliases: rm
Parameters:
[USERNAME]/[REPO]: Repository to remove[BINARY_NAME]: Remove by binary name
Configuration: None.
Flow:
- Remove binary from filesystem
- Clean up metadata entry
- Confirm removal
Clone GitHub repositories with simplified syntax.
Summary: Clone repositories using short username/repo or just repo notation.
Parameters:
[USERNAME]/[REPO]or[REPO]: Repository to clone-c,--cli: Use git CLI instead of gix-i,--internal: Force use of gix library
Configuration:
git.internal: Use gix library by default (true)github.user: Default GitHub username
Flow:
- Resolve full repository path
- If just
repo, use configured username - Clone using gix or git CLI
- Set up local repository
Notes:
- SSH agent support may require
--cliflag - Defaults to gix for better performance
Generate AI-powered commit messages.
Summary: Creates conventional commit messages with AI analysis of changes.
Parameters:
[PARAMETERS]: Additional git commit parameters
Configuration:
git.commit.prefixes: Allowed conventional prefixesgit.commit.before: Prepend text to messagesgit.commit.after: Append text to messages
Flow:
- Generate diff of staged changes
- Truncate large diffs for AI processing
- Send to Claude with commit format instructions
- Generate emoji + conventional prefix title
- Add configured before/after text
- Execute commit with generated message
graph LR
A[Get Diff] --> B{Diff Size}
B -->|Large| C[Truncate]
B -->|Small| D[Send to AI]
C --> D
D --> E[Generate Message]
E --> F[Add Custom Text]
F --> G[Commit]
Notes: Reimplements oco functionality natively.
Get latest commit hash from GitHub.
Summary: Retrieves the most recent commit SHA for a branch.
Parameters:
[USERNAME]/[REPO]: Repository to query[BRANCH]: Branch name (defaults to default branch)
Configuration: None.
Flow:
- Query GitHub API for branch info
- Extract latest commit SHA
- Display hash
Manage GitHub repository secrets.
Summary: Set encrypted secrets for GitHub Actions.
Parameters:
[USERNAME]/[REPO]or[REPO]: Target repository[SECRET_NAME]: Secret name[SECRET_VALUE]: Secret value (or stdin)
Configuration:
github.user: Default GitHub username
Flow:
- Resolve repository path
- Read value from parameter or stdin
- Encrypt and upload to GitHub
- Confirm secret creation
Batch update all Git repositories.
Summary: Recursively fetch and pull all repositories in a directory.
Parameters:
[DIRECTORY]: Root directory to search-c,--cli: Use git CLI-i,--internal: Force gix usage
Configuration:
yank.dir: Default directoryyank.fetch: Git fetch parametersyank.pull: Git pull parametersgit.internal: Use gix by default
Flow:
- Find all
.gitdirectories recursively - For each repository:
- Run fetch with configured parameters
- Run pull with configured parameters
- Report success/failure summary
Notes:
- Respects fetch/pull parameters when possible
- SSH operations may require
--cli
Model Context Protocol functionality.
Model Context Protocol proxy. Configure a single MCP in your clients, subset your configured MCPs and tools (if desired) for client names, and adjust tool names for certain clients.
Summary: Provides a stdio MCP server proxying requests to other MCPs.
Parameters:
[CLIENT_NAME]: The client name to subset MCPs and tools, and adjust tool names. See configuration.
Configuration: TODO
Flow: TODO
Notes:
- I believe Claude Code has a length limit for tool names, hence the name adjustment capability.
- Toolbase is currently set to a limit of 40 for Claude Code.
jigwill manage tool name collisions.- Logs will be automatically written.
Model Context Protocol server for AI agent integration.
Summary: Provides a stdio MCP server allowing AI agents to interact with jig functionality.
Parameters: None.
Configuration: None.
Flow: None.
Notes:
- Implementation planned post-initial release
- Future plans for WASM compilation and remote MCP
- Will expose dave.io API endpoints via MCP
Network utilities and diagnostics.
DNS query and management tools.
Clear local DNS cache.
Summary: Flushes DNS resolver cache on the local system.
Parameters: None.
Configuration: None.
Flow:
- Detect operating system
- Execute appropriate flush command:
- macOS:
dscacheutil -flushcache - Linux:
systemd-resolve --flush-caches - Windows:
ipconfig /flushdns
Perform DNS queries.
Summary: Query DNS records with optional custom resolvers.
Parameters:
[QUERY]: Domain name to query[TYPE]: Record type (A, AAAA, MX, TXT, etc.)--root: Use root nameservers--server [SERVER]: Use specific nameserver
Configuration:
dns.nameserver: Default resolver
Flow:
- Select resolver (system/root/custom)
- Perform DNS query
- Display formatted results
Notes: --root and --server are mutually exclusive.
Verify DNSSEC configuration.
Summary: Checks DNSSEC validation chain for a domain.
Parameters:
[DOMAIN]: Domain to verify
Configuration: None.
Flow:
- Query DNSKEY records
- Verify DS records at parent
- Validate signature chain
- Report validation status
Project management and scaffolding utilities.
Update all dependencies to latest versions.
Summary: Automatically updates package versions across multiple package managers.
Parameters: None.
Configuration: None.
Flow:
- Scan for package files:
Cargo.tomlpackage.json.github/workflows/*.ya?ml
- For each dependency:
- Fetch latest version
- Update version specification
- For GitHub Actions:
- Pin to latest commit SHA
Notes:
⚠️ CAUTION: Updates to latest major versions may introduce breaking changes. GitHub Actions are pinned to default branch commits.
Generate Dependabot configuration.
Summary: Creates .github/dependabot.yml based on detected package managers.
Parameters: None.
Configuration:
project.dependabot: Template for dependabot config
Flow:
- Scan project for package files
- Identify ecosystems (npm, cargo, pip, etc.)
- Generate config with:
- Ecosystem type
- Directory location
- Update schedule
- Configured options
graph LR
A[Scan Files] --> B[Detect Ecosystems]
B --> C[Apply Template]
C --> D[Generate YAML]
Create new project from template.
Summary: Scaffolds a new project using Tera templates.
Parameters:
[TEMPLATE]: Template name to use[NAME]: Project name/directory-n,--name: Override project name-g,--git: Initialize git repo-G,--no-git: Skip git initialization
Configuration:
git.internal: Default git backend
Flow:
- Create project directory
- Load template from
~/.local/share/jig/templatesand~/.local/share/jig/templates/_shared - Process Tera templates with context
- Write files with git commits (if enabled)
- Create
.jig.yamltracking file
Notes: Templates support Tera syntax for dynamic content.
Notes:
- Creates
.jig.yamltracking file with:- Template repository
- Branch name
- Template path
- Applied commit
- Creation/update timestamps
Update existing project with template changes.
Summary: Applies template updates. Attempts to preserve local modifications.
Parameters:
-c,--clobber: Force overwrite without merge-n,--name: Override project name
Configuration: None.
Flow:
- Read
.jig.yamlfor template info - Fetch latest template version
- Compare with applied version
- For each changed file:
- Show diff
- Prompt for action (unless
--clobber)
- Update
.jig.yamlmetadata
Manage project templates.
.jig.template.yaml:
The .jig.template.yaml file is in the root of each template and defines its behaviour.
name: null # if omitted or null, name of the root directory of the template, default: null
shared: true # if false, disable shared template when rendering this template, default: trueList available templates.
Summary: Shows all installed project templates.
Parameters: None.
Configuration: None.
Flow:
- Scan template directory
- Display template names and descriptions
Create a new template.
Summary: Initialize a new project template.
Parameters:
-S,--shared: Copy files from_sharedand disable the shared template for this template[NAME]: Template name (required)
Configuration: None.
Flow:
- Check if template exists
- Create template directory
- Set up
.jig.template.yamlwith metadata and shared template behaviour - Add base files from
_sharedif required
Update template repository.
Summary: Fetches latest templates from configured repository.
Parameters:
-c,--cli: Use git CLI-i,--internal: Force gix usage
Configuration:
git.internal: Default git backendtemplate.repository: Template sourcetemplate.branch: Template branch
Flow:
- Pull latest from template repository
- Update local template cache
# Clone the repository
git clone https://github.com/daveio/jig.git
cd jig
# Build in debug mode
cargo build
# Build in release mode
cargo build --release
# Run tests
cargo test
# Run with cargo
cargo run -- --help# Format code
cargo fmt
# Lint code
cargo clippy
# Check code without building
cargo check
# Watch for changes and rebuild
cargo watch -x runThe project uses GitHub Actions for continuous integration and deployment:
- Runs on every push and pull request to
main - Tests against stable, beta, and nightly Rust toolchains
- Runs tests, builds, and linting
- Caches Rust dependencies for faster builds
- Triggers on version tags (
v*.*.*) - Builds binaries for multiple platforms:
- Linux:
x86_64,aarch64 - macOS:
x86_64,aarch64 - Windows:
x86_64,aarch64(currently disabled due to build issues)
- Linux:
- Compresses binaries with zstd
- Generates checksums and build attestations
- Creates GitHub releases with all artifacts
- Triggers on version tags (
v*.*.*) - Builds multi-architecture Docker images
- Publishes to GitHub Container Registry (
ghcr.io/daveio/jig) - Supports
linux/amd64andlinux/arm64
- Triggers on version tags (
v*.*.*) - Verifies builds across all supported platforms
- Publishes to crates.io
For maintainers, the following GitHub secrets must be configured:
CARGO_REGISTRY_TOKEN: API token for publishing to crates.io- Generate at: https://crates.io/me
- Permissions: "Publish new crates and new versions of existing crates"
The CI/CD pipeline uses optimized caching:
- CI builds: Separate caches per Rust toolchain (
ci-stable,ci-beta,ci-nightly) - Release builds: Shared cache between container and release workflows (
release-{target}) - Publish builds: Separate cache for verification builds (
publish)
This allows:
- Fast incremental builds
- Shared caches between workflows building identical artifacts
- Efficient storage usage
Goal: Implement features that rely on external APIs (dave.io, Domainr, RDAP).
Duration: 2 weeks
Dependencies: Phase 2 partially complete
Can run in parallel with: Phase 3
-
jig api(Core):- Create a base API client for
https://dave.io/with retry logic -
ping: Implement the API health check -
token info: Retrieve token details -
token revoke: Revoke an API token -
token usage: View token usage statistics - Add proper authentication header handling
- Create a base API client for
-
jig domain:-
check: Implement domain availability check using the Domainr API -
expiry: Implement domain expiration check using an RDAP client -
ns: Implement nameserver lookup using RDAP with a DNS fallback - Add caching layer for API responses
- Implement Cloudflare TLD filtering
-
Goal: Integrate with AI services (Claude) to deliver intelligent automation features.
Duration: 2 weeks
Dependencies: Phase 4 complete (for API client)
- Shared AI Utilities:
- Implement the
prepare_image_for_claudeutility for image resizing and optimization - Implement the
ask_claudehelper function for sending prompts and data - Add retry logic and error handling for AI API calls
- Implement the
- AI Commands:
-
jig ai rename image: Implement AI-powered image renaming -
jig git commit: Implement AI-generated conventional commit messages from diffs -
jig api image alt: Generate alt text for images -
jig api image optimise: Optimize images via the API -
jig api ticket title: Generate ticket titles from descriptions -
jig api ticket description: Generate ticket descriptions from titles -
jig api ticket enrich: Design and implement enrichment logic - Add rate limiting and quota management
-
Goal: Implement features that require deep integration with the user's shell and local environment.
Duration: 2 weeks
Dependencies: Phases 1-3 complete
-
jig init:- Implement the full initialization flow: directory creation, template cloning, config generation, and shell integration checks
- Add shell detection logic
- Generate shell-specific installation instructions
-
jig workspace:-
list: Implement listing of configured workspaces -
switch: Implement the complete state transition logic, including runningup/downcommands and managing environment variables -
hook: Implement the shell-specific hook for prompt integration and automatic environment management - Add fish shell support with proper variable handling
- Add bash/zsh compatibility layer
- Implement environment variable isolation
-
-
jig terminal:-
sysinfo: Display system info gauges usingviuer -
xkcd: Fetch and display XKCD comics in the terminal - Add terminal capability detection
- Implement fallback rendering modes
-
Goal: Add features that enhance the user experience but are not critical to core functionality.
Duration: 1 week
Dependencies: Phase 6 complete
-
jig dance:- Integrate the various terminal effects libraries (
tachyonfx,tui-rain, etc.) - Design and implement the animation sequence
- Hide the command from
--helpoutput - Add interrupt handling for clean exit
- Implement multiple animation modes
- Integrate the various terminal effects libraries (
Goal: Implement forward-looking features planned for after the initial release.
Duration: 1 week (initial implementation)
Dependencies: Most other phases complete
-
jig mcp:- Implement the Model Context Protocol server using
rmcp - Define and document the protocol for exposing
jigcommands to AI agents - Create security boundaries for MCP access
- Add command filtering and permission system
- (Note: This is a post-v1.0 feature as per the README)
- Implement the Model Context Protocol server using
Goal: Finalize the application for a public release.
Duration: 2 weeks
Dependencies: All feature phases complete
Should run continuously: Throughout development
- Testing:
- Write unit tests for all core logic (crypto, generation, etc.)
- Write integration tests for the CLI to validate command execution and output
- Add property-based testing for generation utilities
- Create end-to-end test scenarios
- Add performance benchmarks
- CI/CD:
- Configure
ci.yamlto run tests,rustfmt, andclippyon all pushes - Create a release workflow to build cross-platform binaries and publish them to GitHub Releases
- Create container workflow to build and publish Docker images
- Create publish workflow to publish to crates.io
- Add code coverage reporting
- Set up dependency vulnerability scanning
- Configure
- Documentation:
- Thoroughly review and update the
README.mdto ensure it is accurate - Verify that all
--helpmessages are clear, correct, and comprehensive - Create man pages for each command
- Add example usage documentation
- Create troubleshooting guide
- Thoroughly review and update the
- Packaging:
- Ensure the project is correctly configured for
cargo install - Create and test the Homebrew tap formula
- Add shell completion files
- Create Docker image (optional)
- Set up binary signing for releases
- Ensure the project is correctly configured for
- External API Dependencies: Implement proper fallbacks and offline modes where possible
- Shell Integration Complexity: Start with fish shell (your primary), then expand to others
- AI Feature Costs: Add usage tracking and warnings for AI-powered features
- Cross-Platform Compatibility: Use CI to test on multiple OS/architecture combinations
- Binary Size: Monitor and optimize dependencies to keep binary size reasonable
- All commands work as documented in README
- < 100ms startup time for simple commands
- < 5MB binary size (compressed)
- 80%+ test coverage
- Zero security vulnerabilities
- Compatible with macOS, Linux, and Windows
- WASM compilation for browser usage
- Remote MCP server implementation
- Plugin system for custom commands
- GUI wrapper (optional)
- Mobile companion app (optional)
jig macos quarantine [add,remove]: Manage quarantine withxattrjig macos sign: Sign binary withapple-codesignjig clipboard [copy,paste]: Cross platformpbcopy/pbpasteusingclipboard-rsjig about: Replicate https://github.com/daveio/npmjig catppuccin browse: Usenucleo-pickerto browsecatppuccinrepos.- Run fetch functionality (see below) when one is selected.
jig catppuccin fetch [reponame]: Fetch https://github.com/catppuccin/reponame into./reponameusing configuredgitbackendjig nextdns allow [pattern]: Add[pattern]to NextDNS allow list. Confignextdns.profileslists profiles to apply to.-p/--profile: Profile alias (homeandworkin example config) or NextDNS slug (6 hex chars). Single profile to act on.-k/--key: Override NextDNS API key
jig ai usage [tool]: Check usage for tools with AI usage limits.- Tools: Cursor, Warp, Windsurf, Zed
- Check all if
[tool]is unspecified, as justjig ai usage. - Check multiple tools by space separating:
jig ai usage cursor zed
- Decentralised chat and file transfer
irohcan help with this