@obversa/engine-devin-cli runs Devin as an engine: every request is one
fresh devin -p process. Use it to put a Devin model in a writing,
checking or review seat.
Install
@obversa/obversa; install it on its own.
Requirements
- The Devin CLI installed and signed in with your own account. The
devincommand must be on yourPATH, or you pass its path ascliBinary.
Quickstart
devin(model?) is the seat helper a workflow() role takes, as
claude(model) is for Claude. This file runs the seat once on a read-only
question:
examples/engine-devin-cli-seat.ts
npx tsx engine-devin-cli-seat.ts in a git repository that holds
an a.js with two exports. One run printed:
Output
devin('swe-2-max') to name the model. devin models list prints the
models your account can use.
How it runs Devin
Devin runs clean by default: with your home folder and your Devin login, but with an empty config file in place of your Devin settings. Withclean: false it runs as you run it yourself, with your Devin settings
too. Either way it reads the repository’s own instruction files and rules.
Your own MCP servers, skills and personal rules can still load in clean
mode; the engines table has the detail. The plugin adds
only these flags:
Each attempt is a new process. The plugin never continues or resumes an
earlier Devin conversation.
Identity
The plugin reportsprovider: 'cognition'. The model family is the first
part of the model name: swe-2-max gives swe, and claude-opus-5-5-max
gives claude. The result’s effective record names the model Devin reports
for the run, so a seat with no model still records which model answered.
Without a model, the seat records the model as default.
Devin reports token counts in its conversation file, and the result carries
them. If Devin reports none, usage is unknown.
Workspace modes
A step that names no workspace mode runs as
read. The plugin never passes
smart or dangerous.
In print mode Devin cannot ask you. When Devin wants a tool that its
permission mode does not approve, it refuses the tool and does not wait.
Devin then ends the whole run without an answer.
Read-only holds in a read step. A read step that only reads answers
normally. A read step whose model tries to write gets the write refused, and
no file changes. Devin then stops the run, so the attempt fails with
EngineIncompleteResultError. The message says that Devin refused a tool in
read mode, which ends its run without an answer, and that no file changed.
It also repeats Devin’s warning. A run in either mode that exits 0 and
writes its conversation export, but has no final answer for any other
reason, fails with the same error, and its message names the permission
mode. A timeout, a non-zero exit or a missing export fails with its own
error instead.
What Devin cannot do through the plugin
- No list of named tools. Devin has no flag that limits a step to named
tools. The permission mode is the only limit, and a seat’s
toolslist is recorded, not enforced. - No step without a folder.
workspaceMode: 'none'andtools: []fail withinvalid-configbefore Devin starts. - No system prompt. Devin has no flag for one, so a request’s
systemtext goes at the top of the prompt. - No structured result. The final message is text. A request’s
jsonSchemais not sent to Devin. - No live events. The plugin reads the conversation after Devin exits, so text and tool events arrive together at the end.
- No folder trust check. The plugin skips it, for the reason in the table above.
Options
By default Devin runs with
--config pointed at an empty config file
for each attempt, so your own Devin settings file
(~/.config/devin/config.json) stays out. The repository’s instruction
files and rules still apply, and the run keeps your login.
Its row in the engines table: runs on your
setup, clean mode available, read-only held in both modes. Your own MCP
servers and skills still load in clean mode, because Devin has no switch
to leave them out.
Errors
EngineErrorof kindmissing-cliwhen the executable can’t run.EngineErrorof kindinvalid-configfor a step without a folder, a step withtools: [], a step that setseffort, or adevin --versionoutput the plugin cannot read.EngineIncompleteResultErrorwhen Devin exits 0 and writes its conversation export, but has no final answer, for example after it refuses a write in a read step.EngineErrorwhen Devin times out, exits with another code, or writes no readable conversation export, and has no final answer.- Other
EngineErrorkinds, such asauthorrate-limit, are read from Devin’s own error message.
API
devin(model?, options?): aTeamSeatfor a workflow role. Quickstart.DevinCliEngine: the engine class.DevinCliEngineOptionsandDevinSeat: its types.buildDevinArgs: the argument builder, exported for tests.
Next steps
- Runtime: the roles a seat fills.
- Codex CLI Engine: another CLI seat.