# Billing Source: https://docs.devin.ai/admin/billing Devin has two pricing models: * **Self-serve**: Free, Pro, Max, and Teams plans you can sign up for directly at [app.devin.ai](https://app.devin.ai). Self-serve usage is billed through a mix of included quota and on-demand credits. See [Self-serve plans](/admin/billing/self-serve) for full details. * **Enterprise**: Devin Enterprise customers are billed in Agent Compute Units (ACUs) at the rate set in their order form. See [Enterprise](/admin/billing/enterprise) for how ACU consumption is tracked, or [contact sales](https://cognition.com/contact) for pricing. For how Devin meters work in general (how usage accrues, idle/sleep behavior, and tips for keeping consumption under control), see [Usage](/admin/billing/usage). The tips on that page apply to both pricing models. # Enterprise Source: https://docs.devin.ai/admin/billing/enterprise How Devin Enterprise contracts are billed and how admins track ACU consumption Devin Enterprise customers are billed in **Agent Compute Units (ACUs)** at the rate set in their order form. [Contact sales](https://cognition.com/contact) for pricing. For how Devin meters work in general (sleep behavior, what counts toward consumption, tips for keeping costs down), see [Usage](/admin/billing/usage). ## Tracking ACU consumption Enterprise customers can track ACU consumption at both the Enterprise and Organization level: * **Enterprise admins** view Enterprise ACU consumption at [Settings > Consumption](https://app.devin.ai/settings/consumption) in Enterprise Settings. * **Organization admins** view Organization ACU consumption at [Settings > Consumption Analytics](https://app.devin.ai/settings/analytics?tab=consumption) within Organization Settings. * **Any user** can see the ACU cost of a specific session from [Session Insights](/product-guides/session-insights). ## Setting Organization ACU limits Enterprise admins can set per-Organization ACU limits from [Settings > Organizations](https://app.devin.ai/settings/organizations) in Enterprise Settings. Devin Enterprise Org List
Devin Enterprise Org Management Once set, an Organization can only consume up to its limit. All Devin activity stops once the limit is reached, and users see a message indicating the Organization has hit its ACU limit and to contact the Enterprise admin to raise it. Devin Org ACU Limit Reached ## Frequently asked questions Enterprise customers are billed for ACUs as stated in their order form. Enterprise ACUs represent the work performed by Devin for customers on the Enterprise plan, which adheres more strictly to task planning and end-to-end testing. They are distinct from self-serve quota and on-demand credits, and are priced per the customer's Enterprise order form. Enterprise admins can break consumption down by Organization from the [Consumption](https://app.devin.ai/settings/consumption) page in Enterprise Settings. Org admins can break it down by user from [Consumption Analytics](https://app.devin.ai/settings/analytics?tab=consumption) inside Organization Settings. # Self-serve plans Source: https://docs.devin.ai/admin/billing/self-serve Compare Devin's self-serve plans and understand usage quota and on-demand credits Devin has four self-serve plans you can sign up for directly at [app.devin.ai](https://app.devin.ai). For authoritative pricing, see the [Devin pricing page](https://devin.ai/pricing). This page explains how the plans relate to each other and how billing mechanics work. ## Plan overview | Plan | For | Price | Members | | --------- | --------------------------------- | ------------------ | --------- | | **Free** | Individuals trying Devin | Free | 1 | | **Pro** | Individual users | \$20/month | 1 | | **Max** | Power users who need more quota | \$200/month | 1 | | **Teams** | Teams working with Devin together | \$80/month minimum | Unlimited | The **Pro** and **Max** plans are individual plans. They cannot be shared across multiple users. If you want multiple people to use Devin under a single subscription, you need the **Teams** plan. ## Free The Free plan lets you try Devin with limited usage. It includes: * Limited Devin usage * Access to [Devin Review](/work-with-devin/devin-review) * Access to [DeepWiki](/work-with-devin/deepwiki) Free users can upgrade to any paid plan at any time from [Settings > Plans](https://app.devin.ai/settings/plans). ## Pro Pro is Devin's entry-level individual plan. It's designed for a single developer who uses Devin regularly. Pro includes: * A daily and weekly usage quota that covers Devin sessions, [Devin CLI](/cli), and [Devin Desktop](https://windsurf.com) * Pay-as-you-go [on-demand credits](#on-demand-credits) for usage past your quota * Slack, Linear, and [MCP](/work-with-devin/mcp) integrations Pro is a single-user plan. Pro subscribers cannot invite additional members to their organization. To work with teammates on a shared subscription, use the [Teams](#teams) plan. ## Max Max is for individual users who consistently exceed the Pro quota. It includes everything in Pro, plus a significantly larger weekly usage quota (with no daily cap), also shared between Devin sessions, [Devin CLI](/cli), and Devin Desktop. Like Pro, Max is a single-user plan and does not support multiple members. ## Teams The Teams plan is Devin's self-serve plan for teams of any size. Key properties: * **Unlimited members**: invite as many teammates as you want. * **\$80/month minimum**: every Teams account pays at least \$80/month. * Each member gets either a **full seat** or a **flex seat**. * **On-demand credits** are shared across the whole team. ### Full seats vs. flex seats Every member of a Teams account holds one of two seat types: **\$40/month per seat**, billed as a fixed recurring line item. Best for members who use Devin regularly. Each full seat includes: * A daily and weekly usage quota equivalent to the Pro plan * Access to Devin Desktop **Free**. Teams can have unlimited flex seats. Best for occasional users. Flex seats: * Draw entirely from the team's shared pool of on-demand credits * Do **not** include Devin Desktop access * Have no fixed monthly charge per seat Admins choose the seat type when [inviting a member](/product-guides/invite-team), and can convert a member between seat types later from **Settings > Members**. ### The \$80 Teams minimum Every Teams subscription costs **at least \$80/month**. You can hit this minimum in any combination of full seats (\$40 each) and on-demand credits: | Full seats | On-demand credits included | Monthly total | | ---------: | -------------------------: | ------------: | | 0 | \$80 | \$80 | | 1 | \$40 | \$80 | | 2 | \$0 | \$80 | | 3 | \$0 | \$120 | | *N* ≥ 2 | \$0 | *N* × \$40 | When you have fewer than two full seats, the remainder of the \$80 minimum is automatically charged as prepaid on-demand credits that the whole team can draw from. Once you have two or more full seats, you've cleared the minimum and no additional on-demand credits are included, but you can still [top up on-demand credits](#on-demand-credits) at any time. Give a full seat to anyone who uses Devin regularly. Full seats include their own Pro-equivalent quota and Devin Desktop access at a predictable fixed cost, making them the best fit for power users. Reserve flex seats for occasional or trial users who only need ad-hoc access through shared on-demand credits. ## How quotas work Each paid plan and full seat includes a usage allowance that refreshes automatically on a calendar basis: * **Pro** and **Teams full seats** have a **daily and weekly** allowance. The daily allowance is more than 1/7 of the weekly, so you can keep working through weekends without giving up overall capacity for the week. * **Max** has a **weekly** allowance only, with no daily cap. When you've used up your allowance, [on-demand credits](#on-demand-credits) keep you working without interruption. ## On-demand credits On-demand credits are prepaid usage credit that fund any work past your plan's included quota: * **Roll over** month-to-month. Purchased credits never expire. * Can be topped up at any time from [Settings > Plans](https://app.devin.ai/settings/plans), and optionally refilled automatically via auto-reload. * Admins can set auto-reload thresholds and default session spending limits from **Settings > Usage**. * On the **Teams** plan, credits are **shared across all members**, with no per-member balance. Any teammate can draw from the shared pool. * On the **Teams** plan, credits fund all usage on **flex seats** and any **full seat** usage past its included quota, and cover any portion of the [\$80/month minimum](#the-80-teams-minimum) not already covered by full seats.
## Devin Review and Automations Pricing
[Automations](/product-guides/automations) and [Devin Review](/work-with-devin/devin-review) are available on self-serve plans. * **Teams use shared on-demand credits.** On the Teams plan, Automations and Devin Review draw directly from the team's shared [on-demand credit](#on-demand-credits) pool and do not consume full-seat quota. * **What happens when you run out of credits.** If you run out of credits, Automations stop running and Devin Review switches to its smart diff viewer. Top up [on-demand credits](#on-demand-credits) to start Automations again and re-enable AI-powered review. * **Public PRs are free.** Anyone can review a public GitHub PR at [devinreview.com](https://devinreview.com) — or by replacing `github.com` with `devinreview.com` in any PR URL — without a Devin account, and no on-demand credits are consumed. Admins can keep usage predictable by tuning how often auto-review runs. Configure the trigger mode (every commit, only when a PR is first opened, or manual only) per repository or per user from [Settings > Review](https://app.devin.ai/settings/review). See [Trigger Modes](/work-with-devin/devin-review#trigger-modes) in the Devin Review docs for details. ## Migrating from legacy ACU-based plans If you were previously on a legacy ACU-based plan, here's what you need to know: * On-demand credits are the same dollar value as the ACUs you're used to. * **Legacy Core plan users** have been migrated to the Free plan and can continue using any remaining on-demand credits. To purchase additional credits, upgrade to the [Teams](#teams) plan. ## Managing your plan Admins can view and change the account's plan from [Settings > Plans](https://app.devin.ai/settings/plans). From there you can: * Upgrade or downgrade between Free, Pro, Max, and Teams * Add or cancel Teams full seats * Purchase on-demand credits or configure auto-reload to replenish them automatically * Download past invoices For tips on keeping consumption under control across all plans, see [Usage](/admin/billing/usage). # Usage Source: https://docs.devin.ai/admin/billing/usage How Devin meters work, what counts toward consumption, and how to keep usage under control This page explains how Devin's work is metered. The mechanics are the same regardless of pricing model. The only difference is the unit: * **Enterprise** customers consume **Agent Compute Units (ACUs)** against the volume in their order form. * **Self-serve** customers consume their plan's included quota first, then draw from prepaid **on-demand credits**. Throughout this page, "usage" refers to whichever unit applies to your account. ## What counts toward usage Usage accrues based on the work Devin actually performs in a session, including: * Number and complexity of actions Devin takes (planning, context gathering, task execution, browser actions, code execution, and so on) * Virtual machine time and networking bandwidth (typically a small fraction of total usage) ### Windows sessions Windows sessions consume approximately **9% more** usage than equivalent Linux (Ubuntu) sessions. Aside from the few units required to keep the Devin VM running, Devin will not consume usage when: * Waiting for your response * Waiting for a test suite to run * Setting up and cloning repositories ## Sleep and idle behavior When a session is idle, Devin goes to sleep. While sleeping, Devin does not consume usage. You can wake the session up at any time by sending another message. Devin typically sleeps automatically after roughly 0.1 ACUs (or the equivalent quota / on-demand credit) of inactivity. ## Managing usage effectively A number of variables affect how much Devin consumes: * Task complexity * Prompt quality (or specificity) * Size of context or codebase * Number of files being touched or modified * Session runtime * Length of conversation * Frequency of back-and-forth messaging A few tips to keep usage under control: * Delegate clearly scoped tasks with a well-defined end goal * Keep prompts and sessions short * Avoid asking Devin to do a lot of different tasks in the same session * Split big projects into sub-tasks across sessions; there are no concurrent session limits, so take advantage of it These tips also tend to improve the quality of Devin's work, so it's a win-win. ## Frequently asked questions No, Devin does not consume any usage while sleeping. Devin typically sleeps automatically after roughly 0.1 ACUs (or the equivalent quota / on-demand credit) of inactivity, so awake-but-idle time generally adds up to very little. Any user can see per-session usage from [Session Insights](/product-guides/session-insights), regardless of pricing model. * **Self-serve**: Current month's usage, quota remaining, and on-demand credit balance live at [Settings > Plans](https://app.devin.ai/settings/plans). * **Enterprise**: Enterprise and per-Organization ACU consumption are available from the [Consumption](https://app.devin.ai/settings/consumption) and [Consumption Analytics](https://app.devin.ai/settings/analytics?tab=consumption) pages in Enterprise and Organization Settings respectively. Yes. If your enterprise enables [Personal Analytics](/enterprise/security-access/personal-analytics), users with the **View Personal Analytics** permission can see their own ACU consumption across every organization from the **My analytics** page in their settings. # Common Issues Source: https://docs.devin.ai/admin/common-issues ## I'm unable to connect my GitHub.com organization If you're unable to set up your integration or seeing "Configure" next to the organization you want to connect, you or one of your teammates has likely already connected your GitHub organization to another Devin account. **You will need to disconnect the existing integration before you can connect to your Devin account.** GitHub error You can disconnect the existing integration by following these steps: 1. Navigate to the Devin Enterprise or Organization with the active integration 2. Navigate to the Integrations page * If you are on an Enterprise account, navigate to [https://app.devin.ai/settings/connected-accounts](https://app.devin.ai/settings/connected-accounts) in Enterprise Settings * If you are on a Teams account, navigate to [https://app.devin.ai/settings/integrations](https://app.devin.ai/settings/integrations) in Organization Settings 3. Click through on the GitHub integration card 4. Click "Disconnect" under the GitHub integration Alternatively, you can disconnect the integration via GitHub: 1. Go to the [GitHub Integration settings](https://github.com/settings/installations) 2. Navigate to Devin.ai Integration and click "Configure" 3. Scroll to the "Danger zone" section to uninstall the integration Devin ## I'm unable to connect my Slack organization If you're seeing an "Unable to proceed with request" error, it means that you or one of your teammates has already connected your Slack organization to another Devin organization. **You will need to disconnect the existing integration before you can connect your new organization.** Slack error You can disconnect the existing integration by following these steps: 1. Navigate to the Devin Enterprise or Organization with the active integration 2. Navigate to the Integrations page * If you are on an Enterprise account, navigate to [https://app.devin.ai/settings/connected-accounts](https://app.devin.ai/settings/connected-accounts) in Enterprise Settings * If you are on a Teams account, navigate to [https://app.devin.ai/settings/integrations](https://app.devin.ai/settings/integrations) in Organization Settings 3. Click through on the Slack integration card 4. Click "Disconnect" under the Slack integration If you're unable to disconnect or find the existing organization, please reach out to [support@cognition.ai](mailto:support@cognition.ai) ## IP Whitelisting If you need to whitelist Devin's services, please add the following IP addresses: * 100.20.50.251 * 44.238.19.62 * 52.10.84.81 * 52.183.72.253 * 20.172.46.235 * 52.159.232.99 * 4.204.199.103 * 54.201.200.193 * 54.69.238.189 * 100.23.34.160 (Please note: While we intend to keep this list static, it is possible these IPs may change in future updates.) ## Session Expiration Devin sessions can't be continued after 30 days. If you need to resume work after that window, start a new session and re-share any relevant context (for example: goals, requirements, key decisions, and any important files or links) so Devin can continue effectively. # Security at Cognition Source: https://docs.devin.ai/admin/security We want Devin to be a core contributor in your organization, and have prioritized security, data privacy and compliance to make it possible ## Security All data transmission is encrypted in transit and at rest. Production software is also routinely monitored via logging, error handling and monitoring dashboards of live metrics. Unusual application states (i.e. unusually high error rates, slowness, failures) trigger alerts which are quickly investigated by our team. Access to our cloud environment in AWS is granted on an as-required basis based on business roles and only a small number of employees or contractors are granted direct access to production systems. All employees and contractors are required to use multi-factor authentication on all main work applications. All employees and contractors also receive annual training about security best practices, including good password management and how to identify social engineering and phishing scams. Cognition obtained SOC 2 Type II certification and conducted Security Training in March 2024 for all employees at Cognition. As part of the SOC 2 audit, Cognition's auditors reviewed all of Cognition's security policies, procedures, internal and third party controls related to data security, privacy, processing integrity, confidentiality and availability. For more details about our security please visit our [Trust Center](https://trust.cognition.ai/). If you have identified a potential security issue, we encourage you to share your findings with us. Please send your vulnerability reports to our security team at [security@cognition.ai](mailto:security@cognition.ai). ## Privacy & Intellectual Property Cognition processes data based on the application Customers use to interact with Devin. Devin can be accessed via web application, integration with GitHub, or integration with Slack. For the web application, Cognition only processes data actively provided by the authorized user prompting Devin; for the GitHub and Slack integrations, the administrator installing the integration can review and manage all permissions granted to Devin. Cognition uses Customer data to: * Deliver, maintain and update services provided to the Customer per their configuration and type of Devin access (e.g. web application, integration with GitHub, or integration with Slack) to make sure the software is up-to-date and operational. * Troubleshoot, prevent and resolve issues such as product-related issues, software bugs or security incidents to maintain service functionality and reliability. Cognition only retains data processed through Devin for the duration of the relationship with a given Customer, unless otherwise specified by the Customers. Any Feedback Data and User Interaction Data are retained as long as needed and as determined by Cognition. By default, we may use your data for model training purposes to improve and enhance the Services. If you're on a paid plan, you can opt out at any time on the Data Controls settings page. After you opt out, your data will not be used for training and Zero Data Retention will be enabled with our model providers. On the Teams plan, only an administrator can exercise the opt-out. Devin can still learn to fit into your unique workflow via the [Knowledge](/product-guides/knowledge) feature. When you share Knowledge, Devin can become more reliable at working on your specific projects over time. If you are an Enterprise customer, we will never train on your data without your express prior written consent. Please refer to the terms in your agreement with Cognition for details. The output — code, work product, or other — produced by Devin is considered the user’s intellectual property and can be used for the Customer’s commercial purposes, with the exception of using the output to train models that would attempt to reverse engineer and/or build a competing product to Devin. When setting up the GitHub integration, users can select which repositories Devin can access, with permissions adjustable through GitHub's App Settings during and post-installation. For more details on the requested permissions and security considerations go to [GitHub Integration Guide](/integrations/gh). In Slack, Devin doesn’t read, process or store any data in your Slack instance other than the information provided when @Devin is tagged, initially prompted and when any additional information is provided within the Slack thread while the session is ongoing. For more details on the requested permissions and security considerations go to [Integration with Slack Guide](/integrations/slack). ## User Best Practices While Devin’s performance is improving daily, it can still experience hallucinations, introduce bugs into code, or suggest insecure code or procedures. Like with any coding best practices, we recommend taking the appropriate precautions with the code written by Devin such as code reviews, enabling branch protections to ensure checks are enforced before Devin can merge any changes, and any practices currently adopted in your organization to review engineers’ work. You may need to provide Devin with credentials and keys such as passwords, API keys, cookies or other for authentication. In all cases we advise users to leverage our Secrets feature under the Settings page to share and store those credentials securely. We’re still learning and developing Devin to be a great AI software engineer, and our customers’ feedback is crucial for Devin’s development. We strongly encourage sharing feedback and feature requests directly with your Cognition account team or by emailing [support@cognition.ai](mailto:support@cognition.ai), and reporting incidents by emailing [security@cognition.ai](mailto:security@cognition.ai). # JetBrains Source: https://docs.devin.ai/cli/acp/jetbrains Run Devin inside JetBrains IDEs from AI Chat using the Agent Client Protocol (ACP), including JetBrains Remote Development. JetBrains IDEs can run Devin as an agent inside **AI Chat** using the [Agent Client Protocol (ACP)](https://agentclientprotocol.com/). The quickest way to add Devin is to install it from the **ACP Registry**; you can also configure it manually as a custom agent. Either way, you can drive Devin from the AI Chat panel in IntelliJ IDEA, PyCharm, GoLand, and other JetBrains IDEs — including over [JetBrains Remote Development](https://www.jetbrains.com/remote-development/). This integration uses JetBrains' built-in ACP support in AI Assistant. For the upstream reference, see the JetBrains docs on [adding a custom agent](https://www.jetbrains.com/help/ai-assistant/acp.html#add-custom-agent). ## Prerequisites * A JetBrains IDE with the **AI Assistant** plugin and AI Chat available. ## Setup Install Devin directly from the **ACP Registry** — no CLI installation or manual configuration required. Click the **AI Chat** icon in the right-hand tool window bar. AI Chat icon in the JetBrains tool window bar Click the agent selector in the AI Chat footer to see the list of available agents. Choose **Install From ACP Registry...**, search for **Devin**, and click **Install**. Devin is added to the list of available agents. Agent selector menu showing the Install From ACP Registry option The first time you connect, you may be prompted to authenticate. Follow the prompt to log in to your Devin account. Logging in to Devin from JetBrains AI Chat Select **Devin** in the agent selector and send a message to start a session. Devin selected as the agent in the AI Chat footer ## Manual setup (custom ACP) If you'd rather run Devin from your own installation of the Devin CLI, you can add it as a custom ACP agent instead of installing from the registry. ### Prerequisites * Devin CLI installed and authenticated. If you haven't installed it yet, follow the [Quickstart](/cli/index), then run `devin auth login`. * The absolute path to the `devin` binary. You can find it with: ```bash theme={null} which devin ``` This typically resolves to something like `~/.local/bin/devin`. For **JetBrains Remote Development**, Devin CLI must be installed on the **remote host** (where the backend runs), not on your local client. Run `which devin` in a terminal on the remote host and use that path in the configuration below. Click the **AI Chat** icon in the right-hand tool window bar. AI Chat icon in the JetBrains tool window bar Click the three-dots menu in the top-right of the AI Chat panel, then choose **Add Custom Agent**. This opens the `acp.json` configuration file. Add Custom Agent option in the AI Chat menu Add Devin to the `agent_servers` block in `acp.json`. Set `command` to the absolute path of your `devin` binary (from `which devin`) and pass `acp` as the only argument: ```json acp.json theme={null} { "default_mcp_settings": {}, "agent_servers": { "devin": { "command": "/home/you/.local/bin/devin", "args": ["acp"] } } } ``` Save the file. Devin now appears as a selectable agent in AI Chat. Select **devin** as the agent in AI Chat and send a message to start a session. The first time you connect, you may be prompted to authenticate; Devin uses the credentials from `devin auth login` (or `WINDSURF_API_KEY` if set). ## Managing the integration The three-dots menu in the AI Chat panel includes a few helpful actions for the Devin agent: * **Reset ACP Authentication** — clear stored ACP credentials and re-authenticate. * **Get ACP Logs** — open the ACP logs, useful for debugging connection issues or inspecting what the agent is doing under the hood. ## Notes and limitations * Devin CLI's terminal/shell output is surfaced through JetBrains AI Chat's ACP rendering, which differs from the native Devin CLI terminal UI. Some richer interactions are only available in the standalone CLI. * The `devin acp` subcommand is intended to be launched by an ACP-aware client (like JetBrains AI Chat) as a subprocess — it speaks JSON-RPC over stdio and is not meant to be run interactively. See [`devin acp`](/cli/reference/commands#devin-acp) in the command reference. # Xcode Source: https://docs.devin.ai/cli/acp/xcode Run Devin inside Xcode's coding assistant via the Agent Client Protocol (ACP), or give the Devin CLI access to your Xcode project through Xcode's MCP bridge. Xcode 26.6's [coding intelligence](https://developer.apple.com/documentation/xcode/setting-up-coding-intelligence) can run Devin as an agent inside the **coding assistant** using the [Agent Client Protocol (ACP)](https://agentclientprotocol.com/). Devin isn't one of the agents listed in Xcode's Intelligence settings, so you add it manually as a custom ACP agent that runs from your local Devin CLI installation. This integration uses Xcode's built-in ACP support in the coding assistant. For the upstream reference, see Apple's docs on [setting up coding intelligence](https://developer.apple.com/documentation/xcode/setting-up-coding-intelligence). ## Prerequisites * **Xcode 26.6 or later** with the coding assistant available. * Devin CLI installed and authenticated. If you haven't installed it yet, follow the [Quickstart](/cli/index), then run `devin auth login`. * The **absolute** path to the `devin` binary. You can find it with: ```bash theme={null} which devin ``` This typically resolves to something like `/Users/you/.local/bin/devin`. Xcode requires an **absolute** path for the agent command — it does not expand `~` or use your shell's `PATH`. If `which devin` prints a `~`-prefixed path, expand it first (for example, run `echo "$(cd ~ && pwd)/.local/bin/devin"`) and use the full `/Users/...` result. ## Setup Add Devin as a custom agent from the Intelligence settings. Choose **Xcode > Settings**, then select **Intelligence** in the sidebar. Under **Agents**, click **Add an Agent**. Xcode's built-in ACP support lets you register any agent that speaks the Agent Client Protocol. In the sheet that appears, enter the agent's details: * **Name** — `Devin` (or any label you prefer). * **Command** — the **absolute** path to your `devin` binary (from `which devin`), for example `/Users/you/.local/bin/devin`. A relative path or a `~`-prefixed path won't work. * **Arguments** — `acp` (the only argument Devin needs). Click **Add**. Devin now appears as a selectable agent under **Agents**. Select **Devin** in the coding assistant and send a message to start a session. The first time you connect, you may be prompted to authenticate; Devin uses the credentials from `devin auth login` (or `WINDSURF_API_KEY` if set). ## Give Devin CLI access to your Xcode project (MCP) Separately from running Devin *inside* Xcode, you can point the standalone Devin CLI at your Xcode project so it can build, run tests, read and edit files, render SwiftUI previews, and search Apple's documentation. Xcode ships an [MCP](/cli/extensibility/mcp/overview) server, `xcrun mcpbridge`, that exposes these Xcode tools to any external agent (the same mechanism [Cursor uses](https://cursor.com/docs/integrations/xcode)). Add it to Devin like any other MCP server. The Xcode MCP bridge requires **Xcode 26.3 or later**. Confirm the binary is available with `xcrun --find mcpbridge` (see [Troubleshooting](#troubleshooting) if it isn't). See Apple's docs on [giving external agents access to Xcode](https://developer.apple.com/documentation/xcode/giving-external-agents-access-to-xcode). Choose **Xcode > Settings**, select **Intelligence**, and under **Model Context Protocol** turn on **Allow external agents to use Xcode tools**. Register `xcrun mcpbridge` as a stdio MCP server: ```bash theme={null} devin mcp add xcode -- xcrun mcpbridge ``` Verify it was added with `devin mcp list`. See [`devin mcp`](/cli/reference/commands#devin-mcp) for scope and configuration options. Open your project or workspace in Xcode (the bridge needs a running Xcode session with a project open), then prompt Devin from the CLI. Xcode alerts you when the external agent connects and while it's active. ## Troubleshooting * **`xcrun: error: unable to find utility "mcpbridge"`** — your system is pointed at the Command Line Tools instead of the full Xcode install. Fix it with: ```bash theme={null} sudo xcode-select -s /Applications/Xcode.app/Contents/Developer sudo xcodebuild -runFirstLaunch ``` Then confirm with `xcrun --find mcpbridge`, which should print a path. * **Devin can't reach the Xcode tools** — make sure Xcode is running with a project (not an empty window) open, and that **Allow external agents to use Xcode tools** is enabled in Intelligence settings. ## Notes and limitations * The model can't be selected from Xcode — Devin always runs with your team's default model. * When you select an agent in Xcode's coding assistant, it automatically gets access to Xcode capabilities such as building and testing your app. You can review and restrict which commands and tools agents may use under **Agents > Permissions** in Intelligence settings — see Apple's docs on [extending and customizing agents](https://developer.apple.com/documentation/xcode/extending-and-customizing-agents). * Devin CLI's terminal/shell output is surfaced through Xcode's ACP rendering, which differs from the native Devin CLI terminal UI. Some richer interactions are only available in the standalone CLI. * The `devin acp` subcommand is intended to be launched by an ACP-aware client (like Xcode's coding assistant) as a subprocess — it speaks JSON-RPC over stdio and is not meant to be run interactively. See [`devin acp`](/cli/reference/commands#devin-acp) in the command reference. # Zed Source: https://docs.devin.ai/cli/acp/zed Run Devin CLI inside the Zed editor as a custom ACP agent in the Agent Panel. [Zed](https://zed.dev/) has native support for the [Agent Client Protocol (ACP)](https://agentclientprotocol.com/), so you can run Devin CLI as a custom external agent directly inside Zed's **Agent Panel** — with real-time editing, syntax highlighting, and agent following. This integration uses Zed's built-in support for external ACP agents. For the upstream reference, see the Zed docs on [external agents](https://zed.dev/docs/ai/external-agents). ## Setup Open the ACP registry with `zed: acp registry` from the command palette (Cmd+Shift+P on macOS and Ctrl+Shift+P on Windows). Search for "Devin" and install it. On the top left corner of the Threads Sidebar, click on the agent dropdown menu and select "Devin". In the new Devin thread, open the agent menu in the top right corner and select "Authenticate" (or "Reauthenticate"). Then on the bottom of the thread panel, click on "API Key". A browser window will open, where you can log into your Devin Cloud account and authenticate. If you don't have an account you can sign up for free! You can now start a conversation with Devin! By default, Devin will use Adaptive model selection, automatically choosing the best model for your task. You can also pick a specific model from the menu at the bottom of the thread panel. Devin in Zed ## Notes and limitations * Devin CLI's terminal/shell output is surfaced through Zed's ACP rendering, which differs from the native Devin CLI terminal UI. Some richer interactions are only available in the standalone CLI. * The `devin acp` subcommand is intended to be launched by an ACP-aware client (like Zed) as a subprocess — it speaks JSON-RPC over stdio and is not meant to be run interactively. See [`devin acp`](/cli/reference/commands#devin-acp) in the command reference. # Adaptive Source: https://docs.devin.ai/cli/adaptive Adaptive is Cognition's intelligent model router that automatically selects the best AI model for each task. ## Selecting Adaptive To select Adaptive, run `/model adaptive` during a session, pass `--model adaptive` when launching, or set it as your default in `~/.config/devin/config.json` (on Windows, `%APPDATA%\devin\config.json`): ```json theme={null} { "agent": { "model": "adaptive" } } ``` You can switch away from Adaptive to a specific model at any time with `/model`. Adaptive is an intelligent model router that automatically selects the best AI model for each task. Instead of manually choosing between dozens of models, Adaptive analyzes your prompt and routes it to the model that will deliver the best result. ## How it works When you select **Adaptive**, Devin evaluates each request and dynamically chooses the right underlying model. Simple tasks get routed to fast, efficient models. Complex tasks get routed to more capable ones. This means you get the right level of intelligence for every prompt without overspending on premium models for routine work. Adaptive helps your usage allowance last longer by avoiding unnecessary use of expensive models. Adaptive is the best default for most users. ## Enterprise availability For enterprise organizations, Adaptive is disabled by default. An admin must enable the **Adaptive model router** setting from the enterprise settings page before team members can select Adaptive in the model picker. * **Devin Desktop**: Go to **Settings > Devin Desktop > Models** and toggle **Adaptive model router** on. * **Windsurf**: Go to **Team Settings > Models** and toggle **Adaptive model router** on. ## Pricing Adaptive pricing depends on your billing plan. Adaptive draws down your quota at a **fixed per-token rate**, regardless of which underlying model is selected for a given request. Currently, the Adaptive model consumes quota and overage at an introductory promotional rate (through July 7, 2026). | Token type | Cost per 1M tokens | | :---------------- | :----------------- | | Input tokens | \$0.50 | | Output tokens | \$2.00 | | Cache read tokens | \$0.10 | These rates also apply to extra usage beyond your included quota. Because Adaptive routes simpler tasks to lighter models, it typically consumes fewer tokens overall than manually selecting a frontier model for every request. This makes it the most cost-effective option for most users. For customers on the Cognition platform, Adaptive usage is metered in **ACUs** (Agent Compute Units). ACU consumption scales with the tokens used and the model selected by the router for each request. For enterprise customers on credit-based billing, Adaptive uses **variable-token credit pricing**. Each request consumes credits based on the actual tokens used and the model that Adaptive selects for that request according to your credit rate. This means cheaper models cost fewer credits per request, and Adaptive's routing naturally favors cost-efficient choices — so your credit pool lasts longer compared to always selecting a premium model. ## Tips for getting the most out of Adaptive * **Be specific with your prompts.** Clear, focused instructions help Adaptive route to the right model and reduce unnecessary token usage. * **Leverage prompt caching.** Staying on the same model across turns in a conversation enables caching, which significantly reduces input token costs. Adaptive takes this into account when routing. * **Use Adaptive as your default.** For most workflows, Adaptive is the best starting point. Switch to a specific model only when you have a particular reason to — for example, if you need a specific model's reasoning capabilities for a complex task. # Changelog (Stable) Source: https://docs.devin.ai/cli/changelog/stable Release notes for the stable channel ### Fixed * Fixes issues with diff viewing in autonomous mode. ### Added * Added an `/mcp` slash command with a live MCP server status panel. * ACU usage is now shown in the `/usage` command. * Enterprise login policies are now enforced in the CLI. * Added a `sandbox.excluded` allow/ask/deny config (user and team settings) to run specific commands outside the sandbox; excluded commands also skip the sandbox proxy environment. ### Changed * Edits produced in autonomous mode now produce reviewable diffs. * Skill `permissions:` frontmatter now applies to auto-approvals. ### Fixed * Fixed command approval parsing for PowerShell `$variable` assignment prefixes. ### Added * Subagents can now be configured with a default model. * Added an `attribution` option to the Devin Local [config file](/cli/reference/configuration/config-file); set it to `false` to suppress Devin mentions in commit messages. ### Changed * The MCP registry cache is now warmed during startup, so MCP servers are ready sooner. ### Fixed * On Windows, `bash` now resolves to Git Bash instead of the WSL launcher stub. * Injected context is no longer included in auto-generated session titles. * Fixed full-width wrapping of CLI question replies. ### Fixed * Made MCP registry parsing more tolerant of old and inconsistent schemas. ### Fixed * Fixed a bug with loading skill files that use alternative fields. ### Plugins Install bundles of skills from a GitHub repo, a git URL, or a local folder, and share them across projects. A plugin is any source containing a `.devin-plugin/plugin.json` manifest and a `skills/` directory; its skills become available as `/:`. A plugin can require other plugins (installed automatically), endorse optional ones, and forbid others — so a plugin can act as a curated, governed collection. Plugins are in beta and opt-in for enterprises, so behavior and configuration may change in future releases. See the [plugins overview](/cli/extensibility/plugins/overview) for details. ### Enterprise controls Expanded controls for admins to govern what Devin Local can do and which tools it can reach. * Teams can define terminal command allow/deny lists, enforced through CLI permission scopes with exact-command matching and `*` wildcards. * Org-level control to disable Devin CLI plugins: when set, the CLI refuses to install or update plugins and skips the skills from any installed plugins. * The "Disable CLI access" team setting is now enforced for Devin Local (the CLI hosted in Windsurf), including the bundled agent registry and the allowed-MCP-server allowlist. ### Added * `devin plugins install ` installs a plugin (and its required plugins) from a GitHub `owner/repo`, a git URL, or a local path. * `devin plugins list` shows installed plugins with their version and whether they are currently blocked by policy. * `devin plugins info ` shows the skills a plugin provides and its required, optional, and forbidden lists. * `devin plugins update [plugin]` re-fetches a plugin (or all plugins) at the latest version; local plugins are linked to their source folder so edits are live without re-installing. * `devin plugins remove ` uninstalls a plugin, leaving any auto-installed required plugins in place. * `forbiddenPlugins` entries accept glob patterns (e.g. `acme/*`, `*/secrets`, `https://gitlab.com/acme/*`) in addition to exact identities and the lone `*` lockdown. ### Changed * Improved authentication in third-party ACP clients, including JetBrains and Zed: both browser and manual sign-in now use the Devin auth flow, so the manual `/login` fallback works where it previously failed. ### Fixed * Signing in to Devin now honors the `proxy` settings in `config.json` (`mode`, `url`, `no_proxy`). Previously the login token exchange always connected directly (apart from `HTTP_PROXY`/`HTTPS_PROXY` env vars), ignoring a configured `manual` proxy URL, `off` mode, and config-level `no_proxy`. ### Fixed * Custom HTTP headers are now forwarded through the MCP OAuth discovery and authorization flows, so MCP servers behind a gateway that requires extra headers (e.g. an authorization header) can complete OAuth sign-in. * Built-in MCP OAuth strategies (such as Figma's) are now matched by issuer rather than gateway hostname, so they resolve correctly when the server is reached through a gateway or proxy. ### Fixed * IDE editor context (active file, cursor position, open tabs) now includes explicit relevance guidance, so the agent no longer treats passive code browsing as a request to act on the focused file. * IDE editor context (active file, cursor position, open tabs) is now injected once alongside each user message instead of being repeated before every model response, so the agent no longer narrates whether the open IDE files are related to the request. ### Fixed * Starting Devin CLI and exiting without sending a message no longer leaves an empty "Untitled" session in `devin list`; sessions are saved once you send your first message. ### Added * Gemini 3.5 Flash model support. * New `/cloud-attach ` command to attach to an existing cloud Devin session with full TUI rendering (tool calls, messages, plans, file edits). The existing `/handoff` behavior is unchanged. * New `/cloud-sessions [--all]` command to list recent cloud Devin sessions and their attachable session IDs. * Custom subagent profiles can opt in to nested subagent spawning via the `max-nesting` frontmatter field, overriding the default depth limit. * Supported editor integrations, including Windsurf, now show the agent which file you have open, your cursor position, and other open editor tabs as part of its context. * `--export` flag for exporting conversation history in ATIF format. * New `/fast` slash command to quickly switch to SWE-1.6 Fast, with pricing comparison against the current model. * Figma MCP servers can now authenticate with `devin mcp add figma --url https://mcp.figma.com/v1` without additional configuration. * When prompted for an MCP tool permission, two additional server-level options are now offered: approve all tools on the server for the current session, or permanently. This lets you grant broader access without re-approving each tool individually. * Prompt navigation and collapsible command sections in terminals with shell integration. VS Code, Windsurf, Ghostty, iTerm2, kitty, WezTerm, and Windows Terminal users can now jump between prompts with keyboard shortcuts (e.g. Ctrl+Shift+Up/Down in VS Code), see prompt markers in the scrollbar, and collapse agent output sections (iTerm2). Prompt marks also survive session restore. * Revert preview now shows line diff stats (`+N -M`) and a "View diff" button for all action types (restore, delete, recreate). * `show_hints` config option to suppress "Did you know" tips between turns (default: on) ### Changed * Long conversations are compacted earlier in the background so the agent spends less time pausing when context is nearly full. * ATIF exports now include richer per-step transcript details, including telemetry and timing metrics. * Shell commands that continue running in the background after a timeout now report how long Devin waited before returning. * The built-in Explore subagent can now use web search to research topics outside the codebase, in addition to its read-only codebase tools. It still cannot fetch arbitrary URLs or edit files. * Homebrew installations are now externally-managed. The `/update` command will direct users to upgrade via `brew upgrade devin` instead of attempting self-update. * HTTP MCP servers now try Streamable HTTP first and automatically fall back to legacy SSE when the server responds with an HTTP 4xx error, per the [MCP spec](https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/transports/#backwards-compatibility). * MCP OAuth callback pages now show Devin-branded success and failure screens instead of plain text. * Renamed the product from "Devin for Terminal" to "Devin CLI" in user-facing UI, the REPL welcome and startup banner, slash command descriptions (`/bug`), bug report output, cloud handoff messages, version self-manage messages, tips, and public documentation. The binary name, config paths, and install URLs are unchanged. * Revert preview now shows descriptive warnings for irreversible actions instead of empty placeholders. * Read-only shell commands (e.g. `ls`, `cat`, `pwd`) no longer trigger irreversible action warnings during revert. * Shell integration startup is faster, reducing noticeable delay when opening a shell. * Trimmed the first-run welcome message for Devin CLI. * Windows: default non-interactive shell is now PowerShell instead of Git Bash. Git for Windows is no longer required to run Devin CLI on Windows. ### Fixed * Image attachments in Windsurf now show the correct warning when the selected Devin CLI model does not support images. * Responses silently truncated when the model hits its max output token limit now show a warning and exit non-zero in pipe mode instead of returning partial output as if complete. * Persist the reduced trailing-image cap across turns after HTTP 413; prevents the cap from resetting to 20 each turn and triggering repeated 413 cycles * Re-encode bmp/tiff/ico images to PNG at the message-forest chokepoint instead of forwarding them to Anthropic with an unsupported `mime_type`, which surfaced as `messages.N.content.0.image.source.base64.media_type: Input should be 'image/jpeg', 'image/png', 'image/gif' or 'image/webp'` 400 errors. * Drop oversize (>5 MB) images whose bytes can't be fully decoded instead of passing them through verbatim, which surfaced as `image exceeds 5 MB maximum` 400 errors. * Typing into a multiple-choice question's "Other (type your own)" field no longer drops `e`/space or treats `j`/`k`/digits as shortcuts; all characters now insert into the answer. * Plan mode is now available when your organization requires sandbox mode. Previously `/plan` and `/mode plan` were rejected with "Plan mode is not available", even though plan mode is read-only. * Pre-user-prompt hooks that exit with code 2 now correctly block the prompt instead of being silently ignored. * Reverting a step no longer reports a spurious "file was modified externally" conflict for files where the agent's edit was rejected in the IDE. * Reverting or editing a cancelled prompt (stopped before any output streamed) no longer fails with "could not resolve step." * Sandbox mode no longer leaves empty ghost dotfiles (`.bashrc`, `.gitconfig`, `.mcp.json`, etc.) in the project directory after commands finish. * The in-session `skill` tool now finds skills behind symlinked directories under `.windsurf/skills/`, `.agents/skills/`, and `.claude/skills/`, matching `devin skills list`. * `/handoff` now collects untracked files from the entire repository, not just the current subdirectory * `/handoff` now includes untracked files in the git diff sent to cloud Devin, not just tracked changes * "Always Allow" permission grants in Windsurf now persist across sessions. Previously, selecting "Always Allow" in the ACP permission dialog only granted the scope for the current session. ### Web search Search the web directly from your Devin CLI sessions. The agent can look up documentation, find solutions, and pull in relevant information from the internet without leaving the terminal. ### Added * Built-in OAuth device flow for GitHub MCP server. `devin mcp add github --url https://api.githubcopilot.com/mcp/` now authenticates via device flow (enter a code at github.com/login/device) without needing `--oauth-client-id`. * `/copy` command to copy the last agent response to the system clipboard. Works over SSH connections and on Linux desktops. * Numbered options in select prompts can now be picked directly with the `1`-`9` keys instead of arrowing + Enter. The shortcut is shown as a digit prefix on each option in non-search prompts. * `web_search` tool for searching the web during agent sessions. ### Fixed * Cancelling a session now also stops running subagents instead of letting them continue in the background * Shell commands that redirect output to `/dev/null` (e.g. `2>/dev/null`, `>/dev/null`, `&>/dev/null`) no longer prompt for write permission to `/dev/null`. * Edit tool previews now show correct file line numbers instead of always starting from 1. * Output token limit raised from 16k to match each model's actual capacity (128k for Opus, 64k for Sonnet), preventing premature response truncation. * Option+Backspace now correctly deletes words in select menus (user question "Other" field and search) on BS-mode terminals, instead of inserting 'h'. * Slash command output now has consistent visual separation from the prompt, matching how agent responses are displayed. ### Added * `skill search` can find model-invocable skills recursively under a project path and filter them by keywords. ### Changed * Default model is now SWE 1.6 Fast instead of Adaptive. ### Fixed * `apply_patch` diffs now appear incrementally as the patch is being written, not just after it completes. Both new-file and modify-existing-file patches show diffs progressively. * Command hints now show the binary name used to launch Devin CLI when run through a renamed binary, symlink, or alias. * Fixed process hang when MCP OAuth dynamic client registration fails. The local callback server was not properly shut down on error, causing the process to block indefinitely waiting for a browser redirect that would never arrive. * `/steps`, `/revert`, and `/fork` now show and work with steps from before compaction. Previously, compacting a session made all earlier steps invisible and unrevertible. * Text now correctly appears before tool calls in scrollback when both are produced in the same streaming turn. ### Fixed * `/usage` command now shows quota % remaining and overage balance for quota-billing users instead of "no credits consumed." *** bumps: chisel: minor config-importers: minor ----------------------- Added MCP config import support for OpenCode, VS Code, and Zed editors. Added Cursor global MCP config loading (`~/.cursor/mcp.json`). New providers can be toggled via `read_config_from` in user config. ### Added * File edits from `apply_patch` now display as inline diffs in Windsurf, matching the diff preview already shown for the `edit` tool. * `/login-status` command to show login debugging info (email, plan, team). * New `post_compaction` hook event that fires after context compaction, with the compaction summary available on stdin. ### Changed * Permission prompts now use clearer wording for always-allow command choices and can offer switching to Bypass when allowed by org policy. * Background shell commands now render as a single exec card with a spinner instead of showing separate "Command Read" / "Killing shell" cards for each `get_output` and `kill_shell` poll. * Ctrl+L now clears the screen properly, like bash and other shells. Visible content is scrolled into the terminal's scrollback buffer so you can still scroll up to see it. Full redraw (re-render all content from scratch) moved to Ctrl+Shift+L. * Startup banner no longer shows the user's email address. * Resuming a session from a different directory now prompts you to choose between the session's original directory, switching permanently to your current directory, or using your current directory just this time. * Improved streaming view for model output. * Updated the startup braille logo to match the design on devin.ai/terminal. ### Fixed * Resuming a Windsurf session with `devin -r` now shows the conversation history instead of a blank screen. * MCP OAuth discovery now works with POST-only servers and servers whose `.well-known` paths are behind SSO. * Resuming a session now correctly restores the selected mode (Plan, Ask, Code) instead of silently reverting to Code. * Skill discovery no longer picks up duplicate skills from nested configuration directories inside skill folders, reducing token usage at session start. * Shell integration setup (`devin shell setup`) is now available for enterprise accounts. ### Fixed * Opt+backspace no longer inserts 'h' on terminals that send BS for backspace. ### Interactive step picker for `/revert` `/revert` with no arguments now opens an interactive searchable picker showing all conversation steps. Select a step to revert to it. Double-tap Esc while the agent is idle to open the same picker. ### Added * MCP servers configured with `"transport": "sse"` (legacy SSE protocol) are now fully supported. Previously, these servers were rejected with an error; they now connect via the legacy SSE protocol (GET for event stream, POST for messages). Stored OAuth tokens are injected automatically, and 401 responses trigger the interactive OAuth flow. * Terminal notification (bell + desktop notification) on successful authentication, making it easier to return to the terminal after logging in via the browser. * `/btw ` asks the agent a quick side question using the current conversation context. The answer streams into a box below the agent's output without adding the question to the main conversation, so you can check in without disrupting what the agent is working on. * `devin cloud drs` subcommands for managing environment blueprints, sandbox sessions, and builds directly from the CLI. * First-startup welcome box with tips for getting started in Devin for Terminal. * Git provider connection prompt during `devin setup`: detects locally logged-in `gh` CLI accounts and offers to connect them to Devin, or open the browser to set up a GitHub App or other provider. * Typing `&` on an empty prompt enters handoff mode, a shortcut for `/handoff` that mirrors the `!` bash-mode pattern. * Context-aware placeholder text in the input field guides users based on agent state: prompts to ask Devin for help when idle, suggests guiding Devin while it works, and indicates how to send queued messages. * Support disabling individual MCP tools per server via `disabledTools` in the MCP config. Disabled tools are hidden from the agent and rejected at call time. * `devin mcp enable` and `devin mcp disable` subcommands to toggle MCP servers on/off without removing them. Supports `--scope` (user, local, project). Disabled servers show with a `(disabled)` label in `devin mcp list` and a status line in `devin mcp get`. * Support for MCP servers that require a pre-registered OAuth client (e.g. GitHub). Pass `--oauth-client-id` (and optionally `--oauth-client-secret`) to `devin mcp add` and `devin mcp login`, or set `oauthClientId` / `oauthClientSecret` in your MCP config. * Organization selection is now part of the setup wizard. Users with multiple Devin organizations are prompted to choose one during onboarding; single-org users are auto-selected. * `/org` command for selecting a Devin organization from the terminal. * Option to hand off a plan to a cloud Devin session when exiting plan mode, available for users signed in with a Devin account. * `Ctrl+R` fuzzy search for inserting previous prompts into the input box. * Proxy configuration section in `config.json` for controlling how the CLI routes outbound HTTP traffic. Set `proxy.mode` to `"system"` (default), `"manual"`, or `"off"`, provide a `proxy.url` for manual mode, and use `proxy.no_proxy` to bypass specific hosts. * Add `terminal-light` and `terminal-dark` theme names for 16-color terminal themes. `16color` and `terminal-colors` remain supported for backwards compatibility with `terminal-dark`. * `/theme` accepts an optional theme name, such as `/theme dark` or `/theme light`. * When opening the CLI inside a repo that has a Devin wiki, the wiki is now downloaded in the background and made available to the agent on subsequent sessions, so it can answer project questions using an explore subagent. ### Changed * Browser authentication pages redesigned to show a connection status between your computer and Devin, matching the devin.ai website style. * Login and API-key authentication labels now use Devin or generic API-key wording instead of legacy Windsurf-only wording. * Code mode now auto-approves file edits in workspace directories. The separate "Accept Edits" mode has been folded into Code; both display as "Code" in the mode picker, with the auto-approval variant used when the org policy allows it. * The default model is now Adaptive, which automatically routes each turn to the best model for the task. You can still pick a specific model with `/model` or by setting `agent.model` in your config. * Declarative Repo Setup (DRS) is now a builtin agent skill instead of a `/drs` slash command. The agent automatically invokes it when you ask about environment setup. The `devin cloud drs` subcommands continue to work as before. * Shell command previews use clearer titles and show commands with a prompt prefix in the preview body. * Cloud handoffs now send gathered terminal context in an expandable section. * `/handoff` now stops when the selected organization has no connected git provider and asks the user to run `devin setup` before retrying. * New Devin CLI sessions use memorable word-pair IDs. * Model picker now shows labeled pricing (e.g. "$5 / MTok In · $25 / MTok Out") on the highlighted model instead of unlabeled dollar amounts. * Slash commands now show confirmation messages when switching models, themes, or modes via the interactive picker. * Cleaned up slash command output: removed unnecessary colors, improved spacing, and simplified progress messages. * Improved how freeform "Other" answers are handled in agent questions. Typed responses that don't match a predefined option are now recognized as custom answers automatically. * `/resume` now opens the interactive session picker when run without a session ID. * Rule files use tighter injection limits and switch to path-only guidance when triggered rules exceed the available context budget. * Selection prompts now use a neutral highlighted row with clearer contrast and show item descriptions consistently. * Normalized tool preview verb tenses: streaming previews now use present progressive ("Editing file.rs") and completed previews use past tense ("Edited file.rs"). * Status messages (warnings, errors, tips) now render through the Alert component with proper icons and theme-aware colors. * Added meaningful titles to error messages: "Something went wrong", "Quota exhausted", "Turn limit reached", "Couldn't open browser". * Standardized "cancelled" spelling to "canceled" (one L) in all user-facing strings. * "Connection lost, retrying..." replaces "Inference failed mid-stream, retrying...". * Muted text is now easier to read in both dark and light themes. * Multiple-choice questions now use the same selection UI as other CLI prompts, including typed custom answers. ### Fixed * File writes from `apply_patch` now appear in the agent timeline / worklog alongside writes from the `write` and `edit` tools. * Long sessions exit more quickly when shutting down. * Code blocks no longer lose their last character when text fills the terminal width. * Input responsiveness while the agent is actively streaming events. * Numbered lists in rendered markdown now show numeric markers (`1.`, `2.`, `3.`) instead of bullet points. * OpenAI reasoning models no longer fail when a request configures temperature. * Prompt history opens while Devin is running, including when completions are visible. * Todo list no longer disappears after the agent finishes updating it. * `/upgrade` opens Devin plans instead of Windsurf pricing. * Opening a session database that was written by a newer CLI now shows a clear "please run `devin update`" message instead of a raw "migration is missing from the filesystem" error. * `/handoff` now sets the repo via the session config option and tags the session as "Terminal". * Model picker search no longer replaces family grouping with individual variants. * The "Update vX available!" banner is no longer shown when background auto-update is going to install the new version on its own. It now only appears when the user has to take action (e.g. externally managed installs, or when auto-update has been disabled). * File and code snippet references now render as readable paths instead of raw XML tags. ### Background auto-updates On macOS and Linux, new releases are now downloaded and activated while Devin for Terminal runs, so the next invocation picks up the latest version automatically. Quitting mid-update is safe and cannot leave the installation in a broken state. Opt out by setting `"auto_update": false` in `config.json`. ### Interactive config editor `/config` opens an interactive in-terminal config editor with tree navigation, search, and type-aware value editing. ### `/handoff` to cloud Devin The `/handoff` slash command is now generally available. Hand off a task to a remote Devin session with live status updates showing what the agent is currently working on. ### Searchable model picker The model picker now has a searchable interface: type to filter models, navigate with arrow keys, and see pricing info at a glance. ### Added * Support for adaptive and model-router selections, which now resolve to concrete models automatically during inference. * Detailed login info in `devin auth status`: login method, user name and email, user ID, team ID, plan and tier, and cached team settings. * Added a tray panel listing running background shells. Press the down arrow from the input to open it, navigate with up/down, and press `x` to kill the selected shell. * Support for an enterprise-configured default model. Admins can set a team-wide default model for new sessions via the Windsurf or Devin enterprise admin dashboards. * Added keyboard selection in the cloud agents tray: use the arrow keys to pick a cloud agent and press Enter to open its session in the default browser. The session URL is still shown below each entry as a fallback when a browser can't be launched. * Enforcement of the organization's "Auto run terminal commands" setting. Enterprise admins can now restrict which permission modes are available to CLI users — for example, preventing selection of Bypass mode when the org policy is set to "Auto" or below. * Added a way to flush queued messages to the agent immediately by pressing Enter on an empty input box while the agent is busy, so they're picked up as soon as the current tool call finishes (without interrupting it). * `/handoff` now attaches the local git diff to the Devin session, giving it visibility into uncommitted changes. * Interactive organization picker for `/handoff` when no org is configured, replacing the previous error that required manual config editing. * `legacy_terminal` config option for VT100 terminal compatibility, disabling keyboard enhancement probing, OSC sequences, and theme auto-detection. * `disable_osc` config option to independently control OSC sequence emission (terminal titles and hyperlinks). * `skip_workspace_trust` config option to bypass workspace trust prompts. * Per-model token pricing in the model selector, showing input and output cost per million tokens. * NEW, PROMO, and BETA badges in the model picker for models flagged by the server. * Relative cost tier (Free / \$ / \$\$ / \$\$\$) as a fallback description when per-token pricing is unavailable. * Added `/rename-session` slash command to rename the current session. * Added `/revert ` command to undo file changes back to a specific conversation step * Added `/steps` command to list conversation steps for use with `/fork` and `/revert` * Added optional `[step]` argument to `/fork` to branch from an earlier conversation point * Shift+Insert now pastes from the clipboard, matching the standard X11/Linux paste shortcut. ### Changed * `/bug` now clarifies that the report is sent to the Devin for Terminal developers. * Improved model selector with compact single-height items, a visible search input border, and streamlined pricing display for the selected model. * Unknown slash commands now show "did you mean?" suggestions based on similar command names. * Styled `/handoff` status lines with the standard animated spinner and muted text, replacing the static half-circle symbol and blue accent color. * `/handoff` can now be used without arguments. It summarizes the current conversation and hands off to a remote Devin session to continue the task. * Error message when switching to an unavailable permission mode now explains that sandbox mode restricts available modes and whether the restriction is enforced by the organization. * Model name below the input box now uses the default text color instead of blue. * Login experience streamlined: the spinner now offers "Press Enter to paste a token manually instead" and the manual-token path prints a single concise line instead of a multi-step wall of text. * "Logging in with Windsurf. If the browser didn't open..." preamble removed from the login spinner. * Plan mode approval prompt now shows plan-specific options: "Yes, implement plan and accept edits", "Yes, implement plan and bypass permissions", and "No, plan needs changes". * "16-color" theme renamed to "Terminal colors" to clarify that it inherits your terminal emulator's color scheme. * Session resume picker (`devin -r`, `devin list`) now has a searchable type-to-filter interface, matching the model selector experience. * Updated the tray panel to always show both Cloud agents and Subagents tabs, with an empty-state hint describing the other feature when a list has no entries. * Subagents and cloud agents tray panels now sort in reverse chronological order so the most recently launched agent appears at the top. * Always-on rule files (such as `AGENTS.md`) injected into context are now capped at 32 KiB each. Oversized rules are truncated with a hint pointing at the source path so the agent can read the full file on demand. ### Fixed * Errors from upstream servers (quota exhaustion, 5xx responses, connection drops, etc.) now show up as legible warnings in the REPL with a retry hint instead of raw `Error: …` text, and reach ACP clients with a typed cause so they can render them with the right severity. * Honored user `deny` / `allow` / `ask` permission rules (including `Read(...)` and `Write(...)`) in Devin for Terminal running inside Windsurf, matching standalone CLI behavior. * Unnecessary compaction is no longer triggered on every turn when using the adaptive model. * Logo now appears above conversation history when resuming a session, matching the layout of a fresh session. * `/add-dir` on Windows no longer mangles paths containing backslashes. Both `D:\Source\Project` and `..\Project` forms now work correctly. * Startup banner text alignment is now correct on continuation lines at narrow terminal widths. * Day-of-week is now correct when asking for the current date. * Compound shell commands are now blocked when they include a command you've denied in your CLI permissions. * Fixed selected/highlighted UI elements (like active question tabs, selected image attachments, and selected subagents) rendering with the same text color as un-highlighted text, making them hard to distinguish. * MCP servers configured with `"transport": "sse"` now fail with a clear error explaining that legacy SSE is unsupported, instead of silently connecting over the wrong transport. * Unnecessary permission prompts for shell commands no longer appear in autonomous mode with sandboxing enabled. * Clarified in the docs and `devin skills paths` output that on Windows, global skills live in `%APPDATA%\devin\skills\` instead of `~/.config/devin/skills/`. * Cursor positioning now uses VT100-compatible sequences (CR + CUF) instead of CHA, which is not supported by all terminals. * Tips and spinner symbols now respect the ASCII mode setting. * Fixed the browser login page to only say "Authentication Successful" once sign-in actually completes, and show a failure page when it doesn't. * Unrecognized slash commands now show an error instead of being sent to the model. * Clear install-instructions error when `socat` is missing on Linux, instead of failing silently. * File edits in the same turn no longer occasionally overwrite each other. ### Read-only tools allowed by default Read-only tool calls (file reads, grep, glob, thinking) are now always allowed and no longer surface a permission prompt. User-, project-, and organization-configured deny rules still take precedence, so you can still restrict reads to sensitive paths. ### `.devin/hooks.v1.json` support Define pre- and post-command hooks in a standalone `.devin/hooks.v1.json` file using the same format as Claude Code hooks. ### `devin mcp add` overhaul `devin mcp add` now matches Claude Code's syntax: positional URL argument (e.g. `devin mcp add notion https://mcp.notion.com/mcp`), inferred transport from `--url` (HTTP) or trailing args (stdio), default scope changed from `user` to `local` (writes to `.devin/config.local.json`, gitignored), and new short flags (`-t`, `-s`, `-e`, `-H`). ### Agent mode and permission mode separation Agent profiles (normal, plan, ask) and permission modes (normal, accept edits, bypass, autonomous) are now two independent controls. Profiles are switched via `/plan`, `/ask`, `/normal` slash commands. `/plan ` switches to plan mode and immediately sends the prompt in one step. Permission modes are cycled with Shift+Tab or `/mode`. ### Live streaming tool previews Tool calls now appear immediately as arguments stream in, showing structured titles and content (diffs for edits, code blocks for writes, commands for exec) instead of waiting for the full request. ### Terminal notifications The CLI now sends terminal notifications when the agent finishes, needs input, or requests tool approval. Triggers dock badge and notification banners in supported terminal emulators. Controlled by the `notify` config option: `"never"`, `"smart"` (default, only when unfocused), or `"always"`. ### Added * Added structured form-based input support when connected to ACP clients that advertise elicitation capability. * Added inference tool name metadata to ACP tool call events so ACP clients can make per-tool presentation decisions (for example, hiding the arguments panel for internal tools). * Enabled the `devin acp` subcommand on stable and next, so any released build of Devin for Terminal can be launched as an Agent Client Protocol server by ACP-aware editors. * Added `/ask`, `/compact`, `/context`, and `/undo-add-dir` slash commands for ACP clients (e.g. JetBrains). * Expanded `/help` output in ACP sessions to list all built-in commands and discovered skills. * Show subagent activity and lifecycle events in the Windsurf UI. * Made the "Mode:" and "Model:" labels in the footer clickable to open their selector menus * Added mouse support to selector menus: click to select, scroll wheel to navigate, hover to highlight * Autocomplete for `/continue` and `/rm-session` commands showing recent sessions with ID prefix, time ago, and title. * `--force` flag on `devin update` and `/update` to force re-install even when already on the latest version. * Added interactive OAuth support for MCP servers — when an MCP server requires authentication, the browser opens automatically and a status message appears in the REPL. * `/new` as an alias for `/clear` to start a fresh conversation. * Active permission level in the top border of the input box. * Thumbs up/down feedback for agent responses via `Alt+↑`/`Alt+↓` and `/feedback`. * `respect_gitignore` config option to control whether the agent respects `.gitignore` when accessing files via tools (default: off). Separate from `include_gitignored_files`, which only affects `@` tab completion. * `/resume` as an alias for `/ls` (list recent sessions). * Subagent prompt in the expanded view (Ctrl+O) when a subagent completes. * Live streaming of subagent actions while waiting on a foreground subagent or a `read_subagent` call. * `/session-stats` command to display cumulative session statistics (tool calls, files changed, commands run, tokens, model, request ID). ### Changed * Changed workspace directory updates via ACP to use replacement semantics, enabling directory removal through the config option. * Made `/ask ` a one-shot command matching REPL behavior: temporarily switches to Ask mode, submits the question, then restores the previous mode. * Made session troubleshooting easier in Windsurf by showing diagnostic logs directly in the output panel. * Presented related agent questions in a single paginated form instead of one at a time. * Improved the plan mode exit approval with a dedicated review UI showing the plan summary and contextual button labels. * Improved Windsurf hook scripts to receive richer tool information on stdin, including edit details, MCP tool results, and assistant responses * `devin mcp add` no longer requires `--transport` or `--command` for the common stdio case — transport is inferred from `--url` (HTTP) or trailing args (stdio), and the first trailing arg is used as the command when `--command` is omitted * `/mode` now opens an interactive dropdown selector (like `/model`) instead of printing a static list. Use arrow keys to navigate, Enter to confirm, Esc to cancel. * `-p`/`--print` now accepts an optional inline prompt, so `devin -p "fix the bug"` works without needing the `--` separator. The old `devin -p -- fix the bug` syntax continues to work. * Shortened the "always allow" label for command permission prompts to "Always allow `` commands in ``", where `` is just the last path element of the workspace directory, so it no longer overflows narrow terminals or ACP client UIs when the workspace path is long. * `/mode` now opens an interactive dropdown selector (like `/model`) instead of printing a static list. Use arrow keys to navigate, Enter to confirm, Esc to cancel. * Plan mode exit approval now has a dedicated review UI showing the plan summary and contextual button labels. * Removed the brand colors from the startup logo so it uses the terminal's default foreground color. * Truncation notices now include a "(ctrl+o to expand)" hint. * Consolidated the mode and permission pickers into a single unified mode selector in Windsurf. The available modes are now Code, Ask, Plan, Accept Edits, and Bypass Permissions. * Each Devin CLI channel now reads Windsurf config (MCP servers, skills) from its matching channel-specific directory under `~/.codeium/` ### Fixed * Fixed ACP sessions to require host-provided credentials instead of silently falling back to local CLI credentials, ensuring usage is properly attributed to the correct account. * Preserved streamed shell command output in ACP chat UIs so it stays visible after the command completes, with the exit code shown alongside instead of replacing the output. * Session mode selector now updates immediately after choosing "switch to accept edits" from a permission prompt. * Skipping a tool call in Windsurf no longer stops the agent — the LLM now sees the rejection and can try an alternative approach * Tool failure messages now show the error reason in Windsurf instead of just "Failed" with no explanation. * Fixed `/add-dir` and `/undo-add-dir` failing to handle directory paths containing spaces. Slash command arguments are now parsed with shell-style quoting (e.g. `/add-dir "my dir"` or `/add-dir my\ dir`), and tab completions automatically escape spaces in directory names. * Fixed excessive line spacing in the ASCII mode startup banner. * Long-running shell commands like dev servers now start reliably without blocking subsequent work. * Fixed bypass mode not auto-approving MCP `read_resource`, computer use, recording, and browser tools due to incorrect permission scopes. * Fixed autonomous mode silently auto-approving privacy-sensitive tools (computer use, recording, browser) that operate outside the OS sandbox. * Fixed browser screenshot path authorization mismatch when the screenshots directory was relative. * Fixed wide character (CJK/emoji) display corruption when deleting characters adjacent to them. * Fixed "always allow" for command permissions silently failing to persist when running outside a git repository. * Improved text visibility when the terminal background doesn't match the selected color theme. * Fixed alphabetic sorting in directory completion menus so that shorter directory names sort before longer ones that share the same prefix (e.g., `devin/` now correctly appears before `devin-docs/`). * Shell command output is no longer lost after long terminal sessions with extensive scrollback. * Fixed injected lint diagnostics appearing as fake user messages when reopening a saved session. * Fixed an issue where the agent would not automatically review and fix lint errors detected after code edits. * Improved lint error presentation with more detailed information including severity level, source, and precise location. * Added a safety cap on lint-fix injection count to prevent infinite loops when a lint cannot be resolved. * Separated new and persistent lint errors with distinct instruction text so the agent understands which lints it has seen before. * ANSI color escape codes are no longer written to log files or piped stdout/stderr. Colored output is only emitted to real terminals and respects the `NO_COLOR` environment variable. * Mode is now properly restored on session resume. * Session resume no longer drops early conversation messages after multiple compaction rounds. * Permission mode no longer resets unexpectedly mid-session. * Sandbox sessions no longer revert from autonomous to normal mode when exiting plan mode. * Code diffs and other rich tool call content no longer disappear from edit/write tool calls after reloading a session in the replay UI. * `shell run` no longer leaves the terminal in a bad state after exit. * Fixed silent crashes when a corporate proxy or firewall resets a network connection mid-session. * Ctrl+C now exits quickly even when the network connection is slow or stalled. * Session and always-allow choices in permission prompts now work correctly for terminal commands that also write files. * Thinking output now always renders before content when a model skips the `ThinkingComplete` event * Malformed tool-call error messages now point to the specific field and expected value type. * Windows no longer shows double authentication prompts during initial setup. * Windows installer now places files in the correct directory so PATH resolves properly. * Windows config file location is now clearly documented as `%APPDATA%\devin\config.json` instead of `~/.config/devin/config.json`. * Grep now searches hidden files like `.env` and `.github/`, matching the behavior of `rg --hidden`. The `.git/` directory remains excluded. * Large images (over 5 MB) no longer fail to send. * Local shell commands no longer continue running in the background after a session is interrupted or cancelled. * Preserved rich mention rendering (e.g. `@README.md` chips) when resuming a session, instead of showing raw markdown text. ### Removed * Removed the in-REPL overage status indicator banner * "Thought for Xs" duration display no longer appears in the REPL scrollback. ### Removed * In-REPL overage status indicator banner is no longer shown. ### Added * Warning when your account is in overage so you know requests are being billed to your team's prepaid balance. * `/usage` command to show Windsurf credits and ACUs consumed during the current session. ### Fixed * The installer now accepts existing `~/.local/bin/devin` symlinks pointing to the legacy `~/.local/share/cognition/cli/...` path and refreshes them correctly after the cognition-to-devin migration. ### Fixed * Wide character (CJK/emoji) display corruption no longer occurs when deleting characters adjacent to them. ### Added * Show subagent activity and lifecycle events in the Windsurf UI. * "Mode:" and "Model:" labels in the footer are now clickable to open their selector menus. * Mouse support in selector menus: click to select, scroll wheel to navigate, hover to highlight. * Autocomplete for `/continue` and `/rm-session` commands showing recent sessions with ID prefix, time ago, and title. * Added `--force` flag to `devin update` and `/update` to force re-install even when already on the latest version. * Added support for reading hooks from `.devin/hooks.v1.json`, a standalone hooks file using the same format as Claude Code hooks * Show subagent prompt in the expanded view (Ctrl+O) when a subagent completes. * Stream subagent actions in the live display while waiting on a foreground subagent or a `read_subagent` call. * New `notify` config option that controls terminal notifications when the agent finishes, needs input, or requests tool approval. Set to `"never"`, `"smart"` (default), or `"always"`. In `smart` mode, notifications are only sent when the terminal window is unfocused. Triggers dock badge and notification banners in supported terminal emulators. ### Changed * `devin mcp add` no longer requires `--transport` or `--command` for the common stdio case — transport is inferred from `--url` (HTTP) or trailing args (stdio), and the first trailing arg is used as the command when `--command` is omitted * `/mode` now opens an interactive dropdown selector (like `/model`) instead of printing a static list. Use arrow keys to navigate, Enter to confirm, Esc to cancel. * `-p`/`--print` now accepts an optional inline prompt, so `devin -p "fix the bug"` works without needing the `--` separator. The old `devin -p -- fix the bug` syntax continues to work. * Added "(ctrl+o to expand)" hint to truncation notices so users know how to view full output. ### Fixed * Skipping a tool call in Windsurf no longer stops the agent — the LLM now sees the rejection and can try an alternative approach * Tool failure messages now show the error reason in Windsurf instead of just "Failed" with no explanation. * `/add-dir` and `/undo-add-dir` now handle directory paths containing spaces. Slash command arguments are parsed with shell-style quoting (e.g. `/add-dir "my dir"` or `/add-dir my\ dir`), and tab completions automatically escape spaces in directory names. * "Always allow" for command permissions now persists correctly even when running outside a git repository. * Text visibility improved when the terminal background doesn't match the selected color theme. * Alphabetic sorting in directory completion menus now correctly places shorter names before longer ones with the same prefix (e.g. `devin/` before `devin-docs/`). * Mode is now properly restored on session resume. * Silent crashes no longer occur when a corporate proxy or firewall resets a network connection mid-session. * Thinking output now always renders before content when a model skips the `ThinkingComplete` event. * Fixed double authentication prompts on Windows during initial setup. * Fixed Windows installer placing files in the wrong directory, causing PATH to point to the wrong location * Fixed large images (over 5 MB) failing to send. ### Added * Add `16color` and `nocolor` theme modes. `16color` quantizes output to the 16 ANSI color palette (respects terminal color scheme). `nocolor` disables all color output for VT100 and other monochrome terminals. * Support multi-root workspaces with additional directories beyond the session working directory. * Add `/workspace` and `/add-dir` slash commands for listing and adding workspace directories at runtime. * Add `workspace-dirs` config option for setting workspace directories programmatically. * Add Ask mode (`/ask`) for read-only question answering without code changes * Add `/bug` slash command for submitting bug reports from the stdio server * Display a persistent warning banner when running in Windows Conhost, recommending Windows Terminal or Git Bash for a better experience. * `Ctrl+Left` and `Ctrl+Right` now jump between words, matching standard Linux and Windows terminal behavior. `Ctrl+Backspace` and `Ctrl+Delete` delete words backward and forward respectively. * Add custom subagent profiles: define specialized subagents with their own system prompts, tools, and models via `AGENT.md` files in your project's `agents/` directory (experimental) * Add `subagent` and `agent` frontmatter fields for skills, allowing skills to run as independent subagents instead of inline (experimental) * Add `include_gitignored_files` config option to include gitignored files in @ tab completion results (default: off) * `/undo-add-dir` command to remove directories from the workspace. * `/rm-session` command to delete sessions. * Added `request_scope` tool for requesting read/write access to directories when running in sandbox mode * Added sandbox mode system prompt that informs the agent about sandbox restrictions and how to request additional access * The `--sandbox` flag and `devin sandbox setup` command are now available on all build channels (previously insiders-only) * Add `unicode_mode` config option (`auto`/`unicode`/`ascii`) for terminals that don't support Unicode glyphs * Add `devin version` subcommand as an alias for `devin --version` ### Changed * Include the active interface mode in bug report details * Migrate all config, data, and cache directories from `~/.config/cognition/`, `~/.local/share/cognition/`, and `~/.cache/cognition/` to `devin/`. A backward-compatibility symlink is created at each old path so older sessions continue working. * Rename the project-level config directory from `.cognition/` to `.devin/`. Existing `.cognition/` directories are still read (with a deprecation warning) for backward compatibility. ### Fixed * Hooks defined in `.claude/settings.json` are now loaded by the CLI (both project-level and global `~/.claude/settings.json`) * Cmd+V now triggers clipboard paste in terminals that report it as a key event (e.g. when pasting non-text data like images) * Fixed panic when piping CLI output to commands that close early (e.g. `devin -p "..." | head`). * Fix partial agent output (thinking and content) being silently dropped when the agent stops with an error during streaming * Fixed image uploads failing when the file extension doesn't match the actual image format (e.g. a JPEG saved as `.png`). The MIME type is now detected from the image content rather than trusting the caller-supplied value. * Fix `devin mcp login` failing against servers (e.g. Glean) that only allow `/auth/callback` as the OAuth redirect path * Fix CLI freeze when pasting very long single-line text (e.g. JSON blobs, base64 strings) by collapsing pastes that exceed 5,000 characters * Skills now display their true source path (e.g. `.agents/skills/`) instead of always showing `.devin/skills/` * Fixed pasting text (Ctrl+V / bracketed paste) into slash command prompts like `/bug` * Respect the `disabled: true` flag in MCP server configurations, so servers marked as disabled in Windsurf, Claude, or Devin config files are no longer loaded ### Fixed * Load skills and agents from `~/.config/devin/` and `.devin/` directories as documented, in addition to the legacy `~/.config/cognition/` and `.cognition/` paths. ### Added * Add automatic generation of descriptive session titles. * Add `CHISEL_LOG_STDERR` env var to direct log output to stderr * Add PAC (Proxy Auto-Configuration) support on Windows and macOS. The CLI now respects system-level PAC settings and WPAD auto-detection, routing traffic through the correct proxy without requiring manual environment variable configuration. * Add `!` syntax to run shell commands directly from the REPL. Output streams in real-time and is automatically added to the conversation context for your next message. Typing `!` enters bash mode with a dedicated prompt and title indicator. Use Ctrl+C to cancel a running command. * Display Devin logo alongside product info on CLI startup. ### Changed * The `/bug` command now automatically includes terminal environment info (`TERM_PROGRAM`, `TERM_PROGRAM_VERSION`, `TERM`) in bug reports. * Change permission prompt default selection from "Yes, always allow" back to "Yes" (approve once) ### Fixed * Fix "Always Allow" permission not persisting across tool calls when running inside Windsurf * Fix enterprise team-enforced permission rules not being applied when running inside Windsurf * Fixed `Co-Authored-By` commit trailer to use the correct GitHub App bot email instead of `noreply@cognition.ai` * Fix permission suggestions including file paths as part of the command prefix (e.g. `allow cat foo/bar/baz.txt` now correctly shows `allow cat`). * Fix repeated "Context compacted" notifications when inference fails mid-stream and retries * Fixed off-by-one error in edit tool's reported start/end line numbers when the edit is not at the beginning of the file * Fix "always allow fetches to" permission not being recognized after restart * `mcp_list_tools` now includes the `input_schema` for each tool, so the agent can discover parameter requirements without needing to trigger a tool call error first. * Fix `devin mcp login` failing on servers that use RFC 8414 OAuth discovery instead of RFC 9728 (e.g. Atlassian) * Fix pasting text that starts with `#` (e.g. markdown headings) being silently dropped. * Fix spinner disappearing after a sub-agent completes while the main session is still running * Fixed layout shift in the startup banner where text jumped when account info loaded * Fixed stray `<` character appearing at the start of terminal output on headless environments where `TERM=dumb` * Fixed missing whitespace in thoughts. * Allow long question headers in `ask_user_question` instead of rejecting them; headers over 16 characters are now truncated with an ellipsis (…) for display * Fix missing DLL errors on Windows ARM by statically linking the C runtime ### Removed * Removed the "Loading configuration from..." startup notice. Configuration import from Cursor, Windsurf, and Claude Code still works — the notice is simply no longer displayed. ### Added * Add `show_path` config option to display the current working directory in the input border # Controls Source: https://docs.devin.ai/cli/enterprise/controls Devin CLI is a local agent like Cascade, but does not yet implement all of the same features and controls. Devin CLI is a local agent that runs on your machine with access to your local files, tools, and environment — similar to Cascade in Devin Desktop. It shares the same agent harness as the [Devin Local agent](/desktop/devin-local). Because it is a newer agent, Devin CLI does not yet implement all of the same features and controls as Cascade. Many of Cascade's controls are replaced by more flexible mechanisms — for example, [permissions](/cli/reference/permissions), [hooks](/cli/extensibility/hooks/overview), and [team settings](/cli/enterprise/team-settings). ## Limitations The following features are not currently supported with the Devin Local agent: * **Memories** — The Devin Local agent does not persist memories between sessions. Migrate your critical memories to [skills](/desktop/cascade/skills). * **Workflows** — Workflows are not available with the Devin Local agent. Migrate your workflows to [skills](/desktop/cascade/skills). * **Codemaps** — The Devin Local agent does not yet read [codemaps](/desktop/codemaps). * **Code Lenses** - Currently [code lenses](/desktop/command/windsurf-related-features) do not yet trigger the Devin Local agent. * **Fast Context** - Devin Local uses subagents to explore code, but doesn't have the same fast context UI as Cascade. * **App Deploys** - The Devin Local agent does not support app deploys. * **Browser previews** - The Devin Local agent does not yet support in-IDE [browser previews](/desktop/previews), including the DOM element selector tool. * **Conversation Sharing** - Conversation sharing is not yet available with the Devin Local agent. The Devin Local agent does support [rules and AGENTS.md files](https://cli.devin.ai/docs/extensibility/rules) as well as [skills](https://cli.devin.ai/docs/extensibility/skills/overview) for providing persistent context and reusable workflows. ### Analytics The Devin Local agent does not yet report all of the analytics that Cascade collects. The following data is collected for Cascade but **not** for Devin Local: * **Tool usage** — The [`cascade_tool_usage`](/desktop/accounts/api-reference/cascade-analytics) data source (per-tool call counts such as Code Edit, Run Command, Search Web, and MCP Tool) only includes Cascade sessions. Tool calls made by the Devin Local agent are not reported. To monitor or restrict tool usage with the Devin Local agent, use [hooks](/cli/extensibility/hooks/overview) and [permissions](/cli/reference/permissions) instead. * **Lines suggested and accepted** — The [`cascade_lines`](/desktop/accounts/api-reference/cascade-analytics) data source (daily lines of code suggested and accepted) does not include code written by the Devin Local agent. * **Write/Read mode** — The Devin Local agent does not report a Cascade mode, so the `mode` field in the `cascade_runs` data source is not populated for Devin Local activity. Devin Local activity is still included in the [`cascade_runs`](/desktop/accounts/api-reference/cascade-analytics) data source (model usage, messages sent, and credit consumption) and in the [Cascade Data source](/desktop/accounts/analytics-api#cascade-data) of the Custom Analytics API. The Devin CLI does not report analytics for [hybrid deployments](https://devin.ai/blog/self-hosted-deployment-maintenance-mode). ### Enterprise controls Enterprise admins can configure the Devin Local agent through [team settings](https://windsurf.com/team/settings), including [new controls only available with the Devin Local agent](https://cli.devin.ai/docs/enterprise/team-settings): * **Sandbox enforcement** - Require sandbox mode for all users and configure organization-wide domain filtering rules * **Granular permissions** - Control which actions the agent can take with more fine-grained permissions * **Network enforcement** - Control network access with allowed and denied domains Additionally, the "Enable Cascade" control can be used to disable the legacy Cascade agent entirely to ensure your team follows the new controls available with Devin CLI. #### Unsupported enterprise controls The following legacy enterprise controls are not available with the Devin Local agent: * **Restrict Tool Calls to Workspace** - by default, the Devin Local agent can only read/edit files within the workspace. Custom [permissions](https://cli.devin.ai/docs/reference/permissions) are a more flexible replacement that can be used to replicate the same rules. * **App Deploys** - App deploys are not yet supported with the Devin Local agent. * **Conversation Sharing** - Conversation sharing is not yet supported with the Devin Local agent. * **Enable or disable Cascade for your team** - This setting only controls the legacy Cascade agent and does not apply to the Devin Local agent or the Devin CLI. * **Global tool calling disabled** - If you previously disabled tool calling entirely, write an equivalent [permission policy](https://cli.devin.ai/docs/reference/permissions) for Devin CLI instead. The following legacy controls will still be enforced as a fallback if you haven't yet implemented an enterprise CLI permission config: * **Auto Run Terminal Commands** - The Devin Local agent uses its own [permissions model](https://cli.devin.ai/docs/reference/permissions) instead of auto-execution levels; we recommend using this instead, but the old control will still be enforced as a fallback. * **Terminal allow lists** - Implement an equivalent [permission policy](https://cli.devin.ai/docs/reference/permissions) for Devin CLI to allow specific terminal commands. * **Terminal deny lists** - Implement an equivalent [permission policy](https://cli.devin.ai/docs/reference/permissions) for Devin CLI to deny specific terminal commands. ## Further reading * [Team settings](/cli/enterprise/team-settings) * [Permissions](/cli/reference/permissions) * [Hooks](/cli/extensibility/hooks/overview) * [Devin Local agent](/desktop/devin-local) # Devin Auth Source: https://docs.devin.ai/cli/enterprise/devin-auth Authenticate to Devin CLI using your existing Devin account ## Overview You can authenticate to Devin CLI using your existing Devin account. This provides a seamless experience for organizations already using Devin, with billing handled through the standard **Devin billing model**. User management, team organization, SSO, RBAC, billing, and consumption are all inherited natively through the Devin dashboard. For most of your organizational needs, you should rely on the [Devin dashboard](https://app.devin.ai). Devin authentication for Devin CLI is available to **Devin Enterprise** customers. Contact your account executive if you have questions about authentication, billing, or access. ## Getting Started ### Prerequisites Before using Devin authentication, ensure that: 1. Your organization has a Devin enterprise account 2. Your administrator has configured Devin CLI access permissions (see [Configuring Access](#configuring-access) below) 3. You have been assigned a role with the **Use Devin CLI** permission ### Authenticating To authenticate with your Devin enterprise account: ```bash theme={null} devin auth login ``` Follow the prompts and be sure to select the **Log in with Devin for Enterprise** button to authenticate through your organization's identity provider. ### Credentials file location After `devin auth login`, Devin CLI stores your API token in `credentials.toml`. By default, this token is persistent and does not expire. You can copy the credentials file between your own machines to reuse the same authentication, but treat it as sensitive: anyone with this file can authenticate as you. Do not share it or commit it to source control. | Platform | Location | | ------------- | ---------------------------------------------------------------------------------------------------------------------- | | macOS / Linux | `$XDG_DATA_HOME/devin/credentials.toml` when `XDG_DATA_HOME` is set; otherwise `~/.local/share/devin/credentials.toml` | | Windows | `%APPDATA%\devin\credentials.toml` (typically `C:\Users\\AppData\Roaming\devin\credentials.toml`) | Run `devin auth logout` to remove stored credentials. ## Configuring Access Devin CLI access is controlled through Devin's [custom roles and RBAC system](/enterprise/security-access/custom-roles). Administrators must create a custom role with the **Use Devin CLI** role permission and assign it to users who need access. ### Creating an Access Role 1. Navigate to **Enterprise Settings > Roles** 2. Click **Create a custom role** 3. Provide a descriptive name (e.g., "Devin CLI User") 4. Select the **Use Devin CLI** permission 5. Save the role ### Assigning the Role * **Enterprise admins** or users with the **Manage Account Membership** permission can assign account-level roles via the "Enterprise members" page * **Organization admins** or users with the **Manage Organization Membership** permission can assign organization-level roles via the "Organization members" page You can automatically assign roles based on SSO IdP groups. See the [custom roles documentation](/enterprise/security-access/custom-roles) for details. ## Billing Usage through Devin CLI is billed using the standard **Devin ACU (Agent Compute Unit) model**. All Devin CLI usage counts toward your organization's existing Devin enterprise allocation. Enterprise admins can view their users' Devin CLI usage by accessing the **Cost** dashboard under the **Enterprise Analytics** tab in the Devin web app. This dashboard contains helpful visualizations of ACU consumption across all of the Cognition products, including Devin CLI. For details about ACU billing and usage tracking, refer to your enterprise agreement or contact your account executive. ## Further Reading For more information about Devin enterprise features, see the [Devin Enterprise documentation](/enterprise/getting-started/get-started): * [Enterprise Setup](/enterprise/getting-started/get-started) — Initial configuration and onboarding * [SSO Configuration](/enterprise/security-access/sso/guide) — Single sign-on setup * [Custom Roles & RBAC](/enterprise/security-access/custom-roles) — Fine-grained access control * [Enterprise Security](/enterprise/security-access/security/enterprise-security) — Security policies and controls # Team Settings Source: https://docs.devin.ai/cli/enterprise/team-settings Configure team-wide settings to control your users' Devin CLI usage ## Overview Team-wide settings allow enterprise admins to control Devin CLI usage across their organization. * **Devin Enterprise admins** can manage these settings in the customer-facing Devin dashboard under **Settings → Enterprise → Windsurf** (`app.devin.ai/org/{orgName}/settings/windsurf`). This is self-service for admins with access to enterprise settings. * **Windsurf Enterprise admins** can manage these settings in the Windsurf dashboard at [https://windsurf.com/team/cli-settings](https://windsurf.com/team/cli-settings). Only the Devin CLI-specific settings on these pages apply to Devin CLI. General [Windsurf Team Settings](https://windsurf.com/team/settings) apply to Windsurf and do not necessarily apply to Devin CLI unless also listed on the Devin CLI settings page. ## Available Settings ### Models Control which models your users can access through Devin CLI. You can: * **Whitelist specific models** — Restrict users to a curated list of approved models * **Allow all models** — Give users access to all available models Click **Configure** to manage model access for each category. #### Default model You can also pin a **team-wide default model** that Devin CLI will use for new sessions. This is the same setting Windsurf uses for its default model, so configuring it once applies to both surfaces. * If no team default is set, Devin CLI uses its built-in default model. * If the pinned default is not present in the **allowed models** list above, Devin CLI falls back to the built-in default — the allowlist always takes precedence. * Individual users can still switch models during a session; this setting only controls the starting model for new sessions. Enterprise admins can configure the default model from the [Windsurf Team Settings](https://windsurf.com/team/settings) page, the [Devin CLI Settings](https://windsurf.com/team/cli-settings) page, or the customer-facing Devin Enterprise settings page at `app.devin.ai/org/{orgName}/settings/windsurf`. ### Enable Web Search Allow the Devin CLI agent to perform web searches on the open Internet. This does not affect the agent's ability to read specific URLs, which is performed locally on the user's machine. This tool is **disabled by default** for enterprise teams. ### MCP Servers Control whether your users can use MCP (Model Context Protocol) tools. * **Toggle on/off** — Enable or disable MCP server usage entirely * **Whitelisted MCP Servers** — Specify which MCP servers users are allowed to connect to. If no servers are added, all servers are whitelisted by default. Click **Add Server** to restrict access to specific servers. The recommended way to manage approved servers is through an [MCP registry](#mcp-registry) rather than the explicit whitelist. ### MCP Registry You can use the [official MCP registry](https://modelcontextprotocol.io/registry/about), a downstream registry built on it, or your own registry. Configure registries in team settings: * **MCP registry URLs** — Add one or more registry URLs. With multiple registries, a server is allowed if it appears in any of them (the union of all registries). * **MCP registry enforcement** (toggle) — Choose whether to strictly enforce your registries. When on, users can only connect to servers from your registries; when off, they can also connect to other servers, including custom ones. ### Terminal Permissions Configure team-enforced permission rules for Devin CLI usage. These rules have the **highest precedence** and cannot be overridden by individual users' local or project configurations. Click **Configure** to open the permissions editor. The configuration requires a JSON object with three fields: ```json theme={null} { "deny": [ "exec" ], "ask": [], "allow": [ "Read(~/my-repository/**)" ] } ``` * **`deny`** — Actions that are blocked entirely (takes highest priority) * **`ask`** — Actions that always prompt the user for approval * **`allow`** — Actions that are automatically approved without prompting Permissions can be **scope-based** or **tool-based**: | Type | Format | Example | | ----------------- | -------------- | ------------------------------- | | File read | `Read(/path)` | `Read(~/sensitive/**)` | | File write | `Write(/path)` | `Write(.env*)` | | Command execution | `Exec(cmd)` | `Exec(rm)`, `Exec(sudo)` | | HTTP fetch | `Fetch(url)` | `Fetch(https://internal.api/*)` | | Tool-based | Tool name | `read`, `edit`, `exec` | Use team-enforced deny rules to prevent actions across your entire organization, such as blocking access to sensitive directories or dangerous commands like `rm -rf` or `sudo`. For detailed information on permission syntax, glob patterns, and configuration examples, see the [Permissions documentation](/cli/reference/permissions). ### Sandbox Enforcement Control sandbox behavior for your organization: **Enforcement mode** (whether `--sandbox` is **Optional** or **Required** for all CLI sessions), **Domain allowlist** and **Domain denylist** (organization-wide network filtering), and **Excluded allow** / **Excluded ask** / **Excluded deny** (rules for commands that may — or must never — run outside the sandbox). See the [Sandbox documentation](/cli/sandbox) for how the sandbox works, how these settings interact with user-level configuration, and examples. ### Show "Install Devin CLI" in the Devin Desktop Command Palette Devin CLI is bundled with Devin Desktop but requires explicit activation by an admin. Toggle this setting **on** to allow your users to install Devin CLI directly from the Devin Desktop Command Palette. Once enabled, users can open the Command Palette (Cmd+Shift+P on macOS or Ctrl+Shift+P on Windows/Linux) and run **Install Devin CLI** to add the `devin` binary to their PATH. This setting is available on **Legacy Windsurf Enterprise** and **Devin Enterprise** plans and is **off by default**. ## Further Reading To understand how to configure Devin CLI further, see the [Configuration documentation](/cli/reference/configuration/config-file). # Legacy Windsurf Auth Source: https://docs.devin.ai/cli/enterprise/windsurf-auth Authenticate to Devin CLI using your existing legacy Windsurf enterprise account ## Overview Enterprise users can authenticate to Devin CLI using their existing legacy Windsurf enterprise accounts. This provides a seamless experience for organizations already using Windsurf, with billing handled through the standard **Windsurf legacy credit model**. User management, team organization, SSO, RBAC, billing, and consumption are all inherited natively through the Windsurf dashboard. For most of your organizational needs, you should rely on the [Windsurf dashboard](https://windsurf.com). Legacy Windsurf authentication for Devin CLI is available to **legacy Windsurf Enterprise** customers. Contact your account executive if you have questions about authentication, billing, or access. ## Getting Started ### Prerequisites Before using legacy Windsurf authentication, ensure that: 1. Your organization has a legacy Windsurf enterprise account 2. You have an active legacy Windsurf user account that can use the agentic tools No additional permissions are required to access Devin CLI. If your legacy Windsurf enterprise users can use Windsurf, they can use Devin CLI. ### Installation via Devin Desktop Devin CLI is bundled with Devin Desktop. An admin must first enable the option in [Devin CLI Team Settings](https://windsurf.com/team/cli-settings) — see [Team Settings](/cli/enterprise/team-settings#show-install-devin-cli-in-the-devin-desktop-command-palette) for details. Once enabled, open the Command Palette (Cmd+Shift+P / Ctrl+Shift+P) and run **Install Devin CLI**. Alternatively, you can install using the standalone installer — see the [Quickstart](/cli/) for instructions. ### Authenticating To authenticate with your legacy Windsurf enterprise account: ```bash theme={null} devin auth login ``` Follow the prompts and be sure to select the **Log in with Windsurf for Enterprise** option to authenticate through your organization's identity provider. ### Credentials file location After `devin auth login`, Devin CLI stores your API token in `credentials.toml`. By default, this token is persistent and does not expire. You can copy the credentials file between your own machines to reuse the same authentication, but treat it as sensitive: anyone with this file can authenticate as you. Do not share it or commit it to source control. | Platform | Location | | ------------- | ---------------------------------------------------------------------------------------------------------------------- | | macOS / Linux | `$XDG_DATA_HOME/devin/credentials.toml` when `XDG_DATA_HOME` is set; otherwise `~/.local/share/devin/credentials.toml` | | Windows | `%APPDATA%\devin\credentials.toml` (typically `C:\Users\\AppData\Roaming\devin\credentials.toml`) | Run `devin auth logout` to remove stored credentials. ## Billing & Analytics Usage through Devin CLI is billed using the standard **Windsurf legacy credit model**. All Devin CLI usage counts toward your organization's existing legacy Windsurf enterprise allocation. The analytics and billing systems are shared between Windsurf and Devin CLI. Use the [Team Members dashboard](https://windsurf.com/team/members) to manage team organization or view consumption metrics across both products. On prompt-based plans, each subagent consumes additional credits, just like a user message does. The number of credits depends on the model the subagent uses, so tasks that spawn multiple subagents (or [nest](/cli/subagents#nesting-depth) them) consume more credits. Enterprise admins can also access usage analytics programmatically through the [Analytics API](/desktop/accounts/api-reference/api-introduction) to monitor consumption across their organization. For details about credit billing and usage tracking, refer to your enterprise agreement or contact your account executive. ## Further Reading For more information about legacy Windsurf enterprise features, see the [Devin Desktop documentation](/desktop/getting-started): * [Guide for Admins](/desktop/guide-for-admins) — Administration and team management * [SSO & SCIM](/desktop/accounts/sso-scim) — Single sign-on and user provisioning * [API Reference](/desktop/accounts/api-reference/api-introduction) — Access analytics and usage data # Essential Commands Source: https://docs.devin.ai/cli/essential-commands If you remember nothing else... ## Starting Devin CLI By default, sessions happen in a REPL, a graphical terminal interface where you can chat back and forth and observe Devin's actions. ```bash theme={null} devin # Start interactive REPL (no prompt) devin -- your prompt here # Start REPL with initial prompt devin -p "prompt" # Single-turn, no REPL: print response to stdout and exit devin -p -- prompt words here # Same, using -- separator (still works) ``` Use `--` before your prompt so it is interpreted as a prompt and not a subcommand. Single-turn mode (`-p`) is great for scripts and automations. Type `@` in the prompt input to open autocomplete for local files/directories. Selecting one adds it as context for your message. You can paste images from your clipboard with **Ctrl+V**. Attached images appear in the input area and can be managed with **Left/Right** to navigate and **Backspace** to remove. ## Running shell commands Devin may run shell commands while working. If a command is still running after the default wait period, Devin moves it to the background and shows how long it waited along with the background shell ID. Devin can then continue working and check the command's output later. *** ## Modes Devin CLI has 4 built-in permission modes: **Normal**, **Accept Edits**, **Bypass**, and **Autonomous**, and 3 agent-modes: **Normal**, **Plan**, and **Ask**. For plan and ask, use `/plan` and `/ask`. Auto-approves read-only tools within the current directory, and asks for permission for write/execute operations. ```bash theme={null} /normal # or /mode normal ``` This is the default mode. Auto-approves file edits within the workspace while still prompting for shell commands and other actions. We expect people to spend most of their time here. ```bash theme={null} /accept-edits # or /mode accept-edits ``` Auto-approves **all** tool calls, including writes and shell commands. ```bash theme={null} /bypass # or /mode bypass ``` You can also start in bypass mode: ```bash theme={null} devin --permission-mode bypass ``` Aliases: `/yolo`, `/dangerous` Bypass mode **never** overrides organization-level permissions configured by your admin via [Team Settings](/cli/enterprise/team-settings). Admin-enforced deny and ask rules **always** take priority. Roughly equivalent to Accept Edits in the current workspace, with the additional ability to run any shell command within an [OS-level sandbox](/cli/reference/configuration/config-file#sandbox) (to contain what those commands can actually touch). ```bash theme={null} devin --sandbox --permission-mode autonomous ``` Autonomous is the **only** permission mode available when running with `--sandbox`, and it is selected automatically — Normal, Accept Edits, and Bypass are hidden in sandbox sessions. In Autonomous mode... * You are prompted for **capabilities rather than commands**. * Commands respect the `Write` and `Read` scopes via a filesystem sandbox. * Commands prompt you when they try to connect to network resources. * Read-only operations within the current directory auto-approve. Autonomous relies on the sandbox for safety. Without `--sandbox`, the mode is unavailable — use Bypass if you want unattended execution without OS-level isolation. See [Bypass vs Autonomous](#bypass-vs-autonomous) below for a direct comparison. ### Bypass vs Autonomous Bypass and Autonomous both reduce approval prompts, but they rely on different safety mechanisms: | | Bypass | Autonomous | | ------------------------------------------------------------- | --------------------------- | ----------------------------------------------------------------------------------------------------- | | Requires `--sandbox` | No | Yes (only available in sandbox sessions) | | Shell commands | Auto-approved, unrestricted | Auto-approved, contained by the sandbox | | File writes via `edit`/`write` tools | Auto-approved anywhere | Still prompt (granting a scope expands the sandbox) | | Network access | Unrestricted | Filtered by the sandbox's [domain allow/deny lists](/cli/reference/configuration/config-file#sandbox) | | Respects admin [Team Settings](/cli/enterprise/team-settings) | Yes | Yes | Pick Bypass when you trust the agent with your whole machine. Pick `--sandbox` (which selects Autonomous) when you want unattended execution with OS-enforced limits on what files and domains the agent can touch. If you like the feel of bypass but want the agent to have its own computer, try cloud Devin! ## Session History Your conversation history is saved so you can resume a session later. ```bash theme={null} devin -c # Continue the most recent session in the current directory devin --continue devin -r # Pick from recent sessions devin --resume devin -r brisk-otter # Resume a specific session by ID ``` *** ## Slash Commands You can use these commands while in an active session. ### Navigation & Control | Command | Description | | ------------------ | ---------------------------------------- | | `/help` | See all available commands | | `/exit` or `/quit` | Exit the application | | `/clear` or `/new` | Clear conversation history (start fresh) | You can also type `exit` or `quit` as plain text (without the `/` prefix) to exit. ### Mode Switching | Command | Description | | ----------------- | ------------------------------------------------------------------------------------------ | | `/mode` | Show current mode | | `/mode ` | Switch mode (`normal`, `accept-edits`, `plan`, `bypass`; `autonomous` in sandbox sessions) | | `/normal` | Switch to Normal mode (default) | | `/plan` | Switch to Plan mode | | `/ask ` | Ask a question without making code changes (oneshot) | | `/bypass` | Switch to Bypass mode (aliases: `/yolo`, `/dangerous`) | ### Model Switching | Command | Description | | -------- | ------------------- | | `/model` | Show model selector | ### Session Management | Command | Description | | ------------------ | ------------------------------------------------------------------- | | `/resume` | Open the interactive session picker | | `/resume ` | Resume session by ID | | `/ls` | List recent sessions in current directory (alias: `/list-sessions`) | | `/ls --all` | List all sessions across all directories | | `/continue` | Resume most recent session | | `/continue ` | Resume session by ID | | `/rm-session ` | Irreversibly delete a session by ID | ### Workspace | Command | Description | | ---------------------- | ------------------------------------------------- | | `/workspace` | List workspace directories (alias: `/workspaces`) | | `/add-dir ` | Add additional workspace directory | | `/undo-add-dir ` | Remove a workspace directory | ### Automation | Command | Description | | ---------------- | ------------------------------------------------------------------------------------ | | `/loop ` | Run a prompt then auto-review the diff in a loop (requires clean git state to start) | ### Extensibility | Command | Description | | -------- | ------------------------------------------------------------------- | | `/hooks` | List all loaded hooks with their IDs, event types, and source paths | ### Account & System | Command | Description | | ---------- | ---------------------------------------- | | `/login` | Authenticate with Devin | | `/logout` | Clear stored credentials and exit | | `/update` | Check for and install updates | | `/upgrade` | Upgrade your subscription plan | | `/bug` | Report a bug to the Devin CLI developers | | `/compact` | Force conversation compaction | If you installed Devin for Terminal via Homebrew, `/update` will direct you to use `brew upgrade devin` instead of performing a self-update. *** ## Keyboard Shortcuts Here are the most important keyboard shortcuts. See [Keyboard Shortcuts](/cli/reference/keyboard-shortcuts) for more shortcuts. | Shortcut | Description | | -------------------------- | -------------------------------------------------------------------- | | `Shift+Tab` | Cycle between modes (Normal, Accept Edits, Plan, Bypass, Autonomous) | | `Ctrl+C` | Clear input text, or cancel the running agent | | `Esc` | Cancel the running agent | | `Shift+Enter` | Insert a newline (multi-line input) | | `Ctrl+V` or `Shift+Insert` | Paste from clipboard | | `Ctrl+G` | Open external editor | | `Ctrl+O` | Open full-screen thinking trace viewer | | `@` | Mention files to add as context | # Configuration Source: https://docs.devin.ai/cli/extensibility/configuration How to configure Devin CLI behavior with config files Devin CLI is configured through JSON files (with comment support) at the user and project level. These config files control the agent's model, permissions, MCP servers, and more. *** ## Config File Locations **Path:** `~/.config/devin/config.json` Your personal defaults that apply across all projects. This is where you set your preferred model, theme, and global permissions. You can also place an `AGENTS.md` file in this directory (`~/.config/devin/AGENTS.md`) to define [global rules](/cli/extensibility/rules#global-rules) that apply to every project. On Windows, this path is `%APPDATA%\devin\config.json` (typically `C:\Users\\AppData\Roaming\devin\config.json`). ```json theme={null} { "agent": { "model": "claude-sonnet-4.5" }, "permissions": { "allow": ["Read(**)", "Exec(git)"] } } ``` **Path:** `.devin/config.json` (at your project root) Shared team configuration committed to version control. Use this for project-specific MCP servers, permission policies, and import settings. ```json theme={null} { "permissions": { "allow": ["Exec(npm run)", "Read(src/**)"], "deny": ["Exec(sudo)"] }, "mcpServers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"] } } } ``` **Path:** `.devin/config.local.json` Personal overrides for this project that aren't committed to git (automatically gitignored). Use this for secrets, API keys, and personal preference overrides. ```json theme={null} { "mcpServers": { "github": { "env": { "GITHUB_TOKEN": "ghp_your_token" } } } } ``` *** ## What You Can Configure Choose which AI model powers the agent — from Claude Opus to GPT 5.2 to Gemini 3. Pre-approve safe actions, block dangerous ones, and control what the agent can do without asking. Connect external tool servers for GitHub, Linear, databases, and any custom APIs. Import rules, skills, and configuration from Cursor, Windsurf, and Claude Code. *** ## Quick Start The fastest way to get started is to create a `.devin/config.json` in your project root: ```json theme={null} { "permissions": { "allow": [ "Read(**)", "Exec(git)", "Exec(npm run)" ] } } ``` This pre-approves file reads and common commands so the agent doesn't prompt you for every action. You can also configure Devin CLI interactively: when the agent asks for permission, choose to save the decision to your project or user config for next time. *** ## Project vs User Settings Not all settings are available at every level. Project configs (`.devin/config.json` and `.devin/config.local.json`) support: * **`permissions`** — allow, deny, and ask rules * **`mcpServers`** — MCP server definitions * **`read_config_from`** — import settings from Cursor, Windsurf, and Claude * **`hooks`** — lifecycle hooks ([see Hooks](/cli/extensibility/hooks/overview)) All other settings — including `agent` (model), `theme_mode`, `unicode_mode`, `show_path`, `sandbox`, and other display/behavior options — are **user-config only** and can only be set in the user config (`~/.config/devin/config.json`; `%APPDATA%\devin\config.json` on Windows). *** ## Configuration Precedence For settings that support multiple levels, higher-priority sources win: | Priority | Source | Shared? | | ----------- | ------------------------------------------------------------------------------ | ---------------- | | 1 (highest) | Organization / Team settings | Yes (enterprise) | | 2 | Session grants (interactive approvals) | No (in-memory) | | 3 | Project local (`.devin/config.local.json`) | No (gitignored) | | 4 | Project (`.devin/config.json`) | Yes (committed) | | 5 (lowest) | User (`~/.config/devin/config.json`; `%APPDATA%\devin\config.json` on Windows) | No (personal) | Permissions are merged across levels, while MCP servers are merged by name (higher-priority source wins for same-named servers). Organization-level (enterprise) settings can **never** be overridden by project or user config. See [Configuration Precedence](/cli/reference/configuration/global-vs-local) for full details on how merging works. *** ## Limitations Devin CLI does not support `.codeiumignore` files. If you use Codeium's autocomplete and have configured ignore patterns, those patterns will not apply to Devin CLI. *** ## Learn More Complete list of every configuration option and its format. How global, project, and local settings interact and merge. # Lifecycle Hooks Source: https://docs.devin.ai/cli/extensibility/hooks/lifecycle-hooks Understanding hook events and the data available at each stage Each hook event fires at a specific point in the agent's lifecycle. Use the **matcher** field (a regex matched against the hook event's `tool_name`) to filter which tool invocations trigger your hook. *** ## PreToolUse Fires **before** a tool executes. Use this to block, modify, or add context to tool calls. **Stdin data:** | Field | Description | Example | | ------------ | ----------------------------- | ----------------------------------------------- | | `tool_name` | Name of the tool being called | `exec`, `edit`, `mcp__github__create_issue` | | `tool_input` | Arguments passed to the tool | `{ "command": "rm -rf /", "shell_id": "main" }` | **Example — Block destructive commands:** ```json theme={null} { "PreToolUse": [ { "matcher": "exec", "hooks": [ { "type": "command", "command": "python3 -c \"import sys, json; data = json.load(sys.stdin); cmd = data.get('tool_input', {}).get('command', ''); sys.exit(2 if 'rm -rf' in cmd else 0)\"" } ] } ] } ``` **Example — Require confirmation for writes outside src/:** Use a script that inspects the tool input and returns a decision: ```json theme={null} { "PreToolUse": [ { "matcher": "edit", "hooks": [ { "type": "command", "command": "./scripts/check-edit-path.sh", "timeout": 5 } ] } ] } ``` **Example — Rewrite commands before execution:** A hook can transparently rewrite the tool's input by printing `hookSpecificOutput.updatedInput` to stdout (see [Output format](/cli/extensibility/hooks/overview#output-format)). For example, a hook script that routes shell commands through a wrapper: ```json theme={null} { "hookSpecificOutput": { "hookEventName": "PreToolUse", "updatedInput": { "command": "rtk git status" } } } ``` The rewritten arguments are merged into the tool call before it runs — the agent executes the updated command instead of the original. *** ## PostToolUse Fires **after** a tool finishes executing. Use this for logging, validation, or triggering follow-up actions. **Stdin data:** | Field | Description | | --------------- | -------------------------------------------------------------------------------- | | `tool_name` | Name of the tool that ran | | `tool_input` | Arguments that were passed | | `tool_response` | Object with `success` (boolean), `output` (string), and `error` (string or null) | **Example — Log all shell commands:** ```json theme={null} { "PostToolUse": [ { "matcher": "exec", "hooks": [ { "type": "command", "command": "sh -c 'cat >> ~/.devin-command-log'" } ] } ] } ``` *** ## PermissionRequest Fires when the agent needs a permission decision. Use this to implement custom approval logic. **Stdin data:** | Field | Description | | ------------ | --------------------------- | | `tool_name` | Tool requesting permission | | `tool_input` | Arguments for the tool call | **Example — Auto-approve git commands:** ```json theme={null} { "PermissionRequest": [ { "matcher": "exec", "hooks": [ { "type": "command", "command": "python3 -c \"import sys, json; data = json.load(sys.stdin); cmd = data.get('tool_input', {}).get('command', ''); print(json.dumps({'decision': 'approve'})) if cmd.startswith('git ') else sys.exit(0)\"" } ] } ] } ``` *** ## UserPromptSubmit Fires when the user submits a message. Use this to add context or trigger workflows. **Stdin data:** | Field | Description | | -------- | ----------------------- | | `prompt` | The user's message text | **Example — Inject context on every prompt:** ```json theme={null} { "UserPromptSubmit": [ { "matcher": "", "hooks": [ { "type": "command", "command": "echo '{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"Deploys require an approved change ticket.\"}}'" } ] } ] } ``` The command prints `additionalContext` inside a `hookSpecificOutput` object on stdout, tagged with the event name. That text is injected into the agent's context: ```json theme={null} { "hookSpecificOutput": { "hookEventName": "UserPromptSubmit", "additionalContext": "Deploys require an approved change ticket." } } ``` *** ## Stop Fires when the agent decides to stop (finish its turn). Use this to add follow-up instructions or prevent premature stopping. **Stdin data:** | Field | Description | | ------------------ | ------------------------------------- | | `stop_hook_active` | Whether a stop hook is already active | **Example — Remind agent to run tests:** ```json theme={null} { "Stop": [ { "matcher": "", "hooks": [ { "type": "command", "command": "echo '{\"decision\": \"block\", \"reason\": \"Please run the test suite before stopping.\"}'" } ] } ] } ``` Be careful with stop hooks that block — they can cause the agent to loop if the condition isn't eventually satisfied. *** ## PostCompaction Fires **after** context compaction completes successfully. Use this for logging, triggering follow-up actions, or re-injecting context that may have been lost during compaction. **Stdin data:** | Field | Description | | --------- | -------------------------------------------------------------------------------- | | `summary` | Summary text produced by the compactor (may be null if no summary was generated) | **Example — Log compaction events:** ```json theme={null} { "PostCompaction": [ { "matcher": "", "hooks": [ { "type": "command", "command": "sh -c 'cat >> ~/.devin-compaction-log'" } ] } ] } ``` *** ## SessionStart Fires when a new session begins. Use this for initialization, logging, or environment setup. **Stdin data:** | Field | Description | | -------- | --------------------------- | | `source` | How the session was started | **Example — Run setup script:** ```json theme={null} { "SessionStart": [ { "matcher": "", "hooks": [ { "type": "command", "command": "./scripts/dev-setup.sh", "timeout": 10 } ] } ] } ``` A SessionStart command can also inject context by printing `additionalContext` inside a `hookSpecificOutput` object on stdout: ```json theme={null} { "hookSpecificOutput": { "hookEventName": "SessionStart", "additionalContext": "Session started. Project uses ESM imports only." } } ``` *** ## SessionEnd Fires when a session ends. Use this for cleanup or final logging. **Stdin data:** | Field | Description | | -------- | --------------------- | | `reason` | Why the session ended | *** ## Matching Multiple Events A single hooks file can define hooks for multiple events: ```json theme={null} { "PreToolUse": [ { "matcher": "", "hooks": [ { "type": "command", "command": "./scripts/audit.sh" } ] } ], "PostToolUse": [ { "matcher": "", "hooks": [ { "type": "command", "command": "./scripts/audit.sh" } ] } ] } ``` ## Using the Matcher The `matcher` field is a **regex** matched against the hook event's `tool_name`. It is available for tool-related events: `PreToolUse`, `PostToolUse`, and `PermissionRequest`. For non-tool events (`UserPromptSubmit`, `Stop`, `PostCompaction`, `SessionStart`, and `SessionEnd`), there is no `tool_name`; use `""` or omit the matcher to run the hook for every event of that type. The matcher is not a permission glob. Patterns like `mcp__github__*` are useful in permissions, but hook matchers are regexes. Use `mcp__github__.*` in a hook matcher. | Matcher | Matches | | ------------------------------- | ---------------------------------------------------- | | `""` (empty) or omitted | All tool names for tool events | | `"exec"` | Tool names containing `exec` | | `"^exec$"` | Only the `exec` tool | | `"^(exec\|edit)$"` | Only `exec` or `edit` | | `"^mcp__.*"` | All MCP tools | | `"^mcp__github__.*"` | All tools from the `github` MCP server | | `"^mcp__github__create_issue$"` | The `create_issue` tool from the `github` MCP server | ### Tool names you can match Hook matchers run against the same externally-visible tool names that hook scripts receive in stdin as `tool_name`. The exact tool names available can vary by CLI mode, model, and enabled integrations. The most common public core tool names are: * `read` * `edit` * `grep` * `glob` * `exec` MCP server tools appear as `mcp____`. For example, a `github` MCP server tool named `create_issue` appears as `mcp__github__create_issue`. For other tools, match the exact `tool_name` shown in hook stdin. To confirm the complete set available in your current session, add a temporary `PostToolUse` hook with `matcher: ""` and log the stdin payload. # Hooks Source: https://docs.devin.ai/cli/extensibility/hooks/overview Run custom logic when specific events occur during a session Hooks let you run custom logic in response to events in the agent's lifecycle. You can use hooks to enforce policies, add context, log actions, modify permissions, or integrate with external systems. Hooks are configured with a JSON format. Place them in your project's `.devin/` directory (or a user-level config) and Devin CLI runs them at the matching lifecycle events. Existing hooks in `.claude/` directories are also picked up automatically — see [Where Hooks Live](#where-hooks-live). *** ## What Can Hooks Do? Block dangerous commands, require confirmation for specific actions, or restrict file access. Inject additional instructions or information when specific tools are called. Execute scripts, send notifications, or log events when things happen. Dynamically grant or restrict permissions based on the situation. *** ## Quick Example Create `.devin/hooks.v1.json` in your project: ```json theme={null} { "PreToolUse": [ { "matcher": "exec", "hooks": [ { "type": "command", "command": "./scripts/check-command.sh" } ] } ] } ``` This runs `./scripts/check-command.sh` before every shell command execution. The script receives event data on stdin and can block the action by returning a non-zero exit code. *** ## Hook Events Hooks can respond to these lifecycle events: | Event | When it fires | | ------------------- | ------------------------------------ | | `PreToolUse` | Before a tool executes | | `PostToolUse` | After a tool finishes | | `PermissionRequest` | When a permission decision is needed | | `UserPromptSubmit` | When the user submits a message | | `Stop` | When the agent wants to stop | | `SessionStart` | When a session begins | | `SessionEnd` | When a session ends | See [Lifecycle Hooks](/cli/extensibility/hooks/lifecycle-hooks) for details on each event and its available data. *** ## Hook Format Each hook has a **type** (`command` or `prompt`), an optional **matcher** (regex on the hook event's `tool_name`), and configuration: ```json theme={null} { "PreToolUse": [ { "matcher": "exec", "hooks": [ { "type": "command", "command": "./scripts/validate.sh", "timeout": 10 } ] } ] } ``` | Field | Description | | --------- | -------------------------------------------------------------------------------------------------------------- | | `matcher` | Regex matched against the hook event's `tool_name`. Empty string or an omitted matcher matches all tool names. | | `type` | `"command"` to run a shell command, or `"prompt"` to evaluate an LLM prompt. | | `command` | Shell command to run (for `command` type). | | `prompt` | LLM prompt to evaluate (for `prompt` type). | | `timeout` | Timeout in seconds (optional). | ### Command Hooks Command hooks run a shell command. Event data is passed as JSON on **stdin**, and the command can return JSON on **stdout** to control the outcome (see [Output format](#output-format) below). **Input** (stdin): ```json theme={null} { "hook_event_name": "PreToolUse", "tool_name": "exec", "tool_input": { "command": "rm -rf /" } } ``` The `DEVIN_PROJECT_DIR` environment variable is automatically set to the project root directory. See [Using the Matcher](/cli/extensibility/hooks/lifecycle-hooks#using-the-matcher) for the built-in tool names and MCP tool name format you can match. ### Output format A command hook can print a JSON object to **stdout** to control the outcome. To approve or block an action, return a top-level `decision` (with an optional `reason`): ```json theme={null} { "decision": "block", "reason": "Destructive command blocked by policy" } ``` To inject text into the agent's context, return `additionalContext` inside a `hookSpecificOutput` object tagged with the event name: ```json theme={null} { "hookSpecificOutput": { "hookEventName": "UserPromptSubmit", "additionalContext": "Remember: deploys require an approved change ticket." } } ``` To transparently rewrite a tool's input before it executes, return `updatedInput` inside a `PreToolUse` `hookSpecificOutput`. Fields in `updatedInput` are merged into the tool's arguments, so you can update a subset (e.g. just `command`): ```json theme={null} { "hookSpecificOutput": { "hookEventName": "PreToolUse", "updatedInput": { "command": "rtk git status" } } } ``` | Output field | Description | | -------------------------------------- | -------------------------------------------------------------------------------------------------- | | `decision` | `"approve"` to allow the action, or `"block"` to deny it | | `reason` | Explanation shown to the agent | | `hookSpecificOutput.hookEventName` | Event the output applies to (e.g. `UserPromptSubmit`, `SessionStart`, `PreToolUse`, `PostToolUse`) | | `hookSpecificOutput.additionalContext` | Text injected into the agent's context (for `UserPromptSubmit`, `SessionStart`, `PostToolUse`) | | `hookSpecificOutput.updatedInput` | Object merged into the tool's arguments before execution (for `PreToolUse`) | ### Exit Codes | Code | Meaning | | ----- | --------------------------------- | | 0 | Success — hook continues normally | | 2 | Block — action is denied | | Other | Error — logged but doesn't block | *** ## Where Hooks Live Devin CLI reads hooks from the following locations. All use the same JSON format. ### Project-Level | Location | Description | | ----------------------------- | ------------------------------------------ | | `.devin/hooks.v1.json` | Standalone hooks file (recommended) | | `.devin/config.json` | `"hooks"` key in the config file | | `.devin/config.local.json` | `"hooks"` key (local override, gitignored) | | `.claude/settings.json` | `"hooks"` key (Claude Code format) | | `.claude/settings.local.json` | `"hooks"` key (Claude Code format) | ### User-Level (Global) | Location | Description | | ------------------------------------------------------------------------ | ---------------------------------- | | `~/.config/devin/config.json` (`%APPDATA%\devin\config.json` on Windows) | `"hooks"` key in user config | | `~/.claude.json` | `"hooks"` key (Claude Code format) | | `~/.claude/settings.json` | `"hooks"` key (Claude Code format) | | `~/.claude/settings.local.json` | `"hooks"` key (Claude Code format) | In `.devin/hooks.v1.json`, the hooks object is the **entire file** (no wrapper key needed). In all other locations, hooks are nested under the `"hooks"` key in a settings file. Hooks from `.claude/` paths are loaded when `read_config_from.claude` is enabled (the default). You can disable this in your [user config](/cli/reference/configuration/read-config-from) if needed. *** ## Verifying Hooks Use the `/hooks` slash command to see all currently loaded hooks and their source files: ``` /hooks ``` *** ## Next Steps Deep dive into each event type and what data is available. Control which config locations Devin CLI reads hooks from. # Extensibility Overview Source: https://docs.devin.ai/cli/extensibility/index Customize and extend Devin CLI with rules, skills, and MCP servers Devin CLI is designed to be deeply customizable. You can shape how the agent behaves, what tools it has access to, and how it responds to events — all through configuration files in your project or home directory. Provide always-on context and instructions that guide the agent's behavior across every session. Create reusable prompts and workflows the agent can invoke as slash commands or use autonomously. Install and share bundles of skills across projects. Define specialized subagent profiles with their own system prompts, tools, and models. Connect external tool servers to give the agent access to APIs, databases, and more. Run shell commands or LLM prompts at key points in the agent's lifecycle to enforce policies and automate workflows. *** ## How It All Fits Together These features work at different layers: * **Rules** shape the agent's personality and constraints — they're always active. * **Skills** give the agent new capabilities it can invoke on demand. * **Custom Subagents** define specialized worker profiles the agent can delegate tasks to. * **MCP Servers** provide entirely new tools the agent can call. * **Hooks** run shell commands or LLM prompts at lifecycle events (e.g., before a tool runs) to enforce policies or trigger workflows. You can combine all of these in a single project. For example, you might have an `AGENTS.md` file with coding standards, a `review` skill for code review, an MCP server for your issue tracker, and hooks to block destructive commands. *** ## Where Configuration Lives All project-level extensibility configuration lives in the `.devin/` directory at your project root: ``` my-project/ ├── .devin/ │ ├── config.json # Project config (MCP, permissions) │ ├── config.local.json # Personal overrides (gitignored) │ ├── hooks.v1.json # Lifecycle hooks (Claude Code compatible) │ ├── skills/ │ │ └── review/ │ │ └── SKILL.md # A custom skill │ └── agents/ │ └── reviewer/ │ └── AGENT.md # A custom subagent profile ├── AGENTS.md # Project rules └── src/ ``` User-level configuration lives in `~/.config/devin/` and applies to all projects. On Windows, this path is `%APPDATA%\devin\` instead. Files with `.local.` in the name are automatically excluded from git, so you can have personal overrides without affecting your team. *** ## Importing From Other Tools Devin CLI can read configuration from other AI coding tools you may already use: | Source | What's Imported | | -------------------------------------------- | --------------------------------------------------------------------------------------------------------- | | `AGENTS.md` / `AGENT.md` / `CLAUDE.md` | Rules (always-on context) | | `.cursor/rules/*.md` / `.cursor/rules/*.mdc` | Rules | | `.windsurf/rules/*.md` | Rules | | `.claude/` directory | Commands, [custom subagents](/cli/subagents#custom-subagents), [hooks](/cli/extensibility/hooks/overview) | This means you can start using Devin CLI without rewriting your existing configuration. Import is enabled by default and can be controlled in your config file: ```json theme={null} { "read_config_from": { "cursor": true, "windsurf": true, "claude": true } } ``` Set any provider to `false` to disable importing from it. # MCP Configuration Source: https://docs.devin.ai/cli/extensibility/mcp/configuration How to add, configure, and manage MCP servers ## Adding MCP Servers ### Via Command Line The quickest way to add an MCP server: ```bash theme={null} # stdio server — just pass the command after -- devin mcp add -- [args...] # HTTP server — pass the URL as a positional argument devin mcp add # HTTP server — or use the --url flag devin mcp add --url ``` The transport type is inferred automatically: a URL implies HTTP (Streamable HTTP), and trailing args (or `--command`) imply stdio. Remote MCP servers use Streamable HTTP by default. If the server responds with an HTTP 4xx error, the CLI falls back to SSE on the same URL. Set `"transport": "sse"` explicitly if needed — see [Legacy SSE fallback](#legacy-sse-fallback) below. By default, servers are saved to **local** scope (`.devin/config.local.json`, gitignored). Use `-s`/`--scope` to change: ```bash theme={null} devin mcp add -s project # shared via .devin/config.json devin mcp add -s user # global (~/.config/devin/config.json; %APPDATA%\devin\config.json on Windows) ``` You can also manage servers from the command line: ```bash theme={null} devin mcp list # List all configured servers devin mcp get # Show details for a specific server devin mcp remove # Remove a configured server devin mcp login # Authenticate with a server via OAuth devin mcp logout # Remove stored OAuth credentials devin mcp enable # Enable a disabled server devin mcp disable # Disable a server without removing it ``` ### Via Config File Add servers directly to your config file's `mcpServers` section: ```json theme={null} // .devin/config.json { "mcpServers": { "server-name": { "command": "npx", "args": ["-y", "@company/mcp-server"], "env": { "API_KEY": "your-key" } } } } ``` Project-level servers are shared with your team via version control. ```json theme={null} // ~/.config/devin/config.json { "mcpServers": { "my-server": { "command": "node", "args": ["/path/to/my-server.js"], "env": {} } } } ``` User-level servers apply to all your projects. ```json theme={null} // .devin/config.local.json { "mcpServers": { "server-name": { "command": "npx", "args": ["-y", "@company/mcp-server"], "env": { "API_KEY": "my-personal-key" } } } } ``` Local configs are gitignored — use these for personal API keys. *** ## Server Configuration Options MCP servers can be configured in two ways: as a **local command** (stdio transport) or as a **remote server** (HTTP transport). ### Local Command (stdio) | Field | Type | Required | Description | | ---------- | --------- | -------- | --------------------------------------------------------------------------------------------------------- | | `command` | string | Yes | The executable to run | | `args` | string\[] | No | Command-line arguments | | `env` | object | No | Environment variables to set | | `disabled` | boolean | No | Set to `true` to skip this server (see [Enabling and disabling servers](#enabling-and-disabling-servers)) | ### Remote Server (Streamable HTTP) | Field | Type | Required | Description | | ------------------- | ------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `url` | string | Yes | The URL of the MCP server endpoint | | `transport` | string | No | `"http"` (Streamable HTTP, default for URL-based servers) or `"sse"` (legacy SSE). When set to `"http"` or omitted, the CLI tries Streamable HTTP first and falls back to SSE on 4xx errors ([per spec](https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/transports/#backwards-compatibility)). Set `"sse"` explicitly if the server's SSE endpoint is at a different path. | | `headers` | object | No | Custom HTTP headers to include in requests | | `oauthClientId` | string | No | Pre-registered OAuth client ID, for servers that don't support dynamic client registration (DCR), e.g. GitHub. See the "Pre-registered OAuth clients" section below. | | `oauthClientSecret` | string | No | OAuth client secret, for confidential clients. Pair with `oauthClientId`. | | `disabled` | boolean | No | Set to `true` to skip this server (see [Enabling and disabling servers](#enabling-and-disabling-servers)) | ### Examples ```json theme={null} { "mcpServers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_TOKEN": "ghp_..." } } } } ``` ```json theme={null} { "mcpServers": { "notion": { "url": "https://mcp.notion.com/mcp", "transport": "http" } } } ``` After adding an OAuth-based server, run `devin mcp login notion` to authenticate. See [Authentication](#authentication) below. ```json theme={null} { "mcpServers": { "linear": { "url": "https://mcp.linear.app/mcp", "transport": "http" } } } ``` ```json theme={null} { "mcpServers": { "atlassian": { "url": "https://mcp.atlassian.com/v1/mcp", "transport": "http" } } } ``` After adding, run `devin mcp login atlassian` to authenticate. Each MCP client (Windsurf, Claude Code, Devin CLI) maintains its own OAuth session, so you must log in separately even if you've already authenticated in another tool. ```json theme={null} { "mcpServers": { "my-tools": { "command": "python", "args": ["./scripts/mcp-server.py"], "env": { "DB_URL": "postgres://localhost/mydb" } } } } ``` *** ## Authentication Some remote MCP servers require OAuth authentication. After adding an OAuth-based server to your config, authenticate using the `login` command: ```bash theme={null} devin mcp login ``` For example: ```bash theme={null} devin mcp login notion # Authenticate with Notion devin mcp login linear # Authenticate with Linear ``` This opens a browser window where you can authorize access. The OAuth tokens are stored locally and refreshed automatically. You can optionally request specific OAuth scopes: ```bash theme={null} devin mcp login notion --scopes read,write ``` To remove stored OAuth credentials for a server: ```bash theme={null} devin mcp logout ``` If the server supports OAuth, you will also be prompted to authenticate automatically when the server is first used. ### Pre-registered OAuth clients Most OAuth-based MCP servers support [dynamic client registration](https://datatracker.ietf.org/doc/html/rfc7591) (DCR), so Devin CLI registers itself automatically and you don't need to provide any client credentials. Some providers (e.g. GitHub) don't support DCR and instead require a **pre-registered** OAuth client. For those, supply the client ID — and a client secret if it's a confidential client — via `oauthClientId` / `oauthClientSecret`: ```json theme={null} { "mcpServers": { "my-server": { "url": "https://mcp.example.com/mcp", "transport": "http", "oauthClientId": "Iv1.abc123def456", "oauthClientSecret": "${env:MY_MCP_CLIENT_SECRET}" } } } ``` When `oauthClientId` is set, Devin CLI skips dynamic client registration and uses your pre-registered client during the OAuth flow. Run `devin mcp login ` (or trigger first use) to authenticate as usual. You can also set these from the command line when adding or logging into a server: ```bash theme={null} devin mcp add my-server --oauth-client-id --oauth-client-secret devin mcp login my-server --oauth-client-id --oauth-client-secret ``` `oauthClientId` / `oauthClientSecret` are OAuth client credentials used during the authorization flow. They are **not** generic per-request credentials — if a server expects a static token, use `headers` (HTTP) or `env` (stdio) instead. Don't commit a client secret to a shared config. Reference it from an environment variable (`${env:VAR}`), read it from a file (`${file:/path}`), or put it in `.devin/config.local.json` (gitignored). See the "Managing Secrets" section below. *** ## Enabling and Disabling Servers You can temporarily disable an MCP server without removing its configuration. A disabled server is skipped during tool discovery — its tools won't appear and the server process won't be started. ```bash theme={null} devin mcp disable # Disable a server devin mcp enable # Re-enable it ``` This sets the `"disabled": true` flag on the server entry in the config file. Use `-s`/`--scope` to target a specific scope: ```bash theme={null} devin mcp disable -s project my-server devin mcp enable -s user my-server ``` You can also set the flag directly in your config file: ```json theme={null} { "mcpServers": { "my-server": { "command": "npx", "args": ["-y", "@company/mcp-server"], "disabled": true } } } ``` Disabling is useful when you want to keep a server's configuration (including environment variables and OAuth credentials) but temporarily stop using it — for example, to reduce startup time or isolate an issue. *** ## Managing Secrets Never commit API keys or secrets to version control. Use `.devin/config.local.json` for sensitive values. For team projects, the recommended pattern is: 1. Define the server in `.devin/config.json` with placeholder or no env vars 2. Each team member adds their personal keys in `.devin/config.local.json` The local config file is automatically excluded from git. *** ## MCP Permissions You can pre-approve, deny, or force-ask for specific MCP tools in your permissions config: ```json theme={null} { "permissions": { "allow": [ "mcp__github__list_issues", "mcp__github__create_issue" ], "deny": [ "mcp__github__delete_repo" ], "ask": [ "mcp__linear__*" ] } } ``` **Permission matcher patterns:** | Pattern | Matches | | ------------------- | ------------------------------------ | | `mcp__server__tool` | A specific tool on a specific server | | `mcp__server__*` | All tools on a specific server | | `mcp__*` | All MCP tools on all servers | *** ## Organization restrictions If you're on an enterprise team, your admin may restrict which MCP servers you can connect to. A server you've configured can be blocked if MCP is disabled for your team, or if it isn't on your team's allowlist or in an enforced **MCP registry** — in which case it won't connect and its tools won't be available. See [Team Settings — MCP Registry](/cli/enterprise/team-settings#mcp-registry) for details. *** ## Troubleshooting If you see errors like `Auth required` or `AuthRequired` when connecting to a remote MCP server, the server requires OAuth authentication. Run: ```bash theme={null} devin mcp login ``` Each MCP client authenticates independently. Even if you've already authenticated in Windsurf or Claude Code, you need to run `devin mcp login` separately for Devin CLI. To verify your auth status, try removing and re-adding credentials: ```bash theme={null} devin mcp logout devin mcp login ``` Verify the command works outside Devin CLI: ```bash theme={null} npx -y @modelcontextprotocol/server-github ``` Check that all required environment variables are set. Ask the agent to list MCP servers and tools. The server may need a moment to initialize. Check your permissions config. MCP tools default to prompting for approval. Add them to `permissions.allow` to auto-approve. When connecting to an HTTP server, Devin CLI tries **Streamable HTTP** first. If the server responds with an HTTP 4xx error (e.g. 404 or 405), it automatically falls back to **legacy SSE** on the **same configured URL**. This follows the [MCP spec's backwards-compatibility guidance](https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/transports/#backwards-compatibility). The fallback only triggers on 4xx responses — connection errors, timeouts, and 5xx responses are reported directly without attempting SSE. If your server's SSE endpoint is at a different path (e.g. `/sse` instead of `/mcp`), set `"transport": "sse"` with the SSE URL to connect directly without the Streamable HTTP attempt. If both transports fail, the error message includes details from both attempts to help with troubleshooting. # MCP Overview Source: https://docs.devin.ai/cli/extensibility/mcp/overview Extend Devin CLI with external tool servers using the Model Context Protocol MCP (Model Context Protocol) lets you connect external tool servers to Devin CLI, giving the agent access to APIs, databases, issue trackers, and any other service you can wrap in an MCP server. When you configure an MCP server, its tools become available to the agent just like built-in tools. The agent can discover what tools are available and call them as needed. *** ## How It Works You define an MCP server in your config file with a command, arguments, and optional environment variables. Devin CLI starts the server process when needed. The server connects to the external API (GitHub, Linear, etc.). The agent discovers what tools the server provides (e.g., `create_issue`, `list_repos`). When the agent calls an MCP tool, the request flows through the server to the external service and the result is returned. *** ## Quick Example Add a GitHub MCP server to your project: ```json theme={null} // .devin/config.local.json (gitignored — keep tokens out of committed config) { "mcpServers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_TOKEN": "ghp_your_token_here" } } } } ``` Now the agent can create issues, read PRs, search repos, and more — all through natural language. *** ## Permission Control Once configured, MCP tools appear with a namespaced format: `mcp____`. For example, a "github" server with a "create\_issue" tool becomes `mcp__github__create_issue`. MCP tools are subject to the same permission system as built-in tools. You can control access at multiple levels: ```json theme={null} { "permissions": { "allow": [ "mcp__github__*" ], "deny": [ "mcp__github__delete_repo" ] } } ``` See [Permissions](/cli/reference/permissions) for the full permission syntax. *** ## Authentication Some remote MCP servers (such as Atlassian, Notion, and Linear) require OAuth authentication. Each MCP client authenticates independently — tokens from Windsurf or Claude Code are **not** shared with Devin CLI. After adding a remote server, authenticate with: ```bash theme={null} devin mcp login ``` This opens a browser window for the OAuth flow. See [MCP Configuration — Authentication](/cli/extensibility/mcp/configuration#authentication) for details. *** ## Disabling Servers You can temporarily disable an MCP server without removing its configuration or credentials: ```bash theme={null} devin mcp disable devin mcp enable ``` See [MCP Configuration — Enabling and disabling servers](/cli/extensibility/mcp/configuration#enabling-and-disabling-servers) for details. *** ## Next Steps Learn how to configure MCP servers in detail Control which MCP tools the agent can use # Plugins Source: https://docs.devin.ai/cli/extensibility/plugins/overview Install and share bundles of skills from a repo, git URL, or local folder. Plugins are in **beta**. Behavior and configuration may change in future releases. A **plugin** is a bundle of [skills](/cli/extensibility/skills/overview) you can install from a GitHub repo, a git URL, or a local folder and reuse across projects. Installing a plugin makes its skills available as `/:` slash commands, and it can pull in other plugins it depends on automatically. A plugin is just a source that contains: ``` my-plugin/ ├── .devin-plugin/ │ └── plugin.json # The plugin manifest └── skills/ └── review/ └── SKILL.md # An ordinary skill ``` The `skills/` directory holds ordinary skills — plugins introduce no new skill format. See [Creating Skills](/cli/extensibility/skills/creating-skills) for the `SKILL.md` format. *** ## Installing a plugin A plugin source can be a GitHub `owner/repo`, a git URL, or a local path: ```bash theme={null} # From GitHub devin plugins install acme/review-tools # From any git host devin plugins install https://gitlab.com/acme/review-tools.git # From a local folder (great for authoring) devin plugins install ./my-plugin ``` Before installing, Devin shows what the plugin adds — the skills it provides, any required plugins that will be auto-installed, and any policy it introduces (for example, if it forbids other plugins). Pass `-y` / `--yes` to skip the prompt. Plugins are installed at the **user** level and are available across all your projects. *** ## Managing plugins ```bash theme={null} # List installed plugins, their versions, and whether any are blocked by policy devin plugins list # Show a plugin's skills and its required/optional/forbidden lists devin plugins info review-tools # Re-fetch a plugin (or all plugins) at the latest version devin plugins update review-tools devin plugins update # Remove a plugin (auto-installed required plugins are left in place) devin plugins remove review-tools ``` Local plugins are linked directly to their source folder, so edits are live: `devin plugins install ./my-plugin` → edit `skills//SKILL.md` → changes apply on the next session, no `update` needed. *** ## The manifest `.devin-plugin/plugin.json` describes the plugin. Only `name` is required, and it must be unique among installed plugins (it is the `/:…` namespace). ```jsonc theme={null} { "name": "review-tools", "version": "1.0.0", "description": "Code-review skills for our team", "requiredPlugins": [ "acme/secure-base", { "source": "github", "repo": "acme/audit-logging" } ], "optionalPlugins": [ "acme/deploy-tools", { "source": "url", "url": "https://gitlab.com/acme/extra.git" } ], "forbiddenPlugins": ["sketchy-org/bad-plugin", "acme/*", "*"] } ``` Supported metadata fields: `name`, `version`, `description`, `author` (`{ name, email }`), `homepage`, `repository`, `license`, and `keywords`. A dependency entry is a **source** — either a string shorthand or an object: * `"owner/repo"` → GitHub * `"https://…"`, `"git@…"`, `"ssh://…"` → git URL * `{ "source": "github", "repo": "owner/repo" }` * `{ "source": "url", "url": "https://gitlab.com/team/plugin.git" }` All GitHub forms for the same repo (`owner/repo`, the HTTPS URL, the `.git` URL, the SSH form) refer to the same plugin identity. *** ## Dependencies and governance A plugin can declare three lists, which let a single plugin act as a curated, governed collection of other plugins. ### `requiredPlugins` Auto-installed (recursively) when the plugin is installed. If a required plugin is blocked by policy, the whole install fails — there is no partial install. ### `optionalPlugins` An **allow-list** of plugins this plugin endorses. They are **not** auto-installed; the list only matters as a carve-out against a forbidden entry (see below). ### `forbiddenPlugins` A **deny-list**. Each entry is one of: * An exact plugin identity, written as `owner/repo`, a git URL, or a local path. * A **glob pattern** — any entry containing `*`. The `*` matches any sequence of characters, including `/`. Patterns are normalized into canonical-identity space first, so `acme/*` becomes `https://github.com/acme/*` (all of `acme`'s GitHub repos), `*/secrets` matches a repo named `secrets` under any owner, and `https://gitlab.com/acme/*` matches any repo under that path. * The lone `"*"`, which matches every other plugin (an un-defeatable lockdown). The policy rules are: * **Deny wins.** A plugin is blocked if any installed plugin forbids it (via its exact identity, a matching glob, or `"*"`). * **Self-override.** A plugin's own `requiredPlugins`, `optionalPlugins`, and itself are exempt from its **own** forbidden list. So `forbiddenPlugins: ["*"]` together with `optionalPlugins: [B, C]` means "allow myself, B, and C; forbid everything else." * **No cross-plugin re-permitting.** One plugin's allow-lists cannot re-permit what **another** plugin forbids. An installed plugin with `forbiddenPlugins: ["*"]` is an un-defeatable lockdown. * **Default open.** If no installed plugin forbids anything, nothing is blocked. Policy is enforced at two points: * **Install time** — installing a blocked plugin (or one whose required plugins can't be satisfied, or whose name collides with an installed plugin) is refused. * **Load time** — if a plugin becomes blocked after install (for example, a forbidding plugin is installed later), it stays on disk but its skills are skipped at session start, with a warning naming the plugin that forbids it. # Rules & AGENTS.md Source: https://docs.devin.ai/cli/extensibility/rules Provide always-on instructions and context that guide the agent in every session Rules are persistent instructions that shape how Devin CLI behaves in your project. They're injected into the agent's context at the start of every session, ensuring consistent behavior across your team. Common uses for rules include coding standards, architectural guidelines, preferred libraries, testing conventions, and project-specific constraints. **To improve coding ability, speed of completion, and lower cost**, we highly recommend **using Skills instead whenever possible**. Skills are only injected into the context when relevant. **Rules and AGENTS should be kept as small as possible.** **Our recommended pattern** is to use a rule to reference skills that the model should use in particular scenarios. *** ## AGENTS.md The simplest way to add rules is with an `AGENTS.md` file at your project root: ```markdown theme={null} # Project Rules - Use TypeScript for all new files - Follow the existing patterns in src/components/ - Always run `npm run lint` before committing - Use pnpm, not npm or yarn - Write tests for all new utility functions ``` Devin CLI reads this file automatically. `AGENTS.md` is the recommended approach for project rules. It's easy to read, version-controlled, and works across multiple AI tools. *** ## Global Rules You can also create rules that apply to **every project** by placing an `AGENTS.md` file in your user config directory: ``` ~/.config/devin/AGENTS.md ``` ``` %APPDATA%\devin\AGENTS.md ``` Global rules are loaded at the start of every session, regardless of which project you're working in. Use them for personal preferences that apply everywhere: ```markdown theme={null} # My Global Rules - Always write commit messages in conventional commit format - Prefer functional patterns over imperative code - Run tests before suggesting a task is complete ``` Global rules work alongside project rules — both are loaded and active at the same time. `AGENT.md` is also supported at this location. If you use Claude Code, Devin CLI also reads `~/.claude/CLAUDE.md` as a global rule. *** ## Personal Rules with AGENTS.local.md If you have personal instructions that shouldn't be shared with collaborators — such as preferred working style, testing habits, or review preferences — create an `AGENTS.local.md` file next to your `AGENTS.md`: ```markdown theme={null} # My Personal Rules - Always start by writing failing tests before implementing a fix - Prefer functional patterns over imperative code - Run the full test suite before marking a task as complete ``` This file is loaded alongside `AGENTS.md` with the same always-on behavior. Add it to your `.gitignore` so it stays local: ```gitignore theme={null} AGENTS.local.md ``` This follows the same convention as `.devin/config.local.json` — the `.local.` suffix signals a personal override that shouldn't be committed. *** ## Supported File Names Devin CLI reads rules from any of these files: | File | Notes | | ----------------- | ------------------------------- | | `AGENTS.md` | Recommended | | `AGENTS.local.md` | Personal rules (gitignored) | | `AGENT.md` | Singular alternative | | `.windsurfrules` | Legacy Windsurf workspace rules | | `CLAUDE.md` | Compatible with Claude Code | All of these are treated identically — their contents are loaded as always-on rules. These files can exist at multiple levels in your project (not just the root). Files at the workspace root are loaded at session start. Files in subdirectories are discovered lazily when the agent accesses files in that directory, keeping the context focused on the relevant part of the codebase. They can also be placed in the [global config directory](#global-rules) to apply across all projects, except `CLAUDE.md` which is read globally from `~/.claude/CLAUDE.md`. *** ## Rules From Other Tools If you're coming from another AI coding tool, Devin CLI can read your existing rules: Devin CLI reads from `.cursor/rules/*.md` and `.cursor/rules/*.mdc`. Cursor rules support frontmatter to control activation: ```markdown theme={null} --- description: "React component guidelines" globs: "src/components/**/*.tsx" alwaysApply: false --- Use functional components with hooks. Never use class components. ``` **Activation behavior:** * `alwaysApply: true` — Always active * `globs` specified — Active when working with matching files * `description` only — Agent decides when to apply * None of the above — User must invoke manually Devin CLI reads from `.windsurf/rules/*.md` and `.windsurf/global_rules.md`. **Subdirectory support:** `.windsurf/rules/` directories can exist at multiple levels in your project, not just the root. Rules at the workspace root are loaded at session start. Rules in subdirectories are discovered lazily — when the agent accesses files in that directory, any `.windsurf/rules/` found there (and in parent directories up to the workspace root) are automatically loaded. This avoids polluting the agent's context with rules from unrelated parts of the project. Windsurf rules support frontmatter: ```markdown theme={null} --- description: "API design rules" trigger: always_on --- All API endpoints must return JSON with a consistent envelope format. ``` **Trigger values:** `always_on`, `manual`, `model_decision`, `agent`, `glob` Devin CLI reads from the `.claude/` directory. Devin CLI does not support `.codeiumignore` files. If you use Codeium's autocomplete and have configured ignore patterns, those patterns will not apply to Devin CLI. *** ## Controlling Imports You can enable or disable reading from specific tool formats in your config file (`~/.config/devin/config.json` — or `%APPDATA%\devin\config.json` on Windows — or `.devin/config.json`): ```json theme={null} { "read_config_from": { "agents_standard": true, "cursor": true, "windsurf": true, "claude": true } } ``` Standard project rules from `AGENTS.md`, `AGENTS.local.md`, `AGENT.md`, and `.windsurfrules` are read by default. Set `"agents_standard": false` to disable importing them. *** ## Rule Activation Types Rules loaded from external formats may have different activation behaviors: | Type | Behavior | | ------------------ | ----------------------------------------------------------------- | | **Always-on** | Active in every session, no user action needed | | **Glob-activated** | Active when the agent works with files matching specific patterns | | **Agent-decided** | The agent chooses when to apply based on the rule's description | | **User-invocable** | Only active when explicitly triggered by the user | Rules from `AGENTS.md` are always "always-on". *** ## Best Practices Long, verbose rules dilute the agent's attention. Focus on what matters most. "Use pnpm" is better than "use the right package manager". Concrete instructions are easier to follow. Show the pattern you want, not just a description of it. Keep rules in your repo so the whole team benefits from the same guidelines. For most common types of rules, consider using skills instead. Skills give you more control over when and how they're applied. # Creating Skills Source: https://docs.devin.ai/cli/extensibility/skills/creating-skills Full reference for the SKILL.md format and frontmatter options Skills are defined as `SKILL.md` files inside a named directory. This page covers everything you need to know to write effective skills. *** ## File Structure Place skills in the appropriate directory depending on scope: ``` # Project-specific (committed to git) .devin/skills/ └── my-skill/ └── SKILL.md # Global — available in all projects (not committed) # Linux/macOS: ~/.config/devin/skills/ └── my-skill/ └── SKILL.md # Windows: %APPDATA%\devin\skills\ └── my-skill\ └── SKILL.md ``` The directory name is the skill's identifier (used for `/my-skill` invocation). The `SKILL.md` file contains optional YAML frontmatter and the skill's prompt content. On Windows, `%APPDATA%` typically resolves to `C:\Users\\AppData\Roaming`. *** ## Frontmatter Reference ```yaml theme={null} --- name: my-skill description: What this skill does (shown in completions) argument-hint: "[file] [options]" model: sonnet subagent: true allowed-tools: - read - grep - glob - exec permissions: allow: - Read(src/**) deny: - exec ask: - Write(**) triggers: - user - model --- Your prompt content goes here... ``` ### All Frontmatter Fields | Field | Type | Default | Description | | --------------- | ------- | --------------- | ------------------------------------------------------------------------------------------------------- | | `name` | string | directory name | Display name of the skill | | `description` | string | none | Shown in slash command completions | | `argument-hint` | string | none | Hint shown after the command name (e.g., `[filename]`) | | `model` | string | current model | Override the model used when running this skill | | `subagent` | boolean | `false` | Run the skill as a [subagent](/cli/subagents) instead of inline | | `agent` | string | none | Run the skill as a subagent using a specific [custom subagent](/cli/subagents#custom-subagents) profile | | `allowed-tools` | list | all tools | Restrict which tools the skill can use | | `permissions` | object | inherit | Permission overrides for this skill | | `triggers` | list | `[user, model]` | How the skill can be invoked | *** ## Model Override Use the `model` field to run a skill with a different model than the one active in the current session. This is useful for using a faster model for simple tasks or a more capable model for complex ones: ```yaml theme={null} --- name: quick-fix description: Fast lint fix using a lightweight model model: swe --- Fix the lint errors in the current file. ``` The model name uses the same values as the `--model` CLI flag (e.g., `opus`, `sonnet`, `swe`, `codex`). See [Models](/cli/models) for the full list. After the skill completes, the session returns to the previously active model. *** ## Running Skills as Subagents Running skills as subagents is **experimental**. The `subagent` and `agent` frontmatter fields may change in future releases. By default, a skill's prompt is injected into the current conversation — the agent processes it inline. You can instead run a skill as a **subagent**, which spawns an independent worker with its own context window. This is useful for skills that perform focused, self-contained tasks where you don't want the output to clutter the main conversation. There are two ways to run a skill as a subagent: ### `subagent: true` Set `subagent: true` to run the skill as a subagent using the default `subagent_general` profile: ```yaml theme={null} --- name: deep-research description: Thorough codebase research on a topic subagent: true model: sonnet allowed-tools: - read - grep - glob --- Research the topic the user asked about thoroughly. Search broadly, follow references, and trace call chains. Report all findings with specific file paths and line numbers. ``` When invoked, this skill spawns a foreground subagent that runs the skill's prompt as its task. The parent agent waits for the subagent to complete, then reads and summarizes the results. ### `agent: ` Use the `agent` field to run the skill as a subagent with a specific [custom subagent profile](/cli/subagents#custom-subagents): ```yaml theme={null} --- name: review-pr description: Review the current PR using the reviewer subagent agent: reviewer --- Review the staged changes for correctness, security, and style issues. ``` The `agent` value must match the name of a registered subagent profile (either built-in like `subagent_explore` / `subagent_general`, or a custom profile you've defined). The subagent inherits the profile's system prompt, tool restrictions, and model — while the skill's content becomes the task. If both `agent` and `subagent` are set, `agent` takes precedence. The `model` field on the skill overrides the subagent profile's model when both are specified. Skills running as subagents do not spawn nested subagents — if the skill is already executing inside a subagent, it runs inline instead to prevent infinite recursion. ### Orchestrating Subagents Using Skills Because skills can run as subagents, you can use them to orchestrate multi-step work. Define a set of subagent skills that each handle a focused task, then write a regular skill that invokes them. The outer skill becomes the orchestrator — it calls each subagent, collects the results, and decides what to do next. For example, here are two subagent skills and an orchestrator that coordinates them: ```markdown theme={null} --- name: research-changes description: Research recent code changes and their impact subagent: true allowed-tools: - read - grep - glob - exec --- Analyze the recent changes in this repository: 1. Run `git log --oneline -20` to see recent commits 2. For each significant commit, examine what changed and why 3. Identify any patterns, risks, or areas that need attention Report your findings with specific file paths and commit references. ``` ```markdown theme={null} --- name: validate-tests description: Run tests and validate coverage for recent changes subagent: true allowed-tools: - read - grep - glob - exec --- Validate the test suite for the project: 1. Identify the test framework and run command 2. Run the full test suite 3. Check for any failing tests 4. Review test coverage for recently changed files Report which tests pass, which fail, and any coverage gaps. ``` ```markdown theme={null} --- name: health-check description: Full project health check — research changes then validate tests --- Perform a full health check on this project: 1. First, use the /research-changes skill to understand recent changes 2. Then, use the /validate-tests skill to verify the test suite 3. Finally, synthesize the findings from both into a summary: - What changed recently and why - Whether tests are passing - Any risks or recommended actions ``` Invoking `/health-check` runs the orchestrator in the main agent. It calls `/research-changes`, which spawns a subagent to explore the repo. Once that finishes, it calls `/validate-tests`, which spawns another subagent to run the tests. The orchestrator then synthesizes both results into a final summary. A subagent skill will **never** use a subagent when calling other skills, even if those skills have `subagent: true` — they run inline instead. This means you don't need to worry about unbounded nesting. The orchestration pattern is always one level deep: the orchestrator spawns subagents, and those subagents execute everything else inline. *** ## Prompt Content The body of the SKILL.md file (after the frontmatter) is the prompt that gets injected when the skill is invoked. *** ## Permissions Skills can define their own permission scope using the same syntax as the main permissions config: ```yaml theme={null} permissions: allow: - Read(src/**) - Exec(npm run test) deny: - Write(/etc/**) - exec ask: - Write(src/**) ``` **How skill permissions work:** * `allow` — These scopes are auto-approved during skill execution * `deny` — These scopes are blocked during skill execution * `ask` — These scopes always prompt the user Skill permissions are additive to (not replacing) the session's base permissions. A skill cannot grant permissions that are denied at a higher level (project or organization config). *** ## Allowed Tools Restrict which tools the skill can use: ```yaml theme={null} allowed-tools: - read - grep - glob ``` Available tool names: `read`, `edit`, `grep`, `glob`, `exec` You can also allow MCP tools: ```yaml theme={null} allowed-tools: - read - mcp__github__list_issues - mcp__github__create_issue ``` If `allowed-tools` is not specified, the skill has access to all tools. For safety-critical skills, always restrict to the minimum needed. *** ## Examples ### Code Review Skill ```markdown theme={null} --- name: review description: Review staged changes for issues allowed-tools: - read - grep - glob - exec permissions: allow: - Exec(git diff) - Exec(git log) --- Run `git diff --staged` and review the changes for quality issues. Evaluate: 1. **Correctness** — Any logic errors or edge cases? 2. **Security** — Any vulnerabilities introduced? 3. **Performance** — Any obvious inefficiencies? 4. **Style** — Consistent with the codebase? Provide a summary with specific line references. ``` ### Component Generator ```markdown theme={null} --- name: component description: Generate a React component from a description argument-hint: "" allowed-tools: - read - edit - grep - glob model: sonnet permissions: allow: - Write(src/components/**) --- Create a new React component using the name the user provides: 1. Check existing components in src/components/ for style conventions 2. Create the component file at src/components//.tsx 3. Create a barrel export at src/components//index.ts 4. Add basic tests at src/components//.test.tsx 5. Follow the patterns you find in existing components ``` ### Deployment Checklist ```markdown theme={null} --- name: deploy description: Run through the deployment checklist triggers: - user allowed-tools: - read - exec - grep permissions: allow: - Exec(npm run) - Exec(git) --- Run through the deployment checklist: 1. Run the test suite: `npm run test` 2. Run the linter: `npm run lint` 3. Check for uncommitted changes: `git status` 4. Verify the build: `npm run build` 5. Show the current branch and last commit Report the status of each step. If anything fails, stop and explain the issue. ``` ### Search Expert ```markdown theme={null} --- name: find description: Find relevant code across the project argument-hint: "" allowed-tools: - read - grep - glob triggers: - user - model --- Search the codebase thoroughly for what the user asked about. Use grep for content search and glob for file discovery. Provide relevant file paths and code snippets. Explain how the pieces connect. ``` *** ## Tips A skill should do one thing well. Create multiple skills rather than one mega-skill. Show the agent what good output looks like in your prompt. Restricting tools makes skills safer and more predictable. Invoke your skill and iterate on the prompt until the output is what you want. # Skills Overview Source: https://docs.devin.ai/cli/extensibility/skills/overview Create reusable prompts and workflows that extend the agent's capabilities Skills are self-contained units of functionality that you can teach to Devin CLI. They bundle prompts, tool access, permissions, and workflows into a reusable package that can be invoked by either the agent or the human operator. *** ## What Are Skills? Think of skills as expert knowledge you give the agent. A skill might teach it how to: * Review code according to your team's standards * Generate a specific type of component * Run a deployment workflow * Perform a security audit * Set up a new service from a template Users can invoke skills with `/skill-name` in the chat. The agent can invoke skills on its own when relevant. Skills can have their own permission grants and restrictions. Restrict which tools a skill can use for safety. Run skills as independent [subagents](/cli/subagents) with their own context window. Use a different [model](/cli/models) for specific skills. *** ## Quick Example Create a code review skill at `.devin/skills/review/SKILL.md` (or `.windsurf/skills/review/SKILL.md`): ```markdown theme={null} --- name: review description: Review code changes before committing allowed-tools: - read - grep - glob - exec --- Review the current git diff and provide feedback: 1. Run `git diff --staged` (or `git diff` if nothing is staged) 2. Check for: - Logic errors or bugs - Missing error handling - Security issues - Style inconsistencies 3. Summarize findings and suggest improvements ``` Now you can invoke it with `/review` in any session. *** ## How Skills Work When a skill is invoked: 1. The skill's prompt is injected into the conversation 2. Tool access is restricted to the skill's `allowed-tools` (if specified) 3. Additional permissions from the skill's config are applied 4. The specified model is used (if different from the current one) After the skill completes, the session returns to normal configuration. *** ## Skill Triggers Skills can be invoked in two ways: | Trigger | Description | Default | | ------- | ------------------------------------------- | ------- | | `user` | User can invoke with `/skill-name` | Enabled | | `model` | Agent can invoke autonomously when relevant | Enabled | ```yaml theme={null} --- name: security-check triggers: - user - model --- ``` Set `triggers: [user]` to prevent the agent from invoking a skill on its own. *** ## Third-party Skills We support the `.agents` skills standards, so third-party skill installation tools work with Devin CLI. Third-party skills can execute arbitrary code, so install them at your own risk. *** ## Where Skills Live Skills can be scoped to a single project or shared across all projects: | Location | Scope | Committed to git? | | --------------------------------------------- | ---------------------------------------- | ----------------- | | `.agents/skills//SKILL.md` | Project-specific | Yes | | `.devin/skills//SKILL.md` | Project-specific | Yes | | `.windsurf/skills//SKILL.md` | Project-specific | Yes | | `~/.agents/skills//SKILL.md` | Global (all projects) | No | | `~/.config/devin/skills//SKILL.md` | Global (all projects) | No | | `~/.codeium//skills//SKILL.md` | Global (all projects, channel-dependent) | No | **Project skills** live in the `.devin/skills/` or `.windsurf/skills/` directory at your project root and are committed to version control, making them shareable with your team. Both locations use the same `SKILL.md` format. **Global skills** live in `~/.config/devin/skills/` (following [XDG conventions](https://specifications.freedesktop.org/basedir-spec/latest/)) or `~/.codeium//skills/` (where `` is `windsurf`, `windsurf-next`, or `windsurf-insiders` depending on your CLI channel) and are available in every project on your machine. **Windows:** The global skills path follows your system's application data directory. On Windows, use `%APPDATA%\devin\skills\\SKILL.md` (typically `C:\Users\\AppData\Roaming\devin\skills\\SKILL.md`) instead of `~/.config/devin/skills/`. *** ## Next Steps Learn the full skill format including frontmatter options, dynamic content, and examples. Bundle skills into a plugin you can install and share across projects. # Hand off to cloud Devins Source: https://docs.devin.ai/cli/handoff Hand off a task from the Devin CLI to a cloud Devin session with /handoff. When a task outgrows your local machine — or you want Devin to keep working while you step away — use the built-in `/handoff` command to transfer the current session to a cloud [Devin session](/get-started/first-run). The cloud session gets its own VM with a shell, browser, and full repo access, so it can keep going after you close your laptop. ``` /handoff fix the flaky integration tests in CI ``` The Devin CLI packages up the conversation context and your current git branch, then creates a cloud session that picks up where you left off. Track its progress from your terminal or in the [Devin web app](https://app.devin.ai). Run `/handoff` without a task description and the cloud session continues from where you left off automatically. ## When to hand off Hand a task off when it needs more than your local terminal, or when you want it to run in the background: * **VM or server** — running a dev server, hitting endpoints, Docker builds * **Browser** — screenshots, OAuth flows, end-to-end tests, scraping * **CI/CD** — pipeline debugging, deployments, infrastructure changes * **Long-running work** — migrations, batch jobs, large refactors * **Parallel execution** — offload work to the cloud while you keep coding locally ## What carries over The cloud session starts in a fresh VM, so the CLI includes everything it needs to pick up the thread: * **Repo and branch** — so the cloud session clones the right repo and checks out the branch you're on. * **Conversation context** — what you and Devin have been working on in the current session. * **Uncommitted changes** — your work-in-progress diff carries over. Commit or stash anything you don't want sent. Not using the Devin CLI? You can hand off from Claude Code, Codex, Cursor, or any coding agent — and from plain shell scripts — with the open-source [Devin Handoff](https://github.com/club-cog/devin-handoff) plugin. See [Hand off to Devin](/work-with-devin/devin-handoff) for setup and usage across every agent. ## Related resources Hand off from any coding agent, not just the Devin CLI Source, install guides, and the full script reference # Quickstart Source: https://docs.devin.ai/cli/index Get up and running in 2 minutes with Devin CLI, a local command-line coding agent with deep Devin Cloud integration. ```bash theme={null} curl -fsSL https://cli.devin.ai/install.sh | bash ``` On macOS, install Devin CLI with [Homebrew](https://brew.sh): ```bash theme={null} brew install --cask devin-cli ``` To upgrade to the latest version later, run: ```bash theme={null} brew upgrade --cask devin-cli ``` Download and run the installer: * [x86\_64 (most Windows PCs)](https://static.devin.ai/cli/devin-updater-x86_64-pc-windows.exe) * [ARM64 (Windows on ARM)](https://static.devin.ai/cli/devin-updater-aarch64-pc-windows.exe) Alternatively, open **PowerShell** and run: ```powershell theme={null} irm https://static.devin.ai/cli/setup.ps1 | iex ``` `irm` and `iex` are PowerShell commands. Do not run this in Git Bash or CMD — it will fail with "command not found". Use PowerShell for installation only. After installing, you can use Devin CLI from **PowerShell**, **Windows Terminal**, or **Git Bash**. Devin CLI is bundled with **Devin Desktop**. This installation method is available for **Legacy Windsurf Enterprise** and **Devin Enterprise** plans. **Admin setup:** For the Devin Desktop-bundled install, an admin must first enable the install option in Devin CLI team settings by toggling on **Show "Install Devin CLI" in the Devin Desktop Command Palette**. **User installation:** 1. Open Devin Desktop 2. Open the Command Palette with Cmd+Shift+P (macOS) or Ctrl+Shift+P (Windows/Linux) 3. Search for and run **Install Devin CLI** This adds the `devin` binary to your PATH so you can use it from any terminal. That's it! After you restart your terminal, enter a project directory and type `devin` to activate Devin CLI. Also try preloading the session with a prompt for automation: ```bash theme={null} devin -- check out this code and suggest a feasible, helpful feature ``` You're ready to go. For must-know tips, see [Essential Commands](/cli/essential-commands). ## What's next? Devin CLI can implement new features, fix bugs, review code, answer questions, automate tasks, and more. Must-know commands and slash commands Choose the right model for your task Connect MCP servers and skills Explore all commands and flags *** ## Devin CLI vs. Devin Devin CLI and [Devin](/get-started/devin-intro) are separate tools designed for different workflows. **Devin CLI** is a local coding agent that runs directly in your terminal. It works with your local files and environment, giving you fast, interactive assistance right where you code. **Devin** is our cloud-based AI software engineer that runs in a virtual machine. It includes features like Playbooks, Secrets, Knowledge, and other capabilities that are not available in Devin CLI. Devin CLI does not yet support Knowledge, Playbooks, or Secrets from your Devin account. We're actively working on adding support for each of these and plan to roll them out soon. Devin CLI overview # Models Source: https://docs.devin.ai/cli/models Available models and how to configure them Devin CLI supports multiple AI models. You can choose the best model for your task to optimize for maximum capability, speed, or cost efficiency. For most users, we recommend **Adaptive** — our intelligent model router that automatically selects the best model for each task, delivering the right level of intelligence for every prompt. *** ## Available Models Models release frequently. We typically support the latest and greatest models from **Anthropic**, **OpenAI**, **Google**, and **Cognition** within minutes of their launch. We also support a number of **leading open source models** like **DeepSeek**, **Kimi**, and **GLM**. To stay up-to-date on model releases, consider following the [**Cognition** X account](http://x.com/cognition). Short names like `opus`, `sonnet`, `swe`, `codex`, and `gemini` always resolve to the latest version in that model family. ### Reasoning / Thinking Levels Some models support configurable reasoning levels, which control how much compute the model spends "thinking" before responding. You can cycle the thinking level with `Alt+T` (macOS: `Opt+T`) during a session. *** ## Setting the Model ```bash theme={null} devin --model opus -- refactor this module devin --model sonnet -- explain this code ``` Switch models during a session: ```text theme={null} /model opus /model sonnet /model codex ``` Run `/model` with no argument to open the model selector. Set a default in `~/.config/devin/config.json` (on Windows, `%APPDATA%\devin\config.json`): ```json theme={null} { "agent": { "model": "swe-1-6-fast" } } ``` *** ## Model Selection Tips The correct choice of language model varies wildly from person-to-person and task-to-task. Many engineers working on the same project are convinced that their model is the best for the task, despite using different models. The fact of the matter is, AI can perform differently depending on your personal usage and writing style! **As such, we strongly recommend trying multiple models to see which one you prefer.** At minimum we recommend trying `swe`, `gpt`, and `opus`. We find that the vast majority of use-cases can be covered by these three. Use `opus` or `gpt` for multi-file refactors, architecture changes, and tasks requiring deep reasoning. Use `swe` (fast) for straightforward edits, bug fixes, and questions. It's both fast and cheap at a reasonable level of intelligence. Enterprise teams can restrict which models are available through [Team Settings](/cli/enterprise/team-settings). # Commands & Flags Source: https://docs.devin.ai/cli/reference/commands Complete reference for command arguments, subcommands, and interactive slash commands ## Usage ```bash theme={null} devin [OPTIONS] [prompt] ``` Pass an optional prompt to start a session with an initial message, or launch interactively with no arguments. You can also read these from your terminal with `man devin`. *** ## Global Flags | Flag | Short | Description | | --------------------------- | ----- | ----------------------------------------------------------------------------------------------------- | | `--model ` | | Set the AI model for this session | | `--permission-mode ` | | Permission mode (`normal`, `dangerous`, `bypass`) | | `--continue` | `-c` | Resume the most recent session in the current directory | | `--resume ` | `-r` | Resume a specific session by ID | | `--print [PROMPT]` | `-p` | Print response and exit (non-interactive mode). Optionally accepts an inline prompt. | | `--prompt-file ` | | Load the initial prompt from a file | | `--config ` | | Configuration file path | | `--export [PATH]` | | Export conversation to a file after each turn (ATIF format). Uses a default path if none is provided. | | `--respect-workspace-trust` | | Whether to respect workspace trust settings | **Examples:** ```bash theme={null} devin -- add a login page devin --model opus -- refactor the auth module devin -c # Resume last session devin -r abc12345 # Resume specific session devin -p "list all TODO comments" # Print response and exit devin -p -- list all TODO comments # Same, using -- separator (still works) devin --export -- fix the tests # Export conversation to default path devin --export out.json -- fix tests # Export to a specific file ``` *** ## Subcommands ### devin auth Authentication related commands. | Command | Description | | ------------------- | ------------------------------------- | | `devin auth login` | Log in to your account | | `devin auth logout` | Log out and remove stored credentials | | `devin auth status` | Check authentication status | **Options for `devin auth login`:** * `--force-manual-token-flow` — Skip browser-based auth and manually paste a token (useful for remote/SSH sessions) ### devin mcp Connect and log in to Model Context Protocol servers. | Command | Description | | -------------------------- | ------------------------------------------------- | | `devin mcp add ` | Add a new MCP server | | `devin mcp list` | List all configured MCP servers | | `devin mcp get ` | Show details for a specific MCP server | | `devin mcp remove ` | Remove a configured MCP server | | `devin mcp login ` | Authenticate with an MCP server via OAuth | | `devin mcp logout ` | Remove stored OAuth credentials for an MCP server | | `devin mcp enable ` | Enable a disabled MCP server | | `devin mcp disable ` | Disable an MCP server without removing it | **Options for `devin mcp add`:** * `-t, --transport ` — Transport type (optional; inferred from URL → http, trailing args → stdio) * `-s, --scope ` — Configuration scope (default: `local`) * `--url ` — URL for HTTP transport (can also be passed as a positional argument after the name) * `--command ` — Command for stdio transport (optional when trailing args are provided) * `-e, --env ` — Environment variables (repeatable) * `-H, --header ` — HTTP headers (repeatable) * `--scopes ` — OAuth scopes to request (comma-separated) * `` — Positional URL argument for HTTP (alternative to `--url`) * `-- [ARGS...]` — Command and arguments for stdio (first arg is the command when `--command` is omitted) HTTP servers try Streamable HTTP first and fall back to legacy SSE on 4xx errors (per the [MCP spec](https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/transports/#backwards-compatibility)). You can also set `"transport": "sse"` explicitly. See [MCP Configuration → Troubleshooting](/cli/extensibility/mcp/configuration#troubleshooting). **Examples:** ```bash theme={null} # stdio server devin mcp add my-server -- npx @company/mcp-server --port 3000 # HTTP server (positional URL) devin mcp add notion https://mcp.notion.com/mcp devin mcp add --transport http datadog-mcp https://mcp.datadoghq.com/api/unstable/mcp-server/mcp # HTTP server (--url flag, also works) devin mcp add notion --url https://mcp.notion.com/mcp # With environment variables and scope devin mcp add -e GITHUB_TOKEN=ghp_xxx github -- npx -y @modelcontextprotocol/server-github devin mcp add -s project sentry https://mcp.sentry.dev/mcp ``` **Options for `devin mcp remove`:** * `-s, --scope ` — Configuration scope (default: `local`) **Options for `devin mcp login`:** * `--scopes ` — OAuth scopes to request (comma-separated) **Options for `devin mcp enable`:** * `-s, --scope ` — Configuration scope (default: `local`) **Options for `devin mcp disable`:** * `-s, --scope ` — Configuration scope (default: `local`) See [MCP Configuration](/cli/extensibility/mcp/configuration) for details. ### devin rules Manage agent rules (always-on context blobs). | Command | Description | | ------------------------- | -------------------------------- | | `devin rules list` | List all available rules | | `devin rules show ` | Show details for a specific rule | | `devin rules paths` | Show rule directory locations | **Options for `devin rules list`:** * `--provider ` — Filter by rule provider See [Rules](/cli/extensibility/rules) for details. ### devin skills Manage agent skills (slash commands and agent-triggered context blobs). | Command | Description | | -------------------------- | --------------------------------- | | `devin skills list` | List all available skills | | `devin skills show ` | Show details for a specific skill | | `devin skills paths` | Show skill directory locations | **Options for `devin skills list`:** * `--trigger ` — Filter by trigger type See [Skills](/cli/extensibility/skills/overview) for details. ### devin list List sessions in the current directory. Alias: `devin ls` | Command | Description | | -------------------------- | ------------------------------------ | | `devin list` | Interactive session picker (default) | | `devin list --format json` | Output sessions as JSON | | `devin list --format csv` | Output sessions as CSV | ### devin version Print the current version and exit. ```bash theme={null} devin version ``` This is equivalent to `devin --version`. ### devin acp Run Devin as an [Agent Client Protocol (ACP)](https://agentclientprotocol.com/) server over stdio. This subcommand is intended to be invoked by an ACP-aware editor or IDE (such as Windsurf or Zed) as a subprocess — it speaks JSON-RPC over stdin/stdout and is not meant to be run interactively. ```bash theme={null} devin acp ``` The ACP server reads credentials from `WINDSURF_API_KEY` if set, otherwise from the credentials stored by `devin auth login`. It can also accept credentials at runtime via the ACP `authenticate` request. ### devin update Check for updates and optionally install them. ```bash theme={null} devin update ``` Use `--force` to re-install even if already on the latest version: ```bash theme={null} devin update --force ``` ### devin shell \[Feature Preview] Shell integration commands. See [Shell Integration](/cli/shell-integration) for full details. | Command | Description | | --------------------------- | ------------------------------------------------------- | | `devin shell setup` | Install shell integration into your shell config file | | `devin shell setup ` | Install for a specific shell (`bash`, `zsh`, or `fish`) | ### devin sandbox \[Research Preview] Manage OS-level process sandboxing for the exec tool. Pass the global `--sandbox` flag to run a session with the sandbox enforced. #### devin sandbox setup Print the sandbox prerequisites for the current platform. Requirements to run with `--sandbox`: * **Linux**: requires bubblewrap (`bwrap`) and `socat`. A sandbox session fails to start with install instructions if either is missing — including in a fresh WSL distribution. * **macOS**: works out of the box via Seatbelt; no extra packages needed. * **Windows**: native Windows cannot run the sandbox. [Install WSL 2](https://learn.microsoft.com/windows/wsl/install) and run Devin inside your WSL distribution. ```bash theme={null} devin sandbox setup ``` ### devin setup Interactive setup wizard for authentication and MCP configuration. ```bash theme={null} devin setup devin setup --force-manual-token-flow # For remote/SSH sessions ``` ### devin uninstall Uninstall Devin CLI and optionally remove all data. | Option | Description | | --------- | ----------------------------------------------------------------- | | `--clean` | Remove all data including configuration, history, and custom data | | `--force` | Skip confirmation prompt | *** ## Slash Commands These commands are available inside an interactive session. Type them at the prompt. ### Mode & Model | Command | Description | | --------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `/mode [normal\|accept-edits\|plan\|bypass]` | Show or switch the current mode (`autonomous` is available in sandbox sessions) | | `/normal` | Switch to Normal mode (default) | | `/accept-edits` | Switch to Accept Edits mode (auto-approve file edits in workspace) | | `/plan` | Switch to Plan mode (read-only planning) | | `/ask ` | Ask a question without making code changes (oneshot) | | `/bypass` | Switch to Bypass mode (auto-approve all actions) | | `/model [name]` | Show or change the current model | | `/fast` | Switch to SWE-1.6 Fast | | `/theme [dark\|light\|terminal-dark\|terminal-light\|no-color]` | Switch between themes (dark, light, terminal dark, terminal light, no color) | `/bypass` has aliases `/yolo` and `/dangerous`. All three do the same thing. ### Session Management | Command | Description | | ----------------------------- | ------------------------------------------------------------------------------------------------- | | `/clear` | Clear conversation history and start a new session. Alias: `/new` | | `/continue [session-id]` | Resume a previous session | | `/fork [step]` | Fork the current session to a new session. Optionally fork from a specific step (see `/steps`). | | `/steps` | List conversation steps (use with `/fork` and `/revert`) | | `/revert ` | Revert file changes from a specific step onwards and rewind the conversation to before that step | | `/resume [session-id]` | Open the interactive session picker, or resume a specific session by ID | | `/ls [--all]` | List recent sessions (current directory only by default). Alias: `/list-sessions` | | `/rename-session ` | Rename the current session | | `/rm-session ` | Irreversibly delete a session and all its data | | `/export` | Show export info. Use the `--export` CLI flag to enable conversation export. | | `/exit` | Exit the application (alias: `/quit`). You can also type `exit` or `quit` without the `/` prefix. | ### Workspace | Command | Description | | ---------------------- | ------------------------------------------------- | | `/workspace` | List workspace directories (alias: `/workspaces`) | | `/add-dir ` | Add an additional workspace directory | | `/undo-add-dir ` | Remove a workspace directory | ### Automation | Command | Description | | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `/loop ` | Run a prompt then auto-review the diff in a loop | | `/btw ` | Ask a quick side question. Runs a sidechain using the current conversation context and prints the answer in a box, without adding the question to the main conversation. | ### Extensibility | Command | Description | | -------- | ------------------------------------------------------------------- | | `/hooks` | List all loaded hooks with their IDs, event types, and source paths | ### Utilities | Command | Description | | -------------------- | ------------------------------------------------------------------------------------------------------------ | | `/help` | Show available slash commands | | `/shortcuts` | Browse keyboard shortcuts in an interactive, searchable list grouped by category | | `/bug [description]` | Report a bug to the Devin CLI developers | | `/update [--force]` | Check for and install updates. Pass `--force` to re-install even when already on the latest version. | | `/upgrade` | Upgrade your subscription plan | | `/login` | Authenticate with your account | | `/logout` | Clear stored credentials and exit | | `/context` | Show context window usage | | `/usage` | Show estimated credit/ACU usage for the session, including usage from previous openings of a resumed session | | `/compact` | Force conversation compaction | ### Cloud Sessions (insiders only) | Command | Description | | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `/cloud-sessions [--all]` | Open an interactive picker of your recent cloud Devin sessions. Use arrow keys to navigate, type to filter, Enter to attach, Esc to cancel. Pass `--all` for org-wide sessions. | | `/cloud-attach ` | Attach to a cloud Devin session with full TUI rendering and bidirectional input. | *** ## Modes Modes control the agent's autonomy level by combining a permission mode with an agent profile. Full autonomy for complex coding tasks. The agent can read, write, and execute commands with normal permission checks. * **Permission mode:** Normal * **Profile:** Normal * **Use for:** Multi-file refactoring, feature implementation, bug fixes Planning only — the agent proposes changes without making them. Read-only tool access ensures no code is modified. * **Permission mode:** Normal * **Profile:** Plan (read-only tools) * **Use for:** Architecture design, understanding codebases, planning before implementation All permission prompts are auto-approved. The agent executes freely without asking for confirmation. * **Permission mode:** Dangerous * **Profile:** Normal * **Use for:** Trusted tasks where interruptions slow you down Use Bypass mode only for tasks you fully trust. All tool calls (including destructive commands) are auto-approved. Cycle between modes with `/mode`, or switch directly with `/normal`, `/accept-edits`, `/plan`, or `/bypass`. Use `/ask ` as a oneshot command to ask questions without switching modes. *** ## Profiles Profiles determine the agent's available tools and behavior. Profiles are automatically set when you switch modes. | Profile | Description | Tool Access | | -------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `normal` | Full coding assistant (used by Normal, Accept Edits, and Bypass modes) | All tools | | `plan` | Structured planning workflow (used by Plan mode) | Read-only tools (grep, glob, read, todo, ask\_user\_question, exit\_plan\_mode) | | `ask` | Question answering (used by the `/ask` command) | Read-only tools (grep, glob, read, todo, ask\_user\_question) | # Configuration File Source: https://docs.devin.ai/cli/reference/configuration/config-file Complete reference for the Devin CLI config file format Devin CLI uses JSON files (with comment support) for configuration. This page documents all available options. *** ## File Locations | File | Purpose | | ----------------------------- | ------------------------------------ | | `~/.config/devin/config.json` | User-wide settings | | `.devin/config.json` | Project settings (committed) | | `.devin/config.local.json` | Project local overrides (gitignored) | On Windows, the user config path is `%APPDATA%\devin\config.json` (e.g. `C:\Users\\AppData\Roaming\devin\config.json`), not `~\.config\devin\config.json`. *** ## Full Config Reference ```json theme={null} // ~/.config/devin/config.json { // Agent behavior "agent": { "model": "swe-1-6-fast", // Default model "show_history_on_continue": true // Show messages when resuming }, // Theme "theme_mode": null, // "light", "dark", "terminal-dark", "terminal-light", "nocolor", or null (auto) // Permissions "permissions": { "allow": [], "deny": [], "ask": [] }, // MCP servers "mcpServers": {}, // Display "show_path": false, // Show CWD in input border "unicode_mode": "auto", // "auto", "unicode", or "ascii" "show_hints": true, // Show tips between turns // File completion "include_gitignored_files": false, // Include gitignored files in @ completions // File access "respect_gitignore": false, // Block tool access to gitignored paths // Commit & PR attribution "attribution": true, // Add "Generated with Devin" / Co-Authored-By to commits & PRs // Updates "auto_update": true, // Install new versions in the background // Notifications "notify": "smart", // "never" | "smart" | "always" — terminal notifications // Proxy settings for CLI HTTP traffic "proxy": { "mode": "system", // "system" | "manual" | "off" "url": null, // Proxy URL (required for manual mode) "no_proxy": null // Comma-separated bypass list }, // Sandbox network filtering "sandbox": { "allowed_domains": [], // Domain allowlist (empty = no filtering) "denied_domains": [], // Domain denylist (takes precedence) "network_mode": "full" // "full" or "limited" (GET/HEAD/OPTIONS only) }, // Import settings from other tools "read_config_from": { "cursor": true, "windsurf": true, "claude": true } } ``` ```json theme={null} // .devin/config.json { // Permissions "permissions": { "allow": [], "deny": [], "ask": [] }, // MCP servers "mcpServers": {}, // Import settings from other tools "read_config_from": { "cursor": true, "windsurf": true, "claude": true } } ``` *** ## Options Reference Options marked with **User only** can only be set in the user config (`~/.config/devin/config.json`; `%APPDATA%\devin\config.json` on Windows). Only `permissions`, `mcpServers`, `read_config_from`, and `hooks` are available in project configs. ### agent (user only) | Option | Type | Default | Description | | -------------------------- | ------- | ---------------- | ---------------------------------------------- | | `model` | string | `"swe-1-6-fast"` | Default AI model | | `show_history_on_continue` | boolean | `true` | Show previous messages when resuming a session | ### theme\_mode (user only) | Value | Behavior | | ------------------ | ------------------------------------------------------------------------ | | `null` | Auto-detect (asks on first run) | | `"light"` | Light theme | | `"dark"` | Dark theme | | `"terminal-dark"` | Dark theme quantized to 16 ANSI colors (respects terminal color scheme) | | `"terminal-light"` | Light theme quantized to 16 ANSI colors (respects terminal color scheme) | | `"nocolor"` | No color output (monochrome, useful for VT100 terminals) | ### permissions See [Permissions](/cli/reference/permissions) for full documentation. ```json theme={null} { "permissions": { "allow": ["Read(**)", "Exec(git)"], "deny": ["Exec(sudo)"], "ask": ["Write(**/.env*)"] } } ``` ### mcpServers Map of server name to server configuration. Supports both local command (stdio) and remote HTTP servers. See [MCP Configuration](/cli/extensibility/mcp/configuration). ```json theme={null} { "mcpServers": { "server-name": { "command": "executable", "args": ["arg1", "arg2"], "env": { "KEY": "value" } }, "remote-server": { "url": "https://mcp.example.com/mcp", "transport": "http" } } } ``` ### show\_path (user only) Show the current working directory path in the input border. When enabled, the top border of the input box displays your prettified CWD (e.g. `~/projects/my-app`). | Value | Behavior | | ------- | ----------------------------- | | `false` | Hidden (default) | | `true` | Show CWD path in input border | ### unicode\_mode (user only) Controls whether the terminal UI uses Unicode symbols or ASCII-safe fallbacks. Set to `"ascii"` if your terminal or font does not render Unicode glyphs correctly (e.g. the ⏺ symbol appearing as a box). | Value | Behavior | | ----------- | ------------------------------------------------- | | `"auto"` | Detect Unicode support from environment (default) | | `"unicode"` | Always use Unicode symbols | | `"ascii"` | Always use ASCII-safe characters | ### show\_hints (user only) Show occasional tips between turns (e.g. "Did you know: Use /model to switch between available models"). Useful for discovering CLI features; set to `false` to suppress them once you're familiar. | Value | Behavior | | ------- | -------------------------------- | | `true` | Show tips occasionally (default) | | `false` | Never show tips | ### include\_gitignored\_files (user only) Include gitignored files in `@` tab completion results. When enabled, files matching `.gitignore` patterns will appear in `@` mention completions. This is useful if you store documentation or other files in gitignored directories that you want to reference. | Value | Behavior | | ------- | --------------------------------------------------- | | `false` | Exclude gitignored files from completions (default) | | `true` | Include gitignored files in `@` completions | ### respect\_gitignore (user only) Control whether the agent respects `.gitignore` when reading or writing files via tools. When enabled, tool calls that access gitignored paths are blocked. This is separate from `include_gitignored_files`, which only affects `@` tab completion. | Value | Behavior | | ------- | --------------------------------------------------------------- | | `false` | Agent can access all files regardless of `.gitignore` (default) | | `true` | Block tool access to gitignored paths | ### attribution (user only) Control whether the agent adds Devin attribution to the commits and pull requests it creates. When enabled, commit and PR bodies include a `Generated with [Devin]` line and a `Co-Authored-By: Devin` trailer. Set to `false` to omit both so no Devin attribution is added. | Value | Behavior | | ------- | ----------------------------------------------------------------------------------------------- | | `true` | Add the `Generated with [Devin]` line and `Co-Authored-By` trailer to commits and PRs (default) | | `false` | Omit all Devin attribution from commits and PRs | ### auto\_update (user only) Control background auto-update on macOS and Linux. When enabled, new releases are downloaded and activated while Devin CLI runs, so the next invocation of `devin` picks up the latest version automatically. The currently running session is unaffected — a swap of the `current` symlink only takes effect on the next launch. The update is designed to be safe against interruption: every filesystem step is staged to a temp path and promoted with an atomic rename, and concurrent updaters are serialized with a file lock. Quitting mid-update cannot leave the installation in a broken state — you'll just come back up on the old version. Only applies to self-managed installations (`curl | bash` on macOS/Linux). Installations bundled with another product (e.g. Windsurf) ignore this setting and update through their parent application. | Value | Behavior | | ------- | ------------------------------------------------------------- | | `true` | Download and install new versions in the background (default) | | `false` | Only check for new versions; install manually via `/update` | ### notify Control terminal notifications when the agent finishes or needs user input. The CLI writes a BEL character (triggers terminal bell / visual bell), an OSC 9 escape sequence (triggers a system notification in iTerm2 and compatible terminals), and an OSC 777 sequence (desktop notification in rxvt-unicode and other terminals). Terminals that do not recognize these sequences safely ignore them. | Value | Behavior | | ---------- | -------------------------------------------------------------------------------------- | | `"never"` | No notifications | | `"smart"` | Notify only when the terminal window is unfocused (uses OSC focus reporting) (default) | | `"always"` | Notify on every qualifying event regardless of focus | ### read\_config\_from Control importing from other AI tool configurations: | Option | Type | Default | Description | | ---------- | ------------ | ------- | ------------------------------ | | `cursor` | boolean/null | `true` | Import from `.cursor/rules/` | | `windsurf` | boolean/null | `true` | Import from `.windsurf/rules/` | | `claude` | boolean/null | `true` | Import from `.claude/` | Set to `false` to disable a specific import. `null` is treated as `true`. ### proxy (user only) Configure how the CLI routes its own outbound HTTP/HTTPS traffic (API calls, updates, MCP servers, etc.). This does not affect sandbox child-process networking (see `sandbox` below). The `mode` field selects the proxy strategy: | Mode | Behavior | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | `"system"` (default) | Respect environment variables (`HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY`) and platform-native PAC (Proxy Auto-Configuration) on macOS and Windows | | `"manual"` | Route all CLI traffic through the explicit `url` | | `"off"` | Connect directly — no proxy | | Option | Type | Default | Description | | ---------- | ----------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `mode` | string | `"system"` | Proxy strategy: `"system"`, `"manual"`, or `"off"` | | `url` | string/null | `null` | Proxy URL. Required when `mode` is `"manual"`. Supports `http://`, `https://`, and `socks5://` schemes | | `no_proxy` | string/null | `null` | Comma-separated list of hosts/domains that bypass the proxy. Uses the same syntax as the `NO_PROXY` environment variable (e.g. `"localhost,127.0.0.1,.corp.example.com"`). Applies in any mode | **Example — corporate proxy:** ```json theme={null} { "proxy": { "mode": "manual", "url": "http://proxy.corp.example.com:8080", "no_proxy": "localhost,127.0.0.1,.internal.corp" } } ``` **Example — disable proxy:** ```json theme={null} { "proxy": { "mode": "off" } } ```
### sandbox (user only) Sandbox network filtering is currently unstable. If you need this feature, please reach out to your account representative for stability timelines. Configure domain-level network filtering for the sandbox. When `--sandbox` is active and domain filtering is configured, a managed network proxy starts on loopback and the sandbox restricts all child traffic to route through it. For a complete overview of how the sandbox works — including enterprise enforcement and how enterprise and user settings interact — see the [Sandbox documentation](/cli/sandbox). The `--sandbox` flag enforces the active Read and Write permission scopes at the OS level. Writable roots are derived from granted `Write(...)` scopes plus workspace directories; readable roots come from `Read(...)` scopes (with platform defaults always readable). Scopes granted mid-session dynamically expand the sandbox for subsequent commands. If `--sandbox` is passed but sandbox resolution fails (e.g., sandboxing tools are unavailable on the current platform), the CLI will refuse to start rather than running unsandboxed. This fail-closed behavior ensures the security intent of `--sandbox` is never silently bypassed. | Option | Type | Default | Description | | ----------------- | --------- | -------- | ------------------------------------------------------------------------------------------------------------- | | `allowed_domains` | string\[] | `[]` | Domain patterns allowed through the proxy. When non-empty, only matching domains are allowed (allowlist mode) | | `denied_domains` | string\[] | `[]` | Domain patterns always blocked. Deny rules take precedence over allow rules | | `network_mode` | string | `"full"` | `"full"` allows all HTTP methods; `"limited"` allows only GET/HEAD/OPTIONS | **Domain pattern syntax:** | Pattern | Matches | | ---------------- | ----------------------------- | | `example.com` | Exact match only | | `*.example.com` | Any subdomain (not the apex) | | `**.example.com` | Apex domain and any subdomain | **Example:** ```json theme={null} { "sandbox": { "allowed_domains": [ "github.com", "**.npmjs.org", "**.crates.io", "**.pypi.org" ], "denied_domains": ["evil.example.com"], "network_mode": "full" } } ``` Domain filtering applies when the sandbox is active (`--sandbox`). Without `--sandbox`, the sandbox section is ignored. For enterprise teams, admins can override domain lists via [Team Settings](/cli/enterprise/team-settings#sandbox-enforcement). Enterprise allowlists are authoritative (they replace your local `allowed_domains`), while enterprise denylists are additive (merged with your local `denied_domains`). *** ## JSON with Comments Config files support JavaScript-style comments: ```json theme={null} { // Line comments "agent": { "model": "sonnet" // Inline comments }, /* Block comments */ "permissions": {} } ``` # Configuration Precedence Source: https://docs.devin.ai/cli/reference/configuration/global-vs-local How global, project, and local settings interact Devin CLI loads configuration from multiple sources and merges them together. Understanding the precedence order helps you set up the right configuration for your team and personal preferences. *** ## Configuration Layers From highest to lowest priority: | Priority | Source | Notes | | ----------- | ------------------------------------------------------------------------------ | -------------------- | | 1 (highest) | Organization / Team Settings | Cannot be overridden | | 2 | Session (interactive approvals) | In-memory only | | 3 | Project Local (`.devin/config.local.json`) | Personal, gitignored | | 4 | Project (`.devin/config.json`) | Shared with team | | 5 (lowest) | User (`~/.config/devin/config.json`; `%APPDATA%\devin\config.json` on Windows) | Your defaults | When the same setting is defined at multiple levels, the higher-priority source wins. *** ## When to Use Each Level **Path:** `~/.config/devin/config.json` (`%APPDATA%\devin\config.json` on Windows) Use for personal preferences that apply everywhere: * Default model preference * Theme preference * Personal MCP servers (e.g., your own API keys) * Global permission grants ```json theme={null} { "agent": { "model": "opus" }, "permissions": { "allow": ["Read(**)", "Exec(git)"] } } ``` **Path:** `.devin/config.json` Use for team standards committed to the repository. Only `permissions`, `mcpServers`, `read_config_from`, and `hooks` are available at this level: * Shared MCP servers (with non-secret config) * Team permission policies * Import settings * Lifecycle hooks ```json theme={null} { "permissions": { "allow": ["Exec(npm run)", "Read(src/**)"], "deny": ["Exec(sudo)"] }, "mcpServers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"] } } } ``` **Path:** `.devin/config.local.json` Use for personal overrides that shouldn't be committed: * API keys and secrets * Personal tool preferences for this project * Permission overrides ```json theme={null} { "mcpServers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_TOKEN": "ghp_my_personal_token" } } } } ``` Local config files are automatically excluded from git via `.git/info/exclude`. Managed by your enterprise admin through the team settings dashboard. These settings cannot be overridden by individual users and enforce organization-wide policies like model restrictions and MCP server allowlists. *** ## What's Available at Each Level Project configs (`.devin/config.json` and `.devin/config.local.json`) only support a subset of settings. The table below shows which settings are available at each level: | Setting | User config | Project config | | -------------------------- | :---------: | :------------: | | `permissions` | ✓ | ✓ | | `mcpServers` | ✓ | ✓ | | `read_config_from` | ✓ | ✓ | | `hooks` | ✓ | ✓ | | `agent` (model) | ✓ | ✗ | | `theme_mode` | ✓ | ✗ | | `unicode_mode` | ✓ | ✗ | | `show_path` | ✓ | ✗ | | `show_hints` | ✓ | ✗ | | `include_gitignored_files` | ✓ | ✗ | | `sandbox` | ✓ | ✗ | Settings marked as user-config only can only be set in the user config (`~/.config/devin/config.json`; `%APPDATA%\devin\config.json` on Windows) and do not participate in the precedence hierarchy above. *** ## How Merging Works The precedence table above only applies to settings that support multiple levels (`permissions`, `mcpServers`, `read_config_from`, `hooks`). ### Permissions Permission lists are **merged** (combined) across levels. A denial at a higher level cannot be overridden by an allow at a lower level. For example, if your organization denies `Exec(sudo)`, adding `Exec(sudo)` to your user allow list has no effect — the organization denial always wins. However, other permissions like `Read(**)` at the project level are applied normally. ### MCP Servers MCP server configs are **merged by name**. A server defined at a higher level overrides the same-named server at a lower level. For example, if both your user config and project config define a "github" server, the project config version wins because it has higher priority than user config. ### Hooks Hooks are **collected** from all sources and all run. A hook defined in the user config runs alongside hooks defined in the project config — they do not override each other. *** ## Project Root Detection Devin CLI finds your project root by looking for a `.git` or `.jj` directory, walking up from your current working directory. Project config (`.devin/`) is loaded from the project root. If you have nested `.devin/` directories (e.g., in a monorepo), subdirectory configs take precedence over ancestor configs. *** ## File Discovery Summary | File | Found by | Shared? | | ----------------------------------- | ------------------- | --------------- | | `~/.config/devin/config.json` | XDG path | No | | `.devin/config.json` | Walking up from cwd | Yes (committed) | | `.devin/config.local.json` | Walking up from cwd | No (gitignored) | | `.devin/skills/*/SKILL.md` | Project root | Yes (committed) | | `~/.config/devin/skills/*/SKILL.md` | XDG path | No | | `AGENTS.md` | Project root | Yes (committed) | | `~/.config/devin/AGENTS.md` | XDG path | No | **Windows:** Paths shown as `~/.config/devin/` use the XDG convention for Linux/macOS. On Windows, these resolve to `%APPDATA%\devin\` (typically `C:\Users\\AppData\Roaming\devin\`). # Configuration Import Source: https://docs.devin.ai/cli/reference/configuration/read-config-from Control how Devin CLI imports settings from Cursor, Windsurf, Claude Code, OpenCode, VS Code, and Zed Devin CLI can automatically import rules and configuration from other AI coding tools installed in your project. This happens when standard project rule files or configuration files from Cursor, Windsurf, Claude Code, OpenCode, VS Code, or Zed are detected in your workspace. *** ## How It Works When you start a session, Devin CLI checks for standard project rule files and configuration files from supported tools, then imports what it finds. ### Standard project rules | What's imported | Source files | | --------------- | ------------------------------------------------------------ | | Rules | `AGENTS.md`, `AGENTS.local.md`, `AGENT.md`, `.windsurfrules` | ### Cursor | What's imported | Source files | | --------------- | ------------------------------------------- | | Rules | `.cursor/rules/*.md`, `.cursor/rules/*.mdc` | | MCP servers | `.cursor/mcp.json` | ### Windsurf | What's imported | Source files | | --------------- | ------------------------------------------------------------------------------------------ | | Rules | `.windsurf/rules/*.md`, `.windsurf/global_rules.md` (at workspace root and subdirectories) | | Skills | `.windsurf/skills/` (project), `~/.codeium//skills/` (global, channel-dependent) | | MCP servers | `~/.codeium//mcp_config.json` (channel-dependent) | Devin CLI reads from the Windsurf config directory matching its own channel: stable reads from `~/.codeium/windsurf/`, next reads from `~/.codeium/windsurf-next/`, insiders reads from `~/.codeium/windsurf-insiders/`. `.windsurf/rules/` directories can exist at multiple levels in your project. Rules at the workspace root are loaded at session start. Rules in subdirectories are discovered lazily when the agent accesses files in that directory. Windsurf workflows (`.windsurf/workflows/` and `~/.codeium//global_workflows/`) are **not** imported as skills. ### Claude Code | What's imported | Source files | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Rules | `CLAUDE.md`, `~/.claude/CLAUDE.md` | | Skills | `.claude/skills/**/SKILL.md` | | Commands (as skills) | `.claude/commands/**/*.md` | | MCP servers | `.mcp.json`, `.claude/settings.json`, `.claude/settings.local.json`, `~/.claude.json`, `~/.claude/settings.json`, `~/.claude/settings.local.json`, `~/.claude/mcp_servers.json` | ### OpenCode | What's imported | Source files | | --------------- | ---------------------------------------------------------------------- | | MCP servers | `opencode.json` (project), `~/.config/opencode/opencode.json` (global) | OpenCode uses a different MCP schema from the standard format. Commands can be arrays or strings, environment variables use the `"environment"` key, and servers use an `"enabled"` flag (inverted from the standard `"disabled"` flag). These are automatically converted during import. ### VS Code | What's imported | Source files | | --------------- | --------------------------------- | | MCP servers | `.vscode/mcp.json` (project only) | VS Code uses a `"servers"` key instead of the standard `"mcpServers"` key. ### Zed | What's imported | Source files | | --------------- | ---------------------------------------------------------------------- | | MCP servers | `.zed/settings.json` (project), `~/.config/zed/settings.json` (global) | Zed uses a `"context_servers"` key in its settings file. *** ## Disabling Configuration Import To stop importing from a specific tool, set it to `false` in your config: ```json theme={null} // ~/.config/devin/config.json // (on Windows: %APPDATA%\devin\config.json) { "read_config_from": { "agents_standard": false, "cursor": false, "windsurf": false, "claude": false, "opencode": false, "vscode": false, "zed": false } } ``` ```json theme={null} // .devin/config.json { "read_config_from": { "windsurf": false } } ``` You can disable imports selectively — for example, import from Cursor but not Windsurf: ```json theme={null} { "read_config_from": { "cursor": true, "windsurf": false } } ``` *** ## Options | Option | Type | Default | Description | | ----------------- | ------- | ------- | --------------------------------------------------------------------------------------------------- | | `agents_standard` | boolean | `true` | Import standard project rules from `AGENTS.md`, `AGENTS.local.md`, `AGENT.md`, and `.windsurfrules` | | `cursor` | boolean | `true` | Import rules and MCP servers from Cursor config files | | `windsurf` | boolean | `true` | Import rules, skills, and MCP servers from Windsurf | | `claude` | boolean | `true` | Import rules, skills, commands, and MCP servers from Claude Code | | `opencode` | boolean | `true` | Import MCP servers from OpenCode config files | | `vscode` | boolean | `true` | Import MCP servers from VS Code config files | | `zed` | boolean | `true` | Import MCP servers from Zed settings files | Setting a value to `true` (or leaving it unset) enables import. Setting it to `false` disables import for that tool. *** ## Default Behavior If you don't explicitly configure `read_config_from`, all imports are enabled by default. Set any option to `false` to disable imports from that tool. # Keyboard Shortcuts Source: https://docs.devin.ai/cli/reference/keyboard-shortcuts Common keyboard shortcuts in Devin CLI ## Input Shortcuts These shortcuts work while typing at the prompt. | Shortcut | Description | | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | | `Enter` | Submit your message | | `Shift+Enter`\* or `Alt+Enter` | Insert a newline (for multi-line input) | | `Shift+Tab` | Cycle between modes (Normal, Accept Edits, Plan, Bypass, Autonomous) | | `Ctrl+C` | Cancel current input (clears text), or cancel running agent | | `Ctrl+D` | Exit (when input is empty) | | `Esc` | Cancel running agent | | `Ctrl+G` | Open external editor for composing your message | | `Ctrl+R` | Open fuzzy search over previous prompts and insert the selected prompt | | `Ctrl+O` | Open full-screen viewer for the thinking trace | | `Ctrl+L` | Redraw / refresh the screen | | `Ctrl+V` or `Shift+Insert` | Paste from clipboard (images appear in input area; use Left/Right to navigate, Backspace to remove) | | `!` | Enter bash mode to run a shell command directly (when input is empty). Press `Backspace` or `Esc` on an empty input to exit bash mode | | `@` | Open file/directory autocomplete to add context | On macOS, `Alt` is the `Option` key. Some shortcuts below use `Alt` (Option) as a modifier. We recommend [configuring Option as Meta](/cli/reference/terminal-compatibility#configuring-option-as-meta-on-macos) for the best experience. \* Requires a [compatible terminal](/cli/reference/terminal-compatibility). Terminals that do not support the Kitty keyboard protocol cannot distinguish `Shift+Enter` from `Enter`. Use `Alt+Enter` or `Ctrl+J` instead. *** ## Mode & Model Shortcuts | Shortcut | Description | | ------------------------ | ------------------------------------------------------------------------------------ | | `Shift+Tab` | Cycle to the next mode (Normal → Accept Edits → Plan → Bypass → Autonomous → Normal) | | `Alt+T` (macOS: `Opt+T`) | Cycle thinking level for the current model | You can also switch modes with slash commands: `/normal`, `/plan`, `/bypass`, or `/mode `. Use `/ask ` as a oneshot command to ask questions without switching modes. *** ## Text Editing The input uses readline-style or Emacs-style keybindings for text editing. # Permissions Source: https://docs.devin.ai/cli/reference/permissions Control what the agent can do with fine-grained permission rules The permission system controls which actions the agent can perform without asking for your approval. You can pre-approve safe actions, block dangerous ones, and always prompt for sensitive operations. *** ## Default Permission Behavior Devin CLI uses a tiered permission system to balance power and safety. The default behavior depends on the current [mode](/cli/essential-commands#modes): Each cell shows whether that tool runs automatically (**Auto**, no prompt) or waits for your approval (**Prompt**) in that mode: | Tool type | Example | Normal | Accept Edits | Bypass | Autonomous (sandbox) | | ----------------------------- | ---------------------- | ------ | ------------------- | ------ | -------------------- | | Read-only | File reads, grep, glob | Auto | Auto | Auto | Auto | | Fetch | HTTP requests | Prompt | Prompt | Auto | Auto | | Bash commands | Shell execution | Prompt | Prompt | Auto | Auto | | File edits via `edit`/`write` | Edit/write files | Prompt | Auto (in workspace) | Auto | Prompt | In **Normal mode** (the default), read-only operations are auto-approved while writes and shell commands require your explicit approval. Each time you approve an action, you can choose to allow it once, for the session, or permanently for the project. In **Accept Edits mode**, file edits within the workspace are auto-approved, but shell commands and writes outside the workspace still prompt. In **Bypass mode**, all tool calls are auto-approved without prompting. In **Autonomous mode**, shell commands and network fetches auto-approve because the OS-level sandbox enforces what they can touch. Direct file edits via the `edit`/`write` tools still prompt, because those tools operate outside the sandbox. Autonomous is only available when the [OS-level sandbox](#autonomous-mode) is active. Bypass and Autonomous modes do **not** override organization-level permissions. Admin-enforced deny and ask rules configured via [Team Settings](/cli/enterprise/team-settings) remain active regardless of the user's permission mode. See [Precedence](#precedence) for details. ### Autonomous Mode Autonomous is the permission mode that pairs with the `--sandbox` flag. Conceptually it is roughly "Accept Edits in the current workspace" plus the ability to run any shell command, with both behaviors contained by the OS-level sandbox. When sandbox is active: * **It is the only permission mode available.** Normal, Accept Edits, and Bypass are hidden in sandbox sessions. Plan mode remains available. * **Shell commands and fetches auto-approve** instead of prompting, because the sandbox enforces what they can read, write, and reach over the network. * **Direct file edits via the `edit` and `write` tools still prompt.** These tools run inside the CLI process rather than inside the sandbox, so they cannot be bounded by it. Granting a `Write(...)` scope at the prompt dynamically expands the sandbox so subsequent shell commands can write there. * **Scopes granted mid-session dynamically expand the sandbox** for subsequent commands. ```bash theme={null} devin --sandbox --permission-mode autonomous ``` Use Bypass when you want unrestricted execution without OS-level isolation; use `--sandbox` (which selects Autonomous) when you want unattended execution with OS-enforced limits on filesystem and network access. See the [sandbox configuration reference](/cli/reference/configuration/config-file#sandbox) for details on writable/readable roots and domain filtering, and [Team Settings → Sandbox Enforcement](/cli/enterprise/team-settings#sandbox-enforcement) for enterprise controls. *** ## How Permissions Work When the agent calls a tool, the permission system checks your rules in priority order: 1. **Deny rules** — Checked first. If matched, the action is blocked immediately. 2. **Ask rules** — Checked second. If matched, you're always prompted (overrides any allow rules). 3. **Allow rules** — Checked last. If matched, the action proceeds without prompting. 4. **Default** — If no rule matches, you're prompted for approval. Because deny is checked before ask, and ask is checked before allow, a deny rule always wins. If the same scope matches both a deny and an ask rule, the deny takes effect. *** ## Configuration Add permissions to your config file's `permissions` section: On Windows, the user config path is `%APPDATA%\devin\config.json` (typically `C:\Users\\AppData\Roaming\devin\config.json`) rather than `~/.config/devin/config.json`. See [Configuration File](/cli/reference/configuration/config-file#file-locations) for details. ```json theme={null} // .devin/config.json { "permissions": { "allow": [ "Read(src/**)", "Exec(npm run)" ], "deny": [ "Exec(rm)" ] } } ``` ```json theme={null} // ~/.config/devin/config.json { "permissions": { "allow": [ "Read(**)", "Exec(git)" ] } } ``` ```json theme={null} // .devin/config.local.json { "permissions": { "allow": [ "Exec(docker compose)" ] } } ``` *** ## Permission Syntax There are two types of permission matchers: **scope-based** (controlling what paths/commands/URLs are accessible) and **tool-based** (controlling which tools can be used). ### Scope-Based Permissions Controls file read access. The glob pattern matches file paths. ```json theme={null} "allow": [ "Read(src/**)", // All files under src/ "Read(~/.config/**)", // Home config files "Read(/tmp/**)" // Temp directory ] ``` Directory paths automatically match all files within them. Controls file write/edit access. ```json theme={null} "allow": [ "Write(src/**)", // Can write anywhere in src/ "Write(tests/**)" // Can write test files ], "deny": [ "Write(*.lock)", // Can't modify lock files "Write(.env*)" // Can't modify env files ] ``` Controls shell command execution. Matches commands that start with the given prefix. ```json theme={null} "allow": [ "Exec(git)", // git, git status, git commit... "Exec(npm run)", // npm run test, npm run build... "Exec(python)" // python, python script.py... ], "deny": [ "Exec(rm)", // Blocks rm, rm -rf, etc. "Exec(sudo)" // Blocks sudo commands ] ``` `Exec(git)` matches "git", "git status", "git commit -m 'msg'" but NOT "gitk" or "github-cli". The prefix must match as a complete word. Controls HTTP fetch access using URL patterns. ```json theme={null} "allow": [ "Fetch(https://api.github.com/*)", // GitHub API "Fetch(https://*.example.com/*)", // All example.com subdomains "Fetch(domain:npmjs.org)" // Any URL on npmjs.org ] ``` URL patterns follow the [WHATWG URL Pattern](https://urlpattern.spec.whatwg.org/) standard. The `domain:` shorthand matches any path on the exact domain. ### Tool-Based Permissions Match by tool name to control entire tools: ```json theme={null} { "permissions": { "deny": [ "edit", // Block all file edits "exec" // Block all command execution ], "allow": [ "read", // Allow all file reads "grep", // Allow all searches "glob" // Allow all file finding ] } } ``` **Available tool names:** `read`, `edit`, `grep`, `glob`, `exec` ### MCP Tool Permissions Control access to MCP server tools: ```json theme={null} { "permissions": { "allow": [ "mcp__github__list_issues", // Specific tool on specific server "mcp__github__*", // All tools on github server "mcp__*" // All MCP tools ], "deny": [ "mcp__github__delete_repo" // Block specific dangerous tool ] } } ``` | Pattern | Matches | | ------------------- | ------------------------ | | `mcp__server__tool` | One specific tool | | `mcp__server__*` | All tools on a server | | `mcp__*` | All MCP tools everywhere | *** ## Path Patterns Glob patterns in `Read()` and `Write()` support: | Pattern | Meaning | | ------- | ----------------------------------------------- | | `*` | Any characters in a single path segment | | `**` | Any characters across path segments (recursive) | | `~` | Home directory expansion | **Examples:** ```json theme={null} "allow": [ "Read(**)", // All files everywhere "Read(src/**/*.ts)", // All TypeScript in src/ "Write(~/projects/myapp/**)" // Write to specific project ] ``` Use an absolute path prefix (e.g., `Read(/**)`) when you want to match all files on the system. A bare `Read(**)` without a leading `/` is resolved relative to your current working directory, so it only matches files under that directory — not files accessed via absolute paths elsewhere. *** ## Persistence Options When the agent asks for permission during a session, you can choose how to save your decision: | Option | Where it's saved | Shared with team? | | ------------------------- | ------------------------------------------------------------------------ | ----------------- | | Allow once | Not saved | No | | Allow for session | In memory only | No | | Allow for project | `.devin/config.json` | Yes | | Allow for project (local) | `.devin/config.local.json` | No | | Allow globally | `~/.config/devin/config.json` (`%APPDATA%\devin\config.json` on Windows) | No | ### MCP Server-Level Grants When prompted for a specific MCP tool (e.g., `list_issues` on the Figma server), the permission prompt also offers broader server-level options: | Option | Effect | | --------------------------------------------- | ---------------------------------------------------------- | | Allow this tool (this session) | Grants access to the specific tool for the current session | | Always allow this tool | Persists the specific tool grant to config | | Allow all tools on this server (this session) | Grants access to every tool on the server for the session | | Always allow tools on this server | Persists server-wide access to config | This lets you quickly grant blanket access to a trusted MCP server without approving each tool individually. *** ## Precedence When multiple permission sources define rules, they're merged with this precedence (highest first): 1. Organization/team settings (if enterprise) 2. Session-level grants (interactive approvals) 3. Project local config (`.devin/config.local.json`) 4. Project config (`.devin/config.json`) 5. User config (`~/.config/devin/config.json`; `%APPDATA%\devin\config.json` on Windows) Organization-level denials cannot be overridden by project or user config. This ensures enterprise policies are enforced. *** ## Examples ### Minimal Development Setup Allow common read-only operations, prompt for everything else: ```json theme={null} { "permissions": { "allow": [ "Read(**)", "Exec(git status)", "Exec(git diff)", "Exec(git log)" ] } } ``` ### Full Trust for a Project Auto-approve most operations within the project: ```json theme={null} { "permissions": { "allow": [ "Read(**)", "Write(src/**)", "Write(tests/**)", "Exec(npm)", "Exec(git)", "Exec(node)" ], "deny": [ "Exec(rm -rf)", "Exec(sudo)", "Write(.env*)" ] } } ``` ### Locked-Down Enterprise Restrict to specific safe operations, always prompt for writes: ```json theme={null} { "permissions": { "allow": [ "Read(src/**)", "Exec(git status)", "Exec(git diff)", "Exec(npm run lint)" ], "deny": [ "Exec(rm)", "Exec(sudo)", "Write(.env*)" ], "ask": [ "Write(**)", "exec" ] } } ``` In this example, writes to `.env*` are denied outright, all other writes always prompt the user, and only a few read-only commands are auto-approved. Since deny is checked before ask, the `.env*` denial takes priority over the `Write(**)` ask rule. # Terminal Compatibility Source: https://docs.devin.ai/cli/reference/terminal-compatibility Supported terminals and recommendations for the best Devin CLI experience Devin CLI works across a wide range of terminal emulators, but some terminals offer a better experience than others. This page covers compatibility levels, recommendations, and configuration tips. *** ## Compatibility Overview Terminals are grouped into three tiers based on their feature support: ### Fully Supported (all features work) These terminals support the [Kitty keyboard protocol](https://sw.kovidgoyal.net/kitty/keyboard-protocol/), which enables reliable detection of key combinations like `Shift+Enter` for multi-line input. | Terminal | Platform | Notes | | ------------------------------------------- | ---------------------- | --------------------------------------------------------------------- | | [Kitty](https://sw.kovidgoyal.net/kitty/) | macOS†, Linux | Recommended for power users. Used by the developers of Devin CLI. | | [Ghostty](https://ghostty.org/) | macOS†, Linux | Recommended for power users. Used by the developers of Devin CLI. | | [WezTerm](https://wezfurlong.org/wezterm/) | macOS†, Linux, Windows | Recommended for power users. | | [iTerm2](https://iterm2.com/) | macOS† | Recommended for most users. Version 3.5+ required for best support. | | [Windows Terminal](https://aka.ms/terminal) | Windows | Recommended for most users. 1.25 or higher required for best support. | ### Supported (some features limited) These terminals work with Devin CLI but are not ideal because they do not support the Kitty keyboard protocol. For example, `Shift+Enter` will not insert a newline — use `Alt+Enter` or `Ctrl+J` instead. | Terminal | Platform | Notes | | -------------------------------------------------------------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------- | | [Terminal.app](https://support.apple.com/guide/terminal/welcome/mac) | macOS† | Built-in macOS terminal. Requires [Option-as-Meta configuration](#configuring-option-as-meta-on-macos) for `Alt` shortcuts. | | Git Bash | Windows | Included with [Git for Windows](https://git-scm.com/download/win). | | DEC VT100 | Various | Set terminal mode to `legacy` in `/config`. | | Generic ANSI terminals | Various | Any terminal with basic ANSI escape code support. | | [Alacritty](https://alacritty.org/) | macOS†, Linux, Windows | Strongly discouraged / not recommended for best performance. | † On macOS, we recommend [configuring Option as Meta](#configuring-option-as-meta-on-macos) for the best experience with `Alt`-based shortcuts. On macOS terminals that have not been configured for Option-as-Meta, `Alt` (Option) shortcuts like `Alt+Enter` for multi-line input won't work. See [Configuring Option-as-Meta on macOS](#configuring-option-as-meta-on-macos) below. ### Unsupported These terminals are not supported and may exhibit significant issues. We highly recommend switching to a supported terminal. | Terminal | Platform | Notes | | ----------------- | -------- | --------------------------------------------------------------------------------------- | | cmd.exe (conhost) | Windows | Legacy Windows command prompt. Use [Windows Terminal](https://aka.ms/terminal) instead. | *** ## Recommendations | Platform | Recommendation | | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | **Windows** | [Windows Terminal](https://aka.ms/terminal) 1.25 or higher | | **macOS** (general) | [iTerm2](https://iterm2.com/) | | **macOS / Linux** (power users) | [Kitty](https://sw.kovidgoyal.net/kitty/), [Ghostty](https://ghostty.org/), or [WezTerm](https://wezfurlong.org/wezterm/) | *** ## Configuring Option-as-Meta on macOS On macOS, the Option key is used as a compose key by default in most terminals, which means `Alt`-based shortcuts (like `Alt+Enter` for multi-line input or `Alt+T` for cycling thinking level) won't work until you configure the terminal to treat Option as Meta/Alt. 1. Open **iTerm2 > Settings** (or press `Cmd+,`) 2. Go to **Profiles > Keys > General** 3. Set **Left Option Key** to **Esc+** 4. Optionally set **Right Option Key** to **Esc+** as well [iTerm2 documentation](https://iterm2.com/documentation-preferences-profiles-keys.html) 1. Open **Terminal > Settings** (or press `Cmd+,`) 2. Go to **Profiles** and select your active profile 3. Click the **Keyboard** tab 4. Check **Use Option as Meta Key** [Apple documentation](https://support.apple.com/guide/terminal/change-profiles-keyboard-settings-trmlkbrd/mac) Add the following to your `alacritty.toml` configuration file: ```toml theme={null} [keyboard] option_as_alt = "Both" ``` [Alacritty configuration reference](https://alacritty.org/config-alacritty.html) Add the following to your `kitty.conf` configuration file: ```text theme={null} macos_option_as_alt yes ``` Restart Kitty after making this change. [Kitty documentation](https://sw.kovidgoyal.net/kitty/conf/#opt-kitty.macos_option_as_alt) Add the following to your Ghostty configuration file: ```text theme={null} macos-option-as-alt = true ``` Restart Ghostty after making this change. [Ghostty documentation](https://ghostty.org/docs/config/reference#macos-option-as-alt) Add the following to your `~/.wezterm.lua` configuration file: ```lua theme={null} config.send_composed_key_when_left_alt_is_pressed = false config.send_composed_key_when_right_alt_is_pressed = false ``` [WezTerm documentation](https://wezfurlong.org/wezterm/config/lua/config/send_composed_key_when_left_alt_is_pressed.html) # Sandbox Source: https://docs.devin.ai/cli/sandbox OS-level isolation for Devin CLI sessions: how the sandbox works, network filtering, and enterprise enforcement. The `--sandbox` flag runs the CLI with OS-level isolation, enforcing the active Read and Write permission scopes at the operating-system level and optionally restricting network traffic. ## How the sandbox works When the sandbox is active: * **Writable paths** are derived from granted `Write(...)` permission scopes plus the workspace directory * **Readable paths** are derived from granted `Read(...)` scopes (platform defaults like `/usr/bin` are always readable) * Scopes granted mid-session dynamically expand the sandbox for subsequent commands If sandbox resolution fails (e.g., the sandboxing tools are unavailable on the user's platform), the CLI will **refuse to start** rather than running unsandboxed. This fail-closed behavior applies whether sandbox was enabled by a [team setting](/cli/enterprise/team-settings#sandbox-enforcement) or by the user passing `--sandbox` directly, ensuring the security intent is never silently bypassed. Common causes of sandbox resolution failure: * **Windows**: OS-level sandboxing is not currently supported on Windows. Sessions on Windows will hard-fail when `--sandbox` is passed or when sandbox enforcement is **Required**, including when the CLI runs as an ACP server inside an IDE (e.g., Devin Desktop). * **Linux**: Sandboxing requires `bubblewrap` (`bwrap`) and `socat` to be installed. Sessions hard-fail with installation instructions when these are missing. * **Permission scope errors**: Invalid paths in permission scopes that can't be resolved. ## Network filtering Sandbox network filtering is currently unstable. If you need this feature, please reach out to your account representative for stability timelines. Configure domain-level network filtering for the sandbox in the [`sandbox` section of your config file](/cli/reference/configuration/config-file#sandbox) (user config only). When `--sandbox` is active and domain filtering is configured, a managed network proxy starts on loopback and the sandbox restricts all child traffic to route through it. | Option | Type | Default | Description | | ----------------- | --------- | -------- | ------------------------------------------------------------------------------------------------------------- | | `allowed_domains` | string\[] | `[]` | Domain patterns allowed through the proxy. When non-empty, only matching domains are allowed (allowlist mode) | | `denied_domains` | string\[] | `[]` | Domain patterns always blocked. Deny rules take precedence over allow rules | | `network_mode` | string | `"full"` | `"full"` allows all HTTP methods; `"limited"` allows only GET/HEAD/OPTIONS | **Domain pattern syntax:** | Pattern | Matches | | ---------------- | ----------------------------- | | `example.com` | Exact match only | | `*.example.com` | Any subdomain (not the apex) | | `**.example.com` | Apex domain and any subdomain | **Example:** ```json theme={null} { "sandbox": { "allowed_domains": [ "github.com", "**.npmjs.org", "**.crates.io", "**.pypi.org" ], "denied_domains": ["evil.example.com"], "network_mode": "full" } } ``` Domain filtering applies when the sandbox is active (`--sandbox`). Without `--sandbox`, the sandbox section is ignored. ## Excluded commands Sometimes a specific command needs to run *outside* the sandbox — for example `git` commands that must access credentials or hooks the sandbox blocks. The `sandbox.excluded` config section lets you exclude matching commands from sandbox isolation using the same `Exec(...)` rule syntax as [permissions](/cli/reference/permissions): | Option | Type | Description | | ---------------- | --------- | -------------------------------------------------------------------------- | | `excluded.allow` | string\[] | Matching commands run outside the sandbox automatically | | `excluded.ask` | string\[] | Matching commands run outside the sandbox after the user approves a prompt | | `excluded.deny` | string\[] | Matching commands are never excluded — they always stay inside the sandbox | **Example:** ```json theme={null} { "sandbox": { "excluded": { "allow": ["Exec(git status *)"], "ask": ["Exec(git push *)"], "deny": ["Exec(git tag *)"] } } } ``` **Rule resolution:** for each command, the most specific matching rule wins within a source (e.g., `Exec(git push *)` beats `Exec(git *)`), and when both user config and [team settings](#enterprise-excluded-commands) match, the more restrictive verdict wins (`deny` > `ask` > `allow`). Commands with no matching rule — including when `sandbox.excluded` is not configured at all — always run inside the sandbox. * Only `Exec(...)` rules are supported in `sandbox.excluded`; any other rule type (e.g., `Read(...)`, `Write(...)`) is ignored with a warning. * Exclusion is fail-closed: if a command can't be safely resolved (e.g., it can't be parsed), it stays inside the sandbox. * Exclusions apply to the default per-command exec path. Commands run through a persistent PTY shell (interactive sessions, or when `pty_for_noninteractive_exec` is enabled) always stay inside the sandbox. ## Enterprise enforcement Enterprise admins can control sandbox behavior for their entire organization via [Team Settings](/cli/enterprise/team-settings#sandbox-enforcement). ### Sandbox enforcement mode Set the enforcement level for the `--sandbox` flag across your organization: * **Optional** (default) — Users choose whether to pass `--sandbox`. No enforcement. * **Required** — The `--sandbox` flag is forced on for all users, even if they don't pass it on the command line. All CLI sessions run with OS-level file system sandboxing that enforces Read/Write permission scopes. A future **Strict** mode may lock down sandbox configuration entirely, preventing users from modifying sandbox settings. Ensure all target machines are provisioned before setting sandbox enforcement mode to **Required** across your organization. If any users are on Windows, they will be unable to run the CLI until OS-level sandboxing is supported on Windows or the policy is relaxed to **Optional**. ### Enterprise domain filtering Admins can also configure organization-wide domain allowlists and denylists: * **Domain allowlist** — When set, **only** the domains in this list are reachable through the sandbox network proxy. This list is **authoritative**: it completely replaces any user-configured `allowed_domains`. Users cannot add additional domains to bypass admin restrictions. * **Domain denylist** — Domains that are always blocked. Enterprise denied domains are **additive**: they are merged with the user's local `denied_domains`, making the combined list more restrictive. **How enterprise and user domain lists interact:** | Scenario | Enterprise config | User config | Effective result | | -------------------- | --------------------------------- | --------------------------------- | ------------------------------------------------------------ | | Admin sets allowlist | `allowed_domains: ["github.com"]` | `allowed_domains: ["npmjs.org"]` | Only `github.com` is allowed (enterprise replaces user list) | | Admin sets denylist | `denied_domains: ["evil.com"]` | `denied_domains: ["risky.io"]` | Both `evil.com` and `risky.io` are blocked (merged) | | No admin allowlist | `allowed_domains: []` | `allowed_domains: ["github.com"]` | User's allowlist is used | Because the user's local `denied_domains` are preserved and merged additively, a user could deny a domain that appears in the enterprise allowlist. This is intentional: the combined effect is always more restrictive, never less. If this causes access issues, the user should remove the conflicting entry from their local config. ### Enterprise excluded commands Admins can also set organization-wide [excluded command](#excluded-commands) rules in team settings: * **Excluded allow / ask** — `Exec(...)` rules for commands that may run outside the sandbox across the organization, automatically or after a prompt. * **Excluded deny** — `Exec(...)` rules for commands that must never run outside the sandbox. A team `deny` overrides any user-level `allow` or `ask` for matching commands, so users cannot exclude commands their admins have locked down. Team and user rules are resolved together: the most specific matching rule wins within each source, and the more restrictive verdict wins across sources (`deny` > `ask` > `allow`). **Example: lock down all exclusions except `gh`.** A wildcard `deny` with an `allow` carve-out keeps every command inside the sandbox except `gh`, regardless of what users configure locally. These values go into the team-settings excluded-commands configuration (not the user config file, so there is no enclosing `sandbox` key): ```json theme={null} { "excluded": { "deny": ["Exec(**)"], "allow": ["Exec(gh *)"] } } ``` Because the more specific `Exec(gh *)` rule beats the wildcard `Exec(**)`, `gh` commands run outside the sandbox while everything else stays inside — and the team-level wildcard `deny` overrides any user-level `allow` or `ask` rules for other commands. ## Further reading * [Team Settings](/cli/enterprise/team-settings#sandbox-enforcement) — enterprise sandbox enforcement and domain filtering * [Config file reference](/cli/reference/configuration/config-file#sandbox) — the user-level `sandbox` config section * [Permissions](/cli/reference/permissions) — permission scopes that drive sandbox path resolution # Shell Integration [Feature Preview] Source: https://docs.devin.ai/cli/shell-integration Wrap your shell with Devin to invoke it instantly and give Devin visibility into your recent commands. Shell integration is a **Feature Preview**. It is available on macOS, Linux, and WSL with Bash, Zsh, and Fish. Shell integration is not yet supported on Windows (PowerShell or CMD). You can still run Devin CLI on Windows — this feature just isn't available there yet. It is feature complete but may interact poorly with other shell functionality. If you run into something incompatible please let us know! Shell integration wraps your existing shell session so that Devin runs alongside it. Once set up, you can: * Hit **Ctrl+G** (configurable) anywhere in your shell to invoke Devin with your current command line as context * Type `# ` and press Enter to pass it straight to Devin (Zsh only) * Give Devin automatic visibility into your recent shell commands and their output We strongly recommend using `zsh` over `bash` or `fish` for best support. *** ## Setup Run the setup command to install shell integration into your shell config file: ```bash theme={null} devin shell setup ``` This adds managed blocks to your shell rc file (`~/.bashrc`, `~/.zshrc`, or `~/.config/fish/config.fish`). Then restart your terminal or source the config: ```bash theme={null} source ~/.bashrc ``` ```bash theme={null} source ~/.zshrc ``` ```fish theme={null} source ~/.config/fish/config.fish ``` You can also target a specific shell explicitly: ```bash theme={null} devin shell setup bash devin shell setup zsh devin shell setup fish ``` Shell integration is separate from the `devin setup` wizard. Running `devin setup` does **not** install shell integration — you must run `devin shell setup` separately. *** ## Features