Skip to content

Support Jira Server and Data Center sites#7242

Closed
CleonSuo wants to merge 1 commit into
stablyai:mainfrom
CleonSuo:jira-server-dc-support
Closed

Support Jira Server and Data Center sites#7242
CleonSuo wants to merge 1 commit into
stablyai:mainfrom
CleonSuo:jira-server-dc-support

Conversation

@CleonSuo

@CleonSuo CleonSuo commented Jul 3, 2026

Copy link
Copy Markdown

Add Server/DC auth, request routing, issue operations, renderer wiring, tests, and contribution documentation for connect/list/search/create/comment/assign/transition.

Summary

Adds Jira Server/Data Center support alongside Jira Cloud in the existing Jira integration.

Users can now connect Jira Cloud or Server/Data Center sites, choose Basic or Bearer auth for Server/DC, and use Jira issue workflows across connect, list, search, create, comment, assign, unassign, and transition. The implementation routes Cloud requests to REST API v3 and Server/DC requests to REST API v2, preserves Cloud behavior, and supports both local IPC and remote runtime RPC paths.

Screenshots

Updated Jira connect dialog with Cloud and Server/Data Center modes.

Testing

  • pnpm lint
  • pnpm typecheck
  • pnpm test
  • pnpm build
  • Added or updated high-quality tests that would catch regressions, including Server/DC auth, request routing, metadata, comments, assignee updates, IPC/RPC validation, renderer dialog behavior, credential cleanup, and settings integration behavior.

Focused Jira test command run:

pnpm vitest run --config config/vitest.config.ts src/main/jira/client.test.ts src/main/jira/issues.test.ts src/main/ipc/jira.test.ts src/main/runtime/rpc/methods/jira.test.ts src/renderer/src/runtime/runtime-jira-client.test.ts src/renderer/src/store/slices/jira.test.ts src/renderer/src/components/jira-connect-dialog.test.tsx src/renderer/src/components/jira-create-field-payload.test.ts src/renderer/src/components/settings/jira-integration-card.test.tsx

Result: 9 test files passed, 81 tests passed.

Full verification run:

  • pnpm lint: passed, with existing non-fatal warnings.
  • pnpm typecheck: passed.
  • pnpm test: passed, 2297 test files passed, 2 skipped; 23802 tests passed, 29 skipped.
  • pnpm build: passed. The local build emitted existing non-fatal warnings, including the Node engine warning and the optional /usr/local/bin/orca-dev symlink permission warning.

AI Review Report

AI code review checked Jira Cloud regression risk, Jira Server/Data Center REST API v2 routing, Basic/Bearer auth handling, connect/list/search/create/comment/assign/transition coverage, IPC/RPC/preload/runtime wiring, renderer state handling, i18n text, pagination behavior, credential cleanup, and contribution-rule compliance.

The review flagged and fixed these issues:

  • Legacy saved Jira site URLs could retain embedded URL credentials during metadata migration.
  • The Jira connect dialog could retain typed credentials after cancel/close.
  • The Server/Data Center URL placeholder could remain Cloud-specific.
  • A local full-test run previously surfaced an unrelated flaky macOS worktree watcher test; the failing test, its file-level suite, and the full test suite were rerun successfully. The Jira PR diff does not touch that watcher code path.

Legacy metadata migration now strips URL credentials/query/hash, and the connect dialog now clears site URL, credentials, auth mode, and error state when closed or after successful connect. Regression tests were added for those behaviors.

The review explicitly checked cross-platform compatibility for macOS, Linux, and Windows, including shortcuts, labels, paths, shell behavior, and Electron-specific platform differences touched by this PR. This PR does not add platform-specific shortcuts, shell commands, or path separators. File path handling remains in Node/Electron path utilities, and remote runtime behavior was reviewed through the Jira RPC wiring.

Security Audit

AI security review covered input handling, auth, secrets, IPC/RPC validation, path handling, logging, dependencies, and Electron runtime boundaries.

Reviewed items:

  • Credentials are accepted only through explicit Cloud or Server/DC auth payloads.
  • IPC and RPC schemas reject malformed or mixed-mode connect payloads.
  • Auth headers are built in main/runtime code, not renderer UI code.
  • Stored site metadata does not retain URL username/password credentials.
  • Dialog state clears typed credentials on cancel/close and after successful connect.
  • Renderer receives site metadata but not stored token contents.
  • Server/DC request routing is selected from stored deployment metadata rather than user-controlled path fragments.
  • No new shell execution, path handling, or dependency risk was introduced.
  • No private deployment domain is present in code, docs, tests, or package files.

Follow-up: none required from this review.

Notes

Server/Data Center support uses Jira REST API v2. Jira Cloud continues to use REST API v3.

Remote runtime behavior is supported through the existing Jira runtime RPC bridge.

Local verification was run on a machine using Node v25.2.1, while the repository declares Node 24. The commands completed successfully despite the engine warning.

@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR adds deployment-aware Jira support for Cloud and Server/Data Center. Shared Jira types now distinguish deployment type, auth mode, and user identifiers. Main-process Jira logic is split into request, storage, identity, routing, search, metadata, comments, and client modules with server/cloud branching. IPC, RPC, preload, renderer store/runtime, and UI layers now accept cloud or server connect payloads, and assignee updates use userId. The renderer also adds deployment-aware create-field payload handling, updated Jira connect UI, localization, tests, and reference docs.

Related PRs: None specified
Suggested labels: jira-integration, main-process, renderer, i18n
Suggested reviewers: None specified

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding Jira Server and Data Center support.
Description check ✅ Passed The description follows the required template and includes all major sections with relevant details.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/renderer/src/components/TaskPage.tsx (1)

5544-5544: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Guard page-level UI while the Jira connect dialog is open.

jiraConnectOpen is not included in the Tasks tour/Escape-modal guards. Move this state above those guards and include !jiraConnectOpen / jiraConnectOpen checks so opening the connect dialog does not let page-level tour or Escape handling interfere with the modal.

Also applies to: 12367-12367

src/main/ipc/jira.ts (1)

119-132: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Reject mixed assignee IDs. updateIssue silently prefers assigneeUserId when both fields are present, so a mixed payload can update the wrong assignee on Cloud/Server. Reject the combination here or normalize it to a single field first.

🧹 Nitpick comments (9)
src/renderer/src/components/jira-create-field-payload.test.ts (1)

1-46: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for array/allowedValues/number branches.

Tests only cover the textarea server-vs-cloud path in buildJiraCreateFieldValue. The array-split, allowedValues option-payload, and number-parsing branches in jira-create-field-payload.ts (lines 47-65) are untested.

src/shared/jira-types.ts (1)

137-163: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Document why deploymentType is optional only on the Cloud variant.

JiraCloudConnectArgs.deploymentType is optional while both Server variants require the literal. This is intentional (per the design doc, legacy renderer/runtime callers omit deploymentType and are normalized to Cloud at the IPC/RPC/store boundary), but nothing here explains that, and it weakens exhaustiveness checks on JiraConnectArgs for any code that switches on deploymentType without also handling undefined.

As per path instructions, "When writing or modifying code driven by a design doc or non-obvious constraint, add a comment explaining why the code behaves the way it does."

💬 Suggested comment
 export type JiraCloudConnectArgs = {
+  // Optional for legacy callers that predate Server/DC support; normalized
+  // to 'cloud' at the IPC/RPC/store boundary before reaching the client.
   deploymentType?: 'cloud'
   siteUrl: string

Source: Path instructions

src/renderer/src/i18n/locales/en.json (1)

7557-7558: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Locale key naming deviates from hash-based convention for settings strings.

New Jira Server/Data Center keys (jiraServerKeyword, jiraDataCenterKeyword, jiraCloudServerCredentials, jiraCloudServerRemoteCredentialCopy, jiraCloudServerLocalCredentialCopy, jiraCloudServerIssueDescription, connectedJiraCredentialStorage, cloudServerDescription, deploymentType, etc.) use descriptive names instead of the SHA1(path+text) hash convention used for most existing keys in these same objects.

Not blocking — the file already mixes both styles (e.g. disconnect_all, account_scope_prefix) — but worth confirming this is intentional rather than a missed pnpm bootstrap:locale-catalog run, since the convention was called out specifically for settings-component locale strings.

Based on learnings, "when localizing user-facing strings inside settings components (e.g., src/renderer/src/components/settings/*.tsx), use hash-based locale keys with translate('auto.components.<Dir>.<ComponentFile>.<10-char-hash>', 'Default English text')... then run pnpm bootstrap:locale-catalog so translations propagate to es/ja/ko/zh."

Also applies to: 7581-7582, 8415-8419, 12147-12161

Source: Learnings

src/main/ipc/jira.ts (2)

58-106: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider extracting per-deployment normalization to reduce complexity.

normalizeConnectArgs handles three branches (cloud, server-basic, server-bearer) inline with repeated hasOnlyKeys + normalizeRequiredString + ternary patterns. Extracting small helpers (e.g., normalizeCloudConnectArgs, normalizeServerBasicConnectArgs, normalizeServerBearerConnectArgs) would improve readability and make each branch independently testable.

Source: Linters/SAST tools


119-139: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicate nullable-string validation pattern.

The undefined/null/non-string checks for assigneeUserId, assigneeAccountId, and priorityId repeat the same three-line pattern. A small helper like isNullableString(value) would remove the duplication and make it easy to add future nullable fields consistently.

♻️ Proposed helper
+function isNullableString(value: unknown): boolean {
+  return value === undefined || value === null || typeof value === 'string'
+}
+
 function normalizeIssueUpdate(value: unknown): JiraIssueUpdate | null {
   ...
-  if (
-    input.assigneeUserId !== undefined &&
-    input.assigneeUserId !== null &&
-    typeof input.assigneeUserId !== 'string'
-  ) {
-    return null
-  }
+  if (!isNullableString(input.assigneeUserId)) {
+    return null
+  }
src/main/ipc/jira.test.ts (1)

74-163: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Good coverage of the new normalization paths; consider a few additional cases.

Tests correctly cover server basic/bearer connect trimming and the mixed-payload rejection, plus assigneeUserId acceptance/rejection. Consider adding a case for a cloud connect payload (with/without deploymentType) and an explicit invalid deploymentType value to fully lock in normalizeConnectArgs branch coverage.

src/main/runtime/rpc/methods/jira.ts (1)

18-47: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

.strict() is deprecated in Zod 4 in favor of z.strictObject().

Per Zod's v4 migration guide, .strict() "are still available for backwards compatibility... [but] are considered legacy," with z.strictObject()/z.looseObject() as the preferred replacement. Since the project is on zod@4.4.3, consider migrating these three schemas for consistency with idiomatic Zod 4 usage (purely cosmetic — behavior is unchanged).

♻️ Example migration
-const ServerBasicConnect = z
-  .object({
-    deploymentType: z.literal('server'),
-    authMode: z.literal('basic'),
-    siteUrl: requiredString('Site URL is required'),
-    username: requiredString('Username is required'),
-    passwordOrToken: requiredString('Password or token is required')
-  })
-  .strict()
+const ServerBasicConnect = z.strictObject({
+  deploymentType: z.literal('server'),
+  authMode: z.literal('basic'),
+  siteUrl: requiredString('Site URL is required'),
+  username: requiredString('Username is required'),
+  passwordOrToken: requiredString('Password or token is required')
+})
src/main/jira/jira-user-identity.ts (1)

3-11: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Duplicate asRecord/asString/JiraRecord primitives.

These are identical to the exported versions in issue-mappers.ts (Lines 29, 44-50 there). Direct reuse isn't possible without a cycle since issue-mappers.ts already imports mapJiraUser from this file. Consider extracting these primitives into a small shared module (e.g. jira-primitives.ts) that both files import.

src/main/jira/site-storage.ts (1)

83-102: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Duplicate URL credential-stripping logic vs. client.ts's normalizeJiraSiteUrl.

This function reimplements the same protocol/username/password/search/hash stripping as normalizeJiraSiteUrl in client.ts (Lines 54-65), differing only in the try/catch wrapper. Since both exist specifically to prevent credential leakage into site metadata, having two independent copies risks future divergence reintroducing that leak if only one is updated. Extract the core stripping logic into a shared helper (e.g. in a small jira-url.ts module importable by both, since site-storage.ts can't import from client.ts without a cycle) and have each call site apply its own throw-vs-fallback behavior around it.

♻️ Sketch of shared helper
+// jira-url.ts
+export function stripJiraUrlCredentials(url: URL): void {
+  url.username = ''
+  url.password = ''
+  url.pathname = url.pathname.replace(/\/+$/, '')
+  url.search = ''
+  url.hash = ''
+}
-  try {
-    const withProtocol = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`
-    const url = new URL(withProtocol)
-    url.username = ''
-    url.password = ''
-    url.pathname = url.pathname.replace(/\/+$/, '')
-    url.search = ''
-    url.hash = ''
-    return url.toString().replace(/\/$/, '')
-  } catch {
-    return trimmed
-  }
+  try {
+    const withProtocol = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`
+    const url = new URL(withProtocol)
+    stripJiraUrlCredentials(url)
+    return url.toString().replace(/\/$/, '')
+  } catch {
+    return trimmed
+  }

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 4616f886-2b82-40d8-9ea5-8d261542a4fb

📥 Commits

Reviewing files that changed from the base of the PR and between 1403467 and 20233a6.

📒 Files selected for processing (48)
  • docs/reference/README.md
  • docs/reference/jira-server-support.md
  • src/main/ipc/jira.test.ts
  • src/main/ipc/jira.ts
  • src/main/jira/auth-headers.ts
  • src/main/jira/client.test.ts
  • src/main/jira/client.ts
  • src/main/jira/issue-comments.ts
  • src/main/jira/issue-mappers.ts
  • src/main/jira/issue-metadata.ts
  • src/main/jira/issue-page-fetcher.ts
  • src/main/jira/issue-rest-routing.ts
  • src/main/jira/issue-search.ts
  • src/main/jira/issues.test.ts
  • src/main/jira/issues.ts
  • src/main/jira/jira-request.ts
  • src/main/jira/jira-user-identity.ts
  • src/main/jira/site-storage.ts
  • src/main/runtime/rpc/methods/jira.test.ts
  • src/main/runtime/rpc/methods/jira.ts
  • src/preload/api-types.ts
  • src/preload/index.ts
  • src/renderer/src/components/JiraIssueWorkspace.tsx
  • src/renderer/src/components/TaskPage.tsx
  • src/renderer/src/components/feature-interaction-writer-boundaries.test.ts
  • src/renderer/src/components/jira-connect-dialog.test.tsx
  • src/renderer/src/components/jira-connect-dialog.tsx
  • src/renderer/src/components/jira-create-field-payload.test.ts
  • src/renderer/src/components/jira-create-field-payload.ts
  • src/renderer/src/components/jira-server-auth-fields.tsx
  • src/renderer/src/components/right-sidebar/pr-comment-presentation.test.ts
  • src/renderer/src/components/right-sidebar/pr-comments-list-selection.test.tsx
  • src/renderer/src/components/settings/integrations-search.ts
  • src/renderer/src/components/settings/jira-integration-card.test.tsx
  • src/renderer/src/components/settings/jira-integration-card.tsx
  • src/renderer/src/components/sidebar/LinearAgentSkillSetupPrompt.reminder-toast.test.tsx
  • src/renderer/src/components/sidebar/SidebarToolbar.test.tsx
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/zh.json
  • src/renderer/src/runtime/runtime-jira-client.test.ts
  • src/renderer/src/runtime/runtime-jira-client.ts
  • src/renderer/src/store/slices/jira.ts
  • src/renderer/src/test/memory-storage.ts
  • src/shared/jira-types.ts
  • src/shared/types.ts

Comment thread src/main/jira/client.ts Outdated
Comment thread src/main/jira/issue-page-fetcher.ts
Comment thread src/renderer/src/components/jira-connect-dialog.tsx
Comment thread src/renderer/src/components/jira-server-auth-fields.tsx
Comment thread src/shared/jira-types.ts
@CleonSuo CleonSuo force-pushed the jira-server-dc-support branch from 20233a6 to 4d11fce Compare July 3, 2026 15:12

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
src/main/jira/jira-site-url.ts (1)

1-1: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Consider restricting PROTOCOL_PATTERN to http(s).

Any scheme matching ^[a-z][a-z0-9+.-]*:\/\//i is accepted as-is (e.g. file://, ftp://), so a malformed or accidental non-HTTP site URL would be normalized and stored rather than rejected here. Since this is the single normalization point feeding both storage and (per the PR summary) request routing, validating the scheme is http/https would fail fast with a clearer error instead of surfacing confusing failures downstream.

♻️ Proposed tightening of allowed protocols
-const PROTOCOL_PATTERN = /^[a-z][a-z0-9+.-]*:\/\//i
+const PROTOCOL_PATTERN = /^https?:\/\//i

Also applies to: 13-19


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1c3eb053-a5dd-48c3-9bf7-d3ef03e43e58

📥 Commits

Reviewing files that changed from the base of the PR and between 20233a6 and 4d11fce.

📒 Files selected for processing (51)
  • docs/reference/README.md
  • docs/reference/jira-server-support.md
  • src/main/ipc/jira-connect-args-normalization.ts
  • src/main/ipc/jira.test.ts
  • src/main/ipc/jira.ts
  • src/main/jira/auth-headers.ts
  • src/main/jira/client.test.ts
  • src/main/jira/client.ts
  • src/main/jira/issue-comments.ts
  • src/main/jira/issue-mappers.ts
  • src/main/jira/issue-metadata.ts
  • src/main/jira/issue-page-fetcher.ts
  • src/main/jira/issue-rest-routing.ts
  • src/main/jira/issue-search.ts
  • src/main/jira/issues.test.ts
  • src/main/jira/issues.ts
  • src/main/jira/jira-record-primitives.ts
  • src/main/jira/jira-request.ts
  • src/main/jira/jira-site-url.ts
  • src/main/jira/jira-user-identity.ts
  • src/main/jira/site-storage.ts
  • src/main/runtime/rpc/methods/jira.test.ts
  • src/main/runtime/rpc/methods/jira.ts
  • src/preload/api-types.ts
  • src/preload/index.ts
  • src/renderer/src/components/JiraIssueWorkspace.tsx
  • src/renderer/src/components/TaskPage.tsx
  • src/renderer/src/components/feature-interaction-writer-boundaries.test.ts
  • src/renderer/src/components/jira-connect-dialog.test.tsx
  • src/renderer/src/components/jira-connect-dialog.tsx
  • src/renderer/src/components/jira-create-field-payload.test.ts
  • src/renderer/src/components/jira-create-field-payload.ts
  • src/renderer/src/components/jira-server-auth-fields.tsx
  • src/renderer/src/components/right-sidebar/pr-comment-presentation.test.ts
  • src/renderer/src/components/right-sidebar/pr-comments-list-selection.test.tsx
  • src/renderer/src/components/settings/integrations-search.ts
  • src/renderer/src/components/settings/jira-integration-card.test.tsx
  • src/renderer/src/components/settings/jira-integration-card.tsx
  • src/renderer/src/components/sidebar/LinearAgentSkillSetupPrompt.reminder-toast.test.tsx
  • src/renderer/src/components/sidebar/SidebarToolbar.test.tsx
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/zh.json
  • src/renderer/src/runtime/runtime-jira-client.test.ts
  • src/renderer/src/runtime/runtime-jira-client.ts
  • src/renderer/src/store/slices/jira.ts
  • src/renderer/src/test/memory-storage.ts
  • src/shared/jira-types.ts
  • src/shared/types.ts
✅ Files skipped from review due to trivial changes (4)
  • docs/reference/README.md
  • src/shared/types.ts
  • src/renderer/src/components/sidebar/LinearAgentSkillSetupPrompt.reminder-toast.test.tsx
  • src/renderer/src/components/feature-interaction-writer-boundaries.test.ts
🚧 Files skipped from review as they are similar to previous changes (39)
  • src/renderer/src/components/settings/integrations-search.ts
  • src/main/jira/auth-headers.ts
  • src/renderer/src/components/sidebar/SidebarToolbar.test.tsx
  • src/renderer/src/components/right-sidebar/pr-comment-presentation.test.ts
  • src/main/jira/issue-rest-routing.ts
  • src/renderer/src/components/right-sidebar/pr-comments-list-selection.test.tsx
  • src/renderer/src/components/JiraIssueWorkspace.tsx
  • src/renderer/src/components/jira-connect-dialog.test.tsx
  • src/preload/api-types.ts
  • src/main/jira/client.test.ts
  • src/main/jira/issue-comments.ts
  • src/renderer/src/components/settings/jira-integration-card.tsx
  • src/main/jira/issue-page-fetcher.ts
  • src/preload/index.ts
  • src/main/runtime/rpc/methods/jira.test.ts
  • src/renderer/src/components/jira-connect-dialog.tsx
  • src/renderer/src/runtime/runtime-jira-client.ts
  • src/main/jira/jira-user-identity.ts
  • src/main/runtime/rpc/methods/jira.ts
  • src/renderer/src/test/memory-storage.ts
  • src/main/ipc/jira.ts
  • src/renderer/src/components/jira-create-field-payload.ts
  • src/renderer/src/components/settings/jira-integration-card.test.tsx
  • src/main/jira/issues.test.ts
  • src/renderer/src/store/slices/jira.ts
  • src/main/jira/issue-search.ts
  • src/main/jira/issues.ts
  • src/renderer/src/components/jira-server-auth-fields.tsx
  • src/renderer/src/i18n/locales/ja.json
  • src/main/jira/issue-metadata.ts
  • src/shared/jira-types.ts
  • src/main/jira/client.ts
  • src/main/jira/jira-request.ts
  • src/renderer/src/i18n/locales/ko.json
  • src/main/jira/site-storage.ts
  • src/renderer/src/runtime/runtime-jira-client.test.ts
  • src/main/jira/issue-mappers.ts
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/components/TaskPage.tsx

Comment thread docs/reference/jira-server-support.md
Comment thread docs/reference/jira-server-support.md Outdated
Comment thread docs/reference/jira-server-support.md
Comment thread src/main/ipc/jira.test.ts
@CleonSuo CleonSuo force-pushed the jira-server-dc-support branch from 4d11fce to 6cb3bbb Compare July 3, 2026 15:49

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/main/ipc/jira.ts (1)

82-90: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Redundant assignee validation in normalizeIssueUpdate.

getIssueUpdateValidationError (lines 54-69) already validates assigneeUserId/assigneeAccountId types and mixed-identifier usage, and is called before normalizeIssueUpdate at the only call site (Line 191-195). These three checks can never fail here anymore, making them dead code.

♻️ Proposed cleanup
-  if (!isNullableString(input.assigneeUserId)) {
-    return null
-  }
-  if (!isNullableString(input.assigneeAccountId)) {
-    return null
-  }
-  if (input.assigneeUserId !== undefined && input.assigneeAccountId !== undefined) {
-    return null
-  }
   if (!isNullableString(input.priorityId)) {
     return null
   }

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: b760db17-58dc-4c31-b78f-a59a02e58cbf

📥 Commits

Reviewing files that changed from the base of the PR and between 4d11fce and 6cb3bbb.

📒 Files selected for processing (51)
  • docs/reference/README.md
  • docs/reference/jira-server-support.md
  • src/main/ipc/jira-connect-args-normalization.ts
  • src/main/ipc/jira.test.ts
  • src/main/ipc/jira.ts
  • src/main/jira/auth-headers.ts
  • src/main/jira/client.test.ts
  • src/main/jira/client.ts
  • src/main/jira/issue-comments.ts
  • src/main/jira/issue-mappers.ts
  • src/main/jira/issue-metadata.ts
  • src/main/jira/issue-page-fetcher.ts
  • src/main/jira/issue-rest-routing.ts
  • src/main/jira/issue-search.ts
  • src/main/jira/issues.test.ts
  • src/main/jira/issues.ts
  • src/main/jira/jira-record-primitives.ts
  • src/main/jira/jira-request.ts
  • src/main/jira/jira-site-url.ts
  • src/main/jira/jira-user-identity.ts
  • src/main/jira/site-storage.ts
  • src/main/runtime/rpc/methods/jira.test.ts
  • src/main/runtime/rpc/methods/jira.ts
  • src/preload/api-types.ts
  • src/preload/index.ts
  • src/renderer/src/components/JiraIssueWorkspace.tsx
  • src/renderer/src/components/TaskPage.tsx
  • src/renderer/src/components/feature-interaction-writer-boundaries.test.ts
  • src/renderer/src/components/jira-connect-dialog.test.tsx
  • src/renderer/src/components/jira-connect-dialog.tsx
  • src/renderer/src/components/jira-create-field-payload.test.ts
  • src/renderer/src/components/jira-create-field-payload.ts
  • src/renderer/src/components/jira-server-auth-fields.tsx
  • src/renderer/src/components/right-sidebar/pr-comment-presentation.test.ts
  • src/renderer/src/components/right-sidebar/pr-comments-list-selection.test.tsx
  • src/renderer/src/components/settings/integrations-search.ts
  • src/renderer/src/components/settings/jira-integration-card.test.tsx
  • src/renderer/src/components/settings/jira-integration-card.tsx
  • src/renderer/src/components/sidebar/LinearAgentSkillSetupPrompt.reminder-toast.test.tsx
  • src/renderer/src/components/sidebar/SidebarToolbar.test.tsx
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/zh.json
  • src/renderer/src/runtime/runtime-jira-client.test.ts
  • src/renderer/src/runtime/runtime-jira-client.ts
  • src/renderer/src/store/slices/jira.ts
  • src/renderer/src/test/memory-storage.ts
  • src/shared/jira-types.ts
  • src/shared/types.ts
✅ Files skipped from review due to trivial changes (3)
  • docs/reference/README.md
  • src/shared/types.ts
  • src/renderer/src/components/settings/integrations-search.ts
🚧 Files skipped from review as they are similar to previous changes (43)
  • src/main/jira/issue-rest-routing.ts
  • src/renderer/src/components/right-sidebar/pr-comment-presentation.test.ts
  • src/main/jira/jira-record-primitives.ts
  • src/preload/api-types.ts
  • src/main/jira/auth-headers.ts
  • src/renderer/src/components/right-sidebar/pr-comments-list-selection.test.tsx
  • src/preload/index.ts
  • src/renderer/src/components/JiraIssueWorkspace.tsx
  • src/renderer/src/components/jira-server-auth-fields.tsx
  • src/renderer/src/runtime/runtime-jira-client.test.ts
  • src/renderer/src/components/sidebar/LinearAgentSkillSetupPrompt.reminder-toast.test.tsx
  • src/main/runtime/rpc/methods/jira.test.ts
  • src/renderer/src/test/memory-storage.ts
  • src/renderer/src/components/jira-connect-dialog.test.tsx
  • src/renderer/src/components/jira-create-field-payload.test.ts
  • src/main/ipc/jira-connect-args-normalization.ts
  • src/renderer/src/runtime/runtime-jira-client.ts
  • src/renderer/src/components/sidebar/SidebarToolbar.test.tsx
  • src/main/jira/jira-user-identity.ts
  • src/main/jira/issue-comments.ts
  • src/renderer/src/components/settings/jira-integration-card.tsx
  • src/renderer/src/components/feature-interaction-writer-boundaries.test.ts
  • src/main/jira/issue-page-fetcher.ts
  • src/main/jira/issue-metadata.ts
  • src/main/jira/issues.test.ts
  • src/renderer/src/store/slices/jira.ts
  • src/renderer/src/i18n/locales/ja.json
  • src/main/jira/jira-request.ts
  • src/main/jira/issue-mappers.ts
  • src/renderer/src/components/settings/jira-integration-card.test.tsx
  • src/main/jira/issue-search.ts
  • src/main/runtime/rpc/methods/jira.ts
  • src/renderer/src/components/jira-create-field-payload.ts
  • src/renderer/src/i18n/locales/zh.json
  • src/shared/jira-types.ts
  • src/renderer/src/i18n/locales/es.json
  • src/main/jira/issues.ts
  • src/renderer/src/i18n/locales/en.json
  • src/main/jira/client.ts
  • src/renderer/src/i18n/locales/ko.json
  • src/main/jira/site-storage.ts
  • src/renderer/src/components/TaskPage.tsx
  • src/renderer/src/components/jira-connect-dialog.tsx

Comment thread docs/reference/jira-server-support.md
@CleonSuo CleonSuo force-pushed the jira-server-dc-support branch from 6cb3bbb to b441c7a Compare July 3, 2026 16:09

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 6f7869fe-e1e1-4142-a3fb-33bbc9da5219

📥 Commits

Reviewing files that changed from the base of the PR and between 6cb3bbb and b441c7a.

📒 Files selected for processing (51)
  • docs/reference/README.md
  • docs/reference/jira-server-support.md
  • src/main/ipc/jira-connect-args-normalization.ts
  • src/main/ipc/jira.test.ts
  • src/main/ipc/jira.ts
  • src/main/jira/auth-headers.ts
  • src/main/jira/client.test.ts
  • src/main/jira/client.ts
  • src/main/jira/issue-comments.ts
  • src/main/jira/issue-mappers.ts
  • src/main/jira/issue-metadata.ts
  • src/main/jira/issue-page-fetcher.ts
  • src/main/jira/issue-rest-routing.ts
  • src/main/jira/issue-search.ts
  • src/main/jira/issues.test.ts
  • src/main/jira/issues.ts
  • src/main/jira/jira-record-primitives.ts
  • src/main/jira/jira-request.ts
  • src/main/jira/jira-site-url.ts
  • src/main/jira/jira-user-identity.ts
  • src/main/jira/site-storage.ts
  • src/main/runtime/rpc/methods/jira.test.ts
  • src/main/runtime/rpc/methods/jira.ts
  • src/preload/api-types.ts
  • src/preload/index.ts
  • src/renderer/src/components/JiraIssueWorkspace.tsx
  • src/renderer/src/components/TaskPage.tsx
  • src/renderer/src/components/feature-interaction-writer-boundaries.test.ts
  • src/renderer/src/components/jira-connect-dialog.test.tsx
  • src/renderer/src/components/jira-connect-dialog.tsx
  • src/renderer/src/components/jira-create-field-payload.test.ts
  • src/renderer/src/components/jira-create-field-payload.ts
  • src/renderer/src/components/jira-server-auth-fields.tsx
  • src/renderer/src/components/right-sidebar/pr-comment-presentation.test.ts
  • src/renderer/src/components/right-sidebar/pr-comments-list-selection.test.tsx
  • src/renderer/src/components/settings/integrations-search.ts
  • src/renderer/src/components/settings/jira-integration-card.test.tsx
  • src/renderer/src/components/settings/jira-integration-card.tsx
  • src/renderer/src/components/sidebar/LinearAgentSkillSetupPrompt.reminder-toast.test.tsx
  • src/renderer/src/components/sidebar/SidebarToolbar.test.tsx
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/zh.json
  • src/renderer/src/runtime/runtime-jira-client.test.ts
  • src/renderer/src/runtime/runtime-jira-client.ts
  • src/renderer/src/store/slices/jira.ts
  • src/renderer/src/test/memory-storage.ts
  • src/shared/jira-types.ts
  • src/shared/types.ts
✅ Files skipped from review due to trivial changes (2)
  • docs/reference/README.md
  • src/renderer/src/i18n/locales/en.json
🚧 Files skipped from review as they are similar to previous changes (48)
  • src/renderer/src/components/settings/integrations-search.ts
  • src/shared/types.ts
  • src/renderer/src/components/right-sidebar/pr-comment-presentation.test.ts
  • src/main/jira/jira-record-primitives.ts
  • src/preload/api-types.ts
  • src/renderer/src/components/feature-interaction-writer-boundaries.test.ts
  • src/main/ipc/jira-connect-args-normalization.ts
  • src/main/jira/auth-headers.ts
  • src/renderer/src/store/slices/jira.ts
  • src/main/jira/issue-rest-routing.ts
  • src/renderer/src/runtime/runtime-jira-client.test.ts
  • src/main/jira/jira-site-url.ts
  • src/renderer/src/components/JiraIssueWorkspace.tsx
  • src/renderer/src/components/settings/jira-integration-card.test.tsx
  • src/renderer/src/components/sidebar/SidebarToolbar.test.tsx
  • src/renderer/src/components/jira-create-field-payload.ts
  • src/renderer/src/components/jira-server-auth-fields.tsx
  • src/renderer/src/components/jira-connect-dialog.test.tsx
  • src/renderer/src/components/settings/jira-integration-card.tsx
  • src/renderer/src/runtime/runtime-jira-client.ts
  • src/main/jira/jira-user-identity.ts
  • src/main/runtime/rpc/methods/jira.test.ts
  • src/renderer/src/test/memory-storage.ts
  • src/renderer/src/components/sidebar/LinearAgentSkillSetupPrompt.reminder-toast.test.tsx
  • src/main/runtime/rpc/methods/jira.ts
  • src/main/ipc/jira.ts
  • src/renderer/src/i18n/locales/ja.json
  • src/preload/index.ts
  • src/renderer/src/components/right-sidebar/pr-comments-list-selection.test.tsx
  • src/main/ipc/jira.test.ts
  • src/shared/jira-types.ts
  • src/main/jira/issue-search.ts
  • src/main/jira/issue-comments.ts
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/components/jira-connect-dialog.tsx
  • src/main/jira/jira-request.ts
  • src/main/jira/issue-metadata.ts
  • src/main/jira/issues.ts
  • src/main/jira/site-storage.ts
  • src/renderer/src/i18n/locales/ko.json
  • src/main/jira/client.test.ts
  • src/renderer/src/components/jira-create-field-payload.test.ts
  • src/main/jira/client.ts
  • src/main/jira/issue-page-fetcher.ts
  • src/main/jira/issue-mappers.ts
  • src/main/jira/issues.test.ts
  • src/renderer/src/i18n/locales/zh.json
  • src/renderer/src/components/TaskPage.tsx

Comment thread docs/reference/jira-server-support.md
@CleonSuo CleonSuo force-pushed the jira-server-dc-support branch from b441c7a to dcca89f Compare July 3, 2026 16:28

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1134d454-867c-4de4-aa05-10e6301999ad

📥 Commits

Reviewing files that changed from the base of the PR and between b441c7a and dcca89f.

📒 Files selected for processing (51)
  • docs/reference/README.md
  • docs/reference/jira-server-support.md
  • src/main/ipc/jira-connect-args-normalization.ts
  • src/main/ipc/jira.test.ts
  • src/main/ipc/jira.ts
  • src/main/jira/auth-headers.ts
  • src/main/jira/client.test.ts
  • src/main/jira/client.ts
  • src/main/jira/issue-comments.ts
  • src/main/jira/issue-mappers.ts
  • src/main/jira/issue-metadata.ts
  • src/main/jira/issue-page-fetcher.ts
  • src/main/jira/issue-rest-routing.ts
  • src/main/jira/issue-search.ts
  • src/main/jira/issues.test.ts
  • src/main/jira/issues.ts
  • src/main/jira/jira-record-primitives.ts
  • src/main/jira/jira-request.ts
  • src/main/jira/jira-site-url.ts
  • src/main/jira/jira-user-identity.ts
  • src/main/jira/site-storage.ts
  • src/main/runtime/rpc/methods/jira.test.ts
  • src/main/runtime/rpc/methods/jira.ts
  • src/preload/api-types.ts
  • src/preload/index.ts
  • src/renderer/src/components/JiraIssueWorkspace.tsx
  • src/renderer/src/components/TaskPage.tsx
  • src/renderer/src/components/feature-interaction-writer-boundaries.test.ts
  • src/renderer/src/components/jira-connect-dialog.test.tsx
  • src/renderer/src/components/jira-connect-dialog.tsx
  • src/renderer/src/components/jira-create-field-payload.test.ts
  • src/renderer/src/components/jira-create-field-payload.ts
  • src/renderer/src/components/jira-server-auth-fields.tsx
  • src/renderer/src/components/right-sidebar/pr-comment-presentation.test.ts
  • src/renderer/src/components/right-sidebar/pr-comments-list-selection.test.tsx
  • src/renderer/src/components/settings/integrations-search.ts
  • src/renderer/src/components/settings/jira-integration-card.test.tsx
  • src/renderer/src/components/settings/jira-integration-card.tsx
  • src/renderer/src/components/sidebar/LinearAgentSkillSetupPrompt.reminder-toast.test.tsx
  • src/renderer/src/components/sidebar/SidebarToolbar.test.tsx
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/zh.json
  • src/renderer/src/runtime/runtime-jira-client.test.ts
  • src/renderer/src/runtime/runtime-jira-client.ts
  • src/renderer/src/store/slices/jira.ts
  • src/renderer/src/test/memory-storage.ts
  • src/shared/jira-types.ts
  • src/shared/types.ts
✅ Files skipped from review due to trivial changes (4)
  • src/main/jira/auth-headers.ts
  • src/renderer/src/components/sidebar/LinearAgentSkillSetupPrompt.reminder-toast.test.tsx
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/zh.json
🚧 Files skipped from review as they are similar to previous changes (44)
  • src/shared/types.ts
  • src/renderer/src/runtime/runtime-jira-client.test.ts
  • src/renderer/src/components/right-sidebar/pr-comment-presentation.test.ts
  • docs/reference/README.md
  • src/renderer/src/test/memory-storage.ts
  • src/renderer/src/components/feature-interaction-writer-boundaries.test.ts
  • src/main/jira/issue-page-fetcher.ts
  • src/renderer/src/components/JiraIssueWorkspace.tsx
  • src/renderer/src/components/settings/integrations-search.ts
  • src/preload/api-types.ts
  • src/main/jira/jira-record-primitives.ts
  • src/renderer/src/components/right-sidebar/pr-comments-list-selection.test.tsx
  • src/renderer/src/runtime/runtime-jira-client.ts
  • src/main/jira/issue-rest-routing.ts
  • src/main/runtime/rpc/methods/jira.test.ts
  • src/renderer/src/components/sidebar/SidebarToolbar.test.tsx
  • src/renderer/src/components/settings/jira-integration-card.tsx
  • src/renderer/src/components/jira-server-auth-fields.tsx
  • src/main/jira/jira-site-url.ts
  • src/renderer/src/components/jira-connect-dialog.test.tsx
  • src/renderer/src/store/slices/jira.ts
  • src/main/ipc/jira.test.ts
  • src/main/ipc/jira-connect-args-normalization.ts
  • src/renderer/src/components/jira-create-field-payload.test.ts
  • src/main/jira/issue-comments.ts
  • src/main/ipc/jira.ts
  • src/preload/index.ts
  • src/main/runtime/rpc/methods/jira.ts
  • src/renderer/src/components/settings/jira-integration-card.test.tsx
  • src/main/jira/issue-search.ts
  • src/main/jira/jira-request.ts
  • src/renderer/src/components/jira-create-field-payload.ts
  • src/renderer/src/components/jira-connect-dialog.tsx
  • src/main/jira/jira-user-identity.ts
  • src/main/jira/client.test.ts
  • src/shared/jira-types.ts
  • src/main/jira/issue-mappers.ts
  • src/main/jira/issues.ts
  • src/renderer/src/i18n/locales/ja.json
  • src/main/jira/issue-metadata.ts
  • src/main/jira/issues.test.ts
  • src/renderer/src/components/TaskPage.tsx
  • src/renderer/src/i18n/locales/ko.json
  • src/main/jira/site-storage.ts

Comment thread docs/reference/jira-server-support.md
Add Server/DC auth, request routing, issue operations, renderer wiring, tests, and contribution documentation for connect/list/search/create/comment/assign/transition.
@CleonSuo CleonSuo force-pushed the jira-server-dc-support branch from dcca89f to 25fc610 Compare July 3, 2026 17:04
@CleonSuo CleonSuo closed this Jul 4, 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