141 lines
5.1 KiB
Markdown
141 lines
5.1 KiB
Markdown
# Session Mover TUI - Project Plan
|
|
|
|
## Overview
|
|
A Python Textual TUI application to visually manage OpenCode sessions (move/copy between projects and workspaces) without writing SQL.
|
|
|
|
## Database Schema (opencode.db)
|
|
|
|
### Core Tables
|
|
- **session**: `id, project_id, workspace_id, parent_id, slug, directory, title, version, time_created, time_updated, time_archived`
|
|
- **project**: `id, worktree, name, vcs`
|
|
- **workspace**: `id, project_id, branch, type, name, directory`
|
|
|
|
### Related Data (cascade on session delete)
|
|
- **message** → **part**: Conversation content
|
|
- **todo**: Session todos
|
|
- **session_share**: Share links
|
|
|
|
## Goals
|
|
|
|
1. **Visual browsing** - Tree view of Projects → Workspaces → Sessions
|
|
2. **Easy session movement** - Drag-and-drop or keyboard-driven moving between projects
|
|
3. **Batch operations** - Select multiple sessions and move them together
|
|
4. **Safety** - Confirmation dialogs, preview SQL, automatic backup
|
|
5. **Discoverability** - Hotkeys always visible, clear status indicators
|
|
|
|
## Key Features
|
|
|
|
### Display
|
|
- Split pane: Left = Projects/Workspaces tree, Right = Sessions table
|
|
- Sessions table columns: Title, Project, Workspace, Messages, Created, Archived status
|
|
- Filter/search box for sessions
|
|
- Toggle for archived sessions (hidden by default)
|
|
- Selected sessions highlighted/checked
|
|
|
|
### Navigation
|
|
- Mouse: Click to select, double-click to open details
|
|
- Keyboard: Tab/Shift+Tab between panels, arrows to navigate
|
|
- Hotkeys always visible at bottom
|
|
|
|
### Actions
|
|
- **Backup** (`B`) - Create timestamped DB copy
|
|
- **Move** (`M`) - Move selected sessions to another project/workspace
|
|
- **Copy** (`C`) - Duplicate sessions to another project
|
|
- **Show archived** (`A`) - Toggle archived sessions visibility
|
|
- **Refresh** (`R`) - Reload data from database
|
|
- **Quit** (`Q`)
|
|
|
|
### Move/Copy Dialog
|
|
- Dropdown selectors for destination Project (required) and Workspace (optional)
|
|
- Preview of affected sessions and SQL statements that will execute
|
|
- Confirmation before executing
|
|
- Summary after completion
|
|
|
|
### Backup Strategy
|
|
- Before first write operation, create backup: `opencode-YYYYMMDD-HHMMSS.db`
|
|
- Location: same directory as source DB
|
|
- Only one backup per session (don't spam)
|
|
- User can manually backup at any time with `B`
|
|
|
|
## Technical Implementation
|
|
|
|
### Stack
|
|
- **Python 3.9+**
|
|
- **Textual** (TUI framework)
|
|
- **sqlite3** (stdlib)
|
|
|
|
### Project Structure
|
|
```
|
|
session-mover/
|
|
├── main.py # Application entry point
|
|
├── app.py # Textual App class
|
|
├── database.py # DB connection, queries, models
|
|
├── widgets/
|
|
│ ├── project_tree.py # Projects/Workspaces tree
|
|
│ ├── sessions_table.py # Sessions data table
|
|
│ └── dialogs.py # Move/Copy dialogs
|
|
├── utils.py # Backup, formatting helpers
|
|
└── requirements.txt
|
|
```
|
|
|
|
### Database Operations
|
|
|
|
**Move session:**
|
|
```sql
|
|
UPDATE session SET project_id = ? WHERE id = ?;
|
|
-- Optionally: UPDATE session SET workspace_id = ? WHERE id = ?;
|
|
```
|
|
|
|
**Copy session:**
|
|
```sql
|
|
BEGIN TRANSACTION;
|
|
-- Copy session with new UUID
|
|
INSERT INTO session (...)
|
|
SELECT ... FROM session WHERE id = ?;
|
|
-- Copy related records with new IDs
|
|
INSERT INTO message ... SELECT ... FROM message WHERE session_id = ?;
|
|
INSERT INTO part ... SELECT ... FROM part WHERE session_id = ?;
|
|
INSERT INTO todo ... SELECT ... FROM todo WHERE session_id = ?;
|
|
INSERT INTO session_share ... SELECT ... FROM session_share WHERE session_id = ?;
|
|
COMMIT;
|
|
```
|
|
|
|
**Validation checks:**
|
|
- Target project exists
|
|
- If workspace specified: exists and belongs to target project
|
|
- Sessions exist and aren't already in target
|
|
|
|
## Implementation Steps
|
|
|
|
1. **Setup** - Create project structure, requirements.txt with `textual`
|
|
2. **Database layer** - `database.py` with connection, session/project/workspace queries
|
|
3. **TUI skeleton** - Basic Textual app with split layout
|
|
4. **Project tree widget** - Load projects/workspaces, show hierarchy
|
|
5. **Sessions table** - Load sessions with counts, implement filtering
|
|
6. **Selection** - Multi-select mechanism (checkboxes or highlight+shift)
|
|
7. **Action dialogs** - Move/Copy dialog with preview
|
|
8. **Backup system** - Before first write operation
|
|
9. **SQL execution** - Safe updates with transactions
|
|
10. **Polish** - Status messages, error handling, hotkeys display
|
|
|
|
## Open Questions (Resolved)
|
|
|
|
- Use Textual: **Yes**
|
|
- Show hotkeys: **Always at bottom**
|
|
- Include archived: **hidden by default, toggle显示**
|
|
- Single DB path: **Default opencode.db in current dir, --db flag to override**
|
|
- Copy command: **Yes, duplicate sessions**
|
|
- Batch move: **All selected move to same destination**
|
|
- Confirmation needed: **Yes, with SQL preview**
|
|
- Backup: **Timestamped copy before first write**
|
|
- Workspace on move: **Optional - can keep current or select new**
|
|
|
|
## Success Criteria
|
|
|
|
- Can browse all sessions with project/workspace context
|
|
- Can select session(s) and move them to different project with one keystroke
|
|
- Can see exactly what SQL will run before confirming
|
|
- Backup created automatically before any change
|
|
- All operations display clear success/error feedback
|
|
- No need to write SQL manually
|