rhiza 0.8.6__tar.gz → 0.8.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. rhiza-0.8.8/.github/Makefile.gh +34 -0
  2. rhiza-0.8.8/.github/agents/analyser.md +46 -0
  3. rhiza-0.8.8/.github/agents/summarise.md +19 -0
  4. rhiza-0.8.8/.github/copilot-instructions.md +48 -0
  5. {rhiza-0.8.6 → rhiza-0.8.8}/.github/workflows/rhiza_book.yml +1 -4
  6. {rhiza-0.8.6 → rhiza-0.8.8}/.github/workflows/rhiza_ci.yml +5 -13
  7. {rhiza-0.8.6 → rhiza-0.8.8}/.github/workflows/rhiza_deptry.yml +1 -1
  8. {rhiza-0.8.6 → rhiza-0.8.8}/.github/workflows/rhiza_marimo.yml +1 -1
  9. {rhiza-0.8.6 → rhiza-0.8.8}/.github/workflows/rhiza_pre-commit.yml +4 -2
  10. {rhiza-0.8.6 → rhiza-0.8.8}/.github/workflows/rhiza_release.yml +2 -2
  11. {rhiza-0.8.6 → rhiza-0.8.8}/.github/workflows/rhiza_validate.yml +1 -1
  12. {rhiza-0.8.6 → rhiza-0.8.8}/.gitignore +1 -0
  13. {rhiza-0.8.6 → rhiza-0.8.8}/.pre-commit-config.yaml +1 -1
  14. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/.cfg.toml +6 -1
  15. rhiza-0.8.8/.rhiza/.env +14 -0
  16. rhiza-0.8.8/.rhiza/Makefile.rhiza +38 -0
  17. rhiza-0.8.8/.rhiza/agentic/Makefile.agentic +45 -0
  18. rhiza-0.8.8/.rhiza/customisations/Makefile.customisations +29 -0
  19. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/history +13 -5
  20. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/requirements/tests.txt +5 -0
  21. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/template.yml +4 -1
  22. {rhiza-0.8.6 → rhiza-0.8.8}/Makefile +44 -77
  23. {rhiza-0.8.6 → rhiza-0.8.8}/PKG-INFO +1 -1
  24. {rhiza-0.8.6 → rhiza-0.8.8}/book/README.md +1 -1
  25. {rhiza-0.8.6 → rhiza-0.8.8}/pyproject.toml +1 -1
  26. {rhiza-0.8.6 → rhiza-0.8.8}/renovate.json +7 -0
  27. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/commands/materialize.py +21 -0
  28. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/models.py +25 -2
  29. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_commands/test_materialize.py +239 -0
  30. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_commands/test_migrate.py +45 -0
  31. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_models.py +61 -0
  32. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/conftest.py +0 -2
  33. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/test_git_repo_fixture.py +1 -2
  34. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/test_makefile.py +97 -9
  35. rhiza-0.8.8/tests/test_rhiza/test_makefile_gh.py +116 -0
  36. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/test_notebooks.py +4 -4
  37. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/test_readme.py +54 -0
  38. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/test_requirements_folder.py +0 -15
  39. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/test_structure.py +0 -2
  40. {rhiza-0.8.6 → rhiza-0.8.8}/uv.lock +4 -4
  41. rhiza-0.8.6/.rhiza/scripts/bump.sh +0 -243
  42. rhiza-0.8.6/.rhiza/scripts/install-dev-deps.sh +0 -25
  43. rhiza-0.8.6/tests/test_rhiza/test_bump_script.py +0 -170
  44. {rhiza-0.8.6 → rhiza-0.8.8}/.editorconfig +0 -0
  45. {rhiza-0.8.6 → rhiza-0.8.8}/.github/ISSUE_TEMPLATE/assign_ui_implementation.md +0 -0
  46. {rhiza-0.8.6 → rhiza-0.8.8}/.github/workflows/rhiza_codeql.yml +0 -0
  47. {rhiza-0.8.6 → rhiza-0.8.8}/.github/workflows/rhiza_sync.yml +0 -0
  48. {rhiza-0.8.6 → rhiza-0.8.8}/.python-version +0 -0
  49. {rhiza-0.8.6/.rhiza/scripts/customisations → rhiza-0.8.8/.rhiza/customisations/scripts}/build-extras.sh +0 -0
  50. {rhiza-0.8.6/.rhiza/scripts/customisations → rhiza-0.8.8/.rhiza/customisations/scripts}/post-release.sh +0 -0
  51. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/docs/CONFIG.md +0 -0
  52. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/docs/TOKEN_SETUP.md +0 -0
  53. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/requirements/README.md +0 -0
  54. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/requirements/docs.txt +0 -0
  55. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/requirements/marimo.txt +0 -0
  56. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/requirements/tools.txt +0 -0
  57. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/scripts/book.sh +0 -0
  58. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/scripts/generate-coverage-badge.sh +0 -0
  59. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/scripts/marimushka.sh +0 -0
  60. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/scripts/release.sh +0 -0
  61. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/scripts/update-readme-help.sh +0 -0
  62. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza/utils/version_matrix.py +0 -0
  63. {rhiza-0.8.6 → rhiza-0.8.8}/.rhiza.env +0 -0
  64. {rhiza-0.8.6 → rhiza-0.8.8}/CLI.md +0 -0
  65. {rhiza-0.8.6 → rhiza-0.8.8}/CODE_OF_CONDUCT.md +0 -0
  66. {rhiza-0.8.6 → rhiza-0.8.8}/CONTRIBUTING.md +0 -0
  67. {rhiza-0.8.6 → rhiza-0.8.8}/GETTING_STARTED.md +0 -0
  68. {rhiza-0.8.6 → rhiza-0.8.8}/LICENSE +0 -0
  69. {rhiza-0.8.6 → rhiza-0.8.8}/README.md +0 -0
  70. {rhiza-0.8.6 → rhiza-0.8.8}/USAGE.md +0 -0
  71. {rhiza-0.8.6 → rhiza-0.8.8}/book/Makefile.book +0 -0
  72. {rhiza-0.8.6 → rhiza-0.8.8}/book/marimo/.gitkeep +0 -0
  73. {rhiza-0.8.6 → rhiza-0.8.8}/book/marimo/README.md +0 -0
  74. {rhiza-0.8.6 → rhiza-0.8.8}/book/marimo/rhiza.py +0 -0
  75. {rhiza-0.8.6 → rhiza-0.8.8}/book/minibook-templates/custom.html.jinja2 +0 -0
  76. {rhiza-0.8.6 → rhiza-0.8.8}/book/pdoc-templates/module.html.jinja2 +0 -0
  77. {rhiza-0.8.6 → rhiza-0.8.8}/presentation/Makefile.presentation +0 -0
  78. {rhiza-0.8.6 → rhiza-0.8.8}/presentation/README.md +0 -0
  79. {rhiza-0.8.6 → rhiza-0.8.8}/pytest.ini +0 -0
  80. {rhiza-0.8.6 → rhiza-0.8.8}/ruff.toml +0 -0
  81. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/__init__.py +0 -0
  82. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/__main__.py +0 -0
  83. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/_templates/basic/__init__.py.jinja2 +0 -0
  84. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/_templates/basic/main.py.jinja2 +0 -0
  85. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/_templates/basic/pyproject.toml.jinja2 +0 -0
  86. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/cli.py +0 -0
  87. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/commands/__init__.py +0 -0
  88. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/commands/init.py +0 -0
  89. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/commands/migrate.py +0 -0
  90. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/commands/uninstall.py +0 -0
  91. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/commands/validate.py +0 -0
  92. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/commands/welcome.py +0 -0
  93. {rhiza-0.8.6 → rhiza-0.8.8}/src/rhiza/subprocess_utils.py +0 -0
  94. {rhiza-0.8.6 → rhiza-0.8.8}/tests/Makefile.tests +0 -0
  95. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_cli_commands.py +0 -0
  96. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_commands/test_init.py +0 -0
  97. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_commands/test_uninstall.py +0 -0
  98. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_commands/test_validate.py +0 -0
  99. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_package.py +0 -0
  100. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/README.md +0 -0
  101. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/benchmarks/.gitignore +0 -0
  102. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/benchmarks/README.md +0 -0
  103. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/benchmarks/analyze_benchmarks.py +0 -0
  104. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/test_coverage_badge.py +0 -0
  105. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/test_docstrings.py +0 -0
  106. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/test_marimushka_script.py +0 -0
  107. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/test_release_script.py +0 -0
  108. {rhiza-0.8.6 → rhiza-0.8.8}/tests/test_rhiza/test_updatereadme_script.py +0 -0
@@ -0,0 +1,34 @@
1
+ ## Makefile.gh - github repo maintenance and helpers
2
+ # This file is included by the main Makefile
3
+
4
+ # Declare phony targets
5
+ .PHONY: gh-install view-prs view-issues failed-workflows whoami print-logo
6
+
7
+ ##@ GitHub Helpers
8
+ gh-install: ## check for gh cli existence and install extensions
9
+ @if ! command -v gh >/dev/null 2>&1; then \
10
+ printf "${YELLOW}[WARN] gh cli not found.${RESET}\n"; \
11
+ printf "${BLUE}[INFO] Please install it from: https://github.com/cli/cli?tab=readme-ov-file#installation${RESET}\n"; \
12
+ else \
13
+ printf "${GREEN}[INFO] gh cli is installed.${RESET}\n"; \
14
+ fi
15
+
16
+ view-prs: gh-install ## list open pull requests
17
+ @printf "${BLUE}[INFO] Open Pull Requests:${RESET}\n"
18
+ @gh pr list --json number,title,author,headRefName,updatedAt --template \
19
+ '{{tablerow (printf "NUM" | color "bold") (printf "TITLE" | color "bold") (printf "AUTHOR" | color "bold") (printf "BRANCH" | color "bold") (printf "UPDATED" | color "bold")}}{{range .}}{{tablerow (printf "#%v" .number | color "green") .title (.author.login | color "cyan") (.headRefName | color "yellow") (timeago .updatedAt | color "white")}}{{end}}'
20
+
21
+ view-issues: gh-install ## list open issues
22
+ @printf "${BLUE}[INFO] Open Issues:${RESET}\n"
23
+ @gh issue list --json number,title,author,labels,updatedAt --template \
24
+ '{{tablerow (printf "NUM" | color "bold") (printf "TITLE" | color "bold") (printf "AUTHOR" | color "bold") (printf "LABELS" | color "bold") (printf "UPDATED" | color "bold")}}{{range .}}{{tablerow (printf "#%v" .number | color "green") .title (.author.login | color "cyan") (pluck "name" .labels | join ", " | color "yellow") (timeago .updatedAt | color "white")}}{{end}}'
25
+
26
+ failed-workflows: gh-install ## list recent failing workflow runs
27
+ @printf "${BLUE}[INFO] Recent Failing Workflow Runs:${RESET}\n"
28
+ @gh run list --limit 10 --status failure --json conclusion,name,headBranch,event,createdAt --template \
29
+ '{{tablerow (printf "STATUS" | color "bold") (printf "NAME" | color "bold") (printf "BRANCH" | color "bold") (printf "EVENT" | color "bold") (printf "TIME" | color "bold")}}{{range .}}{{tablerow (printf "%s" .conclusion | color "red") .name (.headBranch | color "cyan") (.event | color "yellow") (timeago .createdAt | color "white")}}{{end}}'
30
+
31
+ whoami: gh-install ## check github auth status
32
+ @printf "${BLUE}[INFO] GitHub Authentication Status:${RESET}\n"
33
+ @gh auth status --hostname github.com --json hosts --template \
34
+ '{{range $$host, $$accounts := .hosts}}{{range $$accounts}}{{if .active}} {{printf "✓" | color "green"}} Logged in to {{$$host}} account {{.login | color "bold"}} ({{.tokenSource}}){{"\n"}} Active account: {{printf "true" | color "green"}}{{"\n"}} Git operations protocol: {{.gitProtocol | color "yellow"}}{{"\n"}} Token scopes: {{.scopes | color "yellow"}}{{"\n"}}{{end}}{{end}}{{end}}'
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: analyser
3
+ description: Ongoing technical journal for repository analysis
4
+ ---
5
+
6
+ You are a senior software architect performing a critical, journal-style review of this repository.
7
+
8
+ Your task:
9
+ - Analyze the repository as it exists at the time of execution.
10
+ - Identify concrete strengths, weaknesses, risks, and notable design decisions.
11
+ - Prefer specific file and module references over general statements.
12
+ - Be concise, factual, and critical. Avoid marketing language.
13
+
14
+ Journal mode:
15
+ - Treat this as an ongoing analysis.
16
+ - DO NOT rewrite or summarize existing content.
17
+ - APPEND a new dated entry to the end of the file.
18
+ - Each run should add new observations or refine previous ones if warranted.
19
+
20
+ Output:
21
+ - Write exclusively to `REPOSITORY_ANALYSIS.md`.
22
+ - Append a new section with the following structure:
23
+
24
+ ## YYYY-MM-DD — Analysis Entry
25
+
26
+ ### Summary
27
+ Short high-level assessment of the repository in its current state.
28
+
29
+ ### Strengths
30
+ Bullet points with concrete evidence.
31
+
32
+ ### Weaknesses
33
+ Bullet points with concrete evidence.
34
+
35
+ ### Risks / Technical Debt
36
+ Items that could affect maintainability, correctness, or scalability.
37
+
38
+ ### Score
39
+ Give an overall score between **1 and 10**, where:
40
+ - 9–10: exemplary, production-grade, well-maintained
41
+ - 7–8: solid, minor issues
42
+ - 5–6: mixed quality, notable concerns
43
+ - 3–4: fragile or poorly structured
44
+ - 1–2: critically deficient
45
+
46
+ Be honest. If information is missing or unclear, state that explicitly.
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: summarise
3
+ description: Agent for summarizing changes since the last release/tag
4
+ ---
5
+
6
+ You are a software development assistant tasked with summarizing repository changes since the most recent release or tag.
7
+
8
+ Your task:
9
+ - Identify the most recent git tag or release in the repository.
10
+ - Retrieve all commits made since that tag/release.
11
+ - Provide a concise summary of the changes, including key features, bug fixes, and any notable modifications.
12
+ - Focus on factual, technical details from the commit messages and changes.
13
+
14
+ Output:
15
+ - Display the summary directly in the terminal or output.
16
+ - Structure the summary with sections like: Recent Tag/Release, Commits Summary, Key Changes.
17
+ - Be concise and avoid unnecessary details.
18
+
19
+ Use the 'shell' tool to execute git commands as needed (e.g., git describe --tags, git log --oneline since the tag).
@@ -0,0 +1,48 @@
1
+ # Rhiza Copilot Instructions
2
+
3
+ You are working in a project that utilizes the `rhiza` framework. Rhiza is a collection of reusable
4
+ configuration templates and tooling designed to standardize and streamline modern Python development.
5
+
6
+ As a Rhiza-based project, this workspace adheres to specific conventions for structure, dependency management, and automation.
7
+
8
+ ## Development Environment
9
+
10
+ The project uses `make` and `uv` for development tasks.
11
+
12
+ - **Install Dependencies**: `make install` (installs `uv`, creates `.venv`, installs dependencies)
13
+ - **Run Tests**: `make test` (runs `pytest` with coverage)
14
+ - **Format Code**: `make fmt` (runs `ruff format` and `ruff check --fix`)
15
+ - **Check Dependencies**: `make deptry` (runs `deptry` to check for missing/unused dependencies)
16
+ - **Marimo Notebooks**: `make marimo` (starts the Marimo server)
17
+ - **Build Documentation**: `make book` (builds the documentation book)
18
+
19
+ ## Project Structure
20
+
21
+ - `src/`: Source code
22
+ - `tests/`: Tests (pytest)
23
+ - `assets/`: Static assets
24
+ - `book/`: Documentation source
25
+ - `docker/`: Docker configuration
26
+ - `presentation/`: Presentation slides
27
+ - `.rhiza/`: Rhiza-specific scripts and configurations
28
+
29
+ ## Coding Standards
30
+
31
+ - **Style**: Follow PEP 8. Use `make fmt` to enforce style.
32
+ - **Testing**: Write tests in `tests/` using `pytest`. Ensure high coverage.
33
+ - **Documentation**: Document code using docstrings.
34
+ - **Dependencies**: Manage dependencies in `pyproject.toml`. Use `uv add` to add dependencies.
35
+
36
+ ## Workflow
37
+
38
+ 1. **Setup**: Run `make install` to set up the environment.
39
+ 2. **Develop**: Write code in `src/` and tests in `tests/`.
40
+ 3. **Test**: Run `make test` to verify changes.
41
+ 4. **Format**: Run `make fmt` before committing.
42
+ 5. **Verify**: Run `make deptry` to check dependencies.
43
+
44
+ ## Key Files
45
+
46
+ - `Makefile`: Main entry point for tasks.
47
+ - `pyproject.toml`: Project configuration and dependencies.
48
+ - `.devcontainer/bootstrap.sh`: Bootstrap script for dev containers.
@@ -43,7 +43,7 @@ jobs:
43
43
  - name: Install uv
44
44
  uses: astral-sh/setup-uv@v7
45
45
  with:
46
- version: "0.9.21"
46
+ version: "0.9.24"
47
47
 
48
48
  - name: "Sync the virtual environment for ${{ github.repository }}"
49
49
  shell: bash
@@ -52,9 +52,6 @@ jobs:
52
52
  # will just use .python-version?
53
53
  uv sync --all-extras --all-groups --frozen
54
54
 
55
- - name: Install dev dependencies
56
- run: bash .rhiza/scripts/install-dev-deps.sh
57
-
58
55
  - name: "Make the book"
59
56
  run: |
60
57
  make book
@@ -29,7 +29,7 @@ jobs:
29
29
  - name: Install uv
30
30
  uses: astral-sh/setup-uv@v7
31
31
  with:
32
- version: "0.9.21"
32
+ version: "0.9.24"
33
33
 
34
34
  - id: versions
35
35
  run: |
@@ -58,17 +58,9 @@ jobs:
58
58
  - name: Install uv
59
59
  uses: astral-sh/setup-uv@v7
60
60
  with:
61
- version: "0.9.21"
62
-
63
- - name: "Sync the virtual environment for ${{ github.repository }}"
64
- shell: bash
65
- run: |
66
- export UV_EXTRA_INDEX_URL="${{ secrets.uv-extra-index-url }}"
67
- uv venv --python ${{ matrix.python-version }}
68
- uv sync --all-extras --all-groups --frozen
69
-
70
- - name: Install dev dependencies
71
- run: bash .rhiza/scripts/install-dev-deps.sh
61
+ version: "0.9.24"
62
+ python-version: ${{ matrix.python-version }}
72
63
 
73
64
  - name: Run tests
74
- run: uv run pytest tests
65
+ run: |
66
+ make test
@@ -27,7 +27,7 @@ jobs:
27
27
  name: Check dependencies with deptry
28
28
  runs-on: ubuntu-latest
29
29
  container:
30
- image: ghcr.io/astral-sh/uv:0.9.21-python3.12-trixie
30
+ image: ghcr.io/astral-sh/uv:0.9.24-python3.12-trixie
31
31
 
32
32
  steps:
33
33
  - uses: actions/checkout@v6
@@ -80,7 +80,7 @@ jobs:
80
80
  - name: Install uv
81
81
  uses: astral-sh/setup-uv@v7
82
82
  with:
83
- version: "0.9.21"
83
+ version: "0.9.24"
84
84
 
85
85
  # Execute the notebook with the appropriate runner based on its content
86
86
  - name: Run notebook
@@ -31,5 +31,7 @@ jobs:
31
31
  steps:
32
32
  - uses: actions/checkout@v6
33
33
 
34
- - uses: pre-commit/action@v3.0.1
35
-
34
+ # Run pre-commit
35
+ - name: Run pre-commit
36
+ run: |
37
+ make fmt
@@ -111,7 +111,7 @@ jobs:
111
111
  - name: Install uv
112
112
  uses: astral-sh/setup-uv@v7
113
113
  with:
114
- version: "0.9.21"
114
+ version: "0.9.24"
115
115
 
116
116
  - name: "Sync the virtual environment for ${{ github.repository }}"
117
117
  shell: bash
@@ -322,7 +322,7 @@ jobs:
322
322
  - name: Install uv
323
323
  uses: astral-sh/setup-uv@v7
324
324
  with:
325
- version: "0.9.21"
325
+ version: "0.9.24"
326
326
 
327
327
  - name: "Sync the virtual environment for ${{ github.repository }}"
328
328
  shell: bash
@@ -15,7 +15,7 @@ jobs:
15
15
  # don't run this in rhiza itself. Rhiza has no template.yml file.
16
16
  if: ${{ github.repository != 'jebel-quant/rhiza' }}
17
17
  container:
18
- image: ghcr.io/astral-sh/uv:0.9.21-python3.12-trixie
18
+ image: ghcr.io/astral-sh/uv:0.9.24-python3.12-trixie
19
19
 
20
20
  steps:
21
21
  - name: Checkout repository
@@ -5,6 +5,7 @@
5
5
 
6
6
  ### Don't expose API keys, etc.
7
7
  .env
8
+ !.rhiza/.env
8
9
 
9
10
  __marimo__
10
11
 
@@ -9,7 +9,7 @@ repos:
9
9
  - id: check-yaml
10
10
 
11
11
  - repo: https://github.com/astral-sh/ruff-pre-commit
12
- rev: 'v0.14.10'
12
+ rev: 'v0.14.11'
13
13
  hooks:
14
14
  - id: ruff
15
15
  args: [ --fix, --exit-non-zero-on-fix, --unsafe-fixes ]
@@ -11,7 +11,7 @@ sign_tags = false
11
11
  tag_name = "v{new_version}"
12
12
  tag_message = "Bump version: {current_version} → {new_version}"
13
13
  allow_dirty = false
14
- commit = false
14
+ commit = true
15
15
  message = "Chore: bump version {current_version} → {new_version}"
16
16
  commit_args = ""
17
17
 
@@ -28,4 +28,9 @@ values = [
28
28
  [[tool.bumpversion.files]]
29
29
  filename = "pyproject.toml"
30
30
  search = 'version = "{current_version}"'
31
+ replace = 'version = "{new_version}"'
32
+
33
+ [[tool.bumpversion.files]]
34
+ filename = "uv.lock"
35
+ search = 'version = "{current_version}"'
31
36
  replace = 'version = "{new_version}"'
@@ -0,0 +1,14 @@
1
+ MARIMO_FOLDER=book/marimo
2
+ SOURCE_FOLDER=src
3
+ SCRIPTS_FOLDER=.rhiza/scripts
4
+ CUSTOM_SCRIPTS_FOLDER=.rhiza/customisations/scripts
5
+
6
+ # Book-specific variables
7
+ BOOK_TITLE=Project Documentation
8
+ BOOK_SUBTITLE=Generated by minibook
9
+ PDOC_TEMPLATE_DIR=book/pdoc-templates
10
+ BOOK_TEMPLATE=book/minibook-templates/custom.html.jinja2
11
+ DOCFORMAT=google
12
+
13
+ # Agentic-specific variables
14
+ DEFAULT_AI_MODEL=gpt-4.1
@@ -0,0 +1,38 @@
1
+ ## Makefile.rhiza - rhiza actions
2
+ # This file is included by the main Makefile
3
+
4
+ # RHIZA_LOGO definition
5
+ define RHIZA_LOGO
6
+ ____ _ _
7
+ | _ \| |__ (_)______ _
8
+ | |_) | '_ \| |_ / _\`|
9
+ | _ <| | | | |/ / (_| |
10
+ |_| \_\_| |_|_/___\__,_|
11
+
12
+ endef
13
+ export RHIZA_LOGO
14
+
15
+ # Declare phony targets
16
+ .PHONY: print-logo sync validate
17
+
18
+ ##@ Rhiza Workflows
19
+
20
+ print-logo:
21
+ @printf "${BLUE}$$RHIZA_LOGO${RESET}\n"
22
+
23
+
24
+ sync: ## sync with template repository as defined in .rhiza/template.yml
25
+ @if git remote get-url origin 2>/dev/null | grep -iqE 'jebel-quant/rhiza(\.git)?$$'; then \
26
+ printf "${BLUE}[INFO] Skipping sync in rhiza repository (no template.yml by design)${RESET}\n"; \
27
+ else \
28
+ $(MAKE) install-uv; \
29
+ ${UVX_BIN} "rhiza>=0.7.1" materialize --force .; \
30
+ fi
31
+
32
+ validate: ## validate project structure against template repository as defined in .rhiza/template.yml
33
+ @if git remote get-url origin 2>/dev/null | grep -iqE 'jebel-quant/rhiza(\.git)?$$'; then \
34
+ printf "${BLUE}[INFO] Skipping validate in rhiza repository (no template.yml by design)${RESET}\n"; \
35
+ else \
36
+ $(MAKE) install-uv; \
37
+ ${UVX_BIN} "rhiza>=0.7.1" validate .; \
38
+ fi
@@ -0,0 +1,45 @@
1
+ ## Makefile.customisations - User-defined scripts and overrides
2
+ # This file is included by the main Makefile
3
+
4
+ # Declare phony targets
5
+ .PHONY: install-copilot analyse-repo summarize-changes
6
+
7
+ COPILOT_BIN ?= $(shell command -v copilot 2>/dev/null || echo "$(INSTALL_DIR)/copilot")
8
+ ##@ Agentic Workflows
9
+
10
+ copilot: install-copilot ## open interactive prompt for copilot
11
+ @"$(COPILOT_BIN)" --model "$(DEFAULT_AI_MODEL)"
12
+
13
+ analyse-repo: install-copilot ## run the analyser agent to update REPOSITORY_ANALYSIS.md
14
+ @"$(COPILOT_BIN)" --agent analyser \
15
+ --model "$(DEFAULT_AI_MODEL)" \
16
+ --prompt "Analyze the repository and update the journal." \
17
+ --allow-tool 'write' --deny-tool 'remove' \
18
+ --allow-all-paths
19
+
20
+ summarize-changes: install-copilot ## summarize changes since the most recent release/tag
21
+ @"$(COPILOT_BIN)" -p "Show me the commits since the last release/tag and summarize them" --allow-tool 'shell(git)' --model "$(DEFAULT_AI_MODEL)" --agent summarise
22
+
23
+ install-copilot: ## checks for copilot and prompts to install
24
+ @if command -v copilot >/dev/null 2>&1; then \
25
+ printf "${GREEN}[INFO] copilot already installed in PATH, skipping install.${RESET}\n"; \
26
+ elif [ -x "${INSTALL_DIR}/copilot" ]; then \
27
+ printf "${SUCCESS}[INFO] copilot already installed in ${INSTALL_DIR}, skipping install.${RESET}\n"; \
28
+ else \
29
+ printf "${YELLOW}[WARN] GitHub Copilot CLI not found in ${INSTALL_DIR}.${RESET}\n"; \
30
+ printf "${BLUE}Do you want to install GitHub Copilot CLI? [y/N] ${RESET}"; \
31
+ read -r response; \
32
+ if [ "$$response" = "y" ] || [ "$$response" = "Y" ]; then \
33
+ printf "${BLUE}[INFO] Installing GitHub Copilot CLI to ${INSTALL_DIR}...${RESET}\n"; \
34
+ mkdir -p "${INSTALL_DIR}"; \
35
+ if curl -fsSL https://gh.io/copilot-install | PREFIX="." bash; then \
36
+ printf "${GREEN}[INFO] GitHub Copilot CLI installed successfully.${RESET}\n"; \
37
+ else \
38
+ printf "${RED}[ERROR] Failed to install GitHub Copilot CLI.${RESET}\n"; \
39
+ exit 1; \
40
+ fi; \
41
+ else \
42
+ printf "${BLUE}[INFO] Skipping installation.${RESET}\n"; \
43
+ fi; \
44
+ fi
45
+
@@ -0,0 +1,29 @@
1
+ ## Makefile.customisations - User-defined scripts and overrides
2
+ # This file is included by the main Makefile
3
+
4
+ # Declare phony targets
5
+ .PHONY: install-extras post-release
6
+
7
+ ##@ Customisations
8
+
9
+ install-extras:: ## run custom build script (if exists)
10
+ @if [ -x "${CUSTOM_SCRIPTS_FOLDER}/build-extras.sh" ]; then \
11
+ printf "${BLUE}[INFO] Running custom build script from customisations folder...${RESET}\n"; \
12
+ "${CUSTOM_SCRIPTS_FOLDER}"/build-extras.sh; \
13
+ elif [ -f "${CUSTOM_SCRIPTS_FOLDER}/build-extras.sh" ]; then \
14
+ printf "${BLUE}[INFO] Running custom build script from customisations folder...${RESET}\n"; \
15
+ /bin/sh "${CUSTOM_SCRIPTS_FOLDER}/build-extras.sh"; \
16
+ else \
17
+ printf "${BLUE}[INFO] No custom build script in ${CUSTOM_SCRIPTS_FOLDER}, skipping...${RESET}\n"; \
18
+ fi
19
+
20
+ post-release:: ## perform post-release tasks
21
+ @if [ -x "${CUSTOM_SCRIPTS_FOLDER}/post-release.sh" ]; then \
22
+ printf "${BLUE}[INFO] Running post-release script from customisations folder...${RESET}\n"; \
23
+ "${CUSTOM_SCRIPTS_FOLDER}"/post-release.sh; \
24
+ elif [ -f "${CUSTOM_SCRIPTS_FOLDER}/post-release.sh" ]; then \
25
+ printf "${BLUE}[INFO] Running post-release script from customisations folder...${RESET}\n"; \
26
+ /bin/sh "${CUSTOM_SCRIPTS_FOLDER}/post-release.sh"; \
27
+ else \
28
+ printf "${BLUE}[INFO] No post-release script in ${CUSTOM_SCRIPTS_FOLDER}, skipping...${RESET}\n"; \
29
+ fi
@@ -5,6 +5,10 @@
5
5
  #
6
6
  # Files under template control:
7
7
  .editorconfig
8
+ .github/Makefile.gh
9
+ .github/agents/analyser.md
10
+ .github/agents/summarise.md
11
+ .github/copilot-instructions.md
8
12
  .github/workflows/rhiza_book.yml
9
13
  .github/workflows/rhiza_ci.yml
10
14
  .github/workflows/rhiza_codeql.yml
@@ -16,6 +20,14 @@
16
20
  .github/workflows/rhiza_validate.yml
17
21
  .gitignore
18
22
  .pre-commit-config.yaml
23
+ .python-version
24
+ .rhiza/.cfg.toml
25
+ .rhiza/.env
26
+ .rhiza/Makefile.rhiza
27
+ .rhiza/agentic/Makefile.agentic
28
+ .rhiza/customisations/Makefile.customisations
29
+ .rhiza/customisations/scripts/build-extras.sh
30
+ .rhiza/customisations/scripts/post-release.sh
19
31
  .rhiza/docs/CONFIG.md
20
32
  .rhiza/docs/TOKEN_SETUP.md
21
33
  .rhiza/requirements/README.md
@@ -24,11 +36,7 @@
24
36
  .rhiza/requirements/tests.txt
25
37
  .rhiza/requirements/tools.txt
26
38
  .rhiza/scripts/book.sh
27
- .rhiza/scripts/bump.sh
28
- .rhiza/scripts/customisations/build-extras.sh
29
- .rhiza/scripts/customisations/post-release.sh
30
39
  .rhiza/scripts/generate-coverage-badge.sh
31
- .rhiza/scripts/install-dev-deps.sh
32
40
  .rhiza/scripts/marimushka.sh
33
41
  .rhiza/scripts/release.sh
34
42
  .rhiza/scripts/update-readme-help.sh
@@ -53,11 +61,11 @@ tests/test_rhiza/benchmarks/.gitignore
53
61
  tests/test_rhiza/benchmarks/README.md
54
62
  tests/test_rhiza/benchmarks/analyze_benchmarks.py
55
63
  tests/test_rhiza/conftest.py
56
- tests/test_rhiza/test_bump_script.py
57
64
  tests/test_rhiza/test_coverage_badge.py
58
65
  tests/test_rhiza/test_docstrings.py
59
66
  tests/test_rhiza/test_git_repo_fixture.py
60
67
  tests/test_rhiza/test_makefile.py
68
+ tests/test_rhiza/test_makefile_gh.py
61
69
  tests/test_rhiza/test_marimushka_script.py
62
70
  tests/test_rhiza/test_notebooks.py
63
71
  tests/test_rhiza/test_readme.py
@@ -2,3 +2,8 @@
2
2
  pytest==9.0.2
3
3
  pytest-cov>=7.0.0
4
4
  pytest-html>=4.1.1
5
+ pytest-mock>=3.15.1
6
+
7
+ # For benchmarks
8
+ pytest-benchmark>=5.2.3
9
+ pygal>=3.1.0
@@ -1,7 +1,7 @@
1
1
  template-repository: "jebel-quant/rhiza"
2
2
  template-branch: "main"
3
3
  include:
4
- - .github/workflows
4
+ - .github
5
5
  - .rhiza
6
6
  - tests
7
7
  - .editorconfig
@@ -15,6 +15,9 @@ include:
15
15
  - presentation
16
16
  - book
17
17
  - renovate.json
18
+ - .python-version
18
19
  exclude:
19
20
  - .github/workflows/rhiza_docker.yml
20
21
  - .github/workflows/rhiza_devcontainer.yml
22
+ - .github/ISSUE_TEMPLATE
23
+ - .github/dependabot.yml