Skip to content
Back to skills

Me

BSecurity

Show your profile or change how you're known across Egregore.

  • 280 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added May 27, 2026
data-aigobashnodegitapi

Works with

  • api

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 May 27, 2026

npx -y skills add egregore-labs/egregore --skill me --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Me?

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

Security grade badge for Me
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/egregore-labs-me/badge)](https://www.skillsdirectory.com/skills/egregore-labs-me)

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
# /me — View or set your display name

Show your profile or change how you're known across Egregore.

## When to invoke

- "who am I", "my profile", "my name", "what's my name"
- "call me oz", "I go by cem", "change my name to X"
- User runs `/me` or `/me <name>`

## Mode detection

```bash
MODE=$(jq -r '.mode // "connected"' egregore.json 2>/dev/null)
```

**Local mode** (`mode === "local"`): Skip ALL `bin/graph.sh` calls — do NOT run them. Do NOT show any graph-related messaging (Person node, "synced to graph", Neo4j, orphan merge, etc.). `/me` in local mode is file-based only: read `memory/people/{github}.md` for the profile, update the `# {display_name}` header + the `.egregore-state.json` display_name field when setting a name. Skip uniqueness check against the graph (optional TODO: check against other `memory/people/*.md` files).

## Behavior

### No arguments → Show profile

```bash
AUTHOR=$(jq -r '.github_username // empty' .egregore-state.json 2>/dev/null)
DISPLAY_NAME=$(jq -r '.display_name // empty' .egregore-state.json 2>/dev/null)
```

**Connected mode:** Query the graph for the full Person node:
```bash
RESULT=$(bash bin/graph.sh query "MATCH (p:Person {github: \$gh}) RETURN p.name AS name, p.github AS github, p.fullName AS fullName, p.telegramUsername AS telegram" "{\"gh\":\"$AUTHOR\"}" 2>/dev/null)
```

**Local mode:** Read from people file:
```bash
PEOPLE_FILE="memory/people/${AUTHOR}.md"
FILE_NAME=$(head -1 "$PEOPLE_FILE" 2>/dev/null | sed 's/^# //')
ROLE=$(grep '^Role:' "$PEOPLE_FILE" 2>/dev/null | cut -d: -f2- | xargs)
```

Display:
```
  Name: {display_name or file header name}
  GitHub: {github_username}
  Role: {role or "not set"}
```

### With argument → Set display name

`$ARGUMENTS` is the new display name.

**Validate:**
1. Length: 1-30 characters
2. Characters: alphanumeric, spaces, hyphens only (`^[a-zA-Z0-9 -]+$`)
3. If validation fails, tell the user what's wrong and stop.

**Check uniqueness** — no other Person node should have the same name (case-insensitive):

```bash
AUTHOR=$(jq -r '.github_username // empty' .egregore-state.json 2>/dev/null)
RESULT=$(bash bin/graph.sh query "MATCH (p:Person) WHERE toLower(p.name) = toLower(\$name) AND p.github <> \$gh RETURN p.name AS name, p.github AS github LIMIT 1" "{\"name\":\"$ARGUMENTS\",\"gh\":\"$AUTHOR\"}" 2>/dev/null)
```

If a match is found: `"That name is already taken by {github}. Pick something else."`

**Update** (all five in parallel):

1. **State file:**
   ```bash
   jq --arg dn "$ARGUMENTS" '.display_name = $dn' .egregore-state.json > .egregore-state.json.tmp && mv .egregore-state.json.tmp .egregore-state.json
   ```

2. **People file** (canonical in local mode):
   ```bash
   PEOPLE_FILE="memory/people/${AUTHOR}.md"
   if [ -f "$PEOPLE_FILE" ]; then
     sed -i '' "1s/^# .*/# $ARGUMENTS/" "$PEOPLE_FILE" 2>/dev/null \
       || sed -i "1s/^# .*/# $ARGUMENTS/" "$PEOPLE_FILE"
   fi
   ```

4. **Neo4j — update name + store previous name (connected mode only):**
   ```bash
   bash bin/graph.sh query "MATCH (p:Person {github: \$gh}) WITH p, p.name AS oldName SET p.name = \$name, p.previousNames = CASE WHEN oldName IS NOT NULL AND oldName <> \$name THEN coalesce(p.previousNames, []) + oldName ELSE coalesce(p.previousNames, []) END RETURN p.name" "{\"gh\":\"$AUTHOR\",\"name\":\"$ARGUMENTS\"}"
   ```

5. **Neo4j — merge orphaned duplicate (connected mode only)** (absorb any Person node with the new name that has no github):
   ```bash
   bash bin/graph.sh query "MATCH (real:Person {github: \$gh}), (orphan:Person) WHERE toLower(orphan.name) = toLower(\$name) AND (orphan.github IS NULL OR orphan.github = '') AND orphan <> real WITH real, orphan OPTIONAL MATCH (s1)-[:BY]->(orphan) FOREACH (_ IN CASE WHEN s1 IS NOT NULL THEN [1] ELSE [] END | MERGE (s1)-[:BY]->(real)) WITH real, orphan OPTIONAL MATCH (s2)-[:HANDED_TO]->(orphan) FOREACH (_ IN CASE WHEN s2 IS NOT NULL THEN [1] ELSE [] END | MERGE (s2)-[:HANDED_TO]->(real)) WITH real, orphan OPTIONAL MATCH (m)-[:INVOLVES]->(orphan) FOREACH (_ IN CASE WHEN m IS NOT NULL THEN [1] ELSE [] END | MERGE (m)-[:INVOLVES]->(real)) WITH real, orphan OPTIONAL MATCH (a)-[:CONTRIBUTED_BY]->(orphan) FOREACH (_ IN CASE WHEN a IS NOT NULL THEN [1] ELSE [] END | MERGE (a)-[:CONTRIBUTED_BY]->(real)) WITH real, orphan OPTIONAL MATCH (i)-[:CONDUCTED_BY]->(orphan) FOREACH (_ IN CASE WHEN i IS NOT NULL THEN [1] ELSE [] END | MERGE (i)-[:CONDUCTED_BY]->(real)) WITH real, orphan DETACH DELETE orphan RETURN 'merged' AS status" "{\"gh\":\"$AUTHOR\",\"name\":\"$ARGUMENTS\"}" 2>/dev/null || true
   ```
   This is best-effort — transfers known relationship types from the orphan to the real node, then deletes the orphan.

6. **Supabase (connected mode only)** (via API, non-blocking):
   ```bash
   API_URL=$(jq -r '.api_url // empty' egregore.json)
   API_KEY=$(grep '^EGREGORE_API_KEY=' .env | cut -d'=' -f2-)
   curl -sf "${API_URL}/api/user/ensure" \
     -H "Authorization: Bearer $API_KEY" \
     -H "Content-Type: application/json" \
     -d "{\"github_username\":\"$AUTHOR\",\"display_name\":\"$ARGUMENTS\"}" \
     --max-time 5 2>/dev/null || true
   ```

**Confirm:** `You're now known as **{name}**.`

## Rules

- All Neo4j via `bin/graph.sh`
- Never show raw JSON to the user
- Suppress bash output — only show formatted status

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…