v1.222.0-rc.9
Pre-releasefeat(workflows): http step type (webhook alias) with retries Erik Osterman (Cloud Posse) (@osterman) (#2641)
## what- Add a native
httpworkflow/custom-command step (type: http) that performs an HTTP request — any verb (GET/POST/PUT/PATCH/DELETE/HEAD/OPTIONS),querystring parameters,headers, and a request body viabody(raw) orform(urlencoded, or JSON whenContent-Typeis JSON). - Keep
webhookas a first-class alias forhttp(type: webhookbehaves identically) for the fire-a-notification use case. This adds alias support to the step registry:NewBaseHandleris variadic for aliases,Get()resolves aliases, andList/Countreport only the canonical entry (no duplicate step type). - Per-attempt
timeoutandretrythat composes with the existingretry:policy; retry is HTTP-aware (transport errors,5xx, and429retry by default, other4xxfail fast, andretry.conditionsregexes force additional cases). - Configurable success criteria via
expect.status(codes) andexpect.response(regexes); the response body and status are captured as the step's value/metadata for downstream steps. - Schema fields on
WorkflowStepandTask(so it works in both workflows and custom commands) plus theHTTPExpectstruct,ErrHTTPStep*sentinels, JSON manifest updates, docs, anexamples/http-webhooksexample, a changelog blog post, and a roadmap milestone.
why
- Calling external endpoints (notify a service, trigger a CI job, hit a deployment webhook, poll a health check) previously required shelling out to
curl, which isn't portable (Windows), is awkward to template, and gets no first-class timeout/retry handling. - The step is a general-purpose, verb-agnostic outbound HTTP client, so
httpis the accurate name (an inbound callback receiver is what "webhook" conventionally means);webhookis retained as an alias so the evocative name still works. - Extended/registry step types are not wrapped by the legacy
retry.Dopath thatshell/atmosuse, so the handler applies retry itself viaretry.WithPredicate— which is what enables status-code-aware retry decisions a generic wrapper can't make.
references
- Docs: workflow step types and custom commands
- Changelog:
website/blog/2026-06-20-http-step-type.mdx
Summary by CodeRabbit
Release Notes
-
New Features
- Added an HTTP workflow step (
http, withwebhookalias) to call HTTP endpoints from workflows. - Supports templated URL, method, headers, query, and mutually exclusive raw
bodyvsformpayloads. - Added response expectations (status allowlist and regex matching), with the response body as the step value and status/headers metadata.
- Introduced per-step timeouts and HTTP-aware retries, including
retry.conditionsfor additional match-based retries.
- Added an HTTP workflow step (
-
Documentation
- Expanded HTTP step docs, examples, and retry-condition guidance; updated step type tables.
-
Tests
- Added end-to-end and unit tests covering validation, execution, retries, templating, and aliases.
feat(workflows): add `say` step for audible TTS notifications Erik Osterman (Cloud Posse) (@osterman) (#2640)
## what- Add a new
sayworkflow step type that speaks itscontentaloud using text-to-speech, and gracefully degrades to printing the message as a Markdown blockquote when no speech engine is available or when running in CI/headless. - Introduce a reusable cross-platform
pkg/saypackage (mirroringpkg/browser) that detects macOSsay, Linuxspd-say/espeak/espeak-ng, and Windows PowerShellSystem.Speech, behind aSpeakerinterface with aCommandRunnerDI seam and functional options. - Support a CSS font-family-style
voicelist (first installed voice on the host wins), aratefield (slow/normal/fast), and aprintpolicy (fallback/always/never); add the matchingVoice/Rate/Printfields toWorkflowStepand sentinel errorsErrSayNotFound/ErrVoiceListUnsupported. - Add an
examples/say-something/reference example, workflow step-type docs, an announcement blog post, and a roadmap milestone under the Workflows Overhaul initiative.
why
- Long-running workflows often outlast your attention;
saygives an audible cue when a workflow finishes or needs input, going beyond the bell-onlyalertstep by announcing what happened. - Shelling out to
sayonly works on macOS — this makes audible notifications portable across macOS/Linux/Windows and safe in CI, so the same workflow runs unchanged everywhere and never fails on a missing engine.
references
- N/A
Summary by CodeRabbit
Release Notes
-
New Features
- Added a
sayworkflow step for cross-platform text-to-speech with automatic engine detection. - Supports
voice,rate, and aprintpolicy (fallback,always,never) that can render a Markdown blockquote when audio isn’t available.
- Added a
-
Bug Fixes
- Workflows keep running when speech engines are missing and when voice listing isn’t supported.
-
Documentation
- Added
saystep docs, a “say something” example (README + Atmos config + workflow), and a blog post; updated step-type listings.
- Added
-
Tests
- Added unit tests covering detection, voice enumeration/parsing, argument generation, and
sayexecution.
- Added unit tests covering detection, voice enumeration/parsing, argument generation, and
feat(hooks): CI annotations and SARIF upload for scanner findings Erik Osterman (Cloud Posse) (@osterman) (#2631)
## what- Surface scanner-hook findings (Checkov, Trivy, KICS) in CI beyond the job summary:
ci.annotations(default on) — inline GitHub::error/::warningannotations anchored at each finding's file and line on the PR diff. The non-Code-Scanning path: needs no GitHub Advanced Security.ci.results(default off) — upload the raw SARIF to GitHub Code Scanning (Security tab) natively, with nogithub/codeql-actionstep. Analysis category is auto-derived from the scan target so per-component uploads don't overwrite each other.
- Implemented as native CI provider capabilities (
Annotator,SARIFReporter) — siblings of the existing check-run/comment/summary capabilities — not as hooks. All three reporting outputs (ci.summary/ci.annotations/ci.results) are gated byci.enabled. - Custom hooks opt in by adding
format: sarifto akind: commandhook — any SARIF-emitting tool (tfsec, semgrep, gitleaks, …) gets findings, annotations, and upload with no Go code. - Docs (incl. required GitHub Actions permissions), a changelog blog post, and a roadmap milestone.
why
- The CI job summary (#2617) gave a readable report, but the two richest GitHub surfaces — inline PR annotations and tracked Code Scanning alerts — were missing even though the data was already in the parsed SARIF.
- Modeling this as provider capabilities (rather than reviving the deprecated
ci.*hook kinds) keeps CI reporting where it belongs and lets every SARIF-emitting hook, built-in or custom, participate through one shared path.
references
- Builds on #2617 (scanner findings → CI job summary) and completes the CI-reporting direction from #2614.
- Note: base is
main; #2617 is not yet merged, so this PR's diff currently includes #2617's commits — they drop out once #2617 merges and this branch is rebased.
🤖 Generated with Claude Code
Summary by CodeRabbit
- New Features
- Added CI reporting for security scan findings in GitHub Actions: job step summaries, inline workflow diff annotations, and optional GitHub Code Scanning SARIF uploads (configurable via
ci.enabled,ci.annotations, andci.results). - Enabled
kind: commandhooks withformat: sarifto route findings into the same CI destinations.
- Added CI reporting for security scan findings in GitHub Actions: job step summaries, inline workflow diff annotations, and optional GitHub Code Scanning SARIF uploads (configurable via
- Bug Fixes
- Switched the build base image to Debian trixie to resolve scanner runtime GLIBC issues.
- Standardized AWS custom endpoint configuration to
spec.endpoint_url; CI reporting is best-effort and won’t fail scans/plans.
- Documentation
- Updated CI reporting and hook documentation, plus endpoint configuration references.
feat(container): persistent container component kind + compositions Erik Osterman (Cloud Posse) (@osterman) (#2645)
## whatAdds a stack-scoped, Atmos-native container component kind — one component is one persistent service — plus first-class compositions membership.
- Lifecycle (
atmos container <verb> <component> -s <stack>):build,push,pull,run,up,ps,logs,exec,restart,stop,rm,down. Long-running containers are discovered by labels derived from the canonical instance address<stack>/container/<component>(nameatmos-<stack>-container-<component>), not local state files.up/runbuild the image first whenvars.build-stylebuild:is set and the image is missing. - First-class config —
image,build,runare top-level component sections (reusing the workflow container-step structsContainerBuildStep/ContainerRunStep), not nested undervars. Container app env comes from the componentenv:section. atmos container listshows per-instance running state (running/stopped/unknown), discovered by label. The genericatmos list componentslists containers as a component type without container-specific status — consistent with terraform/ansible (there is noatmos terraform list/atmos ansible list).- Compositions — a first-class
composition:membership field + a top-levelcompositions:section (closed for membership, open for fulfillment). Operating a component with undeclared membership is a hard error;atmos composition validate <name> -s <stack>reports fulfilled vs. not-provided services. - Deep merge — the custom-component fallback now runs
metadata.inheritsinheritance + generic deep-merge of all top-level keys, so container honors catalog/abstract defaults like built-in kinds. Abstract components are rejected for execution and filtered from listings. - Extends the describe-component auto-detect and the describe/list type whitelist for
container(and fixes the pre-existingansiblegap inlist components).
why
Containers should be first-class, addressable component instances like terraform/helmfile/packer/ansible, and atmos list components should show whether each is running. A set of container components grouped by a composition is "our own Compose" with no compose.yaml. Implements docs/prd/container-components.md.
references
- PRD:
docs/prd/container-components.md,docs/prd/compositions.md - Examples:
examples/container-component/,examples/compositions/ - Docs:
website/docs/cli/commands/container/,website/docs/components/container.mdx - Contributor skill:
.claude/skills/atmos-core-component-development/
[!NOTE]
Stacked onosterman/container-step-prd(the container step), notmain. Changelog/roadmap are not required for this base (the gate is main-only); they'll go on the PR that brings the container feature tomain.
🤖 Generated with Claude Code
Summary by CodeRabbit
Release Notes
-
New Features
- Added
atmos containerfor persistent, stack-scoped container lifecycle management (build/push/pull, run/up/down, start/stop/restart, rm, ps/logs/exec/attach), including bulk mode (--all) and interactive selection. - Added
atmos composition validateto report composition service fulfillment across stacks.
- Added
-
Updates
- Introduced first-class
components.container.*withimage/build/run,metadata.inheritsdeep-merge, and improvedrun.commandparsing. - Added
run.restartandrun.healthchecksupport; updated container instance labels totools.atmos.*, plus enhanced shell completion and log streaming.
- Introduced first-class
-
Documentation
- Updated container/composition guides and added runnable examples.