proposal: Add devin desktop support#1167
Conversation
- 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.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthroughAdds Devin Desktop support: new ChangesDevin Desktop Tool Support
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related issues
Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (2)
openspec/changes/add-devin-desktop-support/specs/cli-update/spec.md (1)
3-19: ⚡ Quick winRename 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 winUse “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
📒 Files selected for processing (9)
docs/supported-tools.mdopenspec/changes/add-devin-desktop-support/.openspec.yamlopenspec/changes/add-devin-desktop-support/proposal.mdopenspec/changes/add-devin-desktop-support/specs/cli-init/spec.mdopenspec/changes/add-devin-desktop-support/specs/cli-update/spec.mdopenspec/changes/add-devin-desktop-support/tasks.mdsrc/core/command-generation/adapters/devin.tssrc/core/command-generation/adapters/index.tssrc/core/command-generation/registry.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
left a comment
There was a problem hiding this comment.
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:
-
Devin workflows are flat slash workflows, but the generated bodies still point users at colon commands like
/opsx:applyand describe input after/opsx:propose. Devin Desktop discovers.devin/workflows/opsx-apply.mdas/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. -
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-*.mdare 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:applystyle 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
|
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! |
There was a problem hiding this comment.
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 winAdd 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
📒 Files selected for processing (6)
src/core/command-generation/adapters/devin.tstest/core/available-tools.test.tstest/core/command-generation/adapters.test.tstest/core/command-generation/registry.test.tstest/core/init.test.tstest/core/update.test.ts
alfred-openspec
left a comment
There was a problem hiding this comment.
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-lockfilepnpm 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 buildnode 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-*.mdare generated with no remaining/opsx:references.
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
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
devin) to the CLI tool picker (openspec init).devin/workflows/opsx-<id>.mddocs/supported-tools.mdto include Devin Desktopopenspec updaterefreshes existing Devin workflowsImpact
cli-init,cli-update,command-generationsrc/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)docs/supported-tools.mdKey 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
Documentation
Tests