Restored from origin/main (b4663fb): - .github/ workflows and issue templates - .gitignore (proper exclusions) - .opencode/agent/web_developer.md - AGENTS.md, BUILD.md, PROGRESS.md - dev-docs/ (9 architecture/implementation docs) - docs/screenshots/ (4 UI screenshots) - images/ (CodeNomad icons) - package-lock.json (dependency lockfile) - tasks/ (25+ project task files) Also restored original source files that were modified: - packages/ui/src/App.tsx - packages/ui/src/lib/logger.ts - packages/ui/src/stores/instances.ts - packages/server/src/server/routes/workspaces.ts - packages/server/src/workspaces/manager.ts - packages/server/src/workspaces/runtime.ts - packages/server/package.json Kept new additions: - Install-*.bat/.sh (enhanced installers) - Launch-*.bat/.sh (new launchers) - README.md (SEO optimized with GLM 4.7)
150 lines
4.2 KiB
Markdown
150 lines
4.2 KiB
Markdown
# CodeNomad - Development Progress
|
|
|
|
## Completed Tasks
|
|
|
|
### Task 001: Project Setup ✅
|
|
- Set up Electron + SolidJS + Vite + TypeScript
|
|
- Configured TailwindCSS v3 (downgraded from v4 for electron-vite compatibility)
|
|
- Build pipeline with electron-vite
|
|
- Application window management
|
|
- Application menu with keyboard shortcuts
|
|
|
|
### Task 002: Empty State UI & Folder Selection ✅
|
|
- Empty state component with styled UI
|
|
- Native folder picker integration
|
|
- IPC handlers for folder selection
|
|
- UI state management with SolidJS signals
|
|
- Loading states with spinner
|
|
- Keyboard shortcuts (Cmd/Ctrl+N)
|
|
|
|
### Task 003: Process Manager ✅
|
|
- Process spawning: `opencode serve --port 0`
|
|
- Port detection from stdout (regex: `opencode server listening on http://...`)
|
|
- Process lifecycle management (spawn, kill, cleanup)
|
|
- IPC communication for instance management
|
|
- Instance state tracking (starting → ready → stopped/error)
|
|
- Auto-cleanup on app quit
|
|
- Error handling & timeout protection (10s)
|
|
- Graceful shutdown (SIGTERM → SIGKILL)
|
|
|
|
### Task 004: SDK Integration ✅
|
|
- Installed `@opencode-ai/sdk` package
|
|
- SDK manager for client lifecycle
|
|
- Session fetching from OpenCode server
|
|
- Agent fetching (`client.app.agents()`)
|
|
- Provider fetching (`client.config.providers()`)
|
|
- Session store with SolidJS signals
|
|
- Instance store updated with SDK client
|
|
- Loading states for async operations
|
|
- Error handling for network failures
|
|
|
|
### Task 005: Session Picker Modal ✅
|
|
- Modal dialog with Kobalte Dialog
|
|
- Lists ALL existing sessions (scrollable)
|
|
- Session metadata display (title, relative timestamp)
|
|
- Native HTML select dropdown for agents
|
|
- Auto-selects first agent by default
|
|
- Create new session with selected agent
|
|
- Cancel button stops instance and closes modal
|
|
- Resume session on click
|
|
- Empty state for no sessions
|
|
- Loading state for agents
|
|
- Keyboard navigation (Escape to cancel)
|
|
|
|
## Current State
|
|
|
|
**Working Features:**
|
|
- ✅ App launches with empty state
|
|
- ✅ Folder selection via native dialog
|
|
- ✅ OpenCode server spawning per folder
|
|
- ✅ Port extraction and process tracking
|
|
- ✅ SDK client connection to running servers
|
|
- ✅ Session list fetching and display
|
|
- ✅ Agent and provider data fetching
|
|
- ✅ Session picker modal on instance creation
|
|
- ✅ Resume existing sessions
|
|
- ✅ Create new sessions with agent selection
|
|
|
|
**File Structure:**
|
|
```
|
|
packages/opencode-client/
|
|
├── electron/
|
|
│ ├── main/
|
|
│ │ ├── main.ts (window + IPC setup)
|
|
│ │ ├── menu.ts (app menu)
|
|
│ │ ├── ipc.ts (instance IPC handlers)
|
|
│ │ └── process-manager.ts (server spawning)
|
|
│ └── preload/
|
|
│ └── index.ts (IPC bridge)
|
|
├── src/
|
|
│ ├── components/
|
|
│ │ ├── empty-state.tsx
|
|
│ │ └── session-picker.tsx
|
|
│ ├── lib/
|
|
│ │ └── sdk-manager.ts
|
|
│ ├── stores/
|
|
│ │ ├── ui.ts
|
|
│ │ ├── instances.ts
|
|
│ │ └── sessions.ts
|
|
│ ├── types/
|
|
│ │ ├── electron.d.ts
|
|
│ │ ├── instance.ts
|
|
│ │ └── session.ts
|
|
│ └── App.tsx
|
|
├── tasks/
|
|
│ ├── done/ (001-005)
|
|
│ └── todo/ (006+)
|
|
└── docs/
|
|
```
|
|
|
|
## Next Steps
|
|
|
|
### Task 006: Message Stream UI (NEXT)
|
|
- Message display component
|
|
- User/assistant message rendering
|
|
- Markdown support with syntax highlighting
|
|
- Tool use visualization
|
|
- Auto-scroll behavior
|
|
|
|
### Task 007: Prompt Input
|
|
- Text input with multi-line support
|
|
- Send button
|
|
- File attachment support
|
|
- Keyboard shortcuts (Enter for new line; Cmd+Enter/Ctrl+Enter to send)
|
|
|
|
### Task 008: Instance Tabs
|
|
- Tab bar for multiple instances
|
|
- Switch between instances
|
|
- Close instance tabs
|
|
- "+" button for new instance
|
|
|
|
## Build & Test
|
|
|
|
```bash
|
|
cd packages/opencode-client
|
|
bun run build
|
|
bunx electron .
|
|
```
|
|
|
|
**Known Issue:**
|
|
- Dev mode (`bun dev`) fails due to Bun workspace hoisting + electron-vite
|
|
- Workaround: Use production builds for testing
|
|
|
|
## Dependencies
|
|
|
|
- Electron 38
|
|
- SolidJS 1.8
|
|
- TailwindCSS 3.x
|
|
- @opencode-ai/sdk
|
|
- @kobalte/core (Dialog)
|
|
- Vite 5
|
|
- TypeScript 5
|
|
|
|
## Stats
|
|
|
|
- **Tasks completed:** 5/5 (Phase 1)
|
|
- **Files created:** 18+
|
|
- **Lines of code:** ~1500+
|
|
- **Build time:** ~7s
|
|
- **Bundle size:** 152KB (renderer)
|