From f5d4913da29ce6c58780bc7f9dfcd8fe138d7ace Mon Sep 17 00:00:00 2001 From: Ed_ Date: Sun, 22 Mar 2026 12:54:32 -0400 Subject: [PATCH] feat(gui): Remove ui_summary_only global toggle The ui_summary_only global aggregation toggle was redundant with per-file flags (auto_aggregate, force_full). Removed: - Checkbox from Projects panel (gui_2.py) - State variable and project load/save (app_controller.py) Per-file flags remain the intended mechanism for controlling aggregation. Tests added to verify removal and per-file flag functionality. --- .../plan.md | 4 +- config.toml | 19 ++-- manualslop_layout.ini | 99 ++++++++++--------- src/app_controller.py | 4 - src/gui_2.py | 1 - tests/test_ui_summary_only_removal.py | 75 ++++++++++++++ 6 files changed, 134 insertions(+), 68 deletions(-) create mode 100644 tests/test_ui_summary_only_removal.py diff --git a/conductor/tracks/discussion_hub_panel_reorganization_20260322/plan.md b/conductor/tracks/discussion_hub_panel_reorganization_20260322/plan.md index 3d17198..bae2b0f 100644 --- a/conductor/tracks/discussion_hub_panel_reorganization_20260322/plan.md +++ b/conductor/tracks/discussion_hub_panel_reorganization_20260322/plan.md @@ -3,8 +3,8 @@ ## Phase 1: Cleanup & Project Settings Rename Focus: Remove redundant ui_summary_only, rename Context Hub, establish project-level vs discussion-level separation -- [ ] Task: Audit current ui_summary_only usages and document behavior to deprecate -- [ ] Task: Remove ui_summary_only checkbox from _render_projects_panel (gui_2.py) +- [x] Task: Audit current ui_summary_only usages and document behavior to deprecate [f6fe3ba] (embedded audit) +- [~] Task: Remove ui_summary_only checkbox from _render_projects_panel (gui_2.py) - [ ] Task: Rename Context Hub to "Project Settings" in _gui_func tab bar - [ ] Task: Remove Context Presets tab from Project Settings (Context Hub) - [ ] Task: Update references in show_windows dict and any help text diff --git a/config.toml b/config.toml index 3fe746d..1210eae 100644 --- a/config.toml +++ b/config.toml @@ -10,14 +10,9 @@ system_prompt = "Overridden Prompt" [projects] paths = [ - "C:/projects/gencpp/gencpp_sloppy.toml", - "C:\\projects\\manual_slop\\tests\\artifacts\\temp_livecontextsim.toml", - "C:\\projects\\manual_slop\\tests\\artifacts\\temp_liveaisettingssim.toml", - "C:\\projects\\manual_slop\\tests\\artifacts\\temp_livetoolssim.toml", - "C:\\projects\\manual_slop\\tests\\artifacts\\temp_liveexecutionsim.toml", - "C:\\projects\\manual_slop\\tests\\artifacts\\temp_project.toml", + "C:/projects/gencpp/.ai/gencpp_sloppy.toml", ] -active = "C:/projects/gencpp/gencpp_sloppy.toml" +active = "C:/projects/gencpp/.ai/gencpp_sloppy.toml" [gui] separate_message_panel = false @@ -34,9 +29,9 @@ separate_tier4 = false separate_external_tools = false [gui.show_windows] -"Context Hub" = true -"Files & Media" = true -"AI Settings" = true +"Context Hub" = false +"Files & Media" = false +"AI Settings" = false "MMA Dashboard" = false "Task DAG" = true "Usage Analytics" = true @@ -53,12 +48,12 @@ separate_external_tools = false Message = false Response = false "Tool Calls" = false -Theme = true +Theme = false "Log Management" = false Diagnostics = false "External Tools" = false "Shader Editor" = false -"Session Hub" = false +"Session Hub" = true [theme] palette = "Nord Dark" diff --git a/manualslop_layout.ini b/manualslop_layout.ini index d08542b..9db0845 100644 --- a/manualslop_layout.ini +++ b/manualslop_layout.ini @@ -12,7 +12,7 @@ ViewportPos=43,95 ViewportId=0x78C57832 Size=897,649 Collapsed=0 -DockId=0x00000001,0 +DockId=0x00000005,0 [Window][Files] ViewportPos=3125,170 @@ -33,7 +33,7 @@ DockId=0x0000000A,0 Pos=0,17 Size=1680,730 Collapsed=0 -DockId=0x00000001,0 +DockId=0x00000005,0 [Window][Provider] ViewportPos=43,95 @@ -41,7 +41,7 @@ ViewportId=0x78C57832 Pos=0,651 Size=897,468 Collapsed=0 -DockId=0x00000001,0 +DockId=0x00000005,0 [Window][Message] Pos=711,694 @@ -57,7 +57,7 @@ Collapsed=0 Pos=1028,1668 Size=1397,340 Collapsed=0 -DockId=0x00000006,0 +DockId=0x0000000E,0 [Window][Comms History] ViewportPos=43,95 @@ -74,10 +74,10 @@ Collapsed=0 DockId=0xAFC85805,2 [Window][Theme] -Pos=0,976 -Size=635,951 +Pos=0,975 +Size=1010,730 Collapsed=0 -DockId=0x00000002,2 +DockId=0x00000002,0 [Window][Text Viewer - Entry #7] Pos=379,324 @@ -85,16 +85,15 @@ Size=900,700 Collapsed=0 [Window][Diagnostics] -Pos=2177,26 -Size=1162,1777 +Pos=1945,734 +Size=1211,713 Collapsed=0 -DockId=0x00000010,0 [Window][Context Hub] -Pos=0,976 -Size=635,951 +Pos=0,975 +Size=1010,730 Collapsed=0 -DockId=0x00000002,1 +DockId=0x00000002,0 [Window][AI Settings Hub] Pos=406,17 @@ -103,28 +102,28 @@ Collapsed=0 DockId=0x0000000D,0 [Window][Discussion Hub] -Pos=1936,24 -Size=1468,1903 +Pos=1163,24 +Size=1234,1542 Collapsed=0 -DockId=0x00000013,0 +DockId=0x00000006,0 [Window][Operations Hub] -Pos=637,24 -Size=1297,1903 +Pos=0,24 +Size=1161,1542 Collapsed=0 DockId=0x00000005,0 [Window][Files & Media] -Pos=0,976 -Size=635,951 +Pos=0,975 +Size=1010,730 Collapsed=0 DockId=0x00000002,0 [Window][AI Settings] Pos=0,24 -Size=635,950 +Size=1010,1681 Collapsed=0 -DockId=0x00000001,0 +DockId=0x00000005,0 [Window][Approve Tool Execution] Pos=3,524 @@ -135,13 +134,13 @@ Collapsed=0 Pos=3360,26 Size=480,2134 Collapsed=0 -DockId=0x00000010,0 +DockId=0x00000004,0 [Window][Log Management] Pos=3360,26 Size=480,2134 Collapsed=0 -DockId=0x00000010,0 +DockId=0x00000004,0 [Window][Track Proposal] Pos=709,326 @@ -400,6 +399,12 @@ Pos=1518,488 Size=900,700 Collapsed=0 +[Window][Session Hub] +Pos=1163,24 +Size=1234,1542 +Collapsed=0 +DockId=0x00000006,1 + [Table][0xFB6E3870,4] RefScale=13 Column 0 Width=80 @@ -431,11 +436,11 @@ Column 3 Width=20 Column 4 Weight=1.0000 [Table][0x2A6000B6,4] -RefScale=18 -Column 0 Width=54 -Column 1 Width=76 +RefScale=16 +Column 0 Width=48 +Column 1 Width=67 Column 2 Weight=1.0000 -Column 3 Width=274 +Column 3 Width=243 [Table][0x8BCC69C7,6] RefScale=13 @@ -454,11 +459,11 @@ Column 2 Weight=1.0000 Column 3 Width=135 [Table][0x2C515046,4] -RefScale=18 -Column 0 Width=54 +RefScale=16 +Column 0 Width=48 Column 1 Weight=1.0000 -Column 2 Width=132 -Column 3 Width=54 +Column 2 Width=166 +Column 3 Width=48 [Table][0xD99F45C5,4] Column 0 Sort=0v @@ -479,9 +484,9 @@ Column 1 Width=100 Column 2 Weight=1.0000 [Table][0xA02D8C87,3] -RefScale=18 -Column 0 Width=202 -Column 1 Width=135 +RefScale=16 +Column 0 Width=179 +Column 1 Width=120 Column 2 Weight=1.0000 [Table][0xD0277E63,2] @@ -513,23 +518,19 @@ Column 1 Weight=1.0000 DockNode ID=0x00000008 Pos=3125,170 Size=593,1157 Split=Y DockNode ID=0x00000009 Parent=0x00000008 SizeRef=1029,147 Selected=0x0469CA7A DockNode ID=0x0000000A Parent=0x00000008 SizeRef=1029,145 Selected=0xDF822E02 -DockSpace ID=0xAFC85805 Window=0x079D3A04 Pos=0,24 Size=3404,1903 Split=X +DockSpace ID=0xAFC85805 Window=0x079D3A04 Pos=0,24 Size=2397,1542 Split=X DockNode ID=0x00000003 Parent=0xAFC85805 SizeRef=2175,1183 Split=X DockNode ID=0x0000000B Parent=0x00000003 SizeRef=404,1186 Split=X Selected=0xF4139CA2 - DockNode ID=0x00000007 Parent=0x0000000B SizeRef=1071,858 Split=Y Selected=0x8CA2375C - DockNode ID=0x00000001 Parent=0x00000007 SizeRef=824,950 CentralNode=1 Selected=0x7BD57D6A - DockNode ID=0x00000002 Parent=0x00000007 SizeRef=824,951 Selected=0x8CA2375C - DockNode ID=0x0000000E Parent=0x0000000B SizeRef=2767,858 Split=X Selected=0x418C7449 - DockNode ID=0x00000012 Parent=0x0000000E SizeRef=1297,402 Split=Y Selected=0x418C7449 - DockNode ID=0x00000005 Parent=0x00000012 SizeRef=876,1749 Selected=0x418C7449 - DockNode ID=0x00000006 Parent=0x00000012 SizeRef=876,362 Selected=0x1D56B311 - DockNode ID=0x00000013 Parent=0x0000000E SizeRef=1468,402 Selected=0x6F2B5B04 + DockNode ID=0x00000007 Parent=0x0000000B SizeRef=1512,858 Split=Y Selected=0x8CA2375C + DockNode ID=0x00000001 Parent=0x00000007 SizeRef=824,949 Split=X Selected=0x418C7449 + DockNode ID=0x00000005 Parent=0x00000001 SizeRef=1161,1681 CentralNode=1 Selected=0x418C7449 + DockNode ID=0x00000006 Parent=0x00000001 SizeRef=1234,1681 Selected=0x6F2B5B04 + DockNode ID=0x00000002 Parent=0x00000007 SizeRef=824,730 Selected=0x8CA2375C + DockNode ID=0x0000000E Parent=0x0000000B SizeRef=1777,858 Selected=0x418C7449 DockNode ID=0x0000000D Parent=0x00000003 SizeRef=435,1186 Selected=0x363E93D6 - DockNode ID=0x00000004 Parent=0xAFC85805 SizeRef=1162,1183 Split=Y Selected=0x3AEC3498 - DockNode ID=0x00000010 Parent=0x00000004 SizeRef=1199,1689 Selected=0xB4CBF21A - DockNode ID=0x00000011 Parent=0x00000004 SizeRef=1199,420 Split=X Selected=0xDEB547B6 - DockNode ID=0x0000000C Parent=0x00000011 SizeRef=916,380 Selected=0x655BC6E9 - DockNode ID=0x0000000F Parent=0x00000011 SizeRef=281,380 Selected=0xDEB547B6 + DockNode ID=0x00000004 Parent=0xAFC85805 SizeRef=1162,1183 Split=X Selected=0x3AEC3498 + DockNode ID=0x0000000C Parent=0x00000004 SizeRef=916,380 Selected=0x655BC6E9 + DockNode ID=0x0000000F Parent=0x00000004 SizeRef=281,380 Selected=0xDEB547B6 ;;;<<>>;;; ;;;<<>>;;; diff --git a/src/app_controller.py b/src/app_controller.py index 63d8407..ac18d28 100644 --- a/src/app_controller.py +++ b/src/app_controller.py @@ -230,7 +230,6 @@ class AppController: self.ui_project_system_prompt: str = "" self.ui_gemini_cli_path: str = "gemini" self.ui_word_wrap: bool = True - self.ui_summary_only: bool = False self.ui_auto_add_history: bool = False self.ui_active_tool_preset: str | None = None self.ui_global_system_prompt: str = "" @@ -912,7 +911,6 @@ class AppController: self.ui_gemini_cli_path = self.project.get("gemini_cli", {}).get("binary_path", "gemini") self._update_gcli_adapter(self.ui_gemini_cli_path) self.ui_word_wrap = proj_meta.get("word_wrap", True) - self.ui_summary_only = proj_meta.get("summary_only", False) self.ui_auto_add_history = disc_sec.get("auto_add", False) self.ui_global_system_prompt = self.config.get("ai", {}).get("system_prompt", "") @@ -2006,7 +2004,6 @@ class AppController: self.ui_auto_scroll_comms = proj.get("project", {}).get("auto_scroll_comms", True) self.ui_auto_scroll_tool_calls = proj.get("project", {}).get("auto_scroll_tool_calls", True) self.ui_word_wrap = proj.get("project", {}).get("word_wrap", True) - self.ui_summary_only = proj.get("project", {}).get("summary_only", False) agent_tools_cfg = proj.get("agent", {}).get("tools", {}) self.ui_agent_tools = {t: agent_tools_cfg.get(t, True) for t in models.AGENT_TOOL_NAMES} # MMA Tracks @@ -2458,7 +2455,6 @@ class AppController: proj["project"]["main_context"] = self.ui_project_main_context proj["project"]["active_preset"] = self.ui_project_preset_name proj["project"]["word_wrap"] = self.ui_word_wrap - proj["project"]["summary_only"] = self.ui_summary_only proj["project"]["auto_scroll_comms"] = self.ui_auto_scroll_comms proj["project"]["auto_scroll_tool_calls"] = self.ui_auto_scroll_tool_calls proj.setdefault("gemini_cli", {})["binary_path"] = self.ui_gemini_cli_path diff --git a/src/gui_2.py b/src/gui_2.py index 441984c..bc2638f 100644 --- a/src/gui_2.py +++ b/src/gui_2.py @@ -1702,7 +1702,6 @@ class App: models.save_config(self.config) self.ai_status = "config saved" ch, self.ui_word_wrap = imgui.checkbox("Word-Wrap (Read-only panels)", self.ui_word_wrap) - ch, self.ui_summary_only = imgui.checkbox("Summary Only (send file structure, not full content)", self.ui_summary_only) ch, self.ui_auto_scroll_comms = imgui.checkbox("Auto-scroll Comms History", self.ui_auto_scroll_comms) ch, self.ui_auto_scroll_tool_calls = imgui.checkbox("Auto-scroll Tool History", self.ui_auto_scroll_tool_calls) if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_projects_panel") diff --git a/tests/test_ui_summary_only_removal.py b/tests/test_ui_summary_only_removal.py new file mode 100644 index 0000000..e821c9d --- /dev/null +++ b/tests/test_ui_summary_only_removal.py @@ -0,0 +1,75 @@ +import pytest +import inspect +from src import models + + +def test_ui_summary_only_not_in_projects_panel(): + import src.gui_2 as gui_2 + + source = inspect.getsource(gui_2.App._render_projects_panel) + assert "ui_summary_only" not in source, ( + "ui_summary_only checkbox should be removed from Projects panel" + ) + assert "Summary Only" not in source, ( + "Summary Only label should be removed from Projects panel" + ) + + +def test_ui_summary_only_not_in_app_controller_projects(): + import src.app_controller as app_controller + + source = inspect.getsource(app_controller.AppController) + assert "ui_summary_only" not in source, ( + "ui_summary_only should be removed from AppController" + ) + + +def test_file_item_has_per_file_flags(): + item = models.FileItem(path="test.py") + assert hasattr(item, "auto_aggregate") + assert hasattr(item, "force_full") + assert item.auto_aggregate is True + assert item.force_full is False + + +def test_file_item_serialization_with_flags(): + item = models.FileItem(path="test.py", auto_aggregate=False, force_full=True) + data = item.to_dict() + + assert data["auto_aggregate"] is False + assert data["force_full"] is True + + restored = models.FileItem.from_dict(data) + assert restored.auto_aggregate is False + assert restored.force_full is True + + +def test_project_without_summary_only_loads(): + proj = {"project": {"name": "test", "paths": []}} + assert proj.get("project", {}).get("summary_only") is None + + +def test_aggregate_from_items_respects_auto_aggregate(): + from pathlib import Path + from src import aggregate + + items = [ + { + "path": Path("file1.py"), + "entry": "file1.py", + "content": "print('hello')", + "auto_aggregate": True, + "force_full": False, + }, + { + "path": Path("file2.py"), + "entry": "file2.py", + "content": "print('world')", + "auto_aggregate": False, + "force_full": False, + }, + ] + + result = aggregate._build_files_section_from_items(items) + assert "file1.py" in result + assert "file2.py" not in result