agentplane 0.3.6 → 0.3.8

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 (663) hide show
  1. package/assets/AGENTS.md +11 -1
  2. package/assets/RUNNER.md +17 -0
  3. package/bin/agentplane.js +16 -7
  4. package/bin/framework-dev-contract.d.ts +6 -0
  5. package/bin/framework-dev-contract.js +13 -0
  6. package/bin/stale-dist-policy.js +6 -1
  7. package/dist/.build-manifest.json +724 -359
  8. package/dist/adapters/task-backend/task-backend-adapter.d.ts +4 -2
  9. package/dist/adapters/task-backend/task-backend-adapter.d.ts.map +1 -1
  10. package/dist/adapters/task-backend/task-backend-adapter.js +15 -2
  11. package/dist/backends/task-backend/local-backend-doc.d.ts +5 -0
  12. package/dist/backends/task-backend/local-backend-doc.d.ts.map +1 -0
  13. package/dist/backends/task-backend/local-backend-doc.js +98 -0
  14. package/dist/backends/task-backend/local-backend-read.d.ts +7 -0
  15. package/dist/backends/task-backend/local-backend-read.d.ts.map +1 -0
  16. package/dist/backends/task-backend/local-backend-read.js +186 -0
  17. package/dist/backends/task-backend/local-backend-state.d.ts +17 -0
  18. package/dist/backends/task-backend/local-backend-state.d.ts.map +1 -0
  19. package/dist/backends/task-backend/local-backend-state.js +50 -0
  20. package/dist/backends/task-backend/local-backend-write.d.ts +15 -0
  21. package/dist/backends/task-backend/local-backend-write.d.ts.map +1 -0
  22. package/dist/backends/task-backend/local-backend-write.js +254 -0
  23. package/dist/backends/task-backend/local-backend.d.ts +10 -6
  24. package/dist/backends/task-backend/local-backend.d.ts.map +1 -1
  25. package/dist/backends/task-backend/local-backend.js +32 -337
  26. package/dist/backends/task-backend/redmine/backend-cache-doc.d.ts +40 -0
  27. package/dist/backends/task-backend/redmine/backend-cache-doc.d.ts.map +1 -0
  28. package/dist/backends/task-backend/redmine/backend-cache-doc.js +178 -0
  29. package/dist/backends/task-backend/redmine/backend-report.d.ts +10 -0
  30. package/dist/backends/task-backend/redmine/backend-report.d.ts.map +1 -0
  31. package/dist/backends/task-backend/redmine/backend-report.js +43 -0
  32. package/dist/backends/task-backend/redmine/backend-sync.d.ts +67 -0
  33. package/dist/backends/task-backend/redmine/backend-sync.d.ts.map +1 -0
  34. package/dist/backends/task-backend/redmine/backend-sync.js +367 -0
  35. package/dist/backends/task-backend/redmine/env.d.ts +1 -1
  36. package/dist/backends/task-backend/redmine/env.d.ts.map +1 -1
  37. package/dist/backends/task-backend/redmine/env.js +3 -0
  38. package/dist/backends/task-backend/redmine/inspect.d.ts +11 -0
  39. package/dist/backends/task-backend/redmine/inspect.d.ts.map +1 -0
  40. package/dist/backends/task-backend/redmine/inspect.js +75 -0
  41. package/dist/backends/task-backend/redmine/mapping.d.ts +2 -1
  42. package/dist/backends/task-backend/redmine/mapping.d.ts.map +1 -1
  43. package/dist/backends/task-backend/redmine/mapping.js +32 -3
  44. package/dist/backends/task-backend/redmine/parse.d.ts +2 -1
  45. package/dist/backends/task-backend/redmine/parse.d.ts.map +1 -1
  46. package/dist/backends/task-backend/redmine/parse.js +5 -3
  47. package/dist/backends/task-backend/redmine/state.d.ts +19 -0
  48. package/dist/backends/task-backend/redmine/state.d.ts.map +1 -0
  49. package/dist/backends/task-backend/redmine/state.js +109 -0
  50. package/dist/backends/task-backend/redmine-backend.d.ts +14 -17
  51. package/dist/backends/task-backend/redmine-backend.d.ts.map +1 -1
  52. package/dist/backends/task-backend/redmine-backend.js +121 -379
  53. package/dist/backends/task-backend/shared/constants.d.ts +2 -1
  54. package/dist/backends/task-backend/shared/constants.d.ts.map +1 -1
  55. package/dist/backends/task-backend/shared/constants.js +1 -1
  56. package/dist/backends/task-backend/shared/doc.d.ts.map +1 -1
  57. package/dist/backends/task-backend/shared/doc.js +25 -39
  58. package/dist/backends/task-backend/shared/export.d.ts +2 -9
  59. package/dist/backends/task-backend/shared/export.d.ts.map +1 -1
  60. package/dist/backends/task-backend/shared/export.js +73 -8
  61. package/dist/backends/task-backend/shared/normalize.d.ts +5 -1
  62. package/dist/backends/task-backend/shared/normalize.d.ts.map +1 -1
  63. package/dist/backends/task-backend/shared/normalize.js +166 -0
  64. package/dist/backends/task-backend/shared/record.d.ts +1 -1
  65. package/dist/backends/task-backend/shared/record.d.ts.map +1 -1
  66. package/dist/backends/task-backend/shared/record.js +27 -3
  67. package/dist/backends/task-backend/shared/types.d.ts +76 -36
  68. package/dist/backends/task-backend/shared/types.d.ts.map +1 -1
  69. package/dist/backends/task-backend/shared.d.ts +2 -2
  70. package/dist/backends/task-backend/shared.d.ts.map +1 -1
  71. package/dist/backends/task-backend/shared.js +1 -1
  72. package/dist/backends/task-backend.d.ts +1 -1
  73. package/dist/backends/task-backend.d.ts.map +1 -1
  74. package/dist/backends/task-backend.js +1 -1
  75. package/dist/backends/task-index.d.ts +2 -2
  76. package/dist/backends/task-index.d.ts.map +1 -1
  77. package/dist/backends/task-index.js +9 -5
  78. package/dist/cli/bootstrap-guide.d.ts +2 -2
  79. package/dist/cli/bootstrap-guide.d.ts.map +1 -1
  80. package/dist/cli/bootstrap-guide.js +10 -10
  81. package/dist/cli/command-guide.d.ts.map +1 -1
  82. package/dist/cli/command-guide.js +11 -9
  83. package/dist/cli/command-invocations.d.ts +4 -0
  84. package/dist/cli/command-invocations.d.ts.map +1 -0
  85. package/dist/cli/command-invocations.js +35 -0
  86. package/dist/cli/command-snippets.d.ts +12 -8
  87. package/dist/cli/command-snippets.d.ts.map +1 -1
  88. package/dist/cli/command-snippets.js +14 -8
  89. package/dist/cli/exit-codes.d.ts.map +1 -1
  90. package/dist/cli/exit-codes.js +1 -0
  91. package/dist/cli/group-command.d.ts +18 -0
  92. package/dist/cli/group-command.d.ts.map +1 -0
  93. package/dist/cli/group-command.js +45 -0
  94. package/dist/cli/output.d.ts +29 -0
  95. package/dist/cli/output.d.ts.map +1 -1
  96. package/dist/cli/output.js +76 -0
  97. package/dist/cli/prompts.d.ts.map +1 -1
  98. package/dist/cli/prompts.js +5 -1
  99. package/dist/cli/run-cli/command-catalog/core.d.ts.map +1 -1
  100. package/dist/cli/run-cli/command-catalog/core.js +38 -29
  101. package/dist/cli/run-cli/command-catalog/lifecycle.d.ts.map +1 -1
  102. package/dist/cli/run-cli/command-catalog/lifecycle.js +9 -6
  103. package/dist/cli/run-cli/command-catalog/project.d.ts +1 -1
  104. package/dist/cli/run-cli/command-catalog/project.d.ts.map +1 -1
  105. package/dist/cli/run-cli/command-catalog/project.js +11 -7
  106. package/dist/cli/run-cli/command-catalog/shared.d.ts +12 -3
  107. package/dist/cli/run-cli/command-catalog/shared.d.ts.map +1 -1
  108. package/dist/cli/run-cli/command-catalog/shared.js +6 -3
  109. package/dist/cli/run-cli/command-catalog/task.d.ts +1 -1
  110. package/dist/cli/run-cli/command-catalog/task.d.ts.map +1 -1
  111. package/dist/cli/run-cli/command-catalog/task.js +46 -11
  112. package/dist/cli/run-cli/command-catalog.d.ts +11 -1
  113. package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
  114. package/dist/cli/run-cli/command-catalog.js +29 -0
  115. package/dist/cli/run-cli/commands/config.d.ts.map +1 -1
  116. package/dist/cli/run-cli/commands/config.js +52 -6
  117. package/dist/cli/run-cli/commands/core/agent-profiles.d.ts +34 -0
  118. package/dist/cli/run-cli/commands/core/agent-profiles.d.ts.map +1 -0
  119. package/dist/cli/run-cli/commands/core/agent-profiles.js +97 -0
  120. package/dist/cli/run-cli/commands/core/agents.d.ts +7 -0
  121. package/dist/cli/run-cli/commands/core/agents.d.ts.map +1 -0
  122. package/dist/cli/run-cli/commands/core/agents.js +97 -0
  123. package/dist/cli/run-cli/commands/core/preflight.d.ts +10 -0
  124. package/dist/cli/run-cli/commands/core/preflight.d.ts.map +1 -0
  125. package/dist/cli/run-cli/commands/core/preflight.js +286 -0
  126. package/dist/cli/run-cli/commands/core/quickstart.d.ts +8 -0
  127. package/dist/cli/run-cli/commands/core/quickstart.d.ts.map +1 -0
  128. package/dist/cli/run-cli/commands/core/quickstart.js +43 -0
  129. package/dist/cli/run-cli/commands/core/role.d.ts +9 -0
  130. package/dist/cli/run-cli/commands/core/role.d.ts.map +1 -0
  131. package/dist/cli/run-cli/commands/core/role.js +128 -0
  132. package/dist/cli/run-cli/commands/core.d.ts +4 -24
  133. package/dist/cli/run-cli/commands/core.d.ts.map +1 -1
  134. package/dist/cli/run-cli/commands/core.js +4 -630
  135. package/dist/cli/run-cli/commands/init/write-env.d.ts.map +1 -1
  136. package/dist/cli/run-cli/commands/init/write-env.js +12 -0
  137. package/dist/cli/run-cli/error-guidance.js +10 -0
  138. package/dist/cli/run-cli/globals.d.ts +5 -2
  139. package/dist/cli/run-cli/globals.d.ts.map +1 -1
  140. package/dist/cli/run-cli/globals.js +82 -86
  141. package/dist/cli/run-cli.d.ts.map +1 -1
  142. package/dist/cli/run-cli.js +137 -100
  143. package/dist/cli/run-cli.test-helpers.d.ts +21 -0
  144. package/dist/cli/run-cli.test-helpers.d.ts.map +1 -1
  145. package/dist/cli/run-cli.test-helpers.js +90 -4
  146. package/dist/cli/spec/help.d.ts +10 -2
  147. package/dist/cli/spec/help.d.ts.map +1 -1
  148. package/dist/cli/spec/help.js +7 -5
  149. package/dist/cli/spec/registry.d.ts +27 -1
  150. package/dist/cli/spec/registry.d.ts.map +1 -1
  151. package/dist/cli/spec/registry.js +98 -25
  152. package/dist/commands/backend/sync.command.d.ts +8 -6
  153. package/dist/commands/backend/sync.command.d.ts.map +1 -1
  154. package/dist/commands/backend/sync.command.js +75 -14
  155. package/dist/commands/backend.d.ts +22 -0
  156. package/dist/commands/backend.d.ts.map +1 -1
  157. package/dist/commands/backend.js +111 -1
  158. package/dist/commands/branch/base.command.d.ts +2 -3
  159. package/dist/commands/branch/base.command.d.ts.map +1 -1
  160. package/dist/commands/branch/base.command.js +8 -12
  161. package/dist/commands/branch/base.d.ts.map +1 -1
  162. package/dist/commands/branch/base.js +11 -7
  163. package/dist/commands/branch/cleanup-merged.d.ts.map +1 -1
  164. package/dist/commands/branch/cleanup-merged.js +9 -8
  165. package/dist/commands/branch/remove.d.ts.map +1 -1
  166. package/dist/commands/branch/remove.js +4 -3
  167. package/dist/commands/branch/status.d.ts.map +1 -1
  168. package/dist/commands/branch/status.js +4 -3
  169. package/dist/commands/branch/work-start.d.ts.map +1 -1
  170. package/dist/commands/branch/work-start.js +48 -5
  171. package/dist/commands/cleanup/merged.command.d.ts +2 -3
  172. package/dist/commands/cleanup/merged.command.d.ts.map +1 -1
  173. package/dist/commands/cleanup/merged.command.js +8 -12
  174. package/dist/commands/commit.spec.d.ts.map +1 -1
  175. package/dist/commands/commit.spec.js +30 -6
  176. package/dist/commands/docs/cli.command.js +2 -2
  177. package/dist/commands/doctor/runtime.js +1 -1
  178. package/dist/commands/doctor/workflow.d.ts.map +1 -1
  179. package/dist/commands/doctor/workflow.js +10 -1
  180. package/dist/commands/doctor/workspace.d.ts +8 -0
  181. package/dist/commands/doctor/workspace.d.ts.map +1 -1
  182. package/dist/commands/doctor/workspace.js +127 -3
  183. package/dist/commands/finish.spec.d.ts.map +1 -1
  184. package/dist/commands/finish.spec.js +7 -0
  185. package/dist/commands/guard/commit.command.d.ts.map +1 -1
  186. package/dist/commands/guard/commit.command.js +30 -6
  187. package/dist/commands/guard/guard.command.d.ts +3 -3
  188. package/dist/commands/guard/guard.command.d.ts.map +1 -1
  189. package/dist/commands/guard/guard.command.js +9 -14
  190. package/dist/commands/guard/impl/allow.d.ts +4 -0
  191. package/dist/commands/guard/impl/allow.d.ts.map +1 -1
  192. package/dist/commands/guard/impl/allow.js +14 -3
  193. package/dist/commands/guard/impl/commands.d.ts +2 -0
  194. package/dist/commands/guard/impl/commands.d.ts.map +1 -1
  195. package/dist/commands/guard/impl/commands.js +66 -9
  196. package/dist/commands/guard/impl/policy.d.ts +1 -0
  197. package/dist/commands/guard/impl/policy.d.ts.map +1 -1
  198. package/dist/commands/guard/impl/policy.js +9 -6
  199. package/dist/commands/hooks/hooks.command.d.ts +3 -3
  200. package/dist/commands/hooks/hooks.command.d.ts.map +1 -1
  201. package/dist/commands/hooks/hooks.command.js +9 -11
  202. package/dist/commands/pr/check.d.ts.map +1 -1
  203. package/dist/commands/pr/check.js +90 -18
  204. package/dist/commands/pr/integrate/cmd.d.ts.map +1 -1
  205. package/dist/commands/pr/integrate/cmd.js +31 -3
  206. package/dist/commands/pr/integrate/internal/cleanup.d.ts +12 -0
  207. package/dist/commands/pr/integrate/internal/cleanup.d.ts.map +1 -0
  208. package/dist/commands/pr/integrate/internal/cleanup.js +46 -0
  209. package/dist/commands/pr/integrate/internal/finalize.d.ts +4 -0
  210. package/dist/commands/pr/integrate/internal/finalize.d.ts.map +1 -1
  211. package/dist/commands/pr/integrate/internal/finalize.js +34 -40
  212. package/dist/commands/pr/integrate/internal/merge.d.ts +6 -0
  213. package/dist/commands/pr/integrate/internal/merge.d.ts.map +1 -1
  214. package/dist/commands/pr/integrate/internal/merge.js +92 -0
  215. package/dist/commands/pr/integrate/internal/prepare.d.ts +1 -0
  216. package/dist/commands/pr/integrate/internal/prepare.d.ts.map +1 -1
  217. package/dist/commands/pr/integrate/internal/prepare.js +1 -0
  218. package/dist/commands/pr/integrate/verify.d.ts.map +1 -1
  219. package/dist/commands/pr/integrate/verify.js +4 -3
  220. package/dist/commands/pr/note.d.ts.map +1 -1
  221. package/dist/commands/pr/note.js +3 -2
  222. package/dist/commands/pr/open.d.ts.map +1 -1
  223. package/dist/commands/pr/open.js +9 -12
  224. package/dist/commands/pr/pr.command.d.ts +3 -4
  225. package/dist/commands/pr/pr.command.d.ts.map +1 -1
  226. package/dist/commands/pr/pr.command.js +6 -11
  227. package/dist/commands/pr/update.d.ts.map +1 -1
  228. package/dist/commands/pr/update.js +5 -10
  229. package/dist/commands/recipes/cache.command.d.ts +3 -4
  230. package/dist/commands/recipes/cache.command.d.ts.map +1 -1
  231. package/dist/commands/recipes/cache.command.js +8 -26
  232. package/dist/commands/recipes/impl/apply.d.ts +1 -1
  233. package/dist/commands/recipes/impl/apply.d.ts.map +1 -1
  234. package/dist/commands/recipes/impl/apply.js +1 -1
  235. package/dist/commands/recipes/impl/commands/explain.js +1 -1
  236. package/dist/commands/recipes/impl/commands/install.d.ts.map +1 -1
  237. package/dist/commands/recipes/impl/commands/install.js +1 -2
  238. package/dist/commands/recipes/impl/installed-recipes.d.ts +1 -1
  239. package/dist/commands/recipes/impl/installed-recipes.d.ts.map +1 -1
  240. package/dist/commands/recipes/impl/installed-recipes.js +1 -2
  241. package/dist/commands/recipes/impl/manifest.d.ts.map +1 -1
  242. package/dist/commands/recipes/impl/manifest.js +0 -10
  243. package/dist/commands/recipes/impl/project-installed-recipes.d.ts +1 -1
  244. package/dist/commands/recipes/impl/project-installed-recipes.d.ts.map +1 -1
  245. package/dist/commands/recipes/impl/project-installed-recipes.js +1 -2
  246. package/dist/commands/recipes/impl/resolver.d.ts +1 -1
  247. package/dist/commands/recipes/impl/resolver.d.ts.map +1 -1
  248. package/dist/commands/recipes/impl/resolver.js +26 -16
  249. package/dist/commands/recipes/impl/scenario.d.ts.map +1 -1
  250. package/dist/commands/recipes/impl/scenario.js +80 -0
  251. package/dist/commands/recipes/impl/types.d.ts +27 -13
  252. package/dist/commands/recipes/impl/types.d.ts.map +1 -1
  253. package/dist/commands/recipes/recipes.command.d.ts +3 -4
  254. package/dist/commands/recipes/recipes.command.d.ts.map +1 -1
  255. package/dist/commands/recipes/recipes.command.js +8 -34
  256. package/dist/commands/recipes.d.ts +4 -4
  257. package/dist/commands/recipes.d.ts.map +1 -1
  258. package/dist/commands/recipes.js +3 -3
  259. package/dist/commands/recipes.test-helpers.d.ts +17 -0
  260. package/dist/commands/recipes.test-helpers.d.ts.map +1 -1
  261. package/dist/commands/recipes.test-helpers.js +56 -2
  262. package/dist/commands/release/apply.command.d.ts.map +1 -1
  263. package/dist/commands/release/apply.command.js +77 -56
  264. package/dist/commands/release/plan.command.d.ts.map +1 -1
  265. package/dist/commands/release/plan.command.js +7 -3
  266. package/dist/commands/release/release.command.d.ts +3 -3
  267. package/dist/commands/release/release.command.d.ts.map +1 -1
  268. package/dist/commands/release/release.command.js +9 -11
  269. package/dist/commands/release.test-helpers.d.ts +20 -0
  270. package/dist/commands/release.test-helpers.d.ts.map +1 -0
  271. package/dist/commands/release.test-helpers.js +37 -0
  272. package/dist/commands/runtime.command.d.ts +7 -7
  273. package/dist/commands/runtime.command.d.ts.map +1 -1
  274. package/dist/commands/runtime.command.js +29 -33
  275. package/dist/commands/scenario/execute.command.d.ts +8 -0
  276. package/dist/commands/scenario/execute.command.d.ts.map +1 -0
  277. package/dist/commands/scenario/execute.command.js +117 -0
  278. package/dist/commands/scenario/impl/commands.d.ts.map +1 -1
  279. package/dist/commands/scenario/impl/commands.js +45 -32
  280. package/dist/commands/scenario/run.command.js +2 -2
  281. package/dist/commands/scenario/scenario.command.d.ts +3 -4
  282. package/dist/commands/scenario/scenario.command.d.ts.map +1 -1
  283. package/dist/commands/scenario/scenario.command.js +8 -26
  284. package/dist/commands/shared/git-context.d.ts +1 -0
  285. package/dist/commands/shared/git-context.d.ts.map +1 -1
  286. package/dist/commands/shared/git-context.js +4 -2
  287. package/dist/commands/shared/git-ops.d.ts +1 -0
  288. package/dist/commands/shared/git-ops.d.ts.map +1 -1
  289. package/dist/commands/shared/git-ops.js +13 -0
  290. package/dist/commands/shared/operator-pipeline.d.ts +10 -0
  291. package/dist/commands/shared/operator-pipeline.d.ts.map +1 -0
  292. package/dist/commands/shared/operator-pipeline.js +16 -0
  293. package/dist/commands/shared/pr-meta.d.ts +32 -12
  294. package/dist/commands/shared/pr-meta.d.ts.map +1 -1
  295. package/dist/commands/shared/pr-meta.js +49 -14
  296. package/dist/commands/shared/reconcile-check.d.ts.map +1 -1
  297. package/dist/commands/shared/reconcile-check.js +28 -3
  298. package/dist/commands/shared/task-backend.d.ts +11 -7
  299. package/dist/commands/shared/task-backend.d.ts.map +1 -1
  300. package/dist/commands/shared/task-backend.js +107 -24
  301. package/dist/commands/shared/task-handoff.d.ts +64 -0
  302. package/dist/commands/shared/task-handoff.d.ts.map +1 -0
  303. package/dist/commands/shared/task-handoff.js +151 -0
  304. package/dist/commands/shared/task-mutation.d.ts +36 -0
  305. package/dist/commands/shared/task-mutation.d.ts.map +1 -0
  306. package/dist/commands/shared/task-mutation.js +67 -0
  307. package/dist/commands/shared/task-store.d.ts +65 -2
  308. package/dist/commands/shared/task-store.d.ts.map +1 -1
  309. package/dist/commands/shared/task-store.js +309 -91
  310. package/dist/commands/task/add.d.ts.map +1 -1
  311. package/dist/commands/task/add.js +41 -39
  312. package/dist/commands/task/block.d.ts.map +1 -1
  313. package/dist/commands/task/block.js +31 -89
  314. package/dist/commands/task/close-duplicate.d.ts.map +1 -1
  315. package/dist/commands/task/close-duplicate.js +0 -7
  316. package/dist/commands/task/close-noop.d.ts.map +1 -1
  317. package/dist/commands/task/close-noop.js +0 -21
  318. package/dist/commands/task/close-shared.d.ts +0 -2
  319. package/dist/commands/task/close-shared.d.ts.map +1 -1
  320. package/dist/commands/task/close-shared.js +24 -57
  321. package/dist/commands/task/comment.d.ts.map +1 -1
  322. package/dist/commands/task/comment.js +48 -42
  323. package/dist/commands/task/derive.command.d.ts +1 -0
  324. package/dist/commands/task/derive.command.d.ts.map +1 -1
  325. package/dist/commands/task/derive.command.js +15 -2
  326. package/dist/commands/task/derive.d.ts +1 -0
  327. package/dist/commands/task/derive.d.ts.map +1 -1
  328. package/dist/commands/task/derive.js +37 -7
  329. package/dist/commands/task/doc.command.d.ts.map +1 -1
  330. package/dist/commands/task/doc.command.js +7 -6
  331. package/dist/commands/task/doc.d.ts.map +1 -1
  332. package/dist/commands/task/doc.js +68 -61
  333. package/dist/commands/task/finish-shared.d.ts +60 -0
  334. package/dist/commands/task/finish-shared.d.ts.map +1 -0
  335. package/dist/commands/task/finish-shared.js +181 -0
  336. package/dist/commands/task/finish.d.ts +1 -0
  337. package/dist/commands/task/finish.d.ts.map +1 -1
  338. package/dist/commands/task/finish.js +73 -204
  339. package/dist/commands/task/handoff-record.command.d.ts +17 -0
  340. package/dist/commands/task/handoff-record.command.d.ts.map +1 -0
  341. package/dist/commands/task/handoff-record.command.js +140 -0
  342. package/dist/commands/task/handoff-show.command.d.ts +8 -0
  343. package/dist/commands/task/handoff-show.command.d.ts.map +1 -0
  344. package/dist/commands/task/handoff-show.command.js +77 -0
  345. package/dist/commands/task/handoff.command.d.ts +7 -0
  346. package/dist/commands/task/handoff.command.d.ts.map +1 -0
  347. package/dist/commands/task/handoff.command.js +21 -0
  348. package/dist/commands/task/handoff.shared.d.ts +39 -0
  349. package/dist/commands/task/handoff.shared.d.ts.map +1 -0
  350. package/dist/commands/task/handoff.shared.js +134 -0
  351. package/dist/commands/task/hosted-close.command.d.ts +9 -0
  352. package/dist/commands/task/hosted-close.command.d.ts.map +1 -0
  353. package/dist/commands/task/hosted-close.command.js +190 -0
  354. package/dist/commands/task/hosted-merge-sync.d.ts +40 -0
  355. package/dist/commands/task/hosted-merge-sync.d.ts.map +1 -0
  356. package/dist/commands/task/hosted-merge-sync.js +277 -0
  357. package/dist/commands/task/list.d.ts.map +1 -1
  358. package/dist/commands/task/list.js +7 -24
  359. package/dist/commands/task/migrate-doc.d.ts +15 -0
  360. package/dist/commands/task/migrate-doc.d.ts.map +1 -1
  361. package/dist/commands/task/migrate-doc.js +126 -35
  362. package/dist/commands/task/new.d.ts.map +1 -1
  363. package/dist/commands/task/new.js +26 -4
  364. package/dist/commands/task/next.d.ts.map +1 -1
  365. package/dist/commands/task/next.js +10 -28
  366. package/dist/commands/task/normalize.command.d.ts +1 -0
  367. package/dist/commands/task/normalize.command.d.ts.map +1 -1
  368. package/dist/commands/task/normalize.command.js +12 -0
  369. package/dist/commands/task/normalize.d.ts +1 -0
  370. package/dist/commands/task/normalize.d.ts.map +1 -1
  371. package/dist/commands/task/normalize.js +21 -9
  372. package/dist/commands/task/plan.command.d.ts +3 -4
  373. package/dist/commands/task/plan.command.d.ts.map +1 -1
  374. package/dist/commands/task/plan.command.js +6 -12
  375. package/dist/commands/task/plan.d.ts.map +1 -1
  376. package/dist/commands/task/plan.js +118 -125
  377. package/dist/commands/task/reclaim.command.d.ts +11 -0
  378. package/dist/commands/task/reclaim.command.d.ts.map +1 -0
  379. package/dist/commands/task/reclaim.command.js +102 -0
  380. package/dist/commands/task/resume-context.command.d.ts +9 -0
  381. package/dist/commands/task/resume-context.command.d.ts.map +1 -0
  382. package/dist/commands/task/resume-context.command.js +60 -0
  383. package/dist/commands/task/run-cancel.command.d.ts +6 -0
  384. package/dist/commands/task/run-cancel.command.d.ts.map +1 -0
  385. package/dist/commands/task/run-cancel.command.js +45 -0
  386. package/dist/commands/task/run-cancel.spec.d.ts +7 -0
  387. package/dist/commands/task/run-cancel.spec.d.ts.map +1 -0
  388. package/dist/commands/task/run-cancel.spec.js +20 -0
  389. package/dist/commands/task/run-resume.command.d.ts +6 -0
  390. package/dist/commands/task/run-resume.command.d.ts.map +1 -0
  391. package/dist/commands/task/run-resume.command.js +55 -0
  392. package/dist/commands/task/run-resume.spec.d.ts +7 -0
  393. package/dist/commands/task/run-resume.spec.d.ts.map +1 -0
  394. package/dist/commands/task/run-resume.spec.js +20 -0
  395. package/dist/commands/task/run-retry.command.d.ts +6 -0
  396. package/dist/commands/task/run-retry.command.d.ts.map +1 -0
  397. package/dist/commands/task/run-retry.command.js +56 -0
  398. package/dist/commands/task/run-retry.spec.d.ts +7 -0
  399. package/dist/commands/task/run-retry.spec.d.ts.map +1 -0
  400. package/dist/commands/task/run-retry.spec.js +20 -0
  401. package/dist/commands/task/run-show.command.d.ts +6 -0
  402. package/dist/commands/task/run-show.command.d.ts.map +1 -0
  403. package/dist/commands/task/run-show.command.js +133 -0
  404. package/dist/commands/task/run-show.spec.d.ts +8 -0
  405. package/dist/commands/task/run-show.spec.d.ts.map +1 -0
  406. package/dist/commands/task/run-show.spec.js +44 -0
  407. package/dist/commands/task/run-tail.command.d.ts +6 -0
  408. package/dist/commands/task/run-tail.command.d.ts.map +1 -0
  409. package/dist/commands/task/run-tail.command.js +26 -0
  410. package/dist/commands/task/run-tail.spec.d.ts +8 -0
  411. package/dist/commands/task/run-tail.spec.d.ts.map +1 -0
  412. package/dist/commands/task/run-tail.spec.js +51 -0
  413. package/dist/commands/task/run-trace.command.d.ts +6 -0
  414. package/dist/commands/task/run-trace.command.d.ts.map +1 -0
  415. package/dist/commands/task/run-trace.command.js +25 -0
  416. package/dist/commands/task/run-trace.spec.d.ts +7 -0
  417. package/dist/commands/task/run-trace.spec.d.ts.map +1 -0
  418. package/dist/commands/task/run-trace.spec.js +31 -0
  419. package/dist/commands/task/run.command.d.ts +6 -0
  420. package/dist/commands/task/run.command.d.ts.map +1 -0
  421. package/dist/commands/task/run.command.js +74 -0
  422. package/dist/commands/task/run.spec.d.ts +7 -0
  423. package/dist/commands/task/run.spec.d.ts.map +1 -0
  424. package/dist/commands/task/run.spec.js +26 -0
  425. package/dist/commands/task/scaffold.d.ts.map +1 -1
  426. package/dist/commands/task/scaffold.js +4 -2
  427. package/dist/commands/task/scrub.d.ts.map +1 -1
  428. package/dist/commands/task/scrub.js +27 -24
  429. package/dist/commands/task/search.d.ts.map +1 -1
  430. package/dist/commands/task/search.js +21 -31
  431. package/dist/commands/task/set-status.d.ts.map +1 -1
  432. package/dist/commands/task/set-status.js +38 -111
  433. package/dist/commands/task/shared/dependencies.d.ts +5 -4
  434. package/dist/commands/task/shared/dependencies.d.ts.map +1 -1
  435. package/dist/commands/task/shared/dependencies.js +20 -2
  436. package/dist/commands/task/shared/docs.d.ts +6 -1
  437. package/dist/commands/task/shared/docs.d.ts.map +1 -1
  438. package/dist/commands/task/shared/docs.js +14 -1
  439. package/dist/commands/task/shared/listing.d.ts +16 -2
  440. package/dist/commands/task/shared/listing.d.ts.map +1 -1
  441. package/dist/commands/task/shared/listing.js +56 -0
  442. package/dist/commands/task/shared/transition-command.d.ts +15 -0
  443. package/dist/commands/task/shared/transition-command.d.ts.map +1 -0
  444. package/dist/commands/task/shared/transition-command.js +43 -0
  445. package/dist/commands/task/shared/transitions.d.ts +56 -0
  446. package/dist/commands/task/shared/transitions.d.ts.map +1 -1
  447. package/dist/commands/task/shared/transitions.js +82 -8
  448. package/dist/commands/task/shared/workflow-transition-service.d.ts +75 -0
  449. package/dist/commands/task/shared/workflow-transition-service.d.ts.map +1 -0
  450. package/dist/commands/task/shared/workflow-transition-service.js +226 -0
  451. package/dist/commands/task/shared.d.ts +6 -4
  452. package/dist/commands/task/shared.d.ts.map +1 -1
  453. package/dist/commands/task/shared.js +6 -4
  454. package/dist/commands/task/show.d.ts.map +1 -1
  455. package/dist/commands/task/show.js +37 -3
  456. package/dist/commands/task/start.d.ts.map +1 -1
  457. package/dist/commands/task/start.js +32 -113
  458. package/dist/commands/task/task.command.d.ts +3 -4
  459. package/dist/commands/task/task.command.d.ts.map +1 -1
  460. package/dist/commands/task/task.command.js +22 -37
  461. package/dist/commands/task/verify-record.d.ts.map +1 -1
  462. package/dist/commands/task/verify-record.js +21 -146
  463. package/dist/commands/task/verify.command.d.ts.map +1 -1
  464. package/dist/commands/task/verify.command.js +7 -6
  465. package/dist/commands/task.test-helpers.d.ts +13 -0
  466. package/dist/commands/task.test-helpers.d.ts.map +1 -0
  467. package/dist/commands/task.test-helpers.js +65 -0
  468. package/dist/commands/upgrade/apply.d.ts +2 -0
  469. package/dist/commands/upgrade/apply.d.ts.map +1 -1
  470. package/dist/commands/upgrade/apply.js +33 -1
  471. package/dist/commands/upgrade/materialize.d.ts +28 -0
  472. package/dist/commands/upgrade/materialize.d.ts.map +1 -0
  473. package/dist/commands/upgrade/materialize.js +154 -0
  474. package/dist/commands/upgrade/plan.d.ts +18 -0
  475. package/dist/commands/upgrade/plan.d.ts.map +1 -0
  476. package/dist/commands/upgrade/plan.js +219 -0
  477. package/dist/commands/upgrade/policy.d.ts +24 -0
  478. package/dist/commands/upgrade/policy.d.ts.map +1 -0
  479. package/dist/commands/upgrade/policy.js +182 -0
  480. package/dist/commands/upgrade/report.d.ts.map +1 -1
  481. package/dist/commands/upgrade/report.js +7 -5
  482. package/dist/commands/upgrade.command.d.ts.map +1 -1
  483. package/dist/commands/upgrade.command.js +25 -0
  484. package/dist/commands/upgrade.d.ts +1 -0
  485. package/dist/commands/upgrade.d.ts.map +1 -1
  486. package/dist/commands/upgrade.js +164 -618
  487. package/dist/commands/workflow.command.d.ts +3 -4
  488. package/dist/commands/workflow.command.d.ts.map +1 -1
  489. package/dist/commands/workflow.command.js +8 -25
  490. package/dist/policy/rules/allowlist.d.ts.map +1 -1
  491. package/dist/policy/rules/allowlist.js +12 -9
  492. package/dist/ports/task-backend-port.d.ts +4 -2
  493. package/dist/ports/task-backend-port.d.ts.map +1 -1
  494. package/dist/runner/adapters/codex.d.ts +9 -0
  495. package/dist/runner/adapters/codex.d.ts.map +1 -0
  496. package/dist/runner/adapters/codex.js +414 -0
  497. package/dist/runner/adapters/custom.d.ts +12 -0
  498. package/dist/runner/adapters/custom.d.ts.map +1 -0
  499. package/dist/runner/adapters/custom.js +512 -0
  500. package/dist/runner/adapters/index.d.ts +8 -0
  501. package/dist/runner/adapters/index.d.ts.map +1 -0
  502. package/dist/runner/adapters/index.js +15 -0
  503. package/dist/runner/adapters/recipe-run-profile.d.ts +8 -0
  504. package/dist/runner/adapters/recipe-run-profile.d.ts.map +1 -0
  505. package/dist/runner/adapters/recipe-run-profile.js +53 -0
  506. package/dist/runner/adapters/shared.d.ts +45 -0
  507. package/dist/runner/adapters/shared.d.ts.map +1 -0
  508. package/dist/runner/adapters/shared.js +58 -0
  509. package/dist/runner/artifacts.d.ts +31 -0
  510. package/dist/runner/artifacts.d.ts.map +1 -0
  511. package/dist/runner/artifacts.js +153 -0
  512. package/dist/runner/codex-approval-probe.d.ts +23 -0
  513. package/dist/runner/codex-approval-probe.d.ts.map +1 -0
  514. package/dist/runner/codex-approval-probe.js +55 -0
  515. package/dist/runner/codex-smoke.d.ts +11 -0
  516. package/dist/runner/codex-smoke.d.ts.map +1 -0
  517. package/dist/runner/codex-smoke.js +45 -0
  518. package/dist/runner/config.d.ts +6 -0
  519. package/dist/runner/config.d.ts.map +1 -0
  520. package/dist/runner/config.js +15 -0
  521. package/dist/runner/context/base-prompts.d.ts +10 -0
  522. package/dist/runner/context/base-prompts.d.ts.map +1 -0
  523. package/dist/runner/context/base-prompts.js +255 -0
  524. package/dist/runner/context/recipe-context.d.ts +17 -0
  525. package/dist/runner/context/recipe-context.d.ts.map +1 -0
  526. package/dist/runner/context/recipe-context.js +48 -0
  527. package/dist/runner/context/task-context.d.ts +24 -0
  528. package/dist/runner/context/task-context.d.ts.map +1 -0
  529. package/dist/runner/context/task-context.js +266 -0
  530. package/dist/runner/index.d.ts +12 -0
  531. package/dist/runner/index.d.ts.map +1 -0
  532. package/dist/runner/index.js +11 -0
  533. package/dist/runner/policy-decision.d.ts +12 -0
  534. package/dist/runner/policy-decision.d.ts.map +1 -0
  535. package/dist/runner/policy-decision.js +89 -0
  536. package/dist/runner/policy-display.d.ts +4 -0
  537. package/dist/runner/policy-display.d.ts.map +1 -0
  538. package/dist/runner/policy-display.js +41 -0
  539. package/dist/runner/process-supervision.d.ts +48 -0
  540. package/dist/runner/process-supervision.d.ts.map +1 -0
  541. package/dist/runner/process-supervision.js +490 -0
  542. package/dist/runner/result-manifest-policy.d.ts +9 -0
  543. package/dist/runner/result-manifest-policy.d.ts.map +1 -0
  544. package/dist/runner/result-manifest-policy.js +96 -0
  545. package/dist/runner/result-manifest.d.ts +30 -0
  546. package/dist/runner/result-manifest.d.ts.map +1 -0
  547. package/dist/runner/result-manifest.js +322 -0
  548. package/dist/runner/run-id.d.ts +2 -0
  549. package/dist/runner/run-id.d.ts.map +1 -0
  550. package/dist/runner/run-id.js +3 -0
  551. package/dist/runner/run-repository.d.ts +51 -0
  552. package/dist/runner/run-repository.d.ts.map +1 -0
  553. package/dist/runner/run-repository.js +222 -0
  554. package/dist/runner/task-run-paths.d.ts +19 -0
  555. package/dist/runner/task-run-paths.d.ts.map +1 -0
  556. package/dist/runner/task-run-paths.js +25 -0
  557. package/dist/runner/task-state.d.ts +9 -0
  558. package/dist/runner/task-state.d.ts.map +1 -0
  559. package/dist/runner/task-state.js +354 -0
  560. package/dist/runner/test-helpers.d.ts +30 -0
  561. package/dist/runner/test-helpers.d.ts.map +1 -0
  562. package/dist/runner/test-helpers.js +97 -0
  563. package/dist/runner/trace-artifacts.d.ts +14 -0
  564. package/dist/runner/trace-artifacts.d.ts.map +1 -0
  565. package/dist/runner/trace-artifacts.js +80 -0
  566. package/dist/runner/trace.d.ts +10 -0
  567. package/dist/runner/trace.d.ts.map +1 -0
  568. package/dist/runner/trace.js +37 -0
  569. package/dist/runner/types.d.ts +317 -0
  570. package/dist/runner/types.d.ts.map +1 -0
  571. package/dist/runner/types.js +3 -0
  572. package/dist/runner/usecases/scenario-materialize-task.d.ts +29 -0
  573. package/dist/runner/usecases/scenario-materialize-task.d.ts.map +1 -0
  574. package/dist/runner/usecases/scenario-materialize-task.js +151 -0
  575. package/dist/runner/usecases/task-run-inspect.d.ts +41 -0
  576. package/dist/runner/usecases/task-run-inspect.d.ts.map +1 -0
  577. package/dist/runner/usecases/task-run-inspect.js +74 -0
  578. package/dist/runner/usecases/task-run-lifecycle-cancel.d.ts +10 -0
  579. package/dist/runner/usecases/task-run-lifecycle-cancel.d.ts.map +1 -0
  580. package/dist/runner/usecases/task-run-lifecycle-cancel.js +172 -0
  581. package/dist/runner/usecases/task-run-lifecycle-replay.d.ts +18 -0
  582. package/dist/runner/usecases/task-run-lifecycle-replay.d.ts.map +1 -0
  583. package/dist/runner/usecases/task-run-lifecycle-replay.js +128 -0
  584. package/dist/runner/usecases/task-run-lifecycle-shared.d.ts +45 -0
  585. package/dist/runner/usecases/task-run-lifecycle-shared.d.ts.map +1 -0
  586. package/dist/runner/usecases/task-run-lifecycle-shared.js +172 -0
  587. package/dist/runner/usecases/task-run-lifecycle.d.ts +4 -0
  588. package/dist/runner/usecases/task-run-lifecycle.d.ts.map +1 -0
  589. package/dist/runner/usecases/task-run-lifecycle.js +2 -0
  590. package/dist/runner/usecases/task-run.d.ts +32 -0
  591. package/dist/runner/usecases/task-run.d.ts.map +1 -0
  592. package/dist/runner/usecases/task-run.js +278 -0
  593. package/dist/shared/agent-emoji.d.ts.map +1 -1
  594. package/dist/shared/agent-emoji.js +1 -0
  595. package/dist/shared/errors.d.ts +1 -1
  596. package/dist/shared/errors.d.ts.map +1 -1
  597. package/dist/shared/guards.d.ts.map +1 -1
  598. package/dist/shared/guards.js +1 -0
  599. package/dist/shared/protected-paths.d.ts +10 -0
  600. package/dist/shared/protected-paths.d.ts.map +1 -1
  601. package/dist/shared/protected-paths.js +33 -0
  602. package/dist/shared/repo-cli-version.d.ts.map +1 -1
  603. package/dist/shared/repo-cli-version.js +7 -5
  604. package/dist/shared/task-doc-conflicts.d.ts +12 -0
  605. package/dist/shared/task-doc-conflicts.d.ts.map +1 -0
  606. package/dist/shared/task-doc-conflicts.js +40 -0
  607. package/dist/shared/task-doc-state.d.ts +10 -0
  608. package/dist/shared/task-doc-state.d.ts.map +1 -0
  609. package/dist/shared/task-doc-state.js +15 -0
  610. package/dist/test-helpers/fs.d.ts +2 -0
  611. package/dist/test-helpers/fs.d.ts.map +1 -0
  612. package/dist/test-helpers/fs.js +9 -0
  613. package/dist/usecases/context/resolve-context.d.ts +2 -0
  614. package/dist/usecases/context/resolve-context.d.ts.map +1 -1
  615. package/dist/usecases/context/resolve-context.js +4 -1
  616. package/dist/usecases/task/task-list-usecase.d.ts.map +1 -1
  617. package/dist/usecases/task/task-list-usecase.js +2 -8
  618. package/dist/workflow-runtime/fix.d.ts +9 -1
  619. package/dist/workflow-runtime/fix.d.ts.map +1 -1
  620. package/dist/workflow-runtime/fix.js +9 -1
  621. package/package.json +3 -2
  622. package/dist/backends/task-backend.test-helpers.d.ts +0 -4
  623. package/dist/backends/task-backend.test-helpers.d.ts.map +0 -1
  624. package/dist/backends/task-backend.test-helpers.js +0 -33
  625. package/dist/cli/run-cli/catalog.d.ts +0 -7
  626. package/dist/cli/run-cli/catalog.d.ts.map +0 -1
  627. package/dist/cli/run-cli/catalog.js +0 -22
  628. package/dist/cli/run-cli.core.pr-flow.test-helpers.d.ts +0 -3
  629. package/dist/cli/run-cli.core.pr-flow.test-helpers.d.ts.map +0 -1
  630. package/dist/cli/run-cli.core.pr-flow.test-helpers.js +0 -41
  631. package/dist/cli/run-cli.core.tasks.test-helpers.d.ts +0 -2
  632. package/dist/cli/run-cli.core.tasks.test-helpers.d.ts.map +0 -1
  633. package/dist/cli/run-cli.core.tasks.test-helpers.js +0 -6
  634. package/dist/commands/block.command.d.ts +0 -4
  635. package/dist/commands/block.command.d.ts.map +0 -1
  636. package/dist/commands/block.command.js +0 -2
  637. package/dist/commands/doctor.command.d.ts +0 -3
  638. package/dist/commands/doctor.command.d.ts.map +0 -1
  639. package/dist/commands/doctor.command.js +0 -2
  640. package/dist/commands/finish.command.d.ts +0 -4
  641. package/dist/commands/finish.command.d.ts.map +0 -1
  642. package/dist/commands/finish.command.js +0 -2
  643. package/dist/commands/recipes/install.command.d.ts +0 -3
  644. package/dist/commands/recipes/install.command.d.ts.map +0 -1
  645. package/dist/commands/recipes/install.command.js +0 -2
  646. package/dist/commands/start.command.d.ts +0 -4
  647. package/dist/commands/start.command.d.ts.map +0 -1
  648. package/dist/commands/start.command.js +0 -2
  649. package/dist/commands/task/list.command.d.ts +0 -4
  650. package/dist/commands/task/list.command.d.ts.map +0 -1
  651. package/dist/commands/task/list.command.js +0 -2
  652. package/dist/commands/task/next.command.d.ts +0 -4
  653. package/dist/commands/task/next.command.d.ts.map +0 -1
  654. package/dist/commands/task/next.command.js +0 -2
  655. package/dist/commands/task/search.command.d.ts +0 -4
  656. package/dist/commands/task/search.command.d.ts.map +0 -1
  657. package/dist/commands/task/search.command.js +0 -2
  658. package/dist/commands/task/show.command.d.ts +0 -4
  659. package/dist/commands/task/show.command.d.ts.map +0 -1
  660. package/dist/commands/task/show.command.js +0 -2
  661. package/dist/commands/verify.command.d.ts +0 -4
  662. package/dist/commands/verify.command.d.ts.map +0 -1
  663. package/dist/commands/verify.command.js +0 -2
@@ -1,4 +1,3 @@
1
- import { canonicalizeJson } from "@agentplaneorg/core";
2
1
  import { isRecord } from "../../shared/guards.js";
3
2
  import { appendCommentNotes as appendCommentNotesImpl, normalizeComments as normalizeCommentsImpl, } from "./redmine/comments.js";
4
3
  import { requestJson as requestRedmineJson } from "./redmine/client.js";
@@ -6,15 +5,21 @@ import { appendCustomField as appendRedmineCustomField, customFieldValue as redm
6
5
  import { doneRatioForStatus, issueToTask as issueToTaskImpl, startDateFromTaskId, taskToIssuePayload as taskToIssuePayloadImpl, } from "./redmine/mapping.js";
7
6
  import { coerceDocVersion as coerceRedmineDocVersion, maybeParseJson as maybeParseRedmineJson, } from "./redmine/parse.js";
8
7
  import { findIssueByTaskId as findIssueByTaskIdImpl, listTasksRemote as listTasksRemoteImpl, } from "./redmine/remote.js";
8
+ import { getRedmineTask, getRedmineTaskDoc, getRedmineTasks, listRedmineProjectionTasks, listRedmineTasks, normalizeRedmineTasks, exportRedmineProjectionSnapshot, exportRedmineTasksJson, setRedmineTaskDoc, touchRedmineTaskDocMetadata, } from "./redmine/backend-cache-doc.js";
9
+ import { diffRedmineTasks, inspectRedmineConfiguration, redmineTasksDiffer, } from "./redmine/backend-report.js";
10
+ import { generateRedmineTaskId, handleRedmineConflict, inferRedmineStatusIdForTaskStatus, loadRedmineInferredStatusByTaskStatus, migrateRedmineCanonicalState, selectRedmineInferredStatus, syncPullRedmine, syncPushRedmine, syncRedmine, writeRedmineTask, writeRedmineTasks, } from "./redmine/backend-sync.js";
9
11
  import { readRedmineEnv } from "./redmine/env.js";
10
- import { BackendError, DEFAULT_DOC_UPDATED_BY, DOC_VERSION, RedmineUnavailable, ensureDocMetadata, firstNonEmptyString, generateTaskId, mapLimit, missingTaskIdMessage, normalizeDocVersion, nowIso, redmineConfigMissingEnvMessage, redmineIssueIdMissingMessage, sleep, toStringSafe, unknownTaskIdMessage, validateTaskId, writeTasksExportFromTasks, } from "./shared.js";
12
+ import { BackendError, DEFAULT_DOC_UPDATED_BY, DOC_VERSION, firstNonEmptyString, normalizeDocVersion, nowIso, redmineConfigMissingEnvMessage, toStringSafe, } from "./shared.js";
11
13
  export class RedmineBackend {
12
14
  id = "redmine";
13
15
  capabilities = {
14
16
  canonical_source: "remote",
15
17
  projection: "cache",
18
+ projection_read_mode: "native",
16
19
  reads_from_projection_by_default: true,
17
20
  writes_task_readmes: true,
21
+ supports_task_revisions: false,
22
+ supports_revision_guarded_writes: false,
18
23
  may_access_network_on_read: false,
19
24
  may_access_network_on_write: true,
20
25
  supports_projection_refresh: true,
@@ -72,55 +77,90 @@ export class RedmineBackend {
72
77
  if (!this.customFields?.task_id) {
73
78
  throw new BackendError(redmineConfigMissingEnvMessage("AGENTPLANE_REDMINE_CUSTOM_FIELDS_TASK_ID"), "E_BACKEND");
74
79
  }
80
+ const supportsStructuredRevisions = Boolean(this.customFields?.canonical_state);
81
+ this.capabilities = {
82
+ ...this.capabilities,
83
+ supports_task_revisions: supportsStructuredRevisions,
84
+ supports_revision_guarded_writes: supportsStructuredRevisions,
85
+ };
75
86
  for (const [key, value] of Object.entries(this.statusMap)) {
76
87
  if (typeof value === "number")
77
88
  this.reverseStatus.set(value, key);
78
89
  }
79
90
  }
91
+ cacheDocContext() {
92
+ return {
93
+ cache: this.cache,
94
+ customFields: this.customFields,
95
+ ownerAgent: this.ownerAgent,
96
+ batchSize: this.batchSize,
97
+ findIssueByTaskId: async (taskId) => await this.findIssueByTaskId(taskId),
98
+ issueToTask: (issue, taskIdOverride) => this.issueToTask(issue, taskIdOverride),
99
+ customFieldValue: (issue, fieldId) => this.customFieldValue(issue, fieldId),
100
+ appendCustomField: (fields, key, value) => this.appendCustomField(fields, key, value),
101
+ requestJson: async (method, reqPath, payload, params) => await this.requestJson(method, reqPath, payload, params),
102
+ assertExpectedRevisionSupported: (taskId, opts) => this.assertExpectedRevisionSupported(taskId, opts),
103
+ assertExpectedRevision: (taskId, expectedRevision, currentRevision) => this.assertExpectedRevision(taskId, expectedRevision, currentRevision),
104
+ cacheTask: async (task, dirty) => await this.cacheTask(task, dirty),
105
+ };
106
+ }
107
+ reportContext() {
108
+ return {
109
+ projectId: this.projectId,
110
+ customFields: this.customFields,
111
+ requestJson: async (method, reqPath, payload, params) => await this.requestJson(method, reqPath, payload, params),
112
+ };
113
+ }
114
+ syncContext() {
115
+ return {
116
+ cache: this.cache,
117
+ customFields: this.customFields,
118
+ ownerAgent: this.ownerAgent,
119
+ projectId: this.projectId,
120
+ batchSize: this.batchSize,
121
+ batchPauseMs: this.batchPauseMs,
122
+ statusMap: this.statusMap,
123
+ issueCache: this.issueCache,
124
+ inferredStatusByTaskStatus: this.inferredStatusByTaskStatus,
125
+ setInferredStatusByTaskStatus: (next) => {
126
+ this.inferredStatusByTaskStatus = next;
127
+ },
128
+ listTasksRemote: async () => await this.listTasksRemote(),
129
+ writeTask: async (task, opts) => await this.writeTask(task, opts),
130
+ writeTasks: async (tasks, opts) => await this.writeTasks(tasks, opts),
131
+ findIssueByTaskId: async (taskId) => await this.findIssueByTaskId(taskId),
132
+ issueToTask: (issue, taskIdOverride) => this.issueToTask(issue, taskIdOverride),
133
+ taskToIssuePayload: (task, existingIssue) => this.taskToIssuePayload(task, existingIssue),
134
+ appendCustomField: (fields, key, value) => this.appendCustomField(fields, key, value),
135
+ customFieldValue: (issue, fieldId) => this.customFieldValue(issue, fieldId),
136
+ maybeParseJson: (value) => this.maybeParseJson(value),
137
+ normalizeComments: (value) => this.normalizeComments(value),
138
+ appendCommentNotes: async (issueId, existingComments, desiredComments) => await this.appendCommentNotes(issueId, existingComments, desiredComments),
139
+ cacheTask: async (task, dirty) => await this.cacheTask(task, dirty),
140
+ assertExpectedRevisionSupported: (taskId, opts) => this.assertExpectedRevisionSupported(taskId, opts),
141
+ assertExpectedRevision: (taskId, expectedRevision, currentRevision) => this.assertExpectedRevision(taskId, expectedRevision, currentRevision),
142
+ ensureDocMetadata: (task) => this.ensureDocMetadata(task),
143
+ diffTasks: (localTask, remoteTask) => this.diffTasks(localTask, remoteTask),
144
+ tasksDiffer: (localTask, remoteTask) => this.tasksDiffer(localTask, remoteTask),
145
+ taskIdFieldId: () => this.taskIdFieldId(),
146
+ setIssueCustomFieldValue: (issue, fieldId, value) => this.setIssueCustomFieldValue(issue, fieldId, value),
147
+ requestJson: async (method, reqPath, payload, params, opts) => await this.requestJson(method, reqPath, payload, params, opts),
148
+ };
149
+ }
80
150
  async generateTaskId(opts) {
81
- const length = opts.length;
82
- const attempts = opts.attempts;
83
- let existingIds = new Set();
84
- try {
85
- const tasks = await this.listTasksRemote();
86
- existingIds = new Set(tasks.map((task) => toStringSafe(task.id)).filter(Boolean));
87
- }
88
- catch (err) {
89
- if (!(err instanceof RedmineUnavailable))
90
- throw err;
91
- if (!this.cache)
92
- throw err;
93
- const cached = await this.cache.listTasks();
94
- existingIds = new Set(cached.map((task) => toStringSafe(task.id)).filter(Boolean));
95
- }
96
- return await generateTaskId({
97
- length,
98
- attempts,
99
- isAvailable: (taskId) => !existingIds.has(taskId),
100
- });
151
+ return await generateRedmineTaskId(this.syncContext(), opts);
101
152
  }
102
153
  async listTasks() {
103
- if (!this.cache) {
104
- throw new BackendError("Redmine cache is disabled; projection reads are unavailable", "E_BACKEND");
105
- }
106
- return await this.cache.listTasks();
154
+ return await listRedmineTasks(this.cacheDocContext());
107
155
  }
108
156
  async listProjectionTasks() {
109
- if (!this.cache) {
110
- throw new BackendError("Redmine cache is disabled; projection reads are unavailable", "E_BACKEND");
111
- }
112
- return await this.cache.listTasks();
157
+ return await listRedmineProjectionTasks(this.cacheDocContext());
113
158
  }
114
159
  async exportTasksJson(outputPath) {
115
- const tasks = await this.listTasks();
116
- await writeTasksExportFromTasks({ outputPath, tasks });
160
+ await exportRedmineTasksJson(this.cacheDocContext(), outputPath);
117
161
  }
118
162
  async exportProjectionSnapshot(outputPath) {
119
- if (!this.cache) {
120
- throw new BackendError("Redmine cache is disabled; projection snapshot export is unavailable", "E_BACKEND");
121
- }
122
- const tasks = await this.cache.listTasks();
123
- await writeTasksExportFromTasks({ outputPath, tasks });
163
+ await exportRedmineProjectionSnapshot(this.cacheDocContext(), outputPath);
124
164
  }
125
165
  async refreshProjection(opts) {
126
166
  if (!opts.allowNetwork) {
@@ -129,200 +169,37 @@ export class RedmineBackend {
129
169
  await this.syncPull(opts.conflict ?? "prefer-remote", opts.quiet ?? true);
130
170
  }
131
171
  async normalizeTasks() {
132
- // Remote backends should avoid expensive downloads; best-effort normalize the local cache if present.
133
- if (this.cache?.normalizeTasks)
134
- return await this.cache.normalizeTasks();
135
- return { scanned: 0, changed: 0 };
172
+ return await normalizeRedmineTasks(this.cacheDocContext());
173
+ }
174
+ async migrateCanonicalState() {
175
+ return await migrateRedmineCanonicalState(this.syncContext());
176
+ }
177
+ async inspectConfiguration() {
178
+ return await inspectRedmineConfiguration(this.reportContext());
136
179
  }
137
180
  async getTask(taskId) {
138
- if (!this.cache) {
139
- throw new BackendError("Redmine cache is disabled; projection reads are unavailable", "E_BACKEND");
140
- }
141
- return (await this.cache.getTask(taskId)) ?? null;
181
+ return await getRedmineTask(this.cacheDocContext(), taskId);
142
182
  }
143
183
  async getTasks(taskIds) {
144
- // Use limited parallelism to avoid hammering the Redmine API.
145
- return await mapLimit(taskIds, this.batchSize, async (taskId) => await this.getTask(taskId));
184
+ return await getRedmineTasks(this.cacheDocContext(), taskIds);
146
185
  }
147
186
  async getTaskDoc(taskId) {
148
- const task = await this.getTask(taskId);
149
- if (!task)
150
- throw new Error(unknownTaskIdMessage(taskId));
151
- return toStringSafe(task.doc);
152
- }
153
- async setTaskDoc(taskId, doc, updatedBy) {
154
- if (!this.customFields.doc) {
155
- throw new BackendError(redmineConfigMissingEnvMessage("AGENTPLANE_REDMINE_CUSTOM_FIELDS_DOC"), "E_BACKEND");
156
- }
157
- try {
158
- const issue = await this.findIssueByTaskId(taskId);
159
- if (!issue)
160
- throw new Error(unknownTaskIdMessage(taskId));
161
- const issueIdText = toStringSafe(issue.id);
162
- if (!issueIdText)
163
- throw new Error(redmineIssueIdMissingMessage());
164
- const cachedTask = this.issueToTask(issue, taskId);
165
- const taskDoc = {
166
- doc: String(doc ?? ""),
167
- doc_version: cachedTask?.doc_version,
168
- };
169
- ensureDocMetadata(taskDoc, updatedBy);
170
- const customFields = [];
171
- this.appendCustomField(customFields, "doc", taskDoc.doc);
172
- this.appendCustomField(customFields, "doc_version", taskDoc.doc_version);
173
- this.appendCustomField(customFields, "doc_updated_at", taskDoc.doc_updated_at);
174
- this.appendCustomField(customFields, "doc_updated_by", taskDoc.doc_updated_by);
175
- await this.requestJson("PUT", `issues/${issueIdText}.json`, {
176
- issue: { custom_fields: customFields },
177
- });
178
- if (cachedTask) {
179
- cachedTask.doc = taskDoc.doc;
180
- cachedTask.doc_version = taskDoc.doc_version;
181
- cachedTask.doc_updated_at = taskDoc.doc_updated_at;
182
- cachedTask.doc_updated_by = taskDoc.doc_updated_by;
183
- await this.cacheTask(cachedTask, false);
184
- }
185
- }
186
- catch (err) {
187
- if (err instanceof RedmineUnavailable) {
188
- if (!this.cache)
189
- throw err;
190
- const cached = await this.cache.getTask(taskId);
191
- if (!cached)
192
- throw new Error(unknownTaskIdMessage(taskId));
193
- cached.doc = String(doc ?? "");
194
- ensureDocMetadata(cached, updatedBy);
195
- cached.dirty = true;
196
- await this.cache.writeTask(cached);
197
- return;
198
- }
199
- throw err;
200
- }
187
+ return await getRedmineTaskDoc(this.cacheDocContext(), taskId);
201
188
  }
202
- async touchTaskDocMetadata(taskId, updatedBy) {
203
- try {
204
- const issue = await this.findIssueByTaskId(taskId);
205
- if (!issue)
206
- throw new Error(unknownTaskIdMessage(taskId));
207
- const issueIdText = toStringSafe(issue.id);
208
- if (!issueIdText)
209
- throw new Error(redmineIssueIdMissingMessage());
210
- const docValue = this.customFieldValue(issue, this.customFields.doc);
211
- const cachedTask = this.issueToTask(issue, taskId);
212
- const taskDoc = {
213
- doc: docValue ?? "",
214
- doc_version: cachedTask?.doc_version,
215
- };
216
- ensureDocMetadata(taskDoc, updatedBy);
217
- const customFields = [];
218
- this.appendCustomField(customFields, "doc_version", taskDoc.doc_version);
219
- this.appendCustomField(customFields, "doc_updated_at", taskDoc.doc_updated_at);
220
- this.appendCustomField(customFields, "doc_updated_by", taskDoc.doc_updated_by);
221
- if (customFields.length > 0) {
222
- await this.requestJson("PUT", `issues/${issueIdText}.json`, {
223
- issue: { custom_fields: customFields },
224
- });
225
- if (cachedTask) {
226
- cachedTask.doc_version = taskDoc.doc_version;
227
- cachedTask.doc_updated_at = taskDoc.doc_updated_at;
228
- cachedTask.doc_updated_by = taskDoc.doc_updated_by;
229
- await this.cacheTask(cachedTask, false);
230
- }
231
- }
232
- }
233
- catch (err) {
234
- if (err instanceof RedmineUnavailable) {
235
- if (!this.cache)
236
- throw err;
237
- const cached = await this.cache.getTask(taskId);
238
- if (!cached)
239
- throw new Error(unknownTaskIdMessage(taskId));
240
- ensureDocMetadata(cached, updatedBy);
241
- cached.dirty = true;
242
- await this.cache.writeTask(cached);
243
- return;
244
- }
245
- throw err;
246
- }
189
+ async setTaskDoc(taskId, doc, updatedBy, opts) {
190
+ await setRedmineTaskDoc(this.cacheDocContext(), taskId, doc, updatedBy, opts);
247
191
  }
248
- async writeTask(task) {
249
- const taskId = toStringSafe(task.id).trim();
250
- if (!taskId)
251
- throw new Error(missingTaskIdMessage());
252
- validateTaskId(taskId);
253
- try {
254
- this.ensureDocMetadata(task);
255
- let issue = await this.findIssueByTaskId(taskId);
256
- let issueId = issue?.id;
257
- let issueIdText = issueId ? toStringSafe(issueId) : "";
258
- let existingIssue = issue ?? null;
259
- if (issueIdText && !existingIssue) {
260
- const payload = await this.requestJson("GET", `issues/${issueIdText}.json`);
261
- existingIssue = this.issueFromPayload(payload);
262
- }
263
- const payload = this.taskToIssuePayload(task, existingIssue ?? undefined);
264
- if (payload.status_id === undefined) {
265
- const inferredStatusId = await this.inferStatusIdForTaskStatus(task.status);
266
- if (inferredStatusId !== null)
267
- payload.status_id = inferredStatusId;
268
- }
269
- if (issueIdText) {
270
- await this.requestJson("PUT", `issues/${issueIdText}.json`, { issue: payload });
271
- }
272
- else {
273
- const createPayload = { ...payload, project_id: this.projectId };
274
- const created = await this.requestJson("POST", "issues.json", { issue: createPayload });
275
- const createdIssue = this.issueFromPayload(created);
276
- issueId = createdIssue?.id;
277
- issueIdText = issueId ? toStringSafe(issueId) : "";
278
- if (issueIdText) {
279
- const updatePayload = { ...payload };
280
- delete updatePayload.project_id;
281
- await this.requestJson("PUT", `issues/${issueIdText}.json`, { issue: updatePayload });
282
- const refreshed = await this.requestJson("GET", `issues/${issueIdText}.json`);
283
- existingIssue = this.issueFromPayload(refreshed);
284
- }
285
- }
286
- if (issueIdText) {
287
- const existingComments = existingIssue && this.customFields.comments
288
- ? this.normalizeComments(this.maybeParseJson(this.customFieldValue(existingIssue, this.customFields.comments)))
289
- : [];
290
- const desiredComments = this.normalizeComments(task.comments);
291
- await this.appendCommentNotes(issueIdText, existingComments, desiredComments);
292
- }
293
- task.dirty = false;
294
- await this.cacheTask(task, false);
295
- this.issueCache.clear();
296
- }
297
- catch (err) {
298
- if (err instanceof RedmineUnavailable) {
299
- if (!this.cache)
300
- throw err;
301
- task.dirty = true;
302
- await this.cacheTask(task, true);
303
- return;
304
- }
305
- throw err;
306
- }
192
+ async touchTaskDocMetadata(taskId, updatedBy, opts) {
193
+ await touchRedmineTaskDocMetadata(this.cacheDocContext(), taskId, updatedBy, opts);
307
194
  }
308
- async writeTasks(tasks) {
309
- for (const [index, task] of tasks.entries()) {
310
- await this.writeTask(task);
311
- if (this.batchPauseMs > 0 && this.batchSize > 0 && (index + 1) % this.batchSize === 0) {
312
- await sleep(this.batchPauseMs);
313
- }
314
- }
195
+ async writeTask(task, opts) {
196
+ await writeRedmineTask(this.syncContext(), task, opts);
197
+ }
198
+ async writeTasks(tasks, opts) {
199
+ await writeRedmineTasks(this.syncContext(), tasks, opts);
315
200
  }
316
201
  async sync(opts) {
317
- if (opts.direction === "push") {
318
- await this.syncPush(opts.quiet, opts.confirm);
319
- return;
320
- }
321
- if (opts.direction === "pull") {
322
- await this.syncPull(opts.conflict, opts.quiet);
323
- return;
324
- }
325
- throw new BackendError("Invalid sync direction (expected push|pull)", "E_BACKEND");
202
+ await syncRedmine(this.syncContext(), opts);
326
203
  }
327
204
  ensureDocMetadata(task) {
328
205
  if (task.doc === undefined)
@@ -332,97 +209,19 @@ export class RedmineBackend {
332
209
  task.doc_updated_by ??= DEFAULT_DOC_UPDATED_BY;
333
210
  }
334
211
  async syncPush(quiet, confirm) {
335
- if (!this.cache) {
336
- throw new BackendError("Redmine cache is disabled; sync push is unavailable", "E_BACKEND");
337
- }
338
- const tasks = await this.cache.listTasks();
339
- const dirty = tasks.filter((task) => task.dirty);
340
- if (dirty.length === 0) {
341
- if (!quiet)
342
- process.stdout.write("ℹ️ no local task changes to push\n");
343
- return;
344
- }
345
- if (!confirm) {
346
- for (const task of dirty) {
347
- process.stdout.write(`- pending push: ${task.id}\n`);
348
- }
349
- throw new BackendError("Refusing to push without --yes (preview above)", "E_BACKEND");
350
- }
351
- await this.writeTasks(dirty);
352
- if (!quiet)
353
- process.stdout.write(`✅ pushed ${dirty.length} task(s) (dirty)\n`);
212
+ await syncPushRedmine(this.syncContext(), quiet, confirm);
354
213
  }
355
214
  async syncPull(conflict, quiet) {
356
- if (!this.cache) {
357
- throw new BackendError("Redmine cache is disabled; sync pull is unavailable", "E_BACKEND");
358
- }
359
- const remoteTasks = await this.listTasksRemote();
360
- const remoteById = new Map();
361
- for (const task of remoteTasks) {
362
- const taskId = toStringSafe(task.id);
363
- if (taskId)
364
- remoteById.set(taskId, task);
365
- }
366
- const localTasks = await this.cache.listTasks();
367
- const localById = new Map();
368
- for (const task of localTasks) {
369
- const taskId = toStringSafe(task.id);
370
- if (taskId)
371
- localById.set(taskId, task);
372
- }
373
- for (const [taskId, remoteTask] of remoteById.entries()) {
374
- const localTask = localById.get(taskId);
375
- if (localTask?.dirty) {
376
- if (this.tasksDiffer(localTask, remoteTask)) {
377
- await this.handleConflict(taskId, localTask, remoteTask, conflict);
378
- continue;
379
- }
380
- localTask.dirty = false;
381
- await this.cacheTask(localTask, false);
382
- continue;
383
- }
384
- await this.cacheTask(remoteTask, false);
385
- }
386
- if (!quiet)
387
- process.stdout.write(`✅ pulled ${remoteById.size} task(s) (remote)\n`);
215
+ await syncPullRedmine(this.syncContext(), conflict, quiet);
388
216
  }
389
217
  async handleConflict(taskId, localTask, remoteTask, conflict) {
390
- if (conflict === "prefer-local") {
391
- await this.writeTask(localTask);
392
- return;
393
- }
394
- if (conflict === "prefer-remote") {
395
- await this.cacheTask(remoteTask, false);
396
- return;
397
- }
398
- if (conflict === "diff") {
399
- const diff = this.diffTasks(localTask, remoteTask);
400
- process.stdout.write(`${diff}\n`);
401
- throw new BackendError(`Conflict detected for ${taskId}`, "E_BACKEND");
402
- }
403
- throw new BackendError(`Conflict detected for ${taskId}`, "E_BACKEND");
218
+ await handleRedmineConflict(this.syncContext(), taskId, localTask, remoteTask, conflict);
404
219
  }
405
220
  diffTasks(localTask, remoteTask) {
406
- const localText = JSON.stringify(canonicalizeJson(localTask), null, 2).split("\n");
407
- const remoteText = JSON.stringify(canonicalizeJson(remoteTask), null, 2).split("\n");
408
- const diff = ["--- remote", "+++ local"];
409
- const max = Math.max(localText.length, remoteText.length);
410
- for (let i = 0; i < max; i++) {
411
- const l = localText[i];
412
- const r = remoteText[i];
413
- if (l === r)
414
- continue;
415
- if (r !== undefined)
416
- diff.push(`- ${r}`);
417
- if (l !== undefined)
418
- diff.push(`+ ${l}`);
419
- }
420
- return diff.join("\n");
221
+ return diffRedmineTasks(localTask, remoteTask);
421
222
  }
422
223
  tasksDiffer(localTask, remoteTask) {
423
- const localText = JSON.stringify(canonicalizeJson(localTask));
424
- const remoteText = JSON.stringify(canonicalizeJson(remoteTask));
425
- return localText !== remoteText;
224
+ return redmineTasksDiffer(localTask, remoteTask);
426
225
  }
427
226
  async cacheTask(task, dirty) {
428
227
  if (!this.cache)
@@ -430,6 +229,22 @@ export class RedmineBackend {
430
229
  const next = { ...task, dirty };
431
230
  await this.cache.writeTask(next);
432
231
  }
232
+ assertExpectedRevisionSupported(taskId, opts) {
233
+ if (opts?.expectedRevision === undefined)
234
+ return;
235
+ if (this.capabilities.supports_revision_guarded_writes)
236
+ return;
237
+ throw new BackendError(`Task revision guarding is unavailable for ${taskId} without AGENTPLANE_REDMINE_CUSTOM_FIELDS_CANONICAL_STATE`, "E_BACKEND");
238
+ }
239
+ assertExpectedRevision(taskId, expectedRevision, currentRevision) {
240
+ if (expectedRevision === undefined)
241
+ return;
242
+ const expected = Math.trunc(expectedRevision);
243
+ if (expected <= 0 || expected === currentRevision)
244
+ return;
245
+ throw new BackendError(`Task revision changed concurrently: ${taskId} ` +
246
+ `(expected revision ${expected}, current revision ${currentRevision})`, "E_BACKEND");
247
+ }
433
248
  taskIdFieldId() {
434
249
  const fieldId = this.customFields?.task_id;
435
250
  if (fieldId)
@@ -454,86 +269,13 @@ export class RedmineBackend {
454
269
  return isRecord(payload.issue) ? payload.issue : null;
455
270
  }
456
271
  async inferStatusIdForTaskStatus(statusRaw) {
457
- const status = toStringSafe(statusRaw).trim().toUpperCase();
458
- if (!status)
459
- return null;
460
- const explicit = this.statusMap?.[status];
461
- if (typeof explicit === "number" && Number.isFinite(explicit))
462
- return explicit;
463
- const inferred = await this.loadInferredStatusByTaskStatus();
464
- return inferred.get(status) ?? null;
272
+ return await inferRedmineStatusIdForTaskStatus(this.syncContext(), statusRaw);
465
273
  }
466
274
  async loadInferredStatusByTaskStatus() {
467
- if (this.inferredStatusByTaskStatus)
468
- return this.inferredStatusByTaskStatus;
469
- const map = new Map();
470
- this.inferredStatusByTaskStatus = map;
471
- try {
472
- const payload = await this.requestJson("GET", "issue_statuses.json");
473
- const statuses = Array.isArray(payload.issue_statuses) ? payload.issue_statuses : [];
474
- const parsed = [];
475
- for (const item of statuses) {
476
- if (!isRecord(item))
477
- continue;
478
- const id = typeof item.id === "number" ? item.id : null;
479
- if (!id || !Number.isFinite(id))
480
- continue;
481
- parsed.push({
482
- id,
483
- name: toStringSafe(item.name).trim().toLowerCase(),
484
- isClosed: item.is_closed === true,
485
- isDefault: item.is_default === true,
486
- });
487
- }
488
- const done = this.selectInferredStatus(parsed, "DONE");
489
- const doing = this.selectInferredStatus(parsed, "DOING");
490
- const todo = this.selectInferredStatus(parsed, "TODO");
491
- if (done !== null)
492
- map.set("DONE", done);
493
- if (doing !== null)
494
- map.set("DOING", doing);
495
- if (todo !== null)
496
- map.set("TODO", todo);
497
- }
498
- catch {
499
- // Best effort: keep previous behavior when status discovery is unavailable.
500
- }
501
- return map;
275
+ return await loadRedmineInferredStatusByTaskStatus(this.syncContext());
502
276
  }
503
277
  selectInferredStatus(statuses, target) {
504
- if (statuses.length === 0)
505
- return null;
506
- if (target === "DOING") {
507
- const byId = statuses.find((item) => item.id === 2);
508
- if (byId)
509
- return byId.id;
510
- const byName = statuses.find((item) => item.name.includes("progress") || item.name.includes("doing"));
511
- if (byName)
512
- return byName.id;
513
- return null;
514
- }
515
- if (target === "DONE") {
516
- const closed = statuses.find((item) => item.isClosed);
517
- if (closed)
518
- return closed.id;
519
- const byId = statuses.find((item) => item.id === 5 || item.id === 3 || item.id === 6);
520
- if (byId)
521
- return byId.id;
522
- const byName = statuses.find((item) => item.name.includes("done") ||
523
- item.name.includes("closed") ||
524
- item.name.includes("resolved") ||
525
- item.name.includes("complete"));
526
- if (byName)
527
- return byName.id;
528
- return null;
529
- }
530
- const byDefault = statuses.find((item) => item.isDefault);
531
- if (byDefault)
532
- return byDefault.id;
533
- const byId = statuses.find((item) => item.id === 1);
534
- if (byId)
535
- return byId.id;
536
- return statuses[0]?.id ?? null;
278
+ return selectRedmineInferredStatus(statuses, target);
537
279
  }
538
280
  async findIssueByTaskId(taskId) {
539
281
  const taskFieldId = this.taskIdFieldId();
@@ -1,5 +1,6 @@
1
+ import { type TaskDocVersion } from "@agentplaneorg/core";
1
2
  export declare const TASK_ID_RE: RegExp;
2
3
  export declare const DEFAULT_DOC_UPDATED_BY = "agentplane";
3
- export declare const DOC_VERSION = 2;
4
+ export declare const DOC_VERSION: TaskDocVersion;
4
5
  export declare const SUPPORTED_DOC_VERSIONS: readonly [2, 3];
5
6
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/shared/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,QAA6D,CAAC;AACrF,eAAO,MAAM,sBAAsB,eAAe,CAAC;AACnD,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,sBAAsB,iBAAkB,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/shared/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE5E,eAAO,MAAM,UAAU,QAA6D,CAAC;AACrF,eAAO,MAAM,sBAAsB,eAAe,CAAC;AACnD,eAAO,MAAM,WAAW,EAAE,cAAkB,CAAC;AAC7C,eAAO,MAAM,sBAAsB,iBAAkB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { TASK_ID_ALPHABET } from "@agentplaneorg/core";
2
2
  export const TASK_ID_RE = new RegExp(String.raw `^\d{12}-[${TASK_ID_ALPHABET}]{4,}$`);
3
3
  export const DEFAULT_DOC_UPDATED_BY = "agentplane";
4
- export const DOC_VERSION = 2;
4
+ export const DOC_VERSION = 3;
5
5
  export const SUPPORTED_DOC_VERSIONS = [2, 3];
@@ -1 +1 @@
1
- {"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/shared/doc.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;AAC/C,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;AAE1D,QAAA,MAAM,cAAc,EAAE,cAAmC,CAAC;AAC1D,QAAA,MAAM,YAAY,EAAE,YAA+B,CAAC;AAEpD,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAyBD,wBAAgB,kCAAkC,CAChD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,QAAQ,EAAE,MAAM,GACf,MAAM,CAaR;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CASpF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,GAAE,CAAC,GAAG,CAAe,GAAG,CAAC,GAAG,CAAC,CAExF;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,EACjE,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAUN;AAED,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/shared/doc.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;AAC/C,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;AAG1D,QAAA,MAAM,cAAc,EAAE,cAAmC,CAAC;AAC1D,QAAA,MAAM,YAAY,EAAE,YAA+B,CAAC;AAGpD,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAmBD,wBAAgB,kCAAkC,CAChD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,QAAQ,EAAE,MAAM,GACf,MAAM,CAaR;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYpF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,GAAE,CAAC,GAAG,CAAe,GAAG,CAAC,GAAG,CAAC,CAExF;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,EACjE,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAUN;AAED,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}