Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion .claude/settings/permissions/bash.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,17 @@
"Bash(tail *)",
// Search
"Bash(rg *)",
// Research
"Bash(gh issue list *)",
"Bash(gh pr view *)",
"Bash(gh pr diff *)"
],
"ask": [
"Bash(gh *)", // let's hold off before we let it use the github CLI in any free running allow mode...I don't want it somehow approving PRs with the user's credentials
// let's hold off before we let it use the github CLI in any free running allow mode...I don't want it somehow approving PRs with the user's credentials
"Bash(gh repo *)",
"Bash(gh release *)",
"Bash(gh secret *)",
"Bash(gh ruleset *)",
"Bash(aws *)", // let's hold off before we let it use AWS CLI in any free running allow mode. We need to be very sure we don't have any access to staging or production credentials in our dev environment (...which we shouldn't...but we need to double check that or consider any other safeguards first)
"Bash(curl *)",
"Bash(ln *)",
Expand All @@ -85,6 +93,17 @@
"deny": [
// Exceptions to generally allowed AI tooling
"Bash(bd init*)", // we need to control the init process, don't let AI do that in the background
// Github
// Claude should not ever interfere with the PR process, that is how we gate AI's work
"Bash(gh pr create *)",
"Bash(gh pr edit *)",
"Bash(gh pr ready *)",
"Bash(gh pr review *)",
"Bash(gh pr merge *)",
"Bash(gh pr close *)",
Comment on lines +96 to +103
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

find . -name "bash.jsonc" -type f

Repository: LabAutomationAndScreening/copier-nuxt-static-aws

Length of output: 184


🏁 Script executed:

cat -n ./.claude/settings/permissions/bash.jsonc | head -120 | tail -40

Repository: LabAutomationAndScreening/copier-nuxt-static-aws

Length of output: 1927


🏁 Script executed:

rg "gh pr (comment|reopen|update-branch)" ./.claude/settings/permissions/bash.jsonc

Repository: LabAutomationAndScreening/copier-nuxt-static-aws

Length of output: 74


🌐 Web query:

gh pr subcommands github cli write mutating operations

💡 Result:

The GitHub CLI gh pr command provides several subcommands that perform mutating operations on pull requests (i.e., those that create, update, or delete PR state or related resources on GitHub). These require write permissions to the repository. Mutating gh pr subcommands: - gh pr create: Creates a new pull request. Supports flags like --title, --body, --base, --draft, --assignee, --reviewer, --label, --milestone, --project. Aliases: gh pr new. - gh pr edit: Updates title, body, base branch, assignees, reviewers, labels, milestones, or projects for an existing PR. Flags include --title, --body, --add-assignee, --add-reviewer, --add-label, --remove-* variants. - gh pr merge: Merges a PR. Supports strategies --merge, --rebase, --squash; flags like --delete-branch, --auto. - gh pr close: Closes a PR. Flags: --comment, --delete-branch. - gh pr ready: Marks a draft PR as ready for review (or --undo to mark as draft). - gh pr update-branch: Updates the PR's head branch with latest base branch changes (merge by default, or --rebase). - gh pr revert: Creates a new PR that reverts a merged PR. Flags like --title, --body, --draft. - gh pr lock: Locks conversation on a PR. Flag: --reason. - gh pr unlock: Unlocks conversation on a PR. Non-mutating subcommands (view/query only): list, view, status, diff, checks, checkout (local git only). All subcommands support -R, --repo to target a specific repo. Use gh pr --help for full details. Examples: gh pr create --title "Fix bug" --body "Details" --reviewer user1 gh pr merge 123 --squash --delete-branch gh pr edit 123 --add-label "bug" --title "Updated title"

Citations:


Deny all write-capable gh pr subcommands to prevent PR process interference.

The current deny list covers create, edit, ready, review, merge, and close, but is missing other write-capable PR operations: gh pr update-branch (updates PR head branch), gh pr revert (creates a revert PR), gh pr lock, and gh pr unlock. All of these should be explicitly denied to fully close the write surface on PR operations.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.claude/settings/permissions/bash.jsonc around lines 96 - 103, The deny list
for GitHub PR CLI subcommands currently includes "Bash(gh pr create *)",
"Bash(gh pr edit *)", "Bash(gh pr ready *)", "Bash(gh pr review *)", "Bash(gh pr
merge *)", and "Bash(gh pr close *)" but misses other write-capable commands;
add explicit deny entries for "Bash(gh pr update-branch *)", "Bash(gh pr revert
*)", "Bash(gh pr lock *)", and "Bash(gh pr unlock *)" so all write-capable PR
operations are blocked.

"Bash(gh pr comment *)",
"Bash(gh pr update-branch *)",

// Destructive File Operations
"Bash(chmod -R *)",
"Bash(chown -R *)",
Expand Down
2 changes: 1 addition & 1 deletion .copier-answers.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Changes here will be overwritten by Copier
_commit: v0.0.107
_commit: v0.0.108
_src_path: gh:LabAutomationAndScreening/copier-base-template.git
description: Template for creating a Static Website using Nuxt frontend hosted on
AWS
Expand Down
2 changes: 1 addition & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,5 +65,5 @@
"initializeCommand": "sh .devcontainer/initialize-command.sh",
"onCreateCommand": "sh .devcontainer/on-create-command.sh",
"postStartCommand": "sh .devcontainer/post-start-command.sh"
// Devcontainer context hash (do not manually edit this, it's managed by a pre-commit hook): ae7229d4 # spellchecker:disable-line
// Devcontainer context hash (do not manually edit this, it's managed by a pre-commit hook): afefe4b2 # spellchecker:disable-line
}
17 changes: 17 additions & 0 deletions .devcontainer/manual-setup-deps.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@
default=False,
help="Allow uv to install new versions of Python on the fly. This is typically only needed when instantiating the copier template.",
)
_ = parser.add_argument(
"--skip-installing-pulumi-cli",
action="store_true",
default=False,
help="Do not install the Pulumi CLI even if the lock file references it",
)


class PackageManager(str, enum.Enum):
Expand Down Expand Up @@ -127,6 +133,17 @@ def main():
check=True,
env=uv_env,
)
if (
not generate_lock_file_only
and not args.skip_installing_pulumi_cli
and platform.system() == "Linux"
and env.lock_file.exists()
and '"pulumi"' in env.lock_file.read_text()
):
_ = subprocess.run(
["sh", str(REPO_ROOT_DIR / ".devcontainer" / "install-pulumi-cli.sh"), str(env.lock_file)],
check=True,
)
Comment on lines +143 to +146
Copy link

Copilot AI Mar 30, 2026

Choose a reason for hiding this comment

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

The script attempts to run .devcontainer/install-pulumi-cli.sh, but that file does not exist in the repo root .devcontainer/ directory. If uv.lock ever contains "pulumi" on Linux, this branch will fail with a missing-file error. Either add the missing script to .devcontainer/, or guard this call by checking that the script path exists (and/or point to the correct location).

Suggested change
_ = subprocess.run(
["sh", str(REPO_ROOT_DIR / ".devcontainer" / "install-pulumi-cli.sh"), str(env.lock_file)],
check=True,
)
pulumi_install_script = REPO_ROOT_DIR / ".devcontainer" / "install-pulumi-cli.sh"
if pulumi_install_script.exists():
_ = subprocess.run(
["sh", str(pulumi_install_script), str(env.lock_file)],
check=True,
)
else:
print(
f"Warning: Pulumi CLI install script not found at {pulumi_install_script}; skipping Pulumi CLI installation.",
file=sys.stderr,
)

Copilot uses AI. Check for mistakes.
elif env.package_manager == PackageManager.PNPM:
pnpm_command = ["pnpm", "install", "--dir", str(env.path)]
if env_check_lock:
Expand Down
7 changes: 6 additions & 1 deletion .github/actions/install_deps/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ inputs:
description: Whether to skip updating the hash when running manual-setup-deps.py
default: true
required: false
skip-installing-pulumi-cli:
type: boolean
description: Whether to skip installing the Pulumi CLI even if the lock file references it
default: true
required: false


runs:
Expand Down Expand Up @@ -83,5 +88,5 @@ runs:
- name: Install dependencies
# the funky syntax is github action ternary
if: ${{ inputs.install-deps }}
run: python .devcontainer/manual-setup-deps.py ${{ inputs.python-version == 'notUsing' && '--no-python' || '' }} ${{ inputs.node-version == 'notUsing' && '--no-node' || '' }} ${{ inputs.skip-updating-devcontainer-hash && '--skip-updating-devcontainer-hash' || '' }}
run: python .devcontainer/manual-setup-deps.py ${{ inputs.python-version == 'notUsing' && '--no-python' || '' }} ${{ inputs.node-version == 'notUsing' && '--no-node' || '' }} ${{ inputs.skip-updating-devcontainer-hash && '--skip-updating-devcontainer-hash' || '' }} ${{ inputs.skip-installing-pulumi-cli && '--skip-installing-pulumi-cli' || '' }}
shell: pwsh
1 change: 1 addition & 0 deletions .github/workflows/pre-commit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ jobs:
python-version: ${{ inputs.python-version }}
node-version: ${{ inputs.node-version }}
skip-installing-ssm-plugin-manager: true
skip-installing-pulumi-cli: true

- name: Set up mutex # Github concurrency management is horrible, things get arbitrarily cancelled if queued up. So using mutex until github fixes itself. When multiple jobs are modifying cache at once, weird things can happen. possible issue is https://github.com/actions/toolkit/issues/658
if: ${{ runner.os != 'Windows' }} # we're just gonna have to YOLO on Windows, because this action doesn't support it yet https://github.com/ben-z/gh-action-mutex/issues/14
Expand Down
9 changes: 6 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ This project is a Copier template used to generate other copier templates. It is

## Testing

- Always run tests with an explicit path (e.g. uv run pytest tests/unit) — test runners discover all types by default.
- Always run tests with an explicit path (e.g. uv run pytest tests/unit) — test runners discover all types (unit, integration, E2E...) by default.
- When iterating on a single test, run that test in isolation first and confirm it is in the expected state (red or green) before widening to the full suite. Use the most targeted invocation available: a specific test function for Python (e.g. `uv run pytest path/to/test.py::test_name --no-cov`) or a file path and name filter for TypeScript (e.g. `pnpm test-unit -- path/to/test.spec.ts -t "test name" --no-coverage`). Only run the full suite once the target test behaves as expected.
- Test coverage requirements are usually at 100%, so when running a subset of tests, always disable test coverage to avoid the test run failing for insufficient coverage.
- Avoid magic values in comparisons in tests in all languages (like ruff rule PLR2004 specifies)
- Prefer using random values in tests rather than arbitrary ones (e.g. the faker library, uuids, random.randint) when possible. For enums, pick randomly rather than hardcoding one value.
Expand All @@ -26,11 +27,12 @@ This project is a Copier template used to generate other copier templates. It is

### Python Testing

- When using `mocker.spy` on a class-level method (including inherited ones), the spy records the unbound call, so assertions need `ANY` as the first argument to match self: `spy.assert_called_once_with(ANY, expected_arg)`
- When using `mocker.spy` on a class-level method (including inherited ones), the spy records the unbound call, so assertions need `ANY` as the first argument to match self: `spy.assert_called_once_with(ANY, expected_arg)`
- Before writing new mock/spy helpers, check the `tests/unit/` folder for pre-built helpers in files like `fixtures.py` or `*mocks.py`
- When a test needs a fixture only for its side effects (not its return value), use `@pytest.mark.usefixtures(fixture_name.__name__)` instead of adding an unused parameter with a noqa comment
- Use `__name__` instead of string literals when referencing functions/methods (e.g., `mocker.patch.object(MyClass, MyClass.method.__name__)`, `pytest.mark.usefixtures(my_fixture.__name__)`). This enables IDE refactoring tools to catch renames.
- When using the faker library, prefer the pytest fixture (provided by the faker library) over instantiating instances of Faker.
- **Choosing between cassettes and mocks:** At the layer that directly wraps an external API or service, strongly prefer VCR cassette-recorded interactions (via pytest-recording/vcrpy) — they capture real HTTP traffic and verify the wire format, catching integration issues that mocks would miss. At layers above that (e.g. business logic, route handlers), mock the wrapper layer instead (e.g. `mocker.patch.object(ThresholdsRepository, ...)`) — there is no value in re-testing the HTTP interaction from higher up.
- **Never hand-write VCR cassette YAML files.** Cassettes must be recorded from real HTTP interactions by running the test once with `--record-mode=once` against a live external service: `uv run pytest --record-mode=once <test path> --no-cov`. The default mode is `none` — a missing cassette will cause an error, which is expected until recorded.
- **Never hand-edit syrupy snapshot files.** Snapshots are auto-generated — to create or update them, run `uv run pytest --snapshot-update <test path> --no-cov`. A missing snapshot causes the test to fail, which is expected until you run with `--snapshot-update`. When a snapshot mismatch occurs, fix the code if the change was unintentional; run `--snapshot-update` if it was intentional.
- **Never hand-write or hand-edit pytest-reserial `.jsonl` recording files.** Recordings must be captured from real serial port traffic by running the test with `--record` while the device is connected: `uv run pytest --record <test path> --no-cov`. The default mode replays recordings — a missing recording causes an error, which is expected until recorded against a live device.
Expand All @@ -49,7 +51,8 @@ This project is a Copier template used to generate other copier templates. It is
- For frontend tests, run commands via `pnpm` scripts from `frontend/package.json` — never invoke tools directly (not pnpm exec <tool>, npx <tool>, etc.). ✅ pnpm test-unit ❌ pnpm vitest ... or npx vitest ...
- For linting and type-checking, prefer `pre-commit run <hook-id>` over invoking tools directly — this matches the permission allow-list and mirrors what CI runs. Key hook IDs: `typescript-check`, `eslint`, `pyright`, `ruff`, `ruff-format`.
- Never rely on IDE diagnostics for ruff warnings — the IDE may not respect the project's ruff.toml config. Run `pre-commit run ruff -a` to get accurate results.
- When running terminal commands, execute exactly one command per tool call. Do not chain commands with &&, ||, ;, or & — this prohibition has no exceptions, even for `cd && ...` patterns. Use absolute paths instead of `cd` to avoid needing to chain. Pipes (|) are allowed for output transformation (e.g., head, tail, grep). If two sequential commands are needed, run them in separate tool calls. Chained commands break the permission allow-list matcher and cause unnecessary permission prompts
- When running terminal commands, execute exactly one command per tool call. Do not chain commands with &&, ||, ;, or & — this prohibition has no exceptions, even for `cd && ...` patterns. Use `cd` to change to the directory you want before running the command, avoiding the need to chain. Pipes (|) are allowed for output transformation (e.g., head, tail, grep). If two sequential commands are needed, run them in separate tool calls. Chained commands break the permission allow-list matcher and cause unnecessary permission prompts
- Never use `pnpm --prefix <path>` or `uv --directory <path>` to target a different directory — these flags break the permission allow-list matcher the same way chained `cd &&` commands do. Instead, rely on the working directory already being correct (the cwd persists between Bash tool calls), or issue a plain `cd <path>` as a separate prior tool call to reposition before running the command.
- Never use backslash line continuations in shell commands — always write the full command on a single line. Backslashes break the permission allow-list matcher.
- **Never manually edit files in any `generated/` folder.** These files are produced by codegen tooling (typically Kiota) and any manual changes will be overwritten. If a generated file needs to change, update the source (e.g. the OpenAPI schema) and re-run the generator.

Expand Down
21 changes: 20 additions & 1 deletion template/.claude/settings/permissions/bash.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,17 @@
"Bash(tail *)",
// Search
"Bash(rg *)",
// Research
"Bash(gh issue list *)",
"Bash(gh pr view *)",
"Bash(gh pr diff *)"
],
"ask": [
"Bash(gh *)", // let's hold off before we let it use the github CLI in any free running allow mode...I don't want it somehow approving PRs with the user's credentials
// let's hold off before we let it use the github CLI in any free running allow mode...I don't want it somehow approving PRs with the user's credentials
"Bash(gh repo *)",
"Bash(gh release *)",
"Bash(gh secret *)",
"Bash(gh ruleset *)",
"Bash(aws *)", // let's hold off before we let it use AWS CLI in any free running allow mode. We need to be very sure we don't have any access to staging or production credentials in our dev environment (...which we shouldn't...but we need to double check that or consider any other safeguards first)
"Bash(curl *)",
"Bash(ln *)",
Expand All @@ -85,6 +93,17 @@
"deny": [
// Exceptions to generally allowed AI tooling
"Bash(bd init*)", // we need to control the init process, don't let AI do that in the background
// Github
// Claude should not ever interfere with the PR process, that is how we gate AI's work
"Bash(gh pr create *)",
"Bash(gh pr edit *)",
"Bash(gh pr ready *)",
"Bash(gh pr review *)",
"Bash(gh pr merge *)",
"Bash(gh pr close *)",
Comment on lines +96 to +103
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cat -n template/.claude/settings/permissions/bash.jsonc | sed -n '90,110p'

Repository: LabAutomationAndScreening/copier-nuxt-static-aws

Length of output: 913


🏁 Script executed:

# Get list of all gh pr subcommands that modify state
# Based on GitHub CLI documentation, let's identify all gh pr commands
# and classify which ones are mutating (write operations)
python3 <<'EOF'
# GitHub CLI gh pr subcommands
gh_pr_commands = {
    # Read-only commands
    "list": "list pull requests",
    "view": "view a pull request",
    "diff": "view changes in a pull request",
    "status": "show status of relevant pull requests",
    "checks": "show checks for a pull request",
    
    # Mutating/Write commands
    "create": "create a pull request",
    "edit": "edit a pull request",
    "close": "close a pull request",
    "ready": "mark a pull request as ready for review",
    "review": "add a review to a pull request",
    "merge": "merge a pull request",
    "reopen": "reopen a closed pull request",
    "comment": "comment on a pull request",
    "update-branch": "update a pull request branch",
    "lock": "lock a pull request",
    "unlock": "unlock a pull request",
    "draft": "mark a pull request as a draft",
}

print("Mutating gh pr commands:")
mutating = {k: v for k, v in gh_pr_commands.items() if k in ["create", "edit", "close", "ready", "review", "merge", "reopen", "comment", "update-branch", "lock", "unlock", "draft"]}
for cmd in sorted(mutating.keys()):
    print(f"  - gh pr {cmd}")
EOF

Repository: LabAutomationAndScreening/copier-nuxt-static-aws

Length of output: 320


🏁 Script executed:

cat -n template/.claude/settings/permissions/bash.jsonc | sed -n '85,125p'

Repository: LabAutomationAndScreening/copier-nuxt-static-aws

Length of output: 1862


Explicitly deny all remaining mutating gh pr commands.

The policy comment states Claude should never interfere with the PR process, but the current deny list is incomplete. Missing write-capable commands include gh pr comment, gh pr reopen, gh pr update-branch, gh pr draft, gh pr lock, and gh pr unlock. If the intent is to allow only read operations (view/diff/list), all remaining mutating commands must be explicitly denied to close the write surface.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@template/.claude/settings/permissions/bash.jsonc` around lines 96 - 103, The
deny list for mutating GitHub PR commands is incomplete—update the permissions
array that contains entries like "Bash(gh pr create *)", "Bash(gh pr edit *)",
etc., to explicitly include all remaining write-capable `gh pr` commands (e.g.,
"Bash(gh pr comment *)", "Bash(gh pr reopen *)", "Bash(gh pr update-branch *)",
"Bash(gh pr draft *)", "Bash(gh pr lock *)", "Bash(gh pr unlock *)") so that
only read-only PR commands are permitted; modify the entries in the same JSON
list to add these deny patterns to close the mutating surface while keeping the
existing deny rules.

"Bash(gh pr comment *)",
"Bash(gh pr update-branch *)",

// Destructive File Operations
"Bash(chmod -R *)",
"Bash(chown -R *)",
Expand Down
17 changes: 17 additions & 0 deletions template/.devcontainer/manual-setup-deps.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@
default=False,
help="Allow uv to install new versions of Python on the fly. This is typically only needed when instantiating the copier template.",
)
_ = parser.add_argument(
"--skip-installing-pulumi-cli",
action="store_true",
default=False,
help="Do not install the Pulumi CLI even if the lock file references it",
)


class PackageManager(str, enum.Enum):
Expand Down Expand Up @@ -127,6 +133,17 @@ def main():
check=True,
env=uv_env,
)
if (
not generate_lock_file_only
and not args.skip_installing_pulumi_cli
and platform.system() == "Linux"
and env.lock_file.exists()
and '"pulumi"' in env.lock_file.read_text()
):
_ = subprocess.run(
["sh", str(REPO_ROOT_DIR / ".devcontainer" / "install-pulumi-cli.sh"), str(env.lock_file)],
check=True,
)
elif env.package_manager == PackageManager.PNPM:
pnpm_command = ["pnpm", "install", "--dir", str(env.path)]
if env_check_lock:
Expand Down
7 changes: 6 additions & 1 deletion template/.github/actions/install_deps/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ inputs:
description: Whether to skip updating the hash when running manual-setup-deps.py
default: true
required: false
skip-installing-pulumi-cli:
type: boolean
description: Whether to skip installing the Pulumi CLI even if the lock file references it
default: true
required: false


runs:
Expand Down Expand Up @@ -83,5 +88,5 @@ runs:
- name: Install dependencies
# the funky syntax is github action ternary
if: ${{ inputs.install-deps }}
run: python .devcontainer/manual-setup-deps.py ${{ inputs.python-version == 'notUsing' && '--no-python' || '' }} ${{ inputs.node-version == 'notUsing' && '--no-node' || '' }} ${{ inputs.skip-updating-devcontainer-hash && '--skip-updating-devcontainer-hash' || '' }}
run: python .devcontainer/manual-setup-deps.py ${{ inputs.python-version == 'notUsing' && '--no-python' || '' }} ${{ inputs.node-version == 'notUsing' && '--no-node' || '' }} ${{ inputs.skip-updating-devcontainer-hash && '--skip-updating-devcontainer-hash' || '' }} ${{ inputs.skip-installing-pulumi-cli && '--skip-installing-pulumi-cli' || '' }}
shell: pwsh
1 change: 1 addition & 0 deletions template/.github/workflows/ci.yaml.jinja
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ jobs:
with:
node-version: {% endraw %}{{ node_version }}{% raw %}
skip-installing-ssm-plugin-manager: true
skip-installing-pulumi-cli: true

- name: Build frontend
run: pnpm --dir={% endraw %}{{ app_name }}{% raw %}_app generate
Expand Down
1 change: 1 addition & 0 deletions template/.github/workflows/pre-commit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ jobs:
python-version: ${{ inputs.python-version }}
node-version: ${{ inputs.node-version }}
skip-installing-ssm-plugin-manager: true
skip-installing-pulumi-cli: true

- name: Set up mutex # Github concurrency management is horrible, things get arbitrarily cancelled if queued up. So using mutex until github fixes itself. When multiple jobs are modifying cache at once, weird things can happen. possible issue is https://github.com/actions/toolkit/issues/658
if: ${{ runner.os != 'Windows' }} # we're just gonna have to YOLO on Windows, because this action doesn't support it yet https://github.com/ben-z/gh-action-mutex/issues/14
Expand Down
1 change: 1 addition & 0 deletions template/.github/workflows/pulumi-aws.yml
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ jobs:
uses: ./.github/actions/install_deps
with:
python-version: ${{ inputs.PYTHON_VERSION }}
skip-installing-pulumi-cli: true # at the moment, we're more specifically installing the Pulumi CLI just in the target directory inside the pulumi_ephemeral_deploy action

- name: Download Artifact
uses: actions/download-artifact@v8.0.0
Expand Down
Loading