layout persistence
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
**manual_slop** is a local GUI tool for manually curating and sending context to AI APIs. It aggregates files, screenshots, and discussion history into a structured markdown file and sends it to a chosen AI provider with a user-written message. The AI can also execute PowerShell scripts within the project directory, with user confirmation required before each execution.
|
||||
Make sure to update this file every time.
|
||||
|
||||
**manual_slop** is a local GUI tool for manually curating and sending context to AI APIs. It aggregates files, screenshots, and discussion history into a structured markdown file and sends it to a chosen AI provider with a user-written message. The AI can also execute PowerShell scripts within the project directory, with user confirmation required before each execution.
|
||||
|
||||
**Stack:**
|
||||
- `dearpygui` - GUI with docking/floating/resizable panels
|
||||
@@ -8,12 +10,13 @@
|
||||
- `uv` - package/env management
|
||||
|
||||
**Files:**
|
||||
- `gui.py` - main GUI, `App` class, all panels, all callbacks, confirmation dialog
|
||||
- `gui.py` - main GUI, `App` class, all panels, all callbacks, confirmation dialog, layout persistence
|
||||
- `ai_client.py` - unified provider wrapper, model listing, session management, send, tool/function-call loop
|
||||
- `aggregate.py` - reads config, collects files/screenshots/discussion, writes numbered `.md` files to `output_dir`
|
||||
- `shell_runner.py` - subprocess wrapper that runs PowerShell scripts sandboxed to `base_dir`, returns stdout/stderr/exit code as a string
|
||||
- `config.toml` - namespace, output_dir, files paths+base_dir, screenshots paths+base_dir, discussion history array, ai provider+model
|
||||
- `credentials.toml` - gemini api_key, anthropic api_key
|
||||
- `dpg_layout.ini` - Dear PyGui window layout file (auto-saved on exit, auto-loaded on startup); gitignore this per-user
|
||||
|
||||
**GUI Panels:**
|
||||
- **Config** - namespace, output dir, save
|
||||
@@ -25,6 +28,13 @@
|
||||
- **Response** - readonly multiline displaying last AI response
|
||||
- **Tool Calls** - scrollable log of every PowerShell tool call the AI made, showing script and result; Clear button
|
||||
|
||||
**Layout persistence:**
|
||||
- `dpg.configure_app(..., init_file="dpg_layout.ini")` loads the ini at startup if it exists; DPG silently ignores a missing file
|
||||
- `dpg.save_init_file("dpg_layout.ini")` is called immediately before `dpg.destroy_context()` on clean exit
|
||||
- The ini records window positions, sizes, and dock node assignments in DPG's native format
|
||||
- First run (no ini) uses the hardcoded `pos=` defaults in `_build_ui()`; after that the ini takes over
|
||||
- Delete `dpg_layout.ini` to reset to defaults
|
||||
|
||||
**AI Tool Use (PowerShell):**
|
||||
- Both Gemini and Anthropic are configured with a `run_powershell` tool/function declaration
|
||||
- When the AI wants to edit or create files it emits a tool call with a `script` string
|
||||
@@ -62,4 +72,3 @@
|
||||
- System prompt support could be added as a field in `config.toml` and passed in `ai_client.send()`
|
||||
- Discussion history excerpts could be individually toggleable for inclusion in the generated md
|
||||
- `MAX_TOOL_ROUNDS` in `ai_client.py` caps agentic loops at 5 rounds; adjustable
|
||||
|
||||
|
||||
10
config.toml
10
config.toml
@@ -17,10 +17,16 @@ paths = [
|
||||
|
||||
[screenshots]
|
||||
base_dir = "C:/Users/Ed/scoop/apps/sharex/current/ShareX/Screenshots/2026-02"
|
||||
paths = []
|
||||
paths = [
|
||||
"C:/Users/Ed/scoop/apps/sharex/current/ShareX/Screenshots/2026-02/python_2026-02-21_15-24-31.png",
|
||||
]
|
||||
|
||||
[discussion]
|
||||
history = []
|
||||
history = [
|
||||
"Update the MainContext.md with latest state of codebase. Add support for preserving layout in imgui.",
|
||||
"[NO response from claude-sonnet-4-6]",
|
||||
"No code changed but you ran several scripts, whats going on...",
|
||||
]
|
||||
|
||||
[ai]
|
||||
provider = "anthropic"
|
||||
|
||||
75
dpg_layout.ini
Normal file
75
dpg_layout.ini
Normal file
@@ -0,0 +1,75 @@
|
||||
[Window][WindowOverViewport_11111111]
|
||||
Pos=0,0
|
||||
Size=3840,2137
|
||||
Collapsed=0
|
||||
|
||||
[Window][Debug##Default]
|
||||
Pos=60,60
|
||||
Size=400,400
|
||||
Collapsed=0
|
||||
|
||||
[Window][###22]
|
||||
Pos=0,0
|
||||
Size=376,652
|
||||
Collapsed=0
|
||||
DockId=0x00000005,0
|
||||
|
||||
[Window][###30]
|
||||
Pos=0,654
|
||||
Size=376,835
|
||||
Collapsed=0
|
||||
DockId=0x00000009,0
|
||||
|
||||
[Window][###66]
|
||||
Pos=0,1491
|
||||
Size=376,646
|
||||
Collapsed=0
|
||||
DockId=0x0000000A,0
|
||||
|
||||
[Window][###79]
|
||||
Pos=1209,0
|
||||
Size=968,2137
|
||||
Collapsed=0
|
||||
DockId=0x0000000B,0
|
||||
|
||||
[Window][###96]
|
||||
Pos=2179,0
|
||||
Size=1661,630
|
||||
Collapsed=0
|
||||
DockId=0x0000000D,0
|
||||
|
||||
[Window][###105]
|
||||
Pos=378,494
|
||||
Size=829,1643
|
||||
Collapsed=0
|
||||
DockId=0x00000008,0
|
||||
|
||||
[Window][###103]
|
||||
Pos=2179,632
|
||||
Size=1661,1505
|
||||
Collapsed=0
|
||||
DockId=0x0000000E,0
|
||||
|
||||
[Window][###86]
|
||||
Pos=378,0
|
||||
Size=829,492
|
||||
Collapsed=0
|
||||
DockId=0x00000007,0
|
||||
|
||||
[Docking][Data]
|
||||
DockSpace ID=0x7C6B3D9B Window=0xA87D555D Pos=0,0 Size=3840,2137 Split=X Selected=0x40484D8F
|
||||
DockNode ID=0x00000003 Parent=0x7C6B3D9B SizeRef=376,1161 Split=Y Selected=0xEE087978
|
||||
DockNode ID=0x00000005 Parent=0x00000003 SizeRef=235,354 Selected=0xEE087978
|
||||
DockNode ID=0x00000006 Parent=0x00000003 SizeRef=235,805 Split=Y Selected=0x5F94F9BD
|
||||
DockNode ID=0x00000009 Parent=0x00000006 SizeRef=235,453 Selected=0x5F94F9BD
|
||||
DockNode ID=0x0000000A Parent=0x00000006 SizeRef=235,350 Selected=0x80199DAE
|
||||
DockNode ID=0x00000004 Parent=0x7C6B3D9B SizeRef=1286,1161 Split=X
|
||||
DockNode ID=0x00000001 Parent=0x00000004 SizeRef=829,1161 Split=Y Selected=0x40484D8F
|
||||
DockNode ID=0x00000007 Parent=0x00000001 SizeRef=595,492 Selected=0xBA13FCDE
|
||||
DockNode ID=0x00000008 Parent=0x00000001 SizeRef=595,1643 CentralNode=1 Selected=0x40484D8F
|
||||
DockNode ID=0x00000002 Parent=0x00000004 SizeRef=2631,1161 Split=X Selected=0x714F2F7B
|
||||
DockNode ID=0x0000000B Parent=0x00000002 SizeRef=968,1161 Selected=0xC915D9DA
|
||||
DockNode ID=0x0000000C Parent=0x00000002 SizeRef=1661,1161 Split=Y Selected=0x714F2F7B
|
||||
DockNode ID=0x0000000D Parent=0x0000000C SizeRef=396,342 Selected=0x714F2F7B
|
||||
DockNode ID=0x0000000E Parent=0x0000000C SizeRef=396,817 Selected=0xCF08B82F
|
||||
|
||||
3
gui.py
3
gui.py
@@ -598,7 +598,7 @@ class App:
|
||||
|
||||
def run(self):
|
||||
dpg.create_context()
|
||||
dpg.configure_app(docking=True, docking_space=True)
|
||||
dpg.configure_app(docking=True, docking_space=True, init_file="dpg_layout.ini")
|
||||
dpg.create_viewport(title="manual slop", width=1680, height=1200)
|
||||
dpg.setup_dearpygui()
|
||||
dpg.show_viewport()
|
||||
@@ -616,6 +616,7 @@ class App:
|
||||
|
||||
dpg.render_dearpygui_frame()
|
||||
|
||||
dpg.save_init_file("dpg_layout.ini")
|
||||
dpg.destroy_context()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user