Skip to content

Copier update: release job - #64

Merged
ejfine merged 10 commits into
mainfrom
cop-release
Jul 15, 2026
Merged

Copier update: release job#64
ejfine merged 10 commits into
mainfrom
cop-release

Conversation

@ejfine

@ejfine ejfine commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Pull in upstream changes

Summary by CodeRabbit

  • New Features

    • Added/further enhanced release pipeline with dry-run mode, versioned tagging, and artifact-based packaging for Ubuntu/Windows.
    • Introduced the mutation-testing “fix-mutants” skill workflow and supporting scripts.
    • Added PR/comment automation helpers, including environment/PR validation and commit-link replacement.
    • Added CI composite action for AWS ECR authentication.
  • Improvements

    • Updated CI/devcontainer tooling, lint/type configurations, and dependency versions (including Codecov action).
    • Updated Beads default settings and tightened Git permissions (deny pushing tags).
    • Added template-managed file notices and backport guidance across repo docs/configs.

@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@ejfine, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 45 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 565284fb-4196-4fc8-9b3b-b71c792b5340

📥 Commits

Reviewing files that changed from the base of the PR and between dea456d and 448076e.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (2)
  • .devcontainer/devcontainer.json
  • pyinstaller.spec
📝 Walkthrough

Walkthrough

This PR synchronizes Copier-managed repository files, adds Claude review and mutation-testing workflows, updates development tooling and devcontainer configuration, and introduces GitHub Actions for ECR authentication, tagging, CI validation, and releases.

Changes

Repository tooling and automation

Layer / File(s) Summary
Template management markers and guidance
.claude/*, .config/*, .devcontainer/*, .github/*, AGENTS.md, README.md, docs/*, project files
Adds Copier ownership warnings and documents managed-file maintenance and backport guidance.
Claude configuration and review workflows
.claude/.beads/*, .claude/settings/permissions/bash.jsonc, .claude/skills/address-pr-comments/*
Updates Beads defaults, broadens Git permissions with tag-push denial, centralizes command timeouts, and adds environment verification and commit-link handling.
Mutation testing workflow
.claude/skills/fix-mutants/*, .gitignore, pyproject.toml
Adds an interactive fix-mutants skill and scripts for running, grouping, inspecting, and verifying mutmut results.
Development environment and quality configuration
.config/*, .devcontainer/*, .pre-commit-config.yaml, pyproject.toml, pyrightconfig.json, pytest.ini
Adds Pyrefly and formatting configuration, wires new pre-commit checks, updates tool versions, and excludes generated mutation output.
GitHub Actions and release automation
.github/actions/*, .github/workflows/*
Adds AWS ECR authentication, updates action versions, changes tag handling, and introduces guarded release packaging from CI artifacts.
Project documentation and supporting files
README.md, AGENTS.md, docs/*, LICENSE, .github/CONTRIBUTING.md
Documents release behavior, updates contributor links and guidance, and adds documentation dependencies.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is a single generic sentence and omits all required template sections. Add the required sections: issue/message link, why, how, side effects, testing, and other.
Docstring Coverage ⚠️ Warning Docstring coverage is 17.14% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title matches the main theme of the changes, though it is narrower than the full template sync.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 7

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.claude/skills/address-pr-comments/fetch-pr-comments.py:
- Around line 323-330: Move the copier-managed warning header block to the very
beginning of fetch-pr-comments.py, before all imports, comments, and executable
content, while preserving its existing text unchanged.

In @.claude/skills/address-pr-comments/verify-env.py:
- Line 99: Update the on_protected_branch condition to use explicit checks for
“main” and “master” in separate branches instead of membership testing, while
preserving the same boolean result and allowing each condition to be covered
independently.

In @.claude/skills/fix-mutants/utils.py:
- Around line 56-59: Update the emit function’s docstring to comply with the
project guideline: either remove it because the function name and implementation
are self-explanatory, or expand it into a substantive multi-line explanation of
its stdout JSON serialization behavior.
- Around line 209-212: Update the run_mutmut docstring to remove it or expand it
into a multiline docstring documenting the function’s behavior, arguments, and
possible exceptions; preserve the existing implementation and signature.

In @.github/workflows/git_tag.py:
- Line 12: Update ensure_tag_not_present so tag and remote are keyword-only
parameters by adding * to its signature, then revise both call sites in the
surrounding workflow code to pass these arguments by name.

In @.github/workflows/release.yaml:
- Around line 40-44: Prevent shell injection in the release workflow by moving
all GitHub Actions expression values out of run-script interpolation and into
step-level environment variables. Update .github/workflows/release.yaml lines
40-44 for “Fail if real release is not on main,” lines 88-99 for “Check version
tag does not already exist,” lines 118-121 for both “Confirm tag not already
present” and “Create tag,” lines 143-145 for “Package executable (ubuntu-24.04
py3.13.9),” and lines 154-156 for “Package executable (windows-2025-vs2026
py3.13.9)”; use the env variables inside each script for github.ref,
steps.get-version.outputs.version, inputs.dry_run, and
needs.guard.outputs.version respectively.

In `@pyinstaller.spec`:
- Line 23: Update the datas entries in the PyInstaller configuration to satisfy
the spellchecker suppression requirement: add preceding comments explaining that
datas is PyInstaller’s API name, or remove the spellchecker suppressions if they
are unnecessary. Apply this consistently to both occurrences.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 77483d7a-8981-4765-a490-3afd2f426835

📥 Commits

Reviewing files that changed from the base of the PR and between 48f2cb8 and 0a3ab6f.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (117)
  • .claude/.beads/.gitignore
  • .claude/.beads/config.yaml
  • .claude/CLAUDE.md
  • .claude/commands/add-command.md
  • .claude/commands/commit.md
  • .claude/commands/create-adr.md
  • .claude/commands/create-issues.md
  • .claude/commands/gap.md
  • .claude/commands/green.md
  • .claude/commands/issue.md
  • .claude/commands/polish.md
  • .claude/commands/red.md
  • .claude/commands/refactor.md
  • .claude/commands/research.md
  • .claude/commands/simplify.md
  • .claude/commands/spike.md
  • .claude/commands/summarize.md
  • .claude/commands/tdd-review.md
  • .claude/commands/tdd.md
  • .claude/helpers/merge-claude-settings.sh
  • .claude/hooks/bash-chain-guard.js
  • .claude/hooks/caveman-activate.js
  • .claude/hooks/caveman-config.js
  • .claude/hooks/caveman-mode-tracker.js
  • .claude/settings/basics.jsonc
  • .claude/settings/hooks.jsonc
  • .claude/settings/permissions/additional-dirs.jsonc
  • .claude/settings/permissions/bash.jsonc
  • .claude/settings/permissions/read.jsonc
  • .claude/settings/permissions/write.jsonc
  • .claude/skills/address-pr-comments/SKILL.md
  • .claude/skills/address-pr-comments/check-footer.py
  • .claude/skills/address-pr-comments/commit-link.py
  • .claude/skills/address-pr-comments/fetch-pr-comments.py
  • .claude/skills/address-pr-comments/post-reply.py
  • .claude/skills/address-pr-comments/utils.py
  • .claude/skills/address-pr-comments/verify-env.py
  • .claude/skills/caveman/SKILL.md
  • .claude/skills/fix-mutants/SKILL.md
  • .claude/skills/fix-mutants/check-results.py
  • .claude/skills/fix-mutants/group-by-line.py
  • .claude/skills/fix-mutants/list-survived.py
  • .claude/skills/fix-mutants/run-mutmut.py
  • .claude/skills/fix-mutants/show-mutant.py
  • .claude/skills/fix-mutants/utils.py
  • .claude/skills/fix-mutants/verify-mutant.py
  • .coderabbit.yaml
  • .config/.copier-answers.yml
  • .config/.copier-managed-files.json
  • .config/.coveragerc
  • .config/.prettierrc
  • .config/_typos.toml
  • .config/pylintrc.toml
  • .config/pyrefly.mutmut.toml
  • .config/pyrefly.toml
  • .config/ruff-non-src.toml
  • .config/ruff.toml
  • .devcontainer/Dockerfile
  • .devcontainer/code-artifact-auth.sh
  • .devcontainer/create-aws-profile.sh
  • .devcontainer/devcontainer.json
  • .devcontainer/docker-compose.yml
  • .devcontainer/initialize-command.sh
  • .devcontainer/install-ci-tooling.py
  • .devcontainer/manual-setup-deps.py
  • .devcontainer/on-create-command-boilerplate.sh
  • .devcontainer/on-create-command.sh
  • .devcontainer/post-start-command.sh
  • .devcontainer/windows-host-helper.sh
  • .github/.codecov.yml
  • .github/CODE_OF_CONDUCT.md
  • .github/CONTRIBUTING.md
  • .github/ISSUE_TEMPLATE/bug-report.yml
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/ISSUE_TEMPLATE/feature-request.yml
  • .github/ISSUE_TEMPLATE/tech-debt.yml
  • .github/actions/check-skip-duplicates/action.yml
  • .github/actions/ecr-auth/action.yml
  • .github/actions/install_deps/action.yml
  • .github/actions/update-devcontainer-hash/action.yml
  • .github/dependabot.yml
  • .github/pull_request_template.md
  • .github/workflows/ci.yaml
  • .github/workflows/confirm-on-tagged-copier-template.yaml
  • .github/workflows/extract_project_version.py
  • .github/workflows/get-values.yaml
  • .github/workflows/git_tag.py
  • .github/workflows/hash_git_files.py
  • .github/workflows/pre-commit.yaml
  • .github/workflows/release.yaml
  • .gitignore
  • .pre-commit-config.yaml
  • .python-version
  • .readthedocs.yaml
  • AGENTS.md
  • CHANGELOG.md
  • CLAUDE.md
  • LICENSE
  • README.md
  • biome.jsonc
  • docs/Makefile
  • docs/_static/.gitkeep
  • docs/conf.py
  • docs/index.rst
  • docs/make.bat
  • docs/requirements.txt
  • pyinstaller.spec
  • pyproject.toml
  • pyrightconfig.json
  • pytest.ini
  • scripts/delete_false_positive_rej.py
  • sh.bat
  • src/cloud_courier/main.py
  • src/entrypoint.py
  • tests/unit/__init__.py
  • tests/unit/conftest.py
  • ty.toml
💤 Files with no reviewable changes (2)
  • CLAUDE.md
  • ty.toml

Comment on lines +323 to +330

# ============== WARNING ==============================================================================
# File is managed by copier template: gh:LabAutomationAndScreening/copier-base-template.git
# See .config/.copier-managed-files.json for details.
#
# You are welcome to make changes to this file in your repo if they are custom to your project,
# but if the change should be shared with other projects, please backport it to the template repo.
# =====================================================================================================

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Move the warning header to the top of the file.

Copier-managed file warning headers should be placed at the very beginning of the file. Placing it at the bottom defeats its purpose, as developers modifying the file might not scroll down to see it before making changes.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.claude/skills/address-pr-comments/fetch-pr-comments.py around lines 323 -
330, Move the copier-managed warning header block to the very beginning of
fetch-pr-comments.py, before all imports, comments, and executable content,
while preserving its existing text unchanged.

args = parser.parse_args()

branch = current_branch()
on_protected_branch = branch in {"main", "master"}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Avoid list-style membership tests for conditions.

As per coding guidelines, avoid list-style membership tests such as x in ['a', 'b'] in implementation code; use separate branches so coverage tools can measure each condition independently.

♻️ Proposed refactor
-    on_protected_branch = branch in {"main", "master"}
+    if branch == "main":
+        on_protected_branch = True
+    elif branch == "master":
+        on_protected_branch = True
+    else:
+        on_protected_branch = False
📝 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
on_protected_branch = branch in {"main", "master"}
if branch == "main":
on_protected_branch = True
elif branch == "master":
on_protected_branch = True
else:
on_protected_branch = False
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.claude/skills/address-pr-comments/verify-env.py at line 99, Update the
on_protected_branch condition to use explicit checks for “main” and “master” in
separate branches instead of membership testing, while preserving the same
boolean result and allowing each condition to be covered independently.

Source: Coding guidelines

Comment on lines +56 to +59
def emit(obj: Any) -> None: # noqa: ANN401 — serializes arbitrary JSON-shaped result objects
"""Write a JSON result to stdout (the scripts' machine-readable output)."""
_ = sys.stdout.write(json.dumps(obj, indent=2) + "\n")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Remove or expand the one-line docstring.

As per coding guidelines, never write one-line Python docstrings; either the name is sufficient or the behavior warrants a full explanation.

♻️ Proposed fix
-def emit(obj: Any) -> None:  # noqa: ANN401 — serializes arbitrary JSON-shaped result objects
-    """Write a JSON result to stdout (the scripts' machine-readable output)."""
-    _ = sys.stdout.write(json.dumps(obj, indent=2) + "\n")
+def emit(obj: Any) -> None:  # noqa: ANN401 — serializes arbitrary JSON-shaped result objects
+    _ = sys.stdout.write(json.dumps(obj, indent=2) + "\n")
📝 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
def emit(obj: Any) -> None: # noqa: ANN401 — serializes arbitrary JSON-shaped result objects
"""Write a JSON result to stdout (the scripts' machine-readable output)."""
_ = sys.stdout.write(json.dumps(obj, indent=2) + "\n")
def emit(obj: Any) -> None: # noqa: ANN401 — serializes arbitrary JSON-shaped result objects
_ = sys.stdout.write(json.dumps(obj, indent=2) + "\n")
🧰 Tools
🪛 ast-grep (0.44.1)

[info] 57-57: use jsonify instead of json.dumps for JSON output
Context: json.dumps(obj, indent=2)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.claude/skills/fix-mutants/utils.py around lines 56 - 59, Update the emit
function’s docstring to comply with the project guideline: either remove it
because the function name and implementation are self-explanatory, or expand it
into a substantive multi-line explanation of its stdout JSON serialization
behavior.

Source: Coding guidelines

Comment on lines +209 to +212
def run_mutmut(
args: list[str], backend_root: Path, *, timeout: int = SUBPROCESS_TIMEOUT_SECONDS
) -> subprocess.CompletedProcess[str]:
"""Invoke the project's mutmut via uv, with cwd at the backend root."""

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Remove or expand the one-line docstring.

As per coding guidelines, never write one-line Python docstrings. Consider removing it or expanding it to fully document the behavior, parameters, and exceptions.

♻️ Proposed fix
 def run_mutmut(
     args: list[str], backend_root: Path, *, timeout: int = SUBPROCESS_TIMEOUT_SECONDS
 ) -> subprocess.CompletedProcess[str]:
-    """Invoke the project's mutmut via uv, with cwd at the backend root."""
     try:
📝 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
def run_mutmut(
args: list[str], backend_root: Path, *, timeout: int = SUBPROCESS_TIMEOUT_SECONDS
) -> subprocess.CompletedProcess[str]:
"""Invoke the project's mutmut via uv, with cwd at the backend root."""
def run_mutmut(
args: list[str], backend_root: Path, *, timeout: int = SUBPROCESS_TIMEOUT_SECONDS
) -> subprocess.CompletedProcess[str]:
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.claude/skills/fix-mutants/utils.py around lines 209 - 212, Update the
run_mutmut docstring to remove it or expand it into a multiline docstring
documenting the function’s behavior, arguments, and possible exceptions;
preserve the existing implementation and signature.

Source: Coding guidelines

raise KeyError(f"No version field found in {path!r}")


def ensure_tag_not_present(tag: str, remote: str) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Prefer keyword-only parameters.

As per coding guidelines, prefer keyword-only parameters in Python by using * in function signatures.

♻️ Proposed refactor for the signature and its call sites

Update the signature:

-def ensure_tag_not_present(tag: str, remote: str) -> None:
+def ensure_tag_not_present(*, tag: str, remote: str) -> None:

Update the call on line 57:

-        ensure_tag_not_present(tag, args.remote)
+        ensure_tag_not_present(tag=tag, remote=args.remote)

Update the call on line 63:

-        ensure_tag_not_present(tag, args.remote)
+        ensure_tag_not_present(tag=tag, remote=args.remote)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/git_tag.py at line 12, Update ensure_tag_not_present so
tag and remote are keyword-only parameters by adding * to its signature, then
revise both call sites in the surrounding workflow code to pass these arguments
by name.

Source: Coding guidelines

Comment on lines +40 to +44
- name: Fail if real release is not on main
if: ${{ !inputs.dry_run && github.ref != 'refs/heads/main' }}
run: |
echo "Real releases must run from main. Current ref: ${{ github.ref }}"
exit 1

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Prevent script injection via template expansion.

Using GitHub Actions expressions like ${{ github.ref }} or ${{ steps.get-version.outputs.version }} directly within a bash run block allows for script injection if the interpolated value contains malicious shell metacharacters (e.g., if a manipulated pyproject.toml version string is surfaced to an active action runner). Pass these values securely via environment variables instead.

  • .github/workflows/release.yaml#L40-L44: pass ${{ github.ref }} via an env variable in the "Fail if real release is not on main" step.
  • .github/workflows/release.yaml#L88-L99: pass ${{ steps.get-version.outputs.version }} and ${{ inputs.dry_run }} via env variables in the "Check version tag does not already exist" step.
  • .github/workflows/release.yaml#L118-L121: pass ${{ needs.guard.outputs.version }} via an env variable for both the "Confirm tag not already present" and "Create tag" steps.
  • .github/workflows/release.yaml#L143-L145: pass ${{ needs.guard.outputs.version }} via an env variable in the "Package executable (ubuntu-24.04 py3.13.9)" step.
  • .github/workflows/release.yaml#L154-L156: pass ${{ needs.guard.outputs.version }} via an env variable in the "Package executable (windows-2025-vs2026 py3.13.9)" step.
🧰 Tools
🪛 zizmor (1.26.1)

[error] 43-43: code injection via template expansion (template-injection): may expand into attacker-controllable code

(template-injection)

📍 Affects 1 file
  • .github/workflows/release.yaml#L40-L44 (this comment)
  • .github/workflows/release.yaml#L88-L99
  • .github/workflows/release.yaml#L118-L121
  • .github/workflows/release.yaml#L143-L145
  • .github/workflows/release.yaml#L154-L156
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yaml around lines 40 - 44, Prevent shell injection
in the release workflow by moving all GitHub Actions expression values out of
run-script interpolation and into step-level environment variables. Update
.github/workflows/release.yaml lines 40-44 for “Fail if real release is not on
main,” lines 88-99 for “Check version tag does not already exist,” lines 118-121
for both “Confirm tag not already present” and “Create tag,” lines 143-145 for
“Package executable (ubuntu-24.04 py3.13.9),” and lines 154-156 for “Package
executable (windows-2025-vs2026 py3.13.9)”; use the env variables inside each
script for github.ref, steps.get-version.outputs.version, inputs.dry_run, and
needs.guard.outputs.version respectively.

Source: Linters/SAST tools

Comment thread pyinstaller.spec Outdated
@ejfine
ejfine merged commit 36861a8 into main Jul 15, 2026
15 of 16 checks passed
@ejfine
ejfine deleted the cop-release branch July 15, 2026 13:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant