brainrot-cli 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/dist/AchievementNotification.d.ts.map +1 -1
  2. package/dist/AchievementNotification.js.map +1 -1
  3. package/dist/AppNew.d.ts +11 -0
  4. package/dist/AppNew.d.ts.map +1 -0
  5. package/dist/AppNew.js +437 -0
  6. package/dist/AppNew.js.map +1 -0
  7. package/dist/AttentionOverlay.d.ts +28 -0
  8. package/dist/AttentionOverlay.d.ts.map +1 -0
  9. package/dist/AttentionOverlay.js +92 -0
  10. package/dist/AttentionOverlay.js.map +1 -0
  11. package/dist/ClaudeChat.d.ts +38 -0
  12. package/dist/ClaudeChat.d.ts.map +1 -0
  13. package/dist/ClaudeChat.js +81 -0
  14. package/dist/ClaudeChat.js.map +1 -0
  15. package/dist/DynamicInterviewFlow.d.ts +66 -0
  16. package/dist/DynamicInterviewFlow.d.ts.map +1 -0
  17. package/dist/DynamicInterviewFlow.js +352 -0
  18. package/dist/DynamicInterviewFlow.js.map +1 -0
  19. package/dist/FeatureInput.d.ts +20 -0
  20. package/dist/FeatureInput.d.ts.map +1 -0
  21. package/dist/FeatureInput.js +66 -0
  22. package/dist/FeatureInput.js.map +1 -0
  23. package/dist/FeaturePromptScreen.d.ts +24 -0
  24. package/dist/FeaturePromptScreen.d.ts.map +1 -0
  25. package/dist/FeaturePromptScreen.js +117 -0
  26. package/dist/FeaturePromptScreen.js.map +1 -0
  27. package/dist/GameSelectScreen.d.ts +24 -0
  28. package/dist/GameSelectScreen.d.ts.map +1 -0
  29. package/dist/GameSelectScreen.js +78 -0
  30. package/dist/GameSelectScreen.js.map +1 -0
  31. package/dist/GameSelector.d.ts +9 -1
  32. package/dist/GameSelector.d.ts.map +1 -1
  33. package/dist/GameSelector.js +116 -19
  34. package/dist/GameSelector.js.map +1 -1
  35. package/dist/GameSelectorOverlay.d.ts +21 -0
  36. package/dist/GameSelectorOverlay.d.ts.map +1 -0
  37. package/dist/GameSelectorOverlay.js +98 -0
  38. package/dist/GameSelectorOverlay.js.map +1 -0
  39. package/dist/HelpOverlay.d.ts.map +1 -1
  40. package/dist/HelpOverlay.js +5 -2
  41. package/dist/HelpOverlay.js.map +1 -1
  42. package/dist/InterviewQuestion.d.ts +36 -0
  43. package/dist/InterviewQuestion.d.ts.map +1 -0
  44. package/dist/InterviewQuestion.js +148 -0
  45. package/dist/InterviewQuestion.js.map +1 -0
  46. package/dist/Layout.d.ts +1 -1
  47. package/dist/Layout.d.ts.map +1 -1
  48. package/dist/Layout.js +4 -4
  49. package/dist/Layout.js.map +1 -1
  50. package/dist/LogViewer.d.ts.map +1 -1
  51. package/dist/LogViewer.js +2 -2
  52. package/dist/LogViewer.js.map +1 -1
  53. package/dist/LoopAlertOverlay.d.ts +1 -1
  54. package/dist/LoopAlertOverlay.d.ts.map +1 -1
  55. package/dist/LoopAlertOverlay.js +1 -1
  56. package/dist/LoopAlertOverlay.js.map +1 -1
  57. package/dist/LoopComplete.d.ts +42 -0
  58. package/dist/LoopComplete.d.ts.map +1 -0
  59. package/dist/LoopComplete.js +69 -0
  60. package/dist/LoopComplete.js.map +1 -0
  61. package/dist/LoopManagementPanel.d.ts.map +1 -1
  62. package/dist/LoopManagementPanel.js.map +1 -1
  63. package/dist/OnboardingTutorial.d.ts +23 -0
  64. package/dist/OnboardingTutorial.d.ts.map +1 -0
  65. package/dist/OnboardingTutorial.js +165 -0
  66. package/dist/OnboardingTutorial.js.map +1 -0
  67. package/dist/PrdGenerationScreen.d.ts +43 -0
  68. package/dist/PrdGenerationScreen.d.ts.map +1 -0
  69. package/dist/PrdGenerationScreen.js +411 -0
  70. package/dist/PrdGenerationScreen.js.map +1 -0
  71. package/dist/PrdOverlay.d.ts +29 -0
  72. package/dist/PrdOverlay.d.ts.map +1 -0
  73. package/dist/PrdOverlay.js +174 -0
  74. package/dist/PrdOverlay.js.map +1 -0
  75. package/dist/PreStartReviewScreen.d.ts +29 -0
  76. package/dist/PreStartReviewScreen.d.ts.map +1 -0
  77. package/dist/PreStartReviewScreen.js +161 -0
  78. package/dist/PreStartReviewScreen.js.map +1 -0
  79. package/dist/ResumeOverlay.d.ts +26 -0
  80. package/dist/ResumeOverlay.d.ts.map +1 -0
  81. package/dist/ResumeOverlay.js +163 -0
  82. package/dist/ResumeOverlay.js.map +1 -0
  83. package/dist/ResumePrompt.d.ts +32 -0
  84. package/dist/ResumePrompt.d.ts.map +1 -0
  85. package/dist/ResumePrompt.js +65 -0
  86. package/dist/ResumePrompt.js.map +1 -0
  87. package/dist/SettingsMenu.d.ts.map +1 -1
  88. package/dist/SettingsMenu.js +14 -7
  89. package/dist/SettingsMenu.js.map +1 -1
  90. package/dist/SetupWizard.d.ts +41 -0
  91. package/dist/SetupWizard.d.ts.map +1 -0
  92. package/dist/SetupWizard.js +167 -0
  93. package/dist/SetupWizard.js.map +1 -0
  94. package/dist/SidePanel.d.ts +26 -0
  95. package/dist/SidePanel.d.ts.map +1 -0
  96. package/dist/SidePanel.js +90 -0
  97. package/dist/SidePanel.js.map +1 -0
  98. package/dist/SplitPane.d.ts.map +1 -1
  99. package/dist/SplitPane.js +6 -2
  100. package/dist/SplitPane.js.map +1 -1
  101. package/dist/StatsMenu.d.ts.map +1 -1
  102. package/dist/StatsMenu.js +24 -6
  103. package/dist/StatsMenu.js.map +1 -1
  104. package/dist/StatusBar.d.ts +45 -2
  105. package/dist/StatusBar.d.ts.map +1 -1
  106. package/dist/StatusBar.js +193 -23
  107. package/dist/StatusBar.js.map +1 -1
  108. package/dist/StatusBarMinimal.d.ts +26 -0
  109. package/dist/StatusBarMinimal.d.ts.map +1 -0
  110. package/dist/StatusBarMinimal.js +111 -0
  111. package/dist/StatusBarMinimal.js.map +1 -0
  112. package/dist/TaskBreakdownScreen.d.ts +27 -0
  113. package/dist/TaskBreakdownScreen.d.ts.map +1 -0
  114. package/dist/TaskBreakdownScreen.js +96 -0
  115. package/dist/TaskBreakdownScreen.js.map +1 -0
  116. package/dist/cli.d.ts.map +1 -1
  117. package/dist/cli.js +3 -1
  118. package/dist/cli.js.map +1 -1
  119. package/dist/config.d.ts +11 -0
  120. package/dist/config.d.ts.map +1 -1
  121. package/dist/config.js +12 -0
  122. package/dist/config.js.map +1 -1
  123. package/dist/games/MinesweeperGame.d.ts +1 -1
  124. package/dist/games/MinesweeperGame.d.ts.map +1 -1
  125. package/dist/games/MinesweeperGame.js +30 -10
  126. package/dist/games/MinesweeperGame.js.map +1 -1
  127. package/dist/games/PongGame.d.ts +1 -1
  128. package/dist/games/PongGame.d.ts.map +1 -1
  129. package/dist/games/PongGame.js +7 -2
  130. package/dist/games/PongGame.js.map +1 -1
  131. package/dist/games/SnakeGame.d.ts +1 -1
  132. package/dist/games/SnakeGame.d.ts.map +1 -1
  133. package/dist/games/SnakeGame.js +12 -4
  134. package/dist/games/SnakeGame.js.map +1 -1
  135. package/dist/games/TetrisGame.d.ts +1 -1
  136. package/dist/games/TetrisGame.d.ts.map +1 -1
  137. package/dist/games/TetrisGame.js +22 -5
  138. package/dist/games/TetrisGame.js.map +1 -1
  139. package/dist/high-scores.d.ts.map +1 -1
  140. package/dist/high-scores.js.map +1 -1
  141. package/dist/index.d.ts +6 -0
  142. package/dist/index.d.ts.map +1 -1
  143. package/dist/index.js +10 -236
  144. package/dist/index.js.map +1 -1
  145. package/dist/loop-state.d.ts +137 -0
  146. package/dist/loop-state.d.ts.map +1 -0
  147. package/dist/loop-state.js +228 -0
  148. package/dist/loop-state.js.map +1 -0
  149. package/dist/ralph-loop-parser.d.ts.map +1 -1
  150. package/dist/ralph-loop-parser.js +4 -2
  151. package/dist/ralph-loop-parser.js.map +1 -1
  152. package/dist/stats.d.ts.map +1 -1
  153. package/dist/stats.js.map +1 -1
  154. package/dist/styled-components.d.ts +1 -1
  155. package/dist/styled-components.d.ts.map +1 -1
  156. package/dist/styled-components.js +5 -3
  157. package/dist/styled-components.js.map +1 -1
  158. package/dist/theme.d.ts.map +1 -1
  159. package/dist/theme.js +15 -2
  160. package/dist/theme.js.map +1 -1
  161. package/dist/themes.d.ts.map +1 -1
  162. package/dist/themes.js.map +1 -1
  163. package/dist/use-claude-code.d.ts.map +1 -1
  164. package/dist/use-claude-code.js +7 -1
  165. package/dist/use-claude-code.js.map +1 -1
  166. package/dist/use-config.d.ts.map +1 -1
  167. package/dist/use-config.js.map +1 -1
  168. package/dist/use-loop-state.d.ts +55 -0
  169. package/dist/use-loop-state.d.ts.map +1 -0
  170. package/dist/use-loop-state.js +208 -0
  171. package/dist/use-loop-state.js.map +1 -0
  172. package/dist/use-stats.d.ts.map +1 -1
  173. package/dist/use-stats.js.map +1 -1
  174. package/dist/useTheme.d.ts.map +1 -1
  175. package/dist/useTheme.js.map +1 -1
  176. package/package.json +3 -2
  177. package/dist/__tests__/ralph-loop-parser.test.d.ts +0 -2
  178. package/dist/__tests__/ralph-loop-parser.test.d.ts.map +0 -1
  179. package/dist/__tests__/ralph-loop-parser.test.js +0 -143
  180. package/dist/__tests__/ralph-loop-parser.test.js.map +0 -1
@@ -0,0 +1,411 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * PRD Generation Screen
4
+ *
5
+ * Displays a loading state while generating a PRD from interview responses.
6
+ * Shows spinner animation, progress messages, and elapsed time.
7
+ * Games are disabled during this phase.
8
+ */
9
+ import { Box, Text, useInput } from "ink";
10
+ import { useState, useEffect } from "react";
11
+ import { useThemeColors } from "./useTheme.js";
12
+ import { useSpinner } from "./use-spinner.js";
13
+ import { progressChars, alertIcons } from "./theme.js";
14
+ // ============================================================================
15
+ // PRD GENERATION LOGIC
16
+ // ============================================================================
17
+ /**
18
+ * Generate PRD content from interview results using Claude-like analysis
19
+ * This simulates intelligent PRD generation based on interview context
20
+ */
21
+ async function generatePrdFromInterview(interviewResult, onProgress) {
22
+ const { answers, featureDescription, complexity } = interviewResult;
23
+ // Phase 1: Analyzing responses
24
+ onProgress("Analyzing interview responses...");
25
+ await delay(800);
26
+ // Phase 2: Generating overview
27
+ onProgress("Generating feature overview...");
28
+ await delay(600);
29
+ const overview = generateOverview(featureDescription, answers);
30
+ // Phase 3: Extracting requirements
31
+ onProgress("Extracting requirements...");
32
+ await delay(700);
33
+ const requirements = generateRequirements(answers, complexity);
34
+ // Phase 4: Planning technical approach
35
+ onProgress("Planning technical approach...");
36
+ await delay(800);
37
+ const technicalApproach = generateTechnicalApproach(answers);
38
+ // Phase 5: Breaking down tasks
39
+ onProgress("Breaking down tasks...");
40
+ await delay(900);
41
+ const taskBreakdown = generateTaskBreakdown(featureDescription, answers, complexity);
42
+ // Phase 6: Defining success criteria
43
+ onProgress("Defining success criteria...");
44
+ await delay(500);
45
+ const successCriteria = generateSuccessCriteria(answers);
46
+ // Phase 7: Compiling final PRD
47
+ onProgress("Compiling PRD document...");
48
+ await delay(400);
49
+ const fullContent = compilePrdContent(featureDescription, overview, requirements, technicalApproach, taskBreakdown, successCriteria);
50
+ return {
51
+ overview,
52
+ requirements,
53
+ technicalApproach,
54
+ taskBreakdown,
55
+ successCriteria,
56
+ fullContent,
57
+ };
58
+ }
59
+ function delay(ms) {
60
+ return new Promise((resolve) => setTimeout(resolve, ms));
61
+ }
62
+ function generateOverview(featureDescription, answers) {
63
+ const projectType = answers.scope_type || "project";
64
+ const targetUsers = answers.users_primary || "users";
65
+ const priority = answers.priority_focus || "balanced";
66
+ return (`This ${projectType} feature will ${featureDescription.toLowerCase()}. ` +
67
+ `The primary audience is ${targetUsers.replace("_", " ")}, ` +
68
+ `with a focus on ${priority.replace("_", " ")} implementation.`);
69
+ }
70
+ function generateRequirements(answers, complexity) {
71
+ const requirements = [];
72
+ // Core functionality requirement
73
+ requirements.push("Implement core feature functionality as specified");
74
+ // User-based requirements
75
+ if (answers.users_primary === "end_users") {
76
+ requirements.push("Ensure intuitive user interface and experience");
77
+ }
78
+ else if (answers.users_primary === "developers") {
79
+ requirements.push("Provide clear API documentation and examples");
80
+ }
81
+ else if (answers.users_primary === "admins") {
82
+ requirements.push("Include administrative controls and monitoring");
83
+ }
84
+ // Technical constraint requirements
85
+ if (answers.tech_constraints === "performance") {
86
+ requirements.push("Optimize for performance and response time");
87
+ }
88
+ else if (answers.tech_constraints === "security") {
89
+ requirements.push("Implement security best practices and authentication");
90
+ }
91
+ else if (answers.tech_constraints === "existing_patterns") {
92
+ requirements.push("Follow existing codebase patterns and conventions");
93
+ }
94
+ // Testing requirements
95
+ if (answers.tech_testing === "unit") {
96
+ requirements.push("Write unit tests for core logic");
97
+ }
98
+ else if (answers.tech_testing === "integration") {
99
+ requirements.push("Create integration/E2E tests");
100
+ }
101
+ else if (answers.tech_testing === "both") {
102
+ requirements.push("Write comprehensive unit and integration tests");
103
+ }
104
+ // Integration requirements
105
+ if (answers.integration_external === "external_api") {
106
+ requirements.push("Integrate with external APIs/third-party services");
107
+ }
108
+ else if (answers.integration_external === "database") {
109
+ requirements.push("Set up database/storage integration");
110
+ }
111
+ else if (answers.integration_external === "auth") {
112
+ requirements.push("Integrate authentication provider");
113
+ }
114
+ // Edge case requirements for larger features
115
+ if (complexity !== "small" && answers.edge_cases) {
116
+ if (answers.edge_cases === "all" || answers.edge_cases === "errors") {
117
+ requirements.push("Implement comprehensive error handling");
118
+ }
119
+ if (answers.edge_cases === "all" || answers.edge_cases === "empty_input") {
120
+ requirements.push("Handle edge cases for empty/null inputs");
121
+ }
122
+ if (answers.edge_cases === "all" || answers.edge_cases === "load") {
123
+ requirements.push("Ensure performance under load");
124
+ }
125
+ }
126
+ return requirements;
127
+ }
128
+ function generateTechnicalApproach(answers) {
129
+ const parts = [];
130
+ // Project type approach
131
+ const projectApproaches = {
132
+ web: "Build using modern web technologies with component-based architecture",
133
+ backend: "Implement RESTful API endpoints with proper service layer separation",
134
+ cli: "Create command-line interface with clear argument parsing and help text",
135
+ mobile: "Develop mobile-first UI with responsive design patterns",
136
+ };
137
+ parts.push(projectApproaches[answers.scope_type] ||
138
+ "Follow standard development practices");
139
+ // Constraint-based approach
140
+ if (answers.tech_constraints === "performance") {
141
+ parts.push("Profile and optimize critical paths, implement caching where appropriate");
142
+ }
143
+ else if (answers.tech_constraints === "security") {
144
+ parts.push("Apply security headers, input validation, and authentication middleware");
145
+ }
146
+ // Testing approach
147
+ if (answers.tech_testing && answers.tech_testing !== "manual") {
148
+ parts.push(`Set up ${answers.tech_testing} testing framework with CI integration`);
149
+ }
150
+ // Scope approach
151
+ if (answers.scope_clarify === "refactor") {
152
+ parts.push("Refactor incrementally with backwards compatibility");
153
+ }
154
+ else if (answers.scope_clarify === "extend") {
155
+ parts.push("Extend existing functionality while maintaining API stability");
156
+ }
157
+ return parts.join(". ") + ".";
158
+ }
159
+ function generateTaskBreakdown(featureDescription, answers, complexity) {
160
+ const tasks = [];
161
+ let taskNum = 1;
162
+ // Initial setup task (Task 1 - no dependencies)
163
+ const setupTaskId = `task-${taskNum}`;
164
+ tasks.push({
165
+ id: setupTaskId,
166
+ title: `${taskNum}. Project setup and initial scaffolding`,
167
+ description: "Set up project structure and initial configuration",
168
+ status: "pending",
169
+ complexity: "small",
170
+ dependsOn: [],
171
+ });
172
+ taskNum++;
173
+ // Track core task IDs for dependency chaining
174
+ const coreTaskIds = [];
175
+ // Core implementation task(s) based on complexity
176
+ if (complexity === "small") {
177
+ const coreTaskId = `task-${taskNum}`;
178
+ coreTaskIds.push(coreTaskId);
179
+ tasks.push({
180
+ id: coreTaskId,
181
+ title: `${taskNum}. Implement ${featureDescription.slice(0, 40)}`,
182
+ description: "Core feature implementation",
183
+ status: "pending",
184
+ complexity: "small",
185
+ dependsOn: [setupTaskId],
186
+ });
187
+ taskNum++;
188
+ }
189
+ else {
190
+ const coreLogicTaskId = `task-${taskNum}`;
191
+ coreTaskIds.push(coreLogicTaskId);
192
+ tasks.push({
193
+ id: coreLogicTaskId,
194
+ title: `${taskNum}. Implement core feature logic`,
195
+ description: "Build the main functionality",
196
+ status: "pending",
197
+ complexity: complexity === "large" ? "medium" : "small",
198
+ dependsOn: [setupTaskId],
199
+ });
200
+ taskNum++;
201
+ if (answers.scope_type === "web" || answers.scope_type === "mobile") {
202
+ const uiTaskId = `task-${taskNum}`;
203
+ coreTaskIds.push(uiTaskId);
204
+ tasks.push({
205
+ id: uiTaskId,
206
+ title: `${taskNum}. Build user interface components`,
207
+ description: "Create UI components and views",
208
+ status: "pending",
209
+ complexity: "medium",
210
+ dependsOn: [coreLogicTaskId],
211
+ });
212
+ taskNum++;
213
+ }
214
+ if (answers.scope_type === "backend") {
215
+ const apiTaskId = `task-${taskNum}`;
216
+ coreTaskIds.push(apiTaskId);
217
+ tasks.push({
218
+ id: apiTaskId,
219
+ title: `${taskNum}. Create API endpoints`,
220
+ description: "Implement REST API routes and handlers",
221
+ status: "pending",
222
+ complexity: "medium",
223
+ dependsOn: [coreLogicTaskId],
224
+ });
225
+ taskNum++;
226
+ }
227
+ }
228
+ // Track last task ID for dependency chaining
229
+ let lastTaskId = coreTaskIds[coreTaskIds.length - 1] ?? setupTaskId;
230
+ // Integration task
231
+ if (answers.integration_external && answers.integration_external !== "none") {
232
+ const integrationTaskId = `task-${taskNum}`;
233
+ tasks.push({
234
+ id: integrationTaskId,
235
+ title: `${taskNum}. Set up external integrations`,
236
+ description: `Integrate with ${answers.integration_external.replace("_", " ")}`,
237
+ status: "pending",
238
+ complexity: "medium",
239
+ dependsOn: [lastTaskId],
240
+ });
241
+ lastTaskId = integrationTaskId;
242
+ taskNum++;
243
+ }
244
+ // Testing task
245
+ if (answers.tech_testing && answers.tech_testing !== "manual") {
246
+ const testingTaskId = `task-${taskNum}`;
247
+ tasks.push({
248
+ id: testingTaskId,
249
+ title: `${taskNum}. Write tests`,
250
+ description: `Create ${answers.tech_testing} tests`,
251
+ status: "pending",
252
+ complexity: complexity === "small" ? "small" : "medium",
253
+ dependsOn: [lastTaskId],
254
+ });
255
+ lastTaskId = testingTaskId;
256
+ taskNum++;
257
+ }
258
+ // Documentation task for larger features
259
+ if (complexity !== "small" && answers.priority_focus === "docs") {
260
+ const docsTaskId = `task-${taskNum}`;
261
+ tasks.push({
262
+ id: docsTaskId,
263
+ title: `${taskNum}. Write documentation`,
264
+ description: "Create comprehensive documentation",
265
+ status: "pending",
266
+ complexity: "small",
267
+ dependsOn: [lastTaskId],
268
+ });
269
+ lastTaskId = docsTaskId;
270
+ taskNum++;
271
+ }
272
+ // Final review task
273
+ tasks.push({
274
+ id: `task-${taskNum}`,
275
+ title: `${taskNum}. Code review and final polish`,
276
+ description: "Review implementation and fix any issues",
277
+ status: "pending",
278
+ complexity: "small",
279
+ dependsOn: [lastTaskId],
280
+ });
281
+ return tasks;
282
+ }
283
+ function generateSuccessCriteria(answers) {
284
+ const criteria = [];
285
+ // Primary success criteria
286
+ const successMap = {
287
+ tests: "All automated tests pass",
288
+ functional: "Feature works as specified in requirements",
289
+ merged: "Code reviewed and merged to main branch",
290
+ deployed: "Successfully deployed to production environment",
291
+ };
292
+ criteria.push(successMap[answers.success_criteria] || "Feature implementation complete");
293
+ // Additional criteria based on constraints
294
+ if (answers.tech_constraints === "performance") {
295
+ criteria.push("Performance benchmarks met");
296
+ }
297
+ if (answers.tech_constraints === "security") {
298
+ criteria.push("Security review passed");
299
+ }
300
+ // Testing criteria
301
+ if (answers.tech_testing === "both") {
302
+ criteria.push("Unit and integration test coverage adequate");
303
+ }
304
+ // Edge case criteria
305
+ if (answers.edge_cases === "all") {
306
+ criteria.push("All edge cases handled gracefully");
307
+ }
308
+ return criteria;
309
+ }
310
+ function compilePrdContent(featureDescription, overview, requirements, technicalApproach, taskBreakdown, successCriteria) {
311
+ const sections = [];
312
+ // Title
313
+ sections.push(`# PRD: ${featureDescription}\n`);
314
+ // Overview
315
+ sections.push("## Overview\n");
316
+ sections.push(`${overview}\n`);
317
+ // Requirements
318
+ sections.push("## Requirements\n");
319
+ requirements.forEach((req, i) => {
320
+ sections.push(`${i + 1}. ${req}`);
321
+ });
322
+ sections.push("");
323
+ // Technical Approach
324
+ sections.push("## Technical Approach\n");
325
+ sections.push(`${technicalApproach}\n`);
326
+ // Task Breakdown
327
+ sections.push("## Task Breakdown\n");
328
+ taskBreakdown.forEach((task) => {
329
+ sections.push(`- **${task.title}** [${task.complexity}]`);
330
+ if (task.description) {
331
+ sections.push(` - ${task.description}`);
332
+ }
333
+ if (task.dependsOn && task.dependsOn.length > 0) {
334
+ const depNums = task.dependsOn
335
+ .map((dep) => dep.replace("task-", "#"))
336
+ .join(", ");
337
+ sections.push(` - Dependencies: ${depNums}`);
338
+ }
339
+ });
340
+ sections.push("");
341
+ // Success Criteria
342
+ sections.push("## Success Criteria\n");
343
+ successCriteria.forEach((criterion) => {
344
+ sections.push(`- [ ] ${criterion}`);
345
+ });
346
+ return sections.join("\n");
347
+ }
348
+ function ProgressMessage({ message, colors }) {
349
+ return (_jsx(Box, { marginY: 1, children: _jsx(Text, { color: colors.textMuted, children: message }) }));
350
+ }
351
+ function ElapsedTime({ elapsedMs }) {
352
+ const seconds = Math.floor(elapsedMs / 1000);
353
+ const formattedTime = seconds < 60
354
+ ? `${seconds}s`
355
+ : `${Math.floor(seconds / 60)}m ${seconds % 60}s`;
356
+ return (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["Elapsed: ", formattedTime] }) }));
357
+ }
358
+ // ============================================================================
359
+ // MAIN COMPONENT
360
+ // ============================================================================
361
+ export function PrdGenerationScreen({ isVisible, interviewResult, onComplete, onCancel, hasFocus, dimensions, }) {
362
+ const colors = useThemeColors();
363
+ const [progressMessage, setProgressMessage] = useState("Initializing PRD generation...");
364
+ const [isGenerating, setIsGenerating] = useState(false);
365
+ const [error, setError] = useState(null);
366
+ // Spinner animation
367
+ const spinner = useSpinner({
368
+ isActive: isGenerating,
369
+ interval: 80,
370
+ style: "braille",
371
+ });
372
+ // Handle escape to cancel
373
+ useInput((_input, key) => {
374
+ if (key.escape && onCancel) {
375
+ onCancel();
376
+ }
377
+ }, { isActive: hasFocus && isVisible });
378
+ // Start generation when visible
379
+ useEffect(() => {
380
+ if (!isVisible || isGenerating)
381
+ return;
382
+ setIsGenerating(true);
383
+ setError(null);
384
+ generatePrdFromInterview(interviewResult, setProgressMessage)
385
+ .then((prd) => {
386
+ setProgressMessage("PRD generation complete!");
387
+ setIsGenerating(false);
388
+ // Small delay before calling complete for visual feedback
389
+ setTimeout(() => {
390
+ onComplete(prd);
391
+ }, 500);
392
+ })
393
+ .catch((err) => {
394
+ setIsGenerating(false);
395
+ setError(err instanceof Error ? err.message : "Failed to generate PRD");
396
+ });
397
+ }, [isVisible, interviewResult, onComplete]);
398
+ if (!isVisible) {
399
+ return null;
400
+ }
401
+ const contentWidth = Math.min(60, (dimensions?.width ?? 80) - 10);
402
+ return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", width: "100%", height: "100%", children: [_jsx(Box, { marginBottom: 2, children: _jsxs(Text, { bold: true, color: colors.primary, children: [progressChars.braille[0], " PRD Generation"] }) }), _jsx(Box, { flexDirection: "column", alignItems: "center", borderStyle: "round", borderColor: colors.secondary, paddingX: 3, paddingY: 2, width: contentWidth, children: error ? (
403
+ // Error state
404
+ _jsxs(_Fragment, { children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { color: colors.error, children: [alertIcons.error, " Generation Failed"] }) }), _jsx(Text, { color: colors.textMuted, children: error }), _jsx(Box, { marginTop: 2, children: _jsx(Text, { dimColor: true, children: "Press Esc to go back" }) })] })) : (
405
+ // Loading state
406
+ _jsxs(_Fragment, { children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: colors.primary, children: spinner.frame }), _jsx(Text, { children: " " }), _jsx(Text, { bold: true, color: colors.text, children: "Generating PRD..." })] }), _jsx(ProgressMessage, { message: progressMessage, colors: colors }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: colors.secondary, children: progressChars.dots.join(" ") }) }), _jsx(ElapsedTime, { elapsedMs: spinner.elapsedMs }), onCancel && (_jsx(Box, { marginTop: 2, children: _jsx(Text, { dimColor: true, children: "Press Esc to cancel" }) }))] })) }), _jsx(Box, { marginTop: 2, paddingX: 2, width: contentWidth, children: _jsxs(Text, { dimColor: true, italic: true, children: ["Building:", " ", interviewResult.featureDescription.length > 40
407
+ ? interviewResult.featureDescription.slice(0, 40) + "..."
408
+ : interviewResult.featureDescription] }) }), _jsx(Box, { marginTop: 2, children: _jsxs(Text, { color: colors.warning, children: [alertIcons.info, " Games paused during PRD generation"] }) })] }));
409
+ }
410
+ export default PrdGenerationScreen;
411
+ //# sourceMappingURL=PrdGenerationScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrdGenerationScreen.js","sourceRoot":"","sources":["../src/PrdGenerationScreen.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * PRD Overlay Component
3
+ *
4
+ * Full-screen overlay that displays the PRD and task list.
5
+ * Triggered by pressing P key (or configurable hotkey).
6
+ * Shows feature name, start time, progress bar, and task list with status indicators.
7
+ */
8
+ import type { LoopState } from "./loop-state.js";
9
+ export type PrdOverlayAction = "close" | "resume" | "new_loop" | "full_prd";
10
+ export interface PrdOverlayProps {
11
+ /** Whether the overlay is visible */
12
+ isVisible: boolean;
13
+ /** The current loop state */
14
+ loopState: LoopState;
15
+ /** Callback when user selects an action */
16
+ onAction: (action: PrdOverlayAction) => void;
17
+ /** Callback when overlay is closed */
18
+ onClose: () => void;
19
+ /** Whether the component has focus */
20
+ hasFocus: boolean;
21
+ /** Terminal dimensions for centering */
22
+ dimensions?: {
23
+ width: number;
24
+ height: number;
25
+ };
26
+ }
27
+ export declare function PrdOverlay({ isVisible, loopState, onAction, onClose, hasFocus, dimensions, }: PrdOverlayProps): import("react/jsx-runtime").JSX.Element | null;
28
+ export default PrdOverlay;
29
+ //# sourceMappingURL=PrdOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrdOverlay.d.ts","sourceRoot":"","sources":["../src/PrdOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,iBAAiB,CAAC;AAM3D,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5E,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC7C,sCAAsC;IACtC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,sCAAsC;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,wCAAwC;IACxC,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AA4PD,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,SAAS,EACT,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,UAAU,GACX,EAAE,eAAe,kDAsKjB;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,174 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * PRD Overlay Component
4
+ *
5
+ * Full-screen overlay that displays the PRD and task list.
6
+ * Triggered by pressing P key (or configurable hotkey).
7
+ * Shows feature name, start time, progress bar, and task list with status indicators.
8
+ */
9
+ import { Box, Text, useInput } from "ink";
10
+ import { useState, useMemo, useCallback } from "react";
11
+ import { useThemeColors } from "./useTheme.js";
12
+ import { navIcons, decorChars, progressChars, createProgressBar, alertIcons, } from "./theme.js";
13
+ // ============================================================================
14
+ // CONSTANTS
15
+ // ============================================================================
16
+ const actionButtons = [
17
+ {
18
+ id: "close",
19
+ label: "Close",
20
+ hotkey: "Esc",
21
+ icon: navIcons.arrowLeft,
22
+ },
23
+ {
24
+ id: "resume",
25
+ label: "Resume",
26
+ hotkey: "R",
27
+ icon: navIcons.arrowRight,
28
+ },
29
+ {
30
+ id: "new_loop",
31
+ label: "New Loop",
32
+ hotkey: "N",
33
+ icon: decorChars.sparkle,
34
+ },
35
+ {
36
+ id: "full_prd",
37
+ label: "Full PRD Details",
38
+ hotkey: "F",
39
+ icon: navIcons.chevronRight,
40
+ },
41
+ ];
42
+ // ============================================================================
43
+ // HELPER FUNCTIONS
44
+ // ============================================================================
45
+ function formatElapsedTime(startedAt) {
46
+ const start = new Date(startedAt);
47
+ const now = new Date();
48
+ const diffMs = now.getTime() - start.getTime();
49
+ const diffMins = Math.floor(diffMs / 60000);
50
+ const hours = Math.floor(diffMins / 60);
51
+ const mins = diffMins % 60;
52
+ if (hours > 0) {
53
+ return `${hours}h ${mins}m`;
54
+ }
55
+ return `${mins}m`;
56
+ }
57
+ function getTaskStatusIcon(status) {
58
+ switch (status) {
59
+ case "completed":
60
+ return { icon: alertIcons.success, color: "green" };
61
+ case "in_progress":
62
+ return { icon: progressChars.half, color: "yellow" };
63
+ case "pending":
64
+ return { icon: navIcons.checkbox, color: "gray" };
65
+ case "skipped":
66
+ return { icon: navIcons.arrowRight, color: "gray" };
67
+ default:
68
+ return { icon: navIcons.checkbox, color: "gray" };
69
+ }
70
+ }
71
+ function ProgressHeader({ loopState, colors }) {
72
+ const progressBar = useMemo(() => createProgressBar(loopState.progress.percentage, 25), [loopState.progress.percentage]);
73
+ const elapsedTime = useMemo(() => (loopState.startedAt ? formatElapsedTime(loopState.startedAt) : "--"), [loopState.startedAt]);
74
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [loopState.prd && (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { color: colors.secondary, bold: true, children: [decorChars.sparkle, " ", loopState.prd.name] }) })), _jsxs(Box, { children: [_jsx(Text, { color: colors.textMuted, children: "Progress: " }), _jsx(Text, { color: colors.success, children: progressBar }), _jsxs(Text, { color: colors.text, children: [" ", loopState.progress.percentage, "%"] }), _jsx(Text, { color: colors.textMuted, children: " | " }), _jsx(Text, { color: colors.textMuted, children: "Started: " }), _jsxs(Text, { color: colors.info, children: [elapsedTime, " ago"] })] }), _jsxs(Box, { marginTop: 1, children: [_jsxs(Text, { color: colors.success, children: [loopState.progress.completedTasks, " completed"] }), _jsx(Text, { color: colors.textMuted, children: " / " }), _jsxs(Text, { color: colors.text, children: [loopState.progress.totalTasks, " total"] })] })] }));
75
+ }
76
+ function TaskList({ tasks, colors, selectedIndex, maxVisible, scrollOffset, }) {
77
+ const visibleTasks = tasks.slice(scrollOffset, scrollOffset + maxVisible);
78
+ if (tasks.length === 0) {
79
+ return (_jsx(Box, { marginY: 1, children: _jsx(Text, { dimColor: true, italic: true, children: "No tasks available" }) }));
80
+ }
81
+ return (_jsxs(Box, { flexDirection: "column", children: [scrollOffset > 0 && (_jsx(Box, { justifyContent: "center", marginBottom: 1, children: _jsxs(Text, { dimColor: true, children: ["... ", scrollOffset, " more above ..."] }) })), visibleTasks.map((task, index) => {
82
+ const actualIndex = index + scrollOffset;
83
+ const isSelected = actualIndex === selectedIndex;
84
+ const { icon, color } = getTaskStatusIcon(task.status);
85
+ // Extract task number from title
86
+ const taskNumber = task.title.match(/^(\d+)\./)?.[1] ?? String(actualIndex + 1);
87
+ const titleWithoutNumber = task.title.replace(/^\d+\.\s*/, "");
88
+ return (_jsx(Box, { flexDirection: "column", marginBottom: 0, children: _jsxs(Box, { children: [_jsx(Text, { color: isSelected ? colors.primary : colors.textMuted, children: isSelected ? navIcons.pointer : " " }), _jsx(Text, { children: " " }), _jsx(Text, { color: color, children: icon }), _jsx(Text, { children: " " }), _jsxs(Text, { color: colors.secondary, bold: true, children: [taskNumber, "."] }), _jsx(Text, { children: " " }), _jsx(Text, { color: task.status === "completed"
89
+ ? colors.textMuted
90
+ : task.status === "in_progress"
91
+ ? colors.warning
92
+ : colors.text, strikethrough: task.status === "completed", children: titleWithoutNumber.length > 45
93
+ ? titleWithoutNumber.slice(0, 45) + "..."
94
+ : titleWithoutNumber })] }) }, task.id));
95
+ }), scrollOffset + maxVisible < tasks.length && (_jsx(Box, { justifyContent: "center", marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["... ", tasks.length - scrollOffset - maxVisible, " more below ..."] }) }))] }));
96
+ }
97
+ function ActionBar({ buttons, colors }) {
98
+ return (_jsx(Box, { marginTop: 1, justifyContent: "center", gap: 2, children: buttons.map((button) => (_jsxs(Box, { children: [_jsx(Text, { color: colors.textMuted, children: "[" }), _jsx(Text, { color: colors.accent, bold: true, children: button.hotkey }), _jsx(Text, { color: colors.textMuted, children: "] " }), _jsxs(Text, { color: colors.text, children: [button.icon, " ", button.label] })] }, button.id))) }));
99
+ }
100
+ // ============================================================================
101
+ // MAIN COMPONENT
102
+ // ============================================================================
103
+ export function PrdOverlay({ isVisible, loopState, onAction, onClose, hasFocus, dimensions, }) {
104
+ const [selectedIndex, setSelectedIndex] = useState(0);
105
+ const colors = useThemeColors();
106
+ // Calculate visible height for scrolling
107
+ const maxVisibleTasks = Math.max((dimensions?.height ?? 20) - 16, 5);
108
+ // Calculate scroll offset for viewport
109
+ const scrollOffset = useMemo(() => {
110
+ if (selectedIndex < Math.floor(maxVisibleTasks / 2)) {
111
+ return 0;
112
+ }
113
+ if (selectedIndex >
114
+ loopState.tasks.length - Math.ceil(maxVisibleTasks / 2)) {
115
+ return Math.max(0, loopState.tasks.length - maxVisibleTasks);
116
+ }
117
+ return selectedIndex - Math.floor(maxVisibleTasks / 2);
118
+ }, [selectedIndex, maxVisibleTasks, loopState.tasks.length]);
119
+ const handleAction = useCallback((action) => {
120
+ if (action === "close") {
121
+ onClose();
122
+ }
123
+ else {
124
+ onAction(action);
125
+ }
126
+ }, [onAction, onClose]);
127
+ // Handle keyboard input
128
+ useInput((input, key) => {
129
+ if (!hasFocus || !isVisible)
130
+ return;
131
+ // Close overlay
132
+ if (key.escape || input === "p" || input === "P") {
133
+ onClose();
134
+ return;
135
+ }
136
+ // Navigate tasks
137
+ if (key.upArrow || input === "k" || input === "K") {
138
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
139
+ return;
140
+ }
141
+ if (key.downArrow || input === "j" || input === "J") {
142
+ setSelectedIndex((prev) => Math.min(loopState.tasks.length - 1, prev + 1));
143
+ return;
144
+ }
145
+ // Action hotkeys
146
+ if (input === "r" || input === "R") {
147
+ handleAction("resume");
148
+ return;
149
+ }
150
+ if (input === "n" || input === "N") {
151
+ handleAction("new_loop");
152
+ return;
153
+ }
154
+ if (input === "f" || input === "F") {
155
+ handleAction("full_prd");
156
+ return;
157
+ }
158
+ }, { isActive: hasFocus && isVisible });
159
+ // Calculate box dimensions
160
+ const boxWidth = useMemo(() => {
161
+ if (dimensions?.width) {
162
+ return Math.min(75, dimensions.width - 4);
163
+ }
164
+ return 75;
165
+ }, [dimensions?.width]);
166
+ if (!isVisible) {
167
+ return null;
168
+ }
169
+ // Check if there's any loop data to display
170
+ const hasLoopData = loopState.prd !== null || loopState.tasks.length > 0;
171
+ return (_jsx(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", width: "100%", height: "100%", children: _jsxs(Box, { flexDirection: "column", borderStyle: "double", borderColor: colors.primary, paddingX: 2, paddingY: 1, width: boxWidth, children: [_jsx(Box, { justifyContent: "center", marginBottom: 1, children: _jsxs(Text, { color: colors.primary, bold: true, children: [decorChars.star, " PRD Overview ", decorChars.star] }) }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { dimColor: true, children: "─".repeat(boxWidth - 6) }) }), hasLoopData ? (_jsxs(_Fragment, { children: [_jsx(ProgressHeader, { loopState: loopState, colors: colors }), _jsx(Box, { marginY: 1, children: _jsx(Text, { dimColor: true, children: "─".repeat(boxWidth - 6) }) }), _jsx(Box, { marginBottom: 1, children: _jsxs(Text, { bold: true, color: colors.accent, children: [alertIcons.info, " Task List"] }) }), _jsx(TaskList, { tasks: loopState.tasks, colors: colors, selectedIndex: selectedIndex, maxVisible: maxVisibleTasks, scrollOffset: scrollOffset })] })) : (_jsxs(Box, { flexDirection: "column", alignItems: "center", marginY: 2, children: [_jsx(Text, { dimColor: true, italic: true, children: "No active loop" }), _jsx(Text, { dimColor: true, children: "Start a new loop to see PRD and tasks here." })] })), _jsx(Box, { marginY: 1, children: _jsx(Text, { dimColor: true, children: "─".repeat(boxWidth - 6) }) }), _jsx(ActionBar, { buttons: actionButtons, colors: colors }), _jsx(Box, { marginTop: 1, justifyContent: "center", children: _jsx(Text, { dimColor: true, children: "\u2191\u2193: Navigate tasks | P or Esc: Close" }) })] }) }));
172
+ }
173
+ export default PrdOverlay;
174
+ //# sourceMappingURL=PrdOverlay.js.map