Duo CLI GA
## ![Screenshot 2026-03-13 at 7.05.38 PM.png](/uploads/edd69a26992edfc480a0ea120f27390c/Screenshot_2026-03-13_at_7.05.38_PM.png){width="803" height="440"} ## Summary Duo CLI brings GitLab's AI capabilities directly into the terminal, enabling agentic developer workflows outside the IDE. GA makes Duo CLI production-ready for enterprise customers across all deployment types (.com, Self-Managed, Dedicated). **Why this matters for GitLab:** Agentic CLI sessions are a primary driver of GitLab credit consumption. As customers adopt Duo CLI for multi-step, autonomous workflows, credit usage scales with the depth and frequency of those sessions, directly contributing to growing ARR. GA removes the blockers preventing customers from adopting at scale for the developer persona. ## Duo CLI General Availability **What we've still to deliver before GA :** * **Enterprise admin controls** for Duo CLI, including the admin on/off toggle * **Close the core CLI UX quality gaps** from beta feedback * **Reduce approval friction** by allowing **pattern-based tool approvals** * **Expose MCP configuration** via slash command * **Expose context usage/management** via slash command * **Session summary** on session end and restart * **Environment diagnostic command** to check local environment is properly set up ## Planning 2026-06-15 - 2026-06-26 ### Planned work (:red_circle: Must-have for GA) <table> <tr> <th>Issue</th> <th>Weight</th> <th>Assignee</th> <th>Status</th> <th>Note</th> </tr> <tr> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2439+ </td> <td>—</td> <td> @viktomas </td> <td>not started</td> <td></td> </tr> <tr> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2453+ </td> <td>—</td> <td> @viktomas </td> <td>done</td> <td>This has been done in the previous iteration, but I forgot to close it</td> </tr> <tr> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2466+ </td> <td>1</td> <td> @ametke-jimenez </td> <td>done</td> <td> [!3505](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/3505) This issue was describing two different bugs that resulted in the same generic failure. The second bug has been split into a [separate issue](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2520). </td> </tr> <tr> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2520+ </td> <td>—</td> <td> @ametke-jimenez </td> <td>done</td> <td> [!3522](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/3522) </td> </tr> <tr> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/1911+ </td> <td>2</td> <td></td> <td>not started</td> <td></td> </tr> <tr> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2482+ </td> <td>1</td> <td> @mltheuser.gitlab </td> <td>done</td> <td></td> </tr> <tr> <td> [Glab duo cli log last does not work on Windows](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2505) </td> <td>2</td> <td> @andrei.zubov </td> <td>done</td> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/3515 </td> </tr> <tr> <td> [Duo cli fails to write to files on Windows](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2264) </td> <td>2</td> <td> @andrei.zubov </td> <td>done</td> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/3534 </td> </tr> <tr> <td> [Glab duo cli not using OAuth token on Windows](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2502) </td> <td>1</td> <td> @andrei.zubov </td> <td>done</td> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/3531 https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/3557 </td> </tr> <tr> <td colspan="5"> **Assigned & In-flight** </td> </tr> <tr> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2391+ </td> <td>2</td> <td> @mltheuser.gitlab </td> <td>in progess</td> <td></td> </tr> <tr> <td> [Docs: GitLab Duo CLI - GA](https://gitlab.com/gitlab-org/gitlab/-/work_items/595689) </td> <td>—</td> <td> @uchandran </td> <td>in progess</td> <td></td> </tr> <tr> <td> https://gitlab.com/gitlab-org/gitlab/-/work_items/597833+ </td> <td></td> <td> @mltheuser.gitlab </td> <td>refinment</td> <td> @mltheuser.gitlab I am adding this here for visbility till we are sure all the scenarios are covered last active [discussion](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2322#note_3470552904) </td> </tr> <tr> <td> [Duo disabled in namespaces — confusing error](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/1927) </td> <td>1</td> <td> @ametke-jimenez </td> <td>done</td> <td> [!3540](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/3540) </td> </tr> <tr> <td> [Bug: Bun binary WebSocket fails through SRT proxy](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2445) </td> <td>2</td> <td> @elwyn-gitlab </td> <td>done</td> <td>Blocks binary-only releases</td> </tr> <tr> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/1891+ </td> <td>4</td> <td> @elwyn-gitlab </td> <td>in progress</td> <td></td> </tr> <tr> <td> [MCP panel: config file management](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2133) </td> <td>1</td> <td> @elwyn-gitlab </td> <td>done</td> <td> [!2947](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/2947) </td> </tr> <tr> <td> [GA telemetry must-haves](https://gitlab.com/groups/gitlab-org/editor-extensions/-/work_items/221) </td> <td>—</td> <td>—</td> <td>—</td> <td> Needs PM (@james.casey) to define scope </td> </tr> <tr> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2504+ </td> <td>1</td> <td> @viktomas </td> <td>done</td> <td></td> </tr> <tr> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2534+ </td> <td>1</td> <td> @viktomas </td> <td>done</td> <td></td> </tr> <tr> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2480+ </td> <td>1</td> <td> @viktomas and @ohoral </td> <td>done</td> <td></td> </tr> <tr> <td> https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2590+ </td> <td>1</td> <td> @ametke-jimenez </td> <td>done</td> <td> [!3653](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/3653) I added this bug fix to GA because it's important and had been reported twice. </td> </tr> </table> ## Categorised remaining work ### :yellow_circle: Nice-to-have (ship with GA if possible) | Issue | Weight | Assignee | Status | Note | |-------|--------|----------|--------|------| | https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2146+ | 1 | @ametke-jimenez | done | [!3551](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/3551) | | https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2480+ | | @ohoral | in progress | | | [Define min requirements to run Duo CLI](https://gitlab.com/gitlab-org/gitlab/-/work_items/592548) | 2 | @andrei.zubov | not started | | | https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2531+ | | @ametke-jimenez | done | [!3591](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/3591) | | https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2530+ | | | not started | | | https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2546+ | | | not started | | | https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2522+ | | @ametke-jimenez | done | [!3524](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/3524) | | https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2533+ | | | not started | | | https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2548+ | 1 | @ametke-jimenez | in progress | [!3637](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/3637) | | https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2553+ | | @ametke-jimenez | not started | | ### :green_circle: Follow-up (post-GA) | Issue | Assignee | Note | |-------|----------|------| | [MCP panel: per-server log view](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2137) | — | | | [MCP panel: deferred OAuth flow with user opt-in](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2138) | — | | | [Create issue skill](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2312) | @aelhusseiny | Draft [!3254](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/merge_requests/3254) | | [Allow prompts to be written in external editor](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2288) | @mltheuser.gitlab | blocked | | [Spike (flicker): strategies for avoiding full-history render](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/1947) | @elwyn/ @mltheuser/ @viktomas | | | [Update CLI header to use promptling design](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2284) | @aregnery | Started | | [Features Competitive Analysis](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2317) | @james.casey | | | [UX Competitive Analysis](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2316) | @james.casey | | | [Duo CLI Beta: Feedback](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2149) | @james.casey | Ongoing tracking issue | | [Spike: Decide on npm deprecation migration path](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2398) | — | | | [Deprecate and sunset the npm @gitlab/duo-cli package](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/work_items/2400) | — | | | [Migrate duo-cli installation in CI workloads from npm to binary](https://gitlab.com/gitlab-org/gitlab/-/work_items/600436) | — | |
epic