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.
Files changed (68) hide show
  1. {devagent_ai-0.4.0/devagent_ai.egg-info → devagent_ai-0.5.0}/PKG-INFO +19 -6
  2. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/README.md +18 -5
  3. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/__init__.py +1 -1
  4. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/cli.py +4 -0
  5. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/discovery.py +29 -17
  6. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/qualification.py +1 -1
  7. devagent_ai-0.5.0/devagent/realworld.py +492 -0
  8. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/retrieval.py +72 -3
  9. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/workspace.py +26 -3
  10. {devagent_ai-0.4.0 → devagent_ai-0.5.0/devagent_ai.egg-info}/PKG-INFO +19 -6
  11. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent_ai.egg-info/SOURCES.txt +2 -0
  12. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/pyproject.toml +1 -1
  13. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_cli.py +13 -1
  14. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_production_v040.py +1 -1
  15. devagent_ai-0.5.0/tests/test_realworld_benchmark.py +185 -0
  16. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_retrieval.py +86 -0
  17. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/LICENSE +0 -0
  18. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/NOTICE +0 -0
  19. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/agent/__init__.py +0 -0
  20. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/agent/llm.py +0 -0
  21. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/agent/loop.py +0 -0
  22. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/agent/memory.py +0 -0
  23. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/agent/prompts.py +0 -0
  24. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/agent/tools.py +0 -0
  25. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/__main__.py +0 -0
  26. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/artifacts.py +0 -0
  27. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/config.py +0 -0
  28. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/evaluation.py +0 -0
  29. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/memory.py +0 -0
  30. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/models.py +0 -0
  31. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/orchestrator.py +0 -0
  32. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/providers.py +0 -0
  33. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/report.py +0 -0
  34. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/routing.py +0 -0
  35. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/safety.py +0 -0
  36. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/source_control.py +0 -0
  37. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/state_machine.py +0 -0
  38. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/tasking.py +0 -0
  39. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/technical_review.py +0 -0
  40. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent/worktree.py +0 -0
  41. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent_ai.egg-info/dependency_links.txt +0 -0
  42. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent_ai.egg-info/entry_points.txt +0 -0
  43. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent_ai.egg-info/requires.txt +0 -0
  44. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/devagent_ai.egg-info/top_level.txt +0 -0
  45. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/setup.cfg +0 -0
  46. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_acceptance_contract.py +0 -0
  47. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_benchmark_catalog.py +0 -0
  48. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_capability_discovery.py +0 -0
  49. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_developer_review_report.py +0 -0
  50. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_discovery_memory.py +0 -0
  51. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_e2e_fake_provider.py +0 -0
  52. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_evaluation_harness.py +0 -0
  53. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_evaluation_matrix.py +0 -0
  54. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_evaluation_regression_evidence.py +0 -0
  55. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_functional_qualification.py +0 -0
  56. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_model_routing.py +0 -0
  57. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_multilang_technical_review.py +0 -0
  58. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_multistack_devagent_e2e.py +0 -0
  59. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_multistack_qualification.py +0 -0
  60. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_packaging_metadata.py +0 -0
  61. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_preservation_contradiction.py +0 -0
  62. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_production_hardening.py +0 -0
  63. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_safety_workspace.py +0 -0
  64. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_source_control_publish.py +0 -0
  65. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_structured_provider_contract.py +0 -0
  66. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_tasking_state.py +0 -0
  67. {devagent_ai-0.4.0 → devagent_ai-0.5.0}/tests/test_workspace_environment.py +0 -0
  68. {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.4.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.4.0 adds **production qualification v3**. The release catalog contains 52 required cases and preserves the primary invariant:
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/benchmark_v3.json \
308
- --report .devagent/production-qualification-v3.json
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.4 is **beta software** with a production-readiness target of approximately **9/10 for the documented local engineering workflow**. That assessment is based on explicit qualification evidence, not on a claim of universal correctness or parity with every capability of a hosted coding platform.
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 benchmarks, parallel multi-agent orchestration, operating-system sandboxing, and continuous paid real-provider testing across every model/provider combination.
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.4.0 adds **production qualification v3**. The release catalog contains 52 required cases and preserves the primary invariant:
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/benchmark_v3.json \
277
- --report .devagent/production-qualification-v3.json
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.4 is **beta software** with a production-readiness target of approximately **9/10 for the documented local engineering workflow**. That assessment is based on explicit qualification evidence, not on a claim of universal correctness or parity with every capability of a hosted coding platform.
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 benchmarks, parallel multi-agent orchestration, operating-system sandboxing, and continuous paid real-provider testing across every model/provider combination.
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
 
@@ -1,3 +1,3 @@
1
1
  """DevAgent: evidence-driven local software engineering automation."""
2
2
 
3
- __version__ = "0.4.0"
3
+ __version__ = "0.5.0"
@@ -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
- for path in root.rglob("*"):
72
- relative = path.relative_to(root)
73
- if any(part in SKIP_DIRECTORIES for part in relative.parts):
74
- continue
75
- try:
76
- resolved = path.resolve()
77
- resolved_relative = resolved.relative_to(root)
78
- except (OSError, ValueError):
79
- continue
80
- if (
81
- resolved.is_file()
82
- and not is_secret_path(relative)
83
- and not is_secret_path(resolved_relative)
84
- ):
85
- files.append(path)
86
- if len(files) >= limit:
87
- break
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/benchmark_v3.json"),
160
+ default=Path("evaluation/benchmark_v4.json"),
161
161
  help="Qualification catalog path",
162
162
  )
163
163
  parser.add_argument(