@astrosheep/keiyaku 4.5.29 → 4.6.2

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 (418) hide show
  1. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku/SKILL.md +0 -13
  2. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/SKILL.md +47 -78
  3. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/references/automation.md +54 -41
  4. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-babysit/SKILL.md +10 -0
  5. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-bind/SKILL.md +27 -9
  6. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-workflow/SKILL.md +68 -71
  7. package/build/src/akuma/akuma-call.d.ts +53 -0
  8. package/build/src/akuma/akuma-call.js +113 -0
  9. package/build/src/akuma/akuma-instance.d.ts +20 -18
  10. package/build/src/akuma/akuma-instance.js +65 -175
  11. package/build/src/akuma/akuma-observe.d.ts +3 -21
  12. package/build/src/akuma/akuma-observe.js +7 -24
  13. package/build/src/akuma/{akuma-handle.d.ts → akuma-owner.d.ts} +55 -27
  14. package/build/src/akuma/{akuma-handle.js → akuma-owner.js} +24 -23
  15. package/build/src/akuma/akuma-selection-execution.d.ts +51 -0
  16. package/build/src/akuma/akuma-selection-execution.js +134 -0
  17. package/build/src/akuma/{fleet-execution.d.ts → akuma-wait.d.ts} +24 -44
  18. package/build/src/akuma/akuma-wait.js +113 -0
  19. package/build/src/akuma/akuma.d.ts +35 -89
  20. package/build/src/akuma/akuma.js +148 -30
  21. package/build/src/akuma/archetype.d.ts +12 -0
  22. package/build/src/akuma/archetype.js +47 -19
  23. package/build/src/akuma/body.d.ts +76 -36
  24. package/build/src/akuma/body.js +84 -49
  25. package/build/src/akuma/call-initial-tell.d.ts +131 -22
  26. package/build/src/akuma/call-initial-tell.js +31 -1
  27. package/build/src/akuma/call-request.d.ts +237 -31
  28. package/build/src/akuma/call-request.js +67 -94
  29. package/build/src/akuma/coordinate.d.ts +15 -5
  30. package/build/src/akuma/coordinate.js +12 -22
  31. package/build/src/akuma/dispatch-association.d.ts +1 -1
  32. package/build/src/akuma/dispatch-association.js +1 -10
  33. package/build/src/akuma/heart/activity-schema.d.ts +325 -0
  34. package/build/src/akuma/heart/activity-schema.js +53 -0
  35. package/build/src/akuma/heart/facts.d.ts +1 -6
  36. package/build/src/akuma/heart/index.d.ts +3 -1
  37. package/build/src/akuma/heart/index.js +4 -1
  38. package/build/src/akuma/heart/rows.d.ts +49 -2
  39. package/build/src/akuma/heart/rows.js +16 -2
  40. package/build/src/akuma/heart/soul.d.ts +1 -0
  41. package/build/src/akuma/heart/soul.js +6 -4
  42. package/build/src/akuma/heart/tells.d.ts +1 -0
  43. package/build/src/akuma/heart/tells.js +18 -0
  44. package/build/src/akuma/identity.d.ts +10 -7
  45. package/build/src/akuma/identity.js +23 -0
  46. package/build/src/akuma/index.d.ts +10 -8
  47. package/build/src/akuma/index.js +2 -2
  48. package/build/src/akuma/nuke.d.ts +3 -0
  49. package/build/src/akuma/nuke.js +13 -7
  50. package/build/src/akuma/projection.d.ts +0 -5
  51. package/build/src/akuma/projection.js +22 -43
  52. package/build/src/akuma/provider-recipe.d.ts +58 -13
  53. package/build/src/akuma/provider-recipe.js +62 -80
  54. package/build/src/akuma/provider.d.ts +6 -76
  55. package/build/src/akuma/provider.js +11 -219
  56. package/build/src/akuma/providers/acp/config.d.ts +2 -0
  57. package/build/src/akuma/providers/acp/config.js +26 -1
  58. package/build/src/akuma/providers/acp/core.d.ts +7 -0
  59. package/build/src/akuma/providers/acp/core.js +49 -18
  60. package/build/src/akuma/providers/acp/index.js +14 -6
  61. package/build/src/akuma/providers/grok-build/index.js +44 -13
  62. package/build/src/akuma/providers/index.d.ts +3 -3
  63. package/build/src/akuma/providers/index.js +2 -13
  64. package/build/src/akuma/providers/opencode-sdk/event-stream.d.ts +28 -0
  65. package/build/src/akuma/providers/opencode-sdk/event-stream.js +92 -0
  66. package/build/src/akuma/providers/opencode-sdk/events.d.ts +0 -1
  67. package/build/src/akuma/providers/opencode-sdk/index.js +200 -64
  68. package/build/src/akuma/providers/opencode-sdk/session.d.ts +41 -1
  69. package/build/src/akuma/providers/opencode-sdk/session.js +69 -2
  70. package/build/src/akuma/providers/pi/events.js +5 -2
  71. package/build/src/akuma/providers/pi/index.d.ts +3 -4
  72. package/build/src/akuma/providers/pi/index.js +99 -45
  73. package/build/src/akuma/publication.d.ts +84 -3
  74. package/build/src/akuma/publication.js +145 -2
  75. package/build/src/akuma/read-pool.d.ts +2 -0
  76. package/build/src/akuma/read-pool.js +15 -0
  77. package/build/src/akuma/request-rendezvous.js +10 -0
  78. package/build/src/akuma/request-serve.js +7 -0
  79. package/build/src/akuma/request-wire.d.ts +14 -26
  80. package/build/src/akuma/request-wire.js +4 -0
  81. package/build/src/akuma/requests.d.ts +0 -2
  82. package/build/src/akuma/requests.js +0 -17
  83. package/build/src/akuma/{fleet-observation.d.ts → selection-observation.d.ts} +37 -36
  84. package/build/src/akuma/selection-observation.js +65 -0
  85. package/build/src/akuma/{fleet-owner-port.d.ts → selection-owner-port.d.ts} +3 -3
  86. package/build/src/akuma/{fleet-owner-port.js → selection-owner-port.js} +11 -17
  87. package/build/src/akuma/{fleet-request.d.ts → selection-request.d.ts} +42 -82
  88. package/build/src/akuma/{fleet-request.js → selection-request.js} +92 -136
  89. package/build/src/akuma/turn-drive.js +73 -14
  90. package/build/src/akuma-body.js +91 -56
  91. package/build/src/body/amend.d.ts +5 -0
  92. package/build/src/body/amend.js +26 -50
  93. package/build/src/body/arc.d.ts +4 -2
  94. package/build/src/body/arc.js +19 -26
  95. package/build/src/body/criteria.d.ts +6 -0
  96. package/build/src/body/criteria.js +37 -0
  97. package/build/src/body/decode.js +5 -42
  98. package/build/src/body/region.d.ts +5 -0
  99. package/build/src/body/region.js +45 -2
  100. package/build/src/body/render.js +2 -4
  101. package/build/src/cli/activity.d.ts +26 -0
  102. package/build/src/cli/activity.js +75 -0
  103. package/build/src/cli/actor.d.ts +3 -1
  104. package/build/src/cli/actor.js +15 -2
  105. package/build/src/cli/commands/akuma-grammar.d.ts +75 -0
  106. package/build/src/cli/commands/akuma-grammar.js +414 -0
  107. package/build/src/cli/commands/akuma.d.ts +5 -69
  108. package/build/src/cli/commands/akuma.js +352 -319
  109. package/build/src/cli/commands/amend.d.ts +4 -5
  110. package/build/src/cli/commands/amend.js +1 -2
  111. package/build/src/cli/commands/bind.d.ts +4 -5
  112. package/build/src/cli/commands/bind.js +7 -10
  113. package/build/src/cli/commands/contract-grammar.d.ts +112 -0
  114. package/build/src/cli/commands/contract-grammar.js +282 -0
  115. package/build/src/cli/commands/contract-help.d.ts +17 -22
  116. package/build/src/cli/commands/contract-help.js +37 -24
  117. package/build/src/cli/commands/contract.d.ts +18 -97
  118. package/build/src/cli/commands/contract.js +621 -233
  119. package/build/src/cli/commands/install.d.ts +1 -1
  120. package/build/src/cli/commands/install.js +2 -2
  121. package/build/src/cli/commands/task-grammar.d.ts +19 -0
  122. package/build/src/cli/commands/task-grammar.js +438 -0
  123. package/build/src/cli/commands/task-query.js +23 -104
  124. package/build/src/cli/commands/task.d.ts +5 -20
  125. package/build/src/cli/commands/task.js +414 -364
  126. package/build/src/cli/coordinates.d.ts +10 -0
  127. package/build/src/cli/coordinates.js +20 -0
  128. package/build/src/cli/draft.d.ts +7 -1
  129. package/build/src/cli/main.js +10 -1
  130. package/build/src/cli/parse.d.ts +8 -9
  131. package/build/src/cli/parse.js +62 -62
  132. package/build/src/cli/render/akuma-activity.d.ts +54 -36
  133. package/build/src/cli/render/akuma-activity.js +262 -242
  134. package/build/src/cli/render/akuma-tool.d.ts +8 -4
  135. package/build/src/cli/render/akuma-tool.js +6 -5
  136. package/build/src/cli/render/akuma.d.ts +36 -16
  137. package/build/src/cli/render/akuma.js +65 -132
  138. package/build/src/cli/render/audit.d.ts +6 -2
  139. package/build/src/cli/render/audit.js +59 -28
  140. package/build/src/cli/render/catalog.d.ts +11 -2
  141. package/build/src/cli/render/catalog.js +75 -95
  142. package/build/src/cli/render/contract-history.d.ts +3 -1
  143. package/build/src/cli/render/contract-history.js +215 -22
  144. package/build/src/cli/render/contract-observation.d.ts +10 -5
  145. package/build/src/cli/render/contract-observation.js +29 -46
  146. package/build/src/cli/render/contract.d.ts +10 -3
  147. package/build/src/cli/render/contract.js +252 -103
  148. package/build/src/cli/render/effects.d.ts +26 -0
  149. package/build/src/cli/render/effects.js +41 -0
  150. package/build/src/cli/render/execution-progress.d.ts +18 -6
  151. package/build/src/cli/render/execution-progress.js +34 -31
  152. package/build/src/cli/render/kanshi-akuma.d.ts +1 -2
  153. package/build/src/cli/render/kanshi-akuma.js +5 -26
  154. package/build/src/cli/render/kanshi.js +107 -128
  155. package/build/src/cli/render/marks.d.ts +13 -0
  156. package/build/src/cli/render/marks.js +74 -0
  157. package/build/src/cli/render/nuke.js +18 -7
  158. package/build/src/cli/render/receipt.d.ts +10 -4
  159. package/build/src/cli/render/receipt.js +124 -44
  160. package/build/src/cli/render/reconcile.d.ts +5 -0
  161. package/build/src/cli/render/reconcile.js +152 -0
  162. package/build/src/cli/render/refusal.d.ts +21 -4
  163. package/build/src/cli/render/refusal.js +60 -33
  164. package/build/src/cli/render/region.js +3 -2
  165. package/build/src/cli/render/settings.js +2 -12
  166. package/build/src/cli/render/task.d.ts +37 -6
  167. package/build/src/cli/render/task.js +161 -157
  168. package/build/src/cli/render/terminal.d.ts +20 -1
  169. package/build/src/cli/render/terminal.js +92 -18
  170. package/build/src/cli/runtime.d.ts +32 -8
  171. package/build/src/cli/runtime.js +157 -165
  172. package/build/src/cli/selectors.d.ts +5 -2
  173. package/build/src/cli/selectors.js +11 -3
  174. package/build/src/cli/streams.d.ts +11 -0
  175. package/build/src/cli/streams.js +32 -0
  176. package/build/src/cli/usage.d.ts +2 -0
  177. package/build/src/cli/usage.js +12 -8
  178. package/build/src/contract-guidance.js +3 -7
  179. package/build/src/contract-worktree.d.ts +20 -28
  180. package/build/src/contract-worktree.js +18 -70
  181. package/build/src/coordination/durable-file.d.ts +2 -2
  182. package/build/src/coordination/durable-file.js +0 -27
  183. package/build/src/core/facts/codec.d.ts +1 -2
  184. package/build/src/core/facts/codec.js +6 -7
  185. package/build/src/core/facts/gate.d.ts +0 -1
  186. package/build/src/core/facts/gate.js +0 -82
  187. package/build/src/core/facts/types.d.ts +1 -2
  188. package/build/src/core/verbs/abandon.d.ts +2 -6
  189. package/build/src/core/verbs/abandon.js +0 -16
  190. package/build/src/core/verbs/amend.d.ts +0 -1
  191. package/build/src/core/verbs/amend.js +0 -20
  192. package/build/src/core/verbs/arc.d.ts +7 -8
  193. package/build/src/core/verbs/arc.js +2 -19
  194. package/build/src/core/verbs/attestation.d.ts +2 -6
  195. package/build/src/core/verbs/attestation.js +0 -16
  196. package/build/src/core/verbs/bind.d.ts +0 -1
  197. package/build/src/core/verbs/bind.js +0 -16
  198. package/build/src/core/verbs/deliver.d.ts +0 -1
  199. package/build/src/core/verbs/deliver.js +0 -16
  200. package/build/src/core/verbs/placement.d.ts +2 -1
  201. package/build/src/core/verbs/placement.js +10 -59
  202. package/build/src/git/admission.d.ts +6 -4
  203. package/build/src/git/admission.js +4 -0
  204. package/build/src/git/hooks.d.ts +55 -30
  205. package/build/src/git/hooks.js +30 -3
  206. package/build/src/git/identity.d.ts +6 -0
  207. package/build/src/git/identity.js +47 -0
  208. package/build/src/git/integration.d.ts +31 -13
  209. package/build/src/git/integration.js +32 -1
  210. package/build/src/git/nuke.d.ts +10 -1
  211. package/build/src/git/nuke.js +31 -11
  212. package/build/src/git/observe.js +2 -15
  213. package/build/src/git/private-state-seat.d.ts +6 -7
  214. package/build/src/git/private-state-seat.js +8 -6
  215. package/build/src/git/read-observation.d.ts +6 -1
  216. package/build/src/git/read-observation.js +81 -46
  217. package/build/src/git/reconcile.d.ts +117 -40
  218. package/build/src/git/reconcile.js +169 -40
  219. package/build/src/git/scratch.d.ts +7 -4
  220. package/build/src/git/scratch.js +28 -6
  221. package/build/src/git/target-placement.d.ts +53 -38
  222. package/build/src/git/target-placement.js +69 -54
  223. package/build/src/git/tender.d.ts +37 -28
  224. package/build/src/git/tender.js +39 -0
  225. package/build/src/git/terminal-reconcile.js +21 -23
  226. package/build/src/git/terminal-seal.d.ts +8 -6
  227. package/build/src/git/terminal-seal.js +10 -0
  228. package/build/src/git/workspace.d.ts +29 -15
  229. package/build/src/git/workspace.js +28 -2
  230. package/build/src/identity/normalize.js +19 -6
  231. package/build/src/index.d.ts +78 -7
  232. package/build/src/index.js +52 -4
  233. package/build/src/kanshi/read.d.ts +3 -3
  234. package/build/src/kanshi/read.js +21 -21
  235. package/build/src/kanshi/report.d.ts +9 -8
  236. package/build/src/kanshi/roster.d.ts +2 -0
  237. package/build/src/kanshi/roster.js +2 -0
  238. package/build/src/kanshi/select.js +7 -3
  239. package/build/src/library/address.d.ts +3 -7
  240. package/build/src/library/address.js +7 -7
  241. package/build/src/library/akuma-creation.d.ts +21 -32
  242. package/build/src/library/akuma-creation.js +148 -165
  243. package/build/src/library/akumas.d.ts +20 -22
  244. package/build/src/library/akumas.js +43 -20
  245. package/build/src/library/bind.d.ts +107 -13
  246. package/build/src/library/bind.js +29 -23
  247. package/build/src/library/continuation.d.ts +556 -28
  248. package/build/src/library/continuation.js +29 -54
  249. package/build/src/library/contract-composition.d.ts +40 -0
  250. package/build/src/library/contract-composition.js +105 -0
  251. package/build/src/library/contract-creation.d.ts +7 -0
  252. package/build/src/library/contract-creation.js +192 -0
  253. package/build/src/library/contract-execution.d.ts +29 -40
  254. package/build/src/library/contract-execution.js +503 -128
  255. package/build/src/library/contract-operations.d.ts +275 -134
  256. package/build/src/library/contract-operations.js +83 -92
  257. package/build/src/library/contract-outcomes.d.ts +71 -0
  258. package/build/src/library/contract-outcomes.js +32 -0
  259. package/build/src/library/contract-settings.d.ts +25 -0
  260. package/build/src/library/contract-settings.js +135 -0
  261. package/build/src/library/contract-types.d.ts +17 -38
  262. package/build/src/library/delivery.d.ts +530 -10
  263. package/build/src/library/delivery.js +20 -45
  264. package/build/src/library/input.d.ts +3 -1
  265. package/build/src/library/input.js +11 -16
  266. package/build/src/library/invocation.d.ts +87 -0
  267. package/build/src/library/invocation.js +290 -0
  268. package/build/src/library/keiyaku.d.ts +45 -22
  269. package/build/src/library/keiyaku.js +134 -8
  270. package/build/src/library/nuke.d.ts +2 -11
  271. package/build/src/library/nuke.js +70 -57
  272. package/build/src/library/outcome.d.ts +13196 -0
  273. package/build/src/library/outcome.js +487 -0
  274. package/build/src/library/reconcile.d.ts +96 -24
  275. package/build/src/library/reconcile.js +102 -42
  276. package/build/src/library/refusal.d.ts +470 -42
  277. package/build/src/library/refusal.js +55 -143
  278. package/build/src/library/region.d.ts +15 -7
  279. package/build/src/library/region.js +23 -3
  280. package/build/src/library/repo.d.ts +2 -12
  281. package/build/src/library/repo.js +1 -22
  282. package/build/src/library/selection.d.ts +121 -0
  283. package/build/src/library/{fleet.js → selection.js} +169 -152
  284. package/build/src/plugin/public.d.ts +2 -0
  285. package/build/src/protocol/abandon.d.ts +2 -2
  286. package/build/src/protocol/abandon.js +1 -0
  287. package/build/src/protocol/amend.js +1 -0
  288. package/build/src/protocol/arc.d.ts +6 -4
  289. package/build/src/protocol/attempt.d.ts +4 -2
  290. package/build/src/protocol/attempt.js +10 -0
  291. package/build/src/protocol/audit.d.ts +255 -52
  292. package/build/src/protocol/audit.js +63 -5
  293. package/build/src/protocol/bind.d.ts +18 -17
  294. package/build/src/protocol/bind.js +9 -28
  295. package/build/src/protocol/completion.d.ts +256 -22
  296. package/build/src/protocol/completion.js +100 -12
  297. package/build/src/protocol/deliver.d.ts +34 -23
  298. package/build/src/protocol/deliver.js +39 -25
  299. package/build/src/protocol/execution-observation.d.ts +36 -37
  300. package/build/src/protocol/execution-observation.js +7 -9
  301. package/build/src/protocol/intent.d.ts +101 -30
  302. package/build/src/protocol/intent.js +74 -1
  303. package/build/src/protocol/operations.d.ts +570 -64
  304. package/build/src/protocol/operations.js +189 -9
  305. package/build/src/protocol/outcome.d.ts +2 -1
  306. package/build/src/protocol/placement.d.ts +2 -2
  307. package/build/src/protocol/placement.js +3 -1
  308. package/build/src/protocol/progress.d.ts +108 -65
  309. package/build/src/protocol/progress.js +82 -132
  310. package/build/src/protocol/read/status.d.ts +4 -3
  311. package/build/src/protocol/read/status.js +6 -5
  312. package/build/src/protocol/reconcile.d.ts +3 -3
  313. package/build/src/protocol/reconcile.js +4 -0
  314. package/build/src/protocol/reintegrate.d.ts +2 -2
  315. package/build/src/protocol/review.d.ts +30 -12
  316. package/build/src/protocol/review.js +15 -24
  317. package/build/src/protocol/run.d.ts +34 -5
  318. package/build/src/protocol/run.js +24 -12
  319. package/build/src/runtime/proc/windows-launch.exe +0 -0
  320. package/build/src/settings.d.ts +0 -10
  321. package/build/src/settings.js +0 -76
  322. package/build/src/settlement/holder.d.ts +1 -1
  323. package/build/src/settlement/settle.d.ts +25 -16
  324. package/build/src/settlement/settle.js +80 -20
  325. package/build/src/task/board.d.ts +3 -1
  326. package/build/src/task/board.js +13 -17
  327. package/build/src/task/catalog.d.ts +0 -4
  328. package/build/src/task/catalog.js +0 -15
  329. package/build/src/task/compose-language.d.ts +19 -9
  330. package/build/src/task/compose-language.js +30 -20
  331. package/build/src/task/compose.d.ts +7 -37
  332. package/build/src/task/compose.js +20 -2
  333. package/build/src/task/created-observation.d.ts +0 -1
  334. package/build/src/task/created-observation.js +1 -4
  335. package/build/src/task/document.d.ts +12 -2
  336. package/build/src/task/document.js +4 -0
  337. package/build/src/task/identity.d.ts +4 -1
  338. package/build/src/task/identity.js +21 -17
  339. package/build/src/task/index.d.ts +36 -16
  340. package/build/src/task/index.js +103 -96
  341. package/build/src/task/lifecycle-operations.d.ts +1 -1
  342. package/build/src/task/mutation-result.d.ts +647 -586
  343. package/build/src/task/mutation-result.js +79 -46
  344. package/build/src/task/mutation.d.ts +298 -270
  345. package/build/src/task/mutation.js +93 -110
  346. package/build/src/task/operation-types.d.ts +6 -49
  347. package/build/src/task/operations.d.ts +2 -1
  348. package/build/src/task/operations.js +35 -12
  349. package/build/src/task/query.d.ts +9 -3
  350. package/build/src/task/query.js +42 -16
  351. package/build/src/task/store.d.ts +2 -1
  352. package/build/src/task/store.js +10 -14
  353. package/build/src/verification/declaration.d.ts +0 -1
  354. package/build/src/verification/declaration.js +1 -18
  355. package/build/src/verification/execution.d.ts +6 -2
  356. package/build/src/verification/observation.d.ts +1 -1
  357. package/package.json +2 -18
  358. package/build/src/akuma/akuma-product.d.ts +0 -58
  359. package/build/src/akuma/akuma-product.js +0 -276
  360. package/build/src/akuma/fleet-execution.js +0 -234
  361. package/build/src/akuma/fleet-observation.js +0 -97
  362. package/build/src/cli/accepted.d.ts +0 -24
  363. package/build/src/cli/accepted.js +0 -167
  364. package/build/src/cli/catalog.d.ts +0 -45
  365. package/build/src/cli/catalog.js +0 -1
  366. package/build/src/cli/commands/akuma-invoke.d.ts +0 -114
  367. package/build/src/cli/commands/akuma-invoke.js +0 -375
  368. package/build/src/cli/commands/contract-invoke.d.ts +0 -34
  369. package/build/src/cli/commands/contract-invoke.js +0 -259
  370. package/build/src/cli/commands/nuke.d.ts +0 -10
  371. package/build/src/cli/commands/nuke.js +0 -20
  372. package/build/src/cli/commands/status-set.d.ts +0 -4
  373. package/build/src/cli/commands/status-set.js +0 -52
  374. package/build/src/cli/commands/task-invoke.d.ts +0 -49
  375. package/build/src/cli/commands/task-invoke.js +0 -306
  376. package/build/src/cli/invoke.d.ts +0 -27
  377. package/build/src/cli/invoke.js +0 -521
  378. package/build/src/cli/render/board.d.ts +0 -3
  379. package/build/src/cli/render/board.js +0 -25
  380. package/build/src/cli/render/status-set.d.ts +0 -5
  381. package/build/src/cli/render/status-set.js +0 -19
  382. package/build/src/cli/render/text.d.ts +0 -3
  383. package/build/src/cli/render/text.js +0 -33
  384. package/build/src/cli/result.d.ts +0 -240
  385. package/build/src/cli/result.js +0 -1
  386. package/build/src/git/result-codec.d.ts +0 -29
  387. package/build/src/git/result-codec.js +0 -309
  388. package/build/src/kanshi/fleet.d.ts +0 -6
  389. package/build/src/kanshi/fleet.js +0 -27
  390. package/build/src/library/audit.d.ts +0 -29
  391. package/build/src/library/audit.js +0 -41
  392. package/build/src/library/composition.d.ts +0 -15
  393. package/build/src/library/composition.js +0 -28
  394. package/build/src/library/configuration.d.ts +0 -4
  395. package/build/src/library/configuration.js +0 -2
  396. package/build/src/library/contract-bind.d.ts +0 -31
  397. package/build/src/library/contract-bind.js +0 -140
  398. package/build/src/library/contract-forwarding.d.ts +0 -55
  399. package/build/src/library/contract-forwarding.js +0 -67
  400. package/build/src/library/contract-handle.d.ts +0 -50
  401. package/build/src/library/contract-handle.js +0 -385
  402. package/build/src/library/contract.d.ts +0 -46
  403. package/build/src/library/contract.js +0 -73
  404. package/build/src/library/execution-result.d.ts +0 -243
  405. package/build/src/library/execution-result.js +0 -101
  406. package/build/src/library/execution.d.ts +0 -8
  407. package/build/src/library/execution.js +0 -102
  408. package/build/src/library/fleet.d.ts +0 -83
  409. package/build/src/library/mutation.d.ts +0 -501
  410. package/build/src/library/mutation.js +0 -248
  411. package/build/src/library/result-codec.d.ts +0 -2
  412. package/build/src/library/result-codec.js +0 -12
  413. package/build/src/protocol/result-codec.d.ts +0 -23
  414. package/build/src/protocol/result-codec.js +0 -488
  415. package/build/src/settlement/result-codec.d.ts +0 -2
  416. package/build/src/settlement/result-codec.js +0 -56
  417. package/build/src/task/public.d.ts +0 -2
  418. package/build/src/task/public.js +0 -1
@@ -1,394 +1,444 @@
1
- import { CliUsageError, isBlankInput, TASK_FAMILY_USAGE_GUIDE, unknownCommandGuide, } from "../usage.js";
1
+ import { CliUsageError, isBlankInput } from "../usage.js";
2
2
  import { parseTaskNamespaceSelector } from "../../task/catalog.js";
3
- import { parseTaskQueryExpression, validateTaskLimit, validateTaskParent, } from "./task-query.js";
4
- const COMMON = { json: "boolean" };
5
- const TASK_COMMAND_SPECS = {
6
- add: {
7
- arity: [0, 1],
8
- stdin: "document",
9
- flags: {
10
- ...COMMON,
11
- namespace: "value",
12
- state: "value",
13
- priority: "value",
14
- needs: "repeat",
15
- parent: "value",
16
- supersedes: "repeat",
17
- relates: "repeat",
18
- body: "value",
19
- note: "value",
20
- actor: "value",
21
- },
22
- usage: `task add <TITLE> [--namespace <ns>] [--priority 0..3]
23
- [--state open|in_progress|on_hold|done|drop]
24
- [--note <text>] [--actor <actor>]
25
- [--needs <TaskId>]... [--parent <TaskId>]
26
- [--supersedes <TaskId>]... [--relates <TaskId>]...
27
- [--body <text>]
28
- task add [--namespace <ns>] [--actor <actor>] -`,
29
- purpose: "Create a Task from flags or a Task document on stdin.",
30
- },
31
- show: {
32
- arity: [1, Number.POSITIVE_INFINITY],
33
- flags: COMMON,
34
- usage: "task show <TaskId>...",
35
- purpose: "Read one or more Tasks and their relationships.",
36
- },
37
- ls: {
38
- arity: [0, 1],
39
- flags: { ...COMMON, closed: "boolean", all: "boolean", world: "boolean", limit: "value" },
40
- usage: "task ls [<namespace-selector>] [--closed | --all] [--world] [--limit <n>]",
41
- purpose: "List Tasks in the selected namespace.",
42
- details: [
43
- "With no selector, lists the current directory Task context.",
44
- "task/ selects the root namespace; --world lists every namespace in the current Task world.",
45
- ].join("\n"),
46
- },
47
- ready: {
48
- arity: [0, 0],
49
- flags: { ...COMMON, world: "boolean", parent: "value", limit: "value" },
50
- usage: "task ready [--world] [--parent <TaskId>] [--limit <n>]",
51
- purpose: "List open Tasks whose every dependency is complete or dropped.",
52
- details: "--world lists every namespace in the current Task world.",
53
- },
54
- blocked: {
55
- arity: [0, 0],
56
- flags: { ...COMMON, world: "boolean", parent: "value", limit: "value" },
57
- usage: "task blocked [--world] [--parent <TaskId>] [--limit <n>]",
58
- purpose: "List Tasks with unmet dependencies.",
59
- details: "--world lists every namespace in the current Task world.",
60
- },
61
- query: {
62
- arity: [0, 0],
63
- flags: { ...COMMON, where: "value", world: "boolean", sort: "value", limit: "value" },
64
- usage: `task query [--where <expression>] [--world]
65
- [--sort priority|created|updated|id] [--limit <n>]`,
66
- purpose: "Filter and sort Tasks with a boolean expression.",
67
- details: [
68
- "fields: state priority title id parent under needs blocks ready blocked created updated",
69
- "operators: = != < > <= >= ~ and or not ( )",
70
- "sort: priority and created ascend; updated descends; id is lexical. Default: priority.",
71
- "--world lists every namespace in the current Task world.",
72
- "examples:",
73
- " keiyaku task query --where 'priority <= 1 and ready' --world",
74
- " keiyaku task query --where 'updated < 2026-08-06T00:00:00.000Z' --world",
75
- ].join("\n"),
76
- },
77
- tree: {
78
- arity: [1, 1],
79
- flags: COMMON,
80
- usage: "task tree <TaskId>",
81
- purpose: "Show a Task and its parent/child breakdown.",
82
- },
83
- doctor: {
84
- arity: [0, 0],
85
- flags: COMMON,
86
- usage: "task doctor",
87
- purpose: "Check Tasks for inconsistencies without changing them.",
88
- },
89
- update: {
90
- arity: [1, 1],
91
- flags: {
92
- ...COMMON,
93
- title: "value",
94
- body: "value",
95
- append: "value",
96
- note: "value",
97
- priority: "value",
98
- needs: "repeat",
99
- "drop-needs": "repeat",
100
- parent: "value",
101
- "no-parent": "boolean",
102
- supersedes: "repeat",
103
- "drop-supersedes": "repeat",
104
- relates: "repeat",
105
- "drop-relates": "repeat",
106
- },
107
- usage: `task update <TaskId> [--title <text>] [--body <text>|- | --append <text>]
108
- [--note <text>]
109
- [--priority 0..3] [--needs <TaskId>]... [--drop-needs <TaskId>]...
110
- [--parent <TaskId> | --no-parent]
111
- [--supersedes <TaskId>]... [--drop-supersedes <TaskId>]...
112
- [--relates <TaskId>]... [--drop-relates <TaskId>]...`,
113
- purpose: "Change a Task's fields and relationships.",
114
- details: [
115
- "--body replaces the body; --append adds text after it, separated by a newline when needed.",
116
- "--body - reads replacement body text from stdin.",
117
- ].join("\n"),
118
- },
119
- start: {
120
- arity: [1, Number.POSITIVE_INFINITY],
121
- flags: COMMON,
122
- usage: "task start <TaskId>...",
123
- purpose: "Move one or more open Tasks into progress.",
124
- },
125
- stop: {
126
- arity: [1, 1],
127
- flags: COMMON,
128
- usage: "task stop <TaskId>",
129
- purpose: "Return one in-progress Task to open.",
130
- },
131
- hold: {
132
- arity: [1, Number.POSITIVE_INFINITY],
133
- flags: COMMON,
134
- usage: "task hold <TaskId>...",
135
- purpose: "Put one or more Tasks on hold.",
136
- },
137
- resume: {
138
- arity: [1, 1],
139
- flags: COMMON,
140
- usage: "task resume <TaskId>",
141
- purpose: "Return one held Task to open.",
142
- },
143
- done: {
144
- arity: [1, Number.POSITIVE_INFINITY],
145
- flags: { ...COMMON, note: "value" },
146
- usage: "task done <TaskId>... [--note <text>]",
147
- purpose: "Mark one or more Tasks done.",
148
- },
149
- drop: {
150
- arity: [1, Number.POSITIVE_INFINITY],
151
- flags: { ...COMMON, note: "value" },
152
- usage: "task drop <TaskId>... [--note <text>]",
153
- purpose: "Mark one or more Tasks as no longer needed.",
154
- },
155
- context: {
156
- arity: [0, 1],
157
- flags: COMMON,
158
- usage: "task context [<namespace>]",
159
- purpose: "Set or read the default Task namespace for this directory.",
160
- details: "Omit <namespace> to read the current context; use / to reset it to the root namespace.",
161
- },
162
- compose: {
163
- arity: [0, 0],
164
- stdin: "compose",
165
- flags: { ...COMMON, actor: "value", plan: "boolean" },
166
- usage: "task compose [--actor <actor>] [--plan] -",
167
- purpose: "Create or update several Tasks from one document, with an optional preview.",
168
- details: [
169
- "nodes: + <Title> creates; @task/<id> modifies a pre-existing Task",
170
- "properties: as = <alias>; state = open|in_progress|on_hold|done|drop; pri = 0..3; parent = <ref>|empty",
171
- "relations: needs|supersedes|relates with =, +=, or -=",
172
- "references: @task/... is pre-existing; ^alias is new in this document",
173
- "body: body = clears; body <<TOKEN reads exact content to TOKEN",
174
- "TOKEN: [A-Z][A-Z0-9_]* with length 3..32",
175
- "example:",
176
- " ns=feature",
177
- " + Parent",
178
- " as = parent",
179
- " pri = 1",
180
- " body <<BODY",
181
- " Exact body bytes.",
182
- " BODY",
183
- " + Child",
184
- " parent = ^parent",
185
- ].join("\n"),
186
- },
187
- };
188
- export function isTaskAction(value) {
189
- return value !== undefined && Object.hasOwn(TASK_COMMAND_SPECS, value);
3
+ import { taskRowViewLimit, tasksWithExecution, } from "../../task/index.js";
4
+ import { taskCompositionNamespaceHeader } from "../../task/compose-language.js";
5
+ import { resolveTaskNamespaceContext, writeTaskNamespaceContext } from "../../task/context.js";
6
+ import { displayContext, writeJson, writeStderr, writeStdout } from "../streams.js";
7
+ import { renderTaskCompose, renderTaskContext, renderTaskDoctor, renderTaskFailure, renderTaskIncompleteDiagnostic, renderTaskLifecycle, renderTaskList, renderTaskMutation, renderTaskShow, renderTaskTree, renderTaskUpdate, taskExitCode, } from "../render/task.js";
8
+ import { actorFromEdge } from "../actor.js";
9
+ import { taskQuerySelection } from "../../task/query.js";
10
+ export { renderTaskHelp } from "./task-grammar.js";
11
+ function value(command, name) {
12
+ const item = command.flags[name];
13
+ return typeof item === "string" ? item : undefined;
190
14
  }
191
- export function renderTaskHelp(action) {
192
- if (action !== undefined) {
193
- const spec = TASK_COMMAND_SPECS[action];
194
- return `${spec.purpose}\n\n${renderTaskUsage(action)}${spec.details === undefined ? "" : `\n\n${spec.details}`}`;
195
- }
196
- return [
197
- "usage keiyaku task <command> ...",
198
- "",
199
- "commands:",
200
- ...Object.values(TASK_COMMAND_SPECS).flatMap((spec) => spec.usage
201
- .split("\n")
202
- .map((line) => ` ${line}`)
203
- .concat(` ${spec.purpose}`)),
204
- ].join("\n");
15
+ function values(command, name) {
16
+ const item = command.flags[name];
17
+ return Array.isArray(item) ? item : undefined;
205
18
  }
206
- export function renderTaskUsage(action) {
207
- return TASK_COMMAND_SPECS[action].usage
208
- .split("\n")
209
- .map((line, index) => {
210
- if (index === 0 || line.trimStart().startsWith("task ")) {
211
- const command = line.trimStart().startsWith("task ") ? `keiyaku ${line.trim()}` : `keiyaku ${line}`;
212
- return `${index === 0 ? "usage " : " "}${command}`;
213
- }
214
- return ` ${line.trim()}`;
215
- })
216
- .join("\n");
19
+ function namespace(raw) {
20
+ return raw === undefined ? undefined : raw === "/" ? [] : raw.split("/");
217
21
  }
218
- function taskUsage(action) {
219
- const lines = TASK_COMMAND_SPECS[action].usage.split("\n");
220
- return lines
221
- .map((line, index) => {
222
- if (index === 0 || line.trimStart().startsWith("task "))
223
- return `keiyaku ${line.trim()}`;
224
- return ` ${line.trim()}`;
225
- })
226
- .join("\n");
22
+ function priority(raw) {
23
+ if (raw === undefined)
24
+ return undefined;
25
+ return Number(raw);
227
26
  }
228
- export function taskUsageGuide(action) {
229
- return {
230
- scope: `keiyaku task ${action}`,
231
- accepts: taskUsage(action),
232
- help: `keiyaku task ${action} --help`,
233
- };
27
+ function ids(items) {
28
+ return items;
234
29
  }
235
- function setFlag(flags, name, kind, value, fail) {
236
- if (flags[name] !== undefined && kind !== "repeat")
237
- fail(`duplicate option: --${name}`);
238
- if (kind === "boolean") {
239
- flags[name] = true;
240
- return;
241
- }
242
- if (value === undefined)
243
- fail(`--${name} requires a value`);
244
- if (isBlankInput(value))
245
- fail(`--${name} requires a nonblank value`);
246
- if (kind === "repeat") {
247
- const current = flags[name];
248
- flags[name] = [...(Array.isArray(current) ? current : []), value];
30
+ function limit(command) {
31
+ const raw = value(command, "limit");
32
+ return raw === undefined ? undefined : Number(raw);
33
+ }
34
+ function validateTaskRowView(command) {
35
+ if (command.action === "ls" ||
36
+ command.action === "ready" ||
37
+ command.action === "blocked" ||
38
+ command.action === "query")
39
+ taskRowViewLimit(limit(command));
40
+ }
41
+ function explicitListNamespace(command) {
42
+ return command.action === "ls" && command.positionals.length === 1
43
+ ? parseTaskNamespaceSelector(command.positionals[0])
44
+ : undefined;
45
+ }
46
+ function taskStdinDiagnostic(command) {
47
+ switch (command.stdin) {
48
+ case "document":
49
+ return "task add requires a nonblank stdin document";
50
+ case "compose":
51
+ return "task compose requires a nonblank stdin document";
52
+ case "body":
53
+ return "task update --body requires a nonblank value";
54
+ case "append":
55
+ return "task update --append requires a nonblank value";
56
+ case "note":
57
+ return "task update --note requires a nonblank value";
58
+ default:
59
+ return undefined;
249
60
  }
61
+ }
62
+ /**
63
+ * The shared output primitive: one native answer, its matching rendered text, and the native exit
64
+ * classifier's verdict. JSON writes the untouched native value; text writes the rendered lines.
65
+ */
66
+ function emitTask(output, result, project, code) {
67
+ if (output === "json")
68
+ writeJson(result);
250
69
  else
251
- flags[name] = value;
70
+ writeStdout(project());
71
+ return code;
72
+ }
73
+ async function invokeAdd(input) {
74
+ const { tasks, command, current = [] } = input;
75
+ const selectedNamespace = namespace(value(command, "namespace")) ?? current;
76
+ const actor = input.actor;
77
+ if (command.stdin === "document") {
78
+ return tasks.addDocument({
79
+ markdown: input.stdin,
80
+ ...(selectedNamespace === undefined ? {} : { namespace: selectedNamespace }),
81
+ ...(actor === undefined ? {} : { actor }),
82
+ });
83
+ }
84
+ const body = value(command, "body"), note = value(command, "note"), initialState = value(command, "state"), selectedPriority = priority(value(command, "priority"));
85
+ const needs = ids(values(command, "needs")), parent = value(command, "parent");
86
+ const supersedes = ids(values(command, "supersedes")), relates = ids(values(command, "relates"));
87
+ return tasks.add({
88
+ title: command.positionals[0],
89
+ ...(selectedNamespace === undefined ? {} : { namespace: selectedNamespace }),
90
+ ...(body === undefined ? {} : { body }),
91
+ ...(note === undefined ? {} : { note }),
92
+ ...(initialState === undefined ? {} : { state: initialState }),
93
+ ...(selectedPriority === undefined ? {} : { priority: selectedPriority }),
94
+ ...(needs === undefined ? {} : { needs }),
95
+ ...(parent === undefined ? {} : { parent: parent }),
96
+ ...(supersedes === undefined ? {} : { supersedes }),
97
+ ...(relates === undefined ? {} : { relates }),
98
+ ...(actor === undefined ? {} : { actor }),
99
+ });
100
+ }
101
+ function invokeUpdate(input) {
102
+ const { tasks, command, stdin } = input;
103
+ const body = command.stdin === "body" ? stdin : value(command, "body"), appendBody = command.stdin === "append" ? stdin : value(command, "append");
104
+ const note = command.stdin === "note" ? stdin : value(command, "note");
105
+ const title = value(command, "title"), selectedPriority = priority(value(command, "priority"));
106
+ const addNeeds = ids(values(command, "needs")), dropNeeds = ids(values(command, "drop-needs"));
107
+ const parent = value(command, "parent"), addSupersedes = ids(values(command, "supersedes"));
108
+ const dropSupersedes = ids(values(command, "drop-supersedes")), addRelates = ids(values(command, "relates"));
109
+ const dropRelates = ids(values(command, "drop-relates"));
110
+ return tasks.task({ id: command.positionals[0] }).update({
111
+ ...(title === undefined ? {} : { title }),
112
+ ...(body === undefined ? {} : { body }),
113
+ ...(appendBody === undefined ? {} : { appendBody }),
114
+ ...(note === undefined ? {} : { note }),
115
+ ...(selectedPriority === undefined ? {} : { priority: selectedPriority }),
116
+ ...(addNeeds === undefined ? {} : { addNeeds }),
117
+ ...(dropNeeds === undefined ? {} : { dropNeeds }),
118
+ ...(command.flags["no-parent"] === true
119
+ ? { parent: null }
120
+ : parent === undefined
121
+ ? {}
122
+ : { parent: parent }),
123
+ ...(addSupersedes === undefined ? {} : { addSupersedes }),
124
+ ...(dropSupersedes === undefined ? {} : { dropSupersedes }),
125
+ ...(addRelates === undefined ? {} : { addRelates }),
126
+ ...(dropRelates === undefined ? {} : { dropRelates }),
127
+ });
252
128
  }
253
- function scanTaskOption(input, fail) {
254
- const token = input.argv[input.index], name = token.slice(2), kind = input.spec.flags[name];
255
- if (kind === undefined)
256
- fail(`option ${token} is not valid for task ${input.action}`);
257
- const next = kind === "boolean" ? undefined : input.argv[input.index + 1];
258
- if (next === "-" && input.action === "update" && name === "body") {
259
- if (input.stdin !== undefined)
260
- fail("stdin marker '-' may appear only once");
261
- input.flags[name] = "";
262
- return { index: input.index + 1, stdin: name };
129
+ function readScope(command, current) {
130
+ return command.flags.world === true ? { scope: "world" } : { namespace: current ?? [] };
131
+ }
132
+ /** One addressed read per caller-supplied id, in caller order; the native null survives to JSON. */
133
+ async function runShow(command, tasks) {
134
+ const handles = command.positionals.map((taskId) => tasks.task({ id: taskId }).id);
135
+ const details = [];
136
+ for (const id of handles)
137
+ details.push(await tasks.task({ id }).read());
138
+ const missing = details.findIndex((detail) => detail === null);
139
+ const code = missing >= 0 ? 1 : 0;
140
+ if (command.output === "json") {
141
+ writeJson(handles.length === 1 ? details[0] : details);
142
+ return code;
143
+ }
144
+ if (missing >= 0) {
145
+ const refusal = { kind: "refused", refusal: { kind: "task-missing", taskId: handles[missing] } };
146
+ return emitTask(command.output, refusal, () => renderTaskShow(refusal, displayContext()), code);
263
147
  }
264
- if (kind !== "boolean" && (next === undefined || next.startsWith("--") || next === "-"))
265
- fail(`--${name} requires a value`);
266
- setFlag(input.flags, name, kind, next, fail);
267
- return {
268
- index: input.index + (kind === "boolean" ? 0 : 1),
269
- ...(input.stdin === undefined ? {} : { stdin: input.stdin }),
270
- };
148
+ const found = details.filter((detail) => detail !== null);
149
+ const result = found.length === 1 ? found[0] : found;
150
+ return emitTask(command.output, result, () => renderTaskShow(result, displayContext()), code);
151
+ }
152
+ /** Presentation-only list scope the leaf acquired, never part of the native answer. */
153
+ function listPresentation(command) {
154
+ if (command.flags.world === true)
155
+ return "world";
156
+ const first = command.positionals[0];
157
+ return command.action === "ls" && first !== undefined ? { namespace: first } : "current";
271
158
  }
272
- function scanTaskArgv(action, argv, fail) {
273
- const spec = TASK_COMMAND_SPECS[action], positionals = [], flags = {};
274
- let stdin;
275
- for (let index = 1; index < argv.length; index += 1) {
276
- const token = argv[index];
277
- if (token === "-") {
278
- if (spec.stdin === undefined)
279
- fail("stdin marker '-' is not valid here");
280
- if (stdin !== undefined)
281
- fail("stdin marker '-' may appear only once");
282
- stdin = spec.stdin;
283
- continue;
159
+ async function runRead(input) {
160
+ const { tasks, command, current } = input;
161
+ const id = command.positionals[0];
162
+ const scope = listPresentation(command);
163
+ switch (command.action) {
164
+ case "ls": {
165
+ const result = await tasks.list({
166
+ selection: command.flags.all === true ? "all" : command.flags.closed === true ? "closed" : "active",
167
+ ...(explicitListNamespace(command) === undefined
168
+ ? readScope(command, current)
169
+ : { namespace: explicitListNamespace(command) }),
170
+ ...(limit(command) === undefined ? {} : { limit: limit(command) }),
171
+ });
172
+ return emitTask(command.output, result, () => renderTaskList("ls", scope, result, displayContext()), taskExitCode(result));
173
+ }
174
+ case "ready": {
175
+ const result = await tasks.ready({
176
+ ...readScope(command, current),
177
+ ...(value(command, "parent") === undefined ? {} : { parent: value(command, "parent") }),
178
+ ...(limit(command) === undefined ? {} : { limit: limit(command) }),
179
+ });
180
+ return emitTask(command.output, result, () => renderTaskList("ready", scope, result, displayContext()), taskExitCode(result));
181
+ }
182
+ case "blocked": {
183
+ const result = await tasks.blocked({
184
+ ...readScope(command, current),
185
+ ...(value(command, "parent") === undefined ? {} : { parent: value(command, "parent") }),
186
+ ...(limit(command) === undefined ? {} : { limit: limit(command) }),
187
+ });
188
+ return emitTask(command.output, result, () => renderTaskList("blocked", scope, result, displayContext()), taskExitCode(result));
284
189
  }
285
- if (!token.startsWith("--")) {
286
- if (isBlankInput(token))
287
- fail(`task ${action} requires a nonblank value`);
288
- positionals.push(token);
289
- continue;
190
+ case "query": {
191
+ const result = await tasks.query({
192
+ where: taskQuerySelection(command.flags.all === true ? "all" : command.flags.closed === true ? "closed" : "active", command.where),
193
+ ...readScope(command, current),
194
+ ...(value(command, "sort") === undefined ? {} : { sort: value(command, "sort") }),
195
+ ...(limit(command) === undefined ? {} : { limit: limit(command) }),
196
+ });
197
+ return emitTask(command.output, result, () => renderTaskList("query", scope, result, displayContext()), taskExitCode(result));
290
198
  }
291
- const scanned = scanTaskOption({ action, spec, argv, index, flags, ...(stdin === undefined ? {} : { stdin }) }, fail);
292
- index = scanned.index;
293
- stdin = scanned.stdin;
199
+ case "tree": {
200
+ const result = await tasks.task({ id }).tree();
201
+ return emitTask(command.output, result, () => renderTaskTree(result, displayContext()), taskExitCode(result));
202
+ }
203
+ case "doctor": {
204
+ const result = await tasks.doctor();
205
+ return emitTask(command.output, result, () => renderTaskDoctor(result), taskExitCode(result));
206
+ }
207
+ default:
208
+ throw new Error(`task action is not a read: ${command.action}`);
294
209
  }
295
- return { positionals, flags, ...(stdin === undefined ? {} : { stdin }) };
296
210
  }
297
- function validateUpdate(scanned, fail) {
298
- const flags = scanned.flags;
299
- if (flags.body !== undefined && flags.append !== undefined)
300
- fail("--body and --append are mutually exclusive");
301
- if (flags.parent !== undefined && flags["no-parent"] === true)
302
- fail("--parent and --no-parent are mutually exclusive");
303
- if (Object.keys(flags).every((name) => name === "json"))
304
- fail("task update requires at least one patch option");
211
+ function isWorldObservationAction(command) {
212
+ return (command.action === "ls" ||
213
+ command.action === "ready" ||
214
+ command.action === "blocked" ||
215
+ command.action === "query" ||
216
+ command.action === "doctor");
305
217
  }
306
- function validateTaskReadFlags(action, flags, fail) {
307
- if (action === "ls" && flags.closed === true && flags.all === true)
308
- fail("--closed and --all are mutually exclusive");
309
- if (action === "ls" && flags.world === true) {
310
- // An explicit selector is checked below, after positional shape is known.
311
- }
312
- if (typeof flags.limit === "string") {
313
- try {
314
- validateTaskLimit(flags.limit);
315
- }
316
- catch (error) {
317
- fail(error instanceof Error ? error.message : String(error));
218
+ function missingTask(id) {
219
+ return { kind: "refused", refusal: { kind: "task-missing", taskId: id } };
220
+ }
221
+ /**
222
+ * The one CLI edge mapping a Task action with no World to its native refusal answer, then through
223
+ * the matching action renderer and the native exit classifier.
224
+ */
225
+ function missingWorld(command) {
226
+ const output = command.output;
227
+ if (command.action === "show") {
228
+ // An addressed missing read keeps its native null in JSON; text refuses without partial output.
229
+ if (output === "json") {
230
+ writeJson(command.positionals.length === 1 ? null : command.positionals.map(() => null));
231
+ return 1;
318
232
  }
233
+ const refusal = missingTask(command.positionals[0]);
234
+ return emitTask(output, refusal, () => renderTaskShow(refusal, displayContext()), 1);
319
235
  }
320
- if (typeof flags.sort === "string" &&
321
- flags.sort !== "priority" &&
322
- flags.sort !== "created" &&
323
- flags.sort !== "updated" &&
324
- flags.sort !== "id") {
325
- fail("--sort must be priority, created, updated, or id");
236
+ if (isWorldObservationAction(command) || (command.action === "compose" && command.flags.plan === true)) {
237
+ if (output === "json")
238
+ writeJson({ kind: "absent" });
239
+ else
240
+ writeStdout("task world absent");
241
+ return 1;
326
242
  }
327
- if ((action === "ready" || action === "blocked") && typeof flags.parent === "string") {
328
- try {
329
- validateTaskParent(flags.parent);
330
- }
331
- catch (error) {
332
- fail(error instanceof Error ? error.message : String(error));
243
+ if (command.action === "context") {
244
+ const result = { kind: "accepted", value: { namespace: [], source: "default-root" } };
245
+ return emitTask(output, result, () => renderTaskContext(result, displayContext()), taskExitCode(result));
246
+ }
247
+ if (command.action === "tree") {
248
+ const result = missingTask(command.positionals[0]);
249
+ return emitTask(output, result, () => renderTaskTree(result, displayContext()), taskExitCode(result));
250
+ }
251
+ if (command.action === "update") {
252
+ const result = missingTask(command.positionals[0]);
253
+ return emitTask(output, result, () => renderTaskUpdate(result, displayContext()), taskExitCode(result));
254
+ }
255
+ if (command.action === "start" ||
256
+ command.action === "stop" ||
257
+ command.action === "hold" ||
258
+ command.action === "resume") {
259
+ if (command.positionals.length === 1) {
260
+ const result = missingTask(command.positionals[0]);
261
+ return emitTask(output, result, () => renderTaskMutation(command.action, result, displayContext()), taskExitCode(result));
333
262
  }
263
+ const result = {
264
+ items: command.positionals.map((id) => ({ id: id, outcome: missingTask(id) })),
265
+ };
266
+ return emitTask(output, result, () => renderTaskLifecycle(command.action, result, displayContext()), taskExitCode(result));
267
+ }
268
+ if (command.action === "done" || command.action === "drop") {
269
+ const result = {
270
+ items: command.positionals.map((id) => ({ id: id, outcome: missingTask(id) })),
271
+ };
272
+ return emitTask(output, result, () => renderTaskLifecycle(command.action, result, displayContext()), taskExitCode(result));
334
273
  }
274
+ throw new Error(`task action has no missing-world answer: ${command.action}`);
335
275
  }
336
- function validateTaskScan(action, scanned, fail) {
337
- const spec = TASK_COMMAND_SPECS[action], { positionals, flags, stdin } = scanned;
338
- if (positionals.length < spec.arity[0] || positionals.length > spec.arity[1])
339
- fail(`task ${action} has invalid positional arguments`);
340
- if (action === "add" && (stdin === "document") === (positionals.length === 1))
341
- fail("task add requires either TITLE or '-' input");
342
- if (action === "add" &&
343
- stdin === "document" &&
344
- Object.keys(flags).some((name) => name !== "json" && name !== "namespace" && name !== "actor"))
345
- fail("task add document input owns its creation fields");
346
- if (action === "compose" && stdin !== "compose")
347
- fail("task compose requires '-' input");
348
- if (action === "ls" && positionals.length === 1) {
349
- const selector = positionals[0];
350
- if (selector !== "task/" && (!selector.startsWith("task/") || !selector.endsWith("/")))
351
- fail(`invalid Task namespace selector: ${selector}`);
352
- if (selector !== "task/") {
353
- try {
354
- parseTaskNamespaceSelector(selector);
355
- }
356
- catch (error) {
357
- fail(error instanceof Error ? error.message : String(error));
276
+ /**
277
+ * One compose execution outcome: JSON keeps the untouched native value, while an incomplete text
278
+ * answer recovers its draft and puts the diagnostic on stderr.
279
+ */
280
+ function emitCompose(output, result) {
281
+ if (output === "json") {
282
+ writeJson(result);
283
+ return taskExitCode(result);
284
+ }
285
+ if (result.kind === "incomplete") {
286
+ const diagnostic = renderTaskIncompleteDiagnostic(result);
287
+ if (diagnostic.length > 0)
288
+ writeStderr(diagnostic);
289
+ process.stdout.write(result.draft);
290
+ return taskExitCode(result);
291
+ }
292
+ writeStdout(renderTaskCompose(result, displayContext()));
293
+ return taskExitCode(result);
294
+ }
295
+ /** One plural Task lifecycle answer: every verb shares the same batch shape and renderer. */
296
+ async function runBatchLifecycle(tasks, command, verb) {
297
+ const note = value(command, "note");
298
+ const result = await tasks.batch({
299
+ verb,
300
+ ids: command.positionals,
301
+ ...(note === undefined ? {} : { note }),
302
+ });
303
+ return emitTask(command.output, result, () => renderTaskLifecycle(verb, result, displayContext()), taskExitCode(result));
304
+ }
305
+ async function runMutation(input) {
306
+ const { tasks, command, current, stdin, composeMarkdown, composeNamespace } = input;
307
+ if (isWorldObservationAction(command) || command.action === "tree")
308
+ return await runRead(input);
309
+ switch (command.action) {
310
+ case "add": {
311
+ const result = await invokeAdd(input);
312
+ return emitTask(command.output, result, () => renderTaskMutation("add", result, displayContext()), taskExitCode(result));
313
+ }
314
+ case "update": {
315
+ const result = await invokeUpdate(input);
316
+ return emitTask(command.output, result, () => renderTaskUpdate(result, displayContext()), taskExitCode(result));
317
+ }
318
+ case "start":
319
+ case "stop":
320
+ case "resume": {
321
+ const result = await invokeLifecycle(tasks, command.positionals, command.positionals[0], command.action);
322
+ return emitTask(command.output, result, () => renderTaskLifecycle(command.action, result, displayContext()), taskExitCode(result));
323
+ }
324
+ case "hold":
325
+ case "done":
326
+ case "drop":
327
+ return await runBatchLifecycle(tasks, command, command.action);
328
+ case "context": {
329
+ const selected = namespace(command.positionals[0]);
330
+ if (selected !== undefined) {
331
+ await writeTaskNamespaceContext(input.context.writeRoot ?? input.context.directory, selected);
332
+ const resolved = await resolveTaskNamespaceContext(input.context);
333
+ if (typeof resolved === "object" && "kind" in resolved) {
334
+ const result = { kind: "refused", refusal: resolved };
335
+ return emitTask(command.output, result, () => renderTaskContext(result, displayContext()), taskExitCode(result));
336
+ }
337
+ const result = { kind: "accepted", value: resolved };
338
+ return emitTask(command.output, result, () => renderTaskContext(result, displayContext()), taskExitCode(result));
358
339
  }
340
+ const result = {
341
+ kind: "accepted",
342
+ value: { namespace: current ?? [], source: "default-root" },
343
+ };
344
+ return emitTask(command.output, result, () => renderTaskContext(result, displayContext()), taskExitCode(result));
359
345
  }
360
- if (flags.world === true)
361
- fail("--world cannot be combined with an explicit Task namespace selector");
346
+ case "compose": {
347
+ const result = await tasks.compose({
348
+ markdown: composeMarkdown ?? stdin ?? "",
349
+ namespace: composeNamespace ?? current ?? [],
350
+ ...(input.actor === undefined ? {} : { actor: input.actor }),
351
+ ...(command.flags.plan === true ? { plan: true } : {}),
352
+ });
353
+ return emitCompose(command.output, result);
354
+ }
355
+ default:
356
+ throw new Error(`task action has no invocation: ${command.action}`);
362
357
  }
363
- validateTaskReadFlags(action, flags, fail);
364
- if (action === "update")
365
- validateUpdate(scanned, fail);
366
358
  }
367
- export function parseTaskCommand(argv) {
368
- const candidate = argv[0];
369
- if (!isTaskAction(candidate)) {
370
- throw new CliUsageError(`unknown task command: ${candidate ?? ""}`, unknownCommandGuide(TASK_FAMILY_USAGE_GUIDE, candidate ?? ""));
371
- }
372
- const action = candidate;
373
- const fail = (message) => {
374
- throw new CliUsageError(message, taskUsageGuide(action));
375
- };
376
- const scanned = scanTaskArgv(action, argv, fail);
377
- validateTaskScan(action, scanned, fail);
378
- let where;
379
- if (action === "query" && typeof scanned.flags.where === "string") {
380
- try {
381
- where = parseTaskQueryExpression(scanned.flags.where);
359
+ function invokeLifecycle(tasks, taskIds, firstId, verb) {
360
+ return taskIds.length === 1 ? tasks.task({ id: firstId })[verb]() : tasks.batch({ verb, ids: taskIds });
361
+ }
362
+ function establishesWorld(command) {
363
+ return (command.action === "add" ||
364
+ (command.action === "compose" && command.flags.plan !== true) ||
365
+ (command.action === "context" && command.positionals.length > 0));
366
+ }
367
+ /**
368
+ * One CLI edge turning a namespace-context refusal into the addressed action's native refusal
369
+ * answer, rendered through the matching action renderer and classified natively.
370
+ */
371
+ function refuseNamespace(command, refusal) {
372
+ const result = { kind: "refused", refusal };
373
+ switch (command.action) {
374
+ case "ls":
375
+ case "ready":
376
+ case "blocked":
377
+ case "query": {
378
+ const action = command.action;
379
+ return emitTask(command.output, result, () => renderTaskList(action, listPresentation(command), result, displayContext()), taskExitCode(result));
382
380
  }
383
- catch (error) {
384
- fail(error instanceof Error ? error.message : String(error));
381
+ case "add":
382
+ return emitTask(command.output, result, () => renderTaskMutation("add", result, displayContext()), taskExitCode(result));
383
+ case "context":
384
+ return emitTask(command.output, result, () => renderTaskContext(result, displayContext()), taskExitCode(result));
385
+ case "compose":
386
+ return emitTask(command.output, result, () => renderTaskFailure("compose", result, displayContext()), taskExitCode(result));
387
+ default:
388
+ throw new Error(`task action has no namespace refusal: ${command.action}`);
389
+ }
390
+ }
391
+ // eslint-disable-next-line complexity -- this is the single CLI edge ordering world, context, forwarding, and local execution.
392
+ export async function runTaskCommand(command, coordinates, runtime) {
393
+ validateTaskRowView(command);
394
+ const stdinDiagnostic = taskStdinDiagnostic(command);
395
+ const stdin = stdinDiagnostic === undefined ? undefined : await runtime.readStdin();
396
+ if (stdinDiagnostic !== undefined && isBlankInput(stdin ?? ""))
397
+ throw new CliUsageError(stdinDiagnostic);
398
+ const planOnly = command.action === "compose" && command.flags.plan === true;
399
+ const composeMarkdown = command.action === "compose" ? stdin : undefined;
400
+ const composition = composeMarkdown === undefined ? undefined : taskCompositionNamespaceHeader(composeMarkdown);
401
+ const explicitNamespace = command.action === "add"
402
+ ? namespace(value(command, "namespace"))
403
+ : command.action === "compose" && composition?.specified
404
+ ? composition.namespace
405
+ : undefined;
406
+ const actor = actorFromEdge(typeof command.flags.actor === "string" ? command.flags.actor : undefined, runtime.environment);
407
+ const world = coordinates.world ??
408
+ (planOnly ? coordinates.candidateWorld : establishesWorld(command) ? await coordinates.establishWorld() : null);
409
+ if (world === null)
410
+ return missingWorld(command);
411
+ const tasks = tasksWithExecution(world, runtime.execution);
412
+ const contextSensitive = command.action === "context" ||
413
+ (command.action === "add" && explicitNamespace === undefined) ||
414
+ (command.action === "compose" && composition?.specified !== true) ||
415
+ (((command.action === "ls" && explicitListNamespace(command) === undefined) ||
416
+ command.action === "ready" ||
417
+ command.action === "blocked" ||
418
+ command.action === "query") &&
419
+ command.flags.world !== true);
420
+ let current;
421
+ if (contextSensitive) {
422
+ const resolved = await resolveTaskNamespaceContext(coordinates.taskContext);
423
+ if (typeof resolved === "object" && "kind" in resolved)
424
+ return refuseNamespace(command, resolved);
425
+ current = resolved.namespace;
426
+ if (command.action === "context" && command.positionals.length === 0) {
427
+ const result = { kind: "accepted", value: resolved };
428
+ return emitTask(command.output, result, () => renderTaskContext(result, displayContext()), taskExitCode(result));
385
429
  }
386
430
  }
387
- return {
388
- command: "task",
389
- action,
390
- output: scanned.flags.json === true ? "json" : "text",
391
- ...scanned,
392
- ...(where === undefined ? {} : { where }),
393
- };
431
+ if (command.action === "show")
432
+ return await runShow(command, tasks);
433
+ return await runMutation({
434
+ tasks,
435
+ command,
436
+ runtime,
437
+ context: coordinates.taskContext,
438
+ ...(actor === undefined ? {} : { actor }),
439
+ ...(current === undefined ? {} : { current }),
440
+ ...(stdin === undefined ? {} : { stdin }),
441
+ ...(composeMarkdown === undefined ? {} : { composeMarkdown }),
442
+ ...(explicitNamespace === undefined ? {} : { composeNamespace: explicitNamespace }),
443
+ });
394
444
  }