Skip to content

[codex] Add native asciicast recording and demo embeds#2672

Merged
Andriy Knysh (aknysh) merged 99 commits into
mainfrom
ascii-cast
Jul 9, 2026
Merged

[codex] Add native asciicast recording and demo embeds#2672
Andriy Knysh (aknysh) merged 99 commits into
mainfrom
ascii-cast

Conversation

@osterman

@osterman Erik Osterman (Cloud Posse) (osterman) commented Jul 1, 2026

Copy link
Copy Markdown
Member

what

  • Adds Atmos-native asciicast recording, playback, rendering, and cast/workdir step support.
  • Adds reproducible cast demo commands, deterministic fixtures, committed website casts, and an asciicast authoring skill.
  • Adds website cast playback plus README front matter/example embed support for showing casts on command and example pages.

why

  • Makes command demos reproducible, source-controlled, reviewable as plain text, and reusable across docs.
  • Lets examples opt into casts without duplicating command-page videos.
  • Provides validated demo coverage for Terraform, vendor, describe/list, and AWS emulator workflows.

references

  • None.

Summary by CodeRabbit

  • New Features
    • Added terminal recording via global --cast (supports generated .cast output and rendering to .gif/.mp4 and more formats).
    • Introduced atmos cast play and atmos cast render.
    • Added interactive cast simulation/session driving, plus script and workdir step capabilities.
    • Added website cast playback through the new CastPlayer component and an embedded cast demo gallery.
  • Bug Fixes
    • Improved forced-color behavior and cast/help capturing consistency, without impacting normal CLI argument handling.
  • Documentation
    • Updated CLI docs, examples, and skills/guides to cover cast workflows and new step patterns.

@atmos-pro

atmos-pro Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Tip

Atmos Pro  

No affected stacks workflow was detected for this pull request.
If this is expected, no action is needed.
Learn More. Ask AI.

@github-actions github-actions Bot added the size/xl Extra large size PR label Jul 1, 2026
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown

Dependency Review

✅ No vulnerabilities or license issues found.

Scanned Files

  • .github/workflows/screengrabs.yaml

@osterman Erik Osterman (Cloud Posse) (osterman) marked this pull request as ready for review July 1, 2026 02:23
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown

Warning

Release Documentation Required

This PR is labeled minor or major and requires documentation updates:

  • Changelog entry - Add a blog post in website/blog/YYYY-MM-DD-feature-name.mdx
  • Roadmap update - Update website/src/data/roadmap.js with the new milestone

Alternatively: If this change doesn't require release documentation, remove the minor or major label.

@coderabbitai

coderabbitai Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Too many files!

This PR contains 1365 files, which is 1215 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: bf105de6-6125-4799-a418-899dcd2a9a9a

📥 Commits

Reviewing files that changed from the base of the PR and between f39c3c3 and 792ed0a.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (1365)
  • .claude/skills/atmos-asciicast/SKILL.md
  • .claude/skills/atmos-components
  • .claude/skills/atmos-hooks
  • .claude/skills/atmos-steps
  • .gitattributes
  • .github/workflows/screengrabs.yaml
  • .gitignore
  • .tool-versions
  • CLAUDE.md
  • NOTICE
  • agent-skills/.claude-plugin/plugin.json
  • agent-skills/AGENTS.md
  • agent-skills/skills/atmos-asciicast/SKILL.md
  • agent-skills/skills/atmos-asciicast/references/atmos-asciicast-authoring.md
  • agent-skills/skills/atmos-custom-commands/SKILL.md
  • agent-skills/skills/atmos-custom-commands/references/command-syntax.md
  • agent-skills/skills/atmos-hooks/SKILL.md
  • agent-skills/skills/atmos-steps/SKILL.md
  • agent-skills/skills/atmos-workflows/SKILL.md
  • cmd/ai/init.go
  • cmd/ai/init_test.go
  • cmd/ai/providers.go
  • cmd/cast/cast.go
  • cmd/cast/recording.go
  • cmd/cast/recording_test.go
  • cmd/cast_flag_test.go
  • cmd/cmd_utils.go
  • cmd/composition/composition.go
  • cmd/composition/composition_test.go
  • cmd/custom_command_integration_test.go
  • cmd/env/env.go
  • cmd/help_template.go
  • cmd/help_template_test.go
  • cmd/packer.go
  • cmd/profile/list.go
  • cmd/profile/show.go
  • cmd/root.go
  • cmd/root_helpers_test.go
  • cmd/terraform/cache/stats.go
  • cmd/terraform/cache/subcommands_test.go
  • demo/casts/README.md
  • demo/casts/atmos.d/all.yaml
  • demo/casts/atmos.d/cli/commands/cast/commands.yaml
  • demo/casts/atmos.d/demo/fixtures/all.yaml
  • demo/casts/atmos.d/demo/fixtures/basic/all.yaml
  • demo/casts/atmos.d/demo/fixtures/basic/describe-component.yaml
  • demo/casts/atmos.d/demo/fixtures/basic/describe-stacks.yaml
  • demo/casts/atmos.d/demo/fixtures/basic/list-stacks.yaml
  • demo/casts/atmos.d/demo/fixtures/demo-vendoring/all.yaml
  • demo/casts/atmos.d/demo/fixtures/demo-vendoring/pull.yaml
  • demo/casts/atmos.d/demo/fixtures/native-terraform/all.yaml
  • demo/casts/atmos.d/demo/fixtures/native-terraform/deploy.yaml
  • demo/casts/atmos.d/demo/fixtures/native-terraform/output.yaml
  • demo/casts/atmos.d/demo/fixtures/native-terraform/plan.yaml
  • demo/casts/atmos.d/examples/all.yaml
  • demo/casts/atmos.d/examples/auth-stores/identity-backed-stores.yaml
  • demo/casts/atmos.d/examples/background-steps/service.yaml
  • demo/casts/atmos.d/examples/caching/registry-cache.yaml
  • demo/casts/atmos.d/examples/compositions/validate.yaml
  • demo/casts/atmos.d/examples/config-profiles/list-and-show.yaml
  • demo/casts/atmos.d/examples/container-component/lifecycle.yaml
  • demo/casts/atmos.d/examples/container-sandbox/sandbox.yaml
  • demo/casts/atmos.d/examples/container-step/build-run.yaml
  • demo/casts/atmos.d/examples/custom-commands/hello-greet.yaml
  • demo/casts/atmos.d/examples/custom-components/script-command.yaml
  • demo/casts/atmos.d/examples/demo-ansible/playbook.yaml
  • demo/casts/atmos.d/examples/demo-atlantis/repo-config.yaml
  • demo/casts/atmos.d/examples/demo-auth/auth-list.yaml
  • demo/casts/atmos.d/examples/demo-component-versions/vendor-versions.yaml
  • demo/casts/atmos.d/examples/demo-context/name-template.yaml
  • demo/casts/atmos.d/examples/demo-env/masked-token.yaml
  • demo/casts/atmos.d/examples/demo-helmfile/lifecycle.yaml
  • demo/casts/atmos.d/examples/demo-library/modules.yaml
  • demo/casts/atmos.d/examples/demo-schemas/validate.yaml
  • demo/casts/atmos.d/examples/demo-stacks/inheritance.yaml
  • demo/casts/atmos.d/examples/demo-workflows/deploy.yaml
  • demo/casts/atmos.d/examples/devcontainer-build/build-config.yaml
  • demo/casts/atmos.d/examples/devcontainer/config.yaml
  • demo/casts/atmos.d/examples/emulator-aws/lifecycle.yaml
  • demo/casts/atmos.d/examples/emulator-k8s/lifecycle.yaml
  • demo/casts/atmos.d/examples/generate-files/component-files.yaml
  • demo/casts/atmos.d/examples/gitops/reconcile.yaml
  • demo/casts/atmos.d/examples/helm/lifecycle.yaml
  • demo/casts/atmos.d/examples/hooks-checkov/security-scan.yaml
  • demo/casts/atmos.d/examples/hooks-custom-command/hook-config.yaml
  • demo/casts/atmos.d/examples/hooks-infracost/cost-summary.yaml
  • demo/casts/atmos.d/examples/hooks-kics/security-scan.yaml
  • demo/casts/atmos.d/examples/hooks-trivy/security-scan.yaml
  • demo/casts/atmos.d/examples/http-webhooks/local-endpoints.yaml
  • demo/casts/atmos.d/examples/interactive-workflows/table-and-build.yaml
  • demo/casts/atmos.d/examples/kubernetes/lifecycle.yaml
  • demo/casts/atmos.d/examples/kustomize/lifecycle.yaml
  • demo/casts/atmos.d/examples/local-gitops/lifecycle.yaml
  • demo/casts/atmos.d/examples/locals/structured-values.yaml
  • demo/casts/atmos.d/examples/onepassword-secrets/connect-mock.yaml
  • demo/casts/atmos.d/examples/parallel-steps/control-steps.yaml
  • demo/casts/atmos.d/examples/quick-start-advanced/list-instances.yaml
  • demo/casts/atmos.d/examples/quick-start-simple/list-and-plan.yaml
  • demo/casts/atmos.d/examples/remote-stack-imports/remote-vars.yaml
  • demo/casts/atmos.d/examples/say-something/pipeline.yaml
  • demo/casts/atmos.d/examples/secrets-masking/masked-plan.yaml
  • demo/casts/atmos.d/examples/sops-secrets/secret-lifecycle.yaml
  • demo/casts/atmos.d/examples/source-provisioning/sources.yaml
  • demo/casts/atmos.d/examples/stack-names/explicit-names.yaml
  • demo/casts/atmos.d/examples/terraform-tests/stack-discovery.yaml
  • demo/casts/atmos.d/examples/toolchain/demo-convert.yaml
  • demo/casts/atmos.d/examples/workflow-retries/retry-failure.yaml
  • demo/casts/atmos.d/screengrabs/cli.yaml
  • demo/casts/atmos.d/screengrabs/demo-stacks/all.yaml
  • demo/casts/atmos.d/screengrabs/demo-stacks/define-your-stacks.yaml
  • demo/casts/atmos.d/screengrabs/demo-stacks/deploy.yaml
  • demo/casts/atmos.d/screengrabs/demo-stacks/start-your-project.yaml
  • demo/casts/atmos.d/screengrabs/demo-stacks/write-your-components.yaml
  • demo/casts/atmos.yaml
  • demo/casts/cast-defaults.yaml
  • demo/casts/cast_checks.py
  • demo/casts/fixtures/basic/.gitignore
  • demo/casts/fixtures/basic/atmos.yaml
  • demo/casts/fixtures/basic/components/terraform/mock/main.tf
  • demo/casts/fixtures/basic/stacks/catalog/mock.yaml
  • demo/casts/fixtures/basic/stacks/deploy/nonprod.yaml
  • demo/casts/fixtures/basic/stacks/deploy/prod.yaml
  • demo/casts/fixtures/demo-vendoring/atmos.yaml
  • demo/casts/fixtures/demo-vendoring/stacks/catalog/myapp.yaml
  • demo/casts/fixtures/demo-vendoring/stacks/deploy/dev.yaml
  • demo/casts/fixtures/demo-vendoring/stacks/deploy/prod.yaml
  • demo/casts/fixtures/demo-vendoring/stacks/deploy/staging.yaml
  • demo/casts/fixtures/demo-vendoring/vendor.d/vendor1.yaml
  • demo/casts/fixtures/demo-vendoring/vendor.yaml
  • demo/casts/fixtures/demo-vendoring/vendor/vendor1.yaml
  • demo/casts/fixtures/demo-vendoring/vendor/vendor2.yaml
  • demo/casts/fixtures/native-terraform/.gitignore
  • demo/casts/fixtures/native-terraform/atmos.yaml
  • demo/casts/fixtures/native-terraform/components/terraform/vpc/envs/dev.tfvars
  • demo/casts/fixtures/native-terraform/components/terraform/vpc/envs/prod.tfvars
  • demo/casts/fixtures/native-terraform/components/terraform/vpc/main.tf
  • demo/casts/fixtures/native-terraform/components/terraform/vpc/outputs.tf
  • demo/casts/fixtures/native-terraform/components/terraform/vpc/variables.tf
  • demo/casts/fixtures/native-terraform/stacks/_defaults.yaml
  • demo/casts/fixtures/native-terraform/stacks/dev.yaml
  • demo/casts/fixtures/native-terraform/stacks/prod.yaml
  • demo/screengrabs/.gitignore
  • demo/screengrabs/Brewfile
  • demo/screengrabs/Makefile
  • demo/screengrabs/README.md
  • demo/screengrabs/build-all.sh
  • demo/screengrabs/demo-stacks.txt
  • demo/screengrabs/scripts/README.md
  • demo/screengrabs/scripts/demo-stacks/.demo.rc
  • demo/screengrabs/scripts/demo-stacks/define-your-stacks.sh
  • demo/screengrabs/scripts/demo-stacks/deploy-dev.sh
  • demo/screengrabs/scripts/demo-stacks/deploy-prod.sh
  • demo/screengrabs/scripts/demo-stacks/deploy-staging.sh
  • demo/screengrabs/scripts/demo-stacks/deploy.sh
  • demo/screengrabs/scripts/demo-stacks/start-your-project.sh
  • demo/screengrabs/scripts/demo-stacks/write-your-components.sh
  • docs/fixes/2026-07-01-macos-k3s-runner-research.md
  • docs/prd/asciicast-recording.md
  • docs/prd/atmos-aws-security-compliance.md
  • docs/prd/flag-handling/unified-flag-parsing.md
  • docs/prd/help-system-architecture.md
  • errors/error_funcs.go
  • errors/errors.go
  • errors/formatter.go
  • errors/formatter_test.go
  • examples/ai-claude-code/README.md
  • examples/ai/README.md
  • examples/ai/atmos.yaml
  • examples/auth-stores/README.md
  • examples/auth-stores/atmos.yaml
  • examples/background-steps/README.md
  • examples/caching/README.md
  • examples/compositions/README.md
  • examples/config-profiles/README.md
  • examples/container-component/README.md
  • examples/container-sandbox/README.md
  • examples/container-step/README.md
  • examples/custom-commands/README.md
  • examples/custom-commands/atmos.yaml
  • examples/custom-components/README.md
  • examples/demo-ansible/README.md
  • examples/demo-atlantis/README.md
  • examples/demo-auth/README.md
  • examples/demo-component-versions/README.md
  • examples/demo-component-versions/atmos.yaml
  • examples/demo-context/README.md
  • examples/demo-env/README.md
  • examples/demo-env/atmos.yaml
  • examples/demo-helmfile/README.md
  • examples/demo-library/README.md
  • examples/demo-library/weather/main.tf
  • examples/demo-schemas/README.md
  • examples/demo-stacks/README.md
  • examples/demo-vendoring/README.md
  • examples/demo-vendoring/stacks/deploy/dev.yaml
  • examples/demo-workflows/README.md
  • examples/demo-workflows/atmos.yaml
  • examples/demo-workflows/components/myapp/outputs.tf
  • examples/demo-workflows/components/myapp/variables.tf
  • examples/demo-workflows/stacks/catalog/myapp.yaml
  • examples/demo-workflows/stacks/deploy/dev.yaml
  • examples/demo-workflows/stacks/deploy/prod.yaml
  • examples/demo-workflows/stacks/deploy/staging.yaml
  • examples/demo-workflows/stacks/workflows/deploy.yaml
  • examples/devcontainer-build/README.md
  • examples/devcontainer/README.md
  • examples/emulator-aws/README.md
  • examples/emulator-aws/atmos.yaml
  • examples/emulator-aws/components/terraform/bucket/versions.tf
  • examples/emulator-k8s/README.md
  • examples/generate-files/README.md
  • examples/gitops/README.md
  • examples/helm/README.md
  • examples/hooks-checkov/README.md
  • examples/hooks-custom-command/README.md
  • examples/hooks-infracost/README.md
  • examples/hooks-infracost/atmos.yaml
  • examples/hooks-infracost/bin/infracost-emulator
  • examples/hooks-infracost/stacks/deploy/test.yaml
  • examples/hooks-kics/README.md
  • examples/hooks-trivy/README.md
  • examples/http-webhooks/README.md
  • examples/interactive-workflows/README.md
  • examples/kubernetes/README.md
  • examples/kustomize/README.md
  • examples/local-gitops/README.md
  • examples/local-gitops/atmos.yaml
  • examples/local-gitops/stacks/catalog/emulator/gitea.yaml
  • examples/local-gitops/stacks/catalog/flux.yaml
  • examples/locals/README.md
  • examples/mcp-for-ai-coding-assistants/README.md
  • examples/mcp/README.md
  • examples/native-terraform/README.md
  • examples/onepassword-secrets/README.md
  • examples/onepassword-secrets/atmos.yaml
  • examples/onepassword-secrets/mockoon/1password-connect.json
  • examples/onepassword-secrets/stacks/catalog/api.yaml
  • examples/onepassword-secrets/stacks/catalog/emulator/onepassword-connect.yaml
  • examples/onepassword-secrets/stacks/deploy/dev.yaml
  • examples/parallel-steps/README.md
  • examples/parallel-steps/workflows/parallel.yaml
  • examples/quick-start-advanced/README.md
  • examples/quick-start-simple/README.md
  • examples/quick-start-simple/components/terraform/weather/main.tf
  • examples/quick-start-simple/stacks/deploy/dev.yaml
  • examples/remote-stack-imports/README.md
  • examples/say-something/README.md
  • examples/secrets-masking/.gitignore
  • examples/secrets-masking/README.md
  • examples/secrets-masking/atmos.yaml
  • examples/secrets-masking/components/terraform/secrets-demo/.terraform.lock.hcl
  • examples/secrets-masking/components/terraform/secrets-demo/variables.tf
  • examples/sops-secrets/.atmos.d/test.yaml
  • examples/sops-secrets/README.md
  • examples/sops-secrets/atmos.yaml
  • examples/sops-secrets/components/terraform/api/main.tf
  • examples/sops-secrets/stacks/catalog/api.yaml
  • examples/source-provisioning/README.md
  • examples/source-provisioning/atmos.yaml
  • examples/stack-names/README.md
  • examples/terraform-tests/.gitignore
  • examples/terraform-tests/README.md
  • examples/terraform-tests/atmos.yaml
  • examples/terraform-tests/components/terraform/app/.terraform.lock.hcl
  • examples/terraform-tests/components/terraform/vpc/.terraform.lock.hcl
  • examples/toolchain/README.md
  • examples/toolchain/atmos.yaml
  • examples/toolchain/demo.yaml
  • examples/toolchain/workflows/toolchain-demo.yaml
  • examples/workflow-retries/README.md
  • gists/aws-ami-packer-github-actions/README.md
  • gists/aws-secrets/README.md
  • gists/aws-security-compliance/README.md
  • gists/aws-security-compliance/atmos.yaml
  • gists/aws-store-hooks/README.md
  • gists/mcp-with-aws/README.md
  • go.mod
  • internal/exec/describe_config.go
  • internal/exec/describe_config_test.go
  • internal/exec/docs_generate.go
  • internal/exec/docs_generate_test.go
  • internal/exec/shell_utils.go
  • internal/exec/shell_utils_test.go
  • internal/exec/stack_processor_utils.go
  • internal/exec/stack_processor_utils_test.go
  • internal/exec/template_utils.go
  • internal/exec/template_utils_test.go
  • internal/exec/terraform_execute_helpers_exec.go
  • internal/exec/terraform_execute_helpers_pipeline_test.go
  • internal/exec/terraform_test.go
  • internal/exec/testmain_test.go
  • internal/exec/validate_schema.go
  • internal/exec/validate_schema_test.go
  • internal/exec/vendor_model.go
  • internal/exec/workflow_control_adapter.go
  • internal/exec/workflow_utils.go
  • internal/exec/workflow_utils_test.go
  • internal/tui/templates/term/term_writer.go
  • internal/tui/utils/utils.go
  • pkg/ai/agent/copilotcli/client.go
  • pkg/ai/agent/copilotcli/client_test.go
  • pkg/ai/agent/copilotcli/register.go
  • pkg/ai/agent/github/client.go
  • pkg/ai/agent/github/client_test.go
  • pkg/ai/agent/github/register.go
  • pkg/ai/analyze/analyze.go
  • pkg/ai/analyze/providers.go
  • pkg/ai/factory_test.go
  • pkg/ai/skills/marketplace/catalog_test.go
  • pkg/ai/tui/chat.go
  • pkg/ai/tui/chat_providers.go
  • pkg/ai/tui/chat_test.go
  • pkg/ai/tui/sessions.go
  • pkg/asciicast/cellgrid.go
  • pkg/asciicast/cellgrid_test.go
  • pkg/asciicast/exec.go
  • pkg/asciicast/exec_test.go
  • pkg/asciicast/recorder.go
  • pkg/asciicast/recorder_test.go
  • pkg/asciicast/render.go
  • pkg/asciicast/render_ascii.go
  • pkg/asciicast/render_html.go
  • pkg/asciicast/render_image.go
  • pkg/asciicast/render_static_test.go
  • pkg/asciicast/render_test.go
  • pkg/asciicast/session.go
  • pkg/asciicast/session_test.go
  • pkg/asciicast/session_unix.go
  • pkg/asciicast/session_windows.go
  • pkg/asciicast/testmain_test.go
  • pkg/auth/list/formatter_tree.go
  • pkg/component/emulator/executor.go
  • pkg/component/helm/diff.go
  • pkg/component/helm/executor.go
  • pkg/component/kubernetes/executor.go
  • pkg/component/kubernetes/executor_test.go
  • pkg/component/kubernetes/render.go
  • pkg/component/kubernetes/render_test.go
  • pkg/composition/executor.go
  • pkg/composition/executor_lifecycle_test.go
  • pkg/composition/executor_test.go
  • pkg/condition/condition_test.go
  • pkg/condition/evaluate.go
  • pkg/config/atmos_decode_hook_test.go
  • pkg/config/command_include_env_test.go
  • pkg/config/command_merge_core_test.go
  • pkg/config/config_merge_test.go
  • pkg/config/default.go
  • pkg/config/import_commands_test.go
  • pkg/config/load.go
  • pkg/config/load_command_env_test.go
  • pkg/config/load_config_args_test.go
  • pkg/config/load_error_paths_test.go
  • pkg/config/load_test.go
  • pkg/config/process_yaml.go
  • pkg/container/docker.go
  • pkg/container/docker_unit_test.go
  • pkg/container/ephemeral.go
  • pkg/container/podman.go
  • pkg/container/runtime.go
  • pkg/datafetcher/schema/atmos/manifest/1.0.json
  • pkg/datafetcher/schema/config/global/1.0.json
  • pkg/datafetcher/schema/stacks/stack-config/1.0.json
  • pkg/datafetcher/schema_condition_validation_test.go
  • pkg/dependencies/constraint.go
  • pkg/dependencies/constraint_test.go
  • pkg/emulator/driver.go
  • pkg/emulator/driver/driver_test.go
  • pkg/emulator/driver/drivers_profile_test.go
  • pkg/emulator/driver/mockoon.go
  • pkg/emulator/kubeconfig.go
  • pkg/emulator/manager.go
  • pkg/emulator/manager_more_test.go
  • pkg/emulator/manager_test.go
  • pkg/emulator/persistence.go
  • pkg/emulator/persistence_more_test.go
  • pkg/emulator/profile.go
  • pkg/emulator/profile_more_test.go
  • pkg/emulator/target/onepassword.go
  • pkg/emulator/target/onepassword_test.go
  • pkg/emulator/yamlfunc.go
  • pkg/emulator/yamlfunc_test.go
  • pkg/env/env.go
  • pkg/env/env_test.go
  • pkg/env/output.go
  • pkg/env/output_test.go
  • pkg/flags/standard.go
  • pkg/flags/standard_test.go
  • pkg/function/tags.go
  • pkg/io/context.go
  • pkg/io/global.go
  • pkg/io/interfaces.go
  • pkg/io/masker.go
  • pkg/io/reconcile_masking_test.go
  • pkg/io/recorder.go
  • pkg/io/recorder_test.go
  • pkg/io/streams.go
  • pkg/list/importresolver/provenance.go
  • pkg/list/importresolver/provenance_test.go
  • pkg/locals/resolver.go
  • pkg/locals/resolver_test.go
  • pkg/manifest/render.go
  • pkg/manifest/render_extra_test.go
  • pkg/process/script.go
  • pkg/process/script_test.go
  • pkg/profile/list/formatter_table.go
  • pkg/profile/list/formatter_table_test.go
  • pkg/profile/profile.go
  • pkg/profile/profile_display_test.go
  • pkg/profile/show/formatter.go
  • pkg/profile/show/formatter_test.go
  • pkg/provisioner/source/cmd/describe.go
  • pkg/provisioner/source/cmd/describe_test.go
  • pkg/provisioner/source/vendor.go
  • pkg/provisioner/source/vendor_test.go
  • pkg/provisioner/workdir/fs.go
  • pkg/provisioner/workdir/workdir_test.go
  • pkg/runner/step/atmos.go
  • pkg/runner/step/cast.go
  • pkg/runner/step/cast_simulate.go
  • pkg/runner/step/cast_test.go
  • pkg/runner/step/command_handlers_test.go
  • pkg/runner/step/container_env_test.go
  • pkg/runner/step/http.go
  • pkg/runner/step/http_test.go
  • pkg/runner/step/output_mode.go
  • pkg/runner/step/output_mode_execution_test.go
  • pkg/runner/step/say.go
  • pkg/runner/step/script.go
  • pkg/runner/step/script_test.go
  • pkg/runner/step/shell.go
  • pkg/runner/step/shell_test.go
  • pkg/runner/step/show_config.go
  • pkg/runner/step/show_config_test.go
  • pkg/runner/step/variables.go
  • pkg/runner/step/variables_test.go
  • pkg/runner/step/workdir.go
  • pkg/runner/step/workdir_test.go
  • pkg/schema/ai.go
  • pkg/schema/command.go
  • pkg/schema/command_test.go
  • pkg/schema/schema.go
  • pkg/schema/task.go
  • pkg/schema/task_test.go
  • pkg/schema/task_validate.go
  • pkg/schema/task_validate_test.go
  • pkg/schema/workflow.go
  • pkg/schema/workflow_control_test.go
  • pkg/template/ast.go
  • pkg/template/ast_test.go
  • pkg/terminal/pacing_writer.go
  • pkg/terminal/pty/pty.go
  • pkg/terminal/pty/pty_test.go
  • pkg/terminal/terminal.go
  • pkg/terminal/terminal_test.go
  • pkg/terraform/cache/trust_install.go
  • pkg/terraform/cache/trust_install_test.go
  • pkg/terraform/generate/file_generator.go
  • pkg/terraform/mirror/tui.go
  • pkg/terraform/output/spinner.go
  • pkg/ui/formatter.go
  • pkg/ui/formatter_test.go
  • pkg/ui/spinner/spinner.go
  • pkg/utils/shell_utils.go
  • pkg/utils/yaml_utils.go
  • pkg/utils/yaml_utils_test.go
  • pkg/utils/yq_utils.go
  • pkg/utils/yq_utils_test.go
  • pkg/vendor/uri.go
  • pkg/vendor/uri_test.go
  • pkg/workflow/container.go
  • pkg/workflow/control_executor.go
  • pkg/workflow/control_executor_test.go
  • pkg/workflow/executor.go
  • pkg/workflow/executor_test.go
  • scripts/generate-notice.sh
  • scripts/run-custom-golangci-lint.sh
  • tests/cli_auth_login_provider_test.go
  • tests/cli_double_hyphen_test.go
  • tests/cli_snapshot_test.go
  • tests/cli_test.go
  • tests/describe_affected_include_test.go
  • tests/snapshots/TestCLICommands_atmos_--chdir_config_isolation.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_--help_config_aliases_section.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_about_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_atlantis_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_atlantis_generate_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_atlantis_generate_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_atlantis_generate_repo-config_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_atlantis_generate_repo-config_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_atlantis_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_auth_env_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_auth_exec_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_auth_login_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_auth_user_configure_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_auth_validate_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_auth_validate_--verbose.stderr.golden
  • tests/snapshots/TestCLICommands_atmos_auth_whoami_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_describe_config.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_describe_config_-f_yaml.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_describe_config_imports.stderr.golden
  • tests/snapshots/TestCLICommands_atmos_describe_config_imports.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_describe_configuration.stderr.golden
  • tests/snapshots/TestCLICommands_atmos_describe_configuration.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_helmfile_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_helmfile_apply_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_helmfile_apply_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_helmfile_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_non-existent.stderr.golden
  • tests/snapshots/TestCLICommands_atmos_terraform_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_terraform_--help_alias_subcommand_check.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_terraform_apply_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_terraform_apply_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_terraform_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_toolchain_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_toolchain_info_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_toolchain_install_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_validate_editorconfig_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_validate_editorconfig_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_workflow_invalid_step_type.stderr.golden
  • tests/snapshots/TestCLICommands_config_alias_tp_--help_shows_terraform_plan_help.stdout.golden
  • tests/snapshots/TestCLICommands_config_alias_tr_--help_shows_terraform_help.stdout.golden
  • tests/snapshots/TestCLICommands_deploy_component_help_shows_stack_flag.stdout.golden
  • tests/snapshots/TestCLICommands_describe_component_help_shows_stack_flag.stdout.golden
  • tests/snapshots/TestCLICommands_echo_info_help_shows_verbose_flag.stdout.golden
  • tests/snapshots/TestCLICommands_echo_info_runs_with_verbose_flag.stderr.golden
  • tests/snapshots/TestCLICommands_help_flag_works.stdout.golden
  • tests/snapshots/TestCLICommands_indentation.stdout.golden
  • tests/snapshots/TestCLICommands_secrets-masking_describe_config.stdout.golden
  • tests/snapshots/TestCLICommands_show_component_help_shows_inherited_stack_flag.stdout.golden
  • tests/snapshots/TestCLICommands_terraform_help_shows_stack_flag.stdout.golden
  • tests/snapshots/TestCLICommands_terraform_provision_help_shows_inherited_stack_flag.stdout.golden
  • tests/snapshots/TestCLICommands_tf_plan_help_shows_inherited_stack_flag.stdout.golden
  • tests/test-cases/atmos-cli-imports.yaml
  • tests/test-cases/auth-validation.yaml
  • tests/test-cases/help-and-usage.yaml
  • tests/test-cases/workflows.yaml
  • tests/test-cases/yaml-unsupported-tags/multiple-unsupported.yaml
  • website/blog/2026-04-03-aws-security-compliance.mdx
  • website/blog/2026-06-05-secrets-management.mdx
  • website/blog/2026-06-27-background-container-services.mdx
  • website/blog/2026-06-30-atmos-demo-workflows.mdx
  • website/blog/2026-07-02-path-based-custom-commands.mdx
  • website/docs/ai/agent-skills.mdx
  • website/docs/ai/ai.mdx
  • website/docs/ai/skill-marketplace.mdx
  • website/docs/cli/cli.mdx
  • website/docs/cli/commands/about.mdx
  • website/docs/cli/commands/ai/ask.mdx
  • website/docs/cli/commands/ai/chat.mdx
  • website/docs/cli/commands/ai/exec.mdx
  • website/docs/cli/commands/ai/sessions.mdx
  • website/docs/cli/commands/ai/skill.mdx
  • website/docs/cli/commands/ai/usage.mdx
  • website/docs/cli/commands/ansible/ansible-playbook.mdx
  • website/docs/cli/commands/ansible/ansible-version.mdx
  • website/docs/cli/commands/ansible/usage.mdx
  • website/docs/cli/commands/atlantis/atlantis-generate-repo-config.mdx
  • website/docs/cli/commands/atlantis/usage.mdx
  • website/docs/cli/commands/auth/auth-env.mdx
  • website/docs/cli/commands/auth/auth-exec.mdx
  • website/docs/cli/commands/auth/auth-list.mdx
  • website/docs/cli/commands/auth/auth-login.mdx
  • website/docs/cli/commands/auth/auth-shell.mdx
  • website/docs/cli/commands/auth/auth-validate.mdx
  • website/docs/cli/commands/auth/auth-whoami.mdx
  • website/docs/cli/commands/auth/console.mdx
  • website/docs/cli/commands/auth/logout.mdx
  • website/docs/cli/commands/auth/usage.mdx
  • website/docs/cli/commands/auth/user/configure.mdx
  • website/docs/cli/commands/aws/compliance/compliance.mdx
  • website/docs/cli/commands/aws/compliance/report.mdx
  • website/docs/cli/commands/aws/ecr-login.mdx
  • website/docs/cli/commands/aws/eks/eks.mdx
  • website/docs/cli/commands/aws/eks/update-kubeconfig.mdx
  • website/docs/cli/commands/aws/security/analyze.mdx
  • website/docs/cli/commands/aws/security/security.mdx
  • website/docs/cli/commands/aws/usage.mdx
  • website/docs/cli/commands/cast/_category_.json
  • website/docs/cli/commands/cast/play.mdx
  • website/docs/cli/commands/cast/render.mdx
  • website/docs/cli/commands/cast/usage.mdx
  • website/docs/cli/commands/ci/cache/delete.mdx
  • website/docs/cli/commands/ci/cache/list.mdx
  • website/docs/cli/commands/ci/cache/paths.mdx
  • website/docs/cli/commands/ci/cache/restore.mdx
  • website/docs/cli/commands/ci/cache/save.mdx
  • website/docs/cli/commands/ci/status.mdx
  • website/docs/cli/commands/commands.mdx
  • website/docs/cli/commands/completion.mdx
  • website/docs/cli/commands/composition/_category_.json
  • website/docs/cli/commands/composition/usage.mdx
  • website/docs/cli/commands/container/usage.mdx
  • website/docs/cli/commands/describe/describe-affected.mdx
  • website/docs/cli/commands/describe/describe-component.mdx
  • website/docs/cli/commands/describe/describe-config.mdx
  • website/docs/cli/commands/describe/describe-dependents.mdx
  • website/docs/cli/commands/describe/describe-locals.mdx
  • website/docs/cli/commands/describe/describe-stacks.mdx
  • website/docs/cli/commands/describe/describe-workflows.mdx
  • website/docs/cli/commands/describe/usage.mdx
  • website/docs/cli/commands/devcontainer/attach.mdx
  • website/docs/cli/commands/devcontainer/config.mdx
  • website/docs/cli/commands/devcontainer/devcontainer.mdx
  • website/docs/cli/commands/devcontainer/exec.mdx
  • website/docs/cli/commands/devcontainer/list.mdx
  • website/docs/cli/commands/devcontainer/logs.mdx
  • website/docs/cli/commands/devcontainer/rebuild.mdx
  • website/docs/cli/commands/devcontainer/remove.mdx
  • website/docs/cli/commands/devcontainer/shell.mdx
  • website/docs/cli/commands/devcontainer/start.mdx
  • website/docs/cli/commands/devcontainer/stop.mdx
  • website/docs/cli/commands/docs/docs-generate.mdx
  • website/docs/cli/commands/docs/usage.mdx
  • website/docs/cli/commands/emulator/down.mdx
  • website/docs/cli/commands/emulator/exec.mdx
  • website/docs/cli/commands/emulator/list.mdx
  • website/docs/cli/commands/emulator/logs.mdx
  • website/docs/cli/commands/emulator/ps.mdx
  • website/docs/cli/commands/emulator/reset.mdx
  • website/docs/cli/commands/emulator/up.mdx
  • website/docs/cli/commands/emulator/usage.mdx
  • website/docs/cli/commands/env.mdx
  • website/docs/cli/commands/git/git-clean.mdx
  • website/docs/cli/commands/git/git-clone.mdx
  • website/docs/cli/commands/git/git-commit.mdx
  • website/docs/cli/commands/git/git-diff.mdx
  • website/docs/cli/commands/git/git-init.mdx
  • website/docs/cli/commands/git/git-list.mdx
  • website/docs/cli/commands/git/git-pull.mdx
  • website/docs/cli/commands/git/git-push.mdx
  • website/docs/cli/commands/git/git-status.mdx
  • website/docs/cli/commands/git/hooks/install.mdx
  • website/docs/cli/commands/git/hooks/run.mdx
  • website/docs/cli/commands/git/hooks/uninstall.mdx
  • website/docs/cli/commands/git/usage.mdx
  • website/docs/cli/commands/helmfile/helmfile-generate-varfile.mdx
  • website/docs/cli/commands/helmfile/source/delete.mdx
  • website/docs/cli/commands/helmfile/source/describe.mdx
  • website/docs/cli/commands/helmfile/source/list.mdx
  • website/docs/cli/commands/helmfile/source/pull.mdx
  • website/docs/cli/commands/helmfile/source/source.mdx
  • website/docs/cli/commands/helmfile/usage.mdx
  • website/docs/cli/commands/help.mdx
  • website/docs/cli/commands/kubernetes/kubernetes-apply.mdx
  • website/docs/cli/commands/kubernetes/kubernetes-delete.mdx
  • website/docs/cli/commands/kubernetes/kubernetes-deploy.mdx
  • website/docs/cli/commands/kubernetes/kubernetes-diff.mdx
  • website/docs/cli/commands/kubernetes/kubernetes-render.mdx
  • website/docs/cli/commands/kubernetes/kubernetes-validate.mdx
  • website/docs/cli/commands/list/list-affected.mdx
  • website/docs/cli/commands/list/list-components.mdx
  • website/docs/cli/commands/list/list-dependencies.mdx
  • website/docs/cli/commands/list/list-instances.mdx
  • website/docs/cli/commands/list/list-metadata.mdx
  • website/docs/cli/commands/list/list-settings.mdx
  • website/docs/cli/commands/list/list-sources.mdx
  • website/docs/cli/commands/list/list-stacks.mdx
  • website/docs/cli/commands/list/list-values.mdx
  • website/docs/cli/commands/list/list-vars.mdx
  • website/docs/cli/commands/list/list-vendor.mdx
  • website/docs/cli/commands/list/list-workflows.mdx
  • website/docs/cli/commands/list/themes.mdx
  • website/docs/cli/commands/list/usage.mdx
  • website/docs/cli/commands/lsp/start.mdx
  • website/docs/cli/commands/mcp/export.mdx
  • website/docs/cli/commands/mcp/list.mdx
  • website/docs/cli/commands/mcp/restart.mdx
  • website/docs/cli/commands/mcp/start.mdx
  • website/docs/cli/commands/mcp/status.mdx
  • website/docs/cli/commands/mcp/test.mdx
  • website/docs/cli/commands/mcp/tools.mdx
  • website/docs/cli/commands/packer/source/delete.mdx
  • website/docs/cli/commands/packer/source/describe.mdx
  • website/docs/cli/commands/packer/source/list.mdx
  • website/docs/cli/commands/packer/source/pull.mdx
  • website/docs/cli/commands/packer/source/source.mdx
  • website/docs/cli/commands/packer/usage.mdx
  • website/docs/cli/commands/pro/pro-commit.mdx
  • website/docs/cli/commands/pro/pro-lock.mdx
  • website/docs/cli/commands/pro/pro-unlock.mdx
  • website/docs/cli/commands/pro/usage.mdx
  • website/docs/cli/commands/profile/profile-list.mdx
  • website/docs/cli/commands/profile/profile-show.mdx
  • website/docs/cli/commands/profile/usage.mdx
  • website/docs/cli/commands/secret/delete.mdx
  • website/docs/cli/commands/secret/exec.mdx
  • website/docs/cli/commands/secret/get.mdx
  • website/docs/cli/commands/secret/import.mdx
  • website/docs/cli/commands/secret/init.mdx
  • website/docs/cli/commands/secret/keygen.mdx
  • website/docs/cli/commands/secret/list.mdx
  • website/docs/cli/commands/secret/pull.mdx
  • website/docs/cli/commands/secret/push.mdx
  • website/docs/cli/commands/secret/set.mdx
  • website/docs/cli/commands/secret/shell.mdx
  • website/docs/cli/commands/secret/usage.mdx
  • website/docs/cli/commands/secret/validate.mdx
  • website/docs/cli/commands/support.mdx
  • website/docs/cli/commands/terraform/cache/cache.mdx
  • website/docs/cli/commands/terraform/cache/delete.mdx
  • website/docs/cli/commands/terraform/cache/list.mdx
  • website/docs/cli/commands/terraform/cache/mirror.mdx
  • website/docs/cli/commands/terraform/cache/prune.mdx
  • website/docs/cli/commands/terraform/cache/stats.mdx
  • website/docs/cli/commands/terraform/cache/trust.mdx
  • website/docs/cli/commands/terraform/cache/untrust.mdx
  • website/docs/cli/commands/terraform/generate/backend.mdx
  • website/docs/cli/commands/terraform/generate/backends.mdx
  • website/docs/cli/commands/terraform/generate/files.mdx
  • website/docs/cli/commands/terraform/generate/generate.mdx
  • website/docs/cli/commands/terraform/generate/planfile.mdx
  • website/docs/cli/commands/terraform/generate/varfile.mdx
  • website/docs/cli/commands/terraform/generate/varfiles.mdx
  • website/docs/cli/commands/terraform/providers/lock.mdx
  • website/docs/cli/commands/terraform/providers/mirror.mdx
  • website/docs/cli/commands/terraform/providers/providers.mdx
  • website/docs/cli/commands/terraform/providers/schema.mdx
  • website/docs/cli/commands/terraform/source/delete.mdx
  • website/docs/cli/commands/terraform/source/describe.mdx
  • website/docs/cli/commands/terraform/source/list.mdx
  • website/docs/cli/commands/terraform/source/pull.mdx
  • website/docs/cli/commands/terraform/source/source.mdx
  • website/docs/cli/commands/terraform/state/list.mdx
  • website/docs/cli/commands/terraform/state/mv.mdx
  • website/docs/cli/commands/terraform/state/pull.mdx
  • website/docs/cli/commands/terraform/state/push.mdx
  • website/docs/cli/commands/terraform/state/replace-provider.mdx
  • website/docs/cli/commands/terraform/state/rm.mdx
  • website/docs/cli/commands/terraform/state/show.mdx
  • website/docs/cli/commands/terraform/state/state.mdx
  • website/docs/cli/commands/terraform/terraform-apply.mdx
  • website/docs/cli/commands/terraform/terraform-backend.mdx
  • website/docs/cli/commands/terraform/terraform-clean.mdx
  • website/docs/cli/commands/terraform/terraform-console.mdx
  • website/docs/cli/commands/terraform/terraform-deploy.mdx
  • website/docs/cli/commands/terraform/terraform-destroy.mdx
  • website/docs/cli/commands/terraform/terraform-fmt.mdx
  • website/docs/cli/commands/terraform/terraform-force-unlock.mdx
  • website/docs/cli/commands/terraform/terraform-get.mdx
  • website/docs/cli/commands/terraform/terraform-graph.mdx
  • website/docs/cli/commands/terraform/terraform-import.mdx
  • website/docs/cli/commands/terraform/terraform-init.mdx
  • website/docs/cli/commands/terraform/terraform-login.mdx
  • website/docs/cli/commands/terraform/terraform-logout.mdx
  • website/docs/cli/commands/terraform/terraform-metadata.mdx
  • website/docs/cli/commands/terraform/terraform-modules.mdx
  • website/docs/cli/commands/terraform/terraform-output.mdx
  • website/docs/cli/commands/terraform/terraform-plan-diff.mdx
  • website/docs/cli/commands/terraform/terraform-plan.mdx
  • website/docs/cli/commands/terraform/terraform-providers.mdx
  • website/docs/cli/commands/terraform/terraform-refresh.mdx
  • website/docs/cli/commands/terraform/terraform-shell.mdx
  • website/docs/cli/commands/terraform/terraform-show.mdx
  • website/docs/cli/commands/terraform/terraform-state.mdx
  • website/docs/cli/commands/terraform/terraform-taint.mdx
  • website/docs/cli/commands/terraform/terraform-test.mdx
  • website/docs/cli/commands/terraform/terraform-untaint.mdx
  • website/docs/cli/commands/terraform/terraform-validate.mdx
  • website/docs/cli/commands/terraform/terraform-version.mdx
  • website/docs/cli/commands/terraform/terraform-workspace.mdx
  • website/docs/cli/commands/terraform/usage.mdx
  • website/docs/cli/commands/terraform/workdir/clean.mdx
  • website/docs/cli/commands/terraform/workdir/describe.mdx
  • website/docs/cli/commands/terraform/workdir/list.mdx
  • website/docs/cli/commands/terraform/workdir/show.mdx
  • website/docs/cli/commands/terraform/workdir/workdir.mdx
  • website/docs/cli/commands/terraform/workspace/delete.mdx
  • website/docs/cli/commands/terraform/workspace/list.mdx
  • website/docs/cli/commands/terraform/workspace/new.mdx
  • website/docs/cli/commands/terraform/workspace/select.mdx
  • website/docs/cli/commands/terraform/workspace/show.mdx
  • website/docs/cli/commands/terraform/workspace/workspace.mdx
  • website/docs/cli/commands/theme/list.mdx
  • website/docs/cli/commands/theme/show.mdx
  • website/docs/cli/commands/theme/usage.mdx
  • website/docs/cli/commands/toolchain/registry/list.mdx
  • website/docs/cli/commands/toolchain/registry/search.mdx
  • website/docs/cli/commands/toolchain/registry/usage.mdx
  • website/docs/cli/commands/toolchain/toolchain-add.mdx
  • website/docs/cli/commands/toolchain/toolchain-aliases.mdx
  • website/docs/cli/commands/toolchain/toolchain-clean.mdx
  • website/docs/cli/commands/toolchain/toolchain-du.mdx
  • website/docs/cli/commands/toolchain/toolchain-env.mdx
  • website/docs/cli/commands/toolchain/toolchain-exec.mdx
  • website/docs/cli/commands/toolchain/toolchain-get.mdx
  • website/docs/cli/commands/toolchain/toolchain-info.mdx
  • website/docs/cli/commands/toolchain/toolchain-install.mdx
  • website/docs/cli/commands/toolchain/toolchain-list.mdx
  • website/docs/cli/commands/toolchain/toolchain-path.mdx
  • website/docs/cli/commands/toolchain/toolchain-remove.mdx
  • website/docs/cli/commands/toolchain/toolchain-search.mdx
  • website/docs/cli/commands/toolchain/toolchain-set.mdx
  • website/docs/cli/commands/toolchain/toolchain-uninstall.mdx
  • website/docs/cli/commands/toolchain/toolchain-versions.mdx
  • website/docs/cli/commands/toolchain/toolchain-which.mdx
  • website/docs/cli/commands/toolchain/usage.mdx
  • website/docs/cli/commands/validate/usage.mdx
  • website/docs/cli/commands/validate/validate-component.mdx
  • website/docs/cli/commands/validate/validate-editorconfig.mdx
  • website/docs/cli/commands/validate/validate-schema.mdx
  • website/docs/cli/commands/validate/validate-stacks.mdx
  • website/docs/cli/commands/vendor/usage.mdx
  • website/docs/cli/commands/vendor/vendor-pull.mdx
  • website/docs/cli/commands/version/list.mdx
  • website/docs/cli/commands/version/show.mdx
  • website/docs/cli/commands/version/usage.mdx
  • website/docs/cli/commands/workflow.mdx
  • website/docs/cli/configuration/ai/index.mdx
  • website/docs/cli/configuration/ai/providers.mdx
  • website/docs/cli/configuration/ai/skills.mdx
  • website/docs/cli/configuration/auth/index.mdx
  • website/docs/cli/configuration/commands/command/commands.mdx
  • website/docs/cli/configuration/commands/command/steps.mdx
  • website/docs/cli/configuration/configuration.mdx
  • website/docs/cli/configuration/stacks/index.mdx
  • website/docs/cli/environment-variables.mdx
  • website/docs/cli/global-flags.mdx
  • website/docs/components/container.mdx
  • website/docs/components/emulator.mdx
  • website/docs/learn/mindset.mdx
  • website/docs/quick-start/simple/configure-cli.mdx
  • website/docs/quick-start/simple/write-components.mdx
  • website/docs/stacks/components/emulator.mdx
  • website/docs/workflows/workflows/workflow/steps/index.mdx
  • website/docs/workflows/workflows/workflow/steps/type/cast.mdx
  • website/docs/workflows/workflows/workflow/steps/type/toast.mdx
  • website/docusaurus.config.js
  • website/package.json
  • website/plugins/file-browser/index.js
  • website/src/components/CastPlayer/index.tsx
  • website/src/components/CastPlayer/playback.mjs
  • website/src/components/CastPlayer/playback.test.mjs
  • website/src/components/CastPlayer/styles.module.css
  • website/src/components/EmbedExample/index.tsx
  • website/src/components/EmbedExample/styles.module.css
  • website/src/components/FileBrowser/DirectoryPage.tsx
  • website/src/components/FileBrowser/FileViewer.tsx
  • website/src/components/FileBrowser/IndexPage.tsx
  • website/src/components/FileBrowser/styles.module.css
  • website/src/components/FileBrowser/types.ts
  • website/src/components/Screengrab/index.tsx
  • website/src/components/Screengrabs/atmos--help.html
  • website/src/components/Screengrabs/atmos-about--help.html
  • website/src/components/Screengrabs/atmos-about.html
  • website/src/components/Screengrabs/atmos-ai--help.html
  • website/src/components/Screengrabs/atmos-ai-ask--help.html
  • website/src/components/Screengrabs/atmos-ai-chat--help.html
  • website/src/components/Screengrabs/atmos-ai-exec--help.html
  • website/src/components/Screengrabs/atmos-ai-sessions--help.html
  • website/src/components/Screengrabs/atmos-ai-skill--help.html
  • website/src/components/Screengrabs/atmos-atlantis--help.html
  • website/src/components/Screengrabs/atmos-atlantis-generate--help.html
  • website/src/components/Screengrabs/atmos-atlantis-generate-repo-config--help.html
  • website/src/components/Screengrabs/atmos-auth--help.html
  • website/src/components/Screengrabs/atmos-auth-console--help.html
  • website/src/components/Screengrabs/atmos-auth-env--help.html
  • website/src/components/Screengrabs/atmos-auth-exec--help.html
  • website/src/components/Screengrabs/atmos-auth-list--help.html
  • website/src/components/Screengrabs/atmos-auth-login--help.html
  • website/src/components/Screengrabs/atmos-auth-logout--help.html
  • website/src/components/Screengrabs/atmos-auth-shell--help.html
  • website/src/components/Screengrabs/atmos-auth-user--help.html
  • website/src/components/Screengrabs/atmos-auth-user-configure--help.html
  • website/src/components/Screengrabs/atmos-auth-validate--help.html
  • website/src/components/Screengrabs/atmos-auth-whoami--help.html
  • website/src/components/Screengrabs/atmos-aws--help.html
  • website/src/components/Screengrabs/atmos-aws-compliance--help.html
  • website/src/components/Screengrabs/atmos-aws-compliance-report--help.html
  • website/src/components/Screengrabs/atmos-aws-eks--help.html
  • website/src/components/Screengrabs/atmos-aws-eks-update-kubeconfig--help.html
  • website/src/components/Screengrabs/atmos-aws-security--help.html
  • website/src/components/Screengrabs/atmos-aws-security-analyze--help.html
  • website/src/components/Screengrabs/atmos-completion--help.html
  • website/src/components/Screengrabs/atmos-completion-bash.html
  • website/src/components/Screengrabs/atmos-completion-fish.html
  • website/src/components/Screengrabs/atmos-completion-powershell.html
  • website/src/components/Screengrabs/atmos-completion-zsh.html
  • website/src/components/Screengrabs/atmos-describe--help.html
  • website/src/components/Screengrabs/atmos-describe-affected--help.html
  • website/src/components/Screengrabs/atmos-describe-component--help.html
  • website/src/components/Screengrabs/atmos-describe-config--help.html
  • website/src/components/Screengrabs/atmos-describe-dependents--help.html
  • website/src/components/Screengrabs/atmos-describe-stacks--help.html
  • website/src/components/Screengrabs/atmos-describe-workflows--help.html
  • website/src/components/Screengrabs/atmos-docs--help.html
  • website/src/components/Screengrabs/atmos-docs-generate--help.html
  • website/src/components/Screengrabs/atmos-env--help.html
  • website/src/components/Screengrabs/atmos-helmfile--help.html
  • website/src/components/Screengrabs/atmos-helmfile-generate--help.html
  • website/src/components/Screengrabs/atmos-helmfile-generate-varfile--help.html
  • website/src/components/Screengrabs/atmos-list--help.html
  • website/src/components/Screengrabs/atmos-list-components--help.html
  • website/src/components/Screengrabs/atmos-list-metadata--help.html
  • website/src/components/Screengrabs/atmos-list-settings--help.html
  • website/src/components/Screengrabs/atmos-list-stacks--help.html
  • website/src/components/Screengrabs/atmos-list-values--help.html
  • website/src/components/Screengrabs/atmos-list-vars--help.html
  • website/src/components/Screengrabs/atmos-list-workflows--help.html
  • website/src/components/Screengrabs/atmos-lsp--help.html
  • website/src/components/Screengrabs/atmos-lsp-start--help.html
  • website/src/components/Screengrabs/atmos-mcp--help.html
  • website/src/components/Screengrabs/atmos-mcp-start--help.html
  • website/src/components/Screengrabs/atmos-packer--help.html
  • website/src/components/Screengrabs/atmos-packer-build--help.html
  • website/src/components/Screengrabs/atmos-packer-init--help.html
  • website/src/components/Screengrabs/atmos-packer-inspect--help.html
  • website/src/components/Screengrabs/atmos-packer-output--help.html
  • website/src/components/Screengrabs/atmos-packer-validate--help.html
  • website/src/components/Screengrabs/atmos-packer-version--help.html
  • website/src/components/Screengrabs/atmos-pro-lock--help.html
  • website/src/components/Screengrabs/atmos-pro-unlock--help.html
  • website/src/components/Screengrabs/atmos-profile--help.html
  • website/src/components/Screengrabs/atmos-profile-list--help.html
  • website/src/components/Screengrabs/atmos-profile-list.html
  • website/src/components/Screengrabs/atmos-profile-show--help.html
  • website/src/components/Screengrabs/atmos-support--help.html
  • website/src/components/Screengrabs/atmos-support.html
  • website/src/components/Screengrabs/atmos-terraform--help.html
  • website/src/components/Screengrabs/atmos-terraform-apply--help.html
  • website/src/components/Screengrabs/atmos-terraform-backend--help.html
  • website/src/components/Screengrabs/atmos-terraform-backend-create--help.html
  • website/src/components/Screengrabs/atmos-terraform-backend-delete--help.html
  • website/src/components/Screengrabs/atmos-terraform-backend-describe--help.html
  • website/src/components/Screengrabs/atmos-terraform-backend-list--help.html
  • website/src/components/Screengrabs/atmos-terraform-backend-update--help.html
  • website/src/components/Screengrabs/atmos-terraform-clean--help.html
  • website/src/components/Screengrabs/atmos-terraform-console--help.html
  • website/src/components/Screengrabs/atmos-terraform-deploy--help.html
  • website/src/components/Screengrabs/atmos-terraform-destroy--help.html
  • website/src/components/Screengrabs/atmos-terraform-fmt--help.html
  • website/src/components/Screengrabs/atmos-terraform-force-unlock--help.html
  • website/src/components/Screengrabs/atmos-terraform-generate--help.html
  • website/src/components/Screengrabs/atmos-terraform-generate-backend--help.html
  • website/src/components/Screengrabs/atmos-terraform-generate-backends--help.html
  • website/src/components/Screengrabs/atmos-terraform-generate-planfile--help.html
  • website/src/components/Screengrabs/atmos-terraform-generate-varfile--help.html
  • website/src/components/Screengrabs/atmos-terraform-generate-varfiles--help.html
  • website/src/components/Screengrabs/atmos-terraform-get--help.html
  • website/src/components/Screengrabs/atmos-terraform-graph--help.html
  • website/src/components/Screengrabs/atmos-terraform-import--help.html
  • website/src/components/Screengrabs/atmos-terraform-init--help.html
  • website/src/components/Screengrabs/atmos-terraform-login--help.html
  • website/src/components/Screengrabs/atmos-terraform-logout--help.html
  • website/src/components/Screengrabs/atmos-terraform-metadata--help.html
  • website/src/components/Screengrabs/atmos-terraform-modules--help.html
  • website/src/components/Screengrabs/atmos-terraform-output--help.html
  • website/src/components/Screengrabs/atmos-terraform-plan--help.html
  • website/src/components/Screengrabs/atmos-terraform-plan-diff--help.html
  • website/src/components/Screengrabs/atmos-terraform-providers--help.html
  • website/src/components/Screengrabs/atmos-terraform-providers-lock--help.html
  • website/src/components/Screengrabs/atmos-terraform-providers-mirror--help.html
  • website/src/components/Screengrabs/atmos-terraform-providers-schema--help.html
  • website/src/components/Screengrabs/atmos-terraform-refresh--help.html
  • website/src/components/Screengrabs/atmos-terraform-shell--help.html
  • website/src/components/Screengrabs/atmos-terraform-show--help.html
  • website/src/components/Screengrabs/atmos-terraform-state--help.html
  • website/src/components/Screengrabs/atmos-terraform-state-list--help.html
  • website/src/components/Screengrabs/atmos-terraform-state-mv--help.html
  • website/src/components/Screengrabs/atmos-terraform-state-pull--help.html
  • website/src/components/Screengrabs/atmos-terraform-state-push--help.html
  • website/src/components/Screengrabs/atmos-terraform-state-replace-provider--help.html
  • website/src/components/Screengrabs/atmos-terraform-state-rm--help.html
  • website/src/components/Screengrabs/atmos-terraform-state-show--help.html
  • website/src/components/Screengrabs/atmos-terraform-taint--help.html
  • website/src/components/Screengrabs/atmos-terraform-test--help.html
  • website/src/components/Screengrabs/atmos-terraform-untaint--help.html
  • website/src/components/Screengrabs/atmos-terraform-validate--help.html
  • website/src/components/Screengrabs/atmos-terraform-version--help.html
  • website/src/components/Screengrabs/atmos-terraform-workspace--help.html
  • website/src/components/Screengrabs/atmos-terraform-workspace-delete--help.html
  • website/src/components/Screengrabs/atmos-terraform-workspace-list--help.html
  • website/src/components/Screengrabs/atmos-terraform-workspace-new--help.html
  • website/src/components/Screengrabs/atmos-terraform-workspace-select--help.html
  • website/src/components/Screengrabs/atmos-terraform-workspace-show--help.html
  • website/src/components/Screengrabs/atmos-theme--help.html
  • website/src/components/Screengrabs/atmos-theme-list--help.html
  • website/src/components/Screengrabs/atmos-theme-show--help.html
  • website/src/components/Screengrabs/atmos-toolchain--help.html
  • website/src/components/Screengrabs/atmos-toolchain-add--help.html
  • website/src/components/Screengrabs/atmos-toolchain-aliases--help.html
  • website/src/components/Screengrabs/atmos-toolchain-clean--help.html
  • website/src/components/Screengrabs/atmos-toolchain-exec--help.html
  • website/src/components/Screengrabs/atmos-toolchain-get--help.html
  • website/src/components/Screengrabs/atmos-toolchain-info--help.html
  • website/src/components/Screengrabs/atmos-toolchain-install--help.html
  • website/src/components/Screengrabs/atmos-toolchain-list--help.html
  • website/src/components/Screengrabs/atmos-toolchain-path--help.html
  • website/src/components/Screengrabs/atmos-toolchain-remove--help.html
  • website/src/components/Screengrabs/atmos-toolchain-run--help.html
  • website/src/components/Screengrabs/atmos-toolchain-set--help.html
  • website/src/components/Screengrabs/atmos-toolchain-uninstall--help.html
  • website/src/components/Screengrabs/atmos-toolchain-versions--help.html
  • website/src/components/Screengrabs/atmos-toolchain-which--help.html
  • website/src/components/Screengrabs/atmos-validate--help.html
  • website/src/components/Screengrabs/atmos-validate-component--help.html
  • website/src/components/Screengrabs/atmos-validate-editorconfig--help.html
  • website/src/components/Screengrabs/atmos-validate-schema--help.html
  • website/src/components/Screengrabs/atmos-validate-stacks--help.html
  • website/src/components/Screengrabs/atmos-vendor--help.html
  • website/src/components/Screengrabs/atmos-vendor-pull--help.html
  • website/src/components/Screengrabs/atmos-version--help.html
  • website/src/components/Screengrabs/atmos-version-list--help.html
  • website/src/components/Screengrabs/atmos-version-show--help.html
  • website/src/components/Screengrabs/atmos-version.html
  • website/src/components/Screengrabs/atmos-workflow--help.html
  • website/src/components/Screengrabs/demo-stacks/define-your-stacks.html
  • website/src/components/Screengrabs/demo-stacks/deploy-dev.html
  • website/src/components/Screengrabs/demo-stacks/deploy-prod.html
  • website/src/components/Screengrabs/demo-stacks/deploy-staging.html
  • website/src/components/Screengrabs/demo-stacks/deploy.html
  • website/src/components/Screengrabs/demo-stacks/start-your-project.html
  • website/src/components/Screengrabs/demo-stacks/write-your-components.html
  • website/src/components/Screengrabs/final-test.html
  • website/src/components/Screengrabs/test-final.html
  • website/src/components/Screengrabs/test-list-vars.html
  • website/src/components/Screengrabs/tree-CAF--gitignore.html
  • website/src/components/Screengrabs/tree.html
  • website/src/components/frontmatter.ts
  • website/src/components/landing/DemoVideo/index.js
  • website/src/data/roadmap.js
  • website/src/pages/cast-demo.module.css
  • website/src/pages/cast-demo.tsx
  • website/static/casts/cli/commands/cast/play.cast
  • website/static/casts/cli/commands/cast/render.cast
  • website/static/casts/cli/commands/cast/usage.cast
  • website/static/casts/demo/fixtures/basic/describe-component.cast
  • website/static/casts/demo/fixtures/basic/describe-stacks.cast
  • website/static/casts/demo/fixtures/basic/list-stacks.cast
  • website/static/casts/demo/fixtures/demo-vendoring/pull.cast
  • website/static/casts/demo/fixtures/native-terraform/deploy.cast
  • website/static/casts/demo/fixtures/native-terraform/output.cast
  • website/static/casts/demo/fixtures/native-terraform/plan.cast
  • website/static/casts/examples/auth-stores/identity-backed-stores.cast
  • website/static/casts/examples/background-steps/service.cast
  • website/static/casts/examples/caching/registry-cache.cast
  • website/static/casts/examples/compositions/validate.cast
  • website/static/casts/examples/config-profiles/list-and-show.cast
  • website/static/casts/examples/container-component/lifecycle.cast
  • website/static/casts/examples/container-sandbox/sandbox.cast
  • website/static/casts/examples/container-step/build-run.cast
  • website/static/casts/examples/custom-commands/hello-greet.cast
  • website/static/casts/examples/custom-components/script-command.cast
  • website/static/casts/examples/demo-ansible/playbook.cast
  • website/static/casts/examples/demo-atlantis/repo-config.cast
  • website/static/casts/examples/demo-auth/auth-list.cast
  • website/static/casts/examples/demo-component-versions/vendor-versions.cast
  • website/static/casts/examples/demo-context/name-template.cast
  • website/static/casts/examples/demo-env/masked-token.cast
  • website/static/casts/examples/demo-helmfile/lifecycle.cast
  • website/static/casts/examples/demo-library/modules.cast
  • website/static/casts/examples/demo-schemas/validate.cast
  • website/static/casts/examples/demo-stacks/inheritance.cast
  • website/static/casts/examples/demo-workflows/deploy.cast
  • website/static/casts/examples/devcontainer-build/build-config.cast
  • website/static/casts/examples/devcontainer/config.cast
  • website/static/casts/examples/emulator-aws/lifecycle.cast
  • website/static/casts/examples/emulator-k8s/lifecycle.cast
  • website/static/casts/examples/generate-files/component-files.cast
  • website/static/casts/examples/gitops/reconcile.cast
  • website/static/casts/examples/helm/lifecycle.cast
  • website/static/casts/examples/hooks-checkov/security-scan.cast
  • website/static/casts/examples/hooks-custom-command/hook-config.cast
  • website/static/casts/examples/hooks-infracost/cost-summary.cast
  • website/static/casts/examples/hooks-kics/security-scan.cast
  • website/static/casts/examples/hooks-trivy/security-scan.cast
  • website/static/casts/examples/http-webhooks/local-endpoints.cast
  • website/static/casts/examples/interactive-workflows/table-and-build.cast
  • website/static/casts/examples/kubernetes/lifecycle.cast
  • website/static/casts/examples/kustomize/lifecycle.cast
  • website/static/casts/examples/local-gitops/lifecycle.cast
  • website/static/casts/examples/locals/structured-values.cast
  • website/static/casts/examples/onepassword-secrets/connect-mock.cast
  • website/static/casts/examples/parallel-steps/control-steps.cast
  • website/static/casts/examples/quick-start-advanced/list-instances.cast
  • website/static/casts/examples/quick-start-simple/list-and-plan.cast
  • website/static/casts/examples/remote-stack-imports/remote-vars.cast
  • website/static/casts/examples/say-something/pipeline.cast
  • website/static/casts/examples/secrets-masking/masked-plan.cast
  • website/static/casts/examples/sops-secrets/secret-lifecycle.cast
  • website/static/casts/examples/source-provisioning/sources.cast
  • website/static/casts/examples/stack-names/explicit-names.cast
  • website/static/casts/examples/terraform-tests/stack-discovery.cast
  • website/static/casts/examples/toolchain/demo-convert.cast
  • website/static/casts/examples/workflow-retries/retry-failure.cast
  • website/static/casts/screengrabs/atmos--help.cast
  • website/static/casts/screengrabs/atmos-about--help.cast
  • website/static/casts/screengrabs/atmos-about.cast
  • website/static/casts/screengrabs/atmos-ai--help.cast
  • website/static/casts/screengrabs/atmos-ai-ask--help.cast
  • website/static/casts/screengrabs/atmos-ai-chat--help.cast
  • website/static/casts/screengrabs/atmos-ai-exec--help.cast
  • website/static/casts/screengrabs/atmos-ai-sessions--help.cast
  • website/static/casts/screengrabs/atmos-ai-skill--help.cast
  • website/static/casts/screengrabs/atmos-ansible--help.cast
  • website/static/casts/screengrabs/atmos-ansible-playbook--help.cast
  • website/static/casts/screengrabs/atmos-ansible-version--help.cast
  • website/static/casts/screengrabs/atmos-atlantis--help.cast
  • website/static/casts/screengrabs/atmos-atlantis-generate--help.cast
  • website/static/casts/screengrabs/atmos-atlantis-generate-repo-config--help.cast
  • website/static/casts/screengrabs/atmos-auth--help.cast
  • website/static/casts/screengrabs/atmos-auth-console--help.cast
  • website/static/casts/screengrabs/atmos-auth-env--help.cast
  • website/static/casts/screengrabs/atmos-auth-exec--help.cast
  • website/static/casts/screengrabs/atmos-auth-list--help.cast
  • website/static/casts/screengrabs/atmos-auth-login--help.cast
  • website/static/casts/screengrabs/atmos-auth-logout--help.cast
  • website/static/casts/screengrabs/atmos-auth-shell--help.cast
  • website/static/casts/screengrabs/atmos-auth-user--help.cast
  • website/static/casts/screengrabs/atmos-auth-user-configure--help.cast
  • website/static/casts/screengrabs/atmos-auth-validate--help.cast
  • website/static/casts/screengrabs/atmos-auth-whoami--help.cast
  • website/static/casts/screengrabs/atmos-aws--help.cast
  • website/static/casts/screengrabs/atmos-aws-compliance--help.cast
  • website/static/casts/screengrabs/atmos-aws-compliance-report--help.cast
  • website/static/casts/screengrabs/atmos-aws-ecr-login--help.cast
  • website/static/casts/screengrabs/atmos-aws-eks--help.cast
  • website/static/casts/screengrabs/atmos-aws-eks-update-kubeconfig--help.cast
  • website/static/casts/screengrabs/atmos-aws-security--help.cast
  • website/static/casts/screengrabs/atmos-aws-security-analyze--help.cast
  • website/static/casts/screengrabs/atmos-cast--help.cast
  • website/static/casts/screengrabs/atmos-cast-play--help.cast
  • website/static/casts/screengrabs/atmos-cast-render--help.cast
  • website/static/casts/screengrabs/atmos-ci-cache-delete--help.cast
  • website/static/casts/screengrabs/atmos-ci-cache-list--help.cast
  • website/static/casts/screengrabs/atmos-ci-cache-paths--help.cast
  • website/static/casts/screengrabs/atmos-ci-cache-restore--help.cast
  • website/static/casts/screengrabs/atmos-ci-cache-save--help.cast
  • website/static/casts/screengrabs/atmos-ci-status--help.cast
  • website/static/casts/screengrabs/atmos-completion--help.cast
  • website/static/casts/screengrabs/atmos-container--help.cast
  • website/static/casts/screengrabs/atmos-describe--help.cast
  • website/static/casts/screengrabs/atmos-describe-affected--help.cast
  • website/static/casts/screengrabs/atmos-describe-component--help.cast
  • website/static/casts/screengrabs/atmos-describe-config--help.cast
  • website/static/casts/screengrabs/atmos-describe-config.cast
  • website/static/casts/screengrabs/atmos-describe-dependents--help.cast
  • website/static/casts/screengrabs/atmos-describe-locals--help.cast
  • website/static/casts/screengrabs/atmos-describe-stacks--help.cast
  • website/static/casts/screengrabs/atmos-describe-workflows--help.cast
  • website/static/casts/screengrabs/atmos-devcontainer--help.cast
  • website/static/casts/screengrabs/atmos-devcontainer-attach--help.cast
  • website/static/casts/screengrabs/atmos-devcontainer-config--help.cast
  • website/static/casts/screengrabs/atmos-devcontainer-exec--help.cast
  • website/static/casts/screengrabs/atmos-devcontainer-list--help.cast
  • website/static/casts/screengrabs/atmos-devcontainer-logs--help.cast
  • website/static/casts/screengrabs/atmos-devcontainer-rebuild--help.cast
  • website/static/casts/screengrabs/atmos-devcontainer-remove--help.cast
  • website/static/casts/screengrabs/atmos-devcontainer-shell--help.cast
  • website/static/casts/screengrabs/atmos-devcontainer-start--help.cast
  • website/static/casts/screengrabs/atmos-devcontainer-stop--help.cast
  • website/static/casts/screengrabs/atmos-docs--help.cast
  • website/static/casts/screengrabs/atmos-docs-generate--help.cast
  • website/static/casts/screengrabs/atmos-emulator--help.cast
  • website/static/casts/screengrabs/atmos-emulator-down--help.cast
  • website/static/casts/screengrabs/atmos-emulator-exec--help.cast
  • website/static/casts/screengrabs/atmos-emulator-list--help.cast
  • website/static/casts/screengrabs/atmos-emulator-logs--help.cast
  • website/static/casts/screengrabs/atmos-emulator-ps--help.cast
  • website/static/casts/screengrabs/atmos-emulator-reset--help.cast
  • website/static/casts/screengrabs/atmos-emulator-up--help.cast
  • website/static/casts/screengrabs/atmos-env--help.cast
  • website/static/casts/screengrabs/atmos-git--help.cast
  • website/static/casts/screengrabs/atmos-git-clean--help.cast
  • website/static/casts/screengrabs/atmos-git-clone--help.cast
  • website/static/casts/screengrabs/atmos-git-commit--help.cast
  • website/static/casts/screengrabs/atmos-git-diff--help.cast
  • website/static/casts/screengrabs/atmos-git-hooks--help.cast
  • website/static/casts/screengrabs/atmos-git-hooks-install--help.cast
  • website/static/casts/screengrabs/atmos-git-hooks-run--help.cast
  • website/static/casts/screengrabs/atmos-git-hooks-uninstall--help.cast
  • website/static/casts/screengrabs/atmos-git-init--help.cast
  • website/static/casts/screengrabs/atmos-git-list--help.cast
  • website/static/casts/screengrabs/atmos-git-pull--help.cast
  • website/static/casts/screengrabs/atmos-git-push--help.cast
  • website/static/casts/screengrabs/atmos-git-status--help.cast
  • website/static/casts/screengrabs/atmos-helmfile--help.cast
  • website/static/casts/screengrabs/atmos-helmfile-generate--help.cast
  • website/static/casts/screengrabs/atmos-helmfile-generate-varfile--help.cast
  • website/static/casts/screengrabs/atmos-helmfile-source--help.cast
  • website/static/casts/screengrabs/atmos-helmfile-source-delete--help.cast
  • website/static/casts/screengrabs/atmos-helmfile-source-describe--help.cast
  • website/static/casts/screengrabs/atmos-helmfile-source-list--help.cast
  • website/static/casts/screengrabs/atmos-helmfile-source-pull--help.cast
  • website/static/casts/screengrabs/atmos-kubernetes-apply--help.cast
  • website/static/casts/screengrabs/atmos-kubernetes-delete--help.cast
  • website/static/casts/screengrabs/atmos-kubernetes-deploy--help.cast
  • website/static/casts/screengrabs/atmos-kubernetes-diff--help.cast
  • website/static/casts/screengrabs/atmos-kubernetes-render--help.cast
  • website/static/casts/screengrabs/atmos-kubernetes-validate--help.cast
  • website/static/casts/screengrabs/atmos-list--help.cast
  • website/static/casts/screengrabs/atmos-list-affected--help.cast
  • website/static/casts/screengrabs/atmos-list-components--help.cast
  • website/static/casts/screengrabs/atmos-list-dependencies--help.cast
  • website/static/casts/screengrabs/atmos-list-instances--help.cast
  • website/static/casts/screengrabs/atmos-list-metadata--help.cast
  • website/static/casts/screengrabs/atmos-list-settings--help.cast
  • website/static/casts/screengrabs/atmos-list-sources--help.cast
  • website/static/casts/screengrabs/atmos-list-stacks--help.cast
  • website/static/casts/screengrabs/atmos-list-themes--help.cast
  • website/static/casts/screengrabs/atmos-list-values--help.cast
  • website/static/casts/screengrabs/atmos-list-vars--help.cast
  • website/static/casts/screengrabs/atmos-list-vendor--help.cast
  • website/static/casts/screengrabs/atmos-list-workflows--help.cast
  • website/static/casts/screengrabs/atmos-lsp--help.cast
  • website/static/casts/screengrabs/atmos-lsp-start--help.cast
  • website/static/casts/screengrabs/atmos-mcp--help.cast
  • website/static/casts/screengrabs/atmos-mcp-export--help.cast
  • website/static/casts/screengrabs/atmos-mcp-list--help.cast
  • website/static/casts/screengrabs/atmos-mcp-restart--help.cast
  • website/static/casts/screengrabs/atmos-mcp-start--help.cast
  • website/static/casts/screengrabs/atmos-mcp-status--help.cast
  • website/static/casts/screengrabs/atmos-mcp-test--help.cast
  • website/static/casts/screengrabs/atmos-mcp-tools--help.cast
  • website/static/casts/screengrabs/atmos-packer--help.cast
  • website/static/casts/screengrabs/atmos-packer-build--help.cast
  • website/static/casts/screengrabs/atmos-packer-init--help.cast
  • website/static/casts/screengrabs/atmos-packer-inspect--help.cast
  • website/static/casts/screengrabs/atmos-packer-output--help.cast
  • website/static/casts/screengrabs/atmos-packer-source--help.cast
  • website/static/casts/screengrabs/atmos-packer-source-delete--help.cast
  • website/static/casts/screengrabs/atmos-packer-source-describe--help.cast
  • website/static/casts/screengrabs/atmos-packer-source-list--help.cast
  • website/static/casts/screengrabs/atmos-packer-source-pull--help.cast
  • website/static/casts/screengrabs/atmos-packer-validate--help.cast
  • website/static/casts/screengrabs/atmos-packer-version--help.cast
  • website/static/casts/screengrabs/atmos-pro-lock--help.cast
  • website/static/casts/screengrabs/atmos-pro-unlock--help.cast
  • website/static/casts/screengrabs/atmos-profile--help.cast
  • website/static/casts/screengrabs/atmos-profile-list--help.cast
  • website/static/casts/screengrabs/atmos-profile-list.cast
  • website/static/casts/screengrabs/atmos-profile-show--help.cast
  • website/static/casts/screengrabs/atmos-secret--help.cast
  • website/static/casts/screengrabs/atmos-secret-delete--help.cast
  • website/static/casts/screengrabs/atmos-secret-exec--help.cast
  • website/static/casts/screengrabs/atmos-secret-get--help.cast
  • website/static/casts/screengrabs/atmos-secret-import--help.cast
  • website/static/casts/screengrabs/atmos-secret-init--help.cast
  • website/static/casts/screengrabs/atmos-secret-keygen--help.cast
  • website/static/casts/screengrabs/atmos-secret-list--help.cast
  • website/static/casts/screengrabs/atmos-secret-pull--help.cast
  • website/static/casts/screengrabs/atmos-secret-push--help.cast
  • website/static/casts/screengrabs/atmos-secret-set--help.cast
  • website/static/casts/screengrabs/atmos-secret-shell--help.cast
  • website/static/casts/screengrabs/atmos-secret-validate--help.cast
  • website/static/casts/screengrabs/atmos-support--help.cast
  • website/static/casts/screengrabs/atmos-support.cast
  • website/static/casts/screengrabs/atmos-terraform--help.cast
  • website/static/casts/screengrabs/atmos-terraform-apply--help.cast
  • website/static/casts/screengrabs/atmos-terraform-backend--help.cast
  • website/static/casts/screengrabs/atmos-terraform-backend-create--help.cast
  • website/static/casts/screengrabs/atmos-terraform-backend-delete--help.cast
  • website/static/casts/screengrabs/atmos-terraform-backend-describe--help.cast
  • website/static/casts/screengrabs/atmos-terraform-backend-list--help.cast
  • website/static/casts/screengrabs/atmos-terraform-backend-update--help.cast
  • website/static/casts/screengrabs/atmos-terraform-cache--help.cast
  • website/static/casts/screengrabs/atmos-terraform-cache-delete--help.cast
  • website/static/casts/screengrabs/atmos-terraform-cache-list--help.cast
  • website/static/casts/screengrabs/atmos-terraform-cache-mirror--help.cast
  • website/static/casts/screengrabs/atmos-terraform-cache-prune--help.cast
  • website/static/casts/screengrabs/atmos-terraform-cache-stats--help.cast
  • website/static/casts/screengrabs/atmos-terraform-cache-trust--help.cast
  • website/static/casts/screengrabs/atmos-terraform-cache-untrust--help.cast
  • website/static/casts/screengrabs/atmos-terraform-clean--help.cast
  • website/static/casts/screengrabs/atmos-terraform-console--help.cast
  • website/static/casts/screengrabs/atmos-terraform-deploy--help.cast
  • website/static/casts/screengrabs/atmos-terraform-destroy--help.cast
  • website/static/casts/screengrabs/atmos-terraform-fmt--help.cast
  • website/static/casts/screengrabs/atmos-terraform-force-unlock--help.cast
  • website/static/casts/screengrabs/atmos-terraform-generate--help.cast
  • website/static/casts/screengrabs/atmos-terraform-generate-backend--help.cast
  • website/static/casts/screengrabs/atmos-terraform-generate-backends--help.cast
  • website/static/casts/screengrabs/atmos-terraform-generate-files--help.cast
  • website/static/casts/screengrabs/atmos-terraform-generate-planfile--help.cast
  • website/static/casts/screengrabs/atmos-terraform-generate-varfile--help.cast
  • website/static/casts/screengrabs/atmos-terraform-generate-varfiles--help.cast
  • website/static/casts/screengrabs/atmos-terraform-get--help.cast
  • website/static/casts/screengrabs/atmos-terraform-graph--help.cast
  • website/static/casts/screengrabs/atmos-terraform-import--help.cast
  • website/static/casts/screengrabs/atmos-terraform-init--help.cast
  • website/static/casts/screengrabs/atmos-terraform-login--help.cast
  • website/static/casts/screengrabs/atmos-terraform-logout--help.cast
  • website/static/casts/screengrabs/atmos-terraform-metadata--help.cast
  • website/static/casts/screengrabs/atmos-terraform-modules--help.cast
  • website/static/casts/screengrabs/atmos-terraform-output--help.cast
  • website/static/casts/screengrabs/atmos-terraform-plan--help.cast
  • website/static/casts/screengrabs/atmos-terraform-plan-diff--help.cast
  • website/static/casts/screengrabs/atmos-terraform-providers--help.cast
  • website/static/casts/screengrabs/atmos-terraform-providers-lock--help.cast
  • website/static/casts/screengrabs/atmos-terraform-providers-mirror--help.cast
  • website/static/casts/screengrabs/atmos-terraform-providers-schema--help.cast
  • website/static/casts/screengrabs/atmos-terraform-refresh--help.cast
  • website/static/casts/screengrabs/atmos-terraform-shell--help.cast
  • website/static/casts/screengrabs/atmos-terraform-show--help.cast
  • website/static/casts/screengrabs/atmos-terraform-source--help.cast
  • website/static/casts/screengrabs/atmos-terraform-source-delete--help.cast
  • website/static/casts/screengrabs/atmos-terraform-source-describe--help.cast
  • website/static/casts/screengrabs/atmos-terraform-source-list--help.cast
  • website/static/casts/screengrabs/atmos-terraform-source-pull--help.cast
  • website/static/casts/screengrabs/atmos-terraform-state--help.cast
  • website/static/casts/screengrabs/atmos-terraform-state-list--help.cast
  • website/static/casts/screengrabs/atmos-terraform-state-mv--help.cast
  • website/static/casts/screengrabs/atmos-terraform-state-pull--help.cast
  • website/static/casts/screengrabs/atmos-terraform-state-push--help.cast
  • website/static/casts/screengrabs/atmos-terraform-state-replace-provider--help.cast
  • website/static/casts/screengrabs/atmos-terraform-state-rm--help.cast
  • website/static/casts/screengrabs/atmos-terraform-state-show--help.cast
  • website/static/casts/screengrabs/atmos-terraform-taint--help.cast
  • website/static/casts/screengrabs/atmos-terraform-test--help.cast
  • website/static/casts/screengrabs/atmos-terraform-untaint--help.cast
  • website/static/casts/screengrabs/atmos-terraform-validate--help.cast
  • website/static/casts/screengrabs/atmos-terraform-version--help.cast
  • website/static/casts/screengrabs/atmos-terraform-workdir--help.cast
  • website/static/casts/screengrabs/atmos-terraform-workdir-clean--help.cast
  • website/static/casts/screengrabs/atmos-terraform-workdir-describe--help.cast
  • website/static/casts/screengrabs/atmos-terraform-workdir-list--help.cast
  • website/static/casts/screengrabs/atmos-terraform-workdir-show--help.cast
  • website/static/casts/screengrabs/atmos-terraform-workspace--help.cast
  • website/static/casts/screengrabs/atmos-terraform-workspace-delete--help.cast
  • website/static/casts/screengrabs/atmos-terraform-workspace-list--help.cast
  • website/static/casts/screengrabs/atmos-terraform-workspace-new--help.cast
  • website/static/casts/screengrabs/atmos-terraform-workspace-select--help.cast
  • website/static/casts/screengrabs/atmos-terraform-workspace-show--help.cast
  • website/static/casts/screengrabs/atmos-theme--help.cast
  • website/static/casts/screengrabs/atmos-theme-list--help.cast
  • website/static/casts/screengrabs/atmos-theme-show--help.cast
  • website/static/casts/screengrabs/atmos-toolchain--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-add--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-aliases--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-clean--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-du--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-env--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-exec--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-get--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-info--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-install--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-list--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-path--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-registry--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-registry-list--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-registry-search--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-remove--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-search--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-set--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-uninstall--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-versions--help.cast
  • website/static/casts/screengrabs/atmos-toolchain-which--help.cast
  • website/static/casts/screengrabs/atmos-validate--help.cast
  • website/static/casts/screengrabs/atmos-validate-component--help.cast
  • website/static/casts/screengrabs/atmos-validate-editorconfig--help.cast
  • website/static/casts/screengrabs/atmos-validate-schema--help.cast
  • website/static/casts/screengrabs/atmos-validate-stacks--help.cast
  • website/static/casts/screengrabs/atmos-vendor--help.cast
  • website/static/casts/screengrabs/atmos-vendor-pull--help.cast
  • website/static/casts/screengrabs/atmos-version--help.cast
  • website/static/casts/screengrabs/atmos-version-list--help.cast
  • website/static/casts/screengrabs/atmos-version-show--help.cast
  • website/static/casts/screengrabs/atmos-version.cast
  • website/static/casts/screengrabs/atmos-workflow--help.cast
  • website/static/casts/screengrabs/demo-stacks/define-your-stacks.cast
  • website/static/casts/screengrabs/demo-stacks/deploy.cast
  • website/static/casts/screengrabs/demo-stacks/start-your-project.cast
  • website/static/casts/screengrabs/demo-stacks/write-your-components.cast
  • website/static/schemas/atmos/atmos-manifest/1.0/atmos-manifest.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Walkthrough

This PR adds end-to-end asciicast recording, replay, and rendering, introduces cast/script/workdir step handling, wires a global --cast flag into command execution, adds demo cast workflows and committed recordings, and updates website docs, embeds, and skill guidance to match.

Changes

Cast engine, CLI, and step execution

Layer / File(s) Summary
Schema and validation
pkg/schema/..., errors/errors.go, pkg/datafetcher/schema/..., website/static/schemas/..., .gitattributes
Cast, simulate, script, and workdir types, defaults, decode hooks, JSON schemas, and sentinels are added.
Asciicast recorder
pkg/asciicast/recorder.go, pkg/asciicast/recorder_test.go
Cast files are written as v3 recordings with path resolution, slug generation, env filtering, and lifecycle coverage.
IO and PTY plumbing
pkg/io/*, pkg/terminal/pty/*, internal/exec/vendor_model.go
Masked output is captured and forwarded through shared recorder-aware IO and PTY writers.
Rendering and sessions
pkg/asciicast/render.go, pkg/asciicast/session*.go, tests
Playback, GIF/MP4 rendering, and interactive session actions are implemented and tested.
cast CLI and global flag
cmd/cast/*, cmd/root.go, tests/snapshots/*
atmos cast play|render, the global --cast flag, and root-command recording lifecycle are wired in.
Script/cast/workdir steps
pkg/runner/step/*, pkg/workflow/*, internal/exec/*, pkg/provisioner/source/vendor*.go
Workflow execution now handles inline scripts, cast steps, workdir provisioning, and working-directory-aware command execution.
Command env and merge behavior
pkg/config/*
Command env maps decode from map form, path-based command names normalize into nested trees, and merge/case restoration logic is updated.

Estimated code review effort: 5 (Critical) | ~150 minutes

Demo cast fixtures, workflows, and static casts

Layer / File(s) Summary
Demo workflows
demo/casts/atmos.yaml, demo/casts/atmos.d/**, demo/casts/README.md
Cast generation and validation workflows are added for CLI, examples, native-terraform, and aggregate demo runs.
Fixtures
demo/casts/fixtures/**
Basic, demo-vendoring, and native-terraform fixtures are added for deterministic recordings.
Example updates
examples/**, demo/screengrabs/demo-stacks.txt
Example READMEs gain cast front matter, cast-aware command snippets, and updated weather examples.
Static casts
website/static/casts/**
Committed .cast recordings are added for the CLI, demos, emulator, terraform, vendor, and example flows.

Estimated code review effort: 3 (Moderate) | ~30 minutes

Website CastPlayer component

Layer / File(s) Summary
CastPlayer implementation
website/src/components/CastPlayer/*
The playback component parses .cast files, renders ANSI terminal output, and supports controls and idle skipping.
Example metadata parsing
website/plugins/file-browser/index.js, website/src/components/{EmbedExample,FileBrowser}/..., frontmatter.ts
README frontmatter is parsed for cast metadata and surfaced in example browsers.
Docs and demo embeds
website/docs/cli/..., website/src/pages/cast-demo.tsx, website/blog/..., website/src/data/roadmap.js
CastPlayer embeds and a cast demo page are added across docs and site content.

Estimated code review effort: 3 (Moderate) | ~25 minutes

PRD, agent skills, and snapshots

Layer / File(s) Summary
PRD and skills
docs/prd/asciicast-recording.md, agent-skills/**, .claude/skills/**
Recording behavior, step guidance, hooks, and authoring rules are documented.
Golden snapshots
tests/snapshots/*
CLI help/config snapshots are updated for cast, --cast, and cast recording defaults.

Estimated code review effort: 2 (Simple) | ~15 minutes

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant RootCmd
  participant Recorder
  participant AsciicastRender
  User->>RootCmd: atmos --cast terraform plan
  RootCmd->>Recorder: StartRecordingIfRequested
  RootCmd->>Recorder: FinalizeRecording
  Recorder->>AsciicastRender: Render(out.cast, GIF)
  AsciicastRender-->>User: out.gif
Loading
sequenceDiagram
  participant WorkflowExecutor
  participant CastHandler
  participant AsciicastRecorder
  participant ChildStep
  WorkflowExecutor->>CastHandler: Execute(cast step)
  CastHandler->>AsciicastRecorder: Start(width,height,command)
  loop nested steps
    CastHandler->>ChildStep: run(simulate/shell/toast)
    ChildStep-->>AsciicastRecorder: Record output
  end
  CastHandler->>AsciicastRecorder: Close
  CastHandler-->>WorkflowExecutor: StepResult(cast path)
Loading

Possibly related PRs

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ascii-cast

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 20

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
agent-skills/skills/atmos-asciicast/SKILL.md (1)

1-36: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Fix agent skill line limit violation.

The pipeline failed because this SKILL.md exceeds the maximum line limit for agent skills. Move detailed content to references/ to comply with the spec.

Suggested structure:

  • SKILL.md (≤MAX_LINES): Keep front matter, brief description, and links to references.
  • references/atmos-asciicast-authoring.md: Move "Defaults", "Fixture Policy", and "Authoring Checklist" sections there.
♻️ Proposed restructuring
 ---
 name: atmos-asciicast
-description: Create and update Atmos asciicast demos for command documentation and website publishing.
+description: Create and update Atmos asciicast demos.
 ---
 
 # Atmos Asciicast Demo Skill
 
-Use this skill when creating or updating committed Atmos `.cast` recordings.
-
-## Defaults
-
-- Use `width: 120` and `height: 36` unless the target docs page needs a narrower recording.
-- Write curated casts under `website/static/casts/...`; they are served from `/casts/...`.
-- Use `type: cast` with `mode: steps` for deterministic command demos that need exit-code propagation.
-- Use `mode: session` only when the demo must show typed input, prompts, key presses, or terminal timing.
-- Keep ad hoc local recordings in the XDG cache via `--cast`; do not commit cache recordings.
-
-## Fixture Policy
-
-- Use deterministic demo fixtures under `demo/casts`.
-- Do not reuse product examples or test fixtures just to make a docs cast easier.
-- Keep demo output stable: no local absolute paths, hostnames, real account IDs, secrets, random IDs, or live timestamps.
-
-## Authoring Checklist
-
-1. Add or update the workflow/custom command that regenerates the cast.
-2. Regenerate the `.cast` into `website/static/casts`.
-3. Review the cast as plain text for secrets, local paths, unstable timestamps, and noisy logs.
-4. Embed it with the website `CastPlayer` component when the corresponding docs page can show it usefully:
-
-   ```mdx
-   <CastPlayer src="/casts/cli/describe-component.cast" title="describe component" chrome controls scrubber />
-   ```
-
-5. Prefer committing only `.cast` files. Commit GIF/MP4/SVG derivatives only when a publishing target cannot consume the player.
+Use this skill when creating or updating committed Atmos `.cast` recordings.
+See [Authoring Guide](references/atmos-asciicast-authoring.md) for full details.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@agent-skills/skills/atmos-asciicast/SKILL.md` around lines 1 - 36, The
atmos-asciicast SKILL.md is over the allowed agent-skill line limit; trim it to
a minimal entry point by keeping only the front matter, short description, and a
link to a new reference doc. Move the detailed “Defaults”, “Fixture Policy”, and
“Authoring Checklist” content into references/atmos-asciicast-authoring.md, and
update the SKILL.md text so it points readers to that guide while preserving the
skill name atmos-asciicast.
pkg/io/context.go (1)

80-84: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Record partial writes before returning the error.

fmt.Fprint can return n > 0 with err != nil. In that case the terminal already received a prefix, but the recorder skips it, so the cast no longer matches what the user saw.

Suggested fix
-	_, err := fmt.Fprint(writer, masked)
-	if err != nil {
-		return fmt.Errorf("%w: %w", errUtils.ErrWriteToStream, err)
-	}
-	recordOutput(stream, masked)
+	n, err := fmt.Fprint(writer, masked)
+	if n > 0 {
+		recordOutput(stream, masked[:n])
+	}
+	if err != nil {
+		return fmt.Errorf("%w: %w", errUtils.ErrWriteToStream, err)
+	}
 	return nil
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/io/context.go` around lines 80 - 84, The write path in context output
handling is dropping partially written data when fmt.Fprint returns both bytes
written and an error. Update the output flow around the writer call and
recordOutput so any successfully written prefix is recorded before returning the
wrapped error, ensuring the recorder stays in sync with what the terminal
actually received.
pkg/terminal/pty/pty_test.go (1)

384-422: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Assert the recorded event is masked too.

This test only checks the terminal buffer. It would still pass if recordingWriter masked stdout correctly but wrote the raw secret into the cast event, which is the regression this path needs to prevent.

Suggested test hardening.
 func TestRecordingWriterMasksOutput(t *testing.T) {
 	// Create IO context with masking enabled.
 	ioCtx, err := iolib.NewContext()
 	if err != nil {
 		t.Fatalf("Failed to create IO context: %v", err)
 	}
 
+	rec := &ptyTestRecorder{}
+	restore := iolib.SetRecorder(rec)
+	t.Cleanup(restore)
+
 	var buf bytes.Buffer
 
 	writer := &recordingWriter{
 		underlying: &buf,
 		masker:     ioCtx.Masker(),
@@
 	// Output should contain the mask replacement.
 	if !strings.Contains(output, iolib.MaskReplacement) {
 		t.Errorf("Output does not contain mask replacement: %s", output)
 	}
+
+	if len(rec.events) != 1 {
+		t.Fatalf("recorded %d events, want 1", len(rec.events))
+	}
+	if strings.Contains(rec.events[0], secretKey) {
+		t.Fatalf("recorded event contains unmasked secret: %q", rec.events[0])
+	}
+	if !strings.Contains(rec.events[0], iolib.MaskReplacement) {
+		t.Fatalf("recorded event does not contain mask replacement: %q", rec.events[0])
+	}
 }
As per coding guidelines, "`**/*_test.go`: Every new feature must include comprehensive unit tests targeting >80% code coverage for all packages."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/terminal/pty/pty_test.go` around lines 384 - 422, The masking test only
verifies the terminal buffer and misses the cast event path, so it can still
pass if recordingWriter writes a raw secret into the recorded event. Harden
TestRecordingWriterMasksOutput to also assert the event payload emitted by
recordingWriter is masked, using recordingWriter and its write/recording path to
verify both stdout and the captured event contain iolib.MaskReplacement and do
not contain the secretKey.

Source: Coding guidelines

pkg/provisioner/source/vendor.go (1)

44-50: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Reject unsafe target paths before the replace/remove branch.

VendorSource will recursively delete any existing targetDir when replacement is enabled. That helper is now fed from workflow-resolved input in pkg/runner/step/workdir.go, so a typo like ".", "./", or a filesystem root turns reset: true into data loss instead of a validation error. Please hard-fail on obviously unsafe targets before the first os.Stat/os.RemoveAll path.

Also applies to: 155-177

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/provisioner/source/vendor.go` around lines 44 - 50, VendorSource
currently accepts workflow-resolved targetDir input and can reach the
replace/remove branch that recursively deletes existing paths, so add an early
validation step in VendorSource before any os.Stat or os.RemoveAll calls to
reject obviously unsafe targets like ".", "./", and filesystem roots. Keep the
guard near the top of VendorSource, before the replace logic that uses
targetDir, and return a hard failure for invalid paths so reset-enabled flows
cannot delete unintended directories.
🧹 Nitpick comments (15)
docs/prd/asciicast-recording.md (1)

199-200: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Fix "regexp"/"regex" inconsistency.

Use one form consistently. Prefer "regex" to match the field name regex used elsewhere in the PRD.

- Regex syntax uses Go's `regexp` package.
- Invalid regex patterns fail validation before the session starts.
+ Regex syntax uses Go's `regex` package.
+ Invalid regex patterns fail validation before the session starts.

Wait, Go's package is actually regexp. So keep "regexp" for the package, change "regex" to "regexp" in the next sentence:

- Regex syntax uses Go's `regexp` package.
- Invalid regex patterns fail validation before the session starts.
+ Regexp syntax uses Go's `regexp` package.
+ Invalid regexp patterns fail validation before the session starts.

Or keep both as "regex" since the field is regex:

- Regex syntax uses Go's `regexp` package.
+ Regexp syntax uses Go's `regexp` package.

Actually simplest: just use "regex" consistently since the YAML field is regex:

- Regex syntax uses Go's `regexp` package.
+ Regex syntax uses Go's `regexp` package.
- Invalid regex patterns fail validation before the session starts.
+ Invalid regex patterns fail validation before the session starts.

No change needed to line 200. Just fix line 199 to match:

- Regex syntax uses Go's `regexp` package.
+ Regexp syntax uses Go's `regexp` package.

Hmm, that's worse. Let me just suggest:

- Regex syntax uses Go's `regexp` package.
- Invalid regex patterns fail validation before the session starts.
+ Regexp syntax uses Go's `regexp` package.
+ Invalid regexp patterns fail validation before the session starts.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/prd/asciicast-recording.md` around lines 199 - 200, The issue is
inconsistent use of “regex” vs “regexp” in the asciicast recording PRD bullets.
Update the affected sentence in this section to use one term consistently, and
keep the Go package reference in the `regexp` mention while aligning the
surrounding wording with the `regex` field name used elsewhere. Use the nearby
bullets in the same section to verify the final phrasing stays consistent across
`regex`/`regexp`.
demo/casts/fixtures/demo-vendoring/atmos.yaml (1)

19-27: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Mislabeled comment: "Absolute path" example is actually relative.

Line 27's comment says # Absolute path but vendor.d/vendor1.yaml is a relative path, same as the "Directory" example above it.

✏️ Suggested fix
-  # Absolute path
-  `#base_path`: "vendor.d/vendor1.yaml"
+  # Alternate relative path (single directory)
+  `#base_path`: "vendor.d/vendor1.yaml"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@demo/casts/fixtures/demo-vendoring/atmos.yaml` around lines 19 - 27, The
comment label in the vendor base_path examples is incorrect: the “Absolute path”
example in the vendoring YAML fixture points to a relative path. Update the
comment near the vendor/base_path examples in atmos.yaml so the label matches
the actual path type, or replace it with a truly absolute path; use the vendor
section and the base_path examples as the reference points.
demo/casts/fixtures/demo-vendoring/vendor/vendor1.yaml (1)

10-16: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

Pin to a tag/commit instead of main for reproducibility.

Sourcing from version: "main" tracks a moving branch. Since this fixture backs deterministic/reproducible cast recordings, upstream changes to main could silently alter the generated demo output over time.

♻️ Suggested fix
-      version: "main"
+      version: "1.190.0"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@demo/casts/fixtures/demo-vendoring/vendor/vendor1.yaml` around lines 10 - 16,
The vendoring fixture for the ipinfo component is using a მოძრable branch via
version: "main", which can make cast output non-deterministic. Update the vendor
entry in vendor1.yaml to reference a fixed tag or commit SHA instead, keeping
the same source/targets structure and the component/version placeholders so the
fixture remains reproducible.
website/src/components/FileBrowser/FileViewer.tsx (1)

19-30: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicate stripFrontmatter implementation.

Identical to stripFrontmatter in website/src/components/EmbedExample/index.tsx. Extract to a shared utility to avoid divergence.

♻️ Suggested extraction
-function stripFrontmatter(content: string): string {
-  if (!content.startsWith('---')) return content;
-
-  const lines = content.split(/\r?\n/);
-  if (lines[0].trim() !== '---') return content;
-
-  const endIndex = lines.findIndex((line, index) => index > 0 && line.trim() === '---');
-  if (endIndex === -1) return content;
-
-  return lines.slice(endIndex + 1).join('\n').trim();
-}
+import { stripFrontmatter } from '`@site/src/utils/frontmatter`';

And update EmbedExample/index.tsx to import from the same shared module instead of defining its own copy.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@website/src/components/FileBrowser/FileViewer.tsx` around lines 19 - 30, The
stripFrontmatter helper is duplicated in FileViewer and EmbedExample, so move
the shared logic into a common utility module and have both FileViewer and
EmbedExample import that single implementation. Keep the existing behavior of
stripFrontmatter unchanged while removing the local copy from FileViewer and
updating the EmbedExample/index.tsx usage to reference the shared helper.
pkg/schema/schema.go (1)

142-152: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add doc comments for the exported cast config types.

CastConfig and CastRecordingConfig are exported, so add Go doc comments for lint/doc hygiene. As per coding guidelines, **/*.go: Document all exported functions, types, and methods following Go's documentation conventions.

Suggested fix
+// CastConfig configures asciicast recording and playback behavior.
 type CastConfig struct {
 	Recording CastRecordingConfig `yaml:"recording,omitempty" json:"recording,omitempty" mapstructure:"recording"`
 }
 
+// CastRecordingConfig configures native asciicast recording defaults.
 type CastRecordingConfig struct {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/schema/schema.go` around lines 142 - 152, Add Go doc comments to the
exported cast configuration types in schema.go. Document both CastConfig and
CastRecordingConfig with comments that begin with the type name and briefly
describe their purpose, following standard Go documentation conventions so
exported types in the schema package are lint/doc compliant.

Source: Coding guidelines

pkg/schema/workflow.go (1)

574-579: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Document the exported CastOutput type.

Add a Go doc comment starting with CastOutput. As per coding guidelines, **/*.go: Document all exported functions, types, and methods following Go's documentation conventions.

Suggested fix
+// CastOutput declares cast artifact paths to keep or render.
 type CastOutput struct {
 	Cast string `yaml:"cast,omitempty" json:"cast,omitempty" mapstructure:"cast"`
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/schema/workflow.go` around lines 574 - 579, Add a Go doc comment for the
exported CastOutput type so it starts with “CastOutput” and follows standard Go
documentation conventions. Update the type declaration in workflow.go to include
a concise comment describing what CastOutput represents, keeping the existing
fields Cast, SVG, GIF, and MP4 unchanged.

Source: Coding guidelines

pkg/asciicast/recorder_test.go (1)

36-41: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Assert the wrapped sentinel error.

Use errors.Is(err, ErrCastOutputExists) instead of matching text. As per coding guidelines, **/*.go: Use errors.Is() for error checking.

Suggested fix
 import (
+	"errors"
 	"os"
 	"path/filepath"
 	"strings"
@@
-	if !strings.Contains(err.Error(), "already exists") {
+	if !errors.Is(err, ErrCastOutputExists) {
 		t.Fatalf("unexpected error: %v", err)
 	}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/asciicast/recorder_test.go` around lines 36 - 41, The test in
recorder_test.go is checking the error by matching its text instead of asserting
the sentinel, so update the Start/Options explicit path collision assertion to
use errors.Is against ErrCastOutputExists. Keep the existing failure path check,
but replace the strings.Contains(err.Error(), ...) validation with a direct
wrapped-error check so the test follows the error-handling guideline
consistently.

Source: Coding guidelines

pkg/asciicast/session.go (1)

25-52: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add doc comments for the exported session API.

ErrUnknownSessionAction, SessionAction, SessionOptions, and RunSession are exported. As per coding guidelines, **/*.go: Document all exported functions, types, and methods following Go's documentation conventions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/asciicast/session.go` around lines 25 - 52, Add Go doc comments for every
exported session API symbol in this block: ErrUnknownSessionAction,
SessionAction, SessionOptions, and RunSession. Place a concise comment
immediately above each declaration in pkg/asciicast/session.go, following
standard Go documentation conventions so the purpose of each exported error,
type, and function is clear.

Source: Coding guidelines

pkg/asciicast/recorder.go (1)

32-72: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add doc comments for the exported recorder API.

This new package exposes multiple public types/functions without Go doc comments. As per coding guidelines, **/*.go: Document all exported functions, types, and methods following Go's documentation conventions.

Also applies to: 72-179, 261-314

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/asciicast/recorder.go` around lines 32 - 72, Add Go doc comments for
every exported API in the recorder package. Document the public types and
functions shown here, including ErrCastOutputExists, Options, Recorder, Header,
and Start, and continue through the rest of the package for any exported
methods/functions referenced by the review. Keep the comments in standard Go
style so each exported symbol clearly describes its purpose and behavior.

Source: Coding guidelines

pkg/asciicast/render.go (1)

17-22: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Sentinel errors declared locally instead of in errors/errors.go.

ErrEmptyCastFile, ErrRenderOutputExists, ErrMissingAgg, ErrMissingFFmpeg are new package-level sentinel errors defined here rather than in the centralized errors/errors.go. As per coding guidelines, "All errors MUST be wrapped using static errors defined in errors/errors.go."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/asciicast/render.go` around lines 17 - 22, The sentinel errors in
render.go are defined locally instead of using the centralized error
definitions, so move ErrEmptyCastFile, ErrRenderOutputExists, ErrMissingAgg, and
ErrMissingFFmpeg into the shared errors package and update the render-related
code to reference those shared symbols. Keep the render logic in the render
package using the imported errors identifiers rather than declaring new
package-level error vars.

Source: Coding guidelines

cmd/root.go (1)

379-382: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Route these status lines through the CLI output layer.

Direct fmt.Fprintf(os.Stderr, ...) bypasses the repo’s ui.* / data.* abstractions and makes this output harder to style and test consistently. Emit these messages after restore() via the standard helpers instead. As per coding guidelines "Never use fmt.Fprintf(os.Stdout/Stderr, ...) or fmt.Println(...). Use data.* or ui.* functions instead."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cmd/root.go` around lines 379 - 382, The status messages in the cast
recording flow are written directly with fmt.Fprintf to os.Stderr, bypassing the
CLI output abstractions. Update the restore()/recording completion path in
root.go to emit both the failure and success messages through the existing ui.*
or data.* helpers instead of direct stderr writes, keeping the same cast
recording context via the rec.Path() and error handling logic.

Source: Coding guidelines

cmd/cast/cast.go (1)

46-49: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Register render flags through the standard parser.

These flags are added directly on renderCmd while GetFlagsBuilder() stays nil, which bypasses the repo’s normal flag plumbing and makes this command behave differently from the rest of cmd/. As per coding guidelines "Commands MUST use flags.NewStandardParser() for command-specific flags." Based on learnings "Define and parse flags with a standard parser (e.g., flags.NewStandardParser()) and avoid binding flags to Viper."

Also applies to: 68-74

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cmd/cast/cast.go` around lines 46 - 49, The `renderCmd` flags are being
registered directly in `init()`, which bypasses the repo’s standard flag
plumbing and leaves `GetFlagsBuilder()` unused. Move the `svg`, `gif`, and `mp4`
options onto a `flags.NewStandardParser()`-based setup for the `render` command,
and wire that parser through the command’s flag builder path so `renderCmd`
follows the same pattern as the rest of `cmd/` (including the related code
around `GetFlagsBuilder()` and the later flag handling).

Sources: Coding guidelines, Learnings

pkg/runner/step/cast.go (2)

85-88: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Prefer ui.*/data.* helpers over raw fmt.Fprintf for user-facing output.

fmt.Fprintf(iolib.GetContext().UI(), ...) bypasses the UI formatting layer.

As per coding guidelines: "Never use fmt.Fprintf(os.Stdout/Stderr, ...) or fmt.Println(...). Use data.* or ui.* functions instead."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/runner/step/cast.go` around lines 85 - 88, The user-facing cast success
message is written directly with fmt.Fprintf via iolib.GetContext().UI(), which
bypasses the UI formatting layer. Update the Cast flow in the cast-related
codepath to use the existing ui.* or data.* output helper instead of raw
formatted I/O, keeping the same message content and routing it through the
standard UI abstraction.

Source: Coding guidelines


270-305: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Wrap stdlib errors with context instead of returning them raw.

validateKeyAction, validatePauseAction, and validateWaitAction return time.ParseDuration/regexp.Compile errors directly (lines 278, 286, 297-298, 304) without identifying which field/action failed, unlike parseDurationDefault which wraps with %q/%w context.

♻️ Suggested fix (example for `validatePauseAction`)
 func validatePauseAction(action *schema.WorkflowStep) error {
 	if action.Duration == "" {
 		return ErrPauseActionRequiresDuration
 	}
-	_, err := time.ParseDuration(action.Duration)
-	return err
+	if _, err := time.ParseDuration(action.Duration); err != nil {
+		return fmt.Errorf("invalid pause duration %q: %w", action.Duration, err)
+	}
+	return nil
 }

As per coding guidelines: "wrap errors with context using fmt.Errorf(\"context: %w\", err)."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/runner/step/cast.go` around lines 270 - 305, The action validators are
returning raw stdlib parse errors without field context, so update
validateKeyAction, validatePauseAction, and validateWaitAction to wrap failures
from time.ParseDuration and regexp.Compile with fmt.Errorf using the relevant
action/field name and %w. Keep the existing validation logic in these helper
functions, but make each returned error identify whether the failure came from
Key.Interval, Duration, Regex, or Timeout so callers can tell which WorkflowStep
field was invalid.

Source: Coding guidelines

pkg/runner/step/cast_test.go (1)

1-83: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for remaining validation and execution branches.

Current tests only cover the wait action's text/regex requirement and the header Command round trip. Missing coverage: Validate default-mode/"steps"-mode required-steps checks, ErrInvalidCastMode, validateWriteAction/validateKeyAction/validatePauseAction, and castCommandArgs/castMode defaults.

As per coding guidelines: "Every new feature must include comprehensive unit tests targeting >80% code coverage for all packages" and "Use table-driven tests for testing multiple scenarios in Go."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/runner/step/cast_test.go` around lines 1 - 83, The current tests only
cover session wait validation and recorder header behavior; add table-driven
tests around CastHandler.Validate, validateWriteAction, validateKeyAction,
validatePauseAction, castCommandArgs, and castMode to exercise the missing
branches. Include cases for default mode, steps mode requiring steps, invalid
mode returning ErrInvalidCastMode, and the remaining action validators to
confirm both valid and invalid inputs. Use the existing CastHandler,
startStepRecorder, and related helper symbols to keep the new coverage aligned
with the implementation.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@cmd/cast/cast.go`:
- Line 20: This introduces a package-local sentinel in cast.go instead of using
the shared static error catalog. Move ErrMissingRenderOutput into
errors/errors.go, then update the cast path to return it via wrapping with
fmt.Errorf("%w", ...) or errors.Join as appropriate. Use the existing
ErrMissingRenderOutput symbol in cast.go only through the shared errors package
so callers can classify it with errors.Is().

In `@cmd/root.go`:
- Around line 705-714: The color-profile setup in Execute leaks forced TrueColor
state into later runs because the non-force branch only updates lipgloss and
never resets the log/theme globals. Update the else branch alongside the
existing forced-color handling in cmd/root.go to mirror the detected terminal
profile for both lipgloss and log, and invalidate the theme cache there as well
so each Execute call starts from the current terminal state.

In `@demo/casts/atmos.yaml`:
- Around line 458-473: The vendor-pull validation in the validate step has an
inconsistent bad-token check because it bans --dry-run without matching the
other cast validations. Update the validation logic in vendor-pull so the bad
list follows the same standard as the other checks, or remove --dry-run from the
forbidden set unless there is a specific vendor-pull-only requirement; use the
validate shell step and its bad list as the location to adjust.
- Around line 526-548: The emulator-aws-lifecycle validation in the shell
snippet is too strict because it treats any "WARN" text as a failure. Update the
validation logic in the cast check to remove the broad "WARN" entry from the bad
list or replace it with a more specific error-only pattern, so legitimate
Terraform/emulator warnings do not fail the check.

In `@demo/casts/fixtures/demo-vendoring/vendor.d/vendor1.yaml`:
- Around line 1-16: The vendor manifest in vendor1.yaml is currently unused and
duplicates the existing ipinfo source, so either wire it into the vendoring flow
by adding it to the main manifest’s spec.imports in vendor.yaml, or remove it if
this fixture is not meant to demonstrate multi-manifest vendoring. Use the
AtmosVendorConfig structure and the spec.imports field to make the intended
relationship explicit.

In `@pkg/asciicast/recorder.go`:
- Line 296: The slug-building logic in recorder.go is stripping any basename
that starts with “atmos”, which incorrectly turns Windows executables like
atmos.exe into “.exe”. Update the slug generation in the relevant recorder path
to skip only when the executable basename exactly matches the Atmos binary name,
using the basename comparison around filepath.Base(arg) instead of TrimPrefix,
so non-exact names remain intact across Linux/macOS/Windows.

In `@pkg/asciicast/render.go`:
- Around line 113-130: The renderTargets helper is wiring the SVG output path to
renderWithAgg, which only generates GIF output, so the opts.SVG branch is
producing the wrong artifact. Update renderTargets and the related
renderTarget/renderWithAgg flow so the SVG option uses a true SVG-capable
renderer (or remove the SVG option until such a renderer exists), while keeping
GIF and MP4 mapped to their correct render functions.

In `@pkg/asciicast/session.go`:
- Around line 151-158: The sessionState.stop method is a no-op, so the goroutine
started in the context watcher around ptmx.Close() can leak after a successful
session. Update sessionState to retain a cancellation mechanism from the context
setup and have stop invoke it, then ensure the watcher goroutine exits when that
cancellation is triggered. Use the sessionState and stop symbols to wire the
cleanup into the existing defer state.stop() path.
- Around line 160-173: finishSession currently kills the child process on
cancel/timeout but returns without reaping it, which can leave a zombie. Update
finishSession in session.go to always call cmd.Wait() after the process is
signaled or when done receives an error, and make sure the timeout and ctx.Done
paths also wait on the child before returning. Use the finishSession and
cmd.Process symbols to locate the cleanup flow.

In `@pkg/io/recorder_test.go`:
- Around line 42-47: The masking check in recorder_test.go is too narrow because
it only rejects one exact unmasked string. Update the assertion around rec.data
in the recorder test to verify the raw secret value is not present anywhere and
that the expected mask token is present, using the existing recorder stream/data
checks to locate the test.

In `@pkg/io/streams.go`:
- Around line 97-105: The Write methods on dynamicWriter, maskedWriter, and
dynamicMaskedWriter currently skip recorder output whenever the underlying
writer returns a partial write with an error or ErrShortWrite. Update each Write
path so it records only the successfully written prefix using p[:n] or
maskedBytes[:n] before returning any error, and keep the existing recordOutput
integration so the recorder matches what actually reached the terminal.

In `@pkg/runner/step/cast.go`:
- Around line 80-91: The error handling in runCastBody/rec.Close drops closeErr
whenever runErr is already set, so the close failure is lost. Update the logic
in cast.go to combine runErr and closeErr with errors.Join instead of choosing
only one, and keep the existing renderCastOutputs flow unchanged. Use the
runCastBody, rec.Close, and renderCastOutputs path to locate the fix.
- Around line 20-29: Move the package-level static error declarations from
cast.go into the centralized errors/errors.go file and update cast.go to
reference those shared errors instead of defining its own errors.New values.
Keep the existing symbol names used by the cast step validation paths (such as
ErrCastStepRequiresSteps, ErrWriteActionRequiresText, and
ErrUnsupportedSessionAction) so call sites can continue to use them
consistently. Ensure any remaining uses in the cast step logic point to the
centralized errors package and that no new dynamic errors are introduced here.

In `@pkg/runner/step/workdir.go`:
- Around line 13-17: The workdir validation errors are introducing package-local
sentinels, which breaks the shared error identity used elsewhere. Move the
workdir path/source/map-key errors into the central error definitions in
errors/errors.go, then update the workdir validation flow in workdir.go to wrap
those shared errors through the standard error builder instead of calling
errors.New locally. Keep the existing validation points for the path/source
checks and key-type handling, but ensure all returned failures use the shared
taxonomy.

In `@website/plugins/file-browser/index.js`:
- Around line 303-321: Tighten the front-matter parsing in the file-browser
plugin by making parseFrontMatter only treat a leading --- block as metadata
when it actually contains valid key: value entries. Update the logic around the
lines/endIndex scan and the loop that fills the data object so that if no valid
pairs are found, the function returns the original content unchanged instead of
stripping the opening section and using body extraction.

In `@website/src/components/CastPlayer/index.tsx`:
- Around line 62-88: The CastPlayer fetch/parsing flow in the effect that loads
`src` should explicitly handle request and JSON parse failures instead of
letting them reject unhandled. In the `fetch(src).then(...).then(...)` chain,
add a `response.ok` check before reading the body, guard the `JSON.parse` calls
for the header and each cast line, and add a `.catch(...)` to reset player state
or render a fallback when the cast is missing or malformed. Use the existing
`setEvents`, `setContent`, `setPosition`, and `renderedEventTime` updates in
`CastPlayer` to keep the UI consistent on failure.

In `@website/src/components/CastPlayer/styles.module.css`:
- Around line 91-107: The styles in CastPlayer/styles.module.css are tripping
stylelint because the quoted SFMono-Regular family and the camelCase cursorBlink
animation/keyframes name violate the current naming/quote rules. Update the
font-family declaration in the CastPlayer stylesheet to use the normalized
family formatting expected by lint, and rename the cursorBlink
animation/keyframes to the approved kebab-case/standard form while keeping the
.cursor rule and `@keyframes` declaration in sync.

In `@website/src/pages/cast-demo.tsx`:
- Around line 43-46: The CastPlayer prompt is using a partial command string, so
the demo reads like a standalone binary instead of the full Atmos CLI
invocation. Update the command passed to CastPlayer in cast-demo.tsx so it
includes the full prefix (for example, the intro should show the Atmos command),
or source the prompt text from the recorded header command used by the cast.

In `@website/static/casts/cli/describe-component.cast`:
- Line 2: The cast fixture includes machine-specific absolute paths in the
recorded payload, which makes the committed asset non-reproducible. Update the
recording used by describe-component.cast so that fields like
component_info.component_path and terraform_config positions (pos.filename) are
normalized to a sandboxed or relative path, and ensure the recorded output is
regenerated from the sanitized source instead of a local developer directory.

In `@website/static/casts/emulator/aws-lifecycle.cast`:
- Around line 59-77: The aws-lifecycle.cast fixture contains non-deterministic
runtime values such as the localhost port, container ID, and resolved provider
patch version, which will keep changing on re-recording. Update the recording
workflow or fixture generation so these values are normalized or masked, and pin
the AWS provider version in the underlying emulator/Terraform setup to keep the
output stable. Use the aws-lifecycle.cast recording and the emulator/Terraform
initialization steps as the place to fix this.

---

Outside diff comments:
In `@agent-skills/skills/atmos-asciicast/SKILL.md`:
- Around line 1-36: The atmos-asciicast SKILL.md is over the allowed agent-skill
line limit; trim it to a minimal entry point by keeping only the front matter,
short description, and a link to a new reference doc. Move the detailed
“Defaults”, “Fixture Policy”, and “Authoring Checklist” content into
references/atmos-asciicast-authoring.md, and update the SKILL.md text so it
points readers to that guide while preserving the skill name atmos-asciicast.

In `@pkg/io/context.go`:
- Around line 80-84: The write path in context output handling is dropping
partially written data when fmt.Fprint returns both bytes written and an error.
Update the output flow around the writer call and recordOutput so any
successfully written prefix is recorded before returning the wrapped error,
ensuring the recorder stays in sync with what the terminal actually received.

In `@pkg/provisioner/source/vendor.go`:
- Around line 44-50: VendorSource currently accepts workflow-resolved targetDir
input and can reach the replace/remove branch that recursively deletes existing
paths, so add an early validation step in VendorSource before any os.Stat or
os.RemoveAll calls to reject obviously unsafe targets like ".", "./", and
filesystem roots. Keep the guard near the top of VendorSource, before the
replace logic that uses targetDir, and return a hard failure for invalid paths
so reset-enabled flows cannot delete unintended directories.

In `@pkg/terminal/pty/pty_test.go`:
- Around line 384-422: The masking test only verifies the terminal buffer and
misses the cast event path, so it can still pass if recordingWriter writes a raw
secret into the recorded event. Harden TestRecordingWriterMasksOutput to also
assert the event payload emitted by recordingWriter is masked, using
recordingWriter and its write/recording path to verify both stdout and the
captured event contain iolib.MaskReplacement and do not contain the secretKey.

---

Nitpick comments:
In `@cmd/cast/cast.go`:
- Around line 46-49: The `renderCmd` flags are being registered directly in
`init()`, which bypasses the repo’s standard flag plumbing and leaves
`GetFlagsBuilder()` unused. Move the `svg`, `gif`, and `mp4` options onto a
`flags.NewStandardParser()`-based setup for the `render` command, and wire that
parser through the command’s flag builder path so `renderCmd` follows the same
pattern as the rest of `cmd/` (including the related code around
`GetFlagsBuilder()` and the later flag handling).

In `@cmd/root.go`:
- Around line 379-382: The status messages in the cast recording flow are
written directly with fmt.Fprintf to os.Stderr, bypassing the CLI output
abstractions. Update the restore()/recording completion path in root.go to emit
both the failure and success messages through the existing ui.* or data.*
helpers instead of direct stderr writes, keeping the same cast recording context
via the rec.Path() and error handling logic.

In `@demo/casts/fixtures/demo-vendoring/atmos.yaml`:
- Around line 19-27: The comment label in the vendor base_path examples is
incorrect: the “Absolute path” example in the vendoring YAML fixture points to a
relative path. Update the comment near the vendor/base_path examples in
atmos.yaml so the label matches the actual path type, or replace it with a truly
absolute path; use the vendor section and the base_path examples as the
reference points.

In `@demo/casts/fixtures/demo-vendoring/vendor/vendor1.yaml`:
- Around line 10-16: The vendoring fixture for the ipinfo component is using a
მოძრable branch via version: "main", which can make cast output
non-deterministic. Update the vendor entry in vendor1.yaml to reference a fixed
tag or commit SHA instead, keeping the same source/targets structure and the
component/version placeholders so the fixture remains reproducible.

In `@docs/prd/asciicast-recording.md`:
- Around line 199-200: The issue is inconsistent use of “regex” vs “regexp” in
the asciicast recording PRD bullets. Update the affected sentence in this
section to use one term consistently, and keep the Go package reference in the
`regexp` mention while aligning the surrounding wording with the `regex` field
name used elsewhere. Use the nearby bullets in the same section to verify the
final phrasing stays consistent across `regex`/`regexp`.

In `@pkg/asciicast/recorder_test.go`:
- Around line 36-41: The test in recorder_test.go is checking the error by
matching its text instead of asserting the sentinel, so update the Start/Options
explicit path collision assertion to use errors.Is against ErrCastOutputExists.
Keep the existing failure path check, but replace the
strings.Contains(err.Error(), ...) validation with a direct wrapped-error check
so the test follows the error-handling guideline consistently.

In `@pkg/asciicast/recorder.go`:
- Around line 32-72: Add Go doc comments for every exported API in the recorder
package. Document the public types and functions shown here, including
ErrCastOutputExists, Options, Recorder, Header, and Start, and continue through
the rest of the package for any exported methods/functions referenced by the
review. Keep the comments in standard Go style so each exported symbol clearly
describes its purpose and behavior.

In `@pkg/asciicast/render.go`:
- Around line 17-22: The sentinel errors in render.go are defined locally
instead of using the centralized error definitions, so move ErrEmptyCastFile,
ErrRenderOutputExists, ErrMissingAgg, and ErrMissingFFmpeg into the shared
errors package and update the render-related code to reference those shared
symbols. Keep the render logic in the render package using the imported errors
identifiers rather than declaring new package-level error vars.

In `@pkg/asciicast/session.go`:
- Around line 25-52: Add Go doc comments for every exported session API symbol
in this block: ErrUnknownSessionAction, SessionAction, SessionOptions, and
RunSession. Place a concise comment immediately above each declaration in
pkg/asciicast/session.go, following standard Go documentation conventions so the
purpose of each exported error, type, and function is clear.

In `@pkg/runner/step/cast_test.go`:
- Around line 1-83: The current tests only cover session wait validation and
recorder header behavior; add table-driven tests around CastHandler.Validate,
validateWriteAction, validateKeyAction, validatePauseAction, castCommandArgs,
and castMode to exercise the missing branches. Include cases for default mode,
steps mode requiring steps, invalid mode returning ErrInvalidCastMode, and the
remaining action validators to confirm both valid and invalid inputs. Use the
existing CastHandler, startStepRecorder, and related helper symbols to keep the
new coverage aligned with the implementation.

In `@pkg/runner/step/cast.go`:
- Around line 85-88: The user-facing cast success message is written directly
with fmt.Fprintf via iolib.GetContext().UI(), which bypasses the UI formatting
layer. Update the Cast flow in the cast-related codepath to use the existing
ui.* or data.* output helper instead of raw formatted I/O, keeping the same
message content and routing it through the standard UI abstraction.
- Around line 270-305: The action validators are returning raw stdlib parse
errors without field context, so update validateKeyAction, validatePauseAction,
and validateWaitAction to wrap failures from time.ParseDuration and
regexp.Compile with fmt.Errorf using the relevant action/field name and %w. Keep
the existing validation logic in these helper functions, but make each returned
error identify whether the failure came from Key.Interval, Duration, Regex, or
Timeout so callers can tell which WorkflowStep field was invalid.

In `@pkg/schema/schema.go`:
- Around line 142-152: Add Go doc comments to the exported cast configuration
types in schema.go. Document both CastConfig and CastRecordingConfig with
comments that begin with the type name and briefly describe their purpose,
following standard Go documentation conventions so exported types in the schema
package are lint/doc compliant.

In `@pkg/schema/workflow.go`:
- Around line 574-579: Add a Go doc comment for the exported CastOutput type so
it starts with “CastOutput” and follows standard Go documentation conventions.
Update the type declaration in workflow.go to include a concise comment
describing what CastOutput represents, keeping the existing fields Cast, SVG,
GIF, and MP4 unchanged.

In `@website/src/components/FileBrowser/FileViewer.tsx`:
- Around line 19-30: The stripFrontmatter helper is duplicated in FileViewer and
EmbedExample, so move the shared logic into a common utility module and have
both FileViewer and EmbedExample import that single implementation. Keep the
existing behavior of stripFrontmatter unchanged while removing the local copy
from FileViewer and updating the EmbedExample/index.tsx usage to reference the
shared helper.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: cf9004e3-2149-4d68-8146-337c099732db

📥 Commits

Reviewing files that changed from the base of the PR and between 583aa66 and 0dd6cb5.

📒 Files selected for processing (138)
  • .gitattributes
  • agent-skills/skills/atmos-asciicast/SKILL.md
  • cmd/cast/cast.go
  • cmd/cast_flag_test.go
  • cmd/root.go
  • demo/casts/README.md
  • demo/casts/atmos.yaml
  • demo/casts/fixtures/basic/.gitignore
  • demo/casts/fixtures/basic/README.md
  • demo/casts/fixtures/basic/atmos.yaml
  • demo/casts/fixtures/basic/components/terraform/mock/README.md
  • demo/casts/fixtures/basic/components/terraform/mock/main.tf
  • demo/casts/fixtures/basic/stacks/catalog/mock.yaml
  • demo/casts/fixtures/basic/stacks/deploy/nonprod.yaml
  • demo/casts/fixtures/basic/stacks/deploy/prod.yaml
  • demo/casts/fixtures/demo-vendoring/README.md
  • demo/casts/fixtures/demo-vendoring/atmos.yaml
  • demo/casts/fixtures/demo-vendoring/stacks/catalog/myapp.yaml
  • demo/casts/fixtures/demo-vendoring/stacks/deploy/dev.yaml
  • demo/casts/fixtures/demo-vendoring/stacks/deploy/prod.yaml
  • demo/casts/fixtures/demo-vendoring/stacks/deploy/staging.yaml
  • demo/casts/fixtures/demo-vendoring/vendor.d/vendor1.yaml
  • demo/casts/fixtures/demo-vendoring/vendor.yaml
  • demo/casts/fixtures/demo-vendoring/vendor/vendor1.yaml
  • demo/casts/fixtures/demo-vendoring/vendor/vendor2.yaml
  • demo/casts/fixtures/native-terraform/.gitignore
  • demo/casts/fixtures/native-terraform/README.md
  • demo/casts/fixtures/native-terraform/atmos.yaml
  • demo/casts/fixtures/native-terraform/components/terraform/vpc/envs/dev.tfvars
  • demo/casts/fixtures/native-terraform/components/terraform/vpc/envs/prod.tfvars
  • demo/casts/fixtures/native-terraform/components/terraform/vpc/main.tf
  • demo/casts/fixtures/native-terraform/components/terraform/vpc/outputs.tf
  • demo/casts/fixtures/native-terraform/components/terraform/vpc/variables.tf
  • demo/casts/fixtures/native-terraform/stacks/_defaults.yaml
  • demo/casts/fixtures/native-terraform/stacks/dev.yaml
  • demo/casts/fixtures/native-terraform/stacks/prod.yaml
  • docs/prd/asciicast-recording.md
  • examples/demo-vendoring/README.md
  • examples/emulator-aws/README.md
  • examples/emulator-aws/atmos.yaml
  • examples/native-terraform/README.md
  • internal/exec/vendor_model.go
  • pkg/asciicast/recorder.go
  • pkg/asciicast/recorder_test.go
  • pkg/asciicast/render.go
  • pkg/asciicast/render_test.go
  • pkg/asciicast/session.go
  • pkg/config/load.go
  • pkg/io/context.go
  • pkg/io/recorder.go
  • pkg/io/recorder_test.go
  • pkg/io/streams.go
  • pkg/provisioner/source/vendor.go
  • pkg/provisioner/source/vendor_test.go
  • pkg/runner/step/cast.go
  • pkg/runner/step/cast_test.go
  • pkg/runner/step/workdir.go
  • pkg/runner/step/workdir_test.go
  • pkg/schema/schema.go
  • pkg/schema/task.go
  • pkg/schema/workflow.go
  • pkg/terminal/pty/pty.go
  • pkg/terminal/pty/pty_test.go
  • tests/snapshots/TestCLICommands_atmos_--chdir_config_isolation.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_--help_config_aliases_section.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_about_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_atlantis_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_atlantis_generate_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_atlantis_generate_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_atlantis_generate_repo-config_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_atlantis_generate_repo-config_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_atlantis_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_auth_env_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_auth_exec_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_auth_login_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_auth_user_configure_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_auth_validate_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_auth_whoami_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_describe_config.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_describe_config_-f_yaml.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_describe_config_imports.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_describe_configuration.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_helmfile_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_helmfile_apply_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_helmfile_apply_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_helmfile_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_non-existent.stderr.golden
  • tests/snapshots/TestCLICommands_atmos_terraform_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_terraform_--help_alias_subcommand_check.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_terraform_apply_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_terraform_apply_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_terraform_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_toolchain_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_toolchain_info_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_toolchain_install_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_validate_editorconfig_--help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_validate_editorconfig_help.stdout.golden
  • tests/snapshots/TestCLICommands_config_alias_tp_--help_shows_terraform_plan_help.stdout.golden
  • tests/snapshots/TestCLICommands_config_alias_tr_--help_shows_terraform_help.stdout.golden
  • tests/snapshots/TestCLICommands_deploy_component_help_shows_stack_flag.stdout.golden
  • tests/snapshots/TestCLICommands_describe_component_help_shows_stack_flag.stdout.golden
  • tests/snapshots/TestCLICommands_echo_info_help_shows_verbose_flag.stdout.golden
  • tests/snapshots/TestCLICommands_help_flag_works.stdout.golden
  • tests/snapshots/TestCLICommands_indentation.stdout.golden
  • tests/snapshots/TestCLICommands_secrets-masking_describe_config.stdout.golden
  • tests/snapshots/TestCLICommands_show_component_help_shows_inherited_stack_flag.stdout.golden
  • tests/snapshots/TestCLICommands_terraform_help_shows_stack_flag.stdout.golden
  • tests/snapshots/TestCLICommands_terraform_provision_help_shows_inherited_stack_flag.stdout.golden
  • tests/snapshots/TestCLICommands_tf_plan_help_shows_inherited_stack_flag.stdout.golden
  • website/blog/2026-06-30-atmos-demo-workflows.mdx
  • website/docs/cli/commands/describe/describe-component.mdx
  • website/docs/cli/commands/describe/describe-stacks.mdx
  • website/docs/cli/commands/emulator/usage.mdx
  • website/docs/cli/commands/list/list-stacks.mdx
  • website/docs/cli/commands/terraform/terraform-deploy.mdx
  • website/docs/cli/commands/terraform/terraform-output.mdx
  • website/docs/cli/commands/terraform/terraform-plan.mdx
  • website/docs/cli/commands/vendor/vendor-pull.mdx
  • website/plugins/file-browser/index.js
  • website/src/components/CastPlayer/index.tsx
  • website/src/components/CastPlayer/styles.module.css
  • website/src/components/EmbedExample/index.tsx
  • website/src/components/EmbedExample/styles.module.css
  • website/src/components/FileBrowser/DirectoryPage.tsx
  • website/src/components/FileBrowser/FileViewer.tsx
  • website/src/components/FileBrowser/styles.module.css
  • website/src/components/FileBrowser/types.ts
  • website/src/pages/cast-demo.module.css
  • website/src/pages/cast-demo.tsx
  • website/static/casts/cli/describe-component.cast
  • website/static/casts/cli/describe-stacks.cast
  • website/static/casts/cli/list-stacks.cast
  • website/static/casts/emulator/aws-lifecycle.cast
  • website/static/casts/terraform/deploy.cast
  • website/static/casts/terraform/output.cast
  • website/static/casts/terraform/plan.cast
  • website/static/casts/vendor/pull.cast

Comment thread cmd/cast/cast.go Outdated
Comment thread cmd/root.go
Comment thread demo/casts/atmos.yaml Outdated
Comment thread demo/casts/atmos.yaml Outdated
Comment thread demo/casts/fixtures/demo-vendoring/vendor.d/vendor1.yaml
Comment thread website/src/components/CastPlayer/index.tsx Outdated
Comment thread website/src/components/CastPlayer/styles.module.css Outdated
Comment thread website/src/pages/cast-demo.tsx
Comment thread website/static/casts/cli/describe-component.cast Outdated
Comment thread website/static/casts/emulator/aws-lifecycle.cast Outdated
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown

Warning

Release Documentation Required

This PR is labeled minor or major and requires documentation updates:

  • Changelog entry
  • Roadmap update - Update website/src/data/roadmap.js with the new milestone

Alternatively: If this change doesn't require release documentation, remove the minor or major label.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
pkg/schema/task_validate.go (1)

377-384: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Add a nested script case to the concurrent-step tests. validateConcurrentChild now accepts type: script, but pkg/schema/workflow_control_test.go only covers the rejected input child. Add a parallel/concurrent child test for TaskTypeScript so this path stays covered.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/schema/task_validate.go` around lines 377 - 384, Add test coverage for
the new allowed concurrent child type in validateConcurrentChild. In
pkg/schema/workflow_control_test.go, extend the concurrent/parallel step tests
to include a child WorkflowStep with TaskTypeScript, alongside the existing
rejected input case, so the TaskTypeScript branch in validateConcurrentChild
stays exercised.
pkg/workflow/executor.go (1)

360-377: 🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win

Route type: script steps through runShellStep unconditionally.
The container guard blocks plain script steps, so they fall through to runCommand and hit the unsupported-type error even though runShellStep already handles the host-shell fallback.

🐛 Suggested fix
-	if commandType == schema.TaskTypeScript && (StepContainerOverride(step) || (params.WorkflowDefinition.Container != nil && params.WorkflowDefinition.Container.IsEnabled() && !StepContainerDisabled(step))) {
+	if commandType == schema.TaskTypeScript {
 		err = e.runShellStep(params, step, cmdParams, workDir)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/workflow/executor.go` around lines 360 - 377, The command dispatch in
executor.go is still gating `schema.TaskTypeScript` behind the container check
in `executeStep`, which lets plain script steps fall through to `runCommand` and
fail. Update the `executeStep` branching so `type: script` always goes through
`runShellStep` first, relying on its host-shell fallback, and keep the
`stepPkg.IsExtendedStepType` path unchanged for extended steps.
🧹 Nitpick comments (2)
internal/exec/workflow_utils.go (1)

661-709: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy lift

Duplicated container-dispatch pattern between "shell" and script cases.

Lines 663-707 replicate the same "container override → container-enabled → default retry.Do" structure already used for commandType == "shell" at lines 551-604 (only the Command string differs: raw command vs. process.FormatScriptDisplay(...)). Consider extracting a shared helper (e.g. runContainerAwareStep(ctx, workflow, workflowPath, atmosConfig, workflowDefinition, &step, workDir, displayCommand, stepEnv, dryRun, &activeContainer)) to remove this duplication and keep the two paths in sync going forward.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/exec/workflow_utils.go` around lines 661 - 709, The script execution
branch in workflow step handling duplicates the same container-dispatch flow
already used for the shell path, so refactor the logic around commandType ==
schema.TaskTypeScript to reuse a shared helper instead of repeating the
override/enabled/default retry.Do structure. Extract the common behavior from
the step execution code in workflow_utils.go into a helper that takes the step,
workflow context, display command, and activeContainer handling, and use it for
both the shell and script cases so only the command formatting differs.
pkg/schema/task.go (1)

160-170: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add per-field doc comments for cast/session action fields, matching WorkflowStep.

Every other field group in this struct (interactive, log, HTTP, etc.) carries per-field trailing comments; these ten fields are undocumented even though the mirrored WorkflowStep fields (pkg/schema/workflow.go) already have them. Copying those comments over keeps the two structs in sync and avoids future drift.

♻️ Proposed fix
 	// Cast step and session action fields.
-	Mode        string `yaml:"mode,omitempty" json:"mode,omitempty" mapstructure:"mode"`
-	Shell       string `yaml:"shell,omitempty" json:"shell,omitempty" mapstructure:"shell"`
-	WriteRate   string `yaml:"write_rate,omitempty" json:"write_rate,omitempty" mapstructure:"write_rate"`
-	KeyInterval string `yaml:"key_interval,omitempty" json:"key_interval,omitempty" mapstructure:"key_interval"`
-	Text        string `yaml:"text,omitempty" json:"text,omitempty" mapstructure:"text"`
-	Regex       string `yaml:"regex,omitempty" json:"regex,omitempty" mapstructure:"regex"`
-	Key         string `yaml:"key,omitempty" json:"key,omitempty" mapstructure:"key"`
-	Duration    string `yaml:"duration,omitempty" json:"duration,omitempty" mapstructure:"duration"`
-	Interval    string `yaml:"interval,omitempty" json:"interval,omitempty" mapstructure:"interval"`
-	Repeat      int    `yaml:"repeat,omitempty" json:"repeat,omitempty" mapstructure:"repeat"`
+	Mode        string `yaml:"mode,omitempty" json:"mode,omitempty" mapstructure:"mode"`                         // Cast mode: steps or session.
+	Shell       string `yaml:"shell,omitempty" json:"shell,omitempty" mapstructure:"shell"`                      // Shell for session mode.
+	WriteRate   string `yaml:"write_rate,omitempty" json:"write_rate,omitempty" mapstructure:"write_rate"`       // Default delay between written bytes.
+	KeyInterval string `yaml:"key_interval,omitempty" json:"key_interval,omitempty" mapstructure:"key_interval"` // Default delay between repeated keys.
+	Text        string `yaml:"text,omitempty" json:"text,omitempty" mapstructure:"text"`                         // Text for write/wait actions.
+	Regex       string `yaml:"regex,omitempty" json:"regex,omitempty" mapstructure:"regex"`                      // Regex for wait actions.
+	Key         string `yaml:"key,omitempty" json:"key,omitempty" mapstructure:"key"`                            // Key name for key actions.
+	Duration    string `yaml:"duration,omitempty" json:"duration,omitempty" mapstructure:"duration"`             // Duration for pause/wait actions.
+	Interval    string `yaml:"interval,omitempty" json:"interval,omitempty" mapstructure:"interval"`             // Per-key repeat delay override.
+	Repeat      int    `yaml:"repeat,omitempty" json:"repeat,omitempty" mapstructure:"repeat"`                   // Key repeat count.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/schema/task.go` around lines 160 - 170, Add per-field doc comments for
the cast/session action fields in the task schema struct so they match the
corresponding fields in WorkflowStep. Update the field group containing Mode,
Shell, WriteRate, KeyInterval, Text, Regex, Key, Duration, Interval, and Repeat
with the same trailing descriptions already used in pkg/schema/workflow.go,
keeping the names and meanings aligned between the two structs.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@pkg/process/script.go`:
- Around line 32-41: In the script execution helper in pkg/process/script.go,
the default branch currently falls back to "-c" for any unhandled interpreter,
which causes some runtimes like Ruby to only syntax-check instead of running the
script. Update the fallback in the interpreter selection logic so the generic
path uses stdin-based execution like the Python case, or explicitly rejects
unsupported interpreters, and keep the fix centered in the switch over name that
builds the argv and reader.

In `@pkg/runner/step/script_test.go`:
- Around line 71-73: The test fixture path in script_test.go is built with
string concatenation, which violates the repo’s path rule. Update the fixture
path creation in the test that uses t.TempDir and os.WriteFile to use
filepath.Join instead of dir + "/sops-secrets.cast", keeping the same temporary
directory and filename while relying on the filepath package.

In `@pkg/runner/step/script.go`:
- Around line 124-150: Make the `workDir` and `step.Env` resolution failures
follow the same static-error wrapping convention as `interpreter` and `script`.
In `ScriptHandler.resolveWorkingDirectory` and `ScriptHandler.resolveEnv`,
replace the direct `fmt.Errorf(...)` returns with an
`errUtils.Build(errUtils.ErrTemplateEvaluation)...Err()`-style wrapper using the
existing sentinel from `errors/errors.go`, while preserving the current
contextual message and underlying error. Keep `vars.Resolve`,
`vars.ResolveEnvMap`, and the `step.Name` context intact so callers can use
`errors.Is()` consistently across all template-evaluation failures.

In `@pkg/schema/command.go`:
- Around line 111-133: decodeCommandEnvMapValue currently returns dynamic
fmt.Errorf-wrapped failures for decoder creation and Decode, but the review
requires static sentinel wrapping only. Add or reuse appropriate package-level
errors from errors/errors.go for the decoder initialization and command env
decode failure paths, then update the mapstructure.NewDecoder and decoder.Decode
branches in decodeCommandEnvMapValue to wrap those static errors while keeping
the existing command key context.

In `@pkg/utils/shell_utils.go`:
- Around line 97-98: The comment block in the shell utilities code is missing
terminal punctuation, which will fail the godot lint rule. Update the comment
near the environment-handling logic in the relevant helper so the last line ends
with a period, keeping the wording the same and ensuring the comment style
matches the rest of the Go codebase.

In `@pkg/workflow/control_executor.go`:
- Around line 90-109: The nested control-step execution path in executeScript
currently drops working_directory, so script, shell, and atmos children always
run from the default directory instead of the inherited one. Thread
working_directory through ControlCommandRequest from executeScript and the
related control execution methods, then make the command runner use that value
when launching the child process so it inherits the workflow/step directory
correctly.

In `@pkg/workflow/executor.go`:
- Around line 360-373: The early success return in `executor.go` for the
`commandType == schema.TaskTypeScript` branch skips registering step outputs.
Update `e.runShellStep` success handling in `runStep` to call
`e.stepVars.SetWithOutputs(...)` before returning, matching the fallback success
path so `StepResult` and `finalStack` are preserved and `{{
.steps.<name>.outputs.* }}` works for container-routed script steps. Use the
existing `step.Name`, `cmdParams`, and `stepVars` flow in this branch to wire
outputs consistently.

---

Outside diff comments:
In `@pkg/schema/task_validate.go`:
- Around line 377-384: Add test coverage for the new allowed concurrent child
type in validateConcurrentChild. In pkg/schema/workflow_control_test.go, extend
the concurrent/parallel step tests to include a child WorkflowStep with
TaskTypeScript, alongside the existing rejected input case, so the
TaskTypeScript branch in validateConcurrentChild stays exercised.

In `@pkg/workflow/executor.go`:
- Around line 360-377: The command dispatch in executor.go is still gating
`schema.TaskTypeScript` behind the container check in `executeStep`, which lets
plain script steps fall through to `runCommand` and fail. Update the
`executeStep` branching so `type: script` always goes through `runShellStep`
first, relying on its host-shell fallback, and keep the
`stepPkg.IsExtendedStepType` path unchanged for extended steps.

---

Nitpick comments:
In `@internal/exec/workflow_utils.go`:
- Around line 661-709: The script execution branch in workflow step handling
duplicates the same container-dispatch flow already used for the shell path, so
refactor the logic around commandType == schema.TaskTypeScript to reuse a shared
helper instead of repeating the override/enabled/default retry.Do structure.
Extract the common behavior from the step execution code in workflow_utils.go
into a helper that takes the step, workflow context, display command, and
activeContainer handling, and use it for both the shell and script cases so only
the command formatting differs.

In `@pkg/schema/task.go`:
- Around line 160-170: Add per-field doc comments for the cast/session action
fields in the task schema struct so they match the corresponding fields in
WorkflowStep. Update the field group containing Mode, Shell, WriteRate,
KeyInterval, Text, Regex, Key, Duration, Interval, and Repeat with the same
trailing descriptions already used in pkg/schema/workflow.go, keeping the names
and meanings aligned between the two structs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 974392f6-9743-4039-b78b-1a15185e462b

📥 Commits

Reviewing files that changed from the base of the PR and between 0dd6cb5 and ece1ca7.

📒 Files selected for processing (41)
  • cmd/cmd_utils.go
  • cmd/custom_command_integration_test.go
  • demo/casts/README.md
  • demo/casts/atmos.yaml
  • demo/casts/fixtures/native-terraform/atmos.yaml
  • examples/custom-commands/README.md
  • examples/quick-start-advanced/README.md
  • examples/quick-start-simple/README.md
  • examples/sops-secrets/README.md
  • examples/toolchain/README.md
  • internal/exec/shell_utils.go
  • internal/exec/workflow_utils.go
  • pkg/config/load.go
  • pkg/config/load_command_env_test.go
  • pkg/container/ephemeral.go
  • pkg/process/script.go
  • pkg/process/script_test.go
  • pkg/runner/step/command_handlers_test.go
  • pkg/runner/step/script.go
  • pkg/runner/step/script_test.go
  • pkg/runner/step/variables.go
  • pkg/runner/step/variables_test.go
  • pkg/schema/command.go
  • pkg/schema/command_test.go
  • pkg/schema/task.go
  • pkg/schema/task_test.go
  • pkg/schema/task_validate.go
  • pkg/schema/task_validate_test.go
  • pkg/schema/workflow.go
  • pkg/utils/shell_utils.go
  • pkg/workflow/container.go
  • pkg/workflow/control_executor.go
  • pkg/workflow/control_executor_test.go
  • pkg/workflow/executor.go
  • pkg/workflow/executor_test.go
  • website/docs/cli/commands/workflow.mdx
  • website/static/casts/examples/custom-commands.cast
  • website/static/casts/examples/quick-start-advanced.cast
  • website/static/casts/examples/quick-start-simple.cast
  • website/static/casts/examples/sops-secrets.cast
  • website/static/casts/examples/toolchain.cast
✅ Files skipped from review due to trivial changes (12)
  • examples/sops-secrets/README.md
  • website/static/casts/examples/custom-commands.cast
  • examples/toolchain/README.md
  • examples/custom-commands/README.md
  • website/static/casts/examples/quick-start-simple.cast
  • website/static/casts/examples/quick-start-advanced.cast
  • demo/casts/README.md
  • website/static/casts/examples/sops-secrets.cast
  • examples/quick-start-advanced/README.md
  • website/static/casts/examples/toolchain.cast
  • examples/quick-start-simple/README.md
  • website/docs/cli/commands/workflow.mdx
🚧 Files skipped from review as they are similar to previous changes (2)
  • demo/casts/fixtures/native-terraform/atmos.yaml
  • pkg/schema/workflow.go

Comment thread pkg/process/script.go
Comment thread pkg/runner/step/script_test.go
Comment thread pkg/runner/step/script.go
Comment thread pkg/schema/command.go
Comment thread pkg/utils/shell_utils.go
Comment thread pkg/workflow/control_executor.go
Comment thread pkg/workflow/executor.go
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown

Warning

Release Documentation Required

This PR is labeled minor or major and requires documentation updates:

  • Changelog entry
  • Roadmap update - Update website/src/data/roadmap.js with the new milestone

Alternatively: If this change doesn't require release documentation, remove the minor or major label.

@mergify

mergify Bot commented Jul 1, 2026

Copy link
Copy Markdown

💥 This pull request now has conflicts. Could you fix it Erik Osterman (Cloud Posse) (@osterman)? 🙏

@mergify mergify Bot added the conflict This PR has conflicts label Jul 1, 2026
@github-actions github-actions Bot removed the size/xl Extra large size PR label Jul 1, 2026
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 5, 2026
Comment thread pkg/provisioner/workdir/fs.go Fixed
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 5, 2026
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 5, 2026
@mergify

mergify Bot commented Jul 5, 2026

Copy link
Copy Markdown

💥 This pull request now has conflicts. Could you fix it Erik Osterman (Cloud Posse) (@osterman)? 🙏

# Conflicts:
#	docs/prd/flag-handling/unified-flag-parsing.md
#	tests/test-cases/atmos-cli-imports.yaml
#	tests/test-cases/auth-validation.yaml
@mergify

mergify Bot commented Jul 6, 2026

Copy link
Copy Markdown

💥 This pull request now has conflicts. Could you fix it Erik Osterman (Cloud Posse) (@osterman)? 🙏

@mergify

mergify Bot commented Jul 6, 2026

Copy link
Copy Markdown

💥 This pull request now has conflicts. Could you fix it Erik Osterman (Cloud Posse) (@osterman)? 🙏

# Conflicts:
#	cmd/cmd_utils.go
#	cmd/root.go
#	internal/exec/testmain_test.go
#	internal/exec/workflow_utils.go
#	internal/exec/workflow_utils_test.go
#	scripts/generate-notice.sh
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

Resource Changes Found for bucket in test

Atmos CI

create

Plan: 4 to add, 0 to change, 0 to destroy.
To reproduce this locally, run:

atmos terraform plan bucket -s test

Create

+ aws_s3_bucket.checkov_target
+ aws_s3_bucket.this
+ aws_s3_bucket.trivy_target
+ aws_s3_bucket_public_access_block.trivy_target
Terraform Plan Summary
  # aws_s3_bucket.checkov_target will be created
  + resource "aws_s3_bucket" "checkov_target" {
      + acceleration_status         = (known after apply)
      + acl                         = (known after apply)
      + arn                         = (known after apply)
      + bucket                      = "atmos-native-ci-e2e-checkov-test"
      + bucket_domain_name          = (known after apply)
      + bucket_prefix               = (known after apply)
      + bucket_regional_domain_name = (known after apply)
      + force_destroy               = false
      + hosted_zone_id              = (known after apply)
      + id                          = (known after apply)
      + object_lock_enabled         = (known after apply)
      + policy                      = (known after apply)
      + region                      = (known after apply)
      + request_payer               = (known after apply)
      + tags_all                    = (known after apply)
      + website_domain              = (known after apply)
      + website_endpoint            = (known after apply)

      + cors_rule (known after apply)

      + grant (known after apply)

      + lifecycle_rule (known after apply)

      + logging (known after apply)

      + object_lock_configuration (known after apply)

      + replication_configuration (known after apply)

      + server_side_encryption_configuration (known after apply)

      + versioning (known after apply)

      + website (known after apply)
    }

  # aws_s3_bucket.this will be created
  + resource "aws_s3_bucket" "this" {
      + acceleration_status         = (known after apply)
      + acl                         = (known after apply)
      + arn                         = (known after apply)
      + bucket                      = "atmos-native-ci-e2e-test"
      + bucket_domain_name          = (known after apply)
      + bucket_prefix               = (known after apply)
      + bucket_regional_domain_name = (known after apply)
      + force_destroy               = false
      + hosted_zone_id              = (known after apply)
      + id                          = (known after apply)
      + object_lock_enabled         = (known after apply)
      + policy                      = (known after apply)
      + region                      = (known after apply)
      + request_payer               = (known after apply)
      + tags                        = {
          + "AtmosFixture" = "native-ci-e2e"
          + "Stage"        = "test"
        }
      + tags_all                    = {
          + "AtmosFixture" = "native-ci-e2e"
          + "Stage"        = "test"
        }
      + website_domain              = (known after apply)
      + website_endpoint            = (known after apply)

      + cors_rule (known after apply)

      + grant (known after apply)

      + lifecycle_rule (known after apply)

      + logging (known after apply)

      + object_lock_configuration (known after apply)

      + replication_configuration (known after apply)

      + server_side_encryption_configuration (known after apply)

      + versioning (known after apply)

      + website (known after apply)
    }

  # aws_s3_bucket.trivy_target will be created
  + resource "aws_s3_bucket" "trivy_target" {
      + acceleration_status         = (known after apply)
      + acl                         = (known after apply)
      + arn                         = (known after apply)
      + bucket                      = "atmos-native-ci-e2e-trivy-test"
      + bucket_domain_name          = (known after apply)
      + bucket_prefix               = (known after apply)
      + bucket_regional_domain_name = (known after apply)
      + force_destroy               = false
      + hosted_zone_id              = (known after apply)
      + id                          = (known after apply)
      + object_lock_enabled         = (known after apply)
      + policy                      = (known after apply)
      + region                      = (known after apply)
      + request_payer               = (known after apply)
      + tags_all                    = (known after apply)
      + website_domain              = (known after apply)
      + website_endpoint            = (known after apply)

      + cors_rule (known after apply)

      + grant (known after apply)

      + lifecycle_rule (known after apply)

      + logging (known after apply)

      + object_lock_configuration (known after apply)

      + replication_configuration (known after apply)

      + server_side_encryption_configuration (known after apply)

      + versioning (known after apply)

      + website (known after apply)
    }

  # aws_s3_bucket_public_access_block.trivy_target will be created
  + resource "aws_s3_bucket_public_access_block" "trivy_target" {
      + block_public_acls       = true
      + block_public_policy     = true
      + bucket                  = (known after apply)
      + id                      = (known after apply)
      + ignore_public_acls      = true
      + restrict_public_buckets = true
    }

Plan: 4 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + bucket_name = "atmos-native-ci-e2e-test"

@mergify

mergify Bot commented Jul 6, 2026

Copy link
Copy Markdown

💥 This pull request now has conflicts. Could you fix it Erik Osterman (Cloud Posse) (@osterman)? 🙏

coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 7, 2026
# Conflicts:
#	cmd/cast/cast.go
#	cmd/cast/recording.go
#	cmd/cast/recording_test.go
#	cmd/cmd_utils.go
#	cmd/help_template.go
#	cmd/root.go
#	cmd/root_helpers_test.go
#	errors/errors.go
#	pkg/asciicast/cellgrid.go
#	pkg/asciicast/cellgrid_test.go
#	pkg/asciicast/exec.go
#	pkg/asciicast/exec_test.go
#	pkg/asciicast/recorder.go
#	pkg/asciicast/recorder_test.go
#	pkg/asciicast/render_static_test.go
#	pkg/asciicast/render_test.go
#	pkg/asciicast/session.go
#	pkg/asciicast/session_test.go
#	pkg/asciicast/session_unix.go
#	pkg/asciicast/session_windows.go
#	pkg/asciicast/testmain_test.go
#	pkg/config/command_merge_core_test.go
#	pkg/datafetcher/schema/config/global/1.0.json
#	pkg/process/script.go
#	pkg/process/script_test.go
#	pkg/provisioner/source/vendor.go
#	pkg/provisioner/source/vendor_test.go
#	pkg/runner/step/cast.go
#	pkg/runner/step/cast_simulate.go
#	pkg/runner/step/cast_test.go
#	pkg/runner/step/script_test.go
#	pkg/runner/step/workdir_test.go
#	pkg/schema/command_test.go
#	pkg/schema/schema.go
#	pkg/schema/workflow.go
#	pkg/schema/workflow_control_test.go
#	pkg/terminal/pty/pty_test.go
#	pkg/terminal/terminal.go
#	pkg/terminal/terminal_test.go
#	pkg/ui/formatter_test.go
#	tests/cli_auth_login_provider_test.go
#	tests/snapshots/TestCLICommands_atmos_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_--help_config_aliases_section.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_about_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_atlantis_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_atlantis_generate_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_atlantis_generate_help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_atlantis_generate_repo-config_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_atlantis_generate_repo-config_help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_atlantis_help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_auth_env_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_auth_exec_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_auth_login_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_auth_user_configure_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_auth_validate_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_auth_whoami_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_helmfile_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_helmfile_apply_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_helmfile_apply_help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_helmfile_help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_terraform_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_terraform_--help_alias_subcommand_check.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_terraform_apply_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_terraform_apply_help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_terraform_help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_toolchain_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_toolchain_info_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_toolchain_install_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_validate_editorconfig_--help.stdout.golden
#	tests/snapshots/TestCLICommands_atmos_validate_editorconfig_help.stdout.golden
#	tests/snapshots/TestCLICommands_config_alias_tp_--help_shows_terraform_plan_help.stdout.golden
#	tests/snapshots/TestCLICommands_config_alias_tr_--help_shows_terraform_help.stdout.golden
#	tests/snapshots/TestCLICommands_deploy_component_help_shows_stack_flag.stdout.golden
#	tests/snapshots/TestCLICommands_describe_component_help_shows_stack_flag.stdout.golden
#	tests/snapshots/TestCLICommands_echo_info_help_shows_verbose_flag.stdout.golden
#	tests/snapshots/TestCLICommands_help_flag_works.stdout.golden
#	tests/snapshots/TestCLICommands_show_component_help_shows_inherited_stack_flag.stdout.golden
#	tests/snapshots/TestCLICommands_terraform_help_shows_stack_flag.stdout.golden
#	tests/snapshots/TestCLICommands_terraform_provision_help_shows_inherited_stack_flag.stdout.golden
#	tests/snapshots/TestCLICommands_tf_plan_help_shows_inherited_stack_flag.stdout.golden
Prevents "Incomplete lock file information" warnings when the recorded
secrets-masking cast (or anyone running the example fresh) plans the
demo-dev-test workspace, matching the per-instance lock convention
already used in examples/quick-start-advanced.
@mergify

mergify Bot commented Jul 8, 2026

Copy link
Copy Markdown

💥 This pull request now has conflicts. Could you fix it Erik Osterman (Cloud Posse) (@osterman)? 🙏

# Conflicts:
#	demo/screengrabs/demo-stacks.txt
#	internal/exec/docs_generate_test.go
…ndor commands

The new `atmos config`, `atmos stack`, and `atmos vendor get/set/update/diff`
docs pages (from the format-preserving YAML edits merge) still imported the
`Screengrab` component, which this branch already removed in favor of the
static-cast `CastPlayer` system. That broke the website build with 25
"Module not found" errors.

Converts all 25 pages to `CastPlayer` and records their `--help` screengrabs
via the existing `casts generate screengrabs cli` pipeline.

Recording those screengrabs surfaced a real regression: a prior merge
decision made non-TTY width detection ignore COLUMNS entirely (to keep CI
snapshots stable), which silently broke the docs screengrab pipeline's
90-column recording width, causing --help output to wrap at the 120-column
default instead. Fixed by:
- Wiring ATMOS_CAST_RECORDING_WIDTH/HEIGHT to cast.recording.width/height
  (pkg/config/load.go), so the recorder's own declared dimensions honor it.
- Letting --force-tty mode honor ATMOS_CAST_RECORDING_WIDTH specifically
  (pkg/terminal/terminal.go), since that variable is only ever set
  deliberately by recording pipelines, never ambiently like COLUMNS.
@atmos-pro

atmos-pro Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Tip

Atmos Pro  

No affected stacks workflow was detected for this pull request.
If this is expected, no action is needed.
Learn More. Ask AI.

@github-actions

Copy link
Copy Markdown

These changes were released in v1.223.0-rc.7.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

minor New features that do not break anything size/xxl

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants