brainfile 0.18.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 (360) hide show
  1. package/README.md +222 -0
  2. package/dist/__tests__/helpers/v2.d.ts +12 -0
  3. package/dist/__tests__/helpers/v2.d.ts.map +1 -0
  4. package/dist/__tests__/helpers/v2.js +73 -0
  5. package/dist/__tests__/helpers/v2.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +480 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/add.d.ts +34 -0
  11. package/dist/commands/add.d.ts.map +1 -0
  12. package/dist/commands/add.js +255 -0
  13. package/dist/commands/add.js.map +1 -0
  14. package/dist/commands/adr.d.ts +22 -0
  15. package/dist/commands/adr.d.ts.map +1 -0
  16. package/dist/commands/adr.js +195 -0
  17. package/dist/commands/adr.js.map +1 -0
  18. package/dist/commands/archive.d.ts +20 -0
  19. package/dist/commands/archive.d.ts.map +1 -0
  20. package/dist/commands/archive.js +590 -0
  21. package/dist/commands/archive.js.map +1 -0
  22. package/dist/commands/auth.d.ts +26 -0
  23. package/dist/commands/auth.d.ts.map +1 -0
  24. package/dist/commands/auth.js +245 -0
  25. package/dist/commands/auth.js.map +1 -0
  26. package/dist/commands/complete.d.ts +30 -0
  27. package/dist/commands/complete.d.ts.map +1 -0
  28. package/dist/commands/complete.js +267 -0
  29. package/dist/commands/complete.js.map +1 -0
  30. package/dist/commands/config.d.ts +29 -0
  31. package/dist/commands/config.d.ts.map +1 -0
  32. package/dist/commands/config.js +210 -0
  33. package/dist/commands/config.js.map +1 -0
  34. package/dist/commands/contract.d.ts +84 -0
  35. package/dist/commands/contract.d.ts.map +1 -0
  36. package/dist/commands/contract.js +715 -0
  37. package/dist/commands/contract.js.map +1 -0
  38. package/dist/commands/delete.d.ts +8 -0
  39. package/dist/commands/delete.d.ts.map +1 -0
  40. package/dist/commands/delete.js +139 -0
  41. package/dist/commands/delete.js.map +1 -0
  42. package/dist/commands/hooks.d.ts +35 -0
  43. package/dist/commands/hooks.d.ts.map +1 -0
  44. package/dist/commands/hooks.js +324 -0
  45. package/dist/commands/hooks.js.map +1 -0
  46. package/dist/commands/init.d.ts +7 -0
  47. package/dist/commands/init.d.ts.map +1 -0
  48. package/dist/commands/init.js +118 -0
  49. package/dist/commands/init.js.map +1 -0
  50. package/dist/commands/lint.d.ts +16 -0
  51. package/dist/commands/lint.d.ts.map +1 -0
  52. package/dist/commands/lint.js +123 -0
  53. package/dist/commands/lint.js.map +1 -0
  54. package/dist/commands/list.d.ts +20 -0
  55. package/dist/commands/list.d.ts.map +1 -0
  56. package/dist/commands/list.js +175 -0
  57. package/dist/commands/list.js.map +1 -0
  58. package/dist/commands/log.d.ts +52 -0
  59. package/dist/commands/log.d.ts.map +1 -0
  60. package/dist/commands/log.js +246 -0
  61. package/dist/commands/log.js.map +1 -0
  62. package/dist/commands/mcp.d.ts +3 -0
  63. package/dist/commands/mcp.d.ts.map +1 -0
  64. package/dist/commands/mcp.js +96 -0
  65. package/dist/commands/mcp.js.map +1 -0
  66. package/dist/commands/migrate.d.ts +16 -0
  67. package/dist/commands/migrate.d.ts.map +1 -0
  68. package/dist/commands/migrate.js +388 -0
  69. package/dist/commands/migrate.js.map +1 -0
  70. package/dist/commands/move.d.ts +16 -0
  71. package/dist/commands/move.d.ts.map +1 -0
  72. package/dist/commands/move.js +225 -0
  73. package/dist/commands/move.js.map +1 -0
  74. package/dist/commands/patch.d.ts +17 -0
  75. package/dist/commands/patch.d.ts.map +1 -0
  76. package/dist/commands/patch.js +226 -0
  77. package/dist/commands/patch.js.map +1 -0
  78. package/dist/commands/restore.d.ts +8 -0
  79. package/dist/commands/restore.d.ts.map +1 -0
  80. package/dist/commands/restore.js +111 -0
  81. package/dist/commands/restore.js.map +1 -0
  82. package/dist/commands/rules.d.ts +68 -0
  83. package/dist/commands/rules.d.ts.map +1 -0
  84. package/dist/commands/rules.js +322 -0
  85. package/dist/commands/rules.js.map +1 -0
  86. package/dist/commands/schema.d.ts +31 -0
  87. package/dist/commands/schema.d.ts.map +1 -0
  88. package/dist/commands/schema.js +374 -0
  89. package/dist/commands/schema.js.map +1 -0
  90. package/dist/commands/search.d.ts +33 -0
  91. package/dist/commands/search.d.ts.map +1 -0
  92. package/dist/commands/search.js +209 -0
  93. package/dist/commands/search.js.map +1 -0
  94. package/dist/commands/show.d.ts +20 -0
  95. package/dist/commands/show.d.ts.map +1 -0
  96. package/dist/commands/show.js +272 -0
  97. package/dist/commands/show.js.map +1 -0
  98. package/dist/commands/subtask.d.ts +12 -0
  99. package/dist/commands/subtask.d.ts.map +1 -0
  100. package/dist/commands/subtask.js +212 -0
  101. package/dist/commands/subtask.js.map +1 -0
  102. package/dist/commands/template.d.ts +17 -0
  103. package/dist/commands/template.d.ts.map +1 -0
  104. package/dist/commands/template.js +149 -0
  105. package/dist/commands/template.js.map +1 -0
  106. package/dist/commands/tui.d.ts +6 -0
  107. package/dist/commands/tui.d.ts.map +1 -0
  108. package/dist/commands/tui.js +79 -0
  109. package/dist/commands/tui.js.map +1 -0
  110. package/dist/commands/types.d.ts +40 -0
  111. package/dist/commands/types.d.ts.map +1 -0
  112. package/dist/commands/types.js +242 -0
  113. package/dist/commands/types.js.map +1 -0
  114. package/dist/index.d.ts +10 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +29 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/lib/contractRunner.d.ts +59 -0
  119. package/dist/lib/contractRunner.d.ts.map +1 -0
  120. package/dist/lib/contractRunner.js +511 -0
  121. package/dist/lib/contractRunner.js.map +1 -0
  122. package/dist/mcp/helpers.d.ts +32 -0
  123. package/dist/mcp/helpers.d.ts.map +1 -0
  124. package/dist/mcp/helpers.js +125 -0
  125. package/dist/mcp/helpers.js.map +1 -0
  126. package/dist/mcp/tools/contract.d.ts +25 -0
  127. package/dist/mcp/tools/contract.d.ts.map +1 -0
  128. package/dist/mcp/tools/contract.js +33 -0
  129. package/dist/mcp/tools/contract.js.map +1 -0
  130. package/dist/mcp/tools/contract_tool.d.ts +3 -0
  131. package/dist/mcp/tools/contract_tool.d.ts.map +1 -0
  132. package/dist/mcp/tools/contract_tool.js +328 -0
  133. package/dist/mcp/tools/contract_tool.js.map +1 -0
  134. package/dist/mcp/tools/get_task_tool.d.ts +3 -0
  135. package/dist/mcp/tools/get_task_tool.d.ts.map +1 -0
  136. package/dist/mcp/tools/get_task_tool.js +55 -0
  137. package/dist/mcp/tools/get_task_tool.js.map +1 -0
  138. package/dist/mcp/tools/list_tasks_tool.d.ts +3 -0
  139. package/dist/mcp/tools/list_tasks_tool.d.ts.map +1 -0
  140. package/dist/mcp/tools/list_tasks_tool.js +82 -0
  141. package/dist/mcp/tools/list_tasks_tool.js.map +1 -0
  142. package/dist/mcp/tools/search_tool.d.ts +3 -0
  143. package/dist/mcp/tools/search_tool.d.ts.map +1 -0
  144. package/dist/mcp/tools/search_tool.js +155 -0
  145. package/dist/mcp/tools/search_tool.js.map +1 -0
  146. package/dist/mcp/tools/subtask_tool.d.ts +3 -0
  147. package/dist/mcp/tools/subtask_tool.d.ts.map +1 -0
  148. package/dist/mcp/tools/subtask_tool.js +321 -0
  149. package/dist/mcp/tools/subtask_tool.js.map +1 -0
  150. package/dist/mcp/tools/task_add_tool.d.ts +3 -0
  151. package/dist/mcp/tools/task_add_tool.d.ts.map +1 -0
  152. package/dist/mcp/tools/task_add_tool.js +196 -0
  153. package/dist/mcp/tools/task_add_tool.js.map +1 -0
  154. package/dist/mcp/tools/task_complete_tool.d.ts +3 -0
  155. package/dist/mcp/tools/task_complete_tool.d.ts.map +1 -0
  156. package/dist/mcp/tools/task_complete_tool.js +265 -0
  157. package/dist/mcp/tools/task_complete_tool.js.map +1 -0
  158. package/dist/mcp/tools/task_delete_tool.d.ts +3 -0
  159. package/dist/mcp/tools/task_delete_tool.d.ts.map +1 -0
  160. package/dist/mcp/tools/task_delete_tool.js +87 -0
  161. package/dist/mcp/tools/task_delete_tool.js.map +1 -0
  162. package/dist/mcp/tools/task_move_tool.d.ts +3 -0
  163. package/dist/mcp/tools/task_move_tool.d.ts.map +1 -0
  164. package/dist/mcp/tools/task_move_tool.js +187 -0
  165. package/dist/mcp/tools/task_move_tool.js.map +1 -0
  166. package/dist/mcp/tools/task_patch_tool.d.ts +3 -0
  167. package/dist/mcp/tools/task_patch_tool.d.ts.map +1 -0
  168. package/dist/mcp/tools/task_patch_tool.js +189 -0
  169. package/dist/mcp/tools/task_patch_tool.js.map +1 -0
  170. package/dist/schemas/base.json +159 -0
  171. package/dist/schemas/board.json +290 -0
  172. package/dist/tui/BrainfileTUI.d.ts +4 -0
  173. package/dist/tui/BrainfileTUI.d.ts.map +1 -0
  174. package/dist/tui/BrainfileTUI.js +272 -0
  175. package/dist/tui/BrainfileTUI.js.map +1 -0
  176. package/dist/tui/actions.d.ts +84 -0
  177. package/dist/tui/actions.d.ts.map +1 -0
  178. package/dist/tui/actions.js +1251 -0
  179. package/dist/tui/actions.js.map +1 -0
  180. package/dist/tui/components/ColumnTabs.d.ts +9 -0
  181. package/dist/tui/components/ColumnTabs.d.ts.map +1 -0
  182. package/dist/tui/components/ColumnTabs.js +34 -0
  183. package/dist/tui/components/ColumnTabs.js.map +1 -0
  184. package/dist/tui/components/Header.d.ts +15 -0
  185. package/dist/tui/components/Header.d.ts.map +1 -0
  186. package/dist/tui/components/Header.js +48 -0
  187. package/dist/tui/components/Header.js.map +1 -0
  188. package/dist/tui/components/HelpOverlay.d.ts +9 -0
  189. package/dist/tui/components/HelpOverlay.d.ts.map +1 -0
  190. package/dist/tui/components/HelpOverlay.js +116 -0
  191. package/dist/tui/components/HelpOverlay.js.map +1 -0
  192. package/dist/tui/components/LogsPanel.d.ts +16 -0
  193. package/dist/tui/components/LogsPanel.d.ts.map +1 -0
  194. package/dist/tui/components/LogsPanel.js +115 -0
  195. package/dist/tui/components/LogsPanel.js.map +1 -0
  196. package/dist/tui/components/MainPanelTabs.d.ts +10 -0
  197. package/dist/tui/components/MainPanelTabs.d.ts.map +1 -0
  198. package/dist/tui/components/MainPanelTabs.js +56 -0
  199. package/dist/tui/components/MainPanelTabs.js.map +1 -0
  200. package/dist/tui/components/ManualBorder.d.ts +42 -0
  201. package/dist/tui/components/ManualBorder.d.ts.map +1 -0
  202. package/dist/tui/components/ManualBorder.js +56 -0
  203. package/dist/tui/components/ManualBorder.js.map +1 -0
  204. package/dist/tui/components/Overlays.d.ts +41 -0
  205. package/dist/tui/components/Overlays.d.ts.map +1 -0
  206. package/dist/tui/components/Overlays.js +127 -0
  207. package/dist/tui/components/Overlays.js.map +1 -0
  208. package/dist/tui/components/ProgressBar.d.ts +8 -0
  209. package/dist/tui/components/ProgressBar.d.ts.map +1 -0
  210. package/dist/tui/components/ProgressBar.js +35 -0
  211. package/dist/tui/components/ProgressBar.js.map +1 -0
  212. package/dist/tui/components/RulesPanel.d.ts +25 -0
  213. package/dist/tui/components/RulesPanel.d.ts.map +1 -0
  214. package/dist/tui/components/RulesPanel.js +139 -0
  215. package/dist/tui/components/RulesPanel.js.map +1 -0
  216. package/dist/tui/components/SearchBar.d.ts +8 -0
  217. package/dist/tui/components/SearchBar.d.ts.map +1 -0
  218. package/dist/tui/components/SearchBar.js +38 -0
  219. package/dist/tui/components/SearchBar.js.map +1 -0
  220. package/dist/tui/components/StackedTaskList.d.ts +27 -0
  221. package/dist/tui/components/StackedTaskList.d.ts.map +1 -0
  222. package/dist/tui/components/StackedTaskList.js +120 -0
  223. package/dist/tui/components/StackedTaskList.js.map +1 -0
  224. package/dist/tui/components/StatusBar.d.ts +14 -0
  225. package/dist/tui/components/StatusBar.d.ts.map +1 -0
  226. package/dist/tui/components/StatusBar.js +42 -0
  227. package/dist/tui/components/StatusBar.js.map +1 -0
  228. package/dist/tui/components/TaskCard.d.ts +25 -0
  229. package/dist/tui/components/TaskCard.d.ts.map +1 -0
  230. package/dist/tui/components/TaskCard.js +221 -0
  231. package/dist/tui/components/TaskCard.js.map +1 -0
  232. package/dist/tui/components/TaskCardMeasure.d.ts +31 -0
  233. package/dist/tui/components/TaskCardMeasure.d.ts.map +1 -0
  234. package/dist/tui/components/TaskCardMeasure.js +133 -0
  235. package/dist/tui/components/TaskCardMeasure.js.map +1 -0
  236. package/dist/tui/components/TaskDetail.d.ts +13 -0
  237. package/dist/tui/components/TaskDetail.d.ts.map +1 -0
  238. package/dist/tui/components/TaskDetail.js +64 -0
  239. package/dist/tui/components/TaskDetail.js.map +1 -0
  240. package/dist/tui/components/TaskList.d.ts +12 -0
  241. package/dist/tui/components/TaskList.d.ts.map +1 -0
  242. package/dist/tui/components/TaskList.js +75 -0
  243. package/dist/tui/components/TaskList.js.map +1 -0
  244. package/dist/tui/components/index.d.ts +31 -0
  245. package/dist/tui/components/index.d.ts.map +1 -0
  246. package/dist/tui/components/index.js +43 -0
  247. package/dist/tui/components/index.js.map +1 -0
  248. package/dist/tui/hooks/index.d.ts +3 -0
  249. package/dist/tui/hooks/index.d.ts.map +1 -0
  250. package/dist/tui/hooks/index.js +8 -0
  251. package/dist/tui/hooks/index.js.map +1 -0
  252. package/dist/tui/hooks/useBrainfileLoader.d.ts +5 -0
  253. package/dist/tui/hooks/useBrainfileLoader.d.ts.map +1 -0
  254. package/dist/tui/hooks/useBrainfileLoader.js +237 -0
  255. package/dist/tui/hooks/useBrainfileLoader.js.map +1 -0
  256. package/dist/tui/hooks/useKeyboardNavigation.d.ts +20 -0
  257. package/dist/tui/hooks/useKeyboardNavigation.d.ts.map +1 -0
  258. package/dist/tui/hooks/useKeyboardNavigation.js +806 -0
  259. package/dist/tui/hooks/useKeyboardNavigation.js.map +1 -0
  260. package/dist/tui/index.d.ts +10 -0
  261. package/dist/tui/index.d.ts.map +1 -0
  262. package/dist/tui/index.js +38 -0
  263. package/dist/tui/index.js.map +1 -0
  264. package/dist/tui/theme.d.ts +119 -0
  265. package/dist/tui/theme.d.ts.map +1 -0
  266. package/dist/tui/theme.js +138 -0
  267. package/dist/tui/theme.js.map +1 -0
  268. package/dist/tui/types.d.ts +53 -0
  269. package/dist/tui/types.d.ts.map +1 -0
  270. package/dist/tui/types.js +12 -0
  271. package/dist/tui/types.js.map +1 -0
  272. package/dist/tui/utils.d.ts +24 -0
  273. package/dist/tui/utils.d.ts.map +1 -0
  274. package/dist/tui/utils.js +161 -0
  275. package/dist/tui/utils.js.map +1 -0
  276. package/dist/utils/archive.d.ts +57 -0
  277. package/dist/utils/archive.d.ts.map +1 -0
  278. package/dist/utils/archive.js +304 -0
  279. package/dist/utils/archive.js.map +1 -0
  280. package/dist/utils/auth-store.d.ts +69 -0
  281. package/dist/utils/auth-store.d.ts.map +1 -0
  282. package/dist/utils/auth-store.js +308 -0
  283. package/dist/utils/auth-store.js.map +1 -0
  284. package/dist/utils/board-types.d.ts +13 -0
  285. package/dist/utils/board-types.d.ts.map +1 -0
  286. package/dist/utils/board-types.js +7 -0
  287. package/dist/utils/board-types.js.map +1 -0
  288. package/dist/utils/brainfile-finder.d.ts +12 -0
  289. package/dist/utils/brainfile-finder.d.ts.map +1 -0
  290. package/dist/utils/brainfile-finder.js +69 -0
  291. package/dist/utils/brainfile-finder.js.map +1 -0
  292. package/dist/utils/brainfile-path.d.ts +10 -0
  293. package/dist/utils/brainfile-path.d.ts.map +1 -0
  294. package/dist/utils/brainfile-path.js +88 -0
  295. package/dist/utils/brainfile-path.js.map +1 -0
  296. package/dist/utils/cli-error.d.ts +44 -0
  297. package/dist/utils/cli-error.d.ts.map +1 -0
  298. package/dist/utils/cli-error.js +85 -0
  299. package/dist/utils/cli-error.js.map +1 -0
  300. package/dist/utils/config.d.ts +119 -0
  301. package/dist/utils/config.d.ts.map +1 -0
  302. package/dist/utils/config.js +304 -0
  303. package/dist/utils/config.js.map +1 -0
  304. package/dist/utils/contractSpec.d.ts +13 -0
  305. package/dist/utils/contractSpec.d.ts.map +1 -0
  306. package/dist/utils/contractSpec.js +61 -0
  307. package/dist/utils/contractSpec.js.map +1 -0
  308. package/dist/utils/dot-brainfile.d.ts +9 -0
  309. package/dist/utils/dot-brainfile.d.ts.map +1 -0
  310. package/dist/utils/dot-brainfile.js +74 -0
  311. package/dist/utils/dot-brainfile.js.map +1 -0
  312. package/dist/utils/errorHandler.d.ts +106 -0
  313. package/dist/utils/errorHandler.d.ts.map +1 -0
  314. package/dist/utils/errorHandler.js +223 -0
  315. package/dist/utils/errorHandler.js.map +1 -0
  316. package/dist/utils/git-helper.d.ts +17 -0
  317. package/dist/utils/git-helper.d.ts.map +1 -0
  318. package/dist/utils/git-helper.js +62 -0
  319. package/dist/utils/git-helper.js.map +1 -0
  320. package/dist/utils/github-auth.d.ts +56 -0
  321. package/dist/utils/github-auth.d.ts.map +1 -0
  322. package/dist/utils/github-auth.js +341 -0
  323. package/dist/utils/github-auth.js.map +1 -0
  324. package/dist/utils/hook-parser.d.ts +15 -0
  325. package/dist/utils/hook-parser.d.ts.map +1 -0
  326. package/dist/utils/hook-parser.js +69 -0
  327. package/dist/utils/hook-parser.js.map +1 -0
  328. package/dist/utils/hook-settings.d.ts +27 -0
  329. package/dist/utils/hook-settings.d.ts.map +1 -0
  330. package/dist/utils/hook-settings.js +364 -0
  331. package/dist/utils/hook-settings.js.map +1 -0
  332. package/dist/utils/linear-auth.d.ts +59 -0
  333. package/dist/utils/linear-auth.d.ts.map +1 -0
  334. package/dist/utils/linear-auth.js +295 -0
  335. package/dist/utils/linear-auth.js.map +1 -0
  336. package/dist/utils/logger.d.ts +34 -0
  337. package/dist/utils/logger.d.ts.map +1 -0
  338. package/dist/utils/logger.js +56 -0
  339. package/dist/utils/logger.js.map +1 -0
  340. package/dist/utils/strict-validation.d.ts +8 -0
  341. package/dist/utils/strict-validation.d.ts.map +1 -0
  342. package/dist/utils/strict-validation.js +41 -0
  343. package/dist/utils/strict-validation.js.map +1 -0
  344. package/dist/utils/v2-detect.d.ts +28 -0
  345. package/dist/utils/v2-detect.d.ts.map +1 -0
  346. package/dist/utils/v2-detect.js +112 -0
  347. package/dist/utils/v2-detect.js.map +1 -0
  348. package/dist/utils/v2-only.d.ts +9 -0
  349. package/dist/utils/v2-only.d.ts.map +1 -0
  350. package/dist/utils/v2-only.js +64 -0
  351. package/dist/utils/v2-only.js.map +1 -0
  352. package/dist/utils/workspace-format.d.ts +25 -0
  353. package/dist/utils/workspace-format.d.ts.map +1 -0
  354. package/dist/utils/workspace-format.js +106 -0
  355. package/dist/utils/workspace-format.js.map +1 -0
  356. package/dist/validation/command-lint.d.ts +11 -0
  357. package/dist/validation/command-lint.d.ts.map +1 -0
  358. package/dist/validation/command-lint.js +88 -0
  359. package/dist/validation/command-lint.js.map +1 -0
  360. package/package.json +69 -0
@@ -0,0 +1,388 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.migrateCommand = migrateCommand;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const core_1 = require("@brainfile/core");
44
+ const core_2 = require("@brainfile/core");
45
+ const dot_brainfile_1 = require("../utils/dot-brainfile");
46
+ const v2_detect_1 = require("../utils/v2-detect");
47
+ const workspace_format_1 = require("../utils/workspace-format");
48
+ /**
49
+ * Migrate legacy workspace layouts to v2 (.brainfile/brainfile.md + board/ + logs/).
50
+ */
51
+ function migrateCommand(options = {}) {
52
+ try {
53
+ if (options.logsToLedger) {
54
+ migrateLogsToLedger(options);
55
+ return;
56
+ }
57
+ const rootDir = path.resolve(options.dir || process.cwd());
58
+ const probe = (0, workspace_format_1.probeWorkspaceFormat)(rootDir);
59
+ if (probe.format === 'empty') {
60
+ console.error(chalk_1.default.red('Error: No brainfile found to migrate.'));
61
+ console.log(chalk_1.default.gray(`Checked: ${probe.paths.rootBrainfilePath}`));
62
+ console.log(chalk_1.default.gray(`Checked: ${probe.paths.dotBrainfilePath}`));
63
+ process.exit(1);
64
+ return;
65
+ }
66
+ if (probe.format === 'v2') {
67
+ migrateBrainfileToV2(probe.paths.dotBrainfilePath, options);
68
+ return;
69
+ }
70
+ if (probe.format === 'legacy-root') {
71
+ migrateRootBrainfileToDotDir(probe, options);
72
+ migrateBrainfileToV2(probe.paths.dotBrainfilePath, options);
73
+ return;
74
+ }
75
+ if (probe.format === 'legacy-dotbrainfile') {
76
+ migrateBrainfileToV2(probe.paths.dotBrainfilePath, options);
77
+ return;
78
+ }
79
+ // mixed workspace
80
+ migrateMixedWorkspace(probe, options);
81
+ }
82
+ catch (error) {
83
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : String(error));
84
+ process.exit(1);
85
+ }
86
+ }
87
+ function migrateMixedWorkspace(probe, options) {
88
+ const { presence, paths } = probe;
89
+ const hasFullV2 = presence.dotBrainfile && presence.boardDir && presence.logsDir;
90
+ if (hasFullV2) {
91
+ if (presence.rootBrainfile) {
92
+ const backupPath = backupAndRemoveLegacyRoot(paths.rootBrainfilePath, paths.dotDir);
93
+ console.log(chalk_1.default.yellow('Legacy root brainfile detected alongside v2 workspace.'));
94
+ console.log(chalk_1.default.gray(` Backed up root file to: ${backupPath}`));
95
+ }
96
+ (0, dot_brainfile_1.ensureDotBrainfileGitignore)(paths.dotBrainfilePath);
97
+ (0, dot_brainfile_1.removeLegacyStateFile)(paths.dotBrainfilePath);
98
+ console.log(chalk_1.default.green('Workspace is already v2. No task migration needed.'));
99
+ return;
100
+ }
101
+ if (presence.rootBrainfile && !presence.dotBrainfile) {
102
+ migrateRootBrainfileToDotDir(probe, options);
103
+ migrateBrainfileToV2(paths.dotBrainfilePath, options);
104
+ return;
105
+ }
106
+ if (presence.rootBrainfile && presence.dotBrainfile) {
107
+ const backupPath = backupAndRemoveLegacyRoot(paths.rootBrainfilePath, paths.dotDir);
108
+ console.log(chalk_1.default.yellow('Found both root and .brainfile brainfiles; using .brainfile/brainfile.md as source.'));
109
+ console.log(chalk_1.default.gray(` Backed up root file to: ${backupPath}`));
110
+ migrateBrainfileToV2(paths.dotBrainfilePath, options);
111
+ return;
112
+ }
113
+ if (presence.dotBrainfile) {
114
+ migrateBrainfileToV2(paths.dotBrainfilePath, options);
115
+ return;
116
+ }
117
+ throw new Error('Mixed workspace detected, but no migratable brainfile.md was found.');
118
+ }
119
+ function migrateRootBrainfileToDotDir(probe, options) {
120
+ const { rootBrainfilePath, dotDir, dotBrainfilePath } = probe.paths;
121
+ if (!fs.existsSync(rootBrainfilePath)) {
122
+ throw new Error(`File not found: ${rootBrainfilePath}`);
123
+ }
124
+ if (fs.existsSync(dotBrainfilePath) && !options.force) {
125
+ throw new Error(`Target already exists: ${dotBrainfilePath}. ` +
126
+ 'Run `brainfile migrate` again after resolving conflicts, or use --force.');
127
+ }
128
+ fs.mkdirSync(dotDir, { recursive: true });
129
+ if (fs.existsSync(dotBrainfilePath) && options.force) {
130
+ fs.rmSync(dotBrainfilePath, { force: true });
131
+ }
132
+ // Prefer rename for exact preservation; fall back to copy+unlink on failure.
133
+ try {
134
+ fs.renameSync(rootBrainfilePath, dotBrainfilePath);
135
+ }
136
+ catch {
137
+ const contents = fs.readFileSync(rootBrainfilePath);
138
+ fs.writeFileSync(dotBrainfilePath, contents);
139
+ fs.rmSync(rootBrainfilePath, { force: true });
140
+ }
141
+ (0, dot_brainfile_1.ensureDotBrainfileGitignore)(dotBrainfilePath);
142
+ (0, dot_brainfile_1.removeLegacyStateFile)(dotBrainfilePath);
143
+ console.log(chalk_1.default.gray(`Moved: ${rootBrainfilePath} -> ${dotBrainfilePath}`));
144
+ }
145
+ /**
146
+ * Convert a single legacy board file into v2 per-task files.
147
+ */
148
+ function migrateBrainfileToV2(brainfilePath, options) {
149
+ if (!fs.existsSync(brainfilePath)) {
150
+ throw new Error(`File not found: ${brainfilePath}`);
151
+ }
152
+ const content = fs.readFileSync(brainfilePath, 'utf-8');
153
+ const parsed = core_1.Brainfile.parseWithErrors(content);
154
+ if (!parsed.board) {
155
+ throw new Error(`Failed to parse brainfile: ${parsed.error}`);
156
+ }
157
+ const board = parsed.board;
158
+ const dotDir = path.dirname(path.resolve(brainfilePath));
159
+ const hasBoardDir = fs.existsSync(path.join(dotDir, 'board'));
160
+ const hasLogsDir = fs.existsSync(path.join(dotDir, 'logs'));
161
+ const hasEmbeddedColumnTasks = board.columns.some((column) => column.tasks.length > 0);
162
+ const hasEmbeddedArchiveTasks = Array.isArray(board.archive)
163
+ && (board.archive?.length ?? 0) > 0;
164
+ if (hasBoardDir && hasLogsDir && !hasEmbeddedColumnTasks && !hasEmbeddedArchiveTasks) {
165
+ console.log(chalk_1.default.green('Already using v2 per-task file architecture.'));
166
+ return;
167
+ }
168
+ // Back up original file
169
+ const backupPath = brainfilePath + '.v1.bak';
170
+ if (!fs.existsSync(backupPath) || options.force) {
171
+ fs.copyFileSync(brainfilePath, backupPath);
172
+ console.log(chalk_1.default.gray(`Backup: ${backupPath}`));
173
+ }
174
+ else {
175
+ console.log(chalk_1.default.gray(`Backup already exists: ${backupPath}`));
176
+ }
177
+ // Ensure v2 directory structure
178
+ const dirs = (0, v2_detect_1.ensureV2Dirs)(brainfilePath);
179
+ // Validate/clear existing task files
180
+ const existingTaskFiles = fs.existsSync(dirs.boardDir)
181
+ ? fs.readdirSync(dirs.boardDir).filter((f) => f.endsWith('.md'))
182
+ : [];
183
+ const existingLogFiles = fs.existsSync(dirs.logsDir)
184
+ ? fs.readdirSync(dirs.logsDir).filter((f) => f.endsWith('.md'))
185
+ : [];
186
+ if ((existingTaskFiles.length > 0 || existingLogFiles.length > 0) && !options.force) {
187
+ throw new Error('board/ or logs/ already contains task files. ' +
188
+ 'Use --force to replace existing .md files in those directories.');
189
+ }
190
+ if (options.force) {
191
+ for (const name of existingTaskFiles) {
192
+ fs.rmSync(path.join(dirs.boardDir, name), { force: true });
193
+ }
194
+ for (const name of existingLogFiles) {
195
+ fs.rmSync(path.join(dirs.logsDir, name), { force: true });
196
+ }
197
+ }
198
+ let activeCount = 0;
199
+ let logCount = 0;
200
+ const doneColumnIds = new Set();
201
+ for (const col of board.columns) {
202
+ if (col.completionColumn ||
203
+ /^(done|completed?|finished|closed)$/i.test(col.id) ||
204
+ /^(done|completed?|finished|closed)$/i.test(col.title)) {
205
+ doneColumnIds.add(col.id);
206
+ }
207
+ }
208
+ for (const col of board.columns) {
209
+ const isDone = doneColumnIds.has(col.id);
210
+ for (let i = 0; i < col.tasks.length; i++) {
211
+ const task = col.tasks[i];
212
+ if (isDone) {
213
+ const logTask = {
214
+ ...task,
215
+ completedAt: task.completedAt || new Date().toISOString(),
216
+ };
217
+ delete logTask.column;
218
+ delete logTask.position;
219
+ const logPath = path.join(dirs.logsDir, (0, core_2.taskFileName)(task.id));
220
+ (0, core_2.writeTaskFile)(logPath, logTask);
221
+ logCount++;
222
+ }
223
+ else {
224
+ const activeTask = {
225
+ ...task,
226
+ column: col.id,
227
+ position: i,
228
+ };
229
+ const taskPath = path.join(dirs.boardDir, (0, core_2.taskFileName)(task.id));
230
+ (0, core_2.writeTaskFile)(taskPath, activeTask);
231
+ activeCount++;
232
+ }
233
+ }
234
+ }
235
+ if (board.archive && board.archive.length > 0) {
236
+ for (const task of board.archive) {
237
+ const logTask = {
238
+ ...task,
239
+ completedAt: task.completedAt || new Date().toISOString(),
240
+ };
241
+ delete logTask.column;
242
+ delete logTask.position;
243
+ const logPath = path.join(dirs.logsDir, (0, core_2.taskFileName)(task.id));
244
+ (0, core_2.writeTaskFile)(logPath, logTask);
245
+ logCount++;
246
+ }
247
+ }
248
+ const configBoard = { ...board };
249
+ configBoard.columns = board.columns.map((col) => ({
250
+ id: col.id,
251
+ title: col.title,
252
+ ...(col.order !== undefined && { order: col.order }),
253
+ ...(col.completionColumn && { completionColumn: col.completionColumn }),
254
+ }));
255
+ delete configBoard.archive;
256
+ configBoard.schema = 'https://brainfile.md/v2/board.json';
257
+ const configContent = core_1.Brainfile.serialize(configBoard);
258
+ fs.writeFileSync(brainfilePath, configContent, 'utf-8');
259
+ (0, dot_brainfile_1.ensureDotBrainfileGitignore)(brainfilePath);
260
+ (0, dot_brainfile_1.removeLegacyStateFile)(brainfilePath);
261
+ console.log(chalk_1.default.green('Migration to v2 complete!'));
262
+ console.log('');
263
+ console.log(chalk_1.default.gray(` Active tasks: ${activeCount} files in board/`));
264
+ console.log(chalk_1.default.gray(` Completed/logs: ${logCount} files in logs/`));
265
+ console.log(chalk_1.default.gray(` Board config: ${brainfilePath} (config-only)`));
266
+ console.log(chalk_1.default.gray(` Backup: ${backupPath}`));
267
+ }
268
+ /**
269
+ * Extract the type prefix from a task ID (e.g. "task" from "task-42", "epic" from "epic-3").
270
+ */
271
+ function getTypePrefix(taskId) {
272
+ const match = taskId.match(/^(.+)-\d+$/);
273
+ return match ? match[1] : 'task';
274
+ }
275
+ /**
276
+ * Migrate legacy logs/*.md files into ledger.jsonl.
277
+ *
278
+ * When the old core allowed ID reuse (e.g. task-1 in both board/ and logs/),
279
+ * this resolves the conflict by keeping the log entry (it was completed first)
280
+ * and renaming the board task to the next available ID.
281
+ */
282
+ function migrateLogsToLedger(options) {
283
+ const rootDir = path.resolve(options.dir || process.cwd());
284
+ const probe = (0, workspace_format_1.probeWorkspaceFormat)(rootDir);
285
+ if (probe.format === 'empty') {
286
+ console.error(chalk_1.default.red('Error: No brainfile workspace found.'));
287
+ process.exit(1);
288
+ return;
289
+ }
290
+ const { logsDir, boardDir } = probe.paths;
291
+ if (!fs.existsSync(logsDir)) {
292
+ console.log(chalk_1.default.gray('No logs/ directory found. Nothing to migrate.'));
293
+ return;
294
+ }
295
+ const logDocs = (0, core_2.readTasksDir)(logsDir);
296
+ if (logDocs.length === 0) {
297
+ console.log(chalk_1.default.gray('No .md log files found in logs/. Nothing to migrate.'));
298
+ return;
299
+ }
300
+ // Read only the actual ledger.jsonl — don't use readLedger() which falls back
301
+ // to reading the very .md files we're about to migrate.
302
+ const ledgerPath = path.join(logsDir, 'ledger.jsonl');
303
+ const existingLedgerIds = new Set();
304
+ if (fs.existsSync(ledgerPath)) {
305
+ const lines = fs.readFileSync(ledgerPath, 'utf-8').split('\n');
306
+ for (const line of lines) {
307
+ const trimmed = line.trim();
308
+ if (!trimmed)
309
+ continue;
310
+ try {
311
+ const record = JSON.parse(trimmed);
312
+ if (record?.id)
313
+ existingLedgerIds.add(record.id);
314
+ }
315
+ catch { /* skip malformed lines */ }
316
+ }
317
+ }
318
+ const boardDocs = fs.existsSync(boardDir) ? (0, core_2.readTasksDir)(boardDir) : [];
319
+ const boardIdMap = new Map(boardDocs.map((d) => [d.task.id, d]));
320
+ let migratedCount = 0;
321
+ let skippedCount = 0;
322
+ let conflictCount = 0;
323
+ for (const doc of logDocs) {
324
+ const taskId = doc.task.id;
325
+ if (existingLedgerIds.has(taskId)) {
326
+ console.log(chalk_1.default.gray(` Skip: ${taskId} (already in ledger)`));
327
+ if (options.force) {
328
+ fs.rmSync(doc.filePath, { force: true });
329
+ console.log(chalk_1.default.gray(` Removed stale log file: ${path.basename(doc.filePath)}`));
330
+ }
331
+ skippedCount++;
332
+ continue;
333
+ }
334
+ const record = (0, core_2.buildLedgerRecord)(doc.task, doc.body, {
335
+ completedAt: doc.task.completedAt || doc.task.updatedAt || new Date().toISOString(),
336
+ });
337
+ (0, core_2.appendLedgerRecord)(logsDir, record);
338
+ existingLedgerIds.add(taskId);
339
+ migratedCount++;
340
+ if (boardIdMap.has(taskId)) {
341
+ const boardDoc = boardIdMap.get(taskId);
342
+ const prefix = getTypePrefix(taskId);
343
+ const newId = (0, core_2.generateNextFileTaskId)(boardDir, logsDir, prefix);
344
+ const renamedTask = { ...boardDoc.task, id: newId };
345
+ const newBoardPath = path.join(boardDir, (0, core_2.taskFileName)(newId));
346
+ (0, core_2.writeTaskFile)(newBoardPath, renamedTask, boardDoc.body);
347
+ fs.rmSync(boardDoc.filePath, { force: true });
348
+ console.log(chalk_1.default.yellow(` Conflict: board/${taskId} → ${newId} (completed task takes precedence)`));
349
+ conflictCount++;
350
+ }
351
+ fs.rmSync(doc.filePath, { force: true });
352
+ console.log(chalk_1.default.gray(` Migrated: ${taskId}`));
353
+ }
354
+ console.log('');
355
+ console.log(chalk_1.default.green(`Logs-to-ledger migration complete.`));
356
+ console.log(chalk_1.default.gray(` Migrated to ledger: ${migratedCount}`));
357
+ if (skippedCount > 0) {
358
+ console.log(chalk_1.default.gray(` Skipped (in ledger): ${skippedCount}`));
359
+ }
360
+ if (conflictCount > 0) {
361
+ console.log(chalk_1.default.yellow(` ID conflicts fixed: ${conflictCount} board task(s) renamed`));
362
+ }
363
+ if (skippedCount > 0 && !options.force) {
364
+ console.log('');
365
+ console.log(chalk_1.default.gray('Tip: Use --force to also remove stale .md files that are already in the ledger.'));
366
+ }
367
+ }
368
+ function backupAndRemoveLegacyRoot(rootBrainfilePath, dotDir) {
369
+ const backupPath = uniquePath(path.join(dotDir, 'brainfile.root.legacy.bak'));
370
+ fs.mkdirSync(dotDir, { recursive: true });
371
+ fs.copyFileSync(rootBrainfilePath, backupPath);
372
+ fs.rmSync(rootBrainfilePath, { force: true });
373
+ return backupPath;
374
+ }
375
+ function uniquePath(basePath) {
376
+ if (!fs.existsSync(basePath))
377
+ return basePath;
378
+ const ext = path.extname(basePath);
379
+ const stem = basePath.slice(0, basePath.length - ext.length);
380
+ let i = 1;
381
+ while (true) {
382
+ const candidate = `${stem}.${i}${ext}`;
383
+ if (!fs.existsSync(candidate))
384
+ return candidate;
385
+ i++;
386
+ }
387
+ }
388
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type Column, type Task } from '@brainfile/core';
2
+ import { type Logger } from '../utils/logger';
3
+ interface MoveOptions {
4
+ file: string;
5
+ task: string;
6
+ column: string;
7
+ }
8
+ export interface MoveResult {
9
+ success: boolean;
10
+ movedTask: Task;
11
+ sourceColumn: Column;
12
+ targetColumn: Column;
13
+ }
14
+ export declare function moveCommand(options: MoveOptions, logger?: Logger): MoveResult;
15
+ export {};
16
+ //# sourceMappingURL=move.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move.d.ts","sourceRoot":"","sources":["../../src/commands/move.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmF,KAAK,MAAM,EAAE,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE1I,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAgB7D,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAuBD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAiBD,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,GAAE,MAAsB,GAAG,UAAU,CAyG5F"}
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.moveCommand = moveCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const core_1 = require("@brainfile/core");
40
+ const cli_error_1 = require("../utils/cli-error");
41
+ const logger_1 = require("../utils/logger");
42
+ const errorHandler_1 = require("../utils/errorHandler");
43
+ const brainfile_path_1 = require("../utils/brainfile-path");
44
+ const strict_validation_1 = require("../utils/strict-validation");
45
+ const core_2 = require("@brainfile/core");
46
+ const v2_detect_1 = require("../utils/v2-detect");
47
+ function getBoardTypes(board) {
48
+ const rawTypes = board.types;
49
+ return rawTypes && typeof rawTypes === 'object' ? rawTypes : {};
50
+ }
51
+ function isTaskCompletable(task, board) {
52
+ const taskType = task.type || 'task';
53
+ if (taskType === 'task') {
54
+ return true;
55
+ }
56
+ const typeConfig = getBoardTypes(board)[taskType];
57
+ return typeConfig?.completable !== false;
58
+ }
59
+ function assertSafeTaskId(taskId) {
60
+ const trimmed = taskId.trim();
61
+ if (!trimmed || trimmed !== taskId) {
62
+ throw (0, cli_error_1.operationFailed)(`Invalid task ID: ${taskId}`);
63
+ }
64
+ if (taskId === '.' || taskId === '..') {
65
+ throw (0, cli_error_1.operationFailed)(`Invalid task ID: ${taskId}`);
66
+ }
67
+ if (path.isAbsolute(taskId) || /[\\/]/.test(taskId)) {
68
+ throw (0, cli_error_1.operationFailed)(`Invalid task ID: ${taskId}`);
69
+ }
70
+ }
71
+ function moveCommand(options, logger = logger_1.defaultLogger) {
72
+ // Validate required options
73
+ if (!options.task) {
74
+ throw (0, cli_error_1.missingRequired)('--task', 'brainfile move --task <task-id> --column <column-name>');
75
+ }
76
+ if (!options.column) {
77
+ throw (0, cli_error_1.missingRequired)('--column', 'brainfile move --task <task-id> --column <column-name>');
78
+ }
79
+ // Resolve file path
80
+ const filePath = (0, brainfile_path_1.resolveCliBrainfilePath)(options.file);
81
+ // Check if file exists
82
+ if (!fs.existsSync(filePath)) {
83
+ throw (0, cli_error_1.fileNotFound)(filePath);
84
+ }
85
+ // V2 per-task file architecture
86
+ if ((0, v2_detect_1.isV2)(filePath)) {
87
+ return moveCommandV2(options, filePath, logger);
88
+ }
89
+ // Read and parse the file
90
+ const content = fs.readFileSync(filePath, 'utf-8');
91
+ const result = core_1.Brainfile.parseWithErrors(content);
92
+ if (!result.board) {
93
+ throw (0, cli_error_1.parseFailure)(result.error);
94
+ }
95
+ let board = result.board;
96
+ // Find the task using core query function
97
+ const taskInfo = (0, core_1.findTaskById)(board, options.task);
98
+ if (!taskInfo) {
99
+ // Collect available tasks for error details
100
+ const availableTasks = [];
101
+ board.columns.forEach(col => {
102
+ col.tasks.forEach(t => availableTasks.push(`${t.id}: ${t.title}`));
103
+ });
104
+ throw (0, cli_error_1.taskNotFound)(options.task, availableTasks);
105
+ }
106
+ const { task: foundTask, column: sourceColumn } = taskInfo;
107
+ // Find the target column by ID or name
108
+ let targetColumn = (0, core_1.findColumnById)(board, options.column);
109
+ if (!targetColumn) {
110
+ targetColumn = (0, core_1.findColumnByName)(board, options.column);
111
+ }
112
+ if (!targetColumn) {
113
+ const availableColumns = board.columns.map(c => `${c.id} (${c.title})`);
114
+ throw (0, cli_error_1.columnNotFound)(options.column, availableColumns);
115
+ }
116
+ // Check if already in target column
117
+ if (sourceColumn.id === targetColumn.id) {
118
+ logger.warn(`Task ${options.task} is already in column "${targetColumn.title}"`);
119
+ return {
120
+ success: true,
121
+ movedTask: foundTask,
122
+ sourceColumn,
123
+ targetColumn
124
+ };
125
+ }
126
+ // Move task using core operation (immutable)
127
+ const moveResult = (0, core_1.moveTask)(board, options.task, sourceColumn.id, targetColumn.id, targetColumn.tasks.length // Move to end of target column
128
+ );
129
+ if (!moveResult.success) {
130
+ throw (0, cli_error_1.operationFailed)(moveResult.error);
131
+ }
132
+ // Serialize and write back
133
+ const updatedContent = core_1.Brainfile.serialize(moveResult.board);
134
+ fs.writeFileSync(filePath, updatedContent, 'utf-8');
135
+ // Success message
136
+ logger.log('Task moved successfully!');
137
+ logger.log('');
138
+ logger.log(` Task: ${foundTask.id} - ${foundTask.title}`);
139
+ logger.log(` From: ${sourceColumn.title}`);
140
+ logger.log(` To: ${targetColumn.title}`);
141
+ // Soft error: warn about incomplete subtasks when moving to done-like column
142
+ const warning = (0, errorHandler_1.getIncompleteSubtasksWarning)(foundTask, targetColumn);
143
+ if (warning) {
144
+ logger.warn('');
145
+ logger.warn(warning);
146
+ }
147
+ return {
148
+ success: true,
149
+ movedTask: foundTask,
150
+ sourceColumn,
151
+ targetColumn
152
+ };
153
+ }
154
+ function moveCommandV2(options, filePath, logger) {
155
+ assertSafeTaskId(options.task);
156
+ const dirs = (0, v2_detect_1.getV2Dirs)(filePath);
157
+ const board = (0, v2_detect_1.readV2BoardConfig)(filePath);
158
+ const found = (0, v2_detect_1.findV2Task)(dirs, options.task, false);
159
+ if (!found || found.isLog) {
160
+ throw (0, cli_error_1.taskNotFound)(options.task);
161
+ }
162
+ const { doc, filePath: taskPath } = found;
163
+ const task = doc.task;
164
+ const sourceColumnId = task.column || '';
165
+ // Find source and target columns from board config (title aliases still supported)
166
+ const sourceColumn = board.columns.find(c => c.id === sourceColumnId);
167
+ let configuredTargetColumn = board.columns.find(c => c.id === options.column);
168
+ if (!configuredTargetColumn) {
169
+ configuredTargetColumn = board.columns.find(c => c.title.toLowerCase() === options.column.toLowerCase());
170
+ }
171
+ // Strict boards must target a configured column; non-strict boards allow any column ID.
172
+ const targetColumnId = configuredTargetColumn?.id || options.column;
173
+ const columnValidation = (0, strict_validation_1.validateColumn)(board, targetColumnId);
174
+ if (!columnValidation.valid) {
175
+ throw new cli_error_1.CLIError(columnValidation.error || `Invalid column: ${targetColumnId}`);
176
+ }
177
+ const targetColumn = configuredTargetColumn || { id: options.column, title: options.column, tasks: [] };
178
+ if (sourceColumnId === targetColumn.id) {
179
+ logger.warn(`Task ${options.task} is already in column "${targetColumn.title}"`);
180
+ return {
181
+ success: true,
182
+ movedTask: task,
183
+ sourceColumn: sourceColumn || { id: sourceColumnId, title: sourceColumnId, tasks: [] },
184
+ targetColumn
185
+ };
186
+ }
187
+ // Calculate new position (append to end)
188
+ const targetTasks = (0, core_2.readTasksDir)(dirs.boardDir)
189
+ .filter(t => t.task.column === targetColumn.id);
190
+ const newPosition = targetTasks.length;
191
+ // Update task
192
+ task.column = targetColumn.id;
193
+ task.position = newPosition;
194
+ (0, core_2.writeTaskFile)(taskPath, task, doc.body);
195
+ const shouldAutoComplete = targetColumn.completionColumn === true && isTaskCompletable(task, board);
196
+ let movedTask = task;
197
+ if (shouldAutoComplete) {
198
+ const completeResult = (0, core_2.completeTaskFile)(taskPath, dirs.logsDir);
199
+ if (!completeResult.success || !completeResult.task) {
200
+ throw (0, cli_error_1.operationFailed)(completeResult.error || `Failed to complete task: ${task.id}`);
201
+ }
202
+ movedTask = completeResult.task;
203
+ }
204
+ logger.log('Task moved successfully!');
205
+ logger.log('');
206
+ logger.log(` Task: ${task.id} - ${task.title}`);
207
+ logger.log(` From: ${sourceColumn?.title || sourceColumnId}`);
208
+ logger.log(` To: ${targetColumn.title}`);
209
+ if (shouldAutoComplete) {
210
+ logger.log(' Status: Completed (moved to logs/)');
211
+ }
212
+ // Soft error: warn about incomplete subtasks when moving to done-like column
213
+ const warning = (0, errorHandler_1.getIncompleteSubtasksWarning)(task, targetColumn);
214
+ if (warning) {
215
+ logger.warn('');
216
+ logger.warn(warning);
217
+ }
218
+ return {
219
+ success: true,
220
+ movedTask,
221
+ sourceColumn: sourceColumn || { id: sourceColumnId, title: sourceColumnId, tasks: [] },
222
+ targetColumn
223
+ };
224
+ }
225
+ //# sourceMappingURL=move.js.map