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 --long 2>/dev/null | sed 's/\([^-]*-g\)/r\1/;s/-/./g'
 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:fix
 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  vuln:
 52    cmds:
 53      - go install golang.org/x/vuln/cmd/govulncheck@latest
 54      - govulncheck ./...
 55
 56  reuse:
 57    desc: Lint licenses and copyright headers
 58    cmds:
 59      - reuse lint
 60
 61  build:
 62    cmds:
 63      - go build -o lunatask-mcp-server -ldflags "-s -w -X main.version={{.VERSION}}" .
 64    generates:
 65      - lunatask-mcp-server
 66
 67  install:
 68    cmds:
 69      - go install -ldflags "-s -w -X main.version={{.VERSION}}" .
 70
 71  run:
 72    cmds:
 73      - go run -ldflags "-s -w -X main.version={{.VERSION}}" . {{.CLI_ARGS}}
 74
 75  pack:
 76    desc: Pack lunatask-mcp-server with UPX
 77    cmds:
 78      - upx --best -qo lunatask-mcp-server.min lunatask-mcp-server
 79      - mv lunatask-mcp-server.min lunatask-mcp-server
 80    sources:
 81      - lunatask-mcp-server
 82
 83  clean:
 84    desc: Remove build artifacts
 85    cmds:
 86      - rm -rf lunatask-mcp-server
 87
 88  clean-all:
 89    desc: Remove build artifacts and config.toml
 90    cmds:
 91      - rm -rf lunatask-mcp-server config.toml
 92
 93  release:
 94    desc: Interactive release workflow
 95    vars:
 96      BUMP:
 97        sh: gum choose "major" "minor" "patch" "prerelease"
 98      CURRENT_VERSION:
 99        sh: git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0"
100      IS_CURRENT_PRERELEASE:
101        sh: |
102          current="{{.CURRENT_VERSION}}"
103          if echo "$current" | grep -qE '\-[a-zA-Z]+\.[0-9]+$'; then
104            echo "yes"
105          else
106            echo "no"
107          fi
108      IS_PRERELEASE:
109        sh: |
110          if [ "{{.BUMP}}" = "prerelease" ]; then
111            echo "yes"
112          else
113            gum confirm "Create pre-release?" && echo "yes" || echo "no"
114          fi
115      PRERELEASE_SUFFIX:
116        sh: |
117          if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
118            # Extract suffix from current version (e.g., v1.2.3-beta.0 -> beta)
119            echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-([a-zA-Z]+)\.[0-9]+$/\1/'
120          elif [ "{{.IS_PRERELEASE}}" = "yes" ]; then
121            gum input --placeholder "Enter pre-release suffix (e.g., beta, rc)"
122          fi
123      BASE_NEXT:
124        sh: |
125          if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
126            # Extract base version from current prerelease (e.g., v1.2.3-beta.0 -> v1.2.3)
127            echo "{{.CURRENT_VERSION}}" | sed -E 's/-[a-zA-Z]+\.[0-9]+$//'
128          else
129            svu {{.BUMP}}
130          fi
131      SUFFIX_VERSION:
132        sh: |
133          if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
134            if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
135              # Increment the current prerelease number
136              current_num=$(echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-[a-zA-Z]+\.([0-9]+)$/\1/')
137              echo $((current_num + 1))
138            else
139              # Find existing tags with this suffix and get the highest version number
140              highest=$(git tag -l "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.*" | \
141                sed 's/.*-{{.PRERELEASE_SUFFIX}}\.//' | \
142                sort -n | tail -1)
143              if [ -n "$highest" ]; then
144                echo $((highest + 1))
145              else
146                echo 0
147              fi
148            fi
149          fi
150      NEXT:
151        sh: |
152          if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
153            echo "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.{{.SUFFIX_VERSION}}"
154          else
155            echo "{{.BASE_NEXT}}"
156          fi
157    prompt: "Release {{.NEXT}}?"
158    preconditions:
159      - sh: '[ $(git symbolic-ref --short HEAD) = "main" ] || [ $(git symbolic-ref --short HEAD) = "dev" ]'
160        msg: Not on main or dev branch
161      - sh: "[ $(git status --porcelain=2 | wc -l) = 0 ]"
162        msg: "Git is dirty"
163    cmds:
164      - llm-tag {{.NEXT}}
165      - git push soft {{.NEXT}}
166      - go list -m git.secluded.site/lunatask-mcp-server@{{.NEXT}} > /dev/null
167      - echo "Released {{.NEXT}} and notified module proxy"