summaryrefslogtreecommitdiff
path: root/internal
AgeCommit message (Collapse)Author
2026-04-07Bump version to 0.13.2v0.13.2Paul Buetow
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07ui: subtle started indicator and hide empty priority in ultra modePaul Buetow
- Revert whole-card yellow background for started tasks; instead render only the ID badge (#N) with yellow bg + black text as a low-noise "in progress" cue - Hide the priority field from the status line when no priority is set, removing the distracting "-" that appeared next to every unset task Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07ui: consolidate ultra card to one status line per taskPaul Buetow
Replace the separate header (ID/priority/status/urgency/age) and meta (project/tags/due/recur/start) lines with a single status line: #ID | priority | status | urgency | due: X | proj: X | tags: X - Age, recur, and start are dropped for compactness; started tasks are already highlighted in yellow, detail view has full field set - ultraModeStatus and ultraStatusText replace ultraHeaderText/ultraMetaText - renderUltraStatusWithRegex replaces renderUltraHeaderWithRegex and renderUltraMetaWithRegex; priority badge text padded to 3 chars in the plain line so whole-line and styled search paths produce identical text - Update tests to reflect 2-line cards (status + description) and new field labels (proj: instead of project:) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07ui: highlight started tasks with yellow background in ultra modePaul Buetow
Add UltraStartedBG (amber 220) to Theme and apply it as the card background when a task has a non-empty Start field. Selection highlight still takes priority when the cursor is on the same card. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07ui: remove empty lines from selected (highlighted) ultra cardsPaul Buetow
Use ultraJoinSections instead of ultraJoinSectionsWithBlank so no blank separator row is inserted between card sections regardless of selection state. The outer ultraCardStyle already paints the full card background, so the per-section bg-coloured blank rows were redundant. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07Bump version to 0.13.1v0.13.1Paul Buetow
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07ui: rename ultra mode title and allow u to exit to traditional modePaul Buetow
- Status bar now shows "Task Samurai VERSION (ultra)" instead of "ULTRA MODE" to match the normal-mode header format - Remove the ultraStartup guard on the u key so pressing u in ultra mode always switches to the traditional table view, even when the app was launched with --ultra; ultraStartup is cleared on first switch so q/esc behaves normally afterwards Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07ui: compact ultra mode and case-insensitive searchPaul Buetow
- Remove empty lines between card sections by skipping blank separators when no explicit blankLine is provided to ultraJoinSectionsWithBlank - Remove 2-space leading indent from description and annotation lines - Make ultra search case-insensitive by default (prepends (?i)); users can override with explicit inline flags like (?-i) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07Bump version to 0.13.0v0.13.0Paul Buetow
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07Fix filter mode to handle all taskwarrior filter expressions correctlyPaul Buetow
Replace strings.Fields with shlex.Split in the filter input handler so that quoted attribute filters like description:"my task" are passed as a single argument rather than being split on whitespace. This makes proj:xxx, +tag, and any other valid taskwarrior filter expression work correctly when entered via the interactive f key in both traditional and ultra mode. Also propagate taskwarrior errors from reload() back to the user via the status bar instead of silently discarding them, so invalid filters produce visible feedback. On error the filter is rolled back to nil to avoid leaving the UI in a broken empty-list state. Extracts the filter-string parsing into a testable parseFilterInput helper in helpers.go and adds comprehensive tests in helpers_test.go. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07chore: bump version to 0.12.1v0.12.1Paul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019d669c-a1a9-702a-ab0e-7ea799649e17 Co-authored-by: Amp <amp@ampcode.com>
2026-04-07ui: make ultra mode search live and regex-awarePaul Buetow
Replace the Enter-to-apply search with live filtering: every keystroke recompiles the regex and rebuilds ultraFiltered immediately, so results update as the user types. Behaviour summary: - Typing: regex compiled and filter applied on each character. - Invalid regex mid-type: previous filter kept unchanged (no flicker). - Enter: confirm and close the input (empty Enter clears the filter). - Esc: cancel, clear the filter, close the input. - Regexes are always supported (was already the case via compileAndCacheRegex, now usable interactively as you type). Extracted ultraApplySearch() to centralise the compile+filter logic. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07ui: fix priority black spot and q/esc search-clear in ultra modePaul Buetow
Priority field: the no-priority dash (-) was rendered with terminal- default (black) background because the priority badge path unconditionally passed bg="" to suppress the badge colour. Now only H/M/L pass bg="" to preserve their coloured pill; the dash case inherits the card bg. q/esc with active search: first press clears the ultra search filter (regex + filtered index + cursor reset) and stays in ultra mode, same as esc behaves in normal table mode. A second press with no active search exits ultra / quits the app as before. Tests updated accordingly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07ui: fix black spot between label and value in ultra meta linePaul Buetow
The space between "project:" and its value in ultraKeyValue was a plain unstyled " " string. After the label span's ANSI reset the terminal reverted to black background for that single space before the value span's bg kicked in. Fix: apply bg to the separator space the same way ultraFieldSep does for the " | " between fields. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07ui: fix black inter-section gaps on selected ultra cardsPaul Buetow
The blank lines inserted between card sections (header/meta/desc/ annotations) by ultraJoinSections had no background style, so they rendered in the terminal-default black even when the card was selected. Add ultraJoinSectionsWithBlank(blankLine, sections...) that accepts an explicit blank-line separator. renderUltraCard now passes a Width(width)+Background(SelectedBG) styled empty string as the separator when the card is selected, ensuring every line — including the blank inter-section gaps — carries the grey background. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07ui: fix grey background gaps on selected ultra cardsPaul Buetow
Each lipgloss Render() call emits an ANSI reset that wipes the card's SelectedBG colour, leaving fields, separators and spaces on black. Fix: thread a bg string through renderUltraHeaderWithRegex, renderUltraMetaWithRegex, renderUltraDescriptionWithRegex, renderUltraAnnotationsWithRegex, ultraKeyValue, ultraStyledText, renderUltraSearchLine, and the new ultraFieldSep helper. When the card is selected, bg = theme.SelectedBG is applied to every inner style, so no span can reset back to the terminal default. The priority badge keeps its own background colour regardless of selection state. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07ui: improve ultra mode colors, separators, and navigationPaul Buetow
- Theme: SelectedBG changed from purple (57) to dark grey (238) so selected cards are clearly distinct from the status bar; priority badge colors switched to subtler dark variants (red/blue/green) - Ultra header: ID bold white, urgency amber, age dim, status grey; no background on unselected cards (pure black terminal background) - Priority badge: 3-char wide centred pill with white text - Annotations: italic and dimmer (244) vs description (253) - Card separator: full-width ─── line in dim grey (237) instead of a blank line, making task boundaries easier to scan - u key in ultra mode toggles back to table view (syncs cursor); from --ultra startup mode u is a no-op since there is no table to return to - q/esc from --ultra startup mode exits directly instead of dropping to the table view (ultraStartup flag tracks launch origin) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07ui: polish ultra modus edge cases (yx)Paul Buetow
Add ultraNoTasksMessage() showing centered "No tasks" when task list is empty. Add tests for single-task cursor stability, empty-list render, and cursor clamping after filter yields zero results. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07ui: add --ultra CLI flag to start in ultra modus (yw)Paul Buetow
Add --ultra boolean flag mirroring the --disco pattern. Add SetUltra() method to Model so the flag sets showUltra=true before the TUI starts, opening directly in ultra mode. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07ui: add ultra mode help screen (yv)Paul Buetow
Add buildUltraHelpContent() with hotkey sections for ultra mode. Wire H key in handleUltraMode() to show mode-aware help. Route help viewport to ultra-specific content when showUltra is active. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07ui: add ultra mode task actions (vq)Paul Buetow
2026-04-07ui: add ultra mode navigation (vp)Paul Buetow
2026-04-07ui: render ultra mode screen (vo)Paul Buetow
2026-04-07ui: add ultra card render helpers (vn)Paul Buetow
2026-04-07ui: add ultra mode entry and exit hotkeys (vl vm)Paul Buetow
2026-04-07ui: route ultra mode through update (vk)Paul Buetow
2026-04-07ui: route ultra mode through view (vj)Paul Buetow
2026-04-07ui: add ultra view stub (vi)Paul Buetow
2026-04-07ui: add ultra mode state (vh)Paul Buetow
2026-03-23Bump version to 0.12.0v0.12.0Paul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019d197f-3cb2-775c-ba8b-ff16be288021 Co-authored-by: Amp <amp@ampcode.com>
2026-03-05Bump version to 0.11.4v0.11.4Paul Buetow
2026-03-05Migrate UI stack to Bubble Tea v2Paul Buetow
2026-03-03bump up version to 0.11.3v0.11.3Paul Buetow
Patch release: code quality improvements based on 100 Go Mistakes analysis. (Retried as 0.11.3 because 0.11.2 was already used in remote)
2026-03-03bump up version to 0.11.2Paul Buetow
Patch release: code quality improvements based on 100 Go Mistakes analysis. - Fixed race condition in global RNG - Optimized render performance by lazy-calling .View() - Improved map pre-allocation - Handled or explicitly silenced unchecked errors - Removed unused functions and fields - Updated deprecated library methods
2026-03-03chore: bump version to 0.11.2v0.11.2Paul Buetow
2026-03-03ui: complete help hotkey coveragePaul Buetow
2026-03-03ui: document B hotkey in help screenPaul Buetow
2026-02-28bump up version to 0.9.3v0.11.1Paul Buetow
Patch release: code-quality refactors (Model sub-structs, date format constant, debug config struct, large function decomposition) and one bug fix (View() double-render of expandedCellView). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28refactor(ui): break up large functions in ui packagePaul Buetow
Go/MEDIUM task (UUID d8b51046): several functions exceeded 50 lines. Extract logical sections into focused helpers: renderTaskDetail() (238→20 lines): delegates to detailStyles(), renderDetailFieldRows() + per-field helpers (Priority, Tags, Due, Project, Recur), renderDetailDescription(), renderDetailAnnotations(), renderDetailFooter(). handleDetailFieldEdit() (128→32 lines): uses switch + shared activation helpers (activatePriorityEdit, activateDueEdit, activateTagsEdit, activateProjectEdit, activateRecurEdit, handleDetailDynamicFields). handleEnterOrEdit() (120→42 lines): reuses the same shared helpers from handlers.go; adds a taskStr closure to remove repetitive nil-guards. View() (82→25 lines): extracts appendInlineInputOverlay() that iterates the active editing overlays and appends the focused widget to the layout. Also fix hardcoded Description blink index (was always 9); introduce detailDescriptionFieldIndex() which returns 9 or 10 depending on whether the task has a Recurrence field, matching the dynamic render position. Clarify that Annotations are read-only in the detail view. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28refactor(task): move debug state into debugConfig structPaul Buetow
DIP/MEDIUM task (UUID 2f64277a): the two bare package-level vars (debugWriter, debugFile) were mutable shared state that prevented concurrent test isolation. Introduce private debugConfig struct and a single package-level instance (dbg). SetDebugLog and run() are updated to use dbg.writer / dbg.file. The public API is unchanged so main.go needs no modification. Add TestSetDebugLog covering: invalid-path error (negative), enable, log write reaching the file, reconfiguration, and disable. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28refactor(task): centralize Taskwarrior date format as task.DateFormatPaul Buetow
DRY/MEDIUM task (UUID 2c74960f): the format string "20060102T150405Z" was hardcoded in 5+ places across the task and ui packages. - Export task.DateFormat constant from internal/task/task.go - Replace hardcoded string in task.go and stats.go with DateFormat - Update internal/ui/helpers.go to alias the constant (taskDateFormat = task.DateFormat) rather than repeating the string literal - Replace all 6 raw string literals in table.go with task.DateFormat - Remove duplicate dueText() from table.go; its only call site now uses formatDueText() from helpers.go, which also normalises to midnight UTC for more accurate day-difference calculations Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28fix(ui): remove double-render of expandedCellView in View()Paul Buetow
Bugfix task (UUID d04dccbd): expandedCellView() was called once unconditionally in the base JoinVertical and again inside the cellExpanded guard, producing a duplicate expanded-cell line whenever the user toggled cell expansion. Fix: remove the unconditional call; expand only when cellExpanded is true. Also corrected updateTableHeight() which still reserved an extra row for the now-removed base expanded line (windowHeight-3 → windowHeight-2). Added regression test TestExpandedCellViewNoDoubleRender that verifies the expanded content is absent when cellExpanded is false and appears exactly once when true. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28refactor(ui): group Model fields into embedded sub-structs by concernPaul Buetow
SRP/HIGH task (UUID d2de999b): the Model struct had 50+ fields spanning blink animation, search, detail-view, and inline editing concerns. Group related state into four anonymous embedded sub-structs: blinkState – row blink animation (5 fields) searchState – task-table and help-screen search (10 fields) detailViewState – task detail overlay (11 fields) editState – inline field editing (20 fields) Uses Go anonymous embedding so all existing field-access syntax (m.blinkID, m.searching, …) is preserved — no other files changed. Each sub-struct has a comment explaining its purpose and design rationale, including why detailDescEditing lives in detailViewState rather than editState. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-04feat: add toggle for task completion blinking feedbackv0.11.0Paul Buetow
- Add 'B' hotkey to toggle blinking on/off when tasks are marked done - When disabled, tasks complete immediately without visual distraction - When enabled, provides visual feedback with blinking animation - Show status message indicating toggle state - Bump version to 0.11.0
2026-02-04add runtime debugging signals and convert to magev0.10.0Paul Buetow
- Add SIGUSR1 handler for goroutine stack dumps when app hangs - Add SIGUSR2 handler for full profiling (heap, cpu, block) - Add --debug-dir flag for configurable debug output location - Convert build system from go-task to mage - Update documentation with debugging workflow - Bump version to 0.10.0
2025-10-05add open for macosv0.9.3Paul Buetow
2025-07-02bump up versionv0.9.2Paul Buetow
2025-06-29feat: add random task jump hotkeys and document navigation keysPaul Buetow
- Add hotkey '1' to jump to a random pending task - Add hotkey '2' to jump to a random pending task without due date - Both hotkeys include visual feedback with blink animation - Document '0' key as synonym for 'g' and 'Home' in help screen - Update help screen navigation section with all new hotkeys 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-29fix: correct field count in task detail view to make description selectablePaul Buetow
The getDetailFieldCount() function was returning an incorrect base count of 9, forgetting to include the Project field. This made the description field unselectable in the detail view. Fixed by updating the base count to 10. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-29fix: resolve text wrapping and task ID issues in TaskSamuraiPaul Buetow
- Add word wrapping for long descriptions and annotations in detail view - Fix task ID showing as 0 after undo operation by improving task lookup - Ensure restored tasks are properly fetched from Taskwarrior with correct IDs 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>