gitextract_5epp6u6d/ ├── .adr-dir ├── .clusterfuzzlite/ │ ├── Dockerfile │ └── build.sh ├── .codecov.yml ├── .dockerignore ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── cherry-pick-bot.yml │ ├── copilot-instructions.md │ ├── labeler.yml │ ├── release.yml │ ├── renovate.json5 │ ├── styles/ │ │ └── Atlantis/ │ │ └── ProductTerms.yml │ └── workflows/ │ ├── atlantis-image.yml │ ├── clusterfuzzlite.yml │ ├── codeql.yml │ ├── dependency-review.yml │ ├── labeler.yml │ ├── lint.yml │ ├── pr-lint.yml │ ├── pr-size-labeler.yml │ ├── release.yml │ ├── renovate-config.yml │ ├── scorecard.yml │ ├── stale.yml │ ├── test.yml │ ├── testing-env-image.yml │ └── website.yml ├── .gitignore ├── .golangci.yml ├── .goreleaser.yml ├── .lycheeignore ├── .markdownlint.yaml ├── .node-version ├── .pre-commit-config.yaml ├── .tool-versions ├── .vale.ini ├── .vscode/ │ └── settings.json ├── ADOPTERS.md ├── CHANGELOG.md ├── CODEOWNERS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile ├── Dockerfile.dev ├── LICENSE ├── MAINTAINERS.md ├── Makefile ├── README.md ├── RELEASE.md ├── SECURITY.md ├── _typos.toml ├── atlantis-features-version-analysis.md ├── cmd/ │ ├── bootstrap.go │ ├── cmd.go │ ├── help_fmt.go │ ├── root.go │ ├── server.go │ ├── server_test.go │ └── version.go ├── docker-compose.yml ├── docker-entrypoint.sh ├── docs/ │ └── adr/ │ └── 0001-record-architecture-decisions.md ├── e2e/ │ ├── .gitignore │ ├── Makefile │ ├── README.md │ ├── e2e.go │ ├── github.go │ ├── gitlab.go │ ├── go.mod │ ├── go.sum │ ├── main.go │ └── vcs.go ├── go.mod ├── go.sum ├── goss.yaml ├── kustomize/ │ ├── bundle.yaml │ └── kustomization.yaml ├── main.go ├── netlify.toml ├── package.json ├── playwright.config.cjs ├── runatlantis.io/ │ ├── .vitepress/ │ │ ├── components/ │ │ │ ├── Banner.vue │ │ │ └── shims.d.ts │ │ ├── config.ts │ │ ├── navbars.ts │ │ ├── sidebars.ts │ │ └── theme/ │ │ └── index.ts │ ├── blog/ │ │ ├── 2017/ │ │ │ └── introducing-atlantis.md │ │ ├── 2018/ │ │ │ ├── atlantis-0-4-4-now-supports-bitbucket.md │ │ │ ├── hosting-our-static-site/ │ │ │ │ └── code/ │ │ │ │ ├── cloudfront.tf │ │ │ │ ├── dns.tf │ │ │ │ ├── full.tf │ │ │ │ ├── main.tf │ │ │ │ ├── s3-bucket.tf │ │ │ │ └── ssl-cert.tf │ │ │ ├── hosting-our-static-site-over-ssl-with-s3-acm-cloudfront-and-terraform.md │ │ │ ├── joining-hashicorp.md │ │ │ ├── putting-the-dev-into-devops-why-your-developers-should-write-terraform-too.md │ │ │ └── terraform-and-the-dangers-of-applying-locally.md │ │ ├── 2019/ │ │ │ └── 4-reasons-to-try-hashicorps-new-free-terraform-remote-state-storage.md │ │ ├── 2024/ │ │ │ ├── april-2024-survey-results.md │ │ │ └── integrating-atlantis-with-opentofu.md │ │ └── 2025/ │ │ └── atlantis-on-google-cloud-run.md │ ├── blog.md │ ├── contributing/ │ │ ├── events-controller.md │ │ └── glossary.md │ ├── contributing.md │ ├── docs/ │ │ ├── access-credentials.md │ │ ├── api-endpoints.md │ │ ├── apply-requirements.md │ │ ├── automerging.md │ │ ├── autoplanning.md │ │ ├── checkout-strategy.md │ │ ├── command-requirements.md │ │ ├── configuring-atlantis.md │ │ ├── configuring-webhooks.md │ │ ├── custom-policy-checks.md │ │ ├── custom-workflows.md │ │ ├── deployment.md │ │ ├── faq.md │ │ ├── how-atlantis-works.md │ │ ├── installation-guide.md │ │ ├── locking.md │ │ ├── policy-checking.md │ │ ├── post-workflow-hooks.md │ │ ├── pre-workflow-hooks.md │ │ ├── provider-credentials.md │ │ ├── repo-and-project-permissions.md │ │ ├── repo-level-atlantis-yaml.md │ │ ├── requirements.md │ │ ├── security.md │ │ ├── sending-notifications-via-webhooks.md │ │ ├── server-configuration.md │ │ ├── server-side-repo-config.md │ │ ├── stats.md │ │ ├── streaming-logs.md │ │ ├── terraform-cloud.md │ │ ├── terraform-versions.md │ │ ├── troubleshooting-https.md │ │ ├── upgrading-atlantis-yaml.md │ │ ├── using-atlantis.md │ │ └── webhook-secrets.md │ ├── docs.md │ ├── e2e/ │ │ └── site-check.spec.js │ ├── guide/ │ │ ├── test-drive.md │ │ └── testing-locally.md │ ├── guide.md │ ├── index.md │ └── terraform/ │ ├── main.tf │ └── versions.tf ├── scripts/ │ ├── addlicense.sh │ ├── coverage.sh │ ├── download-release.sh │ ├── e2e.sh │ ├── fmt.sh │ ├── go-generate.sh │ └── pin_ci_terraform_providers.sh ├── server/ │ ├── controllers/ │ │ ├── api_controller.go │ │ ├── api_controller_test.go │ │ ├── events/ │ │ │ ├── azuredevops_request_validator.go │ │ │ ├── azuredevops_request_validator_test.go │ │ │ ├── events_controller.go │ │ │ ├── events_controller_e2e_test.go │ │ │ ├── events_controller_test.go │ │ │ ├── github_request_validator.go │ │ │ ├── github_request_validator_test.go │ │ │ ├── gitlab_request_parser_validator.go │ │ │ ├── gitlab_request_parser_validator_test.go │ │ │ ├── mocks/ │ │ │ │ ├── mock_azuredevops_request_validator.go │ │ │ │ ├── mock_github_request_validator.go │ │ │ │ └── mock_gitlab_request_parser_validator.go │ │ │ └── testdata/ │ │ │ ├── bb-server-pull-deleted-event.json │ │ │ ├── githubIssueCommentEvent.json │ │ │ ├── githubIssueCommentEvent_notAllowlisted.json │ │ │ ├── githubPullRequestClosedEvent.json │ │ │ ├── githubPullRequestOpenedEvent.json │ │ │ ├── gitlabMergeCommentEvent_notAllowlisted.json │ │ │ ├── gitlabMergeCommentEvent_shouldIgnore.json │ │ │ ├── null_provider_lockfile_old_version │ │ │ └── test-repos/ │ │ │ ├── automerge/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── dir1/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── versions.tf │ │ │ │ ├── dir2/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── versions.tf │ │ │ │ ├── exp-output-apply-dir1.txt │ │ │ │ ├── exp-output-apply-dir2.txt │ │ │ │ ├── exp-output-automerge.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ └── exp-output-merge.txt │ │ │ ├── import-multiple-project/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── dir1/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── versions.tf │ │ │ │ ├── dir2/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── versions.tf │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-import-dummy1.txt │ │ │ │ ├── exp-output-import-multiple-projects.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ └── exp-output-plan-again.txt │ │ │ ├── import-single-project/ │ │ │ │ ├── exp-output-apply-no-projects.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-import-dummy1.txt │ │ │ │ ├── exp-output-import-dummy2.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── exp-output-plan-again.txt │ │ │ │ ├── main.tf │ │ │ │ └── versions.tf │ │ │ ├── import-single-project-var/ │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-import-count.txt │ │ │ │ ├── exp-output-import-foreach.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── exp-output-plan-again.txt │ │ │ │ ├── main.tf │ │ │ │ └── versions.tf │ │ │ ├── import-workspace/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── dir1/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── versions.tf │ │ │ │ ├── exp-output-import-dir1-ops-dummy1.txt │ │ │ │ ├── exp-output-import-dir1-ops-dummy2.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ └── exp-output-plan.txt │ │ │ ├── modules/ │ │ │ │ ├── exp-output-apply-production.txt │ │ │ │ ├── exp-output-apply-staging.txt │ │ │ │ ├── exp-output-autoplan-only-staging.txt │ │ │ │ ├── exp-output-merge-all-dirs.txt │ │ │ │ ├── exp-output-merge-only-staging.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── exp-output-plan-production.txt │ │ │ │ ├── exp-output-plan-staging.txt │ │ │ │ ├── modules/ │ │ │ │ │ └── null/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── versions.tf │ │ │ │ ├── production/ │ │ │ │ │ └── main.tf │ │ │ │ └── staging/ │ │ │ │ └── main.tf │ │ │ ├── modules-yaml/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply-production.txt │ │ │ │ ├── exp-output-apply-staging.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge-all-dirs.txt │ │ │ │ ├── exp-output-merge-only-staging.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── exp-output-plan-production.txt │ │ │ │ ├── exp-output-plan-staging.txt │ │ │ │ ├── modules/ │ │ │ │ │ └── null/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── versions.tf │ │ │ │ ├── production/ │ │ │ │ │ └── main.tf │ │ │ │ └── staging/ │ │ │ │ └── main.tf │ │ │ ├── policy-checks/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply-failed.txt │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-approve-policies.txt │ │ │ │ ├── exp-output-auto-policy-check.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── policies/ │ │ │ │ │ └── policy.rego │ │ │ │ ├── repos.yaml │ │ │ │ └── versions.tf │ │ │ ├── policy-checks-apply-reqs/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply-failed.txt │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-approve-policies.txt │ │ │ │ ├── exp-output-auto-policy-check.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── policies/ │ │ │ │ │ └── policy.rego │ │ │ │ ├── repos.yaml │ │ │ │ └── versions.tf │ │ │ ├── policy-checks-clear-approval/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply-failed.txt │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-approve-policies-clear.txt │ │ │ │ ├── exp-output-approve-policies-success.txt │ │ │ │ ├── exp-output-approve-policies.txt │ │ │ │ ├── exp-output-auto-policy-check.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── policies/ │ │ │ │ │ └── policy.rego │ │ │ │ ├── repos.yaml │ │ │ │ └── versions.tf │ │ │ ├── policy-checks-custom-run-steps/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply-failed.txt │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-approve-policies.txt │ │ │ │ ├── exp-output-auto-policy-check.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── policies/ │ │ │ │ │ └── policy.rego │ │ │ │ ├── repos.yaml │ │ │ │ └── versions.tf │ │ │ ├── policy-checks-diff-owner/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply-failed.txt │ │ │ │ ├── exp-output-approve-policies.txt │ │ │ │ ├── exp-output-auto-policy-check.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── policies/ │ │ │ │ │ └── policy.rego │ │ │ │ ├── repos.yaml │ │ │ │ └── versions.tf │ │ │ ├── policy-checks-disabled-previous-match/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply-failed.txt │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-approve-policies.txt │ │ │ │ ├── exp-output-auto-policy-check.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── policies/ │ │ │ │ │ └── policy.rego │ │ │ │ ├── repos.yaml │ │ │ │ └── versions.tf │ │ │ ├── policy-checks-disabled-repo/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply-failed.txt │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-approve-policies.txt │ │ │ │ ├── exp-output-auto-policy-check.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── policies/ │ │ │ │ │ └── policy.rego │ │ │ │ ├── repos.yaml │ │ │ │ └── versions.tf │ │ │ ├── policy-checks-disabled-repo-server-side/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply-failed.txt │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-approve-policies.txt │ │ │ │ ├── exp-output-auto-policy-check.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── policies/ │ │ │ │ │ └── policy.rego │ │ │ │ ├── repos.yaml │ │ │ │ └── versions.tf │ │ │ ├── policy-checks-enabled-repo/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply-failed.txt │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-approve-policies.txt │ │ │ │ ├── exp-output-auto-policy-check.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── policies/ │ │ │ │ │ └── policy.rego │ │ │ │ ├── repos.yaml │ │ │ │ └── versions.tf │ │ │ ├── policy-checks-enabled-repo-server-side/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply-failed.txt │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-approve-policies.txt │ │ │ │ ├── exp-output-auto-policy-check.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── policies/ │ │ │ │ │ └── policy.rego │ │ │ │ ├── repos.yaml │ │ │ │ └── versions.tf │ │ │ ├── policy-checks-extra-args/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply-failed.txt │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-approve-policies.txt │ │ │ │ ├── exp-output-auto-policy-check.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── policies/ │ │ │ │ │ └── policy.rego │ │ │ │ ├── repos.yaml │ │ │ │ └── versions.tf │ │ │ ├── policy-checks-multi-projects/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── dir1/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── versions.tf │ │ │ │ ├── dir2/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── versions.tf │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-auto-policy-check-quiet.txt │ │ │ │ ├── exp-output-auto-policy-check.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── policies/ │ │ │ │ │ └── policy.rego │ │ │ │ └── repos.yaml │ │ │ ├── policy-checks-success-silent/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── policies/ │ │ │ │ │ └── policy.rego │ │ │ │ └── repos.yaml │ │ │ ├── repo-config-file/ │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ └── infrastructure/ │ │ │ │ ├── custom-name-atlantis.yaml │ │ │ │ ├── production/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── versions.tf │ │ │ │ └── staging/ │ │ │ │ ├── main.tf │ │ │ │ └── versions.tf │ │ │ ├── server-side-cfg/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-apply-default-workspace.txt │ │ │ │ ├── exp-output-apply-staging-workspace.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── repos.yaml │ │ │ │ └── versions.tf │ │ │ ├── simple/ │ │ │ │ ├── exp-output-allow-command-unknown-import.txt │ │ │ │ ├── exp-output-apply-var-all.txt │ │ │ │ ├── exp-output-apply-var-default-workspace.txt │ │ │ │ ├── exp-output-apply-var-new-workspace.txt │ │ │ │ ├── exp-output-apply-var.txt │ │ │ │ ├── exp-output-apply.txt │ │ │ │ ├── exp-output-atlantis-plan-new-workspace.txt │ │ │ │ ├── exp-output-atlantis-plan-var-overridden.txt │ │ │ │ ├── exp-output-atlantis-plan.txt │ │ │ │ ├── exp-output-auto-policy-check.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge-workspaces.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ └── versions.tf │ │ │ ├── simple-with-lockfile/ │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-plan.txt │ │ │ │ ├── main.tf │ │ │ │ └── versions.tf │ │ │ ├── simple-yaml/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── exp-output-allow-command-unknown-apply.txt │ │ │ │ ├── exp-output-apply-all.txt │ │ │ │ ├── exp-output-apply-default.txt │ │ │ │ ├── exp-output-apply-locked.txt │ │ │ │ ├── exp-output-apply-staging.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── exp-output-plan-default.txt │ │ │ │ ├── exp-output-plan-staging.txt │ │ │ │ ├── main.tf │ │ │ │ ├── staging.tfvars │ │ │ │ └── versions.tf │ │ │ ├── state-rm-multiple-project/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── dir1/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── versions.tf │ │ │ │ ├── dir2/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── versions.tf │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-import-dummy1.txt │ │ │ │ ├── exp-output-import-dummy2.txt │ │ │ │ ├── exp-output-merged.txt │ │ │ │ ├── exp-output-plan-again.txt │ │ │ │ ├── exp-output-plan.txt │ │ │ │ └── exp-output-state-rm-multiple-projects.txt │ │ │ ├── state-rm-single-project/ │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-import-count.txt │ │ │ │ ├── exp-output-import-foreach.txt │ │ │ │ ├── exp-output-import-simple.txt │ │ │ │ ├── exp-output-merged.txt │ │ │ │ ├── exp-output-plan-again.txt │ │ │ │ ├── exp-output-plan.txt │ │ │ │ ├── exp-output-state-rm-foreach.txt │ │ │ │ ├── exp-output-state-rm-multiple.txt │ │ │ │ ├── main.tf │ │ │ │ └── versions.tf │ │ │ ├── state-rm-workspace/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── dir1/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── versions.tf │ │ │ │ ├── exp-output-import-dummy1.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── exp-output-plan-again.txt │ │ │ │ ├── exp-output-plan.txt │ │ │ │ └── exp-output-state-rm-dummy1.txt │ │ │ ├── tfvars-yaml/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── default.backend.tfvars │ │ │ │ ├── default.tfvars │ │ │ │ ├── exp-output-apply-default.txt │ │ │ │ ├── exp-output-apply-staging.txt │ │ │ │ ├── exp-output-autoplan.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── main.tf │ │ │ │ ├── staging.backend.tfvars │ │ │ │ ├── staging.tfvars │ │ │ │ └── versions.tf │ │ │ ├── tfvars-yaml-no-autoplan/ │ │ │ │ ├── atlantis.yaml │ │ │ │ ├── default.backend.tfvars │ │ │ │ ├── default.tfvars │ │ │ │ ├── exp-output-apply-default.txt │ │ │ │ ├── exp-output-apply-staging.txt │ │ │ │ ├── exp-output-merge.txt │ │ │ │ ├── exp-output-plan-default.txt │ │ │ │ ├── exp-output-plan-staging.txt │ │ │ │ ├── main.tf │ │ │ │ ├── staging.backend.tfvars │ │ │ │ ├── staging.tfvars │ │ │ │ └── versions.tf │ │ │ └── workspace-parallel-yaml/ │ │ │ ├── atlantis.yaml │ │ │ ├── exp-output-apply-all-production.txt │ │ │ ├── exp-output-apply-all-staging.txt │ │ │ ├── exp-output-autoplan-production.txt │ │ │ ├── exp-output-autoplan-staging.txt │ │ │ ├── exp-output-merge.txt │ │ │ ├── production/ │ │ │ │ ├── main.tf │ │ │ │ └── versions.tf │ │ │ └── staging/ │ │ │ ├── main.tf │ │ │ └── versions.tf │ │ ├── github_app_controller.go │ │ ├── jobs_controller.go │ │ ├── locks_controller.go │ │ ├── locks_controller_test.go │ │ ├── status_controller.go │ │ ├── status_controller_test.go │ │ ├── web_templates/ │ │ │ ├── mocks/ │ │ │ │ └── mock_template_writer.go │ │ │ ├── templates/ │ │ │ │ ├── github-app.html.tmpl │ │ │ │ ├── index.html.tmpl │ │ │ │ ├── lock.html.tmpl │ │ │ │ ├── project-jobs-error.html.tmpl │ │ │ │ └── project-jobs.html.tmpl │ │ │ ├── web_templates.go │ │ │ └── web_templates_test.go │ │ └── websocket/ │ │ ├── mux.go │ │ ├── mux_test.go │ │ └── writer.go │ ├── core/ │ │ ├── boltdb/ │ │ │ ├── boltdb.go │ │ │ └── boltdb_test.go │ │ ├── config/ │ │ │ ├── cfgfuzz/ │ │ │ │ └── fuzz_test.go │ │ │ ├── parser_validator.go │ │ │ ├── parser_validator_test.go │ │ │ ├── raw/ │ │ │ │ ├── autodiscover.go │ │ │ │ ├── autodiscover_test.go │ │ │ │ ├── autoplan.go │ │ │ │ ├── autoplan_test.go │ │ │ │ ├── global_cfg.go │ │ │ │ ├── metrics.go │ │ │ │ ├── metrics_test.go │ │ │ │ ├── policies.go │ │ │ │ ├── policies_test.go │ │ │ │ ├── project.go │ │ │ │ ├── project_test.go │ │ │ │ ├── raw.go │ │ │ │ ├── raw_test.go │ │ │ │ ├── repo_cfg.go │ │ │ │ ├── repo_cfg_test.go │ │ │ │ ├── repo_locks.go │ │ │ │ ├── repo_locks_test.go │ │ │ │ ├── stage.go │ │ │ │ ├── stage_test.go │ │ │ │ ├── step.go │ │ │ │ ├── step_test.go │ │ │ │ ├── team_authz.go │ │ │ │ ├── workflow.go │ │ │ │ ├── workflow_step.go │ │ │ │ ├── workflow_step_test.go │ │ │ │ └── workflow_test.go │ │ │ └── valid/ │ │ │ ├── autodiscover.go │ │ │ ├── autodiscover_test.go │ │ │ ├── global_cfg.go │ │ │ ├── global_cfg_test.go │ │ │ ├── policies.go │ │ │ ├── policies_test.go │ │ │ ├── repo_cfg.go │ │ │ ├── repo_cfg_test.go │ │ │ ├── repo_locks.go │ │ │ ├── team_authz.go │ │ │ └── valid.go │ │ ├── db/ │ │ │ ├── db.go │ │ │ └── mocks/ │ │ │ └── mock_database.go │ │ ├── locking/ │ │ │ ├── apply_locking.go │ │ │ ├── locking.go │ │ │ ├── locking_test.go │ │ │ └── mocks/ │ │ │ ├── mock_apply_lock_checker.go │ │ │ ├── mock_apply_locker.go │ │ │ └── mock_locker.go │ │ ├── redis/ │ │ │ ├── redis.go │ │ │ └── redis_test.go │ │ ├── runtime/ │ │ │ ├── apply_step_runner.go │ │ │ ├── apply_step_runner_internal_test.go │ │ │ ├── apply_step_runner_test.go │ │ │ ├── cache/ │ │ │ │ ├── mocks/ │ │ │ │ │ ├── mock_key_serializer.go │ │ │ │ │ └── mock_version_path.go │ │ │ │ ├── version_path.go │ │ │ │ └── version_path_test.go │ │ │ ├── common/ │ │ │ │ ├── common.go │ │ │ │ └── common_test.go │ │ │ ├── env_step_runner.go │ │ │ ├── env_step_runner_test.go │ │ │ ├── executor.go │ │ │ ├── external_team_allowlist_runner.go │ │ │ ├── import_step_runner.go │ │ │ ├── import_step_runner_test.go │ │ │ ├── init_step_runner.go │ │ │ ├── init_step_runner_test.go │ │ │ ├── minimum_version_step_runner_delegate.go │ │ │ ├── minimum_version_step_runner_delegate_test.go │ │ │ ├── mocks/ │ │ │ │ ├── mock_async_tfexec.go │ │ │ │ ├── mock_external_team_allowlist_runner.go │ │ │ │ ├── mock_post_workflows_hook_runner.go │ │ │ │ ├── mock_pre_workflows_hook_runner.go │ │ │ │ ├── mock_pull_approved_checker.go │ │ │ │ ├── mock_runner.go │ │ │ │ ├── mock_status_updater.go │ │ │ │ └── mock_versionedexecutorworkflow.go │ │ │ ├── models/ │ │ │ │ ├── exec.go │ │ │ │ ├── filepath.go │ │ │ │ ├── mocks/ │ │ │ │ │ ├── mock_exec.go │ │ │ │ │ └── mock_filepath.go │ │ │ │ ├── shell_command_runner.go │ │ │ │ └── shell_command_runner_test.go │ │ │ ├── multienv_step_runner.go │ │ │ ├── multienv_step_runner_internal_test.go │ │ │ ├── multienv_step_runner_test.go │ │ │ ├── plan_step_runner.go │ │ │ ├── plan_step_runner_test.go │ │ │ ├── plan_type_step_runner_delegate.go │ │ │ ├── plan_type_step_runner_delegate_test.go │ │ │ ├── policy/ │ │ │ │ ├── conftest_client.go │ │ │ │ ├── conftest_client_test.go │ │ │ │ └── mocks/ │ │ │ │ ├── mock_conftest_client.go │ │ │ │ └── mock_downloader.go │ │ │ ├── policy_check_step_runner.go │ │ │ ├── policy_check_step_runner_test.go │ │ │ ├── post_workflow_hook_runner.go │ │ │ ├── post_workflow_hook_runner_test.go │ │ │ ├── pre_workflow_hook_runner.go │ │ │ ├── pre_workflow_hook_runner_test.go │ │ │ ├── pull_approved_checker.go │ │ │ ├── run_step_runner.go │ │ │ ├── run_step_runner_test.go │ │ │ ├── runtime.go │ │ │ ├── runtime_test.go │ │ │ ├── show_step_runner.go │ │ │ ├── show_step_runner_test.go │ │ │ ├── state_rm_step_runner.go │ │ │ ├── state_rm_step_runner_test.go │ │ │ ├── version_step_runner.go │ │ │ ├── version_step_runner_test.go │ │ │ ├── workspace_step_runner_delegate.go │ │ │ └── workspace_step_runner_delegate_test.go │ │ └── terraform/ │ │ ├── ansi/ │ │ │ ├── strip.go │ │ │ └── strip_test.go │ │ ├── distribution.go │ │ ├── distribution_test.go │ │ ├── downloader.go │ │ ├── downloader_test.go │ │ ├── mocks/ │ │ │ └── mock_downloader.go │ │ └── tfclient/ │ │ ├── mocks/ │ │ │ └── mock_terraform_client.go │ │ ├── terraform_client.go │ │ ├── terraform_client_internal_test.go │ │ └── terraform_client_test.go │ ├── events/ │ │ ├── apply_command_runner.go │ │ ├── apply_command_runner_test.go │ │ ├── approve_policies_command_runner.go │ │ ├── automerger.go │ │ ├── cancel_command_runner.go │ │ ├── cancellation_tracker.go │ │ ├── command/ │ │ │ ├── context.go │ │ │ ├── lock.go │ │ │ ├── name.go │ │ │ ├── name_test.go │ │ │ ├── project_context.go │ │ │ ├── project_context_test.go │ │ │ ├── project_result.go │ │ │ ├── project_result_test.go │ │ │ ├── result.go │ │ │ ├── result_test.go │ │ │ ├── scope_tags.go │ │ │ ├── team_allowlist_checker.go │ │ │ └── team_allowlist_checker_test.go │ │ ├── command_requirement_handler.go │ │ ├── command_requirement_handler_test.go │ │ ├── command_runner.go │ │ ├── command_runner_internal_test.go │ │ ├── command_runner_test.go │ │ ├── command_type.go │ │ ├── comment_parser.go │ │ ├── comment_parser_test.go │ │ ├── commit_status_updater.go │ │ ├── commit_status_updater_test.go │ │ ├── db_updater.go │ │ ├── delete_lock_command.go │ │ ├── delete_lock_command_test.go │ │ ├── drainer.go │ │ ├── drainer_test.go │ │ ├── event_parser.go │ │ ├── event_parser_test.go │ │ ├── external_team_allowlist_checker.go │ │ ├── external_team_allowlist_checker_test.go │ │ ├── github_app_working_dir.go │ │ ├── github_app_working_dir_test.go │ │ ├── import_command_runner.go │ │ ├── import_command_runner_test.go │ │ ├── instrumented_project_command_builder.go │ │ ├── instrumented_project_command_runner.go │ │ ├── instrumented_pull_closed_executor.go │ │ ├── markdown_renderer.go │ │ ├── markdown_renderer_test.go │ │ ├── mock_workingdir_test.go │ │ ├── mocks/ │ │ │ ├── mock_azuredevops_pull_getter.go │ │ │ ├── mock_cancellation_tracker.go │ │ │ ├── mock_command_requirement_handler.go │ │ │ ├── mock_command_runner.go │ │ │ ├── mock_comment_building.go │ │ │ ├── mock_comment_parsing.go │ │ │ ├── mock_commit_status_updater.go │ │ │ ├── mock_custom_step_runner.go │ │ │ ├── mock_delete_lock_command.go │ │ │ ├── mock_env_step_runner.go │ │ │ ├── mock_event_parsing.go │ │ │ ├── mock_github_pull_getter.go │ │ │ ├── mock_gitlab_merge_request_getter.go │ │ │ ├── mock_job_message_sender.go │ │ │ ├── mock_job_url_setter.go │ │ │ ├── mock_lock_url_generator.go │ │ │ ├── mock_pending_plan_finder.go │ │ │ ├── mock_post_workflow_hook_url_generator.go │ │ │ ├── mock_post_workflows_hooks_command_runner.go │ │ │ ├── mock_pre_workflow_hook_url_generator.go │ │ │ ├── mock_pre_workflows_hooks_command_runner.go │ │ │ ├── mock_project_command_builder.go │ │ │ ├── mock_project_command_runner.go │ │ │ ├── mock_project_lock.go │ │ │ ├── mock_pull_cleaner.go │ │ │ ├── mock_resource_cleaner.go │ │ │ ├── mock_step_runner.go │ │ │ ├── mock_webhooks_sender.go │ │ │ ├── mock_working_dir.go │ │ │ └── mock_working_dir_locker.go │ │ ├── models/ │ │ │ ├── commit_status.go │ │ │ ├── commit_status_test.go │ │ │ ├── models.go │ │ │ ├── models_test.go │ │ │ └── testdata/ │ │ │ └── fixtures.go │ │ ├── modules.go │ │ ├── modules_test.go │ │ ├── pending_plan_finder.go │ │ ├── pending_plan_finder_test.go │ │ ├── plan_command_runner.go │ │ ├── plan_command_runner_test.go │ │ ├── policy_check_command_runner.go │ │ ├── post_workflow_hooks_command_runner.go │ │ ├── post_workflow_hooks_command_runner_test.go │ │ ├── pre_workflow_hooks_command_runner.go │ │ ├── pre_workflow_hooks_command_runner_test.go │ │ ├── project_command_builder.go │ │ ├── project_command_builder_internal_test.go │ │ ├── project_command_builder_test.go │ │ ├── project_command_context_builder.go │ │ ├── project_command_context_builder_test.go │ │ ├── project_command_pool_executor.go │ │ ├── project_command_runner.go │ │ ├── project_command_runner_test.go │ │ ├── project_finder.go │ │ ├── project_finder_test.go │ │ ├── project_locker.go │ │ ├── project_locker_test.go │ │ ├── pull_closed_executor.go │ │ ├── pull_closed_executor_test.go │ │ ├── pull_status_fetcher.go │ │ ├── pull_updater.go │ │ ├── repo_allowlist_checker.go │ │ ├── repo_allowlist_checker_test.go │ │ ├── repo_branch_test.go │ │ ├── state_command_runner.go │ │ ├── templates/ │ │ │ ├── apply_unwrapped_success.tmpl │ │ │ ├── apply_wrapped_success.tmpl │ │ │ ├── approve_all_projects.tmpl │ │ │ ├── failure.tmpl │ │ │ ├── failure_with_log.tmpl │ │ │ ├── import_success_unwrapped.tmpl │ │ │ ├── import_success_wrapped.tmpl │ │ │ ├── log.tmpl │ │ │ ├── merged_again.tmpl │ │ │ ├── multi_project_apply.tmpl │ │ │ ├── multi_project_apply_footer.tmpl │ │ │ ├── multi_project_header.tmpl │ │ │ ├── multi_project_import.tmpl │ │ │ ├── multi_project_plan.tmpl │ │ │ ├── multi_project_plan_footer.tmpl │ │ │ ├── multi_project_policy.tmpl │ │ │ ├── multi_project_policy_unsuccessful.tmpl │ │ │ ├── multi_project_state_rm.tmpl │ │ │ ├── multi_project_version.tmpl │ │ │ ├── plan_success_unwrapped.tmpl │ │ │ ├── plan_success_wrapped.tmpl │ │ │ ├── policy_check.tmpl │ │ │ ├── policy_check_results_unwrapped.tmpl │ │ │ ├── policy_check_results_wrapped.tmpl │ │ │ ├── single_project_apply.tmpl │ │ │ ├── single_project_import_success.tmpl │ │ │ ├── single_project_plan_success.tmpl │ │ │ ├── single_project_plan_unsuccessful.tmpl │ │ │ ├── single_project_policy_unsuccessful.tmpl │ │ │ ├── single_project_state_rm_success.tmpl │ │ │ ├── single_project_version_success.tmpl │ │ │ ├── single_project_version_unsuccessful.tmpl │ │ │ ├── state_rm_success_unwrapped.tmpl │ │ │ ├── state_rm_success_wrapped.tmpl │ │ │ ├── unwrapped_err.tmpl │ │ │ ├── unwrapped_err_with_log.tmpl │ │ │ ├── version_unwrapped_success.tmpl │ │ │ ├── version_wrapped_success.tmpl │ │ │ └── wrapped_err.tmpl │ │ ├── testdata/ │ │ │ ├── bitbucket-cloud-comment-event.json │ │ │ ├── bitbucket-cloud-pull-event-created.json │ │ │ ├── bitbucket-cloud-pull-event-fulfilled.json │ │ │ ├── bitbucket-cloud-pull-event-rejected.json │ │ │ ├── bitbucket-cloud-pull-event-updated.json │ │ │ ├── bitbucket-server-comment-event.json │ │ │ ├── bitbucket-server-get-pull-changes.json │ │ │ ├── bitbucket-server-get-pull.json │ │ │ ├── bitbucket-server-pull-event-created.json │ │ │ ├── bitbucket-server-pull-event-declined.json │ │ │ ├── bitbucket-server-pull-event-merged.json │ │ │ ├── fs/ │ │ │ │ ├── repoA/ │ │ │ │ │ ├── baz/ │ │ │ │ │ │ ├── init.tf │ │ │ │ │ │ └── mods.tf │ │ │ │ │ ├── modules/ │ │ │ │ │ │ ├── bar/ │ │ │ │ │ │ │ └── bar.tf │ │ │ │ │ │ └── foo/ │ │ │ │ │ │ ├── foo.tf │ │ │ │ │ │ └── mods.tf │ │ │ │ │ └── qux/ │ │ │ │ │ └── quxx/ │ │ │ │ │ ├── init.tf │ │ │ │ │ └── mods.tf │ │ │ │ └── repoB/ │ │ │ │ ├── dev/ │ │ │ │ │ └── quxx/ │ │ │ │ │ ├── init.tf │ │ │ │ │ └── mods.tf │ │ │ │ ├── modules/ │ │ │ │ │ ├── bar/ │ │ │ │ │ │ └── bar.tf │ │ │ │ │ └── foo/ │ │ │ │ │ ├── foo.tf │ │ │ │ │ └── mods.tf │ │ │ │ └── prod/ │ │ │ │ └── quxx/ │ │ │ │ ├── init.tf │ │ │ │ └── mods.tf │ │ │ ├── gitlab-get-merge-request-subgroup.json │ │ │ ├── gitlab-get-merge-request.json │ │ │ ├── gitlab-merge-request-comment-event-subgroup.json │ │ │ ├── gitlab-merge-request-comment-event.json │ │ │ ├── gitlab-merge-request-event-mark-as-ready.json │ │ │ ├── gitlab-merge-request-event-subgroup.json │ │ │ ├── gitlab-merge-request-event-update-assignee.json │ │ │ ├── gitlab-merge-request-event-update-description.json │ │ │ ├── gitlab-merge-request-event-update-labels.json │ │ │ ├── gitlab-merge-request-event-update-milestone.json │ │ │ ├── gitlab-merge-request-event-update-mixed.json │ │ │ ├── gitlab-merge-request-event-update-new-commit.json │ │ │ ├── gitlab-merge-request-event-update-reviewer.json │ │ │ ├── gitlab-merge-request-event-update-target-branch.json │ │ │ ├── gitlab-merge-request-event-update-title.json │ │ │ ├── gitlab-merge-request-event.json │ │ │ └── test-repos/ │ │ │ ├── cloud-block-without-workspace-name/ │ │ │ │ └── main.tf │ │ │ ├── no-cloud-block/ │ │ │ │ └── main.tf │ │ │ └── workspace-configured/ │ │ │ └── main.tf │ │ ├── unlock_command_runner.go │ │ ├── var_file_allowlist_checker.go │ │ ├── var_file_allowlist_checker_test.go │ │ ├── vcs/ │ │ │ ├── azuredevops/ │ │ │ │ ├── client.go │ │ │ │ ├── client_internal_test.go │ │ │ │ ├── client_test.go │ │ │ │ └── testdata/ │ │ │ │ ├── fixtures.go │ │ │ │ ├── policyevaluations.json │ │ │ │ └── pr.json │ │ │ ├── bitbucketcloud/ │ │ │ │ ├── client.go │ │ │ │ ├── client_test.go │ │ │ │ ├── models.go │ │ │ │ └── testdata/ │ │ │ │ ├── comments.json │ │ │ │ ├── pull-approved-by-author.json │ │ │ │ ├── pull-approved-multiple.json │ │ │ │ ├── pull-approved.json │ │ │ │ ├── pull-unapproved.json │ │ │ │ └── user.json │ │ │ ├── bitbucketserver/ │ │ │ │ ├── client.go │ │ │ │ ├── client_test.go │ │ │ │ ├── models.go │ │ │ │ └── testdata/ │ │ │ │ └── pull-request.json │ │ │ ├── client.go │ │ │ ├── client_test.go │ │ │ ├── common/ │ │ │ │ ├── common.go │ │ │ │ ├── common_test.go │ │ │ │ ├── git_cred_writer.go │ │ │ │ ├── git_cred_writer_test.go │ │ │ │ ├── instrumented_client.go │ │ │ │ ├── request_validation.go │ │ │ │ └── request_validation_test.go │ │ │ ├── gitea/ │ │ │ │ ├── client.go │ │ │ │ └── models.go │ │ │ ├── github/ │ │ │ │ ├── client.go │ │ │ │ ├── client_internal_test.go │ │ │ │ ├── client_test.go │ │ │ │ ├── config.go │ │ │ │ ├── credentials.go │ │ │ │ ├── credentials_test.go │ │ │ │ ├── instrumented_client.go │ │ │ │ ├── mocks/ │ │ │ │ │ ├── mock_credentials.go │ │ │ │ │ └── mock_github_pull_request_getter.go │ │ │ │ ├── testdata/ │ │ │ │ │ ├── fixtures.go │ │ │ │ │ ├── pull-request-mergeability/ │ │ │ │ │ │ ├── branch-protection-expected.json │ │ │ │ │ │ ├── branch-protection-failed.json │ │ │ │ │ │ ├── branch-protection-passed.json │ │ │ │ │ │ ├── repository-id.json │ │ │ │ │ │ ├── ruleset-atlantis-apply-expected.json │ │ │ │ │ │ ├── ruleset-atlantis-apply-pending.json │ │ │ │ │ │ ├── ruleset-check-expected.json │ │ │ │ │ │ ├── ruleset-check-failed-other-atlantis.json │ │ │ │ │ │ ├── ruleset-check-failed.json │ │ │ │ │ │ ├── ruleset-check-neutral.json │ │ │ │ │ │ ├── ruleset-check-passed.json │ │ │ │ │ │ ├── ruleset-check-pending-other-atlantis.json │ │ │ │ │ │ ├── ruleset-check-pending.json │ │ │ │ │ │ ├── ruleset-check-skipped.json │ │ │ │ │ │ ├── ruleset-evaluate-workflow-failed.json │ │ │ │ │ │ ├── ruleset-optional-check-failed.json │ │ │ │ │ │ ├── ruleset-optional-status-failed.json │ │ │ │ │ │ ├── ruleset-workflow-expected.json │ │ │ │ │ │ ├── ruleset-workflow-failed-first-check-successful.json │ │ │ │ │ │ ├── ruleset-workflow-failed.json │ │ │ │ │ │ ├── ruleset-workflow-passed-multiple-runs.json │ │ │ │ │ │ ├── ruleset-workflow-passed-sha-match.json │ │ │ │ │ │ ├── ruleset-workflow-passed-sha-mismatch.json │ │ │ │ │ │ ├── ruleset-workflow-passed-with-global-codeql.json │ │ │ │ │ │ └── ruleset-workflow-passed.json │ │ │ │ │ ├── pull-request.json │ │ │ │ │ └── repo.json │ │ │ │ ├── token_rotator.go │ │ │ │ └── token_rotator_test.go │ │ │ ├── gitlab/ │ │ │ │ ├── client.go │ │ │ │ ├── client_test.go │ │ │ │ └── testdata/ │ │ │ │ ├── changes-available.json │ │ │ │ ├── changes-pending.json │ │ │ │ ├── detailed-merge-status-ci-must-pass.json │ │ │ │ ├── detailed-merge-status-need-rebase.json │ │ │ │ ├── group-membership-success.json │ │ │ │ ├── head-pipeline-not-available.json │ │ │ │ ├── merge-success-with-label.json │ │ │ │ ├── merge-success.json │ │ │ │ ├── pipeline-blocking-discussions-unresolved.json │ │ │ │ ├── pipeline-remaining-approvals.json │ │ │ │ ├── pipeline-success.json │ │ │ │ ├── pipeline-with-pipeline-skipped.json │ │ │ │ ├── pipeline-work-in-progress.json │ │ │ │ ├── project-success.json │ │ │ │ ├── pull-request.json │ │ │ │ ├── user-multiple.json │ │ │ │ ├── user-none.json │ │ │ │ └── user-success.json │ │ │ ├── mocks/ │ │ │ │ ├── mock_client.go │ │ │ │ └── mock_pull_req_status_fetcher.go │ │ │ ├── not_configured_vcs_client.go │ │ │ ├── proxy.go │ │ │ ├── pull_status_fetcher.go │ │ │ └── vcs.go │ │ ├── version_command_runner.go │ │ ├── webhooks/ │ │ │ ├── http.go │ │ │ ├── http_test.go │ │ │ ├── mocks/ │ │ │ │ ├── mock_sender.go │ │ │ │ ├── mock_slack_client.go │ │ │ │ └── mock_underlying_slack_client.go │ │ │ ├── slack.go │ │ │ ├── slack_client.go │ │ │ ├── slack_client_test.go │ │ │ ├── slack_test.go │ │ │ ├── webhooks.go │ │ │ └── webhooks_test.go │ │ ├── working_dir.go │ │ ├── working_dir_locker.go │ │ ├── working_dir_locker_test.go │ │ └── working_dir_test.go │ ├── jobs/ │ │ ├── job_url_setter.go │ │ ├── job_url_setter_test.go │ │ ├── mocks/ │ │ │ ├── mock_project_command_output_handler.go │ │ │ ├── mock_project_job_url_generator.go │ │ │ └── mock_project_status_updater.go │ │ ├── project_command_output_handler.go │ │ └── project_command_output_handler_test.go │ ├── logging/ │ │ ├── log.go │ │ ├── logging_test.go │ │ ├── mocks/ │ │ │ └── mock_simple_logging.go │ │ └── simple_logger.go │ ├── metrics/ │ │ ├── common.go │ │ ├── counter.go │ │ ├── counter_test.go │ │ ├── debug.go │ │ ├── metricstest/ │ │ │ └── scope.go │ │ ├── scope.go │ │ └── scope_test.go │ ├── middleware.go │ ├── recovery/ │ │ ├── recovery.go │ │ └── recovery_test.go │ ├── router.go │ ├── router_test.go │ ├── scheduled/ │ │ ├── executor_service.go │ │ ├── executor_service_test.go │ │ ├── mocks/ │ │ │ └── mock_executor_service_job.go │ │ ├── runtime_stats.go │ │ └── runtime_stats_test.go │ ├── server.go │ ├── server_internal_test.go │ ├── server_test.go │ ├── static/ │ │ ├── css/ │ │ │ ├── custom.css │ │ │ ├── normalize.css │ │ │ ├── skeleton.css │ │ │ └── xterm-5.3.0.css │ │ └── js/ │ │ ├── xterm-5.3.0.js │ │ ├── xterm-addon-attach-0.9.0.js │ │ ├── xterm-addon-fit-0.8.0.js │ │ ├── xterm-addon-search-0.13.0.js │ │ └── xterm-addon-search-bar.js │ ├── user_config.go │ ├── user_config_test.go │ └── utils/ │ ├── os.go │ ├── slices.go │ ├── spellcheck.go │ └── spellcheck_test.go ├── testdata/ │ ├── cert.pem │ ├── cert2.pem │ ├── key.pem │ └── key2.pem ├── testdrive/ │ ├── github.go │ ├── testdrive.go │ └── utils.go └── testing/ ├── Dockerfile ├── assertions.go ├── hooks/ │ └── post_push ├── http.go └── temp_files.go