Taskfile.yaml

  1# SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
  2#
  3# SPDX-License-Identifier: CC0-1.0
  4
  5version: "3"
  6
  7vars:
  8  VERSION:
  9    sh: git describe --tags --always 2>/dev/null || echo "v0.0.0"
 10  GOOS:
 11    sh: go env GOOS
 12  GOARCH:
 13    sh: go env GOARCH
 14
 15env:
 16  CGO_ENABLED: 0
 17
 18tasks:
 19  default:
 20    desc: Run all checks
 21    cmds:
 22      - task: fmt
 23      - task: lint
 24      - task: staticcheck
 25      - task: test
 26      - task: vuln
 27      - task: reuse
 28
 29  fmt:
 30    cmds:
 31      - go install mvdan.cc/gofumpt@latest
 32      - gofumpt -l -w .
 33
 34  lint:
 35    cmds:
 36      - golangci-lint run
 37
 38  lint:fix:
 39    cmds:
 40      - golangci-lint run --fix
 41
 42  staticcheck:
 43    cmds:
 44      - go install honnef.co/go/tools/cmd/staticcheck@latest
 45      - staticcheck ./...
 46
 47  test:
 48    cmds:
 49      - go test -v ./...
 50
 51  integration:
 52    desc: Run integration tests against real API (requires LUNATASK_API_KEY, LUNATASK_TEST_AREA)
 53    cmds:
 54      - go test -v -tags=integration ./...
 55
 56  badge:
 57    desc: Update coverage badge
 58    cmds:
 59      - |
 60        pct=$(go test -cover ./... 2>&1 | grep -oP 'coverage: \K[0-9.]+')
 61        if [ "$pct" = "" ]; then echo "Failed to get coverage"; exit 1; fi
 62        color=red; [ "$(echo "$pct >= 50" | bc)" -eq 1 ] && color=yellow
 63        [ "$(echo "$pct >= 80" | bc)" -eq 1 ] && color=brightgreen
 64        sed -i "s|coverage-[0-9.]*%25-[a-z]*|coverage-${pct}%25-${color}|" README.md
 65        echo "Updated badge to ${pct}% (${color})"
 66
 67  vuln:
 68    cmds:
 69      - go install golang.org/x/vuln/cmd/govulncheck@latest
 70      - govulncheck ./...
 71
 72  reuse:
 73    cmds:
 74      - reuse lint
 75
 76  release:
 77    desc: Interactive release workflow
 78    vars:
 79      BUMP:
 80        sh: gum choose "major" "minor" "patch" "prerelease"
 81      CURRENT_VERSION:
 82        sh: git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0"
 83      IS_CURRENT_PRERELEASE:
 84        sh: |
 85          current="{{.CURRENT_VERSION}}"
 86          if echo "$current" | grep -qE '\-[a-zA-Z]+\.[0-9]+$'; then
 87            echo "yes"
 88          else
 89            echo "no"
 90          fi
 91      IS_PRERELEASE:
 92        sh: |
 93          if [ "{{.BUMP}}" = "prerelease" ]; then
 94            echo "yes"
 95          else
 96            gum confirm "Create pre-release?" && echo "yes" || echo "no"
 97          fi
 98      PRERELEASE_SUFFIX:
 99        sh: |
100          if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
101            # Extract suffix from current version (e.g., v1.2.3-beta.0 -> beta)
102            echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-([a-zA-Z]+)\.[0-9]+$/\1/'
103          elif [ "{{.IS_PRERELEASE}}" = "yes" ]; then
104            gum input --placeholder "Enter pre-release suffix (e.g., beta, rc)"
105          fi
106      BASE_NEXT:
107        sh: |
108          if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
109            # Extract base version from current prerelease (e.g., v1.2.3-beta.0 -> v1.2.3)
110            echo "{{.CURRENT_VERSION}}" | sed -E 's/-[a-zA-Z]+\.[0-9]+$//'
111          else
112            svu {{.BUMP}}
113          fi
114      SUFFIX_VERSION:
115        sh: |
116          if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
117            if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
118              # Increment the current prerelease number
119              current_num=$(echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-[a-zA-Z]+\.([0-9]+)$/\1/')
120              echo $((current_num + 1))
121            else
122              # Find existing tags with this suffix and get the highest version number
123              highest=$(git tag -l "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.*" | \
124                sed 's/.*-{{.PRERELEASE_SUFFIX}}\.//' | \
125                sort -n | tail -1)
126              if [ -n "$highest" ]; then
127                echo $((highest + 1))
128              else
129                echo 0
130              fi
131            fi
132          fi
133      NEXT:
134        sh: |
135          if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
136            echo "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.{{.SUFFIX_VERSION}}"
137          else
138            echo "{{.BASE_NEXT}}"
139          fi
140    prompt: "Release {{.NEXT}}?"
141    preconditions:
142      - sh: '[ $(git symbolic-ref --short HEAD) = "main" ] || [ $(git symbolic-ref --short HEAD) = "dev" ]'
143        msg: Not on main or dev branch
144      - sh: "[ $(git status --porcelain=2 | wc -l) = 0 ]"
145        msg: "Git is dirty"
146    cmds:
147      - llm-tag {{.NEXT}}
148      - git push soft {{.NEXT}}
149      - go list -m git.secluded.site/go-lunatask@{{.NEXT}} > /dev/null
150      - echo "Released {{.NEXT}} and notified module proxy"