# Task 001: Project Setup & Boilerplate

## Goal

Set up the basic Electron + SolidJS + Vite project structure with all necessary dependencies and configuration files.

## Prerequisites

- Node.js 18+ installed
- Bun package manager
- OpenCode CLI installed and accessible in PATH

## Acceptance Criteria

- [ ] Project structure matches documented layout
- [ ] All dependencies installed
- [ ] Dev server starts successfully
- [ ] Electron window launches
- [ ] Hot reload works for renderer
- [ ] TypeScript compilation works
- [ ] Basic "Hello World" renders

## Steps

### 1. Initialize Package

- Create `package.json` with project metadata
- Set `name`: `@opencode-ai/client`
- Set `version`: `0.1.0`
- Set `type`: `module`
- Set `main`: `dist/main/main.js`

### 2. Install Core Dependencies

**Production:**

- `electron` ^28.0.0
- `solid-js` ^1.8.0
- `@solidjs/router` ^0.13.0
- `@opencode-ai/sdk` (from workspace)

**Development:**

- `electron-vite` ^2.0.0
- `electron-builder` ^24.0.0
- `vite` ^5.0.0
- `vite-plugin-solid` ^2.10.0
- `typescript` ^5.3.0
- `tailwindcss` ^4.0.0
- `@tailwindcss/vite` ^4.0.0

**UI Libraries:**

- `@kobalte/core` ^0.13.0
- `shiki` ^1.0.0
- `marked` ^12.0.0
- `lucide-solid` ^0.300.0

### 3. Create Directory Structure

```
packages/opencode-client/
├── electron/
│   ├── main/
│   │   └── main.ts
│   ├── preload/
│   │   └── index.ts
│   └── resources/
│       └── icon.png
├── src/
│   ├── components/
│   ├── stores/
│   ├── lib/
│   ├── hooks/
│   ├── types/
│   ├── App.tsx
│   ├── main.tsx
│   └── index.css
├── docs/
├── tasks/
│   ├── todo/
│   └── done/
├── package.json
├── tsconfig.json
├── tsconfig.node.json
├── electron.vite.config.ts
├── tailwind.config.js
├── .gitignore
└── README.md
```

### 4. Configure TypeScript

**tsconfig.json** (for renderer):

- `target`: ES2020
- `module`: ESNext
- `jsx`: preserve
- `jsxImportSource`: solid-js
- `moduleResolution`: bundler
- `strict`: true
- Path alias: `@/*` → `./src/*`

**tsconfig.node.json** (for main & preload):

- `target`: ES2020
- `module`: ESNext
- `moduleResolution`: bundler
- Include: `electron/**/*.ts`

### 5. Configure Electron Vite

**electron.vite.config.ts:**

- Main process config: External electron
- Preload config: External electron
- Renderer config:
  - SolidJS plugin
  - TailwindCSS plugin
  - Path alias resolution
  - Dev server port: 3000

### 6. Configure TailwindCSS

**tailwind.config.js:**

- Content: `['./src/**/*.{ts,tsx}']`
- Theme: Default (will customize later)
- Plugins: None initially

**src/index.css:**

```css
@import "tailwindcss";
```

### 7. Create Main Process Entry

**electron/main/main.ts:**

- Import app, BrowserWindow from electron
- Set up window creation
- Window size: 1400x900
- Min size: 800x600
- Web preferences:
  - preload: path to preload script
  - contextIsolation: true
  - nodeIntegration: false
- Load URL based on environment:
  - Dev: http://localhost:3000
  - Prod: Load dist/index.html
- Handle app lifecycle:
  - ready event
  - window-all-closed (quit on non-macOS)
  - activate (recreate window on macOS)

### 8. Create Preload Script

**electron/preload/index.ts:**

- Import contextBridge, ipcRenderer
- Expose electronAPI object:
  - Placeholder methods for future IPC
- Type definitions for window.electronAPI

### 9. Create Renderer Entry

**src/main.tsx:**

- Import render from solid-js/web
- Import App component
- Render to #root element

**src/App.tsx:**

- Basic component with "Hello CodeNomad"
- Display environment info
- Basic styling with TailwindCSS

**index.html:**

- Root div with id="root"
- Link to src/main.tsx

### 10. Add Scripts to package.json

```json
{
  "scripts": {
    "dev": "electron-vite dev",
    "build": "electron-vite build",
    "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.node.json",
    "preview": "electron-vite preview",
    "package:mac": "electron-builder --mac",
    "package:win": "electron-builder --win",
    "package:linux": "electron-builder --linux"
  }
}
```

### 11. Configure Electron Builder

**electron-builder.yml** or in package.json:

- appId: ai.opencode.client
- Product name: CodeNomad
- Build resources: electron/resources
- Files to include: dist/, package.json
- Directories:
  - output: release
  - buildResources: electron/resources
- Platform-specific configs (basic)

### 12. Add .gitignore

```
node_modules/
dist/
release/
.DS_Store
*.log
.vite/
.electron-vite/
```

### 13. Create README

- Project description
- Prerequisites
- Installation instructions
- Development commands
- Build commands
- Architecture overview link

## Verification Steps

1. Run `bun install`
2. Run `bun run dev`
3. Verify Electron window opens
4. Verify "Hello CodeNomad" displays
5. Make a change to App.tsx
6. Verify hot reload updates UI
7. Run `bun run typecheck`
8. Verify no TypeScript errors
9. Run `bun run build`
10. Verify dist/ folder created

## Dependencies for Next Tasks

- Task 002 (Empty State) depends on this
- Task 003 (Process Manager) depends on this

## Estimated Time

2-3 hours

## Notes

- Keep this minimal - just the skeleton
- Don't add any business logic yet
- Focus on getting build pipeline working
- Use official Electron + Vite + Solid templates as reference
