agentic-dev-loop 1.0.0a22__tar.gz → 1.0.0a23__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.

Potentially problematic release.


This version of agentic-dev-loop might be problematic. Click here for more details.

Files changed (88) hide show
  1. {agentic_dev_loop-1.0.0a22/src/agentic_dev_loop.egg-info → agentic_dev_loop-1.0.0a23}/PKG-INFO +1 -1
  2. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/pyproject.toml +1 -1
  3. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/isolation.py +20 -0
  4. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23/src/agentic_dev_loop.egg-info}/PKG-INFO +1 -1
  5. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_graph.py +0 -16
  6. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_isolation.py +37 -0
  7. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/LICENSE +0 -0
  8. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/README.md +0 -0
  9. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/setup.cfg +0 -0
  10. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/__init__.py +0 -0
  11. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/core/__init__.py +0 -0
  12. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/core/config.py +0 -0
  13. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/core/paths.py +0 -0
  14. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/core/results.py +0 -0
  15. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/core/verdict.py +0 -0
  16. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/__init__.py +0 -0
  17. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/actions.py +0 -0
  18. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/agents.py +0 -0
  19. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/cli.py +0 -0
  20. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/deps.py +0 -0
  21. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/dryrun.py +0 -0
  22. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/egress_policy.py +0 -0
  23. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/egress_proxy.py +0 -0
  24. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/extensions/__init__.py +0 -0
  25. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/extensions/aidlc.py +0 -0
  26. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/graph.py +0 -0
  27. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/hostboundary.py +0 -0
  28. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/llm.py +0 -0
  29. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/loaders.py +0 -0
  30. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/mounts.py +0 -0
  31. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/outputs.py +0 -0
  32. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/presets.py +0 -0
  33. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/proc.py +0 -0
  34. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/registry.py +0 -0
  35. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/seccomp/__init__.py +0 -0
  36. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/seccomp/chromium-userns.json +0 -0
  37. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/secrets.py +0 -0
  38. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/stages.py +0 -0
  39. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/step_workspace.py +0 -0
  40. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/engine/sync_back.py +0 -0
  41. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/py.typed +0 -0
  42. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/viz/__init__.py +0 -0
  43. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/viz/__main__.py +0 -0
  44. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop/viz/server.py +0 -0
  45. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop.egg-info/SOURCES.txt +0 -0
  46. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop.egg-info/dependency_links.txt +0 -0
  47. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop.egg-info/entry_points.txt +0 -0
  48. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop.egg-info/requires.txt +0 -0
  49. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/src/agentic_dev_loop.egg-info/top_level.txt +0 -0
  50. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_028_declared_caches.py +0 -0
  51. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_actions.py +0 -0
  52. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_agents.py +0 -0
  53. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_aidlc.py +0 -0
  54. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_cli.py +0 -0
  55. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_config.py +0 -0
  56. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_deps.py +0 -0
  57. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_dry_run.py +0 -0
  58. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_e2e_fixtures.py +0 -0
  59. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_egress_proxy.py +0 -0
  60. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_hostboundary.py +0 -0
  61. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_hostboundary_integration.py +0 -0
  62. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_isolation_integration.py +0 -0
  63. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_isolation_pbt.py +0 -0
  64. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_llm.py +0 -0
  65. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_loaders.py +0 -0
  66. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_module_contract.py +0 -0
  67. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_outputs.py +0 -0
  68. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_outputs_pbt.py +0 -0
  69. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_proc.py +0 -0
  70. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_publish.py +0 -0
  71. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_qa_prompt.py +0 -0
  72. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_registry.py +0 -0
  73. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_repo_ascii.py +0 -0
  74. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_results.py +0 -0
  75. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_sdk_compat.py +0 -0
  76. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_secrets.py +0 -0
  77. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_secrets_integration.py +0 -0
  78. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_secrets_pipeline.py +0 -0
  79. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_source_resolution.py +0 -0
  80. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_stages.py +0 -0
  81. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_step_workspace.py +0 -0
  82. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_sync_back.py +0 -0
  83. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_trigger_script.py +0 -0
  84. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_unit5_config.py +0 -0
  85. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_unit5_pbt.py +0 -0
  86. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_unit5_pure.py +0 -0
  87. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_verdict.py +0 -0
  88. {agentic_dev_loop-1.0.0a22 → agentic_dev_loop-1.0.0a23}/tests/test_viz.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-dev-loop
3
- Version: 1.0.0a22
3
+ Version: 1.0.0a23
4
4
  Summary: Turn an LLM into a gated, sandboxed, resumable construction loop over your codebase.
5
5
  Author: Luke Wilson
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agentic-dev-loop"
7
- version = "1.0.0a22"
7
+ version = "1.0.0a23"
8
8
  description = "Turn an LLM into a gated, sandboxed, resumable construction loop over your codebase."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -1307,6 +1307,16 @@ def resolve_image_ref(image: str, environ: Mapping[str, str] | None = None) -> s
1307
1307
  return image
1308
1308
 
1309
1309
 
1310
+ _MODULE_TAG = __name__.rsplit(".", 1)[-1]
1311
+
1312
+
1313
+ def _announce(msg: str) -> None:
1314
+ """One-line console progress note for the eager startup phases. The tag is
1315
+ derived from the emitting module's own name (what a logging library's
1316
+ name field would record), never hardcoded."""
1317
+ print(f"[{_MODULE_TAG}] {msg}", flush=True)
1318
+
1319
+
1310
1320
  def startup_sandbox(cfg: PipelineConfig, *, workspace: Path,
1311
1321
  state_dir: str | Path,
1312
1322
  runner: CommandRunner | None = None,
@@ -1323,6 +1333,7 @@ def startup_sandbox(cfg: PipelineConfig, *, workspace: Path,
1323
1333
  direct Sandbox API (DockerBackend without an export + requests carrying
1324
1334
  ``mount_set=None``), which is integration-tests-only."""
1325
1335
  seccomp_profile = resolved_seccomp_profile(cfg)
1336
+ _announce("probing docker daemon...")
1326
1337
  probe_docker(runner)
1327
1338
  profile = resolve_effective_profile(cfg.isolation)
1328
1339
  image = resolve_image_ref(profile.image)
@@ -1343,15 +1354,18 @@ def startup_sandbox(cfg: PipelineConfig, *, workspace: Path,
1343
1354
  cache_paths.append(SANDBOX_VENV_DIR)
1344
1355
  for cache in cfg.caches:
1345
1356
  (workspace / cache).mkdir(parents=True, exist_ok=True)
1357
+ _announce("materialising workspace export...")
1346
1358
  ws = StepWorkspace.materialise(
1347
1359
  workspace, cache_paths, sys.platform, export_root,
1348
1360
  state_dir=str(state_dir), excludes=list(cfg.sync_excludes))
1349
1361
  export_root = str(ws.export_root)
1350
1362
  cache_mounts = ws.mount_points()[1:] # skip the export root itself
1363
+ _announce(f"export ready at {export_root}")
1351
1364
  # Repair console-script shebangs that bake a previous run's dead export
1352
1365
  # path (028): a venv built by export A must execute its ``bin/*`` scripts
1353
1366
  # when mounted into export B.
1354
1367
  venv_dir = Path(sandbox_venv_dir) if sandbox_venv_dir else workspace / SANDBOX_VENV_DIR
1368
+ _announce("checking venv shebangs")
1355
1369
  repair_venv_shebangs(venv_dir, state_dir=state_dir, export_root=export_root)
1356
1370
 
1357
1371
  backend = DockerBackend(
@@ -1360,11 +1374,17 @@ def startup_sandbox(cfg: PipelineConfig, *, workspace: Path,
1360
1374
  sandbox_venv_dir=sandbox_venv_dir, seccomp_profile=seccomp_profile,
1361
1375
  export_root=export_root, cache_mounts=cache_mounts,
1362
1376
  sync_excludes=list(cfg.sync_excludes))
1377
+ _announce(f"preparing sandbox image {image} (first pull can take a while)")
1363
1378
  backend.ensure_image()
1379
+ _announce("sandbox image ready")
1380
+ _announce("starting execution container...")
1364
1381
  backend.create_execution_container()
1382
+ _announce("execution container started")
1365
1383
  if refresh is None:
1366
1384
  refresh = bool(cfg.isolation and cfg.isolation.refresh)
1367
1385
  for setup_cmd, stamp_key in _declared_setups(cfg, workspace):
1386
+ _announce(f"provisioning setup (stamp {stamp_key[:8]})")
1368
1387
  backend.provision(setup_cmd, stamp_key, str(iso_state_dir / "stamps"),
1369
1388
  force=refresh)
1389
+ _announce("sandbox ready")
1370
1390
  return backend
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-dev-loop
3
- Version: 1.0.0a22
3
+ Version: 1.0.0a23
4
4
  Summary: Turn an LLM into a gated, sandboxed, resumable construction loop over your codebase.
5
5
  Author: Luke Wilson
6
6
  License-Expression: Apache-2.0
@@ -9,7 +9,6 @@ import argparse
9
9
  import queue
10
10
  import sqlite3
11
11
  import subprocess
12
- import time
13
12
  from pathlib import Path
14
13
 
15
14
  import pytest
@@ -353,21 +352,6 @@ class TestCommandStep:
353
352
  second_dev = fake_agents.messages_for("dev")[1]
354
353
  assert "test output" in second_dev and "attempt 1" in second_dev
355
354
 
356
- def test_timeout_exhausts_run_and_kills_process_group(self, repo,
357
- fake_agents):
358
- yaml = COMMAND_STAGE_YAML.replace(
359
- " command: python -c \"import sys; import pathlib; print('test output'); sys.exit(0 if pathlib.Path('.pr/fix.marker').exists() else 1)\"",
360
- ' command: python -c "import time; time.sleep(3)"\n timeout: 0.2')
361
- self._write(repo, yaml)
362
- fake_agents.set("dev", [("write", "fix.marker", "")])
363
- start = time.monotonic()
364
- ok, attempts = run_pipeline("commandstage.yaml", args())
365
- elapsed = time.monotonic() - start
366
- assert (ok, attempts) == (False, 3)
367
- assert fake_agents.agents_called() == ["dev"] * 3
368
- assert all("timed out" in m for m in fake_agents.messages_for("dev")[1:])
369
- assert elapsed < 5.0 # killpg cut the 3s sleeps short
370
-
371
355
  def test_fail_forever_with_cli_max_attempts(self, repo, fake_agents):
372
356
  yaml = COMMAND_STAGE_YAML.replace(
373
357
  "sys.exit(0 if pathlib.Path('.pr/fix.marker').exists() else 1)",
@@ -1023,6 +1023,43 @@ class TestStartupSandbox:
1023
1023
  finally:
1024
1024
  sandbox.close()
1025
1025
 
1026
+ def test_startup_announces_each_phase(self, tmp_path, monkeypatch, capsys):
1027
+ """The eager startup is the long silent span between the CLI banner
1028
+ and the first step's output. Every phase announces itself on the
1029
+ console, tagged with the emitting module's own name."""
1030
+ from agentic_dev_loop.engine import isolation
1031
+ from agentic_dev_loop.engine.isolation import startup_sandbox
1032
+
1033
+ ws = tmp_path / "ws"
1034
+ ws.mkdir()
1035
+ cfg = self._cfg(tmp_path, with_setup=True)
1036
+ monkeypatch.setattr("agentic_dev_loop.engine.isolation.shutil.which",
1037
+ lambda *a: "/usr/bin/docker")
1038
+ monkeypatch.setenv("AGENTIC_DEV_LOOP_DEV_IMAGE", "img:tag")
1039
+ runner = FakeRunner(
1040
+ ok("1.54"), # probe version
1041
+ ok("linux"), # probe ostype
1042
+ ok(""), # image inspect (pull)
1043
+ ok(""), # docker run -d --rm (exec container)
1044
+ ok(""), # docker run provision
1045
+ )
1046
+ sandbox = startup_sandbox(cfg, workspace=ws, state_dir=tmp_path / "run-state", runner=runner)
1047
+ try:
1048
+ out = capsys.readouterr().out
1049
+ tag = f"[{isolation.__name__.rsplit('.', 1)[-1]}]"
1050
+ assert f"{tag} probing docker daemon" in out
1051
+ assert f"{tag} materialising workspace export" in out
1052
+ assert f"{tag} export ready at" in out
1053
+ assert f"{tag} checking venv shebangs" in out
1054
+ assert f"{tag} preparing sandbox image img:tag" in out
1055
+ assert f"{tag} sandbox image ready" in out
1056
+ assert f"{tag} starting execution container" in out
1057
+ assert f"{tag} execution container started" in out
1058
+ assert f"{tag} provisioning setup" in out
1059
+ assert f"{tag} sandbox ready" in out
1060
+ finally:
1061
+ sandbox.close()
1062
+
1026
1063
  def test_network_declaration_starts_second_container(self, tmp_path, monkeypatch):
1027
1064
  """014/unit-5: startup creates only the base network-none export
1028
1065
  container. The bridge-network container for a network-declaring step