pos-morning
Morning brief pipeline — auto-detects MCP servers, gathers calendar + tasks + sessions + vault, synthesizes ONE focus sentence. Three output modes.
Best use case
pos-morning is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Morning brief pipeline — auto-detects MCP servers, gathers calendar + tasks + sessions + vault, synthesizes ONE focus sentence. Three output modes.
Teams using pos-morning should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/pos-morning/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How pos-morning Compares
| Feature / Agent | pos-morning | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Morning brief pipeline — auto-detects MCP servers, gathers calendar + tasks + sessions + vault, synthesizes ONE focus sentence. Three output modes.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# POS Morning — Daily Brief Pipeline
Generate a morning brief by auto-detecting your integrations, gathering context from every available source, and synthesizing ONE focused sentence for the day. Works with zero setup — adapts to whatever you have connected.
This is the **"aha moment"** of a POS — the first time all your data sources produce a single actionable priority.
## Step 0: Detect Available Integrations
Read MCP config to know what's available BEFORE gathering data:
```bash
cat ~/.claude/mcp.json 2>/dev/null
```
Build integrations map from configured servers:
| Server | Capability | Loader |
|--------|-----------|--------|
| krisp | Meetings, transcripts, action items | `ToolSearch: "+krisp"` |
| linear | Tasks, projects, sprints | `ToolSearch: "+linear list"` |
| telegram | Saved messages (context clues) | `ToolSearch: "+telegram get"` |
| notion | Notes, databases | `ToolSearch: "+notion search"` |
| exa | Web context (optional) | `ToolSearch: "+exa"` |
**Only ToolSearch servers found in mcp.json.** Don't guess — if not configured, don't try.
Also check for local tools:
```bash
# Google Calendar script (bash wrapper)
GCAL_SCRIPTS=("$HOME/.claude/scripts/gcal-smart.sh" "$HOME/.claude/scripts/gcal.sh")
for s in "${GCAL_SCRIPTS[@]}"; do [ -x "$s" ] && echo "gcal: $s" && break; done
# Linear tracking cache (memory file)
find ~/.claude/projects -name "linear-tracking.md" -type f 2>/dev/null | head -1
```
## Step 1: Gather Context
Try each source in degradation order. **Skip silently** if unavailable — never error, never ask to install.
### 1.1 Calendar
**Degradation chain** (stop at first success):
1. **Krisp MCP** (if in mcp.json):
```
ToolSearch: "+krisp meetings"
mcp__krisp__list_upcoming_meetings
mcp__krisp__search_meetings (yesterday, for recap)
```
Krisp also provides action items from yesterday's meetings — extract these.
2. **Google Calendar script**:
```bash
"$HOME/.claude/scripts/gcal-smart.sh" today
"$HOME/.claude/scripts/gcal-smart.sh" week # for broader context
```
3. **Skip** — note "no calendar" in output header.
### 1.2 Tasks
**Degradation chain:**
1. **Linear MCP**:
```
ToolSearch: "+linear list_issues"
mcp__linear__list_issues(assignee: "me", status: "started")
mcp__linear__list_issues(assignee: "me", status: "unstarted")
```
Also check for recently completed (last 3 days) to show momentum.
2. **Linear cache** (memory file):
```bash
TRACKING=$(find ~/.claude/projects -name "linear-tracking.md" -type f 2>/dev/null | head -1)
```
Read and extract cached task list with statuses.
3. **Local TODO**:
```bash
find . -maxdepth 2 \( -name "TODO.md" -o -name "tasks.md" -o -name "TODO" \) 2>/dev/null | head -3
```
4. **Skip** — note "no task source".
### 1.3 Messages (context clues)
**Only if Telegram MCP detected:**
```
ToolSearch: "+telegram get_messages"
mcp__telegram__telegram_get_messages(dialog: "me", limit: 5)
```
Saved messages reveal what the user was thinking about. Extract themes, don't display raw messages.
### 1.4 Recent Sessions
```bash
touch -t $(date +%Y%m%d)0000 /tmp/pos-today-marker 2>/dev/null
find ~/.claude/projects -name "*.jsonl" -newer /tmp/pos-today-marker -maxdepth 3 2>/dev/null | head -5
# If nothing today, check yesterday
YESTERDAY=$(date -v-1d +%Y%m%d 2>/dev/null || date -d "yesterday" +%Y%m%d 2>/dev/null)
touch -t ${YESTERDAY}0000 /tmp/pos-yesterday-marker 2>/dev/null
find ~/.claude/projects -name "*.jsonl" -newer /tmp/pos-yesterday-marker -maxdepth 3 2>/dev/null | head -5
```
For each session, read first 20 and last 20 lines to extract:
- Project name (from path)
- Topic (from first user message)
- Tools used (count of tool calls, approximate effort)
### 1.5 Vault State (optional)
If working directory is a vault:
```bash
find . -name "*.md" -mmin -720 \
-not -path "./.obsidian/*" \
-not -path "./.trash/*" \
-not -path "./.smart-env/*" \
-not -path "./node_modules/*" \
2>/dev/null | head -10
```
### 1.6 Yesterday's Meetings (if Krisp available)
```
mcp__krisp__search_meetings (yesterday's date range)
mcp__krisp__list_activities
```
Extract per-meeting:
- Title, duration, participants
- Action items generated
- Talk time ratio (were you presenting or listening?)
## Step 2: Synthesize
### Weekday-aware mode
Adjust synthesis by day:
| Day | Mode | Extra |
|-----|------|-------|
| Monday | Week overview | Show full week calendar, sprint status |
| Tuesday-Thursday | Standard | Focus on today's blocks |
| Friday | Wins + lessons | Show completed tasks this week, retrospective prompt |
### FOCUS derivation
The single most important output. Derive ONE sentence from ALL context:
1. Check today's calendar — what's the biggest time commitment?
2. Check in-progress tasks — what's most urgent or overdue?
3. Check yesterday's sessions — what was the user mid-work on?
4. Check action items from yesterday's meetings — what was promised?
5. Combine: **"[Action verb] [specific thing] [by when / why]"**
Examples:
- "Finalize workshop slides before 14:00 session"
- "Close 3 overdue Linear tasks — sprint ends Friday"
- "No meetings today — deep work on dashboard generator"
- "Follow up on partnership call action items before standup"
**NEVER** generic focus like "have a productive day" — must be specific.
### Output structure
```
┌─────────────────────────────────────────────────┐
│ MORNING BRIEF · {weekday} {date} │
│ sources: {list of what connected} │
└─────────────────────────────────────────────────┘
FOCUS
> {main priority — 1 sentence from all context}
CALENDAR ({count} events)
├─ {time} {title} ({duration})
├─ {time} {title} ({duration})
└─ {time} {title} ({duration})
TASKS ({in_progress} IP · {todo} todo)
├─ {id} {title} ◐ IP
├─ {id} {title} ◐ IP
└─ +{N} in backlog
YESTERDAY
> {1-2 sentences: what you worked on, based on sessions + meetings}
OBSERVATIONS
· {schedule insight — conflicts, free blocks, back-to-back}
· {task insight — overdue items, approaching deadlines}
· {pattern — "3 sessions on X this week, close it today?"}
```
## Step 3: Output Modes
### brief (default)
Terminal output as above.
### full
Same + additional sections:
```
YESTERDAY'S MEETINGS ({count})
├─ {title} {duration} {participants}
│ → action: {item}
└─ {title} {duration}
RECENT FILES ({count})
├─ {filename} {modified time ago}
└─ {filename} {modified time ago}
SAVED MESSAGES
├─ {preview of recent telegram saved}
└─ {preview}
INTEGRATIONS
├─ calendar {krisp|gcal|none}
├─ tasks {linear|cache|local|none}
├─ messaging {telegram|none}
├─ meetings {krisp|none}
└─ sessions {N found}
```
### telegram
Compact version for Telegram Saved Messages:
```
#morning {weekday}
focus: {priority}
{time} {event}
{time} {event}
tasks: {count} IP · {count} todo
· {most important}
· {second}
> {one observation}
```
Send via:
```
ToolSearch: "+telegram send_self"
mcp__telegram__telegram_send_self(message: "{brief}")
```
If Telegram not available, fall back to `brief` and note it.
## Principles
- **Graceful degradation**: 0 integrations = minimal brief; full stack = rich brief
- **Never error on missing source**: skip silently, note what connected in header
- **Opinionated focus**: ALWAYS synthesize ONE focus — this is the core value
- **Fast**: direct tool calls only, no background agents needed, <30 seconds
- **Weekday-aware**: Monday overview, Friday retrospective, standard midweek
- **Action items carry forward**: yesterday's meeting commitments appear in today's brief
## Common Mistakes
| Mistake | Fix |
|---------|-----|
| ToolSearch for server not in mcp.json | Only search servers found in config |
| Generic focus: "be productive today" | Focus MUST be specific: action + object + deadline |
| Showing raw JSONL content | Extract topic from first user message only |
| Failing when no calendar | Skip silently — brief with just tasks is valuable |
| Hardcoded MCP tool names | ToolSearch first — tool names vary across setups |
| Sending telegram without checking | Check Step 0 map — only send if detected |
| Reading entire session files | First 20 + last 20 lines is enough for topic |
| Skipping yesterday's meetings | Krisp action items are tomorrow's priorities |Related Skills
writing-content
Интерактивный процесс написания текстов для вайб-маркетинга на основе Julian Shapiro framework. **Новые возможности (v2.0):** - Research & Gap Analysis (Perplexity → WebSearch fallback) - Scoring 0-5 вместо binary (Novelty + Resonance + Hook + Clarity) - AI-Slop Detection на всех этапах (10 типов patterns) - 3 варианта intro с self-scoring - Markdown export всех промежуточных результатов **Русские triggers:** "напиши пост по шапиро", "написать статью по фреймворку шапиро", "создай текст в стиле julian shapiro", "помоги написать контент по методу shapiro", "контент по julian shapiro фреймворку", "пост по julian shapiro", "напиши в стиле шапиро" **English triggers:** "write content using julian shapiro framework", "create post with shapiro method", "write article shapiro style", "help with julian shapiro writing" **Generic triggers:** "напиши статью", "помоги написать контент", "создай текст", "начать писать", "хочу написать пост", "нужна помощь с текстом", "write content", "write article", "создай контент", "придумай идею для статьи", or requests help with content creation process.
YT Transcribe — YouTube → Whisper → Obsidian
Транскрибирует YouTube-видео через mlx-whisper (Apple Silicon, Metal-native) с параллельными чанками.
/tg-saved v2 — Telegram Saved Messages → Deep Analysis → Obsidian
## Назначение
summarize-comments
Делает LLM-выжимку из комментариев менеджеров об одном или нескольких подрядчиках. Используй этот скилл когда нужно понять что говорят менеджеры о конкретном подрядчике, или получить JSON с выжимкой для дальнейшей обработки.
skill-security
This skill activates when the user mentions "security audit", "skill audit", "проверка безопасности скилла", "аудит скилла", "skill-security", "проверить скилл", "пересобрать скилл", "rebuild skill", "security check", "dual memory audit", "credential isolation check". Also activates on /skill-security command. Use this skill when the user wants to audit, validate, or rebuild any Claude Code skill for security compliance.
session-status
Statusline shown in Claude Code UI status bar via settings.json. No action needed in responses.
session-save
Compress and save current session context for handoff to next session. Use when: (1) context pressure >50%, (2) user says "сохрани сессию", "session save", "checkpoint", (3) before ending a long productive session, (4) switching to a different task mid-session. Supports named sessions: /session-save vpn-fix
continue-session
Restore context from a named or latest session checkpoint. Use when: (1) user says "продолжи", "continue", "что было в прошлой сессии", (2) starting work after a crash or context overflow, (3) "resume", "восстанови контекст", "где я остановился". Supports named sessions: /continue vpn-fix
compress
Info-Compressor: compress text/context by 60-70% without losing meaning. Use when: (1) context pressure >50%, (2) user says "сжать", "compress", "compact", (3) need to fit more context into remaining window, (4) preparing handoff blob for next session.
seo-strategist
Strategic SEO planning and analysis toolkit for site-wide optimization, keyword research, technical SEO audits, and competitive positioning. Complements content-creator's on-page SEO with strategic planning, topic cluster architecture, and SEO roadmap generation. Use for keyword strategy, technical SEO audits, SERP analysis, site architecture planning, or when user mentions SEO strategy, keyword research, technical SEO, or search rankings.
roi-razvitie-draft
Generates a draft meeting document for the weekly "Roi Развитие" (Wednesday, product Roi Navigator). Use when the user asks for a draft for the meeting, for Wednesday's doc, for "Roi Развитие", or for the weekly team meeting agenda.
project-knowledge-base
Collects, structures and maintains a Project Knowledge Base (PKB.md) in Obsidian for a marketing agency. Aggregates data from Google Drive, Gmail, Telegram (group chat and DMs via MTProto), moo.team tasks/comments, and local Obsidian meeting transcripts. Uses async parallel collection and a two-stage LLM pipeline for init. Use when the user wants to initialize, update or enrich a project's knowledge base, mentions PKB, project knowledge base, синхронизация проекта, база знаний проекта, init_project_knowledge, update_project_knowledge, or ad_hoc_add_context.