Mastermind Adapters Management

Install, enable, disable, and remove LLM adapter plugins per org using Mastermind. Supports claude-local, gemini-local, codex-local, cursor, and more.

Sby Skills Guide Bot
DevOpsIntermediate
208/30/2026
Claude CodeCursorCodex
#mastermind#adapters#plugin-management#llm#org-configuration

Recommended for


name: mastermind-adapters description: Mastermind adapters — install, enable, disable, reload, and remove LLM adapter plugins per org. Supports claude-local, gemini-local, codex-local, cursor, hermes, http, and custom adapters. type: domain-skill default_mode: confirm

Mastermind Adapters

This skill is invoked by mastermind:adapters or directly via /mastermind:adapters.


Inputs

  • brain_context: BRAIN CONTEXT block (injected by command, or loaded below if standalone)
  • org_name: org to manage adapters for (required)
  • action: list | enable | disable | install | remove | reload | set-default
  • adapter_type: adapter slug (e.g. claude-local, gemini-local, http) — required for most actions
  • package_name: npm package name or local path (required for install)
  • caller: command | master

Step 0 — Brain Load (standalone only)

If caller is not "command", load brain context following mastermind-protocol/SKILL.md Brain Load Procedure with namespace: ops.


Built-in Adapter Registry

| Type | Label | Source | Notes | |------|-------|--------|-------| | claude-local | Claude (local CLI) | built-in | Uses claude CLI | | claude-opus-4-7 | Claude Opus 4.7 | built-in | High capability | | claude-sonnet-4-6 | Claude Sonnet 4.6 | built-in | Balanced (default) | | claude-haiku-4-5 | Claude Haiku 4.5 | built-in | Fast, low cost | | gemini-local | Gemini (local) | built-in | Uses gemini CLI | | codex-local | Codex (local) | built-in | Uses codex CLI | | cursor | Cursor | built-in | Uses Cursor agent | | hermes-local | Hermes (local) | built-in | Local Hermes LLM | | http | HTTP Adapter | built-in | Generic HTTP endpoint | | acpx-local | ACPX (local) | built-in | ACPX protocol |


Step 1 — Load Adapter Registry

orgFile=".monomind/orgs/${org_name}.json"
[ ! -f "$orgFile" ] && { echo "ERROR: Org '${org_name}' not found."; exit 1; }

adaptersFile=".monomind/orgs/${org_name}-adapters.json"
if [ ! -f "$adaptersFile" ]; then
  # Bootstrap from org config adapter_config if present
  defaultModel=$(jq -r '.run_config.ceo_adapter // "claude-sonnet-4-6"' "$orgFile")
  cat > "$adaptersFile" <<EOF
{
  "org": "${org_name}",
  "default_adapter": "${defaultModel}",
  "adapters": [
    {"type":"claude-local","label":"Claude (local CLI)","source":"built-in","disabled":false,"modelsCount":3},
    {"type":"gemini-local","label":"Gemini (local)","source":"built-in","disabled":false,"modelsCount":1},
    {"type":"http","label":"HTTP Adapter","source":"built-in","disabled":true,"modelsCount":0}
  ]
}
EOF
fi

Step 2 — Execute Action

list (default)

echo "ADAPTERS — org: $org_name"
echo "──────────────────────────────────────────────────────"
printf "%-22s %-28s %-10s %-8s %s\n" "TYPE" "LABEL" "SOURCE" "MODELS" "STATUS"
echo "──────────────────────────────────────────────────────"

defaultAdap=$(jq -r '.default_adapter // "claude-sonnet-4-6"' "$adaptersFile")

jq -r --arg def "$defaultAdap" '
  (.adapters // [])[] |
  [.type, (.label // .type), (.source // "built-in"), (.modelsCount // 0 | tostring),
   (if .disabled then "DISABLED" else "ACTIVE" end),
   (if .type == $def then " ← default" else "" end)]
  | @tsv
' "$adaptersFile" | while IFS=$'\t' read -r type label source models status def; do
  printf "%-22s %-28s %-10s %-8s %s%s\n" "$type" "$label" "$source" "$models" "$status" "$def"
done

echo ""
echo "Default adapter: $defaultAdap"
echo "External adapters: $(jq '[(.adapters // [])[] | select(.source == "external")] | length' "$adaptersFile")"

enable / disable

action_status=$([ "$action" = "enable" ] && echo "false" || echo "true")
tmp="${adaptersFile}.tmp"
jq --arg type "$adapter_type" --argjson dis "$action_status" \
  '.adapters = [(.adapters // [])[] | if .type == $type then .disabled = $dis else . end]' \
  "$adaptersFile" > "$tmp" && mv "$tmp" "$adaptersFile"

# If re-enabling, also check org config adapter_config for matching roles
echo "Adapter '$adapter_type' → $([ "$action" = "enable" ] && echo 'ACTIVE' || echo 'DISABLED')"

install

Add an external adapter (npm package or local path):

[ -z "$package_name" ] && { echo "ERROR: --package-name required."; exit 1; }
[ -z "$adapter_type" ] && adapter_type=$(echo "$package_name" | sed 's/[@/].*$//' | tr '-' '_')

isLocal=false
[[ "$package_name" == /* || "$package_name" == "./"* ]] && isLocal=true

tmp="${adaptersFile}.tmp"
jq --arg type "$adapter_type" \
   --arg pkg "$package_name" \
   --argjson local "$isLocal" \
   '.adapters = [(.adapters // [])[] | select(.type != $type)] +
    [{"type":$type,"label":$pkg,"source":"external","packageName":$pkg,"isLocalPath":$local,
      "disabled":false,"modelsCount":0,"installedAt":(now|todate)}]' \
  "$adaptersFile" > "$tmp" && mv "$tmp" "$adaptersFile"
echo "Installed: $package_name as adapter type '$adapter_type'"
echo "NOTE: Restart the org run to activate the new adapter."

remove

[ -z "$adapter_type" ] && { echo "ERROR: --adapter-type required."; exit 1; }

# Verify it's external
src=$(jq -r --arg t "$adapter_type" '(.adapters // [])[] | select(.type == $t) | .source' "$adaptersFile" 2>/dev/null)
[ "$src" = "built-in" ] && { echo "ERROR: Cannot remove built-in adapters. Use 'disable' instead."; exit 1; }
[ -z "$src" ] && { echo "ERROR: Adapter '$adapter_type' not found."; exit 1; }

tmp="${adaptersFile}.tmp"
jq --arg type "$adapter_type" '.adapters = [(.adapters // [])[] | select(.type != $type)]' \
  "$adaptersFile" > "$tmp" && mv "$tmp" "$adaptersFile"
echo "Removed adapter: $adapter_type"

set-default

[ -z "$adapter_type" ] && { echo "ERROR: --adapter-type required."; exit 1; }
tmp="${adaptersFile}.tmp"
jq --arg type "$adapter_type" '.default_adapter = $type' "$adaptersFile" > "$tmp" && mv "$tmp" "$adaptersFile"
# Sync to org run_config as well
orgTmp="${orgFile}.tmp"
jq --arg model "$adapter_type" '.run_config.ceo_adapter = $model' "$orgFile" > "$orgTmp" && mv "$orgTmp" "$orgFile"
echo "Default adapter set to: $adapter_type"

reload

Force a reload hint (marks adapter as needing restart):

tmp="${adaptersFile}.tmp"
jq --arg type "$adapter_type" --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
  '.adapters = [(.adapters // [])[] | if .type == $type then .last_reload = $ts else . end]' \
  "$adaptersFile" > "$tmp" && mv "$tmp" "$adaptersFile"
echo "Marked adapter '$adapter_type' for reload. Restart the org run to apply."

Step 3 — Return Output

domain: ops
status: complete
action: <action>
org: <org_name>
adapter_type: <adapter_type if applicable>

Step 4 — Brain Write (standalone only)

If caller is not "command", follow mastermind-protocol/SKILL.md Brain Write Procedure for domain ops.

Related skills