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,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSearchQuery = parseSearchQuery;
4
+ exports.taskMatchesFilter = taskMatchesFilter;
5
+ exports.truncate = truncate;
6
+ exports.getPriorityColor = getPriorityColor;
7
+ const theme_js_1 = require("./theme.js");
8
+ /**
9
+ * Parse search query to extract structured filters
10
+ * Supports: p:high, t:bug, #tag, @assignee, due:overdue, contract:ready
11
+ */
12
+ function parseSearchQuery(query) {
13
+ const result = { text: '' };
14
+ const parts = [];
15
+ // Split by spaces but preserve quoted strings (future enhancement)
16
+ const tokens = query.trim().split(/\s+/);
17
+ for (const token of tokens) {
18
+ const lower = token.toLowerCase();
19
+ // Priority filter: p:high or priority:critical
20
+ if (lower.startsWith('p:') || lower.startsWith('priority:')) {
21
+ result.priority = token.split(':')[1]?.toLowerCase();
22
+ continue;
23
+ }
24
+ // Tag filter: t:bug, tag:feature, or #hashtag
25
+ if (lower.startsWith('t:') || lower.startsWith('tag:')) {
26
+ result.tag = token.split(':')[1]?.toLowerCase();
27
+ continue;
28
+ }
29
+ if (token.startsWith('#') && token.length > 1) {
30
+ result.tag = token.slice(1).toLowerCase();
31
+ continue;
32
+ }
33
+ // Assignee filter: @john or assignee:john
34
+ if (token.startsWith('@') && token.length > 1) {
35
+ result.assignee = token.slice(1).toLowerCase();
36
+ continue;
37
+ }
38
+ if (lower.startsWith('assignee:')) {
39
+ result.assignee = token.split(':')[1]?.toLowerCase();
40
+ continue;
41
+ }
42
+ // Due date filter: due:overdue, due:today, due:week, due:month
43
+ if (lower.startsWith('due:')) {
44
+ const value = lower.split(':')[1];
45
+ if (['overdue', 'today', 'week', 'month'].includes(value)) {
46
+ result.due = value;
47
+ }
48
+ continue;
49
+ }
50
+ // Contract status filter: contract:ready, contract:in_progress, contract:delivered, contract:done, contract:failed
51
+ if (lower.startsWith('contract:')) {
52
+ const value = lower.split(':')[1];
53
+ if (['ready', 'in_progress', 'delivered', 'done', 'failed'].includes(value)) {
54
+ result.contract = value;
55
+ }
56
+ continue;
57
+ }
58
+ // Not a filter, add to text search
59
+ parts.push(token);
60
+ }
61
+ result.text = parts.join(' ').toLowerCase();
62
+ return result;
63
+ }
64
+ /**
65
+ * Check if a task matches the parsed search filters
66
+ */
67
+ function taskMatchesFilter(task, filter) {
68
+ // Priority filter
69
+ if (filter.priority) {
70
+ if (!task.priority || task.priority.toLowerCase() !== filter.priority) {
71
+ return false;
72
+ }
73
+ }
74
+ // Tag filter
75
+ if (filter.tag) {
76
+ if (!task.tags || !task.tags.some(t => t.toLowerCase().includes(filter.tag))) {
77
+ return false;
78
+ }
79
+ }
80
+ // Assignee filter
81
+ if (filter.assignee) {
82
+ if (!task.assignee || !task.assignee.toLowerCase().includes(filter.assignee)) {
83
+ return false;
84
+ }
85
+ }
86
+ // Due date filter
87
+ if (filter.due && task.dueDate) {
88
+ const due = new Date(task.dueDate);
89
+ const now = new Date();
90
+ const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
91
+ const diffDays = Math.ceil((due.getTime() - today.getTime()) / (1000 * 60 * 60 * 24));
92
+ switch (filter.due) {
93
+ case 'overdue':
94
+ if (diffDays >= 0)
95
+ return false;
96
+ break;
97
+ case 'today':
98
+ if (diffDays !== 0)
99
+ return false;
100
+ break;
101
+ case 'week':
102
+ if (diffDays < 0 || diffDays > 7)
103
+ return false;
104
+ break;
105
+ case 'month':
106
+ if (diffDays < 0 || diffDays > 30)
107
+ return false;
108
+ break;
109
+ }
110
+ }
111
+ else if (filter.due) {
112
+ // Due filter specified but task has no due date
113
+ return false;
114
+ }
115
+ // Contract status filter
116
+ if (filter.contract) {
117
+ const contractStatus = task.contract?.status;
118
+ if (!contractStatus || contractStatus !== filter.contract) {
119
+ return false;
120
+ }
121
+ }
122
+ // Text search (substring match across multiple fields)
123
+ if (filter.text) {
124
+ const searchText = filter.text;
125
+ const matchesText = task.title.toLowerCase().includes(searchText) ||
126
+ task.id.toLowerCase().includes(searchText) ||
127
+ task.tags?.some(t => t.toLowerCase().includes(searchText)) ||
128
+ task.priority?.toLowerCase().includes(searchText) ||
129
+ task.description?.toLowerCase().includes(searchText) ||
130
+ task.assignee?.toLowerCase().includes(searchText);
131
+ if (!matchesText)
132
+ return false;
133
+ }
134
+ return true;
135
+ }
136
+ function truncate(value, maxLength) {
137
+ if (!value)
138
+ return ' '; // Return space instead of empty string for Ink compatibility
139
+ if (maxLength <= 0)
140
+ return ' ';
141
+ if (value.length <= maxLength)
142
+ return value;
143
+ return `${value.slice(0, Math.max(1, maxLength - 1))}…`;
144
+ }
145
+ function getPriorityColor(priority) {
146
+ switch (priority?.toLowerCase()) {
147
+ case 'critical':
148
+ return theme_js_1.PALETTE.critical;
149
+ case 'giga':
150
+ return theme_js_1.PALETTE.giga;
151
+ case 'high':
152
+ return theme_js_1.PALETTE.high;
153
+ case 'medium':
154
+ return theme_js_1.PALETTE.medium;
155
+ case 'low':
156
+ return theme_js_1.PALETTE.low;
157
+ default:
158
+ return theme_js_1.PALETTE.border;
159
+ }
160
+ }
161
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tui/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Archive utilities for Brainfile CLI
3
+ *
4
+ * Per protocol spec, archived tasks go to a separate brainfile-archive.md file,
5
+ * NOT to an inline archive array in the main brainfile.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { type Board, type Task } from '@brainfile/core';
10
+ export interface ArchiveResult {
11
+ success: boolean;
12
+ error?: string;
13
+ board?: Board;
14
+ archiveBoard?: Board;
15
+ }
16
+ export interface LoadArchiveResult {
17
+ tasks: Task[];
18
+ archivePath: string;
19
+ error?: string;
20
+ }
21
+ /**
22
+ * Get the archive file path for a given brainfile
23
+ * brainfile.md -> brainfile-archive.md
24
+ */
25
+ export declare function getArchivePath(filePath: string): string;
26
+ /**
27
+ * Create an empty archive board structure
28
+ */
29
+ export declare function createEmptyArchiveBoard(): Board;
30
+ /**
31
+ * Load archived tasks from the separate archive file
32
+ */
33
+ export declare function loadArchivedTasks(filePath: string): LoadArchiveResult;
34
+ /**
35
+ * Read the archive board (full structure)
36
+ */
37
+ export declare function readArchiveBoard(filePath: string): {
38
+ board: Board | null;
39
+ archivePath: string;
40
+ error?: string;
41
+ };
42
+ /**
43
+ * Archive a task to the separate archive file
44
+ *
45
+ * 1. Removes task from main board
46
+ * 2. Adds task to brainfile-archive.md
47
+ */
48
+ export declare function archiveTaskToFile(filePath: string, board: Board, columnId: string, taskId: string): ArchiveResult;
49
+ /**
50
+ * Remove a task from the archive file (after exporting to external service)
51
+ */
52
+ export declare function removeFromArchive(filePath: string, taskId: string): ArchiveResult;
53
+ /**
54
+ * Restore a task from archive to a column in the main brainfile
55
+ */
56
+ export declare function restoreFromArchive(filePath: string, taskId: string, toColumnId: string): ArchiveResult;
57
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/utils/archive.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAyB,KAAK,KAAK,EAAE,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAM/E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,KAAK,CAM/C;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAuBrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAuB/G;AAMD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,aAAa,CA2Df;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CA0CjF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,aAAa,CAwEf"}
@@ -0,0 +1,304 @@
1
+ "use strict";
2
+ /**
3
+ * Archive utilities for Brainfile CLI
4
+ *
5
+ * Per protocol spec, archived tasks go to a separate brainfile-archive.md file,
6
+ * NOT to an inline archive array in the main brainfile.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.getArchivePath = getArchivePath;
45
+ exports.createEmptyArchiveBoard = createEmptyArchiveBoard;
46
+ exports.loadArchivedTasks = loadArchivedTasks;
47
+ exports.readArchiveBoard = readArchiveBoard;
48
+ exports.archiveTaskToFile = archiveTaskToFile;
49
+ exports.removeFromArchive = removeFromArchive;
50
+ exports.restoreFromArchive = restoreFromArchive;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const core_1 = require("@brainfile/core");
54
+ // ============================================================================
55
+ // Path Helpers
56
+ // ============================================================================
57
+ /**
58
+ * Get the archive file path for a given brainfile
59
+ * brainfile.md -> brainfile-archive.md
60
+ */
61
+ function getArchivePath(filePath) {
62
+ const dir = path.dirname(filePath);
63
+ const filename = path.basename(filePath);
64
+ const archiveFilename = filename.replace(/\.md$/, '-archive.md');
65
+ return path.join(dir, archiveFilename);
66
+ }
67
+ /**
68
+ * Create an empty archive board structure
69
+ */
70
+ function createEmptyArchiveBoard() {
71
+ return {
72
+ title: 'Archive',
73
+ columns: [],
74
+ archive: [],
75
+ };
76
+ }
77
+ // ============================================================================
78
+ // Read Operations
79
+ // ============================================================================
80
+ /**
81
+ * Load archived tasks from the separate archive file
82
+ */
83
+ function loadArchivedTasks(filePath) {
84
+ const archivePath = getArchivePath(filePath);
85
+ if (!fs.existsSync(archivePath)) {
86
+ return { tasks: [], archivePath };
87
+ }
88
+ try {
89
+ const archiveContent = fs.readFileSync(archivePath, 'utf-8');
90
+ const parseResult = core_1.Brainfile.parseWithErrors(archiveContent);
91
+ if (parseResult.board && Array.isArray(parseResult.board.archive)) {
92
+ return { tasks: parseResult.board.archive, archivePath };
93
+ }
94
+ return { tasks: [], archivePath };
95
+ }
96
+ catch (err) {
97
+ return {
98
+ tasks: [],
99
+ archivePath,
100
+ error: `Failed to read archive: ${err instanceof Error ? err.message : String(err)}`,
101
+ };
102
+ }
103
+ }
104
+ /**
105
+ * Read the archive board (full structure)
106
+ */
107
+ function readArchiveBoard(filePath) {
108
+ const archivePath = getArchivePath(filePath);
109
+ if (!fs.existsSync(archivePath)) {
110
+ return { board: null, archivePath };
111
+ }
112
+ try {
113
+ const archiveContent = fs.readFileSync(archivePath, 'utf-8');
114
+ const parseResult = core_1.Brainfile.parseWithErrors(archiveContent);
115
+ if (parseResult.board) {
116
+ return { board: parseResult.board, archivePath };
117
+ }
118
+ return { board: null, archivePath, error: parseResult.error };
119
+ }
120
+ catch (err) {
121
+ return {
122
+ board: null,
123
+ archivePath,
124
+ error: `Failed to read archive: ${err instanceof Error ? err.message : String(err)}`,
125
+ };
126
+ }
127
+ }
128
+ // ============================================================================
129
+ // Write Operations
130
+ // ============================================================================
131
+ /**
132
+ * Archive a task to the separate archive file
133
+ *
134
+ * 1. Removes task from main board
135
+ * 2. Adds task to brainfile-archive.md
136
+ */
137
+ function archiveTaskToFile(filePath, board, columnId, taskId) {
138
+ const taskInfo = board.columns.find((c) => c.id === columnId)?.tasks.find((t) => t.id === taskId);
139
+ if (!taskInfo) {
140
+ return { success: false, error: `Task ${taskId} not found in column ${columnId}` };
141
+ }
142
+ const task = taskInfo;
143
+ // Remove task from the main board
144
+ const result = (0, core_1.deleteTask)(board, columnId, taskId);
145
+ if (!result.success) {
146
+ return { success: false, error: result.error };
147
+ }
148
+ // Save the main board without the task
149
+ try {
150
+ const mainContent = core_1.Brainfile.serialize(result.board);
151
+ fs.writeFileSync(filePath, mainContent, 'utf-8');
152
+ }
153
+ catch (err) {
154
+ return {
155
+ success: false,
156
+ error: `Failed to write main file: ${err instanceof Error ? err.message : String(err)}`,
157
+ };
158
+ }
159
+ // Add task to separate archive file
160
+ const archivePath = getArchivePath(filePath);
161
+ let archiveBoard;
162
+ if (fs.existsSync(archivePath)) {
163
+ try {
164
+ const archiveContent = fs.readFileSync(archivePath, 'utf-8');
165
+ const parseResult = core_1.Brainfile.parseWithErrors(archiveContent);
166
+ archiveBoard = parseResult.board || createEmptyArchiveBoard();
167
+ }
168
+ catch {
169
+ archiveBoard = createEmptyArchiveBoard();
170
+ }
171
+ }
172
+ else {
173
+ archiveBoard = createEmptyArchiveBoard();
174
+ }
175
+ // Add task to archive (at beginning)
176
+ if (!archiveBoard.archive) {
177
+ archiveBoard.archive = [];
178
+ }
179
+ archiveBoard.archive.unshift(task);
180
+ // Save archive file
181
+ try {
182
+ const archiveContent = core_1.Brainfile.serialize(archiveBoard);
183
+ fs.writeFileSync(archivePath, archiveContent, 'utf-8');
184
+ }
185
+ catch (err) {
186
+ return {
187
+ success: false,
188
+ error: `Task removed from board but failed to write archive: ${err instanceof Error ? err.message : String(err)}`,
189
+ };
190
+ }
191
+ return { success: true, board: result.board, archiveBoard };
192
+ }
193
+ /**
194
+ * Remove a task from the archive file (after exporting to external service)
195
+ */
196
+ function removeFromArchive(filePath, taskId) {
197
+ const archivePath = getArchivePath(filePath);
198
+ if (!fs.existsSync(archivePath)) {
199
+ return { success: false, error: 'Archive file not found' };
200
+ }
201
+ let archiveBoard;
202
+ try {
203
+ const archiveContent = fs.readFileSync(archivePath, 'utf-8');
204
+ const parseResult = core_1.Brainfile.parseWithErrors(archiveContent);
205
+ if (!parseResult.board) {
206
+ return { success: false, error: 'Failed to parse archive file' };
207
+ }
208
+ archiveBoard = parseResult.board;
209
+ }
210
+ catch (err) {
211
+ return {
212
+ success: false,
213
+ error: `Failed to read archive: ${err instanceof Error ? err.message : String(err)}`,
214
+ };
215
+ }
216
+ // Remove task from archive
217
+ const originalLength = archiveBoard.archive?.length || 0;
218
+ archiveBoard.archive = (archiveBoard.archive || []).filter((t) => t.id !== taskId);
219
+ if (archiveBoard.archive.length === originalLength) {
220
+ return { success: false, error: `Task ${taskId} not found in archive` };
221
+ }
222
+ // Save updated archive
223
+ try {
224
+ const archiveContent = core_1.Brainfile.serialize(archiveBoard);
225
+ fs.writeFileSync(archivePath, archiveContent, 'utf-8');
226
+ }
227
+ catch (err) {
228
+ return {
229
+ success: false,
230
+ error: `Failed to write archive: ${err instanceof Error ? err.message : String(err)}`,
231
+ };
232
+ }
233
+ return { success: true, archiveBoard };
234
+ }
235
+ /**
236
+ * Restore a task from archive to a column in the main brainfile
237
+ */
238
+ function restoreFromArchive(filePath, taskId, toColumnId) {
239
+ const archivePath = getArchivePath(filePath);
240
+ // Read archive
241
+ if (!fs.existsSync(archivePath)) {
242
+ return { success: false, error: 'Archive file not found' };
243
+ }
244
+ let archiveBoard;
245
+ try {
246
+ const archiveContent = fs.readFileSync(archivePath, 'utf-8');
247
+ const parseResult = core_1.Brainfile.parseWithErrors(archiveContent);
248
+ if (!parseResult.board) {
249
+ return { success: false, error: 'Failed to parse archive file' };
250
+ }
251
+ archiveBoard = parseResult.board;
252
+ }
253
+ catch (err) {
254
+ return {
255
+ success: false,
256
+ error: `Failed to read archive: ${err instanceof Error ? err.message : String(err)}`,
257
+ };
258
+ }
259
+ // Find task in archive
260
+ const task = archiveBoard.archive?.find((t) => t.id === taskId);
261
+ if (!task) {
262
+ return { success: false, error: `Task ${taskId} not found in archive` };
263
+ }
264
+ // Read main brainfile
265
+ let board;
266
+ try {
267
+ const mainContent = fs.readFileSync(filePath, 'utf-8');
268
+ const parseResult = core_1.Brainfile.parseWithErrors(mainContent);
269
+ if (!parseResult.board) {
270
+ return { success: false, error: 'Failed to parse main brainfile' };
271
+ }
272
+ board = parseResult.board;
273
+ }
274
+ catch (err) {
275
+ return {
276
+ success: false,
277
+ error: `Failed to read main file: ${err instanceof Error ? err.message : String(err)}`,
278
+ };
279
+ }
280
+ // Find target column
281
+ const targetColumn = board.columns.find((c) => c.id === toColumnId);
282
+ if (!targetColumn) {
283
+ return { success: false, error: `Column ${toColumnId} not found` };
284
+ }
285
+ // Add task to column
286
+ targetColumn.tasks.push(task);
287
+ // Remove from archive
288
+ archiveBoard.archive = archiveBoard.archive.filter((t) => t.id !== taskId);
289
+ // Save both files
290
+ try {
291
+ const mainContent = core_1.Brainfile.serialize(board);
292
+ fs.writeFileSync(filePath, mainContent, 'utf-8');
293
+ const archiveContent = core_1.Brainfile.serialize(archiveBoard);
294
+ fs.writeFileSync(archivePath, archiveContent, 'utf-8');
295
+ }
296
+ catch (err) {
297
+ return {
298
+ success: false,
299
+ error: `Failed to save files: ${err instanceof Error ? err.message : String(err)}`,
300
+ };
301
+ }
302
+ return { success: true, board, archiveBoard };
303
+ }
304
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/utils/archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Authentication token storage for Brainfile CLI
3
+ *
4
+ * Stores tokens with the following priority:
5
+ * 1. System keychain (via keytar, if available)
6
+ * 2. Config file (~/.config/brainfile/auth.json)
7
+ * 3. Environment variables (read-only)
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ export type AuthProvider = 'github' | 'linear';
12
+ export interface StoredToken {
13
+ token: string;
14
+ savedAt: string;
15
+ username?: string;
16
+ workspace?: string;
17
+ }
18
+ /**
19
+ * Try to get GitHub token from gh CLI
20
+ * @returns Token from gh CLI, or null if not available
21
+ */
22
+ export declare function getGitHubCLIToken(): string | null;
23
+ /**
24
+ * Check if gh CLI is installed and authenticated
25
+ */
26
+ export declare function isGitHubCLIAvailable(): boolean;
27
+ export declare class AuthStore {
28
+ /**
29
+ * Get a token for a provider
30
+ * Checks: env vars → keychain → config file → gh CLI (for github)
31
+ */
32
+ get(provider: AuthProvider): Promise<string | null>;
33
+ /**
34
+ * Get stored token info (includes metadata like username)
35
+ */
36
+ getTokenInfo(provider: AuthProvider): Promise<StoredToken | null>;
37
+ /**
38
+ * Store a token for a provider
39
+ * Stores in: keychain (if available) AND config file (for metadata)
40
+ */
41
+ set(provider: AuthProvider, token: string, metadata?: {
42
+ username?: string;
43
+ workspace?: string;
44
+ }): Promise<void>;
45
+ /**
46
+ * Clear a token for a provider
47
+ */
48
+ clear(provider: AuthProvider): Promise<void>;
49
+ /**
50
+ * Check if a provider is authenticated
51
+ */
52
+ isAuthenticated(provider: AuthProvider): Promise<boolean>;
53
+ /**
54
+ * Get authentication status for all providers
55
+ */
56
+ getStatus(): Promise<Record<AuthProvider, {
57
+ authenticated: boolean;
58
+ source?: string;
59
+ username?: string;
60
+ }>>;
61
+ private getFromEnv;
62
+ private loadAuthFile;
63
+ private saveAuthFile;
64
+ private getFromFile;
65
+ private saveToFile;
66
+ private removeFromFile;
67
+ }
68
+ export declare const authStore: AuthStore;
69
+ //# sourceMappingURL=auth-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-store.d.ts","sourceRoot":"","sources":["../../src/utils/auth-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmDD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAejD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAMD,qBAAa,SAAS;IACpB;;;OAGG;IACG,GAAG,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkCzD;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAMvE;;;OAGG;IACG,GAAG,CACP,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GACnD,OAAO,CAAC,IAAI,CAAC;IAqBhB;;OAEG;IACG,KAAK,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAelD;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/D;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAyDhH,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,cAAc;CAKvB;AAGD,eAAO,MAAM,SAAS,WAAkB,CAAC"}