agentic-dev-loop 0.13.0__tar.gz → 0.14.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 (156) hide show
  1. {agentic_dev_loop-0.13.0/src/agentic_dev_loop.egg-info → agentic_dev_loop-0.14.0}/PKG-INFO +1 -1
  2. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/pyproject.toml +1 -1
  3. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/templates/trigger-agentic-dev-loop.sh +8 -0
  4. agentic_dev_loop-0.14.0/src/agentic_dev_loop/viz/__init__.py +16 -0
  5. agentic_dev_loop-0.14.0/src/agentic_dev_loop/viz/__main__.py +59 -0
  6. agentic_dev_loop-0.14.0/src/agentic_dev_loop/viz/page.py +11 -0
  7. agentic_dev_loop-0.14.0/src/agentic_dev_loop/viz/runs_view.py +214 -0
  8. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/viz/server.py +109 -18
  9. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0/src/agentic_dev_loop.egg-info}/PKG-INFO +1 -1
  10. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop.egg-info/SOURCES.txt +2 -0
  11. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_build_viz_page.py +3 -0
  12. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_trigger_script.py +47 -0
  13. agentic_dev_loop-0.14.0/tests/test_unit13_runs_viz.py +233 -0
  14. agentic_dev_loop-0.13.0/src/agentic_dev_loop/viz/__init__.py +0 -13
  15. agentic_dev_loop-0.13.0/src/agentic_dev_loop/viz/__main__.py +0 -44
  16. agentic_dev_loop-0.13.0/src/agentic_dev_loop/viz/page.py +0 -9
  17. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/LICENSE +0 -0
  18. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/README.md +0 -0
  19. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/setup.cfg +0 -0
  20. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/__init__.py +0 -0
  21. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/core/__init__.py +0 -0
  22. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/core/config.py +0 -0
  23. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/core/failure.py +0 -0
  24. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/core/paths.py +0 -0
  25. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/core/profiles/__init__.py +0 -0
  26. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/core/profiles/data/dotnet-node.yaml +0 -0
  27. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/core/profiles/data/python.yaml +0 -0
  28. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/core/results.py +0 -0
  29. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/core/verdict.py +0 -0
  30. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/__init__.py +0 -0
  31. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/actions.py +0 -0
  32. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/agent_error_guide.md +0 -0
  33. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/agent_error_guide.py +0 -0
  34. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/agents.py +0 -0
  35. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/allowlist.py +0 -0
  36. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/brief_coverage.py +0 -0
  37. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/brief_prompt.md +0 -0
  38. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/brief_prompt.py +0 -0
  39. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/cli.py +0 -0
  40. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/completion.py +0 -0
  41. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/containers.py +0 -0
  42. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/copilot_auth.py +0 -0
  43. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/deps.py +0 -0
  44. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/dryrun.py +0 -0
  45. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/egress_policy.py +0 -0
  46. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/egress_proxy.py +0 -0
  47. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/extensions/__init__.py +0 -0
  48. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/extensions/aidlc.py +0 -0
  49. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/forbidden.py +0 -0
  50. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/graph.py +0 -0
  51. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/hostboundary.py +0 -0
  52. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/isolation.py +0 -0
  53. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/llm.py +0 -0
  54. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/loaders.py +0 -0
  55. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/mounts.py +0 -0
  56. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/__init__.py +0 -0
  57. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/checks.py +0 -0
  58. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/doctor.py +0 -0
  59. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/init.py +0 -0
  60. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/recipes/dotnet-node.yaml +0 -0
  61. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/recipes/python.yaml +0 -0
  62. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/recipes.py +0 -0
  63. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/templates/dev.agent.md +0 -0
  64. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/templates/env.example +0 -0
  65. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/templates/qa.agent.md +0 -0
  66. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/templates/review.agent.md +0 -0
  67. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/templates.py +0 -0
  68. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/onboarding/upgrade.py +0 -0
  69. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/outputs.py +0 -0
  70. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/presets.py +0 -0
  71. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/proc.py +0 -0
  72. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/provider_wire.py +0 -0
  73. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/registry.py +0 -0
  74. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/run_status.py +0 -0
  75. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/run_status_command.md +0 -0
  76. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/seccomp/__init__.py +0 -0
  77. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/seccomp/chromium-userns.json +0 -0
  78. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/secrets.py +0 -0
  79. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/stages.py +0 -0
  80. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/step_workspace.py +0 -0
  81. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/engine/sync_back.py +0 -0
  82. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/py.typed +0 -0
  83. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/reporting/__init__.py +0 -0
  84. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/reporting/metrics.py +0 -0
  85. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/reporting/render.py +0 -0
  86. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/reporting/sources.py +0 -0
  87. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop/viz/layout.py +0 -0
  88. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop.egg-info/dependency_links.txt +0 -0
  89. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop.egg-info/entry_points.txt +0 -0
  90. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop.egg-info/requires.txt +0 -0
  91. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/src/agentic_dev_loop.egg-info/top_level.txt +0 -0
  92. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_029_merge_on_conflict.py +0 -0
  93. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_033_brief_step.py +0 -0
  94. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_035_finalize_nudge.py +0 -0
  95. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_036_banned_commands_and_lane_boundary.py +0 -0
  96. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_041_brief_coverage.py +0 -0
  97. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_046_brief_prompt.py +0 -0
  98. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_055_cli.py +0 -0
  99. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_055_doctor.py +0 -0
  100. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_055_init.py +0 -0
  101. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_055_profile_loading.py +0 -0
  102. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_055_profiles.py +0 -0
  103. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_055_recipes.py +0 -0
  104. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_055_schema_lock.py +0 -0
  105. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_055_templates.py +0 -0
  106. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_055_upgrade.py +0 -0
  107. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_actions.py +0 -0
  108. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_agent_error_guide.py +0 -0
  109. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_agents.py +0 -0
  110. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_aidlc.py +0 -0
  111. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_cli.py +0 -0
  112. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_config.py +0 -0
  113. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_containers.py +0 -0
  114. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_copilot_auth.py +0 -0
  115. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_copilot_cli.py +0 -0
  116. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_deps.py +0 -0
  117. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_dry_run.py +0 -0
  118. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_e2e_fixtures.py +0 -0
  119. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_egress_proxy.py +0 -0
  120. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_graph.py +0 -0
  121. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_hostboundary.py +0 -0
  122. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_hostboundary_integration.py +0 -0
  123. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_isolation.py +0 -0
  124. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_isolation_integration.py +0 -0
  125. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_isolation_pbt.py +0 -0
  126. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_llm.py +0 -0
  127. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_loaders.py +0 -0
  128. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_module_contract.py +0 -0
  129. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_outputs.py +0 -0
  130. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_outputs_pbt.py +0 -0
  131. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_proc.py +0 -0
  132. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_provider_wire.py +0 -0
  133. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_publish.py +0 -0
  134. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_qa_prompt.py +0 -0
  135. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_registry.py +0 -0
  136. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_repo_ascii.py +0 -0
  137. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_results.py +0 -0
  138. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_run_status.py +0 -0
  139. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_sdk_compat.py +0 -0
  140. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_secrets.py +0 -0
  141. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_secrets_integration.py +0 -0
  142. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_secrets_pipeline.py +0 -0
  143. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_source_resolution.py +0 -0
  144. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_stages.py +0 -0
  145. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_step_workspace.py +0 -0
  146. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_sync_back.py +0 -0
  147. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_unit11.py +0 -0
  148. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_unit11_pbt.py +0 -0
  149. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_unit12_reporting.py +0 -0
  150. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_unit5_config.py +0 -0
  151. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_unit5_pbt.py +0 -0
  152. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_unit5_pure.py +0 -0
  153. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_verdict.py +0 -0
  154. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_viz.py +0 -0
  155. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_viz_demo.py +0 -0
  156. {agentic_dev_loop-0.13.0 → agentic_dev_loop-0.14.0}/tests/test_viz_layout.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-dev-loop
3
- Version: 0.13.0
3
+ Version: 0.14.0
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 = "0.13.0"
7
+ version = "0.14.0"
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"
@@ -37,6 +37,14 @@ if ! agentic-dev-loop doctor --fast; then
37
37
  echo "error: doctor --fast still fails after upgrading the engine" >&2
38
38
  exit 1
39
39
  fi
40
+ # The upgrade rewrites the project pin; commit the bump (only when dirty) so
41
+ # the tooling integrity check passes on the next run instead of failing on
42
+ # an uncommitted pin. Skipped when git is unavailable or the pin is clean.
43
+ if git rev-parse --is-inside-work-tree >/dev/null 2>&1 \
44
+ && [[ -n "$(git status --porcelain -- agentic-dev-loop/.engine-version)" ]]; then
45
+ git add agentic-dev-loop/.engine-version
46
+ git commit -m "Upgrade engine"
47
+ fi
40
48
  fi
41
49
 
42
50
  # Document loader selection - exactly one of:
@@ -0,0 +1,16 @@
1
+ """The live-graph visualiser and the historical runs view."""
2
+
3
+ import time # noqa: F401 - re-exported so tests can pin NodeWatch's clock
4
+
5
+ from . import runs_view
6
+ from .server import (MAX_LINE, PAGE, RUNS_PAGE, ConsoleCapture,
7
+ HeartbeatThread, NodeWatch, VizBus, _ReuseSafeServer,
8
+ _Tee, _handler_class, serve_history, serve_viz,
9
+ topology_graph, topology_mermaid, translate)
10
+
11
+ __all__ = [
12
+ "MAX_LINE", "PAGE", "RUNS_PAGE", "ConsoleCapture", "HeartbeatThread",
13
+ "NodeWatch", "VizBus", "_ReuseSafeServer", "_Tee", "_handler_class",
14
+ "runs_view", "serve_history", "serve_viz", "topology_graph",
15
+ "topology_mermaid", "translate",
16
+ ]
@@ -0,0 +1,59 @@
1
+ """Standalone viz launcher.
2
+
3
+ ``python -m agentic_dev_loop.viz --pipeline <pipeline.yaml>`` serves the
4
+ live graph on localhost; ``--history`` serves the historical runs view with
5
+ no pipeline file.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import argparse
11
+ import sys
12
+
13
+ from agentic_dev_loop.core.config import load_config
14
+
15
+ from . import VizBus, serve_history, serve_viz, topology_graph
16
+
17
+
18
+ def main(argv: list[str] | None = None) -> int:
19
+ parser = argparse.ArgumentParser(
20
+ prog="agentic-dev-loop-viz",
21
+ description="Serve the agentic-dev-loop live graph or run history.")
22
+ parser.add_argument("--pipeline",
23
+ help="pipeline YAML for the flowchart topology "
24
+ "(required unless --history)")
25
+ parser.add_argument("--history", action="store_true",
26
+ help="serve the historical runs view without a "
27
+ "pipeline file")
28
+ parser.add_argument("--port", type=int, default=8321,
29
+ help="preferred port (default 8321; free-port "
30
+ "fallback when busy)")
31
+ args = parser.parse_args(argv)
32
+
33
+ if args.history:
34
+ httpd, _thread = serve_history(args.port)
35
+ label = "Run history viz"
36
+ else:
37
+ pipeline = args.pipeline or "pipeline.yaml"
38
+ cfg = load_config(pipeline)
39
+ topology = topology_graph(cfg)
40
+ bus = VizBus()
41
+ httpd, _thread = serve_viz(bus, topology["mermaid"], cfg.name,
42
+ args.port, topology["nodes"],
43
+ topology["flow"], topology["edges"])
44
+ label = "Live graph viz"
45
+
46
+ bound = httpd.server_address[1]
47
+ url = f"http://127.0.0.1:{bound}"
48
+ print(f"{label}: {url}", flush=True)
49
+ if args.port and bound != args.port:
50
+ print(f"viz port {args.port} busy - serving on {url}", flush=True)
51
+ try:
52
+ httpd.serve_forever()
53
+ except KeyboardInterrupt:
54
+ pass
55
+ return 0
56
+
57
+
58
+ if __name__ == "__main__":
59
+ sys.exit(main())