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
4 changes: 2 additions & 2 deletions .copier-answers.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# Changes here will be overwritten by Copier
_commit: v0.0.94
_commit: v0.0.97
_src_path: gh:LabAutomationAndScreening/copier-base-template.git
description: Copier template for creating Python libraries and executables
install_claude_cli: false
python_ci_versions:
- 3.12.7
- 3.13.2
- 3.13.9
python_version: 3.12.7
repo_name: copier-python-package-template
repo_org_name: LabAutomationAndScreening
Expand Down
5 changes: 3 additions & 2 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
# base image tags available at https://mcr.microsoft.com/v2/devcontainers/universal/tags/list
# added the platform flag to override any local settings since this image is only compatible with linux/amd64. since this image is only x64 compatible, suppressing the hadolint rule
# hadolint ignore=DL3029
FROM --platform=linux/amd64 mcr.microsoft.com/devcontainers/universal:5.1.1-noble
FROM --platform=linux/amd64 mcr.microsoft.com/devcontainers/universal:5.1.4-noble

SHELL ["/bin/bash", "-o", "pipefail", "-c"]

# temporary hack until yarn updates its GPG key
RUN rm /etc/apt/sources.list.d/yarn.list || true
RUN rm /etc/apt/sources.list.d/yarn.list || true && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn-archive-keyring.gpg > /dev/null
Comment on lines +9 to +10
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 | 🟡 Minor

Same curl -sS without --fail issue as in template/.devcontainer/Dockerfile.

Apply the same fix here for consistency.

🛠️ Proposed fix
-    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn-archive-keyring.gpg > /dev/null
+    curl -fsSL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn-archive-keyring.gpg > /dev/null
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
RUN rm /etc/apt/sources.list.d/yarn.list || true && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn-archive-keyring.gpg > /dev/null
RUN rm /etc/apt/sources.list.d/yarn.list || true && \
curl -fsSL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn-archive-keyring.gpg > /dev/null
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.devcontainer/Dockerfile around lines 9 - 10, The Dockerfile RUN line uses
curl without --fail which can mask HTTP errors; update the RUN command that
removes yarn.list and fetches the Yarn GPG key so the curl invocation includes
--fail (i.e., change "curl -sS" to "curl -sS --fail") to ensure non-2xx
responses cause the build to fail and surface download errors when executing
that RUN layer.


RUN apt-get update -y && apt-get install -y \
"bash-completion=$(apt-cache madison bash-completion | awk '{print $3}' | grep '^1:2.11' | head -n 1)" --no-install-recommends \
Expand Down
16 changes: 8 additions & 8 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"service": "devcontainer",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
"features": {
"ghcr.io/devcontainers/features/python:1.7.1": {
"ghcr.io/devcontainers/features/python:1.8.0": {
// https://github.com/devcontainers/features/blob/main/src/python/devcontainer-feature.json
"version": "3.12.7",
"installTools": false,
Expand All @@ -16,24 +16,24 @@
"extensions": [
// basic tooling
// "eamodio.gitlens@15.5.1",
"coderabbit.coderabbit-vscode@0.16.6",
"coderabbit.coderabbit-vscode@0.17.0",
"ms-vscode.live-server@0.5.2025051301",
"MS-vsliveshare.vsliveshare@1.0.5905",
"github.copilot@1.388.0",
"github.copilot-chat@0.36.2026010502",
"github.copilot-chat@0.38.2026022001",

// Python
"ms-python.python@2025.21.2026010501",
"ms-python.vscode-pylance@2025.10.100",
"ms-python.python@2026.2.2026021801",
"ms-python.vscode-pylance@2026.1.1",
"ms-vscode-remote.remote-containers@0.414.0",
"charliermarsh.ruff@2025.32.0",
"charliermarsh.ruff@2026.36.0",

// Misc file formats
"bierner.markdown-mermaid@1.29.0",
"samuelcolvin.jinjahtml@0.20.0",
"tamasfe.even-better-toml@0.19.2",
"emilast.LogFileHighlighter@3.3.3",
"esbenp.prettier-vscode@11.0.2"
"esbenp.prettier-vscode@12.3.0"
],
"settings": {
"editor.accessibilitySupport": "off", // turn off sounds
Expand All @@ -58,5 +58,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): 69bb472f # spellchecker:disable-line
// Devcontainer context hash (do not manually edit this, it's managed by a pre-commit hook): 91027588 # spellchecker:disable-line
}
6 changes: 3 additions & 3 deletions .devcontainer/install-ci-tooling.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
import tempfile
from pathlib import Path

UV_VERSION = "0.9.26"
PNPM_VERSION = "10.28.1"
COPIER_VERSION = "==9.11.2"
UV_VERSION = "0.10.4"
PNPM_VERSION = "10.30.0"
COPIER_VERSION = "==9.11.3"
COPIER_TEMPLATE_EXTENSIONS_VERSION = "==0.3.3"
PRE_COMMIT_VERSION = "4.5.1"
GITHUB_WINDOWS_RUNNER_BIN_PATH = r"C:\Users\runneradmin\.local\bin"
Expand Down
2 changes: 1 addition & 1 deletion .github/actions/update-devcontainer-hash/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ runs:
shell: bash

- name: Checkout code
uses: actions/checkout@v6.0.1
uses: actions/checkout@v6.0.2
with:
persist-credentials: true
fetch-depth: 1
Expand Down
12 changes: 6 additions & 6 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
## Link to Issue or Message thread
## Link to Issue or Message thread



## Why is this change necessary?
## Why is this change necessary?



## How does this change address the issue?
## How does this change address the issue?



## What side effects does this change have?
## What side effects does this change have?



## How is this change tested?
## How is this change tested?



## Other
## Other
2 changes: 1 addition & 1 deletion .github/reusable_workflows/build-docker-image.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ jobs:
shell: bash

- name: Checkout code
uses: actions/checkout@v6.0.1
uses: actions/checkout@v6.0.2
with:
persist-credentials: false

Expand Down
13 changes: 9 additions & 4 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:

- 3.12.7

- 3.13.2
- 3.13.9

copier: [
'--data-file tests/copier_data/data1.yaml',
Expand All @@ -56,7 +56,7 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v6.0.1
uses: actions/checkout@v6.0.2
with:
persist-credentials: false

Expand Down Expand Up @@ -151,9 +151,14 @@ jobs:
if: always()
steps:
- name: fail if prior job failure
if: needs.lint-matrix.result != 'success'
run: |
exit 1
success_pattern="^(skipped|success)$" # these are the possibilities: https://docs.github.com/en/actions/reference/workflows-and-actions/contexts#needs-context

if [[ ! "${{ needs.lint-matrix.result }}" =~ $success_pattern ]]; then
echo "❌ One or more jobs did not finish with skipped or success"
exit 1
fi
echo "✅ All jobs finished with skipped or success"
Comment on lines +155 to +161
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 | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# First, let's find and examine the ci.yaml file
find . -name "ci.yaml" -o -name "ci.yml" | head -20

Repository: LabAutomationAndScreening/copier-python-package-template

Length of output: 127


🌐 Web query:

GitHub Actions needs context job result values skipped failure success

💡 Result:

In GitHub Actions, when job B has needs: A, the needs context exposes A’s result as:

  • needs.A.result → one of: success, failure, cancelled, skipped. [1]

Common patterns:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - run: exit 0

  deploy:
    needs: build
    # Default behavior is effectively success() gating unless you override it
    if: ${{ always() && needs.build.result != 'cancelled' }}
    runs-on: ubuntu-latest
    steps:
      - run: echo "build result was ${{ needs.build.result }}"

Notes:

  • A job skipped via jobs.<job_id>.if: <false> is marked “skipped”, and the UI may show it as “Success” (it won’t block required checks), but its needs.<job_id>.result is still skipped. [2]
  • In if: conditionals, a default status check of success() is applied unless you include a status-check function like always(), failure(), cancelled(), or success(). [3]

Sources: GitHub Actions contexts reference (needs context) [1], job conditions docs (skipped job behavior) [2], expressions/status-check functions docs [3].


🏁 Script executed:

#!/bin/bash
# Test the regex pattern behavior
success_pattern='^(skipped|success)$'
echo "=== Testing regex pattern: $success_pattern ==="
for result in success skipped failure cancelled skipped_by_conditional; do
  if [[ ! "$result" =~ $success_pattern ]]; then
    outcome="FAILS"
  else
    outcome="PASSES"
  fi
  printf '%-25s -> %s\n' "$result" "$outcome"
done

Repository: LabAutomationAndScreening/copier-python-package-template

Length of output: 327


🏁 Script executed:

#!/bin/bash
# Read the ci.yaml file to understand the workflow structure
wc -l ./.github/workflows/ci.yaml

Repository: LabAutomationAndScreening/copier-python-package-template

Length of output: 131


🏁 Script executed:

#!/bin/bash
# Read the section around the review lines (155-161) plus context
sed -n '1,180p' ./.github/workflows/ci.yaml | cat -n

Repository: LabAutomationAndScreening/copier-python-package-template

Length of output: 8482


Required-check incorrectly allows upstream failures to be reported as success.

When pre-commit fails, lint-matrix is automatically skipped (due to its needs: pre-commit dependency without an explicit if: always() condition). The current regex pattern ^(skipped|success)$ treats skipped jobs as acceptable, allowing the required-check to pass despite upstream failures. This masks real failures.

The required-check must only accept success and should verify both get-values and lint-matrix completed successfully:

Fix required
-          success_pattern="^(skipped|success)$" # these are the possibilities: https://docs.github.com/en/actions/reference/workflows-and-actions/contexts#needs-context
-
-          if [[ ! "${{ needs.lint-matrix.result }}" =~ $success_pattern ]]; then
-            echo "❌ One or more jobs did not finish with skipped or success"
+          required_pattern="^success$"
+          if [[ ! "${{ needs.get-values.result }}" =~ $required_pattern ]] || [[ ! "${{ needs.lint-matrix.result }}" =~ $required_pattern ]]; then
+            echo "❌ One or more required jobs did not finish with success"
             exit 1
           fi
-          echo "✅ All jobs finished with skipped or success"
+          echo "✅ All required jobs finished with success"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
success_pattern="^(skipped|success)$" # these are the possibilities: https://docs.github.com/en/actions/reference/workflows-and-actions/contexts#needs-context
if [[ ! "${{ needs.lint-matrix.result }}" =~ $success_pattern ]]; then
echo "❌ One or more jobs did not finish with skipped or success"
exit 1
fi
echo "✅ All jobs finished with skipped or success"
required_pattern="^success$"
if [[ ! "${{ needs.get-values.result }}" =~ $required_pattern ]] || [[ ! "${{ needs.lint-matrix.result }}" =~ $required_pattern ]]; then
echo "❌ One or more required jobs did not finish with success"
exit 1
fi
echo "✅ All required jobs finished with success"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ci.yaml around lines 155 - 161, The current required-check
accepts skipped results and only inspects needs.lint-matrix.result; change the
logic so success_pattern is only "^success$" and verify both
needs.get-values.result and needs.lint-matrix.result equal "success" (do not
treat "skipped" as acceptable). Update the conditional that currently tests "${{
needs.lint-matrix.result }}" to instead check both "${{ needs.get-values.result
}}" and "${{ needs.lint-matrix.result }}" against the new success_pattern (or
test equality to "success") and make the step fail (exit 1) if either is not
"success".

- name: Mark updated dependabot hash commit as succeeded
if: needs.get-values.outputs.dependabot-commit-created == 'true'
env:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/get-values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ jobs:
JSON

- name: Checkout code
uses: actions/checkout@v6.0.1
uses: actions/checkout@v6.0.2
with:
persist-credentials: false

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/pre-commit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@ jobs:
steps:
- name: Checkout code during push
if: ${{ github.event_name == 'push' }}
uses: actions/checkout@v6.0.1
uses: actions/checkout@v6.0.2
with:
ref: ${{ github.ref_name }} # explicitly get the head of the branch, which will include any new commits pushed if this is a dependabot branch
persist-credentials: false

- name: Checkout code not during push
if: ${{ github.event_name != 'push' }}
uses: actions/checkout@v6.0.1
uses: actions/checkout@v6.0.2
with:
persist-credentials: false

Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ dist

# Logs
*.log
*.log.*
**/logs/log*.txt
**/logs/*.log.*

# macOS dev cleanliness
**/.DS_Store
Expand Down
8 changes: 4 additions & 4 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ repos:

# Reformatting (should generally come before any file format or other checks, because reformatting can change things)
- repo: https://github.com/crate-ci/typos
rev: b31d3aa6e8e43e6a9cf7a1d137baf189dec0922b # frozen: v1
rev: e1f6f6eaedd8587fa3c76ec20e7cbaa8f7132b2d # frozen: v1
hooks:
- id: typos
exclude: |
Expand Down Expand Up @@ -108,7 +108,7 @@ repos:
)$

- repo: https://github.com/rbubley/mirrors-prettier
rev: 14abee445aea04b39069c19b4bd54efff6775819 # frozen: v3.7.4
rev: c2bc67fe8f8f549cc489e00ba8b45aa18ee713b1 # frozen: v3.8.1
hooks:
- id: prettier
# TODO: get template YAML and MD files more in line with prettier expectations so we can start using prettier on those too
Expand Down Expand Up @@ -195,7 +195,7 @@ repos:
- id: check-case-conflict

- repo: https://github.com/python-jsonschema/check-jsonschema
rev: b035497fb64e3f9faa91e833331688cc185891e6 # frozen: 0.36.0
rev: ec368acd16deee9c560c105ab6d27db4ee19a5ec # frozen: 0.36.2
hooks:
- id: check-github-workflows

Expand Down Expand Up @@ -249,7 +249,7 @@ repos:
description: Runs hadolint to lint Dockerfiles

- repo: https://github.com/astral-sh/ruff-pre-commit
rev: 5ba58aca0bd5bc7c0e1c0fc45af2e88d6a2bde83 # frozen: v0.14.10
rev: 0839f92796ae388643a08a21640a029b322be5c2 # frozen: v0.15.2
hooks:
- id: ruff
name: ruff-src
Expand Down
12 changes: 11 additions & 1 deletion copier.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ python_ci_versions:
multiselect: true
choices:
- "3.12.7"
- "3.13.2"
- "3.13.9"
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 | 🟡 Minor

Python 3.13.9 is not the latest 3.13.x patch.

Python 3.13.10 was released on December 2, 2025, meaning 3.13.9 is one patch behind. Consider whether this should be bumped to "3.13.10" for the latest security/bug fixes, or confirm this is intentional.

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

In `@copier.yml` at line 79, Update the Python version pin in copier.yml by
replacing the literal "3.13.9" with "3.13.10" (i.e., change the version string
in copier.yml), then run your CI/tests to ensure no regressions; if the
intention was to stay on 3.13.9, add a short comment explaining why the older
patch is required instead of upgrading.

- "3.14.0"


Expand Down Expand Up @@ -143,6 +143,16 @@ use_codecov:
help: Upload code coverage results to CodeCov?
default: no

_tasks:
- command: |
if [ -f ruff.toml ]; then
echo "Updating ruff target-version from python_version..."
py_major_minor="$(printf '%s' '{{ python_version }}' | cut -d. -f1,2)"
py_tag="py$(printf '%s' "$py_major_minor" | tr -d '.')"
sed -i -E 's/^target-version = "py[0-9]+"/target-version = "'"$py_tag"'"/' ruff.toml
else
echo "ruff.toml not found; skipping Ruff target-version update."
fi
Comment on lines +146 to +155
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

sed -i -E will fail on macOS (BSD sed).

GNU sed (Linux) accepts sed -i -E for in-place editing, but BSD sed (macOS) requires an explicit backup extension argument: sed -i '' -E. As written, running this task locally on a macOS developer machine will fail. Use a cross-platform approach instead:

🐛 Proposed cross-platform fix
-            sed -i -E 's/^target-version = "py[0-9]+"/target-version = "'"$py_tag"'"/' ruff.toml
+            if sed --version 2>/dev/null | grep -q GNU; then
+                sed -i -E 's/^target-version = "py[0-9]+"/target-version = "'"$py_tag"'"/' ruff.toml
+            else
+                sed -i '' -E 's/^target-version = "py[0-9]+"/target-version = "'"$py_tag"'"/' ruff.toml
+            fi

Alternatively, use python -c or perl -i -pe which are available and behave consistently on both platforms.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
_tasks:
- command: |
if [ -f ruff.toml ]; then
echo "Updating ruff target-version from python_version..."
py_major_minor="$(printf '%s' '{{ python_version }}' | cut -d. -f1,2)"
py_tag="py$(printf '%s' "$py_major_minor" | tr -d '.')"
sed -i -E 's/^target-version = "py[0-9]+"/target-version = "'"$py_tag"'"/' ruff.toml
else
echo "ruff.toml not found; skipping Ruff target-version update."
fi
_tasks:
- command: |
if [ -f ruff.toml ]; then
echo "Updating ruff target-version from python_version..."
py_major_minor="$(printf '%s' '{{ python_version }}' | cut -d. -f1,2)"
py_tag="py$(printf '%s' "$py_major_minor" | tr -d '.')"
if sed --version 2>/dev/null | grep -q GNU; then
sed -i -E 's/^target-version = "py[0-9]+"/target-version = "'"$py_tag"'"/' ruff.toml
else
sed -i '' -E 's/^target-version = "py[0-9]+"/target-version = "'"$py_tag"'"/' ruff.toml
fi
else
echo "ruff.toml not found; skipping Ruff target-version update."
fi
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@copier.yml` around lines 146 - 155, The inline sed invocation in the copier
_tasks block (the line using sed -i -E to edit ruff.toml) is not cross-platform
and will fail on macOS; change the task to use a portable approach such as
either: detect Darwin via uname and use sed -i '' -E on macOS and sed -i -E
elsewhere, or replace the sed command entirely with a cross-platform single-line
Python or Perl in-place edit that uses the same regex to update target-version
(operating on ruff.toml and using the same py_major_minor/py_tag variables).


# Additional Settings
_min_copier_version: "9.4"
Expand Down
67 changes: 34 additions & 33 deletions extensions/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,78 +10,79 @@ class ContextUpdater(ContextHook):

@override
def hook(self, context: dict[Any, Any]) -> dict[Any, Any]:
context["uv_version"] = "0.9.26"
context["pnpm_version"] = "10.28.1"
context["uv_version"] = "0.10.4"
context["pnpm_version"] = "10.30.0"
context["pre_commit_version"] = "4.5.1"
context["pyright_version"] = ">=1.1.408"
context["pytest_version"] = ">=9.0.2"
context["pytest_randomly_version"] = ">=4.0.1"
context["pytest_cov_version"] = ">=7.0.0"
context["ty_version"] = ">=0.0.13"
context["copier_version"] = "==9.11.2"
context["ty_version"] = ">=0.0.17"
context["copier_version"] = "==9.11.3"
context["copier_template_extensions_version"] = "==0.3.3"
context["sphinx_version"] = "9.0.4"
context["pulumi_version"] = ">=3.214.1"
context["pulumi_aws_version"] = ">=7.15.0"
context["pulumi_aws_native_version"] = ">=1.47.0"
context["pulumi_version"] = ">=3.223.0"
context["pulumi_aws_version"] = ">=7.20.0"
context["pulumi_aws_native_version"] = ">=1.54.0"
context["pulumi_command_version"] = ">=1.1.3"
context["pulumi_github_version"] = ">=6.10.0"
context["pulumi_okta_version"] = ">=6.2.0"
context["boto3_version"] = ">=1.42.11"
context["pulumi_github_version"] = ">=6.12.1"
context["pulumi_okta_version"] = ">=6.2.3"
context["boto3_version"] = ">=1.42.53"
context["ephemeral_pulumi_deploy_version"] = ">=0.0.6"
context["pydantic_version"] = ">=2.12.5"
context["pyinstaller_version"] = ">=6.17.0"
context["pyinstaller_version"] = ">=6.19.0"
context["setuptools_version"] = "80.7.1"
context["strawberry_graphql_version"] = ">=0.289.2"
context["fastapi_version"] = ">=0.128.0"
context["strawberry_graphql_version"] = ">=0.298.0"
context["fastapi_version"] = ">=0.129.0"
context["fastapi_offline_version"] = ">=1.7.4"
context["uvicorn_version"] = ">=0.40.0"
context["uvicorn_version"] = ">=0.41.0"
context["lab_auto_pulumi_version"] = ">=0.1.18"
context["ariadne_codegen_version"] = ">=0.17.0"
context["pytest_mock_version"] = ">=3.15.1"
context["uuid_utils_version"] = ">=0.14.0"
context["syrupy_version"] = ">=5.0.0"
context["syrupy_version"] = ">=5.1.0"
context["structlog_version"] = ">=25.5.0"
context["httpx_version"] = "0.28.1"
context["httpx_version"] = ">=0.28.1"
context["python_kiota_bundle_version"] = ">=1.9.8"
context["vcrpy_version"] = ">=8.1.1"
context["pytest_recording_version"] = ">=0.13.4"
context["pytest_asyncio_version"] = ">=1.3.0"
context["pytest_reserial_version"] = ">=0.6.0"
context["python_faker_version"] = ">=40.4.0"

context["default_node_version"] = "24.11.1"
context["nuxt_ui_version"] = "^4.3.0"
context["nuxt_version"] = "^4.2.2"
context["nuxt_icon_version"] = "^2.1.1"
context["nuxt_ui_version"] = "^4.4.0"
context["nuxt_version"] = "^4.3.1"
context["nuxt_icon_version"] = "^2.2.1"
context["typescript_version"] = "^5.9.3"
context["playwright_version"] = "^1.57.0"
context["vue_version"] = "^3.5.26"
context["vue_tsc_version"] = "^3.2.1"
context["playwright_version"] = "^1.58.2"
context["vue_version"] = "^3.5.28"
context["vue_tsc_version"] = "^3.2.4"
context["vue_devtools_api_version"] = "^8.0.0"
context["vue_router_version"] = "^4.6.4"
context["vue_router_version"] = "^5.0.3"
context["dotenv_cli_version"] = "^11.0.0"
context["faker_version"] = "^10.2.0"
context["faker_version"] = "^10.3.0"
context["vitest_version"] = "^3.2.4"
context["eslint_version"] = "~9.38.0"
context["nuxt_eslint_version"] = "^1.12.1"
context["zod_version"] = "^4.3.5"
context["nuxt_eslint_version"] = "^1.15.1"
context["zod_version"] = "^4.3.6"
context["zod_from_json_schema_version"] = "^0.5.1"
context["nuxt_apollo_version"] = "5.0.0-alpha.15"
context["graphql_codegen_cli_version"] = "^6.1.0"
context["graphql_codegen_typescript_version"] = "^5.0.7"
context["graphql_tools_mock_version"] = "^9.1.0"
context["tailwindcss_version"] = "^4.1.11"
context["tailwindcss_version"] = "^4.2.0"
context["iconify_vue_version"] = "^5.0.0"
context["iconify_json_lucide_version"] = "^1.2.71"
context["nuxt_fonts_version"] = "^0.12.1"
context["nuxt_fonts_version"] = "^0.14.0"
context["nuxtjs_color_mode_version"] = "^3.5.2"
context["vue_test_utils_version"] = "^2.4.6"
context["nuxt_test_utils_version"] = "3.19.1"
context["vue_eslint_parser_version"] = "^10.1.3"
context["happy_dom_version"] = "^20.0.11"
context["vue_eslint_parser_version"] = "^10.4.0"
context["happy_dom_version"] = "^20.6.3"
context["node_kiota_bundle_version"] = "1.0.0-preview.99"

context["gha_checkout"] = "v6.0.1"
context["gha_checkout"] = "v6.0.2"
context["gha_setup_python"] = "v6.2.0"
context["gha_cache"] = "v5.0.2"
context["gha_upload_artifact"] = "v6.0.0"
Expand All @@ -108,10 +109,10 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]:
context["alpine_image_version"] = "3.23"
context["nginx_image_version"] = "1.29.4"

context["kiota_cli_version"] = "1.29.0"
context["kiota_cli_version"] = "1.30.0"

context["py312_version"] = "3.12.7"
context["py313_version"] = "3.13.2"
context["py313_version"] = "3.13.9"
context["py314_version"] = "3.14.0"

# Kludge to be able to help symlinked jinja files in the child and grandchild templates
Expand Down
Loading