Skip to content

Redesign dashboard UI with sidebar navigation, project views, and Jira integration#18

Draft
CryptoRodeo wants to merge 26 commits intomainfrom
updated-ui
Draft

Redesign dashboard UI with sidebar navigation, project views, and Jira integration#18
CryptoRodeo wants to merge 26 commits intomainfrom
updated-ui

Conversation

@CryptoRodeo
Copy link
Copy Markdown
Owner

@CryptoRodeo CryptoRodeo commented Mar 27, 2026

Summary

UI Overhaul

  • Replace top-bar navigation with a persistent sidebar that shows live run status and navigation links
  • Add Projects page that aggregates runs by Jira issue key, with a Ticket Detail page showing Jira issue metadata and comments
  • Add run comments system (API + UI) for annotating individual runs
  • Add ability to create a run for a specific Jira issue and batch-configure AI provider/models from the UI
  • Only show new runs in the pre-flight modal; replace "open editor" button with "open repo" button
  • Lift useWebSocket into a shared React Context and deduplicate relativeTime/PHASE_LABELS across client code

Jira Integration

  • Add server-side API endpoints for Jira issue details, comments, and project summaries with in-memory caching
  • Enrich run context with Jira metadata (priority, labels, assignee, status)

Engine Hardening & Bug Fixes

  • Fix approval gate resume after container restart by falling back to persisted context for phase 3
  • Eliminate command injection in ensureRepo and createPR by switching to execFile
  • Fix signal listener leak, glob brace expansion, grep spawn error handling, and phase 2 iteration bug
  • Make approval gate abortable and fix grep race condition
  • Fail fast on broken context/PRD parsing; persist failure reasons
  • Replace non-null assertions with safe defaults and add safeParse helper
  • Fix duplicate error handler, null crash in getRetryCount, and stuck loading state

Housekeeping

  • Persist and broadcast model name immediately when a run launches

Demos (TODO - Update these images. They're old now.)

New home page

image

Project page

image

Project details page

image

Run details page

image

Live run

unshift-approval.mp4
unshift-updated.mp4

CryptoRodeo and others added 26 commits March 26, 2026 18:42
also simplify run management

Signed-off-by: Bryan Ramos <bramos@redhat.com>
Also deduplicate provider config parsing,
clarify bash cwd resolution

Signed-off-by: Bryan Ramos <bramos@redhat.com>
Both ensureRepo and createPR passed unsanitized external input (repo URLs,
PR titles/bodies) through exec() via shell string interpolation. Replaced
with a new execCommand() helper that uses execFile with argument arrays,
removing the shell entirely. Deleted the hand-rolled shellEscape function.

Signed-off-by: Bryan Ramos <bramos@redhat.com>
…ility

Silent fallbacks in parseContextFromText and readPrdFromRepo allowed
phases 2/3 to proceed on invalid data (empty branch names, corrupt PRD).
Now throws immediately with clear error messages. Also added timeout to
grepFiles and extracted shared exit-code helper to reduce duplication.

Signed-off-by: Bryan Ramos <bramos@redhat.com>
- Threads AbortSignal through waitForApproval so pending runs can be cancelled
- Uses assertWithinBase return value instead of discarding it in
listFiles/grepFiles
- Prevents double-settle in grepFiles when timeout fires alongside process close

Signed-off-by: Bryan Ramos <bramos@redhat.com>
…handling

Signed-off-by: Bryan Ramos <bramos@redhat.com>
…simplify grep

- readPrdFromRepo: distinguish ENOENT from other FS errors; wrap JSON.parse
  with a descriptive error instead of letting raw SyntaxError propagate
- Persist run failure messages to the database so the API can surface them
- Replace manual settled-flag pattern in grepFiles with AbortController signal,
  eliminating the double-settlement race condition

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Bryan Ramos <bramos@redhat.com>
Signed-off-by: Bryan Ramos <bramos@redhat.com>
Signed-off-by: Bryan Ramos <bramos@redhat.com>
Signed-off-by: Bryan Ramos <bramos@redhat.com>
Signed-off-by: Bryan Ramos <bramos@redhat.com>
Should use jira instance set in ENV vars.

Signed-off-by: Bryan Ramos <bramos@redhat.com>
Allows creating PRs to deployed Gitlab instances.

Signed-off-by: Bryan Ramos <bramos@redhat.com>
Signed-off-by: Bryan Ramos <bramos@redhat.com>
Signed-off-by: Bryan Ramos <bramos@redhat.com>
Signed-off-by: Bryan Ramos <bramos@redhat.com>
- Use nullish coalescing (??) instead of non-null assertions (!) in RunDetailPage
- Extract safeParse helper to eliminate scattered JSON.parse try/catch blocks
- Use prepared statement for comment retrieval instead of inline query

Signed-off-by: Bryan Ramos <bramos@redhat.com>
…r types

- Replace per-component useWebSocket() calls with a single WebSocketProvider
  so all consumers share one connection
- Add return types and error handling to fetch helpers (startRunForIssue,
  addComment, approveRun)
- Type broadcast() with WsMessage and tokens with TokenData on the server
- Add periodic cache eviction to prevent unbounded Jira cache growth
- Validate repos.yaml entries with a type guard instead of a bare cast
- Shell-escape localDir/branchName in the git checkout command
- Guard relativeTime against NaN dates

Signed-off-by: Bryan Ramos <bramos@redhat.com>
Signed-off-by: Bryan Ramos <bramos@redhat.com>
Signed-off-by: Bryan Ramos <bramos@redhat.com>
This adds a pre-flight modal that allows the user to configure the AI
provider and model for a set of runs before launching them.

This allows the user to use the model they find correct for the issue.

Signed-off-by: Bryan Ramos <bramos@redhat.com>
Signed-off-by: Bryan Ramos <bramos@redhat.com>
Signed-off-by: Bryan Ramos <bramos@redhat.com>
…oading state

- Remove duplicate proc.on("error") in grepFiles that could reject a Promise twice
- Add null check in getRetryCount to handle issue keys with no prior runs
- Reset startingRun flag in TicketDetailPage when response has no id

Signed-off-by: Bryan Ramos <bramos@redhat.com>
This makes more sense.

Signed-off-by: Bryan Ramos <bramos@redhat.com>
@CryptoRodeo CryptoRodeo self-assigned this Mar 31, 2026
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