aws-test-plugin 0.1.2__tar.gz → 0.1.3__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.
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/.claude-plugin/marketplace.json +1 -1
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/.claude-plugin/plugin.json +1 -1
- aws_test_plugin-0.1.3/.github/dependabot.yml +21 -0
- aws_test_plugin-0.1.3/.github/workflows/ci.yml +156 -0
- aws_test_plugin-0.1.3/.github/workflows/publish.yml +54 -0
- aws_test_plugin-0.1.3/CLAUDE.md +157 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/CONTRIBUTING.md +32 -4
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/PKG-INFO +19 -8
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/README.md +17 -6
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/pyproject.toml +15 -1
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-contract-testing/SKILL.md +1 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-e2e-testing/SKILL.md +1 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-integration-testing/SKILL.md +1 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-perf-load-testing/SKILL.md +1 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-test-orchestrator/SKILL.md +1 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-unit-testing/SKILL.md +1 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/uv.lock +146 -132
- aws_test_plugin-0.1.2/.github/workflows/ci.yml +0 -113
- aws_test_plugin-0.1.2/.github/workflows/publish.yml +0 -53
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/.gitattributes +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/.github/CODEOWNERS +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/.github/pull_request_template.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/.github/workflows/codeql.yml +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/.gitignore +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/.python-version +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/LICENSE +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/PLAN.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/agents/aws-test-engineer.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-contract-testing/references/openapi-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-e2e-testing/references/api-gateway-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-e2e-testing/references/batch-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-e2e-testing/references/step-function-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-integration-testing/references/lambda-dynamodb-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-integration-testing/references/lambda-eventbridge-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-integration-testing/references/lambda-kinesis-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-integration-testing/references/lambda-rds-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-integration-testing/references/lambda-s3-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-integration-testing/references/lambda-sns-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-integration-testing/references/lambda-sqs-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-perf-load-testing/references/benchmark-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-perf-load-testing/references/locust-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-test-orchestrator/references/secrets-and-config.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-unit-testing/references/boundary-branch-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/skills/aws-unit-testing/references/edge-case-patterns.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/src/aws_test_plugin/AGENTS.md +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/src/aws_test_plugin/__init__.py +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/src/aws_test_plugin/cli.py +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/src/aws_test_plugin/scripts/analyze_results.py +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/src/aws_test_plugin/scripts/run_tests.py +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/src/aws_test_plugin/scripts/scaffold.py +0 -0
- {aws_test_plugin-0.1.2 → aws_test_plugin-0.1.3}/tests/test_cli.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aws-test-plugin",
|
|
3
3
|
"description": "AI-powered test generation skills for AWS Python projects — Lambda, API Gateway, Step Functions, and Batch. Generates E2E, integration, contract, performance, and load tests by reading actual handler code.",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.3",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "whitewhiteqq"
|
|
7
7
|
},
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
|
|
3
|
+
updates:
|
|
4
|
+
- package-ecosystem: github-actions
|
|
5
|
+
directory: /
|
|
6
|
+
schedule:
|
|
7
|
+
interval: weekly
|
|
8
|
+
groups:
|
|
9
|
+
actions:
|
|
10
|
+
patterns:
|
|
11
|
+
- "*"
|
|
12
|
+
|
|
13
|
+
- package-ecosystem: uv
|
|
14
|
+
directory: /
|
|
15
|
+
schedule:
|
|
16
|
+
interval: weekly
|
|
17
|
+
groups:
|
|
18
|
+
dev-deps:
|
|
19
|
+
dependency-type: development
|
|
20
|
+
prod-deps:
|
|
21
|
+
dependency-type: production
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
- develop
|
|
8
|
+
push:
|
|
9
|
+
branches:
|
|
10
|
+
- '**'
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
lockfile:
|
|
17
|
+
name: Lockfile Check
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- name: Checkout
|
|
22
|
+
uses: actions/checkout@v4
|
|
23
|
+
|
|
24
|
+
- name: Set up uv
|
|
25
|
+
uses: astral-sh/setup-uv@v7
|
|
26
|
+
with:
|
|
27
|
+
enable-cache: true
|
|
28
|
+
|
|
29
|
+
- name: Verify lockfile is up-to-date
|
|
30
|
+
run: uv lock --check
|
|
31
|
+
|
|
32
|
+
test:
|
|
33
|
+
name: Test (Python ${{ matrix.python-version }})
|
|
34
|
+
needs: [lockfile]
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
strategy:
|
|
37
|
+
fail-fast: false
|
|
38
|
+
matrix:
|
|
39
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
40
|
+
|
|
41
|
+
steps:
|
|
42
|
+
- name: Checkout
|
|
43
|
+
uses: actions/checkout@v4
|
|
44
|
+
|
|
45
|
+
- name: Set up uv
|
|
46
|
+
uses: astral-sh/setup-uv@v7
|
|
47
|
+
with:
|
|
48
|
+
python-version: ${{ matrix.python-version }}
|
|
49
|
+
enable-cache: true
|
|
50
|
+
|
|
51
|
+
- name: Sync dependencies
|
|
52
|
+
run: uv sync --frozen
|
|
53
|
+
|
|
54
|
+
- name: Run tests
|
|
55
|
+
run: uv run pytest tests/ -v
|
|
56
|
+
|
|
57
|
+
lint:
|
|
58
|
+
name: Lint
|
|
59
|
+
needs: [lockfile]
|
|
60
|
+
runs-on: ubuntu-latest
|
|
61
|
+
|
|
62
|
+
steps:
|
|
63
|
+
- name: Checkout
|
|
64
|
+
uses: actions/checkout@v4
|
|
65
|
+
|
|
66
|
+
- name: Set up uv
|
|
67
|
+
uses: astral-sh/setup-uv@v7
|
|
68
|
+
with:
|
|
69
|
+
python-version: "3.12"
|
|
70
|
+
enable-cache: true
|
|
71
|
+
|
|
72
|
+
- name: Sync dependencies (no sdist builds)
|
|
73
|
+
run: uv sync --frozen --no-build --no-install-project
|
|
74
|
+
|
|
75
|
+
- name: Ruff check
|
|
76
|
+
run: uv run --no-sync ruff check src tests
|
|
77
|
+
|
|
78
|
+
- name: Ruff format check
|
|
79
|
+
run: uv run --no-sync ruff format --check src tests
|
|
80
|
+
|
|
81
|
+
typecheck:
|
|
82
|
+
name: Type Check
|
|
83
|
+
needs: [lockfile]
|
|
84
|
+
runs-on: ubuntu-latest
|
|
85
|
+
|
|
86
|
+
steps:
|
|
87
|
+
- name: Checkout
|
|
88
|
+
uses: actions/checkout@v4
|
|
89
|
+
|
|
90
|
+
- name: Set up uv
|
|
91
|
+
uses: astral-sh/setup-uv@v7
|
|
92
|
+
with:
|
|
93
|
+
python-version: "3.12"
|
|
94
|
+
enable-cache: true
|
|
95
|
+
|
|
96
|
+
- name: Sync dependencies (no sdist builds)
|
|
97
|
+
run: uv sync --frozen --no-build --no-install-project
|
|
98
|
+
|
|
99
|
+
- name: Run mypy
|
|
100
|
+
run: uv run --no-sync mypy src
|
|
101
|
+
|
|
102
|
+
security:
|
|
103
|
+
name: Security
|
|
104
|
+
needs: [lockfile]
|
|
105
|
+
runs-on: ubuntu-latest
|
|
106
|
+
|
|
107
|
+
steps:
|
|
108
|
+
- name: Checkout
|
|
109
|
+
uses: actions/checkout@v4
|
|
110
|
+
|
|
111
|
+
- name: Set up uv
|
|
112
|
+
uses: astral-sh/setup-uv@v7
|
|
113
|
+
with:
|
|
114
|
+
python-version: "3.12"
|
|
115
|
+
enable-cache: true
|
|
116
|
+
|
|
117
|
+
- name: Sync dependencies (no sdist builds)
|
|
118
|
+
run: uv sync --frozen --no-build --no-install-project
|
|
119
|
+
|
|
120
|
+
- name: Run Bandit
|
|
121
|
+
run: uv run --no-sync bandit -q -c pyproject.toml -r src
|
|
122
|
+
|
|
123
|
+
- name: Run pip-audit
|
|
124
|
+
run: |
|
|
125
|
+
# CVE-2026-4539: ReDoS in pygments AdlLexer (archetype.py).
|
|
126
|
+
# Local-access-only; no fix version exists yet; pygments is a
|
|
127
|
+
# transitive dep of bandit/rich and is not shipped to users.
|
|
128
|
+
# Remove this ignore once a patched pygments is released.
|
|
129
|
+
#
|
|
130
|
+
# CVE-2026-25645: requests 2.32.5 — blocked by exclude-newer
|
|
131
|
+
# cooldown; fix is in 2.33.0. requests is an optional e2e dep
|
|
132
|
+
# (not installed in default CI runs). Remove once 2.33.0 clears
|
|
133
|
+
# the 14-day window.
|
|
134
|
+
uv run --no-sync pip-audit --ignore-vuln CVE-2026-4539 --ignore-vuln CVE-2026-25645
|
|
135
|
+
|
|
136
|
+
typecheck-ty:
|
|
137
|
+
name: Type Check (ty)
|
|
138
|
+
needs: [lockfile]
|
|
139
|
+
runs-on: ubuntu-latest
|
|
140
|
+
continue-on-error: true # ty is non-blocking while stabilising; promote to blocking when mypy is removed
|
|
141
|
+
|
|
142
|
+
steps:
|
|
143
|
+
- name: Checkout
|
|
144
|
+
uses: actions/checkout@v4
|
|
145
|
+
|
|
146
|
+
- name: Set up uv
|
|
147
|
+
uses: astral-sh/setup-uv@v7
|
|
148
|
+
with:
|
|
149
|
+
python-version: "3.12"
|
|
150
|
+
enable-cache: true
|
|
151
|
+
|
|
152
|
+
- name: Sync dependencies (no sdist builds)
|
|
153
|
+
run: uv sync --frozen --no-build --no-install-project
|
|
154
|
+
|
|
155
|
+
- name: Run ty
|
|
156
|
+
run: uv run --no-sync ty check src
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
id-token: write # Required for trusted publishing
|
|
10
|
+
attestations: write # Required for build provenance
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
publish:
|
|
14
|
+
name: Build & Publish to PyPI
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
environment:
|
|
17
|
+
name: pypi
|
|
18
|
+
url: https://pypi.org/p/aws-test-plugin
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- name: Checkout
|
|
22
|
+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
23
|
+
|
|
24
|
+
- name: Verify tag matches package version
|
|
25
|
+
run: |
|
|
26
|
+
VERSION=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/')
|
|
27
|
+
TAG="${GITHUB_REF_NAME}"
|
|
28
|
+
if [ "v${VERSION}" != "${TAG}" ]; then
|
|
29
|
+
echo "::error::Tag '${TAG}' does not match package version 'v${VERSION}'"
|
|
30
|
+
exit 1
|
|
31
|
+
fi
|
|
32
|
+
echo "Tag '${TAG}' matches package version '${VERSION}' — proceeding"
|
|
33
|
+
|
|
34
|
+
- name: Set up uv
|
|
35
|
+
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
36
|
+
with:
|
|
37
|
+
python-version: "3.12"
|
|
38
|
+
|
|
39
|
+
- name: Build package
|
|
40
|
+
run: uv build
|
|
41
|
+
|
|
42
|
+
- name: Smoke test
|
|
43
|
+
run: |
|
|
44
|
+
WHEEL=$(ls dist/*.whl)
|
|
45
|
+
uv run --no-project --with "$WHEEL" -- python -c "import aws_test_plugin; print('Smoke test passed')"
|
|
46
|
+
|
|
47
|
+
- name: Attest build provenance
|
|
48
|
+
uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be # v2
|
|
49
|
+
with:
|
|
50
|
+
subject-path: dist/*
|
|
51
|
+
|
|
52
|
+
- name: Publish to PyPI
|
|
53
|
+
run: uv publish --trusted-publishing always
|
|
54
|
+
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# CLAUDE.md — Agent Instructions for aws-test-plugin
|
|
2
|
+
|
|
3
|
+
This file is read by Claude Code before any operation in this repository.
|
|
4
|
+
Follow all rules here in addition to the instructions in `src/aws_test_plugin/AGENTS.md`.
|
|
5
|
+
|
|
6
|
+
## Commands
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
# Sync dependencies (after cloning or pulling)
|
|
10
|
+
uv sync --locked
|
|
11
|
+
|
|
12
|
+
# Run all tests
|
|
13
|
+
uv run pytest tests/ -v
|
|
14
|
+
|
|
15
|
+
# Lint — check mode (CI)
|
|
16
|
+
uv run ruff check src tests
|
|
17
|
+
uv run ruff format --check src tests
|
|
18
|
+
|
|
19
|
+
# Lint — fix mode (local dev: always fix before format)
|
|
20
|
+
uv run ruff check --fix src tests
|
|
21
|
+
uv run ruff format src tests
|
|
22
|
+
|
|
23
|
+
# Type checking — ty is the primary checker (fast, replaces mypy)
|
|
24
|
+
uv run ty check src
|
|
25
|
+
|
|
26
|
+
# Type checking — mypy (secondary; kept for compatibility)
|
|
27
|
+
uv run mypy src
|
|
28
|
+
|
|
29
|
+
# Security scans
|
|
30
|
+
uv run bandit -q -c pyproject.toml -r src
|
|
31
|
+
# CVE-2026-4539: pygments ReDoS (local-only, no fix yet) — remove ignore once patched
|
|
32
|
+
# CVE-2026-25645: requests 2.32.5 — fix in 2.33.0, blocked by exclude-newer cooldown
|
|
33
|
+
uv run pip-audit --ignore-vuln CVE-2026-4539 --ignore-vuln CVE-2026-25645
|
|
34
|
+
|
|
35
|
+
# Verify lockfile is up to date (must pass before any commit)
|
|
36
|
+
uv lock --check
|
|
37
|
+
|
|
38
|
+
# Regenerate lockfile when pyproject.toml changes
|
|
39
|
+
uv lock
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Change Workflow
|
|
43
|
+
|
|
44
|
+
Every change, regardless of size, follows this sequence:
|
|
45
|
+
|
|
46
|
+
1. **Branch** — `git checkout -b feat/<name>` or `fix/<name>` from `develop`
|
|
47
|
+
2. **Implement** — make the change
|
|
48
|
+
3. **Docs review** — ask: does this change affect README.md, CONTRIBUTING.md, or CLAUDE.md?
|
|
49
|
+
- CI/CD changes → update CLAUDE.md (Commands section) if any command changes
|
|
50
|
+
- Dependency changes → update README.md and CONTRIBUTING.md if setup steps change
|
|
51
|
+
- Workflow/process changes → update CLAUDE.md (relevant section)
|
|
52
|
+
- `src/` public API changes → update README.md usage examples
|
|
53
|
+
4. **Version bump** — see Version Policy below
|
|
54
|
+
5. **Local checks** — must all pass before committing:
|
|
55
|
+
```bash
|
|
56
|
+
uv lock --check
|
|
57
|
+
uv run ruff check src tests
|
|
58
|
+
uv run ruff format --check src tests
|
|
59
|
+
uv run ty check src # or: uv run mypy src
|
|
60
|
+
uv run pytest tests/ -v
|
|
61
|
+
uv run bandit -q -c pyproject.toml -r src
|
|
62
|
+
uv run pip-audit --ignore-vuln CVE-2026-4539 --ignore-vuln CVE-2026-25645
|
|
63
|
+
```
|
|
64
|
+
6. **Commit** — conventional commit with full body for non-trivial changes
|
|
65
|
+
7. **PR → develop → main** — follow Branch Strategy below
|
|
66
|
+
|
|
67
|
+
## Version Policy
|
|
68
|
+
|
|
69
|
+
Bump the version in `pyproject.toml` (and run `uv lock`) only when the
|
|
70
|
+
**installed package changes**:
|
|
71
|
+
|
|
72
|
+
| Change type | Bump? |
|
|
73
|
+
|---|---|
|
|
74
|
+
| `src/aws_test_plugin/` code change | **Yes** |
|
|
75
|
+
| Runtime dep added/removed/changed (`[project.dependencies]`) | **Yes** |
|
|
76
|
+
| Dev dep change (`[dependency-groups] dev`) | No |
|
|
77
|
+
| CI/CD workflow change (`.github/`) | No |
|
|
78
|
+
| Docs only (`README.md`, `CONTRIBUTING.md`, `CLAUDE.md`) | No |
|
|
79
|
+
| Tool config (`[tool.ruff]`, `[tool.ty]`, etc.) | No |
|
|
80
|
+
| `skills/`, `agents/` content | No |
|
|
81
|
+
|
|
82
|
+
Version follows [Semantic Versioning](https://semver.org/):
|
|
83
|
+
- **patch** (0.1.x) — bug fixes, no API change
|
|
84
|
+
- **minor** (0.x.0) — new backward-compatible features
|
|
85
|
+
- **major** (x.0.0) — breaking changes
|
|
86
|
+
|
|
87
|
+
## Pre-Commit Enforcement
|
|
88
|
+
|
|
89
|
+
**Always run `uv lock --check` before committing.**
|
|
90
|
+
If it reports that `uv.lock` needs updating, run `uv lock` first, stage
|
|
91
|
+
`uv.lock`, and include it in the same commit as the `pyproject.toml` change.
|
|
92
|
+
|
|
93
|
+
Never commit a stale lockfile. The CI `lockfile` job runs `uv lock --check`
|
|
94
|
+
on every push and pull request; a stale lockfile will block the entire
|
|
95
|
+
pipeline.
|
|
96
|
+
|
|
97
|
+
Triggers that require `uv lock`:
|
|
98
|
+
- Any edit to `pyproject.toml` (adding, removing, or changing a dependency)
|
|
99
|
+
- Any uv or Python version bump
|
|
100
|
+
|
|
101
|
+
## Branch Strategy
|
|
102
|
+
|
|
103
|
+
Releases follow exactly one path:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
feature/fix branch → develop → main → annotated tag → GitHub Release → PyPI
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
- **Never push directly to `main` or `develop`.**
|
|
110
|
+
- Branch from `develop` for all changes: `git checkout -b feat/<name> origin/develop`
|
|
111
|
+
- Open a pull request targeting `develop`.
|
|
112
|
+
- Release promotion: maintainer runs `git merge --ff-only develop` from `main`
|
|
113
|
+
locally, then pushes. No GitHub merge button for main promotion.
|
|
114
|
+
- PyPI publish is triggered only by creating a GitHub Release targeting a
|
|
115
|
+
version tag on `main`.
|
|
116
|
+
|
|
117
|
+
## Commit Message Style
|
|
118
|
+
|
|
119
|
+
Use Conventional Commits. For non-trivial changes include the full body:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
type(scope): short imperative summary
|
|
123
|
+
|
|
124
|
+
INTENTION:
|
|
125
|
+
WHAT CHANGED:
|
|
126
|
+
WHY:
|
|
127
|
+
ALTERNATIVES CONSIDERED:
|
|
128
|
+
REFS:
|
|
129
|
+
VERIFIED:
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
See `CONTRIBUTING.md` for the full template and examples.
|
|
133
|
+
|
|
134
|
+
## Project Layout
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
aws-test-plugin/
|
|
138
|
+
├── CLAUDE.md # This file — agent instructions
|
|
139
|
+
├── CONTRIBUTING.md # Human + AI contributor guide
|
|
140
|
+
├── pyproject.toml # Project metadata and deps
|
|
141
|
+
├── uv.lock # Locked dependency graph (never stale)
|
|
142
|
+
├── skills/ # Skill definitions
|
|
143
|
+
├── agents/ # Agent definitions
|
|
144
|
+
├── src/aws_test_plugin/
|
|
145
|
+
│ ├── __init__.py
|
|
146
|
+
│ ├── cli.py
|
|
147
|
+
│ ├── AGENTS.md # Codex-compatible instructions
|
|
148
|
+
│ └── scripts/
|
|
149
|
+
└── tests/
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Safety
|
|
153
|
+
|
|
154
|
+
- Never run E2E or load tests against production without confirmation.
|
|
155
|
+
- Never hardcode secrets. Use `.env` (gitignored) or AWS Secrets Manager/SSM.
|
|
156
|
+
- All test data uses prefixes: `TEST-`, `E2E-TEST-`, `LOAD-TEST-`.
|
|
157
|
+
- Integration tests use moto — no real AWS calls.
|
|
@@ -12,7 +12,7 @@ cd aws-test-plugin
|
|
|
12
12
|
# macOS/Linux: curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
13
13
|
|
|
14
14
|
# Install with dev dependencies
|
|
15
|
-
uv sync
|
|
15
|
+
uv sync --locked
|
|
16
16
|
|
|
17
17
|
# Run tests
|
|
18
18
|
uv run pytest tests/ -v
|
|
@@ -21,18 +21,46 @@ uv run pytest tests/ -v
|
|
|
21
21
|
uv run ruff check src tests
|
|
22
22
|
uv run ruff format --check src tests
|
|
23
23
|
|
|
24
|
-
# Type checking
|
|
24
|
+
# Type checking — ty is the primary checker (fast, replaces mypy)
|
|
25
|
+
uv run ty check src
|
|
26
|
+
|
|
27
|
+
# Type checking — mypy (secondary; kept for compatibility)
|
|
25
28
|
uv run mypy src
|
|
26
29
|
|
|
27
30
|
# Security scans
|
|
28
31
|
uv run bandit -q -c pyproject.toml -r src
|
|
29
|
-
|
|
32
|
+
# CVE-2026-4539: pygments ReDoS (local-only, no fix yet) — remove ignore once patched
|
|
33
|
+
uv run pip-audit --ignore-vuln CVE-2026-4539
|
|
34
|
+
|
|
35
|
+
# Verify lockfile is up to date (must pass before any commit)
|
|
36
|
+
uv lock --check
|
|
37
|
+
|
|
38
|
+
# Regenerate lockfile when pyproject.toml changes
|
|
39
|
+
uv lock
|
|
30
40
|
```
|
|
31
41
|
|
|
42
|
+
## Lockfile Discipline
|
|
43
|
+
|
|
44
|
+
`uv.lock` must never be stale in the repository. The CI `lockfile` job runs
|
|
45
|
+
`uv lock --check` on every push and pull request; a stale lockfile fails the
|
|
46
|
+
entire pipeline before any test or lint job runs.
|
|
47
|
+
|
|
48
|
+
**Rule: run `uv lock --check` before every commit. If it reports the lockfile
|
|
49
|
+
needs updating, run `uv lock`, stage `uv.lock`, and include it in the same
|
|
50
|
+
commit as the `pyproject.toml` change.**
|
|
51
|
+
|
|
52
|
+
Triggers that require `uv lock`:
|
|
53
|
+
- Any edit to `pyproject.toml` (adding, removing, or bumping a dependency)
|
|
54
|
+
- Any change to the `requires-python` field or Python version target
|
|
55
|
+
- Pulling changes from `origin` that modify `pyproject.toml`
|
|
56
|
+
|
|
32
57
|
## Project Structure
|
|
33
58
|
|
|
34
59
|
```
|
|
35
60
|
aws-test-plugin/
|
|
61
|
+
├── CLAUDE.md # Agent instructions (Claude Code / Copilot)
|
|
62
|
+
├── pyproject.toml # Project metadata and deps
|
|
63
|
+
├── uv.lock # Locked dependency graph (never stale)
|
|
36
64
|
├── skills/ # Skill definitions (auto-discovered by npx skills add)
|
|
37
65
|
│ ├── aws-test-orchestrator/SKILL.md
|
|
38
66
|
│ ├── aws-e2e-testing/ # SKILL.md + references/
|
|
@@ -263,7 +291,7 @@ must also land in the commit messages that enter `develop`.
|
|
|
263
291
|
2. Create a feature branch from `develop`: `git checkout -b feat/new-pattern origin/develop`
|
|
264
292
|
3. Make your changes
|
|
265
293
|
4. Rebase your branch on the latest `origin/develop` before opening or updating the pull request
|
|
266
|
-
5. Run local quality checks: `uv run pytest tests/ -v`, `uv run ruff check src tests`, `uv run ruff format --check src tests`, `uv run mypy src`, `uv run bandit -q -c pyproject.toml -r src`, and `uv run pip-audit`
|
|
294
|
+
5. Run local quality checks: `uv lock --check` (regenerate with `uv lock` if stale), `uv run pytest tests/ -v`, `uv run ruff check src tests`, `uv run ruff format --check src tests`, `uv run mypy src`, `uv run bandit -q -c pyproject.toml -r src`, and `uv run pip-audit`
|
|
267
295
|
6. Submit a pull request to `develop` using `.github/pull_request_template.md`
|
|
268
296
|
7. Merge pull requests with `Rebase and merge` (preferred — preserves individual commit reasoning) or `Squash and merge` (only when intermediate commits are noise); do not use merge commits
|
|
269
297
|
8. Release `develop` to `main` with a maintainer-run fast-forward update after CI passes on `develop`; use `git merge --ff-only develop` from a local checkout of `main` so `main` advances without rewriting or duplicating commit history
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: aws-test-plugin
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.3
|
|
4
4
|
Summary: AI-powered test generation skills for AWS Python projects — works with Claude Code, GitHub Copilot, and Codex
|
|
5
5
|
Project-URL: Homepage, https://github.com/whitewhiteqq/aws-test-plugin
|
|
6
6
|
Project-URL: Repository, https://github.com/whitewhiteqq/aws-test-plugin
|
|
@@ -265,7 +265,9 @@ This plugin doesn't fill in templates — it reads your **actual code** and gene
|
|
|
265
265
|
aws-test-plugin/
|
|
266
266
|
├── .claude-plugin/
|
|
267
267
|
│ └── plugin.json # Claude Code plugin manifest
|
|
268
|
+
├── CLAUDE.md # Agent instructions (Claude Code / Copilot)
|
|
268
269
|
├── pyproject.toml # uv/pip package config
|
|
270
|
+
├── uv.lock # Locked dependency graph (never stale)
|
|
269
271
|
├── LICENSE # Apache 2.0
|
|
270
272
|
├── README.md
|
|
271
273
|
├── CONTRIBUTING.md
|
|
@@ -306,21 +308,30 @@ git clone https://github.com/whitewhiteqq/aws-test-plugin.git
|
|
|
306
308
|
cd aws-test-plugin
|
|
307
309
|
|
|
308
310
|
# Install with uv (creates .venv automatically)
|
|
309
|
-
uv sync
|
|
311
|
+
uv sync --locked
|
|
310
312
|
|
|
311
313
|
# Run tests
|
|
312
314
|
uv run pytest tests/ -v
|
|
313
315
|
|
|
314
316
|
# Lint
|
|
315
|
-
uv run ruff check src
|
|
316
|
-
uv run ruff format --check src
|
|
317
|
+
uv run ruff check src tests
|
|
318
|
+
uv run ruff format --check src tests
|
|
317
319
|
|
|
318
|
-
# Type checking
|
|
319
|
-
uv run
|
|
320
|
+
# Type checking — ty is the primary checker (fast, replaces mypy)
|
|
321
|
+
uv run ty check src
|
|
322
|
+
|
|
323
|
+
# Type checking — mypy (secondary; kept for compatibility)
|
|
324
|
+
uv run mypy src
|
|
320
325
|
|
|
321
326
|
# Security scans
|
|
322
|
-
uv run bandit -q -c pyproject.toml -r src
|
|
327
|
+
uv run bandit -q -c pyproject.toml -r src
|
|
323
328
|
uv run pip-audit
|
|
329
|
+
|
|
330
|
+
# Verify lockfile is up to date (must pass before any commit)
|
|
331
|
+
uv lock --check
|
|
332
|
+
|
|
333
|
+
# Regenerate lockfile when pyproject.toml changes
|
|
334
|
+
uv lock
|
|
324
335
|
```
|
|
325
336
|
|
|
326
337
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
|
@@ -203,7 +203,9 @@ This plugin doesn't fill in templates — it reads your **actual code** and gene
|
|
|
203
203
|
aws-test-plugin/
|
|
204
204
|
├── .claude-plugin/
|
|
205
205
|
│ └── plugin.json # Claude Code plugin manifest
|
|
206
|
+
├── CLAUDE.md # Agent instructions (Claude Code / Copilot)
|
|
206
207
|
├── pyproject.toml # uv/pip package config
|
|
208
|
+
├── uv.lock # Locked dependency graph (never stale)
|
|
207
209
|
├── LICENSE # Apache 2.0
|
|
208
210
|
├── README.md
|
|
209
211
|
├── CONTRIBUTING.md
|
|
@@ -244,21 +246,30 @@ git clone https://github.com/whitewhiteqq/aws-test-plugin.git
|
|
|
244
246
|
cd aws-test-plugin
|
|
245
247
|
|
|
246
248
|
# Install with uv (creates .venv automatically)
|
|
247
|
-
uv sync
|
|
249
|
+
uv sync --locked
|
|
248
250
|
|
|
249
251
|
# Run tests
|
|
250
252
|
uv run pytest tests/ -v
|
|
251
253
|
|
|
252
254
|
# Lint
|
|
253
|
-
uv run ruff check src
|
|
254
|
-
uv run ruff format --check src
|
|
255
|
+
uv run ruff check src tests
|
|
256
|
+
uv run ruff format --check src tests
|
|
255
257
|
|
|
256
|
-
# Type checking
|
|
257
|
-
uv run
|
|
258
|
+
# Type checking — ty is the primary checker (fast, replaces mypy)
|
|
259
|
+
uv run ty check src
|
|
260
|
+
|
|
261
|
+
# Type checking — mypy (secondary; kept for compatibility)
|
|
262
|
+
uv run mypy src
|
|
258
263
|
|
|
259
264
|
# Security scans
|
|
260
|
-
uv run bandit -q -c pyproject.toml -r src
|
|
265
|
+
uv run bandit -q -c pyproject.toml -r src
|
|
261
266
|
uv run pip-audit
|
|
267
|
+
|
|
268
|
+
# Verify lockfile is up to date (must pass before any commit)
|
|
269
|
+
uv lock --check
|
|
270
|
+
|
|
271
|
+
# Regenerate lockfile when pyproject.toml changes
|
|
272
|
+
uv lock
|
|
262
273
|
```
|
|
263
274
|
|
|
264
275
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "aws-test-plugin"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.3"
|
|
4
4
|
description = "AI-powered test generation skills for AWS Python projects — works with Claude Code, GitHub Copilot, and Codex"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -84,6 +84,9 @@ Issues = "https://github.com/whitewhiteqq/aws-test-plugin/issues"
|
|
|
84
84
|
requires = ["hatchling"]
|
|
85
85
|
build-backend = "hatchling.build"
|
|
86
86
|
|
|
87
|
+
[tool.uv]
|
|
88
|
+
exclude-newer = "14 days"
|
|
89
|
+
|
|
87
90
|
[tool.hatch.build.targets.wheel]
|
|
88
91
|
packages = ["src/aws_test_plugin"]
|
|
89
92
|
|
|
@@ -110,6 +113,16 @@ warn_unused_configs = true
|
|
|
110
113
|
show_error_codes = true
|
|
111
114
|
pretty = true
|
|
112
115
|
|
|
116
|
+
[tool.ty.environment]
|
|
117
|
+
python-version = "3.12"
|
|
118
|
+
|
|
119
|
+
[tool.ty.src]
|
|
120
|
+
include = ["src/**/*.py"]
|
|
121
|
+
|
|
122
|
+
[tool.ty.rules]
|
|
123
|
+
# Promoted to error once ty reaches feature parity with mypy
|
|
124
|
+
possibly-unresolved-reference = "warn"
|
|
125
|
+
|
|
113
126
|
[tool.pytest.ini_options]
|
|
114
127
|
testpaths = ["tests"]
|
|
115
128
|
pythonpath = ["src"]
|
|
@@ -128,6 +141,7 @@ dev = [
|
|
|
128
141
|
"pytest-cov>=5.0",
|
|
129
142
|
"ruff>=0.4.0",
|
|
130
143
|
"mypy>=1.0",
|
|
144
|
+
"ty>=0.0.0a1",
|
|
131
145
|
"types-defusedxml",
|
|
132
146
|
"bandit[toml]>=1.7.9",
|
|
133
147
|
"pip-audit>=2.8.0",
|