skills/justfile/SKILL.md
Create, edit, and maintain justfiles using the `just` command runner. Use this skill whenever the user mentions justfiles, just recipes, just command runner, or wants to migrate from Makefile/make to just. Also trigger when the user has a justfile in their project and asks about running, organizing, or documenting project commands. Covers migration from make, recipe design, variable patterns, dotenv integration, and cross-platform support.
npx skillsauth add julianobarbosa/claude-code-skills justfileInstall 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.
just is a command runner (not a build system) that saves and runs project-specific commands
in a file called justfile. It uses make-inspired syntax but is simpler, more portable, and
avoids make's idiosyncrasies like .PHONY, tab sensitivity issues, and implicit rules.
| Scenario | Tool | | ------------------------------------------------------- | --------------------- | | Project task automation (build, test, deploy, lint) | just | | Actual file-based build dependencies (compile .c to .o) | make | | Cross-platform command runner | just | | Legacy projects already deep in make | make (or migrate) |
Recipes are the core unit. Each recipe is a named set of commands:
recipe-name:
command1
command2
set ignore-comments helps)set shell or shebang recipes for multi-line scripts).PHONY needed — just doesn't track file timestamps# Assignment
version := "1.0.0"
# Backtick evaluation (runs command, captures stdout)
git_hash := `git rev-parse --short HEAD`
# Environment variable access
home := env('HOME')
# Export to recipe commands
export DATABASE_URL := "postgres://localhost/mydb"
Place settings at the top of the justfile:
set dotenv-load # Load .env file
set positional-arguments # Pass recipe args as $1, $2, etc.
set shell := ["bash", "-euco", "pipefail"] # Fail-fast shell
set export # Export all variables as env vars
set quiet # Suppress command echoing (like @ in make)
# Required argument
deploy target:
echo "Deploying to {{target}}"
# Default value
greet name="World":
echo "Hello {{name}}"
# Variadic (one or more)
test +targets:
go test {{targets}}
# Variadic (zero or more)
lint *flags:
eslint {{flags}} src/
# Run 'build' before 'test'
test: build
cargo test
# Pass arguments to dependencies
push: (deploy "production")
# Multiple dependencies
all: clean build test lint
# Ternary-style conditional
rust_target := if os() == "macos" { "aarch64-apple-darwin" } else { "x86_64-unknown-linux-gnu" }
# In recipes
check:
if [ -f .env ]; then echo "Found .env"; fi
[linux]
install:
sudo apt install ripgrep
[macos]
install:
brew install ripgrep
[windows]
install:
choco install ripgrep
[private] # Hidden from --list
[no-cd] # Don't cd to justfile directory
[confirm] # Ask confirmation before running
[confirm("Deploy to production?")]
[no-exit-message] # Suppress error message on failure
[group("deploy")] # Group in --list output
[doc("Run the full test suite")] # Custom doc string
When a recipe needs to run as a single script rather than line-by-line:
process-data:
#!/usr/bin/env python3
import json
with open("data.json") as f:
data = json.load(f)
print(f"Found {len(data)} records")
# The default recipe — runs when you type `just` with no args
[private]
default:
@just --list --unsorted
Comments above recipes become descriptions in just --list:
# Initialize Terraform with backend config
init:
terraform init
# Import another justfile
import 'ci.just'
# Module (namespaced)
mod deploy 'deploy.just'
# Usage: just deploy::production
| Function | Purpose |
| ------------------------- | -------------------------------------------- |
| os() | Current OS (linux, macos, windows) |
| arch() | CPU architecture (x86_64, aarch64) |
| env('KEY') | Get environment variable (aborts if missing) |
| env('KEY', 'default') | Get env var with fallback |
| invocation_directory() | Directory where just was called from |
| justfile_directory() | Directory containing the justfile |
| join(a, b) | Join path components |
| parent_directory(path) | Parent of path |
| file_name(path) | Filename component |
| without_extension(path) | Remove file extension |
| uppercase(s) | Uppercase string |
| lowercase(s) | Lowercase string |
| replace(s, from, to) | String replacement |
| trim(s) | Trim whitespace |
| quote(s) | Shell-quote a string |
| sha256_file(path) | SHA-256 hash of file |
| shell(cmd, args...) | Execute command, capture output |
# macOS
brew install just
# Cargo
cargo install just
# Pre-built binaries
curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to /usr/local/bin
# Shell completions
just --completions zsh > ~/.zsh/completions/_just
just --completions bash > /etc/bash_completion.d/just
cd foo on one line and ls on the next runs ls in the original directory. Use a shebang recipe or set shell for multi-line scripts.set dotenv-load loads .env from the justfile directory, not the invocation directory — running just from a subdirectory loads the parent's .env, not the local one. Use set dotenv-path to override.git_hash := \git rev-parse HEAD`runs git on everyjust` call, even for unrelated recipes. Slow on large repos; move to inside the recipe if not needed globally.just deploy "my server" passes two args, not one. Use set positional-arguments and "$@", or wrap in {{quote(target)}}.set shell := ["bash", "-c"] breaks set -euo pipefail semantics because each line is its own -c invocation — pipefail only applies within that line. Use shebang recipes for proper fail-fast scripts.just --list hides recipes starting with _ or marked [private] but they're still callable — security through obscurity, not actual access control.[macos]/[linux] attributes silently skip the recipe on other OSes — running just install on Windows when only [linux] and [macos] variants exist exits 0 with no error, which looks like success.testing
Brief description of what this skill does. Include specific triggers - when should Claude use this skill? Example triggers, file types, or keywords that indicate this skill applies.
tools
Manage and troubleshoot PATH configuration in zsh. Use when adding tools to PATH (bun, nvm, Python venv, cargo, go), diagnosing "command not found" errors, validating PATH entries, or organizing shell configuration in .zshrc and .zshrc.local files.
tools
Zabbix monitoring system automation via API and Python. Use when: (1) Managing hosts, templates, items, triggers, or host groups, (2) Automating monitoring configuration, (3) Sending data via Zabbix trapper/sender, (4) Querying historical data or events, (5) Bulk operations on Zabbix objects, (6) Maintenance window management, (7) User/permission management
development
Operate YouTube Music via natural language. Search songs, artists, albums, playlists, lyrics, charts, recommendations, and control playback. Browse personal library, manage playlists, rate tracks, and inspect account info. Use this skill whenever the user asks about YouTube Music, wants to play music, manage playlists, search by song or artist name, inspect lyrics, or control playback.