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: 4 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
early_access: true
reviews:
profile: assertive
path_instructions:
- path: "**/vendor_files/**"
instructions: "These files came from a vendor and we're not allowed to change them. Refer to it if you need to understand how the main code interacts with it, but do not make comments about it."
- path: "**/*.py"
instructions: "Do not express concerns about assert statements being removed by using the -O python flag; we never use that flag. Do not express concerns about ruff rules; a pre-commit hook already runs a ruff check. Do not warn about unnecessary super().init() calls; pyright prefers those to be present."
Copy link

Copilot AI Jan 24, 2026

Choose a reason for hiding this comment

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

The instructions string refers to super().init() which is not a valid Python initializer call; it should reference super().__init__() to avoid confusion.

Suggested change
instructions: "Do not express concerns about assert statements being removed by using the -O python flag; we never use that flag. Do not express concerns about ruff rules; a pre-commit hook already runs a ruff check. Do not warn about unnecessary super().init() calls; pyright prefers those to be present."
instructions: "Do not express concerns about assert statements being removed by using the -O python flag; we never use that flag. Do not express concerns about ruff rules; a pre-commit hook already runs a ruff check. Do not warn about unnecessary super().__init__() calls; pyright prefers those to be present."

Copilot uses AI. Check for mistakes.
tools:
eslint: # when the code contains typescript, eslint will be run by pre-commit, and coderabbit often generates false positives
enabled: false
Expand All @@ -14,6 +17,7 @@ reviews:
flake8: # we use ruff instead (when we use Python)
enabled: false
poem: false
in_progress_fortune: false
# the commit status is driven by our repository config and required checks, we don't want CodeRabbit messing with it
commit_status: false
auto_review:
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.90
_commit: v0.0.94
_src_path: gh:LabAutomationAndScreening/copier-base-template.git
description: Copier template for creating Python libraries and executables
install_claude_cli: false
Expand Down
9 changes: 6 additions & 3 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
# 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:2.13.1-focal
FROM --platform=linux/amd64 mcr.microsoft.com/devcontainers/universal:5.1.1-noble
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

🧩 Analysis chain

🌐 Web query:

devcontainers/universal 5.1.1-noble tag release supported architectures

💡 Result:

For devcontainers/universal:5.1.1-noble, the published image is built for two Linux architectures:

Citations:


Remove --platform=linux/amd64 or document architecture restrictions.

The devcontainers/universal:5.1.1-noble tag supports both linux/amd64 and linux/arm64. The explicit --platform=linux/amd64 restriction unnecessarily prevents Apple Silicon and other arm64 users from using this configuration. Either remove the platform restriction to enable multi-architecture support, or document why amd64-only is required.

🤖 Prompt for AI Agents
In @.devcontainer/Dockerfile at line 4, The FROM line currently pins an explicit
platform flag ("FROM --platform=linux/amd64
mcr.microsoft.com/devcontainers/universal:5.1.1-noble"); remove the
"--platform=linux/amd64" token to allow multi-architecture images (arm64 users
on Apple Silicon) or, if amd64 is strictly required, add a clear comment above
that FROM line explaining the architecture restriction and why amd64-only is
necessary. Ensure the change targets the FROM instruction so the devcontainer
can run on both linux/amd64 and linux/arm64 when appropriate.


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

# temporary hack until yarn updates its GPG key
RUN rm /etc/apt/sources.list.d/yarn.list || true
Copy link

Copilot AI Jan 24, 2026

Choose a reason for hiding this comment

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

rm ... || true will mask real failures (e.g., permission or filesystem errors). Prefer rm -f ... to ignore only the missing-file case while still failing on unexpected errors.

Suggested change
RUN rm /etc/apt/sources.list.d/yarn.list || true
RUN rm -f /etc/apt/sources.list.d/yarn.list

Copilot uses AI. Check for mistakes.

RUN apt-get update -y && apt-get install -y \
"bash-completion=$(apt-cache madison bash-completion | awk '{print $3}' | grep '^1:2.10' | head -n 1)" --no-install-recommends \
"bash-completion=$(apt-cache madison bash-completion | awk '{print $3}' | grep '^1:2.11' | head -n 1)" --no-install-recommends \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

# Create the venv folder and set permissions for anyone to modify---this is necessary to be able to break out the venv folder as a separate docker volume for better performance on Windows hosts
ARG REPO_NAME=copier-base-template
ENV VENV_PATH=/workspaces/${REPO_NAME}/.venv
RUN mkdir -p /workspace && \
RUN mkdir -p /workspaces && \
mkdir -p ${VENV_PATH} && \
chmod -R 777 /workspaces ${VENV_PATH} && \
chgrp -R 0 /workspaces ${VENV_PATH}
Expand Down
16 changes: 8 additions & 8 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,24 @@
"extensions": [
// basic tooling
// "eamodio.gitlens@15.5.1",
"coderabbit.coderabbit-vscode@0.16.1",
"coderabbit.coderabbit-vscode@0.16.6",
"ms-vscode.live-server@0.5.2025051301",
"MS-vsliveshare.vsliveshare@1.0.5905",
"github.copilot@1.388.0",
"github.copilot-chat@0.34.2025112401",
"github.copilot-chat@0.36.2026010502",

// Python
"ms-python.python@2025.17.2025100201",
"ms-python.vscode-pylance@2025.8.3",
"ms-python.python@2025.21.2026010501",
"ms-python.vscode-pylance@2025.10.100",
"ms-vscode-remote.remote-containers@0.414.0",
"charliermarsh.ruff@2025.28.0",
"charliermarsh.ruff@2025.32.0",

// Misc file formats
"bierner.markdown-mermaid@1.28.0",
"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.0"
"esbenp.prettier-vscode@11.0.2"
],
"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): 99b3f7c4 # spellchecker:disable-line
// Devcontainer context hash (do not manually edit this, it's managed by a pre-commit hook): 69bb472f # spellchecker:disable-line
}
14 changes: 7 additions & 7 deletions .devcontainer/install-ci-tooling.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
import tempfile
from pathlib import Path

UV_VERSION = "0.9.17"
PNPM_VERSION = "10.25.0"
COPIER_VERSION = "9.11.0"
COPIER_TEMPLATE_EXTENSIONS_VERSION = "0.3.3"
PRE_COMMIT_VERSION = "4.5.0"
UV_VERSION = "0.9.26"
PNPM_VERSION = "10.28.1"
COPIER_VERSION = "==9.11.2"
COPIER_TEMPLATE_EXTENSIONS_VERSION = "==0.3.3"
PRE_COMMIT_VERSION = "4.5.1"
Comment on lines +10 to +14
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

🧩 Analysis chain

🏁 Script executed:

# First, let's read the install-ci-tooling.py file to understand the full context
cat -n .devcontainer/install-ci-tooling.py

Repository: LabAutomationAndScreening/copier-python-package-template

Length of output: 7394


Clarify version-specifier naming to prevent misuse.

COPIER_VERSION and COPIER_TEMPLATE_EXTENSIONS_VERSION contain version specifiers (==9.11.2 and ==0.3.3), unlike other version constants which hold only the version number. This inconsistency invites mistakes—if someone later edits the constant to 9.11.2 (matching the pattern of UV_VERSION or PNPM_VERSION), the resulting copier9.11.2 will be invalid. Rename these to COPIER_SPEC and COPIER_TEMPLATE_EXTENSIONS_SPEC to signal the embedded specifier:

Suggested change
-COPIER_VERSION = "==9.11.2"
-COPIER_TEMPLATE_EXTENSIONS_VERSION = "==0.3.3"
+COPIER_SPEC = "==9.11.2"
+COPIER_TEMPLATE_EXTENSIONS_SPEC = "==0.3.3"
...
-                f"copier{COPIER_VERSION}",
+                f"copier{COPIER_SPEC}",
...
-                f"copier-template-extensions{COPIER_TEMPLATE_EXTENSIONS_VERSION}",
+                f"copier-template-extensions{COPIER_TEMPLATE_EXTENSIONS_SPEC}",
🤖 Prompt for AI Agents
In @.devcontainer/install-ci-tooling.py around lines 10 - 14, The constants
COPIER_VERSION and COPIER_TEMPLATE_EXTENSIONS_VERSION include the "==" specifier
while others do not; rename them to COPIER_SPEC and
COPIER_TEMPLATE_EXTENSIONS_SPEC and update any references to use these new names
so it’s clear they contain a version specifier (e.g., change COPIER_VERSION ->
COPIER_SPEC and COPIER_TEMPLATE_EXTENSIONS_VERSION ->
COPIER_TEMPLATE_EXTENSIONS_SPEC and adjust any code that uses those symbols to
pass the spec strings into installers/requirements).

GITHUB_WINDOWS_RUNNER_BIN_PATH = r"C:\Users\runneradmin\.local\bin"
INSTALL_SSM_PLUGIN_BY_DEFAULT = False
parser = argparse.ArgumentParser(description="Install CI tooling for the repo")
Expand Down Expand Up @@ -76,9 +76,9 @@ def main():
uv_path,
"tool",
"install",
f"copier=={COPIER_VERSION}",
f"copier{COPIER_VERSION}",
"--with",
f"copier-template-extensions=={COPIER_TEMPLATE_EXTENSIONS_VERSION}",
f"copier-template-extensions{COPIER_TEMPLATE_EXTENSIONS_VERSION}",
],
check=True,
env=uv_env,
Expand Down
4 changes: 2 additions & 2 deletions .github/actions/install_deps/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,13 @@ runs:

- name: Setup python
if: ${{ inputs.python-version != 'notUsing' }}
uses: actions/setup-python@v6.1.0
uses: actions/setup-python@v6.2.0
with:
python-version: ${{ env.PYTHON_VERSION }}

- name: Setup node
if: ${{ inputs.node-version != 'notUsing' }}
uses: actions/setup-node@v6.1.0
uses: actions/setup-node@v6.2.0
with:
node-version: ${{ inputs.node-version }}

Expand Down
3 changes: 0 additions & 3 deletions .github/actions/update-devcontainer-hash/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@ inputs:
description: 'Branch to checkout and update'
required: true

permissions:
contents: write

outputs:
new-sha:
description: 'The SHA of the branch tip after update'
Expand Down
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 @@ -156,7 +156,7 @@ jobs:

- name: Upload Docker Image Artifact
if: ${{ inputs.save-as-artifact }}
uses: actions/upload-artifact@v5.0.0
uses: actions/upload-artifact@v6.0.0
with:
name: ${{ steps.calculate-build-context-hash.outputs.image_name_no_slashes }}
path: ${{ steps.calculate-build-context-hash.outputs.image_name_no_slashes }}.tar
Comment on lines +159 to 162
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

🌐 Web query:

actions/upload-artifact v6.0.0 release notes breaking changes

💡 Result:

actions/upload-artifact v6.0.0 (released Dec 12, 2025) — release notes & breaking changes

Breaking change / upgrade impact

  • Runtime moved to Node.js 24 (runs.using: node24). If your workflows/self-hosted environment can’t run Node 24, upgrading to v6 can break your pipeline. [1]
  • Minimum GitHub Actions Runner version required: 2.327.1 (primarily affects self-hosted runners—they must be updated before upgrading). [1]

What changed in v6.0.0

  • Added Node 24 support. [1]
  • Updated @actions/artifact to address Node 24 “punycode” deprecation. [1]

Sources: GitHub release page / repo docs for actions/upload-artifact v6.0.0. [1]


Verify self-hosted runner compatibility before upgrading to actions/upload-artifact@v6.0.0.

v6.0.0 (released Dec 12, 2025) introduces breaking changes:

  • Runtime moved to Node.js 24—will fail if runners cannot execute Node 24
  • Requires GitHub Actions Runner version 2.327.1+ (critical for self-hosted runners)

If you use self-hosted runners, ensure they're updated before merging this change. GitHub-hosted runners are typically updated automatically and should be compatible.

🤖 Prompt for AI Agents
In @.github/reusable_workflows/build-docker-image.yaml around lines 159 - 162,
The workflow updates actions/upload-artifact to v6.0.0 which requires Node.js 24
and runner >= 2.327.1; before merging either (a) revert/pin the action to the
previous compatible version (e.g., keep the existing tag) or (b) add a clear
guard/check and documentation that self-hosted runners must be updated, and
verify your self-hosted runner versions meet the requirement; locate the usage
of actions/upload-artifact@v6.0.0 and the artifact name references
(steps.calculate-build-context-hash.outputs.image_name_no_slashes) and then
decide to pin to a known-compatible version or confirm/upgrade runners and
update the workflow comment to explicitly state the runner/node requirements.

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ jobs:
timeout-minutes: 8 # this is the amount of time this action will wait to attempt to acquire the mutex lock before failing, e.g. if other jobs are queued up in front of it

- name: Cache Pre-commit hooks
uses: actions/cache@v4.3.0
uses: actions/cache@v5.0.2
env:
cache-name: cache-pre-commit-hooks
with:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pre-commit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ jobs:
timeout-minutes: 8 # this is the amount of time this action will wait to attempt to acquire the mutex lock before failing, e.g. if other jobs are queued up in front of it

- name: Cache Pre-commit hooks
uses: actions/cache@v4.3.0
uses: actions/cache@v5.0.2
env:
cache-name: cache-pre-commit-hooks
with:
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: 802d5794ff9cf7b15610c47eca99cd1ab757d8d4 # frozen: v1
rev: b31d3aa6e8e43e6a9cf7a1d137baf189dec0922b # frozen: v1
hooks:
- id: typos
exclude: |
Expand Down Expand Up @@ -195,12 +195,12 @@ repos:
- id: check-case-conflict

- repo: https://github.com/python-jsonschema/check-jsonschema
rev: 16a6ad2fead09286ee6eb6b0a3fab55655a6c22a # frozen: 0.35.0
rev: b035497fb64e3f9faa91e833331688cc185891e6 # frozen: 0.36.0
hooks:
- id: check-github-workflows

- repo: https://github.com/maresb/check-json5
rev: 893a2b5a0a27c3540bd8fcafe2968ccc05237179 # 1.0
rev: bd4737432a2175617a9eeaa510ab369cbc1cbd3d # frozen: v1.0.1
hooks:
- id: check-json5
files: |
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: 1a1f58ba4c35362efe8fed2279715a905baee93d # frozen: v0.14.8
rev: 5ba58aca0bd5bc7c0e1c0fc45af2e88d6a2bde83 # frozen: v0.14.10
hooks:
- id: ruff
name: ruff-src
Expand Down
19 changes: 15 additions & 4 deletions copier.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# Questions specific to this template





Comment on lines +1 to +6
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

Remove excessive blank lines.

YAMLlint flags 5 blank lines where maximum 2 are allowed. This appears to be unintentional whitespace at the top of the file.

🧹 Proposed fix
 # Questions specific to this template
-
-
-
-
-
 # Questions managed by upstream template
📝 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
# Questions specific to this template
# Questions specific to this template
🧰 Tools
🪛 YAMLlint (1.38.0)

[error] 6-6: too many blank lines (5 > 2)

(empty-lines)

🤖 Prompt for AI Agents
In `@copier.yml` around lines 1 - 6, The file contains excessive leading blank
lines at the top of copier.yml; remove the extra empty lines so that there are
no more than two consecutive blank lines at the beginning of the file (trim
leading whitespace to a single or at most two blank lines), saving the cleaned
copier.yml file to satisfy YAMLlint.

# Questions managed by upstream template
repo_name:
type: str
Expand Down Expand Up @@ -27,6 +33,11 @@ ssh_port_number:
# Pick a random port, but ensure it's not in the excluded port range on Windows (powershell: `netsh int ipv4 show excludedportrange protocol=tcp`)
default: "{{ ( (range(49152, 49752) | list) + (range(49852, 50000) | list) + (range(50060, 50160) | list) + (range(50160, 50260) | list) + (range(50260, 50360) | list) + (range(50914, 51014) | list) + (range(51114, 51214) | list) + (range(51214, 51314) | list) + (range(51314, 51414) | list) + (range(51623, 51723) | list) + (range(51723, 51823) | list) + (range(65269, 65369) | list) + (range(65369, 65469) | list) ) | random }}"

pull_from_ecr:
type: bool
help: Will you need to pull images from a central AWS Elastic Container Registry?
default: no

use_windows_in_ci:
type: bool
help: Should CI in the instantiated template also use Windows runners?
Expand Down Expand Up @@ -72,24 +83,24 @@ python_ci_versions:
aws_identity_center_id:
type: str
help: What's the ID of your Organization's AWS Identity center, e.g. d-9145c20053?
when: "{{ python_package_registry == 'AWS CodeArtifact' or install_aws_ssm_port_forwarding_plugin }}"
when: "{{ python_package_registry == 'AWS CodeArtifact' or install_aws_ssm_port_forwarding_plugin or pull_from_ecr }}"

aws_org_home_region:
type: str
help: What is the home region of the AWS Organization (where all of the central infrastructure is deployed)?
default: us-east-1
when: "{{ python_package_registry == 'AWS CodeArtifact' or install_aws_ssm_port_forwarding_plugin }}"
when: "{{ python_package_registry == 'AWS CodeArtifact' or install_aws_ssm_port_forwarding_plugin or pull_from_ecr }}"

aws_central_infrastructure_account_id:
type: str
help: What's the ID of your Organization's AWS Account containing Central Infrastructure (e.g. CodeArtifact)?
when: "{{ python_package_registry == 'AWS CodeArtifact' }}"
when: "{{ python_package_registry == 'AWS CodeArtifact' or pull_from_ecr }}"
default: "000000000000"

core_infra_base_access_profile_name:
type: str
help: What's the AWS Identity Center Profile name for base access to the Central Infrastructure account (i.e. to read from CodeArtifact)?
when: "{{ python_package_registry == 'AWS CodeArtifact' }}"
when: "{{ python_package_registry == 'AWS CodeArtifact' or pull_from_ecr }}"
default: CoreInfraBaseAccess


Expand Down
Loading
Loading