Files
2025-11-30 08:25:20 +08:00

335 lines
8.9 KiB
Markdown

# Example: Simple Task Manager (No Auth)
This is an example of planning docs generated for a simple public task manager web app (no user accounts).
**User Request**: "I want to build a simple task manager where anyone can create, edit, and complete tasks. Just a public tool, no user accounts needed."
---
## IMPLEMENTATION_PHASES.md
# Implementation Phases: Simple Task Manager
**Project Type**: Public Web App (CRUD)
**Stack**: Cloudflare Workers + Vite + React + Tailwind v4 + shadcn/ui + D1
**Estimated Total**: 12 hours (~12 minutes human time with AI assistance)
**Created**: 2025-10-25
---
## Phase 1: Project Setup
**Type**: Infrastructure
**Estimated**: 2-3 hours
**Files**: `package.json`, `wrangler.jsonc`, `vite.config.ts`, `src/index.ts`, `src/index.css`
### Tasks
- [ ] Scaffold Cloudflare Worker with Vite using `npm create cloudflare@latest`
- [ ] Install dependencies: React, Tailwind v4, shadcn/ui, Hono
- [ ] Configure `wrangler.jsonc` with D1 database binding
- [ ] Setup Tailwind v4 with `@tailwindcss/vite` plugin
- [ ] Initialize shadcn/ui with dark mode support
- [ ] Create basic "Hello World" component
- [ ] Test local dev server
- [ ] Test deployment to Cloudflare
### Verification Criteria
- [ ] `npm run dev` starts without errors
- [ ] `localhost:5173` shows React app with Tailwind styling
- [ ] Dark/light mode toggle works
- [ ] `npm run build` succeeds
- [ ] `npx wrangler deploy` deploys successfully
- [ ] Deployed URL shows working app
### Exit Criteria
Working development environment with successful test deployment. Can iterate on code locally and deploy to Cloudflare.
---
## Phase 2: Database Schema
**Type**: Database
**Estimated**: 2 hours
**Files**: `migrations/0001_initial.sql`, `src/lib/db-types.ts`
### Tasks
- [ ] Create D1 database using `npx wrangler d1 create task-manager-db`
- [ ] Design `tasks` table schema
- [ ] Write migration SQL file
- [ ] Apply migration to local database
- [ ] Create TypeScript types for database schema
- [ ] Write test query in Worker to verify database connection
### Verification Criteria
- [ ] Migration runs without errors
- [ ] Can insert test task
- [ ] Can query tasks from Worker
- [ ] TypeScript types match database schema
### Exit Criteria
Database schema deployed locally, can perform CRUD operations from Worker.
---
## Phase 3: Tasks API
**Type**: API
**Estimated**: 4 hours
**Files**: `src/routes/tasks.ts`, `src/lib/schemas.ts`, `src/middleware/cors.ts`
### Tasks
- [ ] Define Zod schema for task validation
- [ ] Create CORS middleware
- [ ] Implement GET /api/tasks (list all tasks)
- [ ] Implement POST /api/tasks (create task)
- [ ] Implement PATCH /api/tasks/:id (update task)
- [ ] Implement DELETE /api/tasks/:id (delete task)
- [ ] Add error handling middleware
- [ ] Test all endpoints manually with curl
### Verification Criteria
- [ ] GET /api/tasks returns empty array initially
- [ ] POST /api/tasks with valid data returns 201
- [ ] POST /api/tasks with invalid data returns 400
- [ ] PATCH /api/tasks/:id updates task and returns 200
- [ ] DELETE /api/tasks/:id removes task and returns 204
- [ ] Invalid task ID returns 404
- [ ] CORS headers present in responses
### Exit Criteria
All CRUD endpoints working, tested with curl, proper error handling.
---
## Phase 4: Task List UI
**Type**: UI
**Estimated**: 3-4 hours
**Files**: `src/components/TaskList.tsx`, `src/components/TaskCard.tsx`, `src/lib/api.ts`
### Tasks
- [ ] Setup TanStack Query for data fetching
- [ ] Create API client functions (fetch tasks, create, update, delete)
- [ ] Build `TaskList` component with loading/error states
- [ ] Build `TaskCard` component to display individual tasks
- [ ] Add "Mark complete" toggle functionality
- [ ] Add delete button with confirmation
- [ ] Style with Tailwind and shadcn/ui components
### Verification Criteria
- [ ] Task list displays fetched tasks
- [ ] Loading skeleton shows while fetching
- [ ] Error message shows if API fails
- [ ] Can toggle task completion (optimistic update)
- [ ] Can delete task (shows confirmation dialog)
- [ ] UI updates immediately after mutations
### Exit Criteria
Task list displays correctly with all CRUD operations working from UI.
---
## Phase 5: Task Creation Form
**Type**: UI
**Estimated**: 2-3 hours
**Files**: `src/components/TaskForm.tsx`, `src/components/CreateTaskDialog.tsx`
### Tasks
- [ ] Install React Hook Form and Zod resolver
- [ ] Create `TaskForm` component with title and description fields
- [ ] Add client-side validation (Zod schema)
- [ ] Build `CreateTaskDialog` modal wrapper
- [ ] Implement form submission with TanStack Query mutation
- [ ] Add loading state during submission
- [ ] Show success/error feedback
- [ ] Clear form and close dialog on success
### Verification Criteria
- [ ] Form validates empty title (shows error)
- [ ] Form validates title length (max 100 chars)
- [ ] Successful submission creates task in database
- [ ] Task appears in list immediately (optimistic update)
- [ ] Form resets after successful submission
- [ ] Dialog closes after successful submission
- [ ] Error message shows if submission fails
### Exit Criteria
Can create tasks via form, validation works, UX is smooth.
---
## Notes
### Testing Strategy
Testing built into each phase via verification criteria. No separate testing phase needed for this simple project.
### Deployment Strategy
Deploy after each phase to test in production environment:
```bash
npm run build && npx wrangler deploy
```
### Context Management
Phases sized to complete in single session including implementation, verification, and expected debugging.
---
## DATABASE_SCHEMA.md
# Database Schema: Simple Task Manager
**Database**: Cloudflare D1 (SQLite)
**Migrations**: `migrations/` directory
**ORM**: None (raw SQL)
---
## Tables
### `tasks`
**Purpose**: Store tasks (public, no user association)
| Column | Type | Constraints | Default | Notes |
|--------|------|-------------|---------|-------|
| `id` | INTEGER | PRIMARY KEY | AUTO | Auto-increment |
| `title` | TEXT | NOT NULL | - | Task title (max 100 chars) |
| `description` | TEXT | NULL | - | Task description (optional) |
| `completed` | INTEGER | NOT NULL | 0 | 0 = incomplete, 1 = complete |
| `created_at` | INTEGER | NOT NULL | - | Unix timestamp |
| `updated_at` | INTEGER | NOT NULL | - | Unix timestamp |
**Indexes**:
- `idx_tasks_created_at` on `created_at` (for sorting by date)
- `idx_tasks_completed` on `completed` (for filtering complete/incomplete)
---
## Migrations
### Migration 0001: Initial Schema
**File**: `migrations/0001_initial_schema.sql`
**Purpose**: Create tasks table
```sql
CREATE TABLE tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT,
completed INTEGER NOT NULL DEFAULT 0,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE INDEX idx_tasks_created_at ON tasks(created_at);
CREATE INDEX idx_tasks_completed ON tasks(completed);
```
**Run**:
```bash
npx wrangler d1 execute task-manager-db --local --file=migrations/0001_initial_schema.sql
npx wrangler d1 execute task-manager-db --remote --file=migrations/0001_initial_schema.sql
```
---
## Seed Data
**File**: `migrations/seed.sql`
```sql
INSERT INTO tasks (title, description, completed, created_at, updated_at)
VALUES
('Build database schema', 'Create tasks table with migrations', 1, strftime('%s', 'now'), strftime('%s', 'now')),
('Create API endpoints', 'Implement CRUD operations for tasks', 1, strftime('%s', 'now'), strftime('%s', 'now')),
('Build UI components', 'Task list and creation form', 0, strftime('%s', 'now'), strftime('%s', 'now'));
```
---
## API_ENDPOINTS.md
# API Endpoints: Simple Task Manager
**Base URL**: `/api`
**Framework**: Hono
**Auth**: None (public API)
**Validation**: Zod schemas
---
## Tasks
### GET `/api/tasks`
**Purpose**: List all tasks
**Query Parameters**:
- `completed` (optional): Filter by completion status (`true` or `false`)
**Response 200**:
```json
{
"data": [
{
"id": 1,
"title": "Sample Task",
"description": "Task description",
"completed": false,
"createdAt": 1234567890,
"updatedAt": 1234567890
}
]
}
```
---
### POST `/api/tasks`
**Purpose**: Create a new task
**Request Body**:
```json
{
"title": "New Task",
"description": "Optional description"
}
```
**Validation**:
```typescript
z.object({
title: z.string().min(1).max(100),
description: z.string().optional()
})
```
**Response 201**: Created task object
**Response 400**: Validation error
---
### PATCH `/api/tasks/:id`
**Purpose**: Update a task
**Request Body**:
```json
{
"title": "Updated title",
"description": "Updated description",
"completed": true
}
```
**Response 200**: Updated task object
**Response 404**: Task not found
---
### DELETE `/api/tasks/:id`
**Purpose**: Delete a task
**Response 204**: No content (success)
**Response 404**: Task not found
---
**Note**: This is a simplified example for a public task manager. For a production app with user accounts, see the `auth-web-app.md` example.