[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7AJSHSHNQSFRJQTHKAH2WMF":3,"skill-same:01M7AJSHSHNQSFRJQTHKAH2WMF":48},{"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":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":29,"ownerHtmlUrl":30,"ownerBlogUrl":31,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M7AJSHSHNQSFRJQTHKAH2WMF","claudeloop-agent-sdk",null,"Explains how claudeloop integrates with claude-agent-sdk (ClaudeAgentOptions, ClaudeSDKClient vs query(), RateLimitEvent, ResultMessage, AssistantMessage, session discovery via list_sessions()) and the never-block-on-a-human design (permission_mode, can_use_tool, AskUserQuestion handling, hooks). Use this whenever building or modifying src\u002Fclaudeloop\u002Finfrastructure\u002Fagent\u002F (the M2+ agent gateway, options builder, message translation, session catalog, capacity probe), whenever the user asks about the Claude Agent SDK, ClaudeAgentOptions fields, session resumption, rate-limit events, or why a run might block on a human. Make sure to consult this before writing any code that calls claude_agent_sdk directly — infrastructure\u002Fagent\u002F is the ONLY place that import is allowed, per the onion architecture (see the claudeloop-architecture skill), and getting the never-block guarantees wrong here defeats the entire purpose of this project.","the-vibey-project\u002Fvibey","the-vibey-project","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F329298758?v=4","01M7AJHGZ9722CTJ4JNQZVRH0Q","the vibey project","01M7AJHGZVMG2K7TGXQ6XFHVG3",5,"MIT","https:\u002F\u002Fgithub.com\u002Fthe-vibey-project\u002Fvibey\u002Fblob\u002Fdevelop\u002Fsrc\u002Fvibey_runners\u002Fclaude\u002F.agents\u002Fskills\u002Fclaudeloop-agent-sdk\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: claudeloop-agent-sdk\ndescription: Explains how claudeloop integrates with claude-agent-sdk (ClaudeAgentOptions, ClaudeSDKClient vs query(), RateLimitEvent, ResultMessage, AssistantMessage, session discovery via list_sessions()) and the never-block-on-a-human design (permission_mode, can_use_tool, AskUserQuestion handling, hooks). Use this whenever building or modifying src\u002Fclaudeloop\u002Finfrastructure\u002Fagent\u002F (the M2+ agent gateway, options builder, message translation, session catalog, capacity probe), whenever the user asks about the Claude Agent SDK, ClaudeAgentOptions fields, session resumption, rate-limit events, or why a run might block on a human. Make sure to consult this before writing any code that calls claude_agent_sdk directly — infrastructure\u002Fagent\u002F is the ONLY place that import is allowed, per the onion architecture (see the claudeloop-architecture skill), and getting the never-block guarantees wrong here defeats the entire purpose of this project.\n---\n\n# claudeloop + claude-agent-sdk integration\n\n\n> **Codex skill mirror** of `.claude\u002Fskills\u002Fclaudeloop-agent-sdk\u002FSKILL.md`. When this guidance changes, update Claude skill, Cursor rule, and `.agents\u002Fskills\u002F` in the same PR.\n\n`infrastructure\u002Fagent\u002F` is the only place `claude_agent_sdk`\nmay be imported — see the `claudeloop-architecture` skill for the enforced\nonion rule. This skill covers the SDK integration specifics; consult\n`claudeloop-domain-model` for how the resulting signals get classified.\n\n## `ClaudeSDKClient` over `query()` — this is not optional\n\n`query()` (single-shot) raises a **plain `Exception`** after yielding an\nerror `ResultMessage`, and the underlying process exits non-zero. A\nstreaming-input `ClaudeSDKClient` **stays alive** across error results — you\ncan keep sending messages on one live process with no resume\u002Frespawn. The\n`AgentGateway` adapter (infrastructure\u002Fagent\u002Fgateway.py::ClaudeAgentGateway) MUST use `ClaudeSDKClient`, not `query()`, or\nthe whole point of collapsing the legacy respawn loop is lost. See ADR 0002\nfor the full reasoning.\n\n## Key `ClaudeAgentOptions` fields for this project\n\n- **`permission_mode=\"bypassPermissions\"`** — required for autonomy. Note:\n  the Python SDK has **no `dangerously_skip_permissions` field**; this is\n  its equivalent. Do not go looking for a field that doesn't exist.\n- **`can_use_tool`** — a defensive callback that must NEVER await input.\n  Intercepts `AskUserQuestion` specifically and **denies with guidance**\n  (not auto-answers) — see the \"Never blocking\" section below.\n- **`output_format`** — a JSON schema\n  (`{complete: bool, remaining_work: [str], blocked_on: str|null, summary:\n  str}`) so each turn returns a `ResultMessage.structured_output` the\n  domain layer's `completion.py` can evaluate directly, rather than\n  substring-matching output text. Property descriptions (and the autonomy\n  system-prompt fragment) insist `blocked_on` is only for true\n  external\u002Fhuman blockers — waitable self-started work goes in\n  `remaining_work` with `blocked_on: null`, because any non-null value\n  terminates the run as `Blocked`.\n- **`resume` \u002F `continue_conversation` \u002F `fork_session` \u002F `session_id`** —\n  `session_id` cannot combine with `resume`\u002F`continue_conversation` unless\n  `fork_session=True` is also set. Get this wrong and session resumption\n  breaks in a way that's easy to miss in a quick test. When building\n  options, drop `session_id` whenever `resume` or `continue_conversation`\n  is set (see `build_turn_options`).\n- **`setting_sources=None`** for the throwaway capacity probe specifically\n  — no `CLAUDE.md` should load for a one-token \"are we still limited\"\n  check.\n- **`hooks`** — `PermissionRequest` auto-allows; `Notification` logs only,\n  never blocks.\n\n## Never blocking on a human — every mitigation, concretely\n\n| Stall path | Mitigation |\n|---|---|\n| Permission prompts | `permission_mode=\"bypassPermissions\"` |\n| Unexpected permission path | Defensive `can_use_tool` returning `PermissionResultAllow` without ever awaiting input |\n| `AskUserQuestion` | Intercepted, **denied with guidance** — e.g. \"running autonomously, no user available — choose the option you would recommend, note the assumption, and proceed.\" NEVER fabricate an answer; that silently invents a decision nobody made. |\n| `ExitPlanMode` | Auto-approved |\n| `Notification` hooks | Logged, never awaited |\n| Model asks \"Shall I proceed?\" in plain text | No tool call to intercept — mitigated via an appended system-prompt fragment establishing autonomous operation |\n| TTY-dependent stdin | Never inherit a TTY — must be safe under `nohup`\u002Fsystemd |\n| MCP OAuth | Genuinely cannot complete unattended — the `doctor` command checks configured MCP servers up front and fails fast, naming them, rather than discovering the problem mid-run |\n\nIf you're adding a new tool-interception path, apply the same test every\ntime: **can this ever wait on stdin or a human response?** If yes, it needs\nan explicit mitigation in this table before it ships.\n\n## Rate-limit signals — read three, trust none alone\n\n`RateLimitEvent.rate_limit_info`: `status` (`allowed`\u002F`allowed_warning`\u002F\n`rejected`), `resets_at`, `rate_limit_type`\n(`five_hour`\u002F`seven_day`\u002F`seven_day_opus`\u002F`seven_day_sonnet`\u002F`overage`),\n`utilization`, `overage_status`, `overage_resets_at`,\n`overage_disabled_reason`. The Claude Code binary contains the string\n`[sdkMessageAdapter] Ignoring rate_limit_event message` — treat this event\nas possibly absent and always corroborate with `ResultMessage\n.api_error_status` and `AssistantMessage.error` (see the\n`claudeloop-domain-model` skill's `TurnSignals` section for exactly how\nthese three combine).\n\n## Session discovery — use the supported API\n\n`list_sessions()` \u002F `get_session_info()` return `SDKSessionInfo` (session_id,\nsummary, last_modified, custom_title, first_prompt, git_branch, cwd, tag,\ncreated_at) via cheap stat + head\u002Ftail reads. **Never** hand-parse\n`~\u002F.claude\u002Fprojects\u002F\u003Cencoded-cwd>\u002F*.jsonl` directly — the docs explicitly\nwarn the transcript format changes between Claude Code releases, and this\nAPI exists specifically to replace that fragile approach from the legacy\nscript.\n\n## The capacity probe — deliberately minimal\n\nThe throwaway turn used while `WAITING` (see `claudeloop-domain-model`):\none-token prompt, `max_turns=1`, no tools, `setting_sources=None`, and\n`extra_args={\"no-session-persistence\": None}` so it leaves no transcript\nand doesn't pollute the working session's history with \"OK\" turns. A\nrejected probe isn't billed by the API.\n\n## Backend profiles — the env overlay reaches the turn AND the probe\n\nA `[profiles.\u003Cname>]` table (`--profile` \u002F `CLAUDELOOP_PROFILE`) picks the\nendpoint Claude Code talks to. The decisions live in `domain\u002Fbackend.py`\n(`BackendProfile`, `BackendRuntime`, `BackendIdentity`); `infrastructure\u002Fbackend.py`\nreads the TOML and the environment; `bootstrap.py` hands the resolved\n`BackendRuntime` to both `ClaudeAgentGateway` and `ClaudeCapacityProbe`.\n\n- **The SDK merges `options.env` over `os.environ`**, so the overlay wins. That\n  is the only way to *remove* an inherited value: a local profile sets\n  `ANTHROPIC_API_KEY=\"\"` so a paid key never reaches a local server. Never\n  \"just not set\" a key you mean to scrub.\n- **`build_turn_options` and `build_probe_options` both take `env=` and\n  `cli_path=`.** A probe built without the overlay re-checks capacity on\n  Anthropic while the run talks to Ollama — the defect this fixed.\n- **Local (`base_url` set) implies:** every tier named and no `claude-*` id;\n  Claude Code's haiku\u002Fsonnet\u002Fopus aliases mapped onto the tiers; `--effort`\n  not forwarded (`pass_effort`); `--max-budget-usd` not forwarded and\n  `TurnAccumulator(cost_mode=\"zero\")` records $0 — Claude Code prices an\n  unrecognised model at its default model's rate (observed: $0.0008365 for one\n  free qwen2.5-coder:1.5b turn) — while `ResultMessage.usage` token counts are\n  kept; `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1`; web search \u002F deep research\n  refused.\n- **Errors a local backend produces** (captured from the bundled CLI against\n  Ollama 0.34.2) — `AssistantMessage.error` \u002F `ResultMessage.api_error_status`:\n  model not pulled → `\"model_not_found\"` \u002F 404; server down → `\"server_error\"` \u002F\n  `None` with \"Connection refused … (ConnectionRefused)\"; model failed to load →\n  `\"server_error\"` \u002F 500; queue full → `\"server_error\"` \u002F 503; conversation over\n  `context_window` → `\"invalid_request\"` \u002F `None`, \"Prompt is too long\" (Claude\n  Code reserves `max_output_tokens` out of the window). `TurnAccumulator`\n  passes `local_backend=True` into `TurnSignals` so `classify` can read them\n  (see `claudeloop-domain-model`). Claude Code retries a refused connection up\n  to `CLAUDE_CODE_MAX_RETRIES` times first — about three minutes at the\n  default before claudeloop sees it; `extra_env` can lower it.\n- **A model that writes tool calls as text does nothing — and can fake Done.**\n  Observed live: qwen2.5-coder:14b on Ollama answers even a one-tool request\n  with `{\"name\": ..., \"arguments\": ...}` as a *text* block; inside Claude Code it\n  wrote its Write call and its StructuredOutput call as text, appended the done\n  marker, and the run reported Done for a file it never created. Hence a local\n  profile's `done_marker_fallback = false` (only a structured verdict completes\n  a run; `AutonomousRunner(done_marker_fallback=...)` →\n  `evaluate(marker_fallback=...)`) and `doctor`'s `backend-tools` check, which\n  POSTs one trivial tool to `\u002Fv1\u002Fmessages` per tier and wants a `tool_use` block.\n- **`AssistantMessageError` in the SDK types does not list `model_not_found`;**\n  the CLI sends it anyway. Compare strings, not the Literal.\n- **Resume never crosses backends:** run meta records `backend`\n  (`anthropic` | `gateway:\u003Curl>` | `local:\u003Curl>`) and `profile`;\n  `bootstrap.check_resume_backend` refuses a mismatch.\n\n## `CLAUDE_CODE_RETRY_WATCHDOG` — deliberately off by default\n\nDo not set this env var in the default agent gateway configuration. It\nretries 429\u002F529 in-process indefinitely with no progress reporting, no\ncredits-vs-window discrimination, and no `--max-wait`. It's exposed as an\nexplicit opt-in flag (`--retry-watchdog`), never the default. See ADR 0005\nfor the full reasoning if you're tempted to \"simplify\" by using it instead\nof the probe-based waiting policy.\n\n## Full reference\n\n`docs\u002Farchitecture\u002Fdecisions\u002F0002-agent-sdk-over-subprocess.md`,\n`docs\u002Farchitecture\u002Fdecisions\u002F0005-retry-watchdog-off-by-default.md`,\n`docs\u002Farchitecture\u002Fdecisions\u002F0007-ask-user-question-denied-with-guidance.md`,\n`docs\u002Fguides\u002Fnever-blocking.md`, `docs\u002Fguides\u002Frate-limits-and-credits.md`,\n`docs\u002Fguides\u002Flocal-backend.md`.\n","# claudeloop + claude-agent-sdk integration\n\n\n> **Codex skill mirror** of `.claude\u002Fskills\u002Fclaudeloop-agent-sdk\u002FSKILL.md`. When this guidance changes, update Claude skill, Cursor rule, and `.agents\u002Fskills\u002F` in the same PR.\n\n`infrastructure\u002Fagent\u002F` is the only place `claude_agent_sdk`\nmay be imported — see the `claudeloop-architecture` skill for the enforced\nonion rule. This skill covers the SDK integration specifics; consult\n`claudeloop-domain-model` for how the resulting signals get classified.\n\n## `ClaudeSDKClient` over `query()` — this is not optional\n\n`query()` (single-shot) raises a **plain `Exception`** after yielding an\nerror `ResultMessage`, and the underlying process exits non-zero. A\nstreaming-input `ClaudeSDKClient` **stays alive** across error results — you\ncan keep sending messages on one live process with no resume\u002Frespawn. The\n`AgentGateway` adapter (infrastructure\u002Fagent\u002Fgateway.py::ClaudeAgentGateway) MUST use `ClaudeSDKClient`, not `query()`, or\nthe whole point of collapsing the legacy respawn loop is lost. See ADR 0002\nfor the full reasoning.\n\n## Key `ClaudeAgentOptions` fields for this project\n\n- **`permission_mode=\"bypassPermissions\"`** — required for autonomy. Note:\n  the Python SDK has **no `dangerously_skip_permissions` field**; this is\n  its equivalent. Do not go looking for a field that doesn't exist.\n- **`can_use_tool`** — a defensive callback that must NEVER await input.\n  Intercepts `AskUserQuestion` specifically and **denies with guidance**\n  (not auto-answers) — see the \"Never blocking\" section below.\n- **`output_format`** — a JSON schema\n  (`{complete: bool, remaining_work: [str], blocked_on: str|null, summary:\n  str}`) so each turn returns a `ResultMessage.structured_output` the\n  domain layer's `completion.py` can evaluate directly, rather than\n  substring-matching output text. Property descriptions (and the autonomy\n  system-prompt fragment) insist `blocked_on` is only for true\n  external\u002Fhuman blockers — waitable self-started work goes in\n  `remaining_work` with `blocked_on: null`, because any non-null value\n  terminates the run as `Blocked`.\n- **`resume` \u002F `continue_conversation` \u002F `fork_session` \u002F `session_id`** —\n  `session_id` cannot combine with `resume`\u002F`continue_conversation` unless\n  `fork_session=True` is also set. Get this wrong and session resumption\n  breaks in a way that's easy to miss in a quick test. When building\n  options, drop `session_id` whenever `resume` or `continue_conversation`\n  is set (see `build_turn_options`).\n- **`setting_sources=None`** for the throwaway capacity probe specifically\n  — no `CLAUDE.md` should load for a one-token \"are we still limited\"\n  check.\n- **`hooks`** — `PermissionRequest` auto-allows; `Notification` logs only,\n  never blocks.\n\n## Never blocking on a human — every mitigation, concretely\n\n| Stall path | Mitigation |\n|---|---|\n| Permission prompts | `permission_mode=\"bypassPermissions\"` |\n| Unexpected permission path | Defensive `can_use_tool` returning `PermissionResultAllow` without ever awaiting input |\n| `AskUserQuestion` | Intercepted, **denied with guidance** — e.g. \"running autonomously, no user available — choose the option you would recommend, note the assumption, and proceed.\" NEVER fabricate an answer; that silently invents a decision nobody made. |\n| `ExitPlanMode` | Auto-approved |\n| `Notification` hooks | Logged, never awaited |\n| Model asks \"Shall I proceed?\" in plain text | No tool call to intercept — mitigated via an appended system-prompt fragment establishing autonomous operation |\n| TTY-dependent stdin | Never inherit a TTY — must be safe under `nohup`\u002Fsystemd |\n| MCP OAuth | Genuinely cannot complete unattended — the `doctor` command checks configured MCP servers up front and fails fast, naming them, rather than discovering the problem mid-run |\n\nIf you're adding a new tool-interception path, apply the same test every\ntime: **can this ever wait on stdin or a human response?** If yes, it needs\nan explicit mitigation in this table before it ships.\n\n## Rate-limit signals — read three, trust none alone\n\n`RateLimitEvent.rate_limit_info`: `status` (`allowed`\u002F`allowed_warning`\u002F\n`rejected`), `resets_at`, `rate_limit_type`\n(`five_hour`\u002F`seven_day`\u002F`seven_day_opus`\u002F`seven_day_sonnet`\u002F`overage`),\n`utilization`, `overage_status`, `overage_resets_at`,\n`overage_disabled_reason`. The Claude Code binary contains the string\n`[sdkMessageAdapter] Ignoring rate_limit_event message` — treat this event\nas possibly absent and always corroborate with `ResultMessage\n.api_error_status` and `AssistantMessage.error` (see the\n`claudeloop-domain-model` skill's `TurnSignals` section for exactly how\nthese three combine).\n\n## Session discovery — use the supported API\n\n`list_sessions()` \u002F `get_session_info()` return `SDKSessionInfo` (session_id,\nsummary, last_modified, custom_title, first_prompt, git_branch, cwd, tag,\ncreated_at) via cheap stat + head\u002Ftail reads. **Never** hand-parse\n`~\u002F.claude\u002Fprojects\u002F\u003Cencoded-cwd>\u002F*.jsonl` directly — the docs explicitly\nwarn the transcript format changes between Claude Code releases, and this\nAPI exists specifically to replace that fragile approach from the legacy\nscript.\n\n## The capacity probe — deliberately minimal\n\nThe throwaway turn used while `WAITING` (see `claudeloop-domain-model`):\none-token prompt, `max_turns=1`, no tools, `setting_sources=None`, and\n`extra_args={\"no-session-persistence\": None}` so it leaves no transcript\nand doesn't pollute the working session's history with \"OK\" turns. A\nrejected probe isn't billed by the API.\n\n## Backend profiles — the env overlay reaches the turn AND the probe\n\nA `[profiles.\u003Cname>]` table (`--profile` \u002F `CLAUDELOOP_PROFILE`) picks the\nendpoint Claude Code talks to. The decisions live in `domain\u002Fbackend.py`\n(`BackendProfile`, `BackendRuntime`, `BackendIdentity`); `infrastructure\u002Fbackend.py`\nreads the TOML and the environment; `bootstrap.py` hands the resolved\n`BackendRuntime` to both `ClaudeAgentGateway` and `ClaudeCapacityProbe`.\n\n- **The SDK merges `options.env` over `os.environ`**, so the overlay wins. That\n  is the only way to *remove* an inherited value: a local profile sets\n  `ANTHROPIC_API_KEY=\"\"` so a paid key never reaches a local server. Never\n  \"just not set\" a key you mean to scrub.\n- **`build_turn_options` and `build_probe_options` both take `env=` and\n  `cli_path=`.** A probe built without the overlay re-checks capacity on\n  Anthropic while the run talks to Ollama — the defect this fixed.\n- **Local (`base_url` set) implies:** every tier named and no `claude-*` id;\n  Claude Code's haiku\u002Fsonnet\u002Fopus aliases mapped onto the tiers; `--effort`\n  not forwarded (`pass_effort`); `--max-budget-usd` not forwarded and\n  `TurnAccumulator(cost_mode=\"zero\")` records $0 — Claude Code prices an\n  unrecognised model at its default model's rate (observed: $0.0008365 for one\n  free qwen2.5-coder:1.5b turn) — while `ResultMessage.usage` token counts are\n  kept; `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1`; web search \u002F deep research\n  refused.\n- **Errors a local backend produces** (captured from the bundled CLI against\n  Ollama 0.34.2) — `AssistantMessage.error` \u002F `ResultMessage.api_error_status`:\n  model not pulled → `\"model_not_found\"` \u002F 404; server down → `\"server_error\"` \u002F\n  `None` with \"Connection refused … (ConnectionRefused)\"; model failed to load →\n  `\"server_error\"` \u002F 500; queue full → `\"server_error\"` \u002F 503; conversation over\n  `context_window` → `\"invalid_request\"` \u002F `None`, \"Prompt is too long\" (Claude\n  Code reserves `max_output_tokens` out of the window). `TurnAccumulator`\n  passes `local_backend=True` into `TurnSignals` so `classify` can read them\n  (see `claudeloop-domain-model`). Claude Code retries a refused connection up\n  to `CLAUDE_CODE_MAX_RETRIES` times first — about three minutes at the\n  default before claudeloop sees it; `extra_env` can lower it.\n- **A model that writes tool calls as text does nothing — and can fake Done.**\n  Observed live: qwen2.5-coder:14b on Ollama answers even a one-tool request\n  with `{\"name\": ..., \"arguments\": ...}` as a *text* block; inside Claude Code it\n  wrote its Write call and its StructuredOutput call as text, appended the done\n  marker, and the run reported Done for a file it never created. Hence a local\n  profile's `done_marker_fallback = false` (only a structured verdict completes\n  a run; `AutonomousRunner(done_marker_fallback=...)` →\n  `evaluate(marker_fallback=...)`) and `doctor`'s `backend-tools` check, which\n  POSTs one trivial tool to `\u002Fv1\u002Fmessages` per tier and wants a `tool_use` block.\n- **`AssistantMessageError` in the SDK types does not list `model_not_found`;**\n  the CLI sends it anyway. Compare strings, not the Literal.\n- **Resume never crosses backends:** run meta records `backend`\n  (`anthropic` | `gateway:\u003Curl>` | `local:\u003Curl>`) and `profile`;\n  `bootstrap.check_resume_backend` refuses a mismatch.\n\n## `CLAUDE_CODE_RETRY_WATCHDOG` — deliberately off by default\n\nDo not set this env var in the default agent gateway configuration. It\nretries 429\u002F529 in-process indefinitely with no progress reporting, no\ncredits-vs-window discrimination, and no `--max-wait`. It's exposed as an\nexplicit opt-in flag (`--retry-watchdog`), never the default. See ADR 0005\nfor the full reasoning if you're tempted to \"simplify\" by using it instead\nof the probe-based waiting policy.\n\n## Full reference\n\n`docs\u002Farchitecture\u002Fdecisions\u002F0002-agent-sdk-over-subprocess.md`,\n`docs\u002Farchitecture\u002Fdecisions\u002F0005-retry-watchdog-off-by-default.md`,\n`docs\u002Farchitecture\u002Fdecisions\u002F0007-ask-user-question-denied-with-guidance.md`,\n`docs\u002Fguides\u002Fnever-blocking.md`, `docs\u002Fguides\u002Frate-limits-and-credits.md`,\n`docs\u002Fguides\u002Flocal-backend.md`.\n",{"name":5,"description":7},"develop","ae32736a1aabddabca5d2c96d665aa0ebc7d8700","src\u002Fvibey_runners\u002Fclaude\u002F.agents\u002Fskills\u002Fclaudeloop-agent-sdk",3,"https:\u002F\u002Fgithub.com\u002Fthe-vibey-project\u002Fvibey","https:\u002F\u002Fthe-vibey-project.github.io\u002Fvibey\u002F","https:\u002F\u002Fgithub.com\u002Fthe-vibey-project","https:\u002F\u002Fvibewithadam.matthewsteinberger.com","freedom for software engineers","2026-11-15 05:47:42",{"source":8,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add the-vibey-project\u002Fvibey --skill claudeloop-agent-sdk",{"tool":40,"command":41},"bunx","bunx skills add the-vibey-project\u002Fvibey --skill claudeloop-agent-sdk",{"tool":43,"command":44},"pnpm","pnpm dlx skills add the-vibey-project\u002Fvibey --skill claudeloop-agent-sdk","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fthe-vibey-project\u002Fvibey\u002Fblob\u002Fdevelop\u002Fsrc\u002Fvibey_runners\u002Fclaude\u002F.agents\u002Fskills\u002Fclaudeloop-agent-sdk\u002FSKILL.md",true,[],[49,56,63,70,77,84],{"skillNo":50,"name":51,"nameZh":6,"description":52,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":55,"publishedAt":19},"01M7AT1FQJAE1FQYAMDTF490Y4","white-paper-writing","Use when writing white papers, technical reports, policy documents, thought leadership pieces, or any long-form authoritative document. Triggers on requests to write, structure, outline, or review white papers, technical reports, position papers, policy briefs, or evidence-driven arguments. Also use for B2B content marketing strategy, technical documentation requiring authority, academic-style reports, or any document that must educate while persuading. Use when someone asks \"how should I structure this\" for a long-form document.","https:\u002F\u002Fgithub.com\u002Fthe-vibey-project\u002Fvibey\u002Fblob\u002Fdevelop\u002Fsrc\u002Fvibey_tools\u002Fskills\u002Fplugins\u002Fwriting-craft\u002Fskills\u002Fwhite-paper-writing\u002FSKILL.md",[],[],{"skillNo":57,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":62,"publishedAt":19},"01M7AT16BJRJJKK2MASXRZS76G","prose-technical-mechanics","Use when editing or writing prose at a technical\u002Fmechanical level: choosing between Anglo-Saxon and Latinate diction, placing information in topic vs stress positions, writing periodic vs cumulative sentences, handling sentence rhythm, punctuation as logic, transitions, paragraph structure, or phonesthetics. Use when someone wants to understand WHY prose works or doesn't, not just surface-level style advice. Triggers on word choice, sentence structure, emphasis, rhythm, diction, or any deep writing mechanics question.","https:\u002F\u002Fgithub.com\u002Fthe-vibey-project\u002Fvibey\u002Fblob\u002Fdevelop\u002Fsrc\u002Fvibey_tools\u002Fskills\u002Fplugins\u002Fwriting-craft\u002Fskills\u002Fprose-technical-mechanics\u002FSKILL.md",[],[],{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":69,"publishedAt":19},"01M7AT0W9HT0ZZ9Y287NW99MR3","prose-mechanics","Use when writing, editing, or analyzing prose style; when trying to avoid generic AI-sounding writing; when applying specific prose styles such as journalistic, academic, narrative, KJV biblical, Hemingway plain, Latinate\u002FJamesian, Orwellian, Augustan, Victorian, Early Modern (Bacon, Browne, Milton), or free indirect discourse; or when coaching someone on writing voice and mechanics. Triggers on any request to improve, analyze, or write in a specific prose style, to fix \"AI-sounding\" writing, to make prose more vivid or concrete, to vary sentence rhythm, or to understand how a particular writer achieves their effects.","https:\u002F\u002Fgithub.com\u002Fthe-vibey-project\u002Fvibey\u002Fblob\u002Fdevelop\u002Fsrc\u002Fvibey_tools\u002Fskills\u002Fplugins\u002Fwriting-craft\u002Fskills\u002Fprose-mechanics\u002FSKILL.md",[],[],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":19},"01M7AT0KR635JX66X2X6F3E2CP","narrative-structure","Use when structuring stories, pitches, presentations, white papers, or any persuasive narrative; analyzing the hero's journey in fiction or non-fiction; applying StoryBrand for business communication; designing narrative arcs for thought leadership; or understanding Vogler, Snyder, Propp, or Campbell frameworks. Triggers on any narrative structure, storytelling, pitch structure, StoryBrand, hero's journey, three-act structure, Freytag, Save the Cat, narrative arc, or \"how should I structure this story\u002Fpitch\u002Fpresentation\" request.","https:\u002F\u002Fgithub.com\u002Fthe-vibey-project\u002Fvibey\u002Fblob\u002Fdevelop\u002Fsrc\u002Fvibey_tools\u002Fskills\u002Fplugins\u002Fwriting-craft\u002Fskills\u002Fnarrative-structure\u002FSKILL.md",[],[],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":19},"01M7AT0AKGW09NKKZDYBT8VRDE","legal-brief-writing","Use when writing legal briefs, motions, or any court filing; when analyzing judicial cognition and persuasion; when applying elite brief-writing techniques from Roberts, Clement, Kagan, Garner; or when structuring legal arguments for maximum persuasion. Also use for autistic\u002Fneurodivergent advocates who need to understand how their natural communication style maps to elite legal advocacy. Triggers on any legal writing, brief drafting, motion preparation, or legal argument structuring request.","https:\u002F\u002Fgithub.com\u002Fthe-vibey-project\u002Fvibey\u002Fblob\u002Fdevelop\u002Fsrc\u002Fvibey_tools\u002Fskills\u002Fplugins\u002Fwriting-craft\u002Fskills\u002Flegal-brief-writing\u002FSKILL.md",[],[],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":19},"01M7AT00VWPS4Q8B5VEMXX9NQT","journal-publishability-criteria","Use whenever a research paper, article or preprint is being written, revised, reviewed or published, and specifically before every publication of docs\u002Fpaper.md. Covers what legitimate journals actually gate on, in order of gating — the editor's desk screen (scope, novelty, package problems), what reviewers judge (methodological soundness, claims the evidence can carry, statistical and qualitative reporting), EQUATOR reporting guidelines, the ICMJE authorship criteria, COPE's view of text recycling, the near-universal generative-AI policy (no AI author, disclosure, author responsibility), TOP 2025 transparency standards, how to verify a journal is legitimate, submitting without an institution, and a pre-submission checklist. Triggers on requests to evaluate, review, prepare or submit a paper, to judge publishability, to write a declarations or data-availability section, to disclose AI use, or to check a journal.","https:\u002F\u002Fgithub.com\u002Fthe-vibey-project\u002Fvibey\u002Fblob\u002Fdevelop\u002Fsrc\u002Fvibey_tools\u002Fskills\u002Fplugins\u002Fwriting-craft\u002Fskills\u002Fjournal-publishability-criteria\u002FSKILL.md",[],[]]