Repository navigation
feat(tasks): add Jira board view and settings - #28
Merged
Merged
Conversation
nplez1
added a commit
that referenced
this pull request
Sep 25, 2026
nplez1
added a commit
that referenced
this pull request
Sep 27, 2026
nplez1
added a commit
that referenced
this pull request
Sep 29, 2026
nplez1
added a commit
that referenced
this pull request
Oct 1, 2026
nplez1
added a commit
that referenced
this pull request
Oct 6, 2026
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ELI5
Orca's Tasks view can read Jira, but it only ever showed a flat list of issues, filtered by a JQL search box or a preset. There was no way to see the thing Jira is actually for — the board. Now you pick a board once in Settings → Tasks, and the Jira tab opens on it: the board's own columns, the active sprint, the backlog, and cards you can drag from one column to another. Dragging moves the issue in Jira, using the same status transitions the issue detail pane already used. If you don't pick a board, nothing changes and you still get the issue list.
What Changed
Before
After
Mechanism
src/main/jira/jira-board-queries.tsadds four reads on top of the existing authenticated Jira request path:listBoards(paged/board),listCustomFields(/field, custom fields only),getBoardOverview(/board/{id}+/configurationfor columns +/sprint?state=activefor scrum boards only), andlistBoardIssues(sprint or backlog). It reusesacquire/releasefromrequest-queue,clearTokenon an auth error, and the existing record helpers. Cloud and Server differ, so paging is per-auth-type: Cloud boards use/rest/software/1.0withnextPageToken, Server uses/rest/agile/1.0withstartAt; when neitherisLastnortotalis available the page size decides.src/main/ipc/jira-board-handlers.tsregistersjira:listBoards,jira:listCustomFields,jira:getBoardOverview,jira:listBoardIssues(validated before dispatch), the preload bridge exposes them, andsrc/main/runtime/rpc/methods/jira.tsaddsjira.listBoards,jira.listCustomFields,jira.getBoardOverview,jira.listBoardIssueswith zod params (BoardIdentifier, andBoardIssuePageas a discriminated union onscope) — the catalog is regenerated in the same commit.useTaskPageJiraBoardPagesowns the two paged issue feeds with per-feed generation counters so a slow page can't land on a newer board;useTaskPageJiraBoardadds the overview, the active sprint, and the filter;task-page-jira-board-model.tsis the pure part — column grouping (including an Other statuses column for issues in no configured column), the Me/Team/All filter, andgetTaskPageJiraBoardTransitionTargets. Drag-and-drop goes through the issue's own transitions: zero matching transitions is an error toast, exactly one is applied directly, and more than one opens a chooser dialog.jiraBoardViewModeinuse-task-page-jira-list-state.ts. When a board is set and that mode isboard, the list effects skip their fetch entirely (use-task-page-jira-list-effects.ts) rather than loading a list nobody is looking at; the Jira filter bar and the site selector are hidden while the board is pinned, both because the board's saved filter replaces them.fieldsrequest and mapped onto the issue (teamValue), then matched exactly against the value from Settings.global-settings-types.tsintosrc/shared/task-view-settings-types.ts(GlobalSettingsis now… & TaskViewSettings), and three keys are added:defaultJiraBoard,jiraTeamFieldId,jiraTeamValue, all defaulted inbuildDefaultSettings.Also in this diff: the branch's own new strings are localized. The first version of this commit called
translate('auto.components.TaskPage.5b6b2af943', 'Loading…')at three board loading states, but that key is the existing"Retrying…"string fromtask-page/github/List.tsx, and because the English boot catalog resolves fromen-runtime-required.jsonwhen a key is shipped there, reconciling the catalogs would have made the board's spinner read Retrying…. The three sites now use their ownjiraBoardLoadingkey, which leavesen-runtime-required.jsonunchanged from the base, registers the ~50 new board strings inlocales/en.json, and wraps the two newaria-labels (Board.tsx,BoardHeader.tsx) intranslate().Why
status. Jira validates status changes through transitions; a board drag can only offer transitions Jira will actually accept for that issue. When more than one transition reaches the target column, the chooser asks instead of picking one, because guessing silently changes the issue's workflow semantics.Linked Issue
N/A — there is no tracking issue, and there cannot be one: GitHub issues are disabled on this fork (
nplez1/orcareportshas_issues: false). The fork tracker isBRANCHES.md; this branch was not listed there before opening.Visual Proof
N/A — no screenshots, deliberately, at the author's request for this PR. Stated plainly rather than implied: this is a visible change (a new board surface in the Jira Tasks tab and a new settings section), and no capture was taken because the board only renders against a live Jira site with a scrum board attached, which this worktree has no credentials for. The
$electronskillAGENTS.mdnames for rendered-UI checks is not installed here (the available skills arecomputer-use,find-skills,orca-cli,orchestration), and no app was launched, so the untested-by-eye surface is exactly: column widths and horizontal scroll on a wide board, drag-and-drop feel, and the settings section's two-column layout at narrow widths. The rest of the diff is transport, paging, and pure grouping/group-filter logic, which the tests below assert; what no test asserts is any of it against a live Jira site.Testing
Verified on macOS, on the branch as pushed (
e253a3a059), after rebasing ontoorigin/nplez1/main(52780417c1, i.e. #26 + #27 — a clean rebase, which is why the PR is one commit):pnpm tc— clean (main, node, web, cli).pnpm teston the ten touched and adjacent suites — 87 passed:jira-board-queries,main/jira/issues,JiraIssueWorkspace.refreshSignal,settings/JiraBoardSettings,settings/TasksPane,task-page-jira-board-model,task-page/jira/Board,task-page/jira/SettingsLink,runtime-jira-client,task-page-jira-grouping. Covers the Cloud/Server paging split andisLastinference, column grouping with an other-statuses column, the transition-target matching (0 / 1 / many), the Team filter, the settings writes (including clearing the team field when the board's site changes), and the detail refetch after a move.pnpm run check:code-quality:changed— 0 new findings across 47 changed files (casting, focused plugins, type-aware, React Doctor, design system, casting-SAFETY), gate passed since52780417c1.The gates this branch initially failed, now green:
verify:localization-catalog,verify:localization-runtime-catalog,verify:localization-extraction,verify:localization-coverage— and the base was re-checked, where all four pass, so the fix in "Also in this diff" is what closed them.verify:rpc-params-catalogpasses for the regenerated catalog.Not run locally: the new e2e spec (
tests/e2e/jira-tasks-settings-link.spec.ts) needs a built Electron app. CI does cover it —config/scripts/pr-e2e-source-routing.mjsroutes this PR's 48 changed files to exactly that spec, sopr.yml'se2ejob runs it. Fullpnpm lint, fullpnpm test, andpnpm buildare left to CI. No manual run and no Jira connection — the board has never rendered against a real site, so a reviewer with Jira credentials is the first person to see it work.I manually tested these changes locally
Automated tests added/updated, or explained why not below
The commit adds six unit suites and updates two existing ones, plus the e2e spec. Steps for a reviewer with Jira access: Settings → Tasks → Jira board view → pick a scrum board → Tasks → Jira → the board should open on the active sprint; drag a card one column right and confirm Jira records the transition; switch to Backlog and scroll (pages of 100); set a Team field + value and check the Team filter; set No default board and confirm the old list comes back.
AI Disclosure
Authored with an AI coding agent (pi) under human direction; the feature commit carries no model trailer, so no model is named for the code itself. This description was written by a later pi session (
deepseek-flash) from the branch diff, the gate output above, and the session that wrote the code.Review
Start with
src/main/jira/jira-board-queries.ts— the paging split between Cloud (/rest/software/1.0,nextPageToken) and Server (/rest/agile/1.0,startAt) and theisLastfallback are the parts most likely to be wrong against a real site. Thentask-page-jira-board-model.ts, which is pure and fully tested: column grouping, the Me/Team/All filter, and transition targets. ThenBoard.tsx(handleDrop→ 0/1/many transitions) anduse-task-page-jira-board-pages.ts(generation guards).JiraBoardSettings.tsxis the only place that writes the new settings and is worth a look for which fields it clears on change.Agent skill upstream boundary
docs/reference/agent-skill-sharing-upstream-boundary.mdand copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.Notes
jiraRequest+acquire/release,clearTokenonly on an auth error), and board ids / site ids areencodeURIComponentd into the paths before use. The new IPC handlers validate their args before dispatch and the RPC methods validate with zod;listBoardIssuesreturns an empty page rather than throwing on a malformed request.components/ui/primitive was restyled.runtime-jira-board-client.tscalls the paired runtime over RPC when the Jira integration lives on a runtime environment, and the local IPC bridge otherwise. A runtime that predates these methods answersmethod_not_found, which the renderer already detects: it toasts once and falls back to the issue list rather than showing an error, so an old runtime paired with a new client degrades instead of breaking. New RPC methods are additive; nothing an old client reads changed shape.buildDefaultSettings(defaultJiraBoard: null, empty team field/value), so an existing profile keeps the issue list until a board is chosen; theGlobalSettingschange is a type-only move of the task-view keys intoTaskViewSettings.JiraIssuegains an optionalteamValuethat only the board mapping populates.en-runtime-required.jsonis byte-identical to the base.getBoardOverviewis three sequential requests per board (board, configuration, active sprints) and is refetched only on refresh or when the selection changes.Checklist
N/Awith reason — not captured; see Visual Proofpnpm lint,pnpm typecheck,pnpm test, andpnpm buildpass (or CI will cover; local preferred) —pnpm tc, the ten suites above, the changed-code quality gate and all five verify gates pass locally; fullpnpm lint, fullpnpm test,pnpm buildand the e2e spec are left to CI