Skip to content

feat: v3.3.0 - Groups, URL detection, history logging, CI, and robust edit handling#4

Open
decrypted wants to merge 7 commits intoIrtesaam:masterfrom
decrypted:master
Open

feat: v3.3.0 - Groups, URL detection, history logging, CI, and robust edit handling#4
decrypted wants to merge 7 commits intoIrtesaam:masterfrom
decrypted:master

Conversation

@decrypted
Copy link

@decrypted decrypted commented Jan 16, 2026

Major Features

  • Task groups: Organize tasks into color-coded groups (max 10)
  • History logging: All actions logged to ~/.config/todozen/history.jsonl
  • Preferences UI: GTK4/Libadwaita settings with panel position, popup width, groups management
  • URL auto-detection: Extracts URLs from task text, shows link buttons with domain labels for multiple URLs
  • Popup width setting: Normal (500px), Wide (700px), Ultra (900px)
  • Error mode: Shows startup failures with log locations instead of crashing silently

Critical Bug Fixes

  • Edit preservation (v3.3.0): Tasks no longer lost when cancelling edit - stays in list, hidden while editing
  • ID-based operations: All task identification now uses task.id, never matches by name

Performance

  • Task/group caching with signal-based invalidation
  • Lazy UI population (only on menu open)
  • Smart repopulation via _needsPopulate flag
  • Single GSettings writes for batch operations
  • Right-aligned action buttons (consistent positioning)
  • Edit mode protection (disables hover interference)

Code Quality

  • GitHub Actions CI: Automated TypeScript, ESLint, and test checks on push/PR
  • 176 unit tests with vitest
  • src/utils.ts: Pure, testable functions extracted from UI code
  • TypeScript strict mode
  • ESLint configuration
  • Versioned data model (v1) for future migrations
  • make check verifies distribution zip contains all files

Documentation

  • CLAUDE.md: Project goals, architecture, and critical learnings (ID-based identification, edit behavior)
  • PERFORMANCE.md: Optimization state and decisions
  • CHANGELOG.md: Detailed change history

Breaking Changes from Original

  • Data model now includes version, id, groupId fields (auto-migrated)
  • Settings schema expanded with groups, popup-width, history toggle

  Major Features:
  - Task groups: Organize tasks into color-coded groups (max 10)
  - History logging: All actions logged to ~/.config/todozen/history.jsonl
  - Preferences UI: GTK4/Libadwaita settings dialog with panel position,
    groups management, and clear all with confirmation

  Performance:
  - Task/group caching with signal-based invalidation
  - Lazy UI population (only on menu open)
  - Smart repopulation via _needsPopulate flag
  - Single GSettings writes for batch operations

  Code Quality:
  - Added vitest with 41 unit tests
  - TypeScript strict mode
  - ESLint configuration
  - Versioned data model for migrations

  Documentation:
  - CLAUDE.md: Project goals and architecture
  - PERFORMANCE.md: Optimization state and decisions
  - CHANGELOG.md: Detailed change history

  Other:
  - Renamed LICENCE to LICENSE
  - Removed unused src/utils.ts
  - CSS cleanup (removed unused selectors)
@decrypted decrypted mentioned this pull request Jan 16, 2026
   - Add CI workflow (TypeScript, ESLint, tests, build artifact)
   - Switch from npm to yarn (commit yarn.lock, remove package-lock.json)
   - Update build.sh with new files (prefs.ui, build-info.json, LICENSE)
  - Add multiple URL detection with domain labels for link buttons
  - Extract pure functions to utils.ts for better testability (164 tests)
  - Add popup width setting (Normal/Wide/Ultra) in preferences
  - Add edit mode protection - disable hover on items while renaming
  - Add error mode UI showing startup failures with log locations
  - Right-align action buttons for consistent positioning
  - Add build verification to ensure all files included in zip
  - Update .gitignore to exclude build artifacts (*.zip, utils.js)
  - Clear _taskItems and _isEditing in disable() to prevent memory leaks
  - Add tests for multiple URLs without text, URLs with parentheses in path
  - Add tests for invalid version type in validateTask and validateGroup
   BREAKING BUG FIX: Previously, clicking edit would delete the task
   immediately. If user closed the popup or clicked edit on another task,
   the original was permanently lost.

   Now:
   - Task stays in list (hidden while editing)
   - Cancel (close popup/lose focus) restores visibility
   - Submit updates task by ID, preserving position and properties

   Also adds:
   - findTaskIndexById() and updateTaskNameById() utilities
   - 8 new tests for edit-by-ID functionality (176 total)
@decrypted decrypted changed the title feat: v3.1.0 - Task groups, history logging, and preferences UI feat: v3.3.0 - Task groups, history logging, and preferences UI, url extraction, edit bugfix Jan 16, 2026
@decrypted decrypted changed the title feat: v3.3.0 - Task groups, history logging, and preferences UI, url extraction, edit bugfix feat: v3.3.0 - Groups, URL detection, history logging, and robust edit handling Jan 16, 2026
@decrypted decrypted changed the title feat: v3.3.0 - Groups, URL detection, history logging, and robust edit handling feat: v3.3.0 - Groups, URL detection, history logging, CI, and robust edit handling Jan 16, 2026
   - Define JS_FILES, STATIC_FILES, EXTENSION_FILES as single source of truth
   - CI workflow now uses yarn build
yarn run v1.22.22
$ tsc
Done in 1.95s.
rm ./schemas/gschemas.compiled -f
glib-compile-schemas ./schemas
rm -rf dist
mkdir -p dist/schemas
cp extension.js manager.js history.js prefs.js utils.js metadata.json stylesheet.css prefs.ui build-info.json LICENSE dist/
cp schemas/* dist/schemas/ instead of duplicating file lists
   - Add proper  target (preserves eslint.config.js and zip files)
   - Move variables to top of Makefile for clarity
   - Update CLAUDE.md with ID-based task identification doctrine
   - Move pack logic from build.sh into Makefile target
   - Delete build.sh (no longer needed)
   - Clean target now removes .zip
   - Update CLAUDE.md to reference Makefile JS_FILES
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant