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.
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/PKG-INFO +1 -1
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/pyproject.toml +1 -1
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold.py +12 -3
- monkeybot_cli-0.7.0/src/monkeybot_cli/scaffold_defaults/goal/SKILL.md +31 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +11 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_scaffold.py +8 -1
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/.gitignore +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/skills/monkeybot/SKILL.md +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/skills/monkeybot/references/config-sections.md +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/__init__.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_file_index.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_local_shell.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_renderer.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_session.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_status_bar.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_theme.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_tool_display.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_tui.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/chat_tui_widgets.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/__init__.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/chat.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/doctor.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/loop.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/new.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/refresh.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/run_cmd.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/talk.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/commands/validate.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/compat.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/config_resolve.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/exit_commands.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/extras_catalog.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/gateway_health.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/main.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/opensandbox_lifecycle.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/output.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/process_tree.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/providers.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/__init__.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/audio_io.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/client.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/gateway_manager.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/push_to_talk.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/session.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/session_controller.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/talk_ui.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/wire_encode.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/runtime_python.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/AGENT.md +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/Dockerfile +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/__init__.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/dockerignore +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/env.example +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/image-generator/SKILL.md +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/image-generator/generate_image.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/loop/SKILL.md +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/mcp.json +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/opensandbox.docker.toml +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/permissions.yaml +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/session_controller.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/terminal_markdown.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_continue.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_e2e.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_errors.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_file_index.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_grounding.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_local_shell.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_renderer_parity.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_session.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_status_bar.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_theme.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_tool_display.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_chat_tui.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_cli.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_config_resolve.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_doctor.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_extras_catalog.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_gateway_health.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_opensandbox_lifecycle.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_realtime_session_controller.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_run_cmd.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_runtime_python.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/tests/test_terminal_markdown.py +0 -0
- {monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/uv.lock +0 -0
|
@@ -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
|
-
|
|
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
|
|
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(
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/realtime/session_controller.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
{monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/dockerignore
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/loop/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{monkeybot_cli-0.6.0 → monkeybot_cli-0.7.0}/src/monkeybot_cli/scaffold_defaults/permissions.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|