[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71FSJ027W8TS36YDR87GE0H":3,"skill-same:01M71FSJ027W8TS36YDR87GE0H":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},"01M71FSJ027W8TS36YDR87GE0H","operate-prowl",null,"ALWAYS invoke this skill when a workflow needs a public Prowl operation or a correlated delegation handback between Prowl coding agents. NEVER run Prowl command help or construct the public CLI command directly when this capability is available.","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-prowl\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],"prowl","operate prowl","operate","run","help","coding agents","command","cli","Bash","ask","workflow","operation","when","invoke","never run","delegation","tool","environment","never","python3","2026-11-10 10:12:30",false,"---\nname: operate-prowl\ndescription: >-\n  ALWAYS invoke this skill when a workflow needs a public Prowl operation or a correlated delegation handback between Prowl coding agents. NEVER run Prowl command help or construct the public CLI command directly when this capability is available.\nargument-hint: \"\u003Coperation, delegation, or JSON request>\"\nallowed-tools: Write, Bash(python3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fprowl_environment.py\":*), {{! tool('ask_user') !}}\n---\n\n\u003Cobjective>\nA versioned JSON Prowl operation result or one correlated terminal delegation handback, with complete public identities and checked command status preserved verbatim.\n\u003C\u002Fobjective>\n\n\u003Coperation_surface>\n\nThe source-owned operation names are:\n\n| Operation    | Arguments                                                                                           | Mutation authorization |\n| ------------ | --------------------------------------------------------------------------------------------------- | ---------------------- |\n| `list`       | none                                                                                                | no                     |\n| `agents`     | none                                                                                                | no                     |\n| `read`       | one selector; optional `last`, `waitStable`, stability bounds                                       | no                     |\n| `send`       | one selector, `text`; optional `noEnter`, `noWait`, `capture`, `timeout` with the constraints below | no                     |\n| `key`        | one selector, `key`; optional `repeat`                                                              | required               |\n| `focus`      | one selector                                                                                        | required               |\n| `tab-create` | optional selector and `path`                                                                        | required               |\n| `tab-close`  | one selector; optional `force`                                                                      | required               |\n| `pane-close` | one selector; optional `force`                                                                      | required               |\n| `open`       | optional `path`                                                                                     | required               |\n\nA selector is exactly one of `target`, `worktree`, `tab`, or `pane`. Preserve its complete public value. For `send`, `capture` cannot combine with `noEnter` or `noWait`, and `timeout` cannot combine with `noWait`. The adapter always requests public JSON and owns every Prowl command token and flag.\n\n\u003C\u002Foperation_surface>\n\n\u003Coperator_target_resolution>\n\nAn operator names a target by where the work lives — an absolute worktree path, repository directory, or working directory. Resolve that path through one `resolve-target` invocation before operating. Write `{\"schemaVersion\":1,\"path\":\"\u003Cabsolute-operator-supplied-path>\"}` to a request file per `\u003Cinvocation_forms>` and submit it:\n\n```bash\npython3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fprowl_environment.py\" resolve-target \u003C \u003Crequest-file>\n```\n\nThe resolver runs the public `agents` operation once and returns its complete checked result under `inventory`, every complete participant under `participants`, the complete caller selected from `PROWL_PANE_ID` or the exact `PROWL_WORKTREE_PATH` fallback, and non-caller path matches under `candidates`. When both caller values exist, both must identify the same participant. Each candidate carries its complete participant metadata and a `sendRequestTemplate` with that pane already selected, `noWait: true`, and `text: null`. Fill `text` with the semantic payload; never repair the JSON through shell substitution.\n\nUse the one candidate directly when `status` is `succeeded`. On `identity-ambiguous` with a complete caller, use `{{! tool('ask_user') !}}` for one single-select question. Number candidates in resolver order; show each candidate's complete pane, worktree, branch, and repository; and map the answer back to that exact captured candidate, including its `sendRequestTemplate`. When the runtime's option cap is below the candidate count, include the complete numbered inventory in the question and accept an exact candidate number through its free-form response; never omit a candidate. On `identity-ambiguous` with `caller: null`, report the exact detail as an unresolved caller-identity conflict and stop; no candidate choice can resolve it. On `identity-unavailable`, report the supplied path and the returned participant worktrees. The resolver performs no send in every result state.\n\nA target that is not a coding-agent pane is outside what `agents` returns, so no path match is available for it. Say that the operator's target is not among the agent panes and name the ones that are, rather than falling back to an inventory that carries no worktree to match.\n\n`resolve-target` resolves active pane targets from `agents`. When the supplied path matches no non-caller participant, return `identity-unavailable` with the complete pane inventory. A sidebar worktree that has never been entered has no pane UUID and cannot receive a message yet; an explicitly authorized `open` request can activate an operator-known path, after which `resolve-target` can run again. The resolver never probes with `open` or claims whether an unmatched path is known to Prowl.\n\nReport the target back to the operator as the supplied path while using the selected template's pane internally. Never ask the operator for a pane UUID or guess by focus, position, or title.\n\n\u003C\u002Foperator_target_resolution>\n\n\u003Cworkflow>\n\n1. Interpret `$ARGUMENTS` as one target resolution, low-level operation, handback plan, delegation request, or terminal handback. When it is empty, require a concrete operation before running the adapter. Resolve an absolute worktree, repository, or working-directory target per `\u003Coperator_target_resolution>` before building its operation request.\n2. For `list`, `agents`, `read`, or `send`, build this source-owned request shape and set only arguments the operation accepts:\n\n```json\n{\n  \"schemaVersion\": 1,\n  \"operation\": \"agents\",\n  \"arguments\": {}\n}\n```\n\n`list` inventories instantiated terminal panes only. A worktree visible in Prowl's sidebar but never entered in the current app process can be absent from `list` because it has no pane UUID yet.\n\n3. For `key`, `focus`, `tab-create`, `tab-close`, `pane-close`, or `open`, require an explicit user instruction authorizing that exact external mutation in the same turn. `open` can visibly switch focus and create a first terminal tab, so it is never read-only. When authorization is absent, use `{{! tool('ask_user') !}}` with the exact operation and complete target identity; do not run the adapter. After authorization, add `\"mutationAuthorized\": true` inside `arguments`. For `open`, set arguments to `{\"mutationAuthorized\":true}` or `{\"path\":\"\u003Ccomplete-source-supplied-path>\",\"mutationAuthorized\":true}`.\n4. Write the request to a request file per `\u003Cinvocation_forms>` and submit it:\n\n```bash\npython3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fprowl_environment.py\" run \u003C \u003Crequest-file>\n```\n\n5. Accept only `status: \"succeeded\"` for a submitted operation. Preserve the complete versioned result, `commandExitCode`, and public `response` values. For `open`, preserve `response.data.resolution`, `created_tab`, and the complete target; `exact-root` with `created_tab: true` is the lazy equivalent of clicking a known sidebar worktree that has no terminal pane. `new-root` means Prowl added a previously unknown root and never proves a prepared recovery target existed. For submitted `send`, require `commandExitCode: 0` and preserve `response.data.input.trailing_enter_sent`; success with that field false or absent does not prove the turn left the editor. Once the checked send reports `trailing_enter_sent: true`, the turn is queued and delivery is complete; never send it again because the entry box becomes free. Stop with the exact `status` and `detail` on `command-failed`, `invalid-schema`, `prowl-unavailable`, `mutation-unauthorized`, or `operation-unavailable`.\n6. For bounded delegation between two identities returned by `agents`, supply semantic completion text and submit this shape to `delegate`:\n\n```json\n{\n  \"sender\": {\n    \"agent\": \"\u003Ccomplete-agent-id>\",\n    \"pane\": \"\u003Ccomplete-pane-id>\",\n    \"worktree\": \"\u003Cabsolute-worktree-path>\",\n    \"branch\": \"\u003Ccomplete-branch>\",\n    \"repository\": \"\u003Cabsolute-repository-root>\",\n    \"run\": \"\u003Ccomplete-run-id-when-present>\"\n  },\n  \"recipient\": {\n    \"agent\": \"\u003Ccomplete-agent-id>\",\n    \"pane\": \"\u003Ccomplete-pane-id>\",\n    \"worktree\": \"\u003Cabsolute-worktree-path>\",\n    \"branch\": \"\u003Ccomplete-branch>\",\n    \"repository\": \"\u003Cabsolute-repository-root>\",\n    \"run\": \"\u003Ccomplete-run-id-when-present>\"\n  },\n  \"subject\": \"\u003Cbounded subject>\",\n  \"instruction\": \"\u003Ccomplete bounded request, with no shell command or return-path fields>\",\n  \"completionText\": \"\u003Cone-line completion signal for the sender>\",\n  \"correlation\": null\n}\n```\n\nThe adapter maps `completionText` and the two identities to a versioned `handback` block. The block contains `completionText`, the absolute `adapterPath`, an exact one-line `command` ending at `run`, checked `successCriteria`, `retryPolicy: \"never-after-trailing-enter\"`, `socket: \"default\"`, and `expectedPanes` in sender-recipient order. A caller never supplies `handback`, `command`, `handbackCommand`, `returnPane`, or `adapterPath`.\n\nThe result carries the complete source-owned schema-version-2 `delegation` envelope and generated handback block. Preserve it for the terminal handback; transport success is not acceptance or completion.\n\nA direct delegation submission writes that object to a request file per `\u003Cinvocation_forms>` and submits it:\n\n```bash\npython3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fprowl_environment.py\" delegate \u003C \u003Crequest-file>\n```\n\nTo generate the block without sending a delegation, write exactly `sender`, `recipient`, and `completionText` to a request file, submit it to `plan-handback`, and preserve the returned `handback` object unchanged:\n\n```bash\npython3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fprowl_environment.py\" plan-handback \u003C \u003Crequest-file>\n```\n\n7. The recipient writes any durable result first, executes the generated `handback.command` exactly, and submits exactly one terminal result to `handback`, carrying the complete original `delegation`, one `kind`, and one supported result form:\n\n- `delegation-completed`\n- `delegation-failed`\n- `delegation-rejected`\n- `delegation-unavailable`\n\nA complete inline result uses `inlineResult`. A durable result uses a scheme-bearing `resultReference` plus a bounded `projection`; use `file:\u002F\u002F\u002Fabsolute\u002Fpath` for a local file. Both forms may appear together. The adapter rejects a missing result, a reference without a URI scheme or projection, and a conflicting terminal handback.\n\nThe `handback` request file holds `{\"delegation\":\u003Ccomplete-returned-delegation>,\"kind\":\"delegation-completed\",\"inlineResult\":\"\u003Ccomplete-result>\"}`. Replace the angle-bracket value with the returned delegation object itself, never a quoted summary or reconstructed envelope.\n\n8. Return the complete terminal result to the delegating workflow. Do not poll the recipient, add acceptance or progress phases, or infer completion from pane output.\n\n\u003C\u002Fworkflow>\n\n\u003Cinvocation_forms>\n\nEvery subcommand (`run`, `resolve-target`, `delegate`, `plan-handback`, `handback`) takes its JSON request from stdin. 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 `\u003C \u003Crequest-file>` shown with each command. Where the harness names no scratch directory, use the one the environment designates, such as `$RUNNER_TEMP` on a hosted runner. A request carries prompt text, quotes, and JSON that the dangerous-command guard refuses in a heredoc, a pipe, or an inline argument.\n\n\u003C\u002Finvocation_forms>\n\n\u003Chandback_delivery>\n\nCompletion travels by push, never by pull. The sender's environment blocks polling loops by design, so a sender that \"checks later\" has no later to check in — it reads once, sees nothing, and moves on while the finished result sits on disk. The recipient closes the loop or nobody does.\n\n**A durable result separates payload from signal.** The file carries the payload; one line sent into the sender's pane carries the signal. Write the file first, then send. `resultReference` names the complete scheme-bearing reference — `file:\u002F\u002F\u002Fabsolute\u002Fpath` for a local file — and `projection` carries the bounded summary, so the sender knows what arrived without opening it.\n\n**The recipient delivers the handback by sending one line into the return address's pane**, using the `send` operation with normal trailing-Enter behavior. That send lands as a turn in the sender's session, which is what makes it a signal rather than a message the sender must go looking for. A `noEnter` send prefills the sender's editor and signals nothing.\n\n**The adapter generates the handback at delegation time.** The caller supplies only semantic completion text. The generated block binds that text to `sender.pane`, the bundled adapter path, checked submission criteria, the default socket, both expected panes, and the no-retry policy. This separation prevents a caller from changing CLI grammar while describing the requested work.\n\n\u003C\u002Fhandback_delivery>\n\n\u003Cenvironment_traps>\n\nTwo environment conditions silently break a handback. The generated block names both instead of leaving the recipient to discover them.\n\n**The CLI may not be on `PATH`.** Every Prowl command runs the bare `prowl` name, so a shell that cannot resolve it returns `prowl-unavailable` with its detail. That result means the CLI is missing from the environment, not that the recipient is absent; report the detail and stop.\n\n**A non-default socket may belong to a different instance.** When the socket is overridden, the CLI talks to whichever instance owns that socket — which can be another agent's verification harness holding no real panes rather than the operator's live application. An empty or unrecognizable pane inventory is that condition, not an absent recipient. Confirm the inventory contains the expected panes before concluding a target is gone, and use the same socket value for every command in the exchange.\n\n\u003C\u002Fenvironment_traps>\n\n\u003Cconstraints>\n\n- ALWAYS preserve complete source-supplied agent, pane, worktree, branch, repository, run, correlation, status, conclusion, exit-code, and result-reference values.\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 generate executable handback data from semantic completion text through `delegate` or `plan-handback`.\n- NEVER accept caller-authored `handback`, `command`, `handbackCommand`, `returnPane`, or `adapterPath` fields.\n- NEVER pass a request through a heredoc, a pipe, or an inline argument, and NEVER remove the request file; the harness clears its scratch directory.\n- NEVER invoke raw Prowl commands, Prowl command help, or an external environment-control skill.\n- NEVER mutate focus, keys, tabs, panes, or open-path selection without explicit authorization for the exact operation and target in the same turn.\n- NEVER equate `list` with the sidebar worktree inventory or enumerate filesystem worktrees to compensate for an uninstantiated pane.\n- NEVER scan transcripts, parse terminal presentation as identity, or poll for delegation completion.\n- NEVER make retry, checkpoint, persistence, result-interpretation, or continuation decisions for another workflow.\n\n\u003C\u002Fconstraints>\n\n\u003Ctesting>\n\nBefore release, import the bundled module with controlled `CommandRunner` implementations under the interaction-protocol and failure-simulation exceptions. Run the documented `run` form with an `agents` payload and require `status: \"succeeded\"`, `commandExitCode: 0`, and a public response; run `resolve-target` with pane-only, worktree-only, and combined caller evidence and require one inventory call, caller exclusion, and zero sends; fill one returned send template and require `response.data.input.trailing_enter_sent: true`; run `plan-handback`, `delegate`, and `handback` with the documented shapes and require the command to end exactly at `run`, the initiating correlation to survive, and every caller-authored executable handback field to fail. Cover every operation mapping, public JSON failure, mutation rejection before command construction, URI-bearing delegation result forms, repeated terminals, conflicting terminals, malformed input, missing Prowl, and CLI stdin dispatch.\n\nRecorded exercised payload\u002Fresults:\n\n- `{\"schemaVersion\":1,\"operation\":\"agents\",\"arguments\":{}}` with a successful public agents response → `status: \"succeeded\"`, `commandExitCode: 0`, and the response preserved.\n- `resolve-target` with an active non-caller worktree path → one candidate and no send; an unmatched absolute path → `identity-unavailable`, an empty candidate array, and no `open` probe.\n- A filled returned send template with `trailing_enter_sent: true` in the public response → one `succeeded` send result; the same submission evidence then supports one delivered message envelope.\n\n\u003C\u002Ftesting>\n\n\u003Cfailure_modes>\n\n**A selectorless tab creation was rejected.** Claude applied the shared selector requirement to `tab-create`, even though the public operation accepts both selectorless and selected forms. The shared request builder hid the operation-specific shape. Build `tab-create` from its declared optional-selector contract and preserve optional `path` independently.\n\n**An advertised operation had no construction branch.** Claude listed `open` in the public surface but grouped only list, agents, read, and send into the non-mutating workflow. Claude then had to infer the request shape. Keep every advertised operation in an explicit construction branch; `open` accepts empty arguments or one source-supplied `path`, always with explicit mutation authorization.\n\n**A visible worktree was absent from `list`.** Claude inferred missing Prowl topology because a sidebar row had no listed pane. The row was known but not entered; `open` returned `resolution: exact-root`, `created_tab: true`, and the first pane UUID. Treat `list` as the terminal inventory and use authorized `open` for visible lazy activation.\n\n**A delegation had no return path, so the operator became the message bus.** Claude asked a recipient to write a file, then had no signal that it had. Polling loops are blocked in the environment, so Claude read the pane once, saw nothing, and moved on while a complete result sat on disk. Generate the structured handback from the sender, recipient, and completion text, then require the recipient to send one line on completion per `\u003Chandback_delivery>`.\n\n**A caller added a trailing argument to the return command.** Claude copied a hand-written `run .` command into a delegation. `argparse` rejected the extra positional argument before any send occurred. Generate the command from `completionText`; the adapter renders the final token as `run` and rejects caller-authored executable fields.\n\n**A single read was mistaken for a terminal answer.** Claude treated one empty pane read as evidence the recipient had produced nothing, when it proved only that nothing was on screen at that instant. A read establishes the pane's state at the moment it ran and never establishes that a delegation is incomplete. Completion arrives as the recipient's handback; its absence is an open delegation, not a negative result.\n\n**An overridden socket was read as an empty environment.** Claude pointed the CLI at a non-default socket, saw an inventory with none of the expected panes, and concluded the recipient was gone. The socket belonged to a different instance — a verification harness, not the operator's live application. Confirm the inventory contains the expected panes before concluding a target is absent, per `\u003Cenvironment_traps>`.\n\n**Target resolution was rebuilt around scratch files.** Claude wrote the `agents` result and discovery result through dynamic redirects under `$SP`. The dangerous-command guard blocked the command because the redirect carried a shell variable and the shell would open an unproved path with truncation. Claude then rewrote the same operation as a Python script instead of rerunning its parts with literal strings. Invoke `resolve-target` through the input redirect from its request file and keep its returned JSON as the tool result; an output redirect carrying a shell variable is no part of the workflow. Rewriting the blocked operation as another program is forbidden.\n\n\u003C\u002Ffailure_modes>\n\n\u003Csuccess_criteria>\n\n- A successful public operation is mechanically established only when the bundled script exits zero and emits `schemaVersion: 1`, `status: \"succeeded\"`, `commandExitCode: 0`, and a public `response` object without exposing Prowl command grammar.\n- Every positively identified Prowl participant retains complete public identities verbatim.\n- Every delegation preserves its initiating correlation through exactly one completed, failed, rejected, or unavailable terminal handback.\n- Every delegation carries one source-generated handback block whose command ends exactly at `run` and whose conditions identify checked submission, no retry after submission, the default socket, and both expected panes.\n- A durable handback writes its file before sending, and the notification reaches the sender's pane as a submitted turn rather than editor prefill.\n- One `resolve-target` invocation returns the checked inventory, complete caller and participants, non-caller path matches, and candidate-specific immediate-return send templates without sending.\n- An operator-named target is reported as the supplied worktree or directory, never as a pane UUID the operator must verify.\n- Terminal results carry complete inline content or an exact durable reference with a bounded projection.\n- Unauthorized focus, key, creation, closure, and open requests fail before Prowl runs.\n- Lazy activation is established by an authorized `open` result carrying `resolution: exact-root`, `created_tab: true`, and the complete returned pane identity.\n- No workflow polls, invokes help, or depends on a separate environment-control skill.\n\n\u003C\u002Fsuccess_criteria>\n","\u003Cobjective>\nA versioned JSON Prowl operation result or one correlated terminal delegation handback, with complete public identities and checked command status preserved verbatim.\n\u003C\u002Fobjective>\n\n\u003Coperation_surface>\n\nThe source-owned operation names are:\n\n| Operation    | Arguments                                                                                           | Mutation authorization |\n| ------------ | --------------------------------------------------------------------------------------------------- | ---------------------- |\n| `list`       | none                                                                                                | no                     |\n| `agents`     | none                                                                                                | no                     |\n| `read`       | one selector; optional `last`, `waitStable`, stability bounds                                       | no                     |\n| `send`       | one selector, `text`; optional `noEnter`, `noWait`, `capture`, `timeout` with the constraints below | no                     |\n| `key`        | one selector, `key`; optional `repeat`                                                              | required               |\n| `focus`      | one selector                                                                                        | required               |\n| `tab-create` | optional selector and `path`                                                                        | required               |\n| `tab-close`  | one selector; optional `force`                                                                      | required               |\n| `pane-close` | one selector; optional `force`                                                                      | required               |\n| `open`       | optional `path`                                                                                     | required               |\n\nA selector is exactly one of `target`, `worktree`, `tab`, or `pane`. Preserve its complete public value. For `send`, `capture` cannot combine with `noEnter` or `noWait`, and `timeout` cannot combine with `noWait`. The adapter always requests public JSON and owns every Prowl command token and flag.\n\n\u003C\u002Foperation_surface>\n\n\u003Coperator_target_resolution>\n\nAn operator names a target by where the work lives — an absolute worktree path, repository directory, or working directory. Resolve that path through one `resolve-target` invocation before operating. Write `{\"schemaVersion\":1,\"path\":\"\u003Cabsolute-operator-supplied-path>\"}` to a request file per `\u003Cinvocation_forms>` and submit it:\n\n```bash\npython3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fprowl_environment.py\" resolve-target \u003C \u003Crequest-file>\n```\n\nThe resolver runs the public `agents` operation once and returns its complete checked result under `inventory`, every complete participant under `participants`, the complete caller selected from `PROWL_PANE_ID` or the exact `PROWL_WORKTREE_PATH` fallback, and non-caller path matches under `candidates`. When both caller values exist, both must identify the same participant. Each candidate carries its complete participant metadata and a `sendRequestTemplate` with that pane already selected, `noWait: true`, and `text: null`. Fill `text` with the semantic payload; never repair the JSON through shell substitution.\n\nUse the one candidate directly when `status` is `succeeded`. On `identity-ambiguous` with a complete caller, use `{{! tool('ask_user') !}}` for one single-select question. Number candidates in resolver order; show each candidate's complete pane, worktree, branch, and repository; and map the answer back to that exact captured candidate, including its `sendRequestTemplate`. When the runtime's option cap is below the candidate count, include the complete numbered inventory in the question and accept an exact candidate number through its free-form response; never omit a candidate. On `identity-ambiguous` with `caller: null`, report the exact detail as an unresolved caller-identity conflict and stop; no candidate choice can resolve it. On `identity-unavailable`, report the supplied path and the returned participant worktrees. The resolver performs no send in every result state.\n\nA target that is not a coding-agent pane is outside what `agents` returns, so no path match is available for it. Say that the operator's target is not among the agent panes and name the ones that are, rather than falling back to an inventory that carries no worktree to match.\n\n`resolve-target` resolves active pane targets from `agents`. When the supplied path matches no non-caller participant, return `identity-unavailable` with the complete pane inventory. A sidebar worktree that has never been entered has no pane UUID and cannot receive a message yet; an explicitly authorized `open` request can activate an operator-known path, after which `resolve-target` can run again. The resolver never probes with `open` or claims whether an unmatched path is known to Prowl.\n\nReport the target back to the operator as the supplied path while using the selected template's pane internally. Never ask the operator for a pane UUID or guess by focus, position, or title.\n\n\u003C\u002Foperator_target_resolution>\n\n\u003Cworkflow>\n\n1. Interpret `$ARGUMENTS` as one target resolution, low-level operation, handback plan, delegation request, or terminal handback. When it is empty, require a concrete operation before running the adapter. Resolve an absolute worktree, repository, or working-directory target per `\u003Coperator_target_resolution>` before building its operation request.\n2. For `list`, `agents`, `read`, or `send`, build this source-owned request shape and set only arguments the operation accepts:\n\n```json\n{\n  \"schemaVersion\": 1,\n  \"operation\": \"agents\",\n  \"arguments\": {}\n}\n```\n\n`list` inventories instantiated terminal panes only. A worktree visible in Prowl's sidebar but never entered in the current app process can be absent from `list` because it has no pane UUID yet.\n\n3. For `key`, `focus`, `tab-create`, `tab-close`, `pane-close`, or `open`, require an explicit user instruction authorizing that exact external mutation in the same turn. `open` can visibly switch focus and create a first terminal tab, so it is never read-only. When authorization is absent, use `{{! tool('ask_user') !}}` with the exact operation and complete target identity; do not run the adapter. After authorization, add `\"mutationAuthorized\": true` inside `arguments`. For `open`, set arguments to `{\"mutationAuthorized\":true}` or `{\"path\":\"\u003Ccomplete-source-supplied-path>\",\"mutationAuthorized\":true}`.\n4. Write the request to a request file per `\u003Cinvocation_forms>` and submit it:\n\n```bash\npython3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fprowl_environment.py\" run \u003C \u003Crequest-file>\n```\n\n5. Accept only `status: \"succeeded\"` for a submitted operation. Preserve the complete versioned result, `commandExitCode`, and public `response` values. For `open`, preserve `response.data.resolution`, `created_tab`, and the complete target; `exact-root` with `created_tab: true` is the lazy equivalent of clicking a known sidebar worktree that has no terminal pane. `new-root` means Prowl added a previously unknown root and never proves a prepared recovery target existed. For submitted `send`, require `commandExitCode: 0` and preserve `response.data.input.trailing_enter_sent`; success with that field false or absent does not prove the turn left the editor. Once the checked send reports `trailing_enter_sent: true`, the turn is queued and delivery is complete; never send it again because the entry box becomes free. Stop with the exact `status` and `detail` on `command-failed`, `invalid-schema`, `prowl-unavailable`, `mutation-unauthorized`, or `operation-unavailable`.\n6. For bounded delegation between two identities returned by `agents`, supply semantic completion text and submit this shape to `delegate`:\n\n```json\n{\n  \"sender\": {\n    \"agent\": \"\u003Ccomplete-agent-id>\",\n    \"pane\": \"\u003Ccomplete-pane-id>\",\n    \"worktree\": \"\u003Cabsolute-worktree-path>\",\n    \"branch\": \"\u003Ccomplete-branch>\",\n    \"repository\": \"\u003Cabsolute-repository-root>\",\n    \"run\": \"\u003Ccomplete-run-id-when-present>\"\n  },\n  \"recipient\": {\n    \"agent\": \"\u003Ccomplete-agent-id>\",\n    \"pane\": \"\u003Ccomplete-pane-id>\",\n    \"worktree\": \"\u003Cabsolute-worktree-path>\",\n    \"branch\": \"\u003Ccomplete-branch>\",\n    \"repository\": \"\u003Cabsolute-repository-root>\",\n    \"run\": \"\u003Ccomplete-run-id-when-present>\"\n  },\n  \"subject\": \"\u003Cbounded subject>\",\n  \"instruction\": \"\u003Ccomplete bounded request, with no shell command or return-path fields>\",\n  \"completionText\": \"\u003Cone-line completion signal for the sender>\",\n  \"correlation\": null\n}\n```\n\nThe adapter maps `completionText` and the two identities to a versioned `handback` block. The block contains `completionText`, the absolute `adapterPath`, an exact one-line `command` ending at `run`, checked `successCriteria`, `retryPolicy: \"never-after-trailing-enter\"`, `socket: \"default\"`, and `expectedPanes` in sender-recipient order. A caller never supplies `handback`, `command`, `handbackCommand`, `returnPane`, or `adapterPath`.\n\nThe result carries the complete source-owned schema-version-2 `delegation` envelope and generated handback block. Preserve it for the terminal handback; transport success is not acceptance or completion.\n\nA direct delegation submission writes that object to a request file per `\u003Cinvocation_forms>` and submits it:\n\n```bash\npython3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fprowl_environment.py\" delegate \u003C \u003Crequest-file>\n```\n\nTo generate the block without sending a delegation, write exactly `sender`, `recipient`, and `completionText` to a request file, submit it to `plan-handback`, and preserve the returned `handback` object unchanged:\n\n```bash\npython3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fprowl_environment.py\" plan-handback \u003C \u003Crequest-file>\n```\n\n7. The recipient writes any durable result first, executes the generated `handback.command` exactly, and submits exactly one terminal result to `handback`, carrying the complete original `delegation`, one `kind`, and one supported result form:\n\n- `delegation-completed`\n- `delegation-failed`\n- `delegation-rejected`\n- `delegation-unavailable`\n\nA complete inline result uses `inlineResult`. A durable result uses a scheme-bearing `resultReference` plus a bounded `projection`; use `file:\u002F\u002F\u002Fabsolute\u002Fpath` for a local file. Both forms may appear together. The adapter rejects a missing result, a reference without a URI scheme or projection, and a conflicting terminal handback.\n\nThe `handback` request file holds `{\"delegation\":\u003Ccomplete-returned-delegation>,\"kind\":\"delegation-completed\",\"inlineResult\":\"\u003Ccomplete-result>\"}`. Replace the angle-bracket value with the returned delegation object itself, never a quoted summary or reconstructed envelope.\n\n8. Return the complete terminal result to the delegating workflow. Do not poll the recipient, add acceptance or progress phases, or infer completion from pane output.\n\n\u003C\u002Fworkflow>\n\n\u003Cinvocation_forms>\n\nEvery subcommand (`run`, `resolve-target`, `delegate`, `plan-handback`, `handback`) takes its JSON request from stdin. 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 `\u003C \u003Crequest-file>` shown with each command. Where the harness names no scratch directory, use the one the environment designates, such as `$RUNNER_TEMP` on a hosted runner. A request carries prompt text, quotes, and JSON that the dangerous-command guard refuses in a heredoc, a pipe, or an inline argument.\n\n\u003C\u002Finvocation_forms>\n\n\u003Chandback_delivery>\n\nCompletion travels by push, never by pull. The sender's environment blocks polling loops by design, so a sender that \"checks later\" has no later to check in — it reads once, sees nothing, and moves on while the finished result sits on disk. The recipient closes the loop or nobody does.\n\n**A durable result separates payload from signal.** The file carries the payload; one line sent into the sender's pane carries the signal. Write the file first, then send. `resultReference` names the complete scheme-bearing reference — `file:\u002F\u002F\u002Fabsolute\u002Fpath` for a local file — and `projection` carries the bounded summary, so the sender knows what arrived without opening it.\n\n**The recipient delivers the handback by sending one line into the return address's pane**, using the `send` operation with normal trailing-Enter behavior. That send lands as a turn in the sender's session, which is what makes it a signal rather than a message the sender must go looking for. A `noEnter` send prefills the sender's editor and signals nothing.\n\n**The adapter generates the handback at delegation time.** The caller supplies only semantic completion text. The generated block binds that text to `sender.pane`, the bundled adapter path, checked submission criteria, the default socket, both expected panes, and the no-retry policy. This separation prevents a caller from changing CLI grammar while describing the requested work.\n\n\u003C\u002Fhandback_delivery>\n\n\u003Cenvironment_traps>\n\nTwo environment conditions silently break a handback. The generated block names both instead of leaving the recipient to discover them.\n\n**The CLI may not be on `PATH`.** Every Prowl command runs the bare `prowl` name, so a shell that cannot resolve it returns `prowl-unavailable` with its detail. That result means the CLI is missing from the environment, not that the recipient is absent; report the detail and stop.\n\n**A non-default socket may belong to a different instance.** When the socket is overridden, the CLI talks to whichever instance owns that socket — which can be another agent's verification harness holding no real panes rather than the operator's live application. An empty or unrecognizable pane inventory is that condition, not an absent recipient. Confirm the inventory contains the expected panes before concluding a target is gone, and use the same socket value for every command in the exchange.\n\n\u003C\u002Fenvironment_traps>\n\n\u003Cconstraints>\n\n- ALWAYS preserve complete source-supplied agent, pane, worktree, branch, repository, run, correlation, status, conclusion, exit-code, and result-reference values.\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 generate executable handback data from semantic completion text through `delegate` or `plan-handback`.\n- NEVER accept caller-authored `handback`, `command`, `handbackCommand`, `returnPane`, or `adapterPath` fields.\n- NEVER pass a request through a heredoc, a pipe, or an inline argument, and NEVER remove the request file; the harness clears its scratch directory.\n- NEVER invoke raw Prowl commands, Prowl command help, or an external environment-control skill.\n- NEVER mutate focus, keys, tabs, panes, or open-path selection without explicit authorization for the exact operation and target in the same turn.\n- NEVER equate `list` with the sidebar worktree inventory or enumerate filesystem worktrees to compensate for an uninstantiated pane.\n- NEVER scan transcripts, parse terminal presentation as identity, or poll for delegation completion.\n- NEVER make retry, checkpoint, persistence, result-interpretation, or continuation decisions for another workflow.\n\n\u003C\u002Fconstraints>\n\n\u003Ctesting>\n\nBefore release, import the bundled module with controlled `CommandRunner` implementations under the interaction-protocol and failure-simulation exceptions. Run the documented `run` form with an `agents` payload and require `status: \"succeeded\"`, `commandExitCode: 0`, and a public response; run `resolve-target` with pane-only, worktree-only, and combined caller evidence and require one inventory call, caller exclusion, and zero sends; fill one returned send template and require `response.data.input.trailing_enter_sent: true`; run `plan-handback`, `delegate`, and `handback` with the documented shapes and require the command to end exactly at `run`, the initiating correlation to survive, and every caller-authored executable handback field to fail. Cover every operation mapping, public JSON failure, mutation rejection before command construction, URI-bearing delegation result forms, repeated terminals, conflicting terminals, malformed input, missing Prowl, and CLI stdin dispatch.\n\nRecorded exercised payload\u002Fresults:\n\n- `{\"schemaVersion\":1,\"operation\":\"agents\",\"arguments\":{}}` with a successful public agents response → `status: \"succeeded\"`, `commandExitCode: 0`, and the response preserved.\n- `resolve-target` with an active non-caller worktree path → one candidate and no send; an unmatched absolute path → `identity-unavailable`, an empty candidate array, and no `open` probe.\n- A filled returned send template with `trailing_enter_sent: true` in the public response → one `succeeded` send result; the same submission evidence then supports one delivered message envelope.\n\n\u003C\u002Ftesting>\n\n\u003Cfailure_modes>\n\n**A selectorless tab creation was rejected.** Claude applied the shared selector requirement to `tab-create`, even though the public operation accepts both selectorless and selected forms. The shared request builder hid the operation-specific shape. Build `tab-create` from its declared optional-selector contract and preserve optional `path` independently.\n\n**An advertised operation had no construction branch.** Claude listed `open` in the public surface but grouped only list, agents, read, and send into the non-mutating workflow. Claude then had to infer the request shape. Keep every advertised operation in an explicit construction branch; `open` accepts empty arguments or one source-supplied `path`, always with explicit mutation authorization.\n\n**A visible worktree was absent from `list`.** Claude inferred missing Prowl topology because a sidebar row had no listed pane. The row was known but not entered; `open` returned `resolution: exact-root`, `created_tab: true`, and the first pane UUID. Treat `list` as the terminal inventory and use authorized `open` for visible lazy activation.\n\n**A delegation had no return path, so the operator became the message bus.** Claude asked a recipient to write a file, then had no signal that it had. Polling loops are blocked in the environment, so Claude read the pane once, saw nothing, and moved on while a complete result sat on disk. Generate the structured handback from the sender, recipient, and completion text, then require the recipient to send one line on completion per `\u003Chandback_delivery>`.\n\n**A caller added a trailing argument to the return command.** Claude copied a hand-written `run .` command into a delegation. `argparse` rejected the extra positional argument before any send occurred. Generate the command from `completionText`; the adapter renders the final token as `run` and rejects caller-authored executable fields.\n\n**A single read was mistaken for a terminal answer.** Claude treated one empty pane read as evidence the recipient had produced nothing, when it proved only that nothing was on screen at that instant. A read establishes the pane's state at the moment it ran and never establishes that a delegation is incomplete. Completion arrives as the recipient's handback; its absence is an open delegation, not a negative result.\n\n**An overridden socket was read as an empty environment.** Claude pointed the CLI at a non-default socket, saw an inventory with none of the expected panes, and concluded the recipient was gone. The socket belonged to a different instance — a verification harness, not the operator's live application. Confirm the inventory contains the expected panes before concluding a target is absent, per `\u003Cenvironment_traps>`.\n\n**Target resolution was rebuilt around scratch files.** Claude wrote the `agents` result and discovery result through dynamic redirects under `$SP`. The dangerous-command guard blocked the command because the redirect carried a shell variable and the shell would open an unproved path with truncation. Claude then rewrote the same operation as a Python script instead of rerunning its parts with literal strings. Invoke `resolve-target` through the input redirect from its request file and keep its returned JSON as the tool result; an output redirect carrying a shell variable is no part of the workflow. Rewriting the blocked operation as another program is forbidden.\n\n\u003C\u002Ffailure_modes>\n\n\u003Csuccess_criteria>\n\n- A successful public operation is mechanically established only when the bundled script exits zero and emits `schemaVersion: 1`, `status: \"succeeded\"`, `commandExitCode: 0`, and a public `response` object without exposing Prowl command grammar.\n- Every positively identified Prowl participant retains complete public identities verbatim.\n- Every delegation preserves its initiating correlation through exactly one completed, failed, rejected, or unavailable terminal handback.\n- Every delegation carries one source-generated handback block whose command ends exactly at `run` and whose conditions identify checked submission, no retry after submission, the default socket, and both expected panes.\n- A durable handback writes its file before sending, and the notification reaches the sender's pane as a submitted turn rather than editor prefill.\n- One `resolve-target` invocation returns the checked inventory, complete caller and participants, non-caller path matches, and candidate-specific immediate-return send templates without sending.\n- An operator-named target is reported as the supplied worktree or directory, never as a pane UUID the operator must verify.\n- Terminal results carry complete inline content or an exact durable reference with a bounded projection.\n- Unauthorized focus, key, creation, closure, and open requests fail before Prowl runs.\n- Lazy activation is established by an authorized `open` result carrying `resolution: exact-root`, `created_tab: true`, and the complete returned pane identity.\n- No workflow polls, invokes help, or depends on a separate environment-control skill.\n\n\u003C\u002Fsuccess_criteria>\n",{"name":5,"description":7,"allowed-tools":49,"argument-hint":50},"Write, Bash(python3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fprowl_environment.py\":*), {{! tool('ask_user') !}}","\u003Coperation, delegation, or JSON request>","main","f1f479d9550ca2349a637d3ad24fb421d15046ac","src\u002Fplugins\u002Fcoding-agents\u002Fskills\u002Foperate-prowl","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins","https:\u002F\u002Fgithub.com\u002Foutcomeeng","https:\u002F\u002Foutcome.engineering","Spec-driven development for AI-assisted engineering","2026-11-11 22:17:26",{"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-prowl",{"tool":65,"command":66},"bunx","bunx skills add outcomeeng\u002Fplugins --skill operate-prowl",{"tool":68,"command":69},"pnpm","pnpm dlx skills add outcomeeng\u002Fplugins --skill operate-prowl","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fcoding-agents\u002Fskills\u002Foperate-prowl\u002FSKILL.md",true,[73],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"scripts\u002Fprowl_environment.py","SCRIPT","脚本",60984,"https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fcoding-agents\u002Fskills\u002Foperate-prowl\u002Fscripts\u002Fprowl_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,42,108,109,110,111,112,113,114,115,116,117,37,36],"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,42,37,130,131,36,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"]