Ignore and untrack BMad directories

This commit is contained in:
Max
2026-01-26 15:49:36 +07:00
parent 7b732372e3
commit 6b113e0392
525 changed files with 2 additions and 112645 deletions

View File

@@ -1,295 +0,0 @@
# Story 1.4: Fast Track Mode
Status: done
<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
## Story
As a Power User,
I want to bypass the interview questions,
So that I can generate a post immediately if I already have the insight.
## Acceptance Criteria
1. **Fast Track Toggle/Action**
- Given a user is in the chat
- When they toggle "Fast Track" or press a specific "Just Draft It" button
- Then the system enters "Fast Track" mode
- And the UI indicates that the next message will be used for drafting
2. **Skip Probing Phase**
- Given "Fast Track" is active
- When the user sends their input
- Then the Teacher Agent skips the probing questions
- And the input is treated as the final "Insight"
- And the system automatically transitions to the drafting phase (Epic 2)
3. **Immediate Drafting Trigger**
- Given the user sends a message in Fast Track mode
- When the message is received
- Then the system immediately triggers the Ghostwriter Agent (to be implemented in Epic 2)
- OR (for MVP if Ghostwriter isn't ready) shows a "Drafting..." placeholder state
- And provided feedback that drafting has started
4. **Exit Fast Track**
- Given the user is in Fast Track mode
- When they toggle it off
- Then normal Teacher Agent flow resumes (intent detection > probing)
## Tasks / Subtasks
- [x] Implement Fast Track State in ChatStore
- [x] Add `isFastTrackEnabled` boolean to store
- [x] Add action to toggle fast track mode
- [x] Add logic to `addMessage` to check for fast track
- [x] Update Chat Interface
- [x] Add "Fast Track" toggle or button to UI (e.g., in header or input area)
- [x] Add visual indicator when Fast Track is active (e.g., distinct input border or badge)
- [x] Implement Logic Bypass
- [x] Modify ChatStore `addMessage` to skip Teacher Agent if fast track is on
- [x] Trigger "Drafting" placeholder response (Ghostwriter to be implemented in Epic 2)
- [x] For now (pre-Epic 2): System responds with "Understood. I'll draft a post based on this insight immediately."
- [x] Test Fast Track Logic
- [x] Unit test: Fast track toggle in store
- [x] Integration test: Message flow skips Teacher Agent logic when fast track is on
- [x] Integration test: Normal flow resumes when toggled off
## Dev Notes
### Architecture Compliance (CRITICAL)
**Logic Sandwich Pattern - DO NOT VIOLATE:**
- **UI Components** MUST NOT import `src/lib/llm` or `src/services/llm-service.ts` directly
- All Fast Track logic MUST go through `ChatService` layer
- ChatService then calls `LLMService` as needed
- Components use Zustand store via atomic selectors only
- Services return plain objects, not Dexie observables
**State Management - Atomic Selectors Required:**
```typescript
// BAD - Causes unnecessary re-renders
const { isFastTrack, messages } = useChatStore();
// GOOD - Atomic selectors
const isFastTrack = useChatStore(s => s.isFastTrack);
const toggleFastTrack = useChatStore(s => s.toggleFastTrack);
```
**Local-First Data Boundary:**
- Fast Track mode state should be persisted in IndexedDB for session recovery
- If user is in Fast Track mode and closes/reopens app, mode should be restored
- All messages sent in Fast Track mode stored in `chatLogs` table with metadata
### Architecture Implementation Details
**State Management:**
- Add `isFastTrackEnabled` boolean to `ChatStore` (use consistent naming)
- Add `toggleFastTrack()` action to ChatStore
- Add logic to `sendMessage` to check for fast track state
- Store Fast Track preference in session state for persistence
**Logic Flow:**
- The `ChatService.sendMessage()` function is the gatekeeper
- IF `isFastTrack`: Skip `LLMService.getTeacherResponse()`, trigger drafting
- ELSE: Proceed as normal (intent detection -> Teacher response)
- Transition to Epic 2: Since Epic 2 (Ghostwriter) is not done, use placeholder response
**Files to Modify:**
- `src/lib/store/chat-store.ts` - Add isFastTrackEnabled, toggleFastTrack action
- `src/services/chat-service.ts` - Add Fast Track routing logic
- `src/services/llm-service.ts` - Add placeholder for Ghostwriter trigger
- `src/components/features/chat/ChatWindow.tsx` - Add Fast Track toggle UI
- `src/components/features/chat/TypingIndicator.tsx` - Update text for "Drafting..."
**New Files to Create:**
- `src/components/features/chat/FastTrackToggle.tsx` - Toggle UI component
### UX Design Specifications
**From UX Design Document:**
- **Toggle Placement:** Options include header area (less intrusive), above input field (more discoverable), or as special send button mode
- **Visual Indicators:** When active, show "Fast Track Active" badge; change send button icon (e.g., lightning bolt); show different loading state ("Drafting..." vs "Teacher is typing...")
- **User Education:** First-time use: show tooltip or modal explaining Fast Track; help text: "Skip straight to draft generation when you already know what you want to say"
**Button Hierarchy:**
- Fast Track toggle should be **Secondary** (Outline/Ghost) style to not compete with primary Send button
- Or use an icon-only button with clear tooltip (lightning bolt icon suggested)
**Visual Feedback:**
- Keep it subtle but accessible
- Distinct input border or badge when Fast Track is active
- For MVP, a header toggle is easiest to implement and test
### Testing Requirements
**Unit Tests:**
- ChatStore: `toggleFastTrack()` toggles state correctly
- ChatStore: `isFastTrackEnabled` defaults to false
- ChatService: Routes to Fast Track path when `isFastTrackEnabled` is true
- ChatService: Routes to normal path when `isFastTrackEnabled` is false
- FastTrackToggle: Component renders and responds to clicks
**Integration Tests:**
- Full flow: User toggles Fast Track -> sends message -> skips Teacher -> shows drafting state
- Mode switch: User toggles Fast Track during active chat -> context preserved
- Normal flow resumes when toggled off
**Edge Cases:**
- User toggles Fast Track mid-conversation: Preserve existing chat history
- User sends message, then toggles Fast Track: No effect on sent messages
- Fast Track active, but Ghostwriter (Epic 2) not implemented: Show helpful message
- Offline mode in Fast Track: Queue for Ghostwriter when connection restored (Epic 3)
### Previous Story Intelligence (from Story 1.3)
**Patterns Established:**
- **Logic Sandwich Pattern:** UI -> Zustand -> Service -> LLM (strictly enforced)
- **Atomic Selectors:** All state access uses `useChatStore(s => s.field)`
- **Typing Indicator Pattern:** `isTyping` state shows "Teacher is typing..."
- **LLM Service Pattern:** `LLMService` handles all LLM API calls with retry logic
- **Intent Detection:** Teacher agent uses `IntentDetector` for classifying user input
**Files from 1.3 (Reference):**
- `src/lib/llm/intent-detector.ts` - Intent classification (can be skipped in Fast Track)
- `src/lib/llm/prompt-engine.ts` - Prompt generation (can be skipped in Fast Track)
- `src/app/api/llm/route.ts` - Edge Function proxy (will be used by Ghostwriter in Epic 2)
- `src/services/llm-service.ts` - LLM integration with retry/error handling
- `src/lib/store/chat-store.ts` - Zustand store with currentIntent, isProcessing state
**Learnings to Apply:**
- Fast Track mode state should follow the same pattern as `currentIntent` in ChatStore
- Use `isProcessing` state for "Drafting..." indicator (reuse existing pattern)
- Fast Track toggle should use Edge-safe state management (no server-side rendering issues)
**Testing Patterns:**
- Story 1.3 established 98 passing tests
- Follow same test structure: unit tests for each service, integration tests for full flow
- Use mocked LLM responses for Fast Track tests (Ghostwriter not yet implemented)
### Data Schema Considerations
**Dexie schema - chatLogs table may need new field:**
```typescript
interface ChatLog {
id: string;
role: 'user' | 'assistant' | 'system';
content: string;
timestamp: number;
intent?: 'venting' | 'insight'; // From Story 1.3
isFastTrackInput?: boolean; // NEW: Mark Fast Track inputs
sessionId: string;
}
```
**Session state should include Fast Track preference:**
```typescript
interface SessionState {
id: string;
createdAt: number;
updatedAt: number;
isFastTrackMode: boolean; // NEW: Persist Fast Track preference
currentIntent?: 'venting' | 'insight';
}
```
### Performance Requirements
**NFR-01 Compliance (Chat Latency):**
- Fast Track mode should be FASTER than normal mode (skips Teacher call)
- "Drafting..." indicator should appear within 1 second of message send
- Mode toggle should be instant (no network calls required)
**State Persistence:**
- Fast Track mode preference saved to IndexedDB immediately on toggle
- Mode restoration on app load should be <500ms
### References
**Architecture Documents:**
- [Project Context: Logic Sandwich](file:///home/maximilienmao/Projects/Test01/_bmad-output/project-context.md#1-the-logic-sandwich-pattern-service-layer)
- [Project Context: State Management](file:///home/maximilienmao/Projects/Test01/_bmad-output/project-context.md#2-state-management-zustand)
- [Project Context: Local-First Boundary](file:///home/maximilienmao/Projects/Test01/_bmad-output/project-context.md#3-local-first-data-boundary)
- [Architecture: Service Boundaries](file:///home/maximilienmao/Projects/Test01/_bmad-output/planning-artifacts/architecture.md#architectural-boundaries)
**UX Design Specifications:**
- [UX: Experience Mechanics - The Daily Vent](file:///home/maximilienmao/Projects/Test01/_bmad-output/planning-artifacts/ux-design-specification.md#2-experience-mechanics)
- [UX: Button Hierarchy](file:///home/maximilienmao/Projects/Test01/_bmad-output/planning-artifacts/ux-design-specification.md#ux-consistency-patterns)
- [UX: Journey Patterns](file:///home/maximilienmao/Projects/Test01/_bmad-output/planning-artifacts/ux-design-specification.md#journey-patterns)
**Epic Reference:**
- [Epic 1 Story 1.4: Fast Track Mode](file:///home/maximilienmao/Projects/Test01/_bmad-output/planning-artifacts/epics.md#story-14-fast-track-mode)
- FR-05: "System provides a 'Fast Track' option to bypass the interview and go straight to generation"
**Previous Story:**
- [Story 1.3: Teacher Agent Logic & Intent Detection](file:///home/maximilienmao/Projects/Test01/_bmad-output/implementation-artifacts/1-3-teacher-agent-logic-intent-detection.md)
## Dev Agent Record
### Agent Model Used
Claude Opus 4.5 (model ID: 'claude-opus-4-5-20251101')
### Debug Log References
Session file: `/tmp/claude/-home-maximilienmao-Projects-Test01/e9769bf5-0607-4356-a7cc-0b046e1f56f4/scratchpad`
### Completion Notes List
**Implementation Summary:**
Story 1.4 (Fast Track Mode) was already implemented. Fixed test compatibility issue between streaming implementation and test mocks.
**Test Fix Applied (2026-01-22):**
- Fixed `src/lib/store/chat-store.test.ts` to properly mock `getTeacherResponseStream` instead of deprecated `getTeacherResponse`
- All 101 tests now passing (was 1 failure before fix)
- Test now properly simulates streaming callbacks: onIntent, onToken, onComplete
**Story Analysis Completed:**
- Extracted story requirements from Epic 1, Story 1.4
- Analyzed previous story (1.3) for established patterns and learnings
- Reviewed architecture for compliance requirements (Logic Sandwich, State Management, Local-First)
- Reviewed UX specification for visual design and interaction patterns
- Identified all files to create and modify
**Key Technical Decisions:**
1. Fast Track mode state: Added `isFastTrack` to ChatStore with atomic selector pattern
2. UI toggle: Integrated into ChatInput component with lightning bolt icon
3. Service routing: Fast Track logic in ChatStore `addMessage` bypasses LLM streaming
4. Ghostwriter trigger: Placeholder implementation for Epic 2 integration
5. Visual indicators: Amber/gold theme when Fast Track is active
**Dependencies:**
- No new dependencies required
- Reuses existing Zustand, Dexie, LLM service infrastructure
**Integration Points:**
- Connected to existing ChatStore state management
- Fast Track bypass in ChatStore `addMessage` before LLM streaming call
- Reuses `isProcessing` state for "Drafting..." indicator
- Prepares for Epic 2 Ghostwriter integration
**Implementation Notes:**
- Fast Track toggle integrated into ChatInput component (not separate FastTrackToggle as planned)
- Visual feedback: amber/gold accent when active, lightning bolt icon
- Placeholder response: "Understood. I'll draft a post based on this insight immediately."
- All 101 tests passing including 3 new Fast Track integration tests
### File List
**Modified (implementation):**
- `src/lib/store/chat-store.ts` - Added `isFastTrack`, `toggleFastTrack`, Fast Track bypass logic
- `src/components/features/chat/ChatInput.tsx` - Integrated Fast Track toggle button with visual indicators
- `src/components/features/chat/ChatWindow.tsx` - Passes Fast Track state to ChatInput
**Modified (tests):**
- `src/lib/store/chat-store.test.ts` - Fixed streaming mock compatibility
**Created (tests):**
- `src/integration/fast-track.test.ts` - 3 integration tests for Fast Track mode
**Implementation Variations from Plan:**
- Fast Track toggle integrated into ChatInput component (not separate FastTrackToggle.tsx as originally planned)
- This simplification reduces component count while maintaining all functionality