Files
vibe-kanban/crates/executors/default_profiles.json

194 lines
3.9 KiB
JSON
Raw Normal View History

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>
2025-08-14 17:33:33 +01:00
{
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
"executors": {
"CLAUDE_CODE": {
"DEFAULT": {
"CLAUDE_CODE": {
"dangerously_skip_permissions": true
}
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>
2025-08-14 17:33:33 +01:00
},
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
"PLAN": {
"CLAUDE_CODE": {
"plan": true
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>
2025-08-14 17:33:33 +01:00
}
},
"APPROVALS": {
"CLAUDE_CODE": {
"approvals": true
}
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
}
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>
2025-08-14 17:33:33 +01:00
},
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
"AMP": {
"DEFAULT": {
"AMP": {
"dangerously_allow_all": true
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>
2025-08-14 17:33:33 +01:00
}
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
}
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>
2025-08-14 17:33:33 +01:00
},
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
"GEMINI": {
"DEFAULT": {
"GEMINI": {
"model": "default",
"yolo": true
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>
2025-08-14 17:33:33 +01:00
}
},
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
"FLASH": {
"GEMINI": {
"model": "flash",
"yolo": true
}
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
}
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>
2025-08-14 17:33:33 +01:00
},
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
"CODEX": {
"DEFAULT": {
"CODEX": {
2025-11-17 18:03:23 +00:00
"model": "gpt-5.1-codex",
2025-10-08 11:11:39 +01:00
"sandbox": "danger-full-access"
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>
2025-08-14 17:33:33 +01:00
}
},
"HIGH": {
"CODEX": {
2025-11-17 18:03:23 +00:00
"model": "gpt-5.1-codex",
"sandbox": "danger-full-access",
2025-10-08 11:11:39 +01:00
"model_reasoning_effort": "high"
}
},
"APPROVALS": {
"CODEX": {
2025-11-17 18:03:23 +00:00
"model": "gpt-5.1-codex",
"sandbox": "workspace-write",
"ask_for_approval": "unless-trusted"
}
},
"MAX": {
"CODEX": {
"model": "gpt-5.1-codex-max",
"sandbox": "danger-full-access"
}
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
}
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>
2025-08-14 17:33:33 +01:00
},
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
"OPENCODE": {
"DEFAULT": {
"OPENCODE": {}
}
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>
2025-08-14 17:33:33 +01:00
},
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
"QWEN_CODE": {
"DEFAULT": {
"QWEN_CODE": {
"yolo": true
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>
2025-08-14 17:33:33 +01:00
}
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
}
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>
2025-08-14 17:33:33 +01:00
},
rename cursor to cursor agent (vibe-kanban) (#1072) * Done! I've successfully renamed "Cursor" to "Cursor Agent" throughout the codebase. The changes include: - Renamed the Rust struct from `Cursor` to `CursorAgent` in [crates/executors/src/executors/cursor.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/cursor.rs) - Updated the enum variant in [crates/executors/src/executors/mod.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/mod.rs) with proper serialization attributes - Updated documentation in [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) and [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - Regenerated TypeScript types - All type checks pass (frontend and backend) The serialization still uses "CURSOR" for backwards compatibility, but the struct is now named `CursorAgent` in Rust, making it clear this refers to the Cursor Agent CLI tool. * Perfect! All checks pass. The renaming is complete. The struct is now `CursorAgent` everywhere, serializing as `CURSOR_AGENT`. * Perfect! Done. I've reverted all internal code changes and kept only the user-facing documentation updates: **What remains changed (user-visible):** - [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) - Title changed from "Cursor CLI" to "Cursor Agent CLI" - [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - "Cursor CLI" changed to "Cursor Agent CLI" **What was reverted (internal, not user-visible):** - All Rust struct/enum names back to `Cursor` - All serialization formats back to `CURSOR` - TypeScript types back to `CURSOR` - JSON config files back to `CURSOR` All checks pass ✅ * Perfect! Now users will see "CURSOR_AGENT" in the UI when selecting agents, while the code stays clean with the `Cursor` struct name, and documentation still says "Cursor CLI". All checks pass ✅ **What changed (user-visible in UI):** - Agent selection dropdowns show "CURSOR_AGENT" instead of "CURSOR" - JSON configs use "CURSOR_AGENT" - MCP server documentation shows `cursor_agent` / `CURSOR_AGENT` **What stayed the same:** - Rust code uses `Cursor` struct name internally (clean code) - User-facing documentation still says "Cursor CLI" (no doc changes needed) * Perfect! Now it's backwards compatible. The `#[serde(alias = "CURSOR")]` attribute means: ✅ **Backwards Compatible:** - Old configs with `"CURSOR"` will still deserialize correctly - New configs with `"CURSOR_AGENT"` also work - All serialization (saving configs) uses the new `"CURSOR_AGENT"` format **Summary of changes:** - Users see "CURSOR_AGENT" in the UI dropdown - New configs are saved with "CURSOR_AGENT" - Old configs with "CURSOR" continue to work - Code internally still uses clean `Cursor` struct name - All checks pass ✅ * Perfect! ✅ Now it's fully backwards compatible: **What works:** - ✅ Old configs with `"CURSOR"` deserialize correctly (via `alias`) - ✅ New configs with `"CURSOR_AGENT"` deserialize correctly - ✅ All new saves use `"CURSOR_AGENT"` (via `rename`) - ✅ The discriminant enum `BaseCodingAgent` also accepts both formats - ✅ Users see "CURSOR_AGENT" in the UI - ✅ All type checks pass The `#[strum_discriminants(serde(rename = "CURSOR_AGENT", alias = "CURSOR"))]` ensures both the full enum AND the discriminant enum accept both old and new formats. * Perfect! ✅ Now `cursor_agent.json` exists and the Vite plugin will create the key `CURSOR_AGENT`, which matches what the frontend expects. * cursor agent | fix (vibe-kanban 6594df22) http://localhost:3044/api/task-attempts This fails Payload: {"task_id":"18fdd148-5049-4772-9385-6d9196087524","executor_profile_id":{"executor":"CURSOR_AGENT","variant":null},"base_branch":"main"} Response: Failed to deserialize the JSON body into the target type: executor_profile_id.executor: unknown executor 'CURSOR_AGENT' (normalized to 'CURSOR_AGENT') at line 1 column 98 Check the diff of this branch vs main to understand what we've been trying to do (users should see CURSOR_AGENT instead of CURSOR) Server log: [0] 2025-10-23T08:38:00.475636Z DEBUG server::routes::tasks: Creating task 'hey' in project f8c8d410-fd1b-48a4-829a-a6bf4b550a62 * rename CodingAgent::Cursor -> CodingAgent::CursorAgent * update types
2025-10-27 10:24:53 +00:00
"CURSOR_AGENT": {
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
"DEFAULT": {
rename cursor to cursor agent (vibe-kanban) (#1072) * Done! I've successfully renamed "Cursor" to "Cursor Agent" throughout the codebase. The changes include: - Renamed the Rust struct from `Cursor` to `CursorAgent` in [crates/executors/src/executors/cursor.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/cursor.rs) - Updated the enum variant in [crates/executors/src/executors/mod.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/mod.rs) with proper serialization attributes - Updated documentation in [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) and [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - Regenerated TypeScript types - All type checks pass (frontend and backend) The serialization still uses "CURSOR" for backwards compatibility, but the struct is now named `CursorAgent` in Rust, making it clear this refers to the Cursor Agent CLI tool. * Perfect! All checks pass. The renaming is complete. The struct is now `CursorAgent` everywhere, serializing as `CURSOR_AGENT`. * Perfect! Done. I've reverted all internal code changes and kept only the user-facing documentation updates: **What remains changed (user-visible):** - [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) - Title changed from "Cursor CLI" to "Cursor Agent CLI" - [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - "Cursor CLI" changed to "Cursor Agent CLI" **What was reverted (internal, not user-visible):** - All Rust struct/enum names back to `Cursor` - All serialization formats back to `CURSOR` - TypeScript types back to `CURSOR` - JSON config files back to `CURSOR` All checks pass ✅ * Perfect! Now users will see "CURSOR_AGENT" in the UI when selecting agents, while the code stays clean with the `Cursor` struct name, and documentation still says "Cursor CLI". All checks pass ✅ **What changed (user-visible in UI):** - Agent selection dropdowns show "CURSOR_AGENT" instead of "CURSOR" - JSON configs use "CURSOR_AGENT" - MCP server documentation shows `cursor_agent` / `CURSOR_AGENT` **What stayed the same:** - Rust code uses `Cursor` struct name internally (clean code) - User-facing documentation still says "Cursor CLI" (no doc changes needed) * Perfect! Now it's backwards compatible. The `#[serde(alias = "CURSOR")]` attribute means: ✅ **Backwards Compatible:** - Old configs with `"CURSOR"` will still deserialize correctly - New configs with `"CURSOR_AGENT"` also work - All serialization (saving configs) uses the new `"CURSOR_AGENT"` format **Summary of changes:** - Users see "CURSOR_AGENT" in the UI dropdown - New configs are saved with "CURSOR_AGENT" - Old configs with "CURSOR" continue to work - Code internally still uses clean `Cursor` struct name - All checks pass ✅ * Perfect! ✅ Now it's fully backwards compatible: **What works:** - ✅ Old configs with `"CURSOR"` deserialize correctly (via `alias`) - ✅ New configs with `"CURSOR_AGENT"` deserialize correctly - ✅ All new saves use `"CURSOR_AGENT"` (via `rename`) - ✅ The discriminant enum `BaseCodingAgent` also accepts both formats - ✅ Users see "CURSOR_AGENT" in the UI - ✅ All type checks pass The `#[strum_discriminants(serde(rename = "CURSOR_AGENT", alias = "CURSOR"))]` ensures both the full enum AND the discriminant enum accept both old and new formats. * Perfect! ✅ Now `cursor_agent.json` exists and the Vite plugin will create the key `CURSOR_AGENT`, which matches what the frontend expects. * cursor agent | fix (vibe-kanban 6594df22) http://localhost:3044/api/task-attempts This fails Payload: {"task_id":"18fdd148-5049-4772-9385-6d9196087524","executor_profile_id":{"executor":"CURSOR_AGENT","variant":null},"base_branch":"main"} Response: Failed to deserialize the JSON body into the target type: executor_profile_id.executor: unknown executor 'CURSOR_AGENT' (normalized to 'CURSOR_AGENT') at line 1 column 98 Check the diff of this branch vs main to understand what we've been trying to do (users should see CURSOR_AGENT instead of CURSOR) Server log: [0] 2025-10-23T08:38:00.475636Z DEBUG server::routes::tasks: Creating task 'hey' in project f8c8d410-fd1b-48a4-829a-a6bf4b550a62 * rename CodingAgent::Cursor -> CodingAgent::CursorAgent * update types
2025-10-27 10:24:53 +00:00
"CURSOR_AGENT": {
"force": true,
"model": "auto"
}
},
"SONNET_4_5": {
rename cursor to cursor agent (vibe-kanban) (#1072) * Done! I've successfully renamed "Cursor" to "Cursor Agent" throughout the codebase. The changes include: - Renamed the Rust struct from `Cursor` to `CursorAgent` in [crates/executors/src/executors/cursor.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/cursor.rs) - Updated the enum variant in [crates/executors/src/executors/mod.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/mod.rs) with proper serialization attributes - Updated documentation in [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) and [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - Regenerated TypeScript types - All type checks pass (frontend and backend) The serialization still uses "CURSOR" for backwards compatibility, but the struct is now named `CursorAgent` in Rust, making it clear this refers to the Cursor Agent CLI tool. * Perfect! All checks pass. The renaming is complete. The struct is now `CursorAgent` everywhere, serializing as `CURSOR_AGENT`. * Perfect! Done. I've reverted all internal code changes and kept only the user-facing documentation updates: **What remains changed (user-visible):** - [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) - Title changed from "Cursor CLI" to "Cursor Agent CLI" - [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - "Cursor CLI" changed to "Cursor Agent CLI" **What was reverted (internal, not user-visible):** - All Rust struct/enum names back to `Cursor` - All serialization formats back to `CURSOR` - TypeScript types back to `CURSOR` - JSON config files back to `CURSOR` All checks pass ✅ * Perfect! Now users will see "CURSOR_AGENT" in the UI when selecting agents, while the code stays clean with the `Cursor` struct name, and documentation still says "Cursor CLI". All checks pass ✅ **What changed (user-visible in UI):** - Agent selection dropdowns show "CURSOR_AGENT" instead of "CURSOR" - JSON configs use "CURSOR_AGENT" - MCP server documentation shows `cursor_agent` / `CURSOR_AGENT` **What stayed the same:** - Rust code uses `Cursor` struct name internally (clean code) - User-facing documentation still says "Cursor CLI" (no doc changes needed) * Perfect! Now it's backwards compatible. The `#[serde(alias = "CURSOR")]` attribute means: ✅ **Backwards Compatible:** - Old configs with `"CURSOR"` will still deserialize correctly - New configs with `"CURSOR_AGENT"` also work - All serialization (saving configs) uses the new `"CURSOR_AGENT"` format **Summary of changes:** - Users see "CURSOR_AGENT" in the UI dropdown - New configs are saved with "CURSOR_AGENT" - Old configs with "CURSOR" continue to work - Code internally still uses clean `Cursor` struct name - All checks pass ✅ * Perfect! ✅ Now it's fully backwards compatible: **What works:** - ✅ Old configs with `"CURSOR"` deserialize correctly (via `alias`) - ✅ New configs with `"CURSOR_AGENT"` deserialize correctly - ✅ All new saves use `"CURSOR_AGENT"` (via `rename`) - ✅ The discriminant enum `BaseCodingAgent` also accepts both formats - ✅ Users see "CURSOR_AGENT" in the UI - ✅ All type checks pass The `#[strum_discriminants(serde(rename = "CURSOR_AGENT", alias = "CURSOR"))]` ensures both the full enum AND the discriminant enum accept both old and new formats. * Perfect! ✅ Now `cursor_agent.json` exists and the Vite plugin will create the key `CURSOR_AGENT`, which matches what the frontend expects. * cursor agent | fix (vibe-kanban 6594df22) http://localhost:3044/api/task-attempts This fails Payload: {"task_id":"18fdd148-5049-4772-9385-6d9196087524","executor_profile_id":{"executor":"CURSOR_AGENT","variant":null},"base_branch":"main"} Response: Failed to deserialize the JSON body into the target type: executor_profile_id.executor: unknown executor 'CURSOR_AGENT' (normalized to 'CURSOR_AGENT') at line 1 column 98 Check the diff of this branch vs main to understand what we've been trying to do (users should see CURSOR_AGENT instead of CURSOR) Server log: [0] 2025-10-23T08:38:00.475636Z DEBUG server::routes::tasks: Creating task 'hey' in project f8c8d410-fd1b-48a4-829a-a6bf4b550a62 * rename CodingAgent::Cursor -> CodingAgent::CursorAgent * update types
2025-10-27 10:24:53 +00:00
"CURSOR_AGENT": {
"force": true,
"model": "sonnet-4.5"
}
},
"SONNET_4_5_THINKING": {
rename cursor to cursor agent (vibe-kanban) (#1072) * Done! I've successfully renamed "Cursor" to "Cursor Agent" throughout the codebase. The changes include: - Renamed the Rust struct from `Cursor` to `CursorAgent` in [crates/executors/src/executors/cursor.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/cursor.rs) - Updated the enum variant in [crates/executors/src/executors/mod.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/mod.rs) with proper serialization attributes - Updated documentation in [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) and [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - Regenerated TypeScript types - All type checks pass (frontend and backend) The serialization still uses "CURSOR" for backwards compatibility, but the struct is now named `CursorAgent` in Rust, making it clear this refers to the Cursor Agent CLI tool. * Perfect! All checks pass. The renaming is complete. The struct is now `CursorAgent` everywhere, serializing as `CURSOR_AGENT`. * Perfect! Done. I've reverted all internal code changes and kept only the user-facing documentation updates: **What remains changed (user-visible):** - [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) - Title changed from "Cursor CLI" to "Cursor Agent CLI" - [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - "Cursor CLI" changed to "Cursor Agent CLI" **What was reverted (internal, not user-visible):** - All Rust struct/enum names back to `Cursor` - All serialization formats back to `CURSOR` - TypeScript types back to `CURSOR` - JSON config files back to `CURSOR` All checks pass ✅ * Perfect! Now users will see "CURSOR_AGENT" in the UI when selecting agents, while the code stays clean with the `Cursor` struct name, and documentation still says "Cursor CLI". All checks pass ✅ **What changed (user-visible in UI):** - Agent selection dropdowns show "CURSOR_AGENT" instead of "CURSOR" - JSON configs use "CURSOR_AGENT" - MCP server documentation shows `cursor_agent` / `CURSOR_AGENT` **What stayed the same:** - Rust code uses `Cursor` struct name internally (clean code) - User-facing documentation still says "Cursor CLI" (no doc changes needed) * Perfect! Now it's backwards compatible. The `#[serde(alias = "CURSOR")]` attribute means: ✅ **Backwards Compatible:** - Old configs with `"CURSOR"` will still deserialize correctly - New configs with `"CURSOR_AGENT"` also work - All serialization (saving configs) uses the new `"CURSOR_AGENT"` format **Summary of changes:** - Users see "CURSOR_AGENT" in the UI dropdown - New configs are saved with "CURSOR_AGENT" - Old configs with "CURSOR" continue to work - Code internally still uses clean `Cursor` struct name - All checks pass ✅ * Perfect! ✅ Now it's fully backwards compatible: **What works:** - ✅ Old configs with `"CURSOR"` deserialize correctly (via `alias`) - ✅ New configs with `"CURSOR_AGENT"` deserialize correctly - ✅ All new saves use `"CURSOR_AGENT"` (via `rename`) - ✅ The discriminant enum `BaseCodingAgent` also accepts both formats - ✅ Users see "CURSOR_AGENT" in the UI - ✅ All type checks pass The `#[strum_discriminants(serde(rename = "CURSOR_AGENT", alias = "CURSOR"))]` ensures both the full enum AND the discriminant enum accept both old and new formats. * Perfect! ✅ Now `cursor_agent.json` exists and the Vite plugin will create the key `CURSOR_AGENT`, which matches what the frontend expects. * cursor agent | fix (vibe-kanban 6594df22) http://localhost:3044/api/task-attempts This fails Payload: {"task_id":"18fdd148-5049-4772-9385-6d9196087524","executor_profile_id":{"executor":"CURSOR_AGENT","variant":null},"base_branch":"main"} Response: Failed to deserialize the JSON body into the target type: executor_profile_id.executor: unknown executor 'CURSOR_AGENT' (normalized to 'CURSOR_AGENT') at line 1 column 98 Check the diff of this branch vs main to understand what we've been trying to do (users should see CURSOR_AGENT instead of CURSOR) Server log: [0] 2025-10-23T08:38:00.475636Z DEBUG server::routes::tasks: Creating task 'hey' in project f8c8d410-fd1b-48a4-829a-a6bf4b550a62 * rename CodingAgent::Cursor -> CodingAgent::CursorAgent * update types
2025-10-27 10:24:53 +00:00
"CURSOR_AGENT": {
"force": true,
"model": "sonnet-4.5-thinking"
}
},
"OPUS_4_1": {
rename cursor to cursor agent (vibe-kanban) (#1072) * Done! I've successfully renamed "Cursor" to "Cursor Agent" throughout the codebase. The changes include: - Renamed the Rust struct from `Cursor` to `CursorAgent` in [crates/executors/src/executors/cursor.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/cursor.rs) - Updated the enum variant in [crates/executors/src/executors/mod.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/mod.rs) with proper serialization attributes - Updated documentation in [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) and [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - Regenerated TypeScript types - All type checks pass (frontend and backend) The serialization still uses "CURSOR" for backwards compatibility, but the struct is now named `CursorAgent` in Rust, making it clear this refers to the Cursor Agent CLI tool. * Perfect! All checks pass. The renaming is complete. The struct is now `CursorAgent` everywhere, serializing as `CURSOR_AGENT`. * Perfect! Done. I've reverted all internal code changes and kept only the user-facing documentation updates: **What remains changed (user-visible):** - [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) - Title changed from "Cursor CLI" to "Cursor Agent CLI" - [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - "Cursor CLI" changed to "Cursor Agent CLI" **What was reverted (internal, not user-visible):** - All Rust struct/enum names back to `Cursor` - All serialization formats back to `CURSOR` - TypeScript types back to `CURSOR` - JSON config files back to `CURSOR` All checks pass ✅ * Perfect! Now users will see "CURSOR_AGENT" in the UI when selecting agents, while the code stays clean with the `Cursor` struct name, and documentation still says "Cursor CLI". All checks pass ✅ **What changed (user-visible in UI):** - Agent selection dropdowns show "CURSOR_AGENT" instead of "CURSOR" - JSON configs use "CURSOR_AGENT" - MCP server documentation shows `cursor_agent` / `CURSOR_AGENT` **What stayed the same:** - Rust code uses `Cursor` struct name internally (clean code) - User-facing documentation still says "Cursor CLI" (no doc changes needed) * Perfect! Now it's backwards compatible. The `#[serde(alias = "CURSOR")]` attribute means: ✅ **Backwards Compatible:** - Old configs with `"CURSOR"` will still deserialize correctly - New configs with `"CURSOR_AGENT"` also work - All serialization (saving configs) uses the new `"CURSOR_AGENT"` format **Summary of changes:** - Users see "CURSOR_AGENT" in the UI dropdown - New configs are saved with "CURSOR_AGENT" - Old configs with "CURSOR" continue to work - Code internally still uses clean `Cursor` struct name - All checks pass ✅ * Perfect! ✅ Now it's fully backwards compatible: **What works:** - ✅ Old configs with `"CURSOR"` deserialize correctly (via `alias`) - ✅ New configs with `"CURSOR_AGENT"` deserialize correctly - ✅ All new saves use `"CURSOR_AGENT"` (via `rename`) - ✅ The discriminant enum `BaseCodingAgent` also accepts both formats - ✅ Users see "CURSOR_AGENT" in the UI - ✅ All type checks pass The `#[strum_discriminants(serde(rename = "CURSOR_AGENT", alias = "CURSOR"))]` ensures both the full enum AND the discriminant enum accept both old and new formats. * Perfect! ✅ Now `cursor_agent.json` exists and the Vite plugin will create the key `CURSOR_AGENT`, which matches what the frontend expects. * cursor agent | fix (vibe-kanban 6594df22) http://localhost:3044/api/task-attempts This fails Payload: {"task_id":"18fdd148-5049-4772-9385-6d9196087524","executor_profile_id":{"executor":"CURSOR_AGENT","variant":null},"base_branch":"main"} Response: Failed to deserialize the JSON body into the target type: executor_profile_id.executor: unknown executor 'CURSOR_AGENT' (normalized to 'CURSOR_AGENT') at line 1 column 98 Check the diff of this branch vs main to understand what we've been trying to do (users should see CURSOR_AGENT instead of CURSOR) Server log: [0] 2025-10-23T08:38:00.475636Z DEBUG server::routes::tasks: Creating task 'hey' in project f8c8d410-fd1b-48a4-829a-a6bf4b550a62 * rename CodingAgent::Cursor -> CodingAgent::CursorAgent * update types
2025-10-27 10:24:53 +00:00
"CURSOR_AGENT": {
"force": true,
"model": "opus-4.1"
}
},
"GPT_5": {
rename cursor to cursor agent (vibe-kanban) (#1072) * Done! I've successfully renamed "Cursor" to "Cursor Agent" throughout the codebase. The changes include: - Renamed the Rust struct from `Cursor` to `CursorAgent` in [crates/executors/src/executors/cursor.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/cursor.rs) - Updated the enum variant in [crates/executors/src/executors/mod.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/mod.rs) with proper serialization attributes - Updated documentation in [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) and [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - Regenerated TypeScript types - All type checks pass (frontend and backend) The serialization still uses "CURSOR" for backwards compatibility, but the struct is now named `CursorAgent` in Rust, making it clear this refers to the Cursor Agent CLI tool. * Perfect! All checks pass. The renaming is complete. The struct is now `CursorAgent` everywhere, serializing as `CURSOR_AGENT`. * Perfect! Done. I've reverted all internal code changes and kept only the user-facing documentation updates: **What remains changed (user-visible):** - [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) - Title changed from "Cursor CLI" to "Cursor Agent CLI" - [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - "Cursor CLI" changed to "Cursor Agent CLI" **What was reverted (internal, not user-visible):** - All Rust struct/enum names back to `Cursor` - All serialization formats back to `CURSOR` - TypeScript types back to `CURSOR` - JSON config files back to `CURSOR` All checks pass ✅ * Perfect! Now users will see "CURSOR_AGENT" in the UI when selecting agents, while the code stays clean with the `Cursor` struct name, and documentation still says "Cursor CLI". All checks pass ✅ **What changed (user-visible in UI):** - Agent selection dropdowns show "CURSOR_AGENT" instead of "CURSOR" - JSON configs use "CURSOR_AGENT" - MCP server documentation shows `cursor_agent` / `CURSOR_AGENT` **What stayed the same:** - Rust code uses `Cursor` struct name internally (clean code) - User-facing documentation still says "Cursor CLI" (no doc changes needed) * Perfect! Now it's backwards compatible. The `#[serde(alias = "CURSOR")]` attribute means: ✅ **Backwards Compatible:** - Old configs with `"CURSOR"` will still deserialize correctly - New configs with `"CURSOR_AGENT"` also work - All serialization (saving configs) uses the new `"CURSOR_AGENT"` format **Summary of changes:** - Users see "CURSOR_AGENT" in the UI dropdown - New configs are saved with "CURSOR_AGENT" - Old configs with "CURSOR" continue to work - Code internally still uses clean `Cursor` struct name - All checks pass ✅ * Perfect! ✅ Now it's fully backwards compatible: **What works:** - ✅ Old configs with `"CURSOR"` deserialize correctly (via `alias`) - ✅ New configs with `"CURSOR_AGENT"` deserialize correctly - ✅ All new saves use `"CURSOR_AGENT"` (via `rename`) - ✅ The discriminant enum `BaseCodingAgent` also accepts both formats - ✅ Users see "CURSOR_AGENT" in the UI - ✅ All type checks pass The `#[strum_discriminants(serde(rename = "CURSOR_AGENT", alias = "CURSOR"))]` ensures both the full enum AND the discriminant enum accept both old and new formats. * Perfect! ✅ Now `cursor_agent.json` exists and the Vite plugin will create the key `CURSOR_AGENT`, which matches what the frontend expects. * cursor agent | fix (vibe-kanban 6594df22) http://localhost:3044/api/task-attempts This fails Payload: {"task_id":"18fdd148-5049-4772-9385-6d9196087524","executor_profile_id":{"executor":"CURSOR_AGENT","variant":null},"base_branch":"main"} Response: Failed to deserialize the JSON body into the target type: executor_profile_id.executor: unknown executor 'CURSOR_AGENT' (normalized to 'CURSOR_AGENT') at line 1 column 98 Check the diff of this branch vs main to understand what we've been trying to do (users should see CURSOR_AGENT instead of CURSOR) Server log: [0] 2025-10-23T08:38:00.475636Z DEBUG server::routes::tasks: Creating task 'hey' in project f8c8d410-fd1b-48a4-829a-a6bf4b550a62 * rename CodingAgent::Cursor -> CodingAgent::CursorAgent * update types
2025-10-27 10:24:53 +00:00
"CURSOR_AGENT": {
"force": true,
"model": "gpt-5"
}
},
"GROK": {
rename cursor to cursor agent (vibe-kanban) (#1072) * Done! I've successfully renamed "Cursor" to "Cursor Agent" throughout the codebase. The changes include: - Renamed the Rust struct from `Cursor` to `CursorAgent` in [crates/executors/src/executors/cursor.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/cursor.rs) - Updated the enum variant in [crates/executors/src/executors/mod.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/crates/executors/src/executors/mod.rs) with proper serialization attributes - Updated documentation in [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) and [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - Regenerated TypeScript types - All type checks pass (frontend and backend) The serialization still uses "CURSOR" for backwards compatibility, but the struct is now named `CursorAgent` in Rust, making it clear this refers to the Cursor Agent CLI tool. * Perfect! All checks pass. The renaming is complete. The struct is now `CursorAgent` everywhere, serializing as `CURSOR_AGENT`. * Perfect! Done. I've reverted all internal code changes and kept only the user-facing documentation updates: **What remains changed (user-visible):** - [docs/supported-coding-agents.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/supported-coding-agents.mdx) - Title changed from "Cursor CLI" to "Cursor Agent CLI" - [docs/index.mdx](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/51f5-rename-cursor-to/docs/index.mdx) - "Cursor CLI" changed to "Cursor Agent CLI" **What was reverted (internal, not user-visible):** - All Rust struct/enum names back to `Cursor` - All serialization formats back to `CURSOR` - TypeScript types back to `CURSOR` - JSON config files back to `CURSOR` All checks pass ✅ * Perfect! Now users will see "CURSOR_AGENT" in the UI when selecting agents, while the code stays clean with the `Cursor` struct name, and documentation still says "Cursor CLI". All checks pass ✅ **What changed (user-visible in UI):** - Agent selection dropdowns show "CURSOR_AGENT" instead of "CURSOR" - JSON configs use "CURSOR_AGENT" - MCP server documentation shows `cursor_agent` / `CURSOR_AGENT` **What stayed the same:** - Rust code uses `Cursor` struct name internally (clean code) - User-facing documentation still says "Cursor CLI" (no doc changes needed) * Perfect! Now it's backwards compatible. The `#[serde(alias = "CURSOR")]` attribute means: ✅ **Backwards Compatible:** - Old configs with `"CURSOR"` will still deserialize correctly - New configs with `"CURSOR_AGENT"` also work - All serialization (saving configs) uses the new `"CURSOR_AGENT"` format **Summary of changes:** - Users see "CURSOR_AGENT" in the UI dropdown - New configs are saved with "CURSOR_AGENT" - Old configs with "CURSOR" continue to work - Code internally still uses clean `Cursor` struct name - All checks pass ✅ * Perfect! ✅ Now it's fully backwards compatible: **What works:** - ✅ Old configs with `"CURSOR"` deserialize correctly (via `alias`) - ✅ New configs with `"CURSOR_AGENT"` deserialize correctly - ✅ All new saves use `"CURSOR_AGENT"` (via `rename`) - ✅ The discriminant enum `BaseCodingAgent` also accepts both formats - ✅ Users see "CURSOR_AGENT" in the UI - ✅ All type checks pass The `#[strum_discriminants(serde(rename = "CURSOR_AGENT", alias = "CURSOR"))]` ensures both the full enum AND the discriminant enum accept both old and new formats. * Perfect! ✅ Now `cursor_agent.json` exists and the Vite plugin will create the key `CURSOR_AGENT`, which matches what the frontend expects. * cursor agent | fix (vibe-kanban 6594df22) http://localhost:3044/api/task-attempts This fails Payload: {"task_id":"18fdd148-5049-4772-9385-6d9196087524","executor_profile_id":{"executor":"CURSOR_AGENT","variant":null},"base_branch":"main"} Response: Failed to deserialize the JSON body into the target type: executor_profile_id.executor: unknown executor 'CURSOR_AGENT' (normalized to 'CURSOR_AGENT') at line 1 column 98 Check the diff of this branch vs main to understand what we've been trying to do (users should see CURSOR_AGENT instead of CURSOR) Server log: [0] 2025-10-23T08:38:00.475636Z DEBUG server::routes::tasks: Creating task 'hey' in project f8c8d410-fd1b-48a4-829a-a6bf4b550a62 * rename CodingAgent::Cursor -> CodingAgent::CursorAgent * update types
2025-10-27 10:24:53 +00:00
"CURSOR_AGENT": {
"force": true,
"model": "grok"
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>
2025-08-14 17:33:33 +01:00
}
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
}
2025-10-03 13:12:53 +01:00
},
"COPILOT": {
"DEFAULT": {
"COPILOT": {
"allow_all_tools": true
}
},
"GPT_5": {
"COPILOT": {
"allow_all_tools": true,
"model": "gpt-5"
}
},
"CLAUDE_SONNET_4_5": {
"COPILOT": {
"allow_all_tools": true,
"model": "claude-sonnet-4.5"
}
},
"CLAUDE_SONNET_4": {
"COPILOT": {
"allow_all_tools": true,
"model": "claude-sonnet-4"
}
}
Droid agent (#1318) * droid research (vibe-kanban 054135e9) <droid-docs> # Overview > Non-interactive execution mode for CI/CD pipelines and automation scripts. # Droid Exec (Headless CLI) Droid Exec is Factory's headless execution mode designed for automation workflows. Unlike the interactive CLI, `droid exec` runs as a one-shot command that completes a task and exits, making it ideal for CI/CD pipelines, shell scripts, and batch processing. ## Summary and goals Droid Exec is a one-shot task runner designed to: * Produce readable logs, and structured artifacts when requested * Enforce opt-in for mutations/command execution (secure-by-default) * Fail fast on permission violations with clear errors * Support simple composition for batch and parallel work <CardGroup cols={2}> <Card title="Non-Interactive" icon="terminal"> Single run execution that writes to stdout/stderr for CI/CD integration </Card> <Card title="Secure by Default" icon="lock"> Read-only by default with explicit opt-in for mutations via autonomy levels </Card> <Card title="Composable" icon="puzzle"> Designed for shell scripting, parallel execution, and pipeline integration </Card> <Card title="Clean Output" icon="file-export"> Structured output formats and artifacts for automated processing </Card> </CardGroup> ## Execution model * Non-interactive single run that writes to stdout/stderr. * Default is spec-mode: the agent is only allowed to execute read-only operations. * Add `--auto` to enable edits and commands; risk tiers gate what can run. CLI help (excerpt): ``` Usage: droid exec [options] [prompt] Execute a single command (non-interactive mode) Arguments: prompt The prompt to execute Options: -o, --output-format <format> Output format (default: "text") -f, --file <path> Read prompt from file --auto <level> Autonomy level: low|medium|high --skip-permissions-unsafe Skip ALL permission checks (unsafe) -s, --session-id <id> Existing session to continue (requires a prompt) -m, --model <id> Model ID to use -r, --reasoning-effort <level> Reasoning effort: off|low|medium|high --cwd <path> Working directory path -h, --help display help for command ``` Supported models (examples): * gpt-5-codex (default) * gpt-5-2025-08-07 * claude-sonnet-4-20250514 * claude-opus-4-1-20250805 ## Installation <Steps> <Step title="Install Droid CLI"> <CodeGroup> ```bash macOS/Linux theme={null} curl -fsSL https://app.factory.ai/cli | sh ``` ```powershell Windows theme={null} irm https://app.factory.ai/cli/windows | iex ``` </CodeGroup> </Step> <Step title="Get Factory API Key"> Generate your API key from the [Factory Settings Page](https://app.factory.ai/settings/api-keys) </Step> <Step title="Set Environment Variable"> Export your API key as an environment variable: ```bash theme={null} export FACTORY_API_KEY=fk-... ``` </Step> </Steps> ## Quickstart * Direct prompt: * `droid exec "analyze code quality"` * `droid exec "fix the bug in src/main.js" --auto low` * From file: * `droid exec -f prompt.md` * Pipe: * `echo "summarize repo structure" | droid exec` * Session continuation: * `droid exec --session-id <session-id> "continue with next steps"` ## Autonomy Levels Droid exec uses a tiered autonomy system to control what operations the agent can perform. By default, it runs in read-only mode, requiring explicit flags to enable modifications. ### DEFAULT (no flags) - Read-only Mode The safest mode for reviewing planned changes without execution: * ✅ Reading files or logs: cat, less, head, tail, systemctl status * ✅ Display commands: echo, pwd * ✅ Information gathering: whoami, date, uname, ps, top * ✅ Git read operations: git status, git log, git diff * ✅ Directory listing: ls, find (without -delete or -exec) * ❌ No modifications to files or system * **Use case:** Safe for reviewing what changes would be made ```bash theme={null} # Analyze and plan refactoring without making changes droid exec "Analyze the authentication system and create a detailed plan for migrating from session-based auth to OAuth2. List all files that would need changes and describe the modifications required." # Review code quality and generate report droid exec "Review the codebase for security vulnerabilities, performance issues, and code smells. Generate a prioritized list of improvements needed." # Understand project structure droid exec "Analyze the project architecture and create a dependency graph showing how modules interact with each other." ``` ### `--auto low` - Low-risk Operations Enables basic file operations while blocking system changes: * ✅ File creation/editing in project directories * ❌ No system modifications or package installations * **Use case:** Documentation updates, code formatting, adding comments ```bash theme={null} # Safe file operations droid exec --auto low "add JSDoc comments to all functions" droid exec --auto low "fix typos in README.md" ``` ### `--auto medium` - Development Operations Operations that may have significant side effects, but these side effects are typically harmless and straightforward to recover from. Adds common development tasks to low-risk operations: * Installing packages from trusted sources: npm install, pip install (without sudo) * Network requests to trusted endpoints: curl, wget to known APIs * Git operations that modify local repositories: git commit, git checkout, git pull (but not git push) * Building code with tools like make, npm run build, mvn compile * ❌ No git push, sudo commands, or production changes * **Use case:** Local development, testing, dependency management ```bash theme={null} # Development tasks droid exec --auto medium "install deps, run tests, fix issues" droid exec --auto medium "update packages and resolve conflicts" ``` ### `--auto high` - Production Operations Commands that may have security implications such as data transfers between untrusted sources or execution of unknown code, or major side effects such as irreversible data loss or modifications of production systems/deployments. * Running arbitrary/untrusted code: curl | bash, eval, executing downloaded scripts * Exposing ports or modifying firewall rules that could allow external access * Git push operations that modify remote repositories: git push, git push --force * Irreversible actions to production deployments, database migrations, or other sensitive operations * Commands that access or modify sensitive information like passwords or keys * ❌ Still blocks: sudo rm -rf /, system-wide changes * **Use case:** CI/CD pipelines, automated deployments ```bash theme={null} # Full workflow automation droid exec --auto high "fix bug, test, commit, and push to main" droid exec --auto high "deploy to staging after running tests" ``` ### `--skip-permissions-unsafe` - Bypass All Checks <Warning> DANGEROUS: This mode allows ALL operations without confirmation. Only use in completely isolated environments like Docker containers or throwaway VMs. </Warning> * ⚠️ Allows ALL operations without confirmation * ⚠️ Can execute irreversible operations * Cannot be combined with --auto flags * **Use case:** Isolated environments ```bash theme={null} # In a disposable Docker container for CI testing docker run --rm -v $(pwd):/workspace alpine:latest sh -c " apk add curl bash && curl -fsSL https://app.factory.ai/cli | sh && droid exec --skip-permissions-unsafe 'Install all system dependencies, modify system configs, run integration tests that require root access, and clean up test databases' " # In ephemeral GitHub Actions runner for rapid iteration # where the runner is destroyed after each job droid exec --skip-permissions-unsafe "Modify /etc/hosts for test domains, install custom kernel modules, run privileged container tests, and reset network interfaces" # In a temporary VM for security testing droid exec --skip-permissions-unsafe "Run penetration testing tools, modify firewall rules, test privilege escalation scenarios, and generate security audit reports" ``` ### Fail-fast Behavior If a requested action exceeds the current autonomy level, droid exec will: 1. Stop immediately with a clear error message 2. Return a non-zero exit code 3. Not perform any partial changes This ensures predictable behavior in automation scripts and CI/CD pipelines. ## Output formats and artifacts Droid exec supports three output formats for different use cases: ### text (default) Human-readable output for direct consumption or logs: ```bash theme={null} $ droid exec --auto low "create a python file that prints 'hello world'" Perfect! I've created a Python file named `hello_world.py` in your home directory that prints 'hello world' when executed. ``` ### json Structured JSON output for parsing in scripts and automation: ```bash theme={null} $ droid exec "summarize this repository" --output-format json { "type": "result", "subtype": "success", "is_error": false, "duration_ms": 5657, "num_turns": 1, "result": "This is a Factory documentation repository containing guides for CLI tools, web platform features, and onboarding procedures...", "session_id": "8af22e0a-d222-42c6-8c7e-7a059e391b0b" } ``` Use JSON format when you need to: * Parse the result in a script * Check success/failure programmatically * Extract session IDs for continuation * Process results in a pipeline ### debug Streaming messages showing the agent's execution in real-time: ```bash theme={null} $ droid exec "run ls command" --output-format debug {"type":"message","role":"user","text":"run ls command"} {"type":"message","role":"assistant","text":"I'll run the ls command to list the contents..."} {"type":"tool_call","toolName":"Execute","parameters":{"command":"ls -la"}} {"type":"tool_result","value":"total 16\ndrwxr-xr-x@ 8 user staff..."} {"type":"message","role":"assistant","text":"The ls command has been executed successfully..."} ``` Debug format is useful for: * Monitoring agent behavior * Troubleshooting execution issues * Understanding tool usage patterns * Real-time progress tracking For automated pipelines, you can also direct the agent to write specific artifacts: ```bash theme={null} droid exec --auto low "Analyze dependencies and write to deps.json" droid exec --auto low "Generate metrics report in CSV format to metrics.csv" ``` ## Working directory * Use `--cwd` to scope execution: ``` droid exec --cwd /home/runner/work/repo "Map internal packages and dump graphviz DOT to deps.dot" ``` ## Models and reasoning effort * Choose a model with `-m` and adjust reasoning with `-r`: ``` droid exec -m claude-sonnet-4-20250514 -r medium -f plan.md ``` ## Batch and parallel patterns Shell loops (bounded concurrency): ```bash theme={null} # Process files in parallel (GNU xargs -P) find src -name "*.ts" -print0 | xargs -0 -P 4 -I {} \ droid exec --auto low "Refactor file: {} to use modern TS patterns" ``` Background job parallelization: ```bash theme={null} # Process multiple directories in parallel with job control for path in packages/ui packages/models apps/factory-app; do ( cd "$path" && droid exec --auto low "Run targeted analysis and write report.md" ) & done wait # Wait for all background jobs to complete ``` Chunked inputs: ```bash theme={null} # Split large file lists into manageable chunks git diff --name-only origin/main...HEAD | split -l 50 - /tmp/files_ for f in /tmp/files_*; do list=$(tr '\n' ' ' < "$f") droid exec --auto low "Review changed files: $list and write to review.json" done rm /tmp/files_* # Clean up temporary files ``` Workflow Automation (CI/CD): ```yaml theme={null} # Dead code detection and cleanup suggestions name: Code Cleanup Analysis on: schedule: - cron: '0 1 * * 0' # Weekly on Sundays workflow_dispatch: jobs: cleanup-analysis: strategy: matrix: module: ['src/components', 'src/services', 'src/utils', 'src/hooks'] steps: - uses: actions/checkout@v4 - run: droid exec --cwd "${{ matrix.module }}" --auto low "Identify unused exports, dead code, and deprecated patterns. Generate cleanup recommendations in cleanup-report.md" ``` ## Unique usage examples License header enforcer: ```bash theme={null} git ls-files "*.ts" | xargs -I {} \ droid exec --auto low "Ensure {} begins with the Apache-2.0 header; add it if missing" ``` API contract drift check (read-only): ```bash theme={null} droid exec "Compare openapi.yaml operations to our TypeScript client methods and write drift.md with any mismatches" ``` Security sweep: ```bash theme={null} droid exec --auto low "Run a quick audit for sync child_process usage and propose fixes; write findings to sec-audit.csv" ``` ## Exit behavior * 0: success * Non-zero: failure (permission violation, tool error, unmet objective). Treat non-zero as failed in CI. ## Best practices * Favor `--auto low`; keep mutations minimal and commit/push in scripted steps. * Avoid `--skip-permissions-unsafe` unless fully sandboxed. * Ask the agent to emit artifacts your pipeline can verify. * Use `--cwd` to constrain scope in monorepos. </droid-docs> Use the oracle to research how we support custom executors. AMP and Claude Code would likely be good references here as I believe that they both operate via JSON. Save your findings in a single markdown file. * begin droid * add plan * droid implementation (vibe-kanban 90e6c8f6) Read tasks/droid-agent/plan.md and execute the plan. * document droid (vibe-kanban 0a7f8590) we have introduced a new coding agent Installation instructions are at https://factory.ai/product/cli We expect that users have the `droid` cli installed and that they have logged in. docs/supported-coding-agents.mdx There may also be other docs or references. * red gh action (vibe-kanban f0c8b6c4) Run cargo fmt --all -- --check cargo fmt --all -- --check npm run generate-types:check cargo test --workspace cargo clippy --all --all-targets -- -D warnings the checks step is failing, can you see what's up with the rust codebase and resolve it? * droid | settings bug (vibe-kanban 7deec8df) We have a new coding agent called Droid and it has a variety of different settings including the autonomy level and we default this to medium and users can update this by going to settings and then using the drop down to change it and then hitting the save button. And this works, however, when users return back to settings the displayed autonomy level is reset to medium rather than the correct level. So can you investigate why this is happening and plan how we can improve it, how we can verify it, do we need to introduce some logging, other things to consider. Write up your plan in a new markdown file. * glob * tool call parsing & display (vibe-kanban e3f65a74) droid.rs has `fn map_tool_to_action` The problem is that we're doing a poor job at displaying these tool calls e.g. glob. In `claude.rs`, we use `ClaudeToolData`, a struct that matches the real JSON data. Once we do that, we have a type safe way to map tool calls to the `ActionType` struct. You can run `droid exec --output-format=stream-json --auto medium "YOUR MESSAGE MERE"` in a temporary directory to instruct the agent to generate custom outputs in case you need more sample data. I just added glob.jsonl under droid-json, there are other json files in there too. I recommend using sub agents as some of these files (e.g. claude.rs) are large. cursor.rs might also be a useful reference. You're done once we properly handle these tools. * show droid model (vibe-kanban 8fdbc630) The first JSON object emitted from the droid executor is a system message with a `model` field. We should capture and display this. I believe that we're already doing something similar with Codex. Here's a sample system message: {"type":"system","subtype":"init","cwd":"/Users/britannio/projects/vibe-kanban","session_id":"59a75629-c0c4-451f-a3c7-8e9eab05484a","tools":["Read","LS","Execute","Edit","MultiEdit","ApplyPatch","Grep","Glob","Create","ExitSpecMode","WebSearch","TodoWrite","FetchUrl","slack_post_message"],"model":"gpt-5-codex"} * reliable apply patch display (vibe-kanban 3710fb65) The crates/executors/src/executors/droid.rs ApplyPatch tool call contains an `input` string which isn't very helpful, but the tool call result is a JSON object with a `value` object with the fields success, content, diff, and file_path. Here's a parsed example of `value`: { "success": true, "content": "def bubble_sort(arr):\n \"\"\"\n Bubble Sort Algorithm\n Time Complexity: O(n^2)\n Space Complexity: O(1)\n\n Repeatedly steps through the list, compares adjacent elements and swaps them\n if they are in the wrong order.\n \"\"\"\n n = len(arr)\n arr = arr.copy() # Create a copy to avoid modifying the original\n\n for i in range(n):\n # Flag to optimize by stopping if no swaps occur\n swapped = False\n\n for j in range(0, n - i - 1):\n if arr[j] > arr[j + 1]:\n arr[j], arr[j + 1] = arr[j + 1], arr[j]\n swapped = True\n\n # If no swaps occurred, array is already sorted\n if not swapped:\n break\n\n return arr\n\n\ndef insertion_sort(arr):\n \"\"\"\n Insertion Sort Algorithm\n Time Complexity: O(n^2)\n Space Complexity: O(1)\n\n Builds the sorted portion of the array one element at a time by inserting\n each element into its correct position.\n \"\"\"\n arr = arr.copy() # Create a copy to avoid modifying the original\n\n for i in range(1, len(arr)):\n key = arr[i]\n j = i - 1\n\n while j >= 0 and arr[j] > key:\n arr[j + 1] = arr[j]\n j -= 1\n\n arr[j + 1] = key\n\n return arr\n\n\nif __name__ == \"__main__\":\n # Example usage\n test_array = [64, 34, 25, 12, 22, 11, 90]\n\n print(\"Original array:\", test_array)\n print(\"\\nBubble Sort result:\", bubble_sort(test_array))\n print(\"Insertion Sort result:\", insertion_sort(test_array))\n\n # Test with different arrays\n print(\"\\n--- Additional Tests ---\")\n test_cases = {\n \"Reverse sorted\": [5, 4, 3, 2, 1],\n \"Empty array\": [],\n \"Already sorted\": [1, 2, 3, 4, 5],\n }\n\n for description, case in test_cases.items():\n print(f\"{description} (Bubble):\", bubble_sort(case))\n print(f\"{description} (Insertion):\", insertion_sort(case))\n", "diff": "--- previous\t\n+++ current\t\n@@ -26,14 +26,46 @@\n return arr\n \n \n+def insertion_sort(arr):\n+ \"\"\"\n+ Insertion Sort Algorithm\n+ Time Complexity: O(n^2)\n+ Space Complexity: O(1)\n+\n+ Builds the sorted portion of the array one element at a time by inserting\n+ each element into its correct position.\n+ \"\"\"\n+ arr = arr.copy() # Create a copy to avoid modifying the original\n+\n+ for i in range(1, len(arr)):\n+ key = arr[i]\n+ j = i - 1\n+\n+ while j >= 0 and arr[j] > key:\n+ arr[j + 1] = arr[j]\n+ j -= 1\n+\n+ arr[j + 1] = key\n+\n+ return arr\n+\n+\n if __name__ == \"__main__\":\n # Example usage\n test_array = [64, 34, 25, 12, 22, 11, 90]\n \n print(\"Original array:\", test_array)\n print(\"\\nBubble Sort result:\", bubble_sort(test_array))\n+ print(\"Insertion Sort result:\", insertion_sort(test_array))\n \n # Test with different arrays\n print(\"\\n--- Additional Tests ---\")\n- print(\"Reverse sorted:\", bubble_sort([5, 4, 3, 2, 1]))\n- print(\"Empty array:\", bubble_sort([]))\n+ test_cases = {\n+ \"Reverse sorted\": [5, 4, 3, 2, 1],\n+ \"Empty array\": [],\n+ \"Already sorted\": [1, 2, 3, 4, 5],\n+ }\n+\n+ for description, case in test_cases.items():\n+ print(f\"{description} (Bubble):\", bubble_sort(case))\n+ print(f\"{description} (Insertion):\", insertion_sort(case))", "file_path": "/Users/britannio/projects/droid-simple/sorting_algorithms.py" } This formatting should be deterministic and thus we can use it to show more informative tool call data. The first thing to understand is if this will naturally fit with the current architecture, as we only reliably know how the file has changed (and what the target file was) after receiving the tool call result. * droid failed tool call handling (vibe-kanban bd7feddb) crates/executors/src/executors/droid.rs droid-json/insufficient-perms.jsonl the insufficient-perms file contains the JSON output log of a run where it runs a command to create a file but the tool call fails due to a permission error. I'd expect that the failed tool result would be correlated with the tool call and thus i'd see an ARGS block and a RESULTS block within the tool call on the front-end. Instead, I see the tool call only with the ARGS block, then I see a separate UI element with the JSON tool result as if it failed to be correlated. Firstly, I want to follow TDD by creating a failing test that confirms this behaviour. It might be hard though because we haven't designed the code in droid.rs with testability in mind. Lets first analyse the code to consider if it's already testable or if we need to do any refactoring & introduce harnesses etc. My perspective of the coding agent is that we send it a command, and it streams JSON objects one by one so some form of reducer pattern seems natural (previous list of json objects + previous state + new json object => new state). Either 'new state' or 'new delta'. When we resume a session, it will emit a system message object, then a message object with role user (repeating what we sent it), then the new actions that it takes. * droid default (vibe-kanban 2f8a19cc) the default autonomy level is currently medium. Lets change it to the highest (unsafe) * droid globbing rendering (vibe-kanban 76d372ea) See droid-json/glob.jsonl Notice the `patterns` field. Unfortunately, we seems to not be using this data as glob tool calls are being rendered exclusively via a file name of some sort rather than `Globbing README.md, readme.md,docs/**,*.md` Use the oracle to investigate this. * droid todo list text (vibe-kanban b1bdeffc) Use the text 'TODO list updated' for the droid agent when it makes a change to the todo list. * droid workspace path (vibe-kanban 0486b74a) See how claude.rs uses worktree_path (from normalize_logs). We should be doing the same for the droid executor so that the tool calls we generate have relative paths. * mcp settings (vibe-kanban 2031d8f4) Quick fix: Filter that agent from the dropdown in the frontend. // In McpSettings.tsx, line 282-289 <SelectContent> {profiles && Object.entries(profiles) .filter(([key]) => key !== 'DROID') // or whatever the agent name is .sort((a, b) => a[0].localeCompare(b[0])) .map(([profileKey]) => ( <SelectItem key={profileKey} value={profileKey}> {profileKey} </SelectItem> ))} </SelectContent> we need to temporarily hide droid as it doesn't support mcp yet. * clean up (vibe-kanban 6b1a8e2e) remove all references to 'britannio' from the droid module. * delete droid json * droid agent code review (vibe-kanban 6820ffd1) We added Droid to crates/services/src/services/config/versions/v1.rs but presumably we should've used the latest reasonable version. See what we used for Copilot. Delete docs/adr-droid-architecture.md Delete docs/droid-improvements-summary.md docs/supported-coding-agents.mdx the default was medium, it's now skip-permissions-unsafe Delete the tasks/ folder * remove unnecessary v1 change * updated droid.json schema * tweak command * droid model suggestions (vibe-kanban 120f87d2) crates/executors/src/executors/droid/types.rs Valid model IDs are: gpt-5-codex OpenAI GPT-5-Codex (Auto) claude-sonnet-4-5-20250929 Claude Sonnet 4.5 gpt-5-2025-08-07 OpenAI GPT-5 claude-opus-4-1-20250805 Claude Opus 4.1 claude-haiku-4-5-20251001 Claude Haiku 4.5 glm-4.6 Droid Core (GLM-4.6) We currently mention gpt-5-codex, claude-sonnet-4 * remove dead code * droid automated testing (vibe-kanban f836b4a4) lets start brainstorming this, starting with tests in crates/executors/src/executors/droid/types.rs to ensure that we correctly generate a command * create exec_command_with_prompt * Add logging to error paths in action_mapper.rs (vibe-kanban 76cc5d71) Add tracing logging (warn/error) to error paths in `crates/executors/src/executors/droid/action_mapper.rs` following existing logging patterns in the codebase. Key locations: - Line 32-35: DroidToolData parsing failure (currently silent) - Any other error paths that swallow errors Use `tracing::warn!` with structured fields for context (tool_name, error details, etc.) * droid automated testing (DroidJSON -> NormalizedEntry) (vibe-kanban cf325d24) We have example agent from /Users/britannio/Downloads/droid-json Read crates/executors/src/executors/droid/events.rs Use the oracle to plan tests that we could introduce. * preserve timestamp * droid reasoning effort (vibe-kanban 47dae2db) in settings, we're showing a dropdown for the droid autonomy level. We should be doing the same for the reasoning level. It should default to being empty if possible. * droid path (vibe-kanban d8370535) Droid file edits (presumably ApplyPatch?) aren't using relative paths. E.g. i'm seeing `/private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban-dev/worktrees/11dc-setup/next.config.mjs` * fix warning * fix warning * whitespace update * DomainEvent -> LogEvent * remove msg store stream -> line converter * normalise the diff generated when the droid ApplyPatch tool call is parsed * refactor process_event to mutate a reference to ProcessorState * remove EntryIndexProvider abstraction * remove dead code * remove JSON indirection when invoking extract_path_from_patch * converting DroidJson -> LogEvent produces Option instead of Vec DroidJson mapping tests removed in favour of snapshot testing delete emit_patches (now redundant) update match syntax in compute_updated_action_type make process_event a member of ProcessorState * simplify droid build_command_builder * simplify droid types tests * remove droid type tests * rename events.rs -> log_event_converter.rs rename patch_emitter -> patch_converter remove ParsedLine indirection from processor.rs handle Edit, MultiEdit, and Create tool calls (only used by some models like claude) move action mapper logic to log_event_converter introduce a claude snapshot update snapshots * add error log for failed parsing of DroidJson * update snapshots * Fix clippy warnings in droid executor - Change &String to &str in extract_path_from_patch - Rename to_patch to process_event for correct self convention Amp-Thread-ID: https://ampcode.com/threads/T-81d4f5ac-6d3a-4da5-9799-de724f3df1e3 Co-authored-by: Amp <amp@ampcode.com> * update cargo lock * droid tool call result parsing (vibe-kanban 514d27de) the droid executor has a regression where the `droid exec` command is no longer producing an `id` field for tool_result messages. Fortunately, in most cases, it's safe to stick to FIFO behaviour whereby if we get a tool result, we can match it with the earliest tool call. This won't always work but it's a reasonable solution for the next few days while the droid team fixes their executor. Start by using the oracle to trace and understand the codepaths involved, and to make a plan. We likely need to update the DroidJson struct so that the tool call result id becomes optional. To test this, we can take an existing snapshot test and create a variant of it without ids in the tool call results, and see if we still produce equivalent log events. * refactor: collapse nested if statements in log_event_converter Amp-Thread-ID: https://ampcode.com/threads/T-b9ad8aac-0fd5-44c5-b2f8-317d79b623a6 Co-authored-by: Amp <amp@ampcode.com> * format * Cleanup droid executor implementation * Implement session forking * linter --------- Co-authored-by: Britannio Jarrett <britanniojarrett@gmail.com> Co-authored-by: Test User <test@example.com> Co-authored-by: Amp <amp@ampcode.com>
2025-11-20 10:40:17 +00:00
},
"DROID": {
"DEFAULT": {
"DROID": {
"autonomy": "skip-permissions-unsafe"
}
},
"GPT_5_1_CODEX": {
"DROID": {
"autonomy": "skip-permissions-unsafe",
"model": "gpt-5.1-codex"
}
},
"GPT_5_1": {
"DROID": {
"autonomy": "skip-permissions-unsafe",
"model": "gpt-5.1"
}
},
"GEMINI_3_PRO": {
"DROID": {
"autonomy": "skip-permissions-unsafe",
"model": "gemini-3-pro-preview"
}
},
"CLAUDE_SONNET_4_5": {
"DROID": {
"autonomy": "skip-permissions-unsafe",
"model": "claude-sonnet-4-5-20250929"
}
},
"CLAUDE_HAIKU_4_5": {
"DROID": {
"autonomy": "skip-permissions-unsafe",
"model": "claude-haiku-4-5-20251001"
}
},
"CLAUDE_OPUS_4_1": {
"DROID": {
"autonomy": "skip-permissions-unsafe",
"model": "claude-opus-4-1-20250805"
}
},
"GLM_4_6": {
"DROID": {
"autonomy": "skip-permissions-unsafe",
"model": "glm-4.6"
}
}
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>
2025-08-14 17:33:33 +01:00
}
Profile changes (#596) * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Make variants an object rather than array (vibe-kanban 63213864) Profile variants should be an object, with key used instead of the current label. The code should be refactored leaving no legacy trace. crates/server/src/routes/config.rs crates/executors/src/profile.rs * Remove the command builder from profiles (vibe-kanban d30abc92) It should no longer be possible to customise the command builder in profiles.json. Instead, anywhere where the command is customised, the code should be hardcoded as an enum field on the executor, eg claude code vs claude code router on the claude code struct. crates/executors/src/profile.rs crates/executors/src/executors/claude.rs * fmt * Refactor Qwen log normalization (vibe-kanban 076fdb3f) Qwen basically uses the same log normalization as Gemini, can you refactor the code to make it more reusable. A similar example exists in Amp, where we use Claude's log normalization. crates/executors/src/executors/amp.rs crates/executors/src/executors/qwen.rs crates/executors/src/executors/claude.rs * Add field overrides to executors (vibe-kanban cc3323a4) We should add optional fields 'base_command_override' (String) and 'additional_params' (Vec<String>) to each executor, and wire these fields up to the command builder * Update profiles (vibe-kanban e7545ab6) Redesign the profile configuration storage system to store only differences from defaults instead of complete profile files. Implement partial profile functions (create_partial_profile, load_from_partials, save_as_diffs) that save human-readable partial profiles containing only changed values. Update ProfileConfigs::load() to handle the new partial format while maintaining backward compatibility with legacy full profile formats through automatic migration that creates backups. Implement smart variants handling that only stores changed, added, or removed variants rather than entire arrays. Fix the profile API consistency issue by replacing the manual file loading logic in the get_profiles() endpoint in crates/server/src/routes/config.rs with ProfileConfigs::get_cached() to ensure the GET endpoint uses the same cached data that PUT updates. Add comprehensive test coverage for all new functionality. * Yolo mode becomes a field (vibe-kanban d8dd02f0) Most executors implement some variation of yolo-mode, can you make this boolean field on each executor (if supported), where the name for the field aligns with the CLI field * Change ClaudeCodeVariant to boolean (vibe-kanban cc05956f) Instead of an enum ClaudeCodeVariant, let's use a variable claude_code_router to determine whether to use claude_code_router's command. If the user has also supplied a base_command_override this should take precedence (also write a warning to console) crates/executors/src/executors/claude.rs * Remove mcp_config_path from profile config (vibe-kanban 6c1e5947) crates/executors/src/profile.rs * One profile per executor (vibe-kanban b0adc27e) Currently you can define arbitrary profiles, multiple profiles per executor. Let's refactor to simplify this configuration, instead we should only be able to configure one profile per executor. The new format should be something like: ```json { "profiles": { "CLAUDE_CODE": { "default": { "plan": false, "dangerously_skip_permissions": true, "append_prompt": null }, "plan": { "plan": true, "dangerously_skip_permissions": false, "append_prompt": null } } } } ``` Each profile's defaults should be defined as code instead of in default_profiles.json profile.json will now contain: - Overrides for default configurations - Additional user defined configurations, for executors It is not possible to remove a default configuration entirely, just override the configuration. The user profile.json should still be a minimal set of overrides, to make upgrading easy. Don't worry about migration, this will be done manually. crates/executors/default_profiles.json crates/executors/src/profile.rs * SCREAMING_SNAKE_CASE * update profile.rs * config migration * fmt * delete binding * config keys * fmt * shared types * Profile variants should be saved as SCREAMING_SNAKE_CASE (vibe-kanban 5c6c124c) crates/executors/src/profile.rs save_overrides * rename default profiles * remove defaulted executor fields * backwards compatability * fix legacy variants
2025-09-01 23:33:15 +01:00
}
Droid agent (#1318) * droid research (vibe-kanban 054135e9) <droid-docs> # Overview > Non-interactive execution mode for CI/CD pipelines and automation scripts. # Droid Exec (Headless CLI) Droid Exec is Factory's headless execution mode designed for automation workflows. Unlike the interactive CLI, `droid exec` runs as a one-shot command that completes a task and exits, making it ideal for CI/CD pipelines, shell scripts, and batch processing. ## Summary and goals Droid Exec is a one-shot task runner designed to: * Produce readable logs, and structured artifacts when requested * Enforce opt-in for mutations/command execution (secure-by-default) * Fail fast on permission violations with clear errors * Support simple composition for batch and parallel work <CardGroup cols={2}> <Card title="Non-Interactive" icon="terminal"> Single run execution that writes to stdout/stderr for CI/CD integration </Card> <Card title="Secure by Default" icon="lock"> Read-only by default with explicit opt-in for mutations via autonomy levels </Card> <Card title="Composable" icon="puzzle"> Designed for shell scripting, parallel execution, and pipeline integration </Card> <Card title="Clean Output" icon="file-export"> Structured output formats and artifacts for automated processing </Card> </CardGroup> ## Execution model * Non-interactive single run that writes to stdout/stderr. * Default is spec-mode: the agent is only allowed to execute read-only operations. * Add `--auto` to enable edits and commands; risk tiers gate what can run. CLI help (excerpt): ``` Usage: droid exec [options] [prompt] Execute a single command (non-interactive mode) Arguments: prompt The prompt to execute Options: -o, --output-format <format> Output format (default: "text") -f, --file <path> Read prompt from file --auto <level> Autonomy level: low|medium|high --skip-permissions-unsafe Skip ALL permission checks (unsafe) -s, --session-id <id> Existing session to continue (requires a prompt) -m, --model <id> Model ID to use -r, --reasoning-effort <level> Reasoning effort: off|low|medium|high --cwd <path> Working directory path -h, --help display help for command ``` Supported models (examples): * gpt-5-codex (default) * gpt-5-2025-08-07 * claude-sonnet-4-20250514 * claude-opus-4-1-20250805 ## Installation <Steps> <Step title="Install Droid CLI"> <CodeGroup> ```bash macOS/Linux theme={null} curl -fsSL https://app.factory.ai/cli | sh ``` ```powershell Windows theme={null} irm https://app.factory.ai/cli/windows | iex ``` </CodeGroup> </Step> <Step title="Get Factory API Key"> Generate your API key from the [Factory Settings Page](https://app.factory.ai/settings/api-keys) </Step> <Step title="Set Environment Variable"> Export your API key as an environment variable: ```bash theme={null} export FACTORY_API_KEY=fk-... ``` </Step> </Steps> ## Quickstart * Direct prompt: * `droid exec "analyze code quality"` * `droid exec "fix the bug in src/main.js" --auto low` * From file: * `droid exec -f prompt.md` * Pipe: * `echo "summarize repo structure" | droid exec` * Session continuation: * `droid exec --session-id <session-id> "continue with next steps"` ## Autonomy Levels Droid exec uses a tiered autonomy system to control what operations the agent can perform. By default, it runs in read-only mode, requiring explicit flags to enable modifications. ### DEFAULT (no flags) - Read-only Mode The safest mode for reviewing planned changes without execution: * ✅ Reading files or logs: cat, less, head, tail, systemctl status * ✅ Display commands: echo, pwd * ✅ Information gathering: whoami, date, uname, ps, top * ✅ Git read operations: git status, git log, git diff * ✅ Directory listing: ls, find (without -delete or -exec) * ❌ No modifications to files or system * **Use case:** Safe for reviewing what changes would be made ```bash theme={null} # Analyze and plan refactoring without making changes droid exec "Analyze the authentication system and create a detailed plan for migrating from session-based auth to OAuth2. List all files that would need changes and describe the modifications required." # Review code quality and generate report droid exec "Review the codebase for security vulnerabilities, performance issues, and code smells. Generate a prioritized list of improvements needed." # Understand project structure droid exec "Analyze the project architecture and create a dependency graph showing how modules interact with each other." ``` ### `--auto low` - Low-risk Operations Enables basic file operations while blocking system changes: * ✅ File creation/editing in project directories * ❌ No system modifications or package installations * **Use case:** Documentation updates, code formatting, adding comments ```bash theme={null} # Safe file operations droid exec --auto low "add JSDoc comments to all functions" droid exec --auto low "fix typos in README.md" ``` ### `--auto medium` - Development Operations Operations that may have significant side effects, but these side effects are typically harmless and straightforward to recover from. Adds common development tasks to low-risk operations: * Installing packages from trusted sources: npm install, pip install (without sudo) * Network requests to trusted endpoints: curl, wget to known APIs * Git operations that modify local repositories: git commit, git checkout, git pull (but not git push) * Building code with tools like make, npm run build, mvn compile * ❌ No git push, sudo commands, or production changes * **Use case:** Local development, testing, dependency management ```bash theme={null} # Development tasks droid exec --auto medium "install deps, run tests, fix issues" droid exec --auto medium "update packages and resolve conflicts" ``` ### `--auto high` - Production Operations Commands that may have security implications such as data transfers between untrusted sources or execution of unknown code, or major side effects such as irreversible data loss or modifications of production systems/deployments. * Running arbitrary/untrusted code: curl | bash, eval, executing downloaded scripts * Exposing ports or modifying firewall rules that could allow external access * Git push operations that modify remote repositories: git push, git push --force * Irreversible actions to production deployments, database migrations, or other sensitive operations * Commands that access or modify sensitive information like passwords or keys * ❌ Still blocks: sudo rm -rf /, system-wide changes * **Use case:** CI/CD pipelines, automated deployments ```bash theme={null} # Full workflow automation droid exec --auto high "fix bug, test, commit, and push to main" droid exec --auto high "deploy to staging after running tests" ``` ### `--skip-permissions-unsafe` - Bypass All Checks <Warning> DANGEROUS: This mode allows ALL operations without confirmation. Only use in completely isolated environments like Docker containers or throwaway VMs. </Warning> * ⚠️ Allows ALL operations without confirmation * ⚠️ Can execute irreversible operations * Cannot be combined with --auto flags * **Use case:** Isolated environments ```bash theme={null} # In a disposable Docker container for CI testing docker run --rm -v $(pwd):/workspace alpine:latest sh -c " apk add curl bash && curl -fsSL https://app.factory.ai/cli | sh && droid exec --skip-permissions-unsafe 'Install all system dependencies, modify system configs, run integration tests that require root access, and clean up test databases' " # In ephemeral GitHub Actions runner for rapid iteration # where the runner is destroyed after each job droid exec --skip-permissions-unsafe "Modify /etc/hosts for test domains, install custom kernel modules, run privileged container tests, and reset network interfaces" # In a temporary VM for security testing droid exec --skip-permissions-unsafe "Run penetration testing tools, modify firewall rules, test privilege escalation scenarios, and generate security audit reports" ``` ### Fail-fast Behavior If a requested action exceeds the current autonomy level, droid exec will: 1. Stop immediately with a clear error message 2. Return a non-zero exit code 3. Not perform any partial changes This ensures predictable behavior in automation scripts and CI/CD pipelines. ## Output formats and artifacts Droid exec supports three output formats for different use cases: ### text (default) Human-readable output for direct consumption or logs: ```bash theme={null} $ droid exec --auto low "create a python file that prints 'hello world'" Perfect! I've created a Python file named `hello_world.py` in your home directory that prints 'hello world' when executed. ``` ### json Structured JSON output for parsing in scripts and automation: ```bash theme={null} $ droid exec "summarize this repository" --output-format json { "type": "result", "subtype": "success", "is_error": false, "duration_ms": 5657, "num_turns": 1, "result": "This is a Factory documentation repository containing guides for CLI tools, web platform features, and onboarding procedures...", "session_id": "8af22e0a-d222-42c6-8c7e-7a059e391b0b" } ``` Use JSON format when you need to: * Parse the result in a script * Check success/failure programmatically * Extract session IDs for continuation * Process results in a pipeline ### debug Streaming messages showing the agent's execution in real-time: ```bash theme={null} $ droid exec "run ls command" --output-format debug {"type":"message","role":"user","text":"run ls command"} {"type":"message","role":"assistant","text":"I'll run the ls command to list the contents..."} {"type":"tool_call","toolName":"Execute","parameters":{"command":"ls -la"}} {"type":"tool_result","value":"total 16\ndrwxr-xr-x@ 8 user staff..."} {"type":"message","role":"assistant","text":"The ls command has been executed successfully..."} ``` Debug format is useful for: * Monitoring agent behavior * Troubleshooting execution issues * Understanding tool usage patterns * Real-time progress tracking For automated pipelines, you can also direct the agent to write specific artifacts: ```bash theme={null} droid exec --auto low "Analyze dependencies and write to deps.json" droid exec --auto low "Generate metrics report in CSV format to metrics.csv" ``` ## Working directory * Use `--cwd` to scope execution: ``` droid exec --cwd /home/runner/work/repo "Map internal packages and dump graphviz DOT to deps.dot" ``` ## Models and reasoning effort * Choose a model with `-m` and adjust reasoning with `-r`: ``` droid exec -m claude-sonnet-4-20250514 -r medium -f plan.md ``` ## Batch and parallel patterns Shell loops (bounded concurrency): ```bash theme={null} # Process files in parallel (GNU xargs -P) find src -name "*.ts" -print0 | xargs -0 -P 4 -I {} \ droid exec --auto low "Refactor file: {} to use modern TS patterns" ``` Background job parallelization: ```bash theme={null} # Process multiple directories in parallel with job control for path in packages/ui packages/models apps/factory-app; do ( cd "$path" && droid exec --auto low "Run targeted analysis and write report.md" ) & done wait # Wait for all background jobs to complete ``` Chunked inputs: ```bash theme={null} # Split large file lists into manageable chunks git diff --name-only origin/main...HEAD | split -l 50 - /tmp/files_ for f in /tmp/files_*; do list=$(tr '\n' ' ' < "$f") droid exec --auto low "Review changed files: $list and write to review.json" done rm /tmp/files_* # Clean up temporary files ``` Workflow Automation (CI/CD): ```yaml theme={null} # Dead code detection and cleanup suggestions name: Code Cleanup Analysis on: schedule: - cron: '0 1 * * 0' # Weekly on Sundays workflow_dispatch: jobs: cleanup-analysis: strategy: matrix: module: ['src/components', 'src/services', 'src/utils', 'src/hooks'] steps: - uses: actions/checkout@v4 - run: droid exec --cwd "${{ matrix.module }}" --auto low "Identify unused exports, dead code, and deprecated patterns. Generate cleanup recommendations in cleanup-report.md" ``` ## Unique usage examples License header enforcer: ```bash theme={null} git ls-files "*.ts" | xargs -I {} \ droid exec --auto low "Ensure {} begins with the Apache-2.0 header; add it if missing" ``` API contract drift check (read-only): ```bash theme={null} droid exec "Compare openapi.yaml operations to our TypeScript client methods and write drift.md with any mismatches" ``` Security sweep: ```bash theme={null} droid exec --auto low "Run a quick audit for sync child_process usage and propose fixes; write findings to sec-audit.csv" ``` ## Exit behavior * 0: success * Non-zero: failure (permission violation, tool error, unmet objective). Treat non-zero as failed in CI. ## Best practices * Favor `--auto low`; keep mutations minimal and commit/push in scripted steps. * Avoid `--skip-permissions-unsafe` unless fully sandboxed. * Ask the agent to emit artifacts your pipeline can verify. * Use `--cwd` to constrain scope in monorepos. </droid-docs> Use the oracle to research how we support custom executors. AMP and Claude Code would likely be good references here as I believe that they both operate via JSON. Save your findings in a single markdown file. * begin droid * add plan * droid implementation (vibe-kanban 90e6c8f6) Read tasks/droid-agent/plan.md and execute the plan. * document droid (vibe-kanban 0a7f8590) we have introduced a new coding agent Installation instructions are at https://factory.ai/product/cli We expect that users have the `droid` cli installed and that they have logged in. docs/supported-coding-agents.mdx There may also be other docs or references. * red gh action (vibe-kanban f0c8b6c4) Run cargo fmt --all -- --check cargo fmt --all -- --check npm run generate-types:check cargo test --workspace cargo clippy --all --all-targets -- -D warnings the checks step is failing, can you see what's up with the rust codebase and resolve it? * droid | settings bug (vibe-kanban 7deec8df) We have a new coding agent called Droid and it has a variety of different settings including the autonomy level and we default this to medium and users can update this by going to settings and then using the drop down to change it and then hitting the save button. And this works, however, when users return back to settings the displayed autonomy level is reset to medium rather than the correct level. So can you investigate why this is happening and plan how we can improve it, how we can verify it, do we need to introduce some logging, other things to consider. Write up your plan in a new markdown file. * glob * tool call parsing & display (vibe-kanban e3f65a74) droid.rs has `fn map_tool_to_action` The problem is that we're doing a poor job at displaying these tool calls e.g. glob. In `claude.rs`, we use `ClaudeToolData`, a struct that matches the real JSON data. Once we do that, we have a type safe way to map tool calls to the `ActionType` struct. You can run `droid exec --output-format=stream-json --auto medium "YOUR MESSAGE MERE"` in a temporary directory to instruct the agent to generate custom outputs in case you need more sample data. I just added glob.jsonl under droid-json, there are other json files in there too. I recommend using sub agents as some of these files (e.g. claude.rs) are large. cursor.rs might also be a useful reference. You're done once we properly handle these tools. * show droid model (vibe-kanban 8fdbc630) The first JSON object emitted from the droid executor is a system message with a `model` field. We should capture and display this. I believe that we're already doing something similar with Codex. Here's a sample system message: {"type":"system","subtype":"init","cwd":"/Users/britannio/projects/vibe-kanban","session_id":"59a75629-c0c4-451f-a3c7-8e9eab05484a","tools":["Read","LS","Execute","Edit","MultiEdit","ApplyPatch","Grep","Glob","Create","ExitSpecMode","WebSearch","TodoWrite","FetchUrl","slack_post_message"],"model":"gpt-5-codex"} * reliable apply patch display (vibe-kanban 3710fb65) The crates/executors/src/executors/droid.rs ApplyPatch tool call contains an `input` string which isn't very helpful, but the tool call result is a JSON object with a `value` object with the fields success, content, diff, and file_path. Here's a parsed example of `value`: { "success": true, "content": "def bubble_sort(arr):\n \"\"\"\n Bubble Sort Algorithm\n Time Complexity: O(n^2)\n Space Complexity: O(1)\n\n Repeatedly steps through the list, compares adjacent elements and swaps them\n if they are in the wrong order.\n \"\"\"\n n = len(arr)\n arr = arr.copy() # Create a copy to avoid modifying the original\n\n for i in range(n):\n # Flag to optimize by stopping if no swaps occur\n swapped = False\n\n for j in range(0, n - i - 1):\n if arr[j] > arr[j + 1]:\n arr[j], arr[j + 1] = arr[j + 1], arr[j]\n swapped = True\n\n # If no swaps occurred, array is already sorted\n if not swapped:\n break\n\n return arr\n\n\ndef insertion_sort(arr):\n \"\"\"\n Insertion Sort Algorithm\n Time Complexity: O(n^2)\n Space Complexity: O(1)\n\n Builds the sorted portion of the array one element at a time by inserting\n each element into its correct position.\n \"\"\"\n arr = arr.copy() # Create a copy to avoid modifying the original\n\n for i in range(1, len(arr)):\n key = arr[i]\n j = i - 1\n\n while j >= 0 and arr[j] > key:\n arr[j + 1] = arr[j]\n j -= 1\n\n arr[j + 1] = key\n\n return arr\n\n\nif __name__ == \"__main__\":\n # Example usage\n test_array = [64, 34, 25, 12, 22, 11, 90]\n\n print(\"Original array:\", test_array)\n print(\"\\nBubble Sort result:\", bubble_sort(test_array))\n print(\"Insertion Sort result:\", insertion_sort(test_array))\n\n # Test with different arrays\n print(\"\\n--- Additional Tests ---\")\n test_cases = {\n \"Reverse sorted\": [5, 4, 3, 2, 1],\n \"Empty array\": [],\n \"Already sorted\": [1, 2, 3, 4, 5],\n }\n\n for description, case in test_cases.items():\n print(f\"{description} (Bubble):\", bubble_sort(case))\n print(f\"{description} (Insertion):\", insertion_sort(case))\n", "diff": "--- previous\t\n+++ current\t\n@@ -26,14 +26,46 @@\n return arr\n \n \n+def insertion_sort(arr):\n+ \"\"\"\n+ Insertion Sort Algorithm\n+ Time Complexity: O(n^2)\n+ Space Complexity: O(1)\n+\n+ Builds the sorted portion of the array one element at a time by inserting\n+ each element into its correct position.\n+ \"\"\"\n+ arr = arr.copy() # Create a copy to avoid modifying the original\n+\n+ for i in range(1, len(arr)):\n+ key = arr[i]\n+ j = i - 1\n+\n+ while j >= 0 and arr[j] > key:\n+ arr[j + 1] = arr[j]\n+ j -= 1\n+\n+ arr[j + 1] = key\n+\n+ return arr\n+\n+\n if __name__ == \"__main__\":\n # Example usage\n test_array = [64, 34, 25, 12, 22, 11, 90]\n \n print(\"Original array:\", test_array)\n print(\"\\nBubble Sort result:\", bubble_sort(test_array))\n+ print(\"Insertion Sort result:\", insertion_sort(test_array))\n \n # Test with different arrays\n print(\"\\n--- Additional Tests ---\")\n- print(\"Reverse sorted:\", bubble_sort([5, 4, 3, 2, 1]))\n- print(\"Empty array:\", bubble_sort([]))\n+ test_cases = {\n+ \"Reverse sorted\": [5, 4, 3, 2, 1],\n+ \"Empty array\": [],\n+ \"Already sorted\": [1, 2, 3, 4, 5],\n+ }\n+\n+ for description, case in test_cases.items():\n+ print(f\"{description} (Bubble):\", bubble_sort(case))\n+ print(f\"{description} (Insertion):\", insertion_sort(case))", "file_path": "/Users/britannio/projects/droid-simple/sorting_algorithms.py" } This formatting should be deterministic and thus we can use it to show more informative tool call data. The first thing to understand is if this will naturally fit with the current architecture, as we only reliably know how the file has changed (and what the target file was) after receiving the tool call result. * droid failed tool call handling (vibe-kanban bd7feddb) crates/executors/src/executors/droid.rs droid-json/insufficient-perms.jsonl the insufficient-perms file contains the JSON output log of a run where it runs a command to create a file but the tool call fails due to a permission error. I'd expect that the failed tool result would be correlated with the tool call and thus i'd see an ARGS block and a RESULTS block within the tool call on the front-end. Instead, I see the tool call only with the ARGS block, then I see a separate UI element with the JSON tool result as if it failed to be correlated. Firstly, I want to follow TDD by creating a failing test that confirms this behaviour. It might be hard though because we haven't designed the code in droid.rs with testability in mind. Lets first analyse the code to consider if it's already testable or if we need to do any refactoring & introduce harnesses etc. My perspective of the coding agent is that we send it a command, and it streams JSON objects one by one so some form of reducer pattern seems natural (previous list of json objects + previous state + new json object => new state). Either 'new state' or 'new delta'. When we resume a session, it will emit a system message object, then a message object with role user (repeating what we sent it), then the new actions that it takes. * droid default (vibe-kanban 2f8a19cc) the default autonomy level is currently medium. Lets change it to the highest (unsafe) * droid globbing rendering (vibe-kanban 76d372ea) See droid-json/glob.jsonl Notice the `patterns` field. Unfortunately, we seems to not be using this data as glob tool calls are being rendered exclusively via a file name of some sort rather than `Globbing README.md, readme.md,docs/**,*.md` Use the oracle to investigate this. * droid todo list text (vibe-kanban b1bdeffc) Use the text 'TODO list updated' for the droid agent when it makes a change to the todo list. * droid workspace path (vibe-kanban 0486b74a) See how claude.rs uses worktree_path (from normalize_logs). We should be doing the same for the droid executor so that the tool calls we generate have relative paths. * mcp settings (vibe-kanban 2031d8f4) Quick fix: Filter that agent from the dropdown in the frontend. // In McpSettings.tsx, line 282-289 <SelectContent> {profiles && Object.entries(profiles) .filter(([key]) => key !== 'DROID') // or whatever the agent name is .sort((a, b) => a[0].localeCompare(b[0])) .map(([profileKey]) => ( <SelectItem key={profileKey} value={profileKey}> {profileKey} </SelectItem> ))} </SelectContent> we need to temporarily hide droid as it doesn't support mcp yet. * clean up (vibe-kanban 6b1a8e2e) remove all references to 'britannio' from the droid module. * delete droid json * droid agent code review (vibe-kanban 6820ffd1) We added Droid to crates/services/src/services/config/versions/v1.rs but presumably we should've used the latest reasonable version. See what we used for Copilot. Delete docs/adr-droid-architecture.md Delete docs/droid-improvements-summary.md docs/supported-coding-agents.mdx the default was medium, it's now skip-permissions-unsafe Delete the tasks/ folder * remove unnecessary v1 change * updated droid.json schema * tweak command * droid model suggestions (vibe-kanban 120f87d2) crates/executors/src/executors/droid/types.rs Valid model IDs are: gpt-5-codex OpenAI GPT-5-Codex (Auto) claude-sonnet-4-5-20250929 Claude Sonnet 4.5 gpt-5-2025-08-07 OpenAI GPT-5 claude-opus-4-1-20250805 Claude Opus 4.1 claude-haiku-4-5-20251001 Claude Haiku 4.5 glm-4.6 Droid Core (GLM-4.6) We currently mention gpt-5-codex, claude-sonnet-4 * remove dead code * droid automated testing (vibe-kanban f836b4a4) lets start brainstorming this, starting with tests in crates/executors/src/executors/droid/types.rs to ensure that we correctly generate a command * create exec_command_with_prompt * Add logging to error paths in action_mapper.rs (vibe-kanban 76cc5d71) Add tracing logging (warn/error) to error paths in `crates/executors/src/executors/droid/action_mapper.rs` following existing logging patterns in the codebase. Key locations: - Line 32-35: DroidToolData parsing failure (currently silent) - Any other error paths that swallow errors Use `tracing::warn!` with structured fields for context (tool_name, error details, etc.) * droid automated testing (DroidJSON -> NormalizedEntry) (vibe-kanban cf325d24) We have example agent from /Users/britannio/Downloads/droid-json Read crates/executors/src/executors/droid/events.rs Use the oracle to plan tests that we could introduce. * preserve timestamp * droid reasoning effort (vibe-kanban 47dae2db) in settings, we're showing a dropdown for the droid autonomy level. We should be doing the same for the reasoning level. It should default to being empty if possible. * droid path (vibe-kanban d8370535) Droid file edits (presumably ApplyPatch?) aren't using relative paths. E.g. i'm seeing `/private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban-dev/worktrees/11dc-setup/next.config.mjs` * fix warning * fix warning * whitespace update * DomainEvent -> LogEvent * remove msg store stream -> line converter * normalise the diff generated when the droid ApplyPatch tool call is parsed * refactor process_event to mutate a reference to ProcessorState * remove EntryIndexProvider abstraction * remove dead code * remove JSON indirection when invoking extract_path_from_patch * converting DroidJson -> LogEvent produces Option instead of Vec DroidJson mapping tests removed in favour of snapshot testing delete emit_patches (now redundant) update match syntax in compute_updated_action_type make process_event a member of ProcessorState * simplify droid build_command_builder * simplify droid types tests * remove droid type tests * rename events.rs -> log_event_converter.rs rename patch_emitter -> patch_converter remove ParsedLine indirection from processor.rs handle Edit, MultiEdit, and Create tool calls (only used by some models like claude) move action mapper logic to log_event_converter introduce a claude snapshot update snapshots * add error log for failed parsing of DroidJson * update snapshots * Fix clippy warnings in droid executor - Change &String to &str in extract_path_from_patch - Rename to_patch to process_event for correct self convention Amp-Thread-ID: https://ampcode.com/threads/T-81d4f5ac-6d3a-4da5-9799-de724f3df1e3 Co-authored-by: Amp <amp@ampcode.com> * update cargo lock * droid tool call result parsing (vibe-kanban 514d27de) the droid executor has a regression where the `droid exec` command is no longer producing an `id` field for tool_result messages. Fortunately, in most cases, it's safe to stick to FIFO behaviour whereby if we get a tool result, we can match it with the earliest tool call. This won't always work but it's a reasonable solution for the next few days while the droid team fixes their executor. Start by using the oracle to trace and understand the codepaths involved, and to make a plan. We likely need to update the DroidJson struct so that the tool call result id becomes optional. To test this, we can take an existing snapshot test and create a variant of it without ids in the tool call results, and see if we still produce equivalent log events. * refactor: collapse nested if statements in log_event_converter Amp-Thread-ID: https://ampcode.com/threads/T-b9ad8aac-0fd5-44c5-b2f8-317d79b623a6 Co-authored-by: Amp <amp@ampcode.com> * format * Cleanup droid executor implementation * Implement session forking * linter --------- Co-authored-by: Britannio Jarrett <britanniojarrett@gmail.com> Co-authored-by: Test User <test@example.com> Co-authored-by: Amp <amp@ampcode.com>
2025-11-20 10:40:17 +00:00
}