Split A0 remote workflow skills by affordance

Replace the combined A0 CLI remote workflow skill with separate text-editor and code-execution remote skills, update tool stubs to load the matching per-tool guide, and keep computer-use remote scoped to desktop control. Add prompt-gating coverage for the per-affordance skill split.
This commit is contained in:
Alessandro 2026-05-08 18:53:37 +02:00
parent 229de5166b
commit a3d41e2ca1
7 changed files with 134 additions and 72 deletions

View file

@ -1,7 +1,7 @@
# code_execution_remote tool
Runs shell-backed execution on the machine where the subscribed A0 CLI is running.
Load `a0-cli-remote-workflows` before using this tool for nontrivial local project work.
Load `code-execution-remote` before using this tool for nontrivial local project work.
Current local access mode: `{{access_mode}}`

View file

@ -1,7 +1,7 @@
# text_editor_remote tool
Reads, writes, and patches files on the machine where the subscribed A0 CLI is running.
This is different from server-side file tools. Load `a0-cli-remote-workflows` before using it for edits.
This is different from server-side file tools. Load `text-editor-remote` before using it for edits.
Current access mode: `{{access_mode}}`

View file

@ -1,64 +0,0 @@
---
name: a0-cli-remote-workflows
description: Guide safe use of A0 CLI remote shell execution and remote file editing on the connected host machine. Load before using code_execution_remote or text_editor_remote for local project work through the CLI connector.
version: 1.0.0
author: Agent Zero Team
tags: ["agent-zero", "a0", "cli", "connector", "remote-execution", "remote-files"]
trigger_patterns:
- "code_execution_remote"
- "text_editor_remote"
- "remote file editing"
- "remote shell execution"
- "edit my local files through a0 cli"
- "run commands on the cli host"
allowed_tools:
- code_execution_remote
- text_editor_remote
---
# A0 CLI Remote Workflows
## Boundary
Use `code_execution_remote` and `text_editor_remote` only for work on the machine where A0 CLI is running. These paths, shells, runtimes, and files belong to the CLI host, not the Agent Zero server or Docker container.
If the task belongs inside Agent Zero's own runtime, use the normal server-side tools instead.
## Access Modes
- Read only: inspect files and poll/reset existing execution sessions. Do not attempt writes or mutating shell work until the user switches the CLI to Read&Write with F3.
- Read&Write: shell-backed execution, writes, and patches may modify the CLI host. Keep changes narrow and intentional.
- Execution may also be disabled locally in the CLI. If a remote tool returns a structured disabled/no-client error, explain the required CLI toggle instead of falling back to the server filesystem.
## Remote Execution
- Use `runtime=terminal` for shell commands, `runtime=python` for Python snippets, and `runtime=nodejs` for Node.js snippets.
- Reuse the same integer `session` while continuing a workflow; session state is local to the CLI frontend.
- Use `runtime=output` when a previous command is still running or returned before the shell reached a prompt.
- Use `runtime=reset` when a session is stuck or a clean shell is safer.
- Treat `runtime=input` as deprecated compatibility for sending one line to a running shell.
- Match the remote host shell syntax. A Windows CLI may need PowerShell syntax even when Agent Zero runs on Linux.
## Remote File Editing
- Start with `read` when inspecting a file or preparing line-based edits.
- Use `write` only when replacing or creating the whole file is truly the right operation.
- Prefer `patch` with `patch_text` for context-anchored edits, especially after inserts/deletes or when line numbers may have shifted.
- Use `patch` with `edits` only for small line-range edits based on the latest remote read.
- If freshness-aware line patching rejects an edit as stale, reread the file and retry with updated ranges.
## Patch Text Rules
- `patch_text` supports update hunks for one file.
- Use one `@@ existing line` anchor, then `+new line` entries for insertion.
- For replacement, use `@@ before target` followed by `-old` and `+new`, or use `@@ old target` followed by the same replacement pair.
- Do not repeat the same old line as both context and deletion in one hunk.
- Every non-header content line must begin with exactly one prefix: space for context, `+` for additions, or `-` for removals.
- Do not stack multiple `@@` anchors for one insert.
## Failure Handling
- If no CLI is connected or subscribed, ask the user to connect A0 CLI to this chat.
- If writes are blocked, tell the user to switch local access to Read&Write with F3.
- If execution is disabled, tell the user to enable remote execution in the CLI.
- If a request times out or the CLI disconnects, poll once if a session may still be running; otherwise summarize the failure and wait for reconnection.

View file

@ -0,0 +1,45 @@
---
name: code-execution-remote
description: Guide safe use of code_execution_remote for shell-backed execution on the connected A0 CLI host machine.
version: 1.0.0
author: Agent Zero Team
tags: ["agent-zero", "a0", "cli", "connector", "remote-execution", "shell"]
trigger_patterns:
- "code_execution_remote"
- "remote shell execution"
- "run commands on the cli host"
- "run python on the cli host"
- "run node on the cli host"
allowed_tools:
- code_execution_remote
---
# Code Execution Remote
## Boundary
Use `code_execution_remote` only for shell-backed execution on the machine where A0 CLI is running. Shells, runtimes, and paths belong to the CLI host, not the Agent Zero server or Docker container.
If the task belongs inside Agent Zero's own runtime, use the normal server-side execution tool instead.
## Access Modes
- Remote execution can be disabled locally in the CLI. If the tool returns a disabled/no-client error, explain the required CLI toggle instead of falling back to the server runtime.
- Read&Write local file access allows mutating runtimes such as `terminal`, `python`, and `nodejs`.
- Read only local file access blocks mutating runtimes. `runtime=output` and `runtime=reset` remain available for existing sessions.
## Runtimes
- Use `runtime=terminal` for shell commands, `runtime=python` for Python snippets, and `runtime=nodejs` for Node.js snippets.
- Reuse the same integer `session` while continuing a workflow; session state is local to the CLI frontend.
- Use `runtime=output` when a previous command is still running or returned before the shell reached a prompt.
- Use `runtime=reset` when a session is stuck or a clean shell is safer.
- Treat `runtime=input` as deprecated compatibility for sending one line to a running shell.
- Match the remote host shell syntax. A Windows CLI may need PowerShell syntax even when Agent Zero runs on Linux.
## Failure Handling
- If no CLI is connected or subscribed, ask the user to connect A0 CLI to this chat.
- If execution is disabled, tell the user to enable remote execution in the CLI.
- If mutating runtimes are blocked, tell the user to switch local file access to Read&Write with F3.
- If a request times out or the CLI disconnects, poll once if a session may still be running; otherwise summarize the failure and wait for reconnection.

View file

@ -0,0 +1,51 @@
---
name: text-editor-remote
description: Guide safe use of text_editor_remote for reading, writing, and patching files on the connected A0 CLI host machine.
version: 1.0.0
author: Agent Zero Team
tags: ["agent-zero", "a0", "cli", "connector", "remote-files", "file-editing"]
trigger_patterns:
- "text_editor_remote"
- "remote file editing"
- "edit my local files through a0 cli"
- "read files on the cli host"
- "patch files on the cli host"
allowed_tools:
- text_editor_remote
---
# Text Editor Remote
## Boundary
Use `text_editor_remote` only for file work on the machine where A0 CLI is running. These paths and files belong to the CLI host, not the Agent Zero server or Docker container.
If the task belongs inside Agent Zero's own runtime, use the normal server-side file tools instead.
## Access Modes
- Read&Write: reads, writes, and patches may modify the CLI host. Keep changes narrow and intentional.
- Read only: inspect files only. If writes are blocked, tell the user to switch local file access to Read&Write with F3.
## Editing Flow
- Start with `read` when inspecting a file or preparing line-based edits.
- Use `write` only when replacing or creating the whole file is truly the right operation.
- Prefer `patch` with `patch_text` for context-anchored edits, especially after inserts/deletes or when line numbers may have shifted.
- Use `patch` with `edits` only for small line-range edits based on the latest remote read.
- If freshness-aware line patching rejects an edit as stale, reread the file and retry with updated ranges.
## Patch Text Rules
- `patch_text` supports update hunks for one file.
- Use one `@@ existing line` anchor, then `+new line` entries for insertion.
- For replacement, use `@@ before target` followed by `-old` and `+new`, or use `@@ old target` followed by the same replacement pair.
- Do not repeat the same old line as both context and deletion in one hunk.
- Every non-header content line must begin with exactly one prefix: space for context, `+` for additions, or `-` for removals.
- Do not stack multiple `@@` anchors for one insert.
## Failure Handling
- If no CLI is connected or subscribed, ask the user to connect A0 CLI to this chat.
- If writes are blocked, tell the user to switch local file access to Read&Write with F3.
- If a request times out or the CLI disconnects, summarize the failure and wait for reconnection.

View file

@ -14,7 +14,6 @@ trigger_patterns:
- "native ui"
allowed_tools:
- computer_use_remote
- code_execution_remote
---
# Computer Use Remote
@ -25,6 +24,8 @@ Load this skill before using `computer_use_remote` for local desktop and native
If the task is browser-only and the user is flexible, prefer direct browser tooling because it is usually more reliable and token-efficient than screenshot-driven desktop control.
If the task needs shell execution on the CLI host, load `code-execution-remote` separately rather than treating desktop control and shell execution as one affordance.
## Core Loop
1. Call `start_session` first.

View file

@ -198,8 +198,8 @@ def test_computer_use_enabled_cli_adds_computer_stub():
assert "code_execution_remote tool" not in prompt
def test_remote_workflow_skills_parse():
connector_skill = _parse_skill_frontmatter(
def test_remote_affordance_skills_parse():
legacy_connector_skill = (
PROJECT_ROOT
/ "plugins"
/ "_a0_connector"
@ -207,11 +207,40 @@ def test_remote_workflow_skills_parse():
/ "a0-cli-remote-workflows"
/ "SKILL.md"
)
text_editor_skill = _parse_skill_frontmatter(
PROJECT_ROOT
/ "plugins"
/ "_a0_connector"
/ "skills"
/ "text-editor-remote"
/ "SKILL.md"
)
code_execution_skill = _parse_skill_frontmatter(
PROJECT_ROOT
/ "plugins"
/ "_a0_connector"
/ "skills"
/ "code-execution-remote"
/ "SKILL.md"
)
computer_skill = _parse_skill_frontmatter(
PROJECT_ROOT / "skills" / "computer-use-remote" / "SKILL.md"
)
assert connector_skill["name"] == "a0-cli-remote-workflows"
assert connector_skill["description"]
assert not legacy_connector_skill.exists()
assert text_editor_skill["name"] == "text-editor-remote"
assert text_editor_skill["allowed_tools"] == ["text_editor_remote"]
assert code_execution_skill["name"] == "code-execution-remote"
assert code_execution_skill["allowed_tools"] == ["code_execution_remote"]
assert computer_skill["name"] == "computer-use-remote"
assert computer_skill["description"]
assert computer_skill["allowed_tools"] == ["computer_use_remote"]
def test_remote_tool_stubs_point_to_per_tool_skills():
text_stub = (PROMPT_ROOT / "agent.connector_tool.text_editor_remote.md").read_text(encoding="utf-8")
exec_stub = (PROMPT_ROOT / "agent.connector_tool.code_execution_remote.md").read_text(encoding="utf-8")
assert "Load `text-editor-remote`" in text_stub
assert "Load `code-execution-remote`" in exec_stub
assert "a0-cli-remote-workflows" not in text_stub
assert "a0-cli-remote-workflows" not in exec_stub