@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,108 @@
1
+ # ase-task-request(1) -- Request the Processing of a Task by a Prompt
2
+
3
+ ## SYNOPSIS
4
+
5
+ `ase task request`
6
+ \[`-h`|`--help`\]
7
+ *id*
8
+ *name*
9
+ \[*prompt* ...\]
10
+
11
+ ## DESCRIPTION
12
+
13
+ **ase task request** requests the processing of the task *id* by the
14
+ *prompt* under the request name *name*, for an agent processing the
15
+ requests of this name (see `ase-agent`(1)): `edit` for the edit
16
+ requests of `ase agent editor` (the same as key `E` of the task board,
17
+ see `ase-task-board`(1)), `estimate` for the (re-)estimation requests
18
+ of `ase agent estimator --mode request` (see `ase-agent-estimator`(1)),
19
+ `research` for the research requests of `ase agent researcher` (see
20
+ `ase-agent-researcher`(1)), and any other name for the requests of a
21
+ request agent of a definition kind or of `ase agent adhoc` (with
22
+ `--type request` and `--request-name` *name*).
23
+
24
+ The request is attached to the task plan as an attachment of the type
25
+ `text/plain; charset=utf-8; kind="`*name*`"`, with the prompt as its
26
+ data, its whitespace-collapsed first 60 characters as its description
27
+ (resp. *name*` request without prompt` for an empty prompt), and its
28
+ creation and modification timestamps. The aggregated state of
29
+ the requests of the name is mirrored in the `Tags` frontmatter key of
30
+ the task as the tag `ase-agent-`*name*`:pending` (resp.
31
+ `ase-agent-editor:pending` for `edit`), as the agents and the task
32
+ boards see the task headers only.
33
+
34
+ While being processed, the request turns into `kind="`*name*`-running"`
35
+ (tag value `active`), and on a failure into `kind="`*name*`-failed"` (tag
36
+ value `failed`). A new request replaces all failed requests of the name.
37
+
38
+ The request is refused for a missing task, for a task in a finished
39
+ state of the task lifecycle model, for an empty prompt of an `edit`
40
+ request, and while a request of the name is being processed, as adding
41
+ a request would change the task plan under the agent processing the
42
+ running one. The prompt of any other request may be empty, for the
43
+ request agents ignoring the prompts of their requests (like `ase agent
44
+ estimator --mode request`) or taking them as optional (like `ase agent
45
+ researcher`, which then researches the task plan itself), while a
46
+ request agent consuming the prompts (by the placeholder `{prompt}` of
47
+ its prompt template, or by its hooks `prepare`, `prompt`, or `finish`,
48
+ see `ase-agent-adhoc`(1)) turns a request with an empty prompt into a
49
+ failed one.
50
+
51
+ The MCP tool `ase_task_request` provides the same functionality.
52
+
53
+ ## OPTIONS
54
+
55
+ - \[`-h`|`--help`\]:
56
+ Show usage information and exit.
57
+
58
+ ## ARGUMENTS
59
+
60
+ - *id*:
61
+ The id of the task.
62
+
63
+ - *name*:
64
+ The request name: a lower-case word of letters, digits, and dashes,
65
+ starting with a letter, not ending in `-running` or `-failed`, and
66
+ none of the built-in agent kinds `rebooter`, `condenser`,
67
+ `implementer`, `qualifier`, `integrator`, `editor`, `estimator`, and
68
+ `researcher` (as
69
+ its tag `ase-agent-`*name* is the one of a built-in agent). The name
70
+ `edit` selects the edit requests of `ase agent editor`, the name
71
+ `estimate` the estimation requests of `ase agent estimator --mode
72
+ request`, and the name `research` the research requests of `ase agent
73
+ researcher --mode request`.
74
+
75
+ - \[*prompt* ...\]:
76
+ The prompt of the request, with all its words joined by single
77
+ spaces (and leading and trailing whitespace removed), where an
78
+ omitted prompt is an empty one (refused for `edit`).
79
+
80
+ ## EXIT STATUS
81
+
82
+ `0` on success, `1` if the request name is invalid or the request is
83
+ refused.
84
+
85
+ ## EXAMPLES
86
+
87
+ ```sh
88
+ # request an edit of the plan of task "json-export"
89
+ $ ase task request json-export edit "Also support JSON5 output"
90
+
91
+ # request a lint report from a request agent of name "lint"
92
+ $ ase task request json-export lint focus on error handling
93
+
94
+ # request a re-estimation of the effort (without a prompt)
95
+ $ ase task request json-export estimate
96
+
97
+ # request a research of a topic for the task
98
+ $ ase task request json-export research streaming JSON serialization
99
+ ```
100
+
101
+ ## SEE ALSO
102
+
103
+ `ase`(1), `ase-task`(1), `ase-task-board`(1), `ase-agent`(1),
104
+ `ase-agent-editor`(1), `ase-agent-researcher`(1), `ase-agent-adhoc`(1).
105
+
106
+ ## AUTHOR
107
+
108
+ Dr. Ralf S. Engelschall <rse@engelschall.com>
@@ -0,0 +1,78 @@
1
+ # ase-task-save(1) -- Save a Task Plan from Standard Input
2
+
3
+ ## SYNOPSIS
4
+
5
+ `ase task save`
6
+ \[`-h`|`--help`\]
7
+ \[`-c`|`--create`\]
8
+ *id*
9
+
10
+ ## DESCRIPTION
11
+
12
+ **ase task save** reads a task plan in the textual task format (see
13
+ `ase util meta format-task`) from standard input and saves it under
14
+ the given *id* in the task store (see `ase-task`(1)), creating or
15
+ overwriting the task.
16
+
17
+ The text is parsed into the frontmatter block, the plan body, and the
18
+ attachment blocks, where a plan in a legacy format is normalized into
19
+ the current frontmatter shape first. The `Id` frontmatter key is
20
+ always taken from the *id* argument, and a missing `Type` key is set
21
+ to `text/vnd.ase.task`. A text without a closed frontmatter block is
22
+ taken as the plan body.
23
+
24
+ Attachment data given as the elision marker `[elided: `*N*` lines]` is
25
+ restored from the stored plan. The usage attachment (`kind="usage"`)
26
+ can be changed by a booking only: an overwrite keeps the stored usage
27
+ attachment, while a create drops any given one.
28
+
29
+ The `Status` frontmatter key is checked against the task lifecycle
30
+ model of the project: a changed status which is not a state of the
31
+ model, or which is not reachable from the previously saved status (or,
32
+ for a new task, from the initial state of the model) via one or more
33
+ transitions of the model, lets the save fail. An *id* not conforming
34
+ to the task id scheme of the project is saved, but warned about.
35
+
36
+ ## OPTIONS
37
+
38
+ - \[`-h`|`--help`\]:
39
+ Show usage information and exit.
40
+
41
+ - \[`-c`|`--create`\]:
42
+ Create the task only: fail if a task with *id* already exists,
43
+ instead of overwriting it (default: off). Intended for the first
44
+ save of a task whose *id* was obtained via `ase-task-newid`(1), as
45
+ only a `seq` id is reserved there, so a concurrently created task of
46
+ the same id is never overwritten.
47
+
48
+ ## ARGUMENTS
49
+
50
+ - *id*:
51
+ The id of the task, matching `[A-Za-z0-9#][A-Za-z0-9#_-]*`.
52
+
53
+ ## EXIT STATUS
54
+
55
+ `0` on success, `1` if the *id* is invalid, the plan is invalid (e.g.,
56
+ a multi-line frontmatter value, or a body which would be misread as
57
+ attachments), the `Status` is not a state of the model or not
58
+ reachable, or, with `--create`, the task already exists.
59
+
60
+ ## EXAMPLES
61
+
62
+ ```sh
63
+ # create a new task from a plan file
64
+ $ id=$(ase task newid "Export as JSON")
65
+ $ ase task save --create "$id" <plan.md
66
+
67
+ # round-trip a task plan through a filter
68
+ $ ase task load json-export | sed -e 's/^Kind:.*/Kind: CRAFTING/' | ase task save json-export
69
+ ```
70
+
71
+ ## SEE ALSO
72
+
73
+ `ase`(1), `ase-task`(1), `ase-task-load`(1), `ase-task-edit`(1),
74
+ `ase-task-newid`(1), `ase-task-status`(1).
75
+
76
+ ## AUTHOR
77
+
78
+ Dr. Ralf S. Engelschall <rse@engelschall.com>
@@ -0,0 +1,79 @@
1
+ # ase-task-status(1) -- Get or Set the Lifecycle Status of a Task
2
+
3
+ ## SYNOPSIS
4
+
5
+ `ase task status`
6
+ \[`-h`|`--help`\]
7
+ \[*id*\[`:`\]\]
8
+ \[*status*\]
9
+
10
+ ## DESCRIPTION
11
+
12
+ **ase task status** gets or sets the lifecycle status, i.e., the
13
+ `Status` frontmatter key, of the task plan with the given *id* in the
14
+ task store (see `ase-task`(1)).
15
+
16
+ Without *status*, the current status is printed to standard output,
17
+ where a plan without a `Status` key reads as the initial state of the
18
+ task lifecycle model of the project.
19
+
20
+ With *status*, the status is set and the change is logged as
21
+ `task: set status of "`*id*`" from "`*from*`" to "`*to*`"`. The
22
+ *status* is given case-insensitively and has to be a state of the task
23
+ lifecycle model of the project, which is reachable from the current
24
+ status via one or more transitions of the model (see
25
+ **TASK LIFECYCLE MODELS** in `ase-task`(1)); a current status foreign
26
+ to the model can be changed to any state, to allow its correction.
27
+
28
+ Only the frontmatter is changed: the `Modified` key is left alone, as
29
+ it tracks the changes of the plan body only.
30
+
31
+ ## OPTIONS
32
+
33
+ - \[`-h`|`--help`\]:
34
+ Show usage information and exit.
35
+
36
+ ## ARGUMENTS
37
+
38
+ - \[*id*\[`:`\]\]:
39
+ The id of the task (default: `$ASE_TASK_ID`, else `default`). A
40
+ trailing colon is stripped, which allows to mark a single argument
41
+ explicitly as the *id*: if only a single argument is given, it is
42
+ taken as *status* if it is a state of the task lifecycle model
43
+ (case-insensitively) and has no trailing colon, else as *id*.
44
+
45
+ - \[*status*\]:
46
+ The lifecycle status to set.
47
+
48
+ ## ENVIRONMENT
49
+
50
+ - `ASE_TASK_ID`:
51
+ The default task id (default: `default`).
52
+
53
+ ## EXIT STATUS
54
+
55
+ `0` on success, `1` if no such task exists, the *status* is not a
56
+ state of the task lifecycle model, or it is not reachable from the
57
+ current status.
58
+
59
+ ## EXAMPLES
60
+
61
+ ```sh
62
+ # print the status of the task "json-export"
63
+ $ ase task status json-export:
64
+
65
+ # move the task "json-export" into "SHELVED"
66
+ $ ase task status json-export shelved
67
+
68
+ # close the task of $ASE_TASK_ID
69
+ $ ase task status CLOSED
70
+ ```
71
+
72
+ ## SEE ALSO
73
+
74
+ `ase`(1), `ase-task`(1), `ase-task-lifecycle`(1), `ase-task-list`(1),
75
+ `ase-task-save`(1).
76
+
77
+ ## AUTHOR
78
+
79
+ Dr. Ralf S. Engelschall <rse@engelschall.com>
@@ -0,0 +1,377 @@
1
+ # ase-task-store(1) -- Manage the per-user task store REST API server
2
+
3
+ ## SYNOPSIS
4
+
5
+ `ase task store`
6
+ \[`-h`|`--help`\]
7
+ *command*
8
+ \[*options* \[...\]\]
9
+
10
+ `ase task store start`
11
+ \[`-a`|`--address` *host*\]
12
+ \[`-p`|`--port` *port*\]
13
+ \[`-t`|`--token` *token*\]
14
+ \[`-c`|`--cors` *origin*\]
15
+ \[`-m`|`--module` *name*\]
16
+ \[`-d`|`--basedir` *dir*\]
17
+ \[`-s`|`--solo`|`--no-solo`\]
18
+ \[`--with-agent-relay`|`--without-agent-relay`\]
19
+ \[`--tls-cert` *file* `--tls-key` *file*\]
20
+ \[`-f`|`--foreground`\]
21
+
22
+ `ase task store status`
23
+
24
+ `ase task store log`
25
+ \[`-f`|`--follow`\]
26
+ \[`-n`|`--lines` *n*\]
27
+
28
+ `ase task store stop`
29
+
30
+ ## DESCRIPTION
31
+
32
+ **ase task store** manages the *task store server*: a per-user (not
33
+ per-project), bearer token authenticated REST API server, which
34
+ persists the task plans of *all* projects registered with it and which
35
+ the `ase task` commands of a project use through a remote
36
+ `project.task.store.url` of the form
37
+ `ase://`*addr*`:`*port*\[`/`*token*\] resp.
38
+ `ases://`*addr*`:`*port*\[`/`*token*\]\[`?insecure`\] (see
39
+ `ase-task`(1)).
40
+
41
+ It can run locally or on a central host, as long as all clients reach
42
+ it. The REST API itself, its task plan model, and its event
43
+ notifications are described in `docs/task-api.md` of the *ASE*
44
+ distribution.
45
+
46
+ The server is *storage agnostic*: it implements the authentication,
47
+ the validation, the task lifecycle model checks, and the event
48
+ notifications itself, and delegates the *persistence* of projects and
49
+ task plans to a single *storage plugin* loaded at its start (see
50
+ **STORAGE PLUGINS** below).
51
+
52
+ The server is configured through its per-user configuration file
53
+ *per-user configuration directory*`/store.yaml` (see **FILES**), into
54
+ which the effective configuration of every start is persisted again,
55
+ so later starts, `ase task store status`, and `ase task store stop`
56
+ find and probe the running server with the very same address, port,
57
+ token, and TLS setting. Optionally, the server additionally co-hosts
58
+ the *agent relay* (see `ase-agent-relay`(1)), so a central host needs a
59
+ single server process only.
60
+
61
+ Without a *command*, the usage information is shown and the command
62
+ exits with status `1`.
63
+
64
+ ## OPTIONS
65
+
66
+ - \[`-h`|`--help`\]:
67
+ Show usage information of `ase task store` resp. of the given
68
+ *command* and exit.
69
+
70
+ ## COMMANDS
71
+
72
+ The following commands exist:
73
+
74
+ ### ase task store start
75
+
76
+ `ase task store start` \[*options*\]
77
+
78
+ Start the task store server in the background (detached, logging
79
+ into *per-user configuration directory*`/store.log`), or with
80
+ `--foreground` in the current process. Before the server is started,
81
+ the given port is validated, and the TLS certificate and key are
82
+ resolved (where both or none have to be given) and checked for
83
+ readability, so invalid options never leave no server running.
84
+
85
+ The start is *idempotent*: a server already running on the configured
86
+ address and port (as identified by probing its `/projects` endpoint) is
87
+ left alone and reported as `task store: already running on` *url*. If an
88
+ explicitly given option *deviates* from the configuration of the running
89
+ server (`--address`, `--port`, `--token`, `--cors`, `--tls-cert`,
90
+ `--tls-key`, `--module`, `--basedir`, `--solo`/`--no-solo`,
91
+ `--with-agent-relay`, or `--without-agent-relay`), the running server is
92
+ instead stopped and restarted with the new configuration.
93
+
94
+ A running server rejecting the configured token is an error. A
95
+ configured port held by a foreign service is re-allocated (with a
96
+ warning). Binding to a non-loopback *host* without TLS is warned about,
97
+ as the bearer token would then travel unencrypted over the network.
98
+
99
+ A detached server is awaited (for up to 10 seconds) until it responds
100
+ to the probe with the expected token, and is reported as `task store:
101
+ started on` *url* `(storage plugin "`*name*`")`. If it exits during
102
+ startup, does not respond, or its port is taken by a foreign service
103
+ meanwhile, it is terminated and the failure is reported together with
104
+ the last 20 lines of its log. The server terminates on `SIGTERM`,
105
+ `SIGINT`, `SIGHUP`, or `SIGQUIT`, stopping its storage plugin and
106
+ removing its `pid` from `store.yaml`. The options are:
107
+
108
+ - \[`-a`|`--address` *host*\]:
109
+ The IP address (or hostname) to bind to (default: the configured
110
+ `address`, else `127.0.0.1`). Use `0.0.0.0` resp. `::` to bind to
111
+ all interfaces (the local probes then connect to `127.0.0.1`
112
+ resp. `::1`).
113
+ - \[`-p`|`--port` *port*\]:
114
+ The TCP port to bind to, an integer in the range `1`..`65535`
115
+ (default: the configured `port`, else a free port allocated
116
+ randomly in the range `42000`..`44000`).
117
+ - \[`-t`|`--token` *token*\]:
118
+ The bearer token every request has to carry in its
119
+ `Authorization: Bearer` *token* header (default:
120
+ `$ASE_TASK_STORE_TOKEN`, else the configured `token`, else a
121
+ freshly generated random token of 48 hexadecimal digits). The
122
+ token grants *full* access to *all* projects of the server.
123
+ - \[`-c`|`--cors` *origin*\]:
124
+ Allow cross-origin browser requests (Cross-Origin Resource
125
+ Sharing, CORS) from *origin*, e.g. `http://localhost:5173`, or
126
+ from any origin with `*`. Repeatable for multiple origins
127
+ (default: the configured `cors` list, else none, i.e., no CORS
128
+ headers are emitted and cross-origin browser requests fail).
129
+ - \[`-m`|`--module` *name*\]:
130
+ The storage plugin to load: `ase` for the built-in file-based one,
131
+ `github`, `gitlab`, resp. `gitea` for the built-in GitHub, GitLab,
132
+ resp. Gitea Issues one, any other plain *name* (matching
133
+ `[A-Za-z0-9_-]+`) for the NPM package `ase-task-store-`*name*
134
+ (resolvable from the *ASE* installation), and a relative or absolute
135
+ path for a local module (default: the configured `storage.plugin`,
136
+ else `ase`).
137
+
138
+ The given plugin is persisted as `storage.plugin`.
139
+ - \[`-d`|`--basedir` *dir*\]:
140
+ The base directory of the built-in `ase` storage plugin (default:
141
+ the configured `storage.options.basedir`, resolved relative to
142
+ the per-user configuration directory, else `tasks` below it). A
143
+ given *dir* is persisted as `storage.options.basedir`. Ignored for
144
+ all other storage plugins.
145
+ - \[`-s`|`--solo`\]:
146
+ Let the built-in `ase` storage plugin store a *single* project
147
+ flat in its base directory, accepting *any* project id (default:
148
+ the configured `storage.options.solo`, else one sub-directory per
149
+ project). Persisted as `storage.options.solo`. Ignored for all
150
+ other storage plugins.
151
+ - \[`--no-solo`\]:
152
+ Let the built-in `ase` storage plugin store one sub-directory per
153
+ project, removing a configured `storage.options.solo`.
154
+ - \[`--with-agent-relay`\]:
155
+ Additionally co-host the agent relay (see `ase-agent-relay`(1)),
156
+ i.e., its `/agents` and `/projects/`*id*`/agents`... endpoints,
157
+ under the same address, port, and token (default: the configured
158
+ `relay`, else not co-hosted). Persisted as `relay`. Mutually
159
+ exclusive with `--without-agent-relay`.
160
+ - \[`--without-agent-relay`\]:
161
+ Do not co-host the agent relay, removing a configured `relay`.
162
+ Mutually exclusive with `--with-agent-relay`.
163
+ - \[`--tls-cert` *file*\]:
164
+ Serve HTTPS (and `wss://` for the WebSocket event endpoint)
165
+ instead of plain HTTP, with the PEM certificate (chain) in
166
+ *file*. Requires `--tls-key`. Default: the `project.task.store.crt`
167
+ configuration (resolved relative to the configuration file
168
+ defining it), unless `project.task.store.url` selects plain HTTP
169
+ via `ase://` on this host, else the configured `tls.cert`, else
170
+ plain HTTP. The effective path is persisted as `tls.cert`.
171
+ - \[`--tls-key` *file*\]:
172
+ The PEM private key in *file* for HTTPS. Requires `--tls-cert`.
173
+ Default: the `project.task.store.key` configuration (under the
174
+ same condition as for `--tls-cert`), else the configured
175
+ `tls.key`. The effective path is persisted as `tls.key`.
176
+ - \[`-f`|`--foreground`\]:
177
+ Run the server in the current process instead, logging to the
178
+ terminal, until it is interrupted (e.g. via `CTRL+C`) or stopped
179
+ via `ase task store stop`. An already running server with an
180
+ unchanged configuration is then an error.
181
+ - \[`-h`|`--help`\]:
182
+ Show usage information and exit.
183
+
184
+ ### ase task store status
185
+
186
+ `ase task store status`
187
+
188
+ Report whether the task store server is running, by probing the
189
+ configured address and port with the configured token. Prints `task
190
+ store: running on` *url* `(pid` *pid*`)`, followed by `with agent
191
+ relay` if the server co-hosts the agent relay, and exits with status
192
+ `0`. Otherwise it prints why it is not running -- no port configured,
193
+ port not responding, port in use by a foreign service, or a running
194
+ server rejecting the configured token -- and exits with status `1`.
195
+
196
+ ### ase task store log
197
+
198
+ `ase task store log` \[`-f`|`--follow`\] \[`-n`|`--lines` *n*\]
199
+
200
+ Show the log *per-user configuration directory*`/store.log` of the
201
+ task store server run in the background. A server run with
202
+ `--foreground` logs to the terminal instead, and without a log file
203
+ just an informational message is printed. The log file is trimmed
204
+ down to its last 2000 lines whenever a server is started on a log
205
+ file larger than 1 MB. The options are:
206
+
207
+ - \[`-f`|`--follow`\]:
208
+ Show the last *n* lines (default: `10`) and then, in the style of
209
+ `tail -f`, follow all newly appended lines until interrupted,
210
+ even once the server has stopped.
211
+ - \[`-n`|`--lines` *n*\]:
212
+ Show the last *n* lines only, where *n* is a positive integer
213
+ (default: all lines, or `10` with `--follow`).
214
+ - \[`-h`|`--help`\]:
215
+ Show usage information and exit.
216
+
217
+ ### ase task store stop
218
+
219
+ `ase task store stop`
220
+
221
+ Stop the task store server: it is first probed (as a stale process id
222
+ might meanwhile belong to a foreign process), then sent `SIGTERM`,
223
+ and awaited for up to 5 seconds until it is gone, and finally its
224
+ `pid` is removed from `store.yaml`. A server which is not running (or
225
+ not configured at all) is reported informationally with exit status
226
+ `0`. A responding server whose process id is unknown, resp. a server
227
+ not stopping within the timeout, is an error.
228
+
229
+ ## STORAGE PLUGINS
230
+
231
+ A storage plugin is a Node.js module default-exporting a factory
232
+ function, which receives the `storage.options` of `store.yaml`
233
+ verbatim (see `docs/task-api.md` for the plugin API). The following
234
+ built-in storage plugins exist:
235
+
236
+ - `ase`:
237
+ The default, file-based plugin, persisting the task plans in the
238
+ textual task format as `TASK-`*id*`.md` files. Its options are
239
+ `basedir` (the base directory, see `--basedir`), `solo` (see
240
+ `--solo`), and `lifecycle` (the task lifecycle model of newly
241
+ registered projects, default: `solo`).
242
+
243
+ Without `solo`, every project is stored below
244
+ *basedir*`/`*project-id*`/`, with its `PROJECT.yaml` as the project
245
+ registry entry (carrying the task lifecycle model, the task id
246
+ scheme, and the sequence number high-water mark). With `solo`, a
247
+ single project is stored flat in *basedir* itself, with a single
248
+ `PROJECT.yaml` there, and any project id is accepted -- which is
249
+ exactly what the local `ase:`*path* form of `project.task.store.url`
250
+ uses in-process, without any server.
251
+
252
+ - `github`:
253
+ Persists the task plans as the *issues* of GitHub repositories,
254
+ through the GitHub REST API.
255
+
256
+ Its options are `url` (the web URL of the GitHub instance, default:
257
+ `https://github.com`, else e.g. the one of a GitHub Enterprise
258
+ Server or Cloud), `token` (default: `$GITHUB_TOKEN`, else
259
+ `$GH_TOKEN`; required), `repos` (required, a mapping of each project
260
+ id onto its *owner*`/`*repo*), and `poll` (the polling interval of
261
+ the change detection in seconds, default: `60`, `0` disables it).
262
+
263
+ - `gitlab`:
264
+ Persists the task plans as the *issues* of GitLab projects, through
265
+ the GitLab REST API v4. Its options are `url` (the GitLab instance,
266
+ default: `$GITLAB_HOST`, else `https://gitlab.com`), `token` (default:
267
+ `$GITLAB_TOKEN`; required, a token with scope `api` and at least the
268
+ role *Planner* in the projects), `repos` (required, a mapping of each
269
+ project id onto its *namespace*`/`*project* path, with nested groups
270
+ allowed), and `poll` (as for `github`).
271
+
272
+ - `gitea`:
273
+ Persists the task plans as the *issues* of Gitea repositories,
274
+ through the Gitea REST API v1. Its options are `url` (the Gitea
275
+ instance, default: `https://gitea.com`), `token` (default:
276
+ `$GITEA_TOKEN`; required, a token with the scopes `write:issue` and
277
+ `read:repository` and write access to the repositories), `repos`
278
+ (required, a mapping of each project id onto its *owner*`/`*repo*),
279
+ and `poll` (as for `github`).
280
+
281
+ The issue tracker plugins register a project by the label
282
+ `ase:project` of its repository and map the task plan frontmatter onto
283
+ the issue state, assignees, labels, and dependencies, as detailed in
284
+ `docs/task-api.md`. The same plugins also run in-process (without any
285
+ server) for the `github:`, `gitlab:`, and `gitea+http[s]:` forms of
286
+ `project.task.store.url` (see `ase-task`(1)).
287
+
288
+ ## ENVIRONMENT
289
+
290
+ - `ASE_TASK_STORE_TOKEN`:
291
+ The default bearer token of `ase task store start` (taking precedence
292
+ over the configured `token`, but not over `--token`).
293
+
294
+ - `GITHUB_TOKEN`, `GH_TOKEN`:
295
+ The default access token of the `github` storage plugin.
296
+
297
+ - `GITLAB_HOST`, `GITLAB_TOKEN`:
298
+ The default instance and access token of the `gitlab` storage plugin.
299
+
300
+ - `GITEA_TOKEN`:
301
+ The default access token of the `gitea` storage plugin.
302
+
303
+ ## FILES
304
+
305
+ - *per-user configuration directory*`/store.yaml`:
306
+ The configuration and runtime state of the task store server (see
307
+ `ase`(1) for the location of the per-user configuration directory),
308
+ written with mode `0600`, as it carries the token.
309
+
310
+ Its keys are `address` (the bound address), `port` (the bound port),
311
+ `token` (the expected bearer token), `pid` (the process id of the
312
+ running server), `cors` (the list of allowed CORS origins),
313
+ `tls.cert` and `tls.key` (the paths of the PEM certificate and key,
314
+ resolved relative to the file), `relay` (`true` to co-host the agent
315
+ relay), `storage.plugin` (the storage plugin), and `storage.options`
316
+ (the options of the storage plugin, see **STORAGE PLUGINS**), as in
317
+ the example below.
318
+
319
+ - *per-user configuration directory*`/store.log`:
320
+ The log of the task store server run in the background.
321
+
322
+ - *per-user configuration directory*`/tasks/`:
323
+ The default base directory of the built-in `ase` storage plugin.
324
+
325
+ An example `store.yaml` is:
326
+
327
+ ```yaml
328
+ address: 127.0.0.1
329
+ port: 42042
330
+ token: 8f3c[...]
331
+ cors:
332
+ - http://localhost:5173
333
+ storage:
334
+ plugin: ase
335
+ options:
336
+ basedir: /Users/rse/Library/Application Support/ase/tasks
337
+ ```
338
+
339
+ ## EXIT STATUS
340
+
341
+ `ase task store status` exits with status `0` if the server is running
342
+ and with status `1` otherwise. All other commands exit with status `0`
343
+ on success and with status `1` on any error.
344
+
345
+ ## EXAMPLES
346
+
347
+ ```sh
348
+ # start the task store server locally and point the project to it
349
+ $ ase task store start --port 42042
350
+ $ ase config set project.task.store.url ase://127.0.0.1:42042
351
+
352
+ # start a central task store server with TLS and co-hosted agent relay
353
+ $ ase task store start --address 0.0.0.0 --port 42042 \
354
+ --tls-cert /etc/ssl/tasks.example.com.crt \
355
+ --tls-key /etc/ssl/tasks.example.com.key \
356
+ --with-agent-relay
357
+
358
+ # start a task store server on the GitHub Issues storage plugin
359
+ # (after configuring "storage.options.repos" in "store.yaml")
360
+ $ ase task store start --module github
361
+
362
+ # check and follow the server
363
+ $ ase task store status
364
+ $ ase task store log -f
365
+
366
+ # stop the server
367
+ $ ase task store stop
368
+ ```
369
+
370
+ ## SEE ALSO
371
+
372
+ `ase`(1), `ase-task`(1), `ase-task-board`(1), `ase-agent-relay`(1),
373
+ `ase-config`(1).
374
+
375
+ ## AUTHOR
376
+
377
+ Dr. Ralf S. Engelschall <rse@engelschall.com>
@@ -0,0 +1,50 @@
1
+ # ase-task-view(1) -- Show a Task Plan in the Pager
2
+
3
+ ## SYNOPSIS
4
+
5
+ `ase task view`
6
+ \[`-h`|`--help`\]
7
+ *id*
8
+
9
+ ## DESCRIPTION
10
+
11
+ **ase task view** loads the task plan with the given *id* from the task
12
+ store (see `ase-task`(1)) and shows it in the pager defined by `$PAGER`
13
+ (falling back to `more`), run through the shell (so a value with
14
+ arguments is supported) and fed with the plan via its standard input.
15
+ If standard output is not a terminal, the pager is bypassed and the
16
+ plan is written plainly to standard output.
17
+
18
+ ## OPTIONS
19
+
20
+ - \[`-h`|`--help`\]:
21
+ Show usage information and exit.
22
+
23
+ ## ARGUMENTS
24
+
25
+ - *id*:
26
+ The id of the task, matching `[A-Za-z0-9#][A-Za-z0-9#_-]*`.
27
+
28
+ ## ENVIRONMENT
29
+
30
+ - `PAGER`:
31
+ The pager command (default: `more`).
32
+
33
+ ## EXIT STATUS
34
+
35
+ `0` on success, `1` if no such task exists.
36
+
37
+ ## EXAMPLES
38
+
39
+ ```sh
40
+ $ PAGER="less -R" ase task view json-export
41
+ ```
42
+
43
+ ## SEE ALSO
44
+
45
+ `ase`(1), `ase-task`(1), `ase-task-load`(1), `ase-task-edit`(1),
46
+ `more`(1), `less`(1).
47
+
48
+ ## AUTHOR
49
+
50
+ Dr. Ralf S. Engelschall <rse@engelschall.com>