Thank you for your interest in contributing to Devsy! This guide will help you get started with development.
Before your first contribution can be merged, you must sign the Contributor License Agreement. When you open a pull request, a bot will check your signing status and, if needed, comment with instructions. You sign by posting a comment on the pull request with the exact text the bot provides.
CLI Development:
Desktop Application Development:
- Node.js 24+ (with npm)
- Go 1.26+
- Python 3.12+ (for native module builds)
-
Clone the repository:
git clone https://github.com/devsy-org/devsy.git cd devsy -
If you want to change Devsy agent code:
- Exchange the URL in DefaultAgentDownloadURL with a custom public repository release
- Build devsy via:
task cli:build:dev - Upload
dist/devsy-dev_linux_amd64_v1/devsy-linux-amd64and ARM64 variant to your public repository release assets
Using Task (recommended):
# Build CLI for development
task cli:build:dev
# Build CLI for production
task cli:build
# Build with Pro features
task cli:build:dev:proUsing Go directly:
CGO_ENABLED=0 go build -ldflags "-s -w" -o devsyThe binary will be output as devsy in the current directory.
Using Task (recommended):
# Setup Electron environment (first time only)
task desktop:setup
# Run in development mode
task desktop:dev
# Build the application
task desktop:buildManual build:
cd desktop
npm ci
npm run buildThe packaged application will be in desktop/release/
# Tidy dependencies
task cli:tidy
# Run linters
task cli:lint
# Run unit tests
task cli:test
# Build for development
task cli:build:devIn renderer code, use $lib/... for imports across renderer library modules and
$shared/... for shared modules. Apply this to type imports, re-exports, and
dynamic imports as well. Keep ./... for sibling files and relative paths for
renderer entry points without an existing alias. Avoid parent-directory imports
(../...) when one of these aliases addresses the module.
Main-process, preload, and shared code use relative imports: the renderer aliases
are not configured in the main/preload bundlers. Preserve the existing .js
extension on TypeScript module specifiers and .svelte on component imports.
# Install dependencies
cd desktop
npm ci
# Check code quality (type check + svelte-check)
task desktop:check
# Run unit tests
task desktop:test
# Run e2e tests
task desktop:test:e2e# Build for e2e tests
task cli:test:e2e:build
# Run all e2e tests
task cli:test:e2e
# Run specific test suite
task cli:test:e2e:suite -- "suite-name"
# Run focused tests
task cli:test:e2e:focus -- "test-pattern"
# Setup kind cluster for testing
task cli:test:e2e:kind:setup
# Teardown kind cluster
task cli:test:e2e:kind:teardownIf you need to modify the gRPC tunnel code:
task cli:build:grpcThis requires:
protobuf-compiler(install viasudo apt install protobuf-compiler)- Go protobuf plugins (installed automatically by the task)
-
Build Devsy:
task cli:build:dev
-
Add a provider:
./dist/devsy-dev_linux_amd64_v1/devsy-linux-amd64 provider add docker
-
Configure the provider:
./dist/devsy-dev_linux_amd64_v1/devsy-linux-amd64 provider use docker
-
Start a workspace:
./dist/devsy-dev_linux_amd64_v1/devsy-linux-amd64 workspace up github.com/microsoft/vscode-remote-try-node
# Build UI using act
task desktop:act:build:ui
# Build desktop app using act
task desktop:act:build:app
# Build flatpak using act
task desktop:act:build:flatpak
# Run e2e tests with focus
task cli:test:e2e:act:focus -- "test-pattern"Read the docs for an introduction to developing your own providers.
Once your provider is ready:
- Update
community.yamlwith your provider information - Update
sites/docs-devsy-sh/content/docs/managing-providers/manage-providers.mdxwith documentation
This will feature your provider in both the documentation and the UI.
Devsy Desktop can handle deep links to perform various actions.
URL Scheme:
devsy://command?param1=value1¶m2=value2
Open a workspace based on a source (similar to devsy workspace up, but shareable):
devsy://open?source=<url-encoded-source>&workspace=<name>&provider=<provider>&ide=<ide>
Parameters:
source(required): URL-encoded workspace sourceworkspace(optional): Workspace nameprovider(optional): Provider to useide(optional): IDE to open
Example:
devsy://open?source=https%3A%2F%2Fgithub.com%2Fuser%2Frepo&workspace=my-workspace&provider=docker&ide=vscode
Import a remote Devsy.Pro workspace into your local client:
devsy://import?workspace_id=<id>&workspace_uid=<uid>&devsy_pro_host=<host>&options=<options>
Parameters:
workspace_id(required): Workspace IDworkspace_uid(required): Workspace UIDdevsy_pro_host(required): Devsy Pro host URLoptions(optional): Additional options
# View all available tasks
task --list
# CLI tasks
task cli:build # Build CLI for production
task cli:build:dev # Build CLI for development
task cli:lint # Run linters
task cli:test # Run unit tests
task cli:tidy # Tidy go.mod and go.sum
# Desktop tasks
task desktop:build # Build desktop application
task desktop:check # Check code quality
task desktop:dev # Run in development mode
task desktop:setup # Setup Electron environment
task desktop:test # Run unit tests
task desktop:test:e2e # Run e2e tests
# E2E testing
task cli:test:e2e # Run all e2e tests
task cli:test:e2e:suite # Run specific test suite
task cli:test:e2e:focus # Run focused tests/cmd- CLI command implementations/pkg- Core packages and libraries/desktop- Desktop application (Electron + Svelte)/e2e- End-to-end tests/providers- Built-in provider definitions/sites- Documentation and download websites/hack- Build and development scripts
Please be respectful and constructive in all interactions with the community.