From b9b2c07d2ad1a728ac8498481f5048f19f9bcf05 Mon Sep 17 00:00:00 2001 From: "alexei.dolgolyov" Date: Sat, 16 May 2026 18:34:26 +0300 Subject: [PATCH] feat(release-publisher): add pre-release checks, pre-flight guards, CI watch Substantial revision of dolgolyov-git-release-publisher SKILL.md. New steps: - Step 2: pre-flight guards (branch, remote sync, duplicate tag, dirty tree) - Step 4: pre-release checks - detect project type, inspect CI config, run tests/lint/typecheck/build locally before tagging - Step 15: post-tag CI watch (link-only or poll until run finishes) Improvements: - SSH remote support in Step 1 - Detect prerelease tags separately in Step 3 - NUL-separated git log + BREAKING CHANGE: body scan in Step 5 - Prerelease version bumps (-rc.N / -beta.N / -alpha.N) in Step 8 - Mode A (RELEASE_NOTES.md overwrite) vs Mode B (CHANGELOG.md prepend) in Step 11 - Signed-tag detection in Step 14 New edge cases: redo-after-CI-failure flow, signed tags, tag-already-on-HEAD. Also updates the one-line description in claude-code-tools.md and bumps README last-updated date. --- README.md | 2 +- claude-code-tools.md | 2 +- skills/dolgolyov-git-release-publisher.skill | Bin 8380 -> 13192 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c34f274..ea7c134 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Claude Code Facts -> Last updated: 2026-04-28 +> Last updated: 2026-05-16 A collection of interesting and useful facts, tips, tools, and guides for working with Claude and Claude Code. diff --git a/claude-code-tools.md b/claude-code-tools.md index a368d49..7585151 100644 --- a/claude-code-tools.md +++ b/claude-code-tools.md @@ -73,7 +73,7 @@ Fast code search skill for Claude Code — find classes, symbols, usages, implem Packaged `.skill` files available in the [skills/](skills/) directory: - **dolgolyov-dev-facts** — Sync local project configuration with the central claude-code-facts knowledge base. -- **dolgolyov-git-release-publisher** — Generate release notes and push release tags for repos hosted on Gitea or GitHub. +- **dolgolyov-git-release-publisher** — Generate release notes and push release tags for repos hosted on Gitea or GitHub. Runs pre-release checks (tests / lint / typecheck), pre-flight guards (branch, remote sync, duplicate tag, dirty tree), and post-tag CI watch. Supports `RELEASE_NOTES.md` overwrite or `CHANGELOG.md` prepend modes and prerelease versions (`-rc.N`, `-beta.N`, `-alpha.N`). - **feature-planner** — Plan and develop complex features using a structured, phase-based workflow with git integration, Markdown plans, review gates, and controlled merging. ## Toolkits diff --git a/skills/dolgolyov-git-release-publisher.skill b/skills/dolgolyov-git-release-publisher.skill index 1d45d258428393f93d1d0236051b09905175490b..9bc2722e540e84629aef8e4fc2969f9056049ead 100644 GIT binary patch delta 11182 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 delta 6298 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 QFc_0OGe!pP9{>OV0DIFS%K!iX