@kynetic-ai/spec 0.10.0 → 0.12.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 (487) hide show
  1. package/README.md +55 -455
  2. package/dist/agent-runtime/bootstrap.d.ts +31 -0
  3. package/dist/agent-runtime/bootstrap.d.ts.map +1 -0
  4. package/dist/agent-runtime/bootstrap.js +302 -0
  5. package/dist/agent-runtime/bootstrap.js.map +1 -0
  6. package/dist/agent-runtime/dispatch.d.ts +150 -10
  7. package/dist/agent-runtime/dispatch.d.ts.map +1 -1
  8. package/dist/agent-runtime/dispatch.js +1248 -244
  9. package/dist/agent-runtime/dispatch.js.map +1 -1
  10. package/dist/agent-runtime/invocation.d.ts +28 -1
  11. package/dist/agent-runtime/invocation.d.ts.map +1 -1
  12. package/dist/agent-runtime/invocation.js +172 -60
  13. package/dist/agent-runtime/invocation.js.map +1 -1
  14. package/dist/agent-runtime/prompts.d.ts +9 -0
  15. package/dist/agent-runtime/prompts.d.ts.map +1 -1
  16. package/dist/agent-runtime/prompts.js +42 -7
  17. package/dist/agent-runtime/prompts.js.map +1 -1
  18. package/dist/agent-runtime/session-event-accumulator.d.ts +83 -0
  19. package/dist/agent-runtime/session-event-accumulator.d.ts.map +1 -0
  20. package/dist/agent-runtime/session-event-accumulator.js +203 -0
  21. package/dist/agent-runtime/session-event-accumulator.js.map +1 -0
  22. package/dist/agent-runtime/session-event-types.d.ts +67 -0
  23. package/dist/agent-runtime/session-event-types.d.ts.map +1 -0
  24. package/dist/agent-runtime/session-event-types.js +13 -0
  25. package/dist/agent-runtime/session-event-types.js.map +1 -0
  26. package/dist/agent-runtime/workspace.d.ts +244 -0
  27. package/dist/agent-runtime/workspace.d.ts.map +1 -0
  28. package/dist/agent-runtime/workspace.js +2025 -0
  29. package/dist/agent-runtime/workspace.js.map +1 -0
  30. package/dist/agents/adapters.d.ts.map +1 -1
  31. package/dist/agents/adapters.js +58 -13
  32. package/dist/agents/adapters.js.map +1 -1
  33. package/dist/agents/spawner.d.ts +8 -0
  34. package/dist/agents/spawner.d.ts.map +1 -1
  35. package/dist/agents/spawner.js +25 -3
  36. package/dist/agents/spawner.js.map +1 -1
  37. package/dist/cli/batch-exec.js +1 -1
  38. package/dist/cli/batch-exec.js.map +1 -1
  39. package/dist/cli/command-annotations.d.ts +15 -3
  40. package/dist/cli/command-annotations.d.ts.map +1 -1
  41. package/dist/cli/command-annotations.js +23 -3
  42. package/dist/cli/command-annotations.js.map +1 -1
  43. package/dist/cli/commands/agent.d.ts +2 -0
  44. package/dist/cli/commands/agent.d.ts.map +1 -1
  45. package/dist/cli/commands/agent.js +144 -27
  46. package/dist/cli/commands/agent.js.map +1 -1
  47. package/dist/cli/commands/agents.d.ts.map +1 -1
  48. package/dist/cli/commands/agents.js +5 -5
  49. package/dist/cli/commands/agents.js.map +1 -1
  50. package/dist/cli/commands/derive.d.ts.map +1 -1
  51. package/dist/cli/commands/derive.js +118 -3
  52. package/dist/cli/commands/derive.js.map +1 -1
  53. package/dist/cli/commands/guard.d.ts.map +1 -1
  54. package/dist/cli/commands/guard.js +8 -6
  55. package/dist/cli/commands/guard.js.map +1 -1
  56. package/dist/cli/commands/index.d.ts +1 -0
  57. package/dist/cli/commands/index.d.ts.map +1 -1
  58. package/dist/cli/commands/index.js +1 -0
  59. package/dist/cli/commands/index.js.map +1 -1
  60. package/dist/cli/commands/init.d.ts.map +1 -1
  61. package/dist/cli/commands/init.js +20 -0
  62. package/dist/cli/commands/init.js.map +1 -1
  63. package/dist/cli/commands/item.d.ts.map +1 -1
  64. package/dist/cli/commands/item.js +205 -47
  65. package/dist/cli/commands/item.js.map +1 -1
  66. package/dist/cli/commands/log.d.ts.map +1 -1
  67. package/dist/cli/commands/log.js +24 -10
  68. package/dist/cli/commands/log.js.map +1 -1
  69. package/dist/cli/commands/meta.d.ts.map +1 -1
  70. package/dist/cli/commands/meta.js +10 -1
  71. package/dist/cli/commands/meta.js.map +1 -1
  72. package/dist/cli/commands/plan-import.d.ts +3 -3
  73. package/dist/cli/commands/plan-import.d.ts.map +1 -1
  74. package/dist/cli/commands/plan-import.js +213 -528
  75. package/dist/cli/commands/plan-import.js.map +1 -1
  76. package/dist/cli/commands/plan.d.ts.map +1 -1
  77. package/dist/cli/commands/plan.js +533 -83
  78. package/dist/cli/commands/plan.js.map +1 -1
  79. package/dist/cli/commands/review.d.ts +14 -0
  80. package/dist/cli/commands/review.d.ts.map +1 -0
  81. package/dist/cli/commands/review.js +1142 -0
  82. package/dist/cli/commands/review.js.map +1 -0
  83. package/dist/cli/commands/serve.d.ts +1 -0
  84. package/dist/cli/commands/serve.d.ts.map +1 -1
  85. package/dist/cli/commands/serve.js +33 -10
  86. package/dist/cli/commands/serve.js.map +1 -1
  87. package/dist/cli/commands/session/checkpoint.d.ts +2 -4
  88. package/dist/cli/commands/session/checkpoint.d.ts.map +1 -1
  89. package/dist/cli/commands/session/checkpoint.js +6 -107
  90. package/dist/cli/commands/session/checkpoint.js.map +1 -1
  91. package/dist/cli/commands/session/commands.d.ts.map +1 -1
  92. package/dist/cli/commands/session/commands.js +33 -23
  93. package/dist/cli/commands/session/commands.js.map +1 -1
  94. package/dist/cli/commands/session/compact.js +4 -4
  95. package/dist/cli/commands/session/compact.js.map +1 -1
  96. package/dist/cli/commands/session/create.js +2 -2
  97. package/dist/cli/commands/session/create.js.map +1 -1
  98. package/dist/cli/commands/session/format.d.ts.map +1 -1
  99. package/dist/cli/commands/session/format.js +1 -6
  100. package/dist/cli/commands/session/format.js.map +1 -1
  101. package/dist/cli/commands/session/log.d.ts +32 -7
  102. package/dist/cli/commands/session/log.d.ts.map +1 -1
  103. package/dist/cli/commands/session/log.js +166 -60
  104. package/dist/cli/commands/session/log.js.map +1 -1
  105. package/dist/cli/commands/session/migrate.d.ts +9 -0
  106. package/dist/cli/commands/session/migrate.d.ts.map +1 -0
  107. package/dist/cli/commands/session/migrate.js +46 -0
  108. package/dist/cli/commands/session/migrate.js.map +1 -0
  109. package/dist/cli/commands/session/stale-close.d.ts.map +1 -1
  110. package/dist/cli/commands/session/stale-close.js +5 -8
  111. package/dist/cli/commands/session/stale-close.js.map +1 -1
  112. package/dist/cli/commands/session/types.d.ts +1 -1
  113. package/dist/cli/commands/session/types.d.ts.map +1 -1
  114. package/dist/cli/commands/setup.d.ts +2 -2
  115. package/dist/cli/commands/setup.d.ts.map +1 -1
  116. package/dist/cli/commands/setup.js +287 -257
  117. package/dist/cli/commands/setup.js.map +1 -1
  118. package/dist/cli/commands/shadow.d.ts.map +1 -1
  119. package/dist/cli/commands/shadow.js +147 -31
  120. package/dist/cli/commands/shadow.js.map +1 -1
  121. package/dist/cli/commands/skill-crud.d.ts +7 -0
  122. package/dist/cli/commands/skill-crud.d.ts.map +1 -1
  123. package/dist/cli/commands/skill-crud.js +41 -18
  124. package/dist/cli/commands/skill-crud.js.map +1 -1
  125. package/dist/cli/commands/skill-diff.d.ts.map +1 -1
  126. package/dist/cli/commands/skill-diff.js +29 -3
  127. package/dist/cli/commands/skill-diff.js.map +1 -1
  128. package/dist/cli/commands/skill-install.d.ts.map +1 -1
  129. package/dist/cli/commands/skill-install.js +5 -4
  130. package/dist/cli/commands/skill-install.js.map +1 -1
  131. package/dist/cli/commands/task.d.ts.map +1 -1
  132. package/dist/cli/commands/task.js +359 -49
  133. package/dist/cli/commands/task.js.map +1 -1
  134. package/dist/cli/commands/trait.d.ts.map +1 -1
  135. package/dist/cli/commands/trait.js +5 -27
  136. package/dist/cli/commands/trait.js.map +1 -1
  137. package/dist/cli/commands/validate.d.ts.map +1 -1
  138. package/dist/cli/commands/validate.js +113 -52
  139. package/dist/cli/commands/validate.js.map +1 -1
  140. package/dist/cli/index.d.ts.map +1 -1
  141. package/dist/cli/index.js +69 -2
  142. package/dist/cli/index.js.map +1 -1
  143. package/dist/cli/output.d.ts +26 -0
  144. package/dist/cli/output.d.ts.map +1 -1
  145. package/dist/cli/output.js +108 -1
  146. package/dist/cli/output.js.map +1 -1
  147. package/dist/cli/sync-mode.d.ts +44 -0
  148. package/dist/cli/sync-mode.d.ts.map +1 -0
  149. package/dist/cli/sync-mode.js +64 -0
  150. package/dist/cli/sync-mode.js.map +1 -0
  151. package/dist/daemon/middleware/project-context.ts +25 -7
  152. package/dist/daemon/project-context.ts +18 -0
  153. package/dist/daemon/routes/agent-dispatch.ts +107 -23
  154. package/dist/daemon/routes/aggregation.ts +184 -0
  155. package/dist/daemon/routes/inbox.ts +5 -0
  156. package/dist/daemon/routes/items.ts +167 -0
  157. package/dist/daemon/routes/meta.ts +141 -1
  158. package/dist/daemon/routes/plans.ts +147 -0
  159. package/dist/daemon/routes/projects.ts +28 -6
  160. package/dist/daemon/routes/ref-resolution.ts +119 -0
  161. package/dist/daemon/routes/refs.ts +42 -0
  162. package/dist/daemon/routes/session-related.ts +140 -0
  163. package/dist/daemon/routes/sessions.ts +581 -0
  164. package/dist/daemon/routes/tasks.ts +257 -2
  165. package/dist/daemon/routes/triage.ts +40 -1
  166. package/dist/daemon/routes/validation.ts +1 -1
  167. package/dist/daemon/server.ts +165 -50
  168. package/dist/daemon/session-sync.ts +11 -0
  169. package/dist/daemon/shadow-sync.ts +11 -0
  170. package/dist/daemon/watcher.ts +56 -5
  171. package/dist/daemon/websocket/project-resolution.ts +77 -0
  172. package/dist/export/json.d.ts.map +1 -1
  173. package/dist/export/json.js +104 -1
  174. package/dist/export/json.js.map +1 -1
  175. package/dist/export/types.d.ts +52 -1
  176. package/dist/export/types.d.ts.map +1 -1
  177. package/dist/index.d.ts +1 -0
  178. package/dist/index.d.ts.map +1 -1
  179. package/dist/index.js +1 -0
  180. package/dist/index.js.map +1 -1
  181. package/dist/parser/agent-detection.d.ts +1 -1
  182. package/dist/parser/agent-detection.d.ts.map +1 -1
  183. package/dist/parser/agent-detection.js +10 -0
  184. package/dist/parser/agent-detection.js.map +1 -1
  185. package/dist/parser/alignment.d.ts.map +1 -1
  186. package/dist/parser/alignment.js +4 -2
  187. package/dist/parser/alignment.js.map +1 -1
  188. package/dist/parser/config.d.ts +397 -2
  189. package/dist/parser/config.d.ts.map +1 -1
  190. package/dist/parser/config.js +125 -3
  191. package/dist/parser/config.js.map +1 -1
  192. package/dist/parser/dispatch-workspaces.d.ts +18 -0
  193. package/dist/parser/dispatch-workspaces.d.ts.map +1 -0
  194. package/dist/parser/dispatch-workspaces.js +209 -0
  195. package/dist/parser/dispatch-workspaces.js.map +1 -0
  196. package/dist/parser/doctor.d.ts.map +1 -1
  197. package/dist/parser/doctor.js +27 -8
  198. package/dist/parser/doctor.js.map +1 -1
  199. package/dist/parser/file-lock.d.ts.map +1 -1
  200. package/dist/parser/file-lock.js +9 -2
  201. package/dist/parser/file-lock.js.map +1 -1
  202. package/dist/parser/index.d.ts +6 -0
  203. package/dist/parser/index.d.ts.map +1 -1
  204. package/dist/parser/index.js +6 -0
  205. package/dist/parser/index.js.map +1 -1
  206. package/dist/parser/plans.d.ts.map +1 -1
  207. package/dist/parser/plans.js +1 -0
  208. package/dist/parser/plans.js.map +1 -1
  209. package/dist/parser/refs.d.ts +8 -1
  210. package/dist/parser/refs.d.ts.map +1 -1
  211. package/dist/parser/refs.js +27 -1
  212. package/dist/parser/refs.js.map +1 -1
  213. package/dist/parser/review-operations.d.ts +72 -0
  214. package/dist/parser/review-operations.d.ts.map +1 -0
  215. package/dist/parser/review-operations.js +185 -0
  216. package/dist/parser/review-operations.js.map +1 -0
  217. package/dist/parser/review-task-integration.d.ts +78 -0
  218. package/dist/parser/review-task-integration.d.ts.map +1 -0
  219. package/dist/parser/review-task-integration.js +173 -0
  220. package/dist/parser/review-task-integration.js.map +1 -0
  221. package/dist/parser/review-threads.d.ts +101 -0
  222. package/dist/parser/review-threads.d.ts.map +1 -0
  223. package/dist/parser/review-threads.js +222 -0
  224. package/dist/parser/review-threads.js.map +1 -0
  225. package/dist/parser/review-validation.d.ts +69 -0
  226. package/dist/parser/review-validation.d.ts.map +1 -0
  227. package/dist/parser/review-validation.js +207 -0
  228. package/dist/parser/review-validation.js.map +1 -0
  229. package/dist/parser/reviews.d.ts +58 -0
  230. package/dist/parser/reviews.d.ts.map +1 -0
  231. package/dist/parser/reviews.js +230 -0
  232. package/dist/parser/reviews.js.map +1 -0
  233. package/dist/parser/session-branch.d.ts +91 -0
  234. package/dist/parser/session-branch.d.ts.map +1 -0
  235. package/dist/parser/session-branch.js +565 -0
  236. package/dist/parser/session-branch.js.map +1 -0
  237. package/dist/parser/session-sync-scheduler.d.ts +53 -0
  238. package/dist/parser/session-sync-scheduler.d.ts.map +1 -0
  239. package/dist/parser/session-sync-scheduler.js +100 -0
  240. package/dist/parser/session-sync-scheduler.js.map +1 -0
  241. package/dist/parser/setup-status.d.ts +7 -1
  242. package/dist/parser/setup-status.d.ts.map +1 -1
  243. package/dist/parser/setup-status.js +104 -39
  244. package/dist/parser/setup-status.js.map +1 -1
  245. package/dist/parser/shadow-sync-scheduler.d.ts +71 -0
  246. package/dist/parser/shadow-sync-scheduler.d.ts.map +1 -0
  247. package/dist/parser/shadow-sync-scheduler.js +139 -0
  248. package/dist/parser/shadow-sync-scheduler.js.map +1 -0
  249. package/dist/parser/shadow.d.ts +121 -14
  250. package/dist/parser/shadow.d.ts.map +1 -1
  251. package/dist/parser/shadow.js +752 -27
  252. package/dist/parser/shadow.js.map +1 -1
  253. package/dist/parser/skill-render.d.ts +24 -0
  254. package/dist/parser/skill-render.d.ts.map +1 -1
  255. package/dist/parser/skill-render.js +98 -26
  256. package/dist/parser/skill-render.js.map +1 -1
  257. package/dist/parser/validate.d.ts +43 -3
  258. package/dist/parser/validate.d.ts.map +1 -1
  259. package/dist/parser/validate.js +204 -30
  260. package/dist/parser/validate.js.map +1 -1
  261. package/dist/parser/yaml.d.ts +47 -11
  262. package/dist/parser/yaml.d.ts.map +1 -1
  263. package/dist/parser/yaml.js +329 -149
  264. package/dist/parser/yaml.js.map +1 -1
  265. package/dist/review/checks.d.ts +97 -0
  266. package/dist/review/checks.d.ts.map +1 -0
  267. package/dist/review/checks.js +175 -0
  268. package/dist/review/checks.js.map +1 -0
  269. package/dist/review/index.d.ts +3 -0
  270. package/dist/review/index.d.ts.map +1 -0
  271. package/dist/review/index.js +3 -0
  272. package/dist/review/index.js.map +1 -0
  273. package/dist/review/subject-bindings.d.ts +83 -0
  274. package/dist/review/subject-bindings.d.ts.map +1 -0
  275. package/dist/review/subject-bindings.js +175 -0
  276. package/dist/review/subject-bindings.js.map +1 -0
  277. package/dist/schema/common.d.ts +26 -0
  278. package/dist/schema/common.d.ts.map +1 -1
  279. package/dist/schema/common.js +13 -0
  280. package/dist/schema/common.js.map +1 -1
  281. package/dist/schema/dispatch-workspace.d.ts +2643 -0
  282. package/dist/schema/dispatch-workspace.d.ts.map +1 -0
  283. package/dist/schema/dispatch-workspace.js +187 -0
  284. package/dist/schema/dispatch-workspace.js.map +1 -0
  285. package/dist/schema/inbox.d.ts +8 -8
  286. package/dist/schema/index.d.ts +2 -0
  287. package/dist/schema/index.d.ts.map +1 -1
  288. package/dist/schema/index.js +2 -0
  289. package/dist/schema/index.js.map +1 -1
  290. package/dist/schema/meta.d.ts +663 -116
  291. package/dist/schema/meta.d.ts.map +1 -1
  292. package/dist/schema/meta.js +28 -0
  293. package/dist/schema/meta.js.map +1 -1
  294. package/dist/schema/plan.d.ts +30 -19
  295. package/dist/schema/plan.d.ts.map +1 -1
  296. package/dist/schema/plan.js +3 -1
  297. package/dist/schema/plan.js.map +1 -1
  298. package/dist/schema/review-records.d.ts +2676 -0
  299. package/dist/schema/review-records.d.ts.map +1 -0
  300. package/dist/schema/review-records.js +232 -0
  301. package/dist/schema/review-records.js.map +1 -0
  302. package/dist/schema/spec.d.ts +32 -14
  303. package/dist/schema/spec.d.ts.map +1 -1
  304. package/dist/schema/spec.js +5 -0
  305. package/dist/schema/spec.js.map +1 -1
  306. package/dist/schema/task.d.ts +187 -29
  307. package/dist/schema/task.d.ts.map +1 -1
  308. package/dist/schema/task.js +12 -2
  309. package/dist/schema/task.js.map +1 -1
  310. package/dist/schema/triage.d.ts +22 -22
  311. package/dist/sessions/cache.d.ts +119 -0
  312. package/dist/sessions/cache.d.ts.map +1 -0
  313. package/dist/sessions/cache.js +284 -0
  314. package/dist/sessions/cache.js.map +1 -0
  315. package/dist/sessions/index.d.ts +1 -0
  316. package/dist/sessions/index.d.ts.map +1 -1
  317. package/dist/sessions/index.js +2 -0
  318. package/dist/sessions/index.js.map +1 -1
  319. package/dist/sessions/legacy.d.ts +77 -0
  320. package/dist/sessions/legacy.d.ts.map +1 -0
  321. package/dist/sessions/legacy.js +146 -0
  322. package/dist/sessions/legacy.js.map +1 -0
  323. package/dist/sessions/store.d.ts +115 -71
  324. package/dist/sessions/store.d.ts.map +1 -1
  325. package/dist/sessions/store.js +357 -182
  326. package/dist/sessions/store.js.map +1 -1
  327. package/dist/sessions/types.d.ts +44 -16
  328. package/dist/sessions/types.d.ts.map +1 -1
  329. package/dist/sessions/types.js +11 -2
  330. package/dist/sessions/types.js.map +1 -1
  331. package/dist/strings/errors.d.ts +32 -0
  332. package/dist/strings/errors.d.ts.map +1 -1
  333. package/dist/strings/errors.js +17 -0
  334. package/dist/strings/errors.js.map +1 -1
  335. package/dist/strings/labels.d.ts +1 -0
  336. package/dist/strings/labels.d.ts.map +1 -1
  337. package/dist/strings/labels.js +1 -0
  338. package/dist/strings/labels.js.map +1 -1
  339. package/dist/utils/activity.d.ts +101 -0
  340. package/dist/utils/activity.d.ts.map +1 -0
  341. package/dist/utils/activity.js +408 -0
  342. package/dist/utils/activity.js.map +1 -0
  343. package/dist/utils/git.d.ts +31 -0
  344. package/dist/utils/git.d.ts.map +1 -1
  345. package/dist/utils/git.js +87 -0
  346. package/dist/utils/git.js.map +1 -1
  347. package/dist/utils/index.d.ts +2 -0
  348. package/dist/utils/index.d.ts.map +1 -1
  349. package/dist/utils/index.js +1 -0
  350. package/dist/utils/index.js.map +1 -1
  351. package/dist/web-ui/_app/immutable/assets/0.tmlwn-Ih.css +1 -0
  352. package/dist/web-ui/_app/immutable/assets/9.BwwJybWx.css +1 -0
  353. package/dist/web-ui/_app/immutable/chunks/2KqE8gtn.js +1 -0
  354. package/dist/web-ui/_app/immutable/chunks/70-t_QvE.js +1 -0
  355. package/dist/web-ui/_app/immutable/chunks/AiWQj974.js +1 -0
  356. package/dist/web-ui/_app/immutable/chunks/B25nWFyA.js +5 -0
  357. package/dist/web-ui/_app/immutable/chunks/B2bcA_Q_.js +1 -0
  358. package/dist/web-ui/_app/immutable/chunks/B5e5HYyB.js +1 -0
  359. package/dist/web-ui/_app/immutable/chunks/B7-5z6eA.js +1 -0
  360. package/dist/web-ui/_app/immutable/chunks/B7bGmhK0.js +1 -0
  361. package/dist/web-ui/_app/immutable/chunks/B8tYZKAE.js +1 -0
  362. package/dist/web-ui/_app/immutable/chunks/BFGAyJjD.js +1 -0
  363. package/dist/web-ui/_app/immutable/chunks/BG0850zf.js +1 -0
  364. package/dist/web-ui/_app/immutable/chunks/BG8eSzAd.js +1 -0
  365. package/dist/web-ui/_app/immutable/chunks/BIMxXS8I.js +1 -0
  366. package/dist/web-ui/_app/immutable/chunks/BSzL1fpU.js +1 -0
  367. package/dist/web-ui/_app/immutable/chunks/BYtjHfeq.js +1 -0
  368. package/dist/web-ui/_app/immutable/chunks/{D1ArdqNb.js → Bp5pFYXL.js} +1 -1
  369. package/dist/web-ui/_app/immutable/chunks/BsJFsuAT.js +1 -0
  370. package/dist/web-ui/_app/immutable/chunks/BvpNHcD6.js +1 -0
  371. package/dist/web-ui/_app/immutable/chunks/BypqA25-.js +1 -0
  372. package/dist/web-ui/_app/immutable/chunks/C0w6WDm5.js +1 -0
  373. package/dist/web-ui/_app/immutable/chunks/C5_PAZ0y.js +1 -0
  374. package/dist/web-ui/_app/immutable/chunks/CDRO15Iv.js +1 -0
  375. package/dist/web-ui/_app/immutable/chunks/CF1CoqD5.js +1 -0
  376. package/dist/web-ui/_app/immutable/chunks/CS2sa4_m.js +1 -0
  377. package/dist/web-ui/_app/immutable/chunks/CWUQwB9H.js +1 -0
  378. package/dist/web-ui/_app/immutable/chunks/CY5FDdSU.js +1 -0
  379. package/dist/web-ui/_app/immutable/chunks/C_7MTDoj.js +1 -0
  380. package/dist/web-ui/_app/immutable/chunks/CaAJD3dl.js +1 -0
  381. package/dist/web-ui/_app/immutable/chunks/{i-XnOIX0.js → ChB5iyEL.js} +1 -1
  382. package/dist/web-ui/_app/immutable/chunks/ChQD-6N8.js +1 -0
  383. package/dist/web-ui/_app/immutable/chunks/{BCkp8Hs8.js → CqbsoCwA.js} +1 -1
  384. package/dist/web-ui/_app/immutable/chunks/DCeJW50p.js +1 -0
  385. package/dist/web-ui/_app/immutable/chunks/DJtZNgcs.js +1 -0
  386. package/dist/web-ui/_app/immutable/chunks/DKIeaprD.js +1 -0
  387. package/dist/web-ui/_app/immutable/chunks/DLd2uVIA.js +1 -0
  388. package/dist/web-ui/_app/immutable/chunks/DW_subyT.js +2 -0
  389. package/dist/web-ui/_app/immutable/chunks/DbU6lVn0.js +1 -0
  390. package/dist/web-ui/_app/immutable/chunks/Dc7ZCC5m.js +1 -0
  391. package/dist/web-ui/_app/immutable/chunks/Dd5umPsk.js +2 -0
  392. package/dist/web-ui/_app/immutable/chunks/Dg_zDpDS.js +1 -0
  393. package/dist/web-ui/_app/immutable/chunks/Dgqu8Yuc.js +1 -0
  394. package/dist/web-ui/_app/immutable/chunks/DmxsPZTB.js +1 -0
  395. package/dist/web-ui/_app/immutable/chunks/DphTaFUB.js +1 -0
  396. package/dist/web-ui/_app/immutable/chunks/DqK4iHp0.js +1 -0
  397. package/dist/web-ui/_app/immutable/chunks/DqT6OH_u.js +2 -0
  398. package/dist/web-ui/_app/immutable/chunks/Ds9I9wQb.js +1 -0
  399. package/dist/web-ui/_app/immutable/chunks/Du5ng3u4.js +1 -0
  400. package/dist/web-ui/_app/immutable/chunks/DxJw79Wi.js +1 -0
  401. package/dist/web-ui/_app/immutable/chunks/GFTX8GgV.js +1 -0
  402. package/dist/web-ui/_app/immutable/chunks/HNjs76Zz.js +1 -0
  403. package/dist/web-ui/_app/immutable/chunks/HVMjDi4_.js +1 -0
  404. package/dist/web-ui/_app/immutable/chunks/P0A_fJvS.js +1 -0
  405. package/dist/web-ui/_app/immutable/chunks/T3vGWjIL.js +1 -0
  406. package/dist/web-ui/_app/immutable/chunks/VTmrX9Qu.js +1 -0
  407. package/dist/web-ui/_app/immutable/chunks/Xvwhx_F1.js +1 -0
  408. package/dist/web-ui/_app/immutable/chunks/Yyz1XMQA.js +1 -0
  409. package/dist/web-ui/_app/immutable/chunks/dh5HeqUr.js +1 -0
  410. package/dist/web-ui/_app/immutable/chunks/fZMteyca.js +62 -0
  411. package/dist/web-ui/_app/immutable/chunks/{D28BF5MJ.js → gPrj-hqC.js} +1 -1
  412. package/dist/web-ui/_app/immutable/chunks/htcWMiYN.js +1 -0
  413. package/dist/web-ui/_app/immutable/chunks/oTsvd9y4.js +1 -0
  414. package/dist/web-ui/_app/immutable/chunks/qJfLUwU4.js +1 -0
  415. package/dist/web-ui/_app/immutable/chunks/xCtiO_JE.js +1 -0
  416. package/dist/web-ui/_app/immutable/chunks/y4GeEH6k.js +1 -0
  417. package/dist/web-ui/_app/immutable/entry/app.C4h_eOn6.js +2 -0
  418. package/dist/web-ui/_app/immutable/entry/start.CQFTf9ep.js +1 -0
  419. package/dist/web-ui/_app/immutable/nodes/0.Dh1xO970.js +1 -0
  420. package/dist/web-ui/_app/immutable/nodes/1.l75D3Opx.js +1 -0
  421. package/dist/web-ui/_app/immutable/nodes/10.DBidBPc-.js +1 -0
  422. package/dist/web-ui/_app/immutable/nodes/11.Ab0gUKWe.js +1 -0
  423. package/dist/web-ui/_app/immutable/nodes/12.CMsnoxfs.js +1 -0
  424. package/dist/web-ui/_app/immutable/nodes/13.D8YKuknB.js +1 -0
  425. package/dist/web-ui/_app/immutable/nodes/14.DZ0aan7y.js +1 -0
  426. package/dist/web-ui/_app/immutable/nodes/15.CUIKreDL.js +2 -0
  427. package/dist/web-ui/_app/immutable/nodes/16.BWc8--BO.js +1 -0
  428. package/dist/web-ui/_app/immutable/nodes/2.CDUonbuh.js +1 -0
  429. package/dist/web-ui/_app/immutable/nodes/3.Ctg3M00i.js +1 -0
  430. package/dist/web-ui/_app/immutable/nodes/4.Ci-JDwbA.js +2 -0
  431. package/dist/web-ui/_app/immutable/nodes/5.CTyEDAq0.js +1 -0
  432. package/dist/web-ui/_app/immutable/nodes/6.BTZZqsAb.js +1 -0
  433. package/dist/web-ui/_app/immutable/nodes/7.BI52g_Jo.js +137 -0
  434. package/dist/web-ui/_app/immutable/nodes/8.3hZPaB9x.js +1 -0
  435. package/dist/web-ui/_app/immutable/nodes/9.DS49kvwl.js +29 -0
  436. package/dist/web-ui/_app/version.json +1 -1
  437. package/dist/web-ui/favicon-192.png +0 -0
  438. package/dist/web-ui/favicon-32.png +0 -0
  439. package/dist/web-ui/favicon.ico +0 -0
  440. package/dist/web-ui/index.html +14 -11
  441. package/package.json +14 -7
  442. package/plugin/.claude-plugin/marketplace.json +1 -1
  443. package/plugin/.claude-plugin/plugin.json +1 -1
  444. package/plugin/plugins/kspec/skills/merge/SKILL.md +127 -0
  445. package/plugin/plugins/kspec/skills/plan/SKILL.md +55 -26
  446. package/plugin/plugins/kspec/skills/review/SKILL.md +350 -133
  447. package/plugin/plugins/kspec/skills/task-work/SKILL.md +96 -106
  448. package/templates/agents-sections/04-pr-workflow.md +15 -12
  449. package/templates/agents-sections/06-ralph-loop.md +15 -10
  450. package/templates/skills/manifest.yaml +25 -7
  451. package/templates/skills/merge/SKILL.md +120 -0
  452. package/templates/skills/plan/SKILL.md +55 -26
  453. package/templates/skills/review/SKILL.md +346 -130
  454. package/templates/skills/task-work/SKILL.md +93 -103
  455. package/dist/web-ui/_app/immutable/assets/0.BxCxvrZR.css +0 -1
  456. package/dist/web-ui/_app/immutable/chunks/B-CZR0q8.js +0 -1
  457. package/dist/web-ui/_app/immutable/chunks/B1IR5Su5.js +0 -1
  458. package/dist/web-ui/_app/immutable/chunks/B_Cvvtc4.js +0 -1
  459. package/dist/web-ui/_app/immutable/chunks/BtFaGGII.js +0 -1
  460. package/dist/web-ui/_app/immutable/chunks/Bu8JVsCH.js +0 -1
  461. package/dist/web-ui/_app/immutable/chunks/C87u-CNA.js +0 -1
  462. package/dist/web-ui/_app/immutable/chunks/CrFkBTYp.js +0 -1
  463. package/dist/web-ui/_app/immutable/chunks/D6RtLpzL.js +0 -1
  464. package/dist/web-ui/_app/immutable/chunks/D7FHSgx2.js +0 -1
  465. package/dist/web-ui/_app/immutable/chunks/DBXrsxZQ.js +0 -2
  466. package/dist/web-ui/_app/immutable/chunks/Da_hHMuA.js +0 -1
  467. package/dist/web-ui/_app/immutable/chunks/Do6LchSF.js +0 -1
  468. package/dist/web-ui/_app/immutable/chunks/DoNPtcAw.js +0 -1
  469. package/dist/web-ui/_app/immutable/chunks/DtUbXRZz.js +0 -1
  470. package/dist/web-ui/_app/immutable/chunks/DyFPRlLl.js +0 -1
  471. package/dist/web-ui/_app/immutable/chunks/DzAP8lRM.js +0 -1
  472. package/dist/web-ui/_app/immutable/chunks/DzVXElzN.js +0 -2
  473. package/dist/web-ui/_app/immutable/chunks/aoPBFken.js +0 -1
  474. package/dist/web-ui/_app/immutable/chunks/laxtrUO3.js +0 -1
  475. package/dist/web-ui/_app/immutable/chunks/q1nIWgqB.js +0 -1
  476. package/dist/web-ui/_app/immutable/chunks/sTLbk5Nm.js +0 -1
  477. package/dist/web-ui/_app/immutable/chunks/vwKgQu5P.js +0 -5
  478. package/dist/web-ui/_app/immutable/entry/app.BCwMcqnT.js +0 -2
  479. package/dist/web-ui/_app/immutable/entry/start.wKCQH-tt.js +0 -1
  480. package/dist/web-ui/_app/immutable/nodes/0.CjGVMG74.js +0 -1
  481. package/dist/web-ui/_app/immutable/nodes/1.B6_AIPan.js +0 -1
  482. package/dist/web-ui/_app/immutable/nodes/2.q4oCS7Ws.js +0 -1
  483. package/dist/web-ui/_app/immutable/nodes/3.rTKZf9o2.js +0 -1
  484. package/dist/web-ui/_app/immutable/nodes/4.DVIDRu1d.js +0 -1
  485. package/dist/web-ui/_app/immutable/nodes/5.8PtPXIOd.js +0 -1
  486. package/dist/web-ui/_app/immutable/nodes/6.ZZrTemy_.js +0 -1
  487. package/dist/web-ui/_app/immutable/nodes/7.IP-gxCxi.js +0 -1
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Review-task integration: sync rules and linkage.
3
+ *
4
+ * Implements the synchronization rules between review records and task
5
+ * lifecycle without replacing the lightweight task workflow model.
6
+ *
7
+ * AC: @review-task-lifecycle-integration ac-1 - review_ref linkage
8
+ * AC: @review-task-lifecycle-integration ac-2 - auto-set review_ref on task subject
9
+ * AC: @review-task-lifecycle-integration ac-3 - auto-set review_ref on related task
10
+ * AC: @review-task-lifecycle-integration ac-4 - verdict drives task transition
11
+ * AC: @review-task-lifecycle-integration ac-5 - inconsistent linkage warning
12
+ * AC: @review-task-lifecycle-integration ac-6 - history preserved through fix cycles
13
+ * AC: @review-task-lifecycle-integration ac-7 - external links as compatibility
14
+ */
15
+ import type { ReviewRecord, ReviewVerdictDecision } from "../schema/index.js";
16
+ import type { KspecContext, LoadedTask } from "./yaml.js";
17
+ import { type LoadedReviewRecord } from "./reviews.js";
18
+ /**
19
+ * Result of linking a review to task(s).
20
+ */
21
+ export interface ReviewTaskLinkResult {
22
+ /** Tasks that had their review_ref updated. */
23
+ linkedTasks: Array<{
24
+ ulid: string;
25
+ slug?: string;
26
+ }>;
27
+ }
28
+ /**
29
+ * Link a newly created review to associated tasks by setting review_ref.
30
+ *
31
+ * AC: @review-task-lifecycle-integration ac-2 - task subject auto-link
32
+ * AC: @review-task-lifecycle-integration ac-3 - related_refs auto-link
33
+ *
34
+ * When a review is created with:
35
+ * - A task subject (type: "task"): sets review_ref on the subject task
36
+ * - related_refs containing task refs: sets review_ref on each related task
37
+ *
38
+ * Uses the first slug as the review ref, falling back to @ULID.
39
+ */
40
+ export declare function linkReviewToTasks(ctx: KspecContext, review: ReviewRecord, allTasks: LoadedTask[]): Promise<ReviewTaskLinkResult>;
41
+ /**
42
+ * Handle verdict-driven task transition.
43
+ *
44
+ * AC: @review-task-lifecycle-integration ac-4
45
+ *
46
+ * When a changes_requested verdict is recorded on a review:
47
+ * - If the review has a task subject, transition that task to needs_work
48
+ * - If the review has related task refs, transition those tasks to needs_work
49
+ *
50
+ * Only transitions tasks that are currently in pending_review.
51
+ * Returns the list of tasks that were transitioned.
52
+ */
53
+ export declare function handleVerdictTaskTransition(ctx: KspecContext, review: ReviewRecord, decision: ReviewVerdictDecision, allTasks: LoadedTask[], reviewer?: string): Promise<Array<{
54
+ ulid: string;
55
+ slug?: string;
56
+ transitioned: boolean;
57
+ }>>;
58
+ /**
59
+ * Warning about inconsistent review linkage on a task.
60
+ *
61
+ * AC: @review-task-lifecycle-integration ac-5
62
+ */
63
+ export interface ReviewLinkageWarning {
64
+ taskRef: string;
65
+ taskTitle: string;
66
+ message: string;
67
+ }
68
+ /**
69
+ * Check tasks for inconsistent review linkage.
70
+ *
71
+ * AC: @review-task-lifecycle-integration ac-5
72
+ *
73
+ * Surfaces warnings when:
74
+ * - A task is in pending_review with no review_ref
75
+ * - A task is in pending_review with a review_ref pointing at a closed/archived review
76
+ */
77
+ export declare function checkReviewLinkageConsistency(tasks: LoadedTask[], reviews: LoadedReviewRecord[]): ReviewLinkageWarning[];
78
+ //# sourceMappingURL=review-task-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-task-integration.d.ts","sourceRoot":"","sources":["../../src/parser/review-task-integration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE1D,OAAO,EAAsC,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE3F;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,UAAU,EAAE,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAoD/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CAsExE;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,EAAE,kBAAkB,EAAE,GAC5B,oBAAoB,EAAE,CAmCxB"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Review-task integration: sync rules and linkage.
3
+ *
4
+ * Implements the synchronization rules between review records and task
5
+ * lifecycle without replacing the lightweight task workflow model.
6
+ *
7
+ * AC: @review-task-lifecycle-integration ac-1 - review_ref linkage
8
+ * AC: @review-task-lifecycle-integration ac-2 - auto-set review_ref on task subject
9
+ * AC: @review-task-lifecycle-integration ac-3 - auto-set review_ref on related task
10
+ * AC: @review-task-lifecycle-integration ac-4 - verdict drives task transition
11
+ * AC: @review-task-lifecycle-integration ac-5 - inconsistent linkage warning
12
+ * AC: @review-task-lifecycle-integration ac-6 - history preserved through fix cycles
13
+ * AC: @review-task-lifecycle-integration ac-7 - external links as compatibility
14
+ */
15
+ import { createNote, getAuthor, mutateTaskAtomically } from "./yaml.js";
16
+ import { findReviewByRef } from "./reviews.js";
17
+ /**
18
+ * Link a newly created review to associated tasks by setting review_ref.
19
+ *
20
+ * AC: @review-task-lifecycle-integration ac-2 - task subject auto-link
21
+ * AC: @review-task-lifecycle-integration ac-3 - related_refs auto-link
22
+ *
23
+ * When a review is created with:
24
+ * - A task subject (type: "task"): sets review_ref on the subject task
25
+ * - related_refs containing task refs: sets review_ref on each related task
26
+ *
27
+ * Uses the first slug as the review ref, falling back to @ULID.
28
+ */
29
+ export async function linkReviewToTasks(ctx, review, allTasks) {
30
+ const result = { linkedTasks: [] };
31
+ const reviewRef = review.slugs.length > 0
32
+ ? `@${review.slugs[0]}`
33
+ : `@${review._ulid}`;
34
+ // Collect task refs to link
35
+ const taskRefsToLink = new Set();
36
+ // AC: @review-task-lifecycle-integration ac-2 - task subject
37
+ if (review.subject.type === "task") {
38
+ taskRefsToLink.add(review.subject.ref);
39
+ }
40
+ // AC: @review-task-lifecycle-integration ac-3 - related_refs
41
+ for (const ref of review.related_refs) {
42
+ // Only link refs that resolve to tasks
43
+ const cleanRef = ref.startsWith("@") ? ref.slice(1) : ref;
44
+ const matchedTask = allTasks.find((t) => t._ulid === cleanRef ||
45
+ t._ulid.toLowerCase().startsWith(cleanRef.toLowerCase()) ||
46
+ t.slugs.includes(cleanRef));
47
+ if (matchedTask) {
48
+ taskRefsToLink.add(ref);
49
+ }
50
+ }
51
+ // Set review_ref on each matched task
52
+ for (const taskRef of taskRefsToLink) {
53
+ const cleanRef = taskRef.startsWith("@") ? taskRef.slice(1) : taskRef;
54
+ const task = allTasks.find((t) => t._ulid === cleanRef ||
55
+ t._ulid.toLowerCase().startsWith(cleanRef.toLowerCase()) ||
56
+ t.slugs.includes(cleanRef));
57
+ if (!task)
58
+ continue;
59
+ await mutateTaskAtomically(ctx, task, (latestTask) => ({
60
+ ...latestTask,
61
+ review_ref: reviewRef,
62
+ }));
63
+ result.linkedTasks.push({
64
+ ulid: task._ulid,
65
+ slug: task.slugs[0],
66
+ });
67
+ }
68
+ return result;
69
+ }
70
+ /**
71
+ * Handle verdict-driven task transition.
72
+ *
73
+ * AC: @review-task-lifecycle-integration ac-4
74
+ *
75
+ * When a changes_requested verdict is recorded on a review:
76
+ * - If the review has a task subject, transition that task to needs_work
77
+ * - If the review has related task refs, transition those tasks to needs_work
78
+ *
79
+ * Only transitions tasks that are currently in pending_review.
80
+ * Returns the list of tasks that were transitioned.
81
+ */
82
+ export async function handleVerdictTaskTransition(ctx, review, decision, allTasks, reviewer) {
83
+ if (decision !== "request_changes") {
84
+ return [];
85
+ }
86
+ const results = [];
87
+ // Collect task refs from subject and related_refs
88
+ const taskRefsToCheck = new Set();
89
+ if (review.subject.type === "task") {
90
+ taskRefsToCheck.add(review.subject.ref);
91
+ }
92
+ for (const ref of review.related_refs) {
93
+ const cleanRef = ref.startsWith("@") ? ref.slice(1) : ref;
94
+ const matchedTask = allTasks.find((t) => t._ulid === cleanRef ||
95
+ t._ulid.toLowerCase().startsWith(cleanRef.toLowerCase()) ||
96
+ t.slugs.includes(cleanRef));
97
+ if (matchedTask) {
98
+ taskRefsToCheck.add(ref);
99
+ }
100
+ }
101
+ for (const taskRef of taskRefsToCheck) {
102
+ const cleanRef = taskRef.startsWith("@") ? taskRef.slice(1) : taskRef;
103
+ const task = allTasks.find((t) => t._ulid === cleanRef ||
104
+ t._ulid.toLowerCase().startsWith(cleanRef.toLowerCase()) ||
105
+ t.slugs.includes(cleanRef));
106
+ if (!task)
107
+ continue;
108
+ if (task.status !== "pending_review") {
109
+ results.push({ ulid: task._ulid, slug: task.slugs[0], transitioned: false });
110
+ continue;
111
+ }
112
+ // Count existing fix cycles for cycle numbering
113
+ const existingKickbacks = task.notes.filter((note) => note.content.includes("[FIX_CYCLE:")).length;
114
+ const cycleNumber = existingKickbacks + 1;
115
+ await mutateTaskAtomically(ctx, task, (latestTask) => {
116
+ if (latestTask.status !== "pending_review") {
117
+ return latestTask;
118
+ }
119
+ const note = createNote(`[FIX_CYCLE: ${cycleNumber}] Review verdict: changes_requested${reviewer ? ` by ${reviewer}` : ""}`, getAuthor(ctx.config?.identity?.author));
120
+ return {
121
+ ...latestTask,
122
+ status: "needs_work",
123
+ session_id: null,
124
+ notes: [...latestTask.notes, note],
125
+ };
126
+ });
127
+ results.push({ ulid: task._ulid, slug: task.slugs[0], transitioned: true });
128
+ }
129
+ return results;
130
+ }
131
+ /**
132
+ * Check tasks for inconsistent review linkage.
133
+ *
134
+ * AC: @review-task-lifecycle-integration ac-5
135
+ *
136
+ * Surfaces warnings when:
137
+ * - A task is in pending_review with no review_ref
138
+ * - A task is in pending_review with a review_ref pointing at a closed/archived review
139
+ */
140
+ export function checkReviewLinkageConsistency(tasks, reviews) {
141
+ const warnings = [];
142
+ for (const task of tasks) {
143
+ if (task.status !== "pending_review")
144
+ continue;
145
+ const taskRef = task.slugs[0] ? `@${task.slugs[0]}` : `@${task._ulid}`;
146
+ if (!task.review_ref) {
147
+ warnings.push({
148
+ taskRef,
149
+ taskTitle: task.title,
150
+ message: `Task ${taskRef} is in pending_review but has no review_ref — review linkage is missing`,
151
+ });
152
+ continue;
153
+ }
154
+ // Check if review_ref points to a valid, non-closed review
155
+ const review = findReviewByRef(reviews, task.review_ref);
156
+ if (!review) {
157
+ warnings.push({
158
+ taskRef,
159
+ taskTitle: task.title,
160
+ message: `Task ${taskRef} has review_ref ${task.review_ref} but the review record was not found`,
161
+ });
162
+ }
163
+ else if (review.lifecycle_state === "closed" || review.lifecycle_state === "archived") {
164
+ warnings.push({
165
+ taskRef,
166
+ taskTitle: task.title,
167
+ message: `Task ${taskRef} is in pending_review but review_ref ${task.review_ref} is ${review.lifecycle_state}`,
168
+ });
169
+ }
170
+ }
171
+ return warnings;
172
+ }
173
+ //# sourceMappingURL=review-task-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-task-integration.js","sourceRoot":"","sources":["../../src/parser/review-task-integration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,eAAe,EAA8C,MAAM,cAAc,CAAC;AAU3F;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAiB,EACjB,MAAoB,EACpB,QAAsB;IAEtB,MAAM,MAAM,GAAyB,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IACzD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QACvC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QACvB,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;IAEvB,4BAA4B;IAC5B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,6DAA6D;IAC7D,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACnC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,6DAA6D;IAC7D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACtC,uCAAuC;QACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1D,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,KAAK,KAAK,QAAQ;YACpB,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YACxD,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,IAAI,WAAW,EAAE,CAAC;YAChB,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CACxB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,KAAK,KAAK,QAAQ;YACpB,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YACxD,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACrD,GAAG,UAAU;YACb,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC,CAAC;QAEJ,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;SACpB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,GAAiB,EACjB,MAAoB,EACpB,QAA+B,EAC/B,QAAsB,EACtB,QAAiB;IAEjB,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAkE,EAAE,CAAC;IAElF,kDAAkD;IAClD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACnC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1D,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,KAAK,KAAK,QAAQ;YACpB,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YACxD,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,IAAI,WAAW,EAAE,CAAC;YAChB,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CACxB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,KAAK,KAAK,QAAQ;YACpB,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YACxD,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7E,SAAS;QACX,CAAC;QAED,gDAAgD;QAChD,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACnD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CACrC,CAAC,MAAM,CAAC;QACT,MAAM,WAAW,GAAG,iBAAiB,GAAG,CAAC,CAAC;QAE1C,MAAM,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE;YACnD,IAAI,UAAU,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;gBAC3C,OAAO,UAAU,CAAC;YACpB,CAAC;YAED,MAAM,IAAI,GAAG,UAAU,CACrB,eAAe,WAAW,sCAAsC,QAAQ,CAAC,CAAC,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACnG,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CACxC,CAAC;YAEF,OAAO;gBACL,GAAG,UAAU;gBACb,MAAM,EAAE,YAAqB;gBAC7B,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC;aACnC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAaD;;;;;;;;GAQG;AACH,MAAM,UAAU,6BAA6B,CAC3C,KAAmB,EACnB,OAA6B;IAE7B,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB;YAAE,SAAS;QAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAEvE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC;gBACZ,OAAO;gBACP,SAAS,EAAE,IAAI,CAAC,KAAK;gBACrB,OAAO,EAAE,QAAQ,OAAO,yEAAyE;aAClG,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,2DAA2D;QAC3D,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC;gBACZ,OAAO;gBACP,SAAS,EAAE,IAAI,CAAC,KAAK;gBACrB,OAAO,EAAE,QAAQ,OAAO,mBAAmB,IAAI,CAAC,UAAU,sCAAsC;aACjG,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,MAAM,CAAC,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;YACxF,QAAQ,CAAC,IAAI,CAAC;gBACZ,OAAO;gBACP,SAAS,EAAE,IAAI,CAAC,KAAK;gBACrB,OAAO,EAAE,QAAQ,OAAO,wCAAwC,IAAI,CAAC,UAAU,OAAO,MAAM,CAAC,eAAe,EAAE;aAC/G,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Review thread operations.
3
+ *
4
+ * Provides functions to add threads (general or anchored), add replies,
5
+ * resolve/reopen threads, and compute review disposition based on
6
+ * unresolved blocking threads.
7
+ *
8
+ * AC: @review-comment-threads-and-anchors ac-1 - General thread creation
9
+ * AC: @review-comment-threads-and-anchors ac-2 - Code anchor threads
10
+ * AC: @review-comment-threads-and-anchors ac-3 - Structured anchor threads
11
+ * AC: @review-comment-threads-and-anchors ac-4 - Threaded replies
12
+ * AC: @review-comment-threads-and-anchors ac-5 - Thread kind field
13
+ * AC: @review-comment-threads-and-anchors ac-6 - Disposition computation
14
+ */
15
+ import type { ReviewRecord, ReviewThread, ReviewThreadEntry, ReviewThreadKind, ReviewAnchor, ReviewDisposition } from "../schema/index.js";
16
+ import type { LoadedReviewRecord } from "./reviews.js";
17
+ import type { KspecContext } from "./yaml.js";
18
+ export interface AddThreadInput {
19
+ author: string;
20
+ body: string;
21
+ kind?: ReviewThreadKind;
22
+ anchor?: ReviewAnchor;
23
+ }
24
+ export interface AddReplyInput {
25
+ threadUlid: string;
26
+ author: string;
27
+ body: string;
28
+ }
29
+ export interface ResolveThreadInput {
30
+ threadUlid: string;
31
+ actor: string;
32
+ }
33
+ /**
34
+ * Add a new thread to a review record.
35
+ *
36
+ * AC: @review-comment-threads-and-anchors ac-1 - General threads (no anchor)
37
+ * AC: @review-comment-threads-and-anchors ac-2 - Code anchor threads
38
+ * AC: @review-comment-threads-and-anchors ac-3 - Structured anchor threads
39
+ * AC: @review-comment-threads-and-anchors ac-5 - Thread kind field
40
+ */
41
+ export declare function addThread(review: ReviewRecord, input: AddThreadInput): {
42
+ review: ReviewRecord;
43
+ thread: ReviewThread;
44
+ };
45
+ /**
46
+ * Add a reply to an existing thread.
47
+ *
48
+ * AC: @review-comment-threads-and-anchors ac-4 - Threaded replies
49
+ */
50
+ export declare function addReply(review: ReviewRecord, input: AddReplyInput): {
51
+ review: ReviewRecord;
52
+ entry: ReviewThreadEntry;
53
+ };
54
+ /**
55
+ * Resolve a thread.
56
+ */
57
+ export declare function resolveThread(review: ReviewRecord, input: ResolveThreadInput): ReviewRecord;
58
+ /**
59
+ * Reopen a previously resolved thread.
60
+ */
61
+ export declare function reopenThread(review: ReviewRecord, input: ResolveThreadInput): ReviewRecord;
62
+ /**
63
+ * Compute review disposition based on unresolved threads.
64
+ *
65
+ * AC: @review-comment-threads-and-anchors ac-6
66
+ *
67
+ * Only unresolved threads with kind "blocker" prevent approval.
68
+ * Unresolved "nit" and "question" threads do not block.
69
+ */
70
+ export declare function computeThreadDisposition(review: ReviewRecord): ReviewDisposition;
71
+ /**
72
+ * Get unresolved blocking threads from a review.
73
+ */
74
+ export declare function getUnresolvedBlockers(review: ReviewRecord): ReviewThread[];
75
+ /**
76
+ * Get all unresolved threads from a review (any kind).
77
+ */
78
+ export declare function getUnresolvedThreads(review: ReviewRecord): ReviewThread[];
79
+ /**
80
+ * Add a thread to a review with atomic persistence.
81
+ */
82
+ export declare function addThreadAtomic(ctx: KspecContext, review: LoadedReviewRecord, input: AddThreadInput): Promise<{
83
+ review: LoadedReviewRecord;
84
+ thread: ReviewThread;
85
+ }>;
86
+ /**
87
+ * Add a reply to a thread with atomic persistence.
88
+ */
89
+ export declare function addReplyAtomic(ctx: KspecContext, review: LoadedReviewRecord, input: AddReplyInput): Promise<{
90
+ review: LoadedReviewRecord;
91
+ entry: ReviewThreadEntry;
92
+ }>;
93
+ /**
94
+ * Resolve a thread with atomic persistence.
95
+ */
96
+ export declare function resolveThreadAtomic(ctx: KspecContext, review: LoadedReviewRecord, input: ResolveThreadInput): Promise<LoadedReviewRecord>;
97
+ /**
98
+ * Reopen a thread with atomic persistence.
99
+ */
100
+ export declare function reopenThreadAtomic(ctx: KspecContext, review: LoadedReviewRecord, input: ResolveThreadInput): Promise<LoadedReviewRecord>;
101
+ //# sourceMappingURL=review-threads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-threads.d.ts","sourceRoot":"","sources":["../../src/parser/review-threads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EAEZ,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAI9C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAoBD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,cAAc,GACpB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAkChD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,aAAa,GACnB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CAwCpD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,kBAAkB,GACxB,YAAY,CA6Bd;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,kBAAkB,GACxB,YAAY,CA6Bd;AAID;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,GACnB,iBAAiB,CAUnB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,GACnB,YAAY,EAAE,CAIhB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,GACnB,YAAY,EAAE,CAEhB;AAID;;GAEG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC,CAU/D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAUnE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAI7B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAI7B"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Review thread operations.
3
+ *
4
+ * Provides functions to add threads (general or anchored), add replies,
5
+ * resolve/reopen threads, and compute review disposition based on
6
+ * unresolved blocking threads.
7
+ *
8
+ * AC: @review-comment-threads-and-anchors ac-1 - General thread creation
9
+ * AC: @review-comment-threads-and-anchors ac-2 - Code anchor threads
10
+ * AC: @review-comment-threads-and-anchors ac-3 - Structured anchor threads
11
+ * AC: @review-comment-threads-and-anchors ac-4 - Threaded replies
12
+ * AC: @review-comment-threads-and-anchors ac-5 - Thread kind field
13
+ * AC: @review-comment-threads-and-anchors ac-6 - Disposition computation
14
+ */
15
+ import { ulid } from "ulid";
16
+ import { mutateReviewAtomically } from "./reviews.js";
17
+ // --- Event helpers ---
18
+ function createEvent(eventType, actor, payload = {}) {
19
+ return {
20
+ _ulid: ulid(),
21
+ event_type: eventType,
22
+ actor,
23
+ timestamp: new Date().toISOString(),
24
+ payload,
25
+ };
26
+ }
27
+ // --- Thread operations ---
28
+ /**
29
+ * Add a new thread to a review record.
30
+ *
31
+ * AC: @review-comment-threads-and-anchors ac-1 - General threads (no anchor)
32
+ * AC: @review-comment-threads-and-anchors ac-2 - Code anchor threads
33
+ * AC: @review-comment-threads-and-anchors ac-3 - Structured anchor threads
34
+ * AC: @review-comment-threads-and-anchors ac-5 - Thread kind field
35
+ */
36
+ export function addThread(review, input) {
37
+ const now = new Date().toISOString();
38
+ const threadUlid = ulid();
39
+ const entryUlid = ulid();
40
+ const entry = {
41
+ _ulid: entryUlid,
42
+ author: input.author,
43
+ body: input.body,
44
+ created_at: now,
45
+ };
46
+ const thread = {
47
+ _ulid: threadUlid,
48
+ kind: input.kind ?? "nit",
49
+ entries: [entry],
50
+ ...(input.anchor ? { anchor: input.anchor } : {}),
51
+ };
52
+ const event = createEvent("thread_created", input.author, {
53
+ thread_ulid: threadUlid,
54
+ kind: thread.kind,
55
+ ...(input.anchor ? { anchor_type: input.anchor.type } : {}),
56
+ });
57
+ return {
58
+ review: {
59
+ ...review,
60
+ threads: [...review.threads, thread],
61
+ events: [...review.events, event],
62
+ updated_at: now,
63
+ },
64
+ thread,
65
+ };
66
+ }
67
+ /**
68
+ * Add a reply to an existing thread.
69
+ *
70
+ * AC: @review-comment-threads-and-anchors ac-4 - Threaded replies
71
+ */
72
+ export function addReply(review, input) {
73
+ const now = new Date().toISOString();
74
+ const entryUlid = ulid();
75
+ const threadIndex = review.threads.findIndex((t) => t._ulid === input.threadUlid);
76
+ if (threadIndex === -1) {
77
+ throw new Error(`Thread not found: ${input.threadUlid}`);
78
+ }
79
+ const entry = {
80
+ _ulid: entryUlid,
81
+ author: input.author,
82
+ body: input.body,
83
+ created_at: now,
84
+ };
85
+ const updatedThread = {
86
+ ...review.threads[threadIndex],
87
+ entries: [...review.threads[threadIndex].entries, entry],
88
+ };
89
+ const updatedThreads = [...review.threads];
90
+ updatedThreads[threadIndex] = updatedThread;
91
+ const event = createEvent("thread_replied", input.author, {
92
+ thread_ulid: input.threadUlid,
93
+ entry_ulid: entryUlid,
94
+ });
95
+ return {
96
+ review: {
97
+ ...review,
98
+ threads: updatedThreads,
99
+ events: [...review.events, event],
100
+ updated_at: now,
101
+ },
102
+ entry,
103
+ };
104
+ }
105
+ /**
106
+ * Resolve a thread.
107
+ */
108
+ export function resolveThread(review, input) {
109
+ const now = new Date().toISOString();
110
+ const threadIndex = review.threads.findIndex((t) => t._ulid === input.threadUlid);
111
+ if (threadIndex === -1) {
112
+ throw new Error(`Thread not found: ${input.threadUlid}`);
113
+ }
114
+ const updatedThread = {
115
+ ...review.threads[threadIndex],
116
+ resolved_at: now,
117
+ resolved_by: input.actor,
118
+ };
119
+ const updatedThreads = [...review.threads];
120
+ updatedThreads[threadIndex] = updatedThread;
121
+ const event = createEvent("thread_resolved", input.actor, {
122
+ thread_ulid: input.threadUlid,
123
+ });
124
+ return {
125
+ ...review,
126
+ threads: updatedThreads,
127
+ events: [...review.events, event],
128
+ updated_at: now,
129
+ };
130
+ }
131
+ /**
132
+ * Reopen a previously resolved thread.
133
+ */
134
+ export function reopenThread(review, input) {
135
+ const now = new Date().toISOString();
136
+ const threadIndex = review.threads.findIndex((t) => t._ulid === input.threadUlid);
137
+ if (threadIndex === -1) {
138
+ throw new Error(`Thread not found: ${input.threadUlid}`);
139
+ }
140
+ const updatedThread = {
141
+ ...review.threads[threadIndex],
142
+ resolved_at: null,
143
+ resolved_by: null,
144
+ };
145
+ const updatedThreads = [...review.threads];
146
+ updatedThreads[threadIndex] = updatedThread;
147
+ const event = createEvent("thread_reopened", input.actor, {
148
+ thread_ulid: input.threadUlid,
149
+ });
150
+ return {
151
+ ...review,
152
+ threads: updatedThreads,
153
+ events: [...review.events, event],
154
+ updated_at: now,
155
+ };
156
+ }
157
+ // --- Disposition computation ---
158
+ /**
159
+ * Compute review disposition based on unresolved threads.
160
+ *
161
+ * AC: @review-comment-threads-and-anchors ac-6
162
+ *
163
+ * Only unresolved threads with kind "blocker" prevent approval.
164
+ * Unresolved "nit" and "question" threads do not block.
165
+ */
166
+ export function computeThreadDisposition(review) {
167
+ const hasUnresolvedBlockers = review.threads.some((t) => t.kind === "blocker" && !t.resolved_at);
168
+ if (hasUnresolvedBlockers) {
169
+ return "changes_requested";
170
+ }
171
+ return "pending";
172
+ }
173
+ /**
174
+ * Get unresolved blocking threads from a review.
175
+ */
176
+ export function getUnresolvedBlockers(review) {
177
+ return review.threads.filter((t) => t.kind === "blocker" && !t.resolved_at);
178
+ }
179
+ /**
180
+ * Get all unresolved threads from a review (any kind).
181
+ */
182
+ export function getUnresolvedThreads(review) {
183
+ return review.threads.filter((t) => !t.resolved_at);
184
+ }
185
+ // --- Atomic persistence wrappers ---
186
+ /**
187
+ * Add a thread to a review with atomic persistence.
188
+ */
189
+ export async function addThreadAtomic(ctx, review, input) {
190
+ let createdThread;
191
+ const updated = await mutateReviewAtomically(ctx, review, (latest) => {
192
+ const result = addThread(latest, input);
193
+ createdThread = result.thread;
194
+ return result.review;
195
+ });
196
+ return { review: updated, thread: createdThread };
197
+ }
198
+ /**
199
+ * Add a reply to a thread with atomic persistence.
200
+ */
201
+ export async function addReplyAtomic(ctx, review, input) {
202
+ let createdEntry;
203
+ const updated = await mutateReviewAtomically(ctx, review, (latest) => {
204
+ const result = addReply(latest, input);
205
+ createdEntry = result.entry;
206
+ return result.review;
207
+ });
208
+ return { review: updated, entry: createdEntry };
209
+ }
210
+ /**
211
+ * Resolve a thread with atomic persistence.
212
+ */
213
+ export async function resolveThreadAtomic(ctx, review, input) {
214
+ return mutateReviewAtomically(ctx, review, (latest) => resolveThread(latest, input));
215
+ }
216
+ /**
217
+ * Reopen a thread with atomic persistence.
218
+ */
219
+ export async function reopenThreadAtomic(ctx, review, input) {
220
+ return mutateReviewAtomically(ctx, review, (latest) => reopenThread(latest, input));
221
+ }
222
+ //# sourceMappingURL=review-threads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-threads.js","sourceRoot":"","sources":["../../src/parser/review-threads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Validation module for review records.
3
+ *
4
+ * Provides schema validation for review records, threads, checks, verdicts,
5
+ * events, and subject bindings. Used during parsing, persistence, and
6
+ * command mutation to ensure review data integrity.
7
+ *
8
+ * AC: @review-record-validation ac-1, ac-2
9
+ */
10
+ import type { SchemaValidationError } from "./validate.js";
11
+ /**
12
+ * Result of validating a single review record.
13
+ */
14
+ export interface ReviewValidationResult {
15
+ valid: boolean;
16
+ errors: SchemaValidationError[];
17
+ }
18
+ /**
19
+ * Validate a single review record against the full ReviewRecordSchema.
20
+ * Use this when validating persisted or loaded review records.
21
+ *
22
+ * AC: @review-record-validation ac-1
23
+ */
24
+ export declare function validateReviewRecord(data: unknown, source?: string): ReviewValidationResult;
25
+ /**
26
+ * Validate review record input (for creating new reviews).
27
+ * Uses ReviewRecordInputSchema which has relaxed requirements.
28
+ *
29
+ * AC: @review-record-validation ac-1, ac-2
30
+ */
31
+ export declare function validateReviewRecordInput(data: unknown, source?: string): ReviewValidationResult;
32
+ /**
33
+ * Validate a reviews YAML file (project.reviews.yaml).
34
+ * Validates the file-level schema and each individual review record.
35
+ *
36
+ * AC: @review-record-validation ac-1, ac-2
37
+ */
38
+ export declare function validateReviewsFile(filePath: string): Promise<SchemaValidationError[]>;
39
+ /**
40
+ * Find review files in a directory (files matching *.reviews.yaml).
41
+ */
42
+ export declare function findReviewFiles(dir: string): Promise<string[]>;
43
+ /**
44
+ * Convenience: parse and validate a review record, returning the typed
45
+ * result on success or errors on failure.
46
+ *
47
+ * AC: @review-record-validation ac-1, ac-2
48
+ */
49
+ export declare function parseReviewRecord(data: unknown, source?: string): {
50
+ ok: true;
51
+ data: import("../schema/review-records.js").ReviewRecord;
52
+ } | {
53
+ ok: false;
54
+ errors: SchemaValidationError[];
55
+ };
56
+ /**
57
+ * Convenience: parse and validate review record input, returning the typed
58
+ * result on success or errors on failure.
59
+ *
60
+ * AC: @review-record-validation ac-1, ac-2
61
+ */
62
+ export declare function parseReviewRecordInput(data: unknown, source?: string): {
63
+ ok: true;
64
+ data: import("../schema/review-records.js").ReviewRecordInput;
65
+ } | {
66
+ ok: false;
67
+ errors: SchemaValidationError[];
68
+ };
69
+ //# sourceMappingURL=review-validation.d.ts.map