monkeybot-cli 0.6.0__tar.gz → 0.7.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 (87) hide show
  1. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/PKG-INFO +1 -1
  2. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/pyproject.toml +1 -1
  3. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold.py +12 -3
  4. monkeybot_cli-0.7.0/src/monkeybot_cli/scaffold_defaults/goal/SKILL.md +31 -0
  5. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +11 -0
  6. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_scaffold.py +8 -1
  7. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/.gitignore +0 -0
  8. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/skills/monkeybot/SKILL.md +0 -0
  9. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/skills/monkeybot/references/config-sections.md +0 -0
  10. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/__init__.py +0 -0
  11. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_file_index.py +0 -0
  12. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_local_shell.py +0 -0
  13. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_renderer.py +0 -0
  14. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_session.py +0 -0
  15. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_status_bar.py +0 -0
  16. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_theme.py +0 -0
  17. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_tool_display.py +0 -0
  18. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_tui.py +0 -0
  19. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_tui_widgets.py +0 -0
  20. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/__init__.py +0 -0
  21. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/chat.py +0 -0
  22. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/doctor.py +0 -0
  23. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/loop.py +0 -0
  24. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/new.py +0 -0
  25. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/refresh.py +0 -0
  26. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/run_cmd.py +0 -0
  27. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/talk.py +0 -0
  28. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/validate.py +0 -0
  29. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/compat.py +0 -0
  30. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/config_resolve.py +0 -0
  31. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/exit_commands.py +0 -0
  32. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/extras_catalog.py +0 -0
  33. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/gateway_health.py +0 -0
  34. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/main.py +0 -0
  35. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/opensandbox_lifecycle.py +0 -0
  36. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/output.py +0 -0
  37. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/process_tree.py +0 -0
  38. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/providers.py +0 -0
  39. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/__init__.py +0 -0
  40. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/audio_io.py +0 -0
  41. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/client.py +0 -0
  42. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/gateway_manager.py +0 -0
  43. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/push_to_talk.py +0 -0
  44. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/session.py +0 -0
  45. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/session_controller.py +0 -0
  46. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/talk_ui.py +0 -0
  47. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/wire_encode.py +0 -0
  48. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/runtime_python.py +0 -0
  49. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/AGENT.md +0 -0
  50. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/Dockerfile +0 -0
  51. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/__init__.py +0 -0
  52. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +0 -0
  53. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +0 -0
  54. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/dockerignore +0 -0
  55. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/env.example +0 -0
  56. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/image-generator/SKILL.md +0 -0
  57. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/image-generator/generate_image.py +0 -0
  58. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/loop/SKILL.md +0 -0
  59. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/mcp.json +0 -0
  60. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/opensandbox.docker.toml +0 -0
  61. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +0 -0
  62. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/permissions.yaml +0 -0
  63. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/session_controller.py +0 -0
  64. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/terminal_markdown.py +0 -0
  65. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_continue.py +0 -0
  66. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_e2e.py +0 -0
  67. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_errors.py +0 -0
  68. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_file_index.py +0 -0
  69. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_grounding.py +0 -0
  70. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_local_shell.py +0 -0
  71. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_renderer_parity.py +0 -0
  72. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_session.py +0 -0
  73. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_status_bar.py +0 -0
  74. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_theme.py +0 -0
  75. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_tool_display.py +0 -0
  76. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_tui.py +0 -0
  77. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_cli.py +0 -0
  78. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_config_resolve.py +0 -0
  79. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_doctor.py +0 -0
  80. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_extras_catalog.py +0 -0
  81. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_gateway_health.py +0 -0
  82. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_opensandbox_lifecycle.py +0 -0
  83. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_realtime_session_controller.py +0 -0
  84. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_run_cmd.py +0 -0
  85. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_runtime_python.py +0 -0
  86. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_terminal_markdown.py +0 -0
  87. {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: monkeybot-cli
3
- Version: 0.6.0
3
+ Version: 0.7.0
4
4
  Summary: CLI to create, configure, validate, and chat with monkeybot agents.
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: httpx>=0.27.0
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "monkeybot-cli"
7
- version = "0.6.0"
7
+ version = "0.7.0"
8
8
  description = "CLI to create, configure, validate, and chat with monkeybot agents."
9
9
  requires-python = ">=3.11"
10
10
  dependencies = [
@@ -176,6 +176,13 @@ def install_loop_skill(dest: Path, *, force: bool) -> str:
176
176
  return _install_file(target, resources.files(_DEFAULTS_PKG) / "loop" / "SKILL.md", force=force)
177
177
 
178
178
 
179
+ def install_goal_skill(dest: Path, *, force: bool) -> str:
180
+ """Install the bundled native-goal procedure into ``skills/goal``."""
181
+ target = dest / "skills" / "goal" / "SKILL.md"
182
+ target.parent.mkdir(parents=True, exist_ok=True)
183
+ return _install_file(target, resources.files(_DEFAULTS_PKG) / "goal" / "SKILL.md", force=force)
184
+
185
+
179
186
  def install_env_example(dest: Path, *, force: bool) -> str:
180
187
  env_example = dest / ".env.example"
181
188
  if env_example.exists() and not force:
@@ -399,6 +406,7 @@ def run_refresh(*, dest: Path) -> list[str]:
399
406
  report.append(refresh_permissions_if_default(cfg_dir))
400
407
  report.append(refresh_monkeybot_yaml(cfg_dir))
401
408
  report.extend(ensure_memory(dest, force=False))
409
+ report.append(f" skills/goal/SKILL.md: {install_goal_skill(dest, force=False)}")
402
410
  return report
403
411
 
404
412
 
@@ -412,11 +420,12 @@ def run_new(
412
420
  ) -> list[str]:
413
421
  """Full scaffold: config bundle, empty skills root, writable state, and image files.
414
422
 
415
- Capability skills (``browser``, ``image-generator``, ``loop``) are packaged
423
+ Optional capability skills (``browser``, ``image-generator``, ``loop``) are packaged
416
424
  under ``scaffold_defaults`` but not installed into new agents for now —
417
425
  the Mac Main Agent loads them from ``~/.monkeybot/.internal/skills``
418
426
  instead. Re-enable via ``install_*_skill`` when custom agents should get
419
- them again.
427
+ them again. The ``goal`` skill is installed because native goal tools are
428
+ intentionally exposed only for explicit ``/goal`` invocations.
420
429
  """
421
430
  cfg_dir = dest / "monkeybot_config"
422
431
  report = install_config_bundle(cfg_dir, force=force)
@@ -426,7 +435,7 @@ def run_new(
426
435
  )
427
436
  report.extend(ensure_memory(dest, force=force))
428
437
  report.extend(ensure_workspace(dest, force=force))
429
- report.append(" skills/: ensured (empty — capability skills deferred)")
438
+ report.append(f" skills/goal/SKILL.md: {install_goal_skill(dest, force=force)}")
430
439
  report.append(f" .env.example: {install_env_example(dest, force=force)}")
431
440
  report.extend(install_container_files(dest, force=force))
432
441
  report.append(
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: goal
3
+ description: Create one durable objective that continues across scheduled turns until completed.
4
+ ---
5
+
6
+ # Goal
7
+
8
+ Use this skill only when the user explicitly invokes `/goal` with an objective
9
+ that may require multiple turns.
10
+
11
+ ## Start
12
+
13
+ 1. Preserve the user's complete objective without narrowing its scope.
14
+ 2. Call `create_goal` exactly once with that objective.
15
+ 3. Do the first concrete increment of work in the same turn.
16
+ 4. Keep the returned goal id; every `update_goal` call must include it.
17
+
18
+ ## Continue
19
+
20
+ - Goal continuations are scheduled automatically.
21
+ - Treat the stored objective as authoritative.
22
+ - Make measurable progress and verify results before declaring completion.
23
+ - Temporary session-busy deferrals are normal and are not goal failures.
24
+ - Persistent execution failures stop the goal after the retry limit so it
25
+ cannot consume resources indefinitely.
26
+
27
+ ## Complete
28
+
29
+ Call `update_goal` with the returned `goal_id` and `status="complete"` only
30
+ after evidence proves every requirement is satisfied. Otherwise leave the goal
31
+ active. Use the `/goals` control plane to pause, resume, or stop it manually.
@@ -253,6 +253,17 @@ scheduler:
253
253
  # Env override: MONKEYBOT_SCHEDULER_ENABLED (1 | true | yes | on).
254
254
  enabled: false
255
255
 
256
+ # Background verifier (YAML-only). Off by default: ledger costs one model call
257
+ # per human message. `enabled: true` turns on omitted ledger/tracker flags;
258
+ # omitted judge.enabled turns on only when the tracker is on. Explicit
259
+ # `enabled: false` still opts a nested section out. Omitted ledger.model /
260
+ # judge.model inherit model.name (same fallback as the agent). The live
261
+ # worker is session-bound ProviderJudge. Realtime loops ignore this block.
262
+ # verifier:
263
+ # enabled: true
264
+ # escalation:
265
+ # max_severity: nudge
266
+
256
267
  # Optional JSON for model.provider: fake tests (env: MONKEYBOT_FAKE_PROVIDER_EVENTS)
257
268
  # fake_provider:
258
269
  # events_json: '[[]]'
@@ -34,6 +34,7 @@ def test_run_new_creates_bundle(tmp_path: Path) -> None:
34
34
  assert not (tmp_path / "skills" / "browser").exists()
35
35
  assert not (tmp_path / "skills" / "image-generator").exists()
36
36
  assert not (tmp_path / "skills" / "loop").exists()
37
+ assert (tmp_path / "skills" / "goal" / "SKILL.md").is_file()
37
38
  assert (tmp_path / "workspace" / ".gitkeep").is_file()
38
39
  assert (tmp_path / "workspace" / "browser" / "playbooks").is_dir()
39
40
  assert (tmp_path / "workspace" / "generated-media" / "images").is_dir()
@@ -153,6 +154,8 @@ def test_run_refresh_adds_template_commands_and_keeps_extras(tmp_path: Path) ->
153
154
  doc = yaml.safe_load(yaml_path.read_text(encoding="utf-8")) or {}
154
155
  doc.pop("memory", None)
155
156
  yaml_path.write_text(yaml.safe_dump(doc, sort_keys=False), encoding="utf-8")
157
+ goal_skill = tmp_path / "skills" / "goal" / "SKILL.md"
158
+ goal_skill.unlink()
156
159
 
157
160
  report = run_refresh(dest=tmp_path)
158
161
  text = allow.read_text(encoding="utf-8")
@@ -166,6 +169,7 @@ def test_run_refresh_adds_template_commands_and_keeps_extras(tmp_path: Path) ->
166
169
  refreshed_yaml = yaml_path.read_text(encoding="utf-8")
167
170
  assert "enabled: true" in refreshed_yaml
168
171
  assert "custom persona" not in refreshed_yaml
172
+ assert goal_skill.is_file()
169
173
  joined = "\n".join(report)
170
174
  assert "command_allowlist.yaml: updated" in joined
171
175
  assert "monkeybot.yaml: updated" in joined
@@ -174,7 +178,10 @@ def test_run_refresh_adds_template_commands_and_keeps_extras(tmp_path: Path) ->
174
178
  def test_run_refresh_skips_custom_permissions_and_model(tmp_path: Path) -> None:
175
179
  run_new(dest=tmp_path, force=False, provider="nvidia", model="keep-me")
176
180
  perms = tmp_path / "monkeybot_config" / "permissions.yaml"
177
- perms.write_text("default: deny\nrules:\n - tool: '*'\n pattern: '*'\n effect: deny\n", encoding="utf-8")
181
+ perms.write_text(
182
+ "default: deny\nrules:\n - tool: '*'\n pattern: '*'\n effect: deny\n",
183
+ encoding="utf-8",
184
+ )
178
185
  yaml_path = tmp_path / "monkeybot_config" / "monkeybot.yaml"
179
186
  before = yaml_path.read_text(encoding="utf-8")
180
187
 
File without changes
File without changes