diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..7d5daf3 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,29 @@ +# deploydiff + +## Purpose +Compare deployment configurations across environments. Detect drift between staging and production configs. Preview infrastructure changes with human-readable diffs, cost impact estimation, and rollback commands. + +## Build & Test Commands +- Install: `pip install -e .` or `pip install deploydiff` +- Test: `pytest tests/` (or `python -m pytest tests/ -v --tb=short`) +- Lint: `ruff check .` +- Build: `pip install build twine && python -m build && twine check dist/*` +- CLI check: `deploydiff --help` + +## Architecture +Key directories: +- `src/deploydiff/` — Main package (CLI, diff engine, cost estimator, rollback generator) +- `tests/` — Test suite +- `.github/workflows/` — CI/CD (auto-code-review.yml, ci.yml, pages.yml, publish.yml) +- `dist/` — Built distributions + +## Conventions +- Language: Python 3.10+ +- Test framework: pytest +- CI: GitHub Actions (auto-code-review.yml, ci.yml, pages.yml, publish.yml) +- Linting: ruff +- Build system: setuptools +- Package layout: src/ layout +- Dependencies: click, rich, pyyaml, tomli, jinja2 +- CLI entry point: deploydiff.cli:cli +- Default branch: main \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 17077c0..b9e59fa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,8 @@ dependencies = [ "click>=8.1", "rich>=13.0", "pyyaml>=6.0", + "tomli>=2.0", + "jinja2>=3.1", ] keywords = ["infrastructure", "terraform", "cloudformation", "pulumi", "cost", "diff", "cli"] classifiers = [ diff --git a/tests/conftest.py b/tests/conftest.py index baf8023..38b2915 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,9 +1,10 @@ """Test configuration - mock license checks so tests run without a license.""" -import pytest import sys from unittest.mock import MagicMock +import pytest + # Replace revenueholdings_license with a mock BEFORE any src imports resolve it _mock_rl = MagicMock() _mock_rl.require_license = MagicMock(return_value=None)