AI is changing how fast we ship code. A feature that used to take days now lands in hours. But velocity without visibility is chaos — tickets pile up, MRs go stale overnight, and you start the next morning wondering "what did I even ship yesterday?"
Epic Lens gives you that visibility. It pulls your Jira epics, GitLab merge requests, and GitHub pull requests into a single VS Code sidebar so you can see everything at a glance: what's in progress, what's waiting for review, what's been approved, and what's stuck. When AI helps you move fast, Epic Lens helps you stay in control.
- Sidebar tree view — Epics with collapsible child issues, standalone issues listed below
- Merge request tracking — See all your open GitLab MRs and GitHub PRs with approval, pipeline, and conflict status
- Provider cycling — Toggle between Both / GitLab / GitHub with a single toolbar button
- Dashboard — Board and list views with status columns, progress bars, and stats
- Live Jira data — Pulls real statuses, assignees, and priorities from the Jira REST API
- Scope filter — Show only your epics (
mine) or everything in the project (all) - Status/type filters — Filter by status category, issue type, or hide done issues
- Keyboard shortcuts — Chord-based shortcuts with
Alt+Eas the leader key - Click to open — Click any issue, epic, or MR to open it directly in the browser
- Auto-refresh — Periodic re-fetch of epics and MRs on a configurable interval (default 5 min)
- Stale MR highlighting — MRs older than a configurable threshold show a ⏰ indicator with age
- Reviewer view — See MRs where you are assigned as reviewer; cycle between Authored / Reviewing / All scopes
- Status change notifications — Toast alerts when an MR/PR status changes between fetches, with an "Open" button
- Jira-MR linking — Automatically links MRs to Jira issues by parsing issue keys from branch names (e.g.
feat/DX-419-foo→ DX-419). Linked issues show a 🔗 count; tooltips show MR details - MR/PR dashboard section — The dashboard now includes a Merge Requests section below the Kanban board with status colors, stale flags, and reviewer tags
- Install the extension
- Open the command palette (
Ctrl+Shift+P) and run Epic Lens: Configure Jira Credentials - Enter your Jira base URL, email, API token, and project key
- Epics load automatically
A GitLab Personal Access Token with read_api scope is required.
- Create a Personal Access Token with
read_apiscope - Run Epic Lens: Configure GitLab Credentials from the command palette (
Ctrl+Shift+P) - Enter your GitLab host URL (defaults to
https://gitlab.com) - Paste your token (stored securely in the OS keychain)
Alternatively, set the GITLAB_TOKEN environment variable or authenticate glab CLI with a PAT.
Note: If you used
glab auth loginwith browser-based OAuth2 (the default), the stored token won't work. You need a Personal Access Token.
A GitHub Personal Access Token (classic or fine-grained) with repo scope is required.
- Create a Personal Access Token with
reposcope - Run Epic Lens: Configure GitHub Credentials from the command palette (
Ctrl+Shift+P) - Paste your token (stored securely in the OS keychain)
Alternatively, set the GITHUB_TOKEN environment variable or authenticate with gh auth login (PAT-based).
The Merge Requests view has a toolbar button to cycle the provider filter:
Both → GitLab Only → GitHub Only → Both ...
Projects are prefixed with 🦊 (GitLab) or 🐙 (GitHub) when showing both providers.
A second toolbar button cycles the MR scope:
Authored → Reviewing → All → Authored ...
In Reviewing mode, only MRs where you are assigned as a reviewer are shown (marked with 📋). In All mode, both authored and reviewer MRs are shown.
- Go to https://id.atlassian.com/manage-profile/security/api-tokens
- Click Create API token
- Copy the token and paste it when prompted by the configure command
| Setting | Default | Description |
|---|---|---|
epicLens.jiraBaseUrl |
"" |
Jira Cloud instance URL (e.g. https://yourorg.atlassian.net) |
epicLens.jiraEmail |
"" |
Jira account email for API authentication |
epicLens.jiraProject |
"" |
Jira project key (e.g. MYPROJ) |
epicLens.jiraScope |
"mine" |
"mine" = your epics only, "all" = entire project |
epicLens.jiraJql |
"" |
Custom JQL (overrides project and scope when set) |
epicLens.hideDoneIssues |
false |
Hide completed/done issues from the tree |
epicLens.scanOnStartup |
true |
Automatically fetch from Jira and GitLab when VS Code starts |
epicLens.autoRefreshInterval |
5 |
Auto-refresh interval in minutes (0 to disable) |
| Setting | Default | Description |
|---|---|---|
epicLens.gitlabHost |
"https://gitlab.com" |
GitLab instance URL (for self-hosted, e.g. https://gitlab.example.com) |
epicLens.githubHost |
"https://api.github.com" |
GitHub API URL (for GitHub Enterprise, e.g. https://github.example.com/api/v3) |
epicLens.staleMRDays |
7 |
Flag MRs older than this many days as stale with ⏰ indicator (0 to disable) |
Jira token is resolved in this order:
- VS Code SecretStorage (OS keychain) — set via the configure command
ATLASSIAN_TOKENenvironment variable — useful for CLI/CI environments
GitLab token is resolved in this order:
- VS Code SecretStorage (OS keychain) — set via Configure GitLab Credentials
GITLAB_TOKENenvironment variableglabCLI config file (~/.config/glab-cli/config.yml) — PAT-based auth only, not OAuth2
GitHub token is resolved in this order:
- VS Code SecretStorage (OS keychain) — set via Configure GitHub Credentials
GITHUB_TOKENenvironment variableghCLI config file (~/.config/gh/hosts.yml)
All shortcuts use Alt+E as a chord prefix:
| Shortcut | Command |
|---|---|
Alt+E S |
Fetch Epics from Jira |
Alt+E R |
Refresh Status |
Alt+E D |
Open Dashboard |
Alt+E F |
Filter by Status |
Alt+E T |
Filter by Type |
Alt+E H |
Toggle Hide Done |
Alt+E C |
Clear All Filters |
Alt+E M |
Fetch Merge Requests |
| Command | Description |
|---|---|
| Epic Lens: Fetch Epics from Jira | Pull latest epics and issues |
| Epic Lens: Refresh Status | Re-fetch from Jira |
| Epic Lens: Open Dashboard | Open the interactive dashboard panel |
| Epic Lens: Filter by Status | Quick pick to filter by status category |
| Epic Lens: Filter by Type | Quick pick to filter by issue type |
| Epic Lens: Toggle Hide Done | Show/hide completed issues |
| Epic Lens: Clear All Filters | Reset all active filters |
| Epic Lens: Configure Jira Credentials | Guided setup for Jira connection |
| Epic Lens: Open in Jira | Open the selected issue in your browser |
| Epic Lens: Copy Issue Key | Copy the issue key to clipboard |
| Epic Lens: Fetch Merge Requests | Pull open MRs/PRs from GitLab and GitHub |
| Epic Lens: Refresh Merge Requests | Re-fetch MR/PR statuses |
| Epic Lens: Cycle Provider | Toggle between Both / GitLab / GitHub |
| Epic Lens: Cycle Scope | Toggle MR scope between Authored / Reviewing / All |
| Epic Lens: Open in Browser | Open the selected MR/PR in your browser |
| Epic Lens: Copy MR/PR URL | Copy the URL to clipboard |
| Epic Lens: Configure GitLab Credentials | Guided setup for GitLab connection |
| Epic Lens: Configure GitHub Credentials | Guided setup for GitHub connection |
Jira statuses are mapped to these categories for filtering and display:
| Category | Statuses | Icon |
|---|---|---|
| Backlog | Backlog, To Do, Open, New, Queued | 📋 |
| In Progress | In Progress, In Development, Working | 🔄 |
| Review | Review, In Review, Code Review, PR Review | 👀 |
| QA | QA, Testing, In QA, Ready for QA | 🧪 |
| Blocked | Blocked, On Hold, Waiting | 🚫 |
| Done | Done, Closed, Resolved, Complete | ✅ |
| Rejected | Won't Do, Cancelled, Rejected | ❌ |
Each MR in the sidebar shows a status based on its current state:
| Status | Icon | Meaning |
|---|---|---|
| Ready to merge | ✅ | Approved, pipeline passed, no conflicts |
| Approved | 👍 | Has approvals but may need other checks |
| Needs review | 👀 | Waiting for reviewer approval |
| Draft | ✏️ | Marked as draft, not ready for review |
| Pipeline failed | ❌ | CI/CD pipeline failed |
| Pipeline running | 🔄 | CI/CD pipeline in progress |
| Has conflicts | Merge conflicts need resolution | |
| Changes requested | 🔄 | Reviewer requested changes (GitHub) |
| Unresolved discussions | 💬 | Open review threads to address (GitLab) |
| Stale | ⏰ | MR/PR older than the configured staleMRDays threshold |
MRs are grouped by project when you have open MRs across multiple repositories. Click any MR to open it in GitLab, or right-click for additional options.
# Install dependencies
npm install
npm install --prefix webview-ui
# Build
make build
# Watch mode
make watch
# Package .vsix
make package
# Release (auto-bump from conventional commits)
make release
# Install locally
make installMIT