bog-agents-cli 0.9.2__tar.gz → 0.9.4__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 (495) hide show
  1. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/CHANGELOG.md +12 -0
  2. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/PKG-INFO +1 -1
  3. bog_agents_cli-0.9.4/bog_agents_cli/_version.py +3 -0
  4. bog_agents_cli-0.9.4/bog_agents_cli/headless_commands.py +254 -0
  5. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/main.py +26 -0
  6. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/non_interactive.py +99 -6
  7. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/ui.py +1 -0
  8. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/pyproject.toml +1 -1
  9. bog_agents_cli-0.9.4/tests/unit_tests/test_headless_commands.py +88 -0
  10. bog_agents_cli-0.9.4/tests/unit_tests/test_non_interactive_tool_calls.py +126 -0
  11. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/uv.lock +7 -3
  12. bog_agents_cli-0.9.2/bog_agents_cli/_version.py +0 -3
  13. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/.gitignore +0 -0
  14. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/Makefile +0 -0
  15. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/README.md +0 -0
  16. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/__init__.py +0 -0
  17. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/__main__.py +0 -0
  18. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/_bedrock.py +0 -0
  19. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/_constants.py +0 -0
  20. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/_debug.py +0 -0
  21. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/_observability.py +0 -0
  22. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/_panic.py +0 -0
  23. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/_proc.py +0 -0
  24. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/_server_config.py +0 -0
  25. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/_server_constants.py +0 -0
  26. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/_settings_cascade.py +0 -0
  27. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/_spec.py +0 -0
  28. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/_subprocess_stderr.py +0 -0
  29. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/_testing_models.py +0 -0
  30. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/agent.py +0 -0
  31. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/api_keys.py +0 -0
  32. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/app.py +0 -0
  33. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/app.tcss +0 -0
  34. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/ask_user.py +0 -0
  35. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/auto_commit.py +0 -0
  36. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/auto_mode.py +0 -0
  37. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/background_agents.py +0 -0
  38. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/bedrock_refresh.py +0 -0
  39. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/browser_cli.py +0 -0
  40. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/built_in_skills/__init__.py +0 -0
  41. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/built_in_skills/expert_starter_rules/starter.yaml +0 -0
  42. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
  43. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  44. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  45. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/bundled_agents/go/code-reviewer/AGENTS.md +0 -0
  46. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/bundled_agents/node/code-reviewer/AGENTS.md +0 -0
  47. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/bundled_agents/node/react-ink-artist/AGENTS.md +0 -0
  48. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/bundled_agents/node/test-author/AGENTS.md +0 -0
  49. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/bundled_agents/python/code-reviewer/AGENTS.md +0 -0
  50. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/bundled_agents/python/refactorer/AGENTS.md +0 -0
  51. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/bundled_agents/python/test-author/AGENTS.md +0 -0
  52. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/bundled_agents/rust/code-reviewer/AGENTS.md +0 -0
  53. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/bundled_agents/rust/test-author/AGENTS.md +0 -0
  54. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/causal/__init__.py +0 -0
  55. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/causal/controller.py +0 -0
  56. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/causal/ledger.py +0 -0
  57. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/causal/middleware.py +0 -0
  58. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/causal/render.py +0 -0
  59. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/claude_code_compat.py +0 -0
  60. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cli_sounds.py +0 -0
  61. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/clipboard.py +0 -0
  62. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cmd_benchmark.py +0 -0
  63. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cmd_build.py +0 -0
  64. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cmd_call.py +0 -0
  65. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cmd_checkpoint.py +0 -0
  66. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cmd_daemon.py +0 -0
  67. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cmd_explain.py +0 -0
  68. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cmd_index.py +0 -0
  69. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cmd_memory_sync.py +0 -0
  70. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cmd_pr_review.py +0 -0
  71. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cmd_test.py +0 -0
  72. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cmd_undo.py +0 -0
  73. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cmd_verify.py +0 -0
  74. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/code_intelligence_cli.py +0 -0
  75. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/command_registry.py +0 -0
  76. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/__init__.py +0 -0
  77. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/_base.py +0 -0
  78. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/_registry.py +0 -0
  79. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/agent.py +0 -0
  80. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/analysis.py +0 -0
  81. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/config.py +0 -0
  82. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/enterprise.py +0 -0
  83. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/general.py +0 -0
  84. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/git.py +0 -0
  85. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/info.py +0 -0
  86. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/multimodal.py +0 -0
  87. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/quality.py +0 -0
  88. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/session.py +0 -0
  89. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/ui.py +0 -0
  90. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/commands/web.py +0 -0
  91. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/compact_selective.py +0 -0
  92. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/compliance/__init__.py +0 -0
  93. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/compliance/audit_pack.py +0 -0
  94. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/compliance/controller.py +0 -0
  95. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/compliance/cron.py +0 -0
  96. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/compliance/evidence.py +0 -0
  97. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/compliance/examples/__init__.py +0 -0
  98. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/compliance/examples/audit-nightly.yaml +0 -0
  99. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/compliance/examples/soc2-baseline.yaml +0 -0
  100. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/compliance/report.py +0 -0
  101. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/compliance/runner.py +0 -0
  102. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/computer_use.py +0 -0
  103. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/config.py +0 -0
  104. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/configurable_model.py +0 -0
  105. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/conversation_buffer.py +0 -0
  106. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/cross-platform-notes.md +0 -0
  107. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/daemon_client.py +0 -0
  108. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dashboard.py +0 -0
  109. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/default_agent_prompt.md +0 -0
  110. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/__init__.py +0 -0
  111. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/pipelines/blog-post.yaml +0 -0
  112. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/pipelines/bug-investigation.yaml +0 -0
  113. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/pipelines/code-review.yaml +0 -0
  114. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/pipelines/dependency-audit.yaml +0 -0
  115. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/pipelines/github-issue-autofix.yaml +0 -0
  116. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/pipelines/jira-ticket-autofix.yaml +0 -0
  117. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/pipelines/morning-standup.yaml +0 -0
  118. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/pipelines/new-feature.yaml +0 -0
  119. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/pipelines/onboarding-guide.yaml +0 -0
  120. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/pipelines/readme-auto-updater.yaml +0 -0
  121. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/pipelines/security-scan.yaml +0 -0
  122. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/pipelines/sprint-planning.yaml +0 -0
  123. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/pipelines/weekly-report.yaml +0 -0
  124. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults/prompt_library.toml +0 -0
  125. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/defaults_seeder.py +0 -0
  126. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/devil.py +0 -0
  127. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/doctor.py +0 -0
  128. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/doctor_deep.py +0 -0
  129. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dream.py +0 -0
  130. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/__init__.py +0 -0
  131. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/config.py +0 -0
  132. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/dashboard.py +0 -0
  133. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/domain.py +0 -0
  134. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/dream_engine.py +0 -0
  135. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/imagination.py +0 -0
  136. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/laws.py +0 -0
  137. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/lifecycle.py +0 -0
  138. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/rule_proposer.py +0 -0
  139. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/runner.py +0 -0
  140. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/scheduler.py +0 -0
  141. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/seeds.py +0 -0
  142. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/shared_memory.py +0 -0
  143. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/telemetry.py +0 -0
  144. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/dreamscape/violations.py +0 -0
  145. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/drive/__init__.py +0 -0
  146. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/drive/actions.py +0 -0
  147. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/drive/entrypoint.py +0 -0
  148. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/drive/replay_model.py +0 -0
  149. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/drive/runner.py +0 -0
  150. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/drive/snapshot.py +0 -0
  151. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/enterprise_cli.py +0 -0
  152. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/expert/__init__.py +0 -0
  153. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/expert/_helpers.py +0 -0
  154. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/expert/propose.py +0 -0
  155. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/expert/status.py +0 -0
  156. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/expert/watch.py +0 -0
  157. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/expert/wizard.py +0 -0
  158. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/expert/write.py +0 -0
  159. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/expert_controller.py +0 -0
  160. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/expert_watch.py +0 -0
  161. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/extensibility.py +0 -0
  162. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/extensions.py +0 -0
  163. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/feature_helpers.py +0 -0
  164. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/feedback_loop.py +0 -0
  165. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/file_ops.py +0 -0
  166. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/file_watcher.py +0 -0
  167. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/handoff.py +0 -0
  168. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/hooks.py +0 -0
  169. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/image_cli.py +0 -0
  170. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/imagine.py +0 -0
  171. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/input.py +0 -0
  172. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/input_shortcuts.py +0 -0
  173. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/integrations/__init__.py +0 -0
  174. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/integrations/daytona.py +0 -0
  175. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/integrations/docker.py +0 -0
  176. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/integrations/langsmith.py +0 -0
  177. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/integrations/modal.py +0 -0
  178. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/integrations/runloop.py +0 -0
  179. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/integrations/sandbox_factory.py +0 -0
  180. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/integrations/sandbox_provider.py +0 -0
  181. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/io_utils.py +0 -0
  182. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/jobs_manager.py +0 -0
  183. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/json_output.py +0 -0
  184. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/jury.py +0 -0
  185. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/keybindings.py +0 -0
  186. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/langsmith_cli.py +0 -0
  187. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/local_context.py +0 -0
  188. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/mcp_config_manager.py +0 -0
  189. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/mcp_registry.py +0 -0
  190. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/mcp_tools.py +0 -0
  191. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/mcp_trust.py +0 -0
  192. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/media_utils.py +0 -0
  193. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/mentions.py +0 -0
  194. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/model_config.py +0 -0
  195. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/multi_agent.py +0 -0
  196. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/multi_model_cli.py +0 -0
  197. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/oauth_mcp.py +0 -0
  198. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/orchestrator.py +0 -0
  199. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/orchestrator_controller.py +0 -0
  200. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/output.py +0 -0
  201. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/peat/__init__.py +0 -0
  202. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/peat/jobs.py +0 -0
  203. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/peat/persona.py +0 -0
  204. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/peat/research.py +0 -0
  205. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/peat/runner.py +0 -0
  206. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/peat/scheduler.py +0 -0
  207. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/personas.py +0 -0
  208. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/pipeline.py +0 -0
  209. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/plugin_marketplace.py +0 -0
  210. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/policy_prove/__init__.py +0 -0
  211. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/policy_prove/controller.py +0 -0
  212. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/policy_prove/invariant.py +0 -0
  213. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/policy_prove/prover.py +0 -0
  214. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/postmortem.py +0 -0
  215. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/pr_cli.py +0 -0
  216. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/pr_output.py +0 -0
  217. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/preflight.py +0 -0
  218. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/profiles.py +0 -0
  219. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/project_hooks.py +0 -0
  220. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/project_memory.py +0 -0
  221. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/project_utils.py +0 -0
  222. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/prompt_library.py +0 -0
  223. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/prompts.py +0 -0
  224. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/provider_catalog.py +0 -0
  225. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/proxy_tools.py +0 -0
  226. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/py.typed +0 -0
  227. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/qa/__init__.py +0 -0
  228. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/qa/ac.py +0 -0
  229. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/qa/artifact.py +0 -0
  230. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/qa/executor.py +0 -0
  231. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/qa/plan.py +0 -0
  232. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/race.py +0 -0
  233. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/recipes.py +0 -0
  234. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/recommend.py +0 -0
  235. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/release_train.py +0 -0
  236. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/release_train_config.py +0 -0
  237. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/release_train_sources/__init__.py +0 -0
  238. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/release_train_sources/base.py +0 -0
  239. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/release_train_sources/halo.py +0 -0
  240. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/release_train_sources/jira.py +0 -0
  241. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/remote.py +0 -0
  242. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/remote_assets/__init__.py +0 -0
  243. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/remote_assets/ssh_cancel.py +0 -0
  244. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/remote_assets/ssh_status.py +0 -0
  245. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/remote_assets/ssh_submit.py +0 -0
  246. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/remote_assets/ssh_worker.py +0 -0
  247. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/remote_client.py +0 -0
  248. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/remote_sandbox.py +0 -0
  249. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/replay.py +0 -0
  250. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/repo_map_display.py +0 -0
  251. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/review_command.py +0 -0
  252. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/scratch.py +0 -0
  253. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/server.py +0 -0
  254. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/server_graph.py +0 -0
  255. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/server_manager.py +0 -0
  256. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/session_fork.py +0 -0
  257. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/session_manager.py +0 -0
  258. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/sessions.py +0 -0
  259. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/sidecar.py +0 -0
  260. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/sidecar_controller.py +0 -0
  261. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/skill_flywheel.py +0 -0
  262. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/skills/__init__.py +0 -0
  263. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/skills/commands.py +0 -0
  264. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/skills/load.py +0 -0
  265. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/smart_context_cli.py +0 -0
  266. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/smoketest.py +0 -0
  267. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/squad.py +0 -0
  268. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/standing_orders.py +0 -0
  269. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/streaming_diff.py +0 -0
  270. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/subagents.py +0 -0
  271. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/system_prompt.md +0 -0
  272. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/teach.py +0 -0
  273. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/team_config.py +0 -0
  274. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/team_orchestration.py +0 -0
  275. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/telephone.py +0 -0
  276. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/test_tools_cli.py +0 -0
  277. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/textual_adapter.py +0 -0
  278. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/time_travel.py +0 -0
  279. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/timeouts.py +0 -0
  280. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/tool_display.py +0 -0
  281. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/tools.py +0 -0
  282. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/tracefile/__init__.py +0 -0
  283. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/tracefile/controller.py +0 -0
  284. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/tracefile/exporters/__init__.py +0 -0
  285. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/tracefile/exporters/claude_code.py +0 -0
  286. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/tracefile/signing.py +0 -0
  287. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/tracefile/spec.py +0 -0
  288. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/unicode_security.py +0 -0
  289. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/update_check.py +0 -0
  290. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/vars.py +0 -0
  291. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/vars_store.py +0 -0
  292. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/vault.py +0 -0
  293. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/web_fetch.py +0 -0
  294. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/web_search.py +0 -0
  295. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/whisper.py +0 -0
  296. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/__init__.py +0 -0
  297. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/_links.py +0 -0
  298. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/agents_panel.py +0 -0
  299. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/approval.py +0 -0
  300. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/ask_user.py +0 -0
  301. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/autocomplete.py +0 -0
  302. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/chat_input.py +0 -0
  303. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/diff.py +0 -0
  304. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/history.py +0 -0
  305. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/loading.py +0 -0
  306. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/mcp_viewer.py +0 -0
  307. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/message_store.py +0 -0
  308. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/messages.py +0 -0
  309. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/model_selector.py +0 -0
  310. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/pipeline_screen.py +0 -0
  311. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/prompt_library_screen.py +0 -0
  312. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/settings_screen.py +0 -0
  313. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/status.py +0 -0
  314. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/telephone.py +0 -0
  315. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/thread_selector.py +0 -0
  316. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/tool_renderers.py +0 -0
  317. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/tool_widgets.py +0 -0
  318. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/bog_agents_cli/widgets/welcome.py +0 -0
  319. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/examples/skills/arxiv-search/SKILL.md +0 -0
  320. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  321. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/examples/skills/langgraph-docs/SKILL.md +0 -0
  322. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/examples/skills/skill-creator/SKILL.md +0 -0
  323. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  324. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  325. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/examples/skills/web-research/SKILL.md +0 -0
  326. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/images/cli.png +0 -0
  327. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/scripts/check_imports.py +0 -0
  328. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/scripts/install.sh +0 -0
  329. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/README.md +0 -0
  330. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/conftest.py +0 -0
  331. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/integration_tests/__init__.py +0 -0
  332. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/integration_tests/benchmarks/__init__.py +0 -0
  333. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  334. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/integration_tests/conftest.py +0 -0
  335. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/integration_tests/test_acp_mode.py +0 -0
  336. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/integration_tests/test_compact_resume.py +0 -0
  337. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/integration_tests/test_dreamscape_e2e.py +0 -0
  338. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/integration_tests/test_sandbox_factory.py +0 -0
  339. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/integration_tests/test_sandbox_operations.py +0 -0
  340. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/__init__.py +0 -0
  341. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/conftest.py +0 -0
  342. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/drive/__init__.py +0 -0
  343. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/drive/scripts/help_modal.yaml +0 -0
  344. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/drive/scripts/snapshot.yaml +0 -0
  345. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/drive/scripts/type_and_submit.yaml +0 -0
  346. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/drive/scripts/vars.yaml +0 -0
  347. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/drive/test_actions.py +0 -0
  348. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/drive/test_replay_model.py +0 -0
  349. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/drive/test_runner.py +0 -0
  350. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/skills/__init__.py +0 -0
  351. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/skills/test_commands.py +0 -0
  352. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/skills/test_load.py +0 -0
  353. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/skills/test_skills_json.py +0 -0
  354. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_agent.py +0 -0
  355. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_always_ask.py +0 -0
  356. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_anthropic_httpx_per_loop.py +0 -0
  357. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_api_keys.py +0 -0
  358. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_app.py +0 -0
  359. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_apply_plan_models.py +0 -0
  360. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_approval.py +0 -0
  361. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_args.py +0 -0
  362. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_ask_user.py +0 -0
  363. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  364. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_async_command.py +0 -0
  365. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_auto_commit.py +0 -0
  366. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_auto_mode_rules.py +0 -0
  367. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_autocomplete.py +0 -0
  368. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_bedrock.py +0 -0
  369. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_bedrock_async.py +0 -0
  370. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_bedrock_auth.py +0 -0
  371. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_bedrock_refresh.py +0 -0
  372. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_causal.py +0 -0
  373. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_charset.py +0 -0
  374. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_charset_detect.py +0 -0
  375. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_chat_input.py +0 -0
  376. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_clipboard.py +0 -0
  377. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_cmd_benchmark.py +0 -0
  378. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_cmd_build.py +0 -0
  379. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_cmd_checkpoint.py +0 -0
  380. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_cmd_explain.py +0 -0
  381. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_cmd_index.py +0 -0
  382. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_cmd_memory_sync.py +0 -0
  383. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_cmd_pr_review.py +0 -0
  384. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_cmd_test.py +0 -0
  385. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_cmd_undo.py +0 -0
  386. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_cmd_verify_no_output.py +0 -0
  387. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_command_registry_handlers.py +0 -0
  388. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_commands_registry.py +0 -0
  389. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_compact.py +0 -0
  390. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_compact_tool.py +0 -0
  391. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_compliance.py +0 -0
  392. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_computer_use.py +0 -0
  393. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_config.py +0 -0
  394. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_configurable_model.py +0 -0
  395. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_conversation_buffer.py +0 -0
  396. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_debug.py +0 -0
  397. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_docker_sandbox_arg.py +0 -0
  398. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_doctor.py +0 -0
  399. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_doctor_deep.py +0 -0
  400. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_dreamscape.py +0 -0
  401. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_dreamscape_rule_proposer.py +0 -0
  402. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_end_to_end.py +0 -0
  403. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_exception_handling.py +0 -0
  404. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_expert_controller.py +0 -0
  405. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_expert_watch.py +0 -0
  406. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_expert_wizard_cli.py +0 -0
  407. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_extensibility.py +0 -0
  408. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_extensions.py +0 -0
  409. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_feedback_loop.py +0 -0
  410. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_file_ops.py +0 -0
  411. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_first_run_no_api_key.py +0 -0
  412. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_hierarchical_agent_md.py +0 -0
  413. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_hierarchical_skills.py +0 -0
  414. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_history.py +0 -0
  415. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_hooks.py +0 -0
  416. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_imports.py +0 -0
  417. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_input_parsing.py +0 -0
  418. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_jury.py +0 -0
  419. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_killer_features.py +0 -0
  420. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_killer_slash_features.py +0 -0
  421. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_local_context.py +0 -0
  422. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_main.py +0 -0
  423. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_main_acp_mode.py +0 -0
  424. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_main_args.py +0 -0
  425. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_mcp_catalog.py +0 -0
  426. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_mcp_config_manager.py +0 -0
  427. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_mcp_tools.py +0 -0
  428. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_mcp_trust.py +0 -0
  429. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_mcp_viewer.py +0 -0
  430. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_media_utils.py +0 -0
  431. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_message_store.py +0 -0
  432. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_message_store_persistence.py +0 -0
  433. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_messages.py +0 -0
  434. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_model_config.py +0 -0
  435. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_model_selector.py +0 -0
  436. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_model_switch.py +0 -0
  437. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_new_features.py +0 -0
  438. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_non_interactive.py +0 -0
  439. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_observability.py +0 -0
  440. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_orchestrator.py +0 -0
  441. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_output.py +0 -0
  442. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_panic.py +0 -0
  443. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_pasted_text_tracker.py +0 -0
  444. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_peat.py +0 -0
  445. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_personas.py +0 -0
  446. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_policy_prove.py +0 -0
  447. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_postmortem.py +0 -0
  448. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_preflight.py +0 -0
  449. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_project_hooks.py +0 -0
  450. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_project_memory.py +0 -0
  451. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_prompts.py +0 -0
  452. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_provider_catalog_display.py +0 -0
  453. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_qa.py +0 -0
  454. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_race.py +0 -0
  455. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_recipes.py +0 -0
  456. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_release_train_sources.py +0 -0
  457. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_reload.py +0 -0
  458. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_remote.py +0 -0
  459. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_remote_client.py +0 -0
  460. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_replay.py +0 -0
  461. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_server.py +0 -0
  462. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_server_config.py +0 -0
  463. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_server_graph.py +0 -0
  464. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_server_helpers.py +0 -0
  465. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_server_manager.py +0 -0
  466. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_sessions.py +0 -0
  467. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_shell_allow_list.py +0 -0
  468. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_shell_injection.py +0 -0
  469. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_sidecar.py +0 -0
  470. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_skill_flywheel.py +0 -0
  471. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_smoketest.py +0 -0
  472. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_standing_orders.py +0 -0
  473. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_status.py +0 -0
  474. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_subagents.py +0 -0
  475. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_subprocess_stderr.py +0 -0
  476. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_team_orchestration.py +0 -0
  477. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_telephone.py +0 -0
  478. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_textual_adapter.py +0 -0
  479. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_thinking_config.py +0 -0
  480. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_thread_selector.py +0 -0
  481. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_time_travel.py +0 -0
  482. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_timeouts.py +0 -0
  483. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_token_tracker.py +0 -0
  484. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_token_warnings.py +0 -0
  485. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_tracefile.py +0 -0
  486. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_ui.py +0 -0
  487. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_unicode_security.py +0 -0
  488. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_update_check.py +0 -0
  489. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_vars.py +0 -0
  490. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_vault.py +0 -0
  491. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_version.py +0 -0
  492. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_web_fetch.py +0 -0
  493. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/test_welcome.py +0 -0
  494. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/tools/__init__.py +0 -0
  495. {bog_agents_cli-0.9.2 → bog_agents_cli-0.9.4}/tests/unit_tests/tools/test_fetch_url.py +0 -0
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.9.4](https://github.com/bogware/bog-agents/compare/bog-agents-cli==0.9.3...bog-agents-cli==0.9.4) (2026-06-08)
4
+
5
+
6
+ ### Features
7
+
8
+ * **sdk,cli:** deepagents parity, headless driving, provider resilience ([#91](https://github.com/bogware/bog-agents/issues/91)) ([165c5cb](https://github.com/bogware/bog-agents/commit/165c5cbc17a28fac8e15026914dfd7b0da3b02f2))
9
+
10
+ ## [0.9.3](https://github.com/bogware/bog-agents/compare/bog-agents-cli==0.9.2...bog-agents-cli==0.9.3) (2026-05-23)
11
+
12
+
13
+ * **bog-agents-cli:** Synchronize bog-agents-monorepo versions
14
+
3
15
  ## [0.9.2](https://github.com/bogware/bog-agents/compare/bog-agents-cli==0.9.1...bog-agents-cli==0.9.2) (2026-05-22)
4
16
 
5
17
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bog-agents-cli
3
- Version: 0.9.2
3
+ Version: 0.9.4
4
4
  Summary: Bog Agents CLI — your coding agent in the terminal, patient as still water. 80+ slash commands, any LLM provider (Anthropic, OpenAI, Bedrock, Google, Ollama and more), persistent memory, plan mode, /qa acceptance-criteria harness, /peat personal scheduler, /record + /replay, in-memory secrets vault, MCP marketplace with 35+ servers, deep doctor, panic dumps, and a matte swamp/neon-green TUI. One install, no code required. Pass through in harmony.
5
5
  Project-URL: Homepage, https://github.com/bogware/bog-agents
6
6
  Project-URL: Repository, https://github.com/bogware/bog-agents
@@ -0,0 +1,3 @@
1
+ """Version information for `bog-agents-cli`."""
2
+
3
+ __version__ = "0.9.4" # x-release-please-version
@@ -0,0 +1,254 @@
1
+ """Headless (non-interactive) execution of slash commands.
2
+
3
+ Most slash commands live as `_handle_*_command` methods on the Textual
4
+ `BogAgentsApp` and assume a live TUI. This module provides a curated,
5
+ TUI-free surface so AI agents and API users can drive informational and
6
+ configuration commands from the command line:
7
+
8
+ bog-agents command "/help"
9
+ bog-agents command "/commands" --json
10
+ bog-agents command "/model"
11
+
12
+ Commands that are inherently interactive (or that drive the live agent
13
+ session) are not exposed here; for those, `run_headless_command` returns a
14
+ clear "not available headless" result that lists the commands that are.
15
+
16
+ Each headless command is a plain function `(args: str) -> HeadlessResult`,
17
+ registered in `HEADLESS_COMMANDS`. Keeping handlers as standalone functions
18
+ (rather than methods on the TUI app) makes them unit-testable without
19
+ spinning up Textual — the pattern CLAUDE.md recommends for new command
20
+ logic.
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ import sys
26
+ from collections.abc import Callable
27
+ from dataclasses import dataclass
28
+ from pathlib import Path
29
+ from typing import Any
30
+
31
+
32
+ @dataclass(frozen=True)
33
+ class HeadlessResult:
34
+ """Outcome of a headless slash-command invocation.
35
+
36
+ Attributes:
37
+ ok: Whether the command succeeded.
38
+ text: Human-readable output (printed in `text` mode).
39
+ data: Optional structured payload (emitted in `json`/`jsonl` mode).
40
+ """
41
+
42
+ ok: bool
43
+ text: str
44
+ data: dict[str, Any] | None = None
45
+
46
+
47
+ def _ok(text: str, data: dict[str, Any] | None = None) -> HeadlessResult:
48
+ return HeadlessResult(ok=True, text=text, data=data)
49
+
50
+
51
+ def _err(text: str, data: dict[str, Any] | None = None) -> HeadlessResult:
52
+ return HeadlessResult(ok=False, text=text, data=data)
53
+
54
+
55
+ def _cmd_version(_args: str) -> HeadlessResult:
56
+ """Show the CLI and SDK versions."""
57
+ from bog_agents_cli._version import __version__ as cli_version
58
+
59
+ try:
60
+ import bog_agents
61
+
62
+ sdk_version = bog_agents.__version__
63
+ except Exception:
64
+ sdk_version = "unknown"
65
+ return _ok(
66
+ f"bog-agents-cli {cli_version}\nbog-agents (SDK) {sdk_version}",
67
+ {"cli": cli_version, "sdk": sdk_version},
68
+ )
69
+
70
+
71
+ def _cmd_model(_args: str) -> HeadlessResult:
72
+ """Show the currently configured model."""
73
+ from bog_agents_cli.config import settings
74
+
75
+ current = getattr(settings, "model_name", None)
76
+ text = (
77
+ f"Current model: {current}"
78
+ if current
79
+ else "No model configured (a default is used at runtime)."
80
+ )
81
+ return _ok(text, {"model": current})
82
+
83
+
84
+ def _cmd_config(_args: str) -> HeadlessResult:
85
+ """Show key resolved configuration values and the config file path."""
86
+ from bog_agents_cli.config import settings
87
+
88
+ cfg_path = Path.home() / ".bog-agents" / "config.toml"
89
+ data: dict[str, Any] = {
90
+ "config_path": str(cfg_path),
91
+ "config_exists": cfg_path.exists(),
92
+ "model": getattr(settings, "model_name", None),
93
+ }
94
+ lines = [
95
+ f"Config file: {cfg_path}",
96
+ f"Exists: {cfg_path.exists()}",
97
+ f"Model: {data['model']}",
98
+ ]
99
+ return _ok("\n".join(lines), data)
100
+
101
+
102
+ def _cmd_changelog(_args: str) -> HeadlessResult:
103
+ """Print the CLI changelog."""
104
+ path = Path(__file__).resolve().parent.parent / "CHANGELOG.md"
105
+ if not path.exists():
106
+ return _err("CHANGELOG.md not found.", {"found": False})
107
+ text = path.read_text(encoding="utf-8")
108
+ return _ok(text, {"found": True, "path": str(path)})
109
+
110
+
111
+ def _command_rows() -> list[dict[str, Any]]:
112
+ """Build the list of all slash commands with a headless-capable flag."""
113
+ from bog_agents_cli.command_registry import SLASH_COMMAND_SPECS
114
+
115
+ rows: list[dict[str, Any]] = []
116
+ for spec in sorted(SLASH_COMMAND_SPECS, key=lambda s: s.name):
117
+ rows.append(
118
+ {
119
+ "name": spec.name,
120
+ "description": spec.description,
121
+ "category": spec.category,
122
+ "headless": spec.name.lstrip("/") in HEADLESS_COMMANDS,
123
+ }
124
+ )
125
+ return rows
126
+
127
+
128
+ def _cmd_commands(_args: str) -> HeadlessResult:
129
+ """List every slash command and mark which run headlessly."""
130
+ rows = _command_rows()
131
+ lines = ["Slash commands (* runs headlessly via `bog-agents command`):"]
132
+ for row in rows:
133
+ mark = "*" if row["headless"] else " "
134
+ lines.append(f" {mark} {row['name']:<22} {row['description']}")
135
+ return _ok("\n".join(lines), {"commands": rows})
136
+
137
+
138
+ def _cmd_help(args: str) -> HeadlessResult:
139
+ """Show help for all commands, or details for one named command."""
140
+ target = args.strip().lstrip("/")
141
+ if not target:
142
+ return _cmd_commands("")
143
+ from bog_agents_cli.command_registry import SLASH_COMMAND_SPECS
144
+
145
+ for spec in SLASH_COMMAND_SPECS:
146
+ if spec.name.lstrip("/") == target:
147
+ headless = target in HEADLESS_COMMANDS
148
+ data: dict[str, Any] = {
149
+ "name": spec.name,
150
+ "description": spec.description,
151
+ "category": spec.category,
152
+ "aliases": list(spec.aliases),
153
+ "headless": headless,
154
+ "subcommands": [list(sub) for sub in spec.subcommands],
155
+ }
156
+ lines = [
157
+ f"{spec.name} — {spec.description}",
158
+ f"Category: {spec.category}",
159
+ f"Headless: {headless}",
160
+ ]
161
+ if spec.aliases:
162
+ lines.append(f"Aliases: {', '.join(spec.aliases)}")
163
+ if spec.subcommands:
164
+ lines.append(
165
+ "Subcommands: " + ", ".join(name for name, _ in spec.subcommands)
166
+ )
167
+ return _ok("\n".join(lines), data)
168
+ return _err(f"Unknown command: /{target}", {"name": target, "found": False})
169
+
170
+
171
+ # Registry of headless-capable commands: name -> (description, handler).
172
+ HEADLESS_COMMANDS: dict[str, tuple[str, Callable[[str], HeadlessResult]]] = {
173
+ "commands": ("List all slash commands and which run headlessly", _cmd_commands),
174
+ "help": ("Show help for all or a specific slash command", _cmd_help),
175
+ "version": ("Show CLI and SDK versions", _cmd_version),
176
+ "model": ("Show the configured model", _cmd_model),
177
+ "config": ("Show resolved configuration", _cmd_config),
178
+ "changelog": ("Show the CLI changelog", _cmd_changelog),
179
+ }
180
+
181
+
182
+ def run_headless_command(command_line: str, *, output_format: str = "text") -> int:
183
+ """Execute a single slash command without the interactive TUI.
184
+
185
+ Args:
186
+ command_line: The command to run, with or without a leading slash and
187
+ with optional arguments (e.g. `"/help model"`, `"commands"`).
188
+ output_format: `"text"` (human-readable, default), or `"json"`/`"jsonl"`
189
+ for a single machine-readable envelope on stdout.
190
+
191
+ Returns:
192
+ Exit code: `0` on success, `1` when the command ran but reported a
193
+ failure, `2` when the command is unknown or not available headless.
194
+ """
195
+ raw = command_line.strip()
196
+ if not raw:
197
+ return _emit(
198
+ _err('No command provided. Try `bog-agents command "/help"`.'),
199
+ "empty",
200
+ output_format,
201
+ )
202
+
203
+ name, _, args = raw.lstrip("/").partition(" ")
204
+ name = name.strip().lower()
205
+ entry = HEADLESS_COMMANDS.get(name)
206
+ if entry is None:
207
+ available = ", ".join(f"/{key}" for key in sorted(HEADLESS_COMMANDS))
208
+ message = (
209
+ f"/{name} is not available in non-interactive mode. "
210
+ f"Headless commands: {available}. "
211
+ "Run other commands inside the interactive TUI, or use a dedicated "
212
+ "subcommand where one exists (e.g. `bog-agents threads list`)."
213
+ )
214
+ return _emit(
215
+ _err(
216
+ message,
217
+ {
218
+ "command": name,
219
+ "error": "not_headless",
220
+ "headless_commands": sorted(HEADLESS_COMMANDS),
221
+ },
222
+ ),
223
+ name,
224
+ output_format,
225
+ )
226
+
227
+ _description, handler = entry
228
+ try:
229
+ result = handler(args)
230
+ except Exception as exc:
231
+ result = _err(
232
+ f"Command /{name} failed: {exc}", {"command": name, "error": "exception"}
233
+ )
234
+ return _emit(result, name, output_format)
235
+
236
+
237
+ def _emit(result: HeadlessResult, command_name: str, output_format: str) -> int:
238
+ """Write a `HeadlessResult` to stdout/stderr and return its exit code."""
239
+ if output_format in ("json", "jsonl"):
240
+ from bog_agents_cli.output import write_json
241
+
242
+ payload: dict[str, Any] = {"ok": result.ok}
243
+ payload.update(result.data or {"text": result.text})
244
+ write_json(f"command:{command_name}", payload)
245
+ else:
246
+ stream = sys.stdout if result.ok else sys.stderr
247
+ print(result.text, file=stream)
248
+ if not result.ok:
249
+ return (
250
+ 1
251
+ if result.data and result.data.get("error") not in ("not_headless", "empty")
252
+ else 2
253
+ )
254
+ return 0
@@ -350,6 +350,16 @@ def parse_args() -> argparse.Namespace:
350
350
  help="AWS region override (defaults to AWS_REGION env / profile config)",
351
351
  )
352
352
 
353
+ command_parser = subparsers.add_parser(
354
+ "command",
355
+ help="Run a slash command non-interactively (e.g. 'command \"/help\"')",
356
+ )
357
+ command_parser.add_argument(
358
+ "slash",
359
+ help="The slash command to run, e.g. '/help', '/commands', '/model'",
360
+ )
361
+ add_json_output_arg(command_parser)
362
+
353
363
  threads_parser = subparsers.add_parser(
354
364
  "threads",
355
365
  help="Manage conversation threads",
@@ -543,6 +553,18 @@ def parse_args() -> argparse.Namespace:
543
553
  )
544
554
 
545
555
  add_json_output_arg(parser, default="text")
556
+ parser.add_argument(
557
+ "--jsonl",
558
+ dest="output_format",
559
+ action="store_const",
560
+ const="jsonl",
561
+ help=(
562
+ "Stream newline-delimited JSON events (stream-json) for "
563
+ "non-interactive runs: one object per line for start, text "
564
+ "deltas, tool_call, tool_result, and a terminal final event "
565
+ "with thread_id, response, tool_calls, and usage stats."
566
+ ),
567
+ )
546
568
 
547
569
  parser.add_argument(
548
570
  "--auto-approve",
@@ -1825,6 +1847,10 @@ def cli_main() -> None:
1825
1847
  from bog_agents_cli.cmd_call import cmd_call
1826
1848
 
1827
1849
  sys.exit(cmd_call(args))
1850
+ elif args.command == "command":
1851
+ from bog_agents_cli.headless_commands import run_headless_command
1852
+
1853
+ sys.exit(run_headless_command(args.slash, output_format=output_format))
1828
1854
  elif args.command == "test-bedrock":
1829
1855
  from bog_agents_cli._bedrock import probe_bedrock, render_probe_report
1830
1856
 
@@ -152,6 +152,21 @@ def _write_newline() -> None:
152
152
  sys.stdout.flush()
153
153
 
154
154
 
155
+ def _emit_jsonl(event: dict[str, Any]) -> None:
156
+ """Write a single JSON object to stdout as one line (newline-terminated).
157
+
158
+ Used by the `jsonl` (stream-json) output format so a programmatic driver
159
+ can consume one event per line as the agent runs.
160
+
161
+ Args:
162
+ event: The event payload to serialize. Must be JSON-serializable.
163
+ """
164
+ import json
165
+
166
+ sys.stdout.write(json.dumps(event, default=str) + "\n")
167
+ sys.stdout.flush()
168
+
169
+
155
170
  @dataclass
156
171
  class StreamState:
157
172
  """Mutable state accumulated while iterating over the agent stream."""
@@ -168,6 +183,10 @@ class StreamState:
168
183
  agent finishes.
169
184
  """
170
185
 
186
+ output_format: str = "text"
187
+ """Output format: `"text"` (human stream), `"json"` (single buffered
188
+ envelope), or `"jsonl"` (one JSON event per line as the run progresses)."""
189
+
171
190
  full_response: list[str] = field(default_factory=list)
172
191
  """Accumulated text fragments from the AI message stream."""
173
192
 
@@ -203,6 +222,17 @@ class StreamState:
203
222
  stats: SessionStats = field(default_factory=SessionStats)
204
223
  """Accumulated model usage stats for this stream."""
205
224
 
225
+ tool_calls: list[dict[str, Any]] = field(default_factory=list)
226
+ """Ordered, de-duplicated record of tool calls the agent made this run.
227
+
228
+ Each entry is `{"name": str, "args": dict}`. Populated from completed
229
+ `tool_calls` on each `AIMessage` and surfaced in the `--json` / `--jsonl`
230
+ output so programmatic drivers can see what the agent did, not just its
231
+ final text. De-duplicated by tool-call id."""
232
+
233
+ _seen_tool_call_ids: set[str] = field(default_factory=set)
234
+ """Internal: tool-call ids already recorded in `tool_calls` (dedupe)."""
235
+
206
236
 
207
237
  @dataclass
208
238
  class ThreadUrlLookupState:
@@ -317,6 +347,27 @@ def _process_ai_message(
317
347
  # which is the only reliable place to read complete args (the per-chunk
318
348
  # tool_call_chunk blocks only carry partial JSON fragments).
319
349
  completed_tool_calls = getattr(message_obj, "tool_calls", None) or []
350
+ # Record every completed tool call (name + args) once, keyed by id, so the
351
+ # structured (`--json` / `--jsonl`) output can report the agent's actions.
352
+ for tc in completed_tool_calls:
353
+ if not isinstance(tc, dict):
354
+ continue
355
+ tc_name = tc.get("name")
356
+ if not tc_name:
357
+ continue
358
+ tc_id = tc.get("id")
359
+ dedupe_key = (
360
+ tc_id
361
+ if isinstance(tc_id, str) and tc_id
362
+ else f"{tc_name}-{len(state.tool_calls)}"
363
+ )
364
+ if dedupe_key in state._seen_tool_call_ids:
365
+ continue
366
+ state._seen_tool_call_ids.add(dedupe_key)
367
+ tc_args = tc.get("args") if isinstance(tc.get("args"), dict) else {}
368
+ state.tool_calls.append({"name": tc_name, "args": tc_args})
369
+ if state.output_format == "jsonl":
370
+ _emit_jsonl({"type": "tool_call", "name": tc_name, "args": tc_args})
320
371
  for tc in completed_tool_calls:
321
372
  if not isinstance(tc, dict):
322
373
  continue
@@ -343,7 +394,9 @@ def _process_ai_message(
343
394
  if block_type == "text":
344
395
  text = block.get("text", "")
345
396
  if text:
346
- if state.stream:
397
+ if state.output_format == "jsonl":
398
+ _emit_jsonl({"type": "text", "text": text})
399
+ elif state.stream:
347
400
  _write_text(text)
348
401
  state.full_response.append(text)
349
402
  elif block_type in {"tool_call_chunk", "tool_call"}:
@@ -421,6 +474,18 @@ def _process_message_chunk(
421
474
  if isinstance(message_obj, AIMessage):
422
475
  _process_ai_message(message_obj, state, console)
423
476
  elif isinstance(message_obj, ToolMessage):
477
+ if state.output_format == "jsonl":
478
+ content = message_obj.content
479
+ if isinstance(content, list):
480
+ content = " ".join(str(c) for c in content)
481
+ _emit_jsonl(
482
+ {
483
+ "type": "tool_result",
484
+ "name": message_obj.name,
485
+ "status": getattr(message_obj, "status", "success"),
486
+ "content": str(content)[:4000],
487
+ }
488
+ )
424
489
  record = file_op_tracker.complete_with_message(message_obj)
425
490
  if record and record.diff:
426
491
  console.print(f"[dim]📝 {record.display_path}[/dim]")
@@ -850,12 +915,14 @@ async def _run_agent_loop(
850
915
  Raises:
851
916
  HITLIterationLimitError: If the HITL iteration limit is exceeded.
852
917
  """
853
- state = StreamState(quiet=quiet, stream=stream)
918
+ state = StreamState(quiet=quiet, stream=stream, output_format=output_format)
854
919
  stream_input: dict[str, Any] | Command = {
855
920
  "messages": [{"role": "user", "content": message}]
856
921
  }
857
922
 
858
923
  thread_id = config.get("configurable", {}).get("thread_id", "")
924
+ if output_format == "jsonl":
925
+ _emit_jsonl({"type": "start", "thread_id": thread_id})
859
926
  await dispatch_hook("session.start", {"thread_id": thread_id})
860
927
 
861
928
  start_time = time.monotonic()
@@ -896,6 +963,7 @@ async def _run_agent_loop(
896
963
  "data": {
897
964
  "thread_id": thread_id,
898
965
  "response": "".join(state.full_response).strip(),
966
+ "tool_calls": state.tool_calls,
899
967
  "stats": {
900
968
  "wall_time_seconds": round(wall_time, 3),
901
969
  "model": next(iter(state.stats.per_model), None),
@@ -906,12 +974,31 @@ async def _run_agent_loop(
906
974
  },
907
975
  }
908
976
  _write_text(_json.dumps(envelope) + "\n")
977
+ elif output_format == "jsonl":
978
+ # Per-event lines already streamed; emit a terminal `final` event with
979
+ # the assembled response, tool calls, and stats for consumers that want
980
+ # a single summary record at the end of the stream.
981
+ _emit_jsonl(
982
+ {
983
+ "type": "final",
984
+ "thread_id": thread_id,
985
+ "response": "".join(state.full_response).strip(),
986
+ "tool_calls": state.tool_calls,
987
+ "stats": {
988
+ "wall_time_seconds": round(wall_time, 3),
989
+ "model": next(iter(state.stats.per_model), None),
990
+ "request_count": getattr(state.stats, "request_count", 0),
991
+ "input_tokens": getattr(state.stats, "input_tokens", 0),
992
+ "output_tokens": getattr(state.stats, "output_tokens", 0),
993
+ },
994
+ }
995
+ )
909
996
  elif state.full_response:
910
997
  if not state.stream:
911
998
  _write_text("".join(state.full_response))
912
999
  _write_newline()
913
1000
 
914
- if not quiet and output_format != "json":
1001
+ if not quiet and output_format not in ("json", "jsonl"):
915
1002
  console.print()
916
1003
  if (
917
1004
  thread_url_lookup is not None
@@ -1072,7 +1159,11 @@ async def run_non_interactive(
1072
1159
  # uses _write_text() -> sys.stdout directly. Both --quiet and --json
1073
1160
  # need stdout reserved for the actual payload — chrome (server-ready,
1074
1161
  # thread headers, status line) must land on stderr.
1075
- console = Console(stderr=True) if (quiet or output_format == "json") else Console()
1162
+ console = (
1163
+ Console(stderr=True)
1164
+ if (quiet or output_format in ("json", "jsonl"))
1165
+ else Console()
1166
+ )
1076
1167
 
1077
1168
  # J2 fix: bail on always_ask BEFORE we instantiate any models.
1078
1169
  # The combination is logically incompatible (non-interactive has no
@@ -1240,7 +1331,9 @@ async def run_non_interactive(
1240
1331
  # JSON output: suppress mid-stream stdout writes so only the
1241
1332
  # envelope reaches stdout. Diagnostic chrome is already routed
1242
1333
  # via stderr console.
1243
- effective_stream = stream and output_format != "json"
1334
+ effective_stream = (
1335
+ stream and output_format != "json"
1336
+ ) # jsonl streams per-event lines
1244
1337
  # Snapshot the working tree just before the agent runs so we
1245
1338
  # can diff against it after to compute the exact set of
1246
1339
  # files the run created or modified. This is the bulletproof
@@ -1254,7 +1347,7 @@ async def run_non_interactive(
1254
1347
  config,
1255
1348
  console,
1256
1349
  file_op_tracker,
1257
- quiet=quiet or output_format == "json",
1350
+ quiet=quiet or output_format in ("json", "jsonl"),
1258
1351
  stream=effective_stream,
1259
1352
  thread_url_lookup=thread_url_lookup,
1260
1353
  output_format=output_format,
@@ -148,6 +148,7 @@ def show_help() -> None:
148
148
  console.print(" -q, --quiet Suppress chrome, pipe-friendly output")
149
149
  console.print(" --no-stream Buffer full response (don't stream)")
150
150
  console.print(" --json Machine-readable JSON output")
151
+ console.print(" --jsonl Stream newline-delimited JSON events")
151
152
  console.print(
152
153
  " --prompt NAME Run a saved prompt from prompt_library.toml"
153
154
  )
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bog-agents-cli"
7
- version = "0.9.2"
7
+ version = "0.9.4"
8
8
  description = "Bog Agents CLI — your coding agent in the terminal, patient as still water. 80+ slash commands, any LLM provider (Anthropic, OpenAI, Bedrock, Google, Ollama and more), persistent memory, plan mode, /qa acceptance-criteria harness, /peat personal scheduler, /record + /replay, in-memory secrets vault, MCP marketplace with 35+ servers, deep doctor, panic dumps, and a matte swamp/neon-green TUI. One install, no code required. Pass through in harmony."
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -0,0 +1,88 @@
1
+ """Tests for headless (non-interactive) slash-command execution."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from typing import TYPE_CHECKING
7
+
8
+ from bog_agents_cli.headless_commands import HEADLESS_COMMANDS, run_headless_command
9
+
10
+ if TYPE_CHECKING:
11
+ import pytest
12
+
13
+
14
+ def test_version_command_text(capsys: pytest.CaptureFixture[str]) -> None:
15
+ """`/version` prints CLI + SDK versions and exits 0."""
16
+ rc = run_headless_command("/version")
17
+ assert rc == 0
18
+ out = capsys.readouterr().out
19
+ assert "bog-agents-cli" in out
20
+ assert "SDK" in out
21
+
22
+
23
+ def test_commands_lists_registry(capsys: pytest.CaptureFixture[str]) -> None:
24
+ """`/commands` lists slash commands and marks headless ones."""
25
+ rc = run_headless_command("commands") # leading slash optional
26
+ assert rc == 0
27
+ out = capsys.readouterr().out
28
+ assert "/model" in out
29
+ assert "Slash commands" in out
30
+
31
+
32
+ def test_help_for_specific_command(capsys: pytest.CaptureFixture[str]) -> None:
33
+ """`/help model` shows details for the model command."""
34
+ rc = run_headless_command("/help model")
35
+ assert rc == 0
36
+ assert "model" in capsys.readouterr().out.lower()
37
+
38
+
39
+ def test_help_unknown_command_returns_1(capsys: pytest.CaptureFixture[str]) -> None:
40
+ """`/help nonexistent` reports the command ran but failed (exit 1)."""
41
+ rc = run_headless_command("/help totally-not-a-command")
42
+ assert rc == 1
43
+ assert "Unknown command" in capsys.readouterr().err
44
+
45
+
46
+ def test_non_headless_command_returns_2(capsys: pytest.CaptureFixture[str]) -> None:
47
+ """A TUI-only command is rejected (exit 2) with guidance listing headless commands."""
48
+ rc = run_headless_command("/plan")
49
+ assert rc == 2
50
+ err = capsys.readouterr().err
51
+ assert "not available in non-interactive mode" in err
52
+ assert "/help" in err
53
+
54
+
55
+ def test_empty_command_returns_2(capsys: pytest.CaptureFixture[str]) -> None:
56
+ """An empty command line is rejected."""
57
+ rc = run_headless_command(" ")
58
+ assert rc == 2
59
+ assert "No command" in capsys.readouterr().err
60
+
61
+
62
+ def test_json_output_envelope(capsys: pytest.CaptureFixture[str]) -> None:
63
+ """`--json` mode emits a single machine-readable envelope on stdout."""
64
+ rc = run_headless_command("/version", output_format="json")
65
+ assert rc == 0
66
+ envelope = json.loads(capsys.readouterr().out.strip())
67
+ assert envelope["schema_version"] == 1
68
+ assert envelope["command"] == "command:version"
69
+ assert envelope["data"]["ok"] is True
70
+ assert "cli" in envelope["data"]
71
+
72
+
73
+ def test_json_non_headless_envelope(capsys: pytest.CaptureFixture[str]) -> None:
74
+ """Non-headless commands emit a structured error envelope in json mode."""
75
+ rc = run_headless_command("/dashboard", output_format="json")
76
+ assert rc == 2
77
+ envelope = json.loads(capsys.readouterr().out.strip())
78
+ assert envelope["data"]["ok"] is False
79
+ assert envelope["data"]["error"] == "not_headless"
80
+ assert "commands" in envelope["data"]["headless_commands"]
81
+
82
+
83
+ def test_registry_handlers_are_callable() -> None:
84
+ """Every registered headless command exposes a (description, handler) pair."""
85
+ for name, (description, handler) in HEADLESS_COMMANDS.items():
86
+ assert isinstance(name, str)
87
+ assert isinstance(description, str)
88
+ assert callable(handler)