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"