diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 66dd005..167c2b4 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -174,7 +174,7 @@ jobs: - name: Install dependencies run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.6.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.9.8" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - name: Run automated PR review env: REPO_TOKEN: ${{ secrets.REPO_TOKEN }} @@ -187,10 +187,17 @@ jobs: auto-merge: # Auto-merge runs after all CI checks pass. It reads the task ID - # from .taskid file, validates the PR title, and squash-merges. - # No manual label or review needed — CI is the quality gate. - needs: [quality, detect-changes, pr-review] - if: github.event_name == 'pull_request' + # from the branch name (falling back to .taskid file), validates + # the PR title, and squash-merges. + # Uses always() so it evaluates even when molecule-tests is skipped + # (Gitea Actions skips dependent jobs of skipped jobs by default). + needs: [quality, detect-changes, pr-review, molecule-tests] + if: >- + always() && + github.event_name == 'pull_request' && + needs.quality.result == 'success' && + needs.pr-review.result == 'success' && + (needs.molecule-tests.result == 'success' || needs.molecule-tests.result == 'skipped') runs-on: docker timeout-minutes: 10 steps: @@ -201,7 +208,7 @@ jobs: - name: Install dependencies run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.6.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.9.8" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - name: Squash merge with task ID env: REPO_TOKEN: ${{ secrets.REPO_TOKEN }} diff --git a/.gitea/workflows/post-merge.yml b/.gitea/workflows/post-merge.yml index 6a002df..ea35414 100644 --- a/.gitea/workflows/post-merge.yml +++ b/.gitea/workflows/post-merge.yml @@ -43,7 +43,7 @@ jobs: - name: Install dependencies run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.6.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.9.8" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - name: Check if this is a release commit id: check env: @@ -62,7 +62,7 @@ jobs: - name: Install dependencies run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.6.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.9.8" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - name: Validate latest commit message env: PYTHONPATH: src @@ -199,7 +199,7 @@ jobs: - name: Install dependencies run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.6.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.9.8" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - name: Update Vikunja task env: VIKUNJA_TOKEN: ${{ secrets.VIKUNJA_TOKEN }} @@ -231,12 +231,13 @@ jobs: - name: Install dependencies run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.6.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.9.8" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - name: Ensure branch protection and labels env: REPO_TOKEN: ${{ secrets.REPO_TOKEN }} PYTHONPATH: src DEVX_REPO_NAME: grm + DEVX_REPO_OWNER: oblachno-oss DEVX_STATUS_CHECKS: "CI / quality (pull_request),CI / molecule-tests (1) (pull_request),CI / molecule-tests (2) (pull_request),CI / molecule-tests (3) (pull_request)" run: python3 -m devx.tools.configure_repo - name: Notify on failure diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index c98a40e..9e14956 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -16,7 +16,7 @@ jobs: - name: Install CI tools run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.6.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.9.8" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" python3 -m devx.tools.install_tools --tool git-cliff --tool tea - name: Install build tools run: python3 -m pip install --break-system-packages build twine diff --git a/.taskid b/.taskid index 2b996c8..8cf1b76 100644 --- a/.taskid +++ b/.taskid @@ -1 +1 @@ -GRM-74 +GRM-76 diff --git a/AGENTS.md b/AGENTS.md index 3a63a52..25d89d9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -127,9 +127,9 @@ must go through **every category** in `REVIEW_CHECKLIST.md` and verify the **[manual]** items by reviewing the full diff (`git diff master...HEAD`). -Post review comments using `devx.ci.review_pr` (run as `python -m devx.ci.review_pr`): +Post review comments using `devx.ci.pr_review` (run as `python -m devx.ci.pr_review`): ```bash -REPO_TOKEN= python -m devx.ci.review_pr \ +REPO_TOKEN= python -m devx.ci.pr_review \ --event REQUEST_CHANGES \ --body "Review summary" \ --comments-json comments.json @@ -142,7 +142,7 @@ Fix each comment one by one, commit, and push. Re-review until satisfied. Once all checklist items are verified and comments are addressed, post an approval review with `--checklist-confirmed` and `--checklist-categories`: ```bash -REPO_TOKEN= python -m devx.ci.review_pr \ +REPO_TOKEN= python -m devx.ci.pr_review \ --event APPROVE --checklist-confirmed \ --checklist-categories 1,2,3,4,5,6,7,8,9,10,11,12,13 \ --body "All 13 REVIEW_CHECKLIST.md categories verified. Architecture: . Security: . Tests: . Docs: ." @@ -263,7 +263,7 @@ via `[tool.devx.classify]` in `pyproject.toml`. - Any new file type not in the allowlist **devx module structure** (installed from git, not in this repo): -- `devx.ci.*` — CI/CD automation (run by workflows): release, publish, auto_merge, classify_changes, detect_release_commit, push_badges, doc_coverage, sync_wiki, distribute_molecule, molecule_ci_guard, discover_runners, notify_failure, post_merge, pr_review, review_pr, validate_commit_msg +- `devx.ci.*` — CI/CD automation (run by workflows): release, publish, auto_merge, classify_changes, detect_release_commit, push_badges, doc_coverage, sync_wiki, distribute_molecule, molecule_ci_guard, discover_runners, notify_failure, post_merge, pr_review, validate_commit_msg - `devx.tools.*` — Dev tools (run locally): check_test_speed, configure_repo, install_checkmake, install_tools, setup, generate_badges - `devx.molecule.*` — Molecule helpers: molecule_all, platforms, discover_runners, distribute_molecule, molecule_ci_guard - `devx.gitea_cli` — Tea CLI wrapper @@ -319,7 +319,7 @@ The `tea` Gitea CLI tool is used for Gitea API interactions in devx. It is insta - `devx.tools.configure_repo` — Creates labels via `tea labels create` (falls back to `GiteaClient` if tea fails; branch protection still uses `GiteaClient` since tea only supports basic protect/unprotect) **Operations still using `GiteaClient` (not supported by tea):** -- PR reviews (`devx.ci.review_pr`) — tea v0.14.1 only supports interactive reviews +- PR reviews (`devx.ci.pr_review`) — tea v0.14.1 only supports interactive reviews - Wiki page management (`devx.ci.sync_wiki`) - Commit status checks (`devx.ci.auto_merge`) - Runner discovery (`devx.molecule.discover_runners`) @@ -332,7 +332,7 @@ Since devx is installed as a package (via `pip install` from git), it is importa | PYTHONPATH | When to use | Example modules | |------------|-------------|-----------------| -| `src` | Module imports from `gitea_runner_manager` | `devx.ci.auto_merge`, `devx.ci.pr_review`, `devx.ci.review_pr`, `devx.ci.sync_wiki`, `devx.ci.post_merge`, `devx.ci.classify_changes`, `devx.molecule.discover_runners`, `devx.ci.doc_coverage` | +| `src` | Module imports from `gitea_runner_manager` | `devx.ci.auto_merge`, `devx.ci.pr_review`, `devx.ci.pr_review`, `devx.ci.sync_wiki`, `devx.ci.post_merge`, `devx.ci.classify_changes`, `devx.molecule.discover_runners`, `devx.ci.doc_coverage` | | (none) | Module has no GRM imports | `devx.ci.detect_release_commit`, `devx.molecule.distribute_molecule`, `devx.molecule.molecule_ci_guard`, `devx.ci.push_badges`, `devx.ci.validate_commit_msg` | **In workflows**, always use `env:` blocks (not inline `PYTHONPATH=value`): diff --git a/Makefile b/Makefile index d5879fb..d30468b 100644 --- a/Makefile +++ b/Makefile @@ -130,7 +130,11 @@ ansible-lint: PATH="$(PWD)/$(BIN):$$PATH" $(BIN)/ansible-lint ansible/ makefile-lint: - @$(CHECKMAKE) Makefile + @if command -v $(CHECKMAKE) >/dev/null 2>&1 || [ -x "$(CHECKMAKE)" ]; then \ + $(CHECKMAKE) Makefile; \ + else \ + echo "checkmake not found, skipping Makefile lint"; \ + fi lint-all: lint ansible-lint makefile-lint workflow-lint diff --git a/docs/tech/ci-cd-workflow.md b/docs/tech/ci-cd-workflow.md index a15ae8d..3b17efc 100644 --- a/docs/tech/ci-cd-workflow.md +++ b/docs/tech/ci-cd-workflow.md @@ -60,10 +60,10 @@ Review the full diff (`git diff master...HEAD`) focusing on: - **User experience**: Clear error messages, intuitive CLI flags, helpful output - **Documentation**: Completeness and relevance of docs, CHANGELOG entries, AGENTS.md updates -Post review comments using `devx.ci.review_pr`: +Post review comments using `devx.ci.pr_review`: ```bash -REPO_TOKEN= python -m devx.ci.review_pr \ +REPO_TOKEN= python -m devx.ci.pr_review \ --event REQUEST_CHANGES \ --body "Review summary" \ --comments-json comments.json @@ -78,7 +78,7 @@ Fix each comment one by one, commit, and push. Re-review until satisfied. Once all comments are addressed: ```bash -REPO_TOKEN= python -m devx.ci.review_pr \ +REPO_TOKEN= python -m devx.ci.pr_review \ --event APPROVE \ --body "All comments addressed. LGTM." ``` diff --git a/docs/tech/contributing.md b/docs/tech/contributing.md index c60982c..2397c1e 100644 --- a/docs/tech/contributing.md +++ b/docs/tech/contributing.md @@ -55,9 +55,9 @@ Every change to master goes through this workflow. No exceptions. 3. **Implement** — write code, tests (100% coverage), update docs 4. **Commit** — conventional commits (no `GRM-N:` prefix on branch) 5. **Push & create PR** — title: `GRM-N: `, body: summary + `Closes GRM-N` -6. **Review** — review the full diff focusing on: functional completeness, edge cases, technical excellence (architecture, SRP, deduplication, code smells, best practices, code quality, reusability, clean code, readability, maintainability, extensibility), performance, security, UX, documentation completeness/relevance. Post review comments via `devx.ci.review_pr`. +6. **Review** — review the full diff focusing on: functional completeness, edge cases, technical excellence (architecture, SRP, deduplication, code smells, best practices, code quality, reusability, clean code, readability, maintainability, extensibility), performance, security, UX, documentation completeness/relevance. Post review comments via `devx.ci.pr_review`. 7. **Address comments** — fix each comment, commit, push, re-review -8. **Approve** — post an `APPROVE` review via `devx.ci.review_pr` +8. **Approve** — post an `APPROVE` review via `devx.ci.pr_review` 9. **Add `ready-to-merge` label** — auto-merge workflow squash-merges with title `GRM-N `, post-merge workflow marks the Vikunja task as done, release workflow automatically versions and tags ### Branch Protection (Required Gitea Settings)