@compilr-dev/cli 0.4.0 → 0.5.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 (315) hide show
  1. package/README.md +30 -12
  2. package/dist/agent.d.ts +74 -1
  3. package/dist/agent.js +259 -76
  4. package/dist/anchors/index.d.ts +9 -0
  5. package/dist/anchors/index.js +9 -0
  6. package/dist/anchors/project-anchors.d.ts +79 -0
  7. package/dist/anchors/project-anchors.js +202 -0
  8. package/dist/commands/handler-types.d.ts +68 -0
  9. package/dist/commands/handler-types.js +8 -0
  10. package/dist/commands/handlers/agent-commands.d.ts +13 -0
  11. package/dist/commands/handlers/agent-commands.js +305 -0
  12. package/dist/commands/handlers/design-commands.d.ts +15 -0
  13. package/dist/commands/handlers/design-commands.js +334 -0
  14. package/dist/commands/handlers/index.d.ts +20 -0
  15. package/dist/commands/handlers/index.js +43 -0
  16. package/dist/commands/handlers/overlay-commands.d.ts +21 -0
  17. package/dist/commands/handlers/overlay-commands.js +287 -0
  18. package/dist/commands/handlers/project-commands.d.ts +11 -0
  19. package/dist/commands/handlers/project-commands.js +167 -0
  20. package/dist/commands/handlers/simple-commands.d.ts +19 -0
  21. package/dist/commands/handlers/simple-commands.js +144 -0
  22. package/dist/commands/index.d.ts +2 -1
  23. package/dist/commands/registry.d.ts +50 -0
  24. package/dist/commands/registry.js +75 -0
  25. package/dist/commands-v2/handlers/context.d.ts +13 -0
  26. package/dist/commands-v2/handlers/context.js +348 -0
  27. package/dist/commands-v2/handlers/core.d.ts +13 -0
  28. package/dist/commands-v2/handlers/core.js +165 -0
  29. package/dist/commands-v2/handlers/debug.d.ts +11 -0
  30. package/dist/commands-v2/handlers/debug.js +159 -0
  31. package/dist/commands-v2/handlers/index.d.ts +12 -0
  32. package/dist/commands-v2/handlers/index.js +24 -0
  33. package/dist/commands-v2/handlers/project.d.ts +22 -0
  34. package/dist/commands-v2/handlers/project.js +814 -0
  35. package/dist/commands-v2/handlers/settings.d.ts +15 -0
  36. package/dist/commands-v2/handlers/settings.js +235 -0
  37. package/dist/commands-v2/index.d.ts +13 -0
  38. package/dist/commands-v2/index.js +15 -0
  39. package/dist/commands-v2/registry.d.ts +37 -0
  40. package/dist/commands-v2/registry.js +80 -0
  41. package/dist/commands-v2/types.d.ts +75 -0
  42. package/dist/commands-v2/types.js +7 -0
  43. package/dist/commands.js +110 -7
  44. package/dist/index.js +288 -29
  45. package/dist/input-handlers/index.d.ts +7 -0
  46. package/dist/input-handlers/index.js +7 -0
  47. package/dist/input-handlers/memory-handler.d.ts +26 -0
  48. package/dist/input-handlers/memory-handler.js +68 -0
  49. package/dist/repl-helpers.d.ts +63 -0
  50. package/dist/repl-helpers.js +318 -0
  51. package/dist/repl-v2.d.ts +155 -0
  52. package/dist/repl-v2.js +774 -0
  53. package/dist/repl.d.ts +32 -4
  54. package/dist/repl.js +250 -977
  55. package/dist/settings/index.d.ts +23 -0
  56. package/dist/settings/index.js +48 -0
  57. package/dist/settings/paths.d.ts +110 -0
  58. package/dist/settings/paths.js +264 -0
  59. package/dist/templates/compilr-md.js +7 -4
  60. package/dist/templates/index.js +3 -4
  61. package/dist/themes/colors.js +3 -1
  62. package/dist/themes/registry.d.ts +5 -36
  63. package/dist/themes/registry.js +11 -95
  64. package/dist/themes/types.d.ts +3 -38
  65. package/dist/themes/types.js +2 -2
  66. package/dist/tools/anchor-tools.d.ts +31 -0
  67. package/dist/tools/anchor-tools.js +255 -0
  68. package/dist/tools/backlog-wrappers.d.ts +54 -0
  69. package/dist/tools/backlog-wrappers.js +338 -0
  70. package/dist/tools/backlog.js +1 -1
  71. package/dist/tools/db-tools.d.ts +65 -0
  72. package/dist/tools/db-tools.js +19 -0
  73. package/dist/tools/document-db.d.ts +43 -0
  74. package/dist/tools/document-db.js +220 -0
  75. package/dist/tools/project-db.d.ts +102 -0
  76. package/dist/tools/project-db.js +370 -0
  77. package/dist/tools/workitem-db.d.ts +103 -0
  78. package/dist/tools/workitem-db.js +549 -0
  79. package/dist/tools.js +13 -3
  80. package/dist/ui/agents-overlay-v2.d.ts +43 -0
  81. package/dist/ui/agents-overlay-v2.js +809 -0
  82. package/dist/ui/agents-overlay.d.ts +5 -5
  83. package/dist/ui/agents-overlay.js +782 -420
  84. package/dist/ui/anchors-overlay.d.ts +12 -0
  85. package/dist/ui/anchors-overlay.js +775 -0
  86. package/dist/ui/arch-type-overlay.d.ts +1 -6
  87. package/dist/ui/arch-type-overlay.js +175 -203
  88. package/dist/ui/ask-user-overlay-v2.d.ts +26 -0
  89. package/dist/ui/ask-user-overlay-v2.js +555 -0
  90. package/dist/ui/ask-user-overlay.d.ts +2 -2
  91. package/dist/ui/ask-user-overlay.js +443 -535
  92. package/dist/ui/ask-user-simple-overlay-v2.d.ts +25 -0
  93. package/dist/ui/ask-user-simple-overlay-v2.js +215 -0
  94. package/dist/ui/ask-user-simple-overlay.d.ts +2 -2
  95. package/dist/ui/ask-user-simple-overlay.js +182 -209
  96. package/dist/ui/backlog-overlay.d.ts +16 -1
  97. package/dist/ui/backlog-overlay.js +525 -659
  98. package/dist/ui/base/index.d.ts +26 -0
  99. package/dist/ui/base/index.js +33 -0
  100. package/dist/ui/base/inline-overlay-utils.d.ts +217 -0
  101. package/dist/ui/base/inline-overlay-utils.js +320 -0
  102. package/dist/ui/base/inline-overlay.d.ts +159 -0
  103. package/dist/ui/base/inline-overlay.js +257 -0
  104. package/dist/ui/base/key-utils.d.ts +15 -0
  105. package/dist/ui/base/key-utils.js +30 -0
  106. package/dist/ui/base/overlay-base-v2.d.ts +193 -0
  107. package/dist/ui/base/overlay-base-v2.js +246 -0
  108. package/dist/ui/base/overlay-base.d.ts +156 -0
  109. package/dist/ui/base/overlay-base.js +238 -0
  110. package/dist/ui/base/overlay-lifecycle.d.ts +65 -0
  111. package/dist/ui/base/overlay-lifecycle.js +159 -0
  112. package/dist/ui/base/overlay-types.d.ts +185 -0
  113. package/dist/ui/base/overlay-types.js +7 -0
  114. package/dist/ui/base/render-utils.d.ts +8 -0
  115. package/dist/ui/base/render-utils.js +11 -0
  116. package/dist/ui/base/screen-stack.d.ts +148 -0
  117. package/dist/ui/base/screen-stack.js +184 -0
  118. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +103 -0
  119. package/dist/ui/base/tabbed-list-overlay-v2.js +317 -0
  120. package/dist/ui/base/tabbed-list-overlay.d.ts +153 -0
  121. package/dist/ui/base/tabbed-list-overlay.js +369 -0
  122. package/dist/ui/commands-overlay-v2.d.ts +33 -0
  123. package/dist/ui/commands-overlay-v2.js +441 -0
  124. package/dist/ui/commands-overlay.d.ts +7 -2
  125. package/dist/ui/commands-overlay.js +384 -355
  126. package/dist/ui/config-overlay.d.ts +5 -4
  127. package/dist/ui/config-overlay.js +243 -513
  128. package/dist/ui/conversation.d.ts +75 -4
  129. package/dist/ui/conversation.js +374 -161
  130. package/dist/ui/docs-overlay.d.ts +17 -0
  131. package/dist/ui/docs-overlay.js +303 -0
  132. package/dist/ui/ephemeral.d.ts +1 -1
  133. package/dist/ui/ephemeral.js +1 -1
  134. package/dist/ui/features/index.d.ts +34 -0
  135. package/dist/ui/features/index.js +34 -0
  136. package/dist/ui/features/input-feature.d.ts +85 -0
  137. package/dist/ui/features/input-feature.js +238 -0
  138. package/dist/ui/features/list-feature.d.ts +155 -0
  139. package/dist/ui/features/list-feature.js +244 -0
  140. package/dist/ui/features/pagination-feature.d.ts +154 -0
  141. package/dist/ui/features/pagination-feature.js +238 -0
  142. package/dist/ui/features/search-feature.d.ts +148 -0
  143. package/dist/ui/features/search-feature.js +185 -0
  144. package/dist/ui/features/tab-feature.d.ts +194 -0
  145. package/dist/ui/features/tab-feature.js +307 -0
  146. package/dist/ui/footer-v2.d.ts +222 -0
  147. package/dist/ui/footer-v2.js +1349 -0
  148. package/dist/ui/footer.d.ts +107 -0
  149. package/dist/ui/footer.js +359 -67
  150. package/dist/ui/guardrail-overlay.d.ts +29 -0
  151. package/dist/ui/guardrail-overlay.js +145 -0
  152. package/dist/ui/help-overlay-v2.d.ts +34 -0
  153. package/dist/ui/help-overlay-v2.js +309 -0
  154. package/dist/ui/help-overlay.d.ts +16 -0
  155. package/dist/ui/help-overlay.js +316 -0
  156. package/dist/ui/index.d.ts +1 -1
  157. package/dist/ui/index.js +1 -3
  158. package/dist/ui/init-overlay-v2.d.ts +34 -0
  159. package/dist/ui/init-overlay-v2.js +600 -0
  160. package/dist/ui/init-overlay.d.ts +12 -2
  161. package/dist/ui/init-overlay.js +349 -270
  162. package/dist/ui/input-prompt-v2.d.ts +1 -0
  163. package/dist/ui/input-prompt-v2.js +14 -6
  164. package/dist/ui/input-prompt.d.ts +116 -33
  165. package/dist/ui/input-prompt.js +536 -337
  166. package/dist/ui/iteration-limit-overlay-v2.d.ts +21 -0
  167. package/dist/ui/iteration-limit-overlay-v2.js +114 -0
  168. package/dist/ui/iteration-limit-overlay.d.ts +2 -2
  169. package/dist/ui/iteration-limit-overlay.js +92 -128
  170. package/dist/ui/keys-overlay-v2.d.ts +41 -0
  171. package/dist/ui/keys-overlay-v2.js +248 -0
  172. package/dist/ui/keys-overlay.d.ts +1 -0
  173. package/dist/ui/keys-overlay.js +203 -141
  174. package/dist/ui/line-utils.d.ts +88 -0
  175. package/dist/ui/line-utils.js +150 -0
  176. package/dist/ui/live-region.d.ts +161 -0
  177. package/dist/ui/live-region.js +387 -0
  178. package/dist/ui/mascot/expressions.d.ts +32 -0
  179. package/dist/ui/mascot/expressions.js +213 -0
  180. package/dist/ui/mascot/index.d.ts +8 -0
  181. package/dist/ui/mascot/index.js +8 -0
  182. package/dist/ui/mascot/renderer.d.ts +19 -0
  183. package/dist/ui/mascot/renderer.js +97 -0
  184. package/dist/ui/mascot-overlay-v2.d.ts +41 -0
  185. package/dist/ui/mascot-overlay-v2.js +138 -0
  186. package/dist/ui/mascot-overlay.d.ts +21 -0
  187. package/dist/ui/mascot-overlay.js +146 -0
  188. package/dist/ui/model-overlay-v2.d.ts +49 -0
  189. package/dist/ui/model-overlay-v2.js +118 -0
  190. package/dist/ui/model-overlay.d.ts +27 -0
  191. package/dist/ui/model-overlay.js +221 -0
  192. package/dist/ui/model-warning-overlay.js +3 -5
  193. package/dist/ui/new-overlay.d.ts +34 -0
  194. package/dist/ui/new-overlay.js +604 -0
  195. package/dist/ui/overlay/impl/agents-overlay-v2.d.ts +45 -0
  196. package/dist/ui/overlay/impl/agents-overlay-v2.js +825 -0
  197. package/dist/ui/overlay/impl/anchors-overlay-v2.d.ts +47 -0
  198. package/dist/ui/overlay/impl/anchors-overlay-v2.js +783 -0
  199. package/dist/ui/overlay/impl/arch-type-overlay-v2.d.ts +37 -0
  200. package/dist/ui/overlay/impl/arch-type-overlay-v2.js +240 -0
  201. package/dist/ui/overlay/impl/ask-user-overlay-v2.d.ts +72 -0
  202. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +584 -0
  203. package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.d.ts +46 -0
  204. package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.js +204 -0
  205. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +49 -0
  206. package/dist/ui/overlay/impl/backlog-overlay-v2.js +642 -0
  207. package/dist/ui/overlay/impl/commands-overlay-v2.d.ts +33 -0
  208. package/dist/ui/overlay/impl/commands-overlay-v2.js +441 -0
  209. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +100 -0
  210. package/dist/ui/overlay/impl/config-overlay-v2.js +654 -0
  211. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +55 -0
  212. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +359 -0
  213. package/dist/ui/overlay/impl/docs-overlay-v2.d.ts +45 -0
  214. package/dist/ui/overlay/impl/docs-overlay-v2.js +114 -0
  215. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +77 -0
  216. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +1071 -0
  217. package/dist/ui/overlay/impl/guardrail-overlay-v2.d.ts +43 -0
  218. package/dist/ui/overlay/impl/guardrail-overlay-v2.js +114 -0
  219. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +34 -0
  220. package/dist/ui/overlay/impl/help-overlay-v2.js +309 -0
  221. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +77 -0
  222. package/dist/ui/overlay/impl/init-overlay-v2.js +593 -0
  223. package/dist/ui/overlay/impl/init-setup-overlay-v2.d.ts +25 -0
  224. package/dist/ui/overlay/impl/init-setup-overlay-v2.js +97 -0
  225. package/dist/ui/overlay/impl/iteration-limit-overlay-v2.d.ts +35 -0
  226. package/dist/ui/overlay/impl/iteration-limit-overlay-v2.js +105 -0
  227. package/dist/ui/overlay/impl/keys-overlay-v2.d.ts +41 -0
  228. package/dist/ui/overlay/impl/keys-overlay-v2.js +248 -0
  229. package/dist/ui/overlay/impl/mascot-overlay-v2.d.ts +41 -0
  230. package/dist/ui/overlay/impl/mascot-overlay-v2.js +138 -0
  231. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +49 -0
  232. package/dist/ui/overlay/impl/model-overlay-v2.js +118 -0
  233. package/dist/ui/overlay/impl/model-warning-overlay-v2.d.ts +46 -0
  234. package/dist/ui/overlay/impl/model-warning-overlay-v2.js +132 -0
  235. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +77 -0
  236. package/dist/ui/overlay/impl/new-overlay-v2.js +593 -0
  237. package/dist/ui/overlay/impl/permission-overlay-v2.d.ts +36 -0
  238. package/dist/ui/overlay/impl/permission-overlay-v2.js +380 -0
  239. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +36 -0
  240. package/dist/ui/overlay/impl/projects-overlay-v2.js +499 -0
  241. package/dist/ui/overlay/impl/theme-overlay-v2.d.ts +42 -0
  242. package/dist/ui/overlay/impl/theme-overlay-v2.js +135 -0
  243. package/dist/ui/overlay/impl/tools-overlay-v2.d.ts +47 -0
  244. package/dist/ui/overlay/impl/tools-overlay-v2.js +218 -0
  245. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +31 -0
  246. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +1035 -0
  247. package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +80 -0
  248. package/dist/ui/overlay/impl/workflow-overlay-v2.js +637 -0
  249. package/dist/ui/overlay/index.d.ts +33 -0
  250. package/dist/ui/overlay/index.js +35 -0
  251. package/dist/ui/overlay/key-utils.d.ts +6 -0
  252. package/dist/ui/overlay/key-utils.js +6 -0
  253. package/dist/ui/overlay/overlay-types.d.ts +128 -0
  254. package/dist/ui/overlay/overlay-types.js +22 -0
  255. package/dist/ui/overlay/types.d.ts +135 -0
  256. package/dist/ui/overlay/types.js +22 -0
  257. package/dist/ui/overlays/help-overlay-v2.d.ts +28 -0
  258. package/dist/ui/overlays/help-overlay-v2.js +198 -0
  259. package/dist/ui/overlays/index.d.ts +11 -0
  260. package/dist/ui/overlays/index.js +11 -0
  261. package/dist/ui/overlays.d.ts +0 -4
  262. package/dist/ui/overlays.js +0 -444
  263. package/dist/ui/permission-overlay-v2.d.ts +36 -0
  264. package/dist/ui/permission-overlay-v2.js +380 -0
  265. package/dist/ui/permission-overlay.d.ts +1 -1
  266. package/dist/ui/permission-overlay.js +186 -298
  267. package/dist/ui/projects-overlay.d.ts +19 -0
  268. package/dist/ui/projects-overlay.js +484 -0
  269. package/dist/ui/providers/types.d.ts +178 -0
  270. package/dist/ui/providers/types.js +9 -0
  271. package/dist/ui/render-modes.d.ts +36 -0
  272. package/dist/ui/render-modes.js +44 -0
  273. package/dist/ui/startup-menu.d.ts +36 -0
  274. package/dist/ui/startup-menu.js +236 -0
  275. package/dist/ui/subagent-renderer.d.ts +117 -0
  276. package/dist/ui/subagent-renderer.js +334 -0
  277. package/dist/ui/terminal-codes.d.ts +94 -0
  278. package/dist/ui/terminal-codes.js +124 -0
  279. package/dist/ui/terminal-renderer.d.ts +221 -0
  280. package/dist/ui/terminal-renderer.js +751 -0
  281. package/dist/ui/terminal-ui.d.ts +463 -0
  282. package/dist/ui/terminal-ui.js +2296 -0
  283. package/dist/ui/terminal.d.ts +20 -0
  284. package/dist/ui/terminal.js +72 -0
  285. package/dist/ui/theme-overlay-v2.d.ts +42 -0
  286. package/dist/ui/theme-overlay-v2.js +135 -0
  287. package/dist/ui/theme-overlay.d.ts +24 -0
  288. package/dist/ui/theme-overlay.js +127 -0
  289. package/dist/ui/todo-zone.js +53 -25
  290. package/dist/ui/tool-formatters.d.ts +16 -0
  291. package/dist/ui/tool-formatters.js +516 -0
  292. package/dist/ui/tools-overlay-v2.d.ts +47 -0
  293. package/dist/ui/tools-overlay-v2.js +218 -0
  294. package/dist/ui/tools-overlay.d.ts +10 -2
  295. package/dist/ui/tools-overlay.js +172 -220
  296. package/dist/ui/tutorial-overlay-v2.d.ts +31 -0
  297. package/dist/ui/tutorial-overlay-v2.js +1035 -0
  298. package/dist/ui/tutorial-overlay.d.ts +1 -0
  299. package/dist/ui/tutorial-overlay.js +400 -302
  300. package/dist/ui/workflow-overlay.d.ts +22 -0
  301. package/dist/ui/workflow-overlay.js +636 -0
  302. package/dist/utils/debug-log.d.ts +28 -0
  303. package/dist/utils/debug-log.js +57 -0
  304. package/dist/utils/model-tiers.js +1 -1
  305. package/dist/utils/path-safety.d.ts +56 -0
  306. package/dist/utils/path-safety.js +239 -0
  307. package/dist/workflow/guided-mode-injector.d.ts +42 -0
  308. package/dist/workflow/guided-mode-injector.js +191 -0
  309. package/dist/workflow/index.d.ts +8 -0
  310. package/dist/workflow/index.js +8 -0
  311. package/dist/workflow/step-criteria.d.ts +62 -0
  312. package/dist/workflow/step-criteria.js +150 -0
  313. package/dist/workflow/step-tracker.d.ts +92 -0
  314. package/dist/workflow/step-tracker.js +141 -0
  315. package/package.json +12 -5
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Step Criteria - Defines exit criteria for each guided workflow step
3
+ *
4
+ * Each step has:
5
+ * - Human-readable exit criteria (for system prompt)
6
+ * - Success indicators (what agent looks for)
7
+ * - Configuration (max attempts, auto-advance)
8
+ */
9
+ /**
10
+ * Step order - defines valid step progression
11
+ */
12
+ export const STEP_ORDER = ['plan', 'implement', 'test', 'commit', 'review'];
13
+ /**
14
+ * Get the next step in the workflow
15
+ */
16
+ export function getNextStep(current) {
17
+ if (current === null)
18
+ return 'plan';
19
+ const idx = STEP_ORDER.indexOf(current);
20
+ if (idx === -1 || idx >= STEP_ORDER.length - 1)
21
+ return 'complete';
22
+ return STEP_ORDER[idx + 1];
23
+ }
24
+ /**
25
+ * Get the previous step in the workflow
26
+ */
27
+ export function getPreviousStep(current) {
28
+ const idx = STEP_ORDER.indexOf(current);
29
+ if (idx <= 0)
30
+ return null;
31
+ return STEP_ORDER[idx - 1];
32
+ }
33
+ /**
34
+ * Get step number (1-indexed for display)
35
+ */
36
+ export function getStepNumber(step) {
37
+ return STEP_ORDER.indexOf(step) + 1;
38
+ }
39
+ /**
40
+ * Check if step transition is valid (can only advance to next step)
41
+ */
42
+ export function isValidTransition(from, to) {
43
+ const nextStep = getNextStep(from);
44
+ return nextStep === to;
45
+ }
46
+ /**
47
+ * Guided step criteria definitions
48
+ */
49
+ export const GUIDED_STEP_CRITERIA = [
50
+ {
51
+ step: 'plan',
52
+ exitCriteria: [
53
+ 'Requirements understood and documented',
54
+ 'Approach designed (files to create/modify identified)',
55
+ 'Edge cases considered',
56
+ ],
57
+ successIndicators: [
58
+ 'Agent has written a plan in conversation or document',
59
+ 'Agent has identified target files',
60
+ 'No blocking questions remain',
61
+ ],
62
+ autoAdvance: true,
63
+ nextActionHint: 'Start implementing the planned changes',
64
+ },
65
+ {
66
+ step: 'implement',
67
+ exitCriteria: [
68
+ 'All planned code changes completed',
69
+ 'No placeholder TODOs left',
70
+ 'Code compiles/lints cleanly',
71
+ ],
72
+ successIndicators: [
73
+ 'writeFile/edit tools have been called',
74
+ 'Lint command passes (if available)',
75
+ 'No obvious errors in code',
76
+ ],
77
+ autoAdvance: true,
78
+ nextActionHint: 'Run tests to verify the implementation',
79
+ },
80
+ {
81
+ step: 'test',
82
+ exitCriteria: [
83
+ 'All tests pass',
84
+ 'OR: User overrides after 2 failed attempts',
85
+ ],
86
+ successIndicators: [
87
+ 'Test command exits with 0',
88
+ 'All test assertions pass',
89
+ ],
90
+ maxAttempts: 2,
91
+ autoAdvance: true, // Only if tests pass
92
+ nextActionHint: 'Commit the changes with a proper message',
93
+ },
94
+ {
95
+ step: 'commit',
96
+ exitCriteria: [
97
+ 'Changes committed with proper message',
98
+ 'Commit hash captured',
99
+ ],
100
+ successIndicators: [
101
+ 'git commit command succeeded',
102
+ 'Commit hash in output',
103
+ ],
104
+ autoAdvance: true,
105
+ nextActionHint: 'Review and confirm ready for next item',
106
+ },
107
+ {
108
+ step: 'review',
109
+ exitCriteria: [
110
+ 'User confirms ready for next item',
111
+ 'OR: User wants to do something else',
112
+ ],
113
+ successIndicators: [
114
+ 'User says "yes", "next", "continue"',
115
+ 'User explicitly approves',
116
+ ],
117
+ autoAdvance: false, // Always wait for user
118
+ nextActionHint: 'Pick the next work item from backlog',
119
+ },
120
+ ];
121
+ /**
122
+ * Get criteria for a specific step
123
+ */
124
+ export function getStepCriteria(step) {
125
+ const criteria = GUIDED_STEP_CRITERIA.find((c) => c.step === step);
126
+ if (!criteria) {
127
+ throw new Error(`No criteria found for step: ${step}`);
128
+ }
129
+ return criteria;
130
+ }
131
+ /**
132
+ * Get human-readable step description for messages
133
+ */
134
+ export function getStepDescription(step) {
135
+ const descriptions = {
136
+ plan: 'Planning - understanding requirements and designing approach',
137
+ implement: 'Implementing - writing code and making changes',
138
+ test: 'Testing - running tests and fixing failures',
139
+ commit: 'Committing - creating git commit with changes',
140
+ review: 'Reviewing - confirming completion and next steps',
141
+ };
142
+ return descriptions[step];
143
+ }
144
+ /**
145
+ * Format step for display (e.g., "IMPLEMENT (2 of 5)")
146
+ */
147
+ export function formatStepDisplay(step) {
148
+ const num = getStepNumber(step);
149
+ return `${step.toUpperCase()} (${String(num)} of ${String(STEP_ORDER.length)})`;
150
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Step Tracker - In-memory tracking of step attempts
3
+ *
4
+ * Tracks attempts for retryable steps (like test) during a session.
5
+ * This is in-memory only - resets on CLI restart.
6
+ * Can be persisted to history table later if needed.
7
+ */
8
+ import type { GuidedStep } from '../db/schema.js';
9
+ /**
10
+ * Record of a single step attempt
11
+ */
12
+ export interface StepAttempt {
13
+ /** When the attempt was made */
14
+ timestamp: Date;
15
+ /** Whether the attempt succeeded */
16
+ success: boolean;
17
+ /** Error message if failed */
18
+ error?: string;
19
+ /** Additional context */
20
+ context?: string;
21
+ }
22
+ /**
23
+ * In-memory tracker for guided workflow step attempts
24
+ *
25
+ * Tracks attempts per item per step, enabling retry logic
26
+ * (e.g., "tests failed after 2 attempts, ask user").
27
+ */
28
+ export declare class GuidedStepTracker {
29
+ /**
30
+ * Map: itemId -> step -> attempts[]
31
+ */
32
+ private readonly attempts;
33
+ /**
34
+ * Record an attempt for a step
35
+ */
36
+ recordAttempt(itemId: string, step: GuidedStep, success: boolean, error?: string, context?: string): void;
37
+ /**
38
+ * Get all attempts for a step
39
+ */
40
+ getAttempts(itemId: string, step: GuidedStep): StepAttempt[];
41
+ /**
42
+ * Get total attempt count for a step
43
+ */
44
+ getAttemptCount(itemId: string, step: GuidedStep): number;
45
+ /**
46
+ * Get failed attempt count for a step
47
+ */
48
+ getFailedAttemptCount(itemId: string, step: GuidedStep): number;
49
+ /**
50
+ * Get successful attempt count for a step
51
+ */
52
+ getSuccessfulAttemptCount(itemId: string, step: GuidedStep): number;
53
+ /**
54
+ * Check if we should escalate to user (max attempts exceeded)
55
+ */
56
+ shouldAskUser(itemId: string, step: GuidedStep, maxAttempts?: number): boolean;
57
+ /**
58
+ * Get remaining attempts before user escalation
59
+ */
60
+ getRemainingAttempts(itemId: string, step: GuidedStep): number | null;
61
+ /**
62
+ * Check if step has had any successful attempt
63
+ */
64
+ hasSucceeded(itemId: string, step: GuidedStep): boolean;
65
+ /**
66
+ * Get the last attempt for a step
67
+ */
68
+ getLastAttempt(itemId: string, step: GuidedStep): StepAttempt | null;
69
+ /**
70
+ * Reset attempts for a specific item (when starting fresh)
71
+ */
72
+ resetItem(itemId: string): void;
73
+ /**
74
+ * Reset attempts for a specific step (when user wants to retry)
75
+ */
76
+ resetStep(itemId: string, step: GuidedStep): void;
77
+ /**
78
+ * Clear all tracking data (e.g., on session end)
79
+ */
80
+ clear(): void;
81
+ /**
82
+ * Get a summary of attempts for an item (for display)
83
+ */
84
+ getItemSummary(itemId: string): Record<GuidedStep, {
85
+ total: number;
86
+ failed: number;
87
+ }> | null;
88
+ }
89
+ /**
90
+ * Singleton instance for the current session
91
+ */
92
+ export declare const stepTracker: GuidedStepTracker;
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Step Tracker - In-memory tracking of step attempts
3
+ *
4
+ * Tracks attempts for retryable steps (like test) during a session.
5
+ * This is in-memory only - resets on CLI restart.
6
+ * Can be persisted to history table later if needed.
7
+ */
8
+ import { getStepCriteria } from './step-criteria.js';
9
+ /**
10
+ * In-memory tracker for guided workflow step attempts
11
+ *
12
+ * Tracks attempts per item per step, enabling retry logic
13
+ * (e.g., "tests failed after 2 attempts, ask user").
14
+ */
15
+ export class GuidedStepTracker {
16
+ /**
17
+ * Map: itemId -> step -> attempts[]
18
+ */
19
+ attempts = new Map();
20
+ /**
21
+ * Record an attempt for a step
22
+ */
23
+ recordAttempt(itemId, step, success, error, context) {
24
+ if (!this.attempts.has(itemId)) {
25
+ this.attempts.set(itemId, new Map());
26
+ }
27
+ const itemAttempts = this.attempts.get(itemId);
28
+ if (!itemAttempts)
29
+ return; // Should never happen, just added above
30
+ if (!itemAttempts.has(step)) {
31
+ itemAttempts.set(step, []);
32
+ }
33
+ const stepAttempts = itemAttempts.get(step);
34
+ if (!stepAttempts)
35
+ return; // Should never happen, just added above
36
+ stepAttempts.push({
37
+ timestamp: new Date(),
38
+ success,
39
+ error,
40
+ context,
41
+ });
42
+ }
43
+ /**
44
+ * Get all attempts for a step
45
+ */
46
+ getAttempts(itemId, step) {
47
+ return this.attempts.get(itemId)?.get(step) ?? [];
48
+ }
49
+ /**
50
+ * Get total attempt count for a step
51
+ */
52
+ getAttemptCount(itemId, step) {
53
+ return this.getAttempts(itemId, step).length;
54
+ }
55
+ /**
56
+ * Get failed attempt count for a step
57
+ */
58
+ getFailedAttemptCount(itemId, step) {
59
+ return this.getAttempts(itemId, step).filter((a) => !a.success).length;
60
+ }
61
+ /**
62
+ * Get successful attempt count for a step
63
+ */
64
+ getSuccessfulAttemptCount(itemId, step) {
65
+ return this.getAttempts(itemId, step).filter((a) => a.success).length;
66
+ }
67
+ /**
68
+ * Check if we should escalate to user (max attempts exceeded)
69
+ */
70
+ shouldAskUser(itemId, step, maxAttempts) {
71
+ const criteria = getStepCriteria(step);
72
+ const max = maxAttempts ?? criteria.maxAttempts;
73
+ if (max === undefined) {
74
+ // No retry limit defined for this step
75
+ return false;
76
+ }
77
+ return this.getFailedAttemptCount(itemId, step) >= max;
78
+ }
79
+ /**
80
+ * Get remaining attempts before user escalation
81
+ */
82
+ getRemainingAttempts(itemId, step) {
83
+ const criteria = getStepCriteria(step);
84
+ if (criteria.maxAttempts === undefined) {
85
+ return null; // No limit
86
+ }
87
+ return Math.max(0, criteria.maxAttempts - this.getFailedAttemptCount(itemId, step));
88
+ }
89
+ /**
90
+ * Check if step has had any successful attempt
91
+ */
92
+ hasSucceeded(itemId, step) {
93
+ return this.getSuccessfulAttemptCount(itemId, step) > 0;
94
+ }
95
+ /**
96
+ * Get the last attempt for a step
97
+ */
98
+ getLastAttempt(itemId, step) {
99
+ const attempts = this.getAttempts(itemId, step);
100
+ return attempts.length > 0 ? attempts[attempts.length - 1] : null;
101
+ }
102
+ /**
103
+ * Reset attempts for a specific item (when starting fresh)
104
+ */
105
+ resetItem(itemId) {
106
+ this.attempts.delete(itemId);
107
+ }
108
+ /**
109
+ * Reset attempts for a specific step (when user wants to retry)
110
+ */
111
+ resetStep(itemId, step) {
112
+ this.attempts.get(itemId)?.delete(step);
113
+ }
114
+ /**
115
+ * Clear all tracking data (e.g., on session end)
116
+ */
117
+ clear() {
118
+ this.attempts.clear();
119
+ }
120
+ /**
121
+ * Get a summary of attempts for an item (for display)
122
+ */
123
+ getItemSummary(itemId) {
124
+ const itemAttempts = this.attempts.get(itemId);
125
+ if (!itemAttempts) {
126
+ return null;
127
+ }
128
+ const summary = {};
129
+ for (const [step, attempts] of itemAttempts) {
130
+ summary[step] = {
131
+ total: attempts.length,
132
+ failed: attempts.filter((a) => !a.success).length,
133
+ };
134
+ }
135
+ return summary;
136
+ }
137
+ }
138
+ /**
139
+ * Singleton instance for the current session
140
+ */
141
+ export const stepTracker = new GuidedStepTracker();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@compilr-dev/cli",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "AI-powered coding assistant CLI using @compilr-dev/agents",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -14,7 +14,11 @@
14
14
  "clean": "rm -rf dist",
15
15
  "lint": "eslint src/",
16
16
  "lint:fix": "eslint src/ --fix",
17
- "prepublishOnly": "npm run lint && npm run build"
17
+ "prepublishOnly": "npm run lint && npm run build",
18
+ "test:scroll": "npx tsx scripts/test-scroll-regions.ts",
19
+ "test:scroll-input": "npx tsx scripts/test-scroll-input.ts",
20
+ "test:repl-v2": "npx tsx scripts/test-repl-v2.ts",
21
+ "test:ui": "npx tsx scripts/test-terminal-ui.ts"
18
22
  },
19
23
  "keywords": [
20
24
  "cli",
@@ -46,13 +50,16 @@
46
50
  },
47
51
  "dependencies": {
48
52
  "@anthropic-ai/sdk": "^0.30.1",
49
- "@compilr-dev/agents": "^0.2.1",
50
- "@compilr-dev/agents-coding": "^0.1.1",
53
+ "@compilr-dev/agents": "^0.3.1",
54
+ "@compilr-dev/agents-coding": "^1.0.2",
55
+ "@compilr-dev/editor-core": "^0.0.1",
56
+ "@compilr-dev/ui-core": "^0.0.1",
51
57
  "better-sqlite3": "^12.5.0",
52
58
  "chalk": "^5.6.2",
53
59
  "marked": "^15.0.12",
54
60
  "marked-terminal": "^7.3.0",
55
- "picocolors": "^1.1.1"
61
+ "picocolors": "^1.1.1",
62
+ "web-tree-sitter": "^0.20.8"
56
63
  },
57
64
  "devDependencies": {
58
65
  "@eslint/js": "^9.39.1",