@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.
- package/dst/ase-agent-definition-api.d.ts +184 -0
- package/dst/ase-agent-definition-api.js +6 -0
- package/dst/ase-agent-definition-builtin/condenser.js +42 -0
- package/dst/ase-agent-definition-builtin/editor.js +45 -0
- package/dst/ase-agent-definition-builtin/estimator.js +98 -0
- package/dst/ase-agent-definition-builtin/implementer.js +121 -0
- package/dst/ase-agent-definition-builtin/integrator.js +56 -0
- package/dst/ase-agent-definition-builtin/qualifier.js +61 -0
- package/dst/ase-agent-definition-builtin/rebooter.js +41 -0
- package/dst/ase-agent-definition-builtin/researcher.js +77 -0
- package/dst/ase-agent-definition-core.js +827 -0
- package/dst/ase-agent-fleet.js +772 -0
- package/dst/ase-agent-process.js +232 -0
- package/dst/ase-agent-relay-client.js +509 -0
- package/dst/ase-agent-relay-core.js +213 -0
- package/dst/ase-agent-relay-server-bind.js +242 -0
- package/dst/ase-agent-relay-server-cli.js +50 -0
- package/dst/ase-agent-runtime-claim.js +189 -0
- package/dst/ase-agent-runtime-engine.js +1100 -0
- package/dst/ase-agent-runtime-exec.js +275 -0
- package/dst/ase-agent-runtime-phase.js +581 -0
- package/dst/ase-agent-runtime-request.js +272 -0
- package/dst/ase-agent-runtime-tool.js +207 -0
- package/dst/ase-agent-runtime.js +1316 -0
- package/dst/ase-agent.js +65 -0
- package/dst/ase-artifact.js +6 -5
- package/dst/ase-config-core.js +465 -0
- package/dst/ase-config-schema.js +351 -0
- package/dst/ase-config-scope.js +172 -0
- package/dst/ase-config.js +25 -585
- package/dst/ase-hook.js +228 -111
- package/dst/ase-lib-daemon-cli.js +130 -0
- package/dst/ase-lib-hash.js +20 -0
- package/dst/{ase-log.js → ase-lib-log.js} +40 -7
- package/dst/ase-lib-server-bind.js +115 -0
- package/dst/ase-lib-server-cli.js +474 -0
- package/dst/{ase-table.js → ase-lib-table.js} +1 -1
- package/dst/{ase-version.js → ase-lib-version.js} +3 -0
- package/dst/ase-man.js +96 -0
- package/dst/ase-mcp.js +166 -13
- package/dst/{ase-getopt.js → ase-service-getopt.js} +82 -80
- package/dst/{ase-markdown.js → ase-service-markdown.js} +18 -11
- package/dst/ase-service-otel.js +1246 -0
- package/dst/{ase-skills.js → ase-service-skills.js} +29 -64
- package/dst/ase-service-state.js +101 -0
- package/dst/ase-service.js +251 -76
- package/dst/ase-setup-common.js +141 -0
- package/dst/ase-setup-mcp.js +359 -0
- package/dst/ase-setup-settings.js +837 -0
- package/dst/ase-setup.js +113 -869
- package/dst/ase-spec.js +31 -19
- package/dst/ase-statusline.js +108 -43
- package/dst/ase-task-board-core.js +739 -0
- package/dst/ase-task-board-filter.js +127 -0
- package/dst/ase-task-board-flow.js +237 -0
- package/dst/ase-task-board-graph.js +497 -0
- package/dst/ase-task-board-stats.js +263 -0
- package/dst/ase-task-board-tui-control.js +775 -0
- package/dst/ase-task-board-tui-model.js +1008 -0
- package/dst/ase-task-board-tui-popup.js +626 -0
- package/dst/ase-task-board-tui-style.js +106 -0
- package/dst/ase-task-board-tui-view.js +847 -0
- package/dst/ase-task-board-tui.js +189 -0
- package/dst/ase-task-board-web-client.css +1 -0
- package/dst/ase-task-board-web-client.html +20 -0
- package/dst/ase-task-board-web-client.js +81 -0
- package/dst/ase-task-board-web-server.js +823 -0
- package/dst/ase-task-board.js +134 -0
- package/dst/ase-task-format.js +757 -0
- package/dst/ase-task-request.js +208 -0
- package/dst/ase-task-store-client.js +495 -0
- package/dst/ase-task-store-core.js +804 -0
- package/dst/ase-task-store-issues.js +237 -0
- package/dst/ase-task-store-plugin-api.js +6 -0
- package/dst/ase-task-store-plugin-ase.js +484 -0
- package/dst/ase-task-store-plugin-delegate.js +137 -0
- package/dst/ase-task-store-plugin-gitea.js +666 -0
- package/dst/ase-task-store-plugin-github.js +696 -0
- package/dst/ase-task-store-plugin-gitlab.js +668 -0
- package/dst/ase-task-store-server-bind.js +538 -0
- package/dst/ase-task-store-server-cli.js +154 -0
- package/dst/ase-task.js +1335 -357
- package/dst/{ase-compat.js → ase-util-compat.js} +2 -2
- package/dst/{ase-diagram.js → ase-util-diagram.js} +107 -32
- package/dst/{ase-meta.js → ase-util-meta.js} +2 -2
- package/dst/{ase-metric.js → ase-util-metric.js} +2 -2
- package/dst/{ase-mint.js → ase-util-mint.js} +19 -12
- package/dst/{ase-worktree.js → ase-util-worktree.js} +30 -19
- package/dst/ase-util.js +20 -0
- package/dst/ase.js +108 -32
- package/dst/man/ase-agent-adhoc.1 +515 -0
- package/dst/man/ase-agent-condenser.1 +193 -0
- package/dst/man/ase-agent-editor.1 +212 -0
- package/dst/man/ase-agent-estimator.1 +214 -0
- package/dst/man/ase-agent-fleet.1 +185 -0
- package/dst/man/ase-agent-implementer.1 +233 -0
- package/dst/man/ase-agent-integrator.1 +213 -0
- package/dst/man/ase-agent-qualifier.1 +214 -0
- package/dst/man/ase-agent-rebooter.1 +193 -0
- package/dst/man/ase-agent-relay.1 +128 -0
- package/dst/man/ase-agent-researcher.1 +217 -0
- package/dst/man/ase-agent.1 +264 -0
- package/dst/man/ase-artifact-list.1 +38 -0
- package/dst/man/ase-artifact-name.1 +39 -0
- package/dst/man/ase-artifact.1 +56 -0
- package/dst/man/ase-config-delete.1 +45 -0
- package/dst/man/ase-config-edit.1 +48 -0
- package/dst/man/ase-config-get.1 +46 -0
- package/dst/man/ase-config-init.1 +60 -0
- package/dst/man/ase-config-list.1 +42 -0
- package/dst/man/ase-config-set.1 +52 -0
- package/dst/man/ase-config.1 +225 -0
- package/dst/man/ase-hook-permission-request.1 +36 -0
- package/dst/man/ase-hook-pre-tool-use.1 +59 -0
- package/dst/man/ase-hook-session-end.1 +47 -0
- package/dst/man/ase-hook-session-persona.1 +37 -0
- package/dst/man/ase-hook-session-start.1 +81 -0
- package/dst/man/ase-hook-stop.1 +34 -0
- package/dst/man/ase-hook-user-prompt-submit.1 +34 -0
- package/dst/man/ase-hook.1 +51 -0
- package/dst/man/ase-man.1 +67 -0
- package/dst/man/ase-mcp.1 +61 -0
- package/dst/man/ase-service-log.1 +43 -0
- package/dst/man/ase-service-send.1 +47 -0
- package/dst/man/ase-service-start.1 +54 -0
- package/dst/man/ase-service-status.1 +46 -0
- package/dst/man/ase-service-stop.1 +37 -0
- package/dst/man/ase-service.1 +85 -0
- package/dst/man/ase-setup-disable.1 +44 -0
- package/dst/man/ase-setup-enable.1 +45 -0
- package/dst/man/ase-setup-install.1 +73 -0
- package/dst/man/ase-setup-mcp.1 +124 -0
- package/dst/man/ase-setup-status.1 +60 -0
- package/dst/man/ase-setup-statusline.1 +92 -0
- package/dst/man/ase-setup-telemetry.1 +92 -0
- package/dst/man/ase-setup-uninstall.1 +59 -0
- package/dst/man/ase-setup-update.1 +64 -0
- package/dst/man/ase-setup.1 +93 -0
- package/dst/man/ase-spec-export.1 +62 -0
- package/dst/man/ase-spec-lint.1 +40 -0
- package/dst/man/ase-spec-preview.1 +40 -0
- package/dst/man/ase-spec.1 +46 -0
- package/dst/man/ase-statusline.1 +189 -0
- package/dst/man/ase-task-assign.1 +71 -0
- package/dst/man/ase-task-board.1 +384 -0
- package/dst/man/ase-task-delete.1 +35 -0
- package/dst/man/ase-task-edit.1 +46 -0
- package/dst/man/ase-task-idscheme.1 +65 -0
- package/dst/man/ase-task-lifecycle.1 +57 -0
- package/dst/man/ase-task-list.1 +47 -0
- package/dst/man/ase-task-load.1 +36 -0
- package/dst/man/ase-task-newid.1 +61 -0
- package/dst/man/ase-task-purge.1 +37 -0
- package/dst/man/ase-task-rename.1 +44 -0
- package/dst/man/ase-task-request.1 +61 -0
- package/dst/man/ase-task-save.1 +48 -0
- package/dst/man/ase-task-status.1 +55 -0
- package/dst/man/ase-task-store.1 +194 -0
- package/dst/man/ase-task-view.1 +40 -0
- package/dst/man/ase-task.1 +160 -0
- package/dst/man/ase-util-compat.1 +25 -0
- package/dst/man/ase-util-diagram.1 +76 -0
- package/dst/man/ase-util-meta.1 +45 -0
- package/dst/man/ase-util-metric.1 +54 -0
- package/dst/man/ase-util-mint.1 +59 -0
- package/dst/man/ase-util-worktree.1 +72 -0
- package/dst/man/ase-util.1 +50 -0
- package/dst/man/ase.1 +124 -0
- package/package.json +79 -21
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.github/plugin/plugin.json +1 -1
- package/plugin/agents/ase-meta-diagram.md +12 -8
- package/plugin/agents/ase-repo-review.md +322 -0
- package/plugin/hooks/hooks-codex.json +5 -0
- package/plugin/hooks/hooks-copilot.json +5 -0
- package/plugin/hooks/hooks.json +8 -0
- package/plugin/meta/ase-common-approach.md +117 -0
- package/plugin/meta/ase-common-changeset.md +256 -0
- package/plugin/meta/ase-common-code.md +10 -173
- package/plugin/meta/ase-common-grill.md +317 -0
- package/plugin/meta/ase-common-resolve.md +305 -0
- package/plugin/meta/ase-common-task.md +83 -4
- package/plugin/meta/ase-constitution.md +0 -2
- package/plugin/meta/ase-format-specbook.md +208 -25
- package/plugin/meta/ase-format-specbook.yaml +242 -851
- package/plugin/meta/ase-format-task.md +669 -125
- package/plugin/meta/ase-persona.md +3 -4
- package/plugin/meta/ase-skill.md +9 -0
- package/plugin/mods/ase-mods.ts +409 -0
- package/plugin/mods/claude-code.d.ts +13417 -0
- package/plugin/skills/ase-arch-analyze/SKILL.md +1 -1
- package/plugin/skills/ase-arch-analyze/help.md +2 -2
- package/plugin/skills/ase-code-analyze/SKILL.md +59 -8
- package/plugin/skills/ase-code-analyze/help.md +29 -4
- package/plugin/skills/ase-code-edit/SKILL.md +107 -181
- package/plugin/skills/ase-code-edit/help.md +118 -31
- package/plugin/skills/ase-code-lint/SKILL.md +64 -13
- package/plugin/skills/ase-code-lint/help.md +32 -2
- package/plugin/skills/ase-docs-proofread/SKILL.md +4 -4
- package/plugin/skills/ase-docs-proofread/help.md +1 -1
- package/plugin/skills/ase-docs-refine/SKILL.md +4 -4
- package/plugin/skills/ase-docs-shorten/SKILL.md +4 -4
- package/plugin/skills/ase-help-intent/data.md +2164 -1087
- package/plugin/skills/ase-help-intent/help.md +1 -1
- package/plugin/skills/ase-help-skill/catalog.md +12 -9
- package/plugin/skills/ase-meta-brainstorm/SKILL.md +1 -1
- package/plugin/skills/ase-meta-config/SKILL.md +3 -4
- package/plugin/skills/ase-meta-config/help.md +31 -10
- package/plugin/skills/ase-meta-mint/SKILL.md +5 -5
- package/plugin/skills/ase-meta-mint/help.md +10 -5
- package/plugin/skills/ase-meta-why/help.md +1 -1
- package/plugin/skills/ase-meta-workflow/SKILL.md +7 -7
- package/plugin/skills/ase-meta-workflow/help.md +4 -4
- package/plugin/skills/ase-meta-workflow/sample.md +3 -3
- package/plugin/skills/ase-meta-workflow/workflow.txt +22 -18
- package/plugin/skills/{ase-meta-changelog → ase-repo-changelog}/SKILL.md +4 -3
- package/plugin/skills/{ase-meta-changelog → ase-repo-changelog}/help.md +5 -5
- package/plugin/skills/{ase-meta-commit → ase-repo-commit}/SKILL.md +6 -6
- package/plugin/skills/{ase-meta-commit → ase-repo-commit}/help.md +5 -5
- package/plugin/skills/{ase-meta-diff → ase-repo-diff}/SKILL.md +6 -6
- package/plugin/skills/{ase-meta-diff → ase-repo-diff}/help.md +8 -8
- package/plugin/skills/{ase-code-dissect → ase-repo-dissect}/SKILL.md +19 -19
- package/plugin/skills/{ase-code-dissect → ase-repo-dissect}/help.md +10 -12
- package/plugin/skills/ase-repo-merge/SKILL.md +346 -0
- package/plugin/skills/ase-repo-merge/help.md +107 -0
- package/plugin/skills/ase-repo-resolve/SKILL.md +158 -0
- package/plugin/skills/ase-repo-resolve/help.md +102 -0
- package/plugin/skills/ase-repo-review/SKILL.md +406 -0
- package/plugin/skills/ase-repo-review/help.md +181 -0
- package/plugin/skills/ase-spec-edit/SKILL.md +117 -183
- package/plugin/skills/ase-spec-edit/help.md +107 -26
- package/plugin/skills/ase-sync-reconcile/help.md +1 -1
- package/plugin/skills/ase-task-assign/SKILL.md +111 -0
- package/plugin/skills/ase-task-assign/help.md +119 -0
- package/plugin/skills/ase-task-condense/SKILL.md +21 -21
- package/plugin/skills/ase-task-condense/help.md +12 -10
- package/plugin/skills/ase-task-delete/SKILL.md +1 -1
- package/plugin/skills/ase-task-dissect/SKILL.md +71 -48
- package/plugin/skills/ase-task-dissect/help.md +10 -9
- package/plugin/skills/ase-task-edit/SKILL.md +379 -94
- package/plugin/skills/ase-task-edit/help.md +95 -22
- package/plugin/skills/ase-task-estimate/SKILL.md +492 -0
- package/plugin/skills/ase-task-estimate/help.md +158 -0
- package/plugin/skills/ase-task-grill/SKILL.md +246 -138
- package/plugin/skills/ase-task-grill/help.md +129 -26
- package/plugin/skills/ase-task-id/SKILL.md +8 -1
- package/plugin/skills/ase-task-id/help.md +6 -3
- package/plugin/skills/ase-task-implement/SKILL.md +535 -145
- package/plugin/skills/ase-task-implement/help.md +138 -47
- package/plugin/skills/ase-task-integrate/SKILL.md +549 -0
- package/plugin/skills/ase-task-integrate/help.md +187 -0
- package/plugin/skills/ase-task-list/SKILL.md +55 -23
- package/plugin/skills/ase-task-list/help.md +45 -21
- package/plugin/skills/ase-task-reboot/SKILL.md +84 -43
- package/plugin/skills/ase-task-reboot/help.md +28 -8
- package/plugin/skills/ase-task-rename/SKILL.md +10 -2
- package/plugin/skills/ase-task-research/SKILL.md +386 -0
- package/plugin/skills/ase-task-research/help.md +102 -0
- package/plugin/skills/ase-task-status/SKILL.md +137 -0
- package/plugin/skills/ase-task-status/help.md +80 -0
- package/plugin/skills/ase-task-view/SKILL.md +49 -24
- package/plugin/skills/ase-task-view/help.md +19 -9
- package/plugin/agents/ase-meta-review.md +0 -187
- package/plugin/skills/ase-code-craft/SKILL.md +0 -264
- package/plugin/skills/ase-code-craft/help.md +0 -122
- package/plugin/skills/ase-code-refactor/SKILL.md +0 -232
- package/plugin/skills/ase-code-refactor/help.md +0 -109
- package/plugin/skills/ase-code-resolve/SKILL.md +0 -289
- package/plugin/skills/ase-code-resolve/help.md +0 -116
- package/plugin/skills/ase-meta-review/SKILL.md +0 -210
- package/plugin/skills/ase-meta-review/help.md +0 -96
- package/plugin/skills/ase-task-preflight/SKILL.md +0 -166
- package/plugin/skills/ase-task-preflight/help.md +0 -82
- /package/dst/{ase-ignore.js → ase-lib-ignore.js} +0 -0
- /package/dst/{ase-stdio.js → ase-lib-stdio.js} +0 -0
- /package/dst/{ase-kv.js → ase-service-kv.js} +0 -0
- /package/dst/{ase-sleep.js → ase-service-sleep.js} +0 -0
- /package/dst/{ase-timestamp.js → ase-service-timestamp.js} +0 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
.TH "ASE-AGENT-RESEARCHER" "1" "October 2026" "2.0.0" "Agentic Software Engineering (ASE)"
|
|
2
|
+
.SH "NAME"
|
|
3
|
+
\fBase-agent-researcher\fR - Research Agent
|
|
4
|
+
.SH "SYNOPSIS"
|
|
5
|
+
.P
|
|
6
|
+
\fBase agent researcher 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 \fBphase\fR|\fBrequest\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 researcher status\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]
|
|
9
|
+
.P
|
|
10
|
+
\fBase agent researcher 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 researcher stop\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]
|
|
13
|
+
.SH "DESCRIPTION"
|
|
14
|
+
.P
|
|
15
|
+
\fBase agent researcher\fR researches for the plans of tasks, combining a Web research with a grounding in the source artifacts of the project (see the skill \fBase-task-research\fR). It runs in one of two modes (see \fB--mode\fR): the mode \fBphase\fR (the default) researches the plans of the tasks explicitly assigned to it in the \fBPlanning\fR phase of the \fBenterprise\fR task lifecycle model and is intended for \fIresearching and grounding the plan content\fR, while the mode \fBrequest\fR processes the research requests of tasks in any task lifecycle model and is intended for \fItopic-driven research\fR.
|
|
16
|
+
.P
|
|
17
|
+
In the mode \fBphase\fR (refused for any task lifecycle model other than \fBenterprise\fR), as a plan is researched only on the explicit request of a human, the researcher claims only the tasks in the state \fBDRAFTED\fR whose \fBAssignee:\fR frontmatter key already is its agent name (default: \fBresearcher\fR), i.e., which a human assigned to the researcher. 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 researcher in the mode \fBphase\fR or a cancelled \fBAfter:\fR predecessor. It moves each claimed task into \fBPLANNING\fR, tags it with \fBase-agent-researcher:active\fR, and researches the plan itself via the skill invocation \fBase-task-research
|
|
18
|
+
--refine\fR \fIid\fR in the working copy, grounded in the \fBSource:\fR of the task (like in the mode \fBrequest\fR, see below), appending the research report to the \fBresearch\fR attachment of the task and refining the plan by the recommendations of the report. The processing succeeds under the same conditions as in the mode \fBrequest\fR. Afterwards, on success as well as on failure, the researcher puts the task back into \fBDRAFTED\fR, removes its tag, and unassigns it. As the task is no longer assigned to the researcher, it is not claimed again, while assigning it to the researcher again requests another research. On an interrupt, the task is put back, untagged and with its previous assignee (i.e., still assigned to the researcher), into \fBDRAFTED\fR.
|
|
19
|
+
.P
|
|
20
|
+
In the mode \fBrequest\fR, the researcher processes the research requests of tasks. Like the request agent \fBeditor\fR, it is then bound to no phase and supports all task lifecycle models (\fBsolo\fR, \fBteam\fR, and \fBenterprise\fR).
|
|
21
|
+
.P
|
|
22
|
+
A research request is added by key \fBR\fR of the task board (see \fBase-task-board\fR(1)) or by \fBase task request\fR \fIid\fR \fBresearch\fR \[lB]\fItopic\fR\[rB] (see \fBase-task-request\fR(1)) as an attachment of type \fBtext/plain; charset=utf-8; kind="research"\fR with the topic as its data, mirrored in the tag \fBase-agent-research:pending\fR of the task (aggregated as \fB:active\fR while one is processed and as \fB:failed\fR once one failed). The topic is optional: a request without a topic researches the task plan itself.
|
|
23
|
+
.P
|
|
24
|
+
The researcher observes the tasks with this tag, except those in an activity status of the task lifecycle model, where the task is actively worked on (\fBteam\fR: \fBIMPLEMENTING\fR; \fBenterprise\fR: \fBPLANNING\fR, \fBIMPLEMENTING\fR, \fBQUALIFYING\fR, and \fBINTEGRATING\fR), and those still held by a phase agent (tagged \fBase-agent-\fR\fIkind\fR\fB:active\fR), which wait until their status changes resp. their tag is released.
|
|
25
|
+
.P
|
|
26
|
+
It claims the oldest request of such a task in a single conditional save by turning it into \fBkind="research-running"\fR and setting the \fBAssignee:\fR of the task to its agent name (remembering the previous assignee in the request), which keeps all other agents off the task during the research without touching its status. The request of a finished task is turned into \fBkind="research-failed"\fR instead.
|
|
27
|
+
.P
|
|
28
|
+
It then researches the topic via the skill invocation \fBase-task-research --refine\fR \fIid\fR\fB:\fR \[lB]\fItopic\fR\[rB] (with the whitespace of the topic collapsed) in the working copy, grounded in the \fBSource:\fR of the task, where a \fBbranch:\fR\fIname\fR source is checked out in the temporary, detached Git worktree \fB.ase/worktree/.temp/\fR\fIid\fR\fB-researcher\fR, passed to the skill via its internal option \fB--int-source-dir\fR, and removed afterwards. The skill combines a Web research with a grounding in the source artifacts of the project, appends its research report to the \fBresearch\fR attachment of the task (of type \fBtext/markdown;
|
|
29
|
+
charset=utf-8; kind="research"\fR), and refines the plan by the recommendations of the report, all in a single save, which happens only if the task was not changed meanwhile.
|
|
30
|
+
.P
|
|
31
|
+
Finally, in a single save, the researcher restores the previous assignee of the task (unless reassigned meanwhile) and removes the request if the \fBresearch\fR attachment was created or changed and the skill reported the attached research, or else turns it back into \fBkind="research"\fR on an interrupt, resp. into \fBkind="research-failed"\fR (with the reason, e.g., \fBskill reported an error\fR, \fBagent tool failed\fR, or \fBno new or changed attachment "text/markdown;research"\fR) otherwise.
|
|
32
|
+
.P
|
|
33
|
+
A finalization failing even after its retries is retried on every further dispatching.
|
|
34
|
+
.P
|
|
35
|
+
On its start in the mode \fBrequest\fR, the researcher marks the requests left in \fBkind="research-running"\fR by any terminated researcher process of the same user on the same host (whose run lock is gone or stale and whose process is no longer alive) as failed (\fBkind="research-failed"\fR), and restores the previous assignees of their tasks.
|
|
36
|
+
.P
|
|
37
|
+
Both modes can run side by side as two agents of the kind \fBresearcher\fR under different names (e.g., \fBresearcher\fR and \fBresearcher-request\fR). See \fBase-agent\fR(1) for the common mechanics of all agents.
|
|
38
|
+
.SH "OPTIONS"
|
|
39
|
+
.RS 0
|
|
40
|
+
.IP \(bu 4
|
|
41
|
+
\[lB]\fB-h\fR|\fB--help\fR\[rB]: Show usage information of \fBase agent researcher\fR (or of the given sub-command) only.
|
|
42
|
+
.RE 0
|
|
43
|
+
.P
|
|
44
|
+
All other options belong to the sub-commands (see \fBCOMMANDS\fR).
|
|
45
|
+
.SH "COMMANDS"
|
|
46
|
+
.RS 0
|
|
47
|
+
.IP \(bu 4
|
|
48
|
+
\fBase agent researcher start\fR \[lB]\fIoptions\fR\[rB]: Start the researcher 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:
|
|
49
|
+
.RS 4
|
|
50
|
+
.IP \(bu 4
|
|
51
|
+
\[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]: The name of the agent (default: \fBresearcher\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.
|
|
52
|
+
.sp
|
|
53
|
+
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. Agents of the kind \fBresearcher\fR under different names form a pool, competing for the same tasks and processing them in parallel to each other.
|
|
54
|
+
.IP \(bu 4
|
|
55
|
+
\[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.
|
|
56
|
+
.IP \(bu 4
|
|
57
|
+
\[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.
|
|
58
|
+
.IP \(bu 4
|
|
59
|
+
\[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.
|
|
60
|
+
.IP \(bu 4
|
|
61
|
+
\[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 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).
|
|
62
|
+
.IP \(bu 4
|
|
63
|
+
\[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). In the mode \fBrequest\fR, the agent is announced there as processing the \fBresearch\fR requests, which may have an empty prompt.
|
|
64
|
+
.IP \(bu 4
|
|
65
|
+
\[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 (default: none, i.e., all tasks are processed in the Git working copy the agent is started in, which is hence mandatory).
|
|
66
|
+
.sp
|
|
67
|
+
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).
|
|
68
|
+
.IP \(bu 4
|
|
69
|
+
\[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.
|
|
70
|
+
.IP \(bu 4
|
|
71
|
+
\[lB]\fB-m\fR|\fB--mode\fR \fImode\fR\[rB]: The mode of the agent (default: \fBphase\fR): \fBphase\fR researches and grounds the plans of the tasks explicitly assigned to the researcher in \fBDRAFTED\fR, while \fBrequest\fR researches the topics of the \fBresearch\fR requests of the tasks in any task lifecycle model. An invalid mode is an error. The built-in values of the following options are given per mode where they differ, and in the mode \fBrequest\fR, the options for \fBphase\fR only (\fB--unclaimed\fR, \fB--state-\fR*, \fB--tag-success\fR, \fB--tag-failure\fR, \fB--tag-retry\fR, \fB--assign-required\fR, and \fB--attach-skip\fR) are not allowed.
|
|
72
|
+
.IP \(bu 4
|
|
73
|
+
\[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: \fBResearch and ground the plans of assigned tasks\fR (mode \fBphase\fR) resp. \fBResearch topics for tasks on request\fR (mode \fBrequest\fR).
|
|
74
|
+
.IP \(bu 4
|
|
75
|
+
\[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.
|
|
76
|
+
.IP \(bu 4
|
|
77
|
+
\[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 (mode \fBphase\fR) resp. \fBrequest\fR (mode \fBrequest\fR).
|
|
78
|
+
.IP \(bu 4
|
|
79
|
+
\[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: \fBsource\fR.
|
|
80
|
+
.IP \(bu 4
|
|
81
|
+
\[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 (mode \fBphase\fR) resp. not set (mode \fBrequest\fR). Hence, all task lifecycle models are supported in the mode \fBrequest\fR.
|
|
82
|
+
.IP \(bu 4
|
|
83
|
+
\[lB]\fB--serial\fR\[rB]: Process the tasks serially only, ignoring \fB--parallel\fR. Built-in: not set.
|
|
84
|
+
.IP \(bu 4
|
|
85
|
+
\[lB]\fB--unclaimed\fR\[rB]: Process the tasks of the incoming states without claiming them (\fBphase\fR only). Built-in: not set.
|
|
86
|
+
.IP \(bu 4
|
|
87
|
+
\[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.
|
|
88
|
+
.IP \(bu 4
|
|
89
|
+
\[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 (mode \fBphase\fR).
|
|
90
|
+
.IP \(bu 4
|
|
91
|
+
\[lB]\fB--state-activity\fR \fIstate\fR\[rB]: The state of a task during its processing. Built-in: \fBPLANNING\fR (mode \fBphase\fR).
|
|
92
|
+
.IP \(bu 4
|
|
93
|
+
\[lB]\fB--state-success\fR \fIstate\fR\[rB], \[lB]\fB--state-failure\fR \fIstate\fR\[rB]: The target state on success resp. failure, or \fBprevious\fR for the incoming state of the claim. Built-in: \fBDRAFTED\fR (mode \fBphase\fR).
|
|
94
|
+
.IP \(bu 4
|
|
95
|
+
\[lB]\fB--state-phase\fR \fIstate\fR\[rB]: The phase success state. Built-in: not set (mode \fBphase\fR), hence \fBDRAFTED\fR.
|
|
96
|
+
.IP \(bu 4
|
|
97
|
+
\[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. Built-in: not set (mode \fBphase\fR), hence \fBDRAFTED\fR, the first state, so the predecessors impose no gate.
|
|
98
|
+
.IP \(bu 4
|
|
99
|
+
\[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 (mode \fBphase\fR, hence \fBase-agent-researcher\fR) resp. \fBase-agent-research\fR (mode \fBrequest\fR, derived from the request name \fBresearch\fR).
|
|
100
|
+
.IP \(bu 4
|
|
101
|
+
\[lB]\fB--tag-success\fR \fItag\fR\[rB], \[lB]\fB--tag-failure\fR \fItag\fR\[rB]: The tag on success resp. failure (\fBphase\fR only). Built-in: \fBnone\fR (mode \fBphase\fR), as the unassignment of a processed task keeps it from being claimed again.
|
|
102
|
+
.IP \(bu 4
|
|
103
|
+
\[lB]\fB--tag-require\fR \fItag\fR\[rB]: A tag a claimable task has to carry (repeatable). Built-in: not set.
|
|
104
|
+
.IP \(bu 4
|
|
105
|
+
\[lB]\fB--tag-exclude\fR \fItag\fR\[rB]: A tag a claimable task must not carry (repeatable). Built-in: not set.
|
|
106
|
+
.IP \(bu 4
|
|
107
|
+
\[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.
|
|
108
|
+
.IP \(bu 4
|
|
109
|
+
\[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 (mode \fBphase\fR).
|
|
110
|
+
.IP \(bu 4
|
|
111
|
+
\[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.
|
|
112
|
+
.IP \(bu 4
|
|
113
|
+
\[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.
|
|
114
|
+
.IP \(bu 4
|
|
115
|
+
\[lB]\fB--request-name\fR \fIname\fR\[rB]: The name of the processed requests (\fBrequest\fR only). Generic default: the agent name. Built-in: \fBresearch\fR (mode \fBrequest\fR).
|
|
116
|
+
.IP \(bu 4
|
|
117
|
+
\[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: \fBresearched\fR (mode \fBrequest\fR).
|
|
118
|
+
.IP \(bu 4
|
|
119
|
+
\[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-research\fR.
|
|
120
|
+
.IP \(bu 4
|
|
121
|
+
\[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--refine{?source-dir: --int-source-dir
|
|
122
|
+
"{source-dir}"} {id}\fR (mode \fBphase\fR) resp. \fB--refine{?source-dir:
|
|
123
|
+
--int-source-dir "{source-dir}"} {id}:{?prompt: {prompt}}\fR (mode \fBrequest\fR), where the conditional \fB{?prompt:...}\fR makes the prompt optional.
|
|
124
|
+
.IP \(bu 4
|
|
125
|
+
\[lB]\fB--prompt-text\fR \fItemplate\fR\[rB]: The prompt text template to invoke instead of a skill. Built-in: not set.
|
|
126
|
+
.IP \(bu 4
|
|
127
|
+
\[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.
|
|
128
|
+
.IP \(bu 4
|
|
129
|
+
\[lB]\fB--prepare-run\fR \fIcmd\fR\[rB]: A shell command run in the working directory before the prompt (repeatable). Built-in: not set.
|
|
130
|
+
.IP \(bu 4
|
|
131
|
+
\[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, \fBclean\fR, and \fBattachment\fR.
|
|
132
|
+
.IP \(bu 4
|
|
133
|
+
\[lB]\fB--success-match\fR \fIregex\fR\[rB]: A regular expression an output line has to match (repeatable). Built-in: \fBstatus:\[rs]W*research
|
|
134
|
+
attached\[rs]b\fR.
|
|
135
|
+
.IP \(bu 4
|
|
136
|
+
\[lB]\fB--verdict-label\fR \fIlabel\fR\[rB]: The label after which the verdict is given in the output. Built-in: not set.
|
|
137
|
+
.IP \(bu 4
|
|
138
|
+
\[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.
|
|
139
|
+
.IP \(bu 4
|
|
140
|
+
\[lB]\fB--attach-output\fR \fIkind\fR\[rB]: The kind of the attachment storing the output lines of the prompt. Built-in: not set.
|
|
141
|
+
.IP \(bu 4
|
|
142
|
+
\[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: \fBtext/markdown;research\fR.
|
|
143
|
+
.IP \(bu 4
|
|
144
|
+
\[lB]\fB--finish-success\fR \fIcmd\fR\[rB]: A shell command run in the working directory after a successful processing. Built-in: not set.
|
|
145
|
+
.IP \(bu 4
|
|
146
|
+
\[lB]\fB--finish-failure\fR \fIcmd\fR\[rB]: A shell command run in the working directory after a failed processing. Built-in: not set.
|
|
147
|
+
.IP \(bu 4
|
|
148
|
+
\[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.
|
|
149
|
+
.IP \(bu 4
|
|
150
|
+
\[lB]\fB-h\fR|\fB--help\fR\[rB]: Show the usage information of the sub-command only.
|
|
151
|
+
.RE 0
|
|
152
|
+
.IP "" 4
|
|
153
|
+
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 \fBresearcher\fR). See \fBase-agent-adhoc\fR(1) for their full semantics.
|
|
154
|
+
.IP \(bu 4
|
|
155
|
+
\fBase agent researcher status\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]: Report whether the researcher agent of the name \fIname\fR (default: \fBresearcher\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).
|
|
156
|
+
.IP \(bu 4
|
|
157
|
+
\fBase agent researcher 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 researcher agent of the name \fIname\fR (default: \fBresearcher\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:
|
|
158
|
+
.RS 4
|
|
159
|
+
.IP \(bu 4
|
|
160
|
+
\[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.
|
|
161
|
+
.IP \(bu 4
|
|
162
|
+
\[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).
|
|
163
|
+
.IP \(bu 4
|
|
164
|
+
\[lB]\fB--name\fR \fIname\fR\[rB]: The name of the agent (default: \fBresearcher\fR), given in its long form only, as \fB-n\fR is the short form of \fB--lines\fR.
|
|
165
|
+
.RE 0
|
|
166
|
+
.IP \(bu 4
|
|
167
|
+
\fBase agent researcher stop\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]: Stop the researcher agent of the name \fIname\fR (default: \fBresearcher\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.
|
|
168
|
+
.RE 0
|
|
169
|
+
.SH "ENVIRONMENT"
|
|
170
|
+
.RS 0
|
|
171
|
+
.IP \(bu 4
|
|
172
|
+
\fBASE_TOOL\fR: The default agent tool of \fB--tool\fR (default: \fBclaude\fR).
|
|
173
|
+
.IP \(bu 4
|
|
174
|
+
\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.
|
|
175
|
+
.IP \(bu 4
|
|
176
|
+
\fBASE_HEADLESS\fR: Set to \fBtrue\fR for the agent tool processes spawned by the agent.
|
|
177
|
+
.RE 0
|
|
178
|
+
.SH "FILES"
|
|
179
|
+
.RS 0
|
|
180
|
+
.IP \(bu 4
|
|
181
|
+
\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.
|
|
182
|
+
.IP \(bu 4
|
|
183
|
+
\fB.ase/agent/\fR\fIname\fR\fB.log\fR: The log of the agent run in the background.
|
|
184
|
+
.IP \(bu 4
|
|
185
|
+
\fB.ase/worktree/.temp/\fR\fIid\fR\fB-researcher\fR: The temporary, detached Git worktree of a \fBbranch:\fR source of a task during its research (where a \fB#\fR of the task id is replaced by \fB_\fR).
|
|
186
|
+
.IP \(bu 4
|
|
187
|
+
\fIper-user state directory\fR\fB/agent-researcher/\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 researcher agent process, used to recover the research requests of terminated agent processes (see \fBINTERRUPTS AND RECOVERY\fR in \fBase-agent\fR(1)).
|
|
188
|
+
.RE 0
|
|
189
|
+
.SH "EXIT STATUS"
|
|
190
|
+
.P
|
|
191
|
+
\fBase agent researcher 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 in the mode \fBphase\fR, or a missing agent tool). \fBase agent researcher status\fR exits with status \fB1\fR if the agent is not running.
|
|
192
|
+
.SH "EXAMPLES"
|
|
193
|
+
.P
|
|
194
|
+
.RS 2
|
|
195
|
+
.nf
|
|
196
|
+
# research and ground the plans of the tasks assigned to the researcher
|
|
197
|
+
$ ase agent researcher start
|
|
198
|
+
|
|
199
|
+
# request the research of a drafted task by assigning it to the researcher
|
|
200
|
+
$ ase task assign FOO-42 researcher
|
|
201
|
+
|
|
202
|
+
# process the research requests of the task board
|
|
203
|
+
$ ase agent researcher start -n researcher-request -m request
|
|
204
|
+
|
|
205
|
+
# request a research of a topic for a task from the command line
|
|
206
|
+
$ ase task request FOO-42 research "streaming JSON serialization of large data sets"
|
|
207
|
+
|
|
208
|
+
# request a research of the task plan itself (without a topic)
|
|
209
|
+
$ ase task request FOO-42 research
|
|
210
|
+
.fi
|
|
211
|
+
.RE
|
|
212
|
+
.SH "SEE ALSO"
|
|
213
|
+
.P
|
|
214
|
+
\fBase\fR(1), \fBase-agent\fR(1), \fBase-agent-rebooter\fR(1), \fBase-agent-condenser\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-task-request\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).
|
|
215
|
+
.SH "AUTHOR"
|
|
216
|
+
.P
|
|
217
|
+
Dr. Ralf S. Engelschall \fI\(larse@engelschall.com\(ra\fR
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
.TH "ASE-AGENT" "1" "October 2026" "2.0.0" "Agentic Software Engineering (ASE)"
|
|
2
|
+
.SH "NAME"
|
|
3
|
+
\fBase-agent\fR - Autonomous Task Lifecycle Agents
|
|
4
|
+
.SH "SYNOPSIS"
|
|
5
|
+
.P
|
|
6
|
+
\fBase agent\fR \fIagent\fR \fBstart\fR \[lB]\fIagent-options\fR\[rB] \[lB]\fB-f\fR|\fB--foreground\fR\[rB]
|
|
7
|
+
.P
|
|
8
|
+
\fBase agent\fR \fIagent\fR \fBstatus\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]
|
|
9
|
+
.P
|
|
10
|
+
\fBase agent\fR \fIagent\fR \fBlog\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\fR \fIagent\fR \fBstop\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]
|
|
13
|
+
.P
|
|
14
|
+
\fBase agent relay\fR \fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR \[lB]\fIoptions\fR\[rB]
|
|
15
|
+
.P
|
|
16
|
+
\fBase agent fleet\fR \fBinit\fR|\fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR \[lB]\fIoptions\fR\[rB]
|
|
17
|
+
.SH "DESCRIPTION"
|
|
18
|
+
.P
|
|
19
|
+
\fBase agent\fR runs the autonomous, headless agents of \fIASE\fR. Each agent observes the tasks of the task store of the project (see \fBase-task\fR(1)), claims the tasks it is responsible for, processes each of them by an \fIASE\fR skill (or a prompt text) through a headless agent tool (\fIAnthropic Claude Code CLI\fR, \fIGitHub Copilot CLI\fR, or \fIOpenAI Codex CLI\fR), and settles the task afterwards (status, tag, and assignee), until it is interrupted or stopped.
|
|
20
|
+
.P
|
|
21
|
+
The \fIagent\fR is one of the following agent kinds:
|
|
22
|
+
.RS 0
|
|
23
|
+
.IP \(bu 4
|
|
24
|
+
the built-in phase agents \fBimplementer\fR, \fBqualifier\fR, and \fBintegrator\fR, which each drive one phase of the \fBenterprise\fR task lifecycle model, so that the three agents together realize the model from the planned to the integrated tasks,
|
|
25
|
+
.IP \(bu 4
|
|
26
|
+
the built-in phase agents \fBrebooter\fR and \fBcondenser\fR, which re-create resp. condense the plans of the tasks of the \fBPlanning\fR phase of the \fBenterprise\fR task lifecycle model explicitly assigned to them (\fBDRAFTED\fR > \fBPLANNING\fR > \fBDRAFTED\fR),
|
|
27
|
+
.IP \(bu 4
|
|
28
|
+
the built-in request agent \fBeditor\fR, which processes the edit requests of tasks in any task lifecycle model,
|
|
29
|
+
.IP \(bu 4
|
|
30
|
+
the built-in agent \fBestimator\fR, which estimates the effort of tasks in any task lifecycle model, without claiming them (mode \fBphase\fR, intended for the final estimation), resp. on request (mode \fBrequest\fR, intended for dry-runs),
|
|
31
|
+
.IP \(bu 4
|
|
32
|
+
the built-in agent \fBresearcher\fR, which researches and grounds the plans of the tasks of the \fBPlanning\fR phase of the \fBenterprise\fR task lifecycle model explicitly assigned to it (mode \fBphase\fR), resp. researches a topic (or the plan itself) for tasks in any task lifecycle model on request (mode \fBrequest\fR, intended for topic-driven research),
|
|
33
|
+
.IP \(bu 4
|
|
34
|
+
an agent of a \fIdefinition kind\fR, whose entire behavior is configured by a definition file \fIkind\fR\fB.\fR\fIext\fR of the project or of the user,
|
|
35
|
+
.IP \(bu 4
|
|
36
|
+
the \fBadhoc\fR agent, whose entire behavior is configured by its options.
|
|
37
|
+
.RE 0
|
|
38
|
+
.P
|
|
39
|
+
Each agent runs in its own process, either detached in the background (the default) or, with \fB--foreground\fR, in the current process. Several agents are best run together as a \fIfleet\fR (see \fBase-agent-fleet\fR(1)), and each agent can pass its live presence to the task boards through an \fIagent relay\fR (see \fBase-agent-relay\fR(1)).
|
|
40
|
+
.P
|
|
41
|
+
The eight built-in agents are not hard-coded, but each mode of them is a declarative \fIdefinition\fR, run by the same agent engine as the agents of the definition kinds and the \fBadhoc\fR agent. Hence, every agent accepts all options \fB--\fR\fIgroup\fR\fB-\fR\fIitem\fR of the definitions (see \fBase-agent-adhoc\fR(1)), which override the definition of the agent, while a built-in agent keeps the identity of its kind: its runs, its presence (with its mode), its tags, and its agent-owned worktrees (\fIid\fR\fB-\fR\fIkind\fR) are named after its kind.
|
|
42
|
+
.SH "AGENT NAMES"
|
|
43
|
+
.P
|
|
44
|
+
Every agent has a \fIname\fR (option \fB--name\fR, default: its kind, e.g., \fBimplementer\fR or \fBadhoc\fR), which consists of up to 64 letters, digits, underscores, and dashes, starting with a letter or digit, and which must not be the name of another agent kind, \fBrelay\fR, or \fBfleet\fR.
|
|
45
|
+
.P
|
|
46
|
+
The name is used in the log lines of the agent (also in the shared processing log attachment \fBagent\fR), as the \fBAssignee:\fR of the tasks it processes, for its temporary directory, and for its process files \fB.ase/agent/\fR\fIname\fR\fB.yaml\fR and \fB.ase/agent/\fR\fIname\fR\fB.log\fR. Hence, multiple agents of the same kind are started under different names, e.g., \fBase agent implementer start -n impl-claude -t claude\fR and \fBase agent implementer start -n impl-codex -t codex\fR.
|
|
47
|
+
.P
|
|
48
|
+
The agents of the same kind form a \fIpool\fR: they compete for the same tasks, share the same tag (per mode), and process their tasks in parallel to each other.
|
|
49
|
+
.SH "TASK CLAIMING"
|
|
50
|
+
.P
|
|
51
|
+
A \fIphase\fR agent (all built-in agents except \fBeditor\fR, \fBestimator\fR, and \fBresearcher\fR in the mode \fBrequest\fR, and every definition of \fB--type
|
|
52
|
+
phase\fR without \fB--unclaimed\fR) observes the tasks in its \fIincoming\fR state(s) which do not yet carry its \fItag\fR (plain or with any value) in their \fBTags:\fR frontmatter key, and whose \fBAssignee:\fR frontmatter key is either still empty or already the assignee name of the agent (default: its name), so a task can be pre-assigned to a particular agent of a pool, while a task assigned to anybody else (e.g., a human) is left alone.
|
|
53
|
+
.P
|
|
54
|
+
An agent can require a task to be already assigned to it (like \fBrebooter\fR, \fBcondenser\fR, and \fBresearcher\fR in the mode \fBphase\fR, see \fB--assign-required\fR). Such an agent can leave a processed task untagged (see \fB--tag-success none\fR), as the unassignment of the task keeps it from being claimed again, while assigning it to the agent again requests another processing.
|
|
55
|
+
.P
|
|
56
|
+
The tag of a built-in agent is \fBase-agent-\fR\fIkind\fR, resp. one per mode for \fBimplementer\fR in mode \fBdraft\fR (\fBase-agent-implementer-draft\fR). The tag of any other agent is \fBase-agent-\fR\fIname\fR (see \fB--tag-name\fR).
|
|
57
|
+
.P
|
|
58
|
+
The agent claims each dispatchable task (in natural task id order, re-checked on every change of the task store) in a single conditional save of the task (retried on a concurrent change), which moves it into its \fIactivity\fR state, tags it with the value \fBactive\fR (so no other agent of this kind picks it up, even if the skill itself puts it back into the incoming state during its processing), and sets its \fBAssignee:\fR to the agent (for information only, as the tag alone guards the task).
|
|
59
|
+
.P
|
|
60
|
+
A task meanwhile tagged or (re)assigned is silently skipped instead.
|
|
61
|
+
.P
|
|
62
|
+
After the processing, again in a single conditional save, the task is unassigned (only if still assigned to the agent, and not meanwhile to somebody else, e.g., the \fBeditor\fR agent), tagged with its plain tag (or with the label of the processing as its value, like the verdict of \fBqualifier\fR), so no agent of this kind picks it up again, and moved into its \fIsuccess\fR or \fIfailure\fR (parking) state, where the pseudo state \fBprevious\fR restores the incoming state the task was claimed from (for an agent claiming tasks from multiple incoming states).
|
|
63
|
+
.P
|
|
64
|
+
A processing failure, or a processing exceeding the duration of \fB--timeout\fR, always leads to the failure state. A task whose status the skill itself moved elsewhere is tagged, too, and left in that state.
|
|
65
|
+
.P
|
|
66
|
+
The preparing of a processing (e.g., creating a worktree) and its finishing (e.g., committing and pushing a branch) are each limited to a fixed duration of 240 seconds, where exceeding it also leads to the failure state.
|
|
67
|
+
.P
|
|
68
|
+
A task the skill already put into the success state, but whose finishing failed (e.g., a branch which could not be pushed), and a task whose resulting state is not reachable from its current state, is instead tagged with the value \fBfailed\fR, unassigned, and left in its state for a manual intervention (which removes the tag), while the failure is logged as an error. A final status update of a processed task which fails even after its retries is retried in the background with a growing delay.
|
|
69
|
+
.P
|
|
70
|
+
A \fIrequest\fR agent (\fBeditor\fR, \fBestimator\fR and \fBresearcher\fR in the mode \fBrequest\fR, and every definition of \fB--type request\fR) instead processes the prompt requests attached to tasks in any lifecycle status (see \fBase task request\fR in \fBase-task-request\fR(1), \fBase-agent-editor\fR(1), and \fBase-agent-researcher\fR(1)).
|
|
71
|
+
.P
|
|
72
|
+
An \fIunclaimed\fR phase agent (\fBestimator\fR in the mode \fBphase\fR, and every definition of \fB--type phase\fR with \fB--unclaimed\fR) instead processes every task in one of its incoming states (each adapted onto the task lifecycle model of the project, e.g., \fBPLANNED\fR as \fBPLANNING\fR for \fBteam\fR and as \fBOPEN\fR for \fBsolo\fR) which does not carry its tag yet, independent of its assignee and its predecessors, without claiming it: it neither moves the task into an activity state, nor tags it as active, nor assigns it to itself, and it settles the task by its tag only, so it never changes its status and its assignee and keeps no other agent off it (see \fBase-agent-estimator\fR(1)).
|
|
73
|
+
.SH "PREDECESSORS"
|
|
74
|
+
.P
|
|
75
|
+
A phase agent claims a task only once all its predecessors passed the phase of the agent (or no longer exist). The predecessors of a task are the tasks of its \fBAfter:\fR frontmatter key and, for an explicit epic (a task whose \fBGroup:\fR is its own id), implicitly all other tasks of its group. An agent whose passed state (see below) is the first state of the task lifecycle model (like \fBrebooter\fR, \fBcondenser\fR, and \fBresearcher\fR in the mode \fBphase\fR, with \fBDRAFTED\fR) hence imposes no gate, except for a predecessor still being processed by an agent of its kind or a cancelled \fBAfter:\fR predecessor.
|
|
76
|
+
.P
|
|
77
|
+
A predecessor has passed the phase once it is in or beyond the \fIpassed\fR state of the agent (see \fB--state-passed\fR), or in the \fIsuccess\fR state and tagged as processed, where a predecessor still tagged by an agent of this kind with the value \fBactive\fR (while in the success state or not finished) resp. \fBfailed\fR (while still in the success state) has not passed it yet.
|
|
78
|
+
.P
|
|
79
|
+
A cancelled \fBAfter:\fR predecessor never passes (as the task might depend on its never delivered result), while a cancelled member of an epic counts as dropped from it. A predecessor status foreign to the lifecycle model counts as the state it maps onto.
|
|
80
|
+
.P
|
|
81
|
+
A task still waiting for its predecessors is reported once (per change of the reason), while a task referencing unknown predecessors (treated as passed), waiting for cancelled predecessors, or waiting in a dependency cycle is warned about once. A task with predecessors is re-checked against a fresh listing right before its claim.
|
|
82
|
+
.SH "PROCESSING"
|
|
83
|
+
.P
|
|
84
|
+
Each task is processed through the headless agent tool of \fB--tool\fR, with the environment variable \fBASE_HEADLESS=true\fR and without any standard input, i.e., via
|
|
85
|
+
.RS 0
|
|
86
|
+
.IP \(bu 4
|
|
87
|
+
\fBclaude\fR \[lB]\fB--add-dir\fR \fIdir\fR ...\[rB] \fB-p --output-format stream-json
|
|
88
|
+
--verbose --disallowedTools AskUserQuestion --permission-mode auto
|
|
89
|
+
--permission-prompts none\fR \fIprompt\fR,
|
|
90
|
+
.IP \(bu 4
|
|
91
|
+
\fBcopilot\fR \[lB]\fB--add-dir\fR \fIdir\fR ...\[rB] \fB--allow-all-tools --no-ask-user
|
|
92
|
+
--no-color --output-format json -p\fR \fIprompt\fR, resp.
|
|
93
|
+
.IP \(bu 4
|
|
94
|
+
\fBcodex exec\fR \[lB]\fB--add-dir\fR \fIdir\fR ...\[rB] \fB--json --approve-for-me
|
|
95
|
+
--color never\fR \fIprompt\fR,
|
|
96
|
+
.RE 0
|
|
97
|
+
.P
|
|
98
|
+
where risky actions are denied or automatically reviewed instead of being prompted for, and where each additional directory a skill needs access to besides its working directory is granted through an additional \fB--add-dir\fR \fIdir\fR. A skill \fIprompt\fR is \fB/\fR\fIskill\fR \fIargs\fR (\fBclaude\fR and \fBcopilot\fR) resp. \fB$\fR\fIskill\fR \fIargs\fR (\fBcodex\fR), where an un-namespaced \fIASE\fR skill (\fBase-*\fR) gets the plugin namespace \fBase:\fR for \fBclaude\fR only.
|
|
99
|
+
.P
|
|
100
|
+
The agent tool and, for an agent of a working directory other than \fBproject\fR (i.e., all built-in agents except \fBrebooter\fR, \fBcondenser\fR, and \fBestimator\fR, see \fB--workdir\fR), \fBgit\fR have to be found in \fB$PATH\fR.
|
|
101
|
+
.P
|
|
102
|
+
All processing information, including the output of the agent tool (which streams its agent messages, tool calls, failures, and final result as JSONL events), is logged (to standard error, see \fBase\fR(1), resp. to the log file of the agent) with timestamp prefixes in real time, followed by the usage of the agent tool as wall time (measured locally), output tokens (of \fBclaude\fR and \fBcodex\fR), and costs in USD (of \fBclaude\fR only), with \fBn/a\fR for what the agent tool does not report.
|
|
103
|
+
.P
|
|
104
|
+
At the end of each processing, the log lines of the processing (with at most 20 lines of each agent message) are appended to the attachment of the task with the type \fBtext/plain; charset=utf-8; kind="agent"\fR (created if not existing yet), which is shared by all agents, whose log lines carry their name. If the AI usage accounting is enabled (\fBtelemetry.enabled\fR), the usage is additionally booked onto the usage attachment of the task (without any human time and costs, as the agent runs unattended).
|
|
105
|
+
.SH "INTERRUPTS AND RECOVERY"
|
|
106
|
+
.P
|
|
107
|
+
On an interrupt (\fBSIGINT\fR, \fBSIGTERM\fR, \fBSIGHUP\fR, or \fBSIGQUIT\fR, e.g., by \fBase agent\fR \fIagent\fR \fBstop\fR), and on the failure of a concurrently run agent, the running processings are aborted and their tasks are put back, untagged and with their previous assignee, into the incoming state (while a task processed unclaimed is left untouched), while a repeated signal terminates the process at once (leaving the claimed tasks to the recovery described below).
|
|
108
|
+
.P
|
|
109
|
+
The claimed tasks of each run are recorded under a run lock in the \fIper-user state directory\fR (below a sub-directory per task store, as task ids are unique per task store only).
|
|
110
|
+
.P
|
|
111
|
+
Hence, the tasks of an agent terminated without this cleanup (e.g., killed or crashed) are recovered on the next start of an agent of its kind for the same task store on the same host by the same user: a task still in the activity state is put back the same way, and any other task still tagged as \fBactive\fR is tagged plain (as processed), but only while it is still assigned to the terminated agent and not claimed meanwhile by a live agent, where concurrently started agents never recover the same run.
|
|
112
|
+
.P
|
|
113
|
+
The requests left in processing by a terminated request agent are marked as failed instead, and the previous assignees of their tasks are restored.
|
|
114
|
+
.SH "WORKING COPY, CLONES, AND WORKTREES"
|
|
115
|
+
.P
|
|
116
|
+
The agents follow the \fBSource:\fR, \fBChangeset:\fR, and \fBTarget:\fR frontmatter keys of a task (or their configured defaults \fBproject.task.default.source\fR, \fBproject.task.default.changeset\fR, and \fBproject.task.default.target\fR, see \fBase-config\fR(1)). Their values are:
|
|
117
|
+
.RS 0
|
|
118
|
+
.IP \(bu 4
|
|
119
|
+
\fBworktree\fR: the Git working copy the agent is started in. For it, the agents create no own Git worktree, but work in the working copy directly, just adjusting its checked-out branch.
|
|
120
|
+
.sp
|
|
121
|
+
As concurrently processed tasks would interfere there, an agent handles at most one task at a time in the working copy itself (other tasks waiting until it is free again). This coordination does not extend to other agents (each running in its own process, also within a fleet) or humans working in the same working copy, so a working copy should be used directly by a single agent only, while the other agents are given \fB--repo\fR (or process tasks without \fBworktree\fR values only).
|
|
122
|
+
.IP \(bu 4
|
|
123
|
+
\fBbranch:\fR\fIname\fR: the Git branch \fIname\fR, checked out in an \fIASE\fR worktree below \fB.ase/worktree/\fR where needed, which is named after the branch (with every character other than letters, digits, \fB_\fR, and \fB-\fR replaced by \fB-\fR, runs of \fB-\fR reduced to one, and leading and trailing \fB-\fR and \fB_\fR removed, e.g., \fBfeature-x\fR for \fBfeature/x\fR).
|
|
124
|
+
.IP \(bu 4
|
|
125
|
+
\fBattachment:\fR\fIname\fR: the task attachment \fIname\fR (a change set as a diff), handled by the skills (\fBChangeset:\fR only).
|
|
126
|
+
.IP \(bu 4
|
|
127
|
+
\fBsource\fR (\fBTarget:\fR only): the \fBSource:\fR of the task.
|
|
128
|
+
.RE 0
|
|
129
|
+
.P
|
|
130
|
+
The placeholder \fB{id}\fR of a branch or attachment \fIname\fR reads as the id of the task (with every character other than letters, digits, \fB_\fR, and \fB-\fR replaced by \fB-\fR, runs of \fB-\fR reduced to one, and leading and trailing \fB-\fR and \fB_\fR removed, e.g., \fB12\fR for \fB#12\fR and \fBFOO-12\fR for \fBFOO#12\fR), e.g., the \fBChangeset:\fR default \fBbranch:cs-{id}\fR implements every task onto its own branch.
|
|
131
|
+
.P
|
|
132
|
+
Without \fB--repo\fR, all tasks are processed in the Git working copy the agent is started in, which is hence mandatory (except for an agent of the working directory \fBproject\fR, like \fBrebooter\fR, \fBcondenser\fR, and \fBestimator\fR, which work in the project root only, where \fBrebooter\fR, \fBcondenser\fR, and \fBestimator\fR do not accept \fB--repo\fR and \fB--tempdir\fR at all, while any other such agent ignores them).
|
|
133
|
+
.P
|
|
134
|
+
With \fB--repo\fR \fIurl\fR, each agent instead clones the Git repository \fIurl\fR once into its temporary directory (removed on termination) and processes every task without a \fBworktree\fR value in its own temporary Git worktree of this clone (below \fBwork/\fR of the temporary directory), where the Git operations on the clone are serialized: before each task, its default branch and the branches of the task (unless checked out for another task) are refreshed from the origin, and afterwards a changed \fBbranch:\fR changeset resp. target is pushed back to the origin, where a rejected push fails the task.
|
|
135
|
+
.P
|
|
136
|
+
If such a push fails after the skill already put the task into its success state, the work is kept as the branch \fBase-agent-rescue/\fR\fIid\fR in the clone, the task is tagged with the value \fBfailed\fR, and the temporary directory is preserved (instead of being removed on termination) for a manual recovery.
|
|
137
|
+
.P
|
|
138
|
+
Only a task with a \fBworktree\fR value then requires the agent to be started inside a Git working copy. As the skills run inside the clone, \fB--repo\fR requires a task store not located in the working copy (i.e., not a local \fBase:\fR\fIpath\fR one).
|
|
139
|
+
.P
|
|
140
|
+
In the names of all \fIASE\fR worktrees derived from a task id, a \fB#\fR of the id (e.g., of the \fBseq:#%d\fR id scheme of the issue tracker task stores) is replaced by \fB_\fR, as neither a worktree name nor a branch name can carry it.
|
|
141
|
+
.P
|
|
142
|
+
The temporary directory of an agent holds the clone and other temporary files: by default, it is securely created as a fresh, private directory \fBase-agent-\fR\fIname\fR\fB-\fR\fIrandom\fR below the system temporary directory, while \fB--tempdir\fR \fIdir\fR forces it to be the sub-directory \fIname\fR of \fIdir\fR, where \fB%p\fR in \fIdir\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.
|
|
143
|
+
.P
|
|
144
|
+
A missing \fIdir\fR is created private to the current user (and removed again on termination if empty), while an existing \fIdir\fR has to be a directory (no symbolic link) owned by the current user. A sub-directory \fIname\fR left over by an earlier run is removed only if its owning process is no longer alive and it holds no work preserved for a manual recovery, and otherwise refused.
|
|
145
|
+
.SH "AGENT RELAY"
|
|
146
|
+
.P
|
|
147
|
+
With an agent relay (\fB--agent-relay\fR \fIurl\fR, else the configured \fBproject.relay.url\fR, given 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, optionally without certificate verification), each agent additionally passes its live presence to the task boards (see \fBase-task-board\fR(1)): its state (\fBwaiting\fR, or \fBbusy\fR with the ids of its tasks) immediately on every change, its usage of the agent tool (in total and by its last job) immediately after each finished job, its new processing log lines (coalesced to at most four announcements per second), and a heartbeat every 10 seconds, and it removes its presence on termination.
|
|
148
|
+
.P
|
|
149
|
+
The relay requires an explicit \fBproject.id\fR. Its bearer token is the one embedded in the URL, else \fB$ASE_AGENT_RELAY_TOKEN\fR, else \fBproject.relay.token\fR, else the token of the locally started agent relay (or of the locally started task store co-hosting it), if the URL addresses it.
|
|
150
|
+
.P
|
|
151
|
+
An unreachable relay is warned about once per outage and never disturbs the processing of the tasks, where the not yet passed log lines are kept (at most 100) and passed once the relay is reachable again. A presence rejected by the relay is warned about with its reason and retried after a growing delay (from 1 up to 15 minutes).
|
|
152
|
+
.SH "DEFINITION KINDS"
|
|
153
|
+
.P
|
|
154
|
+
A \fIdefinition kind\fR is an agent kind of its own, discovered from a definition file \fIkind\fR\fB.\fR\fIext\fR of the project (\fB.ase/agents/\fR, intended to be versioned) or of the user (\fIper-user configuration directory\fR\fB/agents/\fR), where a definition kind of the project shadows one of the user, and both shadow a built-in agent of the same kind (whose \fB--mode\fR then no longer exists). For instance, \fB.ase/agents/reviewer.mts\fR yields \fBase agent reviewer start\fR.
|
|
155
|
+
.P
|
|
156
|
+
The extensions are, in descending precedence, \fB.yaml\fR, \fB.yml\fR, \fB.ts\fR, \fB.mts\fR, \fB.js\fR, \fB.mjs\fR, and \fB.cjs\fR. The definition files are discovered on the commands \fBase agent\fR ... only, where a file of an invalid kind name (other than up to 64 letters, digits, underscores, and dashes, starting with a letter or digit), of the kind name \fBadhoc\fR, \fBrelay\fR, or \fBfleet\fR, or of an already discovered kind name in the same directory is skipped with a warning.
|
|
157
|
+
.P
|
|
158
|
+
An agent of a definition kind accepts the same options as \fBase agent adhoc start\fR, except \fB--definition\fR, and \fB--repo\fR and \fB--tempdir\fR are silently ignored with \fB--workdir project\fR. See \fBase-agent-adhoc\fR(1) for the format of the definition files, all options of the definitions, their templates, their hooks, and example definitions.
|
|
159
|
+
.SH "OPTIONS"
|
|
160
|
+
.RS 0
|
|
161
|
+
.IP \(bu 4
|
|
162
|
+
\[lB]\fB-h\fR|\fB--help\fR\[rB]: Show usage information of \fBase agent\fR (or of the given sub-command) only.
|
|
163
|
+
.RE 0
|
|
164
|
+
.P
|
|
165
|
+
All other options belong to the sub-commands (see \fBCOMMANDS\fR and the manual pages of the agent kinds).
|
|
166
|
+
.SH "COMMANDS"
|
|
167
|
+
.P
|
|
168
|
+
The following sub-command groups exist:
|
|
169
|
+
.RS 0
|
|
170
|
+
.IP \(bu 4
|
|
171
|
+
\fBase agent rebooter\fR \fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR: The agent re-creating the plans of the \fBDRAFTED\fR tasks of the \fBenterprise\fR task lifecycle model explicitly assigned to it from scratch, putting them back into \fBDRAFTED\fR afterwards. See \fBase-agent-rebooter\fR(1).
|
|
172
|
+
.IP \(bu 4
|
|
173
|
+
\fBase agent condenser\fR \fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR: The agent compressing the wording of the plans of the \fBDRAFTED\fR tasks of the \fBenterprise\fR task lifecycle model explicitly assigned to it, putting them back into \fBDRAFTED\fR afterwards. See \fBase-agent-condenser\fR(1).
|
|
174
|
+
.IP \(bu 4
|
|
175
|
+
\fBase agent implementer\fR \fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR: The agent of the \fBImplementation\fR phase of the \fBenterprise\fR task lifecycle model, implementing the tasks from their \fBSource:\fR into their \fBChangeset:\fR, resp. drafting their implementation. See \fBase-agent-implementer\fR(1).
|
|
176
|
+
.IP \(bu 4
|
|
177
|
+
\fBase agent qualifier\fR \fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR: The agent of the \fBQualification\fR phase of the \fBenterprise\fR task lifecycle model, reviewing the \fBChangeset:\fR of the tasks. See \fBase-agent-qualifier\fR(1).
|
|
178
|
+
.IP \(bu 4
|
|
179
|
+
\fBase agent integrator\fR \fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR: The agent of the \fBIntegration\fR phase of the \fBenterprise\fR task lifecycle model, integrating the \fBChangeset:\fR of the tasks into their \fBTarget:\fR. See \fBase-agent-integrator\fR(1).
|
|
180
|
+
.IP \(bu 4
|
|
181
|
+
\fBase agent editor\fR \fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR: The agent processing the edit requests of tasks in any task lifecycle model. See \fBase-agent-editor\fR(1).
|
|
182
|
+
.IP \(bu 4
|
|
183
|
+
\fBase agent estimator\fR \fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR: The agent estimating the effort of the tasks without a valid \fBEffort:\fR key in any task lifecycle model, without claiming them (mode \fBphase\fR, intended for the final estimation), resp. of the tasks of the \fBestimate\fR requests (mode \fBrequest\fR, intended for dry-runs). See \fBase-agent-estimator\fR(1).
|
|
184
|
+
.IP \(bu 4
|
|
185
|
+
\fBase agent researcher\fR \fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR: The agent researching the plans of the \fBDRAFTED\fR tasks of the \fBenterprise\fR task lifecycle model explicitly assigned to it (mode \fBphase\fR, intended for researching and grounding the plan content), resp. processing the research requests of tasks in any task lifecycle model (mode \fBrequest\fR, intended for topic-driven research), appending a research report, grounded in the Web and in the source artifacts of the project, to the \fBresearch\fR attachment of the tasks. See \fBase-agent-researcher\fR(1).
|
|
186
|
+
.IP \(bu 4
|
|
187
|
+
\fBase agent\fR \fIkind\fR \fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR: The agent of the definition kind \fIkind\fR (see \fBDEFINITION KINDS\fR), with the same sub-commands and options as \fBase agent adhoc\fR, except \fB--definition\fR. See \fBase-agent-adhoc\fR(1).
|
|
188
|
+
.IP \(bu 4
|
|
189
|
+
\fBase agent adhoc\fR \fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR: An ad-hoc agent, whose entire behavior is given by its options. See \fBase-agent-adhoc\fR(1).
|
|
190
|
+
.IP \(bu 4
|
|
191
|
+
\fBase agent relay\fR \fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR: The per-user agent relay server, passing the live presence of the agents to the task boards. See \fBase-agent-relay\fR(1).
|
|
192
|
+
.IP \(bu 4
|
|
193
|
+
\fBase agent fleet\fR \fBinit\fR|\fBstart\fR|\fBstatus\fR|\fBlog\fR|\fBstop\fR: A fleet of agents (and of the agent relay they report to), running each in its own process and restarting it whenever it exits. See \fBase-agent-fleet\fR(1).
|
|
194
|
+
.RE 0
|
|
195
|
+
.P
|
|
196
|
+
The sub-commands of every agent kind \fIagent\fR are:
|
|
197
|
+
.RS 0
|
|
198
|
+
.IP \(bu 4
|
|
199
|
+
\fBase agent\fR \fIagent\fR \fBstart\fR \[lB]\fIagent-options\fR\[rB] \[lB]\fB-f\fR|\fB--foreground\fR\[rB]: Start the 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 (exit status 0).
|
|
200
|
+
.sp
|
|
201
|
+
With \fB--foreground\fR, the agent runs in the current process instead, logging to the terminal, until it is interrupted or stopped, where an agent of the same name already running is an error.
|
|
202
|
+
.IP \(bu 4
|
|
203
|
+
\fBase agent\fR \fIagent\fR \fBstatus\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]: Report whether the agent of the name \fIname\fR (default: its kind) is running (with its process id).
|
|
204
|
+
.IP \(bu 4
|
|
205
|
+
\fBase agent\fR \fIagent\fR \fBlog\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 agent of the name \fIname\fR (default: its kind) run in the background, where an agent of a fleet logs into the log of the fleet instead (see \fBase-agent-fleet\fR(1)). With \fB--lines\fR, only the last \fIn\fR lines are shown. With \fB--follow\fR, the last \fIn\fR lines (default: 10) are shown and then all newly appended lines are followed until interrupted. As \fB-n\fR is the short form of \fB--lines\fR, the name is given via \fB--name\fR only.
|
|
206
|
+
.IP \(bu 4
|
|
207
|
+
\fBase agent\fR \fIagent\fR \fBstop\fR \[lB]\fB-n\fR|\fB--name\fR \fIname\fR\[rB]: Stop the agent of the name \fIname\fR (default: its kind) by \fBSIGTERM\fR, waiting (up to 5 minutes) until it aborted its running processings and put their tasks back.
|
|
208
|
+
.RE 0
|
|
209
|
+
.SH "ENVIRONMENT"
|
|
210
|
+
.RS 0
|
|
211
|
+
.IP \(bu 4
|
|
212
|
+
\fBASE_TOOL\fR: The default agent tool of \fB--tool\fR (default: \fBclaude\fR).
|
|
213
|
+
.IP \(bu 4
|
|
214
|
+
\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.
|
|
215
|
+
.IP \(bu 4
|
|
216
|
+
\fBASE_HEADLESS\fR: Set to \fBtrue\fR for the agent tool processes spawned by the agents.
|
|
217
|
+
.IP \(bu 4
|
|
218
|
+
\fBPATH\fR: Searched for the agent tool (\fBclaude\fR, \fBcopilot\fR, or \fBcodex\fR) and \fBgit\fR.
|
|
219
|
+
.RE 0
|
|
220
|
+
.SH "FILES"
|
|
221
|
+
.RS 0
|
|
222
|
+
.IP \(bu 4
|
|
223
|
+
\fB.ase/agent/\fR\fIname\fR\fB.yaml\fR: The process state (kind, process id, and process start time) of the agent named \fIname\fR, existing while the agent runs.
|
|
224
|
+
.IP \(bu 4
|
|
225
|
+
\fB.ase/agent/\fR\fIname\fR\fB.log\fR: The log of the agent named \fIname\fR run in the background.
|
|
226
|
+
.IP \(bu 4
|
|
227
|
+
\fB.ase/agents/\fR\fIkind\fR\fB.\fR\fIext\fR, \fIper-user configuration directory\fR\fB/agents/\fR\fIkind\fR\fB.\fR\fIext\fR: The definition files of the definition kinds of the project resp. of the user.
|
|
228
|
+
.IP \(bu 4
|
|
229
|
+
\fB.ase/worktree/\fR: The \fIASE\fR worktrees created by the agents (and the skills).
|
|
230
|
+
.IP \(bu 4
|
|
231
|
+
\fIper-user state directory\fR\fB/agent-\fR\fIkind\fR\fB/\fR\fIstore-hash\fR\fB/\fR\fIrun-id\fR\fB.lock\fR and \fB.json\fR: The run lock (a directory, refreshed periodically and considered stale after 30 seconds without refresh) and the run record (process id, process start time, and claimed tasks) of each agent process of agent \fIkind\fR (\fBrebooter\fR, \fBcondenser\fR, \fBimplementer\fR, \fBqualifier\fR, \fBintegrator\fR, \fBeditor\fR, \fBestimator\fR, or \fBresearcher\fR, resp. \fBtag-\fR\fIword\fR per tag \fBase-agent-\fR\fIword\fR of the agents of the definition kinds and of \fBadhoc\fR), where \fIstore-hash\fR is the first 12 hex digits of the SHA-1 digest of the identity of the task store.
|
|
232
|
+
.sp
|
|
233
|
+
On termination, the lock is removed, and so is the record, unless it still records claimed tasks.
|
|
234
|
+
.RE 0
|
|
235
|
+
.SH "EXIT STATUS"
|
|
236
|
+
.P
|
|
237
|
+
\fBase agent\fR \fIagent\fR \fBstart\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 missing agent tool, an unsupported task lifecycle model, or, with \fB--one-shot\fR, a task store failing three checks in a row). \fBase agent\fR \fIagent\fR \fBstatus\fR exits with status \fB1\fR if the agent is not running. \fBase agent\fR without a sub-command shows its usage information and exits with status \fB1\fR.
|
|
238
|
+
.SH "EXAMPLES"
|
|
239
|
+
.P
|
|
240
|
+
.RS 2
|
|
241
|
+
.nf
|
|
242
|
+
# start the phase agents of the "enterprise" lifecycle model
|
|
243
|
+
$ ase agent rebooter start
|
|
244
|
+
$ ase agent condenser start
|
|
245
|
+
$ ase agent researcher start
|
|
246
|
+
$ ase agent implementer start -p 2
|
|
247
|
+
$ ase agent qualifier start -m judge
|
|
248
|
+
$ ase agent integrator start -m squash
|
|
249
|
+
|
|
250
|
+
# start two implementers of different agent tools as a pool
|
|
251
|
+
$ ase agent implementer start -n impl-claude -t claude
|
|
252
|
+
$ ase agent implementer start -n impl-codex -t codex
|
|
253
|
+
|
|
254
|
+
# follow the log of an agent and stop it again
|
|
255
|
+
$ ase agent implementer log -f --name impl-codex
|
|
256
|
+
$ ase agent implementer stop -n impl-codex
|
|
257
|
+
.fi
|
|
258
|
+
.RE
|
|
259
|
+
.SH "SEE ALSO"
|
|
260
|
+
.P
|
|
261
|
+
\fBase\fR(1), \fBase-agent-rebooter\fR(1), \fBase-agent-condenser\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-researcher\fR(1), \fBase-agent-adhoc\fR(1), \fBase-agent-relay\fR(1), \fBase-agent-fleet\fR(1), \fBase-task\fR(1), \fBase-task-board\fR(1), \fBase-task-request\fR(1), \fBase-config\fR(1).
|
|
262
|
+
.SH "AUTHOR"
|
|
263
|
+
.P
|
|
264
|
+
Dr. Ralf S. Engelschall \fI\(larse@engelschall.com\(ra\fR
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
.TH "ASE-ARTIFACT-LIST" "1" "October 2026" "2.0.0" "Agentic Software Engineering (ASE)"
|
|
2
|
+
.SH "NAME"
|
|
3
|
+
\fBase-artifact-list\fR - Resolve Artifact Kinds to Project-Relative File Paths
|
|
4
|
+
.SH "SYNOPSIS"
|
|
5
|
+
.P
|
|
6
|
+
\fBase artifact list\fR \[lB]\fB-h\fR|\fB--help\fR\[rB] \[lB]\fB--kind\fR \fIkinds\fR\[rB]
|
|
7
|
+
.SH "DESCRIPTION"
|
|
8
|
+
.P
|
|
9
|
+
\fBase artifact list\fR resolves one or more artifact kinds of the project to the project-relative (POSIX-style) paths of their files, driven by the configuration keys \fBproject.artifact.\fR\fIkind\fR\fB.basedir\fR and \fBproject.artifact.\fR\fIkind\fR\fB.files\fR and honoring the Git exclude rules, as described in \fBase-artifact\fR(1).
|
|
10
|
+
.P
|
|
11
|
+
The files of each kind are printed sorted, one per line, as a bullet list (\fB- \fR\fIfile\fR). When more than one kind is requested, the list of each kind is preceded by a header line \fB# \fR\fIkind\fR\fB:\fR. The kinds are printed in the requested order, while the partitioning of the files among the kinds always follows the fixed precedence \fBspec\fR, \fBcode\fR, \fBdocs\fR, \fBinfr\fR, with \fBothr\fR as the implicit catch-all.
|
|
12
|
+
.SH "OPTIONS"
|
|
13
|
+
.RS 0
|
|
14
|
+
.IP \(bu 4
|
|
15
|
+
\[lB]\fB-h\fR|\fB--help\fR\[rB]: Show usage information and exit.
|
|
16
|
+
.IP \(bu 4
|
|
17
|
+
\[lB]\fB--kind\fR \fIkinds\fR\[rB]: A comma-separated list of the artifact kinds to resolve, out of \fBspec\fR, \fBcode\fR, \fBdocs\fR, \fBinfr\fR, and \fBothr\fR (default: \fBspec,code,docs,infr,othr\fR, i.e., all kinds). Whitespace around the kinds is ignored. An unknown kind is an error.
|
|
18
|
+
.RE 0
|
|
19
|
+
.SH "EXIT STATUS"
|
|
20
|
+
.P
|
|
21
|
+
Exits with status \fB0\fR on success, and with status \fB1\fR on an unknown kind or an invalid configuration (e.g., a base directory escaping the project root).
|
|
22
|
+
.SH "EXAMPLES"
|
|
23
|
+
.P
|
|
24
|
+
.RS 2
|
|
25
|
+
.nf
|
|
26
|
+
# list the source code files of the project
|
|
27
|
+
$ ase artifact list --kind code
|
|
28
|
+
|
|
29
|
+
# list the specification and documentation files, each with a header
|
|
30
|
+
$ ase artifact list --kind spec,docs
|
|
31
|
+
.fi
|
|
32
|
+
.RE
|
|
33
|
+
.SH "SEE ALSO"
|
|
34
|
+
.P
|
|
35
|
+
\fBase\fR(1), \fBase-artifact\fR(1), \fBase-artifact-name\fR(1), \fBase-config\fR(1).
|
|
36
|
+
.SH "AUTHOR"
|
|
37
|
+
.P
|
|
38
|
+
Dr. Ralf S. Engelschall \fI\(larse@engelschall.com\(ra\fR
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
.TH "ASE-ARTIFACT-NAME" "1" "October 2026" "2.0.0" "Agentic Software Engineering (ASE)"
|
|
2
|
+
.SH "NAME"
|
|
3
|
+
\fBase-artifact-name\fR - Resolve a Filename within an Artifact Kind
|
|
4
|
+
.SH "SYNOPSIS"
|
|
5
|
+
.P
|
|
6
|
+
\fBase artifact name\fR \[lB]\fB-h\fR|\fB--help\fR\[rB] \[lB]\fB--kind\fR \fIkind\fR\[rB] \fIfilename\fR
|
|
7
|
+
.SH "DESCRIPTION"
|
|
8
|
+
.P
|
|
9
|
+
\fBase artifact name\fR resolves a \fIfilename\fR, given relative to the base directory of an artifact \fIkind\fR, to a project-relative (POSIX-style) path by prefixing it with the configured base directory \fBproject.artifact.\fR\fIkind\fR\fB.basedir\fR (see \fBase-artifact\fR(1)), and prints it. The file does not have to exist. The skills use it to name a new file of a kind, e.g., a new specification or source code file.
|
|
10
|
+
.SH "OPTIONS"
|
|
11
|
+
.RS 0
|
|
12
|
+
.IP \(bu 4
|
|
13
|
+
\[lB]\fB-h\fR|\fB--help\fR\[rB]: Show usage information and exit.
|
|
14
|
+
.IP \(bu 4
|
|
15
|
+
\[lB]\fB--kind\fR \fIkind\fR\[rB]: The artifact kind whose base directory is used: \fBspec\fR, \fBcode\fR, \fBdocs\fR, or \fBinfr\fR (default: \fBcode\fR). The implicit catch-all kind \fBothr\fR has no base directory and is rejected.
|
|
16
|
+
.RE 0
|
|
17
|
+
.SH "ARGUMENTS"
|
|
18
|
+
.RS 0
|
|
19
|
+
.IP \(bu 4
|
|
20
|
+
\fIfilename\fR: The filename, relative to the base directory of the kind. Backslashes are converted to slashes and leading slashes are stripped. It must not be empty and must not contain any \fB..\fR segment.
|
|
21
|
+
.RE 0
|
|
22
|
+
.SH "EXIT STATUS"
|
|
23
|
+
.P
|
|
24
|
+
Exits with status \fB0\fR on success, and with status \fB1\fR on an unknown or unsupported kind, an empty filename, or a filename with a \fB..\fR segment.
|
|
25
|
+
.SH "EXAMPLES"
|
|
26
|
+
.P
|
|
27
|
+
.RS 2
|
|
28
|
+
.nf
|
|
29
|
+
# resolve a source file name (with the default "project.artifact.code.basedir" of "src")
|
|
30
|
+
$ ase artifact name --kind code lib/util.ts
|
|
31
|
+
src/lib/util.ts
|
|
32
|
+
.fi
|
|
33
|
+
.RE
|
|
34
|
+
.SH "SEE ALSO"
|
|
35
|
+
.P
|
|
36
|
+
\fBase\fR(1), \fBase-artifact\fR(1), \fBase-artifact-list\fR(1), \fBase-config\fR(1).
|
|
37
|
+
.SH "AUTHOR"
|
|
38
|
+
.P
|
|
39
|
+
Dr. Ralf S. Engelschall \fI\(larse@engelschall.com\(ra\fR
|