covers.js:
- buildCoverPrompt() принимает channelStyle: использует image_style из
канала (abstract/3d-render/minimal/etc.) вместо дефолтного ротационного
COVER_STYLES. image_palette и image_custom_colors перекрывают цвета.
image_prompt_instructions добавляется как Channel visual guidelines.
- generateCover() принимает channelId, загружает channel_style из БД.
postImages.js:
- image_prompt_instructions добавляется в промпт постовой картинки.
articles.js:
- generateCover вызывается с channelId=1 (системный блог-канал zeropost.ru).
services/channels.js:
- updateChannel whitelist расширен: добавлены image_enabled, image_style,
image_palette, image_custom_colors, image_prompt_instructions.
Раньше эти поля молча игнорировались при PATCH канала.
DB:
- ALTER TABLE channel_style ADD COLUMN image_prompt_instructions TEXT;
- Системный канал id=1 получил хорошие дефолты: style=abstract,
palette=dark, instructions=Modern tech editorial blog cover...
- Персонаж Зеро: 23 позы (zeroCharacter.js), скрипты генерации
- Auto-publish статей в TG: multipart upload, кнопки, режим alternating Zero/cover
- Fallback цепочка обложек: aiprimetech gpt-5.5 → Pollinations → local SVG (6 палитр)
- Auto-series: Claude haiku определяет серию для каждой статьи автоматически
- Channel stats: подписчики, история, delta 24h/7d
- Photo-search: Yandex API, профили доменов, Redis лимиты
- Scheduled posts runner: backfill, preview, queue, cancel
- promptBuilder: author_persona Зеро, голос от первого лица
- Fixes: dollar-placeholder bugs в PATCH channels/autogen, listArticles фильтры
- AI model: gpt-5.5 для image generation
- БД: таблица articles (slug, title, excerpt, content, cover, tags, SEO)
- services/articles.js: slugify (ru→en транслит), reading_time, генерация со встроенным blog-channel
- routes/articles.js: GET list/tags/:slug, POST /generate
- Универсальный blogChannel со стилем для лонгридов: tone:friendly, structure:headers, без эмодзи и хэштегов
- generateAndSaveArticle: вытаскивает title из H1, генерит excerpt, считает время чтения