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.
- agentic_sidecar-0.0.1/.github/CODEOWNERS +1 -0
- agentic_sidecar-0.0.1/.github/dependabot.yml +17 -0
- agentic_sidecar-0.0.1/.github/workflows/ci.yml +68 -0
- agentic_sidecar-0.0.1/.github/workflows/release-pypi.yml +46 -0
- agentic_sidecar-0.0.1/.gitignore +14 -0
- agentic_sidecar-0.0.1/AGENTS.md +131 -0
- agentic_sidecar-0.0.1/CHANGELOG.md +39 -0
- agentic_sidecar-0.0.1/CI.md +70 -0
- agentic_sidecar-0.0.1/CONTRIBUTING.md +81 -0
- agentic_sidecar-0.0.1/LICENSE +21 -0
- agentic_sidecar-0.0.1/Makefile +36 -0
- agentic_sidecar-0.0.1/PKG-INFO +466 -0
- agentic_sidecar-0.0.1/README.md +411 -0
- agentic_sidecar-0.0.1/ROADMAP.md +482 -0
- agentic_sidecar-0.0.1/SECURITY.md +51 -0
- agentic_sidecar-0.0.1/concept.md +1767 -0
- agentic_sidecar-0.0.1/examples/README.md +7 -0
- agentic_sidecar-0.0.1/pyproject.toml +105 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/__init__.py +15 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/adapters/__init__.py +8 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/adapters/autogen.py +7 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/adapters/crewai.py +7 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/adapters/google_adk.py +7 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/adapters/langgraph.py +7 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/adapters/openai_agents.py +7 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/cli/__init__.py +7 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/cli/main.py +5 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/core/__init__.py +5 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/core/context.py +6 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/core/decision.py +9 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/core/sidecar.py +9 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/evaluators/__init__.py +14 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/evaluators/critic.py +6 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/evaluators/judge.py +9 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/evaluators/planner.py +17 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/gate/__init__.py +12 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/gate/budget.py +5 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/gate/policy.py +8 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/gate/risk.py +9 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/integrations/__init__.py +13 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/integrations/agentic_chaos.py +26 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/integrations/agenticlens.py +14 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/intent/__init__.py +11 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/intent/alignment.py +10 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/intent/envelope.py +10 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/status/__init__.py +5 -0
- agentic_sidecar-0.0.1/src/agentic_sidecar/status/narrate.py +6 -0
- agentic_sidecar-0.0.1/tests/test_package.py +12 -0
- 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,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
|