| Age | Commit message (Collapse) | Author |
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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>
|
|
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
|
|
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
|
|
The build and tests pass. The changes merge the status badge display
and
Task-Id: t-157.1
|
|
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
|
|
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
|
|
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
|
|
The build and tests pass. The task list/search page now uses the
`list-g
Task-Id: t-156.3
|
|
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
|
|
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
|
|
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
|
|
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
|
|
The build passes. The `/epics` page has been successfully created
and al
Task-Id: t-155.2
|
|
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
|
|
The build and tests pass. The change adds proper dark mode styling
for n
Task-Id: t-154.5
|
|
The build and tests pass with no errors. The homepage action links
secti
Task-Id: t-154.4
|
|
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
|
|
Tasks (Ready, Blocked, Intervention, All), Plans (Epics, KB).
Task-Id: t-154.2
|
|
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
|
|
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
The build passes with no errors. The implementation was already
in place
Task-Id: t-149.6
|
|
The build passes with no errors. The change adds `color "#374151"`
(dark
Task-Id: t-149.5
|
|
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
|
|
The build and tests pass. The dashboard metric cards are now
clickable a
Task-Id: t-149.3
|
|
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
|
|
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
|
|
All builds pass. Here's a summary of the changes I made:
**Omni/Task/Core.hs:** - Added `getActivitiesForTask` function to
query task_activity table for
**Omni/Jr/Web.hs:** - Added `Data.Time` import for timestamp formatting
- Updated `TaskDetailPage` type to include `[TaskCore.TaskActivity]` -
Updated `taskDetailHandler` to fetch activities for the task - Added
activity timeline rendering in `toHtml` instance for InProgress -
Added helper functions: `renderActivity`, `stageClass`, `stageIcon`, `
**Omni/Jr/Web/Style.hs:** - Added `activityTimelineStyles`
function with vertical timeline CSS - Added stage-specific colors
(claiming=blue, running=yellow, reviewing= - Added dark mode styles
for the activity timeline
Task-Id: t-148.3
|
|
Implementation complete. The task is done:
1. **Created `logActivity` helper** in `Omni/Task/Core.hs` that writes
t 2. **Integrated into Worker.hs** at all key points:
- `Claiming` - when claiming task - `Running` - when starting amp
- `Reviewing` - when amp completes successfully - `Retrying` -
on retry (includes attempt count in metadata) - `Completed` - on
success (includes result type in metadata) - `Failed` - on failure
(includes exit code or reason in metadata)
Task-Id: t-148.2
|
|
All components are in place: - `ActivityStage` enum with stages:
Claiming, Running, Reviewing, Retryi - `TaskActivity` data type with
all required fields - JSON instances (ToJSON/FromJSON) - SQLite
instances (FromField/ToField for ActivityStage, FromRow/ToRow f -
`task_activity` table in `initTaskDb`
Build passes with no errors.
Task-Id: t-148.1
|