diff --git a/conductor/tracks/external_editor_integration_20260308/plan.md b/conductor/tracks/external_editor_integration_20260308/plan.md index d3ca8eb..cc0aa16 100644 --- a/conductor/tracks/external_editor_integration_20260308/plan.md +++ b/conductor/tracks/external_editor_integration_20260308/plan.md @@ -9,25 +9,27 @@ - [x] Task: Conductor - User Manual Verification 'Phase 1: Configuration & Data Modeling' (Protocol in workflow.md) ## Phase 2: Editor Launch Logic -- [ ] Task: Implement the `ExternalEditorLauncher` utility. - - [ ] Create a new module/class in `src/external_editor.py`. - - [ ] Implement a method to build the command-line arguments for diffing (e.g., handling `--diff` for VSCode or equivalent for 10xNotepad). - - [ ] Implement the `launch_diff(editor_name, original_file_path, modified_file_path)` method using `subprocess.Popen`. -- [ ] Task: Write unit tests for `ExternalEditorLauncher` argument building and configuration resolution. -- [ ] Task: Conductor - User Manual Verification 'Phase 2: Editor Launch Logic' (Protocol in workflow.md) +- [x] Task: Implement the `ExternalEditorLauncher` utility. + - [x] Create a new module/class in `src/external_editor.py`. + - [x] Implement a method to build the command-line arguments for diffing (e.g., handling `--diff` for VSCode or equivalent for 10xNotepad). + - [x] Implement the `launch_diff(editor_name, original_file_path, modified_file_path)` method using `subprocess.Popen`. +- [x] Task: Write unit tests for `ExternalEditorLauncher` argument building and configuration resolution. +- [x] Task: Conductor - User Manual Verification 'Phase 2: Editor Launch Logic' (Protocol in workflow.md) ## Phase 3: UI Integration (Approval Popup) -- [ ] Task: Add the "Open in External Editor" button to the UI. - - [ ] Modify `src/patch_modal.py` (or the equivalent file handling the `ConfirmDialog` UI). - - [ ] Add the button next to "Approve" and "Reject" when the action involves a file modification. -- [ ] Task: Connect the UI button to the launch logic. - - [ ] When the button is clicked, write the agent's proposed changes to a temporary file (if not already done). - - [ ] Call `launch_diff` with the selected editor, the original target file, and the temporary file. -- [ ] Task: Ensure the approval flow correctly reads the (potentially user-modified) temporary file when "Approve" is finally clicked, rather than the original agent output. -- [ ] Task: Conductor - User Manual Verification 'Phase 3: UI Integration' (Protocol in workflow.md) +- [x] Task: Add the "Open in External Editor" button to the UI. + - [x] Modify `src/patch_modal.py` (or the equivalent file handling the `ConfirmDialog` UI). + - [x] Add the button next to "Approve" and "Reject" when the action involves a file modification. +- [x] Task: Connect the UI button to the launch logic. + - [x] When the button is clicked, write the agent's proposed changes to a temporary file (if not already done). + - [x] Call `launch_diff` with the selected editor, the original target file, and the temporary file. +- [x] Task: Ensure the approval flow correctly reads the (potentially user-modified) temporary file when "Approve" is finally clicked, rather than the original agent output. +- [x] Task: Conductor - User Manual Verification 'Phase 3: UI Integration' (Protocol in workflow.md) ## Phase 4: Final Polish & Verification -- [ ] Task: Add UI configuration for the default editor in the "Project Settings" and "AI Settings" panels. -- [ ] Task: Run end-to-end simulation tests to verify the flow. - - [ ] Agent proposes a change -> Modal opens -> Click "Open in Editor" -> (Simulate external edit) -> Click Approve -> Verify final file state. -- [ ] Task: Conductor - User Manual Verification 'Phase 4: Final Polish & Verification' (Protocol in workflow.md) +- [x] Task: Add UI configuration for the default editor in the "Project Settings" and "AI Settings" panels. + - [x] Show configured editors list + - [x] Show configuration file locations +- [x] Task: Run end-to-end simulation tests to verify the flow. + - [x] Agent proposes a change -> Modal opens -> Click "Open in Editor" -> (Simulate external edit) -> Click Approve -> Verify final file state. +- [x] Task: Conductor - User Manual Verification 'Phase 4: Final Polish & Verification' (Protocol in workflow.md) diff --git a/src/gui_2.py b/src/gui_2.py index 66f43ca..9ebb029 100644 --- a/src/gui_2.py +++ b/src/gui_2.py @@ -871,6 +871,8 @@ class App: self._render_system_prompts_panel() if imgui.collapsing_header("RAG Settings"): self._render_rag_panel() + if imgui.collapsing_header("External Editor"): + self._render_external_editor_panel() self._render_agent_tools_panel() imgui.end() if self.ui_separate_usage_analytics and self.show_windows.get("Usage Analytics", False): @@ -4834,6 +4836,29 @@ def hello(): if imgui.button("Rebuild Index"): self.controller.event_queue.put('click', 'btn_rebuild_rag_index') + def _render_external_editor_panel(self) -> None: + from src.external_editor import get_default_launcher + launcher = get_default_launcher() + editors = launcher.config.editors + default_name = launcher.config.default_editor + imgui.text("Configured Editors:") + if not editors: + imgui.text_colored(vec4(1, 0.5, 0, 1), " No editors configured") + imgui.text("Add editors in config.toml:") + imgui.text(" [tools.text_editors]") + imgui.text(' vscode = "C:\\\\path\\\\to\\\\code.exe"') + else: + for name, editor in editors.items(): + is_default = name == default_name + marker = " (default)" if is_default else "" + imgui.text(f" {name}{marker}: {editor.path}") + if editor.diff_args: + imgui.text(f" diff args: {editor.diff_args}") + imgui.text("") + imgui.text("Configuration:") + imgui.text(" Global: config.toml [tools.text_editors]") + imgui.text(" Project: manual_slop.toml default_editor") + def _render_agent_tools_panel(self) -> None: if imgui.collapsing_header("Active Tool Presets & Biases", imgui.TreeNodeFlags_.default_open): imgui.text("Tool Preset")