feat: edit coding agent profiles (#453)

* edit profiles.json

* move default crate configuration to a default_profiles.json

button to open mcp config in editor

initialse empty mcp config files

fix test

new JSON structure

remove editor buttons

fmt and types

* feat: add profile field to follow-up attempt (#442)

* move default crate configuration to a default_profiles.json

* new JSON structure

* feat: add profile field to follow-up attempt; fix follow ups using wrong session id at 2nd+ follow up

fmt

Profile selection (vibe-kanban cf714482)

Right now in the frontend, when viewing a task card, we show the base_coding_agent from the task attempt. We should also show the currently selected profile there in the same way

feat: add watchkill support to CommandBuilder and integrate with Claude executor

feat: refactor profile handling to use ProfileVariant across executors and requests

feat: restructure command modes in default_profiles.json for clarity and consistency

update profile handling to use ProfileVariant across components and add mode selection

fmt

feat: refactor profile handling to use variants instead of modes across components and update related structures

Fix frontend

* Refactor coding agent representation in task and task attempt models

- Changed `base_coding_agent` field to `profile` in `TaskWithAttemptStatus` and `TaskAttempt` structs.
- Updated SQL queries and data handling to reflect the new `profile` field.
- Modified related API endpoints and request/response structures to use `profile` instead of `base_coding_agent`.
- Adjusted frontend API calls and components to align with the updated data structure.
- Removed unused `BaseCodingAgent` enum and related type guards from the frontend.
- Enhanced MCP server configuration handling to utilize the new profile-based approach.

feat: Introduce MCP configuration management

- Added `McpConfig` struct for managing MCP server configurations.
- Implemented reading and writing of agent config files in JSON and TOML formats.
- Refactored MCP server handling in the `McpServers` component to utilize the new configuration structure.
- Removed deprecated `agent_config.rs` and updated related imports.
- Enhanced error handling for MCP server operations.
- Updated frontend strategies to accommodate the new MCP configuration structure.

feat: Introduce MCP configuration management

- Added `McpConfig` struct for managing MCP server configurations.
- Implemented reading and writing of agent config files in JSON and TOML formats.
- Refactored MCP server handling in the `McpServers` component to utilize the new configuration structure.
- Removed deprecated `agent_config.rs` and updated related imports.
- Enhanced error handling for MCP server operations.
- Updated frontend strategies to accommodate the new MCP configuration structure.

Best effort migration; add missing feature flag

feat: refactor execution process handling and introduce profile variant extraction

feat: add default follow-up variant handling in task details context

feat: enhance profile variant selection with dropdown menus in onboarding and task sections

fmt, types

* refactor: rename ProfileVariant to ProfileVariantLabel; Modified AgentProfile to wrap AgentProfileVariant

Fmt, clippy

* Fix rebase issues

* refactor: replace OnceLock with RwLock for AgentProfiles caching; update profile retrieval in executors and routes

---------

Co-authored-by: Gabriel Gordon-Hall <ggordonhall@gmail.com>

Fmt

Fix tests

refactor: clean up unused imports and default implementations in executor modules

Move profiles to profiles.rs

* rename profile to profile_variant_label for readability

rename AgentProfile to ProfileConfig, AgentProfileVariant to VariantAgentConfig

* remove duplicated profile state

* Amp yolo

---------

Co-authored-by: Alex Netsch <alex@bloop.ai>
This commit is contained in:
Gabriel Gordon-Hall
2025-08-14 17:33:33 +01:00
committed by GitHub
parent 2e07aa1a49
commit 9b4ca9dc45
64 changed files with 2086 additions and 1434 deletions

View File

@@ -0,0 +1,138 @@
{
"profiles": [
{
"label": "claude-code",
"mcp_config_path": null,
"CLAUDE_CODE": {
"command": {
"base": "npx -y @anthropic-ai/claude-code@latest",
"params": [
"-p",
"--dangerously-skip-permissions",
"--verbose",
"--output-format=stream-json"
]
},
"plan": false
},
"variants": [
{
"label": "plan",
"mcp_config_path": null,
"CLAUDE_CODE": {
"command": {
"base": "npx -y @anthropic-ai/claude-code@latest",
"params": [
"-p",
"--permission-mode=plan",
"--verbose",
"--output-format=stream-json"
]
},
"plan": true
}
}
]
},
{
"label": "claude-code-router",
"mcp_config_path": null,
"CLAUDE_CODE": {
"command": {
"base": "npx -y @musistudio/claude-code-router code",
"params": [
"-p",
"--dangerously-skip-permissions",
"--verbose",
"--output-format=stream-json"
]
},
"plan": false
},
"variants": []
},
{
"label": "amp",
"mcp_config_path": null,
"AMP": {
"command": {
"base": "npx -y @sourcegraph/amp@0.0.1752148945-gd8844f",
"params": [
"--format=jsonl",
"--dangerously-allow-all"
]
}
},
"variants": []
},
{
"label": "gemini",
"mcp_config_path": null,
"GEMINI": {
"command": {
"base": "npx -y @google/gemini-cli@latest",
"params": [
"--yolo"
]
}
},
"variants": []
},
{
"label": "codex",
"mcp_config_path": null,
"CODEX": {
"command": {
"base": "npx -y @openai/codex exec",
"params": [
"--json",
"--dangerously-bypass-approvals-and-sandbox",
"--skip-git-repo-check"
]
}
},
"variants": []
},
{
"label": "opencode",
"mcp_config_path": null,
"OPENCODE": {
"command": {
"base": "npx -y opencode-ai@latest run",
"params": [
"--print-logs"
]
}
},
"variants": []
},
{
"label": "qwen-code",
"mcp_config_path": "~/.qwen/settings.json",
"GEMINI": {
"command": {
"base": "npx -y @qwen-code/qwen-code@latest",
"params": [
"--yolo"
]
}
},
"variants": []
},
{
"label": "cursor",
"mcp_config_path": null,
"CURSOR": {
"command": {
"base": "cursor-agent",
"params": [
"-p",
"--output-format=stream-json",
"--force"
]
}
},
"variants": []
}
]
}