agentic-sidecar 0.0.1__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 (49) hide show
  1. agentic_sidecar-0.0.1/.github/CODEOWNERS +1 -0
  2. agentic_sidecar-0.0.1/.github/dependabot.yml +17 -0
  3. agentic_sidecar-0.0.1/.github/workflows/ci.yml +68 -0
  4. agentic_sidecar-0.0.1/.github/workflows/release-pypi.yml +46 -0
  5. agentic_sidecar-0.0.1/.gitignore +14 -0
  6. agentic_sidecar-0.0.1/AGENTS.md +131 -0
  7. agentic_sidecar-0.0.1/CHANGELOG.md +39 -0
  8. agentic_sidecar-0.0.1/CI.md +70 -0
  9. agentic_sidecar-0.0.1/CONTRIBUTING.md +81 -0
  10. agentic_sidecar-0.0.1/LICENSE +21 -0
  11. agentic_sidecar-0.0.1/Makefile +36 -0
  12. agentic_sidecar-0.0.1/PKG-INFO +466 -0
  13. agentic_sidecar-0.0.1/README.md +411 -0
  14. agentic_sidecar-0.0.1/ROADMAP.md +482 -0
  15. agentic_sidecar-0.0.1/SECURITY.md +51 -0
  16. agentic_sidecar-0.0.1/concept.md +1767 -0
  17. agentic_sidecar-0.0.1/examples/README.md +7 -0
  18. agentic_sidecar-0.0.1/pyproject.toml +105 -0
  19. agentic_sidecar-0.0.1/src/agentic_sidecar/__init__.py +15 -0
  20. agentic_sidecar-0.0.1/src/agentic_sidecar/adapters/__init__.py +8 -0
  21. agentic_sidecar-0.0.1/src/agentic_sidecar/adapters/autogen.py +7 -0
  22. agentic_sidecar-0.0.1/src/agentic_sidecar/adapters/crewai.py +7 -0
  23. agentic_sidecar-0.0.1/src/agentic_sidecar/adapters/google_adk.py +7 -0
  24. agentic_sidecar-0.0.1/src/agentic_sidecar/adapters/langgraph.py +7 -0
  25. agentic_sidecar-0.0.1/src/agentic_sidecar/adapters/openai_agents.py +7 -0
  26. agentic_sidecar-0.0.1/src/agentic_sidecar/cli/__init__.py +7 -0
  27. agentic_sidecar-0.0.1/src/agentic_sidecar/cli/main.py +5 -0
  28. agentic_sidecar-0.0.1/src/agentic_sidecar/core/__init__.py +5 -0
  29. agentic_sidecar-0.0.1/src/agentic_sidecar/core/context.py +6 -0
  30. agentic_sidecar-0.0.1/src/agentic_sidecar/core/decision.py +9 -0
  31. agentic_sidecar-0.0.1/src/agentic_sidecar/core/sidecar.py +9 -0
  32. agentic_sidecar-0.0.1/src/agentic_sidecar/evaluators/__init__.py +14 -0
  33. agentic_sidecar-0.0.1/src/agentic_sidecar/evaluators/critic.py +6 -0
  34. agentic_sidecar-0.0.1/src/agentic_sidecar/evaluators/judge.py +9 -0
  35. agentic_sidecar-0.0.1/src/agentic_sidecar/evaluators/planner.py +17 -0
  36. agentic_sidecar-0.0.1/src/agentic_sidecar/gate/__init__.py +12 -0
  37. agentic_sidecar-0.0.1/src/agentic_sidecar/gate/budget.py +5 -0
  38. agentic_sidecar-0.0.1/src/agentic_sidecar/gate/policy.py +8 -0
  39. agentic_sidecar-0.0.1/src/agentic_sidecar/gate/risk.py +9 -0
  40. agentic_sidecar-0.0.1/src/agentic_sidecar/integrations/__init__.py +13 -0
  41. agentic_sidecar-0.0.1/src/agentic_sidecar/integrations/agentic_chaos.py +26 -0
  42. agentic_sidecar-0.0.1/src/agentic_sidecar/integrations/agenticlens.py +14 -0
  43. agentic_sidecar-0.0.1/src/agentic_sidecar/intent/__init__.py +11 -0
  44. agentic_sidecar-0.0.1/src/agentic_sidecar/intent/alignment.py +10 -0
  45. agentic_sidecar-0.0.1/src/agentic_sidecar/intent/envelope.py +10 -0
  46. agentic_sidecar-0.0.1/src/agentic_sidecar/status/__init__.py +5 -0
  47. agentic_sidecar-0.0.1/src/agentic_sidecar/status/narrate.py +6 -0
  48. agentic_sidecar-0.0.1/tests/test_package.py +12 -0
  49. agentic_sidecar-0.0.1/uv.lock +1741 -0
@@ -0,0 +1 @@
1
+ * @pramodbn27
@@ -0,0 +1,17 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "github-actions"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ labels:
8
+ - "dependencies"
9
+ - "github-actions"
10
+
11
+ - package-ecosystem: "pip"
12
+ directory: "/"
13
+ schedule:
14
+ interval: "weekly"
15
+ labels:
16
+ - "dependencies"
17
+ - "python"
@@ -0,0 +1,68 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-latest
11
+ strategy:
12
+ matrix:
13
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
14
+ steps:
15
+ - uses: actions/checkout@v7
16
+
17
+ - name: Install uv
18
+ uses: astral-sh/setup-uv@v7
19
+ with:
20
+ enable-cache: true
21
+
22
+ - name: Set up Python ${{ matrix.python-version }}
23
+ run: uv python install ${{ matrix.python-version }}
24
+
25
+ # No [tool.uv.sources] override exists yet (agenticlens integration is
26
+ # still a placeholder module), so a plain `uv sync` resolves cleanly
27
+ # without needing --frozen or a sibling checkout.
28
+ - name: Install dependencies
29
+ run: uv sync --extra dev --python ${{ matrix.python-version }}
30
+
31
+ - name: Lint (ruff check)
32
+ run: uv run ruff check src tests
33
+
34
+ # Scoped to src/tests, not "." -- ruff >=0.16 formats fenced ```python
35
+ # blocks inside Markdown by default, and this repo's docs (README.md,
36
+ # ROADMAP.md, concept.md) intentionally use abbreviated pseudocode
37
+ # in those fences that isn't meant to be reformatted as real source.
38
+ - name: Format check (ruff format)
39
+ run: uv run ruff format --check src tests
40
+
41
+ - name: Type check (mypy)
42
+ run: uv run mypy
43
+
44
+ - name: Test (pytest)
45
+ run: uv run pytest
46
+
47
+ package:
48
+ runs-on: ubuntu-latest
49
+ needs: [test]
50
+ steps:
51
+ - uses: actions/checkout@v7
52
+ - name: Install uv
53
+ uses: astral-sh/setup-uv@v7
54
+ with:
55
+ enable-cache: true
56
+ - name: Set up Python
57
+ run: uv python install 3.12
58
+ - name: Install dependencies
59
+ run: uv sync --extra dev --python 3.12
60
+ - name: Build distributions
61
+ run: |
62
+ uv run python -m build
63
+ uv run python -m twine check dist/*
64
+
65
+ # TODO(v0.1+, once agentic_sidecar.integrations.agenticlens has real code):
66
+ # add a test-agenticlens-integration job that checks out a sibling
67
+ # `agenticlens` repo and runs `uv sync --extra dev --extra agenticlens`
68
+ # against it. Not added yet -- there's nothing in that module to exercise.
@@ -0,0 +1,46 @@
1
+ name: publish-pypi
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ push:
7
+ tags:
8
+ - "v*"
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ build:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v7
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.12"
21
+ - name: Build distributions
22
+ run: |
23
+ python -m pip install --upgrade pip
24
+ python -m pip install build twine
25
+ python -m build
26
+ python -m twine check dist/*
27
+ - name: Upload distributions
28
+ uses: actions/upload-artifact@v7
29
+ with:
30
+ name: python-package-distributions
31
+ path: dist/
32
+
33
+ publish-pypi:
34
+ runs-on: ubuntu-latest
35
+ needs: build
36
+ environment: pypi
37
+ permissions:
38
+ id-token: write # required for PyPI Trusted Publishing (OIDC) -- no API token/secret needed
39
+ steps:
40
+ - name: Download distributions
41
+ uses: actions/download-artifact@v8
42
+ with:
43
+ name: python-package-distributions
44
+ path: dist/
45
+ - name: Publish to PyPI
46
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,14 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ .eggs/
5
+ .venv/
6
+ .mypy_cache/
7
+ .ruff_cache/
8
+ .pytest_cache/
9
+ htmlcov/
10
+ .coverage
11
+ dist/
12
+ build/
13
+ site/
14
+ .env
@@ -0,0 +1,131 @@
1
+ ## agentic-sidecar Development Reference
2
+
3
+ ## Status
4
+
5
+ This repository is a **scaffold** — directory layout, tooling config, and
6
+ CI/release workflows exist; `src/agentic_sidecar/` modules are placeholders
7
+ (docstring only, `NotImplementedError` on any callable if one exists) until
8
+ their version lands. See [ROADMAP.md](ROADMAP.md) for the build order before
9
+ adding real logic to any module.
10
+
11
+ ## Build and Run
12
+
13
+ - Install: `make install` (runs `uv sync --extra dev`)
14
+ - Test: `make test` or `make check` (lint + format + typecheck + test)
15
+ - Lint: `make lint`
16
+ - Type check: `make typecheck`
17
+ - CLI: not implemented yet — `[project.scripts]` is intentionally absent
18
+ from `pyproject.toml` until `cli/main.py` has a real Typer `app` (v0.5)
19
+
20
+ ## Code Style
21
+
22
+ - Strict typing (mypy strict mode, Python 3.10+)
23
+ - Line length: 100
24
+ - Ruff rules: E, F, I, UP, B, SIM, N
25
+ - One purpose per file (separation of concerns)
26
+ - Decision and Intent Envelope artifacts must be exportable as AI Operations
27
+ Specification objects once implemented (see `ai-operations-spec`)
28
+
29
+ ## Design Constraints
30
+
31
+ These are load-bearing, not preferences — see
32
+ [ROADMAP.md § Design Constraints](ROADMAP.md#design-constraints-read-before-building-v01)
33
+ for the full rationale on each:
34
+
35
+ 1. **One framework adapter first.** `adapters/langgraph.py` before any of
36
+ the other four. Do not claim framework independence until a second
37
+ adapter has been built against real usage.
38
+ 2. **Rules before models.** v0.1's `gate/policy.py` and `gate/risk.py` must
39
+ work with zero LLM calls. Don't reach for `evaluators/judge.py` (v0.3)
40
+ to solve a v0.1 problem.
41
+ 3. **`on_sidecar_failure` has no default.** Every Decision Gate path must
42
+ handle `fail_open` and `fail_closed` explicitly — this is a governance
43
+ property, not an implementation detail.
44
+ 4. **A risk classifier is not a free lunch.** Keep `gate/risk.py` rule-based
45
+ until there's measured evidence (see the v0.2.x benchmark in
46
+ [ROADMAP.md](ROADMAP.md)) that a model-based classifier is actually
47
+ needed.
48
+ 5. **Policy, Risk, and Intent ask different questions.** A change that adds
49
+ a static allow/deny check to `intent/` belongs in `gate/policy.py`
50
+ instead. See
51
+ [README.md](README.md#how-the-decision-gate-evaluates-a-decision).
52
+
53
+ ## Repo Map
54
+
55
+ | Path | Purpose | Planned version |
56
+ |------|---------|------------------|
57
+ | `src/agentic_sidecar/core/` | `Sidecar` class, `attach()`, decision-boundary interception, `Decision` type | v0.1 |
58
+ | `src/agentic_sidecar/gate/policy.py` | Policy Advisor — deterministic YAML allow/deny rules | v0.1 |
59
+ | `src/agentic_sidecar/gate/risk.py` | Risk Evaluator — rule-based classification | v0.1 |
60
+ | `src/agentic_sidecar/gate/budget.py` | Budget Guardian — cost/token ceilings | v0.4 |
61
+ | `src/agentic_sidecar/adapters/langgraph.py` | LangGraph interception adapter | v0.1 |
62
+ | `src/agentic_sidecar/intent/` | `IntentEnvelope`, alignment scoring, drift detection | v0.2 |
63
+ | `src/agentic_sidecar/evaluators/planner.py` | Planner — evaluates the whole plan against intent | v0.3 |
64
+ | `src/agentic_sidecar/evaluators/critic.py` | Critic mode — pre-decision challenge | v0.3 |
65
+ | `src/agentic_sidecar/evaluators/judge.py` | Model-agnostic LLM Judge interface | v0.3 |
66
+ | `src/agentic_sidecar/gate/` (full outcome set) | `WARN` / `CHALLENGE` / `REPLAN` / `PAUSE` / `ESCALATE`, human-in-the-loop escalation | v0.4 |
67
+ | `src/agentic_sidecar/status/narrate.py` | Human-readable status narration | v0.5 |
68
+ | `src/agentic_sidecar/cli/` | CLI entry point (`agentic-sidecar status --follow`) | v0.5 |
69
+ | `src/agentic_sidecar/adapters/{crewai,autogen,openai_agents,google_adk}.py` | Additional framework adapters | v0.6 |
70
+ | `src/agentic_sidecar/integrations/agenticlens.py` | Optional AgenticLens adapter (surfaces Sidecar decisions in `agenticlens analyze`) | optional, coordinate with `agenticlens` |
71
+ | `src/agentic_sidecar/integrations/agentic_chaos.py` | Optional Agentic Chaos coordination (recovery-decision evaluation, chaos-testing the Sidecar's own gate) | optional, coordinate with `agentic-chaos` |
72
+ | `tests/` | Pytest test suite | ongoing |
73
+ | `Makefile` | Local dev automation | — |
74
+
75
+ Full architecture and build order: [ROADMAP.md](ROADMAP.md).
76
+
77
+ ## Entry Points (planned)
78
+
79
+ - Injection API: `from agentic_sidecar import Sidecar`
80
+ - CLI: `agentic-sidecar status --follow` (v0.5)
81
+
82
+ ## Package Boundaries
83
+
84
+ - This package is **standalone** — `pip install agentic-sidecar` must work
85
+ with zero other DeepAgentLabs dependencies.
86
+ - AgenticLens integration is optional (`agentic_sidecar.integrations.agenticlens`)
87
+ and must auto-skip in tests if `agenticlens` is not installed.
88
+ - `core/` must not import from `adapters/` (adapters depend on core, not the
89
+ reverse).
90
+ - `gate/` (Policy, Risk) must work with zero dependency on `evaluators/`
91
+ (Planner, Critic, Judge) — v0.1's Decision Gate has to function before
92
+ Judge exists at all.
93
+ - `evaluators/judge.py` must stay model-agnostic — no hardcoded provider SDK
94
+ imports at module scope.
95
+
96
+ ## Adding a New Framework Adapter
97
+
98
+ 1. Confirm a first adapter (`adapters/langgraph.py`) is done and stable —
99
+ don't start a second adapter to "save time" in parallel; the interception
100
+ abstraction needs to survive one real framework before generalizing.
101
+ 2. Add the adapter module under `adapters/`.
102
+ 3. Add conformance tests asserting identical `Decision` behavior for an
103
+ equivalent scenario across all adapters shipped so far.
104
+ 4. Update README's `Design Constraints` note if the abstraction had to
105
+ change to accommodate the new framework.
106
+
107
+ ## Feature Completion Expectations
108
+
109
+ - Every behavior change must include tests.
110
+ - User-facing features must include or update examples in `README.md` or
111
+ `examples/`.
112
+ - When a roadmap item or milestone meaningfully changes status, update
113
+ `README.md` and `ROADMAP.md` in the same change.
114
+ - When work is packaged as a release-ready change, also update
115
+ `pyproject.toml`, `src/agentic_sidecar/__init__.py`, and `CHANGELOG.md`.
116
+
117
+ ## Pre-push Checklist
118
+
119
+ Run `make check` before every push. It runs: lint → format-check → typecheck → test.
120
+
121
+ ## Release
122
+
123
+ 1. Bump version in `pyproject.toml`, `src/agentic_sidecar/__init__.py`, and `CHANGELOG.md`
124
+ 2. Commit: `git commit -am "release: vX.Y.Z"`
125
+ 3. Tag: `git tag vX.Y.Z`
126
+ 4. Push: `git push origin main --tags`
127
+
128
+ The `release-pypi.yml` workflow triggers on the tag push and publishes to
129
+ PyPI via Trusted Publishing (OIDC) — no API token/secret required, but the
130
+ `pypi` GitHub Environment must exist and be configured as a Trusted
131
+ Publisher on PyPI before the first release.
@@ -0,0 +1,39 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here.
4
+
5
+ ## [Unreleased]
6
+
7
+ ## [0.0.1] - 2026-08-12
8
+
9
+ ### Added
10
+
11
+ - Initial repository scaffold: proposed package layout under
12
+ `src/agentic_sidecar/` (placeholder modules only, no logic), `pyproject.toml`,
13
+ `Makefile`, CI and PyPI-release GitHub Actions workflows, and contributor
14
+ docs (`AGENTS.md`, `CONTRIBUTING.md`, `CI.md`, `SECURITY.md`).
15
+ - `README.md` and `ROADMAP.md` describing the architecture and v0.1–v1.0
16
+ build plan.
17
+ - Reserved (not implemented) optional integration seats for both sibling
18
+ projects: `agenticlens` and `agentic-chaos` extras in `pyproject.toml`,
19
+ each with a docstring-only placeholder under
20
+ `src/agentic_sidecar/integrations/`.
21
+
22
+ ### Fixed
23
+
24
+ - Audited `README.md`/`ROADMAP.md` against the original concept doc and
25
+ corrected two gaps: the `Planner` module was named throughout the docs
26
+ but had no package file, version, or repo-map entry (now
27
+ `evaluators/planner.py`, v0.3); the `CHALLENGE` Decision Gate outcome was
28
+ dropped from every enumeration while `ROADMAP.md` still claimed "all
29
+ seven" outcomes (now restored, v0.4). Also documented two previously
30
+ silent scope cuts (`LangChain` folded into the `LangGraph` adapter;
31
+ sampling/caching/async-advisory cost-control ideas left unscheduled)
32
+ instead of leaving them unexplained.
33
+
34
+ ### Changed
35
+
36
+ - Renamed `future-plans.md` to `concept.md` and updated every reference.
37
+
38
+ No functional code has shipped yet — see [ROADMAP.md](ROADMAP.md) for the
39
+ v0.1 scope (Sidecar Runtime + Rule-Based Decision Gate).
@@ -0,0 +1,70 @@
1
+ # CI Readiness — Pre-push Checklist
2
+
3
+ Run these checks locally before every push or PR.
4
+
5
+ ## Docs-only shortcut
6
+
7
+ If your diff only touches `.md` files, skip code checks. Verify with:
8
+
9
+ ```bash
10
+ git status --short
11
+ ```
12
+
13
+ ## Required checks (all code changes)
14
+
15
+ ```bash
16
+ make check
17
+ ```
18
+
19
+ This runs lint → format-check → typecheck → test in sequence. If any step
20
+ fails, fix it before pushing.
21
+
22
+ Or run steps individually:
23
+
24
+ 1. **Clean tree** — no accidental untracked files, no `.env` or secrets
25
+
26
+ ```bash
27
+ git status --short
28
+ ```
29
+
30
+ 2. **Lint**
31
+
32
+ ```bash
33
+ make lint
34
+ ```
35
+
36
+ 3. **Format**
37
+
38
+ ```bash
39
+ make format-check
40
+ ```
41
+
42
+ If it fails: `make format && make format-check`
43
+
44
+ 4. **Type check**
45
+
46
+ ```bash
47
+ make typecheck
48
+ ```
49
+
50
+ 5. **Test**
51
+
52
+ ```bash
53
+ make test
54
+ ```
55
+
56
+ ## When to run full coverage
57
+
58
+ Run `make test-cov` instead of `make test` for any change to `core/`,
59
+ `gate/`, or `intent/` — those hold the Decision Gate logic every other
60
+ module depends on.
61
+
62
+ ## CI parity
63
+
64
+ The GitHub Actions CI workflow runs one job today: lint, format-check,
65
+ type-check, and test across Python 3.10–3.13, then a build/package check.
66
+ If `make check` passes locally, CI should pass too.
67
+
68
+ A second job testing `agentic_sidecar.integrations.agenticlens` against a
69
+ real `agenticlens` checkout should be added once that module has real code,
70
+ not before.
@@ -0,0 +1,81 @@
1
+ # Contributing
2
+
3
+ Thanks for helping make `agentic-sidecar` better for everyone building
4
+ governable autonomous AI agents.
5
+
6
+ `agentic-sidecar` is currently a **scaffold** — see
7
+ [ROADMAP.md](ROADMAP.md) for what's planned and in what order before
8
+ starting on a module.
9
+
10
+ ## Local setup
11
+
12
+ ```bash
13
+ git clone https://github.com/pramodbn27/agentic-sidecar.git
14
+ cd agentic-sidecar
15
+ python -m venv .venv
16
+ . .venv/bin/activate
17
+ pip install -e ".[dev]"
18
+ ```
19
+
20
+ Or with `uv`:
21
+
22
+ ```bash
23
+ uv sync --extra dev
24
+ ```
25
+
26
+ ## Development workflow
27
+
28
+ 1. Check [ROADMAP.md](ROADMAP.md) for the current build order — modules
29
+ have a stated planned version for a reason (see its Design Constraints
30
+ section); don't jump ahead (e.g. building Judge before the v0.1
31
+ rule-based Decision Gate is solid).
32
+ 2. Create a focused branch from `main`.
33
+ 3. Add or update tests with every behavior change.
34
+ 4. Add or update user-facing examples when the feature or expected workflow
35
+ changes.
36
+ 5. If a roadmap item is completed or its status changes, update
37
+ `README.md` and `ROADMAP.md` in the same pull request.
38
+ 6. If the work is release-ready, update `pyproject.toml`,
39
+ `src/agentic_sidecar/__init__.py`, and `CHANGELOG.md` as part of the
40
+ release.
41
+ 7. Run:
42
+
43
+ ```bash
44
+ ruff check .
45
+ ruff format --check .
46
+ mypy
47
+ pytest
48
+ ```
49
+
50
+ 8. Keep PRs focused — one concern per pull request.
51
+ 9. Write clear commit messages describing *why*, not just *what*.
52
+
53
+ ## Turning a placeholder module into a real one
54
+
55
+ 1. Read the module's docstring in `src/agentic_sidecar/` — it states what
56
+ the module is for and which ROADMAP version it belongs to.
57
+ 2. Implement against the Python API sketched in `README.md`'s
58
+ [Planned Python API](README.md#planned-python-api) section, adjusting
59
+ the README if the real shape needs to differ.
60
+ 3. Respect the Package Boundaries in [AGENTS.md](AGENTS.md) (e.g. `gate/`
61
+ must not depend on `evaluators/`).
62
+ 4. Add tests in `tests/`.
63
+ 5. Add or update a usage example.
64
+ 6. Update README, ROADMAP, and CHANGELOG in the same PR.
65
+
66
+ ## Releases
67
+
68
+ Releases are automated via GitHub Actions when a version tag is pushed.
69
+
70
+ ### Release checklist
71
+
72
+ 1. Update the version string in all three locations:
73
+ - `pyproject.toml` → `version = "X.Y.Z"`
74
+ - `src/agentic_sidecar/__init__.py` → `__version__ = "X.Y.Z"`
75
+ - `CHANGELOG.md` → add a `## [X.Y.Z] - YYYY-MM-DD` section
76
+ 2. Commit: `git commit -am "release: vX.Y.Z"`
77
+ 3. Tag: `git tag vX.Y.Z`
78
+ 4. Push: `git push origin main --tags`
79
+
80
+ The `release-pypi.yml` workflow triggers on the tag push and publishes to
81
+ PyPI via Trusted Publishing (OIDC).
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 pramodbn27
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,36 @@
1
+ .DEFAULT_GOAL := help
2
+
3
+ .PHONY: help install lint format format-check typecheck test test-cov clean build
4
+
5
+ help: ## Show this help
6
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \
7
+ awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-18s\033[0m %s\n", $$1, $$2}'
8
+
9
+ install: ## Install dependencies (dev extras)
10
+ uv sync --extra dev
11
+
12
+ lint: ## Run ruff linter
13
+ uv run ruff check src tests
14
+
15
+ format: ## Auto-format code
16
+ uv run ruff format src tests
17
+
18
+ format-check: ## Check formatting without changes
19
+ uv run ruff format --check src tests
20
+
21
+ typecheck: ## Run mypy type checking
22
+ uv run mypy
23
+
24
+ test: ## Run tests
25
+ uv run pytest
26
+
27
+ test-cov: ## Run tests with coverage
28
+ uv run pytest --cov --cov-report=term-missing
29
+
30
+ clean: ## Remove build artifacts
31
+ rm -rf dist/ build/ *.egg-info src/*.egg-info .mypy_cache .pytest_cache .ruff_cache
32
+
33
+ build: ## Build package distributions
34
+ uv run python -m build
35
+
36
+ check: lint format-check typecheck test ## Run all quality gates