extract-profiles
# Extract Member Profiles
What this skill does
# Extract Member Profiles
Automatically extract member profiles from synced Discord/Telegram messages using heuristic classification.
## When to Use
- User asks to "extract profiles" or "build member profiles"
- User wants to "populate profiles from messages" or "analyze member activity"
- User asks to "create profiles from chat history"
- After syncing a server's messages for the first time
- When user wants to understand who's active in a community
## Smart Defaults
| User Says | Default Action |
|-----------|----------------|
| "extract profiles from TopMediai" | Extract from server 1092630146143506494 |
| "build member profiles" | Extract with incremental mode (only new messages) |
| "re-extract all profiles" | Extract with --full flag |
| "what would be extracted?" | Run with --dry-run |
## Commands
### Extract Profiles from Server
```bash
python {{PLUGIN_DIR}}/tools/extract_profiles.py extract \
--server 1092630146143506494 \
--platform discord
```
**Parameters:**
- `--server`: Required. Server ID (numeric portion only, e.g., "1092630146143506494")
- `--platform`: Optional. Platform identifier (`discord` or `telegram`). Default: discord
- `--full`: Optional. Process all messages (ignore incremental state)
- `--dry-run`: Optional. Show what would be extracted without saving
- `--min-messages`: Optional. Minimum messages to create a profile (default: 3)
- `--json`: Optional. Output in JSON format
### Check Extraction Status
```bash
python {{PLUGIN_DIR}}/tools/extract_profiles.py status \
--server 1092630146143506494 \
--platform discord
```
Shows:
- Last extraction timestamp
- Channels processed
- New messages since last extraction
### Reset Extraction State
```bash
python {{PLUGIN_DIR}}/tools/extract_profiles.py reset \
--server 1092630146143506494 \
--force
```
Resets the incremental state, causing full re-extraction on next run.
## How It Works
### Message Classification
The extractor classifies each message into types:
| Type | Detection Method | Example |
|------|------------------|---------|
| Question | Contains "?" or question words | "How do I use the API?" |
| Issue Report | Contains "not working", "error", "bug" | "Getting 500 error on webhooks" |
| Expertise | Reply containing code or solution | "Try using async/await here" |
| Introduction | In intro channel + "I'm a/I work" | "Hi, I'm a backend developer" |
| High Engagement | 5+ reactions | Popular posts |
| Feature Request | "would be nice", "please add" | "Could you add dark mode?" |
| Feedback | "love it", "great", or negative sentiment | "This tool is awesome!" |
### Generated Observations
Based on activity, the extractor generates observations like:
- `Active in #api-issues, #general (42 messages); topics: API, billing, webhook`
- `Self-intro: Hi everyone, I'm a backend developer working on...`
- `Asked 5 questions about: authentication, rate limits, pricing`
- `Reported issue: webhooks returning 500 error when...`
- `Helped others 3 times; expertise: OAuth, API integration`
- `Popular post (15 reactions): Tip: You can use...`
### Incremental Processing
The extractor tracks state per server:
- Remembers last processed date per channel
- Only processes new messages on subsequent runs
- Use `--full` to force complete re-extraction
## Examples
### First-time extraction for a server
```bash
# Check what data is available
python {{PLUGIN_DIR}}/tools/extract_profiles.py status \
--server 1092630146143506494
# Do a dry run first
python {{PLUGIN_DIR}}/tools/extract_profiles.py extract \
--server 1092630146143506494 \
--dry-run
# If looks good, run for real
python {{PLUGIN_DIR}}/tools/extract_profiles.py extract \
--server 1092630146143506494
```
### Re-extract after new messages synced
```bash
# Check for new messages
python {{PLUGIN_DIR}}/tools/extract_profiles.py status \
--server 1092630146143506494
# Extract only new messages (default behavior)
python {{PLUGIN_DIR}}/tools/extract_profiles.py extract \
--server 1092630146143506494
```
### Force full re-extraction
```bash
# Reset state first
python {{PLUGIN_DIR}}/tools/extract_profiles.py reset \
--server 1092630146143506494 \
--force
# Or use --full flag
python {{PLUGIN_DIR}}/tools/extract_profiles.py extract \
--server 1092630146143506494 \
--full
```
### Check created profiles
After extraction, use the member-profile skill to view profiles:
```bash
# List all profiles
python {{PLUGIN_DIR}}/tools/member_profile.py list --platform discord
# Get a specific profile
python {{PLUGIN_DIR}}/tools/member_profile.py get \
--platform discord \
--member-id 1349572197227827261
```
## Storage
### Extraction State
State is stored at:
```
profiles/{platform}/.extraction_state_{server_id}.yaml
```
### Profiles
Profiles are stored at:
```
profiles/{platform}/{member_id}.yaml
```
## Limits
- **Min messages**: Default 3 messages required to create a profile
- **Max observations per run**: 10 observations added per member per extraction
- **Profile observation limit**: 50 total (oldest trimmed automatically)
## Notes
- Extraction is **additive** - it adds observations to existing profiles
- Running extraction multiple times won't create duplicate observations
- Use `--dry-run` to preview changes before committing
- The `--full` flag reprocesses all messages but still adds to existing profiles
- To start fresh, delete the profile files manually before extracting
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.