@bosun-sh/logbook 1.0.0 → 2.0.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 (455) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/README.md +252 -272
  3. package/bin/logbook.cjs +18 -0
  4. package/dist/context/attachments.d.ts +55 -0
  5. package/dist/context/attachments.d.ts.map +1 -0
  6. package/dist/context/attachments.js +329 -0
  7. package/dist/context/attachments.js.map +1 -0
  8. package/dist/context/create.d.ts +31 -0
  9. package/dist/context/create.d.ts.map +1 -0
  10. package/dist/context/create.js +101 -0
  11. package/dist/context/create.js.map +1 -0
  12. package/dist/context/delete.d.ts +20 -0
  13. package/dist/context/delete.d.ts.map +1 -0
  14. package/dist/context/delete.js +55 -0
  15. package/dist/context/delete.js.map +1 -0
  16. package/dist/context/get.d.ts +20 -0
  17. package/dist/context/get.d.ts.map +1 -0
  18. package/dist/context/get.js +55 -0
  19. package/dist/context/get.js.map +1 -0
  20. package/dist/context/list.d.ts +30 -0
  21. package/dist/context/list.d.ts.map +1 -0
  22. package/dist/context/list.js +172 -0
  23. package/dist/context/list.js.map +1 -0
  24. package/dist/context/schema.d.ts +156 -0
  25. package/dist/context/schema.d.ts.map +1 -0
  26. package/dist/context/schema.js +34 -0
  27. package/dist/context/schema.js.map +1 -0
  28. package/dist/context/search.d.ts +27 -0
  29. package/dist/context/search.d.ts.map +1 -0
  30. package/dist/context/search.js +266 -0
  31. package/dist/context/search.js.map +1 -0
  32. package/dist/context/topics.d.ts +4 -0
  33. package/dist/context/topics.d.ts.map +1 -0
  34. package/dist/context/topics.js +54 -0
  35. package/dist/context/topics.js.map +1 -0
  36. package/dist/context/update.d.ts +29 -0
  37. package/dist/context/update.d.ts.map +1 -0
  38. package/dist/context/update.js +134 -0
  39. package/dist/context/update.js.map +1 -0
  40. package/dist/epic/cascade-delete.d.ts +30 -0
  41. package/dist/epic/cascade-delete.d.ts.map +1 -0
  42. package/dist/epic/cascade-delete.js +173 -0
  43. package/dist/epic/cascade-delete.js.map +1 -0
  44. package/dist/epic/create.d.ts +24 -0
  45. package/dist/epic/create.d.ts.map +1 -0
  46. package/dist/epic/create.js +54 -0
  47. package/dist/epic/create.js.map +1 -0
  48. package/dist/epic/delete.d.ts +21 -0
  49. package/dist/epic/delete.d.ts.map +1 -0
  50. package/dist/epic/delete.js +42 -0
  51. package/dist/epic/delete.js.map +1 -0
  52. package/dist/epic/get.d.ts +19 -0
  53. package/dist/epic/get.d.ts.map +1 -0
  54. package/dist/epic/get.js +31 -0
  55. package/dist/epic/get.js.map +1 -0
  56. package/dist/epic/list.d.ts +25 -0
  57. package/dist/epic/list.d.ts.map +1 -0
  58. package/dist/epic/list.js +114 -0
  59. package/dist/epic/list.js.map +1 -0
  60. package/dist/epic/rules.d.ts +34 -0
  61. package/dist/epic/rules.d.ts.map +1 -0
  62. package/dist/epic/rules.js +127 -0
  63. package/dist/epic/rules.js.map +1 -0
  64. package/dist/epic/schema.d.ts +85 -0
  65. package/dist/epic/schema.d.ts.map +1 -0
  66. package/dist/epic/schema.js +14 -0
  67. package/dist/epic/schema.js.map +1 -0
  68. package/dist/epic/update.d.ts +25 -0
  69. package/dist/epic/update.d.ts.map +1 -0
  70. package/dist/epic/update.js +69 -0
  71. package/dist/epic/update.js.map +1 -0
  72. package/dist/hook/list.d.ts +71 -0
  73. package/dist/hook/list.d.ts.map +1 -0
  74. package/dist/hook/list.js +364 -0
  75. package/dist/hook/list.js.map +1 -0
  76. package/dist/hook/ports.d.ts +16 -0
  77. package/dist/hook/ports.d.ts.map +1 -0
  78. package/dist/hook/ports.js +3 -0
  79. package/dist/hook/ports.js.map +1 -0
  80. package/dist/hook/run.d.ts +24 -0
  81. package/dist/hook/run.d.ts.map +1 -0
  82. package/dist/hook/run.js +185 -0
  83. package/dist/hook/run.js.map +1 -0
  84. package/dist/index.d.ts +31 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +31 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/plugin/hook-tools.d.ts +8 -0
  89. package/dist/plugin/hook-tools.d.ts.map +1 -0
  90. package/dist/plugin/hook-tools.js +31 -0
  91. package/dist/plugin/hook-tools.js.map +1 -0
  92. package/dist/plugin/linear-pull-tool.d.ts +20 -0
  93. package/dist/plugin/linear-pull-tool.d.ts.map +1 -0
  94. package/dist/plugin/linear-pull-tool.js +19 -0
  95. package/dist/plugin/linear-pull-tool.js.map +1 -0
  96. package/dist/plugin/linear-push-tool.d.ts +20 -0
  97. package/dist/plugin/linear-push-tool.d.ts.map +1 -0
  98. package/dist/plugin/linear-push-tool.js +27 -0
  99. package/dist/plugin/linear-push-tool.js.map +1 -0
  100. package/dist/plugin/linear-setup-tool.d.ts +2 -0
  101. package/dist/plugin/linear-setup-tool.d.ts.map +1 -0
  102. package/dist/plugin/linear-setup-tool.js +22 -0
  103. package/dist/plugin/linear-setup-tool.js.map +1 -0
  104. package/dist/plugin/linear-status-tool.d.ts +10 -0
  105. package/dist/plugin/linear-status-tool.d.ts.map +1 -0
  106. package/dist/plugin/linear-status-tool.js +10 -0
  107. package/dist/plugin/linear-status-tool.js.map +1 -0
  108. package/dist/plugin/list.d.ts +15 -0
  109. package/dist/plugin/list.d.ts.map +1 -0
  110. package/dist/plugin/list.js +87 -0
  111. package/dist/plugin/list.js.map +1 -0
  112. package/dist/plugin/public-schemas.d.ts +42 -0
  113. package/dist/plugin/public-schemas.d.ts.map +1 -0
  114. package/dist/plugin/public-schemas.js +577 -0
  115. package/dist/plugin/public-schemas.js.map +1 -0
  116. package/dist/plugin/registry.d.ts +3 -0
  117. package/dist/plugin/registry.d.ts.map +1 -0
  118. package/dist/plugin/registry.js +3 -0
  119. package/dist/plugin/registry.js.map +1 -0
  120. package/dist/plugin/results.d.ts +8 -0
  121. package/dist/plugin/results.d.ts.map +1 -0
  122. package/dist/plugin/results.js +114 -0
  123. package/dist/plugin/results.js.map +1 -0
  124. package/dist/plugin/sync-conflict-tools.d.ts +2 -0
  125. package/dist/plugin/sync-conflict-tools.d.ts.map +1 -0
  126. package/dist/plugin/sync-conflict-tools.js +5 -0
  127. package/dist/plugin/sync-conflict-tools.js.map +1 -0
  128. package/dist/plugin/tool-registry.d.ts +23 -0
  129. package/dist/plugin/tool-registry.d.ts.map +1 -0
  130. package/dist/plugin/tool-registry.js +251 -0
  131. package/dist/plugin/tool-registry.js.map +1 -0
  132. package/dist/plugin/workspace-init-tool.d.ts +2 -0
  133. package/dist/plugin/workspace-init-tool.d.ts.map +1 -0
  134. package/dist/plugin/workspace-init-tool.js +16 -0
  135. package/dist/plugin/workspace-init-tool.js.map +1 -0
  136. package/dist/plugin/workspace-status-tool.d.ts +2 -0
  137. package/dist/plugin/workspace-status-tool.d.ts.map +1 -0
  138. package/dist/plugin/workspace-status-tool.js +15 -0
  139. package/dist/plugin/workspace-status-tool.js.map +1 -0
  140. package/dist/shared/ids.d.ts +3 -0
  141. package/dist/shared/ids.d.ts.map +1 -0
  142. package/dist/shared/ids.js +15 -0
  143. package/dist/shared/ids.js.map +1 -0
  144. package/dist/shared/pagination.d.ts +19 -0
  145. package/dist/shared/pagination.d.ts.map +1 -0
  146. package/dist/shared/pagination.js +110 -0
  147. package/dist/shared/pagination.js.map +1 -0
  148. package/dist/shared/result.d.ts +20 -0
  149. package/dist/shared/result.d.ts.map +1 -0
  150. package/dist/shared/result.js +6 -0
  151. package/dist/shared/result.js.map +1 -0
  152. package/dist/shared/schema/value-objects.d.ts +363 -0
  153. package/dist/shared/schema/value-objects.d.ts.map +1 -0
  154. package/dist/shared/schema/value-objects.js +112 -0
  155. package/dist/shared/schema/value-objects.js.map +1 -0
  156. package/dist/shared/storage/atomic-write.d.ts +25 -0
  157. package/dist/shared/storage/atomic-write.d.ts.map +1 -0
  158. package/dist/shared/storage/atomic-write.js +71 -0
  159. package/dist/shared/storage/atomic-write.js.map +1 -0
  160. package/dist/shared/storage/jsonl-repository.d.ts +85 -0
  161. package/dist/shared/storage/jsonl-repository.d.ts.map +1 -0
  162. package/dist/shared/storage/jsonl-repository.js +278 -0
  163. package/dist/shared/storage/jsonl-repository.js.map +1 -0
  164. package/dist/shared/storage/transaction.d.ts +3 -0
  165. package/dist/shared/storage/transaction.d.ts.map +1 -0
  166. package/dist/shared/storage/transaction.js +22 -0
  167. package/dist/shared/storage/transaction.js.map +1 -0
  168. package/dist/shared/time.d.ts +3 -0
  169. package/dist/shared/time.d.ts.map +1 -0
  170. package/dist/shared/time.js +3 -0
  171. package/dist/shared/time.js.map +1 -0
  172. package/dist/story/cascade-delete.d.ts +22 -0
  173. package/dist/story/cascade-delete.d.ts.map +1 -0
  174. package/dist/story/cascade-delete.js +117 -0
  175. package/dist/story/cascade-delete.js.map +1 -0
  176. package/dist/story/create.d.ts +30 -0
  177. package/dist/story/create.d.ts.map +1 -0
  178. package/dist/story/create.js +69 -0
  179. package/dist/story/create.js.map +1 -0
  180. package/dist/story/delete.d.ts +21 -0
  181. package/dist/story/delete.d.ts.map +1 -0
  182. package/dist/story/delete.js +42 -0
  183. package/dist/story/delete.js.map +1 -0
  184. package/dist/story/get.d.ts +19 -0
  185. package/dist/story/get.d.ts.map +1 -0
  186. package/dist/story/get.js +31 -0
  187. package/dist/story/get.js.map +1 -0
  188. package/dist/story/hierarchy.d.ts +20 -0
  189. package/dist/story/hierarchy.d.ts.map +1 -0
  190. package/dist/story/hierarchy.js +30 -0
  191. package/dist/story/hierarchy.js.map +1 -0
  192. package/dist/story/list.d.ts +25 -0
  193. package/dist/story/list.d.ts.map +1 -0
  194. package/dist/story/list.js +118 -0
  195. package/dist/story/list.js.map +1 -0
  196. package/dist/story/rules.d.ts +34 -0
  197. package/dist/story/rules.d.ts.map +1 -0
  198. package/dist/story/rules.js +100 -0
  199. package/dist/story/rules.js.map +1 -0
  200. package/dist/story/schema.d.ts +65 -0
  201. package/dist/story/schema.d.ts.map +1 -0
  202. package/dist/story/schema.js +14 -0
  203. package/dist/story/schema.js.map +1 -0
  204. package/dist/story/update.d.ts +23 -0
  205. package/dist/story/update.d.ts.map +1 -0
  206. package/dist/story/update.js +67 -0
  207. package/dist/story/update.js.map +1 -0
  208. package/dist/sync/base-snapshot.d.ts +38 -0
  209. package/dist/sync/base-snapshot.d.ts.map +1 -0
  210. package/dist/sync/base-snapshot.js +86 -0
  211. package/dist/sync/base-snapshot.js.map +1 -0
  212. package/dist/sync/conflict-tools.d.ts +75 -0
  213. package/dist/sync/conflict-tools.d.ts.map +1 -0
  214. package/dist/sync/conflict-tools.js +53 -0
  215. package/dist/sync/conflict-tools.js.map +1 -0
  216. package/dist/sync/conflicts.d.ts +201 -0
  217. package/dist/sync/conflicts.d.ts.map +1 -0
  218. package/dist/sync/conflicts.js +526 -0
  219. package/dist/sync/conflicts.js.map +1 -0
  220. package/dist/sync/deferred-providers.d.ts +2 -0
  221. package/dist/sync/deferred-providers.d.ts.map +1 -0
  222. package/dist/sync/deferred-providers.js +6 -0
  223. package/dist/sync/deferred-providers.js.map +1 -0
  224. package/dist/sync/events.d.ts +401 -0
  225. package/dist/sync/events.d.ts.map +1 -0
  226. package/dist/sync/events.js +357 -0
  227. package/dist/sync/events.js.map +1 -0
  228. package/dist/sync/external-links.d.ts +154 -0
  229. package/dist/sync/external-links.d.ts.map +1 -0
  230. package/dist/sync/external-links.js +306 -0
  231. package/dist/sync/external-links.js.map +1 -0
  232. package/dist/sync/linear/config.d.ts +60 -0
  233. package/dist/sync/linear/config.d.ts.map +1 -0
  234. package/dist/sync/linear/config.js +302 -0
  235. package/dist/sync/linear/config.js.map +1 -0
  236. package/dist/sync/linear/mapping.d.ts +115 -0
  237. package/dist/sync/linear/mapping.d.ts.map +1 -0
  238. package/dist/sync/linear/mapping.js +159 -0
  239. package/dist/sync/linear/mapping.js.map +1 -0
  240. package/dist/sync/linear/pull.d.ts +33 -0
  241. package/dist/sync/linear/pull.d.ts.map +1 -0
  242. package/dist/sync/linear/pull.js +376 -0
  243. package/dist/sync/linear/pull.js.map +1 -0
  244. package/dist/sync/linear/push.d.ts +34 -0
  245. package/dist/sync/linear/push.d.ts.map +1 -0
  246. package/dist/sync/linear/push.js +681 -0
  247. package/dist/sync/linear/push.js.map +1 -0
  248. package/dist/sync/linear/setup.d.ts +33 -0
  249. package/dist/sync/linear/setup.d.ts.map +1 -0
  250. package/dist/sync/linear/setup.js +129 -0
  251. package/dist/sync/linear/setup.js.map +1 -0
  252. package/dist/sync/linear/status.d.ts +35 -0
  253. package/dist/sync/linear/status.d.ts.map +1 -0
  254. package/dist/sync/linear/status.js +138 -0
  255. package/dist/sync/linear/status.js.map +1 -0
  256. package/dist/sync/linear/transport.d.ts +47 -0
  257. package/dist/sync/linear/transport.d.ts.map +1 -0
  258. package/dist/sync/linear/transport.js +249 -0
  259. package/dist/sync/linear/transport.js.map +1 -0
  260. package/dist/sync/provider-port.d.ts +81 -0
  261. package/dist/sync/provider-port.d.ts.map +1 -0
  262. package/dist/sync/provider-port.js +16 -0
  263. package/dist/sync/provider-port.js.map +1 -0
  264. package/dist/sync/provider-registry.d.ts +38 -0
  265. package/dist/sync/provider-registry.d.ts.map +1 -0
  266. package/dist/sync/provider-registry.js +115 -0
  267. package/dist/sync/provider-registry.js.map +1 -0
  268. package/dist/sync/schema.d.ts +147 -0
  269. package/dist/sync/schema.d.ts.map +1 -0
  270. package/dist/sync/schema.js +28 -0
  271. package/dist/sync/schema.js.map +1 -0
  272. package/dist/task/comments.d.ts +9 -0
  273. package/dist/task/comments.d.ts.map +1 -0
  274. package/dist/task/comments.js +79 -0
  275. package/dist/task/comments.js.map +1 -0
  276. package/dist/task/create.d.ts +34 -0
  277. package/dist/task/create.d.ts.map +1 -0
  278. package/dist/task/create.js +126 -0
  279. package/dist/task/create.js.map +1 -0
  280. package/dist/task/current.d.ts +18 -0
  281. package/dist/task/current.d.ts.map +1 -0
  282. package/dist/task/current.js +105 -0
  283. package/dist/task/current.js.map +1 -0
  284. package/dist/task/edit.d.ts +22 -0
  285. package/dist/task/edit.d.ts.map +1 -0
  286. package/dist/task/edit.js +105 -0
  287. package/dist/task/edit.js.map +1 -0
  288. package/dist/task/estimate.d.ts +20 -0
  289. package/dist/task/estimate.d.ts.map +1 -0
  290. package/dist/task/estimate.js +141 -0
  291. package/dist/task/estimate.js.map +1 -0
  292. package/dist/task/get.d.ts +13 -0
  293. package/dist/task/get.d.ts.map +1 -0
  294. package/dist/task/get.js +29 -0
  295. package/dist/task/get.js.map +1 -0
  296. package/dist/task/hierarchy.d.ts +18 -0
  297. package/dist/task/hierarchy.d.ts.map +1 -0
  298. package/dist/task/hierarchy.js +56 -0
  299. package/dist/task/hierarchy.js.map +1 -0
  300. package/dist/task/lifecycle.d.ts +14 -0
  301. package/dist/task/lifecycle.d.ts.map +1 -0
  302. package/dist/task/lifecycle.js +80 -0
  303. package/dist/task/lifecycle.js.map +1 -0
  304. package/dist/task/list.d.ts +24 -0
  305. package/dist/task/list.d.ts.map +1 -0
  306. package/dist/task/list.js +116 -0
  307. package/dist/task/list.js.map +1 -0
  308. package/dist/task/model-assignment.d.ts +33 -0
  309. package/dist/task/model-assignment.d.ts.map +1 -0
  310. package/dist/task/model-assignment.js +145 -0
  311. package/dist/task/model-assignment.js.map +1 -0
  312. package/dist/task/ordering.d.ts +4 -0
  313. package/dist/task/ordering.d.ts.map +1 -0
  314. package/dist/task/ordering.js +14 -0
  315. package/dist/task/ordering.js.map +1 -0
  316. package/dist/task/ports.d.ts +37 -0
  317. package/dist/task/ports.d.ts.map +1 -0
  318. package/dist/task/ports.js +3 -0
  319. package/dist/task/ports.js.map +1 -0
  320. package/dist/task/schema.d.ts +447 -0
  321. package/dist/task/schema.d.ts.map +1 -0
  322. package/dist/task/schema.js +35 -0
  323. package/dist/task/schema.js.map +1 -0
  324. package/dist/task/session-assignment.d.ts +23 -0
  325. package/dist/task/session-assignment.d.ts.map +1 -0
  326. package/dist/task/session-assignment.js +197 -0
  327. package/dist/task/session-assignment.js.map +1 -0
  328. package/dist/task/session-registry.d.ts +8 -0
  329. package/dist/task/session-registry.d.ts.map +1 -0
  330. package/dist/task/session-registry.js +3 -0
  331. package/dist/task/session-registry.js.map +1 -0
  332. package/dist/task/update.d.ts +23 -0
  333. package/dist/task/update.d.ts.map +1 -0
  334. package/dist/task/update.js +92 -0
  335. package/dist/task/update.js.map +1 -0
  336. package/dist/task/v1-compat.d.ts +94 -0
  337. package/dist/task/v1-compat.d.ts.map +1 -0
  338. package/dist/task/v1-compat.js +181 -0
  339. package/dist/task/v1-compat.js.map +1 -0
  340. package/dist/workspace/bin-cli.d.ts +2 -0
  341. package/dist/workspace/bin-cli.d.ts.map +1 -0
  342. package/dist/workspace/bin-cli.js +36 -0
  343. package/dist/workspace/bin-cli.js.map +1 -0
  344. package/dist/workspace/cli-adapter.d.ts +16 -0
  345. package/dist/workspace/cli-adapter.d.ts.map +1 -0
  346. package/dist/workspace/cli-adapter.js +229 -0
  347. package/dist/workspace/cli-adapter.js.map +1 -0
  348. package/dist/workspace/cli-commands.d.ts +11 -0
  349. package/dist/workspace/cli-commands.d.ts.map +1 -0
  350. package/dist/workspace/cli-commands.js +12 -0
  351. package/dist/workspace/cli-commands.js.map +1 -0
  352. package/dist/workspace/duckdb-index.d.ts +56 -0
  353. package/dist/workspace/duckdb-index.d.ts.map +1 -0
  354. package/dist/workspace/duckdb-index.js +178 -0
  355. package/dist/workspace/duckdb-index.js.map +1 -0
  356. package/dist/workspace/hook-templates/need-info-notify/config.json +10 -0
  357. package/dist/workspace/hook-templates/need-info-notify/script.mjs +68 -0
  358. package/dist/workspace/hook-templates/review-spawn/config.json +10 -0
  359. package/dist/workspace/hook-templates/review-spawn/script.mjs +100 -0
  360. package/dist/workspace/init-onboarding.d.ts +9 -0
  361. package/dist/workspace/init-onboarding.d.ts.map +1 -0
  362. package/dist/workspace/init-onboarding.js +259 -0
  363. package/dist/workspace/init-onboarding.js.map +1 -0
  364. package/dist/workspace/init.d.ts +20 -0
  365. package/dist/workspace/init.d.ts.map +1 -0
  366. package/dist/workspace/init.js +288 -0
  367. package/dist/workspace/init.js.map +1 -0
  368. package/dist/workspace/layers.d.ts +127 -0
  369. package/dist/workspace/layers.d.ts.map +1 -0
  370. package/dist/workspace/layers.js +50 -0
  371. package/dist/workspace/layers.js.map +1 -0
  372. package/dist/workspace/mcp-server.d.ts +28 -0
  373. package/dist/workspace/mcp-server.d.ts.map +1 -0
  374. package/dist/workspace/mcp-server.js +190 -0
  375. package/dist/workspace/mcp-server.js.map +1 -0
  376. package/dist/workspace/mcp-stdio.d.ts +2 -0
  377. package/dist/workspace/mcp-stdio.d.ts.map +1 -0
  378. package/dist/workspace/mcp-stdio.js +66 -0
  379. package/dist/workspace/mcp-stdio.js.map +1 -0
  380. package/dist/workspace/mcp-tools.d.ts +24 -0
  381. package/dist/workspace/mcp-tools.d.ts.map +1 -0
  382. package/dist/workspace/mcp-tools.js +43 -0
  383. package/dist/workspace/mcp-tools.js.map +1 -0
  384. package/dist/workspace/migrate-v1.d.ts +12 -0
  385. package/dist/workspace/migrate-v1.d.ts.map +1 -0
  386. package/dist/workspace/migrate-v1.js +301 -0
  387. package/dist/workspace/migrate-v1.js.map +1 -0
  388. package/dist/workspace/ohtools-app.d.ts +3 -0
  389. package/dist/workspace/ohtools-app.d.ts.map +1 -0
  390. package/dist/workspace/ohtools-app.js +10 -0
  391. package/dist/workspace/ohtools-app.js.map +1 -0
  392. package/dist/workspace/repositories.d.ts +25 -0
  393. package/dist/workspace/repositories.d.ts.map +1 -0
  394. package/dist/workspace/repositories.js +76 -0
  395. package/dist/workspace/repositories.js.map +1 -0
  396. package/dist/workspace/runtime.d.ts +123 -0
  397. package/dist/workspace/runtime.d.ts.map +1 -0
  398. package/dist/workspace/runtime.js +4 -0
  399. package/dist/workspace/runtime.js.map +1 -0
  400. package/dist/workspace/session-liveness.d.ts +6 -0
  401. package/dist/workspace/session-liveness.d.ts.map +1 -0
  402. package/dist/workspace/session-liveness.js +3 -0
  403. package/dist/workspace/session-liveness.js.map +1 -0
  404. package/dist/workspace/status.d.ts +46 -0
  405. package/dist/workspace/status.d.ts.map +1 -0
  406. package/dist/workspace/status.js +345 -0
  407. package/dist/workspace/status.js.map +1 -0
  408. package/dist/workspace/storage-layout.d.ts +19 -0
  409. package/dist/workspace/storage-layout.d.ts.map +1 -0
  410. package/dist/workspace/storage-layout.js +55 -0
  411. package/dist/workspace/storage-layout.js.map +1 -0
  412. package/dist/workspace/storage-paths.d.ts +16 -0
  413. package/dist/workspace/storage-paths.d.ts.map +1 -0
  414. package/dist/workspace/storage-paths.js +15 -0
  415. package/dist/workspace/storage-paths.js.map +1 -0
  416. package/dist/workspace/v1-cli-aliases.d.ts +18 -0
  417. package/dist/workspace/v1-cli-aliases.d.ts.map +1 -0
  418. package/dist/workspace/v1-cli-aliases.js +223 -0
  419. package/dist/workspace/v1-cli-aliases.js.map +1 -0
  420. package/dist/workspace/v1-cli-task.d.ts +2 -0
  421. package/dist/workspace/v1-cli-task.d.ts.map +1 -0
  422. package/dist/workspace/v1-cli-task.js +53 -0
  423. package/dist/workspace/v1-cli-task.js.map +1 -0
  424. package/package.json +29 -12
  425. package/quickstart.md +163 -0
  426. package/hooks/need-info-notify/config.yml +0 -3
  427. package/hooks/need-info-notify/script.ts +0 -69
  428. package/hooks/review-spawn/config.yml +0 -3
  429. package/hooks/review-spawn/script.ts +0 -96
  430. package/src/cli/init.ts +0 -90
  431. package/src/domain/fibonacci.ts +0 -39
  432. package/src/domain/kTokens.ts +0 -65
  433. package/src/domain/status-machine.ts +0 -49
  434. package/src/domain/types.ts +0 -66
  435. package/src/hook/hook-executor.ts +0 -70
  436. package/src/hook/ports.ts +0 -16
  437. package/src/infra/hook-config-loader.ts +0 -111
  438. package/src/infra/jsonl-task-repository.ts +0 -157
  439. package/src/infra/logger.ts +0 -40
  440. package/src/infra/pid-session-registry.ts +0 -67
  441. package/src/mcp/error-codes.ts +0 -213
  442. package/src/mcp/server.ts +0 -413
  443. package/src/mcp/session.ts +0 -1
  444. package/src/mcp/tool-create-task.ts +0 -28
  445. package/src/mcp/tool-current-task.ts +0 -19
  446. package/src/mcp/tool-edit-task.ts +0 -40
  447. package/src/mcp/tool-list-tasks.ts +0 -34
  448. package/src/mcp/tool-update-task.ts +0 -55
  449. package/src/task/create-task.ts +0 -67
  450. package/src/task/current-task.ts +0 -111
  451. package/src/task/edit-task.ts +0 -59
  452. package/src/task/list-tasks.ts +0 -35
  453. package/src/task/ports.ts +0 -15
  454. package/src/task/session-registry.ts +0 -9
  455. package/src/task/update-task.ts +0 -160
@@ -0,0 +1,223 @@
1
+ import { TaskSchema } from "../task/schema.js";
2
+ import { toV1Task } from "../task/v1-compat.js";
3
+ const estimateComplexity = (fibonacci) => {
4
+ if (fibonacci <= 2)
5
+ return "trivial";
6
+ if (fibonacci <= 5)
7
+ return "small";
8
+ if (fibonacci <= 8)
9
+ return "medium";
10
+ if (fibonacci <= 13)
11
+ return "large";
12
+ return "complex";
13
+ };
14
+ const aliasDefinitions = [
15
+ ["create-task", "task.create"],
16
+ ["list-tasks", "task.list"],
17
+ ["current-task", "task.current"],
18
+ ["update-task", "task.update"],
19
+ ["edit-task", "task.edit"],
20
+ ["init", "workspace.init"],
21
+ ];
22
+ export const v1CliAliases = Object.freeze(aliasDefinitions.map(([alias, toolId]) => ({
23
+ alias,
24
+ toolId,
25
+ compatibility: "v1",
26
+ })));
27
+ export const translateV1CliCommand = (alias, input) => {
28
+ const command = v1CliAliases.find((candidate) => candidate.alias === alias);
29
+ if (command === undefined) {
30
+ return null;
31
+ }
32
+ const translated = translateInput(command.toolId, input);
33
+ const warnings = translated.fields.length === 0
34
+ ? []
35
+ : [
36
+ {
37
+ code: "compatibility_mapping_applied",
38
+ message: "V1 CLI arguments were translated to v2 tool input.",
39
+ details: {
40
+ alias,
41
+ toolId: command.toolId,
42
+ fields: translated.fields,
43
+ },
44
+ },
45
+ ];
46
+ const translation = {
47
+ toolId: command.toolId,
48
+ input: translated.input,
49
+ warnings,
50
+ };
51
+ Object.defineProperty(translation, "withCompatibilityOutput", {
52
+ enumerable: false,
53
+ value: (envelope) => withV1CompatibilityOutput(alias, envelope, warnings),
54
+ });
55
+ return translation;
56
+ };
57
+ const translateInput = (toolId, input) => {
58
+ if (toolId === "task.create" || toolId === "task.edit") {
59
+ return translateTaskWriteInput(toolId, input);
60
+ }
61
+ if (toolId === "task.update") {
62
+ return translateTaskUpdateInput(input);
63
+ }
64
+ if (toolId === "task.list" || toolId === "task.current") {
65
+ return translateTaskFilterInput(input);
66
+ }
67
+ return { input, fields: [] };
68
+ };
69
+ const translateTaskWriteInput = (_toolId, input) => {
70
+ const fields = [];
71
+ const output = { ...input };
72
+ mapListField(output, fields, ["definition_of_done", "definition-of-done", "definitionOfDone"], "definitionOfDone");
73
+ mapListField(output, fields, ["test_cases", "test-cases", "testCases"], "definitionOfReady", {
74
+ enumerable: false,
75
+ });
76
+ mapScalarField(output, fields, ["assigned_session", "assigned-session", "assignedSession"], "sessionId");
77
+ mapModelField(output, fields);
78
+ mapEstimateField(output, fields);
79
+ return { input: output, fields };
80
+ };
81
+ const translateTaskUpdateInput = (input) => {
82
+ const fields = [];
83
+ const output = { ...input };
84
+ mapScalarField(output, fields, ["new_status", "new-status", "newStatus"], "newStatus");
85
+ const title = readFirst(output, ["comment_title", "comment-title", "commentTitle"], fields);
86
+ const content = readFirst(output, ["comment_content", "comment-content", "commentContent"], fields);
87
+ const kind = readFirst(output, ["comment_kind", "comment-kind", "commentKind"], fields);
88
+ const replyToCommentId = readFirst(output, ["comment_reply_to", "comment-reply-to", "commentReplyTo"], fields);
89
+ if (title !== undefined || content !== undefined || replyToCommentId !== undefined) {
90
+ output.comment = {
91
+ ...(title === undefined ? {} : { title: String(title) }),
92
+ content: content === undefined ? "" : String(content),
93
+ ...(kind === undefined ? {} : { kind: String(kind) }),
94
+ ...(replyToCommentId === undefined ? {} : { replyToCommentId: String(replyToCommentId) }),
95
+ };
96
+ }
97
+ return { input: output, fields };
98
+ };
99
+ const translateTaskFilterInput = (input) => {
100
+ const fields = [];
101
+ const output = { ...input };
102
+ mapScalarField(output, fields, ["assigned_session", "assigned-session", "assignedSession"], "sessionId");
103
+ return { input: output, fields };
104
+ };
105
+ const mapListField = (output, fields, candidates, target, options = {}) => {
106
+ const value = readFirst(output, candidates, fields);
107
+ if (value !== undefined) {
108
+ setOutputField(output, target, normalizeList(value).join("\n"), options);
109
+ }
110
+ };
111
+ const mapScalarField = (output, fields, candidates, target) => {
112
+ const value = readFirst(output, candidates, fields);
113
+ if (value !== undefined) {
114
+ setOutputField(output, target, value);
115
+ }
116
+ };
117
+ const setOutputField = (output, target, value, options = {}) => {
118
+ Object.defineProperty(output, target, {
119
+ configurable: true,
120
+ enumerable: options.enumerable ?? true,
121
+ value,
122
+ writable: true,
123
+ });
124
+ };
125
+ const mapModelField = (output, fields) => {
126
+ const value = readFirst(output, ["assigned_model", "assigned-model", "assignedModel"], fields);
127
+ if (value !== undefined) {
128
+ output.model = { id: String(value) };
129
+ }
130
+ };
131
+ const mapEstimateField = (output, fields) => {
132
+ const estimation = readFirst(output, ["estimation"], fields);
133
+ const predictedKTokens = readFirst(output, ["predictedKTokens", "predicted-k-tokens"], fields);
134
+ if (estimation === undefined && predictedKTokens === undefined) {
135
+ return;
136
+ }
137
+ const fibonacci = Number(estimation ?? 1);
138
+ output.estimate = {
139
+ predictedKTokens: Number(predictedKTokens ?? 0),
140
+ fibonacci,
141
+ complexity: estimateComplexity(fibonacci),
142
+ confidence: "medium",
143
+ };
144
+ };
145
+ const readFirst = (output, candidates, fields) => {
146
+ for (const candidate of candidates) {
147
+ if (Object.hasOwn(output, candidate)) {
148
+ const value = output[candidate];
149
+ delete output[candidate];
150
+ fields.push(candidate);
151
+ return value;
152
+ }
153
+ }
154
+ return undefined;
155
+ };
156
+ const normalizeList = (value) => {
157
+ if (Array.isArray(value)) {
158
+ return value.map((entry) => String(entry).trim()).filter((entry) => entry.length > 0);
159
+ }
160
+ if (typeof value === "string") {
161
+ try {
162
+ const parsed = JSON.parse(value);
163
+ if (Array.isArray(parsed)) {
164
+ return parsed.map((entry) => String(entry).trim()).filter((entry) => entry.length > 0);
165
+ }
166
+ }
167
+ catch { }
168
+ const trimmed = value.trim();
169
+ return trimmed.length === 0 ? [] : [trimmed];
170
+ }
171
+ if (value === undefined || value === null) {
172
+ return [];
173
+ }
174
+ return [String(value)];
175
+ };
176
+ const withV1CompatibilityOutput = (alias, envelope, warnings) => {
177
+ if (!envelope.ok || v1CliAliases.every((candidate) => candidate.alias !== alias)) {
178
+ return envelope;
179
+ }
180
+ const data = addCompatibilityData(envelope.data);
181
+ const nextWarnings = [...(envelope.warnings ?? []), ...warnings];
182
+ return {
183
+ ok: true,
184
+ data,
185
+ ...(nextWarnings.length === 0 ? {} : { warnings: nextWarnings }),
186
+ };
187
+ };
188
+ const addCompatibilityData = (data) => {
189
+ if (!isRecord(data)) {
190
+ return data;
191
+ }
192
+ const compat = buildCompatibility(data);
193
+ if (compat === undefined) {
194
+ return data;
195
+ }
196
+ return {
197
+ ...data,
198
+ compat: {
199
+ ...(isRecord(data.compat) ? data.compat : {}),
200
+ v1: compat,
201
+ },
202
+ };
203
+ };
204
+ const buildCompatibility = (data) => {
205
+ const compat = {};
206
+ const task = toTask(data.task);
207
+ if (task !== undefined) {
208
+ compat.task = toV1Task(task);
209
+ }
210
+ if (Array.isArray(data.items)) {
211
+ const tasks = data.items.map(toTask).filter((item) => item !== undefined);
212
+ if (tasks.length > 0) {
213
+ compat.items = tasks.map(toV1Task);
214
+ }
215
+ }
216
+ return Object.keys(compat).length === 0 ? undefined : compat;
217
+ };
218
+ const toTask = (value) => {
219
+ const parsed = TaskSchema.safeParse(value);
220
+ return parsed.success ? parsed.data : undefined;
221
+ };
222
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
223
+ //# sourceMappingURL=v1-cli-aliases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v1-cli-aliases.js","sourceRoot":"","sources":["../../src/workspace/v1-cli-aliases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const translateV1TaskArgs: (command: string, args: Record<string, string>) => Record<string, unknown>;
2
+ //# sourceMappingURL=v1-cli-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v1-cli-task.d.ts","sourceRoot":"","sources":["../../src/workspace/v1-cli-task.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,mBAAmB,GAC9B,SAAS,MAAM,EACf,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CA0CxB,CAAA"}
@@ -0,0 +1,53 @@
1
+ const normalizeListArg = (value) => {
2
+ try {
3
+ const parsed = JSON.parse(value);
4
+ if (Array.isArray(parsed)) {
5
+ return parsed.map((entry) => String(entry).trim()).filter((entry) => entry.length > 0);
6
+ }
7
+ }
8
+ catch { }
9
+ const trimmed = value.trim();
10
+ return trimmed.length === 0 ? [] : [trimmed];
11
+ };
12
+ export const translateV1TaskArgs = (command, args) => {
13
+ if (command === "create-task") {
14
+ const result = {};
15
+ if (args["definition-of-done"] !== undefined) {
16
+ result.definition_of_done = normalizeListArg(args["definition-of-done"]);
17
+ }
18
+ if (args["test-cases"] !== undefined) {
19
+ result.test_cases = normalizeListArg(args["test-cases"]);
20
+ }
21
+ if (args["predicted-k-tokens"] !== undefined) {
22
+ result.predictedKTokens = Number.parseInt(args["predicted-k-tokens"], 10);
23
+ }
24
+ if (args["assigned-session"] !== undefined) {
25
+ result.assigned_session = args["assigned-session"];
26
+ }
27
+ if (args["assigned-model"] !== undefined) {
28
+ result.assigned_model = args["assigned-model"];
29
+ }
30
+ if (args.estimation !== undefined) {
31
+ result.estimation = Number.parseInt(args.estimation, 10);
32
+ }
33
+ return result;
34
+ }
35
+ if (command === "update-task") {
36
+ const result = {};
37
+ if (args["new-status"] !== undefined) {
38
+ result.new_status = args["new-status"];
39
+ }
40
+ if (args["comment-title"] !== undefined) {
41
+ result.comment_title = args["comment-title"];
42
+ }
43
+ if (args["comment-content"] !== undefined) {
44
+ result.comment_content = args["comment-content"];
45
+ }
46
+ if (args["comment-reply-to"] !== undefined) {
47
+ result.comment_reply_to = args["comment-reply-to"];
48
+ }
49
+ return result;
50
+ }
51
+ return {};
52
+ };
53
+ //# sourceMappingURL=v1-cli-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v1-cli-task.js","sourceRoot":"","sources":["../../src/workspace/v1-cli-task.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,25 +1,38 @@
1
1
  {
2
2
  "name": "@bosun-sh/logbook",
3
- "version": "1.0.0",
4
- "description": "File-system kanban board MCP server for AI agents",
3
+ "version": "2.0.0",
4
+ "description": "File-system kanban board CLI and MCP server for AI agents",
5
5
  "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
6
14
  "bin": {
7
- "logbook-mcp": "src/mcp/server.ts"
15
+ "logbook": "bin/logbook.cjs"
8
16
  },
9
17
  "files": [
10
- "src/",
11
- "hooks/",
12
- "README.md"
18
+ "bin/",
19
+ "dist/",
20
+ "CHANGELOG.md",
21
+ "LICENSE",
22
+ "README.md",
23
+ "quickstart.md"
13
24
  ],
14
25
  "engines": {
15
- "bun": ">=1.0.0"
26
+ "node": ">=18.0.0"
16
27
  },
17
28
  "publishConfig": {
18
29
  "access": "public",
19
30
  "registry": "https://registry.npmjs.org/"
20
31
  },
21
32
  "scripts": {
22
- "start": "bun src/mcp/server.ts",
33
+ "build": "node scripts/clean-dist.mjs && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node scripts/copy-hook-templates.mjs",
34
+ "prepack": "bun run build",
35
+ "start": "bun src/workspace/bin-cli.ts mcp",
23
36
  "test": "bun test",
24
37
  "test:watch": "bun test --watch",
25
38
  "test:unit": "bun test tests/unit/",
@@ -29,19 +42,23 @@
29
42
  "lint:fix": "biome lint --write .",
30
43
  "format": "biome format --write .",
31
44
  "check": "biome check .",
32
- "prepare": "husky",
33
- "prepublishOnly": "bun run typecheck",
34
- "publish": "bun run typecheck && npm pack --dry-run && npm publish --ignore-scripts",
45
+ "prepare": "node -e \"process.exit(0)\"",
46
+ "prepublishOnly": "bun run typecheck && bun run check && bun test && bun run build",
47
+ "release:dry-run": "bun run typecheck && bun run check && bun test && bun run build && node scripts/npm-pack-dry-run.mjs",
48
+ "release": "bun run release:dry-run && node scripts/npm-publish.mjs",
35
49
  "publish:dev": "bun link ."
36
50
  },
37
51
  "dependencies": {
38
- "effect": "^3.12.0",
52
+ "@bosun-sh/ohtools": "^0.1.0",
53
+ "@duckdb/node-api": "1.5.2-r.1",
54
+ "effect": "3.21.2",
39
55
  "zod": "^3.24.1"
40
56
  },
41
57
  "devDependencies": {
42
58
  "@biomejs/biome": "latest",
43
59
  "@types/bun": "latest",
44
60
  "husky": "^9.0.0",
61
+ "tsc-alias": "^1.8.17",
45
62
  "typescript": "^5.7.3"
46
63
  }
47
64
  }
package/quickstart.md ADDED
@@ -0,0 +1,163 @@
1
+ # quickstart: logbook in 5 minutes
2
+
3
+ ## 1. install
4
+
5
+ ```bash
6
+ npm install -g @bosun-sh/logbook
7
+ # or
8
+ bunx @bosun-sh/logbook --help
9
+ ```
10
+
11
+ the published CLI runs on Node.js; no Bun install is required for runtime.
12
+
13
+ ## 2. initialize the workspace
14
+
15
+ ```bash
16
+ logbook init
17
+ ```
18
+
19
+ this creates `.logbook/` in the current directory with `config.json`, `workspace.json`, a `storage/` directory, and the `review-spawn` and `need-info-notify` hook templates. it also offers to configure your detected MCP client and optionally set up Linear sync.
20
+
21
+ add `.logbook/storage/` to `.gitignore`:
22
+
23
+ ```gitignore
24
+ .logbook/storage/
25
+ ```
26
+
27
+ ## 3. connect to your ai client
28
+
29
+ `logbook init` can write the MCP config for detected clients. if you skipped that step, add one of these manually:
30
+
31
+ **Claude Code** — add to `.claude/settings.json`:
32
+
33
+ ```json
34
+ {
35
+ "mcpServers": {
36
+ "logbook": {
37
+ "command": "logbook",
38
+ "args": ["mcp"]
39
+ }
40
+ }
41
+ }
42
+ ```
43
+
44
+ **OpenCode** — add to `opencode.json`:
45
+
46
+ ```json
47
+ {
48
+ "mcp": {
49
+ "logbook": {
50
+ "type": "local",
51
+ "command": ["logbook", "mcp"],
52
+ "enabled": true
53
+ }
54
+ }
55
+ }
56
+ ```
57
+
58
+ ## 4. create your first task
59
+
60
+ ```bash
61
+ logbook task:create \
62
+ --title "Implement login endpoint" \
63
+ --description "JWT RS256 auth. See docs/auth.md for the spec." \
64
+ --definition-of-done "Endpoint returns 200 for valid credentials; tests pass" \
65
+ --project myapp \
66
+ --milestone v1
67
+ ```
68
+
69
+ output:
70
+
71
+ ```json
72
+ {"ok":true,"data":{"task":{"id":"task_...","status":"backlog","title":"Implement login endpoint",...}}}
73
+ ```
74
+
75
+ ## 5. list tasks
76
+
77
+ ```bash
78
+ logbook task:list --status "*" # all statuses
79
+ logbook task:list --status in_progress
80
+ ```
81
+
82
+ ## 6. check the current task (as an agent would)
83
+
84
+ ```bash
85
+ logbook task:current
86
+ ```
87
+
88
+ if no task is `in_progress`, this transitions the highest-priority `todo` task automatically. returns a `no_current_task` error if nothing is available.
89
+
90
+ ## 7. move a task through the lifecycle
91
+
92
+ ```bash
93
+ # start work
94
+ logbook task:update --id <uuid> --new-status in_progress
95
+
96
+ # submit for review
97
+ logbook task:update --id <uuid> --new-status pending_review
98
+
99
+ # mark done
100
+ logbook task:update --id <uuid> --new-status done
101
+ ```
102
+
103
+ ## optional: linear sync
104
+
105
+ `logbook init` can run this setup interactively. if you skipped it, configure Linear separately:
106
+
107
+ 1. add your Linear API key to `.env` or export it in your shell:
108
+
109
+ ```bash
110
+ echo "LINEAR_API_KEY=lin_api_..." >> .env
111
+ ```
112
+
113
+ 2. configure Logbook from your Linear team URL:
114
+
115
+ ```bash
116
+ logbook sync:linear:setup --team-url https://linear.app/bosun/team/BOSUN
117
+ ```
118
+
119
+ Or use explicit ids:
120
+
121
+ ```bash
122
+ logbook sync:linear:setup --workspace-id <workspace-id> --team-id <team-id>
123
+ ```
124
+
125
+ This writes the public `linear` block to `.logbook/config.json`:
126
+
127
+ ```json
128
+ {
129
+ "linear": {
130
+ "apiTokenEnv": "LINEAR_API_KEY",
131
+ "workspaceId": "your-workspace-id",
132
+ "defaultTeamId": "your-team-id"
133
+ }
134
+ }
135
+ ```
136
+
137
+ 3. pull issues from Linear:
138
+
139
+ ```bash
140
+ logbook sync:linear:pull --dry-run # preview without writing
141
+ logbook sync:linear:pull # pull and write
142
+ ```
143
+
144
+ 4. push tasks back to Linear:
145
+
146
+ ```bash
147
+ logbook sync:linear:push --dry-run
148
+ logbook sync:linear:push
149
+ ```
150
+
151
+ 5. check sync status:
152
+
153
+ ```bash
154
+ logbook sync:linear:status --check-provider
155
+ ```
156
+
157
+ When you use Logbook through MCP, agent tool calls automatically pull fresh Linear changes before task-facing work and push successful task updates back to Linear.
158
+
159
+ ---
160
+
161
+ that's it. from here:
162
+ - see `README.md` for the full MCP tool reference
163
+ - see the **Migrating from v1** section in `README.md` if you're migrating from v1
@@ -1,3 +0,0 @@
1
- event: task.status_changed
2
- condition: "new_status == 'need_info'"
3
- timeout_ms: 5000
@@ -1,69 +0,0 @@
1
- #!/usr/bin/env bun
2
- import { readFile } from "node:fs/promises"
3
-
4
- const taskId = process.env.LOGBOOK_TASK_ID ?? ""
5
- const dataFile = process.env.LOGBOOK_TASKS_FILE ?? "./tasks.jsonl"
6
-
7
- if (taskId === "") process.exit(0)
8
-
9
- const readLines = async (filePath: string): Promise<readonly string[]> => {
10
- const content = await readFile(filePath, "utf8").catch((e: unknown) => {
11
- if (isEnoent(e)) return ""
12
- throw e
13
- })
14
- return content.split("\n").filter((l) => l.trim() !== "")
15
- }
16
-
17
- interface RawComment {
18
- id: string
19
- timestamp: string
20
- title: string
21
- content: string
22
- reply: string
23
- kind: string
24
- }
25
-
26
- interface RawTask {
27
- id: string
28
- comments: RawComment[]
29
- }
30
-
31
- const parseTask = (line: string): RawTask | null => {
32
- try {
33
- return JSON.parse(line) as RawTask
34
- } catch {
35
- return null
36
- }
37
- }
38
-
39
- const findBlockingComment = (task: RawTask): RawComment | null => {
40
- // Find the most recent need_info comment with an empty reply
41
- for (let i = task.comments.length - 1; i >= 0; i--) {
42
- const comment = task.comments[i]
43
- if (comment !== undefined && comment.kind === "need_info" && comment.reply === "") {
44
- return comment
45
- }
46
- }
47
- return null
48
- }
49
-
50
- const isEnoent = (e: unknown): boolean =>
51
- typeof e === "object" && e !== null && (e as { code?: unknown }).code === "ENOENT"
52
-
53
- const lines = await readLines(dataFile)
54
-
55
- let found: RawTask | null = null
56
- for (const line of lines) {
57
- const task = parseTask(line)
58
- if (task !== null && task.id === taskId) {
59
- found = task
60
- break
61
- }
62
- }
63
-
64
- if (found === null) process.exit(0)
65
-
66
- const comment = findBlockingComment(found)
67
- if (comment === null) process.exit(0)
68
-
69
- process.stdout.write(`[need_info] Task ${taskId}: ${comment.title}\n${comment.content}\n`)
@@ -1,3 +0,0 @@
1
- event: task.status_changed
2
- condition: "new_status == 'pending_review'"
3
- timeout_ms: 30000