CLI-редактор постов для управления контент-пайплайном (Telegram).
Версия: 0.3.0 | Статус: Активная разработка
jtpost — утилита командной строки для управления жизненным циклом постов: от идеи до публикации в Telegram-канале.
- ✅ Создание постов с frontmatter (YAML + Markdown)
- ✅ Управление статусами:
idea→draft→ready→scheduled→published - ✅ Публикация в Telegram
- ✅ Фильтрация и поиск постов
- ✅ Планирование публикаций
- ✅ Импорт существующих Markdown-файлов
- ✅ SQLite хранилище для метаданных
- ✅ Миграция между хранилищами (FS ↔ SQLite)
- ✅ HTTP API с Web UI (htmx + Bootstrap)
- ✅ Логирование и middleware
- ✅ UUID v7 идентификаторы для постов
brew install jtprogru/tap/jtpostMulti-arch образы (linux/amd64, linux/arm64) публикуются в GHCR:
docker pull ghcr.io/jtprogru/jtpost:latest
docker run --rm -v "$PWD:/data" ghcr.io/jtprogru/jtpost listgit clone https://github.com/jtprogru/jtpost.git
cd jtpost
go install ./cmd/jtpostgo install github.com/jtprogru/jtpost/cmd/jtpost@latestСкачайте готовый бинарник со страницы Releases. Подпись checksums.txt GPG-ключом проверяется через gpg --verify checksums.txt.sig checksums.txt.
- Go 1.25.5+
- macOS, Linux, Windows
jtpost initСоздаёт файл .jtpost.yaml с конфигурацией по умолчанию.
jtpost new "Мой первый пост"Создаёт Markdown-файл с frontmatter в директории постов.
jtpost list
jtpost list --status draft
jtpost list --tag golangjtpost status <id> --set ready# 1. Создать пост с заголовком и тегами
jtpost new "Как оптимизировать Go код" --tag go --tag performance
# 2. Отредактировать содержимое в редакторе
jtpost edit <id>
# 3. Начать работу над постом (idea → draft)
jtpost status <id> --set draft
# 4. Завершить работу (draft → ready)
jtpost status <id> --set ready
# 5. Опубликовать в Telegram
jtpost publish <id>
# 6. Пометить как опубликованный
jtpost status <id> --set published# Все черновики
jtpost list --status draft
# Посты с тегом "golang"
jtpost list --tag golang
# Комбинация фильтров
jtpost list --status draft --tag go --platform telegram
# Поиск по заголовку
jtpost list --search "оптимизация"
# Вывод в JSON формате
jtpost list --format json# План публикаций на месяц
jtpost plan
# План на неделю
jtpost plan --days 7
# Получить рекомендацию следующего поста для работы
jtpost next
# Статистика по постам
jtpost stats# Предпросмотр импорта
jtpost import --dry-run
# Импорт всех Markdown файлов из content/posts/
jtpost import
# Интерактивный режим с подтверждением каждого файла
jtpost import --interactive# Миграция из файлового хранилища в SQLite
jtpost migrate
# Работа с SQLite через флаг
jtpost list --db .jtpost.db
# Обратная миграция (SQLite → FS)
jtpost migrate --to fs# Запустить сервер на localhost:8080
jtpost serve
# Запустить на другом порту
jtpost serve --port 3000
# Запустить на всех интерфейсах
jtpost serve --addr 0.0.0.0 --port 8080После запуска:
- Web UI: http://localhost:8080
- API: http://localhost:8080/api/posts
Автоматическая публикация по расписанию (cron):
# crontab -e
# Публикация запланированных постов каждый час
0 * * * * jtpost list --status scheduled --format json | jq -r '.[].id' | xargs -I {} jtpost publish {} --to telegramПакетное создание постов:
#!/bin/bash
# create-series.sh
for topic in "basics" "intermediate" "advanced"; do
jtpost new "Go Guide: $topic" --tag go --tag series
doneЭкспорт статистики:
# Экспорт статистики в JSON
jtpost stats --format json > stats.json
# Анализ тегов
jtpost list --format json | jq '[.[].tags] | flatten | group_by(.) | map({tag: .[0], count: length})'| Команда | Описание |
|---|---|
jtpost init |
Инициализация проекта (создание .jtpost.yaml) |
jtpost new <title> |
Создание нового поста |
jtpost list |
Список всех постов |
jtpost show <id> |
Показать детали поста |
jtpost status <id> --set <status> |
Сменить статус поста |
jtpost edit <id> |
Редактировать пост в $EDITOR |
jtpost delete <id> |
Удалить пост |
jtpost import |
Импорт постов из content/posts/ |
jtpost migrate |
Миграция из FS в SQLite |
jtpost publish <id> |
Опубликовать в Telegram |
jtpost plan |
Показать план публикаций |
jtpost stats |
Статистика по постам |
jtpost next |
Показать следующий пост для публикации |
jtpost serve |
Запустить HTTP API сервер |
jtpost doctor |
Диагностика конфигурации и доступности зависимостей |
jtpost --help |
Показать справку |
Посты хранятся в формате Markdown с YAML frontmatter:
---
id: "0195e8d4-3c7a-7b2e-8f3a-9c5d6e4f2a1b"
title: "Заголовок поста"
slug: "my-first-post"
status: "draft"
deadline: "2026-02-01"
scheduled_at: "2026-02-03T10:00:00+03:00"
tags: ["golang", "cli"]
external:
telegram_url: ""
---
Тело поста в формате Markdown...Файл .jtpost.yaml в корне проекта:
# Пути к директориям с постами
posts_dir: content/posts
templates_dir: templates
# SQLite хранилище (опционально)
sqlite:
dsn: .jtpost.db
# Telegram настройки
telegram:
bot_token: "${TELEGRAM_BOT_TOKEN}"
chat_id: "${TELEGRAM_CHAT_ID}"
# Настройки по умолчанию
defaults:
status: draftВсе поля конфигурации можно переопределить через переменные с префиксом JTPOST_ (вложенные ключи разделяются _). Приоритет: env > yaml > defaults.
| Переменная | Поле в YAML |
|---|---|
JTPOST_POSTS_DIR |
posts_dir |
JTPOST_TEMPLATES_DIR |
templates_dir |
JTPOST_TELEGRAM_BOT_TOKEN |
telegram.bot_token |
JTPOST_TELEGRAM_CHAT_ID |
telegram.chat_id |
JTPOST_SQLITE_DSN |
sqlite.dsn |
JTPOST_DEFAULTS_STATUS |
defaults.status |
Для работы с SQLite хранилищем:
# Миграция из файлового хранилища в SQLite
jtpost migrate
# Работа с SQLite через флаг
jtpost list --db .jtpost.db
# Или через конфигурацию (.jtpost.yaml)
sqlite:
dsn: .jtpost.dbПодробнее: docs/sqlite.md
task build:bin
# или
go build -o ./dist/jtpost ./cmd/jtposttask run:cmd
# или
go run ./cmd/jtposttask test
task test:race
task test:coveragetask lintjtpost/
├── cmd/jtpost/ # Точка входа CLI
├── internal/
│ ├── core/ # Доменная модель и интерфейсы
│ ├── adapters/ # Реализации (FS, SQLite, Telegram, HTTP)
│ └── cli/ # Cobra команды
├── templates/ # Шаблоны постов
├── testdata/ # Тестовые данные
├── docs/ # Документация
├── .jtpost.db # SQLite БД (опционально)
└── .jtpost.yaml # Конфигурация проекта
| Метрика | Значение |
|---|---|
| CLI команд | 15 |
| HTTP API endpoints | 9 |
| Хранилища | 2 (FS, SQLite) |
| Платформы | 1 (Telegram) |
| Статусы поста | 5 |
| Формат ID | UUID v7 |
| Тесты | 100% PASS |
| Линтер | 0 issues |
| Go версия | 1.25.5+ |
idea → draft → ready → scheduled → published
- idea — черновик идеи, требует проработки
- draft — активная работа над постом
- ready — готов к публикации
- scheduled — запланирован на дату
- published — опубликован
MIT
- ROADMAP.md — план развития проекта (версии 0.2.0, 0.3.0, 0.4.0, 1.0.0)
- CHANGELOG.md — история изменений проекта
- CONTRIBUTING.md — руководство для участников проекта
- docs/cli.md — полное описание CLI команд с примерами
- docs/api.md — документация HTTP API endpoints
- docs/architecture.md — архитектура проекта (Hexagonal)
- docs/configuration.md — настройка и конфигурация
- docs/development.md — руководство для разработчиков
- docs/sqlite.md — SQLite хранилище и миграция
- docs/logging.md — логирование и middleware
- ROADMAP.md — детальный план развития
- Effective Go — стиль кода Go
- Cobra CLI — фреймворк для CLI
- htmx — библиотека для Web UI
- Telegram Bot API — API Telegram