Files
opencode-session-manager/PLAN.md
2026-03-07 17:15:21 -07:00

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