@codemieai/code 0.0.2 → 0.0.4

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 (360) hide show
  1. package/README.md +357 -719
  2. package/bin/codemie-claude.js +145 -0
  3. package/bin/codemie-code.js +128 -15
  4. package/bin/codemie-codex.js +137 -0
  5. package/bin/codemie.js +1 -1
  6. package/dist/agents/adapters/claude-code.d.ts +7 -2
  7. package/dist/agents/adapters/claude-code.d.ts.map +1 -1
  8. package/dist/agents/adapters/claude-code.js +94 -58
  9. package/dist/agents/adapters/claude-code.js.map +1 -1
  10. package/dist/agents/adapters/codemie-code.d.ts +11 -2
  11. package/dist/agents/adapters/codemie-code.d.ts.map +1 -1
  12. package/dist/agents/adapters/codemie-code.js +93 -25
  13. package/dist/agents/adapters/codemie-code.js.map +1 -1
  14. package/dist/agents/adapters/codex.d.ts +7 -2
  15. package/dist/agents/adapters/codex.d.ts.map +1 -1
  16. package/dist/agents/adapters/codex.js +104 -39
  17. package/dist/agents/adapters/codex.js.map +1 -1
  18. package/dist/agents/codemie-code/agent.d.ts +89 -0
  19. package/dist/agents/codemie-code/agent.d.ts.map +1 -0
  20. package/dist/agents/codemie-code/agent.js +689 -0
  21. package/dist/agents/codemie-code/agent.js.map +1 -0
  22. package/dist/agents/codemie-code/config.d.ts +40 -0
  23. package/dist/agents/codemie-code/config.d.ts.map +1 -0
  24. package/dist/agents/codemie-code/config.js +278 -0
  25. package/dist/agents/codemie-code/config.js.map +1 -0
  26. package/dist/agents/codemie-code/filters.d.ts +91 -0
  27. package/dist/agents/codemie-code/filters.d.ts.map +1 -0
  28. package/dist/agents/codemie-code/filters.js +328 -0
  29. package/dist/agents/codemie-code/filters.js.map +1 -0
  30. package/dist/agents/codemie-code/index.d.ts +92 -0
  31. package/dist/agents/codemie-code/index.d.ts.map +1 -0
  32. package/dist/agents/codemie-code/index.js +327 -0
  33. package/dist/agents/codemie-code/index.js.map +1 -0
  34. package/dist/agents/codemie-code/modes/contextAwarePlanning.d.ts +87 -0
  35. package/dist/agents/codemie-code/modes/contextAwarePlanning.d.ts.map +1 -0
  36. package/dist/agents/codemie-code/modes/contextAwarePlanning.js +957 -0
  37. package/dist/agents/codemie-code/modes/contextAwarePlanning.js.map +1 -0
  38. package/dist/agents/codemie-code/modes/planMode.d.ts +116 -0
  39. package/dist/agents/codemie-code/modes/planMode.d.ts.map +1 -0
  40. package/dist/agents/codemie-code/modes/planMode.js +537 -0
  41. package/dist/agents/codemie-code/modes/planMode.js.map +1 -0
  42. package/dist/agents/codemie-code/prompts.d.ts +40 -0
  43. package/dist/agents/codemie-code/prompts.d.ts.map +1 -0
  44. package/dist/agents/codemie-code/prompts.js +160 -0
  45. package/dist/agents/codemie-code/prompts.js.map +1 -0
  46. package/dist/agents/codemie-code/storage/todoStorage.d.ts +78 -0
  47. package/dist/agents/codemie-code/storage/todoStorage.d.ts.map +1 -0
  48. package/dist/agents/codemie-code/storage/todoStorage.js +225 -0
  49. package/dist/agents/codemie-code/storage/todoStorage.js.map +1 -0
  50. package/dist/agents/codemie-code/tokenUtils.d.ts +108 -0
  51. package/dist/agents/codemie-code/tokenUtils.d.ts.map +1 -0
  52. package/dist/agents/codemie-code/tokenUtils.js +220 -0
  53. package/dist/agents/codemie-code/tokenUtils.js.map +1 -0
  54. package/dist/agents/codemie-code/toolMetadata.d.ts +15 -0
  55. package/dist/agents/codemie-code/toolMetadata.d.ts.map +1 -0
  56. package/dist/agents/codemie-code/toolMetadata.js +315 -0
  57. package/dist/agents/codemie-code/toolMetadata.js.map +1 -0
  58. package/dist/agents/codemie-code/tools/index.d.ts +45 -0
  59. package/dist/agents/codemie-code/tools/index.d.ts.map +1 -0
  60. package/dist/agents/codemie-code/tools/index.js +407 -0
  61. package/dist/agents/codemie-code/tools/index.js.map +1 -0
  62. package/dist/agents/codemie-code/tools/planning.d.ts +53 -0
  63. package/dist/agents/codemie-code/tools/planning.d.ts.map +1 -0
  64. package/dist/agents/codemie-code/tools/planning.js +224 -0
  65. package/dist/agents/codemie-code/tools/planning.js.map +1 -0
  66. package/dist/agents/codemie-code/types.d.ts +418 -0
  67. package/dist/agents/codemie-code/types.d.ts.map +1 -0
  68. package/dist/agents/codemie-code/types.js +35 -0
  69. package/dist/agents/codemie-code/types.js.map +1 -0
  70. package/dist/agents/codemie-code/ui/progressTracker.d.ts +125 -0
  71. package/dist/agents/codemie-code/ui/progressTracker.d.ts.map +1 -0
  72. package/dist/agents/codemie-code/ui/progressTracker.js +343 -0
  73. package/dist/agents/codemie-code/ui/progressTracker.js.map +1 -0
  74. package/dist/agents/codemie-code/ui/todoPanel.d.ts +112 -0
  75. package/dist/agents/codemie-code/ui/todoPanel.d.ts.map +1 -0
  76. package/dist/agents/codemie-code/ui/todoPanel.js +318 -0
  77. package/dist/agents/codemie-code/ui/todoPanel.js.map +1 -0
  78. package/dist/agents/codemie-code/ui.d.ts +179 -0
  79. package/dist/agents/codemie-code/ui.d.ts.map +1 -0
  80. package/dist/agents/codemie-code/ui.js +1408 -0
  81. package/dist/agents/codemie-code/ui.js.map +1 -0
  82. package/dist/agents/codemie-code/utils/progressionEnforcer.d.ts +87 -0
  83. package/dist/agents/codemie-code/utils/progressionEnforcer.d.ts.map +1 -0
  84. package/dist/agents/codemie-code/utils/progressionEnforcer.js +293 -0
  85. package/dist/agents/codemie-code/utils/progressionEnforcer.js.map +1 -0
  86. package/dist/agents/codemie-code/utils/todoParser.d.ts +41 -0
  87. package/dist/agents/codemie-code/utils/todoParser.d.ts.map +1 -0
  88. package/dist/agents/codemie-code/utils/todoParser.js +305 -0
  89. package/dist/agents/codemie-code/utils/todoParser.js.map +1 -0
  90. package/dist/agents/codemie-code/utils/todoValidator.d.ts +65 -0
  91. package/dist/agents/codemie-code/utils/todoValidator.d.ts.map +1 -0
  92. package/dist/agents/codemie-code/utils/todoValidator.js +249 -0
  93. package/dist/agents/codemie-code/utils/todoValidator.js.map +1 -0
  94. package/dist/agents/codemie-code/validators/planValidator.d.ts +94 -0
  95. package/dist/agents/codemie-code/validators/planValidator.d.ts.map +1 -0
  96. package/dist/agents/codemie-code/validators/planValidator.js +281 -0
  97. package/dist/agents/codemie-code/validators/planValidator.js.map +1 -0
  98. package/dist/agents/registry.d.ts +1 -1
  99. package/dist/agents/registry.d.ts.map +1 -1
  100. package/dist/agents/registry.js +11 -15
  101. package/dist/agents/registry.js.map +1 -1
  102. package/dist/cli/commands/auth.d.ts +3 -0
  103. package/dist/cli/commands/auth.d.ts.map +1 -0
  104. package/dist/cli/commands/auth.js +170 -0
  105. package/dist/cli/commands/auth.js.map +1 -0
  106. package/dist/cli/commands/config.d.ts +3 -0
  107. package/dist/cli/commands/config.d.ts.map +1 -0
  108. package/dist/cli/commands/config.js +350 -0
  109. package/dist/cli/commands/config.js.map +1 -0
  110. package/dist/cli/commands/doctor.d.ts.map +1 -1
  111. package/dist/cli/commands/doctor.js +308 -71
  112. package/dist/cli/commands/doctor.js.map +1 -1
  113. package/dist/cli/commands/env.d.ts +3 -0
  114. package/dist/cli/commands/env.d.ts.map +1 -0
  115. package/dist/cli/commands/env.js +19 -0
  116. package/dist/cli/commands/env.js.map +1 -0
  117. package/dist/cli/commands/install.d.ts.map +1 -1
  118. package/dist/cli/commands/install.js +28 -33
  119. package/dist/cli/commands/install.js.map +1 -1
  120. package/dist/cli/commands/list.js +18 -24
  121. package/dist/cli/commands/list.js.map +1 -1
  122. package/dist/cli/commands/run.d.ts.map +1 -1
  123. package/dist/cli/commands/run.js +297 -31
  124. package/dist/cli/commands/run.js.map +1 -1
  125. package/dist/cli/commands/setup.d.ts +3 -0
  126. package/dist/cli/commands/setup.d.ts.map +1 -0
  127. package/dist/cli/commands/setup.js +523 -0
  128. package/dist/cli/commands/setup.js.map +1 -0
  129. package/dist/cli/commands/tools.d.ts +6 -0
  130. package/dist/cli/commands/tools.d.ts.map +1 -0
  131. package/dist/cli/commands/tools.js +244 -0
  132. package/dist/cli/commands/tools.js.map +1 -0
  133. package/dist/cli/commands/uninstall.js +24 -30
  134. package/dist/cli/commands/uninstall.js.map +1 -1
  135. package/dist/cli/commands/version.d.ts.map +1 -1
  136. package/dist/cli/commands/version.js +11 -16
  137. package/dist/cli/commands/version.js.map +1 -1
  138. package/dist/cli/commands/workflow.d.ts +6 -0
  139. package/dist/cli/commands/workflow.d.ts.map +1 -0
  140. package/dist/cli/commands/workflow.js +424 -0
  141. package/dist/cli/commands/workflow.js.map +1 -0
  142. package/dist/cli/index.js +85 -35
  143. package/dist/cli/index.js.map +1 -1
  144. package/dist/clients/adapters/github.d.ts +17 -0
  145. package/dist/clients/adapters/github.d.ts.map +1 -0
  146. package/dist/clients/adapters/github.js +150 -0
  147. package/dist/clients/adapters/github.js.map +1 -0
  148. package/dist/clients/adapters/gitlab.d.ts +17 -0
  149. package/dist/clients/adapters/gitlab.d.ts.map +1 -0
  150. package/dist/clients/adapters/gitlab.js +147 -0
  151. package/dist/clients/adapters/gitlab.js.map +1 -0
  152. package/dist/clients/registry.d.ts +20 -0
  153. package/dist/clients/registry.d.ts.map +1 -0
  154. package/dist/clients/registry.js +27 -0
  155. package/dist/clients/registry.js.map +1 -0
  156. package/dist/env/manager.js +9 -46
  157. package/dist/env/manager.js.map +1 -1
  158. package/dist/index.d.ts +6 -13
  159. package/dist/index.d.ts.map +1 -1
  160. package/dist/index.js +6 -43
  161. package/dist/index.js.map +1 -1
  162. package/dist/tools/detector.d.ts +33 -0
  163. package/dist/tools/detector.d.ts.map +1 -0
  164. package/dist/tools/detector.js +145 -0
  165. package/dist/tools/detector.js.map +1 -0
  166. package/dist/tools/index.d.ts +8 -0
  167. package/dist/tools/index.d.ts.map +1 -0
  168. package/dist/tools/index.js +8 -0
  169. package/dist/tools/index.js.map +1 -0
  170. package/dist/tools/manager.d.ts +21 -0
  171. package/dist/tools/manager.d.ts.map +1 -0
  172. package/dist/tools/manager.js +104 -0
  173. package/dist/tools/manager.js.map +1 -0
  174. package/dist/tools/registry.d.ts +8 -0
  175. package/dist/tools/registry.d.ts.map +1 -0
  176. package/dist/tools/registry.js +36 -0
  177. package/dist/tools/registry.js.map +1 -0
  178. package/dist/tools/types.d.ts +41 -0
  179. package/dist/tools/types.d.ts.map +1 -0
  180. package/dist/tools/types.js +5 -0
  181. package/dist/tools/types.js.map +1 -0
  182. package/dist/types/sso.d.ts +42 -0
  183. package/dist/types/sso.d.ts.map +1 -0
  184. package/dist/types/sso.js +2 -0
  185. package/dist/types/sso.js.map +1 -0
  186. package/dist/utils/agent-compatibility.d.ts +32 -0
  187. package/dist/utils/agent-compatibility.d.ts.map +1 -0
  188. package/dist/utils/agent-compatibility.js +140 -0
  189. package/dist/utils/agent-compatibility.js.map +1 -0
  190. package/dist/utils/async-tips.d.ts.map +1 -1
  191. package/dist/utils/async-tips.js +16 -55
  192. package/dist/utils/async-tips.js.map +1 -1
  193. package/dist/utils/clipboard.d.ts +16 -0
  194. package/dist/utils/clipboard.d.ts.map +1 -0
  195. package/dist/utils/clipboard.js +179 -0
  196. package/dist/utils/clipboard.js.map +1 -0
  197. package/dist/utils/codemie-integration-validator.d.ts +17 -0
  198. package/dist/utils/codemie-integration-validator.d.ts.map +1 -0
  199. package/dist/utils/codemie-integration-validator.js +105 -0
  200. package/dist/utils/codemie-integration-validator.js.map +1 -0
  201. package/dist/utils/codemie-model-fetcher.d.ts +11 -0
  202. package/dist/utils/codemie-model-fetcher.d.ts.map +1 -0
  203. package/dist/utils/codemie-model-fetcher.js +242 -0
  204. package/dist/utils/codemie-model-fetcher.js.map +1 -0
  205. package/dist/utils/config-loader.d.ts +118 -0
  206. package/dist/utils/config-loader.d.ts.map +1 -0
  207. package/dist/utils/config-loader.js +397 -0
  208. package/dist/utils/config-loader.js.map +1 -0
  209. package/dist/utils/credential-store.d.ts +16 -0
  210. package/dist/utils/credential-store.d.ts.map +1 -0
  211. package/dist/utils/credential-store.js +109 -0
  212. package/dist/utils/credential-store.js.map +1 -0
  213. package/dist/utils/dirname.d.ts +7 -0
  214. package/dist/utils/dirname.d.ts.map +1 -0
  215. package/dist/utils/dirname.js +11 -0
  216. package/dist/utils/dirname.js.map +1 -0
  217. package/dist/utils/errors.js +7 -17
  218. package/dist/utils/errors.js.map +1 -1
  219. package/dist/utils/exec.js +3 -6
  220. package/dist/utils/exec.js.map +1 -1
  221. package/dist/utils/first-time.d.ts +34 -0
  222. package/dist/utils/first-time.d.ts.map +1 -0
  223. package/dist/utils/first-time.js +226 -0
  224. package/dist/utils/first-time.js.map +1 -0
  225. package/dist/utils/health-checker.d.ts +20 -0
  226. package/dist/utils/health-checker.d.ts.map +1 -0
  227. package/dist/utils/health-checker.js +172 -0
  228. package/dist/utils/health-checker.js.map +1 -0
  229. package/dist/utils/logger.js +12 -18
  230. package/dist/utils/logger.js.map +1 -1
  231. package/dist/utils/model-fetcher.d.ts +21 -0
  232. package/dist/utils/model-fetcher.d.ts.map +1 -0
  233. package/dist/utils/model-fetcher.js +150 -0
  234. package/dist/utils/model-fetcher.js.map +1 -0
  235. package/dist/utils/sso-auth.d.ts +15 -0
  236. package/dist/utils/sso-auth.d.ts.map +1 -0
  237. package/dist/utils/sso-auth.js +207 -0
  238. package/dist/utils/sso-auth.js.map +1 -0
  239. package/dist/utils/sso-gateway.d.ts +47 -0
  240. package/dist/utils/sso-gateway.d.ts.map +1 -0
  241. package/dist/utils/sso-gateway.js +298 -0
  242. package/dist/utils/sso-gateway.js.map +1 -0
  243. package/dist/utils/tips.d.ts.map +1 -1
  244. package/dist/utils/tips.js +13 -52
  245. package/dist/utils/tips.js.map +1 -1
  246. package/dist/workflows/detector.d.ts +37 -0
  247. package/dist/workflows/detector.d.ts.map +1 -0
  248. package/dist/workflows/detector.js +160 -0
  249. package/dist/workflows/detector.js.map +1 -0
  250. package/dist/workflows/index.d.ts +8 -0
  251. package/dist/workflows/index.d.ts.map +1 -0
  252. package/dist/workflows/index.js +8 -0
  253. package/dist/workflows/index.js.map +1 -0
  254. package/dist/workflows/installer.d.ts +24 -0
  255. package/dist/workflows/installer.d.ts.map +1 -0
  256. package/dist/workflows/installer.js +105 -0
  257. package/dist/workflows/installer.js.map +1 -0
  258. package/dist/workflows/registry.d.ts +29 -0
  259. package/dist/workflows/registry.d.ts.map +1 -0
  260. package/dist/workflows/registry.js +54 -0
  261. package/dist/workflows/registry.js.map +1 -0
  262. package/dist/workflows/templates/github/metadata.d.ts +6 -0
  263. package/dist/workflows/templates/github/metadata.d.ts.map +1 -0
  264. package/dist/workflows/templates/github/metadata.js +111 -0
  265. package/dist/workflows/templates/github/metadata.js.map +1 -0
  266. package/dist/workflows/templates/gitlab/metadata.d.ts +6 -0
  267. package/dist/workflows/templates/gitlab/metadata.d.ts.map +1 -0
  268. package/dist/workflows/templates/gitlab/metadata.js +14 -0
  269. package/dist/workflows/templates/gitlab/metadata.js.map +1 -0
  270. package/dist/workflows/types.d.ts +71 -0
  271. package/dist/workflows/types.d.ts.map +1 -0
  272. package/dist/workflows/types.js +5 -0
  273. package/dist/workflows/types.js.map +1 -0
  274. package/package.json +32 -25
  275. package/src/workflows/templates/github/code-ci.yml +529 -0
  276. package/src/workflows/templates/github/inline-fix.yml +665 -0
  277. package/src/workflows/templates/github/pr-review.yml +677 -0
  278. package/.claude/agents/README.md +0 -298
  279. package/.claude/agents/release-manager.md +0 -857
  280. package/.codemie/guides/git-workflow.md +0 -493
  281. package/CLAUDE.md +0 -855
  282. package/dist/agents/adapters/aider.d.ts +0 -12
  283. package/dist/agents/adapters/aider.d.ts.map +0 -1
  284. package/dist/agents/adapters/aider.js +0 -80
  285. package/dist/agents/adapters/aider.js.map +0 -1
  286. package/dist/cli/cli.d.ts +0 -4
  287. package/dist/cli/cli.d.ts.map +0 -1
  288. package/dist/cli/cli.js +0 -107
  289. package/dist/cli/cli.js.map +0 -1
  290. package/dist/cli/commands/mcp.d.ts +0 -3
  291. package/dist/cli/commands/mcp.d.ts.map +0 -1
  292. package/dist/cli/commands/mcp.js +0 -459
  293. package/dist/cli/commands/mcp.js.map +0 -1
  294. package/dist/code/agent-events.d.ts +0 -39
  295. package/dist/code/agent-events.d.ts.map +0 -1
  296. package/dist/code/agent-events.js +0 -4
  297. package/dist/code/agent-events.js.map +0 -1
  298. package/dist/code/agent.d.ts +0 -19
  299. package/dist/code/agent.d.ts.map +0 -1
  300. package/dist/code/agent.js +0 -144
  301. package/dist/code/agent.js.map +0 -1
  302. package/dist/code/config.d.ts +0 -13
  303. package/dist/code/config.d.ts.map +0 -1
  304. package/dist/code/config.js +0 -41
  305. package/dist/code/config.js.map +0 -1
  306. package/dist/code/index.d.ts +0 -19
  307. package/dist/code/index.d.ts.map +0 -1
  308. package/dist/code/index.js +0 -400
  309. package/dist/code/index.js.map +0 -1
  310. package/dist/code/prompts.d.ts +0 -2
  311. package/dist/code/prompts.d.ts.map +0 -1
  312. package/dist/code/prompts.js +0 -45
  313. package/dist/code/prompts.js.map +0 -1
  314. package/dist/code/tools/command.d.ts +0 -8
  315. package/dist/code/tools/command.d.ts.map +0 -1
  316. package/dist/code/tools/command.js +0 -83
  317. package/dist/code/tools/command.js.map +0 -1
  318. package/dist/code/tools/diff-utils.d.ts +0 -2
  319. package/dist/code/tools/diff-utils.d.ts.map +0 -1
  320. package/dist/code/tools/diff-utils.js +0 -45
  321. package/dist/code/tools/diff-utils.js.map +0 -1
  322. package/dist/code/tools/filesystem.d.ts +0 -11
  323. package/dist/code/tools/filesystem.d.ts.map +0 -1
  324. package/dist/code/tools/filesystem.js +0 -442
  325. package/dist/code/tools/filesystem.js.map +0 -1
  326. package/dist/code/tools/git.d.ts +0 -7
  327. package/dist/code/tools/git.d.ts.map +0 -1
  328. package/dist/code/tools/git.js +0 -111
  329. package/dist/code/tools/git.js.map +0 -1
  330. package/dist/code/tools/mcp.d.ts +0 -13
  331. package/dist/code/tools/mcp.d.ts.map +0 -1
  332. package/dist/code/tools/mcp.js +0 -230
  333. package/dist/code/tools/mcp.js.map +0 -1
  334. package/dist/data/tips.json +0 -118
  335. package/dist/ui/terminal-ui.d.ts +0 -73
  336. package/dist/ui/terminal-ui.d.ts.map +0 -1
  337. package/dist/ui/terminal-ui.js +0 -900
  338. package/dist/ui/terminal-ui.js.map +0 -1
  339. package/dist/utils/env-mapper.d.ts +0 -40
  340. package/dist/utils/env-mapper.d.ts.map +0 -1
  341. package/dist/utils/env-mapper.js +0 -122
  342. package/dist/utils/env-mapper.js.map +0 -1
  343. package/docs/USER_GUIDE.md +0 -573
  344. package/eslint.config.mjs +0 -43
  345. package/tests/agent-direct.test.mjs +0 -45
  346. package/tests/agent-output.test.mjs +0 -64
  347. package/tests/codemie-code.test.mjs +0 -42
  348. package/tests/context7-only.test.mjs +0 -42
  349. package/tests/conversation-flow.test.mjs +0 -63
  350. package/tests/interactive-simulation.test.mjs +0 -60
  351. package/tests/live-output.test.mjs +0 -53
  352. package/tests/mcp-context7.test.mjs +0 -105
  353. package/tests/mcp-e2e.test.mjs +0 -109
  354. package/tests/mcp-time-server.test.mjs +0 -58
  355. package/tests/streaming.test.mjs +0 -57
  356. package/tests/test-helpers.mjs +0 -94
  357. package/tests/text-wrapping.test.mjs +0 -33
  358. package/tests/tool-count.test.mjs +0 -81
  359. package/tests/ui-format.test.mjs +0 -39
  360. package/tests/ui-state.test.mjs +0 -72
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Todo Parser Utility
3
+ *
4
+ * Handles parsing todos from multiple input formats:
5
+ * - String with bullet lines: "- Plan\n- Search\n- Edit\n- Verify"
6
+ * - List of strings: ["Plan the work", "Search repo", "Edit files", "Run tests"]
7
+ * - List of objects: [{"content":"Plan", "status":"pending"}, {"content":"Search", "status":"in_progress"}]
8
+ * - GitHub-style checkboxes: "- [ ] pending\n- [x] completed"
9
+ *
10
+ * Ported from langchain-code's planner.py with TypeScript improvements
11
+ */
12
+ // Valid status mappings and aliases
13
+ const ALLOWED_STATUSES = new Set(['pending', 'in_progress', 'completed']);
14
+ const STATUS_ALIASES = {
15
+ 'in-progress': 'in_progress',
16
+ 'progress': 'in_progress',
17
+ 'doing': 'in_progress',
18
+ 'todo': 'pending',
19
+ 'tbd': 'pending',
20
+ 'done': 'completed',
21
+ 'complete': 'completed',
22
+ 'finished': 'completed',
23
+ };
24
+ // Regex for GitHub-style checkboxes: "- [x] Do thing" or "* [ ] Task" or "1) [x] Task"
25
+ const CHECKBOX_REGEX = /^\s*(?:[-*+]|\d+[.)])?\s*(\[[ xX]\])?\s*(.+)$/;
26
+ /**
27
+ * Normalize a status string to a valid status
28
+ */
29
+ function normalizeStatus(status) {
30
+ if (!status)
31
+ return 'pending';
32
+ const normalized = status.trim().toLowerCase();
33
+ const mapped = STATUS_ALIASES[normalized] || normalized;
34
+ return ALLOWED_STATUSES.has(mapped) ? mapped : 'pending';
35
+ }
36
+ /**
37
+ * Parse a single todo item from various formats
38
+ */
39
+ function parseOneTodo(item) {
40
+ if (item === null || item === undefined) {
41
+ return null;
42
+ }
43
+ if (typeof item === 'string') {
44
+ const trimmed = item.trim();
45
+ if (!trimmed)
46
+ return null;
47
+ // Handle GitHub-style checkboxes: "- [x] Do thing" / "* [ ] Task"
48
+ const match = CHECKBOX_REGEX.exec(trimmed);
49
+ if (match) {
50
+ const [, checkbox, content] = match;
51
+ const cleanContent = (content || '').trim().replace(/^[-|*]+\s*/, '').trim();
52
+ if (!cleanContent)
53
+ return null;
54
+ const status = (checkbox && checkbox.toLowerCase() === '[x]') ? 'completed' : 'pending';
55
+ return {
56
+ content: cleanContent,
57
+ status,
58
+ timestamp: new Date()
59
+ };
60
+ }
61
+ // Handle plain bullet points: "- Task" or "* Task"
62
+ const cleanContent = trimmed.replace(/^[-|*+]\s*/, '').trim();
63
+ if (!cleanContent)
64
+ return null;
65
+ return {
66
+ content: cleanContent,
67
+ status: 'pending',
68
+ timestamp: new Date()
69
+ };
70
+ }
71
+ if (typeof item === 'object' && item !== null) {
72
+ const content = item.content || item.task || item.title || '';
73
+ const cleanContent = String(content).trim();
74
+ if (!cleanContent)
75
+ return null;
76
+ return {
77
+ content: cleanContent,
78
+ status: normalizeStatus(item.status),
79
+ timestamp: new Date(),
80
+ metadata: item.metadata
81
+ };
82
+ }
83
+ // Fallback: convert to string and try again
84
+ return parseOneTodo(String(item));
85
+ }
86
+ /**
87
+ * Parse todos from various input formats
88
+ */
89
+ function parseTodoList(input) {
90
+ const todos = [];
91
+ const errors = [];
92
+ const warnings = [];
93
+ let detectedFormat = 'mixed';
94
+ try {
95
+ if (typeof input === 'string') {
96
+ // Handle multi-line string input
97
+ const lines = input.split('\n').filter(line => line.trim());
98
+ detectedFormat = lines.some(line => CHECKBOX_REGEX.test(line)) ? 'github_checkboxes' : 'string_bullets';
99
+ for (const line of lines) {
100
+ const todo = parseOneTodo(line);
101
+ if (todo) {
102
+ todos.push(todo);
103
+ }
104
+ }
105
+ }
106
+ else if (Array.isArray(input)) {
107
+ // Handle array input
108
+ const hasObjects = input.some(item => typeof item === 'object' && item !== null);
109
+ detectedFormat = hasObjects ? 'object_array' : 'string_array';
110
+ for (const item of input) {
111
+ const todo = parseOneTodo(item);
112
+ if (todo) {
113
+ todos.push(todo);
114
+ }
115
+ }
116
+ }
117
+ else if (typeof input === 'object' && input !== null && 'items' in input) {
118
+ // Handle object with 'items' property
119
+ detectedFormat = 'object_array';
120
+ if (Array.isArray(input.items)) {
121
+ for (const item of input.items) {
122
+ const todo = parseOneTodo(item);
123
+ if (todo) {
124
+ todos.push(todo);
125
+ }
126
+ }
127
+ }
128
+ }
129
+ else {
130
+ // Single item
131
+ const todo = parseOneTodo(input);
132
+ if (todo) {
133
+ todos.push(todo);
134
+ detectedFormat = typeof input === 'object' ? 'object_array' : 'string_array';
135
+ }
136
+ }
137
+ // Deduplicate consecutive duplicates by content
138
+ const deduped = [];
139
+ let lastContent = null;
140
+ for (const todo of todos.slice(0, 50)) { // Limit to 50 items
141
+ if (todo.content !== lastContent) {
142
+ deduped.push({ ...todo, index: deduped.length });
143
+ lastContent = todo.content;
144
+ }
145
+ else {
146
+ warnings.push(`Duplicate todo removed: "${todo.content}"`);
147
+ }
148
+ }
149
+ if (todos.length > 50) {
150
+ warnings.push(`Todo list truncated to 50 items (was ${todos.length})`);
151
+ }
152
+ return {
153
+ todos: deduped,
154
+ errors,
155
+ warnings,
156
+ detectedFormat
157
+ };
158
+ }
159
+ catch (error) {
160
+ errors.push(`Failed to parse todos: ${error instanceof Error ? error.message : String(error)}`);
161
+ return {
162
+ todos: [],
163
+ errors,
164
+ warnings,
165
+ detectedFormat: 'mixed'
166
+ };
167
+ }
168
+ }
169
+ /**
170
+ * Enforce single in-progress rule
171
+ * Only one todo can be "in_progress" at a time
172
+ */
173
+ function enforceSingleInProgressRule(todos, preferIndex) {
174
+ const inProgressIndices = todos
175
+ .map((todo, index) => ({ todo, index }))
176
+ .filter(({ todo }) => todo.status === 'in_progress')
177
+ .map(({ index }) => index);
178
+ if (inProgressIndices.length <= 1) {
179
+ return todos;
180
+ }
181
+ // Keep preferred index or first one, downgrade others to pending
182
+ const keepIndex = preferIndex !== undefined ? preferIndex : inProgressIndices[0];
183
+ return todos.map((todo, index) => {
184
+ if (todo.status === 'in_progress' && index !== keepIndex) {
185
+ return {
186
+ ...todo,
187
+ status: 'pending',
188
+ lastUpdated: new Date()
189
+ };
190
+ }
191
+ return todo;
192
+ });
193
+ }
194
+ /**
195
+ * Validate sequential progression
196
+ * Ensures todos are completed in order (no skipping ahead)
197
+ */
198
+ function enforceSequentialProgression(todos) {
199
+ let blocked = false;
200
+ return todos.map(todo => {
201
+ const currentStatus = todo.status;
202
+ // If we're blocked and this todo is in_progress or completed, downgrade to pending
203
+ if (blocked && (currentStatus === 'in_progress' || currentStatus === 'completed')) {
204
+ return {
205
+ ...todo,
206
+ status: 'pending',
207
+ lastUpdated: new Date()
208
+ };
209
+ }
210
+ // If this todo is not completed, block future todos
211
+ if (currentStatus !== 'completed') {
212
+ blocked = true;
213
+ }
214
+ return todo;
215
+ });
216
+ }
217
+ /**
218
+ * Main parsing function with validation
219
+ */
220
+ export function parseTodos(input, options = {}) {
221
+ const { enforceSequential = true, enforceSingleInProgress = true, preferredInProgressIndex } = options;
222
+ let result = parseTodoList(input);
223
+ if (result.todos.length === 0) {
224
+ return result;
225
+ }
226
+ // Apply enforcement rules
227
+ let processedTodos = result.todos;
228
+ if (enforceSequential) {
229
+ processedTodos = enforceSequentialProgression(processedTodos);
230
+ }
231
+ if (enforceSingleInProgress) {
232
+ processedTodos = enforceSingleInProgressRule(processedTodos, preferredInProgressIndex);
233
+ }
234
+ // Update indices
235
+ processedTodos = processedTodos.map((todo, index) => ({
236
+ ...todo,
237
+ index
238
+ }));
239
+ return {
240
+ ...result,
241
+ todos: processedTodos
242
+ };
243
+ }
244
+ /**
245
+ * Calculate progress information from todos
246
+ */
247
+ export function calculateProgress(todos) {
248
+ const total = todos.length;
249
+ const completed = todos.filter(t => t.status === 'completed').length;
250
+ const pending = todos.filter(t => t.status === 'pending').length;
251
+ const inProgress = todos.filter(t => t.status === 'in_progress').length;
252
+ const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
253
+ const currentTodo = todos.find(t => t.status === 'in_progress');
254
+ return {
255
+ total,
256
+ completed,
257
+ pending,
258
+ inProgress,
259
+ percentage,
260
+ currentTodo
261
+ };
262
+ }
263
+ /**
264
+ * Generate diff between two todo states
265
+ */
266
+ export function diffTodos(before, after) {
267
+ const changes = [];
268
+ const _maxLength = Math.max(before.length, after.length);
269
+ // Check status changes in existing todos
270
+ for (let i = 0; i < Math.min(before.length, after.length); i++) {
271
+ const prevStatus = before[i]?.status || 'pending';
272
+ const currStatus = after[i]?.status || 'pending';
273
+ if (prevStatus !== currStatus) {
274
+ const content = after[i]?.content || before[i]?.content || '(unknown)';
275
+ changes.push(`[${i + 1}] ${content} -> ${currStatus}`);
276
+ }
277
+ }
278
+ // Check for added todos
279
+ if (after.length > before.length) {
280
+ for (let i = before.length; i < after.length; i++) {
281
+ const content = after[i]?.content || '(unknown)';
282
+ changes.push(`[+] ${content} (added)`);
283
+ }
284
+ }
285
+ // Check for removed todos
286
+ if (before.length > after.length) {
287
+ for (let i = after.length; i < before.length; i++) {
288
+ const content = before[i]?.content || '(unknown)';
289
+ changes.push(`[-] ${content} (removed)`);
290
+ }
291
+ }
292
+ return changes;
293
+ }
294
+ /**
295
+ * Mark all remaining todos as completed
296
+ * Used when agent finishes work but forgot to update todos
297
+ */
298
+ export function completeAllTodos(todos) {
299
+ return todos.map(todo => ({
300
+ ...todo,
301
+ status: todo.status === 'completed' ? 'completed' : 'completed',
302
+ lastUpdated: new Date()
303
+ }));
304
+ }
305
+ //# sourceMappingURL=todoParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todoParser.js","sourceRoot":"","sources":["../../../../src/agents/codemie-code/utils/todoParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Todo Validator Utility
3
+ *
4
+ * Provides validation and quality checking for todo lists
5
+ * Ensures todos follow best practices and are actionable
6
+ */
7
+ import type { Todo, ProgressInfo } from '../types.js';
8
+ /**
9
+ * Validation result for a single todo
10
+ */
11
+ export interface TodoValidationResult {
12
+ /** Whether the todo is valid */
13
+ isValid: boolean;
14
+ /** Validation errors */
15
+ errors: string[];
16
+ /** Warnings for improvement */
17
+ warnings: string[];
18
+ /** Quality score (0-100) */
19
+ qualityScore: number;
20
+ /** Suggestions for improvement */
21
+ suggestions: string[];
22
+ }
23
+ /**
24
+ * Validation result for entire todo list
25
+ */
26
+ export interface TodoListValidationResult {
27
+ /** Whether the entire list is valid */
28
+ isValid: boolean;
29
+ /** Overall errors */
30
+ errors: string[];
31
+ /** Overall warnings */
32
+ warnings: string[];
33
+ /** Individual todo validations */
34
+ todoValidations: TodoValidationResult[];
35
+ /** Overall quality score (0-100) */
36
+ overallQuality: number;
37
+ /** List-level suggestions */
38
+ suggestions: string[];
39
+ }
40
+ /**
41
+ * Validate a single todo item
42
+ */
43
+ export declare function validateTodo(todo: Todo): TodoValidationResult;
44
+ /**
45
+ * Validate entire todo list
46
+ */
47
+ export declare function validateTodoList(todos: Todo[]): TodoListValidationResult;
48
+ /**
49
+ * Check if todo status transition is valid
50
+ */
51
+ export declare function isValidStatusTransition(from: Todo['status'], to: Todo['status']): boolean;
52
+ /**
53
+ * Suggest improvements for a todo
54
+ */
55
+ export declare function suggestImprovements(todo: Todo): string[];
56
+ /**
57
+ * Generate quality report for todo list
58
+ */
59
+ export declare function generateQualityReport(todos: Todo[]): {
60
+ summary: string;
61
+ qualityScore: number;
62
+ recommendations: string[];
63
+ progressInfo: ProgressInfo;
64
+ };
65
+ //# sourceMappingURL=todoValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todoValidator.d.ts","sourceRoot":"","sources":["../../../../src/agents/codemie-code/utils/todoValidator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAC;IAEjB,wBAAwB;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC;IAErB,kCAAkC;IACpC,WAAW,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IAEjB,qBAAqB;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,kCAAkC;IAClC,eAAe,EAAE,oBAAoB,EAAE,CAAC;IAExC,oCAAoC;IACpC,cAAc,EAAE,MAAM,CAAC;IAEvB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,oBAAoB,CA+E7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,wBAAwB,CAiFxE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,OAAO,CAgBzF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CAgCxD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,YAAY,CAAC;CAC5B,CA0BA"}
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Todo Validator Utility
3
+ *
4
+ * Provides validation and quality checking for todo lists
5
+ * Ensures todos follow best practices and are actionable
6
+ */
7
+ /**
8
+ * Validate a single todo item
9
+ */
10
+ export function validateTodo(todo) {
11
+ const errors = [];
12
+ const warnings = [];
13
+ const suggestions = [];
14
+ let qualityScore = 100;
15
+ // Check content
16
+ if (!todo.content || typeof todo.content !== 'string') {
17
+ errors.push('Todo content is required and must be a string');
18
+ qualityScore -= 50;
19
+ }
20
+ else {
21
+ const content = todo.content.trim();
22
+ // Check minimum length
23
+ if (content.length < 3) {
24
+ warnings.push('Todo content is very short (less than 3 characters)');
25
+ qualityScore -= 20;
26
+ }
27
+ // Check maximum length
28
+ if (content.length > 200) {
29
+ warnings.push('Todo content is very long (over 200 characters)');
30
+ suggestions.push('Consider breaking long todos into smaller, more specific steps');
31
+ qualityScore -= 10;
32
+ }
33
+ // Check for vague language
34
+ const vagueWords = ['thing', 'stuff', 'handle', 'deal with', 'manage', 'work on'];
35
+ const lowerContent = content.toLowerCase();
36
+ const foundVague = vagueWords.filter(word => lowerContent.includes(word));
37
+ if (foundVague.length > 0) {
38
+ warnings.push(`Contains vague language: ${foundVague.join(', ')}`);
39
+ suggestions.push('Use specific, actionable language (e.g., "Read config.ts file" not "Handle configuration")');
40
+ qualityScore -= 15;
41
+ }
42
+ // Check for verb-first structure (good practice)
43
+ const verbs = ['read', 'write', 'create', 'update', 'delete', 'fix', 'implement', 'test', 'review', 'analyze', 'install', 'configure', 'run', 'execute', 'build', 'deploy'];
44
+ const startsWithVerb = verbs.some(verb => lowerContent.startsWith(verb));
45
+ if (!startsWithVerb) {
46
+ suggestions.push('Consider starting with an action verb (e.g., "Read file" instead of "File reading")');
47
+ qualityScore -= 5;
48
+ }
49
+ // Check for file paths or specific targets
50
+ const hasSpecifics = /\.(ts|js|py|md|json|yml|yaml|txt)|src\/|\/.*\/|[A-Z][a-zA-Z]*\./.test(content);
51
+ if (!hasSpecifics && content.length > 10) {
52
+ suggestions.push('Consider being more specific about files, functions, or components');
53
+ qualityScore -= 5;
54
+ }
55
+ }
56
+ // Check status
57
+ const validStatuses = ['pending', 'in_progress', 'completed'];
58
+ if (!validStatuses.includes(todo.status)) {
59
+ errors.push(`Invalid status: ${todo.status}. Must be one of: ${validStatuses.join(', ')}`);
60
+ qualityScore -= 30;
61
+ }
62
+ // Check timestamps
63
+ if (todo.timestamp && !(todo.timestamp instanceof Date)) {
64
+ warnings.push('Timestamp should be a Date object');
65
+ qualityScore -= 5;
66
+ }
67
+ if (todo.lastUpdated && !(todo.lastUpdated instanceof Date)) {
68
+ warnings.push('lastUpdated should be a Date object');
69
+ qualityScore -= 5;
70
+ }
71
+ return {
72
+ isValid: errors.length === 0,
73
+ errors,
74
+ warnings,
75
+ qualityScore: Math.max(0, qualityScore),
76
+ suggestions
77
+ };
78
+ }
79
+ /**
80
+ * Validate entire todo list
81
+ */
82
+ export function validateTodoList(todos) {
83
+ const errors = [];
84
+ const warnings = [];
85
+ const suggestions = [];
86
+ const todoValidations = [];
87
+ // Validate each todo
88
+ for (let i = 0; i < todos.length; i++) {
89
+ const validation = validateTodo(todos[i]);
90
+ todoValidations.push(validation);
91
+ // Collect errors and warnings
92
+ errors.push(...validation.errors.map(error => `Todo ${i + 1}: ${error}`));
93
+ warnings.push(...validation.warnings.map(warning => `Todo ${i + 1}: ${warning}`));
94
+ }
95
+ // Check list-level constraints
96
+ // Check for duplicate content
97
+ const contentMap = new Map();
98
+ todos.forEach((todo, index) => {
99
+ const content = todo.content.toLowerCase().trim();
100
+ if (!contentMap.has(content)) {
101
+ contentMap.set(content, []);
102
+ }
103
+ contentMap.get(content).push(index + 1);
104
+ });
105
+ for (const [, indices] of contentMap) {
106
+ if (indices.length > 1) {
107
+ warnings.push(`Duplicate todo content found at positions: ${indices.join(', ')}`);
108
+ suggestions.push('Remove or merge duplicate todos');
109
+ }
110
+ }
111
+ // Check for too many in_progress todos
112
+ const inProgressCount = todos.filter(t => t.status === 'in_progress').length;
113
+ if (inProgressCount > 1) {
114
+ errors.push(`Too many in_progress todos (${inProgressCount}). Only one should be in_progress at a time.`);
115
+ }
116
+ // Check for proper progression
117
+ let foundNonCompleted = false;
118
+ for (let i = 0; i < todos.length; i++) {
119
+ const todo = todos[i];
120
+ if (foundNonCompleted && todo.status === 'completed') {
121
+ warnings.push(`Todo ${i + 1} is completed but earlier todos are not. Consider sequential execution.`);
122
+ suggestions.push('Complete todos in order to maintain clear progress tracking');
123
+ break;
124
+ }
125
+ if (todo.status !== 'completed') {
126
+ foundNonCompleted = true;
127
+ }
128
+ }
129
+ // Check list size
130
+ if (todos.length === 0) {
131
+ warnings.push('Todo list is empty');
132
+ }
133
+ else if (todos.length === 1) {
134
+ suggestions.push('Consider breaking complex tasks into multiple steps');
135
+ }
136
+ else if (todos.length > 10) {
137
+ warnings.push('Todo list is quite long (>10 items). Consider grouping or prioritizing.');
138
+ }
139
+ // Calculate overall quality
140
+ const totalQuality = todoValidations.reduce((sum, validation) => sum + validation.qualityScore, 0);
141
+ const overallQuality = todos.length > 0 ? Math.round(totalQuality / todos.length) : 0;
142
+ // Add quality-based suggestions
143
+ if (overallQuality < 70) {
144
+ suggestions.push('Consider revising todos to be more specific and actionable');
145
+ }
146
+ return {
147
+ isValid: errors.length === 0,
148
+ errors,
149
+ warnings,
150
+ todoValidations,
151
+ overallQuality,
152
+ suggestions
153
+ };
154
+ }
155
+ /**
156
+ * Check if todo status transition is valid
157
+ */
158
+ export function isValidStatusTransition(from, to) {
159
+ // Valid transitions:
160
+ // pending -> in_progress
161
+ // pending -> completed (skip in_progress if needed)
162
+ // in_progress -> completed
163
+ // in_progress -> pending (rollback)
164
+ // completed -> pending (reopen - rare but allowed)
165
+ // completed -> in_progress (reopen - rare but allowed)
166
+ const validTransitions = {
167
+ 'pending': ['in_progress', 'completed'],
168
+ 'in_progress': ['completed', 'pending'],
169
+ 'completed': ['pending', 'in_progress'] // Allow reopening for corrections
170
+ };
171
+ return validTransitions[from]?.includes(to) ?? false;
172
+ }
173
+ /**
174
+ * Suggest improvements for a todo
175
+ */
176
+ export function suggestImprovements(todo) {
177
+ const suggestions = [];
178
+ const content = todo.content.toLowerCase().trim();
179
+ // Suggest more specific language
180
+ if (content.includes('fix')) {
181
+ suggestions.push('Be more specific about what needs to be fixed (e.g., "Fix TypeScript error in config.ts")');
182
+ }
183
+ if (content.includes('update')) {
184
+ suggestions.push('Specify what needs to be updated and how');
185
+ }
186
+ if (content.includes('improve')) {
187
+ suggestions.push('Define specific improvements to be made');
188
+ }
189
+ // Suggest breaking down complex tasks
190
+ if (content.includes(' and ')) {
191
+ suggestions.push('Consider breaking this into separate todos (contains "and")');
192
+ }
193
+ if (content.includes('implement')) {
194
+ suggestions.push('Consider breaking implementation into smaller steps (plan, code, test, review)');
195
+ }
196
+ // Suggest adding context
197
+ if (!content.includes('.') && !content.includes('/')) {
198
+ suggestions.push('Consider adding file paths or specific locations');
199
+ }
200
+ return suggestions;
201
+ }
202
+ /**
203
+ * Generate quality report for todo list
204
+ */
205
+ export function generateQualityReport(todos) {
206
+ const validation = validateTodoList(todos);
207
+ const progressInfo = calculateProgress(todos);
208
+ const recommendations = [
209
+ ...validation.suggestions,
210
+ ...validation.todoValidations
211
+ .flatMap((v, i) => v.suggestions.map(s => `Todo ${i + 1}: ${s}`))
212
+ ];
213
+ let summary = `Todo list contains ${todos.length} items with ${validation.errors.length} errors and ${validation.warnings.length} warnings.`;
214
+ if (validation.overallQuality >= 80) {
215
+ summary += ' Quality is excellent.';
216
+ }
217
+ else if (validation.overallQuality >= 60) {
218
+ summary += ' Quality is good but could be improved.';
219
+ }
220
+ else {
221
+ summary += ' Quality needs improvement.';
222
+ }
223
+ return {
224
+ summary,
225
+ qualityScore: validation.overallQuality,
226
+ recommendations: recommendations.slice(0, 10), // Limit recommendations
227
+ progressInfo
228
+ };
229
+ }
230
+ /**
231
+ * Calculate progress information from todos
232
+ */
233
+ function calculateProgress(todos) {
234
+ const total = todos.length;
235
+ const completed = todos.filter(t => t.status === 'completed').length;
236
+ const pending = todos.filter(t => t.status === 'pending').length;
237
+ const inProgress = todos.filter(t => t.status === 'in_progress').length;
238
+ const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
239
+ const currentTodo = todos.find(t => t.status === 'in_progress');
240
+ return {
241
+ total,
242
+ completed,
243
+ pending,
244
+ inProgress,
245
+ percentage,
246
+ currentTodo
247
+ };
248
+ }
249
+ //# sourceMappingURL=todoValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todoValidator.js","sourceRoot":"","sources":["../../../../src/agents/codemie-code/utils/todoValidator.ts"],"names":[],"mappings":"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"}