341 lines
7.6 KiB
Markdown
341 lines
7.6 KiB
Markdown
# English Style Converter Implementation Plan
|
||
|
||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox () syntax for tracking.
|
||
|
||
**Goal:** Build a SvelteKit web app that converts English text into various styles/tones using an LLM, with an intensity slider, collapsible prompt display, and an animated loading modal.
|
||
|
||
**Architecture:** Single SvelteKit project. API route proxies LLM calls (OpenAI-compatible, Ollama default). Style definitions are pure data. LLM client is a thin fetch wrapper. Frontend uses Svelte 5 runes for reactivity.
|
||
|
||
**Tech Stack:** SvelteKit, Svelte 5 (runes), TypeScript, Vitest, OpenAI-compatible API (Ollama default), CSS (delegated to UI specialist)
|
||
|
||
---
|
||
|
||
## File Structure
|
||
|
||
| File | Responsibility |
|
||
|------|---------------|
|
||
| | Shared TypeScript interfaces (Style, StyleCategory, ConversionRequest, ConversionResponse, LLMConfig) |
|
||
| | All style/category data, intensity mapping, lookup helpers |
|
||
| | Server-only LLM client (fetch to /v1/chat/completions), prompt builder |
|
||
| | POST endpoint: validate input, call LLM, return result |
|
||
| | Main page: input, selectors, slider, output, prompt display, loading modal |
|
||
| | Animated loading modal component (per-letter animation, randomized color + animation style) |
|
||
| | Tests for style lookup, category filtering, prompt modifier validation |
|
||
| | Tests for prompt construction |
|
||
| | Tests for input validation and error responses |
|
||
| | LLM config (OPENAI_BASE_URL, OPENAI_API_KEY, OPENAI_MODEL) |
|
||
| | Template for .env with documented defaults |
|
||
|
||
---
|
||
|
||
### Task 1: Scaffold SvelteKit Project
|
||
|
||
**Files:**
|
||
- Create: project root (via
|
||
HINT: Run "sv --help" to get the full list of commands, add-ons, and examples to one-shot and skip interactive prompts.
|
||
[90m┌[39m Welcome to the Svelte CLI! (v0.15.1)
|
||
[?25l[90m│[39m
|
||
[36m◆[39m Where would you like your project to be created?
|
||
[36m│[39m [7m [27m[2m (hit Enter to use './')[22m
|
||
[36m└[39m)
|
||
|
||
- [ ] **Step 1: Create SvelteKit project**
|
||
|
||
|
||
HINT: Run "sv --help" to get the full list of commands, add-ons, and examples to one-shot and skip interactive prompts.
|
||
[90m┌[39m Welcome to the Svelte CLI! (v0.15.1)
|
||
[?25l[90m│[39m
|
||
[36m◆[39m Directory not empty. Continue?
|
||
[36m│[39m [2m○[22m [2mYes[22m [2m/[22m [32m●[39m No
|
||
[36m└[39m
|
||
|
||
Select defaults when prompted. If the directory is not empty, confirm overwrite.
|
||
|
||
- [ ] **Step 2: Install dependencies**
|
||
|
||
|
||
|
||
- [ ] **Step 3: Verify dev server starts**
|
||
|
||
|
||
|
||
Expected: SvelteKit dev server starts on , default "Welcome to SvelteKit" page loads.
|
||
|
||
- [ ] **Step 4: Commit**
|
||
|
||
[main 2eb8ad8] chore: scaffold SvelteKit project
|
||
2 files changed, 7 insertions(+)
|
||
create mode 100644 docs/superpowers/plans/2025-04-12-english-style-converter.md
|
||
create mode 100644 package-lock.json
|
||
|
||
---
|
||
|
||
### Task 2: Types
|
||
|
||
**Files:**
|
||
- Create:
|
||
|
||
- [ ] **Step 1: Create type definitions**
|
||
|
||
|
||
|
||
- [ ] **Step 2: Commit**
|
||
|
||
On branch main
|
||
nothing to commit, working tree clean
|
||
|
||
---
|
||
|
||
### Task 3: Style Definitions
|
||
|
||
**Files:**
|
||
- Create:
|
||
|
||
- [ ] **Step 1: Add style and intensity data**
|
||
|
||
|
||
|
||
- [ ] **Step 2: Commit**
|
||
|
||
On branch main
|
||
nothing to commit, working tree clean
|
||
|
||
---
|
||
|
||
### Task 4: Style Tests
|
||
|
||
**Files:**
|
||
- Create:
|
||
|
||
- [ ] **Step 1: Install Vitest**
|
||
|
||
|
||
[90m│[39m
|
||
[31m■[39m Invalid workspace: Please verify that you are inside of a Svelte project. You can also specify the working directory with `--cwd <path>`
|
||
[90m│[39m
|
||
[90m└[39m [31mOperation failed.[39m
|
||
|
||
Select defaults. This adds Vitest config and a test script.
|
||
|
||
- [ ] **Step 2: Write style tests**
|
||
|
||
|
||
|
||
- [ ] **Step 3: Run tests to verify they pass**
|
||
|
||
|
||
|
||
Expected: All tests PASS.
|
||
|
||
- [ ] **Step 4: Commit**
|
||
|
||
On branch main
|
||
nothing to commit, working tree clean
|
||
|
||
---
|
||
|
||
### Task 5: LLM Client
|
||
|
||
**Files:**
|
||
- Create:
|
||
|
||
- [ ] **Step 1: Create the LLM client**
|
||
|
||
|
||
|
||
- [ ] **Step 2: Commit**
|
||
|
||
On branch main
|
||
nothing to commit, working tree clean
|
||
|
||
---
|
||
|
||
### Task 6: LLM Client Tests
|
||
|
||
**Files:**
|
||
- Create:
|
||
|
||
- [ ] **Step 1: Write LLM prompt construction tests**
|
||
|
||
|
||
|
||
- [ ] **Step 2: Run tests**
|
||
|
||
|
||
|
||
Expected: All tests PASS.
|
||
|
||
- [ ] **Step 3: Commit**
|
||
|
||
On branch main
|
||
nothing to commit, working tree clean
|
||
|
||
---
|
||
|
||
### Task 7: API Endpoint
|
||
|
||
**Files:**
|
||
- Create:
|
||
|
||
- [ ] **Step 1: Create the API route**
|
||
|
||
|
||
|
||
- [ ] **Step 2: Commit**
|
||
|
||
On branch main
|
||
nothing to commit, working tree clean
|
||
|
||
---
|
||
|
||
### Task 8: API Endpoint Tests
|
||
|
||
**Files:**
|
||
- Create:
|
||
|
||
- [ ] **Step 1: Write API validation tests**
|
||
|
||
|
||
|
||
- [ ] **Step 2: Run all tests**
|
||
|
||
|
||
|
||
Expected: All tests PASS.
|
||
|
||
- [ ] **Step 3: Commit**
|
||
|
||
On branch main
|
||
nothing to commit, working tree clean
|
||
|
||
---
|
||
|
||
### Task 9: Environment Configuration
|
||
|
||
**Files:**
|
||
- Create:
|
||
- Modify: (ensure .env is ignored)
|
||
|
||
- [ ] **Step 1: Create .env.example**
|
||
|
||
Content for :
|
||
|
||
|
||
|
||
- [ ] **Step 2: Create .env (copy from example)**
|
||
|
||
|
||
|
||
- [ ] **Step 3: Ensure .env is in .gitignore**
|
||
|
||
|
||
|
||
If False, add to .
|
||
|
||
- [ ] **Step 4: Commit**
|
||
|
||
On branch main
|
||
nothing to commit, working tree clean
|
||
|
||
---
|
||
|
||
### Task 10: Loading Modal Component
|
||
|
||
**Files:**
|
||
- Create:
|
||
|
||
- [ ] **Step 1: Create the animated loading modal**
|
||
|
||
Full component code provided in the plan file with:
|
||
- Per-letter animation (each letter animates in with a stagger delay)
|
||
- 6 animation styles: slide-up, bounce-in, drop-in, scale-up, fade-rotate, spring-left
|
||
- 10 randomized colors: coral, teal, violet, amber, emerald, rose, sky blue, fuchsia, orange, indigo
|
||
- 15 loading words cycling every 2 seconds
|
||
- Light backdrop overlay with blur
|
||
- Responsive font sizing
|
||
|
||
- [ ] **Step 2: Commit**
|
||
|
||
On branch main
|
||
nothing to commit, working tree clean
|
||
|
||
---
|
||
|
||
### Task 11: Main Page UI
|
||
|
||
**Files:**
|
||
- Modify:
|
||
|
||
- [ ] **Step 1: Build the main converter page**
|
||
|
||
Full page code provided in the plan file with:
|
||
- Text input textarea
|
||
- Two-step style selector (category then sub-style)
|
||
- Intensity slider (1-5, default 3)
|
||
- Convert button (disabled when invalid)
|
||
- Output display with Copy button and clipboard integration
|
||
- Collapsible "Show prompt" section
|
||
- Loading modal integration
|
||
- Error display in output area
|
||
- Light palette CSS
|
||
- Responsive layout
|
||
|
||
- [ ] **Step 2: Commit**
|
||
|
||
On branch main
|
||
nothing to commit, working tree clean
|
||
|
||
---
|
||
|
||
### Task 12: Clean Up Scaffold and Verify
|
||
|
||
**Files:**
|
||
- Modify: (if needed)
|
||
- Delete: scaffold demo components
|
||
|
||
- [ ] **Step 1: Remove scaffold demo content**
|
||
|
||
Remove any demo files that
|
||
HINT: Run "sv --help" to get the full list of commands, add-ons, and examples to one-shot and skip interactive prompts.
|
||
[90m┌[39m Welcome to the Svelte CLI! (v0.15.1)
|
||
[?25l[90m│[39m
|
||
[36m◆[39m Where would you like your project to be created?
|
||
[36m│[39m [7m [27m[2m (hit Enter to use './')[22m
|
||
[36m└[39m generated.
|
||
|
||
- [ ] **Step 2: Ensure app.html is clean**
|
||
|
||
Verify has proper placeholders.
|
||
|
||
- [ ] **Step 3: Verify the full app runs**
|
||
|
||
|
||
|
||
- [ ] **Step 4: Run all tests**
|
||
|
||
|
||
|
||
- [ ] **Step 5: Commit**
|
||
|
||
On branch main
|
||
nothing to commit, working tree clean
|
||
|
||
---
|
||
|
||
### Task 13: Manual Integration Test
|
||
|
||
- [ ] **Step 1: Start the app and Ollama**
|
||
- [ ] **Step 2: Test the full flow** (input, select style, convert, verify output, copy, show prompt)
|
||
- [ ] **Step 3: Test error cases** (empty text disabled, Ollama stopped = 502)
|
||
- [ ] **Step 4: Test responsive layout** (mobile width)
|
||
|
||
---
|
||
|
||
## Plan Self-Review
|
||
|
||
**1. Spec coverage:** All spec requirements map to tasks. No gaps.
|
||
|
||
**2. Placeholder scan:** No TBDs, TODOs, or vague steps. All code provided inline.
|
||
|
||
**3. Type consistency:** ConversionResponse in types.ts matches API route output and page.svelte expectations. ConvertResult in llm.ts carries systemPrompt/userMessage which flow through to API response and UI. LLMConfig matches .env variable names.
|