Skip to content

Commit 52e5d15

Browse files
dev-shimadaclaude
andcommitted
initial commit
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
0 parents  commit 52e5d15

11 files changed

Lines changed: 853 additions & 0 deletions

File tree

.devcontainer/devcontainer.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "semtag",
3+
"image": "ghcr.io/dev-shimada/golang-1.26-trixie:latest",
4+
"workspaceFolder": "/workspace",
5+
"customizations": {
6+
"vscode": {
7+
"extensions": [
8+
"golang.Go",
9+
"GitHub.copilot"
10+
]
11+
}
12+
},
13+
"workspaceMount": "source=${localWorkspaceFolder}/,target=/workspace,type=bind,consistency=delegated",
14+
"remoteUser": "root"
15+
}

.github/workflows/release.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
name: Release
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*"
7+
8+
permissions:
9+
contents: write
10+
11+
jobs:
12+
release:
13+
runs-on: ubuntu-latest
14+
steps:
15+
- uses: actions/checkout@v4
16+
with:
17+
fetch-depth: 0
18+
19+
- uses: actions/setup-go@v5
20+
with:
21+
go-version-file: go.mod
22+
23+
- uses: goreleaser/goreleaser-action@v6
24+
with:
25+
version: "~> v2"
26+
args: release --clean
27+
env:
28+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
semtag
2+
dist/

.goreleaser.yml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
version: 2
2+
3+
builds:
4+
- env:
5+
- CGO_ENABLED=0
6+
goos:
7+
- linux
8+
- darwin
9+
- windows
10+
goarch:
11+
- amd64
12+
- arm64
13+
14+
archives:
15+
- format: tar.gz
16+
name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
17+
format_overrides:
18+
- goos: windows
19+
format: zip
20+
21+
brews:
22+
- repository:
23+
owner: dev-shimada
24+
name: homebrew-tap
25+
homepage: "https://github.com/dev-shimada/semtag"
26+
description: "CLI tool to interactively create and manage semver git tags"
27+
license: "MIT"
28+
install: |
29+
bin.install "semtag"
30+
31+
changelog:
32+
sort: asc
33+
filters:
34+
exclude:
35+
- "^docs:"
36+
- "^test:"

README.md

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# semtag
2+
3+
Git の semver タグを対話的に作成・管理する CLI ツール。
4+
5+
## Features
6+
7+
- 現在の最新タグから次のバージョン候補(patch / minor / major)を提示
8+
- プレリリース対応(alpha, beta, rc)
9+
- タグの削除・リモートへの push
10+
- bubbletea ベースの TUI
11+
12+
## Install
13+
14+
### Homebrew
15+
16+
```sh
17+
brew tap dev-shimada/tap
18+
brew install semtag
19+
```
20+
21+
### Go
22+
23+
```sh
24+
go install github.com/dev-shimada/semtag@latest
25+
```
26+
27+
## Usage
28+
29+
### バージョンタグの作成
30+
31+
```sh
32+
semtag
33+
```
34+
35+
最新の git タグを検出し、次のバージョン候補を表示します。矢印キーで選択して Enter で確定するとタグが作成されます。
36+
37+
**安定版が最新の場合:**
38+
39+
```
40+
Current: v1.2.3
41+
▸ patch v1.2.4
42+
minor v1.3.0
43+
major v2.0.0
44+
prepatch v1.2.4-alpha.1
45+
preminor v1.3.0-alpha.1
46+
premajor v2.0.0-alpha.1
47+
```
48+
49+
**プレリリースが最新の場合:**
50+
51+
```
52+
Current: v2.0.0-alpha.3
53+
▸ alpha v2.0.0-alpha.4
54+
beta v2.0.0-beta.1
55+
rc v2.0.0-rc.1
56+
release v2.0.0
57+
```
58+
59+
### タグの削除
60+
61+
```sh
62+
semtag -d
63+
```
64+
65+
最新の semver タグをローカルから削除します。
66+
67+
### タグの push
68+
69+
```sh
70+
semtag push
71+
```
72+
73+
最新の semver タグを `origin` に push します。
74+
75+
## Requirements
76+
77+
- Go 1.26+
78+
- Git

go.mod

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
module github.com/dev-shimada/semtag
2+
3+
go 1.26.2
4+
5+
require (
6+
github.com/charmbracelet/bubbles v1.0.0
7+
github.com/charmbracelet/bubbletea v1.3.10
8+
github.com/charmbracelet/lipgloss v1.1.0
9+
github.com/spf13/cobra v1.10.2
10+
)
11+
12+
require (
13+
github.com/atotto/clipboard v0.1.4 // indirect
14+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
15+
github.com/charmbracelet/colorprofile v0.4.1 // indirect
16+
github.com/charmbracelet/x/ansi v0.11.6 // indirect
17+
github.com/charmbracelet/x/cellbuf v0.0.15 // indirect
18+
github.com/charmbracelet/x/term v0.2.2 // indirect
19+
github.com/clipperhouse/displaywidth v0.9.0 // indirect
20+
github.com/clipperhouse/stringish v0.1.1 // indirect
21+
github.com/clipperhouse/uax29/v2 v2.5.0 // indirect
22+
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
23+
github.com/inconshreveable/mousetrap v1.1.0 // indirect
24+
github.com/lucasb-eyer/go-colorful v1.3.0 // indirect
25+
github.com/mattn/go-isatty v0.0.20 // indirect
26+
github.com/mattn/go-localereader v0.0.1 // indirect
27+
github.com/mattn/go-runewidth v0.0.19 // indirect
28+
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
29+
github.com/muesli/cancelreader v0.2.2 // indirect
30+
github.com/muesli/termenv v0.16.0 // indirect
31+
github.com/rivo/uniseg v0.4.7 // indirect
32+
github.com/sahilm/fuzzy v0.1.1 // indirect
33+
github.com/spf13/pflag v1.0.9 // indirect
34+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
35+
golang.org/x/sys v0.38.0 // indirect
36+
golang.org/x/text v0.3.8 // indirect
37+
)

go.sum

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
2+
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
3+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
4+
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
5+
github.com/aymanbagabas/go-udiff v0.3.1 h1:LV+qyBQ2pqe0u42ZsUEtPiCaUoqgA9gYRDs3vj1nolY=
6+
github.com/aymanbagabas/go-udiff v0.3.1/go.mod h1:G0fsKmG+P6ylD0r6N/KgQD/nWzgfnl8ZBcNLgcbrw8E=
7+
github.com/charmbracelet/bubbles v1.0.0 h1:12J8/ak/uCZEMQ6KU7pcfwceyjLlWsDLAxB5fXonfvc=
8+
github.com/charmbracelet/bubbles v1.0.0/go.mod h1:9d/Zd5GdnauMI5ivUIVisuEm3ave1XwXtD1ckyV6r3E=
9+
github.com/charmbracelet/bubbletea v1.3.10 h1:otUDHWMMzQSB0Pkc87rm691KZ3SWa4KUlvF9nRvCICw=
10+
github.com/charmbracelet/bubbletea v1.3.10/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4=
11+
github.com/charmbracelet/colorprofile v0.4.1 h1:a1lO03qTrSIRaK8c3JRxJDZOvhvIeSco3ej+ngLk1kk=
12+
github.com/charmbracelet/colorprofile v0.4.1/go.mod h1:U1d9Dljmdf9DLegaJ0nGZNJvoXAhayhmidOdcBwAvKk=
13+
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
14+
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
15+
github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF7ihZW8=
16+
github.com/charmbracelet/x/ansi v0.11.6/go.mod h1:2JNYLgQUsyqaiLovhU2Rv/pb8r6ydXKS3NIttu3VGZQ=
17+
github.com/charmbracelet/x/cellbuf v0.0.15 h1:ur3pZy0o6z/R7EylET877CBxaiE1Sp1GMxoFPAIztPI=
18+
github.com/charmbracelet/x/cellbuf v0.0.15/go.mod h1:J1YVbR7MUuEGIFPCaaZ96KDl5NoS0DAWkskup+mOY+Q=
19+
github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91 h1:payRxjMjKgx2PaCWLZ4p3ro9y97+TVLZNaRZgJwSVDQ=
20+
github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
21+
github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk=
22+
github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI=
23+
github.com/clipperhouse/displaywidth v0.9.0 h1:Qb4KOhYwRiN3viMv1v/3cTBlz3AcAZX3+y9OLhMtAtA=
24+
github.com/clipperhouse/displaywidth v0.9.0/go.mod h1:aCAAqTlh4GIVkhQnJpbL0T/WfcrJXHcj8C0yjYcjOZA=
25+
github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs=
26+
github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA=
27+
github.com/clipperhouse/uax29/v2 v2.5.0 h1:x7T0T4eTHDONxFJsL94uKNKPHrclyFI0lm7+w94cO8U=
28+
github.com/clipperhouse/uax29/v2 v2.5.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g=
29+
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
30+
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
31+
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
32+
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
33+
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
34+
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
35+
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
36+
github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag=
37+
github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
38+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
39+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
40+
github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4=
41+
github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
42+
github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw=
43+
github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
44+
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
45+
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
46+
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
47+
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
48+
github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
49+
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
50+
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
51+
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
52+
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
53+
github.com/sahilm/fuzzy v0.1.1 h1:ceu5RHF8DGgoi+/dR5PsECjCDH1BE3Fnmpo7aVXOdRA=
54+
github.com/sahilm/fuzzy v0.1.1/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y=
55+
github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
56+
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
57+
github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
58+
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
59+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
60+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
61+
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
62+
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
63+
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
64+
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
65+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
66+
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
67+
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
68+
golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY=
69+
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
70+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

internal/ui/logo.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package ui
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/charmbracelet/lipgloss"
7+
)
8+
9+
var logoLines = []string{
10+
` ███████╗ ███████╗ ███╗ ███╗ ████████╗ █████╗ ██████╗ `,
11+
` ██╔════╝ ██╔════╝ ████╗ ████║ ╚══██╔══╝ ██╔══██╗ ██╔════╝ `,
12+
` ███████╗ █████╗ ██╔████╔██║ ██║ ███████║ ██║ ███╗`,
13+
` ╚════██║ ██╔══╝ ██║╚██╔╝██║ ██║ ██╔══██║ ██║ ██║`,
14+
` ███████║ ███████╗ ██║ ╚═╝ ██║ ██║ ██║ ██║ ╚██████╔╝`,
15+
` ╚══════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ `,
16+
}
17+
18+
var gradientColors = []lipgloss.Color{
19+
"#36D399",
20+
"#2EC4B6",
21+
"#26B5D3",
22+
"#1EA6F0",
23+
"#3B82F6",
24+
"#6366F1",
25+
}
26+
27+
func LogoString() string {
28+
lines := make([]string, len(logoLines))
29+
for i, line := range logoLines {
30+
color := gradientColors[i%len(gradientColors)]
31+
lines[i] = lipgloss.NewStyle().Foreground(color).Render(line)
32+
}
33+
return fmt.Sprintf("%s\n", lipgloss.JoinVertical(lipgloss.Left, lines...))
34+
}

0 commit comments

Comments
 (0)