Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
a4e623b
feat(IssueHub): update tool window title to reflect source label #13
vhrabar Jul 25, 2026
f1768a0
feat(Assets): add light and dark mode banners for IssueHub
vhrabar Jul 25, 2026
2ce9e2e
feat(Q/F): add milestone support and implement issue query filters #17
vhrabar Jul 28, 2026
68ee9f2
feat(IssueProvider): add fetchFilterOptions method for filter UI enum…
vhrabar Jul 28, 2026
0dc86f3
feat(GitHubClient): implement issue fetching and filtering methods wi…
vhrabar Jul 28, 2026
c9b357a
feat(IssueFilterBar): add filter bar with search and sorting capabili…
vhrabar Jul 28, 2026
1503892
feat(IssueActor): introduce IssueActor model for author and assignee …
vhrabar Jul 29, 2026
a5217b8
feat(issue detail): add model and inf. required to handle Issue detai…
vhrabar Jul 29, 2026
72298fb
feat(issue timeline): add sealed interface for issue timeline items w…
vhrabar Jul 29, 2026
2e6a08c
feat(issue editor): initial issue editor draft #18
vhrabar Jul 30, 2026
db17e8d
feat(issue timeline): implement timeline fetching and model for issue…
vhrabar Aug 1, 2026
cc347f1
feat(issue timeline): wire issue detail view to UI #18
vhrabar Aug 1, 2026
af09693
chore(deps): bump the actions group with 2 updates
dependabot[bot] Aug 3, 2026
0d0e818
chore(deps): bump the gradle group across 1 directory with 4 updates
dependabot[bot] Aug 3, 2026
58fa99f
Merge pull request #19 from vhrabar/dependabot/github_actions/dev/act…
vhrabar Aug 4, 2026
cb6c0a3
test: add unit tests for GitHub API client and issue filtering
vhrabar Aug 4, 2026
567cb50
Merge remote-tracking branch 'origin/dev' into dev
vhrabar Aug 4, 2026
2aa3c50
Merge pull request #15 from vhrabar/dependabot/gradle/dev/gradle-ed27…
vhrabar Aug 4, 2026
8ebe641
feat(Qodana): fix Qodana-reported issues
vhrabar Aug 4, 2026
26ba88e
docs: update CHANGELOG and README to reflect new features
vhrabar Aug 4, 2026
916ad6f
chore(Qodana): update linter version to 2026.2 & fix found issues
vhrabar Aug 4, 2026
0da8cd8
chore: update IntelliJ version to 2025.3 and adjust compatibility in …
vhrabar Aug 4, 2026
e16efe9
Merge branch 'main' into dev
vhrabar Aug 4, 2026
bd0e582
refactor(spotless): run spotles-apply
vhrabar Aug 4, 2026
cf3146b
Merge remote-tracking branch 'origin/dev' into dev
vhrabar Aug 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ jobs:

# Setup Gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
uses: gradle/actions/setup-gradle@v6.2.0

# Build plugin
- name: Build plugin
Expand Down Expand Up @@ -90,7 +90,7 @@ jobs:

# Setup Gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
uses: gradle/actions/setup-gradle@v6.2.0
with:
cache-read-only: true

Expand Down Expand Up @@ -133,7 +133,7 @@ jobs:

# Setup Gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
uses: gradle/actions/setup-gradle@v6.2.0
with:
cache-read-only: true

Expand Down Expand Up @@ -173,7 +173,7 @@ jobs:

# Setup Gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
uses: gradle/actions/setup-gradle@v6.2.0
with:
cache-read-only: true

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/qodana.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:

# Run Qodana using the configuration from qodana.yml
- name: Qodana Scan
uses: JetBrains/qodana-action@v2026.1
uses: JetBrains/qodana-action@v2026.2
with:
pr-mode: false
env:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ jobs:

# Setup Gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
uses: gradle/actions/setup-gradle@v6.2.0
with:
cache-read-only: true

Expand Down
66 changes: 65 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,39 @@

## [Unreleased]

### Added

- Issue rows now show the author, creation date, labels and open/closed state instead of just the title.
- Real user avatars for issue authors and assignees, downloaded in the background with generated initials shown until the picture arrives.
- Label tooltips with colour swatches matching the label colours configured on GitHub.
- Dedicated IssueHub tool window icons for the light and dark themes.

- Search field above the issue list that matches issue titles and bodies as you type.
- Filter dropdowns for state, author, assignee (including *Unassigned*), labels and milestone (including *No milestone*), plus a **Reset** action.
- Sorting by creation date, last update or comment count, ascending or descending.
- Issue detail view opened in the editor area as its own tab, with the title, metadata and the rendered description, plus **Refresh** and **Open on GitHub** actions. Being an editor, it takes the full window width and can be split next to your code.
- The issue tab now shows the full history below the description: comments (rendered, and marked when edited) alongside closes, reopens, label, assignee and milestone changes, title edits, and references from other issues and commits.
- The history reads as a thread of cards, one per run of activity by the same account, with that account's avatar and name down the left and what they did to the right of it. Every entry carries an icon for its kind, and label changes show the label's own colour.

### Changed

- Double-clicking an issue now opens it in the editor instead of the browser; **Open on GitHub** in the issue tab still takes you to GitHub.
- The tool window header shows the **IssueHub** title instead of the generic tool window ID label.
- Rows ellipsize to the panel width, so the horizontal scrollbar is gone.
- Pull requests are filtered out of the issue list; only real issues are shown.

### Known limitations

- Token entry is still a temporary placeholder; there is no dedicated settings/configuration UI yet.
- GitHub is the only supported provider.
- The list shows at most 50 issues per query; there is no pagination.
- An issue's history is read up to 500 entries; anything past that is not shown.
- The author and assignee dropdowns offer repository collaborators plus anyone seen on the loaded issues; the full list needs a token with push access.

### Compatibility

- Verified against IntelliJ Platform 2025.3 through 2026.3rc

## [0.0.3] - 2026-07-24

### Added
Expand All @@ -19,8 +52,39 @@
- Rows ellipsize to the panel width, so the horizontal scrollbar is gone.
- Pull requests are filtered out of the issue list; only real issues are shown.

### Known limitations### Added

- Issue rows now show the author, creation date, labels and open/closed state instead of just the title.
- Real user avatars for issue authors and assignees, downloaded in the background with generated initials shown until the picture arrives.
- Label tooltips with colour swatches matching the label colours configured on GitHub.
- Dedicated IssueHub tool window icons for the light and dark themes.

- Search field above the issue list that matches issue titles and bodies as you type.
- Filter dropdowns for state, author, assignee (including *Unassigned*), labels and milestone (including *No milestone*), plus a **Reset** action.
- Sorting by creation date, last update or comment count, ascending or descending.
- Issue detail view opened in the editor area as its own tab, with the title, metadata and the rendered description, plus **Refresh** and **Open on GitHub** actions. Being an editor, it takes the full window width and can be split next to your code.
- The issue tab now shows the full history below the description: comments (rendered, and marked when edited) alongside closes, reopens, label, assignee and milestone changes, title edits, and references from other issues and commits.
- The history reads as a thread of cards, one per run of activity by the same account, with that account's avatar and name down the left and what they did to the right of it. Every entry carries an icon for its kind, and label changes show the label's own colour.

### Changed

- Double-clicking an issue now opens it in the editor instead of the browser; **Open on GitHub** in the issue tab still takes you to GitHub.
- The tool window header shows the **IssueHub** title instead of the generic tool window ID label.
- Rows ellipsize to the panel width, so the horizontal scrollbar is gone.
- Pull requests are filtered out of the issue list; only real issues are shown.

### Known limitations

- Token entry is still a temporary placeholder; there is no dedicated settings/configuration UI yet.
- GitHub is the only supported provider.
- The list shows at most 50 issues per query; there is no pagination.
- An issue's history is read up to 500 entries; anything past that is not shown.
- The author and assignee dropdowns offer repository collaborators plus anyone seen on the loaded issues; the full list needs a token with push access.

### Compatibility

- Verified against IntelliJ Platform 2025.3 through 2026.3rc

- Token entry is still a temporary placeholder; there is no dedicated settings/configuration UI yet.
- GitHub is the only supported provider.
- The list shows the 50 most recent open issues; no search or filtering.
Expand Down Expand Up @@ -51,4 +115,4 @@

[Unreleased]: https://github.com/vhrabar/IssueHub/compare/v0.0.3...HEAD
[0.0.3]: https://github.com/vhrabar/IssueHub/compare/v0.0.2...v0.0.3
[0.0.2]: https://github.com/vhrabar/IssueHub/commits/v0.0.2
[0.0.2]: https://github.com/vhrabar/IssueHub/commits/v0.0.2
31 changes: 27 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
<!-- Light mode -->
![Logo (light)](assets/issuehub-banner-light.svg#gh-light-mode-only)

<!-- Dark mode -->
![Logo (dark)](assets/issuehub-banner-dark.svg#gh-dark-mode-only)
# IssueHub

![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/vhrabar/IssueHub/build.yml?style=for-the-badge)
Expand All @@ -6,16 +11,23 @@



> **Alpha.** Core flow works (detect repo > add token > list issues). Configuration is a
> placeholder, GitHub is the only supported provider.
> **Alpha.** Core flow works (detect repo > add token > browse, filter and read issues).
> Configuration is a placeholder, GitHub is the only supported provider, and IssueHub reads issues
> only, it never writes.

<!-- Plugin description -->
**IssueHub** brings your GitHub issues into the IDE. Browse and open issues for the current
repository from a dedicated tool window, without leaving your editor.

- Lists issues for the GitHub repository detected from your project's Git remote
- Shows issue number, title, labels, and assignee
- Opens any issue in the browser with a double-click
- Search issue titles and bodies, and filter by state, author, assignee, labels or milestone
- Sort by creation date, last update or comment count
- Opens an issue as an editor tab, full width and splittable next to your code, with the description
rendered in the IDE's own styling
- Reads the whole thread in that tab: comments alongside closes, reopens, label, assignee and
milestone changes, title edits, and references from other issues and commits
- Jumps to the issue on GitHub whenever you need the browser
- Stores your GitHub token in the IDE's secure credential store

<!-- Plugin description end -->
Expand All @@ -27,7 +39,18 @@ repository from a dedicated tool window, without leaving your editor.
2. Open the **IssueHub** tool window.
3. Click **Add Token…** and paste a GitHub personal access token (stored in the IDE's secure
credential store, never in plain text).
4. Click **Refresh** to load issues. Double-click an issue to open it in your browser.
4. Click **Refresh** to load issues. Double-click an issue to open it as an editor tab, titled with
the issue number; **Open on GitHub** there opens the same issue in your browser.
5. The issue tab shows the description and, below it, the issue's history as a thread of cards:
comments plus the closes, reopens, label, assignee and milestone changes and title edits around
them. **Refresh** in that tab re-reads the issue from GitHub.
6. Use the search field and the **State / Author / Assignee / Label / Milestone / Sort** dropdowns to
narrow the list; **Reset** clears everything back to open issues, newest first.

Filtering and sorting run on GitHub's side, so the results are the whole repository's issues, not
just the ones already on screen. Typing in the search field uses GitHub's search endpoint, which is
rate limited more tightly than the plain issue list, an authenticated token raises that limit
considerably.

### Required token scope

Expand Down
49 changes: 49 additions & 0 deletions assets/issuehub-banner-dark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
49 changes: 49 additions & 0 deletions assets/issuehub-banner-light.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ plugins {
}

dependencies {
compileOnly("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
compileOnly("org.jetbrains.kotlinx:kotlinx-serialization-json:1.11.0")
testImplementation("junit:junit:4.13.2")

// IntelliJ Platform Gradle Plugin Dependencies Extension - read more: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-dependencies-extension.html
intellijPlatform {
intellijIdea("2025.2.6.2")
intellijIdea("2025.3")
testFramework(TestFrameworkType.Platform)
}
}
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
group = com.github.vhrabar.issuehub
version = 0.0.3
version = 0.0.4

pluginRepositoryUrl = https://github.com/vhrabar/IssueHub

Expand Down
6 changes: 1 addition & 5 deletions qodana.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
# Qodana configuration: https://www.jetbrains.com/help/qodana/qodana-yaml.html
# Runs the same inspections as the IDE (e.g. UseJBColor) headlessly in CI.
version: "1.0"

# JVM community linter is enough for a Kotlin plugin; bump the tag to match your IDE line.
linter: jetbrains/qodana-jvm-community:2026.1
linter: jetbrains/qodana-jvm-community:2026.2

# Recommended profile: a balanced set of inspections without the noisiest ones.
profile:
name: qodana.recommended

# Fail the CI run when new problems are introduced above these thresholds.
failThreshold: 0
6 changes: 3 additions & 3 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ rootProject.name = "IssueHub"

pluginManagement {
plugins {
id("org.jetbrains.kotlin.jvm") version "2.1.20"
id("org.jetbrains.kotlin.plugin.serialization") version "2.1.20"
id("org.jetbrains.kotlin.jvm") version "2.4.10"
id("org.jetbrains.kotlin.plugin.serialization") version "2.4.10"
id("org.jetbrains.changelog") version "2.5.0"
id("com.diffplug.spotless") version "7.0.2"
id("com.diffplug.spotless") version "8.9.0"
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.github.vhrabar.issuehub.editor

import com.github.vhrabar.issuehub.toolWindow.IssueDetailPanel
import com.intellij.openapi.fileEditor.FileEditor
import com.intellij.openapi.fileEditor.FileEditorState
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.UserDataHolderBase
import com.intellij.openapi.vfs.VirtualFile
import java.beans.PropertyChangeListener
import java.beans.PropertyChangeSupport
import javax.swing.JComponent

/** Hosts [IssueDetailPanel] as an editor, which is all the platform needs to give it a tab. */
internal class IssueFileEditor(
project: Project,
private val file: IssueVirtualFile,
) : UserDataHolderBase(),
FileEditor {
private val panel = IssueDetailPanel(project, file.issue)

private val listeners = PropertyChangeSupport(this)

override fun getComponent(): JComponent = panel

override fun getPreferredFocusedComponent(): JComponent = panel.preferredFocusComponent()

override fun getName(): String = file.issue.displayNumber

override fun getFile(): VirtualFile = file

override fun setState(state: FileEditorState) = Unit

override fun isModified(): Boolean = false

override fun isValid(): Boolean = file.isValid

override fun addPropertyChangeListener(listener: PropertyChangeListener) = listeners.addPropertyChangeListener(listener)

override fun removePropertyChangeListener(listener: PropertyChangeListener) = listeners.removePropertyChangeListener(listener)

override fun dispose() = panel.dispose()
}
Loading