forked from bchanot/claude
feat(agents): W2/S1 plugin split — probe (sonnet) + advisor reasoner (opus) + plugin-gate include (BDR-077)
plugin-advisor keeps its name, becomes the opus REASONER: PHASE 1 bash extracted to new plugin-probe (sonnet, facts-only PROBE REPORT), PHASE 4 apply + checkpoint hoisted to new lib/plugin-gate.md (main-loop include, doc-commit.md x6 pattern). Fail-closed: advisor ERRORs on missing report. 4 consumers rewired (plugin-check, onboard, init-project, ship-feature). In-wave planted-input smoke PASSED: probe report complete w/ fallbacks; advisor consumed every planted field (monorepo per-package note, fast-libs ctx7 reco) with zero re-detection; ERROR verdict on absent report. Census §13 (81 pass). Note: new subagent_type registers next session — resolution re-check before wave merge.
This commit is contained in:
+25
-118
@@ -1,71 +1,35 @@
|
|||||||
---
|
---
|
||||||
name: plugin-advisor
|
name: plugin-advisor
|
||||||
description: Plugin-fit checker — dispatched by /plugin-check and orchestrator gates (init-project, ship-feature). Recommends enable/disable.
|
description: Plugin-fit REASONER — dispatched by lib/plugin-gate.md with a PROBE REPORT (from plugin-probe). Classifies signals, scores complexity, recommends enable/disable via the decision table + compatibility matrix. Report-only.
|
||||||
tools: Read, Bash, Glob, Grep
|
tools: Read, Glob, Grep
|
||||||
model: sonnet
|
model: opus
|
||||||
---
|
---
|
||||||
|
|
||||||
# PLUGIN ADVISOR
|
# PLUGIN ADVISOR
|
||||||
|
|
||||||
## ROLE
|
## ROLE
|
||||||
Detect active plugins and project signals. Recommend enable/disable. Apply compatibility matrix. Block or warn as needed.
|
Reason over the PROBE REPORT + request. Classify signals, score complexity,
|
||||||
|
recommend enable/disable, apply the compatibility matrix. Block or warn.
|
||||||
|
Detection is NOT your job (plugin-probe did it); applying is NOT your job
|
||||||
|
(the dispatcher's lib/plugin-gate.md apply gate does it).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## PHASE 1 — DETECT
|
## INPUT — PROBE REPORT (ground truth, from plugin-probe)
|
||||||
|
|
||||||
```bash
|
The dispatcher passes `REQUEST` (the project description, verbatim) and the
|
||||||
# Claude Code plugins
|
full `PROBE REPORT` (fields: PLUGINS, EXTERNAL, PROFILE, CLIS, MANIFESTS,
|
||||||
claude plugin list 2>/dev/null || echo "plugin-list-unavailable"
|
FRAMEWORK-DEPS, TSX-JSX-COUNT, DOCKER-COUNT, ANIM, MONOREPO, EMBEDDED,
|
||||||
|
CHECKPOINT). Treat it as ground truth — never re-detect, never invent a
|
||||||
# External (non-marketplace) tools status — gstack, emil-design-eng,
|
field. PROBE REPORT missing or a field absent → emit
|
||||||
# darwin-skill. Managed by lib/toggle-external.sh since
|
`PLUGIN CHECK — VERDICT: ERROR(probe report missing/invalid: <what>)` and
|
||||||
# `claude plugin enable|disable` does not apply to them.
|
STOP. Fail closed: no recommendations over invented detection.
|
||||||
bash "$HOME/.claude/lib/toggle-external.sh" list 2>/dev/null || echo "toggle-external-unavailable"
|
|
||||||
|
|
||||||
# Active skill profile — design / dev / qa / audit / minimal / custom.
|
|
||||||
# Profiles partition gstack + personal skills by purpose. See
|
|
||||||
# lib/profile.sh and lib/profiles/*.profile.
|
|
||||||
bash "$HOME/.claude/lib/profile.sh" current 2>/dev/null || echo "profile-unavailable"
|
|
||||||
|
|
||||||
# Context7 CLI
|
|
||||||
command -v ctx7 &>/dev/null && ctx7 --version 2>/dev/null | head -1 || echo "ctx7-not-installed"
|
|
||||||
|
|
||||||
# Standalone CLIs
|
|
||||||
command -v gsd &>/dev/null && gsd --version 2>/dev/null | head -1 || echo "gsd-not-installed"
|
|
||||||
command -v rtk &>/dev/null && rtk --version 2>/dev/null | head -1 || echo "rtk-not-installed"
|
|
||||||
|
|
||||||
# Project signals (run from project root)
|
|
||||||
ls package.json pyproject.toml Cargo.toml go.mod 2>/dev/null | head -5
|
|
||||||
grep -rl "next\|react\|vue\|prisma\|supabase" package.json 2>/dev/null | head -3 || true
|
|
||||||
find . -name "*.tsx" -o -name "*.jsx" 2>/dev/null | head -3 | wc -l
|
|
||||||
find . -name "docker-compose*" -o -name "Dockerfile" 2>/dev/null | head -3 | wc -l
|
|
||||||
|
|
||||||
# Animation lib status (motion / motion-v) — read-only detection
|
|
||||||
if [ -f "$HOME/.claude/lib/animation-lib-check.sh" ]; then
|
|
||||||
source "$HOME/.claude/lib/animation-lib-check.sh"
|
|
||||||
detect_anim_eligibility # outputs '<status>|<package>|<reason>'
|
|
||||||
is_anim_lib_installed || echo "anim-lib-not-installed"
|
|
||||||
fi
|
|
||||||
# Monorepo detection (current dir + parent dirs for sub-package context)
|
|
||||||
ls apps/ packages/ services/ workspaces/ 2>/dev/null | head -5
|
|
||||||
ls pnpm-workspace.yaml turbo.json nx.json lerna.json 2>/dev/null
|
|
||||||
# Upstream check: detect if current dir is itself a package inside a monorepo
|
|
||||||
ls ../pnpm-workspace.yaml ../turbo.json ../nx.json ../../turbo.json ../../pnpm-workspace.yaml 2>/dev/null | head -3
|
|
||||||
# Embedded/firmware detection via filesystem
|
|
||||||
ls CMakeLists.txt platformio.ini 2>/dev/null
|
|
||||||
ls *.ld *.lds linker*.ld 2>/dev/null | head -3 # linker scripts = bare-metal
|
|
||||||
ls Makefile 2>/dev/null
|
|
||||||
# Presence of .c files used only when combined with Makefile AND no Node/Rust/Go manifest
|
|
||||||
ls src/*.c 2>/dev/null | head -3
|
|
||||||
ls package.json Cargo.toml go.mod pubspec.yaml setup.py pyproject.toml 2>/dev/null | head -1 # counterindicators (ecosystem present = not bare embedded)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## PHASE 2 — ANALYZE $ARGUMENTS
|
## PHASE 2 — ANALYZE
|
||||||
|
|
||||||
Detect signals from the project description and filesystem scan:
|
Detect signals from REQUEST + the PROBE REPORT fields:
|
||||||
|
|
||||||
| Signal | How to detect |
|
| Signal | How to detect |
|
||||||
|---|---|
|
|---|---|
|
||||||
@@ -146,70 +110,11 @@ ACTION REQUIRED? YES / NO
|
|||||||
> packages itself — it just states the status. Installation happens in
|
> packages itself — it just states the status. Installation happens in
|
||||||
> `/init-project` STEP 5e (auto) or `/onboard` STEP 2.5 (opt-in).
|
> `/init-project` STEP 5e (auto) or `/onboard` STEP 2.5 (opt-in).
|
||||||
|
|
||||||
## PHASE 4 — AUTO-ACTIVATION (when called from /init-project or /ship-feature)
|
> **Apply, confirmation, and rollback are the DISPATCHER'S job** —
|
||||||
|
> `lib/plugin-gate.md` steps 4-5 (main loop: present, ACTION-REQUIRED stop,
|
||||||
After presenting RECOMMENDATIONS, if any plugin has ⚡ ENABLE status:
|
> PROPOSED-CHANGES confirmation, toggle + rollback). This agent only
|
||||||
1. List the changes to apply:
|
> recommends and emits the EXACT toggle commands. It never applies, never
|
||||||
```
|
> asks the user (it cannot — it is dispatched).
|
||||||
PROPOSED CHANGES:
|
|
||||||
⚡ Enable ui-ux-pro-max (frontend detected, complexity 65%)
|
|
||||||
⚡ Pre-fetch ctx7 docs for next.js, prisma
|
|
||||||
Apply these changes? (yes / no / customize)
|
|
||||||
```
|
|
||||||
2. On "yes" → apply changes (rename .disabled dirs, update MCP config).
|
|
||||||
3. On "customize" → user picks which to apply.
|
|
||||||
4. On "no" → proceed with current config.
|
|
||||||
|
|
||||||
**Never auto-activate without showing the list and getting confirmation.**
|
|
||||||
|
|
||||||
### Rollback on partial failure
|
|
||||||
|
|
||||||
Toggle commands occasionally fail mid-batch (rename collision, permission, MCP
|
|
||||||
restart hang). Track each toggle and roll back the partial set rather than
|
|
||||||
leave a half-applied configuration:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
applied=()
|
|
||||||
for change in "${PROPOSED_CHANGES[@]}"; do
|
|
||||||
if bash "$HOME/.claude/lib/toggle-external.sh" enable "$change"; then
|
|
||||||
applied+=("$change")
|
|
||||||
else
|
|
||||||
echo "❌ failed to enable $change — rolling back ${#applied[@]} prior change(s)"
|
|
||||||
for prior in "${applied[@]}"; do
|
|
||||||
bash "$HOME/.claude/lib/toggle-external.sh" disable "$prior" \
|
|
||||||
|| echo "⚠️ rollback of $prior also failed — manual cleanup required: see ~/.claude/plugins/cache"
|
|
||||||
done
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
```
|
|
||||||
|
|
||||||
Surface to the user:
|
|
||||||
|
|
||||||
```
|
|
||||||
✅ Applied N change(s).
|
|
||||||
```
|
|
||||||
|
|
||||||
Or, on failure:
|
|
||||||
|
|
||||||
```
|
|
||||||
⚠️ Toggle failed at change <name>. Rolled back the N prior change(s).
|
|
||||||
To inspect manually: ls ~/.claude/plugins/cache; bash ~/.claude/lib/toggle-external.sh list
|
|
||||||
Re-run /plugin-check after fixing the underlying cause (e.g. permissions).
|
|
||||||
```
|
|
||||||
|
|
||||||
### Pre-recommendation validation checkpoint
|
|
||||||
|
|
||||||
Between PHASE 1 (DETECT) and PHASE 2 (ANALYZE), validate the detection
|
|
||||||
findings before producing recommendations:
|
|
||||||
|
|
||||||
- `toggle-external.sh list` returned non-empty AND each listed plugin's
|
|
||||||
directory exists in `~/.claude/plugins/cache` or `~/.agents/skills/`.
|
|
||||||
- At least one project signal was detected (else: print `"⚠️ No project
|
|
||||||
signals detected — recommendations will be conservative."` and continue).
|
|
||||||
- If `toggle-external.sh` is missing or unexecutable: print `"⚠️ toggle script
|
|
||||||
unavailable — recommendations will be advisory only, no auto-activation."`
|
|
||||||
and skip PHASE 4 entirely.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -418,4 +323,6 @@ or by applying a profile that lists it (e.g. `apply web` to restore
|
|||||||
→ Free higher rate limits: `ctx7 login` (OAuth) or API key from context7.com/dashboard
|
→ Free higher rate limits: `ctx7 login` (OAuth) or API key from context7.com/dashboard
|
||||||
→ Type "force" to proceed without context7 (not recommended for fast-evolving libs)
|
→ Type "force" to proceed without context7 (not recommended for fast-evolving libs)
|
||||||
|
|
||||||
Never modify files. If action required → stop and wait. If not → say "proceed".
|
Never modify files. Never ask the user. Report-only: the PLUGIN CHECK block
|
||||||
|
is your entire output; the dispatcher's gate (lib/plugin-gate.md) owns the
|
||||||
|
stop/proceed decision and every state change.
|
||||||
|
|||||||
@@ -0,0 +1,90 @@
|
|||||||
|
---
|
||||||
|
name: plugin-probe
|
||||||
|
description: Mechanical detection probe — dispatched by lib/plugin-gate.md BEFORE the plugin-advisor reasoner. Runs the CLI/filesystem probes, reports raw facts as a PROBE REPORT. No analysis, no recommendations.
|
||||||
|
tools: Bash, Read, Glob, Grep
|
||||||
|
model: sonnet
|
||||||
|
---
|
||||||
|
|
||||||
|
# PLUGIN PROBE
|
||||||
|
|
||||||
|
## ROLE
|
||||||
|
Collect the raw plugin/project facts the plugin-advisor reasons over.
|
||||||
|
Facts only — no signals, no recommendations, no complexity scoring.
|
||||||
|
|
||||||
|
## PROBES (run all; a failing probe reports its fallback string, never aborts)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Claude Code plugins
|
||||||
|
claude plugin list 2>/dev/null || echo "plugin-list-unavailable"
|
||||||
|
|
||||||
|
# External (non-marketplace) tools status — gstack, emil-design-eng,
|
||||||
|
# darwin-skill. Managed by lib/toggle-external.sh since
|
||||||
|
# `claude plugin enable|disable` does not apply to them.
|
||||||
|
bash "$HOME/.claude/lib/toggle-external.sh" list 2>/dev/null || echo "toggle-external-unavailable"
|
||||||
|
|
||||||
|
# Active skill profile — design / dev / qa / audit / minimal / custom.
|
||||||
|
bash "$HOME/.claude/lib/profile.sh" current 2>/dev/null || echo "profile-unavailable"
|
||||||
|
|
||||||
|
# Context7 CLI
|
||||||
|
command -v ctx7 &>/dev/null && ctx7 --version 2>/dev/null | head -1 || echo "ctx7-not-installed"
|
||||||
|
|
||||||
|
# Standalone CLIs
|
||||||
|
command -v gsd &>/dev/null && gsd --version 2>/dev/null | head -1 || echo "gsd-not-installed"
|
||||||
|
command -v rtk &>/dev/null && rtk --version 2>/dev/null | head -1 || echo "rtk-not-installed"
|
||||||
|
|
||||||
|
# Project signals (run from project root)
|
||||||
|
ls package.json pyproject.toml Cargo.toml go.mod 2>/dev/null | head -5
|
||||||
|
grep -rl "next\|react\|vue\|prisma\|supabase" package.json 2>/dev/null | head -3 || true
|
||||||
|
find . -name "*.tsx" -o -name "*.jsx" 2>/dev/null | head -3 | wc -l
|
||||||
|
find . -name "docker-compose*" -o -name "Dockerfile" 2>/dev/null | head -3 | wc -l
|
||||||
|
|
||||||
|
# Animation lib status (motion / motion-v) — read-only detection
|
||||||
|
if [ -f "$HOME/.claude/lib/animation-lib-check.sh" ]; then
|
||||||
|
source "$HOME/.claude/lib/animation-lib-check.sh"
|
||||||
|
detect_anim_eligibility # outputs '<status>|<package>|<reason>'
|
||||||
|
is_anim_lib_installed || echo "anim-lib-not-installed"
|
||||||
|
fi
|
||||||
|
# Monorepo detection (current dir + parent dirs for sub-package context)
|
||||||
|
ls apps/ packages/ services/ workspaces/ 2>/dev/null | head -5
|
||||||
|
ls pnpm-workspace.yaml turbo.json nx.json lerna.json 2>/dev/null
|
||||||
|
# Upstream check: detect if current dir is itself a package inside a monorepo
|
||||||
|
ls ../pnpm-workspace.yaml ../turbo.json ../nx.json ../../turbo.json ../../pnpm-workspace.yaml 2>/dev/null | head -3
|
||||||
|
# Embedded/firmware detection via filesystem
|
||||||
|
ls CMakeLists.txt platformio.ini 2>/dev/null
|
||||||
|
ls *.ld *.lds linker*.ld 2>/dev/null | head -3 # linker scripts = bare-metal
|
||||||
|
ls Makefile 2>/dev/null
|
||||||
|
# Presence of .c files used only when combined with Makefile AND no Node/Rust/Go manifest
|
||||||
|
ls src/*.c 2>/dev/null | head -3
|
||||||
|
ls package.json Cargo.toml go.mod pubspec.yaml setup.py pyproject.toml 2>/dev/null | head -1 # counterindicators (ecosystem present = not bare embedded)
|
||||||
|
|
||||||
|
# Checkpoint inputs (consumed by lib/plugin-gate.md's validation checkpoint)
|
||||||
|
[ -x "$HOME/.claude/lib/toggle-external.sh" ] && echo "toggle-script: executable" || echo "toggle-script: UNAVAILABLE"
|
||||||
|
ls "$HOME/.claude/plugins/cache" 2>/dev/null | head -10
|
||||||
|
ls "$HOME/.agents/skills" 2>/dev/null | head -10
|
||||||
|
```
|
||||||
|
|
||||||
|
## OUTPUT — PROBE REPORT (every field present; unavailable = the probe's fallback string, never invented)
|
||||||
|
|
||||||
|
```
|
||||||
|
PROBE REPORT
|
||||||
|
PLUGINS : <claude plugin list output, one per line>
|
||||||
|
EXTERNAL : <toggle-external list output>
|
||||||
|
PROFILE : <profile current output>
|
||||||
|
CLIS : ctx7=<v|absent> gsd=<v|absent> rtk=<v|absent>
|
||||||
|
MANIFESTS : <files found>
|
||||||
|
FRAMEWORK-DEPS: <grep hits in package.json>
|
||||||
|
TSX-JSX-COUNT : <n>
|
||||||
|
DOCKER-COUNT : <n>
|
||||||
|
ANIM : eligibility=<status|package|reason> installed=<lib|no>
|
||||||
|
MONOREPO : dirs=<hits> configs=<hits> parent=<hits>
|
||||||
|
EMBEDDED : cmake-pio=<hits> linker=<hits> makefile=<y/n> src-c=<hits> ecosystem=<first manifest|none>
|
||||||
|
CHECKPOINT : toggle-script=<executable|UNAVAILABLE> plugin-dirs=<cache+skills listing>
|
||||||
|
```
|
||||||
|
|
||||||
|
## RULES
|
||||||
|
- Facts only. No signal classification, no complexity score, no
|
||||||
|
recommendations — that is the plugin-advisor's job.
|
||||||
|
- Never modify files. Never install anything. Never ask the user
|
||||||
|
(you cannot — report facts instead).
|
||||||
|
- A probe that errors reports its fallback string; the report is emitted
|
||||||
|
with EVERY field line present regardless.
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
# Plugin gate — shared consumer include (plugin-check, onboard, init-project, ship-feature STEP 0)
|
||||||
|
|
||||||
|
Runs in the CONSUMER'S MAIN LOOP. The detection and the reasoning are
|
||||||
|
dispatched (BDR-077 tiers); the validation checkpoint, the report
|
||||||
|
presentation, and the apply gate live HERE — a dispatched agent can neither
|
||||||
|
ask the user nor safely mutate plugin state.
|
||||||
|
|
||||||
|
## 1. PROBE (dispatch — sonnet)
|
||||||
|
|
||||||
|
```
|
||||||
|
Agent(subagent_type="plugin-probe", description="plugin gate — probe",
|
||||||
|
prompt="Run your probes from <PROJECT_ROOT>. Emit the PROBE REPORT.")
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. VALIDATION CHECKPOINT (main loop — between probe and reasoner)
|
||||||
|
|
||||||
|
Validate the PROBE REPORT before any reasoning:
|
||||||
|
- `EXTERNAL` non-empty AND each listed plugin's directory appears under
|
||||||
|
`CHECKPOINT plugin-dirs`.
|
||||||
|
- At least one project signal present (MANIFESTS / FRAMEWORK-DEPS /
|
||||||
|
TSX-JSX-COUNT > 0 / DOCKER-COUNT > 0 / EMBEDDED hits). Else print
|
||||||
|
`⚠️ No project signals detected — recommendations will be conservative.`
|
||||||
|
and continue.
|
||||||
|
- `CHECKPOINT toggle-script=UNAVAILABLE` → print `⚠️ toggle script
|
||||||
|
unavailable — recommendations will be advisory only, no auto-activation.`
|
||||||
|
and SKIP step 5 (apply) entirely.
|
||||||
|
- PROBE REPORT missing/unparsable → retry the probe ONCE fresh; a 2nd
|
||||||
|
failure → STOP and surface (never reason over invented detection).
|
||||||
|
|
||||||
|
## 3. REASON (dispatch — opus)
|
||||||
|
|
||||||
|
```
|
||||||
|
Agent(subagent_type="plugin-advisor", description="plugin gate — reason",
|
||||||
|
prompt="""
|
||||||
|
REQUEST: <the user's request / project description, verbatim>
|
||||||
|
PROBE REPORT (ground truth — do not re-detect):
|
||||||
|
<the full PROBE REPORT from step 1>
|
||||||
|
""")
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. PRESENT + BLOCKING GATE (main loop)
|
||||||
|
|
||||||
|
Show the returned PLUGIN CHECK block.
|
||||||
|
- `ACTION REQUIRED? YES` → offer: A) fix plugins B) type "force". STOP until
|
||||||
|
answered.
|
||||||
|
- OK → print `✅ Plugin check passed — [active plugins] — complexity: <score>%`.
|
||||||
|
|
||||||
|
## 5. APPLY GATE (main loop — only when the flow auto-activates)
|
||||||
|
|
||||||
|
If any plugin has ⚡ ENABLE status:
|
||||||
|
1. List the changes:
|
||||||
|
```
|
||||||
|
PROPOSED CHANGES:
|
||||||
|
⚡ Enable ui-ux-pro-max (frontend detected, complexity 65%)
|
||||||
|
⚡ Pre-fetch ctx7 docs for next.js, prisma
|
||||||
|
Apply these changes? (yes / no / customize)
|
||||||
|
```
|
||||||
|
2. "yes" → apply via the exact commands the advisor emitted. "customize" →
|
||||||
|
user picks. "no" → proceed with current config.
|
||||||
|
|
||||||
|
**Never auto-activate without showing the list and getting confirmation.**
|
||||||
|
|
||||||
|
### Rollback on partial failure
|
||||||
|
|
||||||
|
Track each toggle; roll back the partial set rather than leave a
|
||||||
|
half-applied configuration:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
applied=()
|
||||||
|
for change in "${PROPOSED_CHANGES[@]}"; do
|
||||||
|
if bash "$HOME/.claude/lib/toggle-external.sh" enable "$change"; then
|
||||||
|
applied+=("$change")
|
||||||
|
else
|
||||||
|
echo "❌ failed to enable $change — rolling back ${#applied[@]} prior change(s)"
|
||||||
|
for prior in "${applied[@]}"; do
|
||||||
|
bash "$HOME/.claude/lib/toggle-external.sh" disable "$prior" \
|
||||||
|
|| echo "⚠️ rollback of $prior also failed — manual cleanup required: see ~/.claude/plugins/cache"
|
||||||
|
done
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
Surface: `✅ Applied N change(s).` — or on failure:
|
||||||
|
|
||||||
|
```
|
||||||
|
⚠️ Toggle failed at change <name>. Rolled back the N prior change(s).
|
||||||
|
To inspect manually: ls ~/.claude/plugins/cache; bash ~/.claude/lib/toggle-external.sh list
|
||||||
|
Re-run /plugin-check after fixing the underlying cause (e.g. permissions).
|
||||||
|
```
|
||||||
@@ -81,6 +81,22 @@ has "skills/ship-feature/SKILL.md" 'model: "opus"'
|
|||||||
has "skills/init-project/SKILL.md" 'model: "opus"'
|
has "skills/init-project/SKILL.md" 'model: "opus"'
|
||||||
has "lib/model-gate.md" 'model: "fable"'
|
has "lib/model-gate.md" 'model: "fable"'
|
||||||
lacks "lib/model-gate.md" 'model: "sonnet" in the Agent call'
|
lacks "lib/model-gate.md" 'model: "sonnet" in the Agent call'
|
||||||
|
# 13) BDR-077 W2 — plugin split: probe (sonnet, facts only) + advisor
|
||||||
|
# reasoner (opus, PROBE REPORT is ground truth, fail-closed); gate
|
||||||
|
# include owns checkpoint + apply; 4 consumers run the include, none
|
||||||
|
# inline-loads the advisor anymore
|
||||||
|
has "agents/plugin-probe.md" 'model: sonnet'
|
||||||
|
lacks "agents/plugin-probe.md" 'AskUserQuestion'
|
||||||
|
has "agents/plugin-advisor.md" 'model: opus'
|
||||||
|
has "agents/plugin-advisor.md" 'PROBE REPORT'
|
||||||
|
lacks "agents/plugin-advisor.md" 'PHASE 1 — DETECT'
|
||||||
|
has "lib/plugin-gate.md" 'subagent_type="plugin-probe"'
|
||||||
|
has "lib/plugin-gate.md" 'subagent_type="plugin-advisor"'
|
||||||
|
for s in plugin-check onboard init-project ship-feature; do
|
||||||
|
has "skills/$s/SKILL.md" 'lib/plugin-gate.md'
|
||||||
|
# shellcheck disable=SC2016 # literal $HOME wanted: matching the exact inline-load string
|
||||||
|
lacks "skills/$s/SKILL.md" 'Load `$HOME/.claude/agents/plugin-advisor.md`'
|
||||||
|
done
|
||||||
|
|
||||||
printf 'model-routing census: %d pass, %d fail\n' "$pass" "$fail"
|
printf 'model-routing census: %d pass, %d fail\n' "$pass" "$fail"
|
||||||
[ "$fail" -eq 0 ]
|
[ "$fail" -eq 0 ]
|
||||||
|
|||||||
@@ -36,7 +36,8 @@ so the user does not assume Claude has hung.
|
|||||||
---
|
---
|
||||||
|
|
||||||
## STEP 0 — PLUGIN CHECK + AUTO-ACTIVATE
|
## STEP 0 — PLUGIN CHECK + AUTO-ACTIVATE
|
||||||
Load `$HOME/.claude/agents/plugin-advisor.md`. Feed request.
|
Run `$HOME/.claude/lib/plugin-gate.md`. Feed request (dispatch plugin-probe →
|
||||||
|
checkpoint → dispatch plugin-advisor; gates stay in this loop — BDR-077).
|
||||||
- ACTION REQUIRED → show RECOMMENDATIONS block, offer: A) fix plugins B) type "force". STOP.
|
- ACTION REQUIRED → show RECOMMENDATIONS block, offer: A) fix plugins B) type "force". STOP.
|
||||||
- PROPOSED CHANGES exist → show list, ask "Apply? (yes / no / customize)". Apply on confirm.
|
- PROPOSED CHANGES exist → show list, ask "Apply? (yes / no / customize)". Apply on confirm.
|
||||||
- OK → `✅ Plugin check passed — [active plugins] — complexity: <score>%`, continue.
|
- OK → `✅ Plugin check passed — [active plugins] — complexity: <score>%`, continue.
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ $ARGUMENTS
|
|||||||
|
|
||||||
## STEP 0 — PLUGIN CHECK + AUTO-ACTIVATE
|
## STEP 0 — PLUGIN CHECK + AUTO-ACTIVATE
|
||||||
|
|
||||||
Load `$HOME/.claude/agents/plugin-advisor.md` with hint "onboarding existing project + $ARGUMENTS".
|
Run `$HOME/.claude/lib/plugin-gate.md` with hint "onboarding existing project + $ARGUMENTS" (dispatch plugin-probe → checkpoint → dispatch plugin-advisor → gates in this loop, BDR-077).
|
||||||
|
|
||||||
- ACTION REQUIRED → show RECOMMENDATIONS block, offer: A) apply recos B) type "force". STOP.
|
- ACTION REQUIRED → show RECOMMENDATIONS block, offer: A) apply recos B) type "force". STOP.
|
||||||
- PROPOSED CHANGES exist → show list, ask "Apply? (yes / no / customize)". Apply on confirm.
|
- PROPOSED CHANGES exist → show list, ask "Apply? (yes / no / customize)". Apply on confirm.
|
||||||
|
|||||||
@@ -2,13 +2,19 @@
|
|||||||
name: plugin-check
|
name: plugin-check
|
||||||
description: 'Audit active plugins vs project needs. Read-only advisory recommending enable/disable. Triggers: "plugin-check", "quels plugins".'
|
description: 'Audit active plugins vs project needs. Read-only advisory recommending enable/disable. Triggers: "plugin-check", "quels plugins".'
|
||||||
argument-hint: '[ex: "React + FastAPI" or "Rust CLI, no frontend"]'
|
argument-hint: '[ex: "React + FastAPI" or "Rust CLI, no frontend"]'
|
||||||
allowed-tools: Read, Bash, Glob, Grep
|
allowed-tools: Read, Bash, Glob, Grep, Agent
|
||||||
---
|
---
|
||||||
|
|
||||||
Load and follow strictly: `$HOME/.claude/agents/plugin-advisor.md`.
|
Run `$HOME/.claude/lib/plugin-gate.md` on the context below — dispatch
|
||||||
|
plugin-probe (sonnet) → validation checkpoint → dispatch plugin-advisor
|
||||||
|
(opus) → present the PLUGIN CHECK block (BDR-077: detection and reasoning
|
||||||
|
dispatched, gates in this loop).
|
||||||
|
|
||||||
Analyze active plugins + context below, produce PLUGIN ADVISOR REPORT.
|
/plugin-check is READ-ONLY advisory: SKIP the gate's step 5 (apply) — show
|
||||||
|
the advisor's exact toggle commands for the user instead. Never write; user
|
||||||
|
toggles via `claude plugin enable/disable`.
|
||||||
|
|
||||||
If `$HOME/.claude/agents/plugin-advisor.md` unreachable: emit `Plugin advisor agent missing.` and STOP. Never write — user toggles via `claude plugin enable/disable`.
|
If `$HOME/.claude/lib/plugin-gate.md` unreachable: emit `Plugin gate include
|
||||||
|
missing.` and STOP.
|
||||||
|
|
||||||
$ARGUMENTS
|
$ARGUMENTS
|
||||||
|
|||||||
@@ -20,7 +20,8 @@ $ARGUMENTS
|
|||||||
---
|
---
|
||||||
|
|
||||||
## STEP 0 — PLUGIN CHECK + AUTO-ACTIVATE
|
## STEP 0 — PLUGIN CHECK + AUTO-ACTIVATE
|
||||||
Load `$HOME/.claude/agents/plugin-advisor.md`. Feed request.
|
Run `$HOME/.claude/lib/plugin-gate.md`. Feed request (dispatch plugin-probe →
|
||||||
|
checkpoint → dispatch plugin-advisor; gates stay in this loop — BDR-077).
|
||||||
- ACTION REQUIRED → show RECOMMENDATIONS block, offer: A) fix plugins B) type "force". STOP.
|
- ACTION REQUIRED → show RECOMMENDATIONS block, offer: A) fix plugins B) type "force". STOP.
|
||||||
- PROPOSED CHANGES exist → show list, ask "Apply? (yes / no / customize)". Apply on confirm.
|
- PROPOSED CHANGES exist → show list, ask "Apply? (yes / no / customize)". Apply on confirm.
|
||||||
- OK → `✅ Plugin check passed — [active plugins] — complexity: <score>%`, continue.
|
- OK → `✅ Plugin check passed — [active plugins] — complexity: <score>%`, continue.
|
||||||
|
|||||||
Reference in New Issue
Block a user