| Age | Commit message (Collapse) | Author |
|
- 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>
|
|
- 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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
- 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>
|
|
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>
|
|
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>
|
|
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>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019d197f-3cb2-775c-ba8b-ff16be288021
Co-authored-by: Amp <amp@ampcode.com>
|
|
|
|
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
|
|
|
|
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
- 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
|
|
- 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>
|
|
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>
|
|
- 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>
|
|
Move the Project column from its position after Age to between Recur
and Tags columns for better logical grouping. This places project
information alongside other task metadata fields.
Updated all related code including:
- Column definitions in newTable and applyColumns
- Row data ordering in taskToRow and taskToRowSearch
- Column indices in expandedCellView and handleEnterOrEdit
- Search matching indices for correct column highlighting
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Implement a new 'T' hotkey that automatically converts the first tag
of a task into its project field. This provides a quick workflow for
users who initially tag tasks and later want to organize them into
projects.
The operation:
- Takes the first tag from the selected task
- Sets it as the task's project
- Removes the tag from the task's tag list
This is useful for migrating from tag-based organization to
project-based organization in Taskwarrior.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Add comprehensive project field support including:
- Project column in table view with automatic width calculation
- 'J' hotkey to edit project in both table and detail views
- Project field in task detail view (between Start and Entry)
- Search functionality includes project names
- Enter key on project column allows inline editing
The project field integrates seamlessly with Taskwarrior's native
project support and follows the same UI patterns as other editable
fields in the application.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Fixed viewport update handling in main Update function
- Viewport now properly receives mouse and scroll events
- Content is set immediately when help is toggled
- Resolves issue where help screen couldn't scroll on small terminals
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Added viewport for help screen to enable scrolling on small terminals
- Removed line spacing between help section headers and content for compactness
- Updated help screen to follow current color theme
- Added support for theme changes in help view (including disco mode)
- Added keyboard navigation for help viewport (up/down, page up/down, home/end)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Enable editing task description using external editor ($EDITOR)
- Create temporary file for editing and handle TUI editor properly
- Show editing indicator while external editor is active
- Add blinking feedback after successful description update
- Increment version from 0.9.0 to 0.9.1
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Enable in-place editing of Priority, Tags, Due, and Recurrence fields
- Add blinking effect (bright yellow) after field changes
- Change all status message timeouts from 3 to 2 seconds
- Support disco mode in detail view (random theme on edit)
- Add showLabel parameter to view functions to hide redundant labels
- Temporarily clear input prompts in detail view for cleaner UI
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Implement field-by-field navigation using arrow keys and vi-style keys (↑/k, ↓/j)
- Add highlighting for the currently selected field with theme's selected background
- Support Home/g and End/G keys to jump to first/last field
- Dynamically calculate field count based on optional fields (recurrence, annotations)
- Update instructions to show navigation help
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Add new task detail view accessible via Enter key
- Show all task fields in vertical layout with full descriptions
- Implement search functionality within task detail view
- Use lighter text colors for better readability (252 for values, 250 for descriptions)
- Add ESC/Q key handlers to return to table view
- Keep 'i' key for original expand/edit functionality
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Add search capability (/) within help dialog
- Implement n/N navigation for search results
- Add regex pattern matching for help text
- Improve help text formatting and scrolling
- Update README to simplify hotkey documentation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Fix file handle leak in SetDebugLog by tracking and closing previous files
- Add stderr capture to all taskwarrior commands for better error messages
- Fix timezone issues in date handling tests by normalizing to UTC
- Change Update method to pointer receiver for consistency
- Update all test type assertions to handle pointer receivers correctly
- Remove unused imports and variables
All tests now pass successfully.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Fix file handle leak in SetDebugLog by properly closing previous debug files
- Capture and display stderr from all taskwarrior commands for better error messages
- Handle browser launch errors with status bar notifications
- Add validation for task IDs to prevent negative/zero IDs
- Add mutual exclusion for editing modes to prevent UI state conflicts
- Add bounds checking for array access in expandedCellView
- Cache compiled regular expressions for search performance
- Add CLAUDE.md file with project documentation for AI assistance
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
|
|
|
|
|
|
|