summaryrefslogtreecommitdiff
path: root/Magefile.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-08-28 11:18:21 +0300
committerPaul Buetow <paul@buetow.org>2025-08-28 11:18:21 +0300
commit101500cc9a9b4e636451aba67ae5f8e924432afa (patch)
tree4de216b50c4b75598ff87b14f1c1bc197edcc803 /Magefile.go
parentfaf87a23a782bc7d717e363a3a399a64d6a34146 (diff)
build: replace Taskfile with Magefile; add Mage targets and README build notes
Diffstat (limited to 'Magefile.go')
-rw-r--r--Magefile.go102
1 files changed, 102 insertions, 0 deletions
diff --git a/Magefile.go b/Magefile.go
new file mode 100644
index 0000000..d1ad2ed
--- /dev/null
+++ b/Magefile.go
@@ -0,0 +1,102 @@
+//go:build mage
+
+// Hexai mage targets: build, dev, test, lint, install, etc.
+package main
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+
+ "github.com/magefile/mage/mg"
+ "github.com/magefile/mage/sh"
+)
+
+// Default target: build both binaries.
+var Default = Build
+
+// Build builds the Hexai LSP and CLI binaries.
+func Build() error {
+ mg.Deps(BuildHexaiLSP, BuildHexaiCLI)
+ return nil
+}
+
+// BuildHexaiLSP builds the LSP server binary.
+func BuildHexaiLSP() error {
+ return sh.RunV("go", "build", "-o", "hexai-lsp", "cmd/hexai-lsp/main.go")
+}
+
+// BuildHexaiCLI builds the CLI binary.
+func BuildHexaiCLI() error {
+ return sh.RunV("go", "build", "-o", "hexai", "cmd/hexai/main.go")
+}
+
+// Dev runs tests, vet, lint, then builds with race for both binaries.
+func Dev() error {
+ mg.Deps(Test, Vet, Lint)
+ if err := sh.RunV("go", "build", "-race", "-o", "hexai-lsp", "cmd/hexai-lsp/main.go"); err != nil {
+ return err
+ }
+ return sh.RunV("go", "build", "-race", "-o", "hexai", "cmd/hexai/main.go")
+}
+
+// Run launches the LSP server via go run (useful during development).
+func Run() error {
+ mg.Deps(Dev)
+ return sh.RunV("go", "run", "cmd/hexai-lsp/main.go")
+}
+
+// RunCLI runs the CLI with a small test input.
+func RunCLI() error {
+ mg.Deps(Dev)
+ cmd := "echo 'test' | go run cmd/hexai/main.go"
+ return sh.RunV("bash", "-lc", cmd)
+}
+
+// Install copies built binaries to GOPATH/bin (defaults to ~/go/bin when GOPATH is unset).
+func Install() error {
+ mg.Deps(Build)
+ gopath := os.Getenv("GOPATH")
+ if gopath == "" {
+ home, err := os.UserHomeDir()
+ if err != nil {
+ return fmt.Errorf("resolve home: %w", err)
+ }
+ gopath = filepath.Join(home, "go")
+ }
+ bin := filepath.Join(gopath, "bin")
+ if err := os.MkdirAll(bin, 0o755); err != nil {
+ return err
+ }
+ if err := sh.RunV("cp", "-v", "./hexai-lsp", bin+"/"); err != nil {
+ return err
+ }
+ return sh.RunV("cp", "-v", "./hexai", bin+"/")
+}
+
+// Test runs the test suite.
+func Test() error {
+ if err := sh.RunV("go", "clean", "-testcache"); err != nil {
+ return err
+ }
+ return sh.RunV("go", "test", "-v", "./...")
+}
+
+// Vet runs go vet.
+func Vet() error {
+ return sh.RunV("go", "vet", "./...")
+}
+
+// Lint runs golangci-lint.
+func Lint() error {
+ return sh.RunV("golangci-lint", "run")
+}
+
+// DevInstall installs helpful developer tools.
+func DevInstall() error {
+ if err := sh.RunV("go", "install", "golang.org/x/tools/gopls@latest"); err != nil {
+ return err
+ }
+ return sh.RunV("go", "install", "github.com/golangci/golangci-lint/cmd/golangci-lint@latest")
+}
+