From GTM Engine
End-of-day review that summarizes accomplishments, drafts EOD message, previews tomorrow, and optionally syncs call recordings.
How this skill is triggered — by the user, by Claude, or both
Slash command
/gtm-engine:good-nightThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
End-of-day review that summarizes accomplishments, drafts EOD message, previews tomorrow, and optionally syncs call recordings.
End-of-day review that summarizes accomplishments, drafts EOD message, previews tomorrow, and optionally syncs call recordings.
/good-night — Full evening wrap-up/good-night --quick — Skip call sync, just summary + EOD + tomorrow/good-night --calls — Only fetch and save calls (if call recording enabled)config/config.yaml exists (run /setup first)Parse the argument (if any) from $ARGUMENTS to determine mode:
$ARGUMENTS contains --quick → quick mode (skip call sync)$ARGUMENTS contains --calls → calls-only modeFirst: Read config/config.yaml (relative to project root) to load all configuration. Extract:
config.linear.action_team — action task team nameconfig.linear.pipeline_team — pipeline tracking team nameconfig.linear.default_label — label for engine-created tasksconfig.team — team members, roles, and Linear user IDsconfig.ritual.labels — meaningful, light, and parking lot label namesconfig.ritual.meaningful_count — number of meaningful tasks (default 3)config.ritual.light_count — number of light tasks (default 2)config.ritual.meaningful_definition — what counts as meaningfulconfig.ritual.light_definition — what counts as lightconfig.integrations.call_recording — call recording provider settings (provider, api_key_env, enabled)config.integrations.outreach_sheet — outreach spreadsheet settingsconfig.integrations.google_workspace.enabled — whether calendar is availableIdentify the default assignee = the team member with is_default_assignee: true.
Resolve Linear team IDs (required): Some Linear MCP servers (e.g., linear-mcp-server) hang indefinitely when issue searches are made without a teamId. Before any issue query:
mcp__linear__list_teams onceaction_team and pipeline_team names to their UUIDs{action_team_id} and {pipeline_team_id} for the rest of the sessionEvery Linear issue query below MUST include teamId (the UUID).
Use mcp__google-workspace__time_getCurrentDate to get today's date and timezone.
Only run if config.integrations.call_recording.enabled is true. Otherwise skip entirely.
If --calls mode or full mode:
memory/call_sync.md (relative to project root) to get the last synced tracking info. Look for last_imported_call_date and last_imported_recording_id. If the file does not exist, this is the first sync — fetch the most recent 20 calls.config.integrations.call_recording.provider and call the appropriate API:
curl -s -H "X-Api-Key: ${api_key_env_value}" "https://api.fathom.ai/external/v1/meetings?limit=20"curl -s -X POST "https://api.fireflies.ai/graphql" -H "Authorization: Bearer ${api_key_env_value}" -H "Content-Type: application/json" -d '{"query": "{ transcripts { id title date duration organizer_email participants sentences { speaker_name text } } }"}'| # | Date | Title | Duration | Attendees |
/sync-calls SKILL.md for details)my-context/call-transcripts/{date}_{sanitized_title}.md (relative to project root) with:
memory/call_sync.md with the new last-synced date and recording_idIf --calls mode, STOP HERE after saving calls.
Read the ritual settings from config. Use the label names for meaningful and light tasks.
Before listing completed tasks, check how today's planned tasks went:
mcp__linear__list_issues with teamId: "{action_team_id}", assignee: "me", label: "{meaningful_label}" — filter to tasks with due date = todaymcp__linear__list_issues with teamId: "{action_team_id}", assignee: "me", label: "{light_label}" — filter to tasks with due date = today### Today's {meaningful_count}+{light_count} Score
**Meaningful: X/{meaningful_count} completed**
- [x] {done task}
- [ ] {not done — reschedule?}
**Light: X/{light_count} completed**
- [x] {done task}
- [ ] {not done}
memory/daily_streak.md (relative to project root). Create it if it does not exist, with this header:
# Daily Streak
| Date | Meaningful | Light | Notes |
|------|------------|-------|-------|
| {date} | {X}/{meaningful_count} | {X}/{light_count} | {notes} |**Streak: X days with {meaningful_count}/{meaningful_count} meaningful** (count consecutive days with full meaningful completion from most recent backwards)If no meaningful or light tasks exist for today (system was not used last night), skip this step silently and note "No {meaningful_count}+{light_count} planned for today" in the output.
mcp__linear__list_issues with assignee: "me", teamId: "{action_team_id}", state: "Done", updatedAt: "-P1D" — tasks completed recently| Task | Priority | Completed |mcp__linear__list_issues with assignee: "me", teamId: "{action_team_id}", state: "In Progress" — still openmcp__linear__list_issues with assignee: "me", teamId: "{action_team_id}", state: "Todo" — not startedGenerate a concise 2-3 sentence summary of what was accomplished today based on:
Draft an end-of-day message in this format:
**EOD Update — {date}**
**Done today:**
- {completed task/activity 1}
- {completed task/activity 2}
- ...
**Tomorrow:**
- {task/meeting 1}
- {task/meeting 2}
- ...
Rules for the EOD message:
mcp__google-workspace__calendar_listEvents with calendarId: "primary", timeMin = start of tomorrow, timeMax = end of tomorrowmcp__linear__list_issues with assignee: "me", teamId: "{action_team_id}" — filter to tasks due tomorrow### Tomorrow — {date}
**Calendar:**
| Time | Event |
|------|-------|
**Tasks Due:**
| Task | Priority |
|------|----------|
Plan tomorrow's meaningful and light tasks using data already gathered:
Gather inputs (most already fetched in earlier steps):
mcp__linear__list_issues with teamId: "{action_team_id}", label: "{parking_lot_label}", state: "Backlog"Surface parking lot — show top 5 items sorted by priority then age (oldest first):
### Parking Lot (X items)
| # | Task | Created | Age |
|---|------|---------|-----|
| 1 | ... | Mar 8 | 2d |
| 2 | ... | Mar 5 | 5d |
Ask: "Want to pull any of these into tomorrow's {meaningful_count}+{light_count}?"
Suggest {meaningful_count} meaningful + {light_count} light tasks for tomorrow, categorized:
### Tomorrow's {meaningful_count}+{light_count}
**Meaningful (must do):**
1. [task — why it matters]
2. [task — why it matters]
3. [task — why it matters]
**Light (keep moving):**
1. [task]
2. [task]
What counts as "meaningful" — read from config.ritual.meaningful_definition. Default examples:
What counts as "light" — read from config.ritual.light_definition. Default examples:
Ask: "Does this look right, or want to swap anything?"
After user confirms, tag tasks in Linear:
Only run this step if config.team contains at least one member with role: "sdr" AND config.integrations.outreach_sheet.enabled is true. Otherwise skip entirely.
Find the SDR team member(s) from config. Use their linear_user_id and the configured outreach spreadsheet.
mcp__google-workspace__sheets_getRange with the configured spreadsheet ID and appropriate range### {SDR name} Today
- Profiles added: X
- Messages sent: X
- Status updates: X
## Good Night — {date}
### Calls Synced
| # | Date | Title | Duration |
|---|------|-------|----------|
| ... | ... | ... | ... |
[Saved: X calls / No new calls / Call sync disabled]
### Today's {meaningful_count}+{light_count} Score
**Meaningful: X/{meaningful_count} completed**
- [x] {done task}
- [ ] {not done}
**Light: X/{light_count} completed**
- [x] {done task}
- [ ] {not done}
**Streak: X days with {meaningful_count}/{meaningful_count} meaningful**
### Completed Today
| Task | Priority |
|------|----------|
| ... | ... |
### Still Open
| Task | Priority | Due | Suggested New Date |
|------|----------|-----|--------------------|
| ... | ... | ... | ... |
### Day Summary
{2-3 sentence summary}
### EOD Message
EOD Update — {date}
Done today:
Tomorrow:
### Tomorrow — {date}
**Calendar:**
| Time | Event |
|------|-------|
| ... | ... |
**Tasks Due:**
| Task | Priority |
|------|----------|
| ... | ... |
### Parking Lot (X items)
| # | Task | Created | Age |
|---|------|---------|-----|
| ... | ... | ... | ... |
### Tomorrow's {meaningful_count}+{light_count}
**Meaningful (must do):**
1. [task — why it matters]
2. [task — why it matters]
3. [task — why it matters]
**Light (keep moving):**
1. [task]
2. [task]
### {SDR name} Today
- Profiles added: X
- Messages sent: X
- Updates: X
End the wrap-up with a fulfilling, contentment-oriented quote. Pick a quote that is calming, reflective, and acknowledges the value of the work done — themes of gratitude, progress, patience, perspective, or inner peace. Rotate quotes so the user doesn't see the same one twice in a row. Draw from philosophers, poets, writers, spiritual thinkers — anyone whose words bring a sense of fulfillment.
Format:
> "{quote}"
> — {attribution}
memory/call_sync.md ONLY after successfully fetching callsnpx claudepluginhub himanshusaleria/gtm-engine --plugin gtm-engineDaily morning briefing that pulls calendar, tasks, pipeline, and outreach data into one view.
Evening tomorrow-brief. Reads the Ops Ledger, calendar, and People DB. Surfaces tomorrow's meetings with prep status, birthdays hitting tomorrow, overdue outreach, top 3 priorities, and any unresolved decisions from today. Push notification if anything is genuinely time-sensitive.
End-of-day review to capture progress, insights, and plan tomorrow's focus. Invoked via /daily-review.