CLI that turns LLM input into well-formatted Conventional Commits
0

Configure Feed

Select the types of activity you want to include in your feed.

refactor(release): simplify bumps and add graduate

- Consolidated prerelease logic into a case statement
- Added 'graduate' option when current version is prerelease
- Now uses svu's built-in prerelease flag with user-provided suffix
- When graduating, llm-tag generates changelog from last stable tag

Assisted-by: Claude Sonnet 4.5 via Crush

Amolith (Nov 30, 2025, 11:14 AM -0700) 3d60ef1e 279d4085

+19 -57
+19 -57
Taskfile.yaml
··· 98 98 desc: Interactive release workflow 99 99 vars: 100 100 BUMP: 101 - sh: gum choose "major" "minor" "patch" "prerelease" 102 - CURRENT_VERSION: 103 - sh: git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0" 104 - IS_CURRENT_PRERELEASE: 105 101 sh: | 106 - current="{{.CURRENT_VERSION}}" 107 - if echo "$current" | grep -qE '\-[a-zA-Z]+\.[0-9]+$'; then 108 - echo "yes" 109 - else 110 - echo "no" 111 - fi 112 - IS_PRERELEASE: 113 - sh: | 114 - if [ "{{.BUMP}}" = "prerelease" ]; then 115 - echo "yes" 116 - else 117 - gum confirm "Create pre-release?" && echo "yes" || echo "no" 118 - fi 119 - PRERELEASE_SUFFIX: 120 - sh: | 121 - if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then 122 - # Extract suffix from current version (e.g., v1.2.3-beta.0 -> beta) 123 - echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-([a-zA-Z]+)\.[0-9]+$/\1/' 124 - elif [ "{{.IS_PRERELEASE}}" = "yes" ]; then 125 - gum input --placeholder "Enter pre-release suffix (e.g., beta, rc)" 126 - fi 127 - BASE_NEXT: 128 - sh: | 129 - if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then 130 - # Extract base version from current prerelease (e.g., v1.2.3-beta.0 -> v1.2.3) 131 - echo "{{.CURRENT_VERSION}}" | sed -E 's/-[a-zA-Z]+\.[0-9]+$//' 132 - else 133 - svu {{.BUMP}} 134 - fi 135 - SUFFIX_VERSION: 136 - sh: | 137 - if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then 138 - if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then 139 - # Increment the current prerelease number 140 - current_num=$(echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-[a-zA-Z]+\.([0-9]+)$/\1/') 141 - echo $((current_num + 1)) 142 - else 143 - # Find existing tags with this suffix and get the highest version number 144 - highest=$(git tag -l "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.*" | \ 145 - sed 's/.*-{{.PRERELEASE_SUFFIX}}\.//' | \ 146 - sort -n | tail -1) 147 - if [ -n "$highest" ]; then 148 - echo $((highest + 1)) 149 - else 150 - echo 0 151 - fi 152 - fi 102 + opts="major minor patch prerelease" 103 + if git describe --tags --abbrev=0 2>/dev/null | grep -qE '\-[a-zA-Z]+\.[0-9]+$'; then 104 + opts="$opts graduate" 153 105 fi 106 + gum choose $opts 154 107 NEXT: 155 108 sh: | 156 - if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then 157 - echo "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.{{.SUFFIX_VERSION}}" 158 - else 159 - echo "{{.BASE_NEXT}}" 160 - fi 109 + case "{{.BUMP}}" in 110 + graduate) svu next ;; 111 + prerelease) 112 + suffix=$(gum input --placeholder "Suffix (beta, rc, etc.)") 113 + svu prerelease --pre-release "$suffix" ;; 114 + *) svu {{.BUMP}} ;; 115 + esac 116 + LAST_STABLE: 117 + sh: git tag -l | grep -v '\-' | sort -V | tail -n 1 161 118 prompt: "Release {{.NEXT}}?" 162 119 preconditions: 163 120 - sh: '[ $(git symbolic-ref --short HEAD) = "main" ] || [ $(git symbolic-ref --short HEAD) = "dev" ]' ··· 165 122 - sh: "[ $(git status --porcelain=2 | wc -l) = 0 ]" 166 123 msg: "Git is dirty" 167 124 cmds: 168 - - llm-tag {{.NEXT}} 125 + - | 126 + if [ "{{.BUMP}}" = "graduate" ]; then 127 + llm-tag -b {{.LAST_STABLE}} {{.NEXT}} 128 + else 129 + llm-tag {{.NEXT}} 130 + fi 169 131 - git push soft {{.NEXT}} 170 132 - go list -m git.secluded.site/formatted-commit@{{.NEXT}} > /dev/null 171 133 - echo "Released {{.NEXT}} and notified module proxy"