Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 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
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.106
_commit: v0.0.106-25-g3f683ae
_src_path: gh:LabAutomationAndScreening/copier-base-template.git
description: A web app that is hosted within a local intranet. Nuxt frontend, python
backend, docker-compose
Expand Down
2 changes: 1 addition & 1 deletion .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# 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.4-noble
FROM --platform=linux/amd64 mcr.microsoft.com/devcontainers/universal:5.1.5-noble

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

Expand Down
18 changes: 11 additions & 7 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
{
"hostRequirements": {
"cpus": 2,
"memory": "4gb"
},
"dockerComposeFile": "docker-compose.yml",
"service": "devcontainer",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
Expand All @@ -22,21 +26,21 @@
"ms-vscode.live-server@0.5.2025051301",
"MS-vsliveshare.vsliveshare@1.0.5905",
"github.copilot@1.388.0",
"github.copilot-chat@0.38.2026022704",
"anthropic.claude-code@2.1.74",
"github.copilot-chat@0.42.2026032602",
"anthropic.claude-code@2.1.84",

// Python
"ms-python.python@2026.2.2026021801",
"ms-python.vscode-pylance@2026.1.1",
"ms-python.python@2026.5.2026032701",
"ms-python.vscode-pylance@2026.1.102",
"ms-vscode-remote.remote-containers@0.414.0",
"charliermarsh.ruff@2026.36.0",
"charliermarsh.ruff@2026.38.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@12.3.0"
"esbenp.prettier-vscode@12.4.0"
],
"settings": {
"editor.accessibilitySupport": "off", // turn off sounds
Expand All @@ -61,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): f6b6ee32 # spellchecker:disable-line
// Devcontainer context hash (do not manually edit this, it's managed by a pre-commit hook): 80d9f36a # spellchecker:disable-line
}
2 changes: 1 addition & 1 deletion .devcontainer/install-ci-tooling.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from pathlib import Path

UV_VERSION = "0.10.12"
PNPM_VERSION = "10.32.1"
PNPM_VERSION = "10.33.0"
COPIER_VERSION = "==9.14.0"
COPIER_TEMPLATE_EXTENSIONS_VERSION = "==0.3.3"
PRE_COMMIT_VERSION = "4.5.1"
Expand Down
6 changes: 3 additions & 3 deletions .devcontainer/on-create-command.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ set -ex

# For some reason the directory is not setup correctly and causes build of devcontainer to fail since
# it doesn't have access to the workspace directory. This can normally be done in post-start-command
git config --global --add safe.directory /workspaces/copier-nuxt-python-intranet-app
script_dir="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
repo_root="$(CDPATH= cd -- "$script_dir/.." && pwd)"
git config --global --add safe.directory "$repo_root"

sh .devcontainer/on-create-command-boilerplate.sh
# install json5 for merging claude settings. TODO: consider if we can install json5 globally...or somehow eliminate this dependency
script_dir="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
repo_root="$(CDPATH= cd -- "$script_dir/.." && pwd)"
mkdir -p "$repo_root/.claude"
chmod -R ug+rwX "$repo_root/.claude"
chgrp -R 0 "$repo_root/.claude" || true
Expand Down
4 changes: 3 additions & 1 deletion .devcontainer/post-start-command.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ set -ex

# For some reason the directory is not setup correctly and causes build of devcontainer to fail since
# it doesn't have access to the workspace directory. This can normally be done in post-start-command
git config --global --add safe.directory /workspaces/copier-nuxt-python-intranet-app
script_dir="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
repo_root="$(CDPATH= cd -- "$script_dir/.." && pwd)"
git config --global --add safe.directory "$repo_root"
pre-commit run merge-claude-settings -a
if ! bd ready; then
echo "It's likely the Dolt server has not yet been initialized to support beads, running that now" # TODO: figure out a better way to match this specific scenario than just a non-zero exit code...but beads still seems like in high flux right now so not sure what to tie it to
Expand Down
44 changes: 44 additions & 0 deletions .github/actions/check-skip-duplicates/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: Check Skip Duplicates
description: 'Check that will output a variable to allow you to skip duplicate runs. Example: If you have both push and pull_request triggers enabled and you dont want to run 2 jobs for the same commit if a PR is already open you can add this to your jobs to skip that extra execution.'

outputs:
should-run:
description: 'Flag that determines if this execution should run or not'
value: ${{ steps.check.outputs.should_run }}

runs:
using: composite
steps:
- name: Check if push has associated open PR
id: check
env:
GH_TOKEN: ${{ github.token }}
REF_NAME: ${{ github.ref_name }}
REPO_NAME: ${{ github.repository }}
EVENT_NAME: ${{ github.event_name }}
shell: bash
run: |
# For non-push events, always run
if [ "$EVENT_NAME" != "push" ]; then
echo "should_run=true" >> $GITHUB_OUTPUT
echo "Event is $EVENT_NAME, will run CI"
exit 0
fi

# For push events, check if there's an open PR for this branch
pr_json=$(gh pr list \
--repo "$REPO_NAME" \
--head "$REF_NAME" \
--state open \
--json number \
--limit 1)

pr_number=$(echo "$pr_json" | jq -r '.[0].number // ""')

if [ -n "$pr_number" ]; then
echo "should_run=false" >> $GITHUB_OUTPUT
echo "Push to branch with open PR #$pr_number detected, skipping (PR event will run CI)"
else
echo "should_run=true" >> $GITHUB_OUTPUT
echo "Push to branch without open PR, will run CI"
fi
42 changes: 41 additions & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ on:
branches-ignore:
- 'gh-readonly-queue/**' # don't run (again) when on these special branches created during merge groups; the `on: merge_group` already triggers it.
merge_group:
pull_request:

env:
PYTHONUNBUFFERED: True
Expand All @@ -19,9 +20,23 @@ jobs:
permissions:
contents: write # needed for updating dependabot branches

check-skip-duplicate:
runs-on: ubuntu-24.04
outputs:
should-run: ${{ steps.check.outputs.should-run }}
steps:
- name: Checkout code
uses: actions/checkout@v6.0.2
with:
persist-credentials: false
- id: check
uses: ./.github/actions/check-skip-duplicates

pre-commit:
needs:
- get-values
- check-skip-duplicate
if: needs.check-skip-duplicate.outputs.should-run == 'true'
uses: ./.github/workflows/pre-commit.yaml
permissions:
contents: write # needed for mutex
Expand All @@ -32,6 +47,8 @@ jobs:
unit-test:
needs:
- pre-commit
- check-skip-duplicate
if: needs.check-skip-duplicate.outputs.should-run == 'true'
strategy:
matrix:
os:
Expand Down Expand Up @@ -66,6 +83,8 @@ jobs:
lint-matrix:
needs:
- pre-commit
- check-skip-duplicate
if: needs.check-skip-duplicate.outputs.should-run == 'true'
strategy:
matrix:
os:
Expand Down Expand Up @@ -177,11 +196,18 @@ jobs:
name: pre-commit-log--${{ github.jobs.lint-matrix.name }}
path: "${{ github.workspace }}/.precommit_cache/pre-commit.log"

required-check:
confirm-on-tagged-copier-template:
if: ${{ github.event_name == 'pull_request' || github.event_name == 'merge_group' }}
uses: ./.github/workflows/confirm-on-tagged-copier-template.yaml


workflow-summary:
runs-on: ubuntu-24.04
timeout-minutes: 2
needs:
- get-values
- check-skip-duplicate
- confirm-on-tagged-copier-template
- pre-commit
- unit-test
- lint-matrix
Expand All @@ -194,13 +220,27 @@ jobs:
success_pattern="^(skipped|success)$" # these are the possibilities: https://docs.github.com/en/actions/reference/workflows-and-actions/contexts#needs-context

if [[ ! "${{ needs.get-values.result }}" =~ $success_pattern ]] ||
[[ ! "${{ needs.confirm-on-tagged-copier-template.result }}" =~ $success_pattern ]] ||
[[ ! "${{ needs.check-skip-duplicate.result }}" =~ $success_pattern ]] ||
[[ ! "${{ needs.pre-commit.result }}" =~ $success_pattern ]] ||
[[ ! "${{ needs.unit-test.result }}" =~ $success_pattern ]] ||
[[ ! "${{ 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"

- name: Mark the required-check as succeeded so the PR can be merged
if: ${{ github.event_name == 'pull_request' || github.event_name == 'merge_group' }}
env:
GH_TOKEN: ${{ github.token }}
run: |
gh api \
-X POST -H "Accept: application/vnd.github.v3+json" \
"${{ github.event.pull_request.statuses_url }}" \
-f state=success -f context="required-check" -f description="✅ All required checks passed in the job triggered by pull_request" \
-f target_url="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
Comment on lines +233 to +242

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.

⚠️ Potential issue | 🟠 Major

statuses_url is undefined for merge_group events.

Same issue as in the template: line 234 includes merge_group in the condition, but github.event.pull_request.statuses_url (line 240) is only available for pull_request events. The API call will fail for merge_group events.

🛠️ Proposed fix: Limit to pull_request only
       - name: Mark the required-check as succeeded so the PR can be merged
-        if: ${{ github.event_name == 'pull_request' || github.event_name == 'merge_group' }}
+        if: ${{ github.event_name == 'pull_request' }}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ci.yaml around lines 233 - 242, The step that posts to
"${{ github.event.pull_request.statuses_url }}" runs for both github.event_name
== 'pull_request' and 'merge_group' but github.event.pull_request.statuses_url
is undefined for merge_group; update the step's if condition to run only for
'pull_request' (remove 'merge_group') so the API call using
github.event.pull_request.statuses_url is only executed when that value exists.


- name: Mark updated dependabot hash commit as succeeded
if: needs.get-values.outputs.dependabot-commit-created == 'true'
env:
Expand Down
34 changes: 34 additions & 0 deletions .github/workflows/confirm-on-tagged-copier-template.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Confirm using tagged copier template version

on:
workflow_call:
inputs:
answers_file:
description: 'Path to the copier answers file'
type: string
default: '.copier-answers.yml'

jobs:
confirm-on-tagged-copier-template:
runs-on: ubuntu-24.04
timeout-minutes: 2
name: Fail if template under development
steps:
- name: Checkout code
uses: actions/checkout@v6.0.2
with:
persist-credentials: false

- name: Check _commit is a clean release tag
run: |
ANSWERS_FILE="${{ inputs.answers_file }}"
if [ ! -f "$ANSWERS_FILE" ]; then
echo "Error: $ANSWERS_FILE not found"
exit 1
fi
COMMIT_LINE=$(grep "^_commit:" "$ANSWERS_FILE")
if echo "$COMMIT_LINE" | grep -q "-"; then
echo "Error: $COMMIT_LINE"
echo "_commit must be a clean release tag (e.g. v0.0.111), not a dev commit (e.g. v0.0.106-14-g7847d7b)"
exit 1
Comment on lines +29 to +33

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.

🧹 Nitpick | 🔵 Trivial

Hyphen check may reject valid semver pre-release tags.

The grep -q "-" check will flag any _commit containing a hyphen, including legitimate semver pre-release versions like v1.0.0-alpha or v1.0.0-rc.1. If the upstream template ever uses pre-release tags, this would incorrectly reject them.

Consider a more precise pattern if pre-release tags should be allowed:

# Rejects git-describe format (vX.Y.Z-N-gHASH) but allows semver pre-release (vX.Y.Z-alpha)
if echo "$COMMIT_LINE" | grep -qE '\-[0-9]+-g[0-9a-f]+'; then

If dev commits are the only concern and pre-release tags are not used upstream, the current implementation is acceptable.

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

In @.github/workflows/confirm-on-tagged-copier-template.yaml around lines 37 -
41, The current hyphen check on COMMIT_LINE (the grep -q "-" branch) will reject
valid semver pre-release tags; change the check in the block that reads
COMMIT_LINE so it only detects git-describe style dev commits (the pattern: a
hyphen followed by digits, another hyphen, a "g" and a hex hash) rather than any
hyphen; keep the existing error message and exit behavior when that more
specific git-describe pattern matches.

fi
4 changes: 2 additions & 2 deletions .github/workflows/tag-on-merge.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ jobs:
permissions:
contents: write
steps:
- uses: actions/checkout@v6.0.1
- uses: actions/checkout@v6.0.2
with:
ref: ${{ github.event.pull_request.merge_commit_sha }}
fetch-depth: '0'
persist-credentials: false
- name: Bump version and push tag
uses: mathieudutour/github-tag-action@a22cf08638b34d5badda920f9daf6e72c477b07b # v6.2
uses: nickkostov/github-tag-action@b3aa34b4ac9c7843ee609ba5d0b0a50b962647b9 # v1.3.0 # a fork of https://github.com/mathieudutour/github-tag-action, which is still on Node 20

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.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check the fork's commit history and compare to original

echo "=== Checking fork details ==="
gh repo view nickkostov/github-tag-action --json name,owner,description,updatedAt,forkCount,stargazerCount 2>/dev/null || echo "Could not fetch repo details"

echo ""
echo "=== Checking the specific commit ==="
gh api repos/nickkostov/github-tag-action/commits/b3aa34b4ac9c7843ee609ba5d0b0a50b962647b9 --jq '.commit.message, .commit.author.date' 2>/dev/null || echo "Could not fetch commit details"

Repository: LabAutomationAndScreening/copier-nuxt-python-intranet-app

Length of output: 340


🌐 Web query:

nickkostov/github-tag-action fork Node.js maintenance

💡 Result:

No evidence found of a GitHub repository nickkostov/github-tag-action. Nikolay Kostov (GitHub username: nickkostov) is a DevOps engineer at Planet (weareplanet) in Sofia, with expertise in GitHub Actions, GitOps, Kubernetes, etc. He has forked many repositories including anothrNick/github-tag-action (a popular Shell-based GitHub Action for automatic SemVer tagging), but does not appear to maintain a Node.js-based fork. The original anothrNick/github-tag-action uses Node.js (upgraded to v20 in 2024; mathieudutour/github-tag-action, a TypeScript/Node.js alternative, upgraded to Node 24 in 2026). No sources indicate active Node.js maintenance by nickkostov for this action. His repos focus on homelab, ArgoCD, etc., not github-tag-action forks.

Citations:


🌐 Web query:

mathieudutour/github-tag-action Node.js 20 compatibility issue

💡 Result:

The mathieudutour/github-tag-action is compatible with Node.js 20. It was updated from Node 16 (EOL) to Node 20 via PR #202, merged on March 11, 2024, and included in release v6.2 (March 13, 2024). The repository's example usage specifies actions/checkout@v4, compatible with Node 20 runners. Use version v6.2 or later (latest as of 2024-08-30). No ongoing compatibility issues reported; an open issue #242 requests further Node.js upgrades but does not indicate problems with Node 20.

Citations:


🏁 Script executed:

# Check if there's any documentation about dependency choices in the repository
find . -type f \( -name "*.md" -o -name "*.txt" -o -name "DEPENDENCIES" -o -name "ADR*" \) | head -20

Repository: LabAutomationAndScreening/copier-nuxt-python-intranet-app

Length of output: 655


🏁 Script executed:

# Check the workflow file for any additional context
cat -n .github/workflows/tag-on-merge.yaml

Repository: LabAutomationAndScreening/copier-nuxt-python-intranet-app

Length of output: 1014


🏁 Script executed:

# Search for any references to this commit hash in the repository
rg "b3aa34b4ac9c7843ee609ba5d0b0a50b962647b9" .

Repository: LabAutomationAndScreening/copier-nuxt-python-intranet-app

Length of output: 83


🌐 Web query:

b3aa34b4ac9c7843ee609ba5d0b0a50b962647b9 github-tag-action commit

💡 Result:

No public GitHub commit matching the SHA "b3aa34b4ac9c7843ee609ba5d0b0a50b962647b9" was found in relation to "github-tag-action" or similar repositories. Extensive searches across GitHub, including anothrNick/github-tag-action (the primary matching action), mathieudutour/github-tag-action fork, releases, tags, pull requests, and general web results returned no matches for this specific commit hash. It may be a private commit, from a deleted repository, or not publicly indexed.

Citations:


Remove the unmaintained fork and use the upstream action instead.

The fork nickkostov/github-tag-action does not appear to exist or be actively maintained, and the commit hash b3aa34b4ac9c7843ee609ba5d0b0a50b962647b9 cannot be verified in any public repository. The stated justification—that the original mathieudutour/github-tag-action "is still on Node 20"—is incorrect; the upstream action was updated to Node.js 20 in v6.2 (March 2024) and is fully compatible with ubuntu-24.04.

Use mathieudutour/github-tag-action@v6.2 or later instead:

Recommended change
- uses: nickkostov/github-tag-action@b3aa34b4ac9c7843ee609ba5d0b0a50b962647b9 # v1.3.0
+ uses: mathieudutour/github-tag-action@v6.2
📝 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
uses: nickkostov/github-tag-action@b3aa34b4ac9c7843ee609ba5d0b0a50b962647b9 # v1.3.0 # a fork of https://github.com/mathieudutour/github-tag-action, which is still on Node 20
uses: mathieudutour/github-tag-action@v6.2
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/tag-on-merge.yaml at line 23, The workflow currently
references an unmaintained fork "uses: nickkostov/github-tag-action@b3aa34..."
which is unverifiable; update the GitHub Action invocation to use the upstream
maintained action by replacing that uses entry with
mathieudutour/github-tag-action@v6.2 (or a later tag) so the workflow uses the
official maintained action compatible with ubuntu-24.04 and remove the hard
commit hash reference.

with:
github_token: ${{ secrets.GITHUB_TOKEN }}
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ This project is a Copier template used to generate applications that are able to

## Tooling

- Always use `uv run python` instead of `python3` or `python` when running Python commands.
- Prefer dedicated shell tools over `python3`/`python` for simple one-off tasks: use `jq` for JSON parsing, standard shell builtins for string manipulation, etc. Only reach for `python3` when no simpler tool covers the need.
- ❌ Never use `python3` or `python` directly. ✅ Always use `uv run python` for Python commands.
- ❌ Never use `python3`/`python` for one-off data tasks. ✅ Use `jq` for JSON parsing, standard shell builtins for string manipulation. Only reach for `uv run python` when no dedicated tool covers the need.
- Check .devcontainer/devcontainer.json for tooling versions (Python, Node, etc.) when reasoning about version-specific stdlib or tooling behavior.
- 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`.
Expand Down
8 changes: 4 additions & 4 deletions extensions/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class ContextUpdater(ContextHook):
@override
def hook(self, context: dict[Any, Any]) -> dict[Any, Any]:
context["uv_version"] = "0.10.12"
context["pnpm_version"] = "10.32.1"
context["pnpm_version"] = "10.33.0"
context["pre_commit_version"] = "4.5.1"
context["pyright_version"] = ">=1.1.408"
context["pytest_version"] = ">=9.0.2"
Expand Down Expand Up @@ -51,7 +51,7 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]:
context["python_faker_version"] = ">=40.4.0"

context["default_node_version"] = "24.11.1"
context["nuxt_ui_version"] = "^4.5.1"
context["nuxt_ui_version"] = "^4.6.0"
context["nuxt_version"] = "~4.3.1"
context["nuxt_icon_version"] = "^2.2.1"
context["typescript_version"] = "^5.9.3"
Expand All @@ -61,14 +61,14 @@ def hook(self, context: dict[Any, Any]) -> dict[Any, Any]:
context["vue_devtools_api_version"] = "^8.1.0"
context["vue_router_version"] = "^5.0.3"
context["dotenv_cli_version"] = "^11.0.0"
context["faker_version"] = "^10.3.0"
context["faker_version"] = "^10.4.0"
context["vitest_version"] = "^3.2.4"
context["eslint_version"] = "~9.38.0"
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_cli_version"] = "^6.2.1"
context["graphql_codegen_typescript_version"] = "^5.0.7"
context["graphql_tools_mock_version"] = "^9.1.0"
context["tailwindcss_version"] = "^4.2.0"
Expand Down
2 changes: 1 addition & 1 deletion template/.devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# 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.4-noble
FROM --platform=linux/amd64 mcr.microsoft.com/devcontainers/universal:5.1.5-noble

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

Expand Down
19 changes: 12 additions & 7 deletions template/.devcontainer/devcontainer.json.jinja
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
{% raw %}{
"hostRequirements": {
"cpus": 2,
// Static site generation requires more memory
"memory": "10gb"
},
Comment on lines +2 to +6

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.

🧹 Nitpick | 🔵 Trivial

Make hostRequirements.memory configurable instead of hard-coding 10gb.

This template-level hardcode can force larger dev environments than needed and increases drift risk with generated repos (notably where .devcontainer/devcontainer.json currently uses a different memory value). Please expose memory (and optionally CPUs) as Copier variables with documented defaults.

Proposed template refactor
-  "hostRequirements": {
-    "cpus": 2,
-    // Static site generation requires more memory
-    "memory": "10gb"
-  },
+  "hostRequirements": {
+    "cpus": {% endraw %}{{ devcontainer_host_cpus | default(2) }}{% raw %},
+    // Keep configurable to avoid over-provisioning across generated repos
+    "memory": "{% endraw %}{{ devcontainer_host_memory | default('4gb') }}{% raw %}"
+  },
📝 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
"hostRequirements": {
"cpus": 2,
// Static site generation requires more memory
"memory": "10gb"
},
"hostRequirements": {
"cpus": {{ devcontainer_host_cpus | default(2) }},
// Keep configurable to avoid over-provisioning across generated repos
"memory": "{{ devcontainer_host_memory | default('4gb') }}"
},
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@template/.devcontainer/devcontainer.json.jinja` around lines 2 - 6, Replace
the hard-coded hostRequirements.memory ("10gb") with a Copier template variable
(e.g., {{ devcontainer_memory | default("10gb") }}) and optionally make cpus
configurable via {{ devcontainer_cpus | default(2) }}, update the
hostRequirements block to reference these variables (hostRequirements.memory and
hostRequirements.cpus), and add corresponding entries and defaults in the
template variables documentation so generated repos can override values without
forcing a static 10gb value.

"dockerComposeFile": "docker-compose.yml",
"service": "devcontainer",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
Expand Down Expand Up @@ -40,28 +45,28 @@
"ms-vscode.live-server@0.5.2025051301",
"MS-vsliveshare.vsliveshare@1.0.5905",
"github.copilot@1.388.0",
"github.copilot-chat@0.38.2026022704",{% endraw %}{% if install_claude_cli %}{% raw %}
"anthropic.claude-code@2.1.74",{% endraw %}{% endif %}{% raw %}
"github.copilot-chat@0.42.2026032602",{% endraw %}{% if install_claude_cli %}{% raw %}
"anthropic.claude-code@2.1.84",{% endraw %}{% endif %}{% raw %}

// Python
"ms-python.python@2026.2.2026021801",
"ms-python.vscode-pylance@2026.1.1",
"ms-python.python@2026.5.2026032701",
"ms-python.vscode-pylance@2026.1.102",
"ms-vscode-remote.remote-containers@0.414.0",
"charliermarsh.ruff@2026.36.0",
"charliermarsh.ruff@2026.38.0",
{% endraw %}{% if is_child_of_copier_base_template is not defined and template_uses_vuejs is defined and template_uses_vuejs is sameas(true) %}{% raw %}
// VueJS
"vue.volar@3.2.5",
"vitest.explorer@1.36.0",
{% endraw %}{% endif %}{% raw %}{% endraw %}{% if is_child_of_copier_base_template is not defined and template_uses_javascript is defined and template_uses_javascript is sameas(true) %}{% raw %}
// All javascript
"dbaeumer.vscode-eslint@3.0.21",
"dbaeumer.vscode-eslint@3.0.24",
{% endraw %}{% endif %}{% raw %}
// 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@12.3.0"
"esbenp.prettier-vscode@12.4.0"
],
"settings": {
"editor.accessibilitySupport": "off", // turn off sounds
Expand Down
Loading
Loading