claude/lib/detect-plugins.sh
bastien 66beae16b7 auto-detect plan, complexity scoring, ctx7 cache, graphify in workflows
- detect_plan() auto-detects Max/Pro/Free from ~/.claude.json
- session-start budget adapts to plan (Max=20k, Pro=11k, Free=5k)
- token counting now uses only ACTIVE plugins, not installed binaries
- statusline shows plan label + session duration instead of start time
- plugin-advisor: complexity assessment (0-100%) drives tool selection
- plugin-advisor: auto-activation with confirmation (PHASE 4)
- ruflo OFF by default, GSD v2 preferred for multi-session
- init-project: ctx7 pre-fetch + graphify scaffold + graphify full
- ship-feature: ctx7 cache check before implementation
- frontend-design disabled in installer (doublon with ui-ux-pro-max)
- python3 -c moved from deny to ask (unblocks graphify)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-12 14:56:22 +02:00

105 lines
2.9 KiB
Bash

#!/usr/bin/env bash
# ============================================================
# lib/detect-plugins.sh — Single source of truth for plugin detection
# Sourced by: session-start.sh, doctor.sh, install-plugins.sh
#
# Each function returns 0 (detected) or 1 (not detected).
# No output — callers handle messaging.
# ============================================================
# --- Always-on plugins ---
detect_rtk() {
command -v rtk &>/dev/null
}
detect_superpowers() {
# Fast check: filesystem (plugin cache)
local cache_dir="$HOME/.claude/plugins/cache"
if [ -d "$cache_dir" ]; then
ls "$cache_dir" 2>/dev/null | grep -qi "superpowers" && return 0
fi
# Slow fallback: CLI (only if fast check fails)
claude plugin list 2>/dev/null | grep -qi "superpowers" && return 0
return 1
}
detect_security_guidance() {
local cache_dir="$HOME/.claude/plugins/cache"
[ -d "$cache_dir" ] && ls "$cache_dir" 2>/dev/null | grep -qi "security-guidance"
}
# --- Toggle plugins ---
detect_gstack() {
[ -d "$HOME/.claude/skills/gstack" ]
}
detect_gsd() {
# GSD v2 (gsd-pi) is a standalone CLI, not a Claude Code plugin.
# Detection: check for 'gsd' binary in PATH.
command -v gsd &>/dev/null
}
detect_frontend_design() {
local cache_dir="$HOME/.claude/plugins/cache"
[ -d "$cache_dir" ] && ls "$cache_dir" 2>/dev/null | grep -qi "frontend-design"
}
detect_plugin_dev() {
# plugin-dev replaces the old "skill-creator" reference
local cache_dir="$HOME/.claude/plugins/cache"
[ -d "$cache_dir" ] && ls "$cache_dir" 2>/dev/null | grep -qi "plugin-dev"
}
detect_uiux_pro_max() {
local cache_dir="$HOME/.claude/plugins/cache"
[ -d "$cache_dir" ] && ls "$cache_dir" 2>/dev/null | grep -qi "ui-ux-pro-max"
}
detect_context7() {
# Context7 CLI (ctx7) — installed globally via npm
command -v ctx7 &>/dev/null
}
detect_ruflo() {
# Ruflo CLI — installed globally via npm
command -v ruflo &>/dev/null
}
detect_graphifyy() {
# Graphifyy — codebase knowledge graph, installed via pipx
command -v graphify &>/dev/null
}
# --- Plan detection ---
detect_plan() {
# Detect Claude plan: max, pro, or free.
# Checks ~/.claude.json for model access hints.
# Returns plan name on stdout, always exits 0.
local claude_json="$HOME/.claude.json"
if [ -f "$claude_json" ]; then
# Max plan: has opus model access or max flag
if grep -q '"planType".*"max"' "$claude_json" 2>/dev/null; then
echo "max"; return 0
fi
# Check cached features for max indicators
if grep -q '"tengu_cobalt_compass": true' "$claude_json" 2>/dev/null \
&& grep -q '"tengu_harbor": true' "$claude_json" 2>/dev/null; then
echo "max"; return 0
fi
fi
# Fallback: check if claude CLI reports plan
local plan
plan=$(claude config get planType 2>/dev/null || true)
case "$plan" in
max|Max|MAX) echo "max" ;;
pro|Pro|PRO) echo "pro" ;;
free|Free|FREE) echo "free" ;;
*) echo "pro" ;; # default assumption
esac
}