Agent skill

Helmor Debug Operate

by dohooo in dohooo/helmor

Operate, reproduce, and debug a running local Helmor desktop development build through the Tauri MCP bridge.

Apache-2.0Auto-check passedAgent Workflows

Install Helmor Debug Operate

skills CLI
$ npx skills add dohooo/helmor --skill helmor-debug-operate -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install dohooo/helmor helmor-debug-operate --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/dohooo/helmor.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/helmor-debug-operate .claude/skills/helmor-debug-operate && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
helmor-debug-operate
GitHub stars
1.3k
Token cost
~6.6k tokens
SKILL.md length
1,899 words
Files
4 (incl. references)
Skills in repo
5
Repo updated
First seen
Licence
Apache-2.0

At a glance

Operate, reproduce, and debug a running local Helmor desktop development build through the Tauri MCP bridge.

  • Works in 3 steps: Check the bridge → Start only when not connected → Sanity-check the target
  • The user asks to use Tauri MCP
  • SKILL.md covers References, Ground Rules, Connect and Baseline Snapshot, plus 7 more sections
  • Calls bun

What it does

Helmor Debug Operate is an agent skill from dohooo/helmor. Operate, reproduce, and debug a running local Helmor desktop development build through the Tauri MCP bridge. Use when the user asks to use Tauri MCP, towery MCP, the local dev build, the Tauri webview, visual end-to-end validation, UI automation, screenshots, DOM/accessibility snapshots, IPC or log tracing, terminal/run-script buffer inspection, switching workspaces or sessions, creating/renaming/closing sessions, typing or sending composer prompts, inspecting styles/logs, or reproducing Helmor desktop behavior…

Its SKILL.md is about 6.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including reference files (for example `agents/openai.yaml`, `references/ui-map.md` and `references/verified-recipes.md`).

It sits in Agent Workflows, covering Accessibility, MCP servers and Debugging. It works with Tauri and Model Context Protocol. The repository describes itself as: Open-source local workbench for multi-agent software development. The licence is Apache-2.0.

When your agent uses it

  • The user asks to use Tauri MCP
  • The local dev build
  • The Tauri webview
  • Visual end-to-end validation

Example prompts

  • “/helmor-debug-operate”

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. Check the bridge
  2. Start only when not connected
  3. Sanity-check the target

What it can do on your machine

Read from SKILL.md and the folder at commit a76cda1. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • bun

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Helmor Debug Operate loads about 6.6k tokens when it runs, and up to ~17k if it reads all its reference files. Until then it costs about 139 tokens; SKILL.md has 1,899 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~139
When it runs · the whole SKILL.md, loaded when a task matches
~6.6k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~17k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from dohooo/helmor at commit a76cda1, republished under its Apache-2.0 licence (© dohooo). 1,899 words, ~6,553 tokens.

Download SKILL.mdSave it as .claude/skills/helmor-debug-operate/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.
name
helmor-debug-operate
description
Operate, reproduce, and debug a running local Helmor desktop development build through the Tauri MCP bridge. Use when the user asks to use Tauri MCP, towery MCP, the local dev build, the Tauri webview, visual end-to-end validation, UI automation, screenshots, DOM/accessibility snapshots, IPC or log tracing, terminal/run-script buffer inspection, switching workspaces or sessions, creating/renaming/closing sessions, typing or sending composer prompts, inspecting styles/logs, or reproducing Helmor desktop behavior as a user would.

Helmor Debug Operate

Use this skill to operate and debug a running Helmor dev build through Tauri MCP with the least possible exploration. It is the visual/runtime counterpart to helmor-cli: prefer Tauri MCP for webview UI, screenshots, CSS, accessibility, and IPC tracing; prefer helmor-cli for terminal-first data inspection or workspace orchestration.

Examples below use bare tool names such as driver_session; call the same tool through whatever namespace the runtime exposes.

References

Read these only when needed:

  • references/verified-recipes.md for action-specific recipes that have passed three consecutive Tauri MCP verification attempts.
  • references/ui-map.md for selectors, Settings panels, Inspector/Editor preconditions, and destructive-action boundaries.

Ground Rules

  • Treat every action as real user input against the active app. Do not send prompts, close sessions, archive/delete workspaces, stop streams, or mutate settings unless the user asked for that outcome or it is necessary for the verification.
  • Use the Tauri MCP bridge only for Helmor desktop debugging. Do not switch to Chrome DevTools, Browser, Playwright, or /agent-browser unless the user explicitly asks for another surface.
  • Require a debug Tauri build. The bridge is absent in release builds. If connection fails, ask the user to run bun run dev or call get_setup_instructions only when bridge setup itself is suspect.
  • Default to port: 9223 and windowId: "main".
  • Re-run webview_dom_snapshot after every meaningful UI change. ref=eN handles are per-snapshot and expire after DOM changes.
  • Prefer accessibility snapshots for finding controls, but fall back to structure snapshots and read-only DOM rect inspection when accessibility support is unavailable.
  • Prefer UI operations for end-to-end validation. Do not use the Tauri MCP tool ipc_execute_command for Helmor app commands such as list_workspace_groups, reveal_workspace_in_main_window, or debug_list_terminal_buffers: the current bridge returns Unsupported Tauri command because dynamic app-command execution is not implemented there. Use the verified app-command helper in Call App Commands instead.
  • Do not use webview_execute_js to dispatch synthetic user events. Use it only for read-only, JSON-serializable inspection when MCP tools cannot answer the question.
  • Exception: Helmor's composer is a Lexical contenteditable, not a native input. If webview_keyboard type fails with the current bridge, document.execCommand("insertText", false, text) after real MCP focus/click is the last-resort smoke-test input path. Label it as a fallback and verify visible state afterward.
  • If you start ipc_monitor, always stop it before finishing, even if the task fails.
  • Save screenshots or scratch logs under .agent-contexts/<task-slug>/ when working inside this repository.
  • If a Settings dialog appears stuck visible with data-state="closed", press Cmd+, to reopen it, then Escape to close. Verify document.querySelectorAll('[role="dialog"]').length === 0 and main[aria-hidden] is absent.
  • If webview_execute_js or console log reads start timing out while screenshots and driver_session status still work, restart only the MCP driver session (driver_session stop appIdentifier=9223, then driver_session start port=9223). Do not restart the Helmor dev build unless the bridge cannot reconnect.
  • If you launch a disposable app with HELMOR_DATA_DIR for validation, create both the data dir and its run/ subdir first. Missing run/ can make the UI sync socket fail to bind, leaving backend mutations invisible until you force a reveal or restart.
  • Treat this skill as an operation hint, not an authoritative source of truth. The local UI can drift ahead of these recipes. If a recipe fails three times, stop repeating it mechanically: take a fresh screenshot/snapshot, reason from the visible UI, and inspect the relevant code if needed.
  • Keep this skill self-improving by proposal, not silent mutation. When you discover a better path, missing pitfall, stale selector, or unverified workaround, record a candidate update under .agent-contexts/<task-slug>/skill-update-candidates.md with the scenario, failing attempts, evidence, proposed recipe, and verification status. Ask the user before editing this skill unless the current user request explicitly asks you to update it.

Connect

  1. Check the bridge:
json
driver_session { "action": "status", "port": 9223 }
  1. Start only when not connected:
json
driver_session { "action": "start", "port": 9223 }
  1. Sanity-check the target:
json
ipc_get_backend_state {}
manage_window { "action": "list" }

Expect app.identifier to be ai.helmor.desktop, app.name to be Helmor, environment.debug to be true, and a visible main window. If multiple apps are connected, pass the returned port or bundle id as appIdentifier on later calls.

Baseline Snapshot

Start every UI task with both a visual and semantic read:

json
webview_screenshot { "windowId": "main", "format": "png" }
webview_dom_snapshot { "windowId": "main", "type": "accessibility" }

If accessibility fails with aria-api library not loaded, immediately use:

json
webview_dom_snapshot { "windowId": "main", "type": "structure" }

Avoid taking screenshots with maxWidth when you need click coordinates. A scaled screenshot changes the coordinate space; direct webview_interact { "x": ..., "y": ... } expects the webview's real coordinates from getBoundingClientRect() or manage_window info.

Use this stable mental map:

  • Shell: Application shell, Workspace sidebar, Workspace panel, Workspace viewport.
  • Sidebar buttons: Workspace location, Filter and sort sidebar, Add repository, New workspace, Collapse left sidebar.
  • Workspace rows: role button with the displayed workspace title. Nested actions include Archive workspace, Confirm archive workspace, and Delete permanently.
  • Session header: tablist Sessions; tabs are named by session title, often Untitled; buttons include New session and Session history.
  • Session tab actions: Rename session and Close session appear in the accessibility tree when visible. If not targetable, use the keyboard or the Call App Commands helper recipes below.
  • Hidden session history: Session history opens rows with Restore session and Delete session permanently.
  • Composer: Workspace composer, textbox Workspace input, placeholder Ask to make changes, @mention files, run /commands.
  • Composer controls: model selector, Fast mode, Carry room context, effort dropdown such as High, Plan mode, Terminal mode, Add context, Context usage, and trailing Send, Stop, Steer, Request Changes, or Implement.

Selector Repair And Coordinate Targeting

Some bridge versions inject window.__MCP__ but omit helper functions used by selector-based tools. If webview_dom_snapshot, webview_find_element, webview_interact selector=..., or webview_keyboard type selector=... fails with window.__MCP__.resolveAll is not a function or window.__MCP__.resolveRef is not a function, install this compatibility shim once per page load:

json
webview_execute_js {
  "windowId": "main",
  "script": "(() => {\n  if (!window.__MCP__) window.__MCP__ = {};\n  if (!window.__MCP__.refs) window.__MCP__.refs = new Map();\n  if (!window.__MCP__.reverseRefs) window.__MCP__.reverseRefs = new Map();\n  const all = (selector, strategy = 'css') => {\n    if (!selector) return [];\n    if (String(selector).startsWith('ref=')) {\n      const el = window.__MCP__.refs.get(String(selector).slice(4));\n      return el ? [el] : [];\n    }\n    if (strategy === 'xpath') {\n      const result = document.evaluate(selector, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);\n      return Array.from({ length: result.snapshotLength }, (_, i) => result.snapshotItem(i)).filter(Boolean);\n    }\n    if (strategy === 'text') {\n      const needle = String(selector).trim();\n      return Array.from(document.querySelectorAll('button,[role=\"button\"],[role=\"tab\"],input,textarea,[contenteditable=\"true\"],[role=\"textbox\"],a,[aria-label],[title]')).filter((el) => {\n        const text = (el.textContent || '').trim();\n        return text === needle || text.includes(needle) || el.getAttribute('aria-label') === needle || el.getAttribute('title') === needle || el.getAttribute('placeholder') === needle;\n      });\n    }\n    return Array.from(document.querySelectorAll(selector));\n  };\n  window.__MCP__.resolveAll = (selector, strategy = 'css') => all(selector, strategy);\n  window.__MCP__.resolveRef = (selector, strategy = 'css') => all(selector, strategy)[0] || null;\n  window.__MCP__.countAll = (selector, strategy = 'css') => all(selector, strategy).length;\n  return { installed: true, hasResolveAll: typeof window.__MCP__.resolveAll };\n})()"
}

Even with selector repair, coordinate targeting is often the fastest reliable path:

json
webview_execute_js {
  "windowId": "main",
  "script": "(() => Array.from(document.querySelectorAll('button,[role=\"button\"],[role=\"tab\"],[role=\"textbox\"]')).map((el) => { const r = el.getBoundingClientRect(); return { text: (el.textContent || '').trim(), ariaLabel: el.getAttribute('aria-label'), role: el.getAttribute('role'), selected: el.getAttribute('aria-selected'), x: r.x, y: r.y, width: r.width, height: r.height, disabled: !!el.disabled }; }))()"
}

Click the center of the returned rect:

json
webview_interact { "action": "click", "windowId": "main", "x": 1254, "y": 52 }

For Radix dropdown/menu triggers, direct click is sometimes ignored even when the selector resolves. Prefer:

json
webview_interact { "action": "focus", "selector": "BUTTON_OR_TEXT", "strategy": "text", "windowId": "main" }
webview_keyboard { "action": "press", "key": "Enter", "windowId": "main" }

For model/effort menu triggers, ArrowDown was more reliable than Enter:

json
webview_keyboard { "action": "press", "key": "ArrowDown", "windowId": "main" }

Call App Commands

The MCP bridge's ipc_execute_command tool currently cannot invoke Helmor's ordinary Tauri commands. Use this click-triggered low-level IPC helper whenever you need a deterministic backend command. It was verified against a fresh debug build on port 9224 for repository/workspace setup, debug_list_terminal_buffers, debug_read_terminal_buffer, and terminal stdin writes.

Install the helper once per page load:

json
webview_execute_js {
  "windowId": "main",
  "script": "(() => {\n  window.__helmorDebugResults = window.__helmorDebugResults || {};\n  let btn = document.getElementById('__helmor_debug_ipc_runner');\n  if (!btn) {\n    btn = document.createElement('button');\n    btn.id = '__helmor_debug_ipc_runner';\n    btn.textContent = 'ipc runner';\n    btn.style.position = 'fixed';\n    btn.style.left = '4px';\n    btn.style.top = '244px';\n    btn.style.zIndex = '2147483647';\n    btn.style.width = '120px';\n    btn.style.height = '32px';\n    document.body.appendChild(btn);\n  }\n  btn.onclick = () => {\n    const request = window.__helmorDebugRequest;\n    if (!request) return;\n    const id = request.id || `${Date.now()}-${Math.random()}`;\n    window.__helmorDebugResults[id] = { pending: true, command: request.command };\n    const callback = window.__TAURI_INTERNALS__.transformCallback((value) => {\n      window.__helmorDebugResults[id] = { ok: true, command: request.command, value };\n    }, true);\n    const error = window.__TAURI_INTERNALS__.transformCallback((err) => {\n      window.__helmorDebugResults[id] = { ok: false, command: request.command, error: String(err) };\n    }, true);\n    window.__TAURI_INTERNALS__.ipc({ cmd: request.command, callback, error, payload: request.payload || {} });\n  };\n  const r = btn.getBoundingClientRect();\n  return { installed: true, x: r.x + r.width / 2, y: r.y + r.height / 2 };\n})()"
}

Run a command by setting window.__helmorDebugRequest, clicking the helper button center returned above, then polling the result:

json
webview_execute_js {
  "windowId": "main",
  "script": "(() => { window.__helmorDebugRequest = { id: 'list-buffers', command: 'debug_list_terminal_buffers', payload: {} }; return window.__helmorDebugRequest; })()"
}
webview_interact { "action": "click", "windowId": "main", "x": 64, "y": 260 }
webview_execute_js {
  "windowId": "main",
  "script": "(() => window.__helmorDebugResults?.['list-buffers'] || null)()"
}

Important constraints:

  • Never call window.__TAURI_INTERNALS__.invoke(...) or window.__TAURI_INTERNALS__.ipc(...) directly from the same webview_execute_js stack; it can time out.
  • Do not inject Promise chains in handlers for this bridge path; use transformCallback callback ids as shown.
  • Keep the helper only for debug sessions. It mutates the visible DOM by adding a small fixed button; remove or ignore it before taking polished UI screenshots.
  • Use the returned raw scriptType when reading buffers. Run actions can appear as values such as run:run:<id> because action ids may already include a run: prefix.

Workspace Operations

Show full SKILL.md (787 more words)Show less
Switch By UI
  1. Snapshot accessibility, or structure if accessibility is unavailable.
  2. Prefer selector/text click only if selector repair is working and the name is unique:
json
webview_interact { "action": "click", "selector": "My Workspace", "strategy": "text", "windowId": "main" }
  1. If selector click fails, list workspace row rects and click the target row center:
json
webview_execute_js {
  "windowId": "main",
  "script": "(() => Array.from(document.querySelectorAll('[role=\"button\"],button')).filter((el) => (el.textContent || '').trim()).map((el) => { const r = el.getBoundingClientRect(); return { text: (el.textContent || '').trim(), className: String(el.className || ''), x: r.x, y: r.y, width: r.width, height: r.height }; }).filter((row) => row.className.includes('workspace-row') || row.text === 'TARGET_WORKSPACE'))()"
}
  1. Verify the workspace row has workspace-row-selected, the panel header/title changed, and the visible session tabs belong to the target workspace.
Switch Deterministically

Use this when duplicate workspace names make text selection ambiguous. Install Call App Commands first, then run helper requests:

json
{ "id": "list-workspace-groups", "command": "list_workspace_groups", "payload": {} }
{ "id": "reveal-workspace", "command": "reveal_workspace_in_main_window", "payload": { "workspaceId": "WORKSPACE_ID", "sessionId": null } }

Then re-snapshot and verify the visible UI. For details on one workspace:

json
{ "id": "get-workspace", "command": "get_workspace", "payload": { "workspaceId": "WORKSPACE_ID" } }
Archive Or Restore

Archive is destructive enough to require explicit user intent. If asked to test it as UI:

  1. Click Archive workspace on the target row.
  2. Click Confirm archive workspace.
  3. Verify the row leaves active groups or appears under Archived.

For setup/cleanup only, prefer helper commands after confirming intent:

json
{ "id": "validate-archive", "command": "validate_archive_workspace", "payload": { "workspaceId": "WORKSPACE_ID" } }
{ "id": "start-archive", "command": "start_archive_workspace", "payload": { "workspaceId": "WORKSPACE_ID" } }
{ "id": "restore-workspace", "command": "restore_workspace", "payload": { "workspaceId": "WORKSPACE_ID", "targetBranchOverride": null } }

Session Operations

List And Select

Read sessions for the current or target workspace:

json
{ "id": "list-sessions", "command": "list_workspace_sessions", "payload": { "workspaceId": "WORKSPACE_ID" } }

Select a visible tab by clicking its snapshot ref=eN, or use a deterministic reveal:

json
{ "id": "reveal-session", "command": "reveal_workspace_in_main_window", "payload": { "workspaceId": "WORKSPACE_ID", "sessionId": "SESSION_ID" } }

Re-snapshot and confirm the selected tab and message thread.

Create

UI path:

json
webview_interact { "action": "click", "selector": "New session", "strategy": "text", "windowId": "main" }

Coordinate-safe UI path when selectors are broken:

json
webview_execute_js {
  "windowId": "main",
  "script": "(() => { const el = document.querySelector('button[aria-label=\"New session\"]'); if (!el) return null; const r = el.getBoundingClientRect(); return { x: r.x, y: r.y, width: r.width, height: r.height, disabled: !!el.disabled }; })()"
}
webview_interact { "action": "click", "windowId": "main", "x": 1254, "y": 52 }

Backend helper path:

json
{ "id": "create-session", "command": "create_session", "payload": { "workspaceId": "WORKSPACE_ID" } }

If using helper creation, reveal the returned session id, then verify the new tab:

json
{ "id": "reveal-new-session", "command": "reveal_workspace_in_main_window", "payload": { "workspaceId": "WORKSPACE_ID", "sessionId": "NEW_SESSION_ID" } }

For terminal sessions:

json
{ "id": "create-terminal-session", "command": "create_session", "payload": { "workspaceId": "WORKSPACE_ID", "sessionKind": "terminal", "agentType": "claude" } }
Rename

The most reliable non-UI path is the helper, followed by UI verification:

json
{ "id": "rename-session", "command": "rename_session", "payload": { "sessionId": "SESSION_ID", "title": "New title" } }

Re-snapshot and verify the tab/history label. Use UI rename only when Rename session is visible and targetable in the latest snapshot.

Close, Hide, Restore, Delete

Close the selected visible session like a user:

json
webview_keyboard { "action": "press", "key": "w", "modifiers": ["Meta"], "windowId": "main" }

If the session is running, expect a Close running chat? dialog. Click Close anyway only when cancellation is intended.

Backend equivalents:

json
{ "id": "hide-session", "command": "hide_session", "payload": { "sessionId": "SESSION_ID" } }
{ "id": "unhide-session", "command": "unhide_session", "payload": { "sessionId": "SESSION_ID" } }
{ "id": "delete-session", "command": "delete_session", "payload": { "sessionId": "SESSION_ID" } }

hide_session is the normal recoverable close for non-empty sessions. delete_session is permanent and should normally be limited to empty sessions or hidden-session cleanup explicitly requested by the user.

Composer Operations

Type Without Sending
  1. Select the target workspace and session first.
  2. Get the composer rect and click it:
json
webview_execute_js {
  "windowId": "main",
  "script": "(() => { const el = document.querySelector('#workspace-input'); if (!el) return null; const r = el.getBoundingClientRect(); return { x: r.x, y: r.y, width: r.width, height: r.height, text: el.textContent || '' }; })()"
}
webview_interact { "action": "click", "windowId": "main", "x": 340, "y": 850 }
  1. Try the native MCP typing path only if the bridge supports contenteditable targets:
json
webview_interact { "action": "focus", "selector": "Workspace input", "strategy": "text", "windowId": "main" }
webview_keyboard { "action": "type", "selector": "Workspace input", "strategy": "text", "text": "Prompt text here", "windowId": "main" }

In the known Helmor bridge state, this can fail with The HTMLInputElement.value setter can only be used on instances of HTMLInputElement. For a short smoke test, use the fallback:

json
webview_execute_js {
  "windowId": "main",
  "script": "(() => { const el = document.querySelector('#workspace-input'); if (!el) return { ok: false }; el.focus(); const ok = document.execCommand('insertText', false, 'Prompt text here'); const send = document.querySelector('button[aria-label=\"Send\"]'); return { ok, text: el.textContent || '', sendDisabled: send ? !!send.disabled : null }; })()"
}
  1. Verify the text is present and Send is enabled:
json
webview_execute_js {
  "windowId": "main",
  "script": "(() => { const input = document.querySelector('#workspace-input'); const send = document.querySelector('button[aria-label=\"Send\"]'); return { text: input ? input.textContent : null, sendDisabled: send ? !!send.disabled : null }; })()"
}
Send A Prompt

Only send when the user supplied the exact target and message, or the task explicitly requires sending.

  1. Optional but recommended: start IPC monitor.
json
ipc_monitor { "action": "start" }
  1. Focus/type as above.
  2. Click Send. Prefer the rect center when selectors are unreliable:
json
webview_interact { "action": "click", "selector": "Send", "strategy": "text", "windowId": "main" }

or:

json
webview_execute_js {
  "windowId": "main",
  "script": "(() => { const el = document.querySelector('button[aria-label=\"Send\"]'); if (!el) return null; const r = el.getBoundingClientRect(); return { x: r.x, y: r.y, width: r.width, height: r.height, disabled: !!el.disabled }; })()"
}
webview_interact { "action": "click", "windowId": "main", "x": 1267, "y": 916 }
  1. Verify the UI changed: the composer clears, the user message appears in the thread, Send may become Stop, and list_active_streams may include the session if helper command access is available:
json
{ "id": "list-active-streams", "command": "list_active_streams", "payload": {} }
ipc_get_captured { "filter": "send_agent_message_stream" }
ipc_monitor { "action": "stop" }

If ipc_get_captured returns [] despite the UI changing, treat it as an IPC monitor limitation in that bridge session and use visible UI evidence plus logs instead.

Do not call send_agent_message_stream directly through ipc_execute_command; the real frontend call uses an IPC Channel callback that the generic MCP command runner cannot provide safely.

Proven Smoke Test Recipe

Use this when the user asks whether the local dev build can be controlled end-to-end:

  1. Connect and sanity-check: driver_session status, ipc_get_backend_state, manage_window info.
  2. Snapshot. If accessibility fails, use structure plus read-only rect inspection.
  3. Switch workspace by row rect center; verify workspace-row-selected and the panel title.
  4. Click button[aria-label="New session"] by rect center; verify a selected Untitled tab.
  5. Click #workspace-input, insert a short test prompt using the best available input path, verify Send is enabled.
  6. Start ipc_monitor, click Send by rect center, verify the composer clears and the user message appears, then stop ipc_monitor.
  7. Save a screenshot under .agent-contexts/<task-slug>/ if the result matters.
Stop Or Steer

To stop the selected active turn through the UI:

json
webview_interact { "action": "click", "selector": "Stop", "strategy": "text", "windowId": "main" }

To stop deterministically:

json
{ "id": "stop-agent-stream", "command": "stop_agent_stream", "payload": { "request": { "sessionId": "SESSION_ID", "provider": null } } }

To steer an active turn, type additional content while Stop is visible, then click Steer. If using the helper:

json
{ "id": "steer-agent-stream", "command": "steer_agent_stream", "payload": { "request": { "sessionId": "SESSION_ID", "provider": "claude", "prompt": "Additional instruction", "files": [], "images": [] } } }

Inspection And Debugging

  • Screenshot visible UI:
json
webview_screenshot { "windowId": "main", "format": "png", "filePath": ".agent-contexts/TASK/shot.png" }
  • Accessibility snapshot for controls:
json
webview_dom_snapshot { "windowId": "main", "type": "accessibility" }
  • DOM structure snapshot for selectors/classes:
json
webview_dom_snapshot { "windowId": "main", "type": "structure", "selector": ".some-css-selector" }
  • Styles:
json
webview_get_styles { "windowId": "main", "selector": "Workspace input", "strategy": "text", "properties": ["display", "color", "background-color", "font-size"] }
  • Console/system logs:
json
read_logs { "source": "console", "windowId": "main", "lines": 100 }
read_logs { "source": "system", "filter": "helmor", "lines": 200 }
  • Terminal/run-script buffers:
json
/* Use Call App Commands helper */
{ "id": "list-buffers", "command": "debug_list_terminal_buffers", "payload": {} }

Read the relevant buffer by using the returned repoId, workspaceId, and raw scriptType such as setup, run:<actionId>, run:run:<actionId>, or terminal:<instanceId>:

json
/* Use Call App Commands helper */
{
  "id": "read-buffer",
  "command": "debug_read_terminal_buffer",
  "payload": {
    "repoId": "REPO_ID",
    "workspaceId": "WORKSPACE_ID_OR_NULL",
    "scriptType": "RAW_SCRIPT_TYPE_FROM_LIST",
    "maxBytes": 200000
  }
}

If the helper result is an error saying the command is unknown, the connected build predates the debug buffer feature. Fall back to visible xterm evidence, screenshots, and system logs; do not pretend full terminal history was inspected.

  • IPC tracing:
json
ipc_monitor { "action": "start" }
/* perform the UI action */
ipc_get_captured { "filter": "COMMAND_NAME" }
ipc_monitor { "action": "stop" }

Verification Pattern

End every Tauri MCP task with evidence:

  1. State the target app from ipc_get_backend_state.
  2. State the user flow performed.
  3. State the verification signal: visible text/control from accessibility snapshot, screenshot path, IPC command captured, backend command result, or logs.
  4. If anything was not verified, say exactly what is missing.

© dohooo, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 3 other files (references) in .agents/skills/helmor-debug-operate of dohooo/helmor.

  • SKILL.md
  • agents/openai.yaml
  • references/ui-map.md
  • references/verified-recipes.md

Open the folder on GitHubat commit a76cda1

Compare with similar skills

Helmor Debug Operate next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Helmor Debug Operate compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Helmor Debug Operate this skilldohooo/helmor1.3k—~6.6kAutomated safety check: PassApache-2.0
Memorywhalewuisabel-gif/MemWhale154—~765Automated safety check: PassMIT
Memorywhale Evidencewuisabel-gif/MemWhale154—~459Automated safety check: PassMIT
Change Maple Agent ModeMaplePrivacyLabs/Maple100—~5.5kAutomated safety check: NotesMIT
Memorywhale Debuggingwuisabel-gif/MemWhale154—~370Automated safety check: PassMIT
Local DevSmilyOrg/photofield608—~2.4kAutomated safety check: PassMIT

Similar skills

  • Memorywhale

    wuisabel-gif/MemWhale

    Query and write durable debugging memory recorded by MemoryWhale.

    154 GitHub stars~765 tokensUpdated yesterday
    Agent WorkflowsAuto-check passed
  • Memorywhale Evidence

    wuisabel-gif/MemWhale

    Use MemoryWhale debugging evidence when the user requests recall or a recurring failure may have relevant recorded history.

    154 GitHub stars~459 tokensUpdated yesterday
    Agent WorkflowsAuto-check passed
  • Change Maple Agent Mode

    MaplePrivacyLabs/Maple

    Develop and debug Maple Agent Mode across its React UI, Tauri command and event bridge, account-scoped native runtime, embedded Goose integration, OpenSecret provider, developer tools, permissions…

    100 GitHub stars~5.5k tokensUpdated today
    Agent WorkflowsAuto-check: notes
  • Memorywhale Debugging

    wuisabel-gif/MemWhale

    MemoryWhale debugging; compiler failures; terminal diagnostics.

    154 GitHub stars~370 tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Local Dev

    SmilyOrg/photofield

    Run, test, and debug the photofield server locally. An agent skill from SmilyOrg/photofield.

    608 GitHub stars~2.4k tokensUpdated 1 mo ago
    Agent WorkflowsAuto-check passed
  • Gearcoleco Debugging

    drhelius/Gearcoleco

    Debug and trace ColecoVision and Super Game Module games using the Gearcoleco emulator MCP server.

    141 GitHub stars~3.5k tokensUpdated 2 days ago
    DevelopmentAuto-check passed

More from dohooo/helmor

  • Helmor Bump Vendors

    dohooo/helmor

    Bump or upgrade the pinned versions of Helmor's bundled agent CLIs, SDKs, and supporting binaries — Claude Code + claude-agent-sdk (lockstep), Codex, Cursor SDK, OpenCode, Kimi, Pi, and gh / glab /…

    1.3k GitHub stars~2.1k tokensUpdated 1 mo ago
    Auto-check passed
  • Helmor CLI

    dohooo/helmor

    Use the Helmor CLI to remote-control Helmor from the terminal.

    1.3k GitHub stars~1.3k tokensUpdated 1 mo ago
    Auto-check passed
  • Helmor Debug Loop

    dohooo/helmor

    Autonomous local-development debugging loop for Helmor bugs.

    1.3k GitHub stars~917 tokensUpdated 1 mo ago
    Auto-check passed
  • Helmor Release

    dohooo/helmor

    Prepare Helmor releases by inspecting the current branch, drafting a concise user-facing Changesets entry first (bump + body — keep it as short as possible), creating any needed pending in-app…

    1.3k GitHub stars~2.6k tokensUpdated 1 mo ago
    Auto-check: warnings

Questions about Helmor Debug Operate

What does Helmor Debug Operate do?

Operate, reproduce, and debug a running local Helmor desktop development build through the Tauri MCP bridge. Helmor Debug Operate is an agent skill from dohooo/helmor. Operate, reproduce, and debug a running local Helmor desktop development build through the Tauri MCP bridge.

When should I use Helmor Debug Operate?

Helmor Debug Operate fits situations like: the user asks to use Tauri MCP; the local dev build; the Tauri webview; visual end-to-end validation.

How do I install Helmor Debug Operate in Claude Code?

Run `npx skills add dohooo/helmor --skill helmor-debug-operate -a claude-code`. Or copy the skill folder (.agents/skills/helmor-debug-operate in dohooo/helmor) into .claude/skills/helmor-debug-operate in your project. Claude Code loads it when a task matches its description.

How do I install Helmor Debug Operate in Codex?

Run `npx skills add dohooo/helmor --skill helmor-debug-operate -a codex`. Or copy the skill folder (.agents/skills/helmor-debug-operate in dohooo/helmor) into .agents/skills/helmor-debug-operate in your project. Codex loads it when a task matches its description.

Can I use Helmor Debug Operate in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dohooo/helmor --skill helmor-debug-operate -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/helmor-debug-operate, .gemini/skills/helmor-debug-operate, .github/skills/helmor-debug-operate and .opencode/skills/helmor-debug-operate in your project.

What does Helmor Debug Operate need to run?

Going by SKILL.md and its folder, Helmor Debug Operate needs the command-line tools its instructions call (bun).

Does Helmor Debug Operate access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Helmor Debug Operate safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Helmor Debug Operate use?

Helmor Debug Operate is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Helmor Debug Operate use?

About 6.6k tokens (SKILL.md is roughly 26k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 10k tokens, read only when the agent opens those files.

What are the alternatives to Helmor Debug Operate?

Skills that share tags, products or a category with Helmor Debug Operate: Memorywhale (wuisabel-gif/MemWhale, 154 stars), Memorywhale Evidence (wuisabel-gif/MemWhale, 154 stars), Change Maple Agent Mode (MaplePrivacyLabs/Maple, 100 stars) and Memorywhale Debugging (wuisabel-gif/MemWhale, 154 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Helmor Debug Operate?

dohooo (a GitHub user) maintains it in dohooo/helmor, which has 1,309 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on August 22, 2026.

Source: dohooo/helmor on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.