feat: init command, README, fix config creation, move cicd

- cmd_init.go: interactive setup wizard (gosleep-timer init)
- README.md: comprehensive documentation
- config/config.go: fix os.IsNotExist → errors.Is for wrapped err
- main.go: remove '(no TUI)' from run help
- cicd.yaml moved to .github/workflows/cicd.yaml
This commit is contained in:
2026-07-03 09:52:44 +02:00
parent 442ac9f580
commit d1cc207ce4
5 changed files with 466 additions and 2 deletions
+200
View File
@@ -0,0 +1,200 @@
# ⏱ gosleep-timer
TUI sleep timer with modular WM/DE support. Go rewrite of `timer.py`.
## Quick start
```bash
# Run TUI
gosleep-timer
# First time? Interactive setup wizard
gosleep-timer init
```
## Installation
```bash
go install github.com/forust/gosleep-timer@latest
# or
git clone https://github.com/forust/gosleep-timer
cd gosleep-timer
go build -o gosleep-timer .
sudo cp gosleep-timer /usr/local/bin/
```
## Usage
### TUI mode (default)
```bash
gosleep-timer
```
Keys:
| Key | Action |
|-----|--------|
| `s` | Start timer |
| `S` | Stop timer |
| `Tab` | Next field |
| `↑`/`↓` | Previous/next profile |
| `1`-`0` | Toggle modules |
| `h` | History |
| `?` | Help |
| `q`/`Esc` | Quit |
### CLI mode
```bash
# Run with defaults (25m)
gosleep-timer run
# Custom duration
gosleep-timer run 45m
gosleep-timer run 1h30m
# With profile
gosleep-timer run 20m --profile work
```
### Other commands
```bash
# Interactive setup
gosleep-timer init
# List profiles
gosleep-timer list-profiles
# Export/import config
gosleep-timer export > config-backup.yaml
gosleep-timer import < config-backup.yaml
# History and stats
gosleep-timer history
gosleep-timer stats
```
## Configuration
File: `~/.config/gosleep-timer/config.yaml`
### Profiles
```yaml
profiles:
default:
modules:
workspace:
enabled: true
backend: auto # auto, niri, hyprland, kde
workspace: 12
media:
enabled: true
action: stop # stop, pause, play-pause, next, previous
lock:
enabled: true
command: "" # custom command or auto-detect
kill:
enabled: false
processes: [firefox, telegram-desktop]
notify:
enabled: true
sound: "" # path or empty
sound:
enabled: true
file: /usr/share/sounds/freedesktop/stereo/complete.oga
brightness:
enabled: false
value: 0
mute:
enabled: false
custom:
enabled: false
pre: []
post: []
script:
enabled: false
path: ""
work:
extends: default
modules:
workspace:
workspace: 5
```
### Profile inheritance
Profiles can extend others. Modules from the base profile are merged and overlaid.
## Modules
| Module | Stage | Description |
|--------|-------|-------------|
| **workspace** | pre | Switch WM workspace (niri/Hyprland/KDE) |
| **media** | pre | Control music player via playerctl |
| **lock** | post | Lock screen |
| **kill** | pre | Kill processes by name |
| **notify** | post | Desktop notification |
| **sound** | post | Play audio file |
| **brightness** | pre/post | Dim/restore brightness |
| **mute** | pre/post | Mute/unmute audio |
| **custom** | pre/post | User-defined shell commands |
| **script** | pre/post | Run external script with args |
### Workspace backends
| Backend | Command |
|---------|---------|
| niri | `niri msg action focus-workspace {n}` |
| Hyprland | `hyprctl dispatch workspace {n}` |
| KDE | `qdbus org.kde.KWin /KWin setCurrentDesktop {n}` |
Auto-detection checks `$XDG_CURRENT_DESKTOP`, then tries `hyprctl` and `niri msg`.
## Project structure
```
gosleep-timer/
├── main.go # CLI entrypoint
├── cmd_init.go # Interactive setup wizard
├── config/ # YAML config load/save/types
├── engine/ # Timer core, executor, stages
├── modules/ # Module interface + 10 implementations
├── profiles/ # Profile manager
├── history/ # JSONL log + statistics
├── tui/ # Bubbletea TUI app
├── cicd.yaml # CI/CD pipeline
└── Dockerfile # Multi-stage build
```
## Development
```bash
# Build
go build -o gosleep-timer .
# Test
go test ./...
# Lint
golangci-lint run --config .golangci.yml
# Static analysis
staticcheck ./...
gosec ./...
revive -config .revive.toml ./...
```
## CI/CD
Pipeline (`.github/workflows/cicd.yaml`):
- **lint-go**: golangci-lint, staticcheck, gosec, revive
- **lint-yaml**: yamllint
- **build**: go build + test with race detector
- **publish**: Docker image to registry (main/dev branches)
## License
MIT