From fd04007595e7dcbd1001f535325739d4b53cad1f Mon Sep 17 00:00:00 2001 From: Eric Villard Date: Thu, 26 Mar 2026 12:18:53 +0100 Subject: [PATCH 1/2] =?UTF-8?q?feat(ci):=20=E2=9C=A8=20add=20GitHub=20Acti?= =?UTF-8?q?ons=20workflow=20with=20lint=20and=20test=20jobs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add .github/workflows/ci.yml: lint (shellcheck + ruff) and test (pytest on Python 3.11 and 3.12) jobs, triggered on push and PR - Add ruff>=0.4.0 to dev dependencies - Fix unused imports in tests/test_agent.py (ruff F401) - Update uv.lock - Add CI badge to README.md Signed-off-by: Eric Villard --- .github/workflows/ci.yml | 50 ++++++++++++++++++++++++++++++++++++++++ README.md | 2 ++ pyproject.toml | 1 + tests/test_agent.py | 2 +- uv.lock | 29 ++++++++++++++++++++++- 5 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..eb3b4a6 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,50 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install shellcheck + run: sudo apt-get install -y shellcheck + + - name: Run shellcheck + run: shellcheck scripts/*.sh tests/run-tests.sh + + - uses: astral-sh/setup-uv@v5 + with: + python-version: "3.12" + + - name: Install dependencies + run: uv pip install -e ".[dev]" --system + + - name: Run ruff + run: ruff check src/ tests/ + + test: + name: Test (Python ${{ matrix.python-version }}) + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + python-version: ["3.11", "3.12"] + steps: + - uses: actions/checkout@v4 + + - uses: astral-sh/setup-uv@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: uv pip install -e ".[dev]" --system + + - name: Run tests + run: python -m pytest -v diff --git a/README.md b/README.md index 3f14d6a..71dd4c0 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # ai-rules +[![CI](https://github.com/eviweb/ai-rules/actions/workflows/ci.yml/badge.svg)](https://github.com/eviweb/ai-rules/actions/workflows/ci.yml) + Shared rules and conventions for AI coding assistants. Provides a structured set of rules covering language, naming, git workflow, diff --git a/pyproject.toml b/pyproject.toml index 15aec93..8ac6b73 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,6 +18,7 @@ ai-rules = "ai_rules.cli:app" dev = [ "pytest>=8.0.0,<9.0.0", "pytest-cov>=5.0.0,<6.0.0", + "ruff>=0.4.0,<1.0.0", ] [tool.hatch.version] diff --git a/tests/test_agent.py b/tests/test_agent.py index 4cc644f..eeba440 100644 --- a/tests/test_agent.py +++ b/tests/test_agent.py @@ -2,7 +2,7 @@ import pytest -from ai_rules.agent import Agent, Link, load_agents +from ai_rules.agent import load_agents SAMPLE_TOML = """ diff --git a/uv.lock b/uv.lock index b3b1f9d..94b2234 100644 --- a/uv.lock +++ b/uv.lock @@ -13,13 +13,15 @@ dependencies = [ dev = [ { name = "pytest" }, { name = "pytest-cov" }, + { name = "ruff" }, ] [package.metadata] requires-dist = [ { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0,<9.0.0" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=5.0.0,<6.0.0" }, - { name = "typer", extras = ["all"], specifier = ">=0.12.0,<1.0.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.4.0,<1.0.0" }, + { name = "typer", specifier = ">=0.12.0,<1.0.0" }, ] provides-extras = ["dev"] @@ -256,6 +258,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" }, ] +[[package]] +name = "ruff" +version = "0.15.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/22/9e4f66ee588588dc6c9af6a994e12d26e19efbe874d1a909d09a6dac7a59/ruff-0.15.7.tar.gz", hash = "sha256:04f1ae61fc20fe0b148617c324d9d009b5f63412c0b16474f3d5f1a1a665f7ac", size = 4601277, upload-time = "2026-03-19T16:26:22.605Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/2f/0b08ced94412af091807b6119ca03755d651d3d93a242682bf020189db94/ruff-0.15.7-py3-none-linux_armv6l.whl", hash = "sha256:a81cc5b6910fb7dfc7c32d20652e50fa05963f6e13ead3c5915c41ac5d16668e", size = 10489037, upload-time = "2026-03-19T16:26:32.47Z" }, + { url = "https://files.pythonhosted.org/packages/91/4a/82e0fa632e5c8b1eba5ee86ecd929e8ff327bbdbfb3c6ac5d81631bef605/ruff-0.15.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:722d165bd52403f3bdabc0ce9e41fc47070ac56d7a91b4e0d097b516a53a3477", size = 10955433, upload-time = "2026-03-19T16:27:00.205Z" }, + { url = "https://files.pythonhosted.org/packages/ab/10/12586735d0ff42526ad78c049bf51d7428618c8b5c467e72508c694119df/ruff-0.15.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7fbc2448094262552146cbe1b9643a92f66559d3761f1ad0656d4991491af49e", size = 10269302, upload-time = "2026-03-19T16:26:26.183Z" }, + { url = "https://files.pythonhosted.org/packages/eb/5d/32b5c44ccf149a26623671df49cbfbd0a0ae511ff3df9d9d2426966a8d57/ruff-0.15.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b39329b60eba44156d138275323cc726bbfbddcec3063da57caa8a8b1d50adf", size = 10607625, upload-time = "2026-03-19T16:27:03.263Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f1/f0001cabe86173aaacb6eb9bb734aa0605f9a6aa6fa7d43cb49cbc4af9c9/ruff-0.15.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87768c151808505f2bfc93ae44e5f9e7c8518943e5074f76ac21558ef5627c85", size = 10324743, upload-time = "2026-03-19T16:27:09.791Z" }, + { url = "https://files.pythonhosted.org/packages/7a/87/b8a8f3d56b8d848008559e7c9d8bf367934d5367f6d932ba779456e2f73b/ruff-0.15.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb0511670002c6c529ec66c0e30641c976c8963de26a113f3a30456b702468b0", size = 11138536, upload-time = "2026-03-19T16:27:06.101Z" }, + { url = "https://files.pythonhosted.org/packages/e4/f2/4fd0d05aab0c5934b2e1464784f85ba2eab9d54bffc53fb5430d1ed8b829/ruff-0.15.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0d19644f801849229db8345180a71bee5407b429dd217f853ec515e968a6912", size = 11994292, upload-time = "2026-03-19T16:26:48.718Z" }, + { url = "https://files.pythonhosted.org/packages/64/22/fc4483871e767e5e95d1622ad83dad5ebb830f762ed0420fde7dfa9d9b08/ruff-0.15.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4806d8e09ef5e84eb19ba833d0442f7e300b23fe3f0981cae159a248a10f0036", size = 11398981, upload-time = "2026-03-19T16:26:54.513Z" }, + { url = "https://files.pythonhosted.org/packages/b0/99/66f0343176d5eab02c3f7fcd2de7a8e0dd7a41f0d982bee56cd1c24db62b/ruff-0.15.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dce0896488562f09a27b9c91b1f58a097457143931f3c4d519690dea54e624c5", size = 11242422, upload-time = "2026-03-19T16:26:29.277Z" }, + { url = "https://files.pythonhosted.org/packages/5d/3a/a7060f145bfdcce4c987ea27788b30c60e2c81d6e9a65157ca8afe646328/ruff-0.15.7-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1852ce241d2bc89e5dc823e03cff4ce73d816b5c6cdadd27dbfe7b03217d2a12", size = 11232158, upload-time = "2026-03-19T16:26:42.321Z" }, + { url = "https://files.pythonhosted.org/packages/a7/53/90fbb9e08b29c048c403558d3cdd0adf2668b02ce9d50602452e187cd4af/ruff-0.15.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5f3e4b221fb4bd293f79912fc5e93a9063ebd6d0dcbd528f91b89172a9b8436c", size = 10577861, upload-time = "2026-03-19T16:26:57.459Z" }, + { url = "https://files.pythonhosted.org/packages/2f/aa/5f486226538fe4d0f0439e2da1716e1acf895e2a232b26f2459c55f8ddad/ruff-0.15.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b15e48602c9c1d9bdc504b472e90b90c97dc7d46c7028011ae67f3861ceba7b4", size = 10327310, upload-time = "2026-03-19T16:26:35.909Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/271afdffb81fe7bfc8c43ba079e9d96238f674380099457a74ccb3863857/ruff-0.15.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1b4705e0e85cedc74b0a23cf6a179dbb3df184cb227761979cc76c0440b5ab0d", size = 10840752, upload-time = "2026-03-19T16:26:45.723Z" }, + { url = "https://files.pythonhosted.org/packages/bf/29/a4ae78394f76c7759953c47884eb44de271b03a66634148d9f7d11e721bd/ruff-0.15.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:112c1fa316a558bb34319282c1200a8bf0495f1b735aeb78bfcb2991e6087580", size = 11336961, upload-time = "2026-03-19T16:26:39.076Z" }, + { url = "https://files.pythonhosted.org/packages/26/6b/8786ba5736562220d588a2f6653e6c17e90c59ced34a2d7b512ef8956103/ruff-0.15.7-py3-none-win32.whl", hash = "sha256:6d39e2d3505b082323352f733599f28169d12e891f7dd407f2d4f54b4c2886de", size = 10582538, upload-time = "2026-03-19T16:26:15.992Z" }, + { url = "https://files.pythonhosted.org/packages/2b/e9/346d4d3fffc6871125e877dae8d9a1966b254fbd92a50f8561078b88b099/ruff-0.15.7-py3-none-win_amd64.whl", hash = "sha256:4d53d712ddebcd7dace1bc395367aec12c057aacfe9adbb6d832302575f4d3a1", size = 11755839, upload-time = "2026-03-19T16:26:19.897Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e8/726643a3ea68c727da31570bde48c7a10f1aa60eddd628d94078fec586ff/ruff-0.15.7-py3-none-win_arm64.whl", hash = "sha256:18e8d73f1c3fdf27931497972250340f92e8c861722161a9caeb89a58ead6ed2", size = 11023304, upload-time = "2026-03-19T16:26:51.669Z" }, +] + [[package]] name = "shellingham" version = "1.5.4" From 9ab836f008c90b36a7d48391a7fcbb595b1c054b Mon Sep 17 00:00:00 2001 From: Eric Villard Date: Thu, 26 Mar 2026 12:32:49 +0100 Subject: [PATCH 2/2] =?UTF-8?q?fix(ci):=20=F0=9F=90=9B=20replace=20uv=20pi?= =?UTF-8?q?p=20--system=20with=20uv=20sync=20+=20uv=20run?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PEP 668 blocks system-wide pip installs on Debian/Ubuntu runners. Use uv sync to create a managed venv and uv run to execute commands within it — the idiomatic uv approach for CI environments. Signed-off-by: Eric Villard --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eb3b4a6..8c97366 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,10 +24,10 @@ jobs: python-version: "3.12" - name: Install dependencies - run: uv pip install -e ".[dev]" --system + run: uv sync --extra dev - name: Run ruff - run: ruff check src/ tests/ + run: uv run ruff check src/ tests/ test: name: Test (Python ${{ matrix.python-version }}) @@ -44,7 +44,7 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install dependencies - run: uv pip install -e ".[dev]" --system + run: uv sync --extra dev - name: Run tests - run: python -m pytest -v + run: uv run pytest -v