devagent-ai 0.4.0__tar.gz → 0.5.0__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.
- {devagent_ai-0.4.0/devagent_ai.egg-info → devagent_ai-0.5.0}/PKG-INFO +19 -6
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/README.md +18 -5
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/__init__.py +1 -1
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/cli.py +4 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/discovery.py +29 -17
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/qualification.py +1 -1
- devagent_ai-0.5.0/devagent/realworld.py +492 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/retrieval.py +72 -3
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/workspace.py +26 -3
- {devagent_ai-0.4.0 → devagent_ai-0.5.0/devagent_ai.egg-info}/PKG-INFO +19 -6
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent_ai.egg-info/SOURCES.txt +2 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/pyproject.toml +1 -1
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_cli.py +13 -1
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_production_v040.py +1 -1
- devagent_ai-0.5.0/tests/test_realworld_benchmark.py +185 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_retrieval.py +86 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/LICENSE +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/NOTICE +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/agent/__init__.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/agent/llm.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/agent/loop.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/agent/memory.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/agent/prompts.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/agent/tools.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/__main__.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/artifacts.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/config.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/evaluation.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/memory.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/models.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/orchestrator.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/providers.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/report.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/routing.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/safety.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/source_control.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/state_machine.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/tasking.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/technical_review.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/worktree.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent_ai.egg-info/dependency_links.txt +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent_ai.egg-info/entry_points.txt +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent_ai.egg-info/requires.txt +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent_ai.egg-info/top_level.txt +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/setup.cfg +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_acceptance_contract.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_benchmark_catalog.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_capability_discovery.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_developer_review_report.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_discovery_memory.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_e2e_fake_provider.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_evaluation_harness.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_evaluation_matrix.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_evaluation_regression_evidence.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_functional_qualification.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_model_routing.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_multilang_technical_review.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_multistack_devagent_e2e.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_multistack_qualification.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_packaging_metadata.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_preservation_contradiction.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_production_hardening.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_safety_workspace.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_source_control_publish.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_structured_provider_contract.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_tasking_state.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_workspace_environment.py +0 -0
- {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_worktree.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devagent-ai
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: Evidence-driven local autonomous software engineering agent
|
|
5
5
|
Author: Tom Ha
|
|
6
6
|
Maintainer: Tom Ha
|
|
@@ -224,8 +224,21 @@ devagent setup --help
|
|
|
224
224
|
devagent doctor
|
|
225
225
|
devagent models
|
|
226
226
|
devagent status
|
|
227
|
+
devagent benchmark --help
|
|
227
228
|
```
|
|
228
229
|
|
|
230
|
+
### Pinned real-world benchmark
|
|
231
|
+
|
|
232
|
+
DevAgent 0.5 adds an opt-in benchmark runner for pinned GitHub repositories. A benchmark case injects a deterministic defect into an exact commit and uses an **external oracle** before and after DevAgent. This avoids treating DevAgent's own report as the benchmark oracle.
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
devagent benchmark \
|
|
236
|
+
--catalog /path/to/realworld-cases.json \
|
|
237
|
+
--report .devagent/realworld-benchmark.json
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
A `VERIFIED` result with a failing external oracle is explicitly counted as a **false VERIFIED**. See [docs/realworld-benchmark.md](docs/realworld-benchmark.md) for the catalog contract and safety boundary.
|
|
241
|
+
|
|
229
242
|
## Outcome contract
|
|
230
243
|
|
|
231
244
|
### `VERIFIED`
|
|
@@ -284,7 +297,7 @@ Verification can include baseline tests, targeted tests, component/broad checks,
|
|
|
284
297
|
|
|
285
298
|
## Production qualification
|
|
286
299
|
|
|
287
|
-
DevAgent 0.
|
|
300
|
+
DevAgent 0.5.0 uses **production qualification v4**. It extends the v3 release gate with large-repository bounded-retrieval and real-world benchmark truthfulness contracts while preserving the primary invariant:
|
|
288
301
|
|
|
289
302
|
```text
|
|
290
303
|
false_verified == 0
|
|
@@ -304,8 +317,8 @@ Run the release qualification locally on a machine with those toolchains:
|
|
|
304
317
|
|
|
305
318
|
```bash
|
|
306
319
|
python -m devagent.qualification \
|
|
307
|
-
--catalog evaluation/
|
|
308
|
-
--report .devagent/production-qualification-
|
|
320
|
+
--catalog evaluation/benchmark_v4.json \
|
|
321
|
+
--report .devagent/production-qualification-v4.json
|
|
309
322
|
```
|
|
310
323
|
|
|
311
324
|
Production CI runs Python 3.10/3.11/3.12, a clean wheel install, and this production qualification gate. The qualification JSON is retained as CI evidence.
|
|
@@ -366,9 +379,9 @@ Automated provider tests normally use deterministic or mocked clients and do not
|
|
|
366
379
|
|
|
367
380
|
## Project status
|
|
368
381
|
|
|
369
|
-
DevAgent 0.
|
|
382
|
+
DevAgent 0.5 is **beta software**. Its qualification and benchmark results are bounded claims tied to explicit cases, pinned revisions, and external oracles; they are not a claim of universal correctness or parity with every hosted coding platform.
|
|
370
383
|
|
|
371
|
-
Remaining gaps include browser/UI runtime qualification, a broader Java/.NET/database-migration matrix, very large monorepo
|
|
384
|
+
Remaining gaps include a larger published corpus of pinned upstream benchmark cases, browser/UI runtime qualification, a broader Java/.NET/database-migration matrix, very large monorepo stress runs above the current bounded inventory, parallel multi-agent orchestration, operating-system sandboxing, and continuous paid real-provider testing across every model/provider combination.
|
|
372
385
|
|
|
373
386
|
The project intentionally prioritizes trustworthy outcomes over feature count.
|
|
374
387
|
|
|
@@ -193,8 +193,21 @@ devagent setup --help
|
|
|
193
193
|
devagent doctor
|
|
194
194
|
devagent models
|
|
195
195
|
devagent status
|
|
196
|
+
devagent benchmark --help
|
|
196
197
|
```
|
|
197
198
|
|
|
199
|
+
### Pinned real-world benchmark
|
|
200
|
+
|
|
201
|
+
DevAgent 0.5 adds an opt-in benchmark runner for pinned GitHub repositories. A benchmark case injects a deterministic defect into an exact commit and uses an **external oracle** before and after DevAgent. This avoids treating DevAgent's own report as the benchmark oracle.
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
devagent benchmark \
|
|
205
|
+
--catalog /path/to/realworld-cases.json \
|
|
206
|
+
--report .devagent/realworld-benchmark.json
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
A `VERIFIED` result with a failing external oracle is explicitly counted as a **false VERIFIED**. See [docs/realworld-benchmark.md](docs/realworld-benchmark.md) for the catalog contract and safety boundary.
|
|
210
|
+
|
|
198
211
|
## Outcome contract
|
|
199
212
|
|
|
200
213
|
### `VERIFIED`
|
|
@@ -253,7 +266,7 @@ Verification can include baseline tests, targeted tests, component/broad checks,
|
|
|
253
266
|
|
|
254
267
|
## Production qualification
|
|
255
268
|
|
|
256
|
-
DevAgent 0.
|
|
269
|
+
DevAgent 0.5.0 uses **production qualification v4**. It extends the v3 release gate with large-repository bounded-retrieval and real-world benchmark truthfulness contracts while preserving the primary invariant:
|
|
257
270
|
|
|
258
271
|
```text
|
|
259
272
|
false_verified == 0
|
|
@@ -273,8 +286,8 @@ Run the release qualification locally on a machine with those toolchains:
|
|
|
273
286
|
|
|
274
287
|
```bash
|
|
275
288
|
python -m devagent.qualification \
|
|
276
|
-
--catalog evaluation/
|
|
277
|
-
--report .devagent/production-qualification-
|
|
289
|
+
--catalog evaluation/benchmark_v4.json \
|
|
290
|
+
--report .devagent/production-qualification-v4.json
|
|
278
291
|
```
|
|
279
292
|
|
|
280
293
|
Production CI runs Python 3.10/3.11/3.12, a clean wheel install, and this production qualification gate. The qualification JSON is retained as CI evidence.
|
|
@@ -335,9 +348,9 @@ Automated provider tests normally use deterministic or mocked clients and do not
|
|
|
335
348
|
|
|
336
349
|
## Project status
|
|
337
350
|
|
|
338
|
-
DevAgent 0.
|
|
351
|
+
DevAgent 0.5 is **beta software**. Its qualification and benchmark results are bounded claims tied to explicit cases, pinned revisions, and external oracles; they are not a claim of universal correctness or parity with every hosted coding platform.
|
|
339
352
|
|
|
340
|
-
Remaining gaps include browser/UI runtime qualification, a broader Java/.NET/database-migration matrix, very large monorepo
|
|
353
|
+
Remaining gaps include a larger published corpus of pinned upstream benchmark cases, browser/UI runtime qualification, a broader Java/.NET/database-migration matrix, very large monorepo stress runs above the current bounded inventory, parallel multi-agent orchestration, operating-system sandboxing, and continuous paid real-provider testing across every model/provider combination.
|
|
341
354
|
|
|
342
355
|
The project intentionally prioritizes trustworthy outcomes over feature count.
|
|
343
356
|
|
|
@@ -353,6 +353,10 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
353
353
|
parser = argparse.ArgumentParser(prog="devagent status", description="Show the latest local run")
|
|
354
354
|
parser.add_argument("--repo", "-r", type=Path, default=Path.cwd())
|
|
355
355
|
return _status(parser.parse_args(arguments[1:]).repo)
|
|
356
|
+
if arguments and arguments[0] == "benchmark":
|
|
357
|
+
from devagent.realworld import main as benchmark_main
|
|
358
|
+
|
|
359
|
+
return benchmark_main(arguments[1:])
|
|
356
360
|
return _run(arguments)
|
|
357
361
|
|
|
358
362
|
|
|
@@ -67,24 +67,36 @@ def _fingerprint(path: Path) -> str:
|
|
|
67
67
|
|
|
68
68
|
|
|
69
69
|
def _walk(root: Path, limit: int = 12_000) -> list[Path]:
|
|
70
|
+
"""Walk deterministically while pruning generated/vendor trees before descent."""
|
|
70
71
|
files: list[Path] = []
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
72
|
+
maximum = min(max(0, int(limit)), 12_000)
|
|
73
|
+
if maximum == 0:
|
|
74
|
+
return files
|
|
75
|
+
for current, directories, filenames in os.walk(root, topdown=True, followlinks=False):
|
|
76
|
+
current_path = Path(current)
|
|
77
|
+
relative_current = current_path.relative_to(root)
|
|
78
|
+
directories[:] = sorted(
|
|
79
|
+
directory
|
|
80
|
+
for directory in directories
|
|
81
|
+
if directory not in SKIP_DIRECTORIES
|
|
82
|
+
and not is_secret_path(relative_current / directory)
|
|
83
|
+
)
|
|
84
|
+
for filename in sorted(filenames):
|
|
85
|
+
path = current_path / filename
|
|
86
|
+
relative = path.relative_to(root)
|
|
87
|
+
try:
|
|
88
|
+
resolved = path.resolve()
|
|
89
|
+
resolved_relative = resolved.relative_to(root)
|
|
90
|
+
except (OSError, ValueError):
|
|
91
|
+
continue
|
|
92
|
+
if (
|
|
93
|
+
resolved.is_file()
|
|
94
|
+
and not is_secret_path(relative)
|
|
95
|
+
and not is_secret_path(resolved_relative)
|
|
96
|
+
):
|
|
97
|
+
files.append(path)
|
|
98
|
+
if len(files) >= maximum:
|
|
99
|
+
return files
|
|
88
100
|
return files
|
|
89
101
|
|
|
90
102
|
|
|
@@ -157,7 +157,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
157
157
|
parser.add_argument(
|
|
158
158
|
"--catalog",
|
|
159
159
|
type=Path,
|
|
160
|
-
default=Path("evaluation/
|
|
160
|
+
default=Path("evaluation/benchmark_v4.json"),
|
|
161
161
|
help="Qualification catalog path",
|
|
162
162
|
)
|
|
163
163
|
parser.add_argument(
|