Personal development toolkit for streamlined workflows with automated dependency management

Installation

Choose your preferred installation method

Via curl (no dependencies)

curl -fsSL https://cli.jd.boiv.in/install.sh | bash

Requires only curl/wget and unzip

or

Via npm

npm install -g @jdboivin/cli

Requires Node.js and npm

Commands

All available commands and their options

jd init
Setup and install CLI dependencies (optional first-time setup)
jd init [--skip-deps] [--skip-completions]
  • Helps set up the jd CLI by installing required tools like GitHub CLI, devcontainer CLI, and configuring shell completions.
  • --skip-deps Skip dependency installation checks
  • --skip-completions Skip shell completion setup
jd dev
Apply devcontainer templates to projects
jd dev [template-id] [--force] [--list]
  • template-id Custom template ID (default: ghcr.io/devcontainers/templates/nodejs-postgres)
  • --force Force overwrite existing .devcontainer
  • --list List available templates
jd pr
Create GitHub pull requests with AI-generated title and description
jd pr [--draft] [--auto-draft] [--base BRANCH] [--web] [--title TITLE] [--body BODY] [--no-claude] [--model MODEL] [--reviewers USERS] [--labels LABELS]
  • --draft Create as draft PR
  • --auto-draft Auto-detect draft from branch name (wip/draft prefixes)
  • --base BRANCH Target base branch (default: main/master)
  • --web Open PR in browser after creation
  • --title TITLE Custom PR title (AI generates description if not provided)
  • --body BODY Custom PR body/description
  • --no-claude Disable Claude AI generation (use fallback)
  • --model MODEL Claude model: sonnet (default), haiku, or opus
  • --reviewers USERS Comma-separated list of reviewers
  • --labels LABELS Comma-separated list of labels
jd merge
Merge GitHub pull request and cleanup branches with worktree support (squash by default)
jd merge [--branch BRANCH] [--type TYPE] [--clean]
  • --branch BRANCH Branch name to find PR for (defaults to current branch)
  • --type TYPE Merge type: squash (default), merge, or rebase
  • --clean Only cleanup old temporary branches (no merge)
jd repo
Initialize GitHub repository and configure secrets from 1Password
jd repo [--npm] [--extensions] [--claude] [--apple] [--suffix SUFFIX] [--kubeconfig NS] [--kubeconfig-minimal NS] [--rules] [--rules-strict] [--pages] [--release] [--action] [--public] [--description DESC] [--no-init]
  • --npm Add NPM_TOKEN secret
  • --extensions Add VSCE_PAT and OVSX_PAT secrets for extension publishing
  • --claude Add CLAUDE_CODE_OAUTH_TOKEN secret, copy JD workflows, and create JD label
  • --apple Add Apple App Store, Fastlane, and GitHub PAT secrets
  • --suffix SUFFIX Add suffix to APPSTORE_* and MATCH_* secrets (use with --apple)
  • --kubeconfig [NS] Generate and add KUBE_CONFIG secret for namespace NS (creates NS, NS-dev, NS-pr). Auto-detects from charts/*.yaml if NS not specified
  • --kubeconfig-minimal [NS] Generate and add KUBE_CONFIG secret for single namespace NS only. Auto-detects from charts/*.yaml if NS not specified
  • --rules Apply default branch protection rulesets (main: prevents deletion and force pushes; dev: prevents deletion and force pushes)
  • --rules-strict Apply strict branch protection rulesets (main: prevents deletion, force pushes, and requires pull requests; dev: prevents deletion and force pushes)
  • --pages, --gh-pages Setup GitHub Pages (copy gh-pages.yml workflow and docs/index.html)
  • --release Setup release workflow (copy release.yml workflow)
  • --action Shortcut for --release --pages --claude
  • --public Create public repository (default: private)
  • --description DESC Repository description
  • --no-init Use existing git repo (skip git init)
jd npm
Setup npm package with OIDC trusted publishing
jd npm
  • Publishes placeholder package (0.0.0-placeholder) and guides through OIDC configuration on npmjs.com
jd update
Self-update to latest version
jd update [--check] [--force]
  • --check Check for updates without installing
  • --force Force reinstall current version
jd venv
Create and manage Python virtual environments
jd venv
  • Creates ./venv if missing, activates it, and auto-installs from requirements.txt
jd requirements
Generate requirements.txt from active virtual environment
jd requirements
  • Uses pip freeze to capture all installed packages
jd cleanup
Clean up node_modules directories and free disk space
jd cleanup [--path PATH] [--include-hidden] [--dry-run] [--skip-mac-cleanup]
  • --path PATH Path to start cleanup from (default: ~/Projects)
  • --include-hidden Include hidden directories (starting with .)
  • --dry-run Show what would be deleted without actually deleting
  • --skip-mac-cleanup Skip running mac-cleanup system cleanup
jd claude-github
Update Claude Code OAuth token across all GitHub repositories and 1Password
jd claude-github
  • Runs 'claude setup-token', prompts for the OAuth token, updates 1Password vault, and loops through all GitHub repositories to update the CLAUDE_CODE_OAUTH_TOKEN secret where it exists
  • Prerequisites: GitHub CLI (gh), 1Password CLI (op), Claude Code CLI (claude)
jd pg
Port-forward to PostgreSQL database cluster on localhost:5432
jd pg
  • Creates a port-forward connection from localhost:5432 to the postgres-rw service in the postgres namespace. Press Ctrl+C to stop the port-forward.
  • Prerequisites: kubectl CLI, active Kubernetes context, postgres namespace with postgres-rw service
  • Connect using: psql -h localhost -p 5432 -U <username> <database>
jd release
Automate release process: merge dev→main, bump versions, create GitHub release
jd release [--dry-run]
  • --dry-run Preview changes without executing them
  • Merges dev into main, increments MINOR version in root package.json (e.g., 2025.7.0 → 2025.8.0), updates versions in apps/*/app.config.ts and apps/*/package.json, commits and pushes "Version bump" to dev, and creates GitHub release with auto-generated notes on main
  • Prerequisites: GitHub CLI (gh), clean working directory, root package.json with version field