Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
version: 2
updates:
- package-ecosystem: uv
directory: /
schedule:
interval: cron
cronjob: 15 5 * * *
timezone: Europe/Warsaw
open-pull-requests-limit: 1
versioning-strategy: increase-if-necessary
allow:
- dependency-name: costs
dependency-type: all
- dependency-name: goal
dependency-type: all
- dependency-name: pfix
dependency-type: all
- dependency-name: clickmd
dependency-type: all
- dependency-name: code2llm
dependency-type: all
groups:
internal-packages:
patterns:
- costs
- goal
- pfix
- clickmd
- code2llm
commit-message:
prefix: "chore(deps)"
35 changes: 35 additions & 0 deletions .github/internal-dependencies.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"schema": "goal.internal-dependencies/v1",
"packages": [
{
"name": "costs",
"repository": "semcod/costs",
"registry": "pypi",
"versioning": "semver"
},
{
"name": "goal",
"repository": "semcod/goal",
"registry": "pypi",
"versioning": "semver"
},
{
"name": "pfix",
"repository": "semcod/pfix",
"registry": "pypi",
"versioning": "semver"
},
{
"name": "clickmd",
"repository": "semcod/clickmd",
"registry": "pypi",
"versioning": "semver"
},
{
"name": "code2llm",
"repository": "semcod/code2llm",
"registry": "pypi",
"versioning": "semver"
}
]
}
45 changes: 32 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,48 @@ on:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:

permissions:
contents: read

jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
python-version: ["3.11", "3.12", "3.13"]
use-op3: [0, 1]
steps:
- uses: actions/checkout@v4

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
- uses: actions/checkout@v7
with:
fetch-depth: 0
- uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python-version }}

- name: Install uv
uses: astral-sh/setup-uv@v5

- name: Install dependencies
run: uv sync --frozen

- name: Run tests (REDEPLOY_USE_OP3=${{ matrix.use-op3 }})
- name: Check out immutable documentation standard
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: wellmanifest/docs
ref: ebe7501063ef4f3e63ded610c2d3183010ca636e # v0.1.1
path: .docs-standard
token: ${{ secrets.ORG_SYNC_PAT }}
persist-credentials: false
- name: Validate documentation placement
shell: bash
env:
DOCS_BASE: ${{ github.event.pull_request.base.sha }}
run: |
set -euo pipefail
args=(--root . --standard-revision ebe7501063ef4f3e63ded610c2d3183010ca636e)
if [[ -n "$DOCS_BASE" ]]; then args+=(--base "$DOCS_BASE"); fi
python .docs-standard/docs/standard/check.py "${args[@]}"
- run: python -m pip install uv
- name: Install locked test dependencies
run: uv sync --locked --extra dev --extra op3 --python "${{ matrix.python-version }}"
- name: Test supported Python versions
env:
REDEPLOY_USE_OP3: ${{ matrix.use-op3 }}
run: uv run pytest tests/ tests/contract/ tests/integration/ -v --tb=short
run: uv run --no-sync python -m pytest tests redeploy/tests -q
36 changes: 36 additions & 0 deletions .github/workflows/internal-dependency-freshness.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Internal dependency freshness

on:
schedule:
- cron: "24 6 * * *"
workflow_dispatch:
pull_request:
paths:
- pyproject.toml
- uv.lock
- .github/internal-dependencies.json
- .github/workflows/internal-dependency-freshness.yml

permissions:
contents: read

jobs:
freshness:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
with:
python-version: "3.12"
- name: Install released checker
run: python -m pip install "goal==2.2.0"
- name: Verify published stable targets
run: goal dependencies --catalog .github/internal-dependencies.json --check > dependency-freshness.json
- name: Retain freshness evidence
if: always()
uses: actions/upload-artifact@v4
with:
name: dependency-freshness
path: dependency-freshness.json
if-no-files-found: ignore
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,6 @@ apply-results.yaml

# Environment variables
.env

# Linked development checkouts
/worktrees/
7 changes: 7 additions & 0 deletions .governance/docs.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"schema": "wellmanifest.docs/adoption/v1",
"repository": "semcod/redeploy",
"standard": "wellmanifest/docs",
"source_revision": "ebe7501063ef4f3e63ded610c2d3183010ca636e",
"policy_sha256": "f6ba9c011ea1d9260e7fac3a1638a767d5ebc9f7d9b32ed51cc3aea22fe95d8c"
}
3 changes: 2 additions & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1232,4 +1232,5 @@ pytest
| `README.md` | Project overview (this file) | — |
| `examples` | Usage examples and code samples | [View](./examples) |

<!-- code2docs:end -->
<!-- code2docs:end -->
- [Aktualizacja i kontrola zależności wewnętrznych](information/internal-dependencies.md)
83 changes: 83 additions & 0 deletions docs/information/internal-dependencies.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
---
{
"schema": "wellmanifest.docs/document/v1",
"id": "internal-dependencies",
"kind": "information",
"version": 1,
"title": "Aktualizacja i kontrola zależności wewnętrznych",
"status": "implemented",
"owner": "semcod/redeploy",
"created": "2026-09-06",
"updated": "2026-09-06",
"review_after": "2026-09-13",
"source_revision": "91671e551248177894de1fdc57dfef453e00d85d",
"affected_repositories": [
"semcod/redeploy"
],
"evidence": [
"https://github.com/semcod/redeploy/blob/91671e551248177894de1fdc57dfef453e00d85d/pyproject.toml",
"https://pypi.org/project/goal/2.2.0/",
"https://docs.astral.sh/uv/concepts/projects/dependencies/",
"https://docs.github.com/en/code-security/reference/supply-chain-security/dependabot-options-reference"
]
}
---

# Aktualizacja i kontrola zależności wewnętrznych

<!-- docs:section purpose -->
## Cel

Utrzymywać aktualne, przetestowane zależności projektu `semcod/redeploy` przy zachowaniu Pythona 3.11 jako minimalnej wersji aplikacji.

<!-- docs:section scope -->
## Zakres

Właścicielem lockfile i CI jest `semcod/redeploy`. Katalog [.github/internal-dependencies.json](../../.github/internal-dependencies.json) obejmuje pięć jawnie wskazanych dystrybucji PyPI: costs, goal, pfix, clickmd i code2llm. Audyt sprawdza te z nich, które występują w uv.lock. Nie obejmuje dowolnego pakietu tylko na podstawie nazwy organizacji.

<!-- docs:section evidence -->
## Dowody

Przed zmianą workflow CI używał uv sync --frozen bez dodatku dev, a późniejsze uv run mogło ponownie rozwiązać zależności. Teraz CI instaluje uv sync --locked --extra dev --extra op3 i uruchamia testy przez uv run --no-sync. Zachowano macierz Python 3.11/3.12/3.13 i oba ustawienia REDEPLOY_USE_OP3. W odczycie PyPI z 2026-09-06 aktualnymi stabilnymi wersjami były costs 0.2.0, goal 2.2.0, pfix 0.1.79 i clickmd 1.1.15; te wersje zapisano w uv.lock.

Testy obejmują tests/ i redeploy/tests/, w tym regresje wykonawcy. Lokalna macierz dała 1568 passed, 17 skipped w każdym z sześciu wariantów; pominięcia obejmują integracje wymagające zewnętrznych usług. Wyniki publikacji i kolejnych kontroli są dostępne w [GitHub Actions](https://github.com/semcod/redeploy/actions).

Przywrócono pełną implementację redeploy/apply/handlers.py z [ostatniej wersji przed wyzerowaniem](https://github.com/semcod/redeploy/blob/d9c7dd873cd2cedb6bb082bf2757661f4f3f3da9/redeploy/apply/handlers.py). [Commit wydania 0.2.80](https://github.com/semcod/redeploy/commit/257a616) usunął jej treść, blokując import aplikacji. Testy CLI korzystają teraz z izolowanego katalogu i jawnych plików wejściowych; testy schematu nie wymagają prywatnego checkoutu c2004.

<!-- docs:section content -->
## Obsługa

Goal jest narzędziem automatyzacji, bez importów w kodzie aplikacji. Usunięto go z runtime i dodatku dev. Grupa `automation` wymaga Pythona >=3.12 i nie jest domyślnie instalowana z aplikacją ani dodatkiem `dev`. Zastosowano [oddzielny zakres Pythona grupy uv](https://docs.astral.sh/uv/concepts/projects/dependencies/#group-requires-python).

```bash
uv sync --locked --extra dev --extra op3 --python 3.11
uv run --no-sync python -m pytest tests redeploy/tests -q
```

Dependabot codziennie proponuje aktualizację wewnętrznych pakietów w jednym PR. Testy uruchamiają zatwierdzony lockfile na Pythonie 3.11, 3.12 i 3.13. Osobny workflow codziennie oraz po zmianie zależności w PR porównuje lockfile z najwyższymi stabilnymi wydaniami w katalogu; zachowuje raport jako artefakt. Obie automatyzacje można uruchomić ręcznie.

Ręczny audyt używa grupy narzędziowej:

```bash
uv run --locked --group automation --python 3.12 goal dependencies --catalog .github/internal-dependencies.json --check
```

Aktualizacja wybranych pakietów:

```bash
uv lock --upgrade-package costs --upgrade-package goal --upgrade-package pfix --upgrade-package clickmd --upgrade-package code2llm
```

Po aktualizacji uruchom testy, opublikuj PR, a po jego sprawdzeniu i scaleniu zsynchronizuj środowisko. CI kontroluje też położenie i metadane dokumentacji według wellmanifest/docs 0.1.1, przypiętego do `ebe7501063ef4f3e63ded610c2d3183010ca636e` w `.governance/docs.json`.

<!-- docs:section limitations -->
## Ograniczenia

Ograniczenie `>=` dopuszcza nowszą wersję, lecz nie zmienia istniejącego środowiska. `uv sync --locked` odtwarza wersje z lockfile. Codzienny PR nie jest automatycznie scalany ani wdrażany. Opóźnienie zależy od harmonogramu, testów i procesu publikacji.

Checker w CI jest przypięty do Goal 2.2.0. Jego aktualizację trzeba wykonać jawnie. Audyt tej wersji porównuje stabilne wersje x.y.z i nie jest pełnym resolverem wszystkich formatów wersji ani kontrolą pochodzenia każdego pakietu. Dokładne przypięcie standardu dokumentacji podlega osobnej, sprawdzanej aktualizacji.

<!-- docs:section next_actions -->
## Utrzymanie

Sprawdzaj nieudane harmonogramy i zaległe PR-y. Nową dystrybucję dodaj do katalogu dopiero po potwierdzeniu jej właściciela i sposobu wersjonowania. Wyniki przekrojowe rozwijaj w [kanonicznym raporcie subactor/docs](https://github.com/subactor/docs/blob/main/architecture/analysis/internal-dependencies.md). Zwiększ wersję tego dokumentu po zmianie mechanizmu.
16 changes: 10 additions & 6 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,8 @@ dependencies = [
"httpx>=0.25",
"rich>=13.0",
"jmespath>=1.0",
"goal>=2.1.0",
"costs>=0.1.20",
"pfix>=0.1.60",
"costs>=0.2.0",
"pfix>=0.1.79",
]
license = "Apache-2.0"

Expand All @@ -30,9 +29,8 @@ redeploy-mcp = "redeploy.mcp_server:serve"

[project.optional-dependencies]
dev = ["pytest>=8.0", "ruff>=0.4",
"goal>=2.1.0",
"costs>=0.1.20",
"pfix>=0.1.60",
"costs>=0.2.0",
"pfix>=0.1.79",
]
op3 = ["op3>=0.1.8"]
mcp = ["mcp>=1.0"]
Expand Down Expand Up @@ -82,3 +80,9 @@ max_commits = 500

# Cost thresholds for badge colors (USD)
badge_color_thresholds = { low = 1.0, medium = 5.0, high = 10.0, critical = 50.0 }

[dependency-groups]
automation = ["goal>=2.2.0"]

[tool.uv.dependency-groups.automation]
requires-python = ">=3.12"
Loading
Loading