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 desc: Format all Go source code
31 cmds:
32 - go install mvdan.cc/gofumpt@latest
33 - gofumpt -l -w .
34
35 lint:
36 desc: Lint Go source code
37 cmds:
38 - golangci-lint run
39
40 staticcheck:
41 desc: Perform static analysis
42 cmds:
43 - go install honnef.co/go/tools/cmd/staticcheck@latest
44 - staticcheck ./...
45
46 test:
47 desc: Run tests
48 cmds:
49 - go test -v ./...
50
51 vuln:
52 desc: Check for vulnerabilities
53 cmds:
54 - go install golang.org/x/vuln/cmd/govulncheck@latest
55 - govulncheck ./...
56
57 reuse:
58 desc: Lint licenses and copyright headers
59 cmds:
60 - reuse lint
61
62 docs:
63 desc: Generate CLI documentation
64 cmds:
65 - go run ./internal/tools/docgen -out ./docs/cli -format markdown
66 - go run ./internal/tools/docgen -out ./docs -format markdown -single llm-reference.md -exclude m
67 generates:
68 - docs/cli/**/*
69 - docs/llm-reference.md
70
71 build:
72 desc: Build nasin-pali
73 cmds:
74 - go build -o np -ldflags "-s -w -X main.version={{.VERSION}}"
75 generates:
76 - np
77
78 install:
79 desc: Install nasin-pali
80 cmds:
81 - go install -ldflags "-s -w -X main.version={{.VERSION}}"
82
83 run:
84 desc: Run np
85 cmds:
86 - go run -ldflags "-s -w -X main.version={{.VERSION}}" . {{.CLI_ARGS}}
87
88 pack:
89 desc: Pack np with UPX
90 cmds:
91 - upx --best -qo np.min np
92 - mv np.min np
93 sources:
94 - np
95
96 clean:
97 desc: Remove build artifacts
98 cmds:
99 - rm -rf np
100
101 clean-all:
102 desc: Remove build artifacts and config.toml
103 cmds:
104 - rm -rf np config.toml
105
106 release:
107 desc: Interactive release workflow
108 vars:
109 BUMP:
110 sh: gum choose "major" "minor" "patch" "prerelease"
111 CURRENT_VERSION:
112 sh: git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0"
113 IS_CURRENT_PRERELEASE:
114 sh: |
115 current="{{.CURRENT_VERSION}}"
116 if echo "$current" | grep -qE '\-[a-zA-Z]+\.[0-9]+$'; then
117 echo "yes"
118 else
119 echo "no"
120 fi
121 IS_PRERELEASE:
122 sh: |
123 if [ "{{.BUMP}}" = "prerelease" ]; then
124 echo "yes"
125 else
126 gum confirm "Create pre-release?" && echo "yes" || echo "no"
127 fi
128 PRERELEASE_SUFFIX:
129 sh: |
130 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
131 # Extract suffix from current version (e.g., v1.2.3-beta.0 -> beta)
132 echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-([a-zA-Z]+)\.[0-9]+$/\1/'
133 elif [ "{{.IS_PRERELEASE}}" = "yes" ]; then
134 gum input --placeholder "Enter pre-release suffix (e.g., beta, rc)"
135 fi
136 BASE_NEXT:
137 sh: |
138 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
139 # Extract base version from current prerelease (e.g., v1.2.3-beta.0 -> v1.2.3)
140 echo "{{.CURRENT_VERSION}}" | sed -E 's/-[a-zA-Z]+\.[0-9]+$//'
141 else
142 svu {{.BUMP}}
143 fi
144 SUFFIX_VERSION:
145 sh: |
146 if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
147 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
148 # Increment the current prerelease number
149 current_num=$(echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-[a-zA-Z]+\.([0-9]+)$/\1/')
150 echo $((current_num + 1))
151 else
152 # Find existing tags with this suffix and get the highest version number
153 highest=$(git tag -l "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.*" | \
154 sed 's/.*-{{.PRERELEASE_SUFFIX}}\.//' | \
155 sort -n | tail -1)
156 if [ -n "$highest" ]; then
157 echo $((highest + 1))
158 else
159 echo 0
160 fi
161 fi
162 fi
163 NEXT:
164 sh: |
165 if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
166 echo "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.{{.SUFFIX_VERSION}}"
167 else
168 echo "{{.BASE_NEXT}}"
169 fi
170 prompt: "Release {{.NEXT}}?"
171 preconditions:
172 - sh: '[ $(git symbolic-ref --short HEAD) = "main" ] || [ $(git symbolic-ref --short HEAD) = "dev" ]'
173 msg: Not on main or dev branch
174 - sh: "[ $(git status --porcelain=2 | wc -l) = 0 ]"
175 msg: "Git is dirty"
176 cmds:
177 - llm-tag {{.NEXT}}
178 - git push soft {{.NEXT}}
179 - go list -m git.secluded.site/np@{{.NEXT}} > /dev/null
180 - echo "Released {{.NEXT}} and notified module proxy"