summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2025-11-28Add create fact form in web UIBen Sima
All tests pass. The create fact form has been added to the web UI. Here' 1. **Added `FactCreateForm` data type** - New form type to handle the cr 2. **Added API route** - `POST /kb/create` endpoint that accepts the for 3. **Added handler** - `factCreateHandler` that creates a new fact using 4. **Added form UI** - A collapsible form on the KB page with fields for - Project (required) - Fact Content (required textarea) - Related Files (optional, comma-separated) - Confidence level (0.0-1.0, default 0.8) 5. **Added CSS styles** - Styling for the create fact section in both li Task-Id: t-158.6
2025-11-28Add fact detail/edit view in web UIBen Sima
All tests pass with no warnings. The implementation is complete: 1. **Added new routes** (`/kb/:id`, `/kb/:id/edit`, `/kb/:id/delete`) to 2. **Created `FactDetailPage` data type** with `FactDetailFound` and `Fa 3. **Created `FactEditForm`** data type for handling form submissions 4. **Added handlers** (`factDetailHandler`, `factEditHandler`, `factDele 5. **Added `ToHtml` instance for `FactDetailPage`** with: - Detail view showing project, confidence, created date - Editable content textarea - Related files input - Confidence slider - Source task link - Danger zone with delete button 6. **Updated KB listing** to make facts clickable links to their detail 7. **Added CSS styles** for form elements, buttons, danger zone, and err Task-Id: t-158.5
2025-11-28Create /kb web page listing facts with confidence scoresBen Sima
The implementation is complete. The `/kb` web page now: 1. Fetches all facts from the database via `Fact.getAllFacts` 2. Displays each fact in a card showing: - Fact ID - Confidence score as a colored badge (green ≥80%, yellow ≥50%, red < - Project name - Fact content - Related files (if any) - Source task link (if any) Task-Id: t-158.4
2025-11-28Implement jr facts list/show/add/delete CLI commandsBen Sima
The build and tests pass. The hlint suggestions have been fixed: 1. Changed `Text.pack <$>` to `Text.pack </` on line 528 2. Replaced the case expression with `maybe Fact.getAllFacts Fact.getFac 3. Changed `Text.pack <$>` to `Text.pack </` on line 555 Task-Id: t-158.3
2025-11-28Update AGENTS.md to use jr task instead of taskBen Sima
All task management commands should go through the jr CLI wrapper.
2025-11-28Add Omni/Fact.hs core module with CRUD operationsBen Sima
The build passes now. The task was to add `Omni/Fact.hs` with CRUD opera - `createFact` - Creates a new fact - `getFact` - Gets a fact by ID - `getAllFacts` - Gets all facts - `getFactsByProject` - Gets facts for a project - `getFactsByFile` - Gets facts related to a file - `updateFact` - Updates an existing fact - `deleteFact` - Deletes a fact by ID The actual fix needed was completing the pattern matches in `Omni/Jr/Web Task-Id: t-158.2
2025-11-28Fix web UI bug in search filterBen Sima
This allows Servant's QueryParam Maybe to treat Left as "parameter not provided", so the 'All' filter option (which sends empty string value) now works correctly instead of causing an "Invalid priority" error. Task-Id: t-146
2025-11-27Add Draft status for tasks not ready for jr to pickupBen Sima
All changes are in place. The build and tests pass. The implementation i 1. **Added `Draft` to Status enum** - First in sequence: `Draft | Open | 2. **Excluded Draft from getReadyTasks** - Uses `taskStatus t `elem` [Op 3. **CLI support** - `task update <id> draft` works, `task list --status 4. **Display coloring** - Draft shows in gray with `[.]` indicator in tr 5. **TaskStats** - Added `draftTasks` field and display in stats output 6. **Tests** - Added unit test for draft exclusion from ready tasks and Task-Id: t-166
2025-11-27Add Omni/Fact.hs core module with CRUD operationsBen Sima
The Omni/Fact.hs module is complete with CRUD operations: - **createFact**: Create a new fact with project, content, related files - **getFact**: Retrieve a fact by ID - **getAllFacts**: Get all facts from the database - **getFactsByProject**: Get facts filtered by project - **getFactsByFile**: Get facts related to a specific file - **updateFact**: Update an existing fact's content, related files, and - **deleteFact**: Delete a fact by ID The module properly re-exports the `Fact` data type from `Omni.Task.Core Task-Id: t-158.2
2025-11-27Exclude tasks with retry >= 3 from ready queueBen Sima
Tasks that have failed 3 or more times need human intervention and should not appear in the ready queue. This prevents infinite retry loops. Task-Id: t-164 Amp-Thread-ID: https://ampcode.com/threads/T-4c8bc88f-f8f9-4921-96e5-3b68552c0bc0 Co-authored-by: Amp <amp@ampcode.com>
2025-11-27Ensure keyboard accessibility for status badge dropdownBen Sima
The implementation is complete. Here's a summary of the keyboard accessi **Changes to Omni/Jr/Web.hs:** 1. Added `statusDropdownJs` - JavaScript functions for keyboard handling - `toggleStatusDropdown()` - Opens/closes dropdown, updates aria-expa - `closeStatusDropdown()` - Closes dropdown, returns focus to trigger - `handleStatusKeydown()` - Handles Enter/Space (toggle), Escape (clo - `handleMenuItemKeydown()` - Handles ArrowUp/ArrowDown (navigate), E - Click-outside handler to close open dropdowns 2. Updated `clickableBadge`: - Added `tabindex="0"` for keyboard focusability - Added `role="button"` for screen readers - Added `aria-haspopup="true"` and `aria-expanded="false"` - Changed onclick to use `toggleStatusDropdown()` function - Added `onkeydown` handler 3. Updated `statusDropdownOptions`: - Added `role="menu"` and `aria-label` for accessibility 4. Updated `statusOption`: - Added `role="none"` on form wrapper - Added `role="menuitem"` on button - Added `tabindex="-1"` (focus managed by JS) - Added `onkeydown` handler **Changes to Omni/Jr/Web/Style.hs:** - Added focus styles for `.status-dropdown-option:focus` - Added focus styles for `.status-badge-clickable:focus` Task-Id: t-157.3
2025-11-27Click badge to show inline dropdown optionsBen Sima
The implementation is complete. The changes I made: 1. **Web.hs** - Replaced the `statusBadgeWithForm` function from a `<sel - `statusBadgeWithForm` now creates a container div with the clickabl - `clickableBadge` renders a badge that, when clicked, toggles the "o - `statusDropdownOptions` renders all the status options as badge-sty - `statusOption` renders each status option as an HTMX form that upda 2. **Style.hs** - Added CSS styles for the new dropdown component: - `.status-badge-dropdown` - Container with relative positioning - `.status-badge-clickable` - Clickable badge styling with cursor poi - `.dropdown-arrow` - Arrow indicator styling - `.status-dropdown-menu` - Hidden dropdown that appears when parent - `.status-option-form` and `.status-dropdown-option` - Styling for o - Dark mode support for the dropdown menu Task-Id: t-157.2
2025-11-27Merge status badge display and dropdown into single elementBen Sima
The build and tests pass. The changes merge the status badge display and Task-Id: t-157.1
2025-11-27Audit and fix any remaining vertical button stacksBen Sima
The changes are in place. The build passes with no errors. Summary of ch 1. **`.actions`** - Added explicit `flexDirection row` to ensure horizon 2. **`.review-actions`** - Added `display flex`, `flexDirection row`, `f 3. **`.form-actions`** - Added same flex row layout for consistency Task-Id: t-156.6
2025-11-27Make filter buttons horizontal instead of vertical stackingBen Sima
The changes are complete. The filter buttons are now styled to be horizo 1. Changed `.filter-group` from `flexDirection column` to `flexDirection 2. Added `whiteSpace nowrap` to labels to prevent wrapping 3. Updated responsive styles for mobile to maintain horizontal layout wi Task-Id: t-156.5
2025-11-27Remove redundant borders, consolidate to margin OR padding onlyBen Sima
All tests pass. Summary of changes made: 1. **Removed redundant `borderBottom` from `.detail-row`** - replaced wi 2. **Removed redundant `borderBottom` from `.stats-row`** - replaced wit 3. **Removed redundant `borderBottom` from `.metric-row`** - replaced wi 4. **Removed corresponding dark mode border color overrides** for the ab Task-Id: t-156.4
2025-11-27Convert task list/search page to list-group patternBen Sima
The build and tests pass. The task list/search page now uses the `list-g Task-Id: t-156.3
2025-11-27Convert dashboard ready queue and recent activity to list-group patternBen Sima
All the changes are in place: 1. Created `renderListGroupItem` function for compact list-style task di 2. Updated the dashboard's Ready Queue section to use `list-group` with 3. Updated the dashboard's Recent Activity section to use `list-group` w 4. Updated the `RecentActivityPartial` (HTMX partial) to also use the li 5. Added CSS styles for `.list-group`, `.list-group-item`, etc. in Style 6. Added dark mode styles for the list-group components The build and tests pass successfully. Task-Id: t-156.2
2025-11-27Change task detail labels to inline format (ID: t-123 on same line)Ben Sima
Both tests pass. The change converts the task detail display from: ``` Task: t-123 Title: Some title ``` To the inline format: ``` Title: Some title (ID: t-123) ``` Task-Id: t-156.1
2025-11-27Add status breakdown counts per epic on epics pageBen Sima
The build and tests pass. The implementation adds status breakdown count 1. Changed `EpicsPage` from a newtype to a data type that holds both epi 2. Added `renderEpicCardWithStats` function that calculates descendant c 3. Added `getDescendants` helper to find all child tasks recursively 4. Updated `epicsHandler` to pass all tasks to the page 5. The breakdown shows badges for done, in-progress, review, and open co Task-Id: t-155.4
2025-11-27Fixes to get all tests passingBen Sima
2025-11-27Implement multi-color progress bar componentBen Sima
The build and test passed with no errors. The multi-color progress bar c **Implementation summary:** - **[Omni/Jr/Web.hs](file:///home/ben/omni/Omni/Jr/Web.hs#L234-L275)**: - **[Omni/Jr/Web/Style.hs](file:///home/ben/omni/Omni/Jr/Web/Style.hs#L3 The progress bar is used on the dashboard (line 324 in Web.hs) to visual Task-Id: t-155.3
2025-11-27Create /epics page listing all epicsBen Sima
The build passes. The `/epics` page has been successfully created and al Task-Id: t-155.2
2025-11-27Auto-transition epic to Review status when all children reach DoneBen Sima
The implementation is complete. Summary of changes to [Omni/Jr.hs](file: 1. Added `checkEpicCompletion` function (lines 490-508) that: - Checks if the completed task has a parent - Finds the parent task and verifies it's an Epic - Checks if all children of that epic are Done - If so, transitions the epic to Review status 2. Updated `autoReview` to call `checkEpicCompletion` after marking a ta 3. Updated `interactiveReview` to: - Accept the task as a parameter (line 414) - Call `checkEpicCompletion` after marking a task Done (line 429) 4. Updated the call site at line 361 to pass the task to `interactiveRev Task-Id: t-155.1
2025-11-27Style navbar dropdowns for dark mode compatibilityBen Sima
The build and tests pass. The change adds proper dark mode styling for n Task-Id: t-154.5
2025-11-27Remove homepage action links section (redundant with navbar)Ben Sima
The build and tests pass with no errors. The homepage action links secti Task-Id: t-154.4
2025-11-27Implement hamburger collapse menu for mobileBen Sima
The implementation is complete. I've implemented a hamburger collapse me 1. **Omni/Jr/Web.hs**: Added a checkbox-based hamburger menu toggle (CSS - Hidden checkbox input for toggle state - Label with 3 hamburger lines that acts as the button - The navbar links are shown/hidden based on checkbox state 2. **Omni/Jr/Web/Style.hs**: Added responsive CSS styles: - Hamburger menu styles (`.navbar-hamburger`, `.hamburger-line`) - Hidden by default on desktop, displayed on mobile (< 600px) - Full-width mobile menu with proper ordering - Dark mode support for hamburger lines - Dropdown menus expand inline on mobile Task-Id: t-154.3
2025-11-27Add dropdown menusBen Sima
Tasks (Ready, Blocked, Intervention, All), Plans (Epics, KB). Task-Id: t-154.2
2025-11-27Refactor navbar to single horizontal row (Jr logo left, links right)Ben Sima
The changes are complete. The navbar is now refactored to always stay as - The Jr logo/brand on the left - Navigation links on the right - On mobile screens, instead of switching to a column layout, it now jus Task-Id: t-154.1
2025-11-27Fix SQL query and add simple migration testBen Sima
2025-11-27Add Reset Retries action buttonBen Sima
Build and tests pass. The implementation is complete: 1. **Added API endpoint**: `POST /tasks/:id/reset-retries` in the API ty 2. **Added handler**: `taskResetRetriesHandler` that clears retry contex 3. **Added UI button**: "Reset Retries" button in the retry context bann Task-Id: t-153.6
2025-11-27Add human notes field for intervention tasksBen Sima
All tests pass. Let me summarize the implementation: I've added a human notes field for intervention tasks with the following 1. **Omni/Task/Core.hs**: - Added `retryNotes :: Maybe Text` field to `RetryContext` data type - Added `notes` column to `retryContextColumns` for schema migration - Updated `getRetryContext` to fetch the notes field from DB - Updated `setRetryContext` to save the notes field to DB - Updated `getAllRetryContexts` to include notes - Added `updateRetryNotes :: Text -> Text -> IO ()` function to updat 2. **Omni/Jr/Web.hs**: - Added new API endpoint: `POST /tasks/:id/notes` - Added `NotesForm` type and `FromForm` instance - Added `taskNotesHandler` to save notes - Updated `renderRetryContextBanner` to accept task ID and display: - Notes textarea form when max retries exceeded (intervention tasks - Existing notes display for non-critical retry banners 3. **Omni/Agent/Worker.hs**: - Updated worker prompt to include human notes/guidance in the retry - Preserved existing notes when setting new retry context 4. **Omni/Jr.hs**: - Updated all `RetryContext` creations to preserve existing notes Task-Id: t-153.5
2025-11-27Store and display Amp thread URLBen Sima
The build and tests pass. Let me verify the changes are complete by chec 1. ✅ The Amp thread URL is already parsed from amp output and stored in 2. ✅ The display has been updated to show a "View in Amp ↗" button inste 3. ✅ CSS styling has been added for the button (`.amp-thread-btn`) 4. ✅ Dark mode styles added for the button 5. ✅ Both instances of the URL display (in `renderExecutionDetails` and The implementation is complete. The changes: - [Omni/Jr/Web.hs](file:///home/ben/omni/Omni/Jr/Web.hs#L632-L637) - Cha - [Omni/Jr/Web.hs](file:///home/ben/omni/Omni/Jr/Web.hs#L969-L974) - Sam - [Omni/Jr/Web/Style.hs](file:///home/ben/omni/Omni/Jr/Web/Style.hs#L531 - [Omni/Jr/Web/Style.hs](file:///home/ben/omni/Omni/Jr/Web/Style.hs#L916 Task-Id: t-153.4
2025-11-27Display retry context on task detail pageBen Sima
The build and tests pass. The retry context display is already implement The implementation includes: - Current attempt number (e.g., "Attempt 3 of 3") at line 721 - Failure reason with `summarizeReason` at lines 696-697 - Original commit display at lines 699-703 - Conflict files list at lines 705-710 - Warning banner when max retries exceeded at lines 691-692 and 712-715 Task-Id: t-153.3
2025-11-27Add diff view page for commitsBen Sima
All the pieces are in place: 1. Route: `GET /tasks/:id/diff/:commit` (line 65) 2. Data type: `TaskDiffPage` (line 119) 3. `ToHtml` instance for rendering (line 759) 4. Handler: `taskDiffHandler` (line 1225) 5. Helper: `getDiffForCommit` (line 1301) The implementation shows: - Full git diff output via `git show <commit>` - Pre-formatted output (`<pre class="diff-block">`) - Link back to task detail page - Proper error handling for invalid commits Task-Id: t-153.2
2025-11-27Show git commits for task on detail pageBen Sima
All tests pass. The implementation is complete: 1. Added `GitCommit` data type with hash, short hash, summary, author, r 2. Added `getCommitsForTask` function that queries `git log --grep='Task 3. Updated `TaskDetailPage` to include commits 4. Updated `taskDetailHandler` to fetch commits for the task 5. Added `renderCommit` helper to display each commit with links to `/ta 6. Added CSS styles for the commit list in both light and dark modes Task-Id: t-153.1
2025-11-27Implement proper schema migrations for ALTER TABLEBen Sima
All tests pass. The implementation adds: 1. **`runMigrations`** - Called at the end of `initTaskDb` to run migrat 2. **`migrateTable`** - Compares expected columns against existing colum 3. **`getTableColumns`** - Uses `PRAGMA table_info` to get existing colu 4. **`addColumn`** - Runs `ALTER TABLE ADD COLUMN` for missing columns 5. **Column definitions** - Lists of expected columns for `task_activity When new columns are added to the schema in the future, you just add the Task-Id: t-152.3
2025-11-27Add verification checklist to task completion workflowBen Sima
The implementation is complete. Here's what I added: 1. **`--verified` flag** to `task update <id> done --verified` command 2. **Verification checklist warning** shown when marking a task Done wit - Code compiles (bild succeeds) - Tests pass (bild --test) - Feature works in production (manual verification) 3. **Activity logging** records `{"verified":true}` in the task activity 4. **JSON output enhancement** includes `"verified": true` in the respon 5. **CLI tests** for the new `--verified` flag parsing Task-Id: t-152.2
2025-11-27Display worker metrics on task detail pageBen Sima
All tests pass. Let me summarize what was implemented: - Extended `TaskActivity` type with new fields: - `activityAmpThreadUrl` - Link to amp thread - `activityStartedAt` - Work start timestamp - `activityCompletedAt` - Work completion timestamp - `activityCostCents` - API cost in cents - `activityTokensUsed` - Token usage count - Updated `SQL.FromRow` and `SQL.ToRow` instances for the new fields - Updated schema to include new columns in `task_activity` table - Added `logActivityWithMetrics` function to log activities with all met - Added `updateActivityMetrics` function to update metrics on existing a - Added `getLatestRunningActivity` helper function - Captures execution timing (start/end timestamps) - Retrieves amp thread URL from `AgentLog.getStatus` - Converts credits to cents and logs to activity record - Uses `logActivityWithMetrics` and `updateActivityMetrics` for tracking - Added `getStatus` function to retrieve current status (thread URL, cre - Added `TaskMetricsPartial` type for HTMX auto-refresh - Extended `TaskDetailPage` to include `RetryContext` - Added Execution Details section on task detail page showing: - Amp Thread URL (clickable link) - Duration (formatted as "Xm Ys") - Cost (formatted as "$X.XX") - Retry Attempt count (if applicable) - Last Activity timestamp - Added `/partials/task/:id/metrics` endpoint for HTMX auto-refresh - Auto-refresh enabled while task is InProgress (every 5s) - Added `renderExecutionDetails` helper function - Added `executionDetailsStyles` for metric rows and execution section - Added dark mode support for execution details section Task-Id: t-148.4
2025-11-27HTMX interactive forms - status updates and filtersBen Sima
The build passes. The HTMX interactive forms for status updates and filt 1. **Status update dropdown on task detail** (lines 176-197): `statusBad 2. **Filter form on /tasks** (lines 322-378): The form has `hx-get='/par The only fix needed was changing `data TaskListPartial` to `newtype Task Task-Id: t-151.2
2025-11-27Add HTMX script and first partial endpointsBen Sima
All handlers are wired in. The implementation is complete: 1. **HTMX script tag added** to `pageHead` (CDN at unpkg.com with integr 2. **Partial routes created** in API type: `/partials/recent-activity` a 3. **Handlers implemented** for both partials 4. **HTMX attributes added** to the HomePage: - Ready Queue count: `hx-get="/partials/ready-count"` with `hx-trigge - Recent Activity div: `hx-get="/partials/recent-activity"` with `hx- Task-Id: t-151.1
2025-11-27Add multiline description editing in web UIBen Sima
The implementation is complete and passing. Here's a summary of what was **Changes made:** 1. **Added POST endpoint** for `/tasks/:id/description` - updates the ta 2. **Added `DescriptionForm` type** with `FromForm` instance to parse th 3. **Added `taskDescriptionHandler`** that: - Receives the description text from the form - Treats empty/whitespace-only descriptions as `Nothing` - Uses `TaskCore.editTask` to update the task description 4. **Updated epic detail page** to include: - A collapsible "Edit Design" section using `<details>` element - A multiline `<textarea>` pre-populated with the current description - A "Save Design" button that submits to the new endpoint - Shows "No design document yet." when there's no description 5. **Added CSS styles** for the new elements: - `.edit-description` - styling for the collapsible edit section - `.description-textarea` - monospace font textarea for markdown edit - `.form-actions` - container for the submit button - Dark mode support for all new elements Task-Id: t-150.2
2025-11-27Render epic descriptions as markdown in web UIBen Sima
Successfully implemented markdown rendering for epic descriptions in the 1. **[Omni/Jr/Web.hs](file:///home/ben/omni/Omni/Jr/Web.hs#L380-L391)**: - "Design" header instead of "Description" - Markdown rendering via `renderMarkdown` function - Full-width `.markdown-content` wrapper 2. **[Omni/Jr/Web.hs](file:///home/ben/omni/Omni/Jr/Web.hs#L667-L779)**: - Headers (`#`, `##`, `###`) - Lists (`-` or `*`) - Code blocks (` ``` `) - Inline code (`` ` ``) - Bold text (`**`) 3. **[Omni/Jr/Web/Style.hs](file:///home/ben/omni/Omni/Jr/Web/Style.hs#L - `.markdown-content` with good typography - Headers with appropriate sizing/spacing - Code blocks and inline code - Lists with proper indentation - Dark mode support Task-Id: t-150.1
2025-11-27Denser layout - Gerrit-style CSS overhaulBen Sima
Build passes. The CSS has been updated with the denser, Gerrit-style lay - **Border-radius**: Reduced from 8px to 2px - **Padding**: Reduced from 16px to 8px/10px - **Gaps**: Reduced from 8-12px to 2-6px - **Shadows**: Replaced with subtle 1px borders (`#d0d0d0`) - **Line-height**: Tightened from 1.5em to 1.3em - **Font sizes**: Reduced across the board (body 16→14px, headers smalle - **Button heights**: Reduced from 44px to 32px - **List row heights**: Made denser with smaller padding and gaps Task-Id: t-149.7
2025-11-27Add views for blocked and needs-intervention tasksBen Sima
The build passes with no errors. The implementation was already in place Task-Id: t-149.6
2025-11-27Darken task description text in light themeBen Sima
The build passes with no errors. The change adds `color "#374151"` (dark Task-Id: t-149.5
2025-11-27Make task cards fully clickableBen Sima
The build and tests pass. The task is complete: 1. Changed `renderTaskCard` to wrap the entire card in an `<a>` element 2. Changed the inner task-id from an `<a>` to a `<span>` since the whole 3. Added CSS styles for `.task-card-link` to ensure proper display (bloc Task-Id: t-149.4
2025-11-27Make dashboard metric cards clickableBen Sima
The build and tests pass. The dashboard metric cards are now clickable a Task-Id: t-149.3
2025-11-27Replace back links with proper navbarBen Sima
The implementation is complete: 1. **Created a shared `navbar` component** with Jr branding and navigati 2. **Replaced all back links** (`← Back to Dashboard`, `← Back to Tasks` 3. **Added navbar styling** in the Style.hs file, including: - Light mode styles - Dark mode styles - Mobile responsive styles 4. **Build passes** with `bild --test Omni/Jr.hs` Task-Id: t-149.2
2025-11-27Fix filter dropdowns returning empty string for All optionBen Sima
The build passes. The fix I implemented: 1. **Changed the API type** in `Omni/Jr/Web.hs` to use `QueryParam "stat 2. **Added manual parsing** in `taskListHandler` with `parseStatus` and 3. **Applied `emptyToNothing`** to both status and priority params befor This ensures that when "All" is selected (empty string), it's treated as I also fixed two pre-existing issues that were blocking the build: - Type annotation for `show stage` in `Omni/Task/Core.hs` - `AesonKey.fromText` conversion in `Omni/Agent/Worker.hs` Task-Id: t-149.1