@rse/ase 2.0.3 → 2.0.4

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 (187) hide show
  1. package/dst/ase-hook.js +1 -1
  2. package/dst/ase-lib-version.js +14 -5
  3. package/dst/ase-man-catalog.js +229 -0
  4. package/dst/ase-man-render.js +278 -0
  5. package/dst/ase-man-tui.js +636 -0
  6. package/dst/ase-man.js +33 -27
  7. package/dst/ase-setup.js +2 -2
  8. package/dst/ase-spec.js +103 -20
  9. package/dst/ase-task-board-filter.js +5 -4
  10. package/dst/ase-task-board-web-client.js +26 -26
  11. package/dst/man/ase-agent-adhoc.md +1165 -0
  12. package/dst/man/ase-agent-condenser.md +383 -0
  13. package/dst/man/ase-agent-editor.md +441 -0
  14. package/dst/man/ase-agent-estimator.md +477 -0
  15. package/dst/man/ase-agent-fleet.md +358 -0
  16. package/dst/man/ase-agent-implementer.md +521 -0
  17. package/dst/man/ase-agent-integrator.md +449 -0
  18. package/dst/man/ase-agent-qualifier.md +426 -0
  19. package/dst/man/ase-agent-rebooter.md +384 -0
  20. package/dst/man/ase-agent-relay.md +262 -0
  21. package/dst/man/ase-agent-researcher.md +478 -0
  22. package/dst/man/ase-agent.md +628 -0
  23. package/dst/man/ase-artifact-list.md +57 -0
  24. package/dst/man/ase-artifact-name.md +56 -0
  25. package/dst/man/ase-artifact.md +92 -0
  26. package/dst/man/ase-config-delete.md +74 -0
  27. package/dst/man/ase-config-edit.md +83 -0
  28. package/dst/man/ase-config-get.md +70 -0
  29. package/dst/man/ase-config-init.md +110 -0
  30. package/dst/man/ase-config-list.md +68 -0
  31. package/dst/man/ase-config-set.md +92 -0
  32. package/dst/man/ase-config.md +426 -0
  33. package/dst/man/ase-hook-permission-request.md +61 -0
  34. package/dst/man/ase-hook-pre-tool-use.md +96 -0
  35. package/dst/man/ase-hook-session-end.md +71 -0
  36. package/dst/man/ase-hook-session-persona.md +65 -0
  37. package/dst/man/ase-hook-session-start.md +184 -0
  38. package/dst/man/ase-hook-stop.md +52 -0
  39. package/dst/man/ase-hook-user-prompt-submit.md +54 -0
  40. package/dst/man/ase-hook.md +93 -0
  41. package/dst/man/ase-man.md +195 -0
  42. package/dst/man/ase-mcp.md +102 -0
  43. package/dst/man/ase-service-log.md +59 -0
  44. package/dst/man/ase-service-send.md +60 -0
  45. package/dst/man/ase-service-start.md +93 -0
  46. package/dst/man/ase-service-status.md +58 -0
  47. package/dst/man/ase-service-stop.md +52 -0
  48. package/dst/man/ase-service.md +124 -0
  49. package/dst/man/ase-setup-disable.md +67 -0
  50. package/dst/man/ase-setup-enable.md +66 -0
  51. package/dst/man/ase-setup-install.md +116 -0
  52. package/dst/man/ase-setup-mcp.md +213 -0
  53. package/dst/man/ase-setup-status.md +101 -0
  54. package/dst/man/ase-setup-statusline.md +162 -0
  55. package/dst/man/ase-setup-telemetry.md +166 -0
  56. package/dst/man/ase-setup-uninstall.md +85 -0
  57. package/dst/man/ase-setup-update.md +117 -0
  58. package/dst/man/ase-setup.md +156 -0
  59. package/dst/man/ase-spec-export.md +99 -0
  60. package/dst/man/ase-spec-init.md +57 -0
  61. package/dst/man/ase-spec-lint.md +74 -0
  62. package/dst/man/ase-spec-preview.md +57 -0
  63. package/dst/man/ase-spec.md +85 -0
  64. package/dst/man/ase-statusline.md +330 -0
  65. package/dst/man/ase-task-assign.md +138 -0
  66. package/dst/man/ase-task-board.md +651 -0
  67. package/dst/man/ase-task-delete.md +46 -0
  68. package/dst/man/ase-task-edit.md +73 -0
  69. package/dst/man/ase-task-idscheme.md +92 -0
  70. package/dst/man/ase-task-lifecycle.md +92 -0
  71. package/dst/man/ase-task-list.md +86 -0
  72. package/dst/man/ase-task-load.md +48 -0
  73. package/dst/man/ase-task-newid.md +100 -0
  74. package/dst/man/ase-task-purge.md +49 -0
  75. package/dst/man/ase-task-rename.md +69 -0
  76. package/dst/man/ase-task-request.md +108 -0
  77. package/dst/man/ase-task-save.md +78 -0
  78. package/dst/man/ase-task-status.md +79 -0
  79. package/dst/man/ase-task-store.md +377 -0
  80. package/dst/man/ase-task-view.md +50 -0
  81. package/dst/man/ase-task.md +335 -0
  82. package/dst/man/ase-util-compat.md +38 -0
  83. package/dst/man/ase-util-diagram.md +140 -0
  84. package/dst/man/ase-util-meta.md +68 -0
  85. package/dst/man/ase-util-metric.md +74 -0
  86. package/dst/man/ase-util-mint.md +85 -0
  87. package/dst/man/ase-util-worktree.md +109 -0
  88. package/dst/man/ase-util.md +81 -0
  89. package/dst/man/ase.md +228 -0
  90. package/package.json +12 -17
  91. package/plugin/.claude-plugin/plugin.json +1 -1
  92. package/plugin/.codex-plugin/plugin.json +1 -1
  93. package/plugin/.github/plugin/plugin.json +1 -1
  94. package/plugin/agents/ase-code-lint.md +3 -3
  95. package/plugin/agents/ase-docs-proofread.md +3 -3
  96. package/plugin/agents/ase-docs-refine.md +3 -3
  97. package/plugin/agents/ase-spec-lint.md +338 -0
  98. package/plugin/mods/claude-code.d.ts +26 -3
  99. package/plugin/skills/ase-help-intent/data.md +180 -1
  100. package/plugin/skills/ase-help-skill/catalog.md +1 -0
  101. package/plugin/skills/ase-meta-workflow/workflow.txt +2 -0
  102. package/plugin/skills/ase-repo-commit/SKILL.md +1 -0
  103. package/plugin/skills/ase-repo-merge/SKILL.md +1 -0
  104. package/plugin/skills/ase-spec-edit/SKILL.md +3 -3
  105. package/plugin/skills/ase-spec-edit/help.md +1 -1
  106. package/plugin/skills/ase-spec-lint/SKILL.md +695 -0
  107. package/plugin/skills/ase-spec-lint/help.md +171 -0
  108. package/plugin/skills/ase-task-implement/SKILL.md +24 -6
  109. package/plugin/skills/ase-task-implement/help.md +11 -1
  110. package/dst/man/ase-agent-adhoc.1 +0 -515
  111. package/dst/man/ase-agent-condenser.1 +0 -193
  112. package/dst/man/ase-agent-editor.1 +0 -212
  113. package/dst/man/ase-agent-estimator.1 +0 -214
  114. package/dst/man/ase-agent-fleet.1 +0 -185
  115. package/dst/man/ase-agent-implementer.1 +0 -233
  116. package/dst/man/ase-agent-integrator.1 +0 -213
  117. package/dst/man/ase-agent-qualifier.1 +0 -214
  118. package/dst/man/ase-agent-rebooter.1 +0 -193
  119. package/dst/man/ase-agent-relay.1 +0 -128
  120. package/dst/man/ase-agent-researcher.1 +0 -217
  121. package/dst/man/ase-agent.1 +0 -264
  122. package/dst/man/ase-artifact-list.1 +0 -38
  123. package/dst/man/ase-artifact-name.1 +0 -39
  124. package/dst/man/ase-artifact.1 +0 -56
  125. package/dst/man/ase-config-delete.1 +0 -45
  126. package/dst/man/ase-config-edit.1 +0 -48
  127. package/dst/man/ase-config-get.1 +0 -46
  128. package/dst/man/ase-config-init.1 +0 -60
  129. package/dst/man/ase-config-list.1 +0 -42
  130. package/dst/man/ase-config-set.1 +0 -52
  131. package/dst/man/ase-config.1 +0 -231
  132. package/dst/man/ase-hook-permission-request.1 +0 -36
  133. package/dst/man/ase-hook-pre-tool-use.1 +0 -59
  134. package/dst/man/ase-hook-session-end.1 +0 -47
  135. package/dst/man/ase-hook-session-persona.1 +0 -37
  136. package/dst/man/ase-hook-session-start.1 +0 -81
  137. package/dst/man/ase-hook-stop.1 +0 -34
  138. package/dst/man/ase-hook-user-prompt-submit.1 +0 -34
  139. package/dst/man/ase-hook.1 +0 -51
  140. package/dst/man/ase-man.1 +0 -67
  141. package/dst/man/ase-mcp.1 +0 -61
  142. package/dst/man/ase-service-log.1 +0 -43
  143. package/dst/man/ase-service-send.1 +0 -47
  144. package/dst/man/ase-service-start.1 +0 -54
  145. package/dst/man/ase-service-status.1 +0 -46
  146. package/dst/man/ase-service-stop.1 +0 -37
  147. package/dst/man/ase-service.1 +0 -85
  148. package/dst/man/ase-setup-disable.1 +0 -44
  149. package/dst/man/ase-setup-enable.1 +0 -45
  150. package/dst/man/ase-setup-install.1 +0 -73
  151. package/dst/man/ase-setup-mcp.1 +0 -124
  152. package/dst/man/ase-setup-status.1 +0 -60
  153. package/dst/man/ase-setup-statusline.1 +0 -92
  154. package/dst/man/ase-setup-telemetry.1 +0 -92
  155. package/dst/man/ase-setup-uninstall.1 +0 -59
  156. package/dst/man/ase-setup-update.1 +0 -64
  157. package/dst/man/ase-setup.1 +0 -93
  158. package/dst/man/ase-spec-export.1 +0 -62
  159. package/dst/man/ase-spec-lint.1 +0 -40
  160. package/dst/man/ase-spec-preview.1 +0 -40
  161. package/dst/man/ase-spec.1 +0 -46
  162. package/dst/man/ase-statusline.1 +0 -189
  163. package/dst/man/ase-task-assign.1 +0 -71
  164. package/dst/man/ase-task-board.1 +0 -384
  165. package/dst/man/ase-task-delete.1 +0 -35
  166. package/dst/man/ase-task-edit.1 +0 -46
  167. package/dst/man/ase-task-idscheme.1 +0 -65
  168. package/dst/man/ase-task-lifecycle.1 +0 -57
  169. package/dst/man/ase-task-list.1 +0 -47
  170. package/dst/man/ase-task-load.1 +0 -36
  171. package/dst/man/ase-task-newid.1 +0 -61
  172. package/dst/man/ase-task-purge.1 +0 -37
  173. package/dst/man/ase-task-rename.1 +0 -44
  174. package/dst/man/ase-task-request.1 +0 -61
  175. package/dst/man/ase-task-save.1 +0 -48
  176. package/dst/man/ase-task-status.1 +0 -55
  177. package/dst/man/ase-task-store.1 +0 -194
  178. package/dst/man/ase-task-view.1 +0 -40
  179. package/dst/man/ase-task.1 +0 -160
  180. package/dst/man/ase-util-compat.1 +0 -25
  181. package/dst/man/ase-util-diagram.1 +0 -76
  182. package/dst/man/ase-util-meta.1 +0 -45
  183. package/dst/man/ase-util-metric.1 +0 -54
  184. package/dst/man/ase-util-mint.1 +0 -59
  185. package/dst/man/ase-util-worktree.1 +0 -72
  186. package/dst/man/ase-util.1 +0 -50
  187. package/dst/man/ase.1 +0 -124
@@ -0,0 +1,628 @@
1
+ # ase-agent(1) -- Autonomous Task Lifecycle Agents
2
+
3
+ ## SYNOPSIS
4
+
5
+ `ase agent`
6
+ *agent*
7
+ `start`
8
+ \[*agent-options*\]
9
+ \[`-f`|`--foreground`\]
10
+
11
+ `ase agent`
12
+ *agent*
13
+ `status`
14
+ \[`-n`|`--name` *name*\]
15
+
16
+ `ase agent`
17
+ *agent*
18
+ `log`
19
+ \[`-f`|`--follow`\]
20
+ \[`-n`|`--lines` *n*\]
21
+ \[`--name` *name*\]
22
+
23
+ `ase agent`
24
+ *agent*
25
+ `stop`
26
+ \[`-n`|`--name` *name*\]
27
+
28
+ `ase agent relay`
29
+ `start`|`status`|`log`|`stop`
30
+ \[*options*\]
31
+
32
+ `ase agent fleet`
33
+ `init`|`start`|`status`|`log`|`stop`
34
+ \[*options*\]
35
+
36
+ ## DESCRIPTION
37
+
38
+ **ase agent** runs the autonomous, headless agents of *ASE*. Each agent
39
+ observes the tasks of the task store of the project (see `ase-task`(1)),
40
+ claims the tasks it is responsible for, processes each of them by an
41
+ *ASE* skill (or a prompt text) through a headless agent tool (*Anthropic
42
+ Claude Code CLI*, *GitHub Copilot CLI*, or *OpenAI Codex CLI*), and
43
+ settles the task afterwards (status, tag, and assignee), until it is
44
+ interrupted or stopped.
45
+
46
+ The *agent* is one of the following agent kinds:
47
+
48
+ - the built-in phase agents `implementer`, `qualifier`, and
49
+ `integrator`, which each drive one phase of the `enterprise` task
50
+ lifecycle model, so that the three agents together realize the
51
+ model from the planned to the integrated tasks,
52
+
53
+ - the built-in phase agents `rebooter` and `condenser`, which re-create
54
+ resp. condense the plans of the tasks of the `Planning` phase of the
55
+ `enterprise` task lifecycle model explicitly assigned to them
56
+ (`DRAFTED` > `PLANNING` > `DRAFTED`),
57
+
58
+ - the built-in request agent `editor`, which processes the edit
59
+ requests of tasks in any task lifecycle model,
60
+
61
+ - the built-in agent `estimator`, which estimates the effort of tasks
62
+ in any task lifecycle model, without claiming them (mode `phase`,
63
+ intended for the final estimation), resp. on request (mode `request`,
64
+ intended for dry-runs),
65
+
66
+ - the built-in agent `researcher`, which researches and grounds the
67
+ plans of the tasks of the `Planning` phase of the `enterprise` task
68
+ lifecycle model explicitly assigned to it (mode `phase`), resp.
69
+ researches a topic (or the plan itself) for tasks in any task
70
+ lifecycle model on request (mode `request`, intended for topic-driven
71
+ research),
72
+
73
+ - an agent of a *definition kind*, whose entire behavior is configured
74
+ by a definition file *kind*`.`*ext* of the project or of the user,
75
+
76
+ - the `adhoc` agent, whose entire behavior is configured by its
77
+ options.
78
+
79
+ Each agent runs in its own process, either detached in the background
80
+ (the default) or, with `--foreground`, in the current process. Several
81
+ agents are best run together as a *fleet* (see `ase-agent-fleet`(1)),
82
+ and each agent can pass its live presence to the task boards through
83
+ an *agent relay* (see `ase-agent-relay`(1)).
84
+
85
+ The eight built-in agents are not hard-coded, but each mode of them is a
86
+ declarative *definition*, run by the same agent engine as the agents of
87
+ the definition kinds and the `adhoc` agent. Hence, every agent accepts
88
+ all options `--`*group*`-`*item* of the definitions (see
89
+ `ase-agent-adhoc`(1)), which override the definition of the agent,
90
+ while a built-in agent keeps the identity of its kind: its runs, its
91
+ presence (with its mode), its tags, and its agent-owned worktrees
92
+ (*id*`-`*kind*) are named after its kind.
93
+
94
+ ## AGENT NAMES
95
+
96
+ Every agent has a *name* (option `--name`, default: its kind, e.g.,
97
+ `implementer` or `adhoc`), which consists of up to 64 letters, digits,
98
+ underscores, and dashes, starting with a letter or digit, and which
99
+ must not be the name of another agent kind, `relay`, or `fleet`.
100
+
101
+ The name is used in the log lines of the agent (also in the shared
102
+ processing log attachment `agent`), as the `Assignee:` of the tasks it
103
+ processes, for its temporary directory, and for its process files
104
+ `.ase/agent/`*name*`.yaml` and `.ase/agent/`*name*`.log`. Hence,
105
+ multiple agents of the same kind are started under different names,
106
+ e.g., `ase agent implementer start -n impl-claude -t claude` and
107
+ `ase agent implementer start -n impl-codex -t codex`.
108
+
109
+ The agents of the same kind form a *pool*: they compete for the same
110
+ tasks, share the same tag (per mode), and process their tasks in
111
+ parallel to each other.
112
+
113
+ ## TASK CLAIMING
114
+
115
+ A *phase* agent (all built-in agents except `editor`, `estimator`, and
116
+ `researcher` in the mode `request`, and every definition of `--type
117
+ phase` without `--unclaimed`) observes the tasks in its *incoming*
118
+ state(s) which do not yet carry its *tag*
119
+ (plain or with any value) in their `Tags:` frontmatter key, and whose
120
+ `Assignee:` frontmatter key is either still empty or already the
121
+ assignee name of the agent (default: its name), so a task can be
122
+ pre-assigned to a particular agent of a pool, while a task assigned to
123
+ anybody else (e.g., a human) is left alone.
124
+
125
+ An agent can require a task to be already assigned to it (like
126
+ `rebooter`, `condenser`, and `researcher` in the mode `phase`, see
127
+ `--assign-required`). Such an agent can leave a processed task untagged
128
+ (see `--tag-success none`), as the unassignment of the task keeps it from
129
+ being claimed again, while assigning it to the agent again requests
130
+ another processing.
131
+
132
+ The tag of a built-in agent is `ase-agent-`*kind*, resp. one per mode
133
+ for `implementer` in mode `draft` (`ase-agent-implementer-draft`). The
134
+ tag of any other agent is `ase-agent-`*name* (see `--tag-name`).
135
+
136
+ The agent claims each dispatchable task (in natural task id order,
137
+ re-checked on every change of the task store) in a single conditional
138
+ save of the task (retried on a concurrent change), which moves it into
139
+ its *activity* state, tags it with the value `active` (so no other
140
+ agent of this kind picks it up, even if the skill itself puts it back
141
+ into the incoming state during its processing), and sets its
142
+ `Assignee:` to the agent (for information only, as the tag alone
143
+ guards the task).
144
+
145
+ A task meanwhile tagged or (re)assigned is silently skipped instead.
146
+
147
+ After the processing, again in a single conditional save, the task is
148
+ unassigned (only if still assigned to the agent, and not meanwhile to
149
+ somebody else, e.g., the `editor` agent), tagged with its plain tag
150
+ (or with the label of the processing as its value, like the verdict of
151
+ `qualifier`), so no agent of this kind picks it up again, and moved into
152
+ its *success* or *failure* (parking) state, where the pseudo state
153
+ `previous` restores the incoming state the task was claimed from (for an
154
+ agent claiming tasks from multiple incoming states).
155
+
156
+ A processing failure, or a processing exceeding the duration of
157
+ `--timeout`, always leads to the failure state. A task whose status the
158
+ skill itself moved elsewhere is tagged, too, and left in that state.
159
+
160
+ The preparing of a processing (e.g., creating a worktree) and its
161
+ finishing (e.g., committing and pushing a branch) are each limited to a
162
+ fixed duration of 240 seconds, where exceeding it also leads to the
163
+ failure state.
164
+
165
+ A task the skill already put into the success state, but whose
166
+ finishing failed (e.g., a branch which could not be pushed), and a task
167
+ whose resulting state is not reachable from its current state, is
168
+ instead tagged with the value `failed`, unassigned, and left in its
169
+ state for a manual intervention (which removes the tag), while the
170
+ failure is logged as an error. A final status update of a processed
171
+ task which fails even after its retries is retried in the background
172
+ with a growing delay.
173
+
174
+ A *request* agent (`editor`, `estimator` and `researcher` in the mode
175
+ `request`, and every definition of `--type request`) instead processes the prompt requests attached to tasks in
176
+ any lifecycle status (see `ase task request` in `ase-task-request`(1),
177
+ `ase-agent-editor`(1), and `ase-agent-researcher`(1)).
178
+
179
+ An *unclaimed* phase agent (`estimator` in the mode `phase`, and every definition of
180
+ `--type phase` with `--unclaimed`) instead processes every task in one
181
+ of its incoming states (each adapted onto the task lifecycle model of
182
+ the project, e.g., `PLANNED` as `PLANNING` for `team` and as `OPEN` for
183
+ `solo`) which does not carry its tag yet, independent of its assignee
184
+ and its predecessors, without claiming it: it neither moves the task
185
+ into an activity state, nor tags it as active, nor assigns it to
186
+ itself, and it settles the task by its tag only, so it never changes
187
+ its status and its assignee and keeps no other agent off it (see
188
+ `ase-agent-estimator`(1)).
189
+
190
+ ## PREDECESSORS
191
+
192
+ A phase agent claims a task only once all its predecessors passed the
193
+ phase of the agent (or no longer exist). The predecessors of a task are
194
+ the tasks of its `After:` frontmatter key and, for an explicit epic (a
195
+ task whose `Group:` is its own id), implicitly all other tasks of its
196
+ group. An agent whose passed state (see below) is the first state of
197
+ the task lifecycle model (like `rebooter`, `condenser`, and
198
+ `researcher` in the mode `phase`, with `DRAFTED`) hence imposes no gate,
199
+ except for a predecessor still being processed by an agent of its kind
200
+ or a cancelled `After:` predecessor.
201
+
202
+ A predecessor has passed the phase once it is in or beyond the
203
+ *passed* state of the agent (see `--state-passed`), or in the *success*
204
+ state and tagged as processed, where a predecessor still tagged by an
205
+ agent of this kind with the value `active` (while in the success state
206
+ or not finished) resp. `failed` (while still in the success state) has
207
+ not passed it yet.
208
+
209
+ A cancelled `After:` predecessor never passes (as the task might
210
+ depend on its never delivered result), while a cancelled member of an
211
+ epic counts as dropped from it. A predecessor status foreign to the
212
+ lifecycle model counts as the state it maps onto.
213
+
214
+ A task still waiting for its predecessors is reported once (per change
215
+ of the reason), while a task referencing unknown predecessors (treated
216
+ as passed), waiting for cancelled predecessors, or waiting in a
217
+ dependency cycle is warned about once. A task with predecessors is
218
+ re-checked against a fresh listing right before its claim.
219
+
220
+ ## PROCESSING
221
+
222
+ Each task is processed through the headless agent tool of `--tool`,
223
+ with the environment variable `ASE_HEADLESS=true` and without any
224
+ standard input, i.e., via
225
+
226
+ - `claude` \[`--add-dir` *dir* ...\] `-p --output-format stream-json
227
+ --verbose --disallowedTools AskUserQuestion --permission-mode auto
228
+ --permission-prompts none` *prompt*,
229
+
230
+ - `copilot` \[`--add-dir` *dir* ...\] `--allow-all-tools --no-ask-user
231
+ --no-color --output-format json -p` *prompt*, resp.
232
+
233
+ - `codex exec` \[`--add-dir` *dir* ...\] `--json --approve-for-me
234
+ --color never` *prompt*,
235
+
236
+ where risky actions are denied or automatically reviewed instead of
237
+ being prompted for, and where each additional directory a skill needs
238
+ access to besides its working directory is granted through an
239
+ additional `--add-dir` *dir*. A skill *prompt* is `/`*skill* *args*
240
+ (`claude` and `copilot`) resp. `$`*skill* *args* (`codex`), where an
241
+ un-namespaced *ASE* skill (`ase-*`) gets the plugin namespace `ase:`
242
+ for `claude` only.
243
+
244
+ The agent tool and, for an agent of a working directory other than
245
+ `project` (i.e., all built-in agents except `rebooter`, `condenser`,
246
+ and `estimator`, see `--workdir`), `git` have to be found in `$PATH`.
247
+
248
+ All processing information, including the output of the agent tool
249
+ (which streams its agent messages, tool calls, failures, and final
250
+ result as JSONL events), is logged (to standard error, see `ase`(1),
251
+ resp. to the log file of the agent) with timestamp prefixes in real
252
+ time, followed by the usage of the agent tool as wall time (measured
253
+ locally), output tokens (of `claude` and `codex`), and costs in USD
254
+ (of `claude` only), with `n/a` for what the agent tool does not report.
255
+
256
+ At the end of each processing, the log lines of the processing (with at
257
+ most 20 lines of each agent message) are appended to the attachment of
258
+ the task with the type `text/plain; charset=utf-8; kind="agent"`
259
+ (created if not existing yet), which is shared by all agents, whose log
260
+ lines carry their name. If the AI usage accounting is enabled
261
+ (`telemetry.enabled`), the usage is additionally booked onto the usage
262
+ attachment of the task (without any human time and costs, as the agent
263
+ runs unattended).
264
+
265
+ ## INTERRUPTS AND RECOVERY
266
+
267
+ On an interrupt (`SIGINT`, `SIGTERM`, `SIGHUP`, or `SIGQUIT`, e.g., by
268
+ `ase agent` *agent* `stop`), and on the failure of a concurrently run
269
+ agent, the running processings are aborted and their tasks are put
270
+ back, untagged and with their previous assignee, into the incoming
271
+ state (while a task processed unclaimed is left untouched), while a
272
+ repeated signal terminates the process at once (leaving the claimed
273
+ tasks to the recovery described below).
274
+
275
+ The claimed tasks of each run are recorded under a run lock in the
276
+ *per-user state directory* (below a sub-directory per task store, as
277
+ task ids are unique per task store only).
278
+
279
+ Hence, the tasks of an agent terminated without this cleanup (e.g.,
280
+ killed or crashed) are recovered on the next start of an agent of its
281
+ kind for the same task store on the same host by the same user: a task
282
+ still in the activity state is put back the same way, and any other
283
+ task still tagged as `active` is tagged plain (as processed), but only
284
+ while it is still assigned to the terminated agent and not claimed
285
+ meanwhile by a live agent, where concurrently started agents never
286
+ recover the same run.
287
+
288
+ The requests left in processing by a terminated request agent are
289
+ marked as failed instead, and the previous assignees of their tasks
290
+ are restored.
291
+
292
+ ## WORKING COPY, CLONES, AND WORKTREES
293
+
294
+ The agents follow the `Source:`, `Changeset:`, and `Target:`
295
+ frontmatter keys of a task (or their configured defaults
296
+ `project.task.default.source`, `project.task.default.changeset`, and
297
+ `project.task.default.target`, see `ase-config`(1)). Their values are:
298
+
299
+ - `worktree`:
300
+ the Git working copy the agent is started in. For it, the agents
301
+ create no own Git worktree, but work in the working copy directly,
302
+ just adjusting its checked-out branch.
303
+
304
+ As concurrently processed tasks would interfere there, an agent
305
+ handles at most one task at a time in the working copy itself
306
+ (other tasks waiting until it is free again). This coordination does
307
+ not extend to other agents (each running in its own process, also
308
+ within a fleet) or humans working in the same working copy, so a
309
+ working copy should be used directly by a single agent only, while
310
+ the other agents are given `--repo` (or process tasks without
311
+ `worktree` values only).
312
+
313
+ - `branch:`*name*:
314
+ the Git branch *name*, checked out in an *ASE* worktree below
315
+ `.ase/worktree/` where needed, which is named after the branch (with
316
+ every character other than letters, digits, `_`, and `-` replaced by
317
+ `-`, runs of `-` reduced to one, and leading and trailing `-` and `_`
318
+ removed, e.g., `feature-x` for `feature/x`).
319
+
320
+ - `attachment:`*name*:
321
+ the task attachment *name* (a change set as a diff), handled by the
322
+ skills (`Changeset:` only).
323
+
324
+ - `source` (`Target:` only):
325
+ the `Source:` of the task.
326
+
327
+ The placeholder `{id}` of a branch or attachment *name* reads as the id
328
+ of the task (with every character other than letters, digits, `_`, and
329
+ `-` replaced by `-`, runs of `-` reduced to one, and leading and
330
+ trailing `-` and `_` removed, e.g., `12` for `#12` and `FOO-12` for
331
+ `FOO#12`), e.g., the `Changeset:`
332
+ default `branch:cs-{id}` implements every task onto its own branch.
333
+
334
+ Without `--repo`, all tasks are processed in the Git working copy the
335
+ agent is started in, which is hence mandatory (except for an agent of
336
+ the working directory `project`, like `rebooter`, `condenser`, and
337
+ `estimator`, which work in the project root only, where `rebooter`,
338
+ `condenser`, and `estimator` do not accept `--repo` and `--tempdir` at
339
+ all, while any other such agent ignores them).
340
+
341
+ With `--repo` *url*, each agent instead clones the Git repository *url* once
342
+ into its temporary directory (removed on termination) and processes every
343
+ task without a `worktree` value in its own temporary Git worktree of this
344
+ clone (below `work/` of the temporary directory), where the Git operations
345
+ on the clone are serialized: before each task, its default branch and the
346
+ branches of the task (unless checked out for another task) are refreshed
347
+ from the origin, and afterwards a changed `branch:` changeset resp. target
348
+ is pushed back to the origin, where a rejected push fails the task.
349
+
350
+ If such a push fails after the skill already put the task into its
351
+ success state, the work is kept as the branch `ase-agent-rescue/`*id*
352
+ in the clone, the task is tagged with the value `failed`, and the
353
+ temporary directory is preserved (instead of being removed on
354
+ termination) for a manual recovery.
355
+
356
+ Only a task with a `worktree` value then requires the agent to be
357
+ started inside a Git working copy. As the skills run inside the clone,
358
+ `--repo` requires a task store not located in the working copy (i.e.,
359
+ not a local `ase:`*path* one).
360
+
361
+ In the names of all *ASE* worktrees derived from a task id, a `#` of
362
+ the id (e.g., of the `seq:#%d` id scheme of the issue tracker task
363
+ stores) is replaced by `_`, as neither a worktree name nor a branch name
364
+ can carry it.
365
+
366
+ The temporary directory of an agent holds the clone and other
367
+ temporary files: by default, it is securely created as a fresh, private
368
+ directory `ase-agent-`*name*`-`*random* below the system temporary
369
+ directory, while `--tempdir` *dir* forces it to be the sub-directory
370
+ *name* of *dir*, where `%p` in *dir* is expanded to the process id of
371
+ the agent, `%h` to a hash value unique to the process, and `%%` to `%`.
372
+
373
+ A missing *dir* is created private to the current user (and removed
374
+ again on termination if empty), while an existing *dir* has to be a
375
+ directory (no symbolic link) owned by the current user. A sub-directory
376
+ *name* left over by an earlier run is removed only if its owning
377
+ process is no longer alive and it holds no work preserved for a manual
378
+ recovery, and otherwise refused.
379
+
380
+ ## AGENT RELAY
381
+
382
+ With an agent relay (`--agent-relay` *url*, else the configured
383
+ `project.relay.url`, given as `ase://`*addr*`:`*port*\[`/`*token*\]
384
+ resp. `ases://`*addr*`:`*port*\[`/`*token*\]\[`?insecure`\] for HTTPS,
385
+ optionally without certificate verification), each agent additionally
386
+ passes its live presence to the task boards (see `ase-task-board`(1)):
387
+ its state (`waiting`, or `busy` with the ids of its tasks) immediately
388
+ on every change, its usage of the agent tool (in total and by its last
389
+ job) immediately after each finished job, its new processing log lines
390
+ (coalesced to at most four announcements per second), and a heartbeat
391
+ every 10 seconds, and it removes its presence on termination.
392
+
393
+ The relay requires an explicit `project.id`. Its bearer token is the
394
+ one embedded in the URL, else `$ASE_AGENT_RELAY_TOKEN`, else
395
+ `project.relay.token`, else the token of the locally started agent
396
+ relay (or of the locally started task store co-hosting it), if the URL
397
+ addresses it.
398
+
399
+ An unreachable relay is warned about once per outage and never disturbs
400
+ the processing of the tasks, where the not yet passed log lines are
401
+ kept (at most 100) and passed once the relay is reachable again. A
402
+ presence rejected by the relay is warned about with its reason and
403
+ retried after a growing delay (from 1 up to 15 minutes).
404
+
405
+ ## DEFINITION KINDS
406
+
407
+ A *definition kind* is an agent kind of its own, discovered from a
408
+ definition file *kind*`.`*ext* of the project (`.ase/agents/`, intended
409
+ to be versioned) or of the user (*per-user configuration
410
+ directory*`/agents/`), where a definition kind of the project shadows
411
+ one of the user, and both shadow a built-in agent of the same kind
412
+ (whose `--mode` then no longer exists). For instance,
413
+ `.ase/agents/reviewer.mts` yields `ase agent reviewer start`.
414
+
415
+ The extensions are, in descending precedence, `.yaml`, `.yml`, `.ts`,
416
+ `.mts`, `.js`, `.mjs`, and `.cjs`. The definition files are discovered
417
+ on the commands `ase agent` ... only, where a file of an invalid kind
418
+ name (other than up to 64 letters, digits, underscores, and dashes,
419
+ starting with a letter or digit), of the kind name `adhoc`, `relay`, or
420
+ `fleet`, or of an already discovered kind name in the same directory
421
+ is skipped with a warning.
422
+
423
+ An agent of a definition kind accepts the same options as
424
+ `ase agent adhoc start`, except `--definition`, and `--repo` and
425
+ `--tempdir` are silently ignored with `--workdir project`. See
426
+ `ase-agent-adhoc`(1) for the format of the definition files, all
427
+ options of the definitions, their templates, their hooks, and example
428
+ definitions.
429
+
430
+ ## OPTIONS
431
+
432
+ - \[`-h`|`--help`\]:
433
+ Show usage information of `ase agent` (or of the given sub-command)
434
+ only.
435
+
436
+ All other options belong to the sub-commands (see **COMMANDS** and the
437
+ manual pages of the agent kinds).
438
+
439
+ ## COMMANDS
440
+
441
+ The following sub-command groups exist:
442
+
443
+ - `ase agent rebooter` `start`|`status`|`log`|`stop`:
444
+ The agent re-creating the plans of the `DRAFTED` tasks of the
445
+ `enterprise` task lifecycle model explicitly assigned to it from
446
+ scratch, putting them back into `DRAFTED` afterwards. See
447
+ `ase-agent-rebooter`(1).
448
+
449
+ - `ase agent condenser` `start`|`status`|`log`|`stop`:
450
+ The agent compressing the wording of the plans of the `DRAFTED` tasks
451
+ of the `enterprise` task lifecycle model explicitly assigned to it,
452
+ putting them back into `DRAFTED` afterwards. See
453
+ `ase-agent-condenser`(1).
454
+
455
+ - `ase agent implementer` `start`|`status`|`log`|`stop`:
456
+ The agent of the `Implementation` phase of the `enterprise` task
457
+ lifecycle model, implementing the tasks from their `Source:` into
458
+ their `Changeset:`, resp. drafting their implementation. See
459
+ `ase-agent-implementer`(1).
460
+
461
+ - `ase agent qualifier` `start`|`status`|`log`|`stop`:
462
+ The agent of the `Qualification` phase of the `enterprise` task
463
+ lifecycle model, reviewing the `Changeset:` of the tasks. See
464
+ `ase-agent-qualifier`(1).
465
+
466
+ - `ase agent integrator` `start`|`status`|`log`|`stop`:
467
+ The agent of the `Integration` phase of the `enterprise` task
468
+ lifecycle model, integrating the `Changeset:` of the tasks into their
469
+ `Target:`. See `ase-agent-integrator`(1).
470
+
471
+ - `ase agent editor` `start`|`status`|`log`|`stop`:
472
+ The agent processing the edit requests of tasks in any task lifecycle
473
+ model. See `ase-agent-editor`(1).
474
+
475
+ - `ase agent estimator` `start`|`status`|`log`|`stop`:
476
+ The agent estimating the effort of the tasks without a valid
477
+ `Effort:` key in any task lifecycle model, without claiming them
478
+ (mode `phase`, intended for the final estimation), resp. of the tasks
479
+ of the `estimate` requests (mode `request`, intended for dry-runs).
480
+ See `ase-agent-estimator`(1).
481
+
482
+ - `ase agent researcher` `start`|`status`|`log`|`stop`:
483
+ The agent researching the plans of the `DRAFTED` tasks of the
484
+ `enterprise` task lifecycle model explicitly assigned to it
485
+ (mode `phase`, intended for researching and grounding the plan
486
+ content), resp. processing the research requests of tasks in any task
487
+ lifecycle model (mode `request`, intended for topic-driven research),
488
+ appending a research report, grounded in the Web and in the source
489
+ artifacts of the project, to the `research` attachment of the tasks.
490
+ See `ase-agent-researcher`(1).
491
+
492
+ - `ase agent` *kind* `start`|`status`|`log`|`stop`:
493
+ The agent of the definition kind *kind* (see **DEFINITION KINDS**),
494
+ with the same sub-commands and options as `ase agent adhoc`, except
495
+ `--definition`. See `ase-agent-adhoc`(1).
496
+
497
+ - `ase agent adhoc` `start`|`status`|`log`|`stop`:
498
+ An ad-hoc agent, whose entire behavior is given by its options. See
499
+ `ase-agent-adhoc`(1).
500
+
501
+ - `ase agent relay` `start`|`status`|`log`|`stop`:
502
+ The per-user agent relay server, passing the live presence of the
503
+ agents to the task boards. See `ase-agent-relay`(1).
504
+
505
+ - `ase agent fleet` `init`|`start`|`status`|`log`|`stop`:
506
+ A fleet of agents (and of the agent relay they report to), running
507
+ each in its own process and restarting it whenever it exits. See
508
+ `ase-agent-fleet`(1).
509
+
510
+ The sub-commands of every agent kind *agent* are:
511
+
512
+ - `ase agent` *agent* `start` \[*agent-options*\] \[`-f`|`--foreground`\]:
513
+ Start the agent in the background, logging into
514
+ `.ase/agent/`*name*`.log`. The agent is validated and initialized
515
+ (e.g., its agent tool is looked up and the task lifecycle model is
516
+ checked) before the command returns (waiting up to 30 seconds), so a
517
+ failing agent is reported together with the tail of its log. An agent
518
+ of the same name already running is left alone (exit status 0).
519
+
520
+ With `--foreground`, the agent runs in the current process instead,
521
+ logging to the terminal, until it is interrupted or stopped, where an
522
+ agent of the same name already running is an error.
523
+
524
+ - `ase agent` *agent* `status` \[`-n`|`--name` *name*\]:
525
+ Report whether the agent of the name *name* (default: its kind) is
526
+ running (with its process id).
527
+
528
+ - `ase agent` *agent* `log` \[`-f`|`--follow`\] \[`-n`|`--lines` *n*\] \[`--name` *name*\]:
529
+ Show the log `.ase/agent/`*name*`.log` of the agent of the name *name*
530
+ (default: its kind) run in the background, where an agent of a fleet
531
+ logs into the log of the fleet instead (see `ase-agent-fleet`(1)).
532
+ With `--lines`, only the last *n* lines are shown. With `--follow`,
533
+ the last *n* lines (default: 10) are shown and then all newly appended
534
+ lines are followed until interrupted. As `-n` is the short form of
535
+ `--lines`, the name is given via `--name` only.
536
+
537
+ - `ase agent` *agent* `stop` \[`-n`|`--name` *name*\]:
538
+ Stop the agent of the name *name* (default: its kind) by `SIGTERM`,
539
+ waiting (up to 5 minutes) until it aborted its running processings
540
+ and put their tasks back.
541
+
542
+ ## ENVIRONMENT
543
+
544
+ - `ASE_TOOL`:
545
+ The default agent tool of `--tool` (default: `claude`).
546
+
547
+ - `ASE_AGENT_RELAY_TOKEN`:
548
+ The bearer token of the agent relay, if not embedded in the URL of
549
+ `--agent-relay` resp. `project.relay.url`.
550
+
551
+ - `ASE_HEADLESS`:
552
+ Set to `true` for the agent tool processes spawned by the agents.
553
+
554
+ - `PATH`:
555
+ Searched for the agent tool (`claude`, `copilot`, or `codex`) and
556
+ `git`.
557
+
558
+ ## FILES
559
+
560
+ - `.ase/agent/`*name*`.yaml`:
561
+ The process state (kind, process id, and process start time) of the
562
+ agent named *name*, existing while the agent runs.
563
+
564
+ - `.ase/agent/`*name*`.log`:
565
+ The log of the agent named *name* run in the background.
566
+
567
+ - `.ase/agents/`*kind*`.`*ext*, *per-user configuration directory*`/agents/`*kind*`.`*ext*:
568
+ The definition files of the definition kinds of the project resp. of
569
+ the user.
570
+
571
+ - `.ase/worktree/`:
572
+ The *ASE* worktrees created by the agents (and the skills).
573
+
574
+ - *per-user state directory*`/agent-`*kind*`/`*store-hash*`/`*run-id*`.lock` and `.json`:
575
+ The run lock (a directory, refreshed periodically and considered stale
576
+ after 30 seconds without refresh) and the run record (process id, process
577
+ start time, and claimed tasks) of each agent process of agent *kind*
578
+ (`rebooter`, `condenser`, `implementer`, `qualifier`, `integrator`,
579
+ `editor`, `estimator`, or `researcher`, resp. `tag-`*word* per tag `ase-agent-`*word* of the
580
+ agents of the definition kinds and of `adhoc`), where *store-hash* is
581
+ the first 12 hex digits of the SHA-1 digest of the identity of the
582
+ task store.
583
+
584
+ On termination, the lock is removed, and so is the record, unless it
585
+ still records claimed tasks.
586
+
587
+ ## EXIT STATUS
588
+
589
+ `ase agent` *agent* `start` exits with status `0` once the agent
590
+ started (or was already running), resp. once a foreground agent
591
+ terminated regularly, and with status `1` on any error (e.g., an
592
+ invalid option, a missing agent tool, an unsupported task lifecycle
593
+ model, or, with `--one-shot`, a task store failing three checks in a
594
+ row). `ase agent` *agent* `status` exits with status `1` if the agent is
595
+ not running. `ase agent` without a sub-command shows its usage
596
+ information and exits with status `1`.
597
+
598
+ ## EXAMPLES
599
+
600
+ ```sh
601
+ # start the phase agents of the "enterprise" lifecycle model
602
+ $ ase agent rebooter start
603
+ $ ase agent condenser start
604
+ $ ase agent researcher start
605
+ $ ase agent implementer start -p 2
606
+ $ ase agent qualifier start -m judge
607
+ $ ase agent integrator start -m squash
608
+
609
+ # start two implementers of different agent tools as a pool
610
+ $ ase agent implementer start -n impl-claude -t claude
611
+ $ ase agent implementer start -n impl-codex -t codex
612
+
613
+ # follow the log of an agent and stop it again
614
+ $ ase agent implementer log -f --name impl-codex
615
+ $ ase agent implementer stop -n impl-codex
616
+ ```
617
+
618
+ ## SEE ALSO
619
+
620
+ `ase`(1), `ase-agent-rebooter`(1), `ase-agent-condenser`(1), `ase-agent-implementer`(1),
621
+ `ase-agent-qualifier`(1), `ase-agent-integrator`(1),
622
+ `ase-agent-editor`(1), `ase-agent-estimator`(1), `ase-agent-researcher`(1),
623
+ `ase-agent-adhoc`(1), `ase-agent-relay`(1), `ase-agent-fleet`(1), `ase-task`(1),
624
+ `ase-task-board`(1), `ase-task-request`(1), `ase-config`(1).
625
+
626
+ ## AUTHOR
627
+
628
+ Dr. Ralf S. Engelschall <rse@engelschall.com>
@@ -0,0 +1,57 @@
1
+ # ase-artifact-list(1) -- Resolve Artifact Kinds to Project-Relative File Paths
2
+
3
+ ## SYNOPSIS
4
+
5
+ `ase artifact list`
6
+ \[`-h`|`--help`\]
7
+ \[`--kind` *kinds*\]
8
+
9
+ ## DESCRIPTION
10
+
11
+ **ase artifact list** resolves one or more artifact kinds of the
12
+ project to the project-relative (POSIX-style) paths of their files,
13
+ driven by the configuration keys `project.artifact.`*kind*`.basedir`
14
+ and `project.artifact.`*kind*`.files` and honoring the Git exclude
15
+ rules, as described in `ase-artifact`(1).
16
+
17
+ The files of each kind are printed sorted, one per line, as a bullet
18
+ list (`- `*file*). When more than one kind is requested, the list of
19
+ each kind is preceded by a header line `# `*kind*`:`. The kinds are
20
+ printed in the requested order, while the partitioning of the files
21
+ among the kinds always follows the fixed precedence `spec`, `code`,
22
+ `docs`, `infr`, with `othr` as the implicit catch-all.
23
+
24
+ ## OPTIONS
25
+
26
+ - \[`-h`|`--help`\]:
27
+ Show usage information and exit.
28
+
29
+ - \[`--kind` *kinds*\]:
30
+ A comma-separated list of the artifact kinds to resolve, out of
31
+ `spec`, `code`, `docs`, `infr`, and `othr` (default:
32
+ `spec,code,docs,infr,othr`, i.e., all kinds). Whitespace around the
33
+ kinds is ignored. An unknown kind is an error.
34
+
35
+ ## EXIT STATUS
36
+
37
+ Exits with status `0` on success, and with status `1` on an unknown
38
+ kind or an invalid configuration (e.g., a base directory escaping the
39
+ project root).
40
+
41
+ ## EXAMPLES
42
+
43
+ ```sh
44
+ # list the source code files of the project
45
+ $ ase artifact list --kind code
46
+
47
+ # list the specification and documentation files, each with a header
48
+ $ ase artifact list --kind spec,docs
49
+ ```
50
+
51
+ ## SEE ALSO
52
+
53
+ `ase`(1), `ase-artifact`(1), `ase-artifact-name`(1), `ase-config`(1).
54
+
55
+ ## AUTHOR
56
+
57
+ Dr. Ralf S. Engelschall <rse@engelschall.com>