cli-just — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited cli-just (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.
Targets just v1.53.0 (latest stable, released 2026-06-16). Features are tagged with the version that introduced them (e.g. v1.51.0+); a tag newer than your installed just --version means you must upgrade to use it. List features (set lists) and other gated capabilities additionally require set unstable.
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.47.0; stable 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+)
set lists # Enable list-of-strings values; unstable, requires `set unstable` (v1.53.0+)| Attribute | Purpose |
|---|---|
[arg("p", long, ...)] | Configure parameter as --flag option (v1.46) |
[arg("p", long, flag)] | Valueless flag ⇒ "true"/[]; needs set lists (v1.53+) |
[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 |
[macos] | Restrict a recipe to macOS |
[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 under set default-script (v1.52+) |
[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 the given value); under `set lists`, `flag` is the v1.53+ alternative
[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 helpMultiple 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()
# Name of the currently-running recipe (v1.53.0+)
self:
echo "running {{ recipe_name() }}"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.
set lists (also requires set unstable) turns values into lists of strings — still unstable and subject to breaking changes. Highlights:
set unstable
set lists
targets := ["x86", "arm"] # List literal (flattens; strings only)
all := targets ++ ["wasm"] # `++` concatenates lists
files := split("a.ts b.ts") # ["a.ts", "b.ts"] (whitespace by default)
root_ox_paths := [
"package.json",
".lintstagedrc.mjs",
".mcp.json",
"biome.jsonc",
"knip.jsonc",
"oxlint.config.ts",
"oxfmt.config.ts",
"tsconfig.base.json",
"vitest.shared.ts",
]
# Map a dependency over a list: invoked once per element, parallelized
[parallel]
build *platform: *(compile *platform)
compile platform:
echo "compiling for {{ platform }}"Use list literals for file/path collections. Do not recommend parenthesized, space-joined string assembly for path sets.
Booleans are reformed under set lists: canonical true is "true", canonical false is the empty list [] (every other value, including '', is truthy). !expr negates, ==/!=/=~/!~ work in any expression, and an if without else evaluates to [] when false. Variadic params (*args) become lists. New functions: split(), bool(), show(), join_list(). Full behavior in references/settings.md.
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::buildFor projects using @sablier/devkit:
import "./node_modules/@sablier/devkit/just/base.just"
import "./node_modules/@sablier/devkit/just/npm.just"When --justfile points at a .md file, just extracts the contents of unindented ``` `just ``` fenced code blocks and runs them as a justfile. Useful for keeping runnable recipes inside documentation:
Build the project:
build: echo Building…
just --justfile README.md build--fmt prints the formatted justfile to stdout (rather than rewriting) when the source is a markdown file or stdin.
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-checkIf 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 buildThe 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 --listDocument 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 buildNote: 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:
Working justfile templates in examples/:
/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]~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.