Skip to content

proposal: Add devin desktop support#1167

Open
mehdishahdoost wants to merge 6 commits into
Fission-AI:mainfrom
mehdishahdoost:feat/add-devin-desktop-support
Open

proposal: Add devin desktop support#1167
mehdishahdoost wants to merge 6 commits into
Fission-AI:mainfrom
mehdishahdoost:feat/add-devin-desktop-support

Conversation

@mehdishahdoost

@mehdishahdoost mehdishahdoost commented Jun 4, 2026

Copy link
Copy Markdown

Summary

Windsurf has been rebranded to Devin Desktop, the new flagship AI coding assistant from Cognition. This proposal adds support for Devin Desktop to OpenSpec, enabling users to transition from Windsurf seamlessly.

Motivation

  • Windsurf → Devin Desktop Transition: Users who previously used Windsurf are now transitioning to Devin Desktop
  • Same Workflow System: Devin Desktop uses the same Cascade workflow system as Windsurf, making it a natural migration path
  • Migration Enabler: OpenSpec currently supports Windsurf but not Devin Desktop. Adding support ensures users can continue using OpenSpec without manual migration
  • Proven Pattern: The adapter pattern is already established and proven with Windsurf; extending it to Devin Desktop is straightforward

Proposal Details

I've created an OpenSpec change proposal following the project's contribution guidelines.

Proposal Location: openspec/changes/add-devin-desktop-support/

What Changes

  • Add Devin Desktop (devin) to the CLI tool picker (openspec init)
  • Create a new Devin adapter that generates commands in .devin/workflows/opsx-<id>.md
  • Register the adapter in the command adapter registry
  • Update docs/supported-tools.md to include Devin Desktop
  • Ensure openspec update refreshes existing Devin workflows
  • Add comprehensive tests for init/update coverage
  • Update CLI prompts and documentation

Impact

  • Specs: cli-init, cli-update, command-generation
  • Code:
    • src/core/command-generation/adapters/devin.ts (new adapter)
    • src/core/command-generation/registry.ts (register adapter)
    • src/core/command-generation/adapters/index.ts (export adapter)
    • CLI tool selection logic
  • Docs: docs/supported-tools.md
  • Tests: init/update integration coverage for Devin Desktop workflows

Key Features

✅ Mirrors proven Windsurf adapter pattern
✅ Backward compatible with existing Windsurf support
✅ Cross-platform path handling (Windows/macOS/Linux)
✅ Comprehensive implementation roadmap
✅ Clear specifications with scenarios
✅ Reduces complexity and risk

Summary by CodeRabbit

  • New Features

    • Devin Desktop support: create and refresh Devin workflow files and add Devin to the CLI tool picker.
  • Documentation

    • Updated supported-tools docs, CLI specs, and implementation checklist to include Devin Desktop and its setup/update behavior.
  • Tests

    • Added tests for Devin workflow generation, CLI init/update flows, adapter registry recognition, path/format handling, and backward compatibility.

- Create new Devin Desktop adapter for .devin/workflows/opsx-<id>.md
- Register adapter in CommandAdapterRegistry
- Export adapter from adapters index
- Update docs/supported-tools.md with Devin Desktop entry
- Add 'devin' to available tool IDs list

Devin Desktop uses the same Cascade workflow system as Windsurf,
making it a natural migration path for existing users.
@mehdishahdoost mehdishahdoost requested a review from TabishB as a code owner June 4, 2026 10:12
@coderabbitai

coderabbitai Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: eb005536-d663-46c7-892f-9393a47bc904

📥 Commits

Reviewing files that changed from the base of the PR and between 9a8befa and cbb8301.

📒 Files selected for processing (1)
  • test/core/command-generation/adapters.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • test/core/command-generation/adapters.test.ts

📝 Walkthrough

Walkthrough

Adds Devin Desktop support: new devinAdapter that emits Devin workflow Markdown with YAML frontmatter, exports and registers the adapter, adds devin to AI_TOOLS, and updates documentation, OpenSpec specs, tasks, and tests.

Changes

Devin Desktop Tool Support

Layer / File(s) Summary
Devin adapter implementation
src/core/command-generation/adapters/devin.ts, test/core/command-generation/adapters.test.ts
Implements devinAdapter with escapeYamlValue and formatTagsArray; produces workflow Markdown files with YAML frontmatter (name, description, category, tags) under .devin/workflows/opsx-<id>.md, rewrites /opsx:/opsx-, and includes adapter unit tests.
Adapter registration, exports, and config
src/core/command-generation/adapters/index.ts, src/core/command-generation/registry.ts, src/core/config.ts, test/core/*
Re-exports devinAdapter, imports and registers it in CommandAdapterRegistry, adds a devin entry to AI_TOOLS (skillsDir: '.devin', successLabel: 'Devin Desktop'), and extends registry/available-tools/init/update tests to cover devin.
Docs, OpenSpec metadata, proposal, specs, and tasks
docs/supported-tools.md, openspec/changes/add-devin-desktop-support/*
Adds Devin to supported-tools table and --tools list; creates OpenSpec metadata file, proposal, cli-init/cli-update specs, and a tasks/checklist documenting implementation and tests.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related issues

Possibly related PRs

Suggested reviewers

  • TabishB

Poem

🐰 I hopped in with a shimmy and yawn,
Quoted tags tucked neat at the crack of dawn,
Workflows placed gently in .devin's nest,
Frontmatter tidy, commands hyphenated best —
Happy hops! Another tool joins the quest. 🥕

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and directly summarizes the main change: adding Devin Desktop support to the project.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (2)
openspec/changes/add-devin-desktop-support/specs/cli-update/spec.md (1)

3-19: ⚡ Quick win

Rename requirement to “Workflow Updates” for consistency with the actual behavior.

This requirement describes refreshing workflow files, not slash commands. Tightening the label avoids ambiguous interpretation in future diffs/tests.

Based on learnings, slash commands and workflow artifacts are distinct concepts in OpenSpec.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@openspec/changes/add-devin-desktop-support/specs/cli-update/spec.md` around
lines 3 - 19, Rename the requirement heading "Requirement: Slash Command
Updates" to "Requirement: Workflow Updates" to match the described behavior;
update any occurrences of that heading text in this spec file (the top-level
requirement title and any references) so tests and readers clearly understand
this applies to workflow files (see the heading string "Requirement: Slash
Command Updates" and the scenarios mentioning workflows for Devin Desktop and
Windsurf).
openspec/changes/add-devin-desktop-support/specs/cli-init/spec.md (1)

20-29: ⚡ Quick win

Use “workflow” terminology instead of “slash command” for Devin/Windsurf scenarios.

The section header conflicts with the scenarios beneath it (which are workflow files). Renaming to “Workflow Configuration” will keep spec language precise.

Based on learnings, in this repo slash commands are agent-interface commands and should be distinguished from workflow-file generation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@openspec/changes/add-devin-desktop-support/specs/cli-init/spec.md` around
lines 20 - 29, The header "Requirement: Slash Command Configuration" is
inconsistent with the scenarios that generate Devin workflow files; rename that
header to "Requirement: Workflow Configuration" (or simply "Workflow
Configuration") and update any references in the same spec section so scenarios
like "Generating workflows for Devin Desktop" and file names
`.devin/workflows/opsx-propose.md`, `.devin/workflows/opsx-apply.md`,
`.devin/workflows/opsx-archive.md` are described as workflow-file generation
(not agent slash commands), and ensure wording mentions using shared templates
wrapped in OpenSpec markers and the Windsurf-style frontmatter (name,
description, category, tags).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/supported-tools.md`:
- Line 33: Docs list 'devin' as a valid tool ID but
parseWorkspaceSkillToolsValue()/getWorkspaceSkillToolIds() derive valid IDs from
AI_TOOLS, which lacks a value 'devin', causing validation to fail; fix by adding
a matching value 'devin' to the corresponding AI_TOOLS entry (the object that
represents Devin Desktop) so getToolsWithSkillsDir()/getWorkspaceSkillToolIds()
will include it, or alternatively update
getToolsWithSkillsDir()/parseWorkspaceSkillToolsValue() to accept the documented
alias; reference AI_TOOLS, getToolsWithSkillsDir(), getWorkspaceSkillToolIds(),
and parseWorkspaceSkillToolsValue() when making the change.

In `@openspec/changes/add-devin-desktop-support/tasks.md`:
- Around line 45-47: The `.devin/skills/openspec-*/SKILL.md` entry appears
inconsistent with the introduced Devin workflow location; open the
"Non-Interactive Setup" section and either correct or remove that skills path so
it matches the actual Devin artifact layout (e.g., if skills live elsewhere,
replace `.devin/skills/openspec-*/SKILL.md` with the correct path, or drop it if
no skills directory is used), and ensure the tools list still includes `devin`
only where appropriate (referencing the `opsx-<id>.md` workflow entry and the
`devin` tool ID).

In `@src/core/command-generation/adapters/devin.ts`:
- Around line 15-23: escapeYamlValue currently leaves implicit-typed YAML
scalars (e.g., true/false, null, yes/no, on/off, plain numbers, hex/exponential)
unquoted which lets parsers coerce them; update escapeYamlValue to detect these
scalar patterns in addition to special chars and force quoting: add a regex
check for booleans (true|false|yes|no|on|off), null variants (null|~), numeric
forms (integers, floats, exponentials, hex/octal), and standalone dot/minus
forms, and if matched, perform the existing escaping (backslashes, quotes,
newlines) and return the value wrapped in double quotes so the result always
remains a string in YAML frontmatter while preserving current escaping logic.

---

Nitpick comments:
In `@openspec/changes/add-devin-desktop-support/specs/cli-init/spec.md`:
- Around line 20-29: The header "Requirement: Slash Command Configuration" is
inconsistent with the scenarios that generate Devin workflow files; rename that
header to "Requirement: Workflow Configuration" (or simply "Workflow
Configuration") and update any references in the same spec section so scenarios
like "Generating workflows for Devin Desktop" and file names
`.devin/workflows/opsx-propose.md`, `.devin/workflows/opsx-apply.md`,
`.devin/workflows/opsx-archive.md` are described as workflow-file generation
(not agent slash commands), and ensure wording mentions using shared templates
wrapped in OpenSpec markers and the Windsurf-style frontmatter (name,
description, category, tags).

In `@openspec/changes/add-devin-desktop-support/specs/cli-update/spec.md`:
- Around line 3-19: Rename the requirement heading "Requirement: Slash Command
Updates" to "Requirement: Workflow Updates" to match the described behavior;
update any occurrences of that heading text in this spec file (the top-level
requirement title and any references) so tests and readers clearly understand
this applies to workflow files (see the heading string "Requirement: Slash
Command Updates" and the scenarios mentioning workflows for Devin Desktop and
Windsurf).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f1310b76-ad6a-4ea0-bb86-f47e4f61ad1a

📥 Commits

Reviewing files that changed from the base of the PR and between 1b06fdd and a0a3fb6.

📒 Files selected for processing (9)
  • docs/supported-tools.md
  • openspec/changes/add-devin-desktop-support/.openspec.yaml
  • openspec/changes/add-devin-desktop-support/proposal.md
  • openspec/changes/add-devin-desktop-support/specs/cli-init/spec.md
  • openspec/changes/add-devin-desktop-support/specs/cli-update/spec.md
  • openspec/changes/add-devin-desktop-support/tasks.md
  • src/core/command-generation/adapters/devin.ts
  • src/core/command-generation/adapters/index.ts
  • src/core/command-generation/registry.ts

Comment thread docs/supported-tools.md
Comment thread openspec/changes/add-devin-desktop-support/tasks.md
Comment thread src/core/command-generation/adapters/devin.ts
Add Devin Desktop entry to AI_TOOLS configuration so that:
- getToolsWithSkillsDir() includes 'devin' as a valid tool ID
- getWorkspaceSkillToolIds() returns 'devin' in the list
- parseWorkspaceSkillToolsValue() accepts 'devin' as valid input
- openspec init --tools devin works correctly

This fixes validation failures where 'devin' was documented in
docs/supported-tools.md but not recognized by validation functions
that derive valid IDs from AI_TOOLS.
Update escapeYamlValue to detect and quote implicit YAML scalars that
would be coerced by parsers:
- Booleans: true, false, yes, no, on, off
- Null variants: null, ~
- Numbers: integers, floats, exponentials, hex (0x), octal (0o)
- Edge cases: standalone dash (-) and dot (.)

This ensures values like 'true', '123', 'null' remain strings in YAML
frontmatter instead of being interpreted as booleans, numbers, or nulls.

Preserves existing escaping logic for special characters and newlines.

@alfred-openspec alfred-openspec left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for adding this. The registry/config wiring is mostly in the right shape, and I verified openspec init --tools devin generates .devin/skills/* plus .devin/workflows/opsx-*.md successfully.

I’m going to request changes before merge for two reasons:

  1. Devin workflows are flat slash workflows, but the generated bodies still point users at colon commands like /opsx:apply and describe input after /opsx:propose. Devin Desktop discovers .devin/workflows/opsx-apply.md as /opsx-apply, same as the existing Windsurf shape. Please either run the body through the hyphen command-reference transformer for the Devin adapter, or make the adapter explicitly follow whatever invocation syntax Devin actually accepts with a citation/test. Otherwise the first workflow will tell users to call a command that does not exist.

  2. The PR does not add focused test coverage despite adding a new adapter and tool ID. Please add at least adapter/registry coverage for devin, plus a focused init/update test that proves .devin/workflows/opsx-*.md are generated/refreshed and the tool is detected from .devin. That would have caught the earlier CodeRabbit wiring issue and will protect this adapter as the tool list keeps growing.

What I ran locally on head fd974e1:

  • pnpm install --frozen-lockfile (build passed via prepare)
  • pnpm vitest run test/core/command-generation/adapters.test.ts test/core/command-generation/registry.test.ts test/core/init.test.ts test/core/update.test.ts test/core/available-tools.test.ts (219 tests passed)
  • Manual isolated node bin/openspec.js init --tools devin --force, which generated the expected .devin/ files but confirmed the body still contains /opsx:apply style references.

Add test coverage for the Devin Desktop adapter including:
- Command reference transformation from colon to hyphen syntax
- YAML frontmatter escaping for special characters and implicit scalars
- File path generation for workflows
- Integration with available tools detection
- Init and update command workflows
@mehdishahdoost

Copy link
Copy Markdown
Author

Hey @alfred-openspec,

Thanks a lot for your review. I've addressed all of your comments and applied the requested changes. Could you please take another look at the PR when you have a chance?

Thanks!

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
test/core/command-generation/adapters.test.ts (1)

747-779: 🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Add cross-platform path test for Devin adapter.

The Devin adapter is missing from the cross-platform path verification tests. Major adapters (Claude, Cursor, Windsurf) have individual path.join verification tests in this section, but Devin does not.

As per coding guidelines, when touching path behavior, add coverage that would fail on Windows path separators.

🧪 Proposed test to add after line 763
   it('Windsurf adapter uses path.join for paths', () => {
     const filePath = windsurfAdapter.getFilePath('test');
     expect(filePath.split(path.sep)).toEqual(['.windsurf', 'workflows', 'opsx-test.md']);
   });
+
+  it('Devin adapter uses path.join for paths', () => {
+    const filePath = devinAdapter.getFilePath('test');
+    expect(filePath.split(path.sep)).toEqual(['.devin', 'workflows', 'opsx-test.md']);
+  });
 
   it('All adapters use path.join for paths', () => {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/core/command-generation/adapters.test.ts` around lines 747 - 779, The
Devin adapter is missing from the cross-platform path tests; add a test that
calls devinAdapter.getFilePath('test') and asserts the path is constructed via
path.join semantics (e.g., split by path.sep yields the expected segments like
['.devin','commands','opsx-test.md'] or otherwise verify it contains path.sep),
similar to the existing Claude/Cursor/Windsurf tests—locate the test block in
adapters.test.ts and insert the new "Devin adapter uses path.join for paths"
it() that references devinAdapter and its getFilePath method.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@test/core/command-generation/adapters.test.ts`:
- Around line 747-779: The Devin adapter is missing from the cross-platform path
tests; add a test that calls devinAdapter.getFilePath('test') and asserts the
path is constructed via path.join semantics (e.g., split by path.sep yields the
expected segments like ['.devin','commands','opsx-test.md'] or otherwise verify
it contains path.sep), similar to the existing Claude/Cursor/Windsurf
tests—locate the test block in adapters.test.ts and insert the new "Devin
adapter uses path.join for paths" it() that references devinAdapter and its
getFilePath method.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 9b243bd9-9b9a-40b1-92ba-482a3ace432a

📥 Commits

Reviewing files that changed from the base of the PR and between fd974e1 and 9a8befa.

📒 Files selected for processing (6)
  • src/core/command-generation/adapters/devin.ts
  • test/core/available-tools.test.ts
  • test/core/command-generation/adapters.test.ts
  • test/core/command-generation/registry.test.ts
  • test/core/init.test.ts
  • test/core/update.test.ts

@alfred-openspec alfred-openspec left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed head cbb8301 after the follow-up commits. The blockers from my prior review are addressed: Devin workflow bodies now rewrite /opsx:* references to /opsx-*, .devin/workflows/ generation/update is covered, AI_TOOLS/registry/detection wiring is present, and the CodeRabbit path-test nit is covered.

Verified locally:

  • pnpm install --frozen-lockfile
  • pnpm vitest run test/core/command-generation/adapters.test.ts test/core/command-generation/registry.test.ts test/core/init.test.ts test/core/update.test.ts test/core/available-tools.test.ts (232 passed)
  • pnpm build
  • node bin/openspec.js validate add-devin-desktop-support --strict
  • Manual node bin/openspec.js init --tools devin --force <tmp> confirmed .devin/skills/* and .devin/workflows/opsx-*.md are generated with no remaining /opsx: references.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants