atlas.nvim

emrearmaganMIT活跃维护

在 Neovim 里直接审 PR、管 issue,打通 GitHub、GitLab、Bitbucket、Jira 等多个平台,不用来回切浏览器。

Review pull requests and manage issues across GitHub, GitLab, Bitbucket and Jira directly in Neovim.

0.8.13发布于 2026-11-09 15:35 UTC395star28fork同步于 2026-11-10 23:58 UTC

怎么上手

由 README 提炼,执行前请确认
{
  "emrearmagan/atlas.nvim",
  dependencies = { "nvim-tree/nvim-web-devicons" },
  opts = {},
}
硬件要求按 README 说明

README 未说明

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

在 Neovim 里直接评审 PR、管理 GitHub/GitLab/Bitbucket/Jira 的 issue

在 Neovim 里直接审 PR、管 issue,打通 GitHub、GitLab、Bitbucket、Jira 等多个平台,不用来回切浏览器。

核心能力

  • 在编辑器内浏览 PR 的文件、提交、hunk 与评审历史
  • 支持逐提交或按提交区间评审,并发表评论、建议与线程管理
  • 可提交评审、批准、请求修改或合并 PR
  • 用临时 worktree 提供 LSP 悬停与跳转定义
  • 支持查看 CI 流水线、任务状态与作业日志

容易踩的坑

需要 Neovim 0.10+,且 git 和 curl 必须在 $PATH 中;GitHub 需先用 gh auth login 认证,GitLab 需带 api scope 的 Personal Access Token;项目仍处早期开发阶段,会有破坏性变更。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本0.8.13
  1. 0.8.13最新正式版2026-11-09 · 2026-11-09 15:35 UTC

    0.8.13 (2026-11-09)

    Features

    • add copy url to the actions menu and more views (e590b18)
    • change the copy url key to gy and add it to more views (231e5ff)
    • diff: improve the commits panel (ce2d594)

    Bug Fixes

    • default base_url to https (0def5e1)
  2. 0.8.122026-11-05 · 2026-11-05 19:48 UTC
    查看更新说明

    0.8.12 (2026-11-05)

    Features

    • statusline: add configurable layouts and key hints (cd0dbd5)

    Performance Improvements

  3. 0.8.112026-11-03 · 2026-11-03 19:02 UTC
    查看更新说明

    0.8.11 (2026-11-03)

    Features

    • resolve the base repository like gh and glab (#121) (f4a77c0)

    Bug Fixes

    • handle GitLab comments without discussion IDs (#122) (8969ea4)
  4. 0.8.102026-11-01 · 2026-11-01 18:27 UTC
    查看更新说明

    0.8.10 (2026-11-01)

    Features

    • pipelines: show gitlab downstream pipelines (81f08df)
    • pulls: support any Git remote when creating pull requests (#118) (398ded9)
    • ui: follow the active colorscheme in highlight defaults (#119) (91bc9f3)
  5. 0.8.92026-10-31 · 2026-10-31 19:31 UTC
    查看更新说明

    0.8.9 (2026-10-31)

    Features

    • diff: react to comments in the diff (baf446f)
    • jira: set issue fields in the issue editor (#120) (df8b1c6)
    • pulls: support reactions on inline review comments (#110) (c92f264)
    • ui: use Lua predicate function to enable/disable statusline (#115) (607383c)

    Bug Fixes

    • git: prefer current checkout or worktree (#116) (8244026)
    • pulls: avoid base updates for stacked PRs (#117) (1d2a6e9)

    Big thanks to @disrupted for the many improvements and fixes in this release!

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Neovim Version CI License

    atlas.nvim

    Review pull requests and manage issues across GitHub, GitLab, Bitbucket and Jira without leaving your editor.

    [!CAUTION] Still in early development, will have breaking changes!

    Quick links

    Installation

    {
      "emrearmagan/atlas.nvim",
      dependencies = {
        "nvim-tree/nvim-web-devicons", -- optional but recommended
        "esmuellert/codediff.nvim", -- optional (PullRequest diff)
        "sindrets/diffview.nvim", -- optional; or "dlyongemallo/diffview-plus.nvim"
      },
      -- See Configuration below
      ---@type AtlasConfig
      opts = {},
    }
    
    vim.pack.add({
      "https://github.com/emrearmagan/atlas.nvim",
    })
    
    -- See Configuration below
    require("atlas").setup({})
    
    • Neovim: 0.10+
    • git and curl on $PATH
    • Jira: Jira Cloud REST API v3 (*.atlassian.net) or Jira Server REST API v2
    • Bitbucket: Bitbucket Cloud REST API 2.0 (api.bitbucket.org)
    • GitHub: GitHub CLI (gh) authenticated with gh auth login
    • GitLab: GitLab 17.7+ (gitlab.com or self-hosted), Personal Access Token with api scope

    [!tip] It's a good idea to run :checkhealth atlas to see if everything is set up correctly.

    Review Pull Requests

    Run :Atlas review in a Git repository to pick a pull request, or pass a PR URL directly. It opens in your configured diff viewer.

    • Browse files, commits, hunks, and review history.
    • Review commit by commit or a range of commits.
    • Comment, suggest changes, manage threads, or leave notes.
    • Track tasks, checklists, and reviewed files.
    • Submit, approve, request changes, or merge.

    [!NOTE] Alternative viewers: CodeDiff requires v3.0.0 or newer. Diffview and Diffview-plus are also supported. These viewers can display Atlas comment, task, and note overlays, but their integrations rely on plugin internals and may break after upstream changes.

    Notes

    Notes let you leave something on a diff without posting it to the pull request. Each note is attached to a file and line and can be an ISSUE, SUGGESTION, NOTE, or PRAISE.

    For scripts, use bin/atlas-notes. Notes added there appear in AtlasDiff, CodeDiff, Diffview, Diffview-plus, and :Atlas notes:

    ./bin/atlas-notes add \
      --target https://github.com/owner/repository/pull/123 \
      --commit 3f2a9c1e \
      --file lua/review_queue.lua --start-line 19 \
      --type suggestion --body "Should this be a bool?"
    

    My dotfiles include a Pi extension that wraps this script so review agents can list and add notes.

    LSP for Reviews

    Use your configured language servers for hover and go-to-definition on the new side of AtlasDiff or CodeDiff.

    The diff uses a temporary worktree, removed when the diff closes. Set link to symlink dependency folders from your local checkout. See Pulls Configuration for all options.

    Repository browser

    Browse a repository's README, pull requests, issues, discussions, builds, branches, tags and releases. Use :Atlas browse . for the current repository, or pass a repository URL.

    Pipelines

    View pipelines and their jobs, inspect their status, and read job logs directly in Atlas.

    Use :Atlas pipelines <target> with a branch name, PR URL or number (123, #123, or GitLab !123), or a build URL. Branch names use the local repository; :Atlas pipelines . opens builds for the current branch.

    Pipelines use your provider's CI by default. Set ci.backend to use your own. For Bamboo on Bitbucket, use require("atlas.pulls.pipelines.bamboo").new(opts) with host, user, and password.

    providers = {
      github = {
        ci = {
          backend = {
            fetch = function(context, opts, done)
              -- Fetch the pull request's or branch's pipelines with their stages and jobs.
              done({}, nil)
            end,
            fetch_pipeline = function(context, pipeline, done)
              -- Fetch one pipeline with its stages and jobs.
              done(pipeline, nil)
            end,
            fetch_job = function(context, pipeline, job, done)
              -- Fetch the updated job, including any steps.
              done(job, nil)
            end,
            fetch_job_log = function(context, pipeline, job, done)
              -- Fetch the job's raw log output.
              done({ raw = "Your log output here" }, nil)
            end,
            parse = function(log)
              -- Return cleaned lines or your own nested groups.
              return log.lines
            end,
            actions = {
              -- Add your actions here.
            },
          },
          highlights = {
            { pattern = "^FAIL%s", level = "error" },
            { pattern = "deprecated", level = "warn", hl_group = "DiagnosticWarn" },
          },
        },
      },
    }
    

    ci.highlights controls log highlighting using Lua patterns. Set level for a severity color or hl_group for an existing Neovim highlight group.

    Custom actions

    Add project-specific actions to pull requests and issues. Custom actions receive the current item and provider context, making it possible to call local scripts, open repositories in tmux, copy branch names, or connect Atlas to your own tooling.

    pulls = {
      repo_config = {
        paths = {
          ["your-workspace/*"] = "~/code/repos/*",
        },
        settings = {},
      },
      custom_actions = {
        {
          id = "show_repo_status",
          label = "Show repository status",
          icon = "",
          confirm = "Show repository status?",
          ---@param pr PullRequest
          ---@param ctx AtlasPullsCustomActionContext
          ---@param done fun(ok: boolean|nil, message: string|nil)
          run = function(_, ctx, done)
            if not ctx.repo_path then
              done(false, "No repo path")
              return
            end
    
            local function write(_, data)
              if data then ctx.write(data) end
            end
            vim.system({ "git", "status", "--short" }, {
              cwd = ctx.repo_path,
              stdout = write,
              stderr = write,
            }, function(result)
              if result.code ~= 0 then
                done(false, "Failed to read repository status")
                return
              end
              done(true, "Repository status loaded")
            end)
          end,
        },
      },
    },
    issues = {
      custom_actions = {
        {
          id = "copy_branch_name",
          label = "Copy branch name",
          icon = "",
          ---@param issue Issue
          ---@param ctx AtlasIssuesCustomActionContext
          ---@param done fun(ok: boolean|nil, message: string|nil)
          run = function(issue, ctx, done)
            local branch = string.format("%s/%s", issue.key, issue.title:lower():gsub("%s+", "-"))
            vim.fn.setreg("+", branch)
            done(true, "Copied: " .. branch)
          end,
        },
      },
    },
    

    Use ctx.write(text) to show output and done(ok, message) to finish the action.

    ctx.write("Running checks...\n")
    done(true, "Checks passed")
    

    Create PRs and Issues

    Use :Atlas create pr to create a pull request from the current branch, or :Atlas create issue for a new issue. For pull requests, the description can be filled from your template or commits.

    Bookmarks

    Save searches as bookmarks, or press * to star a pull request or issue. Both appear alongside your configured views.

    Other features

    • Compare branches or commits with :Atlas diff main...HEAD.
    • Search with GitHub queries or Jira JQL, with query completion.
    • Use Conventional Comments templates or define your own.
    • Save issue descriptions as templates and reuse them when creating issues.
    • Close or reopen GitHub/GitLab issues and change Jira workflow states.
    • Jump between linked issues and pull requests and back, or browse related issues and sub-issues.
    • See a GitHub PR's position in its stack (e.g. 2/5) and step through the stack with ]s / [s.
    • Read GitHub and GitLab notifications, open them in Atlas, and mark them as read or done.
    • Remap shortcuts or assign multiple keys to the same action.
    • Set local repository paths and PR templates per project.

    Configuration

    {
      ui = {
        -- See Statusline below.
        statusline = { ... },
        -- "auto", "default", "snacks", or "fzf-lua".
        picker = "auto",
        -- Make the main Atlas dashboard a listed buffer.
        listed_buffer = false,
      },
    
      providers = {
        ---@type AtlasGitHubConfig
        github = {
          -- hostname = "github.company.com", -- Defaults to GH_HOST, then github.com.
          cache_ttl = 300, -- Set to 0 to disable caching.
        },
    
        ---@type AtlasGitLabConfig
        gitlab = {
          base_url = "https://gitlab.com",
          -- Personal Access Token with `api` scope:
          -- https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html
          token = vim.env.GITLAB_TOKEN,
          cache_ttl = 300, -- Set to 0 to disable caching.
        },
    
        ---@type AtlasBitbucketConfig
        bitbucket = {
          user = vim.env.BITBUCKET_USER,
          token = vim.env.BITBUCKET_TOKEN,
          cache_ttl = 300, -- Set to 0 to disable caching.
        },
    
        ---@type AtlasJiraConfig
        jira = {
          base_url = "https://your-site.atlassian.net",
          email = "[email protected]", -- Required for basic authentication only.
          --- See: https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/
          token = "your_jira_api_token",
          auth_method = "basic", -- "basic" or "bearer", defaults to "basic". If using bearer, set `token` to your API token.
          api_type = "cloud", -- either "cloud" or "server", defaults to "cloud". Cloud API is v3, server API is v2
          cache_ttl = 300, -- Set to 0 to disable caching.
        },
      },
    
      -- See Pulls Configuration below.
      pulls = { },
    
      -- See Issue Configuration below.
      issues = { },
    }
    

    Statusline

    Atlas shows its own statusline in its windows. You can turn it off or change what it shows.

    local components = require("atlas.ui.statusline.components")
    
    ui = {
      statusline = {
        -- false keeps your own statusline, a function decides per window.
        enable = function(buf, win)
          return vim.bo[buf].filetype ~= "atlas-ui.detail"
        end,
    
        -- Key hints for the current buffer, handy if you're new to Atlas.
        show_hints = false,
    
        -- Returning nil, or leaving layout unset, keeps the default.
        layout = function(buf, win)
          return {
            components.user,
            -- ctx has win, buf, user, pr, issue, list, diff and pipeline.
            ---@param ctx AtlasStatuslineContext
            function(ctx)
              if ctx.pr then
                -- A list of parts. Plain text or one { text, hl_group } work too. nil hides it.
                return {
                  { text = "#" .. ctx.pr.id, hl_group = "AtlasFooterInfo" },
                  { text = ctx.pr.title },
                }
              end
            end,
            "%=", -- "%=" moves everything after it to the right.
            components.version,
            components.help,
          }
        end,
      },
    },
    

    Pulls

    Use :Atlas pulls [provider|.] to browse and manage pull requests from GitHub, Bitbucket, and GitLab. Shared authentication and endpoints are configured in the top-level providers table.

    Pulls Configuration

    pulls = {
      delete_notes = false, -- Delete notes after approval, merge, or decline.
      default_merge_method = "merge", -- "merge" or "squash".
      default_delete_source_branch = false,
      git_transport = "https", -- "https" or "ssh" for Atlas-managed Git remotes.
    
    
      description = {
        include_summary = true,
        include_commit_hashes = true,
        include_related = true,
        include_diffstat = false,
      },
    
      -- Replaces the built-in Conventional Comments templates.
      comment_templates = {
        insert_mode = true, -- Enter Insert mode after applying a template.
        items = {
          { label = "Suggestion", text = "suggestion: " },
          { label = "Issue", text = "issue: " },
          { label = "Nitpick", text = "nitpick: " },
        },
      },
    
      diff = {
        -- "auto", or a command that accepts explicit <base>...<head> Git revisions.
        open_cmd = "auto", -- CodeDiff, DiffviewOpen or AtlasDiff
        comment_display = "virtual_lines", -- "virtual_lines" or compact "virtual_text" hints.
        review_panel = {
          hidden = true, -- Set false to show the review panel when a diff opens.
          height = 10,
        },
    
        -- AtlasDiff options; external viewers use their own configuration.
        layout = "inline", -- "inline" or "side-by-side".
        compact = true, -- Start with only changed hunks and surrounding context visible.
        lsp = {
          -- Back the new side of the diff with a detached worktree at the PR head so it is made of
          -- real files and your language servers attach to it (AtlasDiff and CodeDiff). Off by default.
          enabled = false,
          -- Defaults to `stdpath("cache")/atlas/worktrees/<repo>/pr-<id>` (or `<repo>/<sha>` without a PR).
          -- May be an absolute path, or a function receiving
          -- { repo_root, repo_full_name, pr_id, head_sha, default } that returns a path or nil.
          dir = nil,
          -- Directories symlinked from your checkout into the worktree so servers can resolve
          -- dependencies. These are the same directories on disk, not copies.
          link = {}, -- e.g. { "node_modules", ".venv" }
        },
        explorer = {
          grouped = true, -- Group changed files by directory.
          hidden = false,
          show_commits = false, -- Set true to show commits below changed files initially.
          width = 40,
          initial_focus = "explorer", -- "explorer" or "diff".
          preview = false, -- Show a file as soon as the explorer cursor moves onto it.
          focus_on_select = false, -- Move into the diff after selecting a file.
          ignore = { ".git/**", ".jj/**" },
        },
      },
      repo_config = {
        -- Maps `namespace/repo` to local paths. Used for checkout, diffs, and custom actions.
        -- PR checkout prefers the matching checkout or worktree Atlas is run from, then falls back here.
        -- Diffs of other repositories use a clone in the cache, removed after 30 days without a review.
        paths = {
          ["your-workspace/*"] = "~/code/repos/*",
          ["your-workspace/atlas"] = "~/code/atlas",
          ["group/subgroup/*"] = "~/code/subgroup/*",
        },
        settings = {
          ["your-workspace/atlas"] = {
            readme = "README.md", -- optional, defaults to README.md
            pr_template = ".github/pull_request_template.md", -- optional, defaults to .github/pull_request_template.md
            merge_method = "squash", -- Overrides default_merge_method.
            delete_source_branch = true, -- Overrides default_delete_source_branch when merging.
          },
        },
      },
      custom_actions = {}, -- See :help atlas-custom-actions.
    },
    

    Full configuration

    pulls = {
      ---@type AtlasGitHubPullsConfig
      github = {
        ---@type AtlasGitHubViewConfig[]
        views = {
          {
            name = "My PRs",
            key = "1",
            layout = "plain", -- "compact", "grouped", or "plain"
            -- current_repo = true, -- Limit this view to the local repository.
            search = "author:@me sort:updated-desc",
          },
          {
            name = "Team",
            key = "2",
            layout = "compact",
            search = "org:your-org sort:updated-desc",
          },
          {
            name = "Repo",
            key = "3",
            layout = "grouped",
            search = "repo:your-org/your-repo",
          },
        },
    
        bookmarks = {
          key   = "S",      -- default
          label = "Search", -- default
          items = {
            ["Drafts"]           = "is:pr is:draft author:@me",
            ["Recently merged"]  = "is:pr is:merged author:@me sort:updated-desc",
            ["Review requested"] = "is:pr is:open review-requested:@me",
          },
        },
      },
    },
    

    Full configuration

    pulls = {
      ---@type AtlasBitbucketPullsConfig
      bitbucket = {
        ---@type AtlasBitbucketViewConfig[]
        views = {
          {
            name = "Me",
            key = "M",
            layout = "compact", -- "compact", "grouped", or "plain"
            -- current_repo = true, -- Remove repo:/project: targets from search when enabled.
            -- https://developer.atlassian.com/cloud/bitbucket/rest/#filter-and-sort-api-objects
            search = 'repo:your-workspace/standalone-repo project:your-workspace/CORE author.nickname = "your-name"',
          },
          {
            name = "Team",
            key = "1",
            layout = "grouped",
            search = 'project:your-workspace/TEAM destination.branch.name = "main"',
          },
        },
    
        bookmarks = {
          key   = "S",      -- default
          label = "Search", -- default
          items = {
            ["Atlas"] = {
              layout = "grouped",
              search = 'repo:your-workspace/atlas project:your-workspace/ATLAS title ~ "atlas"',
            },
          },
        },
      },
    },
    

    Full configuration

    pulls = {
      ---@type AtlasGitLabPullsConfig
      gitlab = {
        ---@type AtlasGitLabPullsViewConfig[]
        views = {
          {
            name = "Assigned",
            key = "1",
            layout = "grouped", -- "compact", "grouped", or "plain"
            scope = "assigned_to_me",
            -- current_repo = true, -- Limit this view to the local repository.
          },
          {
            name = "Waiting for review",
            key = "3",
            scope = "reviews_for_me",
            state = "opened", -- "opened", "closed", "merged", or "all".
            review_states = { "UNREVIEWED", "REVIEW_STARTED" },
          },
          -- Single project
          {
            name = "GitLab",
            key = "G",
            project = "gitlab-org/gitlab",
            target_branch = "main",
          },
          -- Projects directly in this group
          {
            name = "GitLab Org",
            key = "O",
            group = "gitlab-org",
          },
        },
    
        bookmarks = {
          key   = "S",      -- default
          label = "Search", -- default
          items = {
            ["Reviewing"]    = { scope = "reviews_for_me" },
            ["Created by me"] = { scope = "created_by_me" },
          },
        },
      },
    },
    

    Issues

    Use :Atlas issues [provider|.] to browse and manage Jira, GitHub, and GitLab issues. Shared authentication and endpoints are configured in the top-level providers table.

    Issue Configuration

    issues = {
      with_relationships = true, -- Fetch parent/subissue relationships for plain issue tree views.
      custom_actions = {}, -- See :help atlas-custom-actions.
    }
    

    Issue views support plain and compact layouts. Jira also supports board, which groups the current page by workflow status.

    [!IMPORTANT] The markdown editor for issue descriptions and comments is still experimental and may not work perfectly in all cases. You can toggle between markdown and ADF view in the overview tab to see the raw ADF content and how it translates to markdown. If you encounter any issues with the markdown editor, please open an issue with details.

    Full configuration

    issues = {
      ---@type AtlasJiraIssuesConfig
      jira = {
        ---@type AtlasJiraViewConfig[]
        views = {
          {
            name = "My Board",
            key = "M",
            layout = "board",
            jql = "project = KAN AND assignee = currentUser() ORDER BY updated DESC",
          },
          {
            name = "Team Board",
            key = "T",
            layout = "compact",
            jql = "project = KAN ORDER BY updated DESC",
          },
        },
    
        bookmarks = {
          key   = "J",   -- default
          label = "JQL", -- default
          items = {
            ["Backlog"]     = "project = KAN AND statusCategory != Done AND (sprint IS EMPTY OR sprint NOT IN openSprints()) ORDER BY Rank ASC",
            ["Next sprint"] = "project = KAN AND sprint in futureSprints() ORDER BY Rank ASC",
            ["My open"]     = "assignee = currentUser() AND statusCategory != Done ORDER BY updated DESC",
          },
        },
    
        project_config = {
          -- The Jira custom field ID used for story points. Defaults to "customfield_10016".
          story_points_field = "customfield_10016",
          -- Override issue type styles by name (lowercase).
          issue_types = {
            bug = { icon = "" },
            maintenance = { icon = "", hl_group = "AtlasTextWarning" },
            infrastructure = { icon = "󰒋", hl_group = "AtlasLogInfo" },
          },
          -- Icons for issue statuses and the transition picker; names override categories.
          status_icons = {
            new = "●",
            indeterminate = "",
            done = "",
            ["In Review"] = "",
            ["Blocked"] = "",
          },
    
          -- Fields and defaults per project; see "Project fields" below.
          KAN = { ... },
        },
      },
    },
    

    Project fields

    Custom fields to display go under fields in the project's entry, keyed by Jira field ID. Replace KAN with your project key.

    KAN = {
      fields = {
        customfield_10003 = {
          name = "Approvers", -- the field's label
          format = function(value) -- what the detail panel shows
            if type(value) ~= "table" or #value == 0 then
              return nil -- nil hides the field
            end
            return table.concat(value, ", ")
          end,
          hl_group = "AtlasChipActive",
          display = "chip", -- "chip" or "table"
        },
      },
      -- Pre-fills new issues, with values as Jira shows them.
      defaults = {
        issue_type = "Story",
        fields = {
          priority = "High",
          labels = { "backend" },
          components = { "Backend", "Frontend" },
          customfield_10050 = "Platform",
        },
      },
    },
    

    To find out which custom fields your project has, expand the field names of any issue: https://your-site.atlassian.net/rest/api/3/issue/KAN-1?expand=names. names maps each field ID to its name, and fields holds the value format receives.

    If you came here to replace the browser with this plugin, here's a curl for you:

    curl -s -u "[email protected]:your_jira_api_token" \
      "https://your-site.atlassian.net/rest/api/3/issue/KAN-1?expand=names" \
      | jq .names
    

    Once you have the ID, use jq .fields.customfield_10003 to see the value format receives.

    On Jira Server/Data Center, use /rest/api/2/, and with bearer auth -H "Authorization: Bearer your_jira_api_token".

    Full configuration

    issues = {
      ---@type AtlasGitHubIssuesConfig
      github = {
        ---@type AtlasGitHubIssuesViewConfig[]
        views = {
          {
            name = "Assigned",
            key = "1",
            layout = "plain",
            -- current_repo = true, -- Limit this view to the local repository.
            search = "assignee:@me is:open",
          },
          {
            name = "Created",
            key = "2",
            layout = "compact",
            search = "author:@me is:open",
          },
          {
            name = "Mentions",
            key = "3",
            layout = "plain",
            search = "mentions:@me is:open",
          },
        },
    
        bookmarks = {
          key   = "S",      -- default
          label = "Search", -- default
          items = {
            ["Bugs"]            = "is:issue is:open label:bug",
            ["Recently closed"] = "is:issue is:closed author:@me sort:updated-desc",
          },
        },
      },
    },
    

    Full configuration

    issues = {
      ---@type AtlasGitLabIssuesConfig
      gitlab = {
        ---@type AtlasGitLabIssuesViewConfig[]
        views = {
          {
            name = "Assigned",
            key = "1",
            scope = "assigned_to_me",
            state = "opened",
            -- current_repo = true, -- Limit this view to the local repository.
          },
          {
            name = "Created",
            key = "2",
            scope = "created_by_me",
            state = "opened",
          },
          {
            name = "All open",
            key = "3",
            scope = "all",
            state = "opened",
          },
        },
    
        bookmarks = {
          key   = "S",      -- default
          label = "Search", -- default
          items = {
            ["Closed"] = { scope = "created_by_me", state = "closed" },
          },
        },
      },
    },
    

    Highlights

    Atlas builds its Atlas* groups from your colorscheme, so it fits light and dark themes. Override any of them after setup():

    vim.api.nvim_set_hl(0, "AtlasTextMuted", { link = "Comment" })
    vim.api.nvim_set_hl(0, "AtlasFooterInfo", { fg = "#7aa2f7", bold = true })
    

    See all highlight groups.

    Commands

    • :Atlas - Pick a command
    • :Atlas pulls [provider|.] - Open a pull-request provider dashboard; . uses the current repository's provider
    • :Atlas issues [provider|.] - Open an issue provider dashboard; . uses the current repository's provider
    • :Atlas review [pull-request-url|number|.] - Review a pull request with the configured diff viewer; without an argument, pick one from the current repository; . reviews the current branch's pull request
    • :Atlas diff <base...head> - Open a Git range with the configured diff viewer
    • :Atlas pipelines [target|.] - Open pipelines by branch name, PR URL or number, or build URL; . uses the current branch
    • :Atlas create pr - Create a pull request from the current branch
    • :Atlas create issue [provider|.] - Create an issue; . uses the current repository's provider
    • :Atlas search [provider|.] - Search configured pull-request and issue providers; . uses the current repository's provider
    • :Atlas open [target|.] - Open a pull request or issue by URL, Jira key, or number; . opens the current branch's pull request
    • :Atlas browse [repository URL|.|page] [page] - Open the repository browser; . uses the current repository, a page name alone picks a repository first, and a URL to a repository page or item opens that page, e.g. :Atlas browse . branches, :Atlas browse issues or :Atlas browse https://github.com/owner/repo/discussions
    • :Atlas notes [target|.] - Inspect notes; . shows the current repository's notes
    • :Atlas clear [cache|notes|reviewed|stars] - Clear all Atlas data or only cached data and cloned repositories, notes, reviewed file marks, or starred items
    • :Atlas logs - Toggle Atlas logs
    • :Atlas console - Open the latest command output

    Events

    These User events fire after the corresponding cleanup or setup has completed:

    • AtlasUIClosed for the pull request or issue dashboard.
    • AtlasDiffOpened and AtlasDiffClosed for diff sessions in AtlasDiff, CodeDiff, and Diffview.
    • AtlasDiffFileChanged when the current diff file changes in any of these viewers.

    Keymaps

    Set an action to false to disable it, or set it to a list to add aliases.

    keymaps = {
      ui = {
        help = "g?", -- { "g?", "<leader>?" } would add aliases
        close = "q", -- false would disable it
        next_item = "j",
        previous_item = "k",
        previous_column = "h",
        next_column = "l",
        first_item = "gg",
        last_item = "G",
        select = "<CR>",
        submit = "<C-s>",
        delete = "dd",
        comments = {
          add = { "a", "i" },
          reply = "c",
          edit = "e",
          react = "gr",
          upvote = "gu", -- GitHub discussions only.
        },
        toggle_panel = "p",
        cycle_layout = "t",
        toggle_fold = "za",
        toggle_all_folds = "zA",
        toggle_description_mode = "<leader>m",
        previous_panel_tab = "<S-Tab>",
        next_panel_tab = "<Tab>",
        notifications = {
          open = "N",
          mark_read = "r",
          mark_done = "d",
        },
        toggle_subscription = "gS",
        toggle_star = "*",
        refresh = "r",
        refresh_view = "R",
        next_page = "]p",
        previous_page = "[p",
        open_actions = "A",
        open_in_browser = "gx",
        open_references = "gl",
        copy_id = "y",
        copy_url = "Y",
        show_details = "K",
        search = "?",
        edit_search = "i",
      },
      picker = {
        next_item = { "<Down>", "<C-n>", "<C-j>" },
        previous_item = { "<Up>", "<C-p>", "<C-k>" },
        select = { "<CR>", "<C-s>" },
        toggle = "<Tab>",
        close = { "q", "<Esc>" },
      },
      issues = {
        transition_issue = "gs",
        change_assignee = "ga",
        change_reporter = "gr",
        edit_issue = "ge",
        create_issue = "c",
      },
      editor = {
        assignees = "ga",
        labels = "gl", -- GitHub and GitLab only.
        milestone = "gm", -- GitHub and GitLab only.
        reporter = "gR", -- Jira only.
        reviewers = "gr", -- Pull requests only.
        base = "gb", -- Pull requests only.
        draft = "gD", -- Pull requests only.
        issue_type = "gt", -- Jira only.
        fields = "gf", -- Jira only.
        templates = "gT",
        delete_template = "<C-d>",
        complete = "<C-x><C-u>",
      },
      pulls = {
        open_diff = "gd",
        checkout = "gc",
        open_repository = "o",
        edit_pr = "ge",
        stack = {
          next = "]s",
          prev = "[s",
        },
        review = {
          show_details = "K", -- File/commit details.
          toggle_file_reviewed = "-",
          approve = "<leader>ga",
          request_changes = "<leader>gr",
          submit_review = "<leader>gs",
          add_task = "<leader>t",
          comment_templates = "gT",
          toggle_resolved = "x",
          next_comment = "]c",
          prev_comment = "[c",
          next_unresolved = "]x",
          prev_unresolved = "[x",
          next_note = "]n",
          prev_note = "[n",
          next_commit = "]r",
          prev_commit = "[r",
          add_comment = "c",
          submit_comment = "C",
          add_suggestion = "s",
          submit_suggestion = "S",
          add_note = "<leader>n",
          note_type = "!",
          view = {
            external_help = "gA", -- External diff viewer help.
            toggle_review_panel = "gR",
            toggle_detail_panel = "gD",
            toggle_comments = "gH",
          },
          explorer = {
            toggle_commits = "gC",
            next_unreviewed_file = "]u",
            prev_unreviewed_file = "[u",
            find_file = "<leader>f",
          },
          panel = {
            cycle_filter = "f",
          },
          -- Built-in navigation; external viewers use their own keys.
          atlas = {
            next_file = { "]f", "<Tab>" },
            prev_file = { "[f", "<S-Tab>" },
            toggle_explorer = "<leader>b",
            focus_explorer = "<leader>e",
            open_file = "gf",
            toggle_view_mode = "i",
            next_hunk = "]h",
            prev_hunk = "[h",
            toggle_layout = "t",
            toggle_compact = "gc",
          },
        },
        pipelines = {
          next_job = { "]j", "<Tab>" },
          previous_job = { "[j", "<S-Tab>" },
          show_history = "gH",
          toggle_raw_logs = "gL",
          toggle_auto_refresh = "gR",
          toggle_config = "gC",
        },
        filters = {
          open = "gpo",
          merged = "gpm",
          declined = "gpd",
        },
        merge = {
          method = "gm",
          delete_branch = "gd",
        },
      },
    },
    

    Custom Keymaps

    You can add custom keymaps to run Atlas actions, commands, or your own Lua functions.

    local actions = require("atlas.pulls.actions")
    
    keymaps = {
      pulls = {
        custom = {
          {
            key = "gP",
            desc = "Open pipelines",
            callback = function(context, done)
              actions.run("open_pipelines", context, done)
            end,
          },
        },
      },
      issues = {
        custom = {
          {
            key = "<leader>as",
            desc = "Atlas search",
            callback = function()
              vim.cmd("Atlas search")
            end,
          },
        },
      },
    }
    

    Credits

    Thank you to everyone who has contributed to Atlas! ❤️

    Contributing

    Contributions are welcome! If you'd like to contribute, please open an issue or pull request on GitHub. See CONTRIBUTING.md.

    License

    MIT License - see LICENSE for details.