summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
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
2025-11-27Show activity timeline on task detail page in web UIBen Sima
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
2025-11-27Add logActivity helper and integrate into Worker.hsBen Sima
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
2025-11-27Add task_activity table schemaBen Sima
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
2025-11-27Jr web: design_docs table missing - View design docs link crashesBen Sima
The build and tests passed with no errors. The fix is complete - calling Task-Id: t-147
2025-11-27Make Omni/Jr.hs executableBen Sima
2025-11-27jr: Fix empty query param parsing and use XDG for db pathBen Sima
- FromHttpApiData instances return Left for empty strings (Servant treats as missing param for QueryParam Maybe) - getTasksDbPath now uses ~/.local/share/jr/jr.db via XDG - Remove standalone task binary output - Add tests for parseQueryParam on Priority/Status Task-Id: t-145, t-146 Amp-Thread-ID: https://ampcode.com/threads/T-2ad5310f-b7f5-451d-ad9b-35aa17c58774 Co-authored-by: Amp <amp@ampcode.com>
2025-11-26Bild: mark Toml as not buildableBen Sima
Toml files were marked as buildable but analyzeOne returned Nothing, causing them to fail instead of being skipped with [_].
2025-11-26Bild: collect transitive langdeps for Python buildsBen Sima
detectPythonImports now returns (srcs, transitiveDeps) where transitiveDeps contains langdeps from all transitively imported local modules. This fixes builds where a module imports another local module that has language-level dependencies (e.g., pytest).
2025-11-26Bild: remove spurious warn messagesBen Sima
The multi-line UI now handles status display, so these warn messages are redundant and clutter the output.
2025-11-26Bild: pipelined analyze→build architecture with multi-line UIBen Sima
Implement STM-based pipeline that allows per-target progression through build phases (analyze → wait for deps → build) with concurrent workers. Key changes: - TargetState enum tracks each target through pipeline stages - Coordinator manages state, analyze queue, build queue coordination - pipelineAnalysisWorker/pipelineBuildWorker pull from queues concurrently - promoteWaiters unblocks targets when their dependencies complete UI improvements: - Multi-line mode reserves N lines for N targets, updates in-place - Remove narrow terminal (<80 col) restriction for multi-line mode - Add Skipped state with yellow [_] for non-buildable files - Remove extra blank line at start of output State symbols: [.] Pending, [+] Analyzing, [~] Building, [✓] Success (green), [x] Failed (red), [_] Skipped (yellow)
2025-11-26Unify LineManager for analyze and build phasesBen Sima
- Create single LineManager in move() that spans both phases - Reserve N lines upfront for N build targets - Status progression: [.] pending -> [+] analyzing -> [~] building -> [✓]/[x] done - Remove duplicate LineManager creation from analyzeAll and build - Update both SingleLine and MultiLine modes with proper symbols This fixes the issue where only one line was reserved during analysis and status lines were being duplicated instead of overwritten.
2025-11-26Remove duplicate TaskListPage declarationBen Sima
Left over from merge conflict resolution.
2025-11-26Replace unicode ellipsis with ASCII to fix xterm parsingBen Sima
The ellipsis character (…, code 8230) was causing xterm.js parsing errors in the jr worker terminal. Replace with ASCII alternatives.
2025-11-26Add simple output mode for bild testsBen Sima
All tests pass. The solution was minimal - simply passing `True` instead 1. For `analyzeAll`, the first parameter (`isPlanMode`) controls whether 2. For `build`, the second parameter (`loud`) controls whether to use si The changes effectively use the existing "loud/plan mode" infrastructure Task-Id: t-134
2025-11-26Clean commit message subject for gitlint complianceBen Sima
- Remove trailing punctuation from subject line - Truncate to 72 chars max - Capitalize first letter Task-Id: t-1o2g8gugkr1
2025-11-26Fix bild status line output not overwriting properlyBen Sima
The fix is complete. Here's a summary of the changes: Fixed the bild status line output not overwriting properly by: 1. **Made `withLineManager` reentrant** ([Omni/Log/Concurrent.hs](file:/ 2. **Added `linesInitialized` tracking** ([Omni/Log/Concurrent.hs](file: 3. **Added `lastOutputTransient` tracking** ([Omni/Log/Concurrent.hs](fi 4. **Wrapped analyze+build in single manager** ([Omni/Bild.hs](file:///h Task-Id: t-l6kc73wk
2025-11-26Jr: Gerrit-style conflict handling - kick back to coder with contextBen Sima
All tests pass and lint is clean. The implementation adds Gerrit-style c 1. **`gatherConflictContext`** - Creates rich context including: - The commit info (SHA, subject, body) - Current HEAD state (what branch moved to) - Per-file conflict details showing both your changes and recent chan 2. **`getFileConflictInfo`** - For each conflicting file, shows: - Your changes to that file (stat summary) - Recent changes by others (last 3 commits touching the file) 3. The context is stored in `retryReason` and passed to the worker via t Task-Id: t-1o2g8gudqlx
2025-11-26Jr: Sequential task IDsBen Sima
All tests pass. The sequential task IDs feature for Jr is complete: **Summary:** - Sequential task IDs are implemented in `Omni/Task/Core.hs` using an SQ - IDs follow the format `t-1`, `t-2`, `t-3`, etc. - Child tasks use dotted notation: `t-parent.1`, `t-parent.2` - The `jr task` command uses this through `Omni.Task.main` - Tests verify sequential IDs work correctly (lines 564-586 in Task.hs) Task-Id: t-1o2g8gu9y2z
2025-11-26Jr: Sequential task IDsBen Sima
All tests pass. The sequential task ID feature for Jr is complete: **Summary**: - Sequential task IDs are implemented in `Omni/Task/Core.hs` using an SQ - IDs follow the format `t-1`, `t-2`, `t-3`, etc. - Child tasks use dotted notation: `t-parent.1`, `t-parent.2` - The `jr task` command uses this through `Omni.Task.main` - A new test was added to verify sequential IDs work correctly Task-Id: t-1o2g8gu9y2z
2025-11-26Jr: Sequential task IDsBen Sima
All tests pass and the feature is working correctly. The sequential task 1. **Implementation**: Already present in `Omni/Task/Core.hs` with `gene 2. **Integration**: `jr task` commands use `Omni/Task.main` which levera 3. **Testing**: Added a new test `"generateId produces sequential IDs"` Task-Id: t-1o2g8gu9y2z
2025-11-26Jr: Sequential task IDsBen Sima
All tests pass. The implementation is complete: **Summary of changes:** 1. Removed sqids dependency from `Omni/Task/Core.hs`, `Omni/Task.hs`, an 2. Changed `generateId` in `Omni/Task/Core.hs` to produce simple sequent 3. Removed the now-unused `sqidsOptions` configuration and `Web.Sqids` i Task-Id: t-1o2g8gu9y2z
2025-11-26Port task commands to jr taskBen Sima
All tests pass. The task is complete: - ✅ `jr task list` works - ✅ `jr task create` works - ✅ `jr task show` works - ✅ All Omni/Task commands accessible via `jr task` - ✅ Reuses Omni.Task logic - ✅ Added tests for task command parsing - ✅ `bild --test Omni/Jr.hs` passes Task-Id: t-1o2egbj8o0n.2
2025-11-26Build failed: Biz/PodcastItLater/Test.py - 1Ben Sima
The build passes. The fix involved: 1. Adding `sqids` to the test dependencies in Test.py 2. Wrapping the return value of `sqids.encode()` with `str()` to satisfy Task-Id: t-1o2cbfhxu5e