api-reference.md11.5 KB
View on GitHubAtmos Automation Language API Reference
Everything below is predeclared; there is nothing to import. The published function reference documents each function in more depth. If a name is not listed here, check that page before concluding it does not exist.
Context and inputs
ctx.args: immutable list of raw script arguments. Standalone scripts get the tokens after the script name; Git hooks get the arguments Git passes to the hook. It is empty elsewhere.ctx.flags,ctx.arguments: immutable parsed inputs for script steps. Custom command string, bool, andtype: intflags keep their types; workflow flags are strings and always includestack. In standalone scripts both are empty; use thecli.commandcallback instead.ctx.script:.pathand.directoryof the physical file. Set for standalone scripts and for script steps included through a local!include;Nonefor inline step scripts.ctx.component,ctx.hook,ctx.operation: see the entry-point table inSKILL.md.env: immutable dict of the step's explicitenvinputs.
Standalone command line
cli.command(run, name=, description=, args=, flags=, validate=),cli.arg(...),cli.flag(...): see standalone-scripts.md. Standalone main thread only.
Processes
exec.run(argv, working_directory=, env={...}, output="stream", check=True): argv-based child process; returns a result with.stdout,.stderr,.exit_code, and.data(stdout decoded as JSON on first access; reading it on non-JSON stdout fails).timeout="30s"bounds the whole call, andretry={"max_attempts": 3, "initial_delay": "1s", "conditions": [regex, ...]}retries ordinary nonzero exits (conditionsmatch the failed attempt's output). It raises on failure by default, with the last stderr lines in the error. Usecheck=Falseto assert an expected nonzero exit. Start failures (command not found, bad directory), cancellation, signals, and transport errors always raise.output="stream"(default) shows output live and also captures it;output="capture"captures without showing;output="viewport"shows live output in a bounded viewport (streams without a TTY or in parallel tasks). Acheck=Truefailure that reaches the top exits Atmos with the child's exit code. It inherits the effective execution environment without changing the global working directory or environment. Relativeworking_directoryresolves against the step working directory.exec.which(name): absolute path of the executableexec.runwould start forname, orNone. Searches the samePATHasexec.run(includingdependencies.toolsdirectories); a name with a path separator resolves relative to the working directory. Use it for prerequisite checks instead of running a tool just to see whether it exists.component.exec(argv, working_directory=, env={...}, output=, check=): same, but runs in the component's physical directory and uses the component env (then command, step, and per-call overrides). Use the handle rather than inferring a path from a logical name.
Atmos commands
atmos.<command>(*positional, flags={}, args=[], working_directory=, env=, output=, check=)for every registered command, including custom commands and aliases (print(dir(atmos))). Examples:atmos.version(),atmos.list("components"),atmos.vendor("pull", flags={"stack": "dev"}),atmos.describe("component", "api", flags={"stack": "dev", "format": "json"}, output="capture"),atmos.scaffold("generate", "template", "target"),atmos.config("get", args=["base_path"]). Theatmos.list,atmos.describe,atmos.config("get"),atmos.stack("get"), andatmos.stack("config", "get")wrappers default to JSON and captured output and expose.data.atmos.run(argv, working_directory=, env=, output=, check=): invoke the current Atmos binary with a full argument list. Use it for hyphenated custom command names that cannot be attributes:atmos.run(["my-command", "--flag=value"]).atmos.terraform(command, component, stack, flags={}, args=[], working_directory=, env=, output=, check=)andatmos.helm(...): structured component arguments.atmos.tfisatmos.terraform(same keywordcomponent=/stack=signature anddetailed-exitcodetolerance). Pass the stack as thestackargument, not as aflagsentry. Preferdeployoverapplyin non-interactive scripts.atmos.toolchain(command, tool=, flags=, args=, ...): explicit toolchain commands, for exampleatmos.toolchain("install", "jqlang/jq@1.7.1"). It behaves like the CLI and pins the tool in the project's.tool-versions. Commands use installed pins; automatic installation depends ontoolchain.install(alwaysinstalls all pins on every run). It does not change the script'sPATH; usedependencies.toolsfor a script-scoped pin.- Flag mapping: bare keys become
--name; an explicit dash prefix preserves native tool spelling ("-detailed-exitcode"). Values are strings, ints, bools, or lists (a list repeats the flag).Trueemits a bare flag;Falseemits--name=false.detailed-exitcodeonterraform planuses a single dash and accepts exit code 2 without raising. - All wrappers return process results (
.stdout,.stderr,.exit_code,.data)..dataparses captured stdout as JSON. The query wrappers listed above default to JSON andoutput="capture"; other wrappers default tooutput="stream". DefaultcheckisTrue, and the default working directory is where Atmos was invoked. Parent CLI-only flags are not replayed automatically.
Stack configuration
components.get(name, stack, type): resolved component handle in standalone scripts (with an Atmos project), and in custom command, workflow, and hook script steps and theirparallel/matrixchildren. Results are cached per run. The handle exposesname,stack,type,implementation,path,vars,settings,metadata,env,config(read-only), andexec.
Concurrency
steps.parallel(functions=[fn, ...] | tasks=[...], max_concurrency=4, fail_fast=False): runs zero-argument functions or tasks; returns results in input order.steps.task(name, function, args=[], kwargs={}, retry=None, timeout=""): deferred task descriptor forsteps.parallel(tasks=[...]).retrykeys:max_attempts,initial_delay,backoff_strategy,max_delay.
Cleanup
defer(fn, *args, **kwargs): registers a call to run when the enclosing script orsteps.paralleltask finishes, last in first out, after a normal return,fail(), or cancellation (then with a 30 s grace context soexec.run/atmos.*still work). Arguments are captured at registration. The body error stays primary; a failing deferred call is reported after it. This is thefinally/trap EXITequivalent;when: alwaysis the YAML-step counterpart. Never write cleanup after afail()and expect it to run.
Step library
steps.run(type, **fields)andsteps.<type>(**fields)(for examplesteps.input,steps.choose,steps.join,steps.http) execute any registered step handler immediately and return its result. See steps.run.
Data helpers
json.encode(value),json.decode(text): structured data without shell quoting. Usejson.indent(text, prefix=, indent=)to pretty-print JSON text, andjson.encode_indent(value)to encode and format in one call.fs.read_file(path): read a local file as a string (relative to the step working directory, also inside loaded functions; absolute paths accepted; a leading~expands to the home directory in everyfs.*call). There is no write API. Usefs.glob(pattern),fs.stat(path),fs.exists(path), andfs.readlink(path)to inspect the filesystem.fs.resolve(path)returns the absolute path (tilde expanded, relative paths joined to the working directory, cleaned) without touching the filesystem, so use it instead of hand-rolled~and absolute-path checks.digest.sha256(data),digest.sha512(data),digest.sha1(data),digest.md5(data): lowercase hex digest of a string. Strings are bytes, sodigest.sha256(fs.read_file(path))fingerprints a binary file exactly. There is no incremental API; sha1 and md5 exist for interoperability (Git ids, S3 ETags), not security.errors.build(message): error builder with.with_title,.with_explanation,.with_hint,.with_example,.with_context,.with_exit_code, and a final.fail().regex.search(pattern, text): boolean match anywhere.regex.findall(pattern, text): list of full matches.regex.replace(pattern, replacement, text): replace all matches with literal text. Go/RE2 syntax, including inline flags; no lookaround, backreferences, or replacement capture expansion. Use ordinary string methods for fixed text.
Output
print(...): stdout (data).ui.info(message)(▶),ui.success(message)(✓),ui.warning(message)(⚠): stderr.log.trace/debug/info/warn/error(message, **fields): Atmos logger. Field names must be identifiers.stepandtaskfields are added automatically. Never the step value.
CI
ci.context: read-only struct, resolved on first access:provider,local(no CI provider detected; the generic provider renders locally),event,sha,branch,repo,actor,run_id,run_url,elevated(pull_request_target/workflow_run), andpr(number,head,base,url) orNone.ci.base(): the affected-detection base (ref,sha,head_sha,target_branch,source) orNone.- Writes, one call each, with a local rendering on stderr when no provider is detected:
ci.summary(markdown),ci.output(name, value),ci.env(name, value),ci.path(dir),ci.mask(value)(registers with Atmos masking at once;::add-mask::in CI),ci.annotate(level, message, file="", line=0, end_line=0, title="")(error|warning|notice),ci.comment(body, key="", behavior="upsert", pr=0)→ structid,url,created(akeymakes later runs update the same comment; locally a preview, never posted),ci.check(name, state="pending", description="", url="")→ handle withname,state,id,url, andupdate(state, description="", url="")(a commit status on GitHub; no body),ci.group(title, fn)→fn()'s result inside a collapsible log group, andci.sarif(path, category=""). - In CI each write honors the same switches as native reporting (
ci.enabledplusci.summary.enabled,ci.output.enabled(also env/path),ci.annotations.enabled,ci.results.enabled,ci.checks.enabled,ci.comments.enabled,ci.groups.mode). A gated-off call renders locally and warns with the disabled flag; local rendering errors can still fail the script.ci.maskregisters the secret with Atmos masking without a gate warning whenci.enabledis disabled. Comments and checks are held on elevated events unlessci.allow_unsafe_fork_executionis set. - Distinct from
atmos.ci(...), which runs theatmos ciCLI command group as a subprocess. Reference: ci.
Toolchain
dependencies.tools(name, version): install and pin a tool for the invocation. Main thread only, beforesteps.parallel.
Language dialect
Top-level if, for, and while; set(); and recursion are enabled. Globals can be assigned
once. There are no classes, exceptions, or import; use load("path.star", "name") for local modules
and fail("message") to abort.