wiggum-cli 0.12.0 → 0.13.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 (502) hide show
  1. package/dist/ai/agents/codebase-analyst.d.ts +0 -1
  2. package/dist/ai/agents/codebase-analyst.js +0 -1
  3. package/dist/ai/agents/codebase-analyzer.d.ts +0 -1
  4. package/dist/ai/agents/codebase-analyzer.js +0 -1
  5. package/dist/ai/agents/context-enricher.d.ts +0 -1
  6. package/dist/ai/agents/context-enricher.js +0 -1
  7. package/dist/ai/agents/evaluator-optimizer.d.ts +0 -1
  8. package/dist/ai/agents/evaluator-optimizer.js +0 -1
  9. package/dist/ai/agents/index.d.ts +0 -1
  10. package/dist/ai/agents/index.js +0 -1
  11. package/dist/ai/agents/mcp-detector.d.ts +0 -1
  12. package/dist/ai/agents/mcp-detector.js +0 -1
  13. package/dist/ai/agents/orchestrator.d.ts +0 -1
  14. package/dist/ai/agents/orchestrator.js +0 -1
  15. package/dist/ai/agents/planning-orchestrator.d.ts +0 -1
  16. package/dist/ai/agents/planning-orchestrator.js +0 -1
  17. package/dist/ai/agents/stack-researcher.d.ts +0 -1
  18. package/dist/ai/agents/stack-researcher.js +0 -1
  19. package/dist/ai/agents/stack-utils.d.ts +0 -1
  20. package/dist/ai/agents/stack-utils.js +0 -1
  21. package/dist/ai/agents/synthesis-agent.d.ts +0 -1
  22. package/dist/ai/agents/synthesis-agent.js +0 -1
  23. package/dist/ai/agents/tech-researcher.d.ts +0 -1
  24. package/dist/ai/agents/tech-researcher.js +0 -1
  25. package/dist/ai/agents/types.d.ts +0 -1
  26. package/dist/ai/agents/types.js +0 -1
  27. package/dist/ai/conversation/conversation-manager.d.ts +0 -1
  28. package/dist/ai/conversation/conversation-manager.js +0 -1
  29. package/dist/ai/conversation/index.d.ts +0 -1
  30. package/dist/ai/conversation/index.js +0 -1
  31. package/dist/ai/conversation/interview-tools.d.ts +0 -1
  32. package/dist/ai/conversation/interview-tools.js +0 -1
  33. package/dist/ai/conversation/spec-generator.d.ts +0 -1
  34. package/dist/ai/conversation/spec-generator.js +0 -1
  35. package/dist/ai/conversation/url-fetcher.d.ts +0 -1
  36. package/dist/ai/conversation/url-fetcher.js +0 -1
  37. package/dist/ai/enhancer.d.ts +0 -1
  38. package/dist/ai/enhancer.js +0 -1
  39. package/dist/ai/index.d.ts +0 -1
  40. package/dist/ai/index.js +0 -1
  41. package/dist/ai/prompts.d.ts +0 -1
  42. package/dist/ai/prompts.js +0 -1
  43. package/dist/ai/providers.d.ts +0 -1
  44. package/dist/ai/providers.js +0 -1
  45. package/dist/ai/tools/context7.d.ts +0 -1
  46. package/dist/ai/tools/context7.js +0 -1
  47. package/dist/ai/tools/index.d.ts +0 -1
  48. package/dist/ai/tools/index.js +0 -1
  49. package/dist/ai/tools/tavily.d.ts +0 -1
  50. package/dist/ai/tools/tavily.js +0 -1
  51. package/dist/ai/tools.d.ts +0 -1
  52. package/dist/ai/tools.js +0 -1
  53. package/dist/commands/config.d.ts +0 -1
  54. package/dist/commands/config.js +0 -1
  55. package/dist/commands/init.d.ts +0 -1
  56. package/dist/commands/init.js +0 -1
  57. package/dist/commands/monitor.d.ts +0 -1
  58. package/dist/commands/monitor.js +0 -1
  59. package/dist/commands/new.d.ts +0 -1
  60. package/dist/commands/new.js +0 -1
  61. package/dist/commands/run.d.ts +0 -1
  62. package/dist/commands/run.js +0 -1
  63. package/dist/context/convert.d.ts +0 -1
  64. package/dist/context/convert.js +0 -1
  65. package/dist/context/index.d.ts +0 -1
  66. package/dist/context/index.js +0 -1
  67. package/dist/context/storage.d.ts +0 -1
  68. package/dist/context/storage.js +0 -1
  69. package/dist/context/types.d.ts +0 -1
  70. package/dist/context/types.js +0 -1
  71. package/dist/generator/config.d.ts +0 -1
  72. package/dist/generator/config.js +0 -1
  73. package/dist/generator/index.d.ts +0 -1
  74. package/dist/generator/index.js +0 -1
  75. package/dist/generator/templates.d.ts +0 -1
  76. package/dist/generator/templates.js +0 -1
  77. package/dist/generator/writer.d.ts +0 -1
  78. package/dist/generator/writer.js +0 -1
  79. package/dist/index.d.ts +0 -1
  80. package/dist/index.js +7 -7
  81. package/dist/repl/command-parser.d.ts +0 -1
  82. package/dist/repl/command-parser.js +0 -1
  83. package/dist/repl/index.d.ts +0 -1
  84. package/dist/repl/index.js +0 -1
  85. package/dist/repl/session-state.d.ts +0 -1
  86. package/dist/repl/session-state.js +0 -1
  87. package/dist/scanner/detectors/core/framework.d.ts +0 -1
  88. package/dist/scanner/detectors/core/framework.js +0 -1
  89. package/dist/scanner/detectors/core/packageManager.d.ts +0 -1
  90. package/dist/scanner/detectors/core/packageManager.js +0 -1
  91. package/dist/scanner/detectors/core/styling.d.ts +0 -1
  92. package/dist/scanner/detectors/core/styling.js +0 -1
  93. package/dist/scanner/detectors/core/testing.d.ts +0 -1
  94. package/dist/scanner/detectors/core/testing.js +0 -1
  95. package/dist/scanner/detectors/data/api.d.ts +0 -1
  96. package/dist/scanner/detectors/data/api.js +0 -1
  97. package/dist/scanner/detectors/data/database.d.ts +0 -1
  98. package/dist/scanner/detectors/data/database.js +0 -1
  99. package/dist/scanner/detectors/data/orm.d.ts +0 -1
  100. package/dist/scanner/detectors/data/orm.js +0 -1
  101. package/dist/scanner/detectors/frontend/formHandling.d.ts +0 -1
  102. package/dist/scanner/detectors/frontend/formHandling.js +0 -1
  103. package/dist/scanner/detectors/frontend/stateManagement.d.ts +0 -1
  104. package/dist/scanner/detectors/frontend/stateManagement.js +0 -1
  105. package/dist/scanner/detectors/frontend/uiComponents.d.ts +0 -1
  106. package/dist/scanner/detectors/frontend/uiComponents.js +0 -1
  107. package/dist/scanner/detectors/infra/deployment.d.ts +0 -1
  108. package/dist/scanner/detectors/infra/deployment.js +0 -1
  109. package/dist/scanner/detectors/infra/monorepo.d.ts +0 -1
  110. package/dist/scanner/detectors/infra/monorepo.js +0 -1
  111. package/dist/scanner/detectors/mcp/mcpProject.d.ts +0 -1
  112. package/dist/scanner/detectors/mcp/mcpProject.js +0 -1
  113. package/dist/scanner/detectors/mcp/mcpServers.d.ts +0 -1
  114. package/dist/scanner/detectors/mcp/mcpServers.js +0 -1
  115. package/dist/scanner/detectors/services/analytics.d.ts +0 -1
  116. package/dist/scanner/detectors/services/analytics.js +0 -1
  117. package/dist/scanner/detectors/services/auth.d.ts +0 -1
  118. package/dist/scanner/detectors/services/auth.js +0 -1
  119. package/dist/scanner/detectors/services/email.d.ts +0 -1
  120. package/dist/scanner/detectors/services/email.js +0 -1
  121. package/dist/scanner/detectors/services/payments.d.ts +0 -1
  122. package/dist/scanner/detectors/services/payments.js +0 -1
  123. package/dist/scanner/detectors/utils.d.ts +0 -1
  124. package/dist/scanner/detectors/utils.js +0 -1
  125. package/dist/scanner/index.d.ts +0 -1
  126. package/dist/scanner/index.js +0 -1
  127. package/dist/scanner/registry.d.ts +0 -1
  128. package/dist/scanner/registry.js +0 -1
  129. package/dist/scanner/types.d.ts +0 -1
  130. package/dist/scanner/types.js +0 -1
  131. package/dist/tui/app.d.ts +12 -23
  132. package/dist/tui/app.js +130 -315
  133. package/dist/tui/components/ActionOutput.d.ts +0 -1
  134. package/dist/tui/components/ActionOutput.js +0 -1
  135. package/dist/tui/components/AppShell.d.ts +47 -0
  136. package/dist/tui/components/AppShell.js +19 -0
  137. package/dist/tui/components/ChatInput.d.ts +0 -1
  138. package/dist/tui/components/ChatInput.js +0 -1
  139. package/dist/tui/components/CommandDropdown.d.ts +0 -1
  140. package/dist/tui/components/CommandDropdown.js +0 -1
  141. package/dist/tui/components/Confirm.d.ts +0 -1
  142. package/dist/tui/components/Confirm.js +0 -1
  143. package/dist/tui/components/ErrorCard.d.ts +0 -1
  144. package/dist/tui/components/ErrorCard.js +0 -1
  145. package/dist/tui/components/FooterStatusBar.d.ts +0 -1
  146. package/dist/tui/components/FooterStatusBar.js +2 -4
  147. package/dist/tui/components/HeaderContent.d.ts +28 -0
  148. package/dist/tui/components/HeaderContent.js +16 -0
  149. package/dist/tui/components/MessageList.d.ts +9 -8
  150. package/dist/tui/components/MessageList.js +23 -18
  151. package/dist/tui/components/MultiSelect.d.ts +0 -1
  152. package/dist/tui/components/MultiSelect.js +0 -1
  153. package/dist/tui/components/PasswordInput.d.ts +0 -1
  154. package/dist/tui/components/PasswordInput.js +0 -1
  155. package/dist/tui/components/PhaseHeader.d.ts +0 -1
  156. package/dist/tui/components/PhaseHeader.js +0 -1
  157. package/dist/tui/components/RunCompletionSummary.d.ts +22 -0
  158. package/dist/tui/components/RunCompletionSummary.js +23 -0
  159. package/dist/tui/components/Select.d.ts +0 -1
  160. package/dist/tui/components/Select.js +0 -1
  161. package/dist/tui/components/SpecCompletionSummary.d.ts +47 -0
  162. package/dist/tui/components/SpecCompletionSummary.js +124 -0
  163. package/dist/tui/components/StatusLine.d.ts +0 -1
  164. package/dist/tui/components/StatusLine.js +0 -1
  165. package/dist/tui/components/StreamingText.d.ts +0 -1
  166. package/dist/tui/components/StreamingText.js +0 -1
  167. package/dist/tui/components/TipsBar.d.ts +24 -0
  168. package/dist/tui/components/TipsBar.js +23 -0
  169. package/dist/tui/components/ToolCallCard.d.ts +0 -1
  170. package/dist/tui/components/ToolCallCard.js +0 -1
  171. package/dist/tui/components/WiggumBanner.d.ts +0 -1
  172. package/dist/tui/components/WiggumBanner.js +8 -4
  173. package/dist/tui/components/WorkingIndicator.d.ts +0 -1
  174. package/dist/tui/components/WorkingIndicator.js +0 -1
  175. package/dist/tui/components/index.d.ts +0 -1
  176. package/dist/tui/components/index.js +0 -1
  177. package/dist/tui/hooks/index.d.ts +0 -1
  178. package/dist/tui/hooks/index.js +0 -1
  179. package/dist/tui/hooks/useBackgroundRuns.d.ts +52 -0
  180. package/dist/tui/hooks/useBackgroundRuns.js +121 -0
  181. package/dist/tui/hooks/useCommandHistory.d.ts +0 -1
  182. package/dist/tui/hooks/useCommandHistory.js +0 -1
  183. package/dist/tui/hooks/useInit.d.ts +0 -1
  184. package/dist/tui/hooks/useInit.js +0 -1
  185. package/dist/tui/hooks/useSpecGenerator.d.ts +0 -1
  186. package/dist/tui/hooks/useSpecGenerator.js +0 -1
  187. package/dist/tui/hooks/useSync.d.ts +0 -1
  188. package/dist/tui/hooks/useSync.js +0 -1
  189. package/dist/tui/index.d.ts +0 -1
  190. package/dist/tui/index.js +0 -1
  191. package/dist/tui/orchestration/index.d.ts +0 -1
  192. package/dist/tui/orchestration/index.js +0 -1
  193. package/dist/tui/orchestration/interview-orchestrator.d.ts +0 -1
  194. package/dist/tui/orchestration/interview-orchestrator.js +1 -2
  195. package/dist/tui/screens/InitScreen.d.ts +13 -9
  196. package/dist/tui/screens/InitScreen.js +86 -88
  197. package/dist/tui/screens/InterviewScreen.d.ts +11 -9
  198. package/dist/tui/screens/InterviewScreen.js +145 -100
  199. package/dist/tui/screens/MainShell.d.ts +13 -13
  200. package/dist/tui/screens/MainShell.js +65 -70
  201. package/dist/tui/screens/RunScreen.d.ts +17 -2
  202. package/dist/tui/screens/RunScreen.js +235 -81
  203. package/dist/tui/screens/index.d.ts +0 -3
  204. package/dist/tui/screens/index.js +0 -2
  205. package/dist/tui/theme.d.ts +0 -1
  206. package/dist/tui/theme.js +0 -1
  207. package/dist/tui/types/interview.d.ts +0 -1
  208. package/dist/tui/types/interview.js +0 -1
  209. package/dist/tui/utils/input-utils.d.ts +0 -1
  210. package/dist/tui/utils/input-utils.js +0 -1
  211. package/dist/tui/utils/loop-status.d.ts +22 -4
  212. package/dist/tui/utils/loop-status.js +65 -16
  213. package/dist/utils/colors.d.ts +0 -1
  214. package/dist/utils/colors.js +0 -1
  215. package/dist/utils/config.d.ts +0 -1
  216. package/dist/utils/config.js +0 -1
  217. package/dist/utils/env.d.ts +0 -1
  218. package/dist/utils/env.js +0 -1
  219. package/dist/utils/header.d.ts +0 -1
  220. package/dist/utils/header.js +0 -1
  221. package/dist/utils/json-repair.d.ts +0 -1
  222. package/dist/utils/json-repair.js +0 -1
  223. package/dist/utils/logger.d.ts +0 -1
  224. package/dist/utils/logger.js +0 -1
  225. package/dist/utils/spinner.d.ts +0 -1
  226. package/dist/utils/spinner.js +0 -1
  227. package/dist/utils/tracing.d.ts +0 -1
  228. package/dist/utils/tracing.js +0 -1
  229. package/dist/utils/tui.d.ts +0 -1
  230. package/dist/utils/tui.js +0 -1
  231. package/dist/utils/update-check.d.ts +0 -1
  232. package/dist/utils/update-check.js +0 -1
  233. package/package.json +6 -4
  234. package/CONTRIBUTING.md +0 -162
  235. package/dist/__test-utils__/fixtures.d.ts +0 -17
  236. package/dist/__test-utils__/fixtures.d.ts.map +0 -1
  237. package/dist/__test-utils__/fixtures.js +0 -32
  238. package/dist/__test-utils__/fixtures.js.map +0 -1
  239. package/dist/__test-utils__/ink-helpers.d.ts +0 -43
  240. package/dist/__test-utils__/ink-helpers.d.ts.map +0 -1
  241. package/dist/__test-utils__/ink-helpers.js +0 -62
  242. package/dist/__test-utils__/ink-helpers.js.map +0 -1
  243. package/dist/__test-utils__/mock-ai.d.ts +0 -99
  244. package/dist/__test-utils__/mock-ai.d.ts.map +0 -1
  245. package/dist/__test-utils__/mock-ai.js +0 -75
  246. package/dist/__test-utils__/mock-ai.js.map +0 -1
  247. package/dist/__test-utils__/mock-tracing.d.ts +0 -18
  248. package/dist/__test-utils__/mock-tracing.d.ts.map +0 -1
  249. package/dist/__test-utils__/mock-tracing.js +0 -24
  250. package/dist/__test-utils__/mock-tracing.js.map +0 -1
  251. package/dist/__test-utils__/setup.d.ts +0 -8
  252. package/dist/__test-utils__/setup.d.ts.map +0 -1
  253. package/dist/__test-utils__/setup.js +0 -21
  254. package/dist/__test-utils__/setup.js.map +0 -1
  255. package/dist/ai/agents/codebase-analyst.d.ts.map +0 -1
  256. package/dist/ai/agents/codebase-analyst.js.map +0 -1
  257. package/dist/ai/agents/codebase-analyzer.d.ts.map +0 -1
  258. package/dist/ai/agents/codebase-analyzer.js.map +0 -1
  259. package/dist/ai/agents/context-enricher.d.ts.map +0 -1
  260. package/dist/ai/agents/context-enricher.js.map +0 -1
  261. package/dist/ai/agents/evaluator-optimizer.d.ts.map +0 -1
  262. package/dist/ai/agents/evaluator-optimizer.js.map +0 -1
  263. package/dist/ai/agents/index.d.ts.map +0 -1
  264. package/dist/ai/agents/index.js.map +0 -1
  265. package/dist/ai/agents/mcp-detector.d.ts.map +0 -1
  266. package/dist/ai/agents/mcp-detector.js.map +0 -1
  267. package/dist/ai/agents/orchestrator.d.ts.map +0 -1
  268. package/dist/ai/agents/orchestrator.js.map +0 -1
  269. package/dist/ai/agents/planning-orchestrator.d.ts.map +0 -1
  270. package/dist/ai/agents/planning-orchestrator.js.map +0 -1
  271. package/dist/ai/agents/stack-researcher.d.ts.map +0 -1
  272. package/dist/ai/agents/stack-researcher.js.map +0 -1
  273. package/dist/ai/agents/stack-utils.d.ts.map +0 -1
  274. package/dist/ai/agents/stack-utils.js.map +0 -1
  275. package/dist/ai/agents/synthesis-agent.d.ts.map +0 -1
  276. package/dist/ai/agents/synthesis-agent.js.map +0 -1
  277. package/dist/ai/agents/tech-researcher.d.ts.map +0 -1
  278. package/dist/ai/agents/tech-researcher.js.map +0 -1
  279. package/dist/ai/agents/types.d.ts.map +0 -1
  280. package/dist/ai/agents/types.js.map +0 -1
  281. package/dist/ai/conversation/conversation-manager.d.ts.map +0 -1
  282. package/dist/ai/conversation/conversation-manager.js.map +0 -1
  283. package/dist/ai/conversation/index.d.ts.map +0 -1
  284. package/dist/ai/conversation/index.js.map +0 -1
  285. package/dist/ai/conversation/interview-tools.d.ts.map +0 -1
  286. package/dist/ai/conversation/interview-tools.js.map +0 -1
  287. package/dist/ai/conversation/spec-generator.d.ts.map +0 -1
  288. package/dist/ai/conversation/spec-generator.js.map +0 -1
  289. package/dist/ai/conversation/url-fetcher.d.ts.map +0 -1
  290. package/dist/ai/conversation/url-fetcher.js.map +0 -1
  291. package/dist/ai/enhancer.d.ts.map +0 -1
  292. package/dist/ai/enhancer.js.map +0 -1
  293. package/dist/ai/index.d.ts.map +0 -1
  294. package/dist/ai/index.js.map +0 -1
  295. package/dist/ai/prompts.d.ts.map +0 -1
  296. package/dist/ai/prompts.js.map +0 -1
  297. package/dist/ai/providers.d.ts.map +0 -1
  298. package/dist/ai/providers.js.map +0 -1
  299. package/dist/ai/tools/context7.d.ts.map +0 -1
  300. package/dist/ai/tools/context7.js.map +0 -1
  301. package/dist/ai/tools/index.d.ts.map +0 -1
  302. package/dist/ai/tools/index.js.map +0 -1
  303. package/dist/ai/tools/tavily.d.ts.map +0 -1
  304. package/dist/ai/tools/tavily.js.map +0 -1
  305. package/dist/ai/tools.d.ts.map +0 -1
  306. package/dist/ai/tools.js.map +0 -1
  307. package/dist/commands/config.d.ts.map +0 -1
  308. package/dist/commands/config.js.map +0 -1
  309. package/dist/commands/init.d.ts.map +0 -1
  310. package/dist/commands/init.js.map +0 -1
  311. package/dist/commands/monitor.d.ts.map +0 -1
  312. package/dist/commands/monitor.js.map +0 -1
  313. package/dist/commands/new.d.ts.map +0 -1
  314. package/dist/commands/new.js.map +0 -1
  315. package/dist/commands/run.d.ts.map +0 -1
  316. package/dist/commands/run.js.map +0 -1
  317. package/dist/context/convert.d.ts.map +0 -1
  318. package/dist/context/convert.js.map +0 -1
  319. package/dist/context/index.d.ts.map +0 -1
  320. package/dist/context/index.js.map +0 -1
  321. package/dist/context/storage.d.ts.map +0 -1
  322. package/dist/context/storage.js.map +0 -1
  323. package/dist/context/types.d.ts.map +0 -1
  324. package/dist/context/types.js.map +0 -1
  325. package/dist/generator/config.d.ts.map +0 -1
  326. package/dist/generator/config.js.map +0 -1
  327. package/dist/generator/index.d.ts.map +0 -1
  328. package/dist/generator/index.js.map +0 -1
  329. package/dist/generator/templates.d.ts.map +0 -1
  330. package/dist/generator/templates.js.map +0 -1
  331. package/dist/generator/writer.d.ts.map +0 -1
  332. package/dist/generator/writer.js.map +0 -1
  333. package/dist/index.d.ts.map +0 -1
  334. package/dist/index.js.map +0 -1
  335. package/dist/repl/command-parser.d.ts.map +0 -1
  336. package/dist/repl/command-parser.js.map +0 -1
  337. package/dist/repl/index.d.ts.map +0 -1
  338. package/dist/repl/index.js.map +0 -1
  339. package/dist/repl/session-state.d.ts.map +0 -1
  340. package/dist/repl/session-state.js.map +0 -1
  341. package/dist/scanner/detectors/core/framework.d.ts.map +0 -1
  342. package/dist/scanner/detectors/core/framework.js.map +0 -1
  343. package/dist/scanner/detectors/core/packageManager.d.ts.map +0 -1
  344. package/dist/scanner/detectors/core/packageManager.js.map +0 -1
  345. package/dist/scanner/detectors/core/styling.d.ts.map +0 -1
  346. package/dist/scanner/detectors/core/styling.js.map +0 -1
  347. package/dist/scanner/detectors/core/testing.d.ts.map +0 -1
  348. package/dist/scanner/detectors/core/testing.js.map +0 -1
  349. package/dist/scanner/detectors/data/api.d.ts.map +0 -1
  350. package/dist/scanner/detectors/data/api.js.map +0 -1
  351. package/dist/scanner/detectors/data/database.d.ts.map +0 -1
  352. package/dist/scanner/detectors/data/database.js.map +0 -1
  353. package/dist/scanner/detectors/data/orm.d.ts.map +0 -1
  354. package/dist/scanner/detectors/data/orm.js.map +0 -1
  355. package/dist/scanner/detectors/frontend/formHandling.d.ts.map +0 -1
  356. package/dist/scanner/detectors/frontend/formHandling.js.map +0 -1
  357. package/dist/scanner/detectors/frontend/stateManagement.d.ts.map +0 -1
  358. package/dist/scanner/detectors/frontend/stateManagement.js.map +0 -1
  359. package/dist/scanner/detectors/frontend/uiComponents.d.ts.map +0 -1
  360. package/dist/scanner/detectors/frontend/uiComponents.js.map +0 -1
  361. package/dist/scanner/detectors/infra/deployment.d.ts.map +0 -1
  362. package/dist/scanner/detectors/infra/deployment.js.map +0 -1
  363. package/dist/scanner/detectors/infra/monorepo.d.ts.map +0 -1
  364. package/dist/scanner/detectors/infra/monorepo.js.map +0 -1
  365. package/dist/scanner/detectors/mcp/mcpProject.d.ts.map +0 -1
  366. package/dist/scanner/detectors/mcp/mcpProject.js.map +0 -1
  367. package/dist/scanner/detectors/mcp/mcpServers.d.ts.map +0 -1
  368. package/dist/scanner/detectors/mcp/mcpServers.js.map +0 -1
  369. package/dist/scanner/detectors/services/analytics.d.ts.map +0 -1
  370. package/dist/scanner/detectors/services/analytics.js.map +0 -1
  371. package/dist/scanner/detectors/services/auth.d.ts.map +0 -1
  372. package/dist/scanner/detectors/services/auth.js.map +0 -1
  373. package/dist/scanner/detectors/services/email.d.ts.map +0 -1
  374. package/dist/scanner/detectors/services/email.js.map +0 -1
  375. package/dist/scanner/detectors/services/payments.d.ts.map +0 -1
  376. package/dist/scanner/detectors/services/payments.js.map +0 -1
  377. package/dist/scanner/detectors/utils.d.ts.map +0 -1
  378. package/dist/scanner/detectors/utils.js.map +0 -1
  379. package/dist/scanner/index.d.ts.map +0 -1
  380. package/dist/scanner/index.js.map +0 -1
  381. package/dist/scanner/registry.d.ts.map +0 -1
  382. package/dist/scanner/registry.js.map +0 -1
  383. package/dist/scanner/types.d.ts.map +0 -1
  384. package/dist/scanner/types.js.map +0 -1
  385. package/dist/tui/app.d.ts.map +0 -1
  386. package/dist/tui/app.js.map +0 -1
  387. package/dist/tui/components/ActionOutput.d.ts.map +0 -1
  388. package/dist/tui/components/ActionOutput.js.map +0 -1
  389. package/dist/tui/components/ChatInput.d.ts.map +0 -1
  390. package/dist/tui/components/ChatInput.js.map +0 -1
  391. package/dist/tui/components/ChatInput.test.d.ts +0 -2
  392. package/dist/tui/components/ChatInput.test.d.ts.map +0 -1
  393. package/dist/tui/components/ChatInput.test.js +0 -75
  394. package/dist/tui/components/ChatInput.test.js.map +0 -1
  395. package/dist/tui/components/CommandDropdown.d.ts.map +0 -1
  396. package/dist/tui/components/CommandDropdown.js.map +0 -1
  397. package/dist/tui/components/Confirm.d.ts.map +0 -1
  398. package/dist/tui/components/Confirm.js.map +0 -1
  399. package/dist/tui/components/ErrorCard.d.ts.map +0 -1
  400. package/dist/tui/components/ErrorCard.js.map +0 -1
  401. package/dist/tui/components/FooterStatusBar.d.ts.map +0 -1
  402. package/dist/tui/components/FooterStatusBar.js.map +0 -1
  403. package/dist/tui/components/MessageList.d.ts.map +0 -1
  404. package/dist/tui/components/MessageList.js.map +0 -1
  405. package/dist/tui/components/MultiSelect.d.ts.map +0 -1
  406. package/dist/tui/components/MultiSelect.js.map +0 -1
  407. package/dist/tui/components/PasswordInput.d.ts.map +0 -1
  408. package/dist/tui/components/PasswordInput.js.map +0 -1
  409. package/dist/tui/components/PhaseHeader.d.ts.map +0 -1
  410. package/dist/tui/components/PhaseHeader.js.map +0 -1
  411. package/dist/tui/components/Select.d.ts.map +0 -1
  412. package/dist/tui/components/Select.js.map +0 -1
  413. package/dist/tui/components/StatusLine.d.ts.map +0 -1
  414. package/dist/tui/components/StatusLine.js.map +0 -1
  415. package/dist/tui/components/StreamingText.d.ts.map +0 -1
  416. package/dist/tui/components/StreamingText.js.map +0 -1
  417. package/dist/tui/components/ToolCallCard.d.ts.map +0 -1
  418. package/dist/tui/components/ToolCallCard.js.map +0 -1
  419. package/dist/tui/components/WiggumBanner.d.ts.map +0 -1
  420. package/dist/tui/components/WiggumBanner.js.map +0 -1
  421. package/dist/tui/components/WorkingIndicator.d.ts.map +0 -1
  422. package/dist/tui/components/WorkingIndicator.js.map +0 -1
  423. package/dist/tui/components/WorkingIndicator.test.d.ts +0 -2
  424. package/dist/tui/components/WorkingIndicator.test.d.ts.map +0 -1
  425. package/dist/tui/components/WorkingIndicator.test.js +0 -26
  426. package/dist/tui/components/WorkingIndicator.test.js.map +0 -1
  427. package/dist/tui/components/index.d.ts.map +0 -1
  428. package/dist/tui/components/index.js.map +0 -1
  429. package/dist/tui/demo.d.ts +0 -8
  430. package/dist/tui/demo.d.ts.map +0 -1
  431. package/dist/tui/demo.js +0 -69
  432. package/dist/tui/demo.js.map +0 -1
  433. package/dist/tui/hooks/index.d.ts.map +0 -1
  434. package/dist/tui/hooks/index.js.map +0 -1
  435. package/dist/tui/hooks/useCommandHistory.d.ts.map +0 -1
  436. package/dist/tui/hooks/useCommandHistory.js.map +0 -1
  437. package/dist/tui/hooks/useInit.d.ts.map +0 -1
  438. package/dist/tui/hooks/useInit.js.map +0 -1
  439. package/dist/tui/hooks/useSpecGenerator.d.ts.map +0 -1
  440. package/dist/tui/hooks/useSpecGenerator.js.map +0 -1
  441. package/dist/tui/hooks/useSync.d.ts.map +0 -1
  442. package/dist/tui/hooks/useSync.js.map +0 -1
  443. package/dist/tui/index.d.ts.map +0 -1
  444. package/dist/tui/index.js.map +0 -1
  445. package/dist/tui/orchestration/index.d.ts.map +0 -1
  446. package/dist/tui/orchestration/index.js.map +0 -1
  447. package/dist/tui/orchestration/interview-orchestrator.d.ts.map +0 -1
  448. package/dist/tui/orchestration/interview-orchestrator.js.map +0 -1
  449. package/dist/tui/screens/InitScreen.d.ts.map +0 -1
  450. package/dist/tui/screens/InitScreen.js.map +0 -1
  451. package/dist/tui/screens/InterviewScreen.d.ts.map +0 -1
  452. package/dist/tui/screens/InterviewScreen.integration.test.d.ts +0 -7
  453. package/dist/tui/screens/InterviewScreen.integration.test.d.ts.map +0 -1
  454. package/dist/tui/screens/InterviewScreen.integration.test.js +0 -149
  455. package/dist/tui/screens/InterviewScreen.integration.test.js.map +0 -1
  456. package/dist/tui/screens/InterviewScreen.js.map +0 -1
  457. package/dist/tui/screens/MainShell.d.ts.map +0 -1
  458. package/dist/tui/screens/MainShell.js.map +0 -1
  459. package/dist/tui/screens/MainShell.test.d.ts +0 -2
  460. package/dist/tui/screens/MainShell.test.d.ts.map +0 -1
  461. package/dist/tui/screens/MainShell.test.js +0 -103
  462. package/dist/tui/screens/MainShell.test.js.map +0 -1
  463. package/dist/tui/screens/RunScreen.d.ts.map +0 -1
  464. package/dist/tui/screens/RunScreen.js.map +0 -1
  465. package/dist/tui/screens/WelcomeScreen.d.ts +0 -45
  466. package/dist/tui/screens/WelcomeScreen.d.ts.map +0 -1
  467. package/dist/tui/screens/WelcomeScreen.js +0 -55
  468. package/dist/tui/screens/WelcomeScreen.js.map +0 -1
  469. package/dist/tui/screens/WelcomeScreen.test.d.ts +0 -2
  470. package/dist/tui/screens/WelcomeScreen.test.d.ts.map +0 -1
  471. package/dist/tui/screens/WelcomeScreen.test.js +0 -51
  472. package/dist/tui/screens/WelcomeScreen.test.js.map +0 -1
  473. package/dist/tui/screens/index.d.ts.map +0 -1
  474. package/dist/tui/screens/index.js.map +0 -1
  475. package/dist/tui/theme.d.ts.map +0 -1
  476. package/dist/tui/theme.js.map +0 -1
  477. package/dist/tui/types/interview.d.ts.map +0 -1
  478. package/dist/tui/types/interview.js.map +0 -1
  479. package/dist/tui/utils/input-utils.d.ts.map +0 -1
  480. package/dist/tui/utils/input-utils.js.map +0 -1
  481. package/dist/tui/utils/loop-status.d.ts.map +0 -1
  482. package/dist/tui/utils/loop-status.js.map +0 -1
  483. package/dist/utils/colors.d.ts.map +0 -1
  484. package/dist/utils/colors.js.map +0 -1
  485. package/dist/utils/config.d.ts.map +0 -1
  486. package/dist/utils/config.js.map +0 -1
  487. package/dist/utils/env.d.ts.map +0 -1
  488. package/dist/utils/env.js.map +0 -1
  489. package/dist/utils/header.d.ts.map +0 -1
  490. package/dist/utils/header.js.map +0 -1
  491. package/dist/utils/json-repair.d.ts.map +0 -1
  492. package/dist/utils/json-repair.js.map +0 -1
  493. package/dist/utils/logger.d.ts.map +0 -1
  494. package/dist/utils/logger.js.map +0 -1
  495. package/dist/utils/spinner.d.ts.map +0 -1
  496. package/dist/utils/spinner.js.map +0 -1
  497. package/dist/utils/tracing.d.ts.map +0 -1
  498. package/dist/utils/tracing.js.map +0 -1
  499. package/dist/utils/tui.d.ts.map +0 -1
  500. package/dist/utils/tui.js.map +0 -1
  501. package/dist/utils/update-check.d.ts.map +0 -1
  502. package/dist/utils/update-check.js.map +0 -1
@@ -5,20 +5,49 @@ import { execFileSync } from 'node:child_process';
5
5
  import { existsSync, readFileSync } from 'node:fs';
6
6
  import { join } from 'node:path';
7
7
  import { loadConfigWithDefaults } from '../../utils/config.js';
8
+ import { logger } from '../../utils/logger.js';
9
+ /**
10
+ * Track whether pgrep is available to avoid repeated failed calls.
11
+ * null = untested, true = available, false = unavailable
12
+ */
13
+ let pgrepAvailable = null;
8
14
  /**
9
15
  * Check if a process matching pattern is running.
10
16
  */
11
17
  function isProcessRunning(pattern) {
18
+ if (pgrepAvailable === false)
19
+ return false;
12
20
  try {
13
21
  const result = execFileSync('pgrep', ['-f', pattern], { encoding: 'utf-8' });
22
+ pgrepAvailable = true;
14
23
  return result.trim().length > 0;
15
24
  }
16
- catch {
25
+ catch (err) {
26
+ // pgrep exits with code 1 when no processes match — that's expected
27
+ if (err && typeof err === 'object' && 'status' in err && err.status === 1) {
28
+ pgrepAvailable = true;
29
+ return false;
30
+ }
31
+ // Any other error (pgrep not installed, permission denied, etc.)
32
+ if (pgrepAvailable === null) {
33
+ logger.warn(`Process detection unavailable: ${err instanceof Error ? err.message : String(err)}. Background run status may be inaccurate.`);
34
+ pgrepAvailable = false;
35
+ }
17
36
  return false;
18
37
  }
19
38
  }
20
39
  /**
21
- * Detect current phase of the loop based on active prompt files.
40
+ * Return the conventional log file path for a feature loop.
41
+ */
42
+ export function getLoopLogPath(feature) {
43
+ return `/tmp/ralph-loop-${feature}.log`;
44
+ }
45
+ /**
46
+ * Detect current phase of the loop by checking for processes with prompt file patterns in their command line.
47
+ *
48
+ * Note: prompt-file checks (PROMPT_feature.md, etc.) are global — they match any
49
+ * running process, not just the one for `feature`. This is acceptable because
50
+ * concurrent loops are rare, but callers should be aware of the limitation.
22
51
  */
23
52
  export function detectPhase(feature) {
24
53
  if (isProcessRunning('PROMPT_feature.md'))
@@ -38,9 +67,18 @@ export function detectPhase(feature) {
38
67
  return 'Idle';
39
68
  }
40
69
  /**
41
- * Read status from temp files.
70
+ * Read loop status from temp files written by feature-loop.sh.
71
+ *
72
+ * Reads `ralph-loop-<feature>.status` (or `.final`) for iteration progress
73
+ * and `ralph-loop-<feature>.tokens` for token counts. Also runs `pgrep` to
74
+ * check whether the loop process is still alive.
75
+ *
76
+ * @throws {Error} If `feature` contains invalid characters.
42
77
  */
43
78
  export function readLoopStatus(feature) {
79
+ if (!/^[a-zA-Z0-9_-]+$/.test(feature)) {
80
+ throw new Error(`Invalid feature name: "${feature}". Must contain only letters, numbers, hyphens, and underscores.`);
81
+ }
44
82
  const statusFile = `/tmp/ralph-loop-${feature}.status`;
45
83
  const finalStatusFile = `/tmp/ralph-loop-${feature}.final`;
46
84
  const tokensFile = `/tmp/ralph-loop-${feature}.tokens`;
@@ -54,8 +92,8 @@ export function readLoopStatus(feature) {
54
92
  iteration = parseInt(parts[0] || '0', 10) || 0;
55
93
  maxIterations = parseInt(parts[1] || '0', 10) || 0;
56
94
  }
57
- catch {
58
- // Ignore parse errors
95
+ catch (err) {
96
+ logger.debug(`Failed to parse status file: ${err instanceof Error ? err.message : String(err)}`);
59
97
  }
60
98
  }
61
99
  let tokensInput = 0;
@@ -67,8 +105,8 @@ export function readLoopStatus(feature) {
67
105
  tokensInput = parseInt(parts[0] || '0', 10) || 0;
68
106
  tokensOutput = parseInt(parts[1] || '0', 10) || 0;
69
107
  }
70
- catch {
71
- // Ignore parse errors
108
+ catch (err) {
109
+ logger.debug(`Failed to parse tokens file: ${err instanceof Error ? err.message : String(err)}`);
72
110
  }
73
111
  }
74
112
  return {
@@ -81,12 +119,23 @@ export function readLoopStatus(feature) {
81
119
  };
82
120
  }
83
121
  /**
84
- * Parse implementation plan for task counts.
122
+ * Parse the markdown implementation plan for a feature to extract task/E2E counts.
123
+ *
124
+ * Looks for `- [x]` (done) and `- [ ]` (pending) checklist items.
125
+ * Items containing "E2E:" are counted separately as end-to-end tests.
126
+ *
127
+ * @returns Counts of done/pending tasks and E2E tests.
85
128
  */
86
129
  export async function parseImplementationPlan(projectRoot, feature, specsDirOverride) {
87
- const config = specsDirOverride
88
- ? null
89
- : await loadConfigWithDefaults(projectRoot);
130
+ let config = null;
131
+ if (!specsDirOverride) {
132
+ try {
133
+ config = await loadConfigWithDefaults(projectRoot);
134
+ }
135
+ catch (err) {
136
+ logger.debug(`Failed to load config for plan parsing: ${err instanceof Error ? err.message : String(err)}`);
137
+ }
138
+ }
90
139
  const specsDir = specsDirOverride || config?.paths.specs || '.ralph/specs';
91
140
  const planPath = join(projectRoot, specsDir, `${feature}-implementation-plan.md`);
92
141
  let tasksDone = 0;
@@ -117,8 +166,8 @@ export async function parseImplementationPlan(projectRoot, feature, specsDirOver
117
166
  }
118
167
  }
119
168
  }
120
- catch {
121
- // Ignore parse errors
169
+ catch (err) {
170
+ logger.debug(`Failed to parse implementation plan: ${err instanceof Error ? err.message : String(err)}`);
122
171
  }
123
172
  }
124
173
  return { tasksDone, tasksPending, e2eDone, e2ePending };
@@ -131,9 +180,10 @@ export function getGitBranch(projectRoot) {
131
180
  return execFileSync('git', ['branch', '--show-current'], {
132
181
  cwd: projectRoot,
133
182
  encoding: 'utf-8',
134
- }).trim();
183
+ }).trim() || '(detached HEAD)';
135
184
  }
136
- catch {
185
+ catch (err) {
186
+ logger.debug(`getGitBranch failed: ${err instanceof Error ? err.message : String(err)}`);
137
187
  return '-';
138
188
  }
139
189
  }
@@ -149,4 +199,3 @@ export function formatNumber(num) {
149
199
  }
150
200
  return String(num);
151
201
  }
152
- //# sourceMappingURL=loop-status.js.map
@@ -92,4 +92,3 @@ export declare function nextStepsBox(steps: Array<{
92
92
  */
93
93
  export declare const PASSWORD_MASK_LENGTH = 32;
94
94
  export declare const PASSWORD_MASK: string;
95
- //# sourceMappingURL=colors.d.ts.map
@@ -203,4 +203,3 @@ export function nextStepsBox(steps) {
203
203
  */
204
204
  export const PASSWORD_MASK_LENGTH = 32;
205
205
  export const PASSWORD_MASK = '▪'.repeat(PASSWORD_MASK_LENGTH);
206
- //# sourceMappingURL=colors.js.map
@@ -93,4 +93,3 @@ export declare function getScriptsDir(projectRoot: string): Promise<string>;
93
93
  * Get loop settings with defaults
94
94
  */
95
95
  export declare function getLoopSettings(projectRoot: string): Promise<LoopConfig>;
96
- //# sourceMappingURL=config.d.ts.map
@@ -147,4 +147,3 @@ export async function getLoopSettings(projectRoot) {
147
147
  reviewMode: config?.loop?.reviewMode || DEFAULT_CONFIG.loop.reviewMode,
148
148
  };
149
149
  }
150
- //# sourceMappingURL=config.js.map
@@ -35,4 +35,3 @@ export declare function writeKeysToEnvFile(filePath: string, keys: Record<string
35
35
  * - Malformed lines are skipped without aborting.
36
36
  */
37
37
  export declare function loadApiKeysFromEnvLocal(): void;
38
- //# sourceMappingURL=env.d.ts.map
package/dist/utils/env.js CHANGED
@@ -115,4 +115,3 @@ export function loadApiKeysFromEnvLocal() {
115
115
  logger.debug(`Failed to load env file: ${err instanceof Error ? err.message : String(err)}`);
116
116
  }
117
117
  }
118
- //# sourceMappingURL=env.js.map
@@ -6,4 +6,3 @@ export declare function displayHeader(): void;
6
6
  * Display a minimal header (for subcommands)
7
7
  */
8
8
  export declare function displayMinimalHeader(): void;
9
- //# sourceMappingURL=header.d.ts.map
@@ -44,4 +44,3 @@ export function displayMinimalHeader() {
44
44
  console.log(simpson.yellow('Wiggum CLI') + simpson.brown(' │ ') + 'AI-powered Ralph development loop');
45
45
  console.log('');
46
46
  }
47
- //# sourceMappingURL=header.js.map
@@ -11,4 +11,3 @@ export declare function repairJson(text: string): string;
11
11
  * Tries to fix common issues before parsing
12
12
  */
13
13
  export declare function parseJsonSafe<T>(text: string): T | null;
14
- //# sourceMappingURL=json-repair.d.ts.map
@@ -143,4 +143,3 @@ export function parseJsonSafe(text) {
143
143
  }
144
144
  return null;
145
145
  }
146
- //# sourceMappingURL=json-repair.js.map
@@ -8,4 +8,3 @@ export declare const logger: {
8
8
  error(message: string): void;
9
9
  debug(message: string): void;
10
10
  };
11
- //# sourceMappingURL=logger.d.ts.map
@@ -21,4 +21,3 @@ export const logger = {
21
21
  }
22
22
  },
23
23
  };
24
- //# sourceMappingURL=logger.js.map
@@ -71,4 +71,3 @@ export declare class ShimmerSpinner {
71
71
  * Create a shimmer spinner instance
72
72
  */
73
73
  export declare function createShimmerSpinner(options?: ShimmerSpinnerOptions): ShimmerSpinner;
74
- //# sourceMappingURL=spinner.d.ts.map
@@ -205,4 +205,3 @@ export class ShimmerSpinner {
205
205
  export function createShimmerSpinner(options) {
206
206
  return new ShimmerSpinner(options);
207
207
  }
208
- //# sourceMappingURL=spinner.js.map
@@ -27,4 +27,3 @@ export declare function maybeTraced<T extends (...args: unknown[]) => unknown>(f
27
27
  type?: string;
28
28
  name?: string;
29
29
  }): T;
30
- //# sourceMappingURL=tracing.d.ts.map
@@ -100,4 +100,3 @@ export function maybeTraced(fn, options = {}) {
100
100
  name: options.name || fn.name || 'anonymous',
101
101
  });
102
102
  }
103
- //# sourceMappingURL=tracing.js.map
@@ -58,4 +58,3 @@ export declare function clearThinking(): void;
58
58
  * Format bytes for display
59
59
  */
60
60
  export declare function formatBytes(bytes: number): string;
61
- //# sourceMappingURL=tui.d.ts.map
package/dist/utils/tui.js CHANGED
@@ -211,4 +211,3 @@ export function formatBytes(bytes) {
211
211
  return `${(bytes / 1024).toFixed(1)}KB`;
212
212
  return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
213
213
  }
214
- //# sourceMappingURL=tui.js.map
@@ -18,4 +18,3 @@ export declare function checkForUpdates(): Promise<UpdateInfo | null>;
18
18
  */
19
19
  export declare function notifyIfUpdateAvailable(): Promise<void>;
20
20
  export {};
21
- //# sourceMappingURL=update-check.d.ts.map
@@ -146,4 +146,3 @@ export async function notifyIfUpdateAvailable() {
146
146
  // Fail silently - don't interrupt user workflow
147
147
  }
148
148
  }
149
- //# sourceMappingURL=update-check.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wiggum-cli",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "AI-powered feature development loop CLI",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -9,8 +9,7 @@
9
9
  "bin",
10
10
  "src/templates",
11
11
  "LICENSE",
12
- "README.md",
13
- "CONTRIBUTING.md"
12
+ "README.md"
14
13
  ],
15
14
  "bin": {
16
15
  "wiggum": "bin/ralph.js"
@@ -34,13 +33,16 @@
34
33
  "code-generation",
35
34
  "tech-stack-detection"
36
35
  ],
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/federiconeri/wiggum-cli"
39
+ },
37
40
  "author": "Wiggum CLI Contributors",
38
41
  "license": "SEE LICENSE IN LICENSE",
39
42
  "dependencies": {
40
43
  "@ai-sdk/anthropic": "^3.0.15",
41
44
  "@ai-sdk/openai": "^3.0.12",
42
45
  "@braintrust/otel": "^0.2.0",
43
- "@clack/prompts": "^0.7.0",
44
46
  "@upstash/context7-tools-ai-sdk": "^0.2.1",
45
47
  "ai": "^6.0.41",
46
48
  "braintrust": "^2.0.2",
package/CONTRIBUTING.md DELETED
@@ -1,162 +0,0 @@
1
- # Contributing to Wiggum CLI
2
-
3
- Thanks for your interest in contributing! This guide covers everything you need to get started.
4
-
5
- ## What We Accept
6
-
7
- ### Always welcome
8
- - **Bug fixes** — Found something broken? PRs welcome
9
- - **Documentation** — Improvements, typos, examples, tutorials
10
- - **Scanner detectors** — Add support for new frameworks, tools, or tech stacks
11
- - **Templates** — New spec templates, prompt guides, or workflow examples
12
-
13
- ### Requires discussion first
14
- - **New commands** — Open an issue before coding to align on scope
15
- - **TUI components** — Discuss architecture impacts first
16
- - **Integrations** — New API integrations need maintainer approval
17
- - **Large refactors** — These need alignment first
18
-
19
- ## Getting Started
20
-
21
- ```bash
22
- git clone https://github.com/federiconeri/wiggum-cli.git
23
- cd wiggum-cli
24
- npm install
25
- npm run build
26
- ```
27
-
28
- ### Prerequisites
29
-
30
- - **Node.js** >= 18.0.0
31
- - **npm**
32
- - **Git**
33
-
34
- ## Development
35
-
36
- ### Build
37
-
38
- ```bash
39
- npm run build # Compile TypeScript + copy templates
40
- npm run dev # Watch mode (recompiles on save)
41
- ```
42
-
43
- ### Test
44
-
45
- ```bash
46
- npm test # Run all tests (vitest)
47
- npm run test:watch # Watch mode
48
- ```
49
-
50
- ### Run locally
51
-
52
- ```bash
53
- npm start # Runs bin/ralph.js
54
- # or
55
- node bin/ralph.js
56
- ```
57
-
58
- ## Project Structure
59
-
60
- ```
61
- src/
62
- ├── ai/ # AI agents, conversation management, enhancers
63
- ├── commands/ # CLI command handlers (init, new, run, etc.)
64
- ├── context/ # Project context storage and conversion
65
- ├── generator/ # Template-based file generation
66
- ├── repl/ # REPL/interactive shell logic
67
- ├── scanner/ # Tech stack detection (80+ technologies)
68
- ├── templates/ # Templates for prompts, scripts, configs
69
- ├── terminal/ # Terminal utilities
70
- ├── tui/ # Ink-based terminal UI (screens, components, hooks)
71
- ├── utils/ # Shared utilities (config, env, tracing)
72
- └── index.ts # Entry point
73
- ```
74
-
75
- Tests live next to source files as `*.test.ts`.
76
-
77
- ## Making Changes
78
-
79
- ### Branch naming
80
-
81
- ```
82
- feat/short-description # New features
83
- fix/short-description # Bug fixes
84
- chore/short-description # Maintenance, refactoring
85
- docs/short-description # Documentation
86
- ```
87
-
88
- ### Commit messages
89
-
90
- We use [Conventional Commits](https://www.conventionalcommits.org/):
91
-
92
- ```
93
- feat: add spec autocomplete to /run command
94
- fix(tui): handle empty input in interview screen
95
- chore: bump version to 0.11.19
96
- docs: update CLI reference in README
97
- ```
98
-
99
- **Format:** `type(scope): description`
100
-
101
- | Type | When to use |
102
- |------|------------|
103
- | `feat` | New feature or capability |
104
- | `fix` | Bug fix |
105
- | `chore` | Maintenance, deps, version bumps |
106
- | `docs` | Documentation only |
107
- | `refactor` | Code change that neither fixes nor adds a feature |
108
- | `test` | Adding or updating tests |
109
-
110
- Common scopes: `tui`, `ai`, `cli`, `scanner`, `loop`.
111
-
112
- ## Pull Requests
113
-
114
- 1. Fork the repo and create your branch from `main`
115
- 2. Make your changes and add tests if applicable
116
- 3. Ensure `npm test` and `npm run build` pass
117
- 4. Write a clear PR title using the commit convention format
118
- 5. Reference the related issue in your PR description
119
- 6. Keep PRs small and focused — single-purpose PRs are easier to review
120
-
121
- ## Code Style
122
-
123
- - **TypeScript** with strict mode enabled
124
- - **ESM** modules (`import`/`export`, `.js` extensions in imports)
125
- - **React JSX** for TUI components (Ink)
126
- - Run `npm run build` to catch type errors before submitting
127
-
128
- ## Reporting Bugs
129
-
130
- [Open an issue](https://github.com/federiconeri/wiggum-cli/issues/new) with:
131
-
132
- - Steps to reproduce
133
- - Expected vs actual behavior
134
- - Node.js version (`node -v`)
135
- - Wiggum version (`wiggum --version`)
136
- - OS and terminal
137
-
138
- ## Feature Requests
139
-
140
- [Open an issue](https://github.com/federiconeri/wiggum-cli/issues/new) describing:
141
-
142
- - The problem you're trying to solve
143
- - Your proposed solution
144
- - Any alternatives you considered
145
-
146
- ## Out of Scope
147
-
148
- We don't accept PRs for these areas without prior discussion:
149
-
150
- - **Core AI logic** — Maintained internally to ensure consistency and quality
151
- - **Paid features** — Dashboard, API infrastructure, cloud environment, and notification systems are developed separately
152
- - **Large refactors without discussion** — These need alignment with the maintainer first
153
-
154
- PRs in these areas without prior discussion will likely be closed.
155
-
156
- ## Security Issues
157
-
158
- Please don't open a public issue. Email security concerns directly to the maintainers.
159
-
160
- ## License
161
-
162
- By contributing, you agree that your contributions will be licensed under the project's [MIT + Commons Clause license](LICENSE).
@@ -1,17 +0,0 @@
1
- /**
2
- * Data factories for test fixtures
3
- *
4
- * Provides factory functions to build typed test data with sensible defaults.
5
- * Use the `overrides` parameter to customize specific fields per test.
6
- */
7
- import type { SessionState } from '../repl/session-state.js';
8
- import type { ScanResult } from '../scanner/types.js';
9
- /**
10
- * Create a SessionState with sensible defaults.
11
- */
12
- export declare function createTestSessionState(overrides?: Partial<SessionState>): SessionState;
13
- /**
14
- * Create a ScanResult with sensible defaults.
15
- */
16
- export declare function createTestScanResult(overrides?: Partial<ScanResult>): ScanResult;
17
- //# sourceMappingURL=fixtures.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/__test-utils__/fixtures.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,YAAY,CAU1F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,UAAU,CAOpF"}
@@ -1,32 +0,0 @@
1
- /**
2
- * Data factories for test fixtures
3
- *
4
- * Provides factory functions to build typed test data with sensible defaults.
5
- * Use the `overrides` parameter to customize specific fields per test.
6
- */
7
- /**
8
- * Create a SessionState with sensible defaults.
9
- */
10
- export function createTestSessionState(overrides = {}) {
11
- return {
12
- projectRoot: '/tmp/test-project',
13
- config: null,
14
- provider: 'anthropic',
15
- model: 'sonnet',
16
- conversationMode: false,
17
- initialized: true,
18
- ...overrides,
19
- };
20
- }
21
- /**
22
- * Create a ScanResult with sensible defaults.
23
- */
24
- export function createTestScanResult(overrides = {}) {
25
- return {
26
- projectRoot: '/tmp/test-project',
27
- stack: {},
28
- scanTime: 42,
29
- ...overrides,
30
- };
31
- }
32
- //# sourceMappingURL=fixtures.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/__test-utils__/fixtures.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,YAAmC,EAAE;IAC1E,OAAO;QACL,WAAW,EAAE,mBAAmB;QAChC,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,QAAQ;QACf,gBAAgB,EAAE,KAAK;QACvB,WAAW,EAAE,IAAI;QACjB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,YAAiC,EAAE;IACtE,OAAO;QACL,WAAW,EAAE,mBAAmB;QAChC,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE;QACZ,GAAG,SAAS;KACb,CAAC;AACJ,CAAC"}
@@ -1,43 +0,0 @@
1
- /**
2
- * Ink test utilities
3
- *
4
- * Helpers for rendering and interacting with Ink components in tests.
5
- * Built on top of ink-testing-library.
6
- */
7
- import { render } from 'ink-testing-library';
8
- type Instance = ReturnType<typeof render>;
9
- /**
10
- * Wait for a short period to let React effects settle.
11
- */
12
- export declare function wait(ms?: number): Promise<void>;
13
- /**
14
- * Render and wait for effects to settle.
15
- * Returns the ink-testing-library Instance.
16
- *
17
- * IMPORTANT: Always use this (or manually wait after render) before
18
- * writing to stdin, because React 18 useEffect runs asynchronously.
19
- */
20
- export declare function renderAndWait(renderFn: () => Instance, delayMs?: number): Promise<Instance>;
21
- /**
22
- * Strip ANSI escape codes from a string for clean assertions.
23
- */
24
- export declare function stripAnsi(text: string): string;
25
- /**
26
- * Send a string of text as key-by-key input.
27
- * Each character is written individually to simulate real typing,
28
- * which is required because Ink's useInput processes multi-char
29
- * writes as paste events.
30
- *
31
- * Waits before and after writing to allow React effects to settle.
32
- */
33
- export declare function type(instance: Instance, text: string): Promise<void>;
34
- /**
35
- * Press Enter (carriage return).
36
- */
37
- export declare function pressEnter(instance: Instance): void;
38
- /**
39
- * Press Escape.
40
- */
41
- export declare function pressEscape(instance: Instance): void;
42
- export {};
43
- //# sourceMappingURL=ink-helpers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ink-helpers.d.ts","sourceRoot":"","sources":["../../src/__test-utils__/ink-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AAE1C;;GAEG;AACH,wBAAgB,IAAI,CAAC,EAAE,SAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3C;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,QAAQ,EACxB,OAAO,SAAK,GACX,OAAO,CAAC,QAAQ,CAAC,CAInB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED;;;;;;;GAOG;AACH,wBAAsB,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAEnD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAEpD"}
@@ -1,62 +0,0 @@
1
- /**
2
- * Ink test utilities
3
- *
4
- * Helpers for rendering and interacting with Ink components in tests.
5
- * Built on top of ink-testing-library.
6
- */
7
- /**
8
- * Wait for a short period to let React effects settle.
9
- */
10
- export function wait(ms = 50) {
11
- return new Promise((resolve) => setTimeout(resolve, ms));
12
- }
13
- /**
14
- * Render and wait for effects to settle.
15
- * Returns the ink-testing-library Instance.
16
- *
17
- * IMPORTANT: Always use this (or manually wait after render) before
18
- * writing to stdin, because React 18 useEffect runs asynchronously.
19
- */
20
- export async function renderAndWait(renderFn, delayMs = 50) {
21
- const instance = renderFn();
22
- await wait(delayMs);
23
- return instance;
24
- }
25
- /**
26
- * Strip ANSI escape codes from a string for clean assertions.
27
- */
28
- export function stripAnsi(text) {
29
- // eslint-disable-next-line no-control-regex
30
- return text.replace(/\u001b\[[0-9;]*m/g, '');
31
- }
32
- /**
33
- * Send a string of text as key-by-key input.
34
- * Each character is written individually to simulate real typing,
35
- * which is required because Ink's useInput processes multi-char
36
- * writes as paste events.
37
- *
38
- * Waits before and after writing to allow React effects to settle.
39
- */
40
- export async function type(instance, text) {
41
- for (const char of text) {
42
- instance.stdin.write(char);
43
- // Yield to let React commit the state update before the next char.
44
- // Without this, React batches consecutive synchronous writes and
45
- // only the last write in each batch survives (stale closure values).
46
- await new Promise((resolve) => setTimeout(resolve, 0));
47
- }
48
- await wait(30);
49
- }
50
- /**
51
- * Press Enter (carriage return).
52
- */
53
- export function pressEnter(instance) {
54
- instance.stdin.write('\r');
55
- }
56
- /**
57
- * Press Escape.
58
- */
59
- export function pressEscape(instance) {
60
- instance.stdin.write('\u001b');
61
- }
62
- //# sourceMappingURL=ink-helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ink-helpers.js","sourceRoot":"","sources":["../../src/__test-utils__/ink-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,EAAE,GAAG,EAAE;IAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAwB,EACxB,OAAO,GAAG,EAAE;IAEZ,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC;IAC5B,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,4CAA4C;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,QAAkB,EAAE,IAAY;IACzD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,mEAAmE;QACnE,iEAAiE;QACjE,qEAAqE;QACrE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAkB;IAC3C,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAkB;IAC5C,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC"}