claude/skills/just/SKILL.md
Use just for command running and task automation. Prefer Justfiles over Makefiles. Keep recipes simple - delegate complex logic to scripts rather than embedding in recipes.
npx skillsauth add lanej/dotfiles justInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
IMPORTANT: just is the PREFERRED command runner for project task automation. Use Justfiles instead of Makefiles for new projects and task automation.
# List available recipes
just --list
just -l
# Run a recipe
just build
just test
# Run recipe with arguments
just deploy production
just run-test integration
# Run recipe from different directory
just --working-directory /path/to/project build
# Choose a different Justfile
just --justfile custom.just build
# Simple recipe
build:
cargo build --release
# Recipe with description (shown in --list)
# Run all tests
test:
cargo test --quiet
# Recipe with dependencies (runs setup first)
deploy: build test
./scripts/deploy.sh
# Recipe with parameters
run-test test_name:
cargo test {{test_name}}
# Recipe with default parameter value
serve port="8080":
python -m http.server {{port}}
# Recipe with multiple parameters
deploy env branch="main":
./scripts/deploy.sh {{env}} {{branch}}
Good - Delegates to script:
# Build the project
build:
./scripts/build.sh
# Run integration tests
test-integration:
./scripts/test-integration.sh
# Deploy to environment
deploy env:
./scripts/deploy.sh {{env}}
Avoid - Complex logic in recipe:
# ❌ Too complex - should be in a script
deploy env:
#!/usr/bin/env bash
set -euo pipefail
if [ "{{env}}" = "production" ]; then
echo "Deploying to production..."
git fetch origin
git checkout main
git pull
docker build -t app:latest .
docker push registry.example.com/app:latest
kubectl apply -f k8s/production/
kubectl rollout status deployment/app
else
echo "Deploying to staging..."
# ... many more lines ...
fi
Better - Simple orchestration:
# Deploy to production
deploy-prod:
./scripts/deploy.sh production
# Deploy to staging
deploy-staging:
./scripts/deploy.sh staging
# Generic deploy with validation
deploy env:
./scripts/validate-env.sh {{env}}
./scripts/deploy.sh {{env}}
# Recipe runs after its dependencies
all: clean build test deploy
# Dependencies run in order specified
deploy: build test package
./scripts/deploy.sh
# Multiple dependency chains
full-deploy: lint build test docker-build docker-push k8s-deploy
# Set variables at top of file
version := "1.2.3"
registry := "registry.example.com"
image := registry + "/app:" + version
# Use in recipes
docker-build:
docker build -t {{image}} .
docker-push:
docker push {{image}}
# Environment variables
deploy:
API_KEY=$API_KEY ./scripts/deploy.sh
# Use shell conditionals in scripts
test:
./scripts/test.sh
# Or delegate to script
check-and-test:
./scripts/check-and-test.sh
# Private recipe (not shown in --list, can't be run directly)
_setup:
./scripts/setup-env.sh
# Public recipe uses private recipe
deploy: _setup
./scripts/deploy.sh
# Ignore errors (continue even if fails)
[ignore-errors]
lint:
./scripts/lint.sh
# Run in specific directory
[working-directory: 'frontend']
build-ui:
npm run build
# Confirm before running
[confirm]
deploy-prod:
./scripts/deploy.sh production
# Don't print recipe before running
[no-quiet]
status:
./scripts/status.sh
# Default recipe (runs when you type 'just')
default: check test
# Quick validation
check:
./scripts/check.sh
# Run all tests
test:
./scripts/test.sh
# Full CI workflow
ci: check test lint build
# Clean build artifacts
clean:
./scripts/clean.sh
# Build project
build:
./scripts/build.sh
# Full rebuild
rebuild: clean build
# Build with caching
build-cached:
./scripts/build.sh --cache
# Development environment
dev:
./scripts/run-dev.sh
# Staging deployment
deploy-staging:
./scripts/deploy.sh staging
# Production deployment (with confirmation)
[confirm]
deploy-prod:
./scripts/deploy.sh production
# Deploy to any environment
deploy env:
./scripts/validate-env.sh {{env}}
./scripts/deploy.sh {{env}}
# Build Docker image
docker-build:
./scripts/docker-build.sh
# Run container locally
docker-run:
./scripts/docker-run.sh
# Push to registry
docker-push: docker-build
./scripts/docker-push.sh
# Complete Docker workflow
docker: docker-build docker-push
# Run migrations
migrate:
./scripts/db-migrate.sh
# Rollback migration
migrate-rollback:
./scripts/db-rollback.sh
# Seed database
seed:
./scripts/db-seed.sh
# Reset database (dev only)
[confirm]
db-reset:
./scripts/db-reset.sh
project/
├── justfile
├── scripts/
│ ├── build.sh
│ ├── test.sh
│ ├── deploy.sh
│ ├── validate-env.sh
│ └── utils/
│ ├── common.sh
│ └── logging.sh
└── src/
└── ...
Make scripts executable:
chmod +x scripts/*.sh
Use shebang in scripts:
#!/usr/bin/env bash
set -euo pipefail
# Script logic here
Keep scripts focused:
# Good - single purpose
# scripts/build.sh
#!/usr/bin/env bash
set -euo pipefail
echo "Building project..."
cargo build --release
Source common utilities:
# scripts/deploy.sh
#!/usr/bin/env bash
set -euo pipefail
source "$(dirname "$0")/utils/common.sh"
source "$(dirname "$0")/utils/logging.sh"
log_info "Starting deployment..."
# Deployment logic
# Backticks execute shell commands
commit := `git rev-parse --short HEAD`
timestamp := `date +%Y%m%d-%H%M%S`
# Use in recipes
tag:
echo "Tagging {{commit}} at {{timestamp}}"
# Multi-line variables
help := '''
Available commands:
build - Build the project
test - Run tests
deploy - Deploy to production
'''
# Print help
help:
@echo {{help}}
# Change shell (default is sh)
set shell := ["bash", "-c"]
# Make all recipes silent (@echo becomes echo)
set quiet := true
# Use PowerShell on Windows
set windows-shell := ["powershell.exe", "-c"]
# Use Python for recipes
set shell := ["python3", "-c"]
# Import recipes from other files
import 'ci.just'
import 'deploy.just'
# Use imported recipes
all: ci-check deploy-staging
# Rust development workflow
check:
cargo check --quiet
test:
cargo test --quiet
clippy:
cargo clippy
build: check test clippy
cargo build --release
# Or delegate to script
rust-workflow:
./scripts/rust-workflow.sh
# Install dependencies
install:
pnpm install
# Run dev server
dev:
pnpm run dev
# Build frontend
build:
pnpm run build
# Or use scripts
ui-build:
./scripts/build-ui.sh
# Docker operations via scripts
docker-build:
./scripts/docker/build.sh
docker-run:
./scripts/docker/run.sh
docker-compose-up:
docker-compose up -d
# Git workflow helpers
sync:
git fetch origin
git pull
push: test
git push origin main
release version:
./scripts/release.sh {{version}}
# Default - run dev server
default: dev
# Install dependencies
install:
./scripts/install.sh
# Development server
dev:
./scripts/dev.sh
# Run tests
test:
./scripts/test.sh
# Build for production
build:
./scripts/build.sh
# Deploy to staging
deploy-staging: test build
./scripts/deploy.sh staging
# Deploy to production
[confirm]
deploy-prod: test build
./scripts/deploy.sh production
# Default - check code
default: check
# Fast check
check:
cargo check --quiet
# Run tests
test:
cargo test --quiet
# Lint code
lint:
cargo clippy
# Full validation
ci: test lint
./scripts/verify-formatting.sh
# Build release
build:
cargo build --release
# Install binary
install: build
cargo install --path .
# Build all services
build-all:
./scripts/build-all.sh
# Test all services
test-all:
./scripts/test-all.sh
# Build specific service
build-service service:
./scripts/build-service.sh {{service}}
# Deploy specific service
deploy service env:
./scripts/deploy-service.sh {{service}} {{env}}
# Full deployment
deploy-all env: test-all build-all
./scripts/deploy-all.sh {{env}}
# List recipes
just --list
# Run recipe
just <recipe>
# Run with arguments
just <recipe> arg1 arg2
# Set variable
just var=value recipe
# Choose Justfile
just --justfile path/to/justfile recipe
# Work in different directory
just --working-directory /path recipe
# Dry run (show what would run)
just --dry-run recipe
# Verbose output
just --verbose recipe
# Choose recipe interactively
just --choose
deploy-prod not dp, test-integration not tiscripts/ directory with logical subdirectorieschmod +x scripts/*.sh[confirm] for deployments, database resets, etc._recipe naming for internal setup stepsdev or check)# Set shell for all recipes
set shell := ["bash", "-c"]
# Variables
version := "1.0.0"
# Default recipe
default: check
# List all recipes
help:
@just --list
# Development
dev:
./scripts/dev.sh
# Testing
test:
./scripts/test.sh
# Build
build:
./scripts/build.sh
# Full CI check
ci: test build
./scripts/verify.sh
# Deploy to staging
deploy-staging: ci
./scripts/deploy.sh staging
# Deploy to production
[confirm]
deploy-prod: ci
./scripts/deploy.sh production
# Clean build artifacts
clean:
./scripts/clean.sh
.PHONY, tabs vs. spaces issues, etc.Makefile:
.PHONY: build test deploy
build:
cargo build --release
test:
cargo test
deploy: build test
./deploy.sh
Justfile:
build:
cargo build --release
test:
cargo test
deploy: build test
./scripts/deploy.sh
brew install just (macOS) or cargo install justdata-ai
Delegate research and context-gathering tasks to a sub-agent to protect the primary context window. Use when the user asks to "research X", "look into X", "find out about X", "gather context on X", or any investigative framing where answering requires 2+ searches or multiple sources. Also use proactively before starting substantive work when prior context is unknown. Never run research inline — always delegate.
documentation
--- name: qmd-math description: Math notation conventions for Quarto/EPQ documents rendered via lualatex. Use when: writing or adding a formula, equation, or mathematical expression to a .qmd file; asked about display math, inline math, or LaTeX notation in a QMD/Quarto context; defining a where-clause or variable definitions for an equation; converting prose variable descriptions into structured math notation; fixing math that renders badly in a PDF; using \lvert, \begin{aligned}, \tfrac, \text
development
Trim a prose document (README, design doc, blog post, notes) for readability by cutting redundancy, filler, and dead weight in the author's own words. Invoke with /trim [file path], or /trim alone to be prompted for a file. Not for source code, data files, or summarization.
business
Query and analyze Josh Lane's org headcount from the staffing DuckDB at ~/workspace/areas/staffing/staffing.duckdb. Use when asked about headcount counts, org structure, direct reports, team breakdown, hiring/attrition trends, international employees, salary/pay grade distribution, offboarding lag, or any question about people in Josh's org. Triggers on questions about how many people, who reports to whom, headcount by team/country/level, who joined or left, org size, staffing, headcount trend.