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-defaultadapter_type: adapter slug (e.g.claude-local,gemini-local,http) — required for most actionspackage_name: npm package name or local path (required forinstall)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.
Architecte Docker Compose
DevOps
Concoit des configurations Docker Compose optimisees.
Rapport de Post-Mortem
DevOps
Rédige des rapports post-mortem d'incidents structurés et blameless.
Créateur de Runbooks
DevOps
Crée des runbooks opérationnels clairs pour les procédures DevOps courantes.