[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71FSF718TE5M59EZWM4T3GD":3,"skill-same:01M71FSF718TE5M59EZWM4T3GD":79},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":14,"repositoryHtmlUrl":54,"repositoryHomepageUrl":6,"ownerHtmlUrl":55,"ownerBlogUrl":56,"ownerDescription":57,"updatedAt":58,"install":59,"resources":72},"01M71FSF718TE5M59EZWM4T3GD","operate-herdr",null,"ALWAYS invoke this skill when running a public herdr operation — agent inventory, read, bounded wait, prompt, start, relaunch, stop, keystroke, worktree create, or worktree open — on agent sessions herdr hosts. NEVER run herdr command help or construct the public CLI command directly.","outcomeeng\u002Fplugins","outcomeeng","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F257335685?v=4","01M71FRVRF36XYR3HRSCGFHK2R","Outcome Engineering","01M71FRVS4BZG17DWANFJ7EPNY",1,"MIT","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fcoding-agents\u002Fskills\u002Foperate-herdr\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"operate herdr","herdr","operate","never","never run","running","when","invoke","hosts","operation","worktree create","cli","environment","prompt","python3","Bash","open","inventory","create","sessions","2026-11-10 10:12:30",false,"---\nname: operate-herdr\ndescription: >-\n  ALWAYS invoke this skill when running a public herdr operation — agent inventory, read, bounded wait, prompt, start, relaunch, stop, keystroke, worktree create, or worktree open — on agent sessions herdr hosts. NEVER run herdr command help or construct the public CLI command directly.\nargument-hint: \"\u003Coperation or JSON request>\"\nallowed-tools: Write, Bash(python3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fherdr_environment.py\":*)\n---\n\n\u003Cobjective>\nOne versioned JSON result per herdr operation — `status: \"succeeded\"` with herdr's public response and the operation's projection, identities and states verbatim, or a failure `status` from `\u003Clifecycle_statuses>` or among `command-failed`, `invalid-schema`, `mutation-unauthorized`, and `operation-unavailable` with its `detail` — except for stdin holding no single JSON object, which yields an unversioned `invalid-schema` result carrying only `status` and `detail`.\n\u003C\u002Fobjective>\n\n\u003Coperation_surface>\n\nThe source-owned operation names are:\n\n| Operation         | Arguments                                                        | Mutation authorization            |\n| ----------------- | ---------------------------------------------------------------- | --------------------------------- |\n| `inventory`       | none                                                             | no                                |\n| `read`            | one selector; optional `source`, `lines`                         | no                                |\n| `wait`            | one selector, `timeout`; optional `until`                        | no                                |\n| `prompt`          | one selector, `text`; optional `wait` with `timeout` and `until` | when `text` is `\u002Fexit` or `\u002Fquit` |\n| `key`             | one selector, `keys`                                             | required                          |\n| `start`           | `name`, `kind`, `pane`, `timeout`; optional `agentArguments`     | required                          |\n| `relaunch`        | as `start`, for a pane whose earlier agent session ended         | required                          |\n| `stop`            | `pane`                                                           | required                          |\n| `create-worktree` | `workspace`; optional `branch`, `base`, `path`                   | required                          |\n| `open-worktree`   | `workspace`, `path`                                              | required                          |\n\nA selector is exactly one of `agent` (a live agent name) or `pane` (a pane id such as `w1:p1`). `timeout` is milliseconds and is required on every wait: `wait`, `prompt` with `wait: true`, `start`, and `relaunch`; the adapter's subprocess bound always exceeds it. `until` lists the server's states `idle`, `working`, `blocked`, `done`, and `unknown`. `source` is one of `visible`, `recent`, `recent-unwrapped`, and `detection`. `workspace` is the id of the herdr workspace a new worktree groups with, such as `w1F`; a `create-worktree` or `open-worktree` request without it returns `invalid-schema` before any herdr command runs. Every text argument — `agent`, `pane`, `text`, `name`, `kind`, `path`, `workspace`, `branch`, `base` — and every item of `keys` and `until` is non-empty and never begins with `--`, which herdr would read as one of its options; such a request returns `invalid-schema` before any herdr command runs, whatever its authorization, as does a request whose `wait` or `mutationAuthorized` is not a JSON boolean. The adapter judges authorization only for a request it has found well formed. Items of `agentArguments` are exempt: they pass after herdr's `--` separator to the launched agent. The adapter owns every herdr command token and flag.\n\n`read` returns the session's terminal text, not a JSON envelope. `start` launches the named agent kind into a pane at its shell prompt and succeeds only when herdr reports the session ready for input within the bound. `stop` submits the agent's own `\u002Fexit` to the pane: Claude Code and Codex, the agents `start` launches, end their session on it, and the pane stays open at its shell, so `relaunch` into the same pane follows. A `prompt` whose `text`, stripped of surrounding whitespace, is `\u002Fexit` — `stop`'s own command — or `\u002Fquit`, the alias Claude Code and Codex both accept for it, ends the session the same way, so it requires mutation authorization as `stop` does; without it the adapter returns `mutation-unauthorized` before any herdr command runs. A longer message that only mentions either command inside it ends no session and needs no authorization.\n\n`create-worktree` creates a Git worktree — on `branch` from `base` where the request names them, herdr's defaults otherwise, at `path` — and opens it as its own herdr workspace in one operation; `open-worktree` does the same for the existing worktree at `path`. Neither takes focus. Herdr groups the new workspace with the one the request names as a linked-worktree workspace; the new workspace is never the named one. The result's `worktree` object carries the checkout's `path`, the new `workspace`, and that workspace's `rootPane`, which is the `pane` a `start` into the worktree takes. `create-worktree` records no worktree-occupancy claim; the agent session `start` launches in the worktree claims it at its own start.\n\nThe adapter accepts `create-worktree` without `path` and then lets herdr choose the checkout location, which no result states before the checkout exists. This skill therefore always sets `path` to an absolute destination, as `\u003Cworkflow>` step 3 requires.\n\n\u003C\u002Foperation_surface>\n\n\u003Clifecycle_statuses>\n\nHerdr reports lifecycle conditions as error codes; the adapter projects the codes that call for distinct handling to a named `status` and keeps the code under `errorCode`:\n\n| herdr code             | `status`               | Meaning                                                     |\n| ---------------------- | ---------------------- | ----------------------------------------------------------- |\n| `server_not_running`   | `server-not-running`   | no server at the socket; the launch is refused, no fallback |\n| `agent_not_found`      | `identity-unavailable` | the selector names no hosted session                        |\n| `agent_not_ready`      | `agent-not-ready`      | start saw the agent but it is blocked during startup        |\n| `agent_blocked`        | `agent-blocked`        | the session waits at an approval or question UI             |\n| `agent_prompt_stalled` | `prompt-stalled`       | the prompt was written but no activity followed             |\n| `timeout`              | `wait-timeout`         | the bound elapsed before a matching state                   |\n\nEvery other code stays verbatim under `command-failed`. `server-not-running` also arrives with no `errorCode` when no `herdr` executable resolves on the machine: no command ran, so there is no envelope, and the `detail` says so.\n\n`agent-evidence-incomplete` carries no herdr code: a `start`, `relaunch`, or `wait` whose readiness judgment needs a field the agent's evidence lacks — `interactive_ready` for start and relaunch, `agent_status` for wait — returns it with the incomplete item under `session` in place of a readiness verdict.\n\nEvery named status ends the operation. Report the exact `status`, `errorCode` when present, `detail`, and any `session`, and take only the follow-up its row names; any further mutating operation is a new request under its own authorization:\n\n| `status`                    | Follow-up                                                                                                      |\n| --------------------------- | -------------------------------------------------------------------------------------------------------------- |\n| `server-not-running`        | none: never start a herdr server or switch to another environment                                              |\n| `identity-unavailable`      | run `inventory` to find the session's current name or pane; never re-address a request from a guessed selector |\n| `agent-not-ready`           | `read` the pane before any `relaunch`, which needs its own authorization                                       |\n| `agent-blocked`             | `read` the session to see the approval or question; an answer is a new `key` or `prompt` request               |\n| `prompt-stalled`            | `read` the session before submitting the prompt again; the prompt may already be delivered                     |\n| `wait-timeout`              | `read` the session before any retry; a prompt the request carried may already be delivered                     |\n| `agent-evidence-incomplete` | none: report the item's `missingFields`, and treat the session as neither ready nor not ready                  |\n\n\u003C\u002Flifecycle_statuses>\n\n\u003Cworkflow>\n\n1. Interpret `$ARGUMENTS` as one operation with its arguments, or as a complete JSON request. When it is empty, run nothing and return the result that one operation from `\u003Coperation_surface>` is required; the adapter has no default operation.\n2. Build this source-owned request shape and set only the arguments the operation accepts; the angle-bracketed value is a placeholder for the destination step 3 obtains:\n\n```json\n{\n  \"schemaVersion\": 1,\n  \"operation\": \"create-worktree\",\n  \"arguments\": {\n    \"workspace\": \"w1F\",\n    \"branch\": \"work\u002Fchange-42\",\n    \"path\": \"\u003Cabsolute checkout destination the authorization names>\",\n    \"mutationAuthorized\": true\n  }\n}\n```\n\n3. For `key`, `start`, `relaunch`, `stop`, `create-worktree`, `open-worktree`, or a `prompt` whose `text`, stripped of surrounding whitespace, is `\u002Fexit` or `\u002Fquit`, run the request only when it names its exact target and carries `\"mutationAuthorized\": true` inside `arguments`, which states the operator's authorization for that target. The target is one selector for `key`; the `pane` for `start`, `relaunch`, and `stop`; the session its selector names for that `prompt`; the workspace and the existing worktree at `path` for `open-worktree`; and for `create-worktree` the workspace and the absolute path of the checkout it writes, which the request carries as `path`. A `create-worktree` authorization that states no absolute destination authorizes no checkout: obtain one that states it, and never omit `path` or choose a destination the operator did not name. One authorization covers one checkout. Set the flag only when the request arrived with it or the operator authorized that exact target; never add it while interpreting a plain-text request. A request without it is not run.\n4. Write the request with the file-write tool to a file in the scratch directory the harness names for this session, under a file name unique to the agent and the request, and submit it through the input redirect in `\u003Cinvocation_forms>`. Where the harness names no scratch directory, use the one the environment designates, such as `$RUNNER_TEMP` on a hosted runner.\n5. Accept only `status: \"succeeded\"`. Preserve the complete versioned result, `commandExitCode`, and the public `response`: herdr's own JSON envelope for every operation but `read`, and for `read` herdr's terminal text verbatim under `output`. Read the projection the operation adds:\n   - `inventory` carries `agents`, one item per hosted session with `name`, `agent`, `agent_status`, `pane_id`, `tab_id`, `workspace_id`, `cwd`, and `interactive_ready`. An agent whose evidence lacks any of those fields is an incomplete item: the fields its evidence carries, verbatim, and the missing names under `missingFields`. Every other agent stays complete.\n   - `start`, `relaunch`, `wait`, `read`, and `prompt` carry under `session` the one hosted session they acted on, projected as an inventory item is. A `read` or `prompt` addressed to an agent whose evidence is incomplete still succeeds and carries the incomplete item.\n   - `create-worktree` and `open-worktree` carry `worktree` with `path`, `workspace`, and `rootPane`.\n6. On any other `status`, the operation carries no projection. For a status `\u003Clifecycle_statuses>` names, report it and apply the follow-up its row names. On `command-failed`, `invalid-schema`, `mutation-unauthorized`, or `operation-unavailable`, stop with the exact `status` and `detail`. When the script exits 2 with only `status: \"invalid-schema\"` and `detail`, carrying no `schemaVersion` and no `operation`, stdin held no single JSON object and the adapter read no request; stop with that `status` and `detail` the same way.\n\n\u003C\u002Fworkflow>\n\n\u003Cinvocation_forms>\n\nTo submit a request, with `\u003Crequest-file>` the file written in `\u003Cworkflow>` step 4:\n\n```bash\npython3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fherdr_environment.py\" run \u003C \u003Crequest-file>\n```\n\n\u003C\u002Finvocation_forms>\n\n\u003Cconstraints>\n\n- ALWAYS execute the bundled script through `${CLAUDE_SKILL_DIR}`; never import it from another filesystem location or manufacture a path outside this skill directory.\n- ALWAYS preserve herdr identities and states verbatim: agent names, pane, tab, and workspace ids, and the server's own `agent_status`.\n- ALWAYS carry an explicit `timeout` on every wait; the adapter rejects an unbounded wait before any command runs.\n- ALWAYS address a worktree's agent session through the `rootPane` and `workspace` its worktree result returns, never through a pane of the workspace the request named.\n- NEVER pass a request through a heredoc, a pipe, or an inline argument, and NEVER remove the request file — a request carries prompt text, quotes, and JSON that the dangerous-command guard refuses in those forms, and the harness clears its scratch directory.\n- NEVER invoke raw herdr commands, herdr command help, or `herdr --skill`, the skill text herdr prints for agents; the adapter owns the grammar, and that text would put a second, unversioned grammar into the conversation.\n- NEVER create a worktree for a herdr-hosted agent session with `git worktree add` — `create-worktree` creates the checkout and its grouped workspace in one authorized operation.\n- NEVER run `key`, `start`, `relaunch`, `stop`, `create-worktree`, `open-worktree`, or a `prompt` whose `text`, stripped of surrounding whitespace, is `\u002Fexit` or `\u002Fquit` without authorization for its exact target in the request — that prompt ends the session exactly as `stop` does.\n- NEVER run `create-worktree` without an absolute `path` its authorization names — herdr's default location stays unstated until the checkout exists, so the write would land where no one confirmed it.\n- NEVER produce or expect a pane-borne handback block; the environment surface carries prompts and keystrokes only, and message records travel through the agent-mail capability.\n\n\u003C\u002Fconstraints>\n\n\u003Ctesting>\n\nTested over the generated request domain and herdr's captured responses, with controlled `CommandRunner` implementations at the herdr boundary:\n\n- Every registry operation's argument vector → matches herdr's captured usage text and carries a subprocess bound above the request's timeout ✓\n- Every captured response — each success envelope, the read's terminal text, every error envelope herdr emitted → its result, without rewriting ✓\n- Captured start, wait, and prompt responses → the session's identity and state ✓\n- The captured inventory, and inventories varied from its first item over every server state → complete participants ✓\n- Absent or duplicated selectors → their named results ✓\n- A captured inventory with an agent lacking a name and one lacking `interactive_ready`, and inventories varied by dropping each projected field → each incomplete agent as its incomplete item, every other agent in full ✓\n- Start, relaunch, and wait with a readiness field missing → `agent-evidence-incomplete`, exactly then ✓\n- Read and prompt addressed to an incomplete agent → succeed carrying the item ✓\n- Captured worktree create and open responses → the checkout's path, a workspace other than the named one, and that workspace's root pane ✓\n- Herdr's captured worktree list for the named workspace → lists the checkout as a linked worktree open in the returned workspace ✓\n- A worktree request without `workspace` → runs no command ✓\n- `create-worktree` → runs its one command and nothing more ✓\n- `stop` → runs the prompt vector carrying `\u002Fexit`; herdr's captured pane list keeps the pane at its shell; a relaunch into it succeeds ✓\n- Every projected error code → its named status; an unprojected code → `command-failed` with the code verbatim ✓\n- Every mutating request with authorization absent or `false` → fails ✓\n- Every mutating request, and every `prompt` whose `text` is `\u002Fexit` or `\u002Fquit`, carrying a text argument that begins with `--` under authorization absent or `false`, or carrying `mutationAuthorized` as the text `\"true\"` → `invalid-schema` and no command ✓\n- A `prompt` whose `text` is `\u002Fexit` or `\u002Fquit`, bare or padded with whitespace, with authorization absent or `false` → `mutation-unauthorized` and no command; with authorization → runs its command, `\u002Fexit` as `stop`'s own vector; a longer message mentioning either command, or any other text → runs unauthorized ✓\n- Every wait-bearing request without a timeout → fails ✓\n- A request against a child that outlives the derived bound → `command-failed` ✓\n\n\u003C\u002Ftesting>\n\n\u003Csuccess_criteria>\n\n- A successful operation is established only when the bundled script exits zero and emits `schemaVersion: 1`, `status: \"succeeded\"`, `commandExitCode: 0`, and the public `response` without exposing herdr command grammar.\n- Every hosted session in an inventory result keeps its complete public identity and the server's own state, or appears as an incomplete item naming exactly the fields its evidence lacks; no incomplete agent removes another agent from the result.\n- A worktree result names the checkout's path, a workspace herdr grouped with the named one, and that workspace's root pane.\n- A stop's own result establishes only that herdr accepted `\u002Fexit`; its pane's return to the shell is established when a following `relaunch` into that pane, under that relaunch's own authorization, succeeds.\n- Every projected herdr error code reaches the caller as its named status with the code and message verbatim.\n- No mutating operation and no `prompt` whose `text`, stripped of surrounding whitespace, is `\u002Fexit` or `\u002Fquit` reaches herdr without authorization, and no worktree request without a workspace or unbounded wait reaches herdr.\n- No `create-worktree` reaches herdr without an absolute `path` its authorization names.\n\n\u003C\u002Fsuccess_criteria>\n","\u003Cobjective>\nOne versioned JSON result per herdr operation — `status: \"succeeded\"` with herdr's public response and the operation's projection, identities and states verbatim, or a failure `status` from `\u003Clifecycle_statuses>` or among `command-failed`, `invalid-schema`, `mutation-unauthorized`, and `operation-unavailable` with its `detail` — except for stdin holding no single JSON object, which yields an unversioned `invalid-schema` result carrying only `status` and `detail`.\n\u003C\u002Fobjective>\n\n\u003Coperation_surface>\n\nThe source-owned operation names are:\n\n| Operation         | Arguments                                                        | Mutation authorization            |\n| ----------------- | ---------------------------------------------------------------- | --------------------------------- |\n| `inventory`       | none                                                             | no                                |\n| `read`            | one selector; optional `source`, `lines`                         | no                                |\n| `wait`            | one selector, `timeout`; optional `until`                        | no                                |\n| `prompt`          | one selector, `text`; optional `wait` with `timeout` and `until` | when `text` is `\u002Fexit` or `\u002Fquit` |\n| `key`             | one selector, `keys`                                             | required                          |\n| `start`           | `name`, `kind`, `pane`, `timeout`; optional `agentArguments`     | required                          |\n| `relaunch`        | as `start`, for a pane whose earlier agent session ended         | required                          |\n| `stop`            | `pane`                                                           | required                          |\n| `create-worktree` | `workspace`; optional `branch`, `base`, `path`                   | required                          |\n| `open-worktree`   | `workspace`, `path`                                              | required                          |\n\nA selector is exactly one of `agent` (a live agent name) or `pane` (a pane id such as `w1:p1`). `timeout` is milliseconds and is required on every wait: `wait`, `prompt` with `wait: true`, `start`, and `relaunch`; the adapter's subprocess bound always exceeds it. `until` lists the server's states `idle`, `working`, `blocked`, `done`, and `unknown`. `source` is one of `visible`, `recent`, `recent-unwrapped`, and `detection`. `workspace` is the id of the herdr workspace a new worktree groups with, such as `w1F`; a `create-worktree` or `open-worktree` request without it returns `invalid-schema` before any herdr command runs. Every text argument — `agent`, `pane`, `text`, `name`, `kind`, `path`, `workspace`, `branch`, `base` — and every item of `keys` and `until` is non-empty and never begins with `--`, which herdr would read as one of its options; such a request returns `invalid-schema` before any herdr command runs, whatever its authorization, as does a request whose `wait` or `mutationAuthorized` is not a JSON boolean. The adapter judges authorization only for a request it has found well formed. Items of `agentArguments` are exempt: they pass after herdr's `--` separator to the launched agent. The adapter owns every herdr command token and flag.\n\n`read` returns the session's terminal text, not a JSON envelope. `start` launches the named agent kind into a pane at its shell prompt and succeeds only when herdr reports the session ready for input within the bound. `stop` submits the agent's own `\u002Fexit` to the pane: Claude Code and Codex, the agents `start` launches, end their session on it, and the pane stays open at its shell, so `relaunch` into the same pane follows. A `prompt` whose `text`, stripped of surrounding whitespace, is `\u002Fexit` — `stop`'s own command — or `\u002Fquit`, the alias Claude Code and Codex both accept for it, ends the session the same way, so it requires mutation authorization as `stop` does; without it the adapter returns `mutation-unauthorized` before any herdr command runs. A longer message that only mentions either command inside it ends no session and needs no authorization.\n\n`create-worktree` creates a Git worktree — on `branch` from `base` where the request names them, herdr's defaults otherwise, at `path` — and opens it as its own herdr workspace in one operation; `open-worktree` does the same for the existing worktree at `path`. Neither takes focus. Herdr groups the new workspace with the one the request names as a linked-worktree workspace; the new workspace is never the named one. The result's `worktree` object carries the checkout's `path`, the new `workspace`, and that workspace's `rootPane`, which is the `pane` a `start` into the worktree takes. `create-worktree` records no worktree-occupancy claim; the agent session `start` launches in the worktree claims it at its own start.\n\nThe adapter accepts `create-worktree` without `path` and then lets herdr choose the checkout location, which no result states before the checkout exists. This skill therefore always sets `path` to an absolute destination, as `\u003Cworkflow>` step 3 requires.\n\n\u003C\u002Foperation_surface>\n\n\u003Clifecycle_statuses>\n\nHerdr reports lifecycle conditions as error codes; the adapter projects the codes that call for distinct handling to a named `status` and keeps the code under `errorCode`:\n\n| herdr code             | `status`               | Meaning                                                     |\n| ---------------------- | ---------------------- | ----------------------------------------------------------- |\n| `server_not_running`   | `server-not-running`   | no server at the socket; the launch is refused, no fallback |\n| `agent_not_found`      | `identity-unavailable` | the selector names no hosted session                        |\n| `agent_not_ready`      | `agent-not-ready`      | start saw the agent but it is blocked during startup        |\n| `agent_blocked`        | `agent-blocked`        | the session waits at an approval or question UI             |\n| `agent_prompt_stalled` | `prompt-stalled`       | the prompt was written but no activity followed             |\n| `timeout`              | `wait-timeout`         | the bound elapsed before a matching state                   |\n\nEvery other code stays verbatim under `command-failed`. `server-not-running` also arrives with no `errorCode` when no `herdr` executable resolves on the machine: no command ran, so there is no envelope, and the `detail` says so.\n\n`agent-evidence-incomplete` carries no herdr code: a `start`, `relaunch`, or `wait` whose readiness judgment needs a field the agent's evidence lacks — `interactive_ready` for start and relaunch, `agent_status` for wait — returns it with the incomplete item under `session` in place of a readiness verdict.\n\nEvery named status ends the operation. Report the exact `status`, `errorCode` when present, `detail`, and any `session`, and take only the follow-up its row names; any further mutating operation is a new request under its own authorization:\n\n| `status`                    | Follow-up                                                                                                      |\n| --------------------------- | -------------------------------------------------------------------------------------------------------------- |\n| `server-not-running`        | none: never start a herdr server or switch to another environment                                              |\n| `identity-unavailable`      | run `inventory` to find the session's current name or pane; never re-address a request from a guessed selector |\n| `agent-not-ready`           | `read` the pane before any `relaunch`, which needs its own authorization                                       |\n| `agent-blocked`             | `read` the session to see the approval or question; an answer is a new `key` or `prompt` request               |\n| `prompt-stalled`            | `read` the session before submitting the prompt again; the prompt may already be delivered                     |\n| `wait-timeout`              | `read` the session before any retry; a prompt the request carried may already be delivered                     |\n| `agent-evidence-incomplete` | none: report the item's `missingFields`, and treat the session as neither ready nor not ready                  |\n\n\u003C\u002Flifecycle_statuses>\n\n\u003Cworkflow>\n\n1. Interpret `$ARGUMENTS` as one operation with its arguments, or as a complete JSON request. When it is empty, run nothing and return the result that one operation from `\u003Coperation_surface>` is required; the adapter has no default operation.\n2. Build this source-owned request shape and set only the arguments the operation accepts; the angle-bracketed value is a placeholder for the destination step 3 obtains:\n\n```json\n{\n  \"schemaVersion\": 1,\n  \"operation\": \"create-worktree\",\n  \"arguments\": {\n    \"workspace\": \"w1F\",\n    \"branch\": \"work\u002Fchange-42\",\n    \"path\": \"\u003Cabsolute checkout destination the authorization names>\",\n    \"mutationAuthorized\": true\n  }\n}\n```\n\n3. For `key`, `start`, `relaunch`, `stop`, `create-worktree`, `open-worktree`, or a `prompt` whose `text`, stripped of surrounding whitespace, is `\u002Fexit` or `\u002Fquit`, run the request only when it names its exact target and carries `\"mutationAuthorized\": true` inside `arguments`, which states the operator's authorization for that target. The target is one selector for `key`; the `pane` for `start`, `relaunch`, and `stop`; the session its selector names for that `prompt`; the workspace and the existing worktree at `path` for `open-worktree`; and for `create-worktree` the workspace and the absolute path of the checkout it writes, which the request carries as `path`. A `create-worktree` authorization that states no absolute destination authorizes no checkout: obtain one that states it, and never omit `path` or choose a destination the operator did not name. One authorization covers one checkout. Set the flag only when the request arrived with it or the operator authorized that exact target; never add it while interpreting a plain-text request. A request without it is not run.\n4. Write the request with the file-write tool to a file in the scratch directory the harness names for this session, under a file name unique to the agent and the request, and submit it through the input redirect in `\u003Cinvocation_forms>`. Where the harness names no scratch directory, use the one the environment designates, such as `$RUNNER_TEMP` on a hosted runner.\n5. Accept only `status: \"succeeded\"`. Preserve the complete versioned result, `commandExitCode`, and the public `response`: herdr's own JSON envelope for every operation but `read`, and for `read` herdr's terminal text verbatim under `output`. Read the projection the operation adds:\n   - `inventory` carries `agents`, one item per hosted session with `name`, `agent`, `agent_status`, `pane_id`, `tab_id`, `workspace_id`, `cwd`, and `interactive_ready`. An agent whose evidence lacks any of those fields is an incomplete item: the fields its evidence carries, verbatim, and the missing names under `missingFields`. Every other agent stays complete.\n   - `start`, `relaunch`, `wait`, `read`, and `prompt` carry under `session` the one hosted session they acted on, projected as an inventory item is. A `read` or `prompt` addressed to an agent whose evidence is incomplete still succeeds and carries the incomplete item.\n   - `create-worktree` and `open-worktree` carry `worktree` with `path`, `workspace`, and `rootPane`.\n6. On any other `status`, the operation carries no projection. For a status `\u003Clifecycle_statuses>` names, report it and apply the follow-up its row names. On `command-failed`, `invalid-schema`, `mutation-unauthorized`, or `operation-unavailable`, stop with the exact `status` and `detail`. When the script exits 2 with only `status: \"invalid-schema\"` and `detail`, carrying no `schemaVersion` and no `operation`, stdin held no single JSON object and the adapter read no request; stop with that `status` and `detail` the same way.\n\n\u003C\u002Fworkflow>\n\n\u003Cinvocation_forms>\n\nTo submit a request, with `\u003Crequest-file>` the file written in `\u003Cworkflow>` step 4:\n\n```bash\npython3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fherdr_environment.py\" run \u003C \u003Crequest-file>\n```\n\n\u003C\u002Finvocation_forms>\n\n\u003Cconstraints>\n\n- ALWAYS execute the bundled script through `${CLAUDE_SKILL_DIR}`; never import it from another filesystem location or manufacture a path outside this skill directory.\n- ALWAYS preserve herdr identities and states verbatim: agent names, pane, tab, and workspace ids, and the server's own `agent_status`.\n- ALWAYS carry an explicit `timeout` on every wait; the adapter rejects an unbounded wait before any command runs.\n- ALWAYS address a worktree's agent session through the `rootPane` and `workspace` its worktree result returns, never through a pane of the workspace the request named.\n- NEVER pass a request through a heredoc, a pipe, or an inline argument, and NEVER remove the request file — a request carries prompt text, quotes, and JSON that the dangerous-command guard refuses in those forms, and the harness clears its scratch directory.\n- NEVER invoke raw herdr commands, herdr command help, or `herdr --skill`, the skill text herdr prints for agents; the adapter owns the grammar, and that text would put a second, unversioned grammar into the conversation.\n- NEVER create a worktree for a herdr-hosted agent session with `git worktree add` — `create-worktree` creates the checkout and its grouped workspace in one authorized operation.\n- NEVER run `key`, `start`, `relaunch`, `stop`, `create-worktree`, `open-worktree`, or a `prompt` whose `text`, stripped of surrounding whitespace, is `\u002Fexit` or `\u002Fquit` without authorization for its exact target in the request — that prompt ends the session exactly as `stop` does.\n- NEVER run `create-worktree` without an absolute `path` its authorization names — herdr's default location stays unstated until the checkout exists, so the write would land where no one confirmed it.\n- NEVER produce or expect a pane-borne handback block; the environment surface carries prompts and keystrokes only, and message records travel through the agent-mail capability.\n\n\u003C\u002Fconstraints>\n\n\u003Ctesting>\n\nTested over the generated request domain and herdr's captured responses, with controlled `CommandRunner` implementations at the herdr boundary:\n\n- Every registry operation's argument vector → matches herdr's captured usage text and carries a subprocess bound above the request's timeout ✓\n- Every captured response — each success envelope, the read's terminal text, every error envelope herdr emitted → its result, without rewriting ✓\n- Captured start, wait, and prompt responses → the session's identity and state ✓\n- The captured inventory, and inventories varied from its first item over every server state → complete participants ✓\n- Absent or duplicated selectors → their named results ✓\n- A captured inventory with an agent lacking a name and one lacking `interactive_ready`, and inventories varied by dropping each projected field → each incomplete agent as its incomplete item, every other agent in full ✓\n- Start, relaunch, and wait with a readiness field missing → `agent-evidence-incomplete`, exactly then ✓\n- Read and prompt addressed to an incomplete agent → succeed carrying the item ✓\n- Captured worktree create and open responses → the checkout's path, a workspace other than the named one, and that workspace's root pane ✓\n- Herdr's captured worktree list for the named workspace → lists the checkout as a linked worktree open in the returned workspace ✓\n- A worktree request without `workspace` → runs no command ✓\n- `create-worktree` → runs its one command and nothing more ✓\n- `stop` → runs the prompt vector carrying `\u002Fexit`; herdr's captured pane list keeps the pane at its shell; a relaunch into it succeeds ✓\n- Every projected error code → its named status; an unprojected code → `command-failed` with the code verbatim ✓\n- Every mutating request with authorization absent or `false` → fails ✓\n- Every mutating request, and every `prompt` whose `text` is `\u002Fexit` or `\u002Fquit`, carrying a text argument that begins with `--` under authorization absent or `false`, or carrying `mutationAuthorized` as the text `\"true\"` → `invalid-schema` and no command ✓\n- A `prompt` whose `text` is `\u002Fexit` or `\u002Fquit`, bare or padded with whitespace, with authorization absent or `false` → `mutation-unauthorized` and no command; with authorization → runs its command, `\u002Fexit` as `stop`'s own vector; a longer message mentioning either command, or any other text → runs unauthorized ✓\n- Every wait-bearing request without a timeout → fails ✓\n- A request against a child that outlives the derived bound → `command-failed` ✓\n\n\u003C\u002Ftesting>\n\n\u003Csuccess_criteria>\n\n- A successful operation is established only when the bundled script exits zero and emits `schemaVersion: 1`, `status: \"succeeded\"`, `commandExitCode: 0`, and the public `response` without exposing herdr command grammar.\n- Every hosted session in an inventory result keeps its complete public identity and the server's own state, or appears as an incomplete item naming exactly the fields its evidence lacks; no incomplete agent removes another agent from the result.\n- A worktree result names the checkout's path, a workspace herdr grouped with the named one, and that workspace's root pane.\n- A stop's own result establishes only that herdr accepted `\u002Fexit`; its pane's return to the shell is established when a following `relaunch` into that pane, under that relaunch's own authorization, succeeds.\n- Every projected herdr error code reaches the caller as its named status with the code and message verbatim.\n- No mutating operation and no `prompt` whose `text`, stripped of surrounding whitespace, is `\u002Fexit` or `\u002Fquit` reaches herdr without authorization, and no worktree request without a workspace or unbounded wait reaches herdr.\n- No `create-worktree` reaches herdr without an absolute `path` its authorization names.\n\n\u003C\u002Fsuccess_criteria>\n",{"name":5,"description":7,"allowed-tools":49,"argument-hint":50},"Write, Bash(python3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fherdr_environment.py\":*)","\u003Coperation or JSON request>","main","978d51c51d68c99cffb2ba48f7cad9d2f07e5738","src\u002Fplugins\u002Fcoding-agents\u002Fskills\u002Foperate-herdr","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins","https:\u002F\u002Fgithub.com\u002Foutcomeeng","https:\u002F\u002Foutcome.engineering","Spec-driven development for AI-assisted engineering","2026-11-10 01:06:33",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add outcomeeng\u002Fplugins --skill operate-herdr",{"tool":65,"command":66},"bunx","bunx skills add outcomeeng\u002Fplugins --skill operate-herdr",{"tool":68,"command":69},"pnpm","pnpm dlx skills add outcomeeng\u002Fplugins --skill operate-herdr","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fcoding-agents\u002Fskills\u002Foperate-herdr\u002FSKILL.md",true,[73],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"scripts\u002Fherdr_environment.py","SCRIPT","脚本",45153,"https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fcoding-agents\u002Fskills\u002Foperate-herdr\u002Fscripts\u002Fherdr_environment.py",[80,86,118,134,151,164],{"skillNo":81,"name":82,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":44},"01M71G25RZTPQG9KJ00JCHC1F7","plugin","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Ftemplates\u002Fplugin\u002FSKILL.md",[],[82],{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":100,"publishedAt":44},"01M71G23DCX3SV60H63HBBKQ6J","sanitize-powerpoint","ALWAYS invoke this skill when sanitizing, cleaning up, auditing, or aligning a PowerPoint (.pptx) deck — slide-master and layout structure, layout type attributes, stray fonts, non-theme colors, or layout naming. NEVER hand-edit pptx XML without this skill.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fwork\u002Fskills\u002Fsanitize-powerpoint\u002FSKILL.md",[92,95],{"categoryNo":93,"categoryName":94,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":96,"categoryName":97,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[101,102,103,104,105,106,107,27,108,109,110,111,112,113,114,115,116,117,31,30],"sanitize powerpoint","powerpoint","sanitize","fonts","type","cleaning","structure","attributes","theme","pptx","naming","layout","deck","up","edit","xml","master",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":44},"01M71G21PQKBCDECHGVYSKPJW5","draw-excalidraw","ALWAYS invoke this skill when creating Excalidraw diagrams, visualizing workflows, architectures, or concepts. NEVER generate Excalidraw JSON without this skill.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fwork\u002Fskills\u002Fdraw-excalidraw\u002FSKILL.md",[],[125,126,127,128,129,27,31,130,131,30,132,133],"draw excalidraw","excalidraw","draw","diagrams","architectures","generate","workflows","concepts","json",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":143,"publishedAt":44},"01M71G1ZMNGFD37RZYM620XM2C","typescript-test-standards","TypeScript test standards enforced across all skills. Loaded by other skills, not invoked directly.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Ftypescript\u002Fskills\u002Ftypescript-test-standards\u002FSKILL.md",[140],{"categoryNo":141,"categoryName":142,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[144,145,146,147,148,149,150],"typescript","typescript test standards","test","standards","false","read","across",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":160,"publishedAt":44},"01M71G1XBH0X1VCTR7269MDGSY","typescript-code-standards","TypeScript code standards enforced across all skills. Loaded by other skills, not invoked directly.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Ftypescript\u002Fskills\u002Ftypescript-code-standards\u002FSKILL.md",[157],{"categoryNo":158,"categoryName":159,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000030","开发工程师",[144,161,162,163,147,148,149,150],"code","typescript code standards","code standards",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":170,"publishedAt":44},"01M71G1TQ3VN45SJ75DFMJDB9W","typescript-architecture-standards","TypeScript ADR conventions enforced across architect and auditor skills. Loaded by other skills, not invoked directly.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Ftypescript\u002Fskills\u002Ftypescript-architecture-standards\u002FSKILL.md",[],[171,147,172,173,144,174,175,150,149,176,148,177],"architecture standards","typescript architecture standards","architecture","adr","architect","auditor","conventions"]