feat(tui): add search via capture bar and absorb flow

Search uses existing parse grammar ?prefix — type `?query #tag` in
capture bar to filter entities client-side. Substring match on
body+title+description with AND tag filtering. Esc clears search.

Absorb via m key on fluid entities — opens source picker showing all
other entities, enter merges source into target. Uses existing
store.Absorb() backend.
This commit is contained in:
2026-05-17 21:35:44 -04:00
parent ce335cabd6
commit 1066c0bc7d
10 changed files with 387 additions and 17 deletions
+4 -2
View File
@@ -27,7 +27,7 @@ func countText(m model) string {
if m.mode == modeCards {
total = len(m.cards.filtered)
} else {
total = len(m.list.entities)
total = len(m.list.displayEntities())
}
if m.filterTag != "" {
return fmt.Sprintf("%d entities #%s", total, m.filterTag)
@@ -47,10 +47,12 @@ func contextHints(m model) string {
return "y:confirm n:cancel"
case statePromote:
return "j/k:nav enter:select esc:cancel"
case stateAbsorb:
return "j/k:nav enter:absorb esc:cancel"
default:
if m.mode == modeCards {
return "1:stream 2:cards s:sort tab:intent a:add ?:help q:quit"
}
return "1:stream 2:cards a:add d:del x:todo #:filter ?:help q:quit"
return "1:stream 2:cards a:add/?search m:absorb d:del #:filter ?:help q:quit"
}
}