From career-navigator
Surfaces prior email and Google Calendar / M365 calendar context when tools allow—read-only, user-approved. Includes past and upcoming meetings with a contact for meeting-history awareness and warm-networking identification (e.g. scheduled sync = warm relationship signal). If the user says they sent mail but the address was wrong, trust them and help find a better address (Gmail MCP is unreliable for bounces). Feeds draft-outreach and writer with a ContactContextBrief.
npx claudepluginhub tmargolis/career-navigator --plugin career-navigatorThis skill uses the workspace's default tool permissions.
Gather **evidence-backed** context from **Gmail** / **Microsoft 365** (and **calendar** when the host exposes it) so **`draft-outreach`** and **`writer`** do not guess about prior conversations.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Builds scalable data pipelines, modern data warehouses, and real-time streaming architectures using Spark, dbt, Airflow, Kafka, and cloud platforms like Snowflake, BigQuery.
Builds production Apache Airflow DAGs with best practices for operators, sensors, testing, and deployment. For data pipelines, workflow orchestration, and batch job scheduling.
Gather evidence-backed context from Gmail / Microsoft 365 (and calendar when the host exposes it) so draft-outreach and writer do not guess about prior conversations.
Meeting history awareness (warm networking identification): When calendar tools are used, retrieve past and scheduled (upcoming) events involving this contact. An upcoming meeting on the calendar is a strong signal the relationship is warm (not cold)—outreach can reference the scheduled time or avoid redundant “first touch” framing. A past meeting without a future one still supports warm follow-up. Label uncertainty in caveats if attendee matching is fuzzy.
/career-navigator:launch Step 6—do not invent inbox or calendar access.“I can search your mail for threads involving {name or company} [and check your calendar for past and upcoming meetings with them / their email]—read-only. Approve for this request?”
(Include the bracketed calendar sentence only when calendar tools exist and the user wants meeting context.)
If the host exposes only mail or only calendar, ask only for that scope. If no, exit with a short note—no fabricated summaries.
If the user says they sent an email (or it bounced / failed / wrong address), believe them. Do not spend the session trying to prove delivery or find a bounce/NDR via the Gmail MCP — it is a poor fit for that (operators often don’t apply; results can look like random Inbox/Sent).
Instead, pivot immediately to helping them find a correct email address (or a short list of evidence-backed candidates) for this contact:
tracker.json / profile.md — any stored email, title, or company for this person.Firstname Lastname, company, to: / from: with a simple address or domain (one clause at a time). Look at Sent and Inbox for real threads (signatures, forwards, calendar invites), not mailer-daemon unless the user explicitly asks you to hunt a bounce.first.last, firstlast, flast — label each as guess vs cited from a source.email_address_notes; explain in search_method_notes that bounce search was skipped (MCP limitation) and the user’s send attempt is taken at their word.Optional bounce lookup: Only if the user explicitly asks you to find the bounce message and approves spending time on it: try from:mailer-daemon (single token) and read a few recent system messages for this address/name — but do not treat “no result” as proof of anything. Prefer the user pasting the bounce from Gmail web if needed.
If step 2 (below) doesn’t surface a clear thread, search mail for the contact’s full name as plain text (e.g. Jordan Kim), then name + company. Prefer All Mail / broad scope when the tool allows.
{user_dir}/CareerNavigator/profile.md and tracker.json (applications[].contacts[], networking[]) for any known facts about this person—do not contradict tracker evidence. If inbox tools are missing in this session, skip mail search below and note in caveats. If calendar tools are missing, skip the calendar step and set calendar_notes, upcoming_meetings, and warm_networking to "—" or not searched — no calendar tools as appropriate.hooks_for_writer (e.g. “Upcoming 1:1 Thu—short ping to confirm or share prep,” not a cold intro).
Read-only: do not create, move, or delete events unless the user explicitly asks outside this skill’s scope.writer / draft-outreach.draft-outreach next with this context folded in?” If yes, pass the brief into the next step (user can run /career-navigator:draft-outreach or continue in chat).## ContactContextBrief
- **contact:** {name or best label}
- **company:** {company or "—"}
- **sources_used:** gmail | microsoft_365 | calendar | none (list all that were actually queried)
- **as_of:** {YYYY-MM-DD}
- **summary:** {2–6 bullets: substance of prior exchanges and, if used, calendar context}
- **calendar_notes:** {**Past** meetings with this contact—dates, titles, commitments from descriptions—or "—" if none}
- **upcoming_meetings:** {**Scheduled** future events with this contact—date, time if known, title—or "—" if none / not searched}
- **warm_networking:** {one line: e.g. `warm — upcoming meeting scheduled` | `warm — past 1:1 only` | `uncertain — calendar partial` | `cold — no calendar match`}
- **open_loops:** {promises, unanswered threads, deadlines mentioned—in mail or calendar; include prep/follow-up for **upcoming** meetings when relevant}
- **hooks_for_writer:** {3 bullets—factual, safe to reference in outreach}
- **email_address_notes:** {candidate addresses for this contact—evidence-backed vs tentative—or "—"}
- **search_method_notes:** {e.g. user confirmed they sent mail; bounce hunt skipped; MCP limits—or "—"}
- **caveats:** {e.g. partial search, connector limits}
Optional /schedule before high-stakes outreach weeks; usually on-demand before draft-outreach.