skills/cli-just/SKILL.md
Use for just/justfile task automation: create justfiles, write recipes, configure settings, add modules/attributes, or set up command-runner workflows.
npx skillsauth add paulrberg/agent-skills cli-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.
Expert guidance for Just, a command runner with syntax inspired by make. Use this skill for creating justfiles, writing recipes, configuring settings, and implementing task automation workflows.
Key capabilities:
set allow-duplicate-recipes # Allow recipes to override imported ones
set allow-duplicate-variables # Allow variables to override imported ones
set shell := ["bash", "-euo", "pipefail", "-c"] # Strict bash with error handling
set unstable # Enable unstable features (user-defined functions, eager keyword)
set dotenv-load # Auto-load .env file
set positional-arguments # Pass recipe args as $1, $2, etc.
set lazy # Defer evaluation of unused variables (v1.48.0+)
set no-cd # Don't change to justfile directory for any recipe (v1.51.0+)
set default-list := true # Bare `just` lists recipes instead of running default (v1.52.0+)
set default-script := true # Make unannotated recipes script recipes; use sparingly (v1.52.0+)
| Attribute | Purpose |
| -------------------------- | -------------------------------------------------------------- |
| [arg("p", long, ...)] | Configure parameter as --flag option (v1.46) |
| [arg("p", pattern="…")] | Constrain parameter to match regex pattern |
| [confirm("prompt")] | Require user confirmation (expressions OK as of v1.49) |
| [doc("text")] | Override recipe documentation |
| [env("NAME", "VALUE")] | Set env var for this recipe only (v1.47+, expr v1.51) |
| [group("name")] | Group recipes in just --list output |
| [linux] / [macos] … | Restrict to OS; also [android] (v1.50+) and BSD variants |
| [no-cd] | Don't change to justfile directory |
| [parallel] | Run direct dependencies concurrently |
| [positional-arguments] | Enable positional args for this recipe only |
| [private] | Hide from just --list (same as _ prefix) |
| [script] | Execute recipe as single script block |
| [script("interpreter")] | Use specific interpreter (bash, python, etc.) |
| [shell] | Force linewise shell mode when set default-script is enabled |
| [working-directory: "…"] | Run from given path (expressions OK as of v1.51) |
The [arg()] attribute configures parameters as CLI-style options:
# Long option (--target)
[arg("target", long)]
build target:
cargo build --target {{ target }}
# Short option (-v)
[arg("verbose", short="v")]
run verbose="false":
echo "Verbose: {{ verbose }}"
# Combined long + short
[arg("output", long, short="o")]
compile output:
gcc main.c -o {{ output }}
# Flag without value (presence sets to "true")
[arg("release", long, value="true")]
build release="false":
cargo build {{ if release == "true" { "--release" } else { "" } }}
# Help string (shown in `just --usage`)
[arg("target", long, help="Build target architecture")]
build target:
cargo build --target {{ target }}
Usage examples:
just build --target x86_64
just build --target=x86_64
just compile -o main
just build --release
just --usage build # Show recipe argument help
Multiple attributes can be combined:
[no-cd, private]
[group("checks")]
recipe:
echo "hello"
Terminal formatting constants are globally available (no definition needed):
| Constant | Description |
| --------------------------------------------------- | ------------------------------------------ |
| CYAN, GREEN, RED, YELLOW, BLUE, MAGENTA | Text colors |
| BOLD, ITALIC, UNDERLINE, STRIKETHROUGH | Text styles |
| NORMAL | Reset formatting |
| BG_* | Background colors (BG_RED, BG_GREEN, etc.) |
| HEX, HEXLOWER, HEXUPPER | Hexadecimal digits |
Usage:
@status:
echo -e '{{ GREEN }}Success!{{ NORMAL }}'
echo -e '{{ BOLD + CYAN }}Building...{{ NORMAL }}'
# Require executable exists (fails recipe if not found)
jq := require("jq")
# Get environment variable with default
log_level := env("LOG_LEVEL", "info")
# Get justfile directory path
root := justfile_dir()
# Module location (useful inside `mod` files)
mod_path := module_path() # Full submodule path, e.g. "foo::bar"
mod_file := module_file() # Absolute path to module's justfile
mod_dir := module_directory() # Directory containing the module justfile
# Runtime directory (v1.49.0; typically $XDG_RUNTIME_DIR, falls back to tempdir)
rt := runtime_directory()
Define reusable named expressions with name(args) := expression. Requires set unstable. Functions can reference module-level assignments.
set unstable
base := "foo"
join(extension) := base + "." + extension
# Use f-strings for interpolation
hello(name) := f"Hello, {{ name }}!"
create:
touch {{ join("c") }}
touch {{ join("html") }}
echo '{{ hello("World") }}'
Use these to dedupe expression logic that would otherwise repeat across recipes; prefer them over backtick-evaluated variables when the value depends on input.
When designing recipes that use status reporting, check/write semantics, or alias conventions, see references/patterns.md.
When writing recipes that need shell scripts (script attribute or shebang style), see references/inline-scripts.md. On stock macOS, bash resolves to /bin/bash 3.2 — see that file's Bash Version Pitfalls section before using Bash-4+ features.
Include recipes from another file:
import "./just/settings.just"
import "./just/base.just"
import? "./local.just" # Optional (no error if missing)
Load submodule (requires set unstable):
mod foo # Loads foo.just or foo/justfile
mod bar "path/to/bar" # Custom path
mod? optional # Optional module
# Call module recipes
just foo::build
For projects using @sablier/devkit:
import "./node_modules/@sablier/devkit/just/base.just"
import "./node_modules/@sablier/devkit/just/npm.just"
Standard section header format:
# ---------------------------------------------------------------------------- #
# DEPENDENCIES #
# ---------------------------------------------------------------------------- #
Common sections (in order):
Define a curated default recipe when one action should be the entrypoint:
# Run all checks by default
default: full-check
If no single default makes sense, prefer set default-list := true (v1.52.0+) over a default recipe that shells out to
just --list:
set default-list := true
# Optional: still define recipes normally; bare `just` now lists them.
build:
cargo build
The setting is per-module. It can also be forced at runtime with JUST_DEFAULT_LIST=true or just --default-list.
For compatibility with older just versions, keep the explicit listing recipe:
default:
@just --list
Document required tools at the top:
# ---------------------------------------------------------------------------- #
# DEPENDENCIES #
# ---------------------------------------------------------------------------- #
# Bun: https://bun.sh
bun := require("bun")
# Ni: https://github.com/antfu-collective/ni
na := require("na")
ni := require("ni")
nlx := require("nlx")
# Usage: invoke directly in recipes (not with interpolation)
build:
bun next build
Note: require() validates the tool exists at recipe evaluation time. Use the variable name directly (e.g., bun), not with interpolation ({{ bun }}).
For Just features not covered in this skill (new attributes, advanced functions, edge cases), fetch the latest documentation:
Use context7 MCP with library ID `/websites/just_systems_man_en` to get up-to-date Just documentation.
Example topics to search:
modules import mod - Module system detailssettings - All available settingsattributes - Recipe attributesfunctions - Built-in functionsscript recipes - Script block syntaxFor detailed patterns and comprehensive coverage, consult:
references/settings.md - Settings configuration and module systemreferences/recipes.md - Recipe attributes, parameters, dependencies, and prefixesreferences/syntax.md - Constants, functions, variables, and CLI optionsreferences/patterns.md - Established conventions, section organization, helper patternsWorking justfile templates in examples/:
devkit.just - Minimal template importing @sablier/devkitstandalone.just - Full standalone template with all patterns/websites/just_systems_man_enDo not use just --fmt or just --dump. The user has bespoke formatting preferences that the built-in formatter does not respect. Preserve existing formatting as-is.
@ prefix to suppress command echo: @echo "quiet"+ for variadic parameters: test +args* for optional variadic: build *flagsGLOBS := "\"**/*.json\""[no-cd] in monorepos to stay in current directory_ or use [private]testing
Use ONLY to check or update the project-scoped agent skills installed under .agents/skills so they match the current state of the repo. Do not trigger for creating, finding, or installing skills, or for README/AGENTS.md updates.
testing
Use when CSV, TSV, or Excel (.xlsx) is the primary input/output: inspect, clean, transform, dedupe, merge, validate, convert, recalc formulas, or create/fix spreadsheets. Do not trigger when tabular data is incidental.
development
This skill should be used when the user asks to consult Codex/GPT for planning or code review, or wants a second opinion on code. Trigger phrases include "ask Codex", "consult Codex", "second opinion on code", "consult the oracle". NOT for implementation tasks.
databases
This skill should be used when the user asks to create a monochrome technical diagram, schematic, or systems/architecture diagram in black-and-white line-art style. Trigger phrases include "create a diagram", "monochrome diagram", "systems diagram", "draw a schematic".