Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .ktickets/kti-427f.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
id: kti-427f
status: closed
created: "2026-02-12T01:11:47Z"
type: task
priority: 2
assignee: kostyay
tests_passed: false
---
# Add tests for version command

Test version command output in text and json modes
12 changes: 12 additions & 0 deletions .ktickets/kti-4abf.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
id: kti-4abf
status: closed
created: "2026-02-12T01:11:43Z"
type: task
priority: 2
assignee: kostyay
tests_passed: false
---
# Add internal/version package

Create internal/version/version.go with ldflags-injectable vars and dev fallbacks
12 changes: 12 additions & 0 deletions .ktickets/kti-6f9c.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
id: kti-6f9c
status: closed
created: "2026-02-12T01:11:47Z"
type: task
priority: 2
assignee: kostyay
tests_passed: false
---
# Update Makefile build target with ldflags

Inject Version/Commit/Date via ldflags in build target
12 changes: 12 additions & 0 deletions .ktickets/kti-b9fc.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
id: kti-b9fc
status: closed
created: "2026-02-12T01:11:46Z"
type: task
priority: 2
assignee: kostyay
tests_passed: false
---
# Add kt version cobra command

Add version.go command in internal/cmd that prints version info, supports --json
10 changes: 9 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
.PHONY: all fmt lint test build clean security install

VERSION := $(shell git describe --tags --always --dirty)
COMMIT := $(shell git rev-parse --short HEAD)
DATE := $(shell date -u +%FT%TZ)
LDFLAGS := -s -w \
-X 'github.com/kostyay/kticket/internal/version.Version=$(VERSION)' \
-X 'github.com/kostyay/kticket/internal/version.Commit=$(COMMIT)' \
-X 'github.com/kostyay/kticket/internal/version.Date=$(DATE)'

all: lint test build

fmt:
Expand All @@ -12,7 +20,7 @@ test:
go test -race -coverprofile=coverage.out ./...

build:
go build -o kt ./cmd/kt
go build -ldflags "$(LDFLAGS)" -o kt ./cmd/kt

clean:
rm -f kt coverage.out
Expand Down
42 changes: 42 additions & 0 deletions docs/plans/2026-02-12-kt-version-design.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# kt version

## Summary

Add `kt version` command. Version derived from git tags at build time via `-ldflags`.

## Vars

Package: `internal/version/version.go`

- `Version` — `git describe --tags --always --dirty`
- `Commit` — short SHA
- `Date` — build timestamp (UTC)

Fallback when built without ldflags: `"dev"`.

## Command

`kt version` output:
```
kt v0.1.0-3-gabcdef (commit: abcdef, built: 2026-02-12T10:00:00Z)
```

`kt version --json`:
```json
{"version":"v0.1.0-3-gabcdef","commit":"abcdef","date":"2026-02-12T10:00:00Z"}
```

## Makefile

```makefile
VERSION := $(shell git describe --tags --always --dirty)
COMMIT := $(shell git rev-parse --short HEAD)
DATE := $(shell date -u +%FT%TZ)
LDFLAGS := -s -w \
-X 'github.com/kostyay/kticket/internal/version.Version=$(VERSION)' \
-X 'github.com/kostyay/kticket/internal/version.Commit=$(COMMIT)' \
-X 'github.com/kostyay/kticket/internal/version.Date=$(DATE)'

build:
go build -ldflags "$(LDFLAGS)" -o kt ./cmd/kt
```
28 changes: 28 additions & 0 deletions internal/cmd/version.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package cmd

import (
"fmt"

"github.com/kostyay/kticket/internal/version"
"github.com/spf13/cobra"
)

var versionCmd = &cobra.Command{
Use: "version",
Short: "Print kt version",
Run: func(cmd *cobra.Command, args []string) {
if IsJSON() {
_ = PrintJSON(map[string]string{
"version": version.Version,
"commit": version.Commit,
"date": version.Date,
})
return
}
fmt.Printf("kt %s (commit: %s, built: %s)\n", version.Version, version.Commit, version.Date)
},
}

func init() {
rootCmd.AddCommand(versionCmd)
}
71 changes: 71 additions & 0 deletions internal/cmd/version_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package cmd

import (
"bytes"
"encoding/json"
"testing"

"github.com/kostyay/kticket/internal/version"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestRunVersion(t *testing.T) {
// Set known values
version.Version = "v0.1.0-test"
version.Commit = "abc1234"
version.Date = "2026-02-12T00:00:00Z"

buf := new(bytes.Buffer)
rootCmd.SetOut(buf)
rootCmd.SetArgs([]string{"version"})
err := rootCmd.Execute()
require.NoError(t, err)
}

func TestRunVersionJSON(t *testing.T) {
defer setupTestEnv(t)()
jsonFlag = true
defer func() { jsonFlag = false }()

version.Version = "v0.1.0-test"
version.Commit = "abc1234"
version.Date = "2026-02-12T00:00:00Z"

buf := new(bytes.Buffer)
rootCmd.SetOut(buf)
rootCmd.SetArgs([]string{"version", "--json"})
err := rootCmd.Execute()
require.NoError(t, err)
}

func TestVersionDefaults(t *testing.T) {
// Reset to defaults
version.Version = "dev"
version.Commit = "unknown"
version.Date = "unknown"

assert.Equal(t, "dev", version.Version)
assert.Equal(t, "unknown", version.Commit)
assert.Equal(t, "unknown", version.Date)
}

func TestVersionJSONStructure(t *testing.T) {
version.Version = "v1.0.0"
version.Commit = "deadbeef"
version.Date = "2026-02-12T10:00:00Z"

data := map[string]string{
"version": version.Version,
"commit": version.Commit,
"date": version.Date,
}
b, err := json.Marshal(data)
require.NoError(t, err)

var parsed map[string]string
require.NoError(t, json.Unmarshal(b, &parsed))
assert.Equal(t, "v1.0.0", parsed["version"])
assert.Equal(t, "deadbeef", parsed["commit"])
assert.Equal(t, "2026-02-12T10:00:00Z", parsed["date"])
}
8 changes: 8 additions & 0 deletions internal/version/version.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package version

// Overridden via -ldflags at build time.
var (
Version = "dev"
Commit = "unknown"
Date = "unknown"
)