Чеклист для каждого релиза task-journal v0.X.Y.
- GitHub repo создан, origin подключён.
- crates.io аккаунт заведён → Settings → API Tokens → создать токен
task-journal-publishсо scopespublish-newиpublish-update(безpublish-updateновые версии уже существующих crate'ов не опубликуются). - GitHub Secrets (Settings → Secrets and variables → Actions → New repository secret):
CRATES_IO_TOKEN= токен из шага 2.publish.ymlчитает именно этот secret и передаёт его cargo как envCARGO_REGISTRY_TOKEN— поэтому ошибка «CARGO_REGISTRY_TOKEN is empty» значит, что не заданCRATES_IO_TOKEN.
- Crate names проверены —
cargo search task-journal-core task-journal-cli task-journal-mcpпоказывает что свободны. Если заняты — поменять в Cargo.toml каждого crate (name = "...").
# Убедись что main green
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings
cargo fmt --all --check
# Bump version в Cargo.toml workspace (раз — все crates наследуют через version.workspace = true)
# Edit Cargo.toml: version = "0.1.1" (или 0.2.0, 1.0.0, etc.)
#
# ВАЖНО: версия плагина НЕ наследуется из Cargo.toml — синхронь вручную, иначе
# `/plugin update` будет показывать старую версию (см. историю: 0.10.3 vs 0.12.0).
# Обнови до той же версии:
# - Cargo.toml [workspace.dependencies] → tj-core version (cargo publish
# заливает её как требование на core)
# - plugin/.claude-plugin/plugin.json → "version"
# - plugin/package.json → "version"
# - .claude-plugin/marketplace.json → metadata.version И plugins[0].version
#
# Проверка (падает, если хоть один манифест или пин отстал):
cargo test -p task-journal-cli --test plugin_metadata
# Плагин целиком — манифест, MCP-объявления, frontmatter скиллов и команд:
claude plugin validate plugin --json
git add Cargo.toml Cargo.lock plugin/.claude-plugin/plugin.json plugin/package.json .claude-plugin/marketplace.json
git commit -m "chore: bump version to v0.1.1"
git pushНе забудь тег. Версия в
Cargo.tomlсама по себе НЕ публикует. crates.io и GitHub Release триггерит только push тегаvX.Y.Z(шаг 2). Если бампнул версию в feature-PR и смёржил без тега — релиз НЕ вышел, crates.io отстанет.
git tag v0.1.1
git push origin v0.1.1Это автоматически триггерит:
.github/workflows/release.yml— собирает pre-built бинарники под Linux/macOS-x86_64/macOS-arm64/Windows и публикует GitHub Release с прикреплённымиtar.gz/.zip+checksums.txt..github/workflows/publish.yml— публикует все 3 crate'а на crates.io (нуженCRATES_IO_TOKENsecret).
Оба workflow сначала гоняют свой job test (fmt, clippy -D warnings, cargo test --workspace --all-targets); если он красный — ни бинарники, ни crate'ы не публикуются.
cargo login # paste crates.io token
cargo publish -p task-journal-core
sleep 60 # как в publish.yml: crates.io должен проиндексировать core
cargo publish -p task-journal-cli
sleep 30
cargo publish -p task-journal-mcp- GitHub Releases страница: https://github.com/Digital-Threads/Task-Journal/releases — должен быть
v0.1.1с 4 артефактами. - crates.io: https://crates.io/crates/task-journal-core (и cli, mcp) — должна появиться версия v0.1.1.
Если первая публикация — добавить badge'и:
[](https://github.com/Digital-Threads/Task-Journal/actions/workflows/ci.yml)
[](https://crates.io/crates/task-journal-cli)
[](LICENSE)Для каждой следующей версии:
- Пройди шаг 1 целиком:
Cargo.toml(workspaceversionи пинtj-core) и три манифеста плагина,plugin_metadataзелёный git tag vX.Y.Z && git push origin vX.Y.Z- CI делает остальное
| Симптом | Что проверить |
|---|---|
cargo publish падает с "name already taken" |
Имя crate занято на crates.io. Поменяй name = "..." в Cargo.toml на другое. |
| Release workflow не запустился | Тэг должен начинаться с v (например v0.1.0, не 0.1.0 или release-0.1.0). |
cargo publish -p task-journal-cli падает с "task-journal-core not found" |
Не подождал sleep 60 после публикации task-journal-core — повтори через минуту. |
| Pre-built binary не работает на macOS — "killed" | Apple Silicon vs Intel — скачай правильный target (aarch64-apple-darwin для M1/M2/M3, x86_64-apple-darwin для Intel). |