aepkit 0.6.0__tar.gz → 0.7.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.
- {aepkit-0.6.0 → aepkit-0.7.1}/CHANGELOG.md +78 -9
- {aepkit-0.6.0/src/aepkit.egg-info → aepkit-0.7.1}/PKG-INFO +26 -12
- {aepkit-0.6.0 → aepkit-0.7.1}/README.md +21 -8
- {aepkit-0.6.0 → aepkit-0.7.1}/SKILL.md +13 -7
- {aepkit-0.6.0 → aepkit-0.7.1}/pyproject.toml +9 -4
- {aepkit-0.6.0/src/aepkit/skill → aepkit-0.7.1}/references/autonomous-mode.md +5 -1
- {aepkit-0.6.0/src/aepkit/skill → aepkit-0.7.1}/references/failure-modes-and-example.md +1 -1
- {aepkit-0.6.0/src/aepkit/skill → aepkit-0.7.1}/references/handoffs.md +10 -1
- aepkit-0.7.1/src/aepkit/__init__.py +1 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/cli.py +17 -7
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/install_skill.py +1 -1
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/lint.py +26 -19
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/negcontrol.py +23 -6
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/scaffold.py +4 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/skill/SKILL.md +13 -7
- {aepkit-0.6.0 → aepkit-0.7.1/src/aepkit/skill}/references/autonomous-mode.md +5 -1
- {aepkit-0.6.0 → aepkit-0.7.1/src/aepkit/skill}/references/failure-modes-and-example.md +1 -1
- {aepkit-0.6.0 → aepkit-0.7.1/src/aepkit/skill}/references/handoffs.md +10 -1
- aepkit-0.7.1/src/aepkit/status.py +314 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/templates/execution-guide.md +6 -3
- {aepkit-0.6.0 → aepkit-0.7.1/src/aepkit.egg-info}/PKG-INFO +26 -12
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit.egg-info/requires.txt +4 -3
- {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_install_skill.py +39 -40
- {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_lint.py +87 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_negcontrol.py +42 -1
- {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_scaffold.py +8 -0
- aepkit-0.7.1/tests/test_status.py +322 -0
- aepkit-0.6.0/src/aepkit/__init__.py +0 -1
- aepkit-0.6.0/src/aepkit/status.py +0 -122
- aepkit-0.6.0/tests/test_status.py +0 -112
- {aepkit-0.6.0 → aepkit-0.7.1}/LICENSE +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/MANIFEST.in +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/references/tasks-and-gates.md +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/setup.cfg +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/__main__.py +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/py.typed +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/skill/references/tasks-and-gates.md +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/templates/compliance-log.md +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/templates/plan-of-record.md +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit.egg-info/SOURCES.txt +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit.egg-info/dependency_links.txt +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit.egg-info/entry_points.txt +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit.egg-info/top_level.txt +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/tests/run.py +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_cli.py +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_readme_claims.py +0 -0
- {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_skill_sync.py +0 -0
|
@@ -7,6 +7,49 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.7.1] - 2026-11-08
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- `references/handoffs.md`: an optional `Load: docs-only` line in the handoff template, for
|
|
14
|
+
runs where a tool holds back Executor launches while the machine is busy. It marks a task
|
|
15
|
+
that builds nothing, so it may run beside one that builds; a handoff without it counts as
|
|
16
|
+
a build. The protocol does not require it.
|
|
17
|
+
- `aeprogress` 0.2.0 (`integrations/claude-code/aeprogress/`): a launch limit that, while a
|
|
18
|
+
run is found, refuses launching another Executor past 2 live workers, 1 building worker,
|
|
19
|
+
or a machine more than 75% busy for a build (each a `/config` option), with the reason in
|
|
20
|
+
the refusal. It sees Claude Code subagents whose prompt names a task of the run, and Orca
|
|
21
|
+
`worker-start` and `send` to a dispatch that is not live; it counts both together, and
|
|
22
|
+
refuses when Orca cannot be asked. The pane shows the machine's load (Linux `/proc`,
|
|
23
|
+
macOS and BSD `sysctl`, Windows PowerShell) and how full the limit is. On macOS, when
|
|
24
|
+
Spotlight's indexing stays busy, it recommends excluding the project folder in System
|
|
25
|
+
Settings; it never changes a setting.
|
|
26
|
+
- `aeprogress`: Windows fallbacks for finding aepkit (`python -m`, `py -m`,
|
|
27
|
+
`%USERPROFILE%\.local\bin`).
|
|
28
|
+
|
|
29
|
+
## [0.7.0] - 2026-11-08
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
- `aepkit status --json` prints the status reading as one JSON object: each ID with its
|
|
33
|
+
phase, kind, effective state, verdict, latest report, executor (a status board column
|
|
34
|
+
named `Executor`, `Worker`, `Agent`, `Owner` or `Assignee`) and any board/header
|
|
35
|
+
conflict; the phases with their titles from `execution-guide.md` and the plan's phase
|
|
36
|
+
table, an optional `Weight` column, and phases the guide has not broken down; IDs the
|
|
37
|
+
guide lists that the log has no entry for yet, marked `inLog: false`. The text output
|
|
38
|
+
is unchanged.
|
|
39
|
+
- `aeprogress`, an optional Claude Code mod in `integrations/claude-code/aeprogress/`:
|
|
40
|
+
a pane with the run's progress per phase, who is working on which ID (Claude Code
|
|
41
|
+
subagents, Orca workers, or any harness through a command), what awaits audit and what
|
|
42
|
+
needs attention, opened with `/aeprogress`. `.claude-plugin/marketplace.json` makes the
|
|
43
|
+
repository installable with
|
|
44
|
+
`/plugin install aeprogress --marketplace tBeltty/auditor-executor-protocol`.
|
|
45
|
+
|
|
46
|
+
### Fixed
|
|
47
|
+
- `SKILL.md`, `references/handoffs.md`, `references/autonomous-mode.md` and
|
|
48
|
+
`references/failure-modes-and-example.md` spoke of "a plain `PASS`" on one task. `PASS`
|
|
49
|
+
is not a verdict (the verdicts are `APPROVED`, `CONDITIONAL` and `REJECTED`), and a log
|
|
50
|
+
that used it showed the task as awaiting audit in `aepkit status`. The four sentences
|
|
51
|
+
now say `APPROVED`.
|
|
52
|
+
|
|
10
53
|
## [0.6.0] - 2026-10-24
|
|
11
54
|
|
|
12
55
|
### Added
|
|
@@ -29,6 +72,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
29
72
|
(`pipx install aepkit`, `aepkit`, `python -m aepkit`) to eliminate naming collisions with
|
|
30
73
|
external `auditkit` packages and binaries.
|
|
31
74
|
|
|
75
|
+
## [0.5.1] - 2026-10-04
|
|
76
|
+
|
|
77
|
+
### Fixed
|
|
78
|
+
- `negcontrol --file` without `--break-cmd` is now a usage error (exit 2). The backup was taken
|
|
79
|
+
of a file already broken by hand, so a correct `--restore-cmd` was overwritten with the broken
|
|
80
|
+
copy and blamed for it.
|
|
81
|
+
- `negcontrol` fails the control when the test times out with the protection removed: a hang is
|
|
82
|
+
not a caught break. It used to print `OK` with a warning.
|
|
83
|
+
- `negcontrol --file <directory>` and `auditkit init <existing file>` print an error and exit 2
|
|
84
|
+
instead of crashing with a traceback.
|
|
85
|
+
- The execution guide's reporting format puts the verify output in a fenced block, so a report
|
|
86
|
+
written as the template shows no longer fails `lint`.
|
|
87
|
+
- `lint` no longer cuts a report short at a `#`, `---` or `**Field:**` line inside pasted output.
|
|
88
|
+
- `lint`'s phase-order check reads verdicts the way `status` does: the latest report header wins,
|
|
89
|
+
and a status board verdict that disagrees with it is a conflict, not an approval.
|
|
90
|
+
- `install-skill` auto-detects Claude Code through `CLAUDECODE`, the variable Claude Code sets.
|
|
91
|
+
- The install-skill tests no longer depend on the agent environment they run in.
|
|
92
|
+
|
|
93
|
+
### Changed
|
|
94
|
+
- The release workflow runs the full CI before building and publishing.
|
|
95
|
+
- CI pins ruff, mypy, build and twine through the `dev` extra, and smoke-tests the built wheel in
|
|
96
|
+
a clean environment.
|
|
97
|
+
- README links are absolute, so they work on PyPI; `auditkit --help` and the installed skill
|
|
98
|
+
link to GitHub instead of "the repo root".
|
|
99
|
+
- `--annex-threshold` is documented as a total with a per-phase breakdown, which is what it
|
|
100
|
+
checks.
|
|
101
|
+
- `SECURITY.md` lists 0.5.x as supported; `CONTRIBUTING.md` documents the release steps.
|
|
102
|
+
|
|
32
103
|
## [0.5.0] - 2026-10-02
|
|
33
104
|
|
|
34
105
|
### Added
|
|
@@ -85,9 +156,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
85
156
|
requires Python 3.11+.
|
|
86
157
|
|
|
87
158
|
### Fixed
|
|
88
|
-
- `AGENTS.md` imported itself and said nothing, because `GEMINI.md` was a symlink to it. It is
|
|
89
|
-
now a short, generic agent guide that points to `CONTRIBUTING.md`; tool-specific instruction
|
|
90
|
-
files (`CLAUDE.md`, `GEMINI.md`) are no longer tracked.
|
|
91
159
|
- README: the compliance log template, `install-skill` detection and `--global`/`--dest`, every
|
|
92
160
|
command's options, exit codes, and the BSD-only `sed -i ''` in the `negcontrol` example now match
|
|
93
161
|
the CLI.
|
|
@@ -193,7 +261,7 @@ Fixes from an independent review of 0.3.0.
|
|
|
193
261
|
field is missing, empty, or only a template placeholder. The protocol already records
|
|
194
262
|
these as `FAILED`; the check makes that mechanical.
|
|
195
263
|
- README: install `auditkit` without cloning via `pipx install git+https://github.com/tBeltty/auditor-executor-protocol`.
|
|
196
|
-
- Conventional Commits specification documented in `CONTRIBUTING.md
|
|
264
|
+
- Conventional Commits specification documented in `CONTRIBUTING.md`.
|
|
197
265
|
- `SKILL.md`: optional Guided/Autonomous operating mode, with the autonomy charter, per-task
|
|
198
266
|
model-tier assignment, the per-task cycle, and an Auditor-brief template for starting an
|
|
199
267
|
autonomous run.
|
|
@@ -218,8 +286,6 @@ Fixes from an independent review of 0.3.0.
|
|
|
218
286
|
- `auditkit install-skill` copies `references/` beside `SKILL.md`. Destinations that hold a
|
|
219
287
|
single file (Cursor `.mdc`, or a `--dest` not named `SKILL.md`) get one bundled file.
|
|
220
288
|
- The packaged skill moved from `src/auditkit/templates/SKILL.md` to `src/auditkit/skill/`.
|
|
221
|
-
- `GEMINI.md` imports `AGENTS.md` instead of duplicating it, so the agent rules have one
|
|
222
|
-
source of truth.
|
|
223
289
|
- Bumped `actions/checkout` and `actions/setup-python` to v7 in GitHub Actions CI workflow.
|
|
224
290
|
- Configured grouped updates in `.github/dependabot.yml` to bundle action and pip dependency bumps.
|
|
225
291
|
|
|
@@ -250,7 +316,6 @@ Fixes from an independent review of 0.3.0.
|
|
|
250
316
|
- 90%+ test coverage enforcement across the repository.
|
|
251
317
|
- GitHub Actions CI workflow hardening: explicit token permissions, dedicated lint/format/typecheck job, package distribution verification, and weekly Dependabot configuration.
|
|
252
318
|
- Open-source governance files: `SECURITY.md`, `CONTRIBUTING.md`, `CHANGELOG.md`, PR and issue templates.
|
|
253
|
-
- Agent rule specifications (`AGENTS.md`, `GEMINI.md`) establishing mandatory changelog updates and test verification gates on every task.
|
|
254
319
|
|
|
255
320
|
### Changed
|
|
256
321
|
- Conformed all Python code to Ruff formatting and PEP 8 import conventions.
|
|
@@ -269,8 +334,11 @@ Fixes from an independent review of 0.3.0.
|
|
|
269
334
|
- Multi-framework agent installation support for Antigravity, Claude Code, and Cursor.
|
|
270
335
|
- Zero-dependency test runner (`tests/run.py`).
|
|
271
336
|
|
|
272
|
-
[Unreleased]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.
|
|
273
|
-
[0.
|
|
337
|
+
[Unreleased]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.7.1...HEAD
|
|
338
|
+
[0.7.1]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.7.0...v0.7.1
|
|
339
|
+
[0.7.0]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.6.0...v0.7.0
|
|
340
|
+
[0.6.0]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.5.1...v0.6.0
|
|
341
|
+
[0.5.1]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.5.0...v0.5.1
|
|
274
342
|
[0.5.0]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.4.0...v0.5.0
|
|
275
343
|
[0.4.0]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.3.9...v0.4.0
|
|
276
344
|
[0.3.9]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.3.8...v0.3.9
|
|
@@ -284,3 +352,4 @@ Fixes from an independent review of 0.3.0.
|
|
|
284
352
|
[0.3.1]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.3.0...v0.3.1
|
|
285
353
|
[0.3.0]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.2.0...v0.3.0
|
|
286
354
|
[0.2.0]: https://github.com/tBeltty/auditor-executor-protocol/releases/tag/v0.2.0
|
|
355
|
+
[0.1.0]: https://github.com/tBeltty/auditor-executor-protocol/tree/7e9701cdacf732fa63b28428eedd9dcc7250fa2f
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aepkit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.1
|
|
4
4
|
Summary: Mechanical support for the Auditor/Executor protocol: scaffold, lint, and negative-control the document set for a multi-phase, multi-agent execution.
|
|
5
5
|
Author-email: tBeltty <jhonatan@tbelt.online>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -30,9 +30,10 @@ Requires-Dist: pytest-cov>=4.0; extra == "test"
|
|
|
30
30
|
Provides-Extra: dev
|
|
31
31
|
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
32
32
|
Requires-Dist: pytest-cov>=4.0; extra == "dev"
|
|
33
|
-
Requires-Dist: ruff
|
|
34
|
-
Requires-Dist: mypy
|
|
35
|
-
Requires-Dist: build
|
|
33
|
+
Requires-Dist: ruff==0.16.10; extra == "dev"
|
|
34
|
+
Requires-Dist: mypy==2.4.0; extra == "dev"
|
|
35
|
+
Requires-Dist: build==1.6.1; extra == "dev"
|
|
36
|
+
Requires-Dist: twine==7.0.0; extra == "dev"
|
|
36
37
|
Dynamic: license-file
|
|
37
38
|
|
|
38
39
|
# Auditor/Executor Protocol
|
|
@@ -43,13 +44,13 @@ Dynamic: license-file
|
|
|
43
44
|
[](https://opensource.org/licenses/MIT)
|
|
44
45
|
[](https://github.com/astral-sh/ruff)
|
|
45
46
|
[](https://mypy-lang.org/)
|
|
46
|
-
[](pyproject.toml)
|
|
47
|
+
[](https://github.com/tBeltty/auditor-executor-protocol/blob/main/pyproject.toml)
|
|
47
48
|
|
|
48
49
|
A two-role protocol for running multi-phase work through AI agents without the plan drifting into open-ended discussion and without "all tests pass" masquerading as verification.
|
|
49
50
|
|
|
50
51
|
The **Auditor** defines what "done" means and proves it independently. The **Executor** implements one numbered task at a time and logs command output. Neither role crosses into the other.
|
|
51
52
|
|
|
52
|
-
[`SKILL.md`](SKILL.md) specifies the protocol core; [`references/`](references
|
|
53
|
+
[`SKILL.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/SKILL.md) specifies the protocol core; [`references/`](https://github.com/tBeltty/auditor-executor-protocol/tree/main/references) holds the parts an agent loads only when it reaches that step (task and gate writing, handoff templates, Autonomous mode, failure modes and a worked example). `aepkit` is a zero-dependency Python CLI that automates scaffolding, drift linting, negative controls, status tallies, and installing the skill into your agent.
|
|
53
54
|
|
|
54
55
|
---
|
|
55
56
|
|
|
@@ -147,13 +148,15 @@ Inspect open tasks and tallied verdicts:
|
|
|
147
148
|
aepkit status docs/<task-name>
|
|
148
149
|
```
|
|
149
150
|
|
|
151
|
+
`aepkit status --json docs/<task-name>` prints the same reading as JSON, with each ID's phase, effective state and executor, and the phases with their titles from `execution-guide.md` (and weights from an optional `Weight` column in the plan's phase table), for scripts and tools to use instead of parsing the log.
|
|
152
|
+
|
|
150
153
|
Cross-check document consistency:
|
|
151
154
|
|
|
152
155
|
```bash
|
|
153
156
|
aepkit lint docs/<task-name>
|
|
154
157
|
```
|
|
155
158
|
|
|
156
|
-
`aepkit lint` catches an empty guide, tasks without a report line, missing report entries, log entries with no matching task, `DONE` reports whose verify output is not pasted in a code block, gates without a stated negative control (hypothetical or waived ones do not count), work reported in a phase before every earlier phase is `APPROVED`, unfilled opportunity/shaping/non-goal fields in `plan-of-record.md` once work is reported `DONE` or audited, open rows in the deferred items ledger for a phase being closed, duplicated log paragraphs, and annex buildup past `--annex-threshold` (default 6,
|
|
159
|
+
`aepkit lint` catches an empty guide, tasks without a report line, missing report entries, log entries with no matching task, `DONE` reports whose verify output is not pasted in a code block, gates without a stated negative control (hypothetical or waived ones do not count), work reported in a phase before every earlier phase is `APPROVED`, unfilled opportunity/shaping/non-goal fields in `plan-of-record.md` once work is reported `DONE` or audited, open rows in the deferred items ledger for a phase being closed, duplicated log paragraphs, and annex buildup past `--annex-threshold` (default 6 in total, with a per-phase breakdown). It checks that evidence is present and in the right form, not that it is genuine; the Auditor's re-run does that.
|
|
157
160
|
|
|
158
161
|
### 5. Run a Negative Control
|
|
159
162
|
|
|
@@ -169,9 +172,20 @@ aepkit negcontrol \
|
|
|
169
172
|
|
|
170
173
|
The `sed -i ''` form above is BSD/macOS sed; on GNU/Linux use `sed -i 's/.../.../' file`.
|
|
171
174
|
|
|
172
|
-
`negcontrol` backs up the target file, applies the break mutation, confirms the test fails, restores the file with byte-level verification, confirms the test passes, and outputs a transcript ready for `compliance-log.md`. Without `--file`, pass `--restore-cmd` to undo the break yourself; with both, the backup still wins if the file is not byte-identical afterwards. `--timeout` limits each command in seconds.
|
|
175
|
+
`negcontrol` backs up the target file, applies the break mutation, confirms the test fails, restores the file with byte-level verification, confirms the test passes, and outputs a transcript ready for `compliance-log.md`. Without `--file`, pass `--restore-cmd` to undo the break yourself; with both, the backup still wins if the file is not byte-identical afterwards. `--file` needs `--break-cmd`, because the backup must be taken before the break. `--timeout` limits each command in seconds, and a test that times out instead of failing fails the control: a hang is not a caught break.
|
|
176
|
+
|
|
177
|
+
A failure only proves something if it is the failure you meant. A syntax error, a missing import or a mistyped test command also makes the test exit non-zero. `--expect` takes a regular expression that the failing run's output must match, and the control fails if it does not. Without `--expect`, output that looks like a syntax, import, collection or command-not-found error is flagged with a `WARNING` next to the `OK`, and you need to read the transcript to confirm the reason.
|
|
178
|
+
|
|
179
|
+
### Optional: Progress Pane for Claude Code
|
|
180
|
+
|
|
181
|
+
`aeprogress` is a Claude Code mod that keeps a pane beside the chat with the run's overall percentage, a bar per phase, who is working on which task ID (Claude Code subagents, Orca workers, or any other harness through a command of your own), what awaits audit, what needs attention, and the machine's load. It reads the log through `aepkit status --json` and refreshes after each turn, and every 20 seconds while the pane is open. While a run is found it also holds back launching another Executor past a worker count or a machine load (2 workers, 1 building, 75% busy by default; a handoff marked `Load: docs-only` does not count as a build), and on macOS it recommends excluding the project from Spotlight when indexing keeps the machine busy. The protocol does not depend on it.
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
/plugin install aeprogress --marketplace tBeltty/auditor-executor-protocol
|
|
185
|
+
/aeprogress docs/<task-name>
|
|
186
|
+
```
|
|
173
187
|
|
|
174
|
-
|
|
188
|
+
It works in the terminal and in the desktop app's local sessions. Claude Code's mod API is early access, so a Claude Code release can break it. Setup, options and how the percentage is computed: [integrations/claude-code/aeprogress](https://github.com/tBeltty/auditor-executor-protocol/tree/main/integrations/claude-code/aeprogress).
|
|
175
189
|
|
|
176
190
|
---
|
|
177
191
|
|
|
@@ -183,7 +197,7 @@ A failure only proves something if it is the failure you meant. A syntax error,
|
|
|
183
197
|
| `aepkit install-skill [dir]` | `--agent`, `--global`, `--dest`, `--force` | Provision `SKILL.md` and `references/` into Antigravity, Claude Code, or Cursor |
|
|
184
198
|
| `aepkit lint <dir>` | `--annex-threshold` | Cross-check IDs both ways, flag `DONE` without evidence, detect missing negative controls, and flag log rot |
|
|
185
199
|
| `aepkit negcontrol` | `--test-cmd` (required), `--file`, `--break-cmd`, `--restore-cmd`, `--expect`, `--timeout` | Run automated backup, break, fail, restore, and pass cycle |
|
|
186
|
-
| `aepkit status <dir>` | | Combine status board verdicts with reports; list everything not `APPROVED` |
|
|
200
|
+
| `aepkit status <dir>` | `--json` | Combine status board verdicts with reports; list everything not `APPROVED` |
|
|
187
201
|
|
|
188
202
|
`python -m aepkit` works the same as `aepkit`. Errors go to stderr.
|
|
189
203
|
|
|
@@ -212,11 +226,11 @@ pytest
|
|
|
212
226
|
|
|
213
227
|
## Contributing
|
|
214
228
|
|
|
215
|
-
Contributions are welcome. [`CONTRIBUTING.md`](CONTRIBUTING.md) covers the development setup, the quality gates, and the PR checklist; participation follows the [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md). Report vulnerabilities privately as described in [`SECURITY.md`](SECURITY.md). Changes are listed in [`CHANGELOG.md`](CHANGELOG.md).
|
|
229
|
+
Contributions are welcome. [`CONTRIBUTING.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/CONTRIBUTING.md) covers the development setup, the quality gates, and the PR checklist; participation follows the [`CODE_OF_CONDUCT.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/CODE_OF_CONDUCT.md). Report vulnerabilities privately as described in [`SECURITY.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/SECURITY.md). Changes are listed in [`CHANGELOG.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/CHANGELOG.md).
|
|
216
230
|
|
|
217
231
|
## License
|
|
218
232
|
|
|
219
|
-
MIT (see [`LICENSE`](LICENSE)).
|
|
233
|
+
MIT (see [`LICENSE`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/LICENSE)).
|
|
220
234
|
|
|
221
235
|
---
|
|
222
236
|
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
[](https://github.com/astral-sh/ruff)
|
|
8
8
|
[](https://mypy-lang.org/)
|
|
9
|
-
[](pyproject.toml)
|
|
9
|
+
[](https://github.com/tBeltty/auditor-executor-protocol/blob/main/pyproject.toml)
|
|
10
10
|
|
|
11
11
|
A two-role protocol for running multi-phase work through AI agents without the plan drifting into open-ended discussion and without "all tests pass" masquerading as verification.
|
|
12
12
|
|
|
13
13
|
The **Auditor** defines what "done" means and proves it independently. The **Executor** implements one numbered task at a time and logs command output. Neither role crosses into the other.
|
|
14
14
|
|
|
15
|
-
[`SKILL.md`](SKILL.md) specifies the protocol core; [`references/`](references
|
|
15
|
+
[`SKILL.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/SKILL.md) specifies the protocol core; [`references/`](https://github.com/tBeltty/auditor-executor-protocol/tree/main/references) holds the parts an agent loads only when it reaches that step (task and gate writing, handoff templates, Autonomous mode, failure modes and a worked example). `aepkit` is a zero-dependency Python CLI that automates scaffolding, drift linting, negative controls, status tallies, and installing the skill into your agent.
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
@@ -110,13 +110,15 @@ Inspect open tasks and tallied verdicts:
|
|
|
110
110
|
aepkit status docs/<task-name>
|
|
111
111
|
```
|
|
112
112
|
|
|
113
|
+
`aepkit status --json docs/<task-name>` prints the same reading as JSON, with each ID's phase, effective state and executor, and the phases with their titles from `execution-guide.md` (and weights from an optional `Weight` column in the plan's phase table), for scripts and tools to use instead of parsing the log.
|
|
114
|
+
|
|
113
115
|
Cross-check document consistency:
|
|
114
116
|
|
|
115
117
|
```bash
|
|
116
118
|
aepkit lint docs/<task-name>
|
|
117
119
|
```
|
|
118
120
|
|
|
119
|
-
`aepkit lint` catches an empty guide, tasks without a report line, missing report entries, log entries with no matching task, `DONE` reports whose verify output is not pasted in a code block, gates without a stated negative control (hypothetical or waived ones do not count), work reported in a phase before every earlier phase is `APPROVED`, unfilled opportunity/shaping/non-goal fields in `plan-of-record.md` once work is reported `DONE` or audited, open rows in the deferred items ledger for a phase being closed, duplicated log paragraphs, and annex buildup past `--annex-threshold` (default 6,
|
|
121
|
+
`aepkit lint` catches an empty guide, tasks without a report line, missing report entries, log entries with no matching task, `DONE` reports whose verify output is not pasted in a code block, gates without a stated negative control (hypothetical or waived ones do not count), work reported in a phase before every earlier phase is `APPROVED`, unfilled opportunity/shaping/non-goal fields in `plan-of-record.md` once work is reported `DONE` or audited, open rows in the deferred items ledger for a phase being closed, duplicated log paragraphs, and annex buildup past `--annex-threshold` (default 6 in total, with a per-phase breakdown). It checks that evidence is present and in the right form, not that it is genuine; the Auditor's re-run does that.
|
|
120
122
|
|
|
121
123
|
### 5. Run a Negative Control
|
|
122
124
|
|
|
@@ -132,9 +134,20 @@ aepkit negcontrol \
|
|
|
132
134
|
|
|
133
135
|
The `sed -i ''` form above is BSD/macOS sed; on GNU/Linux use `sed -i 's/.../.../' file`.
|
|
134
136
|
|
|
135
|
-
`negcontrol` backs up the target file, applies the break mutation, confirms the test fails, restores the file with byte-level verification, confirms the test passes, and outputs a transcript ready for `compliance-log.md`. Without `--file`, pass `--restore-cmd` to undo the break yourself; with both, the backup still wins if the file is not byte-identical afterwards. `--timeout` limits each command in seconds.
|
|
137
|
+
`negcontrol` backs up the target file, applies the break mutation, confirms the test fails, restores the file with byte-level verification, confirms the test passes, and outputs a transcript ready for `compliance-log.md`. Without `--file`, pass `--restore-cmd` to undo the break yourself; with both, the backup still wins if the file is not byte-identical afterwards. `--file` needs `--break-cmd`, because the backup must be taken before the break. `--timeout` limits each command in seconds, and a test that times out instead of failing fails the control: a hang is not a caught break.
|
|
138
|
+
|
|
139
|
+
A failure only proves something if it is the failure you meant. A syntax error, a missing import or a mistyped test command also makes the test exit non-zero. `--expect` takes a regular expression that the failing run's output must match, and the control fails if it does not. Without `--expect`, output that looks like a syntax, import, collection or command-not-found error is flagged with a `WARNING` next to the `OK`, and you need to read the transcript to confirm the reason.
|
|
140
|
+
|
|
141
|
+
### Optional: Progress Pane for Claude Code
|
|
142
|
+
|
|
143
|
+
`aeprogress` is a Claude Code mod that keeps a pane beside the chat with the run's overall percentage, a bar per phase, who is working on which task ID (Claude Code subagents, Orca workers, or any other harness through a command of your own), what awaits audit, what needs attention, and the machine's load. It reads the log through `aepkit status --json` and refreshes after each turn, and every 20 seconds while the pane is open. While a run is found it also holds back launching another Executor past a worker count or a machine load (2 workers, 1 building, 75% busy by default; a handoff marked `Load: docs-only` does not count as a build), and on macOS it recommends excluding the project from Spotlight when indexing keeps the machine busy. The protocol does not depend on it.
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
/plugin install aeprogress --marketplace tBeltty/auditor-executor-protocol
|
|
147
|
+
/aeprogress docs/<task-name>
|
|
148
|
+
```
|
|
136
149
|
|
|
137
|
-
|
|
150
|
+
It works in the terminal and in the desktop app's local sessions. Claude Code's mod API is early access, so a Claude Code release can break it. Setup, options and how the percentage is computed: [integrations/claude-code/aeprogress](https://github.com/tBeltty/auditor-executor-protocol/tree/main/integrations/claude-code/aeprogress).
|
|
138
151
|
|
|
139
152
|
---
|
|
140
153
|
|
|
@@ -146,7 +159,7 @@ A failure only proves something if it is the failure you meant. A syntax error,
|
|
|
146
159
|
| `aepkit install-skill [dir]` | `--agent`, `--global`, `--dest`, `--force` | Provision `SKILL.md` and `references/` into Antigravity, Claude Code, or Cursor |
|
|
147
160
|
| `aepkit lint <dir>` | `--annex-threshold` | Cross-check IDs both ways, flag `DONE` without evidence, detect missing negative controls, and flag log rot |
|
|
148
161
|
| `aepkit negcontrol` | `--test-cmd` (required), `--file`, `--break-cmd`, `--restore-cmd`, `--expect`, `--timeout` | Run automated backup, break, fail, restore, and pass cycle |
|
|
149
|
-
| `aepkit status <dir>` | | Combine status board verdicts with reports; list everything not `APPROVED` |
|
|
162
|
+
| `aepkit status <dir>` | `--json` | Combine status board verdicts with reports; list everything not `APPROVED` |
|
|
150
163
|
|
|
151
164
|
`python -m aepkit` works the same as `aepkit`. Errors go to stderr.
|
|
152
165
|
|
|
@@ -175,11 +188,11 @@ pytest
|
|
|
175
188
|
|
|
176
189
|
## Contributing
|
|
177
190
|
|
|
178
|
-
Contributions are welcome. [`CONTRIBUTING.md`](CONTRIBUTING.md) covers the development setup, the quality gates, and the PR checklist; participation follows the [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md). Report vulnerabilities privately as described in [`SECURITY.md`](SECURITY.md). Changes are listed in [`CHANGELOG.md`](CHANGELOG.md).
|
|
191
|
+
Contributions are welcome. [`CONTRIBUTING.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/CONTRIBUTING.md) covers the development setup, the quality gates, and the PR checklist; participation follows the [`CODE_OF_CONDUCT.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/CODE_OF_CONDUCT.md). Report vulnerabilities privately as described in [`SECURITY.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/SECURITY.md). Changes are listed in [`CHANGELOG.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/CHANGELOG.md).
|
|
179
192
|
|
|
180
193
|
## License
|
|
181
194
|
|
|
182
|
-
MIT (see [`LICENSE`](LICENSE)).
|
|
195
|
+
MIT (see [`LICENSE`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/LICENSE)).
|
|
183
196
|
|
|
184
197
|
---
|
|
185
198
|
|
|
@@ -188,7 +188,6 @@ done before task 1 is drafted:**
|
|
|
188
188
|
| Rule | Look for |
|
|
189
189
|
|---|---|
|
|
190
190
|
| Version bump per change | A version field (`package.json`, `pyproject.toml`, a `VERSION` file) and any script that already bumps it |
|
|
191
|
-
| No AI co-author trailers | `git log --grep="Co-Authored-By"` — existing trailers (or their consistent absence) |
|
|
192
191
|
| Fetch-before-push | Multiple contributors or branches in `git log`/`git branch -a` — a solo, single-branch repo needs this less |
|
|
193
192
|
| Quality gate green before push | CI config (`.github/workflows/`, `.gitlab-ci.yml`) or a `test`/`lint`/`build` script already wired together |
|
|
194
193
|
| i18n/locale parity | A locales/translations directory with more than one language file |
|
|
@@ -299,7 +298,7 @@ report's job is to point at the evidence, not to argue for a verdict.
|
|
|
299
298
|
for the whole feature.
|
|
300
299
|
8. **Before sending the verdict, check what it's missing, not just what it says.** This
|
|
301
300
|
applies to every verdict, not only a full-phase `APPROVED` or a `CONDITIONAL`/
|
|
302
|
-
`REJECTED` with an obvious remediation — a plain `
|
|
301
|
+
`REJECTED` with an obvious remediation — a plain `APPROVED` on one task, mid-phase, with
|
|
303
302
|
something else already outstanding (an earlier remediation, the next task) needs the
|
|
304
303
|
same discipline: it does not end the message on its own. If anything is left to do —
|
|
305
304
|
a remediation handoff, the next task's handoff, or a re-statement of a handoff already
|
|
@@ -423,7 +422,7 @@ If `aepkit` is installed, prefer it over doing these by hand:
|
|
|
423
422
|
compliance log in both directions, flag `DONE` reports with no pasted verify output
|
|
424
423
|
(output counts only inside a fenced code block; prose such as "all tests pass" or a lone
|
|
425
424
|
"n/a" is not output), flag work reported in a phase before every earlier phase is
|
|
426
|
-
`APPROVED`, flag near-duplicate paragraphs, warn on annex count per phase, flag gates with no
|
|
425
|
+
`APPROVED`, flag near-duplicate paragraphs, warn on annex count (listed per phase), flag gates with no
|
|
427
426
|
stated negative control (it must name the action that removes the protection and the
|
|
428
427
|
failure that follows; a negated, deferred, hypothetical, or waived mention such as "n/a",
|
|
429
428
|
"TBD", or "we could remove it" does not count), and—once work has started (`DONE` or a
|
|
@@ -437,12 +436,19 @@ If `aepkit` is installed, prefer it over doing these by hand:
|
|
|
437
436
|
file up, runs the break command, runs the test (expects failure), restores from the
|
|
438
437
|
backup, runs the test again (expects success), and prints a paste-ready transcript.
|
|
439
438
|
With `--restore-cmd`, the file must still end byte-identical to the backup or it is
|
|
440
|
-
restored from it
|
|
439
|
+
restored from it. `--file` needs `--break-cmd`, since the backup must come before the
|
|
440
|
+
break. `--timeout` bounds each command, and a test that times out instead of failing
|
|
441
|
+
fails the control. Pass `--expect "<regex>"` with the
|
|
441
442
|
failure the break should cause (an assertion message, a 403): a test that fails for
|
|
442
443
|
another reason, such as a syntax error or a missing import, then fails the control
|
|
443
444
|
instead of passing it. Without `--expect`, such output is only flagged as a warning.
|
|
444
445
|
- `aepkit status <dir>` — combines the status board verdicts with the latest report
|
|
445
446
|
per ID and prints what's still open. Only `APPROVED` closes an item; a `DONE` with no
|
|
446
|
-
verdict is listed as awaiting audit.
|
|
447
|
-
|
|
448
|
-
|
|
447
|
+
verdict is listed as awaiting audit. `--json` prints the same reading, with the phases
|
|
448
|
+
from the guide and the plan, for tools to use instead of parsing the log themselves.
|
|
449
|
+
- Optional, Claude Code only: the `aeprogress` mod keeps a pane beside the chat with the
|
|
450
|
+
run's progress per phase and who is working on which ID (subagents, Orca workers, or
|
|
451
|
+
any harness through a command). The protocol does not depend on it. See
|
|
452
|
+
`integrations/claude-code/aeprogress/` in the repository.
|
|
453
|
+
|
|
454
|
+
Install instructions: https://github.com/tBeltty/auditor-executor-protocol#quickstart
|
|
@@ -45,12 +45,15 @@ test = [
|
|
|
45
45
|
"pytest>=7.0",
|
|
46
46
|
"pytest-cov>=4.0",
|
|
47
47
|
]
|
|
48
|
+
# Exact pins, so a new linter rule or build-tool release cannot turn CI red or change a
|
|
49
|
+
# published build without a commit; Dependabot bumps them.
|
|
48
50
|
dev = [
|
|
49
51
|
"pytest>=7.0",
|
|
50
52
|
"pytest-cov>=4.0",
|
|
51
|
-
"ruff
|
|
52
|
-
"mypy
|
|
53
|
-
"build
|
|
53
|
+
"ruff==0.16.10",
|
|
54
|
+
"mypy==2.4.0",
|
|
55
|
+
"build==1.6.1",
|
|
56
|
+
"twine==7.0.0",
|
|
54
57
|
]
|
|
55
58
|
|
|
56
59
|
[project.scripts]
|
|
@@ -68,6 +71,8 @@ where = ["src"]
|
|
|
68
71
|
[tool.ruff]
|
|
69
72
|
line-length = 100
|
|
70
73
|
target-version = "py311"
|
|
74
|
+
# agent-produced run directories and experiment scripts are data, not package code
|
|
75
|
+
extend-exclude = ["benchmarks"]
|
|
71
76
|
|
|
72
77
|
[tool.ruff.lint]
|
|
73
78
|
select = ["E", "F", "W", "I", "UP", "B", "PL", "RUF"]
|
|
@@ -82,7 +87,7 @@ ignore = [
|
|
|
82
87
|
]
|
|
83
88
|
|
|
84
89
|
[tool.ruff.lint.per-file-ignores]
|
|
85
|
-
"tests/*" = ["RUF001"
|
|
90
|
+
"tests/*" = ["RUF001"]
|
|
86
91
|
|
|
87
92
|
[tool.mypy]
|
|
88
93
|
python_version = "3.11"
|
|
@@ -47,6 +47,10 @@ it from a governance decision in the plan of record. It has four parts:
|
|
|
47
47
|
made: <decision-entry IDs, or "none">. Next: <phase/task already launched>.
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
+
Between reports, an owner on Claude Code can follow the run in the optional
|
|
51
|
+
`aeprogress` pane (`integrations/claude-code/aeprogress/` in the repository), which
|
|
52
|
+
reads the compliance log and never messages the Auditor. The run does not depend on it.
|
|
53
|
+
|
|
50
54
|
Harness permission prompts that need the owner go in **one batched request**, not one
|
|
51
55
|
at a time. When every phase is `APPROVED` and the plan of record declares no further
|
|
52
56
|
phase, say so as its own line — see "Closing the run" in `SKILL.md`.
|
|
@@ -91,7 +95,7 @@ each handoff. The shape that has worked here:
|
|
|
91
95
|
its first task.
|
|
92
96
|
|
|
93
97
|
Do not end a turn between a verdict and the next launch unless something on the
|
|
94
|
-
critical-risk list is open. A run that stops to report
|
|
98
|
+
critical-risk list is open. A run that stops to report an `APPROVED` and wait is Guided
|
|
95
99
|
mode by accident.
|
|
96
100
|
|
|
97
101
|
### Starting the Auditor (the Auditor brief)
|
|
@@ -23,7 +23,7 @@ this file.
|
|
|
23
23
|
- **Silent model inheritance.** A subagent launched without an explicit model runs on
|
|
24
24
|
the Auditor's own model. Nothing fails; the rule is just broken on every task. Pass
|
|
25
25
|
it every time.
|
|
26
|
-
- **Guided by habit.** In Autonomous mode, the Auditor ends a turn after
|
|
26
|
+
- **Guided by habit.** In Autonomous mode, the Auditor ends a turn after an `APPROVED` to
|
|
27
27
|
"report," or asks the owner a question the charter already lets it decide. Each one
|
|
28
28
|
costs the owner a message and adds nothing.
|
|
29
29
|
- **A defect ships and nobody owns re-checking its blast radius.** A task changes what
|
|
@@ -32,6 +32,8 @@ ROLE: Executor. Work from <EXECUTION_GUIDE> (Phase <n>, `<TASK-ID>`) only; repor
|
|
|
32
32
|
[Autonomous mode only:] You are the Auditor's subagent. Questions go as BLOCKED in the
|
|
33
33
|
log and in your final report; you do not address the owner.
|
|
34
34
|
|
|
35
|
+
[Optional, only when the run uses a launch limit:] Load: docs-only
|
|
36
|
+
|
|
35
37
|
REPORTED STATE: <what is already DONE in the log, and whether it was audited or only
|
|
36
38
|
self-reported — do not conflate the two>. Do not reopen <prior tasks>.
|
|
37
39
|
|
|
@@ -71,6 +73,13 @@ mid-task.
|
|
|
71
73
|
Do not paste a rules-of-engagement block from one project's run into another's handoff
|
|
72
74
|
without re-confirming it applies. It is a per-run artifact, not part of this skill.
|
|
73
75
|
|
|
76
|
+
`Load: docs-only` is for runs where a tool holds back Executor launches while the machine
|
|
77
|
+
is busy, such as the optional `aeprogress` mod for Claude Code. Put it on its own line in
|
|
78
|
+
a handoff whose task compiles, builds and tests nothing (documentation, a plan, a review),
|
|
79
|
+
so it can run beside a task that builds. Leave it out when unsure: a handoff without it
|
|
80
|
+
counts as a build, which is the safe side. The protocol does not require the line, and a
|
|
81
|
+
run with no such tool ignores it.
|
|
82
|
+
|
|
74
83
|
## Remediation handoff (Auditor)
|
|
75
84
|
|
|
76
85
|
A verdict is not the deliverable — a well-evidenced `CONDITIONAL` or `REJECTED` that
|
|
@@ -120,7 +129,7 @@ Auditor's own rule 4 ("The Auditor is bound by rule 4 too" in `SKILL.md`).
|
|
|
120
129
|
|
|
121
130
|
**No verdict ends the loop by itself if anything is left to run — and "anything left to
|
|
122
131
|
run" is not only "a phase remains" or "a remediation order is needed."** It also covers
|
|
123
|
-
the most common case of all: a plain `
|
|
132
|
+
the most common case of all: a plain `APPROVED` on one task, mid-phase, with something else
|
|
124
133
|
already outstanding — an earlier remediation, the next task in line. That case has no
|
|
125
134
|
name of its own in the Verdicts table of `SKILL.md`, which is exactly why it's the easiest one
|
|
126
135
|
to ship without a handoff: closing with a status sentence that *describes* what's still
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.7.1"
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"""aepkit — mechanical support for the Auditor/Executor protocol.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
The protocol itself is SKILL.md:
|
|
4
|
+
https://github.com/tBeltty/auditor-executor-protocol/blob/main/SKILL.md
|
|
5
|
+
|
|
6
|
+
This CLI operationalizes the parts of it that are checklist work, not judgment:
|
|
7
|
+
scaffolding the document set, cross-checking it for drift, running a negative control
|
|
8
|
+
end to end, and reporting status.
|
|
7
9
|
"""
|
|
8
10
|
|
|
9
11
|
from __future__ import annotations
|
|
@@ -15,7 +17,9 @@ from . import __version__, install_skill, lint, negcontrol, scaffold, status
|
|
|
15
17
|
|
|
16
18
|
|
|
17
19
|
def build_parser() -> argparse.ArgumentParser:
|
|
18
|
-
parser = argparse.ArgumentParser(
|
|
20
|
+
parser = argparse.ArgumentParser(
|
|
21
|
+
prog="aepkit", description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
|
|
22
|
+
)
|
|
19
23
|
parser.add_argument("--version", action="version", version=f"aepkit {__version__}")
|
|
20
24
|
sub = parser.add_subparsers(dest="command", required=True)
|
|
21
25
|
|
|
@@ -39,7 +43,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
39
43
|
type=int,
|
|
40
44
|
metavar="N",
|
|
41
45
|
default=lint.DEFAULT_ANNEX_THRESHOLD,
|
|
42
|
-
help="flag more annexes than this,
|
|
46
|
+
help="flag more annexes than this in total, listed per phase (default: %(default)s)",
|
|
43
47
|
)
|
|
44
48
|
|
|
45
49
|
p_neg = sub.add_parser("negcontrol", help="run a backup/break/test/restore/test cycle")
|
|
@@ -85,6 +89,12 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
85
89
|
"status", help="tally verdicts and reports in the compliance log; only APPROVED closes"
|
|
86
90
|
)
|
|
87
91
|
p_status.add_argument("target_dir", help="directory holding compliance-log.md")
|
|
92
|
+
p_status.add_argument(
|
|
93
|
+
"--json",
|
|
94
|
+
dest="as_json",
|
|
95
|
+
action="store_true",
|
|
96
|
+
help="print the reading as JSON, with phases from the execution guide and the plan",
|
|
97
|
+
)
|
|
88
98
|
|
|
89
99
|
p_install = sub.add_parser(
|
|
90
100
|
"install-skill", help="provision SKILL.md and references/ into an agent skills directory"
|
|
@@ -137,7 +147,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
137
147
|
expect=args.expect,
|
|
138
148
|
)
|
|
139
149
|
if args.command == "status":
|
|
140
|
-
return status.run(args.target_dir)
|
|
150
|
+
return status.run(args.target_dir, as_json=args.as_json)
|
|
141
151
|
return install_skill.run(
|
|
142
152
|
target_dir=args.target_dir,
|
|
143
153
|
agent=args.agent,
|
|
@@ -61,7 +61,7 @@ def _detect_agent(target: Path) -> str:
|
|
|
61
61
|
# 2. Check runtime environment variables
|
|
62
62
|
if os.environ.get("ANTIGRAVITY_AGENT") or os.environ.get("GEMINI_CLI"):
|
|
63
63
|
return "antigravity"
|
|
64
|
-
if os.environ.get(
|
|
64
|
+
if any(os.environ.get(v) for v in ("CLAUDECODE", "CLAUDE_CODE", "CLAUDE_PROJECT_DIR")):
|
|
65
65
|
return "claude"
|
|
66
66
|
if os.environ.get("CURSOR_PROJECT_DIR"):
|
|
67
67
|
return "cursor"
|