claude/ai-daily-digest/skills/ai-daily-digest/SKILL.md
Daily AI news digest covering technical advances, business news, and engineering impact. Aggregates from research papers, tech blogs, HN, newsletters. Use daily for staying current on AI developments.
npx skillsauth add smykla-skalski/sai ai-daily-digestInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate comprehensive daily AI news digest with technical, business, and engineering coverage.
Parse from $ARGUMENTS:
--focus [technical|business|engineering|leadership|all] — Default: all--notion-page-id [UUID] — Notion parent page ID for digest publishing (overrides env var)--no-notion — Skip Notion publishing entirely (archive-only mode)--obsidian-vault [PATH] — Obsidian vault path for digest output (overrides env var)Resolve the Notion parent page ID using this precedence (first match wins):
--notion-page-id argumentNOTION_PARENT_PAGE_ID environment variableWhen prompting the user, provide these instructions for finding the page ID:
https://www.notion.so/Page-Title-{32-hex-chars})8-4-4-4-12 for UUID formatRecommend persisting via env var in ~/.zshrc / ~/.bashrc:
export NOTION_PARENT_PAGE_ID="your-page-id-here"
Or in ~/.claude/settings.json under the "env" key:
{
"env": {
"NOTION_PARENT_PAGE_ID": "your-page-id-here"
}
}
When Notion is not configured (no page ID resolved and no --no-notion flag), the digest is written to an Obsidian vault instead.
Resolve the Obsidian vault path using this precedence (first match wins):
--obsidian-vault argumentOBSIDIAN_VAULT_PATH environment variable.obsidian/ directories in common locations:
~/Documents/*/ (one level deep)~/*/ (one level deep, e.g. ~/vault/, ~/notes/)~/Library/Mobile Documents/iCloud~md~obsidian/Documents/*/ (iCloud sync)
Use: find ~/Documents ~/Library/Mobile\ Documents/iCloud~md~obsidian/Documents ~ -maxdepth 2 -name .obsidian -type d 2>/dev/null
If exactly one vault found, use its parent directory. If multiple found, present choices via AskUserQuestion. If none found, fall back to archive-only mode.0_Inbox/ subdirectory if it exists, otherwise write to vault root.The digest is saved as AI Digest {YYYY-MM-DD}.md in the resolved path. Integrates with Obsidian's file-based workflow — the digest appears as a regular note with full markdown rendering.
Persist via env var in ~/.zshrc / ~/.bashrc:
export OBSIDIAN_VAULT_PATH="$HOME/Documents/my-vault/0_Inbox"
Or in ~/.claude/settings.json under the "env" key:
{
"env": {
"OBSIDIAN_VAULT_PATH": "/Users/you/Documents/your-vault/0_Inbox"
}
}
echo "${XDG_DATA_HOME:-$HOME/.local/share}/sai/ai-daily-digest"date +%Y-%m-%ddate +%Aecho "${NOTION_PARENT_PAGE_ID:-}"echo "${OBSIDIAN_VAULT_PATH:-}"All persistent state and generated artifacts are stored in the data directory from preprocessed context above. This path is independent of the plugin cache and project working directory — artifacts survive plugin updates and work from any project.
Use the pre-resolved data directory path for all file operations. Do NOT use ./findings/ or other relative paths — they may resolve to the plugin cache and be lost on updates.
All state stored in the persistent data directory.
.last-run)Format: YYYY-MM-DD. Read on startup to calculate date range. If missing, default to past 7 days.
.covered-stories)Pipe-separated: {date}|{story_id}|{url} — one story per line.
story_id — Normalized: lowercase, hyphen-separated, key terms (e.g., falcon-h1r-7b-release, xai-20b-funding)Example:
2026-01-28|deepseek-r1-release|https://api-docs.deepseek.com/news/news250120
2026-01-29|falcon-h1r-7b-release|https://falcon-lm.github.io/blog/falcon-h1r-7b/
--focus area and --notion-page-id--no-notion is set, set notion_page_id to null.
Otherwise check in order: --notion-page-id arg → Notion page ID from preprocessed context → prompt user interactively.
Store resolved value as notion_page_id for Phase 18.
If the preprocessed value is empty and user declines to provide an ID, set notion_page_id to null.notion_page_id is null (Notion not configured).
Check in order: --obsidian-vault arg → Obsidian vault path from preprocessed context → auto-detect (see Configuration section above).
Store resolved value as obsidian_path for Phase 18. If no vault found, fall back to archive-only mode.DATA_DIR. Run mkdir -p "$DATA_DIR" to ensure it exists.$DATA_DIR/.last-run — set date range from last run to the today value from preprocessed context$DATA_DIR/.covered-stories — build in-memory covered_ids and covered_urls setsBefore starting Phase 2, read references/search-patterns.md in full for all search queries, source-specific patterns, and the Friday Weekly Recap section.
Spawn a general-purpose research agent for each phase (or batch of independent phases).
Pass each agent: the date range, covered_ids and covered_urls sets, the focus area, and the relevant section from references/search-patterns.md.
Phases 2-5 are independent - spawn them in parallel. Subsequent phases can be batched as appropriate.
Each agent executes all web searches for its phase and returns ONLY a list of story items: title, URL, 1-line summary, and story_id. No analysis, no ranking - that happens in Phase 16.
Collect results from all research agents before proceeding to Phase 16. Do not skip phases - missing a phase means missing an entire digest section.
| Phase | Topic | Skip unless focus includes | | --- | --- | --- | | 2 | Technical research (models, papers, frameworks) | technical | | 3 | Business research (funding, acquisitions, launches) | business | | 4 | Engineering impact (dev tools, workflow, job market) | engineering | | 5 | Leadership research (strategy, org transformation) | leadership | | 6 | GitHub trending AI repos | technical | | 7 | AI tools for professionals (9 domains) | all (always run) | | 8 | AI application domains (7 verticals) | all (always run) | | 9 | AI safety & ethics | all (always run) | | 10 | Open source AI ecosystem | technical | | 11 | AI infrastructure & hardware | technical | | 12 | Regional AI developments | all (always run) | | 13 | YouTube AI videos | all (always run) | | 14 | Cool & thought-provoking research | all (always run) | | 15 | Newsletter & blog aggregation | all (always run) |
All deduplication happens here before generating the digest.
Step 1: Generate story IDs for all collected items.
Normalized format — lowercase, hyphen-separated, company/product + action + key detail:
falcon-h1r-7b-releasexai-20b-fundingsimonwillison-sandboxes-postStep 2: Deduplicate within session — remove same event from different URLs.
Step 3: Deduplicate against history — use in-memory covered_ids and covered_urls from Phase 1. DO NOT re-read or update the file.
Filter out stories where:
covered_idscovered_urlsStep 4: Rank by source credibility (tier 1 > tier 2 > tier 3), engagement, relevance.
Step 5: Categorize into template sections and select Top 5 from filtered content.
Step 6: Completeness check — compare categorized items against the Length Guidelines table in references/output-template.md. If any section is below its target minimum, return to the corresponding research phase and run additional searches from references/search-patterns.md to fill the gap. Every section in the template must have content before proceeding.
- [ ] **[Title]** — [1-line summary] [Source: URL]
- [ ] on ALL story items with source URLs (renders as Notion task)DO NOT update .covered-stories in this phase — wait for verification.
Step 1: Publish digest
Choose ONE based on Phase 1 resolution:
Notion (when notion_page_id is set): Load Notion tool via ToolSearch (select:mcp__notion__notion-create-pages), then create page:
notion_page_id resolved in Phase 1🤖 AI Digest {YYYY-MM-DD}Obsidian (when obsidian_path is set): Write digest to {obsidian_path}/AI Digest {YYYY-MM-DD}.md.
- [ ] render natively in ObsidianArchive-only (neither set): Skip publishing, archive copy in Step 2 still provides value.
Step 2: Write archive copy to $DATA_DIR/ai-digest-{YYYY-MM-DD}.md
Step 3: Update $DATA_DIR/.last-run with today's date (YYYY-MM-DD).
Spawn a general-purpose verification agent to check today's digest against:
$DATA_DIR/.covered-stories (should NOT include today's stories yet)$DATA_DIR/Agent checks for: exact duplicates, near duplicates (same company + similar action within 7 days), URL duplicates, topic fatigue (same topic 3+ times in past week).
On duplicate detection:
*Verification: {N} borderline items retained*Only after Phase 19 passes. Append to $DATA_DIR/.covered-stories for each story in final digest:
{date}|{story_id}|{url}
Keep file under 300 lines — trim oldest from top if over.
.last-run on successful digest generationStory items use - [ ] checkbox format for newsletter curation. User checks stories in Notion or Obsidian → /ai-newsletter extracts checked items.
/ai-digest
</example>
<example>
Focus on a single area:
/ai-digest --focus technical
/ai-digest --focus business
</example>
<example>
Explicit Notion page or archive-only mode:
/ai-digest --notion-page-id 12345678-abcd-1234-efgh-123456789abc
/ai-digest --no-notion
/ai-digest --focus technical --no-notion
</example>
<example>
Explicit Obsidian vault path:
/ai-digest --obsidian-vault ~/Documents/my-vault/0_Inbox
</example>development
Run the council workflow from a normal Copilot session only when the user explicitly asks for council review, multi-persona critique, debate, design review, code review, architecture feedback, UX review, or tradeoff analysis. Do not use it for commit, stage, merge, approval, or generic pre-commit requests. Accept the same mode syntax as the bundled council reviewers: `core|auto|core-eng|core-ux|core-mix|all|debate <problem|@file>`. During council slash-command use, the current session agent moderates reviewer agents directly. Runs broader than 6 reviewers require explicit AskUserQuestion approval before launch.
tools
Use when the user invokes $council, $council:council, Council review, or Council debate. Use loaded SKILL body or one direct installed `skills/council/SKILL.md` read. Direct read path must contain `/.codex/plugins/cache/sai/council/` and end `/skills/council/SKILL.md`. `cd <cwd> && sed -n ... <path>` is valid. Do not use `pwd`, `ls`, `find`, `rg`, `cat`, multiple `&&`, or `;`. Never use repo-local paths. If unavailable, stop exactly `Council not run: skill unavailable.` At most one pre-tool message, exact `Council progress:` line only. Non-final lines start `Council progress:`.
development
Run council reviews with sourced engineering, UX, reliability, performance, AI, and strategy persona lenses. Use when the user asks for council review, multi-persona critique, debate, design review, code review, architecture feedback, UX review, or tradeoff analysis.
development
Use when the user asks for council review, multi-persona critique, debate, design review, code review, architecture feedback, UX review, or tradeoff analysis. Bare invocations use `core` profile auto-detect; explicit `auto` selects the best-fit 6 personas from the sourced 27-persona engineering and UX roster. Users can still pin `core`, `core-eng`, `core-ux`, `core-mix`, `all`, or `debate`.