Skip to content

Commit 1d947bd

Browse files
feat: implement core architecture, task service layer, API module, and cinematic TUI animation engine
1 parent 6d78e7e commit 1d947bd

15 files changed

Lines changed: 700 additions & 169 deletions

File tree

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,27 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.2.2]
9+
10+
### Added
11+
12+
* **Cinematic TUI Motion System**: A comprehensive motion engine for liquid glass interactions, elastic physics, and fluid boba clustering.
13+
* **Cinematic View Shutter**: Smooth 600ms vertical split transition when switching tabs or closing menus, accompanied by a cascading task reveal.
14+
* **Bulk Deletion API**: Added `kairo api delete all` to safely soft-delete all active tasks in one command.
15+
* **Task Lifecycle Animations**:
16+
* **Bloom**: New tasks expand into existence with an 800ms `EaseOutQuad` deliberate typing sequence.
17+
* **Glitch Deletion**: Bombastic 600ms glitch-vaporization effect where the task scrambles into particles and shrinks into nothingness.
18+
* **Liquid Fade**: Completed tasks "melt" into the background using progressive eased strikethrough.
19+
* **Bento Layout System**: Redesigned header and empty states with modular, asymmetric blocks and soft, rounded borders for a premium aesthetic.
20+
21+
### Fixed
22+
23+
* **Isolated Tab Animations**: View transition bubbles in the header now *only* trigger when genuinely switching tabs, preventing layout flicker.
24+
* **Context Isolation**: `Esc` now gracefully closes the Tag Filter, and selecting a plugin with `Enter` smoothly animates the view transition instead of instantly snapping.
25+
* **Animation Glitches**: Resolved rendering artifacts (black blocks) during view transitions by ensuring background color persistence.
26+
* **Layout Stability**: Fixed alignment of the empty state Bento card and footer keybindings.
27+
* **Footer Legibility**: Fixed keybinding labels in the footer for better clarity.
28+
829
## [1.2.1]
930

1031
### Fixed

README.md

Lines changed: 79 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@
44

55
### 🌿 Minimal, powerful task management for the modern terminal.
66

7+
![Demo](screenshots/demo.gif)
8+
79
[![Release](https://img.shields.io/github/v/release/programmersd21/kairo?sort=semver&style=for-the-badge&logo=github&color=7c3aed)](https://github.com/programmersd21/kairo/releases)
810
[![CI](https://img.shields.io/github/actions/workflow/status/programmersd21/kairo/ci.yml?branch=main&style=for-the-badge&logo=githubactions&logoColor=white&color=2563eb)](https://github.com/programmersd21/kairo/actions)
911
[![Go Report Card](https://img.shields.io/badge/go%20report-A%2B-brightgreen?style=for-the-badge&logo=go&logoColor=white&color=10b981)](https://goreportcard.com/report/github.com/programmersd21/kairo)
1012
[![License: MIT](https://img.shields.io/badge/License-MIT-f59e0b?style=for-the-badge&logo=open-source-initiative&logoColor=white)](https://opensource.org/licenses/MIT)
1113

12-
---
13-
14-
![Demo](screenshots/demo.gif)
15-
1614
**⌛ Time, executed well.**
1715

1816
</div>
@@ -27,15 +25,16 @@ built for developers and power users.
2725
It combines the simplicity of a **command-line tool**
2826
with the sophistication of a *modern, premium design system*.
2927

30-
🎯 **Instant Responsiveness**Sub-millisecond task searching and navigation
31-
🎨 **Premium UI Design** — Modern color palette with accessibility at its core
28+
🎯 **BubbleTea Motion System**Liquid glass interactions with elastic physics
29+
🎨 **Premium UI Design** — Modern Bento-style layout with soft, rounded aesthetics
3230
⌨️ **Keyboard-First** — Complete control without ever touching a mouse
3331
🖥️ **Seamless Rendering** — Pixel-perfect background fills the entire viewport, no terminal bleed-through
3432
🔐 **Offline-First** — Your data lives locally in SQLite, always under your control
3533
🔗 **Git-Backed Sync** — Optional distributed sync leveraging Git's architecture
3634
🧩 **Extensible** — Unified Lua plugin system and CLI automation API
3735
📱 **Responsive Layout** — Gracefully adapts to any terminal size
3836
🤖 **Automation-Friendly** — Headless API for external scripts and CI/CD
37+
🌊 **Boba Liquid Feel** — UI elements behave with soft inertia and fluid clustering
3938

4039
Built with [Bubble Tea](https://github.com/charmbracelet/bubbletea) (TUI framework), [Lip Gloss](https://github.com/charmbracelet/lipgloss) (terminal styling), and SQLite (local storage).
4140

@@ -51,7 +50,7 @@ Built with [Bubble Tea](https://github.com/charmbracelet/bubbletea) (TUI framewo
5150
| **Event Hooks** | React to task creation, updates, and app lifecycle events |
5251
| **Smart Filtering** | Multiple views: Inbox, Today, Upcoming, Completed, by Tag, by Priority |
5352
| **Fuzzy Search** | Lightning-fast command palette with ranked results |
54-
| **Strike Animation** | Visual feedback when completing tasks with 'z' |
53+
| **Cinematic Animations** | Smooth vertical shutter, cascading row reveals, and glitch/vaporize deletions |
5554
| **Offline Storage** | SQLite with WAL for reliability and concurrent access |
5655
| **Git Sync** | Optional repository-backed sync with per-task JSON files |
5756
| **Import/Export** | JSON and Markdown support for data portability |
@@ -113,7 +112,7 @@ Downloads the latest GitHub Release for your OS/arch, verifies it against `check
113112
On Windows, Kairo will automatically close to apply the update; simply re-run `kairo` once the terminal returns.
114113

115114
**Startup Notifications:**
116-
Kairo automatically checks for updates on startup. If a newer version is available, a notification will appear in the footer (e.g., `Update: v1.1.7 → v1.1.8`) directing you to run the update command.
115+
Kairo automatically checks for updates on startup. If a newer version is available, a notification will appear in the footer (e.g., `Update: v1.2.1 → v1.2.2`) directing you to run the update command.
117116

118117
---
119118

@@ -133,6 +132,9 @@ kairo api create --title "Finish report" --priority 1
133132
# Update a task
134133
kairo api update --id <task-id> --status done
135134

135+
# Delete all tasks (soft-delete)
136+
kairo api delete all
137+
136138
# Advanced JSON interface
137139
kairo api --json '{"action": "create", "payload": {"title": "API Task", "tags": ["bot"]}}'
138140
```
@@ -325,6 +327,20 @@ kairo sync
325327

326328
---
327329

330+
## 📅 Natural Language Deadlines
331+
332+
Kairo's smart parser understands natural language, making it effortless to set deadlines without worrying about specific date formats.
333+
334+
When creating or editing a task, you can input deadlines like:
335+
- **Relative days:** `today`, `tomorrow`, `day after tomorrow`
336+
- **Specific days:** `monday`, `next friday`, `this sunday`
337+
- **Time-based:** `in 2 hours`, `at 5pm`, `tomorrow at 10am`
338+
- **Dates:** `august 24`, `24th of april`
339+
340+
Powered by the [when](https://github.com/olebedev/when) library, Kairo ensures your deadlines are always parsed intuitively.
341+
342+
---
343+
328344
## 🏗 Architecture
329345

330346
Kairo is built with a modular architecture designed for performance, extensibility, and data sovereignty.
@@ -356,109 +372,115 @@ UI Re-render → Instant User Feedback
356372

357373
```
358374
kairo/
359-
├── Casks
360-
│ └── kairo.rb
361-
├── CHANGELOG.md
362-
├── cmd
363-
│ └── kairo
375+
├── .github/
376+
│ ├── ISSUE_TEMPLATE/
377+
│ │ ├── bug_report.md
378+
│ │ └── feature_request.md
379+
│ ├── workflows/
380+
│ │ ├── ci.yml
381+
│ │ └── release.yml
382+
│ └── PULL_REQUEST_TEMPLATE.md
383+
├── cmd/
384+
│ └── kairo/
364385
│ └── main.go
365-
├── CODE_OF_CONDUCT.md
366-
├── configs
367-
│ └── kairo.example.toml
368-
├── CONTRIBUTING.md
369-
├── go.mod
370-
├── go.sum
371-
├── internal
372-
│ ├── api
386+
├── internal/
387+
│ ├── api/
373388
│ │ └── api.go
374-
│ ├── app
389+
│ ├── app/
375390
│ │ ├── model.go
376391
│ │ └── msg.go
377-
│ ├── buildinfo
392+
│ ├── buildinfo/
378393
│ │ └── buildinfo.go
379-
│ ├── completion
394+
│ ├── completion/
380395
│ │ └── completion.go
381-
│ ├── config
396+
│ ├── config/
382397
│ │ ├── config.go
383398
│ │ └── config_test.go
384-
│ ├── core
385-
│ │ ├── codec
399+
│ ├── core/
400+
│ │ ├── codec/
386401
│ │ │ ├── json.go
387402
│ │ │ └── markdown.go
403+
│ │ ├── nlp/
404+
│ │ │ └── deadline.go
388405
│ │ ├── core_test.go
389406
│ │ ├── ids.go
390-
│ │ ├── nlp
391-
│ │ │ └── deadline.go
392407
│ │ ├── task.go
393408
│ │ └── view.go
394-
│ ├── hooks
409+
│ ├── hooks/
395410
│ │ └── hooks.go
396-
│ ├── lua
411+
│ ├── lua/
397412
│ │ └── engine.go
398-
│ ├── plugins
413+
│ ├── plugins/
399414
│ │ └── host.go
400-
│ ├── search
415+
│ ├── search/
401416
│ │ ├── fuzzy.go
402417
│ │ ├── fuzzy_test.go
403418
│ │ └── index.go
404-
│ ├── service
419+
│ ├── service/
405420
│ │ └── service.go
406-
│ ├── storage
421+
│ ├── storage/
407422
│ │ ├── migrations.go
408423
│ │ ├── repo.go
409424
│ │ └── repo_test.go
410-
│ ├── sync
425+
│ ├── sync/
411426
│ │ └── engine.go
412-
│ ├── ui
413-
│ │ ├── detail
427+
│ ├── ui/
428+
│ │ ├── detail/
414429
│ │ │ └── model.go
415-
│ │ ├── editor
430+
│ │ ├── editor/
416431
│ │ │ └── model.go
417-
│ │ ├── help
432+
│ │ ├── help/
418433
│ │ │ └── model.go
419-
│ │ ├── keymap
434+
│ │ ├── keymap/
420435
│ │ │ ├── keymap.go
421436
│ │ │ ├── keymap_test.go
422437
│ │ │ ├── normalize.go
423438
│ │ │ └── normalize_test.go
424-
│ │ ├── palette
439+
│ │ ├── palette/
425440
│ │ │ └── model.go
426-
│ │ ├── plugin_menu
441+
│ │ ├── plugin_menu/
427442
│ │ │ └── model.go
428-
│ │ ├── render
443+
│ │ ├── render/
444+
│ │ │ ├── easing.go
429445
│ │ │ └── render.go
430-
│ │ ├── styles
446+
│ │ ├── styles/
431447
│ │ │ └── styles.go
432-
│ │ ├── tasklist
448+
│ │ ├── tasklist/
433449
│ │ │ └── model.go
434-
│ │ ├── theme
450+
│ │ ├── theme/
435451
│ │ │ └── theme.go
436-
│ │ └── theme_menu
452+
│ │ └── theme_menu/
437453
│ │ └── model.go
438-
│ ├── updater
454+
│ ├── updater/
439455
│ │ ├── checksums.go
440456
│ │ ├── download.go
441457
│ │ ├── extract.go
442458
│ │ ├── github.go
443459
│ │ ├── updater.go
444460
│ │ └── windows_helper.go
445-
│ └── util
461+
│ └── util/
446462
│ ├── paths.go
447463
│ └── util_test.go
448-
├── LICENSE
449-
├── Makefile
450-
├── plugins
464+
├── plugins/
451465
│ ├── auto-cleanup.lua
452466
│ ├── auto-tagger.lua
453467
│ ├── sample.lua
454468
│ └── task-logger.lua
455-
├── README.md
456-
├── screenshots
469+
├── screenshots/
457470
│ └── demo.gif
458-
├── scripts
471+
├── scripts/
459472
│ ├── install.ps1
460473
│ └── install.sh
461-
├── SECURITY.md
474+
├── local/
475+
│ └── demo_preset.json
476+
├── .gitignore
477+
├── .goreleaser.yaml
478+
├── CHANGELOG.md
479+
├── go.mod
480+
├── go.sum
481+
├── LICENSE
482+
├── Makefile
483+
├── README.md
462484
└── VERSION.txt
463485
```
464486

VERSION.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.2.1
1+
1.2.2

cmd/kairo/main.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,12 @@ func runAPI(ctx context.Context, svc service.TaskService, args []string) error {
174174
taskAPI := api.New(svc)
175175
action := args[0]
176176

177+
// Handle "delete all" special case
178+
if action == "delete" && len(args) > 1 && args[1] == "all" {
179+
action = "delete_all"
180+
args = args[1:] // shift args so loop works if needed, though delete_all ignores payload
181+
}
182+
177183
var req api.Request
178184
if action == "--json" {
179185
if len(args) < 2 {
@@ -335,7 +341,7 @@ func runHelp(args []string) {
335341
fmt.Println("\nUsage:")
336342
fmt.Println(" kairo api [action] [flags]")
337343
fmt.Println("\nActions:")
338-
fmt.Println(" create, list, update, delete, get, list-tags, cleanup")
344+
fmt.Println(" create, list, update, delete, delete all, get, list-tags, cleanup")
339345
case "completion":
340346
fmt.Println("Generate shell completion scripts.")
341347
fmt.Println("\nUsage:")

internal/api/api.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ func (api *TaskAPI) Execute(ctx context.Context, req Request) Response {
4646
return api.handleUpdate(ctx, req.Payload)
4747
case "delete":
4848
return api.handleDelete(ctx, req.Payload)
49+
case "delete_all":
50+
return api.handleDeleteAll(ctx)
4951
case "list":
5052
return api.handleList(ctx, req.Payload)
5153
case "list_tags":
@@ -288,6 +290,21 @@ func (api *TaskAPI) handleDelete(ctx context.Context, payload json.RawMessage) R
288290
}
289291
}
290292

293+
// handleDeleteAll processes a delete_all request
294+
func (api *TaskAPI) handleDeleteAll(ctx context.Context) Response {
295+
if err := api.service.DeleteAll(ctx); err != nil {
296+
return Response{
297+
Success: false,
298+
Error: err.Error(),
299+
}
300+
}
301+
302+
return Response{
303+
Success: true,
304+
Data: "all tasks deleted successfully",
305+
}
306+
}
307+
291308
// handleList processes a list request
292309
func (api *TaskAPI) handleList(ctx context.Context, payload json.RawMessage) Response {
293310
type ListPayload struct {

0 commit comments

Comments
 (0)