Hace
Constants
Environment variable names that already produced a deprecation warning (${NAME} expansion, brace-less $NAME in non-command fields), so each is reported at most once per run.
Shells that understand POSIX fail-fast (-e). When a task or Hacefile selects one of these shells without explicit arguments, hace runs the commands with "-e -c" so multi-command tasks stop at the first failure, matching the default /bin/sh behavior. Other shells (python, cmd.exe, ...) only get the script passed via -c.
Recipe stamps make the rendered recipe part of the staleness model.
Croupier only considers missing outputs, input file hashes and upstream staleness, so editing a task's commands in the Hacefile would never trigger a rebuild. To fix that, every task gets an extra input: a small file whose content is the SHA1 of its commands, shell and working directory. When the recipe changes, the stamp content changes, and the regular input-hash comparison marks the task stale.
Track which tasks explicitly use CLI_ARGS (detected before Crinja expansion)
Class methods
Snapshot the merged environment view as template variables, backing the
env namespace ({{ env.NAME }}). It matches what task shells see for
$NAME: process environment (including dotenv) plus env: overrides.
Expand the deprecated ${ENV_VAR} references inside a value and everything nested in it, leaving non-string values untouched. Warns when a brace-less $ENV_VAR reference would have expanded before (only names that resolve in the merged environment, to keep noise down).
Expand the deprecated braced ${ENV_VAR} references from the merged environment view. Actual substitutions log a deprecation warning, once per variable name per run; undefined references stay literal (matching both the old behavior and post-removal shell passthrough).
Convert a parsed YAML node into the typed Value representation. This is the single place where YAML::Any is allowed to exist.
Inject CLI_ARGS and CLI_ARGS_LIST into VARIABLES for template expansion
Clear the module-level mutable state (VARIABLES, ENVIRONMENT, the CLI_ARGS tracking set and the env-deprecation warning set). Intended for use between test scenarios so that values injected by one run (CLI_ARGS, Hacefile variables, env entries) do not leak into the next. Mirrors Croupier::TaskManager.cleanup.
Record the current recipe signature for task_name and return the stamp path. Writing is skipped when the content is unchanged so the file's mtime stays stable (mtime-based staleness modes would otherwise see it as modified on every run). Failures degrade gracefully: the returned path then simply does not exist, which scan_inputs skips, giving the old behavior without recipe sensitivity.
Convert a Hash(String, Value) to Crinja::Variables
Warn about brace-less $WORD references in non-command fields: hace no longer expands them, so a value like "$HOME" stays literal. Only names that resolve in the merged environment warn, since only those could have relied on the old expansion.