Claude-skill-registry just-automation-practices

Best practices for using just command runner and task automation in development workflows.

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/just-automation-practices" ~/.claude/skills/majiayu000-claude-skill-registry-just-automation-practices && rm -rf "$T"
manifest: skills/data/just-automation-practices/SKILL.md
source content

Just automation practices

Purpose

Guide for using the just command runner for task automation, covering recipe design, variable handling, and cross-platform development.

When to use

This skill activates when:

  • Creating Justfiles
  • Writing build/test automation
  • Defining development workflows
  • Setting up task dependencies
  • Cross-platform automation

Core concepts

Basic recipe

# Run tests
test:
    uv run pytest

# Run with arguments
test-file file:
    uv run pytest {{file}}

# Default recipe (runs when just called without arguments)
default: lint test

Recipe with dependencies

# Dependencies run first
build: lint test
    uv run python -m build

# Clean before build
clean-build: clean build

Variables

Setting variables

# Simple variables
python := "uv run python"
pytest := "uv run pytest"

# Using variables
test:
    {{pytest}} tests/

# Environment variables
export PYTHONPATH := "src"

test:
    {{pytest}} tests/

Built-in functions

# Current directory
project_dir := justfile_directory()

# Parent directory
parent := parent_directory(justfile_directory())

# Environment with default
python := env_var_or_default("PYTHON", "python3")

Arguments and parameters

Positional arguments

# Required argument
test file:
    uv run pytest {{file}}

# Optional with default
test file="tests/":
    uv run pytest {{file}}

# Variadic (all remaining args)
test *args:
    uv run pytest {{args}}

Named parameters

# Named with defaults
build target="release" output="dist":
    echo "Building {{target}} to {{output}}"

Conditionals

# Conditional execution
test:
    #!/usr/bin/env bash
    if [[ -f "tests/integration" ]]; then
        uv run pytest tests/integration
    fi

# Using just's if
python := if os() == "windows" { "python" } else { "python3" }

Multi-line recipes

# With shebang
setup:
    #!/usr/bin/env bash
    set -euo pipefail

    echo "Setting up environment..."
    uv sync
    echo "Done!"

# Default shell recipes
install:
    uv sync
    echo "Dependencies installed"

Common patterns

Development workflow

# Install dependencies
install:
    uv sync

# Format code
format:
    uv run ruff format .

# Lint code
lint:
    uv run ruff check .
    uv run basedpyright

# Run tests
test *args:
    uv run pytest {{args}}

# Full check before commit
check: format lint test

# Clean artifacts
clean:
    rm -rf dist/ .pytest_cache/ .coverage htmlcov/

Parameterized builds

# Build with options
build target="release":
    #!/usr/bin/env bash
    case "{{target}}" in
        release)
            uv run python -m build
            ;;
        dev)
            uv pip install -e .
            ;;
        *)
            echo "Unknown target: {{target}}"
            exit 1
            ;;
    esac

Environment management

# Set environment for recipes
set dotenv-load := true

# Use .env file
test:
    uv run pytest

# Override environment
test-ci:
    CI=true uv run pytest

Cross-platform

OS detection

# Different commands per OS
open_browser := if os() == "macos" {
    "open"
} else if os() == "windows" {
    "start"
} else {
    "xdg-open"
}

docs:
    {{open_browser}} docs/_build/html/index.html

Path handling

# Cross-platform paths
project_dir := justfile_directory()
src_dir := project_dir / "src"
tests_dir := project_dir / "tests"

Organization

List recipes

# Show available recipes
just --list

# Show recipe with description
just --show test

Documentation

# Recipe descriptions appear in --list
# Run all tests with coverage
test:
    uv run pytest --cov

# Format code using ruff
format:
    uv run ruff format .

Grouping with aliases

# Main recipe
test-all:
    uv run pytest

# Aliases for convenience
alias t := test-all
alias tests := test-all

Checklist

  • Default recipe defined
  • Recipes have descriptions (comments)
  • Variables used for repeated values
  • Dependencies properly declared
  • Cross-platform compatible (if needed)
  • Error handling in complex recipes

Additional resources: