From 78cd16a4a99c10d3d2050f1b9f8e310f9b8337c5 Mon Sep 17 00:00:00 2001 From: kochetkov-ma Date: Thu, 11 Jun 2026 19:21:49 +0100 Subject: [PATCH] v3.10.0: sync CC 2.1.144-2.1.173, shorten descriptions, deep-compress LLM docs, fix false plugin-list/nesting/Stop claims --- .claude-plugin/marketplace.json | 10 ++-- RELEASE-NOTES.md | 46 +++++++++++++++++++ brewcode/.claude-plugin/plugin.json | 2 +- brewcode/README.md | 2 +- brewcode/package.json | 4 +- brewdoc/.claude-plugin/plugin.json | 2 +- brewdoc/skills/publish/SKILL.md | 2 +- brewtools/.claude-plugin/plugin.json | 2 +- brewui/.claude-plugin/plugin.json | 2 +- .../docs/brewcode/agents/agent-creator.mdx | 6 +-- .../docs/brewcode/agents/hook-creator.mdx | 38 ++++++++++++--- .../docs/brewcode/agents/skill-creator.mdx | 15 +++++- web/docs/src/content/docs/brewcode/hooks.mdx | 5 ++ .../docs/brewtools/skills/plugin-update.mdx | 4 +- web/docs/src/content/docs/faq.mdx | 4 +- 15 files changed, 115 insertions(+), 29 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 91ec61d..a49a017 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -6,13 +6,13 @@ }, "metadata": { "description": "Claude Code plugin suite: brewcode for infinite task execution, brewdoc for documentation tools, brewtools for text utilities, brewui for UI/visual/creative tools", - "version": "3.9.2" + "version": "3.10.0" }, "plugins": [ { "name": "brewcode", "description": "Brewcode - full-featured development platform for Claude Code: infinite focus tasks, prompt optimization, skill/agent creation, quorum reviews, rules management", - "version": "3.9.2", + "version": "3.10.0", "category": "productivity", "keywords": [ "brewcode", @@ -46,7 +46,7 @@ { "name": "brewdoc", "description": "Brewdoc - Claude Code documentation tools: auto-sync for skills/agents/rules, my-claude installation docs, memory optimization, md-to-pdf conversion", - "version": "3.9.2", + "version": "3.10.0", "category": "productivity", "keywords": [ "brewdoc", @@ -74,7 +74,7 @@ { "name": "brewtools", "description": "Brewtools - universal utilities for Claude Code: text optimization, humanization, secrets scanning", - "version": "3.9.2", + "version": "3.10.0", "category": "productivity", "keywords": [ "brewtools", @@ -102,7 +102,7 @@ { "name": "brewui", "description": "Brewui - UI/visual/creative tools for Claude Code: AI image generation, design-to-code conversion", - "version": "3.9.2", + "version": "3.10.0", "category": "productivity", "keywords": [ "brewui", diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 9495cdc..779ae0b 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -2,6 +2,52 @@ --- +## v3.10.0 (2026-06-11) + +> Docs: [brewcode/agents/skill-creator](https://doc-claude.brewcode.app/brewcode/agents/skill-creator/) | [brewcode/agents/agent-creator](https://doc-claude.brewcode.app/brewcode/agents/agent-creator/) | [brewcode/agents/hook-creator](https://doc-claude.brewcode.app/brewcode/agents/hook-creator/) | [brewcode/hooks](https://doc-claude.brewcode.app/brewcode/hooks/) | [brewtools/skills/plugin-update](https://doc-claude.brewcode.app/brewtools/skills/plugin-update/) | [faq](https://doc-claude.brewcode.app/faq/) | [installation](https://doc-claude.brewcode.app/installation/) + +> **Theme:** sync the plugin suite with Claude Code 2.1.144-2.1.173 — remove false platform claims, document new features, shorten skill/agent descriptions, and deep-compress LLM-facing docs. + +### repo + +#### Fixed +- **plugin list claim was false:** the suite documented that `claude plugin list` does not exist. It has existed since CC 2.1.163. `brewtools:plugin-update` now uses `claude plugin list --json` as the **primary** discovery path (objects: `id, version, scope, enabled, installPath, installedAt, lastUpdated, mcpServers?`; `version` may be `"unknown"`; prefix `unset CLAUDECODE &&` inside a session). `discover-plugins.sh` is kept as the **fallback** for CC < 2.1.163. Fixed in SKILL.md, references, README, `faq.mdx`, `installation.mdx`, and the plugin-update MDX page. +- **"subagents cannot spawn subagents" was false:** CC 2.1.172 allows nesting up to 5 levels. Corrected in `CLAUDE.md`, `agent-creator`, `skill-creator`, guide refs, and MDX. Framed correctly: CC allows it, but the **brewcode workflow** still requires spawning from the main conversation (the 2-step report protocol binds the lock to one session and delivers report/coordinator instructions there; nested spawns bypass session binding, KNOWLEDGE injection, and the coordinator loop). +- **"Stop additionalContext does nothing" was false:** Stop and SubagentStop hooks support `hookSpecificOutput.additionalContext` since CC 2.1.163. Corrected in `hook-creator` and `hooks.mdx`. + +### brewcode + +#### Added +- **CC 2.1.144-2.1.173 platform facts** across creator agents: `disallowed-tools` skill frontmatter (2.1.152), `/reload-skills` (2.1.152), root-level `SKILL.md` with no `skills/` subdir (2.1.142), `MessageDisplay` hook event (2.1.152), SessionStart `reloadSkills` / `sessionTitle` outputs (2.1.152), `--safe-mode` / `CLAUDE_CODE_SAFE_MODE` and `disableBundledSkills` / `CLAUDE_CODE_DISABLE_BUNDLED_SKILLS` (2.1.169), post-session hook (2.1.169, self-hosted runner only — NOT a hooks.json event), and **Fable 5** (`claude-fable-5`, Mythos-class above Opus, CC 2.1.170) added to agent model lists. +- **session-start hook sets sessionTitle:** `session-start.mjs` now sets `hookSpecificOutput.sessionTitle` to the active brewcode task name when a task lock exists (CC 2.1.152; ignored by older CC). + +#### Changed +- **Shorter skill/agent descriptions:** every skill description trimmed to <= 120 chars (optimal ~100) and every agent description to <= 100 chars (optimal ~80), keeping the strongest distinct trigger keywords (EN + RU where present). `` blocks removed from creator-agent frontmatter. The skill/agent generators (skill-creator, agent-creator, `skills`, `agents`, `teams`, `setup`, `e2e`) now emit descriptions within these caps. + +### Optimization + +#### Changed +- **Deep/standard token compression of LLM-facing docs.** Top files compressed (chars, deep batch + key agents): + +| File | Before | After | Saved | +|------|--------|-------|-------| +| brewcode/docs/flow.md | ~72.3K | ~57.5K | -20% | +| brewcode/docs/grepai.md | ~49.2K | ~16.8K | -66% | +| brewcode/docs/commands.md | ~39.4K | ~17.5K | -55% | +| brewcode/docs/hooks.md | ~30.7K | ~12.5K | -58% | +| brewcode/agents/skill-creator.md | ~50.8K | ~38.6K | -25% | +| brewcode/agents/hook-creator.md | ~44.8K | ~26.2K | -43% | +| brewcode/agents/agent-creator.md | ~30.1K | ~21.8K | -23% | +| brewui/skills/glm-design-to-code/SKILL.md | ~34.4K | ~21.5K | -37% | + + Plus standard-mode passes on the remaining top-25 + Phase 1-2 touched files. Deep+key set: ~430.9K -> ~330.8K chars (~25K tokens, **-23%**). Frontmatter and all facts preserved; every compressed file passed a comprehension gate (32/32 questions) and path-existence check. + +### Next (deferred) +- `MessageDisplay` hook adoption in brewcode hooks (2.1.152) — documented, not yet wired. +- Nested subagents inside the brewcode workflow (2.1.172) — requires session-aware lock handling in `pre-task.mjs`/`post-task.mjs` first. + +--- + ## v3.9.2 (2026-05-16) ### repo diff --git a/brewcode/.claude-plugin/plugin.json b/brewcode/.claude-plugin/plugin.json index 692c0f5..8bf4a9f 100644 --- a/brewcode/.claude-plugin/plugin.json +++ b/brewcode/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "brewcode", - "version": "3.9.2", + "version": "3.10.0", "description": "Brewcode - full-featured development platform for Claude Code: infinite focus tasks, prompt optimization, skill/agent creation, quorum reviews, rules management", "author": { "name": "Maksim Kochetkov", diff --git a/brewcode/README.md b/brewcode/README.md index 5c36c65..3a2839c 100644 --- a/brewcode/README.md +++ b/brewcode/README.md @@ -4,7 +4,7 @@ | Field | Value | |-------|-------| -| Version | 3.9.2 | +| Version | 3.10.0 | | Skills | 15 | | Agents | 12+ | | Hooks | 8 | diff --git a/brewcode/package.json b/brewcode/package.json index 11366f5..a98d947 100644 --- a/brewcode/package.json +++ b/brewcode/package.json @@ -1,6 +1,6 @@ { "name": "claude-plugin-brewcode", - "version": "3.9.2", + "version": "3.10.0", "description": "Infinite task execution with automatic handoff for Claude Code", "keywords": [ "claude-code", @@ -36,6 +36,6 @@ }, "claude-plugin": { "name": "brewcode", - "version": "3.9.2" + "version": "3.10.0" } } diff --git a/brewdoc/.claude-plugin/plugin.json b/brewdoc/.claude-plugin/plugin.json index 9a42f12..79452f2 100644 --- a/brewdoc/.claude-plugin/plugin.json +++ b/brewdoc/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "brewdoc", - "version": "3.9.2", + "version": "3.10.0", "description": "Brewdoc - Claude Code documentation tools: auto-sync for skills/agents/rules, my-claude installation docs, memory optimization", "author": { "name": "Maksim Kochetkov", diff --git a/brewdoc/skills/publish/SKILL.md b/brewdoc/skills/publish/SKILL.md index 885ce54..a59de28 100644 --- a/brewdoc/skills/publish/SKILL.md +++ b/brewdoc/skills/publish/SKILL.md @@ -109,7 +109,7 @@ if [ ! -f "$HISTORY_FILE" ]; then cat > "$HISTORY_FILE" <<'HEADER' # brewpage.app — Published Pages -> Owner tokens allow delete (no in-place PUT for sites; html/json/kv support PUT). Keep this file private. +> Owner tokens allow delete and in-place republish (html/json/kv/sites all support PUT). Keep this file private. > Delete: `curl -s -X DELETE "https://brewpage.app/api/{ns}/{id}" -H "X-Owner-Token: TOKEN"` | Date | URL | Owner Token | TTL | Type | diff --git a/brewtools/.claude-plugin/plugin.json b/brewtools/.claude-plugin/plugin.json index ff8fe22..5d526b9 100644 --- a/brewtools/.claude-plugin/plugin.json +++ b/brewtools/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "brewtools", - "version": "3.9.2", + "version": "3.10.0", "description": "Brewtools - universal utilities for Claude Code: text optimization, humanization, secrets scanning", "author": { "name": "Maksim Kochetkov", diff --git a/brewui/.claude-plugin/plugin.json b/brewui/.claude-plugin/plugin.json index 1f2f993..5eeb2e2 100644 --- a/brewui/.claude-plugin/plugin.json +++ b/brewui/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "brewui", - "version": "3.9.2", + "version": "3.10.0", "description": "Brewui - UI/visual/creative tools for Claude Code: AI image generation, design-to-code conversion", "author": { "name": "Maksim Kochetkov", diff --git a/web/docs/src/content/docs/brewcode/agents/agent-creator.mdx b/web/docs/src/content/docs/brewcode/agents/agent-creator.mdx index 19a65c7..ec555b5 100644 --- a/web/docs/src/content/docs/brewcode/agents/agent-creator.mdx +++ b/web/docs/src/content/docs/brewcode/agents/agent-creator.mdx @@ -52,7 +52,7 @@ import { Callout, Card, CardGrid, Steps, UpdateNotice } from '../../../../compon
  • Clarify intent -

    Asks 2-3 targeted questions: desired role, allowed tools, model tier (opus / sonnet / haiku). For improvement requests, reads the existing agent file first.

    +

    Asks 2-3 targeted questions: desired role, allowed tools, model tier (fable / opus / sonnet / haiku). For improvement requests, reads the existing agent file first.

  • @@ -94,7 +94,7 @@ import { Callout, Card, CardGrid, Steps, UpdateNotice } from '../../../../compon --- name: agent-name # REQ: [a-z0-9-]+ description: "..." # REQ: action verb + Triggers: keyword list -model: sonnet # OPT: sonnet|opus|haiku|inherit +model: sonnet # OPT: fable|opus|sonnet|haiku|inherit (fable=claude-fable-5, Mythos-class, CC 2.1.170+) effort: high # OPT: low|medium|high|auto (plugin agents, v2.1.78+) maxTurns: 20 # OPT: integer (plugin agents, v2.1.78+) tools: Read, Glob, Grep # OPT: omit = inherit all @@ -123,7 +123,7 @@ Description patterns by ambiguity level: | Some — 1-2 other agents | Single-line + detailed Triggers | `"Creates bash scripts. Triggers: create script, bash script, shell script"` | | High — creator/meta agents | Multi-line + 2-3 `` blocks | See agent-creator.md source | -Subagent spawn constraint: subagents run in `SubAgentLoop` which excludes `AgentTool`. Nesting is not possible by design — chain from the main conversation instead. +Subagent spawn constraint: CC 2.1.172 allows nested subagent spawning up to 5 levels deep. However, brewcode workflow requires spawning only from the main conversation — the 2-step report protocol (`post-task.mjs`) binds the task lock to one session and delivers report/coordinator instructions back to the spawning conversation. Nested spawns bypass session binding, `KNOWLEDGE` injection, and the coordinator loop. This is a **brewcode workflow policy**, not a Claude Code platform limitation. Known active bugs: [#29423](https://github.com/anthropics/claude-code/issues/29423) (subagents skip CLAUDE.md), [#27736](https://github.com/anthropics/claude-code/issues/27736) (`skills:` in plugin agents), [#31392](https://github.com/anthropics/claude-code/issues/31392) (global agents not discovered in v2.1.70+). diff --git a/web/docs/src/content/docs/brewcode/agents/hook-creator.mdx b/web/docs/src/content/docs/brewcode/agents/hook-creator.mdx index ac1f4eb..3b08b5e 100644 --- a/web/docs/src/content/docs/brewcode/agents/hook-creator.mdx +++ b/web/docs/src/content/docs/brewcode/agents/hook-creator.mdx @@ -8,11 +8,11 @@ import { Badge, Callout, Card, CardGrid, Steps, UpdateNotice } from '../../../.. # Hook Creator -**Hooks fail silently when the wrong output channel is used.** `additionalContext` on a `Stop` event does nothing — Claude never sees it. `decision:"block"` on `PostToolUse` is not a valid field. Getting the event-to-channel mapping wrong means the hook runs and produces zero effect, with no error to debug. +**Hooks fail silently when the wrong output channel is used.** On `Stop` and `SubagentStop`, use `hookSpecificOutput.additionalContext` to give Claude feedback and keep the turn going — plain `additionalContext` at the top level is not the correct channel for those events. `decision:"block"` on `PostToolUse` is not a valid field. Getting the event-to-channel mapping wrong means the hook runs and produces zero effect, with no error to debug. -**hook-creator knows all 26 events, 4 hook types, and the full routing matrix.** Describe what you want in plain language — it picks the right event, output channel, and schema, then delivers a working file with fail-safe error handling included. +**hook-creator knows all 27 events, 4 hook types, and the full routing matrix.** Describe what you want in plain language — it picks the right event, output channel, and schema, then delivers a working file with fail-safe error handling included. ## Quick reference @@ -60,7 +60,7 @@ import { Badge, Callout, Card, CardGrid, Steps, UpdateNotice } from '../../../..
  • Select event and channel -

    Applies the routing matrix — picks the correct event from 26 options and the right output channel (additionalContext, updatedInput, permissionDecision, decision) for your goal. Wrong channel = silent failure, so this step is non-negotiable.

    +

    Applies the routing matrix — picks the correct event from 27 options and the right output channel (additionalContext, updatedInput, permissionDecision, decision, hookSpecificOutput) for your goal. Wrong channel = silent failure, so this step is non-negotiable.

  • @@ -94,25 +94,28 @@ import { Badge, Callout, Card, CardGrid, Steps, UpdateNotice } from '../../../.. | Inject into subagent prompt | `updatedInput.prompt` | PreToolUse (matcher: Task) | | Block tool execution | `permissionDecision:"deny"` | PreToolUse | | Block session stop | `decision:"block"` + `reason` | Stop | +| Give Claude feedback at stop (keep turn going) | `hookSpecificOutput.additionalContext` | Stop, SubagentStop | | Post-tool feedback | `additionalContext` | PostToolUse | | Modify tool parameters | `updatedInput` | PreToolUse | | Show user warning (Claude does NOT see) | `systemMessage` | Any | | Auto-allow permission | `decision.behavior:"allow"` | PermissionRequest | | Control teammates | `{continue, stopReason}` JSON | TeammateIdle, TaskCompleted, TaskCreated | +| Re-scan skill dirs on startup | `reloadSkills: true` | SessionStart (CC 2.1.152) | +| Set session title on startup/resume | `hookSpecificOutput.sessionTitle` | SessionStart (CC 2.1.152) | -### All 26 events +### All 27 events | Event | Blocking? | Key use | |-------|-----------|---------| -| SessionStart | No | Context injection on start/resume | +| SessionStart | No | Context injection on start/resume; supports `reloadSkills` and `sessionTitle` outputs (CC 2.1.152) | | UserPromptSubmit | Yes | Gate or modify user prompts | | PreToolUse | Yes | Allow / deny / modify tool calls | | PermissionRequest | Yes | Auto-allow or auto-deny permission dialogs | | PostToolUse | No | Feedback after tool completes | | PostToolUseFailure | No | React to failed tool call | | SubagentStart | No | Inject into subagent context | -| SubagentStop | Yes | Block subagent exit | -| Stop | Yes | Block session exit until condition met | +| SubagentStop | Yes | Block subagent exit; supports `additionalContext` to give Claude feedback | +| Stop | Yes | Block session exit until condition met; supports `additionalContext` to give Claude feedback (CC 2.1.163) | | PreCompact | No | Write handoff before auto-compact | | PostCompact | No | React after compact | | Notification | No | Log or react to notifications | @@ -130,6 +133,7 @@ import { Badge, Callout, Card, CardGrid, Steps, UpdateNotice } from '../../../.. | ElicitationResult | Yes | Post-elicitation hook | | SessionEnd | No | Cleanup on session close | | PermissionDenied | Yes | Retry after auto-mode denial (v2.1.89+) | +| MessageDisplay | No | Transform or hide assistant message text as it is displayed to the user (CC 2.1.152) | ### Hook types @@ -144,6 +148,26 @@ import { Badge, Callout, Card, CardGrid, Steps, UpdateNotice } from '../../../.. +
    +Troubleshooting flags and environment variables (expand) + +### Safe mode and bundled skills + +| Flag / Env var | Effect | +|----------------|--------| +| `--safe-mode` or `CLAUDE_CODE_SAFE_MODE=1` | Starts CC with ALL customizations disabled: CLAUDE.md, plugins, skills, hooks, MCP servers. Use to isolate whether a hook is causing a startup problem. (CC 2.1.169) | +| `--disable-bundled-skills` or `CLAUDE_CODE_DISABLE_BUNDLED_SKILLS=1` | Hides all bundled skills, workflows, and built-in commands without disabling plugins or hooks. Useful when a bundled skill name collides with a project skill. | + + +`--safe-mode` is also the fastest way to verify a hook regression: if the problem disappears in safe mode, the hook is the cause. + + +### Post-session lifecycle hook + +A **post-session lifecycle hook** runs after a session ends and before the workspace is deleted. This is **NOT a hooks.json event** — do not add it to `hooks.json`; it will be silently ignored. It is available only on **self-hosted runners** as a workspace lifecycle callback configured at the runner level. (CC 2.1.169) + +
    + All brewcode agents and skills — hooks live here in the plugin's hooks/ directory. diff --git a/web/docs/src/content/docs/brewcode/agents/skill-creator.mdx b/web/docs/src/content/docs/brewcode/agents/skill-creator.mdx index 9910fd7..ddbaf25 100644 --- a/web/docs/src/content/docs/brewcode/agents/skill-creator.mdx +++ b/web/docs/src/content/docs/brewcode/agents/skill-creator.mdx @@ -20,7 +20,7 @@ import { Badge, Callout, Card, CardGrid, Steps, UpdateNotice } from '../../../.. | Field | Value | |-------|-------| | Trigger | "create skill", "new skill", "skill doesn't invoke", "improve skill", "fix skill trigger" | -| Model | opus | +| Model | opus (default); `claude-fable-5` for Mythos-class tasks (CC 2.1.170+) | | Tools | Read, Write, Edit, Glob, Grep, Bash, Task, Skill, AskUserQuestion | ## When to use @@ -146,9 +146,10 @@ Common mistakes: multiline `|` (truncated at 250 chars since v2.1.84), missing ` | `user-invocable` | true/false | `false` = hide from menu, Claude-only | | `context` | `fork` | Isolated subagent, fresh context | | `agent` | Explore, Plan, general-purpose, developer | With `context: fork` | -| `model` | opus, sonnet, haiku | Based on complexity | +| `model` | opus, sonnet, haiku, `claude-fable-5` | Based on complexity; Fable 5 (Mythos-class) available since CC 2.1.170 — above Opus tier | | `effort` | low, medium, high, max, auto | v2.1.80+ | | `allowed-tools` | tool list | Minimal set | +| `disallowed-tools` | tool list | Removes tools while the skill is active (CC 2.1.152) | | `argument-hint` | string | Autocomplete hint | | `once` | true/false | Fire once per session | @@ -179,6 +180,12 @@ Replace ARGS_HERE with the actual value from above. | `context: fork` | 1–4 | Works well, context isolated | | `context: fork` | 5+ | Memory loss — forgets task structure, skips phases | +### Additional skill facts (CC 2.1.142+) + +Root-level `SKILL.md`: a plugin with a `SKILL.md` at the plugin root (no `skills/` subdirectory) is surfaced as a skill automatically since CC 2.1.142. Useful for single-skill plugins. + +`/reload-skills` re-scans skill directories without restarting the session (CC 2.1.152). Use this after editing or adding a `SKILL.md` — no session restart needed. + ### Known bugs | Issue | Impact | Workaround | @@ -189,6 +196,10 @@ Replace ARGS_HERE with the actual value from above. | [#17417](https://github.com/anthropics/claude-code/issues/17417) | `skill.md` (lowercase) silently ignored | Use `SKILL.md` (uppercase) | | [#10768](https://github.com/anthropics/claude-code/issues/10768) | Auto-activation 20–50% (NOT PLANNED) | Optimize description or use `/name` | +### Subagent spawn constraint + +CC 2.1.172 allows nested subagent spawning up to 5 levels deep. However, brewcode workflow requires spawning only from the main conversation — the 2-step report protocol (`post-task.mjs`) binds the task lock to one session and delivers report/coordinator instructions back to the spawning conversation. Nested spawns bypass session binding, `KNOWLEDGE` injection, and the coordinator loop. This is a **brewcode workflow policy**, not a Claude Code platform limitation. + diff --git a/web/docs/src/content/docs/brewcode/hooks.mdx b/web/docs/src/content/docs/brewcode/hooks.mdx index 70ffe94..c42fe85 100644 --- a/web/docs/src/content/docs/brewcode/hooks.mdx +++ b/web/docs/src/content/docs/brewcode/hooks.mdx @@ -114,6 +114,7 @@ Initializes the session, logs the session ID, and manages Plan Mode symlinks. | `resume` | Log session_id | | `clear` | Create symlink LATEST.md -> newest plan | | `compact` + active task | Handoff instructions in additionalContext | +| any + active task lock | Set `hookSpecificOutput.sessionTitle` to active task name (CC 2.1.152+; ignored by older versions) | **LATEST.md symlink:** 1. Checks `~/.claude/plans/` for `.md` files @@ -275,6 +276,10 @@ Controls session exit: blocks when a task is active, cleans up the lock when fin **Recursion protection:** If `input.stop_hook_active === true`, the hook is skipped to prevent an infinite loop. +**additionalContext (CC 2.1.163+):** Stop and SubagentStop events support +`hookSpecificOutput.additionalContext`. `stop.mjs` uses this channel to surface the +blocking reason in the Claude Code UI when exit is prevented. + --- ### 9. permission-guard.sh diff --git a/web/docs/src/content/docs/brewtools/skills/plugin-update.mdx b/web/docs/src/content/docs/brewtools/skills/plugin-update.mdx index 739b4c4..664acb2 100644 --- a/web/docs/src/content/docs/brewtools/skills/plugin-update.mdx +++ b/web/docs/src/content/docs/brewtools/skills/plugin-update.mdx @@ -74,7 +74,7 @@ Status legend: ✅ current · ⬇️ update available · ❌ missing · ❓ unkn
  • Discover installed plugins -

    Runs discover-plugins.sh, which reads ~/.claude/settings.json and walks the plugin cache at ~/.claude/plugins/cache/. Outputs a JSON object with each installed plugin and its version. claude plugin list does not exist as a subcommand — the script bypasses it entirely.

    +

    Primary path: runs claude plugin list --json (CC 2.1.163+, prefixed with unset CLAUDECODE && inside a session). Returns an array of objects: id, version, scope, enabled, installPath, installedAt, lastUpdated, and optional mcpServers. The version field may read "unknown" for locally-loaded plugins. Fallback: if the command errors, returns empty output, or produces invalid JSON, the skill runs discover-plugins.sh, which reads ~/.claude/settings.json and walks ~/.claude/plugins/cache/ directly.

  • @@ -122,7 +122,7 @@ Run `/reload-plugins` or restart the session after any install or update. Claude
    Internals -**Discovery** — no `claude plugin list`. The skill uses `discover-plugins.sh`, which parses `~/.claude/settings.json` for marketplace registrations and walks `~/.claude/plugins/cache/` for installed version directories. +**Discovery** — primary: `claude plugin list --json` (available since CC 2.1.163). Returns objects with fields `id`, `version`, `scope`, `enabled`, `installPath`, `installedAt`, `lastUpdated`, and optionally `mcpServers`. The `version` field may be `"unknown"` for dev-mode plugins. When run inside a session, the Bash invocation is prefixed with `unset CLAUDECODE &&` to avoid the env-var conflict. Fallback: if the command errors, returns empty output, or returns invalid JSON (CC older than 2.1.163), the skill falls back to `discover-plugins.sh`, which parses `~/.claude/settings.json` for marketplace registrations and walks `~/.claude/plugins/cache/` for installed version directories. **Update chain** — runs in this fixed order: diff --git a/web/docs/src/content/docs/faq.mdx b/web/docs/src/content/docs/faq.mdx index cf80814..9f63e08 100644 --- a/web/docs/src/content/docs/faq.mdx +++ b/web/docs/src/content/docs/faq.mdx @@ -137,8 +137,8 @@ The marketplace metadata lives at: Run [`/brewtools:plugin-update`](/brewtools/skills/plugin-update/) inside a Claude Code session. It reports the installed and latest available version for each plugin and prompts you to update if a newer version exists. - - The claude plugin list CLI command does not exist. Version checking must be done through the /brewtools:plugin-update skill or by inspecting the cache directory above. + + Run claude plugin list (or claude plugin list --json for machine-readable output) to see installed plugins with their versions. Inside an active Claude session, prefix with unset CLAUDECODE && to avoid the env-var conflict. On CC older than 2.1.163 the command does not exist — use the cache directory path above or /brewtools:plugin-update as a fallback.