Skip to content
Back to skills

Mastermind Invite Landing

BSecurity

Mastermind invite-landing — bookkeeping only — not enforced by the Org Runtime. Records accepting an org invite as a human or agent member in a side file.

  • 21 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added September 10, 2026
ai-agentsgobash

Works with

  • cursor
  • cli

Security analysis

B88/100
  • criticalSends environment variables or credentials to an external URL

Pro shows the line behind each finding and how to fix it

Scanned October 1, 2026

npx -y skills add monoes/monomind --skill mastermind-invite-landing --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Mastermind Invite Landing?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Mastermind Invite Landing
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/monoes-mastermind-invite-landing/badge)](https://www.skillsdirectory.com/skills/monoes-mastermind-invite-landing)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: mastermind-invite-landing
description: "Mastermind invite-landing — bookkeeping only — not enforced by the Org Runtime. Records accepting an org invite as a human or agent member in a side file."
type: domain-skill
default_mode: confirm
pick: low
---

# Mastermind Invite Landing

This skill is invoked directly via `/mastermind-invite-landing`.

**Bookkeeping only — not enforced by the Org Runtime.** It writes `.monomind/orgs/<org>-members.json`, which no runtime code reads: joining grants no access. An agent join also appends a role stub to the org definition — check it with `monomind org validate` before running the org.

---

## Inputs

- `brain_context`: BRAIN CONTEXT block (injected by command, or loaded below if standalone)
- `action`: show | accept-human | accept-agent | status
- `token`: invite token (required; extract from monomind://invite?... URL or share link)
- `org_name`: org name (required unless extractable from token record)
- `join_as`: human | agent (for accept actions; default: agent in CLI context)
- `display_name`: human display name (for accept-human)
- `email`: email address (for accept-human)
- `agent_name`: agent display name (for accept-agent)
- `adapter_type`: claude-local | gemini-local | codex-local | cursor | opencode | hermes | http | acpx (for accept-agent; default: claude-local)
- `model`: model override (for accept-agent; uses adapter default if omitted)
- `caller`: command | master

---

## Join Modes

| Mode | Who | Required Fields |
|------|-----|-----------------|
| `human` | A human operator joining the org | `display_name`, `email` |
| `agent` | An AI agent joining the org | `agent_name`, `adapter_type` |

---

## 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`.

---

## Step 1 — Validate Token

```bash
[ -z "$token" ] && { echo "ERROR: --token required. Extract from invite URL: monomind://invite?org=...&token=...&role=..."; exit 1; }

# Try to find org from token if org_name not given
if [ -z "$org_name" ]; then
  # Search all members files for a matching invite token
  for mf in .monomind/orgs/*-members.json; do
    [ -f "$mf" ] || continue
    match=$(jq -r --arg t "$token" '(.join_requests // [])[] | select(.token == $t or .id == $t) | .id' "$mf" 2>/dev/null | head -1)
    if [ -n "$match" ]; then
      org_name=$(basename "$mf" "-members.json")
      break
    fi
  done
  [ -z "$org_name" ] && { echo "ERROR: Could not find org for token '$token'. Specify --org-name explicitly."; exit 1; }
fi

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

inviteDef=$(jq -r --arg t "$token" \
  '(.join_requests // [])[] | select((.token == $t or .id == $t) and .type == "invite")' \
  "$membersFile" | head -c 4096)
[ -z "$inviteDef" ] && { echo "ERROR: Invite token '$token' not found or already used."; exit 1; }

inviteStatus=$(echo "$inviteDef" | jq -r '.status // "pending"')
inviteRole=$(echo "$inviteDef" | jq -r '.role // "operator"')
```

---

## Step 2 — Execute Action

### show (default)

```bash
echo "INVITE — org: $org_name"
echo "────────────────────────────────────────────────────────"
echo "  Token:    ${token:0:16}…"
echo "  Role:     $inviteRole"
echo "  Status:   $inviteStatus"

inviteCreatedAt=$(echo "$inviteDef" | jq -r '.createdAt // "-"')
echo "  Created:  $inviteCreatedAt"
echo ""

if [ "$inviteStatus" = "revoked" ]; then
  echo "  This invite has been revoked and can no longer be used."
elif [ "$inviteStatus" = "accepted" ]; then
  echo "  This invite has already been accepted."
else
  echo "  To join as an agent (default in CLI):"
  echo "    --action accept-agent --token $token --org-name $org_name --agent-name 'My Agent' --adapter-type claude-local"
  echo ""
  echo "  To join as a human:"
  echo "    --action accept-human --token $token --org-name $org_name --display-name 'Your Name' --email 'you@example.com'"
fi
```

### accept-human

```bash
[ "$inviteStatus" != "pending" ] && { echo "ERROR: Invite status is '$inviteStatus' — cannot accept."; exit 1; }
[ -z "$display_name" ] && { echo "ERROR: --display-name required for human join."; exit 1; }
[ -z "$email" ] && { echo "ERROR: --email required for human join."; exit 1; }

ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)
memberId="human-$(echo "${email}" | tr '[:upper:]' '[:lower:]' | tr -cs 'a-z0-9' '-' | sed 's/^-//;s/-$//')"

tmp="${membersFile}.tmp"
# Mark invite accepted and add member record
jq --arg token "$token" --arg mid "$memberId" --arg name "$display_name" \
   --arg email "$email" --arg role "$inviteRole" --arg ts "$ts" \
  '.join_requests = [(.join_requests // [])[] | if (.token == $token or .id == $token) then
     .status = "accepted" | .acceptedAt = $ts | .acceptedAs = "human"
   else . end] |
   .members += [{"id":$mid,"displayName":$name,"email":$email,"role":$role,
     "memberType":"human","status":"active","joinedAt":$ts}]' \
  "$membersFile" > "$tmp" && mv "$tmp" "$membersFile"

echo "JOINED as human: $display_name"
echo "  Member ID:  $memberId"
echo "  Role:       $inviteRole"
echo "  Org:        $org_name"
echo "  Email:      $email"
echo "  Joined at:  $ts"
```

### accept-agent

```bash
[ "$inviteStatus" != "pending" ] && { echo "ERROR: Invite status is '$inviteStatus' — cannot accept."; exit 1; }
[ -z "$agent_name" ] && { echo "ERROR: --agent-name required for agent join."; exit 1; }

adapterType="${adapter_type:-claude-local}"
case "$adapterType" in
  claude-local|gemini-local|codex-local|cursor|opencode-local|hermes-local|http|acpx) : ;;
  *) echo "ERROR: Unknown adapter type '$adapterType'. Choose: claude-local, gemini-local, codex-local, cursor, opencode-local, hermes-local, http, acpx"; exit 1 ;;
esac

# Resolve default model
modelId="${model}"
if [ -z "$modelId" ]; then
  case "$adapterType" in
    claude-local)   modelId="claude-sonnet-5" ;;
    gemini-local)   modelId="gemini-2.0-flash" ;;
    codex-local)    modelId="gpt-4o" ;;
    cursor)         modelId="cursor-default" ;;
    opencode-local) modelId="opencode-default" ;;
    hermes-local)   modelId="hermes-3" ;;
    *)              modelId="custom" ;;
  esac
fi

# Generate agent slug
agentSlug=$(echo "$agent_name" | tr '[:upper:]' '[:lower:]' | tr -cs 'a-z0-9' '-' | sed 's/^-//;s/-$//')
agentId="agent-${agentSlug}"
ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)

# Add to members file
tmp="${membersFile}.tmp"
jq --arg token "$token" --arg mid "$agentId" --arg name "$agent_name" \
   --arg role "$inviteRole" --arg adapter "$adapterType" --arg model "$modelId" --arg ts "$ts" \
  '.join_requests = [(.join_requests // [])[] | if (.token == $token or .id == $token) then
     .status = "accepted" | .acceptedAt = $ts | .acceptedAs = "agent"
   else . end] |
   .members += [{"id":$mid,"displayName":$name,"role":$role,
     "memberType":"agent","adapter":{"type":$adapter,"model":$model},
     "status":"active","joinedAt":$ts}]' \
  "$membersFile" > "$tmp" && mv "$tmp" "$membersFile"

# Also append a role stub to the org definition (validate it with `monomind org validate` before running)
orgFile=".monomind/orgs/${org_name}.json"
if [ -f "$orgFile" ]; then
  dupCheck=$(jq -r --arg id "$agentId" '[(.roles // [])[] | select(.id == $id)] | length' "$orgFile")
  if [ "$dupCheck" -eq 0 ]; then
    tmp2="${orgFile}.tmp"
    jq --arg id "$agentId" --arg title "$agent_name" \
       --arg adapter "$adapterType" --arg model "$modelId" --arg ts "$ts" \
      '.roles += [{"id":$id,"title":$title,"adapter":{"type":$adapter,"model":$model,"max_tokens":8192},
        "reports_to":null,"governance":null,"skills":[],"created_at":$ts}]' \
      "$orgFile" > "$tmp2" && mv "$tmp2" "$orgFile"
  fi
fi

echo "JOINED as agent: $agent_name"
echo "  Agent ID:    $agentId"
echo "  Role:        $inviteRole"
echo "  Adapter:     $adapterType / $modelId"
echo "  Org:         $org_name"
echo "  Joined at:   $ts"
echo ""
echo "  View agent: /mastermind-agent-detail --org $org_name --agent-id $agentId"
```

### status

```bash
echo "INVITE STATUS — token: ${token:0:16}…"
echo "────────────────────────────────────────────────────────"
echo "$inviteDef" | jq '{status, role, createdAt, acceptedAt, acceptedAs}'
```

---

## Step 3 — Return Output

```yaml
domain: ops
status: complete
action: <action>
org: <org_name>
invite_status: <status>
role: <role>
```

---

## Step 4 — Brain Write (standalone only)

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

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.