@rse/ase 1.0.7 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/dst/ase-agent-definition-api.d.ts +184 -0
  2. package/dst/ase-agent-definition-api.js +6 -0
  3. package/dst/ase-agent-definition-builtin/condenser.js +42 -0
  4. package/dst/ase-agent-definition-builtin/editor.js +45 -0
  5. package/dst/ase-agent-definition-builtin/estimator.js +98 -0
  6. package/dst/ase-agent-definition-builtin/implementer.js +121 -0
  7. package/dst/ase-agent-definition-builtin/integrator.js +56 -0
  8. package/dst/ase-agent-definition-builtin/qualifier.js +61 -0
  9. package/dst/ase-agent-definition-builtin/rebooter.js +41 -0
  10. package/dst/ase-agent-definition-builtin/researcher.js +77 -0
  11. package/dst/ase-agent-definition-core.js +827 -0
  12. package/dst/ase-agent-fleet.js +772 -0
  13. package/dst/ase-agent-process.js +232 -0
  14. package/dst/ase-agent-relay-client.js +509 -0
  15. package/dst/ase-agent-relay-core.js +213 -0
  16. package/dst/ase-agent-relay-server-bind.js +242 -0
  17. package/dst/ase-agent-relay-server-cli.js +50 -0
  18. package/dst/ase-agent-runtime-claim.js +189 -0
  19. package/dst/ase-agent-runtime-engine.js +1100 -0
  20. package/dst/ase-agent-runtime-exec.js +275 -0
  21. package/dst/ase-agent-runtime-phase.js +581 -0
  22. package/dst/ase-agent-runtime-request.js +272 -0
  23. package/dst/ase-agent-runtime-tool.js +207 -0
  24. package/dst/ase-agent-runtime.js +1316 -0
  25. package/dst/ase-agent.js +65 -0
  26. package/dst/ase-artifact.js +6 -5
  27. package/dst/ase-config-core.js +465 -0
  28. package/dst/ase-config-schema.js +351 -0
  29. package/dst/ase-config-scope.js +172 -0
  30. package/dst/ase-config.js +25 -585
  31. package/dst/ase-hook.js +228 -111
  32. package/dst/ase-lib-daemon-cli.js +130 -0
  33. package/dst/ase-lib-hash.js +20 -0
  34. package/dst/{ase-log.js → ase-lib-log.js} +40 -7
  35. package/dst/ase-lib-server-bind.js +115 -0
  36. package/dst/ase-lib-server-cli.js +474 -0
  37. package/dst/{ase-table.js → ase-lib-table.js} +1 -1
  38. package/dst/{ase-version.js → ase-lib-version.js} +3 -0
  39. package/dst/ase-man.js +96 -0
  40. package/dst/ase-mcp.js +166 -13
  41. package/dst/{ase-getopt.js → ase-service-getopt.js} +82 -80
  42. package/dst/{ase-markdown.js → ase-service-markdown.js} +18 -11
  43. package/dst/ase-service-otel.js +1246 -0
  44. package/dst/{ase-skills.js → ase-service-skills.js} +29 -64
  45. package/dst/ase-service-state.js +101 -0
  46. package/dst/ase-service.js +251 -76
  47. package/dst/ase-setup-common.js +141 -0
  48. package/dst/ase-setup-mcp.js +359 -0
  49. package/dst/ase-setup-settings.js +837 -0
  50. package/dst/ase-setup.js +113 -869
  51. package/dst/ase-spec.js +31 -19
  52. package/dst/ase-statusline.js +108 -43
  53. package/dst/ase-task-board-core.js +739 -0
  54. package/dst/ase-task-board-filter.js +127 -0
  55. package/dst/ase-task-board-flow.js +237 -0
  56. package/dst/ase-task-board-graph.js +497 -0
  57. package/dst/ase-task-board-stats.js +263 -0
  58. package/dst/ase-task-board-tui-control.js +775 -0
  59. package/dst/ase-task-board-tui-model.js +1008 -0
  60. package/dst/ase-task-board-tui-popup.js +626 -0
  61. package/dst/ase-task-board-tui-style.js +106 -0
  62. package/dst/ase-task-board-tui-view.js +847 -0
  63. package/dst/ase-task-board-tui.js +189 -0
  64. package/dst/ase-task-board-web-client.css +1 -0
  65. package/dst/ase-task-board-web-client.html +20 -0
  66. package/dst/ase-task-board-web-client.js +81 -0
  67. package/dst/ase-task-board-web-server.js +823 -0
  68. package/dst/ase-task-board.js +134 -0
  69. package/dst/ase-task-format.js +757 -0
  70. package/dst/ase-task-request.js +208 -0
  71. package/dst/ase-task-store-client.js +495 -0
  72. package/dst/ase-task-store-core.js +804 -0
  73. package/dst/ase-task-store-issues.js +237 -0
  74. package/dst/ase-task-store-plugin-api.js +6 -0
  75. package/dst/ase-task-store-plugin-ase.js +484 -0
  76. package/dst/ase-task-store-plugin-delegate.js +137 -0
  77. package/dst/ase-task-store-plugin-gitea.js +666 -0
  78. package/dst/ase-task-store-plugin-github.js +696 -0
  79. package/dst/ase-task-store-plugin-gitlab.js +668 -0
  80. package/dst/ase-task-store-server-bind.js +538 -0
  81. package/dst/ase-task-store-server-cli.js +154 -0
  82. package/dst/ase-task.js +1335 -357
  83. package/dst/{ase-compat.js → ase-util-compat.js} +2 -2
  84. package/dst/{ase-diagram.js → ase-util-diagram.js} +107 -32
  85. package/dst/{ase-meta.js → ase-util-meta.js} +2 -2
  86. package/dst/{ase-metric.js → ase-util-metric.js} +2 -2
  87. package/dst/{ase-mint.js → ase-util-mint.js} +19 -12
  88. package/dst/{ase-worktree.js → ase-util-worktree.js} +30 -19
  89. package/dst/ase-util.js +20 -0
  90. package/dst/ase.js +108 -32
  91. package/dst/man/ase-agent-adhoc.1 +515 -0
  92. package/dst/man/ase-agent-condenser.1 +193 -0
  93. package/dst/man/ase-agent-editor.1 +212 -0
  94. package/dst/man/ase-agent-estimator.1 +214 -0
  95. package/dst/man/ase-agent-fleet.1 +185 -0
  96. package/dst/man/ase-agent-implementer.1 +233 -0
  97. package/dst/man/ase-agent-integrator.1 +213 -0
  98. package/dst/man/ase-agent-qualifier.1 +214 -0
  99. package/dst/man/ase-agent-rebooter.1 +193 -0
  100. package/dst/man/ase-agent-relay.1 +128 -0
  101. package/dst/man/ase-agent-researcher.1 +217 -0
  102. package/dst/man/ase-agent.1 +264 -0
  103. package/dst/man/ase-artifact-list.1 +38 -0
  104. package/dst/man/ase-artifact-name.1 +39 -0
  105. package/dst/man/ase-artifact.1 +56 -0
  106. package/dst/man/ase-config-delete.1 +45 -0
  107. package/dst/man/ase-config-edit.1 +48 -0
  108. package/dst/man/ase-config-get.1 +46 -0
  109. package/dst/man/ase-config-init.1 +60 -0
  110. package/dst/man/ase-config-list.1 +42 -0
  111. package/dst/man/ase-config-set.1 +52 -0
  112. package/dst/man/ase-config.1 +225 -0
  113. package/dst/man/ase-hook-permission-request.1 +36 -0
  114. package/dst/man/ase-hook-pre-tool-use.1 +59 -0
  115. package/dst/man/ase-hook-session-end.1 +47 -0
  116. package/dst/man/ase-hook-session-persona.1 +37 -0
  117. package/dst/man/ase-hook-session-start.1 +81 -0
  118. package/dst/man/ase-hook-stop.1 +34 -0
  119. package/dst/man/ase-hook-user-prompt-submit.1 +34 -0
  120. package/dst/man/ase-hook.1 +51 -0
  121. package/dst/man/ase-man.1 +67 -0
  122. package/dst/man/ase-mcp.1 +61 -0
  123. package/dst/man/ase-service-log.1 +43 -0
  124. package/dst/man/ase-service-send.1 +47 -0
  125. package/dst/man/ase-service-start.1 +54 -0
  126. package/dst/man/ase-service-status.1 +46 -0
  127. package/dst/man/ase-service-stop.1 +37 -0
  128. package/dst/man/ase-service.1 +85 -0
  129. package/dst/man/ase-setup-disable.1 +44 -0
  130. package/dst/man/ase-setup-enable.1 +45 -0
  131. package/dst/man/ase-setup-install.1 +73 -0
  132. package/dst/man/ase-setup-mcp.1 +124 -0
  133. package/dst/man/ase-setup-status.1 +60 -0
  134. package/dst/man/ase-setup-statusline.1 +92 -0
  135. package/dst/man/ase-setup-telemetry.1 +92 -0
  136. package/dst/man/ase-setup-uninstall.1 +59 -0
  137. package/dst/man/ase-setup-update.1 +64 -0
  138. package/dst/man/ase-setup.1 +93 -0
  139. package/dst/man/ase-spec-export.1 +62 -0
  140. package/dst/man/ase-spec-lint.1 +40 -0
  141. package/dst/man/ase-spec-preview.1 +40 -0
  142. package/dst/man/ase-spec.1 +46 -0
  143. package/dst/man/ase-statusline.1 +189 -0
  144. package/dst/man/ase-task-assign.1 +71 -0
  145. package/dst/man/ase-task-board.1 +384 -0
  146. package/dst/man/ase-task-delete.1 +35 -0
  147. package/dst/man/ase-task-edit.1 +46 -0
  148. package/dst/man/ase-task-idscheme.1 +65 -0
  149. package/dst/man/ase-task-lifecycle.1 +57 -0
  150. package/dst/man/ase-task-list.1 +47 -0
  151. package/dst/man/ase-task-load.1 +36 -0
  152. package/dst/man/ase-task-newid.1 +61 -0
  153. package/dst/man/ase-task-purge.1 +37 -0
  154. package/dst/man/ase-task-rename.1 +44 -0
  155. package/dst/man/ase-task-request.1 +61 -0
  156. package/dst/man/ase-task-save.1 +48 -0
  157. package/dst/man/ase-task-status.1 +55 -0
  158. package/dst/man/ase-task-store.1 +194 -0
  159. package/dst/man/ase-task-view.1 +40 -0
  160. package/dst/man/ase-task.1 +160 -0
  161. package/dst/man/ase-util-compat.1 +25 -0
  162. package/dst/man/ase-util-diagram.1 +76 -0
  163. package/dst/man/ase-util-meta.1 +45 -0
  164. package/dst/man/ase-util-metric.1 +54 -0
  165. package/dst/man/ase-util-mint.1 +59 -0
  166. package/dst/man/ase-util-worktree.1 +72 -0
  167. package/dst/man/ase-util.1 +50 -0
  168. package/dst/man/ase.1 +124 -0
  169. package/package.json +79 -21
  170. package/plugin/.claude-plugin/plugin.json +1 -1
  171. package/plugin/.codex-plugin/plugin.json +1 -1
  172. package/plugin/.github/plugin/plugin.json +1 -1
  173. package/plugin/agents/ase-meta-diagram.md +12 -8
  174. package/plugin/agents/ase-repo-review.md +322 -0
  175. package/plugin/hooks/hooks-codex.json +5 -0
  176. package/plugin/hooks/hooks-copilot.json +5 -0
  177. package/plugin/hooks/hooks.json +8 -0
  178. package/plugin/meta/ase-common-approach.md +117 -0
  179. package/plugin/meta/ase-common-changeset.md +256 -0
  180. package/plugin/meta/ase-common-code.md +10 -173
  181. package/plugin/meta/ase-common-grill.md +317 -0
  182. package/plugin/meta/ase-common-resolve.md +305 -0
  183. package/plugin/meta/ase-common-task.md +83 -4
  184. package/plugin/meta/ase-constitution.md +0 -2
  185. package/plugin/meta/ase-format-specbook.md +208 -25
  186. package/plugin/meta/ase-format-specbook.yaml +242 -851
  187. package/plugin/meta/ase-format-task.md +669 -125
  188. package/plugin/meta/ase-persona.md +3 -4
  189. package/plugin/meta/ase-skill.md +9 -0
  190. package/plugin/mods/ase-mods.ts +409 -0
  191. package/plugin/mods/claude-code.d.ts +13417 -0
  192. package/plugin/skills/ase-arch-analyze/SKILL.md +1 -1
  193. package/plugin/skills/ase-arch-analyze/help.md +2 -2
  194. package/plugin/skills/ase-code-analyze/SKILL.md +59 -8
  195. package/plugin/skills/ase-code-analyze/help.md +29 -4
  196. package/plugin/skills/ase-code-edit/SKILL.md +107 -181
  197. package/plugin/skills/ase-code-edit/help.md +118 -31
  198. package/plugin/skills/ase-code-lint/SKILL.md +64 -13
  199. package/plugin/skills/ase-code-lint/help.md +32 -2
  200. package/plugin/skills/ase-docs-proofread/SKILL.md +4 -4
  201. package/plugin/skills/ase-docs-proofread/help.md +1 -1
  202. package/plugin/skills/ase-docs-refine/SKILL.md +4 -4
  203. package/plugin/skills/ase-docs-shorten/SKILL.md +4 -4
  204. package/plugin/skills/ase-help-intent/data.md +2164 -1087
  205. package/plugin/skills/ase-help-intent/help.md +1 -1
  206. package/plugin/skills/ase-help-skill/catalog.md +12 -9
  207. package/plugin/skills/ase-meta-brainstorm/SKILL.md +1 -1
  208. package/plugin/skills/ase-meta-config/SKILL.md +3 -4
  209. package/plugin/skills/ase-meta-config/help.md +31 -10
  210. package/plugin/skills/ase-meta-mint/SKILL.md +5 -5
  211. package/plugin/skills/ase-meta-mint/help.md +10 -5
  212. package/plugin/skills/ase-meta-why/help.md +1 -1
  213. package/plugin/skills/ase-meta-workflow/SKILL.md +7 -7
  214. package/plugin/skills/ase-meta-workflow/help.md +4 -4
  215. package/plugin/skills/ase-meta-workflow/sample.md +3 -3
  216. package/plugin/skills/ase-meta-workflow/workflow.txt +22 -18
  217. package/plugin/skills/{ase-meta-changelog → ase-repo-changelog}/SKILL.md +4 -3
  218. package/plugin/skills/{ase-meta-changelog → ase-repo-changelog}/help.md +5 -5
  219. package/plugin/skills/{ase-meta-commit → ase-repo-commit}/SKILL.md +6 -6
  220. package/plugin/skills/{ase-meta-commit → ase-repo-commit}/help.md +5 -5
  221. package/plugin/skills/{ase-meta-diff → ase-repo-diff}/SKILL.md +6 -6
  222. package/plugin/skills/{ase-meta-diff → ase-repo-diff}/help.md +8 -8
  223. package/plugin/skills/{ase-code-dissect → ase-repo-dissect}/SKILL.md +19 -19
  224. package/plugin/skills/{ase-code-dissect → ase-repo-dissect}/help.md +10 -12
  225. package/plugin/skills/ase-repo-merge/SKILL.md +346 -0
  226. package/plugin/skills/ase-repo-merge/help.md +107 -0
  227. package/plugin/skills/ase-repo-resolve/SKILL.md +158 -0
  228. package/plugin/skills/ase-repo-resolve/help.md +102 -0
  229. package/plugin/skills/ase-repo-review/SKILL.md +406 -0
  230. package/plugin/skills/ase-repo-review/help.md +181 -0
  231. package/plugin/skills/ase-spec-edit/SKILL.md +117 -183
  232. package/plugin/skills/ase-spec-edit/help.md +107 -26
  233. package/plugin/skills/ase-sync-reconcile/help.md +1 -1
  234. package/plugin/skills/ase-task-assign/SKILL.md +111 -0
  235. package/plugin/skills/ase-task-assign/help.md +119 -0
  236. package/plugin/skills/ase-task-condense/SKILL.md +21 -21
  237. package/plugin/skills/ase-task-condense/help.md +12 -10
  238. package/plugin/skills/ase-task-delete/SKILL.md +1 -1
  239. package/plugin/skills/ase-task-dissect/SKILL.md +71 -48
  240. package/plugin/skills/ase-task-dissect/help.md +10 -9
  241. package/plugin/skills/ase-task-edit/SKILL.md +379 -94
  242. package/plugin/skills/ase-task-edit/help.md +95 -22
  243. package/plugin/skills/ase-task-estimate/SKILL.md +492 -0
  244. package/plugin/skills/ase-task-estimate/help.md +158 -0
  245. package/plugin/skills/ase-task-grill/SKILL.md +246 -138
  246. package/plugin/skills/ase-task-grill/help.md +129 -26
  247. package/plugin/skills/ase-task-id/SKILL.md +8 -1
  248. package/plugin/skills/ase-task-id/help.md +6 -3
  249. package/plugin/skills/ase-task-implement/SKILL.md +535 -145
  250. package/plugin/skills/ase-task-implement/help.md +138 -47
  251. package/plugin/skills/ase-task-integrate/SKILL.md +549 -0
  252. package/plugin/skills/ase-task-integrate/help.md +187 -0
  253. package/plugin/skills/ase-task-list/SKILL.md +55 -23
  254. package/plugin/skills/ase-task-list/help.md +45 -21
  255. package/plugin/skills/ase-task-reboot/SKILL.md +84 -43
  256. package/plugin/skills/ase-task-reboot/help.md +28 -8
  257. package/plugin/skills/ase-task-rename/SKILL.md +10 -2
  258. package/plugin/skills/ase-task-research/SKILL.md +386 -0
  259. package/plugin/skills/ase-task-research/help.md +102 -0
  260. package/plugin/skills/ase-task-status/SKILL.md +137 -0
  261. package/plugin/skills/ase-task-status/help.md +80 -0
  262. package/plugin/skills/ase-task-view/SKILL.md +49 -24
  263. package/plugin/skills/ase-task-view/help.md +19 -9
  264. package/plugin/agents/ase-meta-review.md +0 -187
  265. package/plugin/skills/ase-code-craft/SKILL.md +0 -264
  266. package/plugin/skills/ase-code-craft/help.md +0 -122
  267. package/plugin/skills/ase-code-refactor/SKILL.md +0 -232
  268. package/plugin/skills/ase-code-refactor/help.md +0 -109
  269. package/plugin/skills/ase-code-resolve/SKILL.md +0 -289
  270. package/plugin/skills/ase-code-resolve/help.md +0 -116
  271. package/plugin/skills/ase-meta-review/SKILL.md +0 -210
  272. package/plugin/skills/ase-meta-review/help.md +0 -96
  273. package/plugin/skills/ase-task-preflight/SKILL.md +0 -166
  274. package/plugin/skills/ase-task-preflight/help.md +0 -82
  275. /package/dst/{ase-ignore.js → ase-lib-ignore.js} +0 -0
  276. /package/dst/{ase-stdio.js → ase-lib-stdio.js} +0 -0
  277. /package/dst/{ase-kv.js → ase-service-kv.js} +0 -0
  278. /package/dst/{ase-sleep.js → ase-service-sleep.js} +0 -0
  279. /package/dst/{ase-timestamp.js → ase-service-timestamp.js} +0 -0
@@ -0,0 +1,214 @@
1
+ .TH "ASE-AGENT-QUALIFIER" "1" "October 2026" "2.0.0" "Agentic Software Engineering (ASE)"
2
+ .SH "NAME"
3
+ \fBase-agent-qualifier\fR - Qualification Phase Agent
4
+ .SH "SYNOPSIS"
5
+ .P
6
+ \fBase agent qualifier start\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB] \[lB]\fB-t\fR|\fB--tool\fR \fBclaude\fR|\fBcopilot\fR|\fBcodex\fR\[rB] \[lB]\fB-p\fR|\fB--parallel\fR \fInum\fR\[rB] \[lB]\fB-T\fR|\fB--timeout\fR \fIduration\fR\[rB] \[lB]\fB-o\fR|\fB--one-shot\fR\[rB] \[lB]\fB--agent-relay\fR \fIurl\fR\[rB] \[lB]\fB-r\fR|\fB--repo\fR \fIurl\fR\[rB] \[lB]\fB-d\fR|\fB--tempdir\fR \fIdir\fR\[rB] \[lB]\fB-m\fR|\fB--mode\fR \fBjudge\fR|\fBqualify\fR\[rB] \[lB]\fB--\fR\fIgroup\fR\fB-\fR\fIitem\fR \fIvalue\fR \[lB]...\[rB]\[rB] \[lB]\fB-f\fR|\fB--foreground\fR\[rB]
7
+ .P
8
+ \fBase agent qualifier status\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]
9
+ .P
10
+ \fBase agent qualifier log\fR \[lB]\fB-f\fR|\fB--follow\fR\[rB] \[lB]\fB-n\fR|\fB--lines\fR \fIn\fR\[rB] \[lB]\fB--name\fR \fIname\fR\[rB]
11
+ .P
12
+ \fBase agent qualifier stop\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]
13
+ .SH "DESCRIPTION"
14
+ .P
15
+ \fBase agent qualifier\fR drives the \fBQualification\fR phase of the \fBenterprise\fR task lifecycle model (refused for any other model).
16
+ .P
17
+ It claims every task in the state \fBIMPLEMENTED\fR which is unassigned or assigned to the agent, which does not carry any tag \fBase-agent-qualifier\fR yet (i.e., without its verdict yet, so a task already carrying a verdict of the qualifier is never picked up again), and whose \fBAfter:\fR predecessors (and, for an explicit epic, its group members) are \fBQUALIFIED\fR or later, moves it into \fBQUALIFYING\fR, and reviews its \fBChangeset:\fR (or the configured \fBproject.task.default.changeset\fR) via the skill \fBase-repo-review\fR:
18
+ .RS 0
19
+ .IP \(bu 4
20
+ \fBworktree\fR: The change set staged in its working copy, i.e., the Git worktree \fB.ase/worktree/\fR\fIid\fR of a parallel implementer if existing, else the working copy of the project.
21
+ .IP \(bu 4
22
+ \fBbranch:\fR\fIname\fR: The branch against its base, via \fBase-repo-review
23
+ --branch\fR \fIname\fR.
24
+ .IP \(bu 4
25
+ \fBattachment:\fR\fIname\fR: The change set staged in a temporary Git worktree, detached at the \fBbase\fR commit of the attachment and removed afterwards.
26
+ .RE 0
27
+ .P
28
+ The verdict \fBAPPROVE\fR resp. \fBREJECT\fR of the review (the last upper-case word after the label \fBREVIEW VERDICT\fR in the output of the successfully exited agent tool) is added as the tag \fBase-agent-qualifier:approve\fR resp. \fBase-agent-qualifier:reject\fR, while a failed or skipped review, which yields no verdict, adds the plain tag \fBase-agent-qualifier\fR.
29
+ .P
30
+ In the default mode \fBjudge\fR, the task is then put back into \fBIMPLEMENTED\fR for a human decision, while in mode \fBqualify\fR, it is put into \fBQUALIFIED\fR on the verdict \fBAPPROVE\fR, into \fBDECLINED\fR on the verdict \fBREJECT\fR, and back into \fBIMPLEMENTED\fR without a verdict. In both modes, the task is unassigned afterwards.
31
+ .P
32
+ On an interrupt, a task being processed is put back, untagged and with its previous assignee, into \fBIMPLEMENTED\fR. See \fBase-agent\fR(1) for the common mechanics of all agents.
33
+ .SH "OPTIONS"
34
+ .RS 0
35
+ .IP \(bu 4
36
+ \[lB]\fB-h\fR|\fB--help\fR\[rB]: Show usage information of \fBase agent qualifier\fR (or of the given sub-command) only.
37
+ .RE 0
38
+ .P
39
+ All other options belong to the sub-commands (see \fBCOMMANDS\fR).
40
+ .SH "COMMANDS"
41
+ .RS 0
42
+ .IP \(bu 4
43
+ \fBase agent qualifier start\fR \[lB]\fIoptions\fR\[rB]: Start the qualifier agent in the background, logging into \fB.ase/agent/\fR\fIname\fR\fB.log\fR. The agent is validated and initialized (e.g., its agent tool is looked up and the task lifecycle model is checked) before the command returns (waiting up to 30 seconds), so a failing agent is reported together with the tail of its log. An agent of the same name already running is left alone. The options are:
44
+ .RS 4
45
+ .IP \(bu 4
46
+ \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]: The name of the agent (default: \fBqualifier\fR): up to 64 letters, digits, underscores, and dashes, starting with a letter or digit, other than the name of another agent kind, \fBrelay\fR, or \fBfleet\fR. It names the agent in its log lines (also in the shared processing log attachment \fBagent\fR), the \fBAssignee:\fR of the tasks it processes, its temporary directory, and its process files \fB.ase/agent/\fR\fIname\fR\fB.yaml\fR and \fB.ase/agent/\fR\fIname\fR\fB.log\fR.
47
+ .sp
48
+ Agents of the kind \fBqualifier\fR under different names form a pool, competing for the same tasks and processing them in parallel to each other.
49
+ .IP \(bu 4
50
+ \[lB]\fB-t\fR|\fB--tool\fR \fItool\fR\[rB]: The headless agent tool processing the tasks: \fBclaude\fR (\fIAnthropic Claude Code CLI\fR), \fBcopilot\fR (\fIGitHub Copilot CLI\fR), or \fBcodex\fR (\fIOpenAI Codex CLI\fR) (default: \fB$ASE_TOOL\fR, else \fBclaude\fR). Its command has to be found in \fB$PATH\fR.
51
+ .IP \(bu 4
52
+ \[lB]\fB-p\fR|\fB--parallel\fR \fInum\fR\[rB]: The maximum number of tasks processed in parallel by this agent (default: \fB1\fR), a positive integer.
53
+ .IP \(bu 4
54
+ \[lB]\fB-T\fR|\fB--timeout\fR \fIduration\fR\[rB]: The maximum duration of processing a task (the run of the agent tool), as \fInumber\fR \fIunit\fR (without a space) with \fIunit\fR \fBs\fR (seconds), \fBm\fR (minutes), or \fBh\fR (hours) (default: \fB60m\fR). A processing exceeding it is aborted and counts as failed.
55
+ .IP \(bu 4
56
+ \[lB]\fB-o\fR|\fB--one-shot\fR\[rB]: Terminate the agent, instead of observing for further tasks, once a check of the task store finds no dispatchable task while the agent processes no task anymore -- intended for CI contexts like GitHub Actions, and not allowed in a fleet. A task still waiting for its predecessors at that time is left for a later run. A check of the task store failing three times in a row then terminates the agent with a non-zero exit status (instead of being retried endlessly after a growing delay).
57
+ .IP \(bu 4
58
+ \[lB]\fB--agent-relay\fR \fIurl\fR\[rB]: The agent relay to pass the live presence of the agent to, as \fBase://\fR\fIaddr\fR\fB:\fR\fIport\fR\[lB]\fB/\fR\fItoken\fR\[rB] resp. \fBases://\fR\fIaddr\fR\fB:\fR\fIport\fR\[lB]\fB/\fR\fItoken\fR\[rB]\[lB]\fB?insecure\fR\[rB] for HTTPS (default: the configured \fBproject.relay.url\fR, else none). See \fBAGENT RELAY\fR in \fBase-agent\fR(1).
59
+ .IP \(bu 4
60
+ \[lB]\fB-r\fR|\fB--repo\fR \fIurl\fR\[rB]: The Git repository to clone once into the temporary directory of the agent, where every task without a \fBworktree\fR value is processed in its own temporary Git worktree of this clone, and changed branches are pushed back to its origin (default: none, i.e., all tasks are processed in the Git working copy the agent is started in, which is hence mandatory).
61
+ .sp
62
+ Requires a task store not located in the working copy (i.e., not a local \fBase:\fR\fIpath\fR one). See \fBWORKING COPY, CLONES, AND WORKTREES\fR in \fBase-agent\fR(1).
63
+ .IP \(bu 4
64
+ \[lB]\fB-d\fR|\fB--tempdir\fR \fIdir\fR\[rB]: Create the temporary directory of the agent as the sub-directory \fIname\fR of \fIdir\fR, where \fB%p\fR is expanded to the process id of the agent, \fB%h\fR to a hash value unique to the process, and \fB%%\fR to \fB%\fR (default: a fresh, private directory below the system temporary directory). A missing \fIdir\fR is created private to the current user, while an existing \fIdir\fR has to be a directory (no symbolic link) owned by the current user.
65
+ .IP \(bu 4
66
+ \[lB]\fB-m\fR|\fB--mode\fR \fImode\fR\[rB]: The mode of the agent (default: \fBjudge\fR): \fBjudge\fR just adds the verdict tag and puts the task back into \fBIMPLEMENTED\fR for a human decision, while \fBqualify\fR additionally qualifies resp. declines the task by its verdict, i.e., puts it into \fBQUALIFIED\fR on the verdict \fBAPPROVE\fR, into \fBDECLINED\fR on the verdict \fBREJECT\fR, and back into \fBIMPLEMENTED\fR without a verdict. An invalid mode is an error.
67
+ .IP \(bu 4
68
+ \[lB]\fB--title\fR \fItext\fR\[rB]: The one-line title of the operation of the agent (at most 80 characters), shown on the task boards. Built-in: \fBReview implemented tasks and tag their verdict\fR (\fBjudge\fR) resp. \fBReview implemented tasks and decide by verdict\fR (\fBqualify\fR).
69
+ .IP \(bu 4
70
+ \[lB]\fB--description\fR \fItext\fR\[rB]: The brief description of the operation of the agent (about 3-6 lines, at most 600 characters, with its whitespace collapsed), shown on the task boards. Built-in: a description of the operation of the mode.
71
+ .IP \(bu 4
72
+ \[lB]\fB--type\fR \fBphase\fR|\fBrequest\fR\[rB]: The processing type: \fBphase\fR claims the tasks by their lifecycle status, \fBrequest\fR processes the prompt requests attached to the tasks. Generic default: \fBphase\fR. Built-in: \fBphase\fR.
73
+ .IP \(bu 4
74
+ \[lB]\fB--workdir\fR \fIkind\fR\[rB]: The working directory of the agent tool: \fBproject\fR, \fBsource\fR, \fBchangeset\fR, \fBchangeset-read\fR, or \fBtarget\fR. Generic default: \fBproject\fR. Built-in: \fBchangeset-read\fR.
75
+ .IP \(bu 4
76
+ \[lB]\fB--lifecycle\fR \fImodel\fR\[rB]: A supported task lifecycle model (\fBsolo\fR, \fBteam\fR, or \fBenterprise\fR, repeatable). Generic default: every model containing all given states, resp. all models for \fBrequest\fR and with \fB--unclaimed\fR. Built-in: \fBenterprise\fR.
77
+ .IP \(bu 4
78
+ \[lB]\fB--serial\fR\[rB]: Process the tasks serially only, ignoring \fB--parallel\fR. Built-in: not set.
79
+ .IP \(bu 4
80
+ \[lB]\fB--unclaimed\fR\[rB]: Process the tasks of the incoming states without claiming them, independent of their assignee and predecessors, and without ever changing their status and assignee (\fBphase\fR only). Built-in: not set. Not allowed, as the qualifier claims the tasks into its activity state.
81
+ .IP \(bu 4
82
+ \[lB]\fB--params\fR \fIname\fR\fB=\fR\fIvalue\fR\[rB]: The value of a parameter declared by the definition (repeatable). Built-in: none declared.
83
+ .IP \(bu 4
84
+ \[lB]\fB--state-incoming\fR \fIstate\fR\[rB]: The state of the tasks to claim (mandatory for \fBphase\fR, repeatable with \fB--unclaimed\fR only). Built-in: \fBIMPLEMENTED\fR.
85
+ .IP \(bu 4
86
+ \[lB]\fB--state-activity\fR \fIstate\fR\[rB]: The state of a task during its processing. Generic default: the incoming state. Built-in: \fBQUALIFYING\fR.
87
+ .IP \(bu 4
88
+ \[lB]\fB--state-success\fR \fIstate\fR\[rB]: The target state on success. Generic default: the incoming state. Built-in: \fBIMPLEMENTED\fR.
89
+ .IP \(bu 4
90
+ \[lB]\fB--state-failure\fR \fIstate\fR\[rB]: The target state on failure. Generic default: the incoming state. Built-in: \fBIMPLEMENTED\fR.
91
+ .IP \(bu 4
92
+ \[lB]\fB--state-phase\fR \fIstate\fR\[rB]: The phase success state, into which the skill itself can move a task. Generic default: the success state. Built-in: \fBQUALIFIED\fR.
93
+ .IP \(bu 4
94
+ \[lB]\fB--state-passed\fR \fIstate\fR\[rB]: The first state from which on a task has passed the phase for its \fBAfter:\fR successors. Generic default: the phase success state. Built-in: \fBQUALIFIED\fR.
95
+ .IP \(bu 4
96
+ \[lB]\fB--state-verdict\fR \fIVERDICT\fR\fB=\fR\fIstate\fR\[rB]: The target state per verdict (repeatable). Built-in: not set (mode \fBjudge\fR), \fBAPPROVE=QUALIFIED\fR and \fBREJECT=DECLINED\fR (mode \fBqualify\fR).
97
+ .IP \(bu 4
98
+ \[lB]\fB--tag-name\fR \fItag\fR\[rB]: The tag of the processed tasks (\fBase-agent-\fR\fIword\fR). Generic default: \fBase-agent-\fR\fIname\fR, resp. for \fBrequest\fR always \fBase-agent-\fR\fIrequest-name\fR. Built-in: \fBase-agent-qualifier\fR.
99
+ .IP \(bu 4
100
+ \[lB]\fB--tag-success\fR \fItag\fR\[rB]: The tag on success: \fItag-name\fR, \fItag-name\fR\fB:\fR\fIvalue\fR, or \fBnone\fR (\fBphase\fR only). Generic default: \fItag-name\fR. Built-in: not set.
101
+ .IP \(bu 4
102
+ \[lB]\fB--tag-failure\fR \fItag\fR\[rB]: The tag on failure: \fItag-name\fR, \fItag-name\fR\fB:\fR\fIvalue\fR, or \fBnone\fR (\fBphase\fR only). Generic default: \fItag-name\fR. Built-in: not set.
103
+ .IP \(bu 4
104
+ \[lB]\fB--tag-require\fR \fItag\fR\[rB]: A tag a claimable task has to carry (repeatable). Built-in: not set.
105
+ .IP \(bu 4
106
+ \[lB]\fB--tag-exclude\fR \fItag\fR\[rB]: A tag a claimable task must not carry (repeatable). Built-in: not set.
107
+ .IP \(bu 4
108
+ \[lB]\fB--tag-retry\fR\[rB]: A shorthand for \fB--tag-failure none\fR, so a failed task is claimed again after a growing delay (\fBphase\fR only). Built-in: not set.
109
+ .IP \(bu 4
110
+ \[lB]\fB--assign-name\fR \fIwho\fR\[rB]: The assignee under which the tasks are claimed, held, recognized, and released, and which names the agent-owned worktrees. Generic default: the agent name. Built-in: not set.
111
+ .IP \(bu 4
112
+ \[lB]\fB--assign-required\fR\[rB]: Claim only the tasks explicitly assigned to \fIwho\fR of \fB--assign-name\fR (\fBphase\fR only). Built-in: not set.
113
+ .IP \(bu 4
114
+ \[lB]\fB--assign-success\fR \fIwho\fR\[rB]: The assignee of a task after its successful processing: a name, \fBnone\fR, or \fBprevious\fR. Generic default: \fBnone\fR for \fBphase\fR, \fBprevious\fR for \fBrequest\fR. Built-in: not set.
115
+ .IP \(bu 4
116
+ \[lB]\fB--assign-failure\fR \fIwho\fR\[rB]: The assignee of a task after its failed processing: a name, \fBnone\fR, or \fBprevious\fR. Generic default: \fBnone\fR for \fBphase\fR, \fBprevious\fR for \fBrequest\fR. Built-in: not set.
117
+ .IP \(bu 4
118
+ \[lB]\fB--request-name\fR \fIname\fR\[rB]: The name of the processed requests (\fBrequest\fR only). Generic default: the agent name. Built-in: not set. Not allowed, as the qualifier is of type \fBphase\fR.
119
+ .IP \(bu 4
120
+ \[lB]\fB--request-done\fR \fIword\fR\[rB]: The word naming a processed task in the log lines (\fBrequest\fR only). Generic default: \fBprocessed\fR. Built-in: not set. Not allowed, as the qualifier is of type \fBphase\fR.
121
+ .IP \(bu 4
122
+ \[lB]\fB--prompt-skill\fR \fIname\fR\[rB]: The skill to invoke (mutually exclusive with \fB--prompt-text\fR and \fB--prompt-file\fR). Built-in: \fBase-repo-review\fR.
123
+ .IP \(bu 4
124
+ \[lB]\fB--prompt-args\fR \fItemplate\fR\[rB]: The argument template of the skill. Generic default: \fB{id}\fR for \fBphase\fR, \fB{id}: {prompt}\fR for \fBrequest\fR. Built-in: \fB{?changeset-type=branch:--branch
125
+ {changeset-name}}\fR.
126
+ .IP \(bu 4
127
+ \[lB]\fB--prompt-text\fR \fItemplate\fR\[rB]: The prompt text template to invoke instead of a skill. Built-in: not set.
128
+ .IP \(bu 4
129
+ \[lB]\fB--prompt-file\fR \fIfile\fR\[rB]: The file with the prompt text template to invoke instead of a skill. Built-in: not set.
130
+ .IP \(bu 4
131
+ \[lB]\fB--prepare-run\fR \fIcmd\fR\[rB]: A shell command run in the working directory before the prompt (repeatable). Built-in: not set.
132
+ .IP \(bu 4
133
+ \[lB]\fB--success-criterion\fR \fIcriterion\fR\[rB]: A success criterion: \fBexit\fR, \fBclean\fR, \fBchanged\fR, \fBverdict\fR, \fBattachment\fR, or \fBstatus\fR (repeatable). Generic default: \fBexit\fR and \fBclean\fR for \fBphase\fR, \fBclean\fR and \fBchanged\fR for \fBrequest\fR. Built-in: \fBexit\fR and \fBverdict\fR.
134
+ .IP \(bu 4
135
+ \[lB]\fB--success-match\fR \fIregex\fR\[rB]: A regular expression an output line has to match (repeatable). Built-in: not set.
136
+ .IP \(bu 4
137
+ \[lB]\fB--verdict-label\fR \fIlabel\fR\[rB]: The label after which the verdict is given in the output. Built-in: \fBREVIEW VERDICT\fR.
138
+ .IP \(bu 4
139
+ \[lB]\fB--verdict-allow\fR \fIVERDICT\fR\[rB]: An accepted verdict (repeatable). Generic default: the verdicts of \fB--state-verdict\fR, else any. Built-in: \fBAPPROVE\fR and \fBREJECT\fR.
140
+ .IP \(bu 4
141
+ \[lB]\fB--attach-output\fR \fIkind\fR\[rB]: The kind of the attachment storing the output lines of the prompt. Built-in: not set.
142
+ .IP \(bu 4
143
+ \[lB]\fB--attach-expect\fR \fIspec\fR\[rB]: The attachment \[lB]\fImime-type\fR\fB;\fR\[rB]\fIkind\fR to be created or changed by the processing for the success criterion \fBattachment\fR. Built-in: not set.
144
+ .IP \(bu 4
145
+ \[lB]\fB--attach-skip\fR \fIspec\fR\[rB]: The attachment \[lB]\fImime-type\fR\fB;\fR\[rB]\fIkind\fR leaving a task unclaimed (\fBphase\fR only). Built-in: not set.
146
+ .IP \(bu 4
147
+ \[lB]\fB--attach-changeset\fR \fIkind\fR\[rB]: The kind of the attachment \fBtext/x-diff;\fR\fIkind\fR storing the change set snapshot of the task (with \fB--workdir changeset\fR or \fBtarget\fR only). Built-in: not set.
148
+ .IP \(bu 4
149
+ \[lB]\fB--finish-commit\fR\[rB]: Commit the work onto a \fBbranch:\fR changeset and publish it (with \fB--workdir changeset\fR only). Built-in: not set. Not allowed, as the qualifier works with \fB--workdir
150
+ changeset-read\fR.
151
+ .IP \(bu 4
152
+ \[lB]\fB--finish-success\fR \fIcmd\fR\[rB]: A shell command run in the working directory after a successful processing. Built-in: not set.
153
+ .IP \(bu 4
154
+ \[lB]\fB--finish-failure\fR \fIcmd\fR\[rB]: A shell command run in the working directory after a failed processing. Built-in: not set.
155
+ .IP \(bu 4
156
+ \[lB]\fB-f\fR|\fB--foreground\fR\[rB]: Run the agent in the current process instead, logging to the terminal, until it is interrupted (e.g., via \fBCTRL+C\fR) or stopped, where an agent of the same name already running is an error.
157
+ .IP \(bu 4
158
+ \[lB]\fB-h\fR|\fB--help\fR\[rB]: Show the usage information of the sub-command only.
159
+ .RE 0
160
+ .IP "" 4
161
+ The options \fB--\fR\fIgroup\fR\fB-\fR\fIitem\fR above override the built-in definition of the mode of the agent (where an option also replaces its mutually exclusive alternatives, e.g., \fB--prompt-text\fR replaces the skill of \fB--prompt-skill\fR), while the agent keeps the identity of its kind (its runs, its presence, and its agent-owned worktrees are named after \fBqualifier\fR). See \fBase-agent-adhoc\fR(1) for their full semantics.
162
+ .IP \(bu 4
163
+ \fBase agent qualifier status\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]: Report whether the qualifier agent of the name \fIname\fR (default: \fBqualifier\fR) is running, as \fBagent\fR \fIname\fR\fB: running (pid\fR \fIpid\fR\fB)\fR resp. \fBagent\fR \fIname\fR\fB: not running\fR (exit status 1).
164
+ .IP \(bu 4
165
+ \fBase agent qualifier log\fR \[lB]\fB-f\fR|\fB--follow\fR\[rB] \[lB]\fB-n\fR|\fB--lines\fR \fIn\fR\[rB] \[lB]\fB--name\fR \fIname\fR\[rB]: Show the log \fB.ase/agent/\fR\fIname\fR\fB.log\fR of the qualifier agent of the name \fIname\fR (default: \fBqualifier\fR) run in the background, where an agent of a fleet logs into the log of the fleet instead (see \fBase-agent-fleet\fR(1)). Without a log file, an informational message is shown only. The options are:
166
+ .RS 4
167
+ .IP \(bu 4
168
+ \[lB]\fB-f\fR|\fB--follow\fR\[rB]: Show the last \fIn\fR lines (default: 10) and then follow all newly appended lines, in the style of \fBtail -f\fR, until interrupted.
169
+ .IP \(bu 4
170
+ \[lB]\fB-n\fR|\fB--lines\fR \fIn\fR\[rB]: Show the last \fIn\fR lines only (default: all, or 10 with \fB--follow\fR).
171
+ .IP \(bu 4
172
+ \[lB]\fB--name\fR \fIname\fR\[rB]: The name of the agent (default: \fBqualifier\fR), given in its long form only, as \fB-n\fR is the short form of \fB--lines\fR.
173
+ .RE 0
174
+ .IP \(bu 4
175
+ \fBase agent qualifier stop\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]: Stop the qualifier agent of the name \fIname\fR (default: \fBqualifier\fR) by \fBSIGTERM\fR, waiting (up to 5 minutes) until it aborted its running processings and put their tasks back. An agent not running is reported informationally only.
176
+ .RE 0
177
+ .SH "ENVIRONMENT"
178
+ .RS 0
179
+ .IP \(bu 4
180
+ \fBASE_TOOL\fR: The default agent tool of \fB--tool\fR (default: \fBclaude\fR).
181
+ .IP \(bu 4
182
+ \fBASE_AGENT_RELAY_TOKEN\fR: The bearer token of the agent relay, if not embedded in the URL of \fB--agent-relay\fR resp. \fBproject.relay.url\fR.
183
+ .IP \(bu 4
184
+ \fBASE_HEADLESS\fR: Set to \fBtrue\fR for the agent tool processes spawned by the agent.
185
+ .RE 0
186
+ .SH "FILES"
187
+ .RS 0
188
+ .IP \(bu 4
189
+ \fB.ase/agent/\fR\fIname\fR\fB.yaml\fR: The process state (kind, process id, and process start time) of the agent, existing while it runs.
190
+ .IP \(bu 4
191
+ \fB.ase/agent/\fR\fIname\fR\fB.log\fR: The log of the agent run in the background.
192
+ .IP \(bu 4
193
+ \fIper-user state directory\fR\fB/agent-qualifier/\fR\fIstore-hash\fR\fB/\fR\fIrun-id\fR\fB.lock\fR and \fB.json\fR: The run lock and the run record of each qualifier agent process, used to recover the tasks of terminated agent processes (see \fBINTERRUPTS AND RECOVERY\fR in \fBase-agent\fR(1)).
194
+ .RE 0
195
+ .SH "EXIT STATUS"
196
+ .P
197
+ \fBase agent qualifier start\fR exits with status \fB0\fR once the agent started (or was already running), resp. once a foreground agent terminated regularly, and with status \fB1\fR on any error (e.g., an invalid option, a task lifecycle model other than \fBenterprise\fR, or a missing agent tool). \fBase agent qualifier status\fR exits with status \fB1\fR if the agent is not running.
198
+ .SH "EXAMPLES"
199
+ .P
200
+ .RS 2
201
+ .nf
202
+ # review the implemented tasks, leaving the decision to a human
203
+ $ ase agent qualifier start -m judge -p 2
204
+
205
+ # review the implemented tasks and decide on them by the verdict
206
+ $ ase agent qualifier start -m qualify
207
+ .fi
208
+ .RE
209
+ .SH "SEE ALSO"
210
+ .P
211
+ \fBase\fR(1), \fBase-agent\fR(1), \fBase-agent-rebooter\fR(1), \fBase-agent-condenser\fR(1), \fBase-agent-researcher\fR(1), \fBase-agent-implementer\fR(1), \fBase-agent-integrator\fR(1), \fBase-agent-editor\fR(1), \fBase-agent-estimator\fR(1), \fBase-agent-adhoc\fR(1), \fBase-agent-fleet\fR(1), \fBase-agent-relay\fR(1), \fBase-task\fR(1), \fBase-task-board\fR(1).
212
+ .SH "AUTHOR"
213
+ .P
214
+ Dr. Ralf S. Engelschall \fI\(larse@engelschall.com\(ra\fR
@@ -0,0 +1,193 @@
1
+ .TH "ASE-AGENT-REBOOTER" "1" "October 2026" "2.0.0" "Agentic Software Engineering (ASE)"
2
+ .SH "NAME"
3
+ \fBase-agent-rebooter\fR - Plan Rebooting Agent
4
+ .SH "SYNOPSIS"
5
+ .P
6
+ \fBase agent rebooter start\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB] \[lB]\fB-t\fR|\fB--tool\fR \fBclaude\fR|\fBcopilot\fR|\fBcodex\fR\[rB] \[lB]\fB-p\fR|\fB--parallel\fR \fInum\fR\[rB] \[lB]\fB-T\fR|\fB--timeout\fR \fIduration\fR\[rB] \[lB]\fB-o\fR|\fB--one-shot\fR\[rB] \[lB]\fB--agent-relay\fR \fIurl\fR\[rB] \[lB]\fB--\fR\fIgroup\fR\fB-\fR\fIitem\fR \fIvalue\fR \[lB]...\[rB]\[rB] \[lB]\fB-f\fR|\fB--foreground\fR\[rB]
7
+ .P
8
+ \fBase agent rebooter status\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]
9
+ .P
10
+ \fBase agent rebooter log\fR \[lB]\fB-f\fR|\fB--follow\fR\[rB] \[lB]\fB-n\fR|\fB--lines\fR \fIn\fR\[rB] \[lB]\fB--name\fR \fIname\fR\[rB]
11
+ .P
12
+ \fBase agent rebooter stop\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]
13
+ .SH "DESCRIPTION"
14
+ .P
15
+ \fBase agent rebooter\fR re-creates the plans of tasks in the \fBPlanning\fR phase of the \fBenterprise\fR task lifecycle model (refused for any other model) from scratch.
16
+ .P
17
+ As a plan is re-created only on the explicit request of a human, the rebooter claims only the tasks in the state \fBDRAFTED\fR whose \fBAssignee:\fR frontmatter key already is its agent name (default: \fBrebooter\fR), i.e., which a human assigned to the rebooter. Such a task is claimed immediately, without waiting for its \fBAfter:\fR predecessors (and, for an explicit epic, its group members), except for a predecessor still being processed by a rebooter or a cancelled \fBAfter:\fR predecessor.
18
+ .P
19
+ The rebooter moves each claimed task into \fBPLANNING\fR, tags it with \fBase-agent-rebooter:active\fR, and reboots its plan via the skill invocation \fBase-task-reboot --next DONE\fR \fIid\fR. The skill itself resets a successfully rebooted plan into \fBDRAFTED\fR (the processing succeeds only then). Afterwards, on success as well as on failure, the rebooter puts the task back into \fBDRAFTED\fR (for its review and its promotion into \fBPLANNED\fR by a human), removes its tag, and unassigns it. As the task is no longer assigned to the rebooter, it is not claimed again, while assigning it to the rebooter again requests another reboot.
20
+ .P
21
+ On an interrupt, a task being processed is put back, untagged and with its previous assignee (i.e., still assigned to the rebooter), into \fBDRAFTED\fR. The rebooter works in the project root only, so it neither requires a Git working copy nor \fBgit\fR, and it accepts no \fB--repo\fR and \fB--tempdir\fR. See \fBase-agent\fR(1) for the common mechanics of all agents.
22
+ .SH "OPTIONS"
23
+ .RS 0
24
+ .IP \(bu 4
25
+ \[lB]\fB-h\fR|\fB--help\fR\[rB]: Show usage information of \fBase agent rebooter\fR (or of the given sub-command) only.
26
+ .RE 0
27
+ .P
28
+ All other options belong to the sub-commands (see \fBCOMMANDS\fR).
29
+ .SH "COMMANDS"
30
+ .RS 0
31
+ .IP \(bu 4
32
+ \fBase agent rebooter start\fR \[lB]\fIoptions\fR\[rB]: Start the rebooter agent in the background, logging into \fB.ase/agent/\fR\fIname\fR\fB.log\fR. The agent is validated and initialized (e.g., its agent tool is looked up and the task lifecycle model is checked) before the command returns (waiting up to 30 seconds), so a failing agent is reported together with the tail of its log. An agent of the same name already running is left alone. The options are:
33
+ .RS 4
34
+ .IP \(bu 4
35
+ \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]: The name of the agent (default: \fBrebooter\fR): up to 64 letters, digits, underscores, and dashes, starting with a letter or digit, other than the name of another agent kind, \fBrelay\fR, or \fBfleet\fR.
36
+ .sp
37
+ It names the agent in its log lines (also in the shared processing log attachment \fBagent\fR), the \fBAssignee:\fR of the tasks it processes, and its process files \fB.ase/agent/\fR\fIname\fR\fB.yaml\fR and \fB.ase/agent/\fR\fIname\fR\fB.log\fR. Agents of the kind \fBrebooter\fR under different names form a pool, competing for the same tasks, but each claims only the tasks explicitly assigned to its own name.
38
+ .IP \(bu 4
39
+ \[lB]\fB-t\fR|\fB--tool\fR \fItool\fR\[rB]: The headless agent tool processing the tasks: \fBclaude\fR (\fIAnthropic Claude Code CLI\fR), \fBcopilot\fR (\fIGitHub Copilot CLI\fR), or \fBcodex\fR (\fIOpenAI Codex CLI\fR) (default: \fB$ASE_TOOL\fR, else \fBclaude\fR). Its command has to be found in \fB$PATH\fR.
40
+ .IP \(bu 4
41
+ \[lB]\fB-p\fR|\fB--parallel\fR \fInum\fR\[rB]: The maximum number of tasks processed in parallel by this agent (default: \fB1\fR), a positive integer.
42
+ .IP \(bu 4
43
+ \[lB]\fB-T\fR|\fB--timeout\fR \fIduration\fR\[rB]: The maximum duration of processing a task (the run of the agent tool), as \fInumber\fR \fIunit\fR (without a space) with \fIunit\fR \fBs\fR (seconds), \fBm\fR (minutes), or \fBh\fR (hours) (default: \fB60m\fR). A processing exceeding it is aborted and counts as failed.
44
+ .IP \(bu 4
45
+ \[lB]\fB-o\fR|\fB--one-shot\fR\[rB]: Terminate the agent, instead of observing for further tasks, once a check of the task store finds no dispatchable task while the agent processes no task anymore -- intended for CI contexts like GitHub Actions, and not allowed in a fleet. A task still waiting for its predecessors at that time is left for a later run. A check of the task store failing three times in a row then terminates the agent with a non-zero exit status (instead of being retried endlessly after a growing delay).
46
+ .IP \(bu 4
47
+ \[lB]\fB--agent-relay\fR \fIurl\fR\[rB]: The agent relay to pass the live presence of the agent to, as \fBase://\fR\fIaddr\fR\fB:\fR\fIport\fR\[lB]\fB/\fR\fItoken\fR\[rB] resp. \fBases://\fR\fIaddr\fR\fB:\fR\fIport\fR\[lB]\fB/\fR\fItoken\fR\[rB]\[lB]\fB?insecure\fR\[rB] for HTTPS (default: the configured \fBproject.relay.url\fR, else none). See \fBAGENT RELAY\fR in \fBase-agent\fR(1).
48
+ .IP \(bu 4
49
+ \[lB]\fB--title\fR \fItext\fR\[rB]: The one-line title of the operation of the agent (at most 80 characters), shown on the task boards. Built-in: \fBReboot the plans of assigned tasks\fR.
50
+ .IP \(bu 4
51
+ \[lB]\fB--description\fR \fItext\fR\[rB]: The brief description of the operation of the agent (about 3-6 lines, at most 600 characters, with its whitespace collapsed), shown on the task boards. Built-in: a description of the operation.
52
+ .IP \(bu 4
53
+ \[lB]\fB--type\fR \fBphase\fR|\fBrequest\fR\[rB]: The processing type: \fBphase\fR claims the tasks by their lifecycle status, \fBrequest\fR processes the prompt requests attached to the tasks. Generic default: \fBphase\fR. Built-in: \fBphase\fR.
54
+ .IP \(bu 4
55
+ \[lB]\fB--workdir\fR \fIkind\fR\[rB]: The working directory of the agent tool: \fBproject\fR, \fBsource\fR, \fBchangeset\fR, \fBchangeset-read\fR, or \fBtarget\fR. Generic default: \fBproject\fR. Built-in: \fBproject\fR.
56
+ .IP \(bu 4
57
+ \[lB]\fB--lifecycle\fR \fImodel\fR\[rB]: A supported task lifecycle model (\fBsolo\fR, \fBteam\fR, or \fBenterprise\fR, repeatable). Generic default: every model containing all given states, resp. all models for \fBrequest\fR and with \fB--unclaimed\fR. Built-in: \fBenterprise\fR.
58
+ .IP \(bu 4
59
+ \[lB]\fB--serial\fR\[rB]: Process the tasks serially only, ignoring \fB--parallel\fR. Built-in: not set.
60
+ .IP \(bu 4
61
+ \[lB]\fB--unclaimed\fR\[rB]: Process the tasks of the incoming states without claiming them, independent of their assignee and predecessors, and without ever changing their status and assignee (\fBphase\fR only). Built-in: not set. Not allowed, as the rebooter claims the tasks into its activity state.
62
+ .IP \(bu 4
63
+ \[lB]\fB--params\fR \fIname\fR\fB=\fR\fIvalue\fR\[rB]: The value of a parameter declared by the definition (repeatable). Built-in: none declared.
64
+ .IP \(bu 4
65
+ \[lB]\fB--state-incoming\fR \fIstate\fR\[rB]: A state of the tasks to claim (mandatory for \fBphase\fR, repeatable with \fB--unclaimed\fR or \fB--state-activity\fR only). Built-in: \fBDRAFTED\fR.
66
+ .IP \(bu 4
67
+ \[lB]\fB--state-activity\fR \fIstate\fR\[rB]: The state of a task during its processing. Generic default: the incoming state. Built-in: \fBPLANNING\fR.
68
+ .IP \(bu 4
69
+ \[lB]\fB--state-success\fR \fIstate\fR\[rB]: The target state on success, or \fBprevious\fR for the incoming state of the claim. Generic default: the incoming state. Built-in: \fBDRAFTED\fR.
70
+ .IP \(bu 4
71
+ \[lB]\fB--state-failure\fR \fIstate\fR\[rB]: The target state on failure, or \fBprevious\fR for the incoming state of the claim. Generic default: the incoming state. Built-in: \fBDRAFTED\fR.
72
+ .IP \(bu 4
73
+ \[lB]\fB--state-phase\fR \fIstate\fR\[rB]: The phase success state, into which the skill itself can move a task. Generic default: the success state, resp. the activity state for a \fBprevious\fR success state. Built-in: not set (hence \fBDRAFTED\fR, the default state, into which the skill resets a rebooted plan).
74
+ .IP \(bu 4
75
+ \[lB]\fB--state-passed\fR \fIstate\fR\[rB]: The first state from which on a task has passed the phase for its \fBAfter:\fR successors. Generic default: the phase success state. Built-in: not set (hence \fBDRAFTED\fR, the first state, so the predecessors impose no gate).
76
+ .IP \(bu 4
77
+ \[lB]\fB--state-verdict\fR \fIVERDICT\fR\fB=\fR\fIstate\fR\[rB]: The target state per verdict (repeatable). Built-in: not set.
78
+ .IP \(bu 4
79
+ \[lB]\fB--tag-name\fR \fItag\fR\[rB]: The tag of the processed tasks (\fBase-agent-\fR\fIword\fR). Generic default: \fBase-agent-\fR\fIname\fR, resp. for \fBrequest\fR always \fBase-agent-\fR\fIrequest-name\fR. Built-in: not set.
80
+ .IP \(bu 4
81
+ \[lB]\fB--tag-success\fR \fItag\fR\[rB]: The tag on success: \fItag-name\fR, \fItag-name\fR\fB:\fR\fIvalue\fR, or \fBnone\fR (\fBphase\fR only). Generic default: \fItag-name\fR. Built-in: \fBnone\fR.
82
+ .IP \(bu 4
83
+ \[lB]\fB--tag-failure\fR \fItag\fR\[rB]: The tag on failure: \fItag-name\fR, \fItag-name\fR\fB:\fR\fIvalue\fR, or \fBnone\fR (\fBphase\fR only). Generic default: \fItag-name\fR. Built-in: \fBnone\fR.
84
+ .IP \(bu 4
85
+ \[lB]\fB--tag-require\fR \fItag\fR\[rB]: A tag a claimable task has to carry (repeatable). Built-in: not set.
86
+ .IP \(bu 4
87
+ \[lB]\fB--tag-exclude\fR \fItag\fR\[rB]: A tag a claimable task must not carry (repeatable). Built-in: not set.
88
+ .IP \(bu 4
89
+ \[lB]\fB--tag-retry\fR\[rB]: A shorthand for \fB--tag-failure none\fR, so a failed task is claimed again after a growing delay (\fBphase\fR only). Built-in: not set.
90
+ .IP \(bu 4
91
+ \[lB]\fB--assign-name\fR \fIwho\fR\[rB]: The assignee under which the tasks are claimed, held, recognized, and released, and which names the agent-owned worktrees. Generic default: the agent name. Built-in: not set.
92
+ .IP \(bu 4
93
+ \[lB]\fB--assign-required\fR\[rB]: Claim only the tasks explicitly assigned to \fIwho\fR of \fB--assign-name\fR (\fBphase\fR only). Built-in: enabled.
94
+ .IP \(bu 4
95
+ \[lB]\fB--assign-success\fR \fIwho\fR\[rB]: The assignee of a task after its successful processing: a name, \fBnone\fR, or \fBprevious\fR. Generic default: \fBnone\fR for \fBphase\fR, \fBprevious\fR for \fBrequest\fR. Built-in: not set.
96
+ .IP \(bu 4
97
+ \[lB]\fB--assign-failure\fR \fIwho\fR\[rB]: The assignee of a task after its failed processing: a name, \fBnone\fR, or \fBprevious\fR. Generic default: \fBnone\fR for \fBphase\fR, \fBprevious\fR for \fBrequest\fR. Built-in: not set.
98
+ .IP \(bu 4
99
+ \[lB]\fB--request-name\fR \fIname\fR\[rB]: The name of the processed requests (\fBrequest\fR only). Generic default: the agent name. Built-in: not set. Not allowed, as the rebooter is of type \fBphase\fR.
100
+ .IP \(bu 4
101
+ \[lB]\fB--request-done\fR \fIword\fR\[rB]: The word naming a processed task in the log lines (\fBrequest\fR only). Generic default: \fBprocessed\fR. Built-in: not set. Not allowed, as the rebooter is of type \fBphase\fR.
102
+ .IP \(bu 4
103
+ \[lB]\fB--prompt-skill\fR \fIname\fR\[rB]: The skill to invoke (mutually exclusive with \fB--prompt-text\fR and \fB--prompt-file\fR). Built-in: \fBase-task-reboot\fR.
104
+ .IP \(bu 4
105
+ \[lB]\fB--prompt-args\fR \fItemplate\fR\[rB]: The argument template of the skill. Generic default: \fB{id}\fR for \fBphase\fR, \fB{id}: {prompt}\fR for \fBrequest\fR. Built-in: \fB--next DONE {id}\fR.
106
+ .IP \(bu 4
107
+ \[lB]\fB--prompt-text\fR \fItemplate\fR\[rB]: The prompt text template to invoke instead of a skill. Built-in: not set.
108
+ .IP \(bu 4
109
+ \[lB]\fB--prompt-file\fR \fIfile\fR\[rB]: The file with the prompt text template to invoke instead of a skill. Built-in: not set.
110
+ .IP \(bu 4
111
+ \[lB]\fB--prepare-run\fR \fIcmd\fR\[rB]: A shell command run in the working directory before the prompt (repeatable). Built-in: not set.
112
+ .IP \(bu 4
113
+ \[lB]\fB--success-criterion\fR \fIcriterion\fR\[rB]: A success criterion: \fBexit\fR, \fBclean\fR, \fBchanged\fR, \fBverdict\fR, \fBattachment\fR, or \fBstatus\fR (repeatable). Generic default: \fBexit\fR and \fBclean\fR for \fBphase\fR, \fBclean\fR and \fBchanged\fR for \fBrequest\fR. Built-in: \fBstatus\fR.
114
+ .IP \(bu 4
115
+ \[lB]\fB--success-match\fR \fIregex\fR\[rB]: A regular expression an output line has to match (repeatable). Built-in: not set.
116
+ .IP \(bu 4
117
+ \[lB]\fB--verdict-label\fR \fIlabel\fR\[rB]: The label after which the verdict is given in the output. Built-in: not set.
118
+ .IP \(bu 4
119
+ \[lB]\fB--verdict-allow\fR \fIVERDICT\fR\[rB]: An accepted verdict (repeatable). Generic default: the verdicts of \fB--state-verdict\fR, else any. Built-in: not set.
120
+ .IP \(bu 4
121
+ \[lB]\fB--attach-output\fR \fIkind\fR\[rB]: The kind of the attachment storing the output lines of the prompt. Built-in: not set.
122
+ .IP \(bu 4
123
+ \[lB]\fB--attach-expect\fR \fIspec\fR\[rB]: The attachment \[lB]\fImime-type\fR\fB;\fR\[rB]\fIkind\fR to be created or changed by the processing for the success criterion \fBattachment\fR. Built-in: not set.
124
+ .IP \(bu 4
125
+ \[lB]\fB--attach-skip\fR \fIspec\fR\[rB]: The attachment \[lB]\fImime-type\fR\fB;\fR\[rB]\fIkind\fR leaving a task unclaimed (\fBphase\fR only). Built-in: not set.
126
+ .IP \(bu 4
127
+ \[lB]\fB--attach-changeset\fR \fIkind\fR\[rB]: The kind of the attachment \fBtext/x-diff;\fR\fIkind\fR storing the change set snapshot of the task (with \fB--workdir changeset\fR or \fBtarget\fR only). Built-in: not set.
128
+ .IP \(bu 4
129
+ \[lB]\fB--finish-commit\fR\[rB]: Commit the work onto a \fBbranch:\fR changeset and publish it (with \fB--workdir changeset\fR only). Built-in: not set. Not allowed, as the rebooter works in the project root.
130
+ .IP \(bu 4
131
+ \[lB]\fB--finish-success\fR \fIcmd\fR\[rB]: A shell command run in the working directory after a successful processing. Built-in: not set.
132
+ .IP \(bu 4
133
+ \[lB]\fB--finish-failure\fR \fIcmd\fR\[rB]: A shell command run in the working directory after a failed processing. Built-in: not set.
134
+ .IP \(bu 4
135
+ \[lB]\fB-f\fR|\fB--foreground\fR\[rB]: Run the agent in the current process instead, logging to the terminal, until it is interrupted (e.g., via \fBCTRL+C\fR) or stopped, where an agent of the same name already running is an error.
136
+ .IP \(bu 4
137
+ \[lB]\fB-h\fR|\fB--help\fR\[rB]: Show the usage information of the sub-command only.
138
+ .RE 0
139
+ .IP "" 4
140
+ The options \fB--\fR\fIgroup\fR\fB-\fR\fIitem\fR above override the built-in definition of the agent (where an option also replaces its mutually exclusive alternatives, e.g., \fB--prompt-text\fR replaces the skill of \fB--prompt-skill\fR), while the agent keeps the identity of its kind (its runs, its presence, and its agent-owned worktrees are named after \fBrebooter\fR). See \fBase-agent-adhoc\fR(1) for their full semantics.
141
+ .IP \(bu 4
142
+ \fBase agent rebooter status\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]: Report whether the rebooter agent of the name \fIname\fR (default: \fBrebooter\fR) is running, as \fBagent\fR \fIname\fR\fB: running (pid\fR \fIpid\fR\fB)\fR resp. \fBagent\fR \fIname\fR\fB: not running\fR (exit status 1).
143
+ .IP \(bu 4
144
+ \fBase agent rebooter log\fR \[lB]\fB-f\fR|\fB--follow\fR\[rB] \[lB]\fB-n\fR|\fB--lines\fR \fIn\fR\[rB] \[lB]\fB--name\fR \fIname\fR\[rB]: Show the log \fB.ase/agent/\fR\fIname\fR\fB.log\fR of the rebooter agent of the name \fIname\fR (default: \fBrebooter\fR) run in the background, where an agent of a fleet logs into the log of the fleet instead (see \fBase-agent-fleet\fR(1)). Without a log file, an informational message is shown only. The options are:
145
+ .RS 4
146
+ .IP \(bu 4
147
+ \[lB]\fB-f\fR|\fB--follow\fR\[rB]: Show the last \fIn\fR lines (default: 10) and then follow all newly appended lines, in the style of \fBtail -f\fR, until interrupted.
148
+ .IP \(bu 4
149
+ \[lB]\fB-n\fR|\fB--lines\fR \fIn\fR\[rB]: Show the last \fIn\fR lines only (default: all, or 10 with \fB--follow\fR).
150
+ .IP \(bu 4
151
+ \[lB]\fB--name\fR \fIname\fR\[rB]: The name of the agent (default: \fBrebooter\fR), given in its long form only, as \fB-n\fR is the short form of \fB--lines\fR.
152
+ .RE 0
153
+ .IP \(bu 4
154
+ \fBase agent rebooter stop\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]: Stop the rebooter agent of the name \fIname\fR (default: \fBrebooter\fR) by \fBSIGTERM\fR, waiting (up to 5 minutes) until it aborted its running processings and put their tasks back. An agent not running is reported informationally only.
155
+ .RE 0
156
+ .SH "ENVIRONMENT"
157
+ .RS 0
158
+ .IP \(bu 4
159
+ \fBASE_TOOL\fR: The default agent tool of \fB--tool\fR (default: \fBclaude\fR).
160
+ .IP \(bu 4
161
+ \fBASE_AGENT_RELAY_TOKEN\fR: The bearer token of the agent relay, if not embedded in the URL of \fB--agent-relay\fR resp. \fBproject.relay.url\fR.
162
+ .IP \(bu 4
163
+ \fBASE_HEADLESS\fR: Set to \fBtrue\fR for the agent tool processes spawned by the agent.
164
+ .RE 0
165
+ .SH "FILES"
166
+ .RS 0
167
+ .IP \(bu 4
168
+ \fB.ase/agent/\fR\fIname\fR\fB.yaml\fR: The process state (kind, process id, and process start time) of the agent, existing while it runs.
169
+ .IP \(bu 4
170
+ \fB.ase/agent/\fR\fIname\fR\fB.log\fR: The log of the agent run in the background.
171
+ .IP \(bu 4
172
+ \fIper-user state directory\fR\fB/agent-rebooter/\fR\fIstore-hash\fR\fB/\fR\fIrun-id\fR\fB.lock\fR and \fB.json\fR: The run lock and the run record of each rebooter agent process, used to recover the tasks of terminated agent processes (see \fBINTERRUPTS AND RECOVERY\fR in \fBase-agent\fR(1)).
173
+ .RE 0
174
+ .SH "EXIT STATUS"
175
+ .P
176
+ \fBase agent rebooter start\fR exits with status \fB0\fR once the agent started (or was already running), resp. once a foreground agent terminated regularly, and with status \fB1\fR on any error (e.g., an invalid option, a task lifecycle model other than \fBenterprise\fR, or a missing agent tool). \fBase agent rebooter status\fR exits with status \fB1\fR if the agent is not running.
177
+ .SH "EXAMPLES"
178
+ .P
179
+ .RS 2
180
+ .nf
181
+ # start the rebooter, rebooting the plans of the tasks assigned to it
182
+ $ ase agent rebooter start
183
+
184
+ # request the reboot of a drafted task by assigning it to the rebooter
185
+ $ ase task assign FOO-42 rebooter
186
+ .fi
187
+ .RE
188
+ .SH "SEE ALSO"
189
+ .P
190
+ \fBase\fR(1), \fBase-agent\fR(1), \fBase-agent-condenser\fR(1), \fBase-agent-researcher\fR(1), \fBase-agent-implementer\fR(1), \fBase-agent-qualifier\fR(1), \fBase-agent-integrator\fR(1), \fBase-agent-editor\fR(1), \fBase-agent-estimator\fR(1), \fBase-agent-adhoc\fR(1), \fBase-agent-fleet\fR(1), \fBase-agent-relay\fR(1), \fBase-task\fR(1), \fBase-task-board\fR(1).
191
+ .SH "AUTHOR"
192
+ .P
193
+ Dr. Ralf S. Engelschall \fI\(larse@engelschall.com\(ra\fR
@@ -0,0 +1,128 @@
1
+ .TH "ASE-AGENT-RELAY" "1" "October 2026" "2.0.0" "Agentic Software Engineering (ASE)"
2
+ .SH "NAME"
3
+ \fBase-agent-relay\fR - Manage the Agent Relay Server
4
+ .SH "SYNOPSIS"
5
+ .P
6
+ \fBase agent relay start\fR \[lB]\fB-a\fR|\fB--address\fR \fIhost\fR\[rB] \[lB]\fB-p\fR|\fB--port\fR \fIport\fR\[rB] \[lB]\fB-t\fR|\fB--token\fR \fItoken\fR\[rB] \[lB]\fB-c\fR|\fB--cors\fR \fIorigin\fR\[rB] \[lB]\fB--tls-cert\fR \fIfile\fR \fB--tls-key\fR \fIfile\fR\[rB] \[lB]\fB-f\fR|\fB--foreground\fR\[rB]
7
+ .P
8
+ \fBase agent relay status\fR
9
+ .P
10
+ \fBase agent relay log\fR \[lB]\fB-f\fR|\fB--follow\fR\[rB] \[lB]\fB-n\fR|\fB--lines\fR \fIn\fR\[rB]
11
+ .P
12
+ \fBase agent relay stop\fR
13
+ .SH "DESCRIPTION"
14
+ .P
15
+ \fBase agent relay\fR manages the per-user \fIagent relay\fR server, which passes the live presence of the agents (see \fBase-agent\fR(1)) to the task boards (see \fBase-task-board\fR(1)) without any external infrastructure. It can run locally or on a central host, as long as both the agents and the task boards reach it, and serves any number of projects (by their \fBproject.id\fR).
16
+ .P
17
+ The agent relay holds the presence of the agents in memory only: per agent its kind, name, mode, the title and description of its operation (for the agent logs view of \fBase-task-board\fR(1)), request name, the lifecycle states it operates on (of a phase agent: its incoming, activity, written, and gate states, for the agent graph of \fBase-task-board\fR(1)), host, process id, current working directory, user name and user id, start time, state (\fBwaiting\fR or \fBbusy\fR), the ids of the tasks it is busy with, its usage of the agent tool (in total and by its last job), the time since which it is in its state, the time of its latest announcement (its heartbeat), and its most recent 100 processing log lines (each message truncated to 500 characters).
18
+ .P
19
+ An agent without heartbeat for 30 seconds is removed (checked every 5 seconds), and a project exists only while it has agents.
20
+ .P
21
+ The agents announce their presence (see \fB--agent-relay\fR of \fBase-agent\fR(1)) on every change of their state, after each finished job, with their new processing log lines, and as a heartbeat every 10 seconds, and remove it on their termination. The task boards subscribe to the agents of their project.
22
+ .P
23
+ Alternatively, \fBase task store start --with-agent-relay\fR (see \fBase-task-store\fR(1)) co-hosts the agent relay in the task store server under the same address, port, and token, so a central host needs a single server process only. A fleet with the section \fBrelay\fR owns the agent relay instead (see \fBase-agent-fleet\fR(1)).
24
+ .P
25
+ The agent relay is selected by the agents and task boards via the configuration \fBproject.relay.url\fR (or their option \fB--agent-relay\fR), as \fBase://\fR\fIaddr\fR\fB:\fR\fIport\fR\[lB]\fB/\fR\fItoken\fR\[rB] for HTTP, resp. \fBases://\fR\fIaddr\fR\fB:\fR\fIport\fR\[lB]\fB/\fR\fItoken\fR\[rB]\[lB]\fB?insecure\fR\[rB] for HTTPS (verifying the server certificate against the Node.js CA store, extendable via \fB$NODE_EXTRA_CA_CERTS\fR, or, with \fB?insecure\fR, without certificate verification). The relay requires an explicit \fBproject.id\fR.
26
+ .P
27
+ The bearer token of a client is the one embedded in the URL (warned about if configured on the \fBproject\fR or a \fBtask\fR scope, as it might be committed), else \fB$ASE_AGENT_RELAY_TOKEN\fR, else \fBproject.relay.token\fR (intended for the \fBuser\fR scope, and warned about on any other scope), else the token of the locally started agent relay (resp. of the locally started task store co-hosting it), but only if the URL addresses exactly this server. Sending a token to a non-loopback host selected by a repository-supplied scope is warned about.
28
+ .SH "COMMANDS"
29
+ .RS 0
30
+ .IP \(bu 4
31
+ \fBase agent relay start\fR \[lB]\fIoptions\fR\[rB]: Start the agent relay server in the background (spawning a detached process logging into \fBrelay.log\fR) and wait until it responds (up to 10 seconds), or with \fB--foreground\fR run it in the current process.
32
+ .sp
33
+ The configuration of the server is resolved from the options, the environment, and the per-user \fBrelay.yaml\fR, and its effective values (address, port, token, CORS origins, TLS certificate and key, and process id) are persisted in \fBrelay.yaml\fR (readable by the current user only). The start is idempotent: an already running server is left alone, unless an explicitly given option (\fB--address\fR, \fB--port\fR, \fB--token\fR, \fB--cors\fR, \fB--tls-cert\fR, or \fB--tls-key\fR) deviates from its configuration, in which case the server is restarted to apply it.
34
+ .sp
35
+ With \fB--foreground\fR, an already running server with an unchanged configuration is an error. A configured port held by a foreign service is re-allocated (with a warning). Binding to a non-loopback address without TLS is warned about, as the bearer token then travels unencrypted. All options are described under \fBOPTIONS\fR below.
36
+ .IP \(bu 4
37
+ \fBase agent relay status\fR: Report whether the agent relay server is running, as \fBrelay: running
38
+ on\fR \fIurl\fR \fB(pid\fR \fIpid\fR\fB)\fR, after probing it on its configured address and port with its configured token. Exits with status 1 if it is not running (no port configured, the port not responding, or the port in use by a foreign service), or if it rejects the configured token.
39
+ .IP \(bu 4
40
+ \fBase agent relay log\fR \[lB]\fB-f\fR|\fB--follow\fR\[rB] \[lB]\fB-n\fR|\fB--lines\fR \fIn\fR\[rB]: Show the log \fBrelay.log\fR of the agent relay server run in the background. With \fB-n\fR|\fB--lines\fR \fIn\fR, only the last \fIn\fR lines are shown (default: all). With \fB-f\fR|\fB--follow\fR, the last \fIn\fR lines (default: 10) are shown and then, in the style of \fBtail -f\fR, all newly appended lines are followed until interrupted. If no log file exists, this is just reported (at log level \fBinfo\fR). The server logs its requests at log level \fBdebug\fR only, as the agents announce frequently.
41
+ .IP \(bu 4
42
+ \fBase agent relay stop\fR: Stop the agent relay server by sending it \fBSIGTERM\fR and waiting (up to 5 seconds) until it is gone, closing all subscriptions of the task boards. A not running server is reported as such, without an error.
43
+ .RE 0
44
+ .SH "OPTIONS"
45
+ .P
46
+ The following options exist for \fBase agent relay start\fR:
47
+ .RS 0
48
+ .IP \(bu 4
49
+ \[lB]\fB-a\fR|\fB--address\fR \fIhost\fR\[rB]: The address to bind to (default: the configured \fBaddress\fR of \fBrelay.yaml\fR, else \fB127.0.0.1\fR), e.g., \fB0.0.0.0\fR for all IPv4 interfaces of a central host.
50
+ .IP \(bu 4
51
+ \[lB]\fB-p\fR|\fB--port\fR \fIport\fR\[rB]: The TCP port to bind to, \fB1\fR..\fB65535\fR (default: the configured \fBport\fR of \fBrelay.yaml\fR, else a randomly allocated free port in the range \fB42000\fR..\fB44000\fR).
52
+ .IP \(bu 4
53
+ \[lB]\fB-t\fR|\fB--token\fR \fItoken\fR\[rB]: The bearer token to expect from all clients (default: \fB$ASE_AGENT_RELAY_TOKEN\fR, else the configured \fBtoken\fR of \fBrelay.yaml\fR, else a generated random token).
54
+ .IP \(bu 4
55
+ \[lB]\fB-c\fR|\fB--cors\fR \fIorigin\fR\[rB]: (repeatable) Allow cross-origin browser requests from \fIorigin\fR, or from any origin with \fB*\fR (default: the configured \fBcors\fR origins of \fBrelay.yaml\fR, else none).
56
+ .IP \(bu 4
57
+ \[lB]\fB--tls-cert\fR \fIfile\fR\[rB]: Serve HTTPS with the PEM certificate (chain) in \fIfile\fR, which requires \fB--tls-key\fR, too (default: the configured \fBproject.relay.crt\fR (unless \fBproject.relay.url\fR selects HTTP via \fBase://\fR on this host), else the configured \fBtls.cert\fR of \fBrelay.yaml\fR, else plain HTTP). A relative path of a configuration is relative to its configuration file.
58
+ .IP \(bu 4
59
+ \[lB]\fB--tls-key\fR \fIfile\fR\[rB]: Serve HTTPS with the PEM private key in \fIfile\fR, which requires \fB--tls-cert\fR, too (default: the configured \fBproject.relay.key\fR (unless \fBproject.relay.url\fR selects HTTP via \fBase://\fR on this host), else the configured \fBtls.key\fR of \fBrelay.yaml\fR).
60
+ .IP \(bu 4
61
+ \[lB]\fB-f\fR|\fB--foreground\fR\[rB]: Run the server in the current process, logging to the terminal instead of \fBrelay.log\fR, until it is interrupted (e.g., via \fBCTRL+C\fR) or stopped via \fBase agent relay stop\fR.
62
+ .IP \(bu 4
63
+ \[lB]\fB-h\fR|\fB--help\fR\[rB]: Show the usage information of the command and exit.
64
+ .RE 0
65
+ .SH "PROTOCOL"
66
+ .P
67
+ All requests have to carry the bearer token in the \fBAuthorization:
68
+ Bearer\fR \fItoken\fR header (the WebSocket handshake alternatively in the query parameter \fBtoken\fR), else they are rejected with status 401 and an \fBapplication/problem+json\fR problem details response. The REST endpoints are:
69
+ .RS 0
70
+ .IP \(bu 4
71
+ \fBGET /agents\fR: The projects with agents, as \fB{ "projects": \[lB] { "id":\fR \fIid\fR\fB,
72
+ "agents":\fR \fIcount\fR \fB} \[rB] }\fR.
73
+ .IP \(bu 4
74
+ \fBGET /projects/\fR\fIid\fR\fB/agents\fR: All agents of the project \fIid\fR, as \fB{ "agents": \[lB]\fR ... \fB\[rB] }\fR.
75
+ .IP \(bu 4
76
+ \fBPUT /projects/\fR\fIid\fR\fB/agents/\fR\fIagent\fR: The announcement of the agent \fIagent\fR (also its heartbeat), as a JSON payload with its presence and only its processing log lines added since its previous announcement (at most 100), answered with status 204.
77
+ .IP \(bu 4
78
+ \fBDELETE /projects/\fR\fIid\fR\fB/agents/\fR\fIagent\fR: The removal of the agent \fIagent\fR (on its termination), answered with status 204.
79
+ .RE 0
80
+ .P
81
+ The WebSocket event endpoint \fB/projects/\fR\fIid\fR\fB/agents/events\fR first sends a snapshot frame of all agents of the project (with \fBreset:
82
+ true\fR) and then a frame on each change (the added or updated agents, and the removed ones), where the processing log lines of an agent are always to be appended to the already received ones.
83
+ .P
84
+ Subscribers are pinged every 15 seconds and terminated if they did not answer the previous ping, resp. if they cannot keep up (more than 1 MB of not yet transmitted data). A plain HTTP request onto the event endpoint is answered with status 426.
85
+ .P
86
+ The project ids have to match \fB\[lB]A-Za-z0-9_-\[rB]+\fR and the agent ids \fB\[lB]A-Za-z0-9\[rB]\[lB]A-Za-z0-9_.-\[rB]*\fR (at most 128 characters), else the request is rejected with status 422. To bound its memory, the relay holds at most 128 projects with agents, 64 agents per project, and 1024 agents in total, and accepts at most 64 subscribers per project and 1024 subscribers in total, where a request beyond these limits is rejected with status 429.
87
+ .SH "ENVIRONMENT"
88
+ .RS 0
89
+ .IP \(bu 4
90
+ \fBASE_AGENT_RELAY_TOKEN\fR: The default of \fB--token\fR of \fBase agent relay start\fR, and the bearer token of the agents and task boards connecting to the relay (if not embedded in its URL).
91
+ .RE 0
92
+ .SH "FILES"
93
+ .RS 0
94
+ .IP \(bu 4
95
+ \fIper-user configuration directory\fR\fB/relay.yaml\fR: The configuration and runtime state of the agent relay server: the keys \fBaddress\fR, \fBport\fR, \fBtoken\fR, \fBcors\fR (a list of origins), \fBtls.cert\fR, \fBtls.key\fR, and \fBpid\fR (of the running server). It is written by \fBase agent relay start\fR (readable by the current user only), and can be edited by hand to configure the defaults.
96
+ .IP \(bu 4
97
+ \fIper-user configuration directory\fR\fB/relay.log\fR: The log of the agent relay server run in the background.
98
+ .RE 0
99
+ .P
100
+ The \fIper-user configuration directory\fR is \fB~/Library/Application
101
+ Support/ase\fR on macOS, \fB%APPDATA%\[rs]ase\fR on Windows, and \fB$XDG_CONFIG_HOME/ase\fR (falling back to \fB~/.config/ase\fR) on Linux and other Unix systems.
102
+ .SH "EXIT STATUS"
103
+ .P
104
+ \fBstart\fR and \fBstop\fR exit with status 0 on success (also for a server already running resp. not running) and 1 on any error. \fBstatus\fR exits with status 1 if the server is not running or rejects the configured token. \fBlog\fR exits with status 0.
105
+ .SH "EXAMPLES"
106
+ .P
107
+ .RS 2
108
+ .nf
109
+ # start the agent relay locally and let the agents and task boards follow it
110
+ $ ase agent relay start -p 4711
111
+ $ ase config --scope project set project.id myproject
112
+ $ ase config --scope project set project.relay.url ase://127.0.0.1:4711
113
+
114
+ # start the agent relay on a central host via HTTPS
115
+ $ ase agent relay start -a 0.0.0.0 -p 4711 --tls-cert relay.crt --tls-key relay.key
116
+ $ ase config --scope user set project.relay.token <token>
117
+
118
+ # check and follow the agent relay
119
+ $ ase agent relay status
120
+ $ ase agent relay log -f
121
+ .fi
122
+ .RE
123
+ .SH "SEE ALSO"
124
+ .P
125
+ \fBase\fR(1), \fBase-agent\fR(1), \fBase-agent-fleet\fR(1), \fBase-task-board\fR(1), \fBase-task-store\fR(1), \fBase-config\fR(1).
126
+ .SH "AUTHOR"
127
+ .P
128
+ Dr. Ralf S. Engelschall \fI\(larse@engelschall.com\(ra\fR