Skip to content

jtprogru/jtpost

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

68 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

jtpost

CLI-редактор постов для управления контент-пайплайном (Telegram).

Go Version License Go Report Card CI Release

Версия: 0.3.0 | Статус: Активная разработка


Описание

jtpost — утилита командной строки для управления жизненным циклом постов: от идеи до публикации в Telegram-канале.

Возможности

  • ✅ Создание постов с frontmatter (YAML + Markdown)
  • ✅ Управление статусами: ideadraftreadyscheduledpublished
  • ✅ Публикация в Telegram
  • ✅ Фильтрация и поиск постов
  • ✅ Планирование публикаций
  • ✅ Импорт существующих Markdown-файлов
  • ✅ SQLite хранилище для метаданных
  • ✅ Миграция между хранилищами (FS ↔ SQLite)
  • ✅ HTTP API с Web UI (htmx + Bootstrap)
  • ✅ Логирование и middleware
  • ✅ UUID v7 идентификаторы для постов

Установка

Homebrew (macOS / Linux)

brew install jtprogru/tap/jtpost

Docker

Multi-arch образы (linux/amd64, linux/arm64) публикуются в GHCR:

docker pull ghcr.io/jtprogru/jtpost:latest
docker run --rm -v "$PWD:/data" ghcr.io/jtprogru/jtpost list

Из исходников

git clone https://github.com/jtprogru/jtpost.git
cd jtpost
go install ./cmd/jtpost

Через Go Install

go 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

Быстрый старт

1. Инициализация проекта

jtpost init

Создаёт файл .jtpost.yaml с конфигурацией по умолчанию.

2. Создание нового поста

jtpost new "Мой первый пост"

Создаёт Markdown-файл с frontmatter в директории постов.

3. Просмотр списка постов

jtpost list
jtpost list --status draft
jtpost list --tag golang

4. Смена статуса

jtpost 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 хранилищем

# Миграция из файлового хранилища в SQLite
jtpost migrate

# Работа с SQLite через флаг
jtpost list --db .jtpost.db

# Обратная миграция (SQLite → FS)
jtpost migrate --to fs

🌐 HTTP API и Web UI

# Запустить сервер на localhost:8080
jtpost serve

# Запустить на другом порту
jtpost serve --port 3000

# Запустить на всех интерфейсах
jtpost serve --addr 0.0.0.0 --port 8080

После запуска:

🔧 Примеры скриптов

Автоматическая публикация по расписанию (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})'

Команды CLI

Команда Описание
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 хранилищем:

# Миграция из файлового хранилища в 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/jtpost

Запуск

task run:cmd
# или
go run ./cmd/jtpost

Тесты

task test
task test:race
task test:coverage

Линтинг

task lint

Структура проекта

jtpost/
├── 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

Для AI-ассистентов

  • AGENTS.md — руководство для AI-ассистентов
  • QWEN.md — контекст проекта для AI

📚 Дополнительные ресурсы

About

No description, website, or topics provided.

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors