tablassert 7.0.0__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.
- tablassert-7.0.0/.github/workflows/docs.yml +24 -0
- tablassert-7.0.0/.github/workflows/pipy.yml +19 -0
- tablassert-7.0.0/.gitignore +25 -0
- tablassert-7.0.0/.planning/PROJECT.md +47 -0
- tablassert-7.0.0/.planning/REQUIREMENTS.md +73 -0
- tablassert-7.0.0/.planning/ROADMAP.md +66 -0
- tablassert-7.0.0/.planning/STATE.md +79 -0
- tablassert-7.0.0/.planning/config.json +15 -0
- tablassert-7.0.0/.planning/quick/1-please-add-a-github-action-that-runs-uv-/1-PLAN.md +90 -0
- tablassert-7.0.0/.planning/quick/1-please-add-a-github-action-that-runs-uv-/1-SUMMARY.md +80 -0
- tablassert-7.0.0/.planning/research/ARCHITECTURE.md +220 -0
- tablassert-7.0.0/.planning/research/FEATURES.md +134 -0
- tablassert-7.0.0/.planning/research/PITFALLS.md +219 -0
- tablassert-7.0.0/.planning/research/STACK.md +140 -0
- tablassert-7.0.0/.planning/research/SUMMARY.md +146 -0
- tablassert-7.0.0/.pre-commit-config.yaml +15 -0
- tablassert-7.0.0/.python-version +1 -0
- tablassert-7.0.0/.vscode/settings.json +23 -0
- tablassert-7.0.0/CHANGELOG.md +74 -0
- tablassert-7.0.0/LICENSE +201 -0
- tablassert-7.0.0/PKG-INFO +141 -0
- tablassert-7.0.0/README.md +113 -0
- tablassert-7.0.0/docs/api/fullmap.md +184 -0
- tablassert-7.0.0/docs/api/qc.md +226 -0
- tablassert-7.0.0/docs/api/utils.md +196 -0
- tablassert-7.0.0/docs/cli.md +114 -0
- tablassert-7.0.0/docs/configuration/advanced-example.md +257 -0
- tablassert-7.0.0/docs/configuration/graph.md +168 -0
- tablassert-7.0.0/docs/configuration/table.md +517 -0
- tablassert-7.0.0/docs/examples/tutorial-data.csv +5 -0
- tablassert-7.0.0/docs/examples/tutorial-graph.yaml +9 -0
- tablassert-7.0.0/docs/examples/tutorial-table.yaml +40 -0
- tablassert-7.0.0/docs/index.md +65 -0
- tablassert-7.0.0/docs/installation.md +158 -0
- tablassert-7.0.0/docs/tutorial.md +192 -0
- tablassert-7.0.0/mkdocs.yml +16 -0
- tablassert-7.0.0/pyproject.toml +57 -0
- tablassert-7.0.0/src/tablassert/__init__.py +0 -0
- tablassert-7.0.0/src/tablassert/downloader.py +35 -0
- tablassert-7.0.0/src/tablassert/enums.py +521 -0
- tablassert-7.0.0/src/tablassert/fullmap.py +167 -0
- tablassert-7.0.0/src/tablassert/ingests.py +43 -0
- tablassert-7.0.0/src/tablassert/lib.py +602 -0
- tablassert-7.0.0/src/tablassert/log.py +15 -0
- tablassert-7.0.0/src/tablassert/models.py +131 -0
- tablassert-7.0.0/src/tablassert/qc.py +124 -0
- tablassert-7.0.0/src/tablassert/utils.py +43 -0
- tablassert-7.0.0/uv.lock +2005 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: Deploy MkDocs
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches:
|
|
5
|
+
- main
|
|
6
|
+
permissions:
|
|
7
|
+
contents: write
|
|
8
|
+
jobs:
|
|
9
|
+
deploy-docs:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- name: Checkout repository
|
|
13
|
+
uses: actions/checkout@v4
|
|
14
|
+
- name: Install uv
|
|
15
|
+
uses: astral-sh/setup-uv@v4
|
|
16
|
+
- name: Build documentation
|
|
17
|
+
run: uv run --group dev mkdocs build
|
|
18
|
+
- name: Deploy to GitHub Pages
|
|
19
|
+
uses: peaceiris/actions-gh-pages@v3
|
|
20
|
+
with:
|
|
21
|
+
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
22
|
+
publish_dir: ./site
|
|
23
|
+
user_name: "github-actions[bot]"
|
|
24
|
+
user_email: "github-actions[bot]@users.noreply.github.com"
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
name: Deploy to PyPI
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
paths: [pyproject.toml]
|
|
6
|
+
jobs:
|
|
7
|
+
publish:
|
|
8
|
+
runs-on: ubuntu-latest
|
|
9
|
+
permissions:
|
|
10
|
+
id-token: write
|
|
11
|
+
steps:
|
|
12
|
+
- name: Checkout repository
|
|
13
|
+
uses: actions/checkout@v4
|
|
14
|
+
- name: Install uv
|
|
15
|
+
uses: astral-sh/setup-uv@v4
|
|
16
|
+
- name: Build package
|
|
17
|
+
run: uv build
|
|
18
|
+
- name: Publish to PyPI
|
|
19
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
*.egg-info
|
|
2
|
+
*__pycache__/
|
|
3
|
+
*.logs/
|
|
4
|
+
*.opencode/
|
|
5
|
+
*.ruff_cache/
|
|
6
|
+
*.pytest_cache/
|
|
7
|
+
*plans/
|
|
8
|
+
*CLAUDE.md
|
|
9
|
+
*.claude/
|
|
10
|
+
*.cachassert/
|
|
11
|
+
*.storassert/
|
|
12
|
+
*.logassert/
|
|
13
|
+
*DATALAKE/
|
|
14
|
+
*.onnxassert/
|
|
15
|
+
*.envrc
|
|
16
|
+
*venv/
|
|
17
|
+
*.log
|
|
18
|
+
*.duckdb
|
|
19
|
+
*.ndjson
|
|
20
|
+
*.wal
|
|
21
|
+
*.sh
|
|
22
|
+
*.pyc
|
|
23
|
+
*.tar.gz
|
|
24
|
+
*.whl
|
|
25
|
+
*dist/
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Tablassert Release Automation
|
|
2
|
+
|
|
3
|
+
## What This Is
|
|
4
|
+
|
|
5
|
+
This project defines and automates the release workflow for the Tablassert Python CLI so releases are built consistently with UV and published to PyPI through GitHub Actions. It is for maintainers who currently validate the codebase manually and want a repeatable CI/CD path that matches the repository's real behavior.
|
|
6
|
+
|
|
7
|
+
## Core Value
|
|
8
|
+
|
|
9
|
+
A tagged release can be built and published to PyPI reliably from GitHub without manual packaging steps.
|
|
10
|
+
|
|
11
|
+
## Requirements
|
|
12
|
+
|
|
13
|
+
### Validated
|
|
14
|
+
|
|
15
|
+
(None yet — ship to validate)
|
|
16
|
+
|
|
17
|
+
### Active
|
|
18
|
+
|
|
19
|
+
- [ ] GitHub Actions workflow builds Tablassert distribution artifacts with UV on release.
|
|
20
|
+
- [ ] GitHub Actions workflow publishes validated artifacts to PyPI.
|
|
21
|
+
- [ ] Release pipeline uses secure authentication and avoids hardcoded credentials.
|
|
22
|
+
|
|
23
|
+
### Out of Scope
|
|
24
|
+
|
|
25
|
+
- Docker image publishing — currently paused and intentionally excluded.
|
|
26
|
+
- Additional product features unrelated to release automation — this initialization only covers packaging and publishing flow.
|
|
27
|
+
|
|
28
|
+
## Context
|
|
29
|
+
|
|
30
|
+
The codebase already exists and is manually tested; current repository behavior is treated as source of truth for documentation and release decisions. Recent updates migrated project workflows from Nix to UV, and CLI command usage is now `tablassert`.
|
|
31
|
+
|
|
32
|
+
## Constraints
|
|
33
|
+
|
|
34
|
+
- **Tooling**: UV-based Python workflow — release build must run via UV tooling to stay consistent with repository standards.
|
|
35
|
+
- **Registry**: PyPI publication target — release outputs must be installable from PyPI.
|
|
36
|
+
- **Security**: CI secrets or trusted publishing only — publishing must not expose credentials in workflow files.
|
|
37
|
+
|
|
38
|
+
## Key Decisions
|
|
39
|
+
|
|
40
|
+
| Decision | Rationale | Outcome |
|
|
41
|
+
|----------|-----------|---------|
|
|
42
|
+
| Use GitHub Actions for release automation | Repository already uses GitHub Actions and this keeps release flow in existing CI/CD surface | — Pending |
|
|
43
|
+
| Use UV for build steps | UV is now the project's package and environment tool | — Pending |
|
|
44
|
+
| Publish to PyPI from CI | Removes manual release drift and supports reproducible distribution | — Pending |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
*Last updated: 2026-03-17 after initialization*
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Requirements: Tablassert Release Automation
|
|
2
|
+
|
|
3
|
+
**Defined:** 2026-03-17
|
|
4
|
+
**Core Value:** A tagged release can be built and published to PyPI reliably from GitHub without manual packaging steps.
|
|
5
|
+
|
|
6
|
+
## v1 Requirements
|
|
7
|
+
|
|
8
|
+
Requirements for initial release automation. Each maps to roadmap phases.
|
|
9
|
+
|
|
10
|
+
### Triggering and Versioning
|
|
11
|
+
|
|
12
|
+
- [ ] **TRIG-01**: Maintainer can publish only from release/tag events intended for production releases.
|
|
13
|
+
- [ ] **TRIG-02**: Release workflow validates that package version and release/tag metadata are consistent before publish.
|
|
14
|
+
|
|
15
|
+
### Build and Artifacts
|
|
16
|
+
|
|
17
|
+
- [x] **BLD-01**: Release workflow builds both sdist and wheel artifacts using UV.
|
|
18
|
+
- [ ] **BLD-02**: Build job stores immutable artifacts for downstream jobs in the same workflow run.
|
|
19
|
+
- [ ] **BLD-03**: Release workflow fails if artifact metadata is invalid or artifact checks fail.
|
|
20
|
+
|
|
21
|
+
### Publish and Security
|
|
22
|
+
|
|
23
|
+
- [x] **PUB-01**: Publish job uploads only artifacts produced by the validated build job.
|
|
24
|
+
- [x] **PUB-02**: Publish job uses PyPI trusted publishing (OIDC) or equivalent secure credentials with no hardcoded secrets in repo files.
|
|
25
|
+
- [ ] **PUB-03**: Publish step is gated by GitHub environment protections for production PyPI publication.
|
|
26
|
+
|
|
27
|
+
### Operations and Reliability
|
|
28
|
+
|
|
29
|
+
- [ ] **OPS-01**: Workflow prevents duplicate/racing publish attempts for the same version.
|
|
30
|
+
- [ ] **OPS-02**: Maintainers have documented rollback/mitigation guidance for bad production releases.
|
|
31
|
+
|
|
32
|
+
## v2 Requirements
|
|
33
|
+
|
|
34
|
+
Deferred to future release improvements.
|
|
35
|
+
|
|
36
|
+
### Release Hardening
|
|
37
|
+
|
|
38
|
+
- **HARD-01**: Maintainer can publish continuously to TestPyPI for pre-production validation.
|
|
39
|
+
- **HARD-02**: Workflow performs post-publish install smoke checks from target index.
|
|
40
|
+
- **HARD-03**: Workflow enforces stronger provenance/attestation policy.
|
|
41
|
+
|
|
42
|
+
## Out of Scope
|
|
43
|
+
|
|
44
|
+
| Feature | Reason |
|
|
45
|
+
|---------|--------|
|
|
46
|
+
| Docker image publishing | Explicitly paused by maintainers and not required for PyPI package release |
|
|
47
|
+
| Feature development unrelated to release automation | This scope is limited to CI/CD packaging and publication reliability |
|
|
48
|
+
|
|
49
|
+
## Traceability
|
|
50
|
+
|
|
51
|
+
Which phases cover which requirements. Updated during roadmap creation.
|
|
52
|
+
|
|
53
|
+
| Requirement | Phase | Status |
|
|
54
|
+
|-------------|-------|--------|
|
|
55
|
+
| TRIG-01 | Phase 1 | Pending |
|
|
56
|
+
| TRIG-02 | Phase 1 | Pending |
|
|
57
|
+
| BLD-01 | Phase 1 | Complete |
|
|
58
|
+
| BLD-02 | Phase 2 | Pending |
|
|
59
|
+
| BLD-03 | Phase 2 | Pending |
|
|
60
|
+
| PUB-01 | Phase 3 | Complete |
|
|
61
|
+
| PUB-02 | Phase 3 | Complete |
|
|
62
|
+
| PUB-03 | Phase 3 | Pending |
|
|
63
|
+
| OPS-01 | Phase 2 | Pending |
|
|
64
|
+
| OPS-02 | Phase 4 | Pending |
|
|
65
|
+
|
|
66
|
+
**Coverage:**
|
|
67
|
+
- v1 requirements: 10 total
|
|
68
|
+
- Mapped to phases: 10
|
|
69
|
+
- Unmapped: 0
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
*Requirements defined: 2026-03-17*
|
|
73
|
+
*Last updated: 2026-03-17 after roadmap creation*
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Roadmap: Tablassert Release Automation
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This roadmap delivers a secure, reproducible GitHub Actions release path for the Tablassert CLI: first enforce correct release triggers and deterministic UV builds, then validate and preserve artifacts, then publish through protected PyPI trusted publishing, and finally ensure maintainers can recover safely from bad releases.
|
|
6
|
+
|
|
7
|
+
## Phases
|
|
8
|
+
|
|
9
|
+
**Phase Numbering:**
|
|
10
|
+
- Integer phases (1, 2, 3): Planned milestone work
|
|
11
|
+
- Decimal phases (2.1, 2.2): Urgent insertions (marked with INSERTED)
|
|
12
|
+
|
|
13
|
+
- [ ] **Phase 1: Release Preconditions and Deterministic Build** - Production releases only trigger with verified tag/version alignment and UV-built distribution outputs.
|
|
14
|
+
- [ ] **Phase 2: Artifact Validation and Run Reliability** - Built artifacts are validated, preserved for downstream jobs, and protected from duplicate publish races.
|
|
15
|
+
- [ ] **Phase 3: Protected PyPI Publication** - Only validated artifacts are published to PyPI through secure, environment-gated credentials.
|
|
16
|
+
- [ ] **Phase 4: Release Recovery Playbook** - Maintainers can follow documented rollback/mitigation steps for bad production releases.
|
|
17
|
+
|
|
18
|
+
## Phase Details
|
|
19
|
+
|
|
20
|
+
### Phase 1: Release Preconditions and Deterministic Build
|
|
21
|
+
**Goal**: Maintainers can trigger production release runs only from intended release events, with version metadata checks and deterministic UV artifact generation in place.
|
|
22
|
+
**Depends on**: Nothing (first phase)
|
|
23
|
+
**Requirements**: TRIG-01, TRIG-02, BLD-01
|
|
24
|
+
**Success Criteria** (what must be TRUE):
|
|
25
|
+
1. Maintainer can trigger a production release workflow only from approved release/tag events.
|
|
26
|
+
2. Workflow blocks publication path when tag/release metadata does not match package version.
|
|
27
|
+
3. Release run produces both wheel and sdist artifacts using UV for the tagged version.
|
|
28
|
+
**Plans**: TBD
|
|
29
|
+
|
|
30
|
+
### Phase 2: Artifact Validation and Run Reliability
|
|
31
|
+
**Goal**: Artifact integrity is proven before publish by validating build outputs, promoting immutable artifacts across jobs, and preventing racing runs for the same version.
|
|
32
|
+
**Depends on**: Phase 1
|
|
33
|
+
**Requirements**: BLD-02, BLD-03, OPS-01
|
|
34
|
+
**Success Criteria** (what must be TRUE):
|
|
35
|
+
1. Maintainer can see build artifacts preserved and transferred unchanged between workflow jobs in the same run.
|
|
36
|
+
2. Workflow fails before publish when artifact metadata/checks are invalid.
|
|
37
|
+
3. Starting duplicate release runs for the same version does not result in multiple competing publish attempts.
|
|
38
|
+
**Plans**: TBD
|
|
39
|
+
|
|
40
|
+
### Phase 3: Protected PyPI Publication
|
|
41
|
+
**Goal**: Production publish is a tightly scoped, secure step that uploads only previously validated artifacts through GitHub-protected controls.
|
|
42
|
+
**Depends on**: Phase 2
|
|
43
|
+
**Requirements**: PUB-01, PUB-02, PUB-03
|
|
44
|
+
**Success Criteria** (what must be TRUE):
|
|
45
|
+
1. Publish job uploads only artifacts produced by the validated build/verify jobs from the same workflow run.
|
|
46
|
+
2. Maintainer can complete publish without repository-stored static PyPI secrets in workflow files.
|
|
47
|
+
3. Production publish requires the configured GitHub environment protections before artifact upload proceeds.
|
|
48
|
+
**Plans**: TBD
|
|
49
|
+
|
|
50
|
+
### Phase 4: Release Recovery Playbook
|
|
51
|
+
**Goal**: Maintainers can quickly mitigate bad releases with clear, repeatable rollback guidance tailored to PyPI release constraints.
|
|
52
|
+
**Depends on**: Phase 3
|
|
53
|
+
**Requirements**: OPS-02
|
|
54
|
+
**Success Criteria** (what must be TRUE):
|
|
55
|
+
1. Maintainer can find and follow documented mitigation steps when a bad release reaches PyPI.
|
|
56
|
+
2. Maintainer can execute the documented recovery path (for example yank + corrected release) without ad hoc decision-making.
|
|
57
|
+
**Plans**: TBD
|
|
58
|
+
|
|
59
|
+
## Progress
|
|
60
|
+
|
|
61
|
+
| Phase | Plans Complete | Status | Completed |
|
|
62
|
+
|-------|----------------|--------|-----------|
|
|
63
|
+
| 1. Release Preconditions and Deterministic Build | 0/TBD | Not started | - |
|
|
64
|
+
| 2. Artifact Validation and Run Reliability | 0/TBD | Not started | - |
|
|
65
|
+
| 3. Protected PyPI Publication | 0/TBD | Not started | - |
|
|
66
|
+
| 4. Release Recovery Playbook | 0/TBD | Not started | - |
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
gsd_state_version: 1.0
|
|
3
|
+
milestone: v1.0
|
|
4
|
+
milestone_name: milestone
|
|
5
|
+
status: planning
|
|
6
|
+
stopped_at: Completed quick-1-PLAN.md
|
|
7
|
+
last_updated: "2026-03-17T22:02:05.791Z"
|
|
8
|
+
last_activity: 2026-03-17 - Completed quick task 1: Please add a github action that runs UV build and uploads to PiPy
|
|
9
|
+
progress:
|
|
10
|
+
percent: 0
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Project State
|
|
14
|
+
|
|
15
|
+
## Project Reference
|
|
16
|
+
|
|
17
|
+
See: `.planning/PROJECT.md` (updated 2026-03-17)
|
|
18
|
+
|
|
19
|
+
**Core value:** A tagged release can be built and published to PyPI reliably from GitHub without manual packaging steps.
|
|
20
|
+
**Current focus:** Phase 1 - Release Preconditions and Deterministic Build
|
|
21
|
+
|
|
22
|
+
## Current Position
|
|
23
|
+
|
|
24
|
+
Phase: 1 of 4 (Release Preconditions and Deterministic Build)
|
|
25
|
+
Plan: 0 of TBD in current phase
|
|
26
|
+
Status: Ready to plan
|
|
27
|
+
Last activity: 2026-03-17 - Completed quick task 1: Please add a github action that runs UV build and uploads to PiPy
|
|
28
|
+
|
|
29
|
+
Progress: [░░░░░░░░░░] 0%
|
|
30
|
+
|
|
31
|
+
## Performance Metrics
|
|
32
|
+
|
|
33
|
+
**Velocity:**
|
|
34
|
+
- Total plans completed: 0
|
|
35
|
+
- Average duration: 0 min
|
|
36
|
+
- Total execution time: 0.0 hours
|
|
37
|
+
|
|
38
|
+
**By Phase:**
|
|
39
|
+
|
|
40
|
+
| Phase | Plans | Total | Avg/Plan |
|
|
41
|
+
|-------|-------|-------|----------|
|
|
42
|
+
| - | - | - | - |
|
|
43
|
+
|
|
44
|
+
**Recent Trend:**
|
|
45
|
+
- Last 5 plans: -
|
|
46
|
+
- Trend: Stable
|
|
47
|
+
| Phase quick-1-please-add-a-github-action-that-runs-uv- P1 | 1m | 2 tasks | 1 files |
|
|
48
|
+
|
|
49
|
+
## Accumulated Context
|
|
50
|
+
|
|
51
|
+
### Decisions
|
|
52
|
+
|
|
53
|
+
Decisions are logged in `.planning/PROJECT.md` Key Decisions table.
|
|
54
|
+
Recent decisions affecting current work:
|
|
55
|
+
|
|
56
|
+
- [Phase 1]: Enforce production release triggers and tag/version validation before publish path.
|
|
57
|
+
- [Phase 3]: Use protected trusted publishing flow for PyPI with environment gating.
|
|
58
|
+
- [Phase quick-1-please-add-a-github-action-that-runs-uv-]: Use artifact promotion so publish uploads exactly what build produced.
|
|
59
|
+
- [Phase quick-1-please-add-a-github-action-that-runs-uv-]: Use PyPI trusted publishing via OIDC with pypi environment gating.
|
|
60
|
+
|
|
61
|
+
### Pending Todos
|
|
62
|
+
|
|
63
|
+
None yet.
|
|
64
|
+
|
|
65
|
+
### Blockers/Concerns
|
|
66
|
+
|
|
67
|
+
- Trusted publisher mapping details must be verified against live PyPI project and GitHub environment configuration before first production publish.
|
|
68
|
+
|
|
69
|
+
### Quick Tasks Completed
|
|
70
|
+
|
|
71
|
+
| # | Description | Date | Commit | Directory |
|
|
72
|
+
|---|-------------|------|--------|-----------|
|
|
73
|
+
| 1 | Please add a github action that runs UV build and uploads to PiPy | 2026-03-17 | 6c32765 | [1-please-add-a-github-action-that-runs-uv-](./quick/1-please-add-a-github-action-that-runs-uv-/) |
|
|
74
|
+
|
|
75
|
+
## Session Continuity
|
|
76
|
+
|
|
77
|
+
Last session: 2026-03-17T22:02:05.790Z
|
|
78
|
+
Stopped at: Completed quick-1-PLAN.md
|
|
79
|
+
Resume file: None
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mode": "yolo",
|
|
3
|
+
"granularity": "coarse",
|
|
4
|
+
"parallelization": true,
|
|
5
|
+
"commit_docs": true,
|
|
6
|
+
"model_profile": "balanced",
|
|
7
|
+
"workflow": {
|
|
8
|
+
"research": true,
|
|
9
|
+
"plan_check": true,
|
|
10
|
+
"verifier": true,
|
|
11
|
+
"nyquist_validation": true,
|
|
12
|
+
"auto_advance": true,
|
|
13
|
+
"_auto_chain_active": true
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
phase: quick-1-please-add-a-github-action-that-runs-uv-
|
|
3
|
+
plan: 1
|
|
4
|
+
type: execute
|
|
5
|
+
wave: 1
|
|
6
|
+
depends_on: []
|
|
7
|
+
files_modified:
|
|
8
|
+
- .github/workflows/release-pypi.yml
|
|
9
|
+
autonomous: true
|
|
10
|
+
requirements:
|
|
11
|
+
- BLD-01
|
|
12
|
+
- PUB-01
|
|
13
|
+
- PUB-02
|
|
14
|
+
must_haves:
|
|
15
|
+
truths:
|
|
16
|
+
- "Maintainer can run a release workflow that builds wheel and sdist with UV."
|
|
17
|
+
- "Built artifacts are the exact inputs used by the publish job."
|
|
18
|
+
- "PyPI upload is performed by GitHub Actions without hardcoded credentials."
|
|
19
|
+
artifacts:
|
|
20
|
+
- path: ".github/workflows/release-pypi.yml"
|
|
21
|
+
provides: "Release workflow with build and publish jobs"
|
|
22
|
+
contains: "uv build, upload/download-artifact, pypa/gh-action-pypi-publish"
|
|
23
|
+
key_links:
|
|
24
|
+
- from: "build job"
|
|
25
|
+
to: "publish job"
|
|
26
|
+
via: "actions/upload-artifact -> actions/download-artifact"
|
|
27
|
+
pattern: "dist/ artifacts"
|
|
28
|
+
- from: "release tag"
|
|
29
|
+
to: "pyproject version"
|
|
30
|
+
via: "workflow validation step"
|
|
31
|
+
pattern: "tag equals project.version"
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
<objective>
|
|
35
|
+
Create a single GitHub Actions release workflow that builds distributions with UV and publishes those artifacts to PyPI.
|
|
36
|
+
|
|
37
|
+
Purpose: Remove manual packaging/publishing drift and make tagged releases reproducible and secure.
|
|
38
|
+
Output: `.github/workflows/release-pypi.yml` with guarded release trigger, UV build, artifact handoff, and PyPI publish.
|
|
39
|
+
</objective>
|
|
40
|
+
|
|
41
|
+
<execution_context>
|
|
42
|
+
@/home/skyeav/.config/opencode/get-shit-done/workflows/execute-plan.md
|
|
43
|
+
@/home/skyeav/.config/opencode/get-shit-done/templates/summary.md
|
|
44
|
+
</execution_context>
|
|
45
|
+
|
|
46
|
+
<context>
|
|
47
|
+
@.planning/STATE.md
|
|
48
|
+
@.planning/PROJECT.md
|
|
49
|
+
@.planning/ROADMAP.md
|
|
50
|
+
@pyproject.toml
|
|
51
|
+
@.github/workflows/docs.yml
|
|
52
|
+
</context>
|
|
53
|
+
|
|
54
|
+
<tasks>
|
|
55
|
+
|
|
56
|
+
<task type="auto">
|
|
57
|
+
<name>Task 1: Create UV release build workflow scaffold</name>
|
|
58
|
+
<files>.github/workflows/release-pypi.yml</files>
|
|
59
|
+
<action>Create a new workflow triggered by `release.published` (and optional `workflow_dispatch` for maintainers). Add a `build` job on ubuntu-latest that checks out code, installs UV via `astral-sh/setup-uv`, validates that release tag (strip leading `v`) matches `project.version` in `pyproject.toml`, then runs `uv build` to produce wheel and sdist. Upload `dist/*` as a named artifact for downstream jobs. Do not embed PyPI credentials or tokens in workflow code.</action>
|
|
60
|
+
<verify>
|
|
61
|
+
<automated>uv run python -c "import pathlib, yaml; yaml.safe_load(pathlib.Path('.github/workflows/release-pypi.yml').read_text()); print('workflow yaml valid')"</automated>
|
|
62
|
+
</verify>
|
|
63
|
+
<done>Workflow file exists with build job, UV build step, tag/version guard, and artifact upload step.</done>
|
|
64
|
+
</task>
|
|
65
|
+
|
|
66
|
+
<task type="auto">
|
|
67
|
+
<name>Task 2: Add secure publish job using built artifacts</name>
|
|
68
|
+
<files>.github/workflows/release-pypi.yml</files>
|
|
69
|
+
<action>Add a `publish` job that `needs: build`, has minimal permissions (`id-token: write`, `contents: read`), downloads the exact build artifact, and uploads via `pypa/gh-action-pypi-publish` (trusted publishing/OIDC path). Bind the job to a `pypi` environment for protection rules. Ensure publish only runs on successful build and never rebuilds artifacts in this job.</action>
|
|
70
|
+
<verify>
|
|
71
|
+
<automated>python -c "import pathlib,re; t=pathlib.Path('.github/workflows/release-pypi.yml').read_text(); assert 'needs: build' in t and 'id-token: write' in t and 'gh-action-pypi-publish' in t; print('publish wiring present')"</automated>
|
|
72
|
+
</verify>
|
|
73
|
+
<done>Publish job uses downloaded build artifacts and trusted publishing permissions, with no static credential usage in workflow file.</done>
|
|
74
|
+
</task>
|
|
75
|
+
|
|
76
|
+
</tasks>
|
|
77
|
+
|
|
78
|
+
<verification>
|
|
79
|
+
Run a local packaging smoke check and workflow lint-level checks before merge.
|
|
80
|
+
</verification>
|
|
81
|
+
|
|
82
|
+
<success_criteria>
|
|
83
|
+
1. Tagged release workflow builds both `.whl` and `.tar.gz` with UV.
|
|
84
|
+
2. Publish job consumes artifacts from the build job and uploads to PyPI via `gh-action-pypi-publish`.
|
|
85
|
+
3. Workflow file contains no hardcoded PyPI username/password/token secrets.
|
|
86
|
+
</success_criteria>
|
|
87
|
+
|
|
88
|
+
<output>
|
|
89
|
+
After completion, create `.planning/quick/1-please-add-a-github-action-that-runs-uv-/1-SUMMARY.md`
|
|
90
|
+
</output>
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
phase: quick-1-please-add-a-github-action-that-runs-uv-
|
|
3
|
+
plan: 1
|
|
4
|
+
subsystem: infra
|
|
5
|
+
tags: [github-actions, uv, pypi, oidc, release]
|
|
6
|
+
requires: []
|
|
7
|
+
provides:
|
|
8
|
+
- Release workflow building wheel and sdist with uv
|
|
9
|
+
- Artifact handoff from build to publish job
|
|
10
|
+
- Trusted publishing path to PyPI with OIDC permissions
|
|
11
|
+
affects: [release, packaging, publishing]
|
|
12
|
+
tech-stack:
|
|
13
|
+
added: []
|
|
14
|
+
patterns: [release-tag-version-guard, artifact-promotion, trusted-publishing]
|
|
15
|
+
key-files:
|
|
16
|
+
created: [.planning/quick/1-please-add-a-github-action-that-runs-uv-/1-SUMMARY.md]
|
|
17
|
+
modified: [.github/workflows/release-pypi.yml]
|
|
18
|
+
key-decisions:
|
|
19
|
+
- "Use release artifact promotion (upload/download-artifact) so publish never rebuilds outputs"
|
|
20
|
+
- "Use PyPI trusted publishing (id-token + pypi environment) instead of static credentials"
|
|
21
|
+
patterns-established:
|
|
22
|
+
- "Release workflow validates tag-to-version parity before building artifacts"
|
|
23
|
+
- "Publish job consumes build artifacts via needs + download-artifact"
|
|
24
|
+
requirements-completed: [BLD-01, PUB-01, PUB-02]
|
|
25
|
+
duration: 1m
|
|
26
|
+
completed: 2026-03-17
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
# Phase [quick-1] Plan [1]: Release Workflow Summary
|
|
30
|
+
|
|
31
|
+
**GitHub Actions now builds Tablassert wheel/sdist with uv and publishes the exact built artifacts to PyPI using OIDC trusted publishing.**
|
|
32
|
+
|
|
33
|
+
## Performance
|
|
34
|
+
|
|
35
|
+
- **Duration:** 1m
|
|
36
|
+
- **Started:** 2026-03-17T14:59:57Z
|
|
37
|
+
- **Completed:** 2026-03-17T15:01:11Z
|
|
38
|
+
- **Tasks:** 2
|
|
39
|
+
- **Files modified:** 1
|
|
40
|
+
|
|
41
|
+
## Accomplishments
|
|
42
|
+
- Added `.github/workflows/release-pypi.yml` with `release.published` and optional `workflow_dispatch` triggers.
|
|
43
|
+
- Implemented build job with `astral-sh/setup-uv`, tag/version validation against `pyproject.toml`, `uv build`, and artifact upload.
|
|
44
|
+
- Added publish job with `needs: build`, `id-token: write`, `contents: read`, `environment: pypi`, artifact download, and `pypa/gh-action-pypi-publish`.
|
|
45
|
+
|
|
46
|
+
## Task Commits
|
|
47
|
+
|
|
48
|
+
1. **Task 1: Create UV release build workflow scaffold** - `77fba59` (feat)
|
|
49
|
+
2. **Task 2: Add secure publish job using built artifacts** - `d4fbfec` (feat)
|
|
50
|
+
|
|
51
|
+
## Files Created/Modified
|
|
52
|
+
- `.github/workflows/release-pypi.yml` - Release workflow with uv build, guarded tag/version check, artifact handoff, and trusted PyPI publish.
|
|
53
|
+
- `.planning/quick/1-please-add-a-github-action-that-runs-uv-/1-SUMMARY.md` - Execution summary and task traceability.
|
|
54
|
+
|
|
55
|
+
## Decisions Made
|
|
56
|
+
- Use a manual `workflow_dispatch` input for `release_tag` so maintainers can rerun releases with explicit version context.
|
|
57
|
+
- Keep build and publish strictly separated with artifact promotion to guarantee published files are exact build outputs.
|
|
58
|
+
|
|
59
|
+
## Deviations from Plan
|
|
60
|
+
|
|
61
|
+
None - plan executed exactly as written.
|
|
62
|
+
|
|
63
|
+
## Issues Encountered
|
|
64
|
+
|
|
65
|
+
None.
|
|
66
|
+
|
|
67
|
+
## User Setup Required
|
|
68
|
+
|
|
69
|
+
Configure GitHub environment `pypi` and PyPI trusted publisher mapping before first production release.
|
|
70
|
+
|
|
71
|
+
## Next Phase Readiness
|
|
72
|
+
|
|
73
|
+
- Release workflow is ready for repository-level environment/protection configuration and first dry-run tag release.
|
|
74
|
+
- Trusted publisher mapping in PyPI remains the only external dependency called out in project state.
|
|
75
|
+
|
|
76
|
+
## Self-Check: PASSED
|
|
77
|
+
|
|
78
|
+
- FOUND: `.planning/quick/1-please-add-a-github-action-that-runs-uv-/1-SUMMARY.md`
|
|
79
|
+
- FOUND: `77fba59`
|
|
80
|
+
- FOUND: `d4fbfec`
|