«Утренняя вкладка» — ежедневная газетная страница-дайджест на любую тему пользователя: материалы из бесплатных RSS, Google News, Hacker News, arXiv и GitHub, тексты на нужном языке пишет сам агент, страница публикуется по постоянной ссылке. Use when просят утреннюю вкладку, дайджест или газету по теме, «собери главное про X за сутки», «сделай ежедневную подборку новостей по Y», «страницу с новостями темы каждое утро», «обнови вкладку», «поставь дайджест на расписание» — even if слов «morning-...
Installs into .claude/skills of the current project.
Are you the author of Morning Tab?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/smixs-morning-tab)
---
name: morning-tab
description: >-
«Утренняя вкладка» — ежедневная газетная страница-дайджест на любую тему пользователя:
материалы из бесплатных RSS, Google News, Hacker News, arXiv и GitHub, тексты
на нужном языке пишет сам агент, страница публикуется по постоянной ссылке. Use when
просят утреннюю вкладку, дайджест или газету по теме, «собери главное про X за сутки»,
«сделай ежедневную подборку новостей по Y», «страницу с новостями темы каждое утро»,
«обнови вкладку», «поставь дайджест на расписание» — even if слов «morning-tab» и
«вкладка» нет. Do NOT use for разового ответа на новостной вопрос в чате, постов в
Telegram-канал, email-рассылок, мониторинга цен и упоминаний бренда.
---
# Утренняя вкладка
Страница в стиле утренней газеты: шапка, главная история с картинкой, вторая история, заметки, блок «Главное за день», альманах (погода, восход и закат, счётчики рубрик) и рубрики по источникам. Сбор и вёрстку делают скрипты, тексты пишет агент, публикация идёт на статический хостинг. Образец вида — `assets/example-ai.png`, `assets/example-urbanism.png`.
## Термины
- **Тема** — то, о чём страница; одна тема = одна рабочая папка.
- **Рабочая папка** — `~/morning-tab/<slug>/` с `config.json` (конфиг) и `out/`.
- **Выпуск** — сбор → тексты → вёрстка → проверка → публикация за один день.
- **Рутина** — ежедневный выпуск по расписанию без человека.
Ниже `<skill>` — папка этого скилла, `<ws>` — рабочая папка темы.
## Режим
| Ситуация | Режим |
|---|---|
| рабочей папки темы нет или в ней нет `config.json` | **Первый запуск** → `references/setup.md`, затем выпуск, затем предложение рутины |
| папка есть, пользователь в чате | **Выпуск** |
| запуск по расписанию (промпт говорит «режим рутины») | **Выпуск в рутине**: вопросов не задавать, при FAIL остановиться и последней строкой написать причину и что исправить |
Если пользователь назвал тему, а папок несколько, сопоставить по `title`/`topline` в их `config.json`; совпадения нет — это первый запуск новой темы.
## Шаг 0. Pre-flight — каждый запуск
```
bash <skill>/scripts/preflight.sh <ws>/config.json
```
Проверяет Bun, зависимости, браузер для скриншотов, сеть, конфиг и вход на площадку публикации. Каждый FAIL печатается со способом исправить.
- **PREFLIGHT: FAIL** → не продолжать. Показать пользователю каждый FAIL и команду исправления; ключ или вход, которые может дать только он, запросить у него. После исправления запустить pre-flight снова.
- Почему: без браузера пропадает проверка скриншотом, без входа на площадку страница не выйдет, а обходной путь (другой хостинг, «опубликую потом») даёт пользователю не ту ссылку, что он сохранил.
## Первый запуск
Тему и источники всегда спрашивать у пользователя, примеры из `config/` — только заготовка формата. Порядок: `references/setup.md`.
- [ ] тема и источники названы пользователем (или он сказал «подбери сам» и утвердил подобранный список);
- [ ] источники проверены сбором: нет `ошибка`/`ПУСТО`, материалов не меньше 12;
- [ ] площадка выбрана, pre-flight с конфигом — OK;
- [ ] пользователь сказал «ок» по итоговому списку.
## Выпуск
1. **Сбор.** `bun <skill>/scripts/fetch.ts --config <ws>/config.json --out <ws>/out` → `out/items.json`, `out/texts.template.json`. Источник с `ошибка` или `ПУСТО` назвать в отчёте; в первом запуске исправить по `references/setup.md` §5.
2. **Тексты.** Прочитать `out/items.json` (`title`, `summary`, `body` у главной и второй) и записать `out/texts.json` по образцу `out/texts.template.json`:
- `items[].title` — короткий газетный заголовок на языке страницы, имена брендов как есть;
- `items[].summary` — 1–2 предложения: что произошло и почему важно;
- `digest` — 3–5 пунктов `{id, text}`, по одному предложению;
- `lead_paragraph` — 3–5 предложений о главной (`leadId`).
Факты брать только из `title`, `summary`, `body`: страница выходит под именем источника, и выдуманная деталь подрывает доверие ко всей подборке. Переводить сам агент; сервисы машинного перевода не подключать — это платный API и худший язык.
3. **Вёрстка.** `bun <skill>/scripts/render.ts --config <ws>/config.json --out <ws>/out` → `out/site/index.html`, `out/screenshot-top.png`, `out/screenshot.png`. Падает со списком id, если текст не заполнен, — дописать и повторить.
4. **Проверка глазами.** Открыть `out/screenshot-top.png`:
- [ ] вёрстка как в `assets/example-*.png`, ничего не наехало;
- [ ] все заголовки на языке страницы;
- [ ] у главной есть картинка, у остальных битые картинки скрыты;
- [ ] в шапке нейтральный тон: без шуток и обращений к читателю.
5. **Публикация.** Команда для `publish.target` и проверка ссылки — `references/publish.md`. Ссылка не отвечает `200` или дата в `<title>` не сегодняшняя — выпуск не готов.
6. **Отчёт.** Полная ссылка, `out/screenshot-top.png`, одна фраза о главном за день, проблемные источники (если были).
«Готово» говорить только после пунктов 4 и 5: скрипт отрабатывает и тогда, когда страница сломана визуально или выложена старая версия.
## После первого выпуска — рутина
Когда пользователь посмотрел страницу и сказал «ок», предложить ежедневный выпуск. Ставить только после его согласия: каждый запуск расходует лимит или токены агента. Как предложить, поставить и проверить — `references/routine.md`.
## Правила
- Источники только бесплатные. Платный API (X API, платный поиск, перевод) — после того как пользователь услышал цену и явно согласился.
- Токены и ключи хранить в окружении или залогиненном CLI; `config.json` и репозиторий — без секретов.
- Конфиг меняется только по слову пользователя; в рутине — никогда.
## Неполадки
| Симптом | Причина | Что делать |
|---|---|---|
| источник: `HTTP 403`/`429` | сайт режет запросы с серверов | убрать источник или заменить запросом Google News по теме |
| `Ни одного материала` | все источники пусты за окно | расширить `windowHours`, добавить запрос Google News |
| `texts.json не прошёл проверку` | не все id заполнены | дописать перечисленные id |
| `Скриншот не снят` | нет браузера | `cd <skill> && bunx playwright install chromium` |
| `Конфиг … с ошибками` | поле пропущено или раздел не описан | исправить по списку ошибок |
| на странице вчерашние новости | выложилась старая папка или кэш CDN | повторить публикацию, проверить `<title>` |