teernisse f5ce8a9091 feat(followup): implement PLAN-FOLLOWUP.md gap fixes
Complete implementation of 7 slices addressing E2E testing gaps:

Slice 0+1: Wire Actions + ReasonPrompt
- FocusView now uses useActions hook instead of direct act() calls
- Added pendingAction state pattern for skip/defer/complete actions
- ReasonPrompt integration with proper confirm/cancel flow
- Tags support in DecisionEntry interface

Slice 2: Drag Reorder UI
- Installed @dnd-kit (core, sortable, utilities)
- QueueView with DndContext, SortableContext, verticalListSortingStrategy
- SortableQueueItem wrapper component using useSortable hook
- pendingReorder state with ReasonPrompt for reorder reasons
- Cmd+Up/Down keyboard shortcuts for accessibility
- Fixed: Store item ID in PendingReorder to avoid stale queue reference

Slice 3: System Tray Integration
- tray.rs with TrayState, setup_tray, toggle_window_visibility
- Menu with Show/Quit items
- Left-click toggles window visibility
- update_tray_badge command updates tooltip with item count
- Frontend wiring in AppShell

Slice 4: E2E Test Updates
- Fixed test selectors for InboxView, Queue badge
- Exposed inbox store for test seeding

Slice 5: Staleness Visualization
- Already implemented in computeStaleness() with tests

Slice 6: Quick Wiring
- onStartBatch callback wired to QueueView
- SyncStatus rendered in nav area
- SettingsView renders Settings component

Slice 7: State Persistence
- settings-store with hydrate/update methods
- Tauri backend integration via read_settings/write_settings
- AppShell hydrates settings on mount

Bug fixes from code review:
- close_bead now has error isolation (try/catch) so decision logging
  and queue advancement continue even if bead close fails
- PendingReorder stores item ID to avoid stale queue reference

E2E tests for all ACs (tests/e2e/followup-acs.spec.ts):
- AC-F1: Drag reorder (4 tests)
- AC-F2: ReasonPrompt integration (7 tests)
- AC-F5: Staleness visualization (3 tests)
- AC-F6: Batch mode (2 tests)
- AC-F7: SyncStatus (2 tests)
- ReasonPrompt behavior (3 tests)

Tests: 388 frontend + 119 Rust + 32 E2E all passing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 17:28:28 -05:00

Mission Control

An ADHD-centric personal productivity hub that unifies GitLab activity, beads task tracking, and manual task management into a single native interface.

Core principle: Surface THE ONE THING you should be doing right now.

This is NOT a dashboard of everything. It's a trusted advisor that understands your work and helps you decide what matters.

Features

Focus View

The primary interface displays the single most important item you should be working on. When no focus is set, it suggests the top item from your queue. Actions available:

  • Start - Open the associated URL and begin working
  • Defer - Postpone for 1 hour or until tomorrow
  • Skip - Remove from today's queue

Queue View

A prioritized list of all your work items. Filter by type, search across titles, and batch-select items for bulk operations. Drag to reorder priorities.

Inbox

Triage incoming items from GitLab or manual captures. Items flow in, you decide where they go.

Quick Capture

Global hotkey (Ctrl+Shift+Space) to capture a thought instantly. Type it, hit enter, and it becomes a bead. Triage later.

Batch Mode

When you have multiple items of the same type (e.g., code reviews), batch them together for focused flow sessions with time estimates.

GitLab-Beads Bridge

Automatic synchronization creates beads from GitLab events:

  • MR review requests
  • Issue assignments
  • Mentions in discussions
  • Comments on your MRs

The bridge tracks mappings, handles deduplication, and recovers from partial sync failures.

Decision Logging

Every action (start, defer, skip, complete) is logged with context: time of day, queue size, and optional reasoning. This data enables future pattern learning.

bv Triage Integration

Surfaces AI-powered recommendations from bv --robot-triage:

  • Top picks based on graph analysis
  • Quick wins (low effort, available now)
  • Blockers to clear (high unblock impact)

Keyboard Shortcuts

Shortcut Action
Cmd+1 Focus view
Cmd+2 Queue view
Cmd+3 Inbox
Cmd+4 Debug view
Cmd+, Settings
Ctrl+Shift+Space Quick capture

Shortcuts use Ctrl instead of Cmd on non-macOS platforms.

Architecture

Frontend (React 19 + Vite)     Backend (Tauri/Rust)
        |                              |
        |---- IPC (invoke) ----------->|
        |                              |
        |                     CLI Traits (mockable)
        |                              |
        |                     lore --robot (GitLab)
        |                     br (beads tasks)
        |                     bv --robot-* (triage)

Mission Control shells out to CLIs rather than importing them as libraries. This keeps boundaries clean and avoids schema coupling.

Tech Stack

Layer Technology
Shell Tauri 2.0 (Rust backend)
Frontend React 19 + Vite
Styling Tailwind CSS
Animations Framer Motion
State Zustand + TanStack Query
IPC Tauri commands + events

External Dependencies

MC requires these CLIs to be installed and available in PATH:

  • lore - GitLab data sync (lore --robot me)
  • br - Beads task management (br create, br close)
  • bv - Beads triage engine (bv --robot-triage, bv --robot-next)

Local State

All MC-specific state lives in ~/.local/share/mc/:

File Purpose
gitlab_bead_map.json Maps GitLab events to bead IDs (deduplication)
decision_log.jsonl Append-only log of all user decisions with context
state.json Current focus, queue order, UI state
settings.json User preferences

Development

Prerequisites

  • Node.js 20+
  • Rust (latest stable)
  • Tauri CLI (npm install -g @tauri-apps/cli)

Commands

# Install dependencies
npm install

# Start development (frontend only)
npm run dev

# Start development (frontend + backend)
npm run tauri:dev

# Run tests
npm run test           # Vitest unit tests
npm run test:watch     # Vitest watch mode
npm run test:coverage  # With coverage
npm run test:e2e       # Playwright e2e tests
cargo test             # Rust tests

# Lint
npm run lint           # ESLint
cargo clippy -- -D warnings  # Rust lints

# Build
npm run build          # Frontend only
npm run tauri:build    # Full app bundle

Project Structure

src/
  components/      # React components
  hooks/           # Custom React hooks
  lib/             # Utilities, type definitions
  stores/          # Zustand state stores
src-tauri/
  src/
    commands/      # Tauri IPC command handlers
    data/          # CLI traits, bridge logic, state
    error.rs       # Error types
    lib.rs         # App setup
    main.rs        # Entry point
tests/
  components/      # Component tests
  lib/             # Library tests
  e2e/             # Playwright tests

Testing

The codebase uses test-driven development with trait-based mocking:

  • Frontend: Vitest + React Testing Library for component tests
  • Backend: Rust unit tests with mock CLI traits
  • E2E: Playwright for full application testing

CLI integrations use traits (LoreCli, BeadsCli, BvCli) that can be mocked in tests, keeping tests fast and deterministic without external dependencies.

Design Principles

Mission Control follows ADHD-centric design principles:

  • The One Thing - UI's primary job is surfacing THE single most important item
  • Achievable Inbox Zero - Every view has a clearable state
  • Time Decay Visibility - Age is visceral (fresh=bright, old=amber/red)
  • Batch Mode for Flow - Group similar tasks for focused sessions
  • Quick Capture, Trust the System - One hotkey, type it, gone
  • Ambient Awareness, Not Interruption - Notifications are visible but never modal

License

Private - not for distribution.

Description
No description provided
Readme 813 KiB
Languages
TypeScript 66%
Rust 33.5%
JavaScript 0.3%
Shell 0.1%