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"