/shirman-digest — Ежедневный дайджест AI & Tech трендов
Скилл автоматически собирает самое важное за день из мира AI и технологий с shir-man.com/homepage/ — SPA-дашборда, агрегирующего GitHub Trending, Hacker News, Lobsters и AI-новости. Результат — готовый HTML-отчёт с 4 вкладками (без дублей), темой и ссылками на оригиналы.
Зачем
shir-man.com — это единственная точка входа для обзора трендов, но сайт SPA без API, данные не парсятся обычным скрапером. Скилл решает эту проблему: навигирует SPA через headless-браузер, параллельно читает статьи, и упаковывает всё в удобный отчёт. Без скилла это занимает 30-40 минут ручной работы.
Алгоритм
Шаг 1: Навигация по SPA (PinchTab)
shir-man.com — SPA, поэтому нужен headless-браузер для навигации. PinchTab snapshot даёт accessibility tree с минимумом токенов.
pinchtab_navigate(url: "https://shir-man.com/homepage/")pinchtab_wait(seconds: 3)— SPA грузит данные асинхронноpinchtab_snapshot(filter: "interactive", format: "compact")— получить элементы (~19 нод vs 269 в полном DOM)- Переключить селекторы колонок:
- Первая колонка: Midjourney → GitHub (самые быстрорастущие репозитории)
- Третья колонка: Hype Replicate → Lobsters (экспертный контент)
- Пройти вкладки внизу (кружочки-переключатели):
- Собрать: Top signals, HN Best Show, GitHub Fastest rising, Popular
- Пропустить: Virality map, Topic cloud (визуализации без парсируемых ссылок)
- На каждой вкладке: snapshot → извлечь ссылки из StaticText нод
Почему StaticText, а не eval? PinchTab eval возвращает 404 (известный баг #225). Данные извлекаются из snapshot accessibility tree — менее точно, но работает стабильно.
Шаг 1.5: Извлечение URL из ссылок (ОБЯЗАТЕЛЬНО)
PinchTab compact snapshot показывает текст ссылок, но НЕ href. Для каждой карточки в отчёте ОБЯЗАТЕЛЬНА кликабельная ссылка на оригинал. Без ссылки карточка бесполезна.
Способы получения URL:
- GitHub репо — URL строится из текста ссылки:
https://github.com/{link_text}(текст уже содержитowner/repo) - HN статьи — домен виден в StaticText (напр.
GIST.GITHUB.COM,SAMHENRI.GOLD). Для получения точного URL:- WebSearch:
"{заголовок статьи}" site:{домен}— быстрый поиск точного URL - Или:
WebFetch("https://hn.algolia.com/api/v1/search?query={title}&tags=story")— HN API возвращаетurlполе
- WebSearch:
- Lobsters статьи — аналогично HN: домен виден, искать через WebSearch по заголовку + домену
- Show HN / Top Signals — ссылки в карусели: кликнуть на link-ноду (
pinchtab_click), snapshot → извлечь URL из адресной строки,pinchtab_backдля возврата
Правило: Если URL не удалось найти ни одним способом — пометить карточку 🔗 ссылка не найдена и указать домен-источник как текст. Но стремиться к 100% покрытию ссылками.
Параллельность: Запускать WebSearch/WebFetch для разрешения URL параллельно (до 8 одновременно), чтобы не тратить время.
Шаг 2: Чтение статей (WebFetch)
WebFetch в 5-10x эффективнее браузера для чтения контента: параллельный fetch без ожидания рендера.
- Собрать уникальные URL из Шага 1.5 + snapshot'ов
- Запустить WebFetch параллельно (до 8 одновременно)
- Извлечь из каждой статьи: заголовок, ключевые тезисы, практическую ценность
- При 404 или ошибке — пропустить без ретрая (URL может быть устаревшим)
Шаг 3: Генерация HTML-отчёта
Создать claudedocs/shir-man-daily-report-YYYY-MM-DD.html.
4 вкладки (без дублей между разделами):
| Вкладка | Контент |
|---|---|
| GitHub Trending | Быстрорастущие репозитории с описанием |
| Hacker News | Лучшие обсуждения и статьи |
| Lobsters | Экспертный технический контент |
| AI Agents | Новые инструменты и фреймворки |
Правило дедупликации: Каждая статья/проект появляется ТОЛЬКО в одной вкладке. Приоритет размещения: AI Agents (если про AI инструмент) → GitHub Trending (если репозиторий) → Hacker News (если HN источник) → Lobsters. Если статья появилась на HN и Lobsters — оставить там где больше очков. Deep Reads, Обзор, Попробовать — УБРАНЫ, их контент распределяется по 4 основным вкладкам.
Убранные вкладки и причины:
Обзор— пересказ того что уже есть в остальных вкладкахDeep Reads— 100% дубли из HN/Lobsters/AI AgentsПопробовать— частично дубли AI Agents + GitHub Trending
Каждая карточка ОБЯЗАТЕЛЬНО содержит:
- Заголовок + кликабельная ссылка на оригинал (ОБЯЗАТЕЛЬНО! Без ссылки карточка бесполезна — см. Шаг 1.5)
- Краткое описание (2-3 предложения)
- Цветной бейдж источника
- Блок «Ключевой вывод» для важных статей (выделенный фон, 1-2 предложения)
⚠️ НЕ допускается: карточка без <a href="..."> ссылки на оригинальный ресурс. Если URL не разрешён — использовать домен + заголовок в WebSearch.
Стиль отчёта:
CSS variables → тёмная тема по умолчанию, светлая по toggle
Переключатель темы → кнопка в шапке, состояние в localStorage
Бейджи источников → GitHub: зелёный, HN: оранжевый, Lobsters: красный, AI: фиолетовый
Layout → responsive CSS grid, max-width: 1200px, system-ui шрифт
Градиенты → заголовок страницы и заголовки вкладок
Язык: Весь текст на русском. Технические термины (GitHub, Hacker News, API и т.д.) — в оригинале.
HTML skeleton — структура отчёта:
<!DOCTYPE html>
<html lang="ru" data-theme="dark">
<head>
<meta charset="UTF-8">
<title>AI & Tech Дайджест — YYYY-MM-DD</title>
<style>
:root { --bg: #1a1a2e; --card: #16213e; --text: #e0e0e0; --accent: #7c3aed; }
[data-theme="light"] { --bg: #f5f5f5; --card: #fff; --text: #1a1a2e; --accent: #6d28d9; }
body { font-family: system-ui; background: var(--bg); color: var(--text); max-width: 1200px; margin: 0 auto; }
.badge { padding: 2px 8px; border-radius: 12px; font-size: 0.75rem; }
.badge-github { background: #22c55e20; color: #22c55e; }
.badge-hn { background: #f9731620; color: #f97316; }
.badge-lobsters { background: #ef444420; color: #ef4444; }
.badge-ai { background: #7c3aed20; color: #7c3aed; }
.takeaway { background: var(--accent)15; border-left: 3px solid var(--accent); padding: 8px 12px; margin-top: 8px; }
.tabs button { background: none; border: none; color: var(--text); padding: 8px 16px; cursor: pointer; }
.tabs button.active { border-bottom: 2px solid var(--accent); }
.card { background: var(--card); border-radius: 8px; padding: 16px; margin: 8px 0; }
</style>
</head>
<body>
<header><!-- Заголовок + theme toggle --></header>
<nav class="tabs"><!-- 4 вкладки: GitHub Trending, HN, Lobsters, AI Agents --></nav>
<main><!-- CSS grid карточки --></main>
<script>/* Theme toggle: localStorage.getItem/setItem('theme') */</script>
</body>
</html>
Шаг 4: Открыть отчёт
open claudedocs/shir-man-daily-report-YYYY-MM-DD.html
Шаг 5: Очистка
pkill -f pinchtab
PinchTab daemon и MCP-процессы остаются жить между сессиями — их нужно убивать после каждого запуска, иначе они накапливаются.
Известные ограничения
| Проблема | Причина | Workaround |
|---|---|---|
pinchtab_eval → 404 | Баг PinchTab #225 | Парсить данные из snapshot StaticText |
pinchtab_type не работает | macOS баг #226 | Не нужен для этого скилла (только клики) |
| WebFetch 404 на некоторых URL | Устаревшие ссылки или paywall | Пропускать, не ретраить |
| Snapshot refs меняются | Ожидаемое поведение после навигации | Пере-snapshot после каждого клика |
| shir-man.com без API | SPA рендерит всё на клиенте | Только headless-браузер (PinchTab) |