Skip to content

feat(template): restructure modules into subpackages and add deployment workflows#9

Open
hasansezertasan wants to merge 12 commits intomainfrom
feat/packaging-and-deploy
Open

feat(template): restructure modules into subpackages and add deployment workflows#9
hasansezertasan wants to merge 12 commits intomainfrom
feat/packaging-and-deploy

Conversation

@hasansezertasan
Copy link
Owner

@hasansezertasan hasansezertasan commented Jan 26, 2026

Summary

  • Module restructuring: Reorganize flat source files into proper subpackages (cli/, gui/, tui/, web/, mcp/, core/, utils/) with matching test structure
  • MCP support: Add Model Context Protocol server feature with include_mcp option
  • PyCrucible integration: Build standalone executables for Windows, macOS, and Linux on release
  • Docker Hub publishing: Build and push multi-arch Docker images when include_web is enabled
  • Unified CD workflow: Consolidate all release automation into single cd.yml with conditional jobs

Test plan

  • Generate project with all features enabled and verify structure
  • Generate project with minimal features and verify no extra files
  • Run tox run -e style on generated project
  • Run tox run on generated project
  • Verify CD workflow YAML is valid with actionlint

🤖 Generated with Claude Code

High-level PR Summary

This PR restructures a Copier Python template from a flat module layout to a proper subpackage architecture (cli/, web/, gui/, tui/, mcp/, core/, utils/), adds Model Context Protocol (MCP) server support with an include_mcp option, integrates PyCrucible for building standalone executables across platforms, adds Docker Hub multi-arch publishing for web projects, consolidates all CD workflows into a unified cd.yml with conditional jobs for PyPI, executables, and Docker images, introduces profiling tools (py-spy, scalene, cProfile) via include_profiling, and supports both FastAPI and Litestar web frameworks through a configurable web_framework choice. Additionally, it updates documentation, renames use_precommit to include_precommit, removes the include_poe option in favor of mise for task running, and adds comprehensive VS Code debugging configurations for all entry points.

⏱️ Estimated Review Time: 30-90 minutes

💡 Review Order Suggestion
Order File Path
1 copier.yml
2 .example-input.yml
3 README.md
4 CLAUDE.md
5 AGENTS.md
6 cliff.toml
7 .cliffignore
8 template/pyproject.toml.jinja
9 template/src/{{github_repo_name}}/core/__init__.py.jinja
10 template/src/{{github_repo_name}}/core/app.py.jinja
11 template/src/{{github_repo_name}}/core/logging_setup.py.jinja
12 template/src/{{github_repo_name}}/utils/__init__.py.jinja
13 template/src/{{github_repo_name}}/{% if include_cli %}cli{% endif %}/__init__.py.jinja
14 template/src/{{github_repo_name}}/{% if include_cli %}cli{% endif %}/app.py.jinja
15 template/src/{{github_repo_name}}/{% if include_web %}web{% endif %}/__init__.py.jinja
16 template/src/{{github_repo_name}}/{% if include_web %}web{% endif %}/app.py.jinja
17 template/src/{{github_repo_name}}/{% if include_tui %}tui{% endif %}/__init__.py.jinja
18 template/src/{{github_repo_name}}/{% if include_tui %}tui{% endif %}/app.py.jinja
19 template/src/{{github_repo_name}}/{% if include_gui %}gui{% endif %}/__init__.py.jinja
20 template/src/{{github_repo_name}}/{% if include_gui %}gui{% endif %}/app.py.jinja
21 template/src/{{github_repo_name}}/{% if include_mcp %}mcp{% endif %}/__init__.py.jinja
22 template/src/{{github_repo_name}}/{% if include_mcp %}mcp{% endif %}/app.py.jinja
23 template/tests/{% if include_cli %}cli{% endif %}/__init__.py.jinja
24 template/tests/{% if include_cli %}cli{% endif %}/test_app.py.jinja
25 template/tests/{% if include_web %}web{% endif %}/__init__.py.jinja
26 template/tests/{% if include_web %}web{% endif %}/test_app.py.jinja
27 template/tests/{% if include_tui %}tui{% endif %}/__init__.py.jinja
28 template/tests/{% if include_tui %}tui{% endif %}/test_app.py.jinja
29 template/tests/{% if include_gui %}gui{% endif %}/__init__.py.jinja
30 template/tests/{% if include_gui %}gui{% endif %}/test_app.py.jinja
31 template/tests/{% if include_mcp %}mcp{% endif %}/__init__.py.jinja
32 template/tests/{% if include_mcp %}mcp{% endif %}/test_app.py.jinja
33 template/{% if include_profiling %}profile.py{% endif %}.jinja
34 template/.github/workflows/cd.yml.jinja
35 template/.github/workflows/ci.yml
36 template/.github/{% if dependency_management == 'dependabot' %}dependabot.yml{% endif %}.jinja
37 template/.github/ISSUE_TEMPLATE/bug_report.md.jinja
38 template/.vscode/launch.json.jinja
39 template/.vscode/extensions.json
40 template/.zed/debug.json.jinja
41 template/.devcontainer/docker-compose.queue.yml
42 template/.devcontainer/queue/Dockerfile
43 template/{% if include_mise %}mise.toml{% endif %}.jinja
44 template/{% if include_web %}Dockerfile{% endif %}.jinja
⚠️ Inconsistent Changes Detected
File Path Warning
template/.devcontainer/docker-compose.queue.yml Adds RabbitMQ queue infrastructure which is not mentioned in the PR summary and appears unrelated to the main restructuring and deployment workflow changes
template/.devcontainer/queue/Dockerfile Adds RabbitMQ queue Dockerfile which is not mentioned in the PR summary and appears unrelated to the main restructuring and deployment workflow changes
template/.github/ISSUE_TEMPLATE/bug_report.md.jinja Adds a large example traceback to the bug report template which seems unrelated to module restructuring or deployment workflows

Need help? Join our Discord

…nt workflows

Reorganize template source structure from flat files to proper subpackages:
- Move cli.py, gui.py, tui.py, web.py, mcp.py into cli/, gui/, tui/, web/, mcp/ subpackages
- Move config.py, dirs.py, logging_setup.py into core/ subpackage
- Move utils.py into utils/ subpackage
- Mirror test structure to match source layout

Add new features:
- MCP (Model Context Protocol) server support with include_mcp option
- PyCrucible standalone executable building integrated into cd.yml
- Docker Hub publishing integrated into cd.yml for web apps
- Profiling support with include_profiling option and profile.py script
- git-cliff changelog generation config

Update CD workflow to unified release flow:
- build -> pypi-publish -> attach-github-release
- Conditional build-executables job (3 platforms) when include_pycrucible
- Conditional docker-publish job when include_web
- Document workflow structure in README with ASCII diagram

Other improvements:
- Add devcontainer queue service configuration
- Update VS Code and Zed debug configurations
- Fix dependabot.yml template syntax
- Update example input with new options

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@sourcery-ai
Copy link
Contributor

sourcery-ai bot commented Jan 26, 2026

Reviewer's Guide

Restructures the generated project’s runtime modules into subpackages, adds optional MCP server and profiling/packaging features, and unifies/enriches CI/CD to support PyCrucible executables and Docker Hub publishing with framework-conditional web support.

Class diagram for restructured runtime subpackages and entry points

classDiagram
    direction LR

    class Package_root {
      <<package>>
      +__init__
      +__main__
      +__metadata__
      +_version
    }

    class Package_core {
      <<package>>
    }

    class Core_dirs {
      +LOG_FILE_PATH
      +ROOT_FOLDER_PATH
    }

    class Core_logging_setup {
      +setup_logger() Logger
    }

    class Core_app {
      <<module>>
    }

    class Package_utils {
      <<package>>
    }

    class Package_cli {
      <<package>>
    }

    class Cli_app {
      +app
      +version()
      +info()
      +interactive()  %% optional TUI
      +gui()          %% optional GUI
      +web()          %% optional Web
    }

    class Package_web {
      <<package>>
    }

    class Web_app_fastapi {
      +app FastAPI
      +get_version() str
      +get_info() JSONResponse
      +main() void
    }

    class Web_app_litestar {
      +app Litestar
      +get_version() str
      +get_info() dict~str,str~
      +main() void
    }

    class Package_gui {
      <<package>>
    }

    class Gui_app {
      +GuiDisplayError
    }

    class Package_tui {
      <<package>>
    }

    class Tui_app {
      +TuiDisplayError
    }

    class Package_mcp {
      <<package>>
    }

    class Mcp_app {
      +server Server
      +list_tools() list~Tool~
      +call_tool(name, arguments) list~TextContent~
      +run_server() void
      +main() void
    }

    class Profile_module {
      +run_app() void
      +profile_pyspy() void
      +profile_scalene() void
      +profile_cprofile() void
      +main() void
    }

    Package_root *-- Package_core
    Package_root *-- Package_utils
    Package_root *-- Package_cli
    Package_root *-- Package_web
    Package_root *-- Package_gui
    Package_root *-- Package_tui
    Package_root *-- Package_mcp
    Package_root *-- Profile_module

    Package_core *-- Core_dirs
    Package_core *-- Core_logging_setup
    Package_core *-- Core_app

    Package_cli *-- Cli_app
    Package_web *-- Web_app_fastapi
    Package_web *-- Web_app_litestar
    Package_gui *-- Gui_app
    Package_tui *-- Tui_app
    Package_mcp *-- Mcp_app

    Cli_app ..> Core_logging_setup : uses logger
    Web_app_fastapi ..> Core_logging_setup : uses logger
    Web_app_litestar ..> Core_logging_setup : uses logger
    Gui_app ..> Core_logging_setup : uses logger
    Tui_app ..> Core_logging_setup : uses logger
    Mcp_app ..> Core_logging_setup : uses logger

    Cli_app ..> Web_app_fastapi : optional web()
    Cli_app ..> Web_app_litestar : optional web()
    Cli_app ..> Tui_app : optional interactive()
    Cli_app ..> Gui_app : optional gui()

    Profile_module ..> Cli_app : optional run_app()
    Profile_module ..> Web_app_fastapi : optional run_app()
    Profile_module ..> Web_app_litestar : optional run_app()
    Profile_module ..> Tui_app : optional run_app()
Loading

Flow diagram for web feature and framework-dependent behavior

flowchart TD
  direction TB

  Start([Template generation]) --> QIncludeWeb{include_web}

  QIncludeWeb -- false --> SkipWeb[No web package
no Docker image
no web scripts]
  QIncludeWeb -- true --> QFramework{web_framework}

  QFramework -- fastapi --> FastAPIDeps[Set dependency group web
fastapi_all]
  QFramework -- litestar --> LitestarDeps[Set dependency group web
litestar_standard]

  FastAPIDeps --> WebPkgFastAPI[Generate web/app_py
with FastAPI app]
  LitestarDeps --> WebPkgLitestar[Generate web/app_py
with Litestar app]

  WebPkgFastAPI --> EntryPoints[Configure project_scripts
repo_web -> repo_web_app_main]
  WebPkgLitestar --> EntryPoints

  EntryPoints --> Dockerfile[Generate Dockerfile
uvicorn repo_web_app_app]
  EntryPoints --> CDWorkflow

  CDWorkflow[cd_yml
includes docker_publish job] --> DockerHub[Build multi-arch image
push to Docker Hub]
Loading

File-Level Changes

Change Details Files
Restructure runtime code and tests into feature-specific subpackages with updated entry points.
  • Move flat modules (cli.py, gui.py, tui.py, web.py, logging_setup.py, dirs.py) into structured packages core/, utils/, cli/, gui/, tui/, web/, mcp/ with corresponding init.py files.
  • Introduce web/app.py as the web entrypoint supporting either FastAPI or Litestar, and adjust Dockerfile and CLI to import from pkg.web.app.
  • Update CLI, GUI, TUI implementations to live under their respective app.py modules and adjust imports to use core.logging_setup and new package paths.
  • Mirror the new source layout under tests/ by moving feature tests into tests/cli/, tests/gui/, tests/tui/, tests/web/, tests/mcp/ and updating imports accordingly.
  • Adjust pyproject project.scripts and project.gui-scripts to point to the new package paths (cli.app:app, gui.app:main, tui.app:main, web.app:main, mcp.app:main).
template/src/{{github_repo_name}}/cli/app.py.jinja
template/src/{{github_repo_name}}/gui/app.py.jinja
template/src/{{github_repo_name}}/tui/app.py.jinja
template/src/{{github_repo_name}}/web/app.py.jinja
template/src/{{github_repo_name}}/core/logging_setup.py.jinja
template/src/{{github_repo_name}}/core/__init__.py.jinja
template/src/{{github_repo_name}}/utils/__init__.py.jinja
template/tests/cli/test_app.py.jinja
template/tests/gui/test_app.py.jinja
template/tests/tui/test_app.py.jinja
template/tests/web/test_app.py.jinja
template/tests/mcp/test_app.py.jinja
template/pyproject.toml.jinja
template/{% if include_web %}Dockerfile{% endif %}.jinja
AGENTS.md
CLAUDE.md
Add optional MCP server feature with matching tests and script entrypoint.
  • Introduce include_mcp copier option and document it in CLAUDE.md, README, and copier.yml.
  • Add mcp/ package with an MCP stdio server exposing version and info tools plus an asyncio-based main entrypoint.
  • Provide tests under tests/mcp/ to validate tool listing, version/info responses, and error handling for unknown tools.
  • Wire MCP into pyproject optional dependency group (mcp), project.scripts entry, and example inputs.
copier.yml
template/src/{{github_repo_name}}/mcp/app.py.jinja
template/src/{{github_repo_name}}/mcp/__init__.py.jinja
template/tests/mcp/test_app.py.jinja
template/tests/mcp/__init__.py.jinja
.example-input.yml
README.md
CLAUDE.md
Support multiple web frameworks (FastAPI or Litestar) with conditional dependencies and tests.
  • Add web_framework copier variable (fastapi/litestar) gated by include_web.
  • Update pyproject keywords, classifiers, and optional-dependencies.web to be conditional on the selected framework.
  • Make web/app.py and web tests use framework-conditional imports, clients, and assertions (FastAPI vs Litestar).
  • Update documentation and example inputs to describe and default the framework choice.
copier.yml
template/pyproject.toml.jinja
template/src/{{github_repo_name}}/web/app.py.jinja
template/tests/web/test_app.py.jinja
CLAUDE.md
.example-input.yml
Integrate PyCrucible and profiling tools as optional features with tox, mise, and documentation support.
  • Introduce include_profiling and include_pycrucible copier options and describe them in docs and README.
  • Add profile.py helper script and a tox profile environment to set up profiling tools (py-spy, scalene, snakeviz).
  • Add pycrucible configuration (tool.pycrucible) with a conditional entrypoint depending on which UI/web option is enabled.
  • Extend mise.toml to use uv-based tasks (test, style, docs, pre-commit, build, package) and add a packaging task that invokes PyCrucible.
  • Update dependency groups (tool, style, pre-commit) to include profiling dependencies, prek, debugpy, basedpyright, updated tool versions, and optional PyCrucible tooling.
  • Document profiling usage and VS Code debugging flows in the template README, AGENTS.md, and CLAUDE.md.
copier.yml
template/pyproject.toml.jinja
template/{% if include_mise %}mise.toml{% endif %}.jinja
template/profile.py.jinja
template/README.md.jinja
AGENTS.md
README.md
CLAUDE.md
.example-input.yml
Enhance CI/CD workflows with coverage upload, unified CD jobs, Docker Hub publishing, and PyCrucible executables.
  • Extend ci.yml to generate coverage reports and upload them via codecov-action.
  • Augment cd.yml to add conditional jobs: build-executables using razorblade23/pycrucible-action (if include_pycrucible) and docker-publish for multi-arch Docker builds and pushes to Docker Hub (if include_web).
  • Make attach-github-release depend on PyPI publish and optionally build-executables, and ensure all artifacts (packages and executables) are collected and attached.
  • Document Docker Hub setup, unified CD workflow graph, and behavior of conditional jobs in README and CLAUDE.md.
template/.github/workflows/ci.yml
template/.github/workflows/cd.yml.jinja
README.md
CLAUDE.md
Adjust template options, tooling, and documentation to reflect new structure and defaults.
  • Rename use_precommit to include_precommit and adjust all references; change include_mise/help text to emphasize task running; keep Pants, Trunk, Codecov toggles but remove Poe-specific config/tasks.
  • Update CLAUDE.md and README to better describe template variables, generated structure, CI/CD, code style, and testing commands aligned with the new package layout.
  • Add git-cliff configuration and ignore file to support changelog automation, and add devcontainer queue-related files for RabbitMQ-based setups.
  • Apply minor YAML/TOML tweaks (e.g., add document start in dependabot.yml, add new style tools and comments).
copier.yml
CLAUDE.md
README.md
AGENTS.md
template/.github/{% if dependency_management == 'dependabot' %}dependabot.yml{% endif %}.jinja
cliff.toml
.cliffignore
template/.devcontainer/docker-compose.queue.yml
template/.devcontainer/queue/Dockerfile
.example-input.yml

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

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

Hey - I've found 1 issue, and left some high level feedback:

  • In template/profile.py.jinja, the imports and entrypoints still reference the old flat module layout (e.g., from {{github_repo_name}}.cli import app, from {{github_repo_name}}.web import main); these should be updated to the new subpackage paths like {{github_repo_name}}.cli.app and {{github_repo_name}}.web.app:main to stay consistent with the restructuring.
  • The new Codecov upload step in template/.github/workflows/ci.yml runs unconditionally; consider gating this step (and coverage combination) behind the include_codecov option to align with the template’s configurability and avoid enabling Codecov behavior when it was explicitly disabled.
  • In the updated mise.toml template, the package task always calls pycrucible even when include_pycrucible is false, which can break users who include mise but not PyCrucible; it would be safer to either guard this task with include_pycrucible or make it a no-op unless PyCrucible is enabled.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- In `template/profile.py.jinja`, the imports and entrypoints still reference the old flat module layout (e.g., `from {{github_repo_name}}.cli import app`, `from {{github_repo_name}}.web import main`); these should be updated to the new subpackage paths like `{{github_repo_name}}.cli.app` and `{{github_repo_name}}.web.app:main` to stay consistent with the restructuring.
- The new Codecov upload step in `template/.github/workflows/ci.yml` runs unconditionally; consider gating this step (and coverage combination) behind the `include_codecov` option to align with the template’s configurability and avoid enabling Codecov behavior when it was explicitly disabled.
- In the updated `mise.toml` template, the `package` task always calls `pycrucible` even when `include_pycrucible` is false, which can break users who include mise but not PyCrucible; it would be safer to either guard this task with `include_pycrucible` or make it a no-op unless PyCrucible is enabled.

## Individual Comments

### Comment 1
<location> `template/.github/workflows/ci.yml:59-65` </location>
<code_context>
       - name: Run the tests
         run: uv run --locked tox run
         # https://github.com/marketplace/actions/alls-green#why used for branch protection checks
+      - name: Coverage
+        run: |
+          uv run coverage combine
+          uv run coverage report --show-missing
+          uv run coverage xml
+      - name: Upload coverage
+        uses: codecov/codecov-action@v5
+
   check:
</code_context>

<issue_to_address>
**issue (bug_risk):** Codecov upload is now hard-wired even though there is an `include_codecov` template option

With this change, coverage reporting and Codecov upload always run, but the template still exposes an `include_codecov` option. Users who set `include_codecov = false` will still hit failing steps unless they configure Codecov and its secrets. To keep Codecov truly optional, consider conditioning the coverage upload (and possibly XML generation) on `include_codecov`, or remove/repurpose that option so behavior and configuration stay consistent.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Copy link

@recurseml recurseml bot left a comment

Choose a reason for hiding this comment

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

Review by RecurseML

🔍 Review performed on 61aedc8..38ceab5

✨ No bugs found, your code is sparkling clean

✅ Files analyzed, no issues (47)

.cliffignore
.example-input.yml
AGENTS.md
CLAUDE.md
README.md
cliff.toml
copier.yml
template/.devcontainer/docker-compose.queue.yml
template/.devcontainer/queue/Dockerfile
template/.github/ISSUE_TEMPLATE/bug_report.md.jinja
template/.github/workflows/cd.yml.jinja
template/.github/workflows/ci.yml
template/.github/{% if dependency_management == 'dependabot' %}dependabot.yml{% endif %}.jinja
template/.vscode/extensions.json
template/.vscode/launch.json.jinja
template/.zed/debug.json.jinja
template/README.md.jinja
template/pyproject.toml.jinja
template/src/{{github_repo_name}}/core.py
template/src/{{github_repo_name}}/core/__init__.py.jinja
template/src/{{github_repo_name}}/core/app.py.jinja
template/src/{{github_repo_name}}/core/logging_setup.py.jinja
template/src/{{github_repo_name}}/utils/__init__.py.jinja
template/src/{{github_repo_name}}/{% if include_cli %}cli{% endif %}/__init__.py.jinja
template/src/{{github_repo_name}}/{% if include_cli %}cli{% endif %}/app.py.jinja
template/src/{{github_repo_name}}/{% if include_gui %}gui{% endif %}/__init__.py.jinja
template/src/{{github_repo_name}}/{% if include_gui %}gui{% endif %}/app.py.jinja
template/src/{{github_repo_name}}/{% if include_mcp %}mcp{% endif %}/__init__.py.jinja
template/src/{{github_repo_name}}/{% if include_mcp %}mcp{% endif %}/app.py.jinja
template/src/{{github_repo_name}}/{% if include_tui %}tui{% endif %}/__init__.py.jinja
template/src/{{github_repo_name}}/{% if include_tui %}tui{% endif %}/app.py.jinja
template/src/{{github_repo_name}}/{% if include_web %}web.py{% endif %}.jinja
template/src/{{github_repo_name}}/{% if include_web %}web{% endif %}/__init__.py.jinja
template/src/{{github_repo_name}}/{% if include_web %}web{% endif %}/app.py.jinja
template/tests/{% if include_cli %}cli{% endif %}/__init__.py.jinja
template/tests/{% if include_cli %}cli{% endif %}/test_app.py.jinja
template/tests/{% if include_gui %}gui{% endif %}/__init__.py.jinja
template/tests/{% if include_gui %}gui{% endif %}/test_app.py.jinja
template/tests/{% if include_mcp %}mcp{% endif %}/__init__.py.jinja
template/tests/{% if include_mcp %}mcp{% endif %}/test_app.py.jinja
template/tests/{% if include_tui %}tui{% endif %}/__init__.py.jinja
template/tests/{% if include_tui %}tui{% endif %}/test_app.py.jinja
template/tests/{% if include_web %}web{% endif %}/__init__.py.jinja
template/tests/{% if include_web %}web{% endif %}/test_app.py.jinja
template/{% if include_mise %}mise.toml{% endif %}.jinja
template/{% if include_profiling %}profile.py{% endif %}.jinja
template/{% if include_web %}Dockerfile{% endif %}.jinja

⏭️ Files skipped (3)
  Locations  
template/src/{{github_repo_name}}/core/config.py.jinja
template/src/{{github_repo_name}}/core/dirs.py.jinja
template/src/{{github_repo_name}}/utils/app.py.jinja

hasansezertasan and others added 11 commits January 26, 2026 20:51
- Fix cd.yml.jinja raw block placement (close tag after github.ref_name)
- Standardize actions/checkout to v6 across all jobs
- Add PackageNotFoundError handling to MCP, CLI, web, GUI, TUI modules
- Add pytest-asyncio to test dependencies for async tests
- Fix profile.py import paths and add subprocess error handling
- Narrow TUI exception catch to not mask KeyboardInterrupt/SystemExit

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix pyproject.toml `all` extra to use actual dependencies instead of
  invalid extra references (cli -> typer, web -> fastapi, etc.)
- Add re-exports to CLI, Web, MCP __init__.py files for cleaner imports
- Enables `from pkg.cli import app` style imports

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add include_mcp and web_framework to README documentation
- Fix import ordering in core/logging_setup.py and core/config.py
- Fix blank lines and trailing newlines in cli/app.py, web/app.py
- Fix line length issues in mcp/app.py
- Fix EM101 (raw string in exception) in gui and tui tests
- Refactor profile.py with noqa directives and improved structure
- Fix import ordering in all test files

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Convert ci.yml to Jinja template with coverage steps conditional on
  include_codecov
- Make build-wheels.yml conditional on include_c_extensions (multi-platform
  wheel building is only needed for C extensions)
- Remove JavaScript from CodeQL language matrix (Python-only template)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Convert devcontainer.json to Jinja template
- Make mise devcontainer feature conditional on include_mise
- Make mise VSCode extension conditional on include_mise in both
  devcontainer.json and extensions.json

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add message queue worker support:
- Add include_worker and worker_broker options (kafka/nats/rabbitmq/redis)
- Create worker module with FastStream app and version endpoint
- Add worker tests with pytest-asyncio
- Add worker entry point and optional dependency

Consolidate devcontainer docker-compose files:
- Merge all services into single docker-compose.yml.jinja
- Add include_dbeaver option for CloudBeaver database management
- Add include_vpn option for OpenVPN client
- Remove separate docker-compose.queue.yml, docker-compose.dbeaver.yml,
  docker-compose.vpn.yml, and queue/Dockerfile

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add asyncio_mode = "auto" to pytest configuration for pytest-asyncio >=0.23
- Enhance worker test to verify response is actually published
- Test now captures and validates published message content

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add include_worker and worker_broker documentation
- Add include_dbeaver and include_vpn devcontainer services
- Add devcontainer structure section for consolidated docker-compose
- Add "Adding New Optional Components" checklist
- Document whitespace control pattern for Jinja templates
- Add testing commands for features with choices

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add GitHub Container Registry login step using GITHUB_TOKEN
- Push Docker images to both docker.io and ghcr.io simultaneously
- Fix test_smoke.py docstrings and noqa comment for local import

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…rkflow

- Add explicit pydantic and uvloop dependencies to worker optional deps
- Use environment variables for broker URLs (devcontainer compatibility)
- Remove invalid FastStream constructor kwargs (title, version, description)
- Rewrite worker test using broker-specific TestBroker and .mock assertions
- Make Docker Hub login conditional on DOCKERHUB_USERNAME secret
- Remove Docker socket mount from CloudBeaver (security risk)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…OF_CONDUCT

Move CHANGELOG.md, CONTRIBUTING.md, and CODE_OF_CONDUCT.md from
conditional filename inclusion to always-included files. CHANGELOG.md
now uses in-file condition to switch between conventional format and
a simple GitHub Releases link. Remove include_contributing and
include_code_of_conduct copier variables.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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