@rse/ase 2.0.3 → 2.0.5
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-hook.js +13 -4
- package/dst/ase-lib-version.js +14 -5
- package/dst/ase-man-catalog.js +229 -0
- package/dst/ase-man-render.js +278 -0
- package/dst/ase-man-tui.js +636 -0
- package/dst/ase-man.js +33 -27
- package/dst/ase-setup.js +2 -2
- package/dst/ase-spec.js +103 -20
- package/dst/ase-task-board-filter.js +5 -4
- package/dst/ase-task-board-web-client.js +26 -26
- package/dst/man/ase-agent-adhoc.md +1165 -0
- package/dst/man/ase-agent-condenser.md +383 -0
- package/dst/man/ase-agent-editor.md +441 -0
- package/dst/man/ase-agent-estimator.md +477 -0
- package/dst/man/ase-agent-fleet.md +358 -0
- package/dst/man/ase-agent-implementer.md +521 -0
- package/dst/man/ase-agent-integrator.md +449 -0
- package/dst/man/ase-agent-qualifier.md +426 -0
- package/dst/man/ase-agent-rebooter.md +384 -0
- package/dst/man/ase-agent-relay.md +262 -0
- package/dst/man/ase-agent-researcher.md +478 -0
- package/dst/man/ase-agent.md +628 -0
- package/dst/man/ase-artifact-list.md +57 -0
- package/dst/man/ase-artifact-name.md +56 -0
- package/dst/man/ase-artifact.md +92 -0
- package/dst/man/ase-config-delete.md +74 -0
- package/dst/man/ase-config-edit.md +83 -0
- package/dst/man/ase-config-get.md +70 -0
- package/dst/man/ase-config-init.md +110 -0
- package/dst/man/ase-config-list.md +68 -0
- package/dst/man/ase-config-set.md +92 -0
- package/dst/man/ase-config.md +426 -0
- package/dst/man/ase-hook-permission-request.md +61 -0
- package/dst/man/ase-hook-pre-tool-use.md +96 -0
- package/dst/man/ase-hook-session-end.md +71 -0
- package/dst/man/ase-hook-session-persona.md +65 -0
- package/dst/man/ase-hook-session-start.md +184 -0
- package/dst/man/ase-hook-stop.md +52 -0
- package/dst/man/ase-hook-user-prompt-submit.md +54 -0
- package/dst/man/ase-hook.md +93 -0
- package/dst/man/ase-man.md +195 -0
- package/dst/man/ase-mcp.md +102 -0
- package/dst/man/ase-service-log.md +59 -0
- package/dst/man/ase-service-send.md +60 -0
- package/dst/man/ase-service-start.md +93 -0
- package/dst/man/ase-service-status.md +58 -0
- package/dst/man/ase-service-stop.md +52 -0
- package/dst/man/ase-service.md +124 -0
- package/dst/man/ase-setup-disable.md +67 -0
- package/dst/man/ase-setup-enable.md +66 -0
- package/dst/man/ase-setup-install.md +116 -0
- package/dst/man/ase-setup-mcp.md +213 -0
- package/dst/man/ase-setup-status.md +101 -0
- package/dst/man/ase-setup-statusline.md +162 -0
- package/dst/man/ase-setup-telemetry.md +166 -0
- package/dst/man/ase-setup-uninstall.md +85 -0
- package/dst/man/ase-setup-update.md +117 -0
- package/dst/man/ase-setup.md +156 -0
- package/dst/man/ase-spec-export.md +99 -0
- package/dst/man/ase-spec-init.md +57 -0
- package/dst/man/ase-spec-lint.md +74 -0
- package/dst/man/ase-spec-preview.md +57 -0
- package/dst/man/ase-spec.md +85 -0
- package/dst/man/ase-statusline.md +330 -0
- package/dst/man/ase-task-assign.md +138 -0
- package/dst/man/ase-task-board.md +651 -0
- package/dst/man/ase-task-delete.md +46 -0
- package/dst/man/ase-task-edit.md +73 -0
- package/dst/man/ase-task-idscheme.md +92 -0
- package/dst/man/ase-task-lifecycle.md +92 -0
- package/dst/man/ase-task-list.md +86 -0
- package/dst/man/ase-task-load.md +48 -0
- package/dst/man/ase-task-newid.md +100 -0
- package/dst/man/ase-task-purge.md +49 -0
- package/dst/man/ase-task-rename.md +69 -0
- package/dst/man/ase-task-request.md +108 -0
- package/dst/man/ase-task-save.md +78 -0
- package/dst/man/ase-task-status.md +79 -0
- package/dst/man/ase-task-store.md +377 -0
- package/dst/man/ase-task-view.md +50 -0
- package/dst/man/ase-task.md +335 -0
- package/dst/man/ase-util-compat.md +38 -0
- package/dst/man/ase-util-diagram.md +140 -0
- package/dst/man/ase-util-meta.md +68 -0
- package/dst/man/ase-util-metric.md +74 -0
- package/dst/man/ase-util-mint.md +85 -0
- package/dst/man/ase-util-worktree.md +109 -0
- package/dst/man/ase-util.md +81 -0
- package/dst/man/ase.md +228 -0
- package/package.json +16 -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-code-lint.md +3 -3
- package/plugin/agents/ase-docs-proofread.md +3 -3
- package/plugin/agents/ase-docs-refine.md +3 -3
- package/plugin/agents/ase-spec-lint.md +338 -0
- package/plugin/mods/ase-mods-common.ts +444 -0
- package/plugin/mods/ase-mods-grill.ts +312 -0
- package/plugin/mods/ase-mods-help-browse.ts +405 -0
- package/plugin/mods/ase-mods-help-compose.ts +561 -0
- package/plugin/mods/ase-mods-help-find.ts +426 -0
- package/plugin/mods/ase-mods-help-hint.ts +134 -0
- package/plugin/mods/ase-mods-help-show.ts +142 -0
- package/plugin/mods/ase-mods.ts +214 -381
- package/plugin/mods/claude-code.d.ts +26 -3
- package/plugin/skills/ase-code-lint/SKILL.md +15 -15
- package/plugin/skills/ase-code-lint/help.md +21 -8
- package/plugin/skills/ase-help-intent/SKILL.md +2 -1
- package/plugin/skills/ase-help-intent/data.md +214 -9
- package/plugin/skills/ase-help-skill/catalog.md +1 -0
- package/plugin/skills/ase-meta-workflow/workflow.txt +2 -0
- package/plugin/skills/ase-repo-commit/SKILL.md +1 -0
- package/plugin/skills/ase-repo-merge/SKILL.md +1 -0
- package/plugin/skills/ase-spec-edit/SKILL.md +3 -3
- package/plugin/skills/ase-spec-edit/help.md +1 -1
- package/plugin/skills/ase-spec-lint/SKILL.md +695 -0
- package/plugin/skills/ase-spec-lint/help.md +184 -0
- package/plugin/skills/ase-task-implement/SKILL.md +24 -6
- package/plugin/skills/ase-task-implement/help.md +11 -1
- package/dst/man/ase-agent-adhoc.1 +0 -515
- package/dst/man/ase-agent-condenser.1 +0 -193
- package/dst/man/ase-agent-editor.1 +0 -212
- package/dst/man/ase-agent-estimator.1 +0 -214
- package/dst/man/ase-agent-fleet.1 +0 -185
- package/dst/man/ase-agent-implementer.1 +0 -233
- package/dst/man/ase-agent-integrator.1 +0 -213
- package/dst/man/ase-agent-qualifier.1 +0 -214
- package/dst/man/ase-agent-rebooter.1 +0 -193
- package/dst/man/ase-agent-relay.1 +0 -128
- package/dst/man/ase-agent-researcher.1 +0 -217
- package/dst/man/ase-agent.1 +0 -264
- package/dst/man/ase-artifact-list.1 +0 -38
- package/dst/man/ase-artifact-name.1 +0 -39
- package/dst/man/ase-artifact.1 +0 -56
- package/dst/man/ase-config-delete.1 +0 -45
- package/dst/man/ase-config-edit.1 +0 -48
- package/dst/man/ase-config-get.1 +0 -46
- package/dst/man/ase-config-init.1 +0 -60
- package/dst/man/ase-config-list.1 +0 -42
- package/dst/man/ase-config-set.1 +0 -52
- package/dst/man/ase-config.1 +0 -231
- package/dst/man/ase-hook-permission-request.1 +0 -36
- package/dst/man/ase-hook-pre-tool-use.1 +0 -59
- package/dst/man/ase-hook-session-end.1 +0 -47
- package/dst/man/ase-hook-session-persona.1 +0 -37
- package/dst/man/ase-hook-session-start.1 +0 -81
- package/dst/man/ase-hook-stop.1 +0 -34
- package/dst/man/ase-hook-user-prompt-submit.1 +0 -34
- package/dst/man/ase-hook.1 +0 -51
- package/dst/man/ase-man.1 +0 -67
- package/dst/man/ase-mcp.1 +0 -61
- package/dst/man/ase-service-log.1 +0 -43
- package/dst/man/ase-service-send.1 +0 -47
- package/dst/man/ase-service-start.1 +0 -54
- package/dst/man/ase-service-status.1 +0 -46
- package/dst/man/ase-service-stop.1 +0 -37
- package/dst/man/ase-service.1 +0 -85
- package/dst/man/ase-setup-disable.1 +0 -44
- package/dst/man/ase-setup-enable.1 +0 -45
- package/dst/man/ase-setup-install.1 +0 -73
- package/dst/man/ase-setup-mcp.1 +0 -124
- package/dst/man/ase-setup-status.1 +0 -60
- package/dst/man/ase-setup-statusline.1 +0 -92
- package/dst/man/ase-setup-telemetry.1 +0 -92
- package/dst/man/ase-setup-uninstall.1 +0 -59
- package/dst/man/ase-setup-update.1 +0 -64
- package/dst/man/ase-setup.1 +0 -93
- package/dst/man/ase-spec-export.1 +0 -62
- package/dst/man/ase-spec-lint.1 +0 -40
- package/dst/man/ase-spec-preview.1 +0 -40
- package/dst/man/ase-spec.1 +0 -46
- package/dst/man/ase-statusline.1 +0 -189
- package/dst/man/ase-task-assign.1 +0 -71
- package/dst/man/ase-task-board.1 +0 -384
- package/dst/man/ase-task-delete.1 +0 -35
- package/dst/man/ase-task-edit.1 +0 -46
- package/dst/man/ase-task-idscheme.1 +0 -65
- package/dst/man/ase-task-lifecycle.1 +0 -57
- package/dst/man/ase-task-list.1 +0 -47
- package/dst/man/ase-task-load.1 +0 -36
- package/dst/man/ase-task-newid.1 +0 -61
- package/dst/man/ase-task-purge.1 +0 -37
- package/dst/man/ase-task-rename.1 +0 -44
- package/dst/man/ase-task-request.1 +0 -61
- package/dst/man/ase-task-save.1 +0 -48
- package/dst/man/ase-task-status.1 +0 -55
- package/dst/man/ase-task-store.1 +0 -194
- package/dst/man/ase-task-view.1 +0 -40
- package/dst/man/ase-task.1 +0 -160
- package/dst/man/ase-util-compat.1 +0 -25
- package/dst/man/ase-util-diagram.1 +0 -76
- package/dst/man/ase-util-meta.1 +0 -45
- package/dst/man/ase-util-metric.1 +0 -54
- package/dst/man/ase-util-mint.1 +0 -59
- package/dst/man/ase-util-worktree.1 +0 -72
- package/dst/man/ase-util.1 +0 -50
- package/dst/man/ase.1 +0 -124
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
# ase-task(1) -- Manage Persisted Task Plans
|
|
2
|
+
|
|
3
|
+
## SYNOPSIS
|
|
4
|
+
|
|
5
|
+
`ase task`
|
|
6
|
+
\[`-h`|`--help`\]
|
|
7
|
+
*command*
|
|
8
|
+
\[*options* \[...\]\]
|
|
9
|
+
\[*args* \[...\]\]
|
|
10
|
+
|
|
11
|
+
## DESCRIPTION
|
|
12
|
+
|
|
13
|
+
**ase task** manages the persisted *task plans* of the current project.
|
|
14
|
+
A task plan is a Markdown document in the textual *ASE* task format
|
|
15
|
+
(see `ase util meta format-task`): a frontmatter block with the keys
|
|
16
|
+
`Type`, `Id`, `Created`, `Modified`, `Group`, `Phase`, `After`,
|
|
17
|
+
`Status`, `Assignee`, `Kind`, `Effort`, `Tags`, `Source`, `Changeset`,
|
|
18
|
+
and `Target`, followed by the plan body and optional attachment blocks.
|
|
19
|
+
|
|
20
|
+
The optional `Effort` key carries the estimated effort of the task as
|
|
21
|
+
*size* *hash*, with *size* one of the T-shirt sizes `XS`, `S`, `M`, `L`,
|
|
22
|
+
or `XL` (see `project.task.effort.scale` in `ase-config`(1)) and *hash*
|
|
23
|
+
the content hash of the plan body the size was given for. The task
|
|
24
|
+
store drops a *stale* `Effort` (whose *hash* no longer matches the
|
|
25
|
+
body, ignoring checkboxes, whitespace, and cancelled or deferred
|
|
26
|
+
bullet-points) on load and save, and stamps an `Effort` given without
|
|
27
|
+
*hash* with the content hash of the body on save.
|
|
28
|
+
|
|
29
|
+
All commands are forwarded to the *task store* selected by the
|
|
30
|
+
`project.task.store.url` configuration (see **TASK STORES** below). The
|
|
31
|
+
project is identified in the task store by `project.id` (default: the
|
|
32
|
+
sanitized basename of the project root, i.e., the Git top-level
|
|
33
|
+
directory, or the current working directory outside a Git working
|
|
34
|
+
tree).
|
|
35
|
+
|
|
36
|
+
The `Status` of the task plans follows the *task lifecycle model* of
|
|
37
|
+
the project (see **TASK LIFECYCLE MODELS** below), and new task ids
|
|
38
|
+
are generated after the *task id scheme* of the project (see
|
|
39
|
+
**TASK ID SCHEMES** below).
|
|
40
|
+
|
|
41
|
+
Without a *command*, the usage information is shown and the command
|
|
42
|
+
exits with status `1`.
|
|
43
|
+
|
|
44
|
+
## OPTIONS
|
|
45
|
+
|
|
46
|
+
- \[`-h`|`--help`\]:
|
|
47
|
+
Show usage information of `ase task`, including the list of all
|
|
48
|
+
sub-commands, and exit.
|
|
49
|
+
|
|
50
|
+
## COMMANDS
|
|
51
|
+
|
|
52
|
+
- `ase task list` \[`-v`|`--verbose`\] \[`-i`|`--include` *states*\] \[`-e`|`--exclude` *states*\]:
|
|
53
|
+
List the persisted task ids. See `ase-task-list`(1).
|
|
54
|
+
|
|
55
|
+
- `ase task status` \[*id*\[`:`\]\] \[*status*\]:
|
|
56
|
+
Get or set the lifecycle status of a task. See `ase-task-status`(1).
|
|
57
|
+
|
|
58
|
+
- `ase task request` *id* *name* \[*prompt* ...\]:
|
|
59
|
+
Request the processing of a task by a prompt. See
|
|
60
|
+
`ase-task-request`(1).
|
|
61
|
+
|
|
62
|
+
- `ase task assign` \[`-s`|`--session` *id*\] \[*id*\[`:`\]\] *assignee*:
|
|
63
|
+
Assign a task (and handle the AI usage window of a session). See
|
|
64
|
+
`ase-task-assign`(1).
|
|
65
|
+
|
|
66
|
+
- `ase task load` *id*:
|
|
67
|
+
Write a task plan to standard output. See `ase-task-load`(1).
|
|
68
|
+
|
|
69
|
+
- `ase task view` *id*:
|
|
70
|
+
Show a task plan in the pager. See `ase-task-view`(1).
|
|
71
|
+
|
|
72
|
+
- `ase task edit` *id*:
|
|
73
|
+
Edit a task plan in the editor. See `ase-task-edit`(1).
|
|
74
|
+
|
|
75
|
+
- `ase task save` \[`-c`|`--create`\] *id*:
|
|
76
|
+
Save a task plan read from standard input. See `ase-task-save`(1).
|
|
77
|
+
|
|
78
|
+
- `ase task delete` *id*:
|
|
79
|
+
Delete a task plan. See `ase-task-delete`(1).
|
|
80
|
+
|
|
81
|
+
- `ase task rename` *old-id* *new-id*:
|
|
82
|
+
Rename a task plan and its references. See `ase-task-rename`(1).
|
|
83
|
+
|
|
84
|
+
- `ase task newid` \[`-p`|`--proposal` *id*\] \[`-t`|`--taken` *ids*\] \[`-v`|`--verbose`\] \[*title*\]:
|
|
85
|
+
Print the next free task id. See `ase-task-newid`(1).
|
|
86
|
+
|
|
87
|
+
- `ase task purge` \[*age*\]:
|
|
88
|
+
Remove all task plans older than an age. See `ase-task-purge`(1).
|
|
89
|
+
|
|
90
|
+
- `ase task lifecycle` \[*name*\]:
|
|
91
|
+
Get or set the task lifecycle model of the project. See
|
|
92
|
+
`ase-task-lifecycle`(1).
|
|
93
|
+
|
|
94
|
+
- `ase task idscheme` \[*scheme*\]:
|
|
95
|
+
Get or set the task id scheme of the project. See
|
|
96
|
+
`ase-task-idscheme`(1).
|
|
97
|
+
|
|
98
|
+
- `ase task store` *command* \[...\]:
|
|
99
|
+
Manage the per-user task store REST API server. See
|
|
100
|
+
`ase-task-store`(1).
|
|
101
|
+
|
|
102
|
+
- `ase task board` \[*options*\]:
|
|
103
|
+
Show the interactive task board in the terminal or the browser. See
|
|
104
|
+
`ase-task-board`(1).
|
|
105
|
+
|
|
106
|
+
## TASK IDS
|
|
107
|
+
|
|
108
|
+
A task id consists of the characters `A-Z`, `a-z`, `0-9`, `#`, `_`,
|
|
109
|
+
and `-`, where it has to start with a letter, a digit, or `#`, i.e.,
|
|
110
|
+
it has to match `[A-Za-z0-9#][A-Za-z0-9#_-]*`. The id `default` is the
|
|
111
|
+
reserved id of the default task of a session. As `#` starts a comment
|
|
112
|
+
in the shell, an id containing `#` has to be quoted on the command
|
|
113
|
+
line, e.g., `ase task view "#7"`.
|
|
114
|
+
|
|
115
|
+
## TASK STORES
|
|
116
|
+
|
|
117
|
+
The task store is selected by the `project.task.store.url`
|
|
118
|
+
configuration URL (see `ase-config`(1)):
|
|
119
|
+
|
|
120
|
+
- `ase:`*path*:
|
|
121
|
+
The built-in file-based storage plugin, running in-process, storing
|
|
122
|
+
each plan as a file `TASK-`*id*`.md` directly in the directory
|
|
123
|
+
*path*, which is resolved relative to the project root (default:
|
|
124
|
+
`ase:./.ase/task`).
|
|
125
|
+
|
|
126
|
+
On the `project` and `task:`*id* scopes, *path* must not escape the
|
|
127
|
+
project root (also not through symbolic links), as a cloned
|
|
128
|
+
repository could otherwise direct task writes anywhere; a directory
|
|
129
|
+
outside of it is accepted on the `user` or `session` scope only. The
|
|
130
|
+
lifecycle model and task id scheme of a local task store always
|
|
131
|
+
follow `project.task.lifecycle` and `project.task.idscheme`.
|
|
132
|
+
|
|
133
|
+
- `ase://`*addr*`:`*port*\[`/`*token*\]:
|
|
134
|
+
A remote task store server (see `ase-task-store`(1)), connected via
|
|
135
|
+
HTTP. It requires an explicitly configured `project.id`, as a
|
|
136
|
+
basename-derived one likely collides on a shared server.
|
|
137
|
+
|
|
138
|
+
On first use, the project is registered in the task store under the
|
|
139
|
+
configured `project.task.lifecycle` and `project.task.idscheme`;
|
|
140
|
+
afterwards the registered model and scheme apply to all clients of
|
|
141
|
+
the project, and a deviating configuration is warned about once per
|
|
142
|
+
deviation only (see `ase-task-lifecycle`(1)).
|
|
143
|
+
|
|
144
|
+
The bearer token is the embedded *token* (warned about if the URL is
|
|
145
|
+
configured on the `project` or a `task:`*id* scope, as it might be
|
|
146
|
+
committed), else `$ASE_TASK_STORE_TOKEN`, else
|
|
147
|
+
`project.task.store.token` (warned about if not configured on the
|
|
148
|
+
`user` scope), else the `token` of the per-user `store.yaml` of a
|
|
149
|
+
locally started task store server (only if the URL addresses exactly
|
|
150
|
+
this server). Sending a token to a non-loopback host selected on the
|
|
151
|
+
`project` or a `task:`*id* scope is warned about.
|
|
152
|
+
|
|
153
|
+
- `ases://`*addr*`:`*port*\[`/`*token*\]\[`?insecure`\]:
|
|
154
|
+
The same as `ase://`, but connecting via HTTPS, verifying the server
|
|
155
|
+
certificate against the Node.js CA store (extendable via
|
|
156
|
+
`$NODE_EXTRA_CA_CERTS`). With the suffix `?insecure`, the
|
|
157
|
+
verification of the server certificate is skipped.
|
|
158
|
+
|
|
159
|
+
- `github:`*owner*`/`*repo*, `github+https://`*host*`/`*owner*`/`*repo*, or `github+http://`*host*`/`*owner*`/`*repo*:
|
|
160
|
+
The built-in GitHub storage plugin, running in-process, storing the
|
|
161
|
+
plans as the issues of the repository *owner*`/`*repo* on GitHub
|
|
162
|
+
resp. on the GitHub (Enterprise) instance *host*. It requires a `seq`
|
|
163
|
+
task id scheme (e.g., `seq:#%d`), as the task ids are the issue
|
|
164
|
+
numbers. The GitHub token is `project.task.store.token`, else
|
|
165
|
+
`$GITHUB_TOKEN`, else `$GH_TOKEN`.
|
|
166
|
+
|
|
167
|
+
- `gitlab:`*namespace*`/`*project*, `gitlab://`*host*`/`*namespace*`/`*project*, `gitlab+https://`*host*`/`*namespace*`/`*project*, or `gitlab+http://`*host*`/`*namespace*`/`*project*:
|
|
168
|
+
The built-in GitLab storage plugin, running in-process, storing the
|
|
169
|
+
plans as the issues of the GitLab project *namespace*`/`*project*
|
|
170
|
+
(with nested groups allowed) on the GitLab instance *host*, else
|
|
171
|
+
`$GITLAB_HOST`, else `gitlab.com`. It also requires a `seq` task id
|
|
172
|
+
scheme. The GitLab token is `project.task.store.token`, else
|
|
173
|
+
`$GITLAB_TOKEN`.
|
|
174
|
+
|
|
175
|
+
- `gitea+https://`*host*`/`*owner*`/`*repo* or `gitea+http://`*host*`/`*owner*`/`*repo*:
|
|
176
|
+
The built-in Gitea storage plugin, running in-process, storing the
|
|
177
|
+
plans as the issues of the repository *owner*`/`*repo* on the Gitea
|
|
178
|
+
instance *host*. It also requires a `seq` task id scheme. The Gitea
|
|
179
|
+
token is `project.task.store.token`, else `$GITEA_TOKEN`.
|
|
180
|
+
|
|
181
|
+
For the GitHub, GitLab, and Gitea task stores, a repository selected
|
|
182
|
+
on the `project` or a `task:`*id* scope is warned about once per
|
|
183
|
+
project and repository only (remembered in the *per-user state
|
|
184
|
+
directory* as `task-github.json`, `task-gitlab.json`, resp.
|
|
185
|
+
`task-gitea.json`), and a `project.task.store.token` not configured on
|
|
186
|
+
the `user` scope is warned about.
|
|
187
|
+
|
|
188
|
+
## TASK LIFECYCLE MODELS
|
|
189
|
+
|
|
190
|
+
The `Status` frontmatter key of a task plan holds a state of the task
|
|
191
|
+
lifecycle model of the project, selected by `project.task.lifecycle`
|
|
192
|
+
for a local task store resp. registered in a remote task store (see
|
|
193
|
+
`ase-task-lifecycle`(1)). A plan without a `Status` key reads as the
|
|
194
|
+
*initial* state of the model.
|
|
195
|
+
|
|
196
|
+
A status change has to be reachable from the current state via one or
|
|
197
|
+
more transitions of the model (a status foreign to the model can be
|
|
198
|
+
changed to any state, to allow its correction). The *finished* states
|
|
199
|
+
end the lifecycle, and in the *activity* states a task is actively
|
|
200
|
+
worked on (by a human or an agent), so its plan must not be changed
|
|
201
|
+
concurrently.
|
|
202
|
+
|
|
203
|
+
- `solo`:
|
|
204
|
+
The single-phase lifecycle for a local solo developer (default).
|
|
205
|
+
States: `OPEN` (initial), `SHELVED`, `CLOSED` (finished), and
|
|
206
|
+
`CANCELLED` (finished); no activity states. Transitions: `OPEN` to
|
|
207
|
+
`SHELVED`, `CLOSED`, or `CANCELLED`; `SHELVED` to `OPEN` or
|
|
208
|
+
`CANCELLED`.
|
|
209
|
+
|
|
210
|
+
- `team`:
|
|
211
|
+
The two-phase lifecycle for a distributed small team. States:
|
|
212
|
+
`PLANNING` (initial), `SHELVED`, `IMPLEMENTING` (activity),
|
|
213
|
+
`STALLED`, `IMPLEMENTED` (finished), and `CANCELLED` (finished).
|
|
214
|
+
Transitions: `PLANNING` to `SHELVED`, `IMPLEMENTING`, or
|
|
215
|
+
`CANCELLED`; `SHELVED` to `PLANNING` or `CANCELLED`; `IMPLEMENTING`
|
|
216
|
+
to `PLANNING`, `STALLED`, `IMPLEMENTED`, or `CANCELLED`; `STALLED`
|
|
217
|
+
to `IMPLEMENTING` or `CANCELLED`.
|
|
218
|
+
|
|
219
|
+
- `enterprise`:
|
|
220
|
+
The four-phase lifecycle (planning, implementation, qualification, and
|
|
221
|
+
integration) for a gated enterprise pipeline, driven headless by the
|
|
222
|
+
agents of `ase-agent`(1). States: `DRAFTED` (initial), `SHELVED`,
|
|
223
|
+
`PLANNING` (activity), `PLANNED`, `STALLED`, `IMPLEMENTING`
|
|
224
|
+
(activity), `IMPLEMENTED`, `DECLINED`, `QUALIFYING` (activity),
|
|
225
|
+
`QUALIFIED`, `DEFERRED`, `INTEGRATING` (activity), `INTEGRATED`
|
|
226
|
+
(finished), and `CANCELLED` (finished).
|
|
227
|
+
|
|
228
|
+
Transitions: `DRAFTED` to `SHELVED`, `PLANNING`, or `CANCELLED`;
|
|
229
|
+
`SHELVED` to `DRAFTED` or `CANCELLED`; `PLANNING` to `DRAFTED`,
|
|
230
|
+
`SHELVED`, `PLANNED`, or `CANCELLED`; `PLANNED` to `STALLED`,
|
|
231
|
+
`IMPLEMENTING`, or `CANCELLED`; `STALLED` to `PLANNED` or
|
|
232
|
+
`CANCELLED`; `IMPLEMENTING` to `DRAFTED`, `PLANNED`, `STALLED`,
|
|
233
|
+
`IMPLEMENTED`, or `CANCELLED`; `IMPLEMENTED` to `DECLINED`,
|
|
234
|
+
`QUALIFYING`, or `CANCELLED`; `DECLINED` to `IMPLEMENTED` or
|
|
235
|
+
`CANCELLED`; `QUALIFYING` to `DRAFTED`, `PLANNED`, `IMPLEMENTED`,
|
|
236
|
+
`DECLINED`, `QUALIFIED`, or `CANCELLED`; `QUALIFIED` to `DEFERRED`,
|
|
237
|
+
`INTEGRATING`, or `CANCELLED`; `DEFERRED` to `QUALIFIED` or
|
|
238
|
+
`CANCELLED`; `INTEGRATING` to `DRAFTED`, `PLANNED`, `QUALIFIED`,
|
|
239
|
+
`DEFERRED`, `INTEGRATED`, or `CANCELLED`.
|
|
240
|
+
|
|
241
|
+
In all models, no transition leaves a finished state.
|
|
242
|
+
|
|
243
|
+
## TASK ID SCHEMES
|
|
244
|
+
|
|
245
|
+
New task ids are generated by `ase-task-newid`(1) after the task id
|
|
246
|
+
scheme of the project, selected by `project.task.idscheme` for a local
|
|
247
|
+
task store resp. registered in a remote task store (see
|
|
248
|
+
`ase-task-idscheme`(1)):
|
|
249
|
+
|
|
250
|
+
- `slug`\[`:`*words*\]:
|
|
251
|
+
The slug of the first *words* (`1`-`16`, default: `2`) words of the
|
|
252
|
+
task title, starting with the first word beginning with a letter,
|
|
253
|
+
with diacritics stripped, lower-cased, and joined with `-`, e.g.,
|
|
254
|
+
`json-export` (default scheme). Conforming ids match
|
|
255
|
+
`^[a-z][a-z0-9]*(?:-[a-z0-9]+){0,`*words-1*`}(?:-[0-9]+)?$`.
|
|
256
|
+
|
|
257
|
+
- `seq`\[`:`*template*\]:
|
|
258
|
+
A continuously increasing sequence number, rendered through the
|
|
259
|
+
sprintf-style *template* (default: `%d`) with exactly one `%d` or
|
|
260
|
+
`%0`*width*`d` (*width* `0`-`16`) and otherwise only the characters
|
|
261
|
+
`A-Z`, `a-z`, `#`, `_`, and `-` (but not starting with `_` or `-`),
|
|
262
|
+
e.g., `FOO-%03d` (`FOO-007`) or `#%d` (`#7`). Conforming ids match
|
|
263
|
+
*prefix*`([0-9]+)`*suffix* (resp. with at least *width* digits).
|
|
264
|
+
|
|
265
|
+
- `any`:
|
|
266
|
+
An arbitrary id, as proposed by the caller. Conforming ids match
|
|
267
|
+
`^[A-Za-z0-9#][A-Za-z0-9#_-]*$`.
|
|
268
|
+
|
|
269
|
+
An id not conforming to the scheme is accepted, but warned about on
|
|
270
|
+
`ase task save`, `ase task edit`, and `ase task rename` (the reserved
|
|
271
|
+
id `default` always conforms).
|
|
272
|
+
|
|
273
|
+
## ENVIRONMENT
|
|
274
|
+
|
|
275
|
+
- `ASE_TASK_ID`:
|
|
276
|
+
The default task id of `ase task status` and `ase task assign`
|
|
277
|
+
(default: `default`).
|
|
278
|
+
|
|
279
|
+
- `ASE_TASK_STORE_TOKEN`:
|
|
280
|
+
The bearer token of a remote (`ase://` or `ases://`) task store.
|
|
281
|
+
|
|
282
|
+
- `GITHUB_TOKEN`, `GH_TOKEN`, `GITLAB_TOKEN`, `GITLAB_HOST`, `GITEA_TOKEN`:
|
|
283
|
+
The tokens resp. the default host of the GitHub, GitLab, and Gitea
|
|
284
|
+
task stores (see **TASK STORES**).
|
|
285
|
+
|
|
286
|
+
## FILES
|
|
287
|
+
|
|
288
|
+
- `.ase/task/TASK-`*id*`.md`:
|
|
289
|
+
The persisted task plans of the default local task store
|
|
290
|
+
`ase:./.ase/task`, relative to the project root.
|
|
291
|
+
|
|
292
|
+
- `.ase/config.yaml`:
|
|
293
|
+
The `project` scope configuration with the `project.id`,
|
|
294
|
+
`project.task.store.url`, `project.task.lifecycle`, and
|
|
295
|
+
`project.task.idscheme` keys.
|
|
296
|
+
|
|
297
|
+
- *per-user state directory*`/task-lifecycle.json`:
|
|
298
|
+
The deviations of the configured lifecycle model and task id scheme
|
|
299
|
+
from the ones of a remote task store already warned about.
|
|
300
|
+
|
|
301
|
+
- *per-user state directory*`/task-github.json`, `task-gitlab.json`, `task-gitea.json`:
|
|
302
|
+
The repositories of the issue tracker task stores already warned
|
|
303
|
+
about.
|
|
304
|
+
|
|
305
|
+
## EXAMPLES
|
|
306
|
+
|
|
307
|
+
```sh
|
|
308
|
+
# list all unfinished tasks with their status, time, effort, and title
|
|
309
|
+
$ ase task list -v
|
|
310
|
+
|
|
311
|
+
# create a new task from a title and a plan file
|
|
312
|
+
$ id=$(ase task newid "Export as JSON")
|
|
313
|
+
$ ase task save --create "$id" <plan.md
|
|
314
|
+
|
|
315
|
+
# move the task forward in the lifecycle
|
|
316
|
+
$ ase task status "$id" CLOSED
|
|
317
|
+
|
|
318
|
+
# use a shared remote task store
|
|
319
|
+
$ ase config --scope project set project.id myproject
|
|
320
|
+
$ ase config --scope project set project.task.store.url ase://127.0.0.1:4711
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
## SEE ALSO
|
|
324
|
+
|
|
325
|
+
`ase`(1), `ase-task-list`(1), `ase-task-status`(1),
|
|
326
|
+
`ase-task-request`(1), `ase-task-assign`(1), `ase-task-load`(1),
|
|
327
|
+
`ase-task-view`(1), `ase-task-edit`(1), `ase-task-save`(1),
|
|
328
|
+
`ase-task-delete`(1), `ase-task-rename`(1), `ase-task-newid`(1),
|
|
329
|
+
`ase-task-purge`(1), `ase-task-lifecycle`(1), `ase-task-idscheme`(1),
|
|
330
|
+
`ase-task-store`(1), `ase-task-board`(1), `ase-config`(1),
|
|
331
|
+
`ase-agent`(1).
|
|
332
|
+
|
|
333
|
+
## AUTHOR
|
|
334
|
+
|
|
335
|
+
Dr. Ralf S. Engelschall <rse@engelschall.com>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# ase-util-compat(1) -- Output Expected Probe Values of the Compatibility Self-Test
|
|
2
|
+
|
|
3
|
+
## SYNOPSIS
|
|
4
|
+
|
|
5
|
+
`ase util compat`
|
|
6
|
+
\[`-h`|`--help`\]
|
|
7
|
+
|
|
8
|
+
## DESCRIPTION
|
|
9
|
+
|
|
10
|
+
**ase util compat** writes the canonical expected values of all probes
|
|
11
|
+
of the `ase-meta-compat` self-test skill to standard output, one probe
|
|
12
|
+
per line as *id*`: `*value*, where *id* is
|
|
13
|
+
*category*`/`*probe-name*. The probe categories are `xml-placeholders`,
|
|
14
|
+
`control-flow`, `regex`, and `arithmetic`, which check whether the
|
|
15
|
+
model of the agent tool correctly interprets the pseudo-code
|
|
16
|
+
constructs the *ASE* skills are written in.
|
|
17
|
+
|
|
18
|
+
This command is intended to be invoked by the skill only after it has
|
|
19
|
+
recorded all actual probe results (so the model cannot see the
|
|
20
|
+
expected values beforehand), and not directly by end users. The MCP
|
|
21
|
+
tool `ase_compat` provides the same.
|
|
22
|
+
|
|
23
|
+
## OPTIONS
|
|
24
|
+
|
|
25
|
+
- \[`-h`|`--help`\]:
|
|
26
|
+
Show usage information and exit.
|
|
27
|
+
|
|
28
|
+
## EXIT STATUS
|
|
29
|
+
|
|
30
|
+
Exits with status `0`.
|
|
31
|
+
|
|
32
|
+
## SEE ALSO
|
|
33
|
+
|
|
34
|
+
`ase`(1), `ase-util`(1).
|
|
35
|
+
|
|
36
|
+
## AUTHOR
|
|
37
|
+
|
|
38
|
+
Dr. Ralf S. Engelschall <rse@engelschall.com>
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# ase-util-diagram(1) -- Render Mermaid or D2 Diagrams as Unicode/ASCII Art or SVG
|
|
2
|
+
|
|
3
|
+
## SYNOPSIS
|
|
4
|
+
|
|
5
|
+
`ase util diagram`
|
|
6
|
+
\[`-h`|`--help`\]
|
|
7
|
+
\[`-i`|`--input` *file*\]
|
|
8
|
+
\[`-l`|`--lang` `mermaid`|`d2`\]
|
|
9
|
+
\[`-f`|`--format` `ascii`|`svg`\]
|
|
10
|
+
\[`-a`|`--ascii`\]
|
|
11
|
+
\[`-c`|`--color-mode` `none`|`ansi16`|`ansi256`\]
|
|
12
|
+
\[`--node-margin-x` *n*\]
|
|
13
|
+
\[`--node-margin-y` *n*\]
|
|
14
|
+
\[`--node-padding` *n*\]
|
|
15
|
+
\[`--diagram-clip-x` *n*\]
|
|
16
|
+
\[`--diagram-clip-y` *n*\]
|
|
17
|
+
\[`--terminal-width` *n*\]
|
|
18
|
+
\[`--terminal-height` *n*\]
|
|
19
|
+
|
|
20
|
+
## DESCRIPTION
|
|
21
|
+
|
|
22
|
+
**ase util diagram** renders a diagram specification, written in the
|
|
23
|
+
*Mermaid* or *D2* diagram language and read from standard input or a
|
|
24
|
+
file, as Unicode box-drawing (or plain ASCII) art for the terminal, or
|
|
25
|
+
as a self-contained SVG document. The *Mermaid* diagrams are rendered
|
|
26
|
+
via *beautiful-mermaid* (supporting, e.g., flowcharts, UML state,
|
|
27
|
+
sequence, and class diagrams, ER diagrams, and XY-charts), and the
|
|
28
|
+
*D2* diagrams via the WebAssembly build of *D2*.
|
|
29
|
+
|
|
30
|
+
For the `ascii` format, the rendering is optionally clipped to the
|
|
31
|
+
terminal dimensions (reduced by the extra clipping amounts): lines
|
|
32
|
+
wider than the width budget are truncated (preserving and properly
|
|
33
|
+
terminating any ANSI color sequences), and lines beyond the height
|
|
34
|
+
budget are dropped.
|
|
35
|
+
|
|
36
|
+
A clipped rendering is followed by a warning paragraph which states
|
|
37
|
+
the overflow and advises how to regenerate the diagram source to fit
|
|
38
|
+
(e.g., by preferring a portrait orientation, reducing siblings per
|
|
39
|
+
row, abbreviating node labels, or nesting). The output always ends
|
|
40
|
+
with a newline.
|
|
41
|
+
|
|
42
|
+
The MCP tool `ase_diagram` provides the same to the skills.
|
|
43
|
+
|
|
44
|
+
## OPTIONS
|
|
45
|
+
|
|
46
|
+
- \[`-h`|`--help`\]:
|
|
47
|
+
Show usage information and exit.
|
|
48
|
+
|
|
49
|
+
- \[`-i`|`--input` *file*\]:
|
|
50
|
+
Read the diagram specification from *file* instead of standard
|
|
51
|
+
input. An empty (or whitespace-only) specification is an error.
|
|
52
|
+
|
|
53
|
+
- \[`-l`|`--lang` `mermaid`|`d2`\]:
|
|
54
|
+
The diagram language: `mermaid` for *Mermaid* (default) or `d2` for
|
|
55
|
+
*D2*.
|
|
56
|
+
|
|
57
|
+
- \[`-f`|`--format` `ascii`|`svg`\]:
|
|
58
|
+
The output format: `ascii` for Unicode/ASCII art (default) or `svg`
|
|
59
|
+
for an SVG document. The clipping options apply to `ascii` only.
|
|
60
|
+
|
|
61
|
+
- \[`-a`|`--ascii`\]:
|
|
62
|
+
Emit plain ASCII characters (`+`, `-`, `|`) instead of the Unicode
|
|
63
|
+
box-drawing characters (for both languages).
|
|
64
|
+
|
|
65
|
+
- \[`-c`|`--color-mode` `none`|`ansi16`|`ansi256`\]:
|
|
66
|
+
The color mode of the ANSI escape sequences in the rendered art
|
|
67
|
+
(*Mermaid* and `ascii` only): `none` for no colors, `ansi16` for 16
|
|
68
|
+
colors, or `ansi256` for 256 colors, where colors render the diagram
|
|
69
|
+
in gray shades. Default: `$ASE_TERM_COLORS` if set to one of these
|
|
70
|
+
values, else derived from the color depth of standard output if it is
|
|
71
|
+
a terminal (`ansi256` for at least 8 bits, `ansi16` for at least 4
|
|
72
|
+
bits), else `none`.
|
|
73
|
+
|
|
74
|
+
- \[`--node-margin-x` *n*\]:
|
|
75
|
+
The horizontal margin between nodes in characters (*Mermaid* only,
|
|
76
|
+
default: `3`).
|
|
77
|
+
|
|
78
|
+
- \[`--node-margin-y` *n*\]:
|
|
79
|
+
The vertical margin between nodes in lines (*Mermaid* only, default:
|
|
80
|
+
`3`).
|
|
81
|
+
|
|
82
|
+
- \[`--node-padding` *n*\]:
|
|
83
|
+
The horizontal and vertical inner padding of each node in characters
|
|
84
|
+
(*Mermaid* only, default: `1`).
|
|
85
|
+
|
|
86
|
+
- \[`--diagram-clip-x` *n*\]:
|
|
87
|
+
The extra horizontal clipping: the width budget is the terminal width
|
|
88
|
+
minus *n* characters (default: `0`).
|
|
89
|
+
|
|
90
|
+
- \[`--diagram-clip-y` *n*\]:
|
|
91
|
+
The extra vertical clipping: the height budget is the terminal height
|
|
92
|
+
minus *n* lines (default: `0`).
|
|
93
|
+
|
|
94
|
+
- \[`--terminal-width` *n*\]:
|
|
95
|
+
The terminal width in characters for the clipping, where `0` disables
|
|
96
|
+
the horizontal clipping. Default: `$ASE_TERM_WIDTH` if a positive
|
|
97
|
+
integer, else the width of standard output if it is a terminal, else
|
|
98
|
+
`0`.
|
|
99
|
+
|
|
100
|
+
- \[`--terminal-height` *n*\]:
|
|
101
|
+
The terminal height in lines for the clipping, where `0` disables the
|
|
102
|
+
vertical clipping. Default: `$ASE_TERM_HEIGHT` if a positive integer,
|
|
103
|
+
else the height of standard output if it is a terminal, else `0`.
|
|
104
|
+
|
|
105
|
+
All numeric values *n* have to be non-negative integers.
|
|
106
|
+
|
|
107
|
+
## ENVIRONMENT
|
|
108
|
+
|
|
109
|
+
- `ASE_TERM_COLORS`:
|
|
110
|
+
The default of `--color-mode` (`none`, `ansi16`, or `ansi256`).
|
|
111
|
+
|
|
112
|
+
- `ASE_TERM_WIDTH`, `ASE_TERM_HEIGHT`:
|
|
113
|
+
The defaults of `--terminal-width` and `--terminal-height`.
|
|
114
|
+
|
|
115
|
+
## EXIT STATUS
|
|
116
|
+
|
|
117
|
+
Exits with status `0` on success, and with status `1` on an invalid
|
|
118
|
+
option value, an unreadable input file, an empty specification, or a
|
|
119
|
+
rendering failure (e.g., a syntax error in the specification).
|
|
120
|
+
|
|
121
|
+
## EXAMPLES
|
|
122
|
+
|
|
123
|
+
```sh
|
|
124
|
+
# render a Mermaid flowchart as Unicode art
|
|
125
|
+
$ printf 'flowchart LR\n A --> B --> C\n' | ase util diagram
|
|
126
|
+
|
|
127
|
+
# render a D2 diagram from a file as plain ASCII art without colors
|
|
128
|
+
$ ase util diagram -l d2 -i arch.d2 -a -c none
|
|
129
|
+
|
|
130
|
+
# render a Mermaid diagram as an SVG document
|
|
131
|
+
$ ase util diagram -i flow.mmd -f svg >flow.svg
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## SEE ALSO
|
|
135
|
+
|
|
136
|
+
`ase`(1), `ase-util`(1).
|
|
137
|
+
|
|
138
|
+
## AUTHOR
|
|
139
|
+
|
|
140
|
+
Dr. Ralf S. Engelschall <rse@engelschall.com>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# ase-util-meta(1) -- Output Plugin Meta Files
|
|
2
|
+
|
|
3
|
+
## SYNOPSIS
|
|
4
|
+
|
|
5
|
+
`ase util meta`
|
|
6
|
+
\[`-h`|`--help`\]
|
|
7
|
+
*name* \[...\]
|
|
8
|
+
|
|
9
|
+
## DESCRIPTION
|
|
10
|
+
|
|
11
|
+
**ase util meta** writes the contents of one or more *meta files* of
|
|
12
|
+
the *ASE* plugin to standard output, concatenated in the given order
|
|
13
|
+
and without any separator.
|
|
14
|
+
|
|
15
|
+
The meta files are the shared instructions and format conventions of
|
|
16
|
+
the *ASE* skills, e.g., the constitution (`ase-constitution.md`), the
|
|
17
|
+
tenets (`ase-tenets.md`), the persona (`ase-persona.md`), the dialog
|
|
18
|
+
conventions (`ase-dialog.md`), the option parsing conventions
|
|
19
|
+
(`ase-getopt.md`), and the artifact format conventions
|
|
20
|
+
(`ase-format-*.md`, plus the standard *SpecBook* schema configuration
|
|
21
|
+
`ase-format-specbook.yaml`).
|
|
22
|
+
|
|
23
|
+
The meta files are read from the `plugin/meta/` directory bundled with
|
|
24
|
+
the tool package itself, independent of any environment variables. All
|
|
25
|
+
requested files are read before any output is written, so a failing
|
|
26
|
+
name produces no output at all.
|
|
27
|
+
|
|
28
|
+
This command is intended to be leveraged by the *ASE* skills, and not
|
|
29
|
+
typically invoked directly by end users.
|
|
30
|
+
|
|
31
|
+
## OPTIONS
|
|
32
|
+
|
|
33
|
+
- \[`-h`|`--help`\]:
|
|
34
|
+
Show usage information and exit.
|
|
35
|
+
|
|
36
|
+
## ARGUMENTS
|
|
37
|
+
|
|
38
|
+
- *name* \[...\]:
|
|
39
|
+
One or more meta file names. Each *name* is reduced to its base name
|
|
40
|
+
(so no directory traversal or absolute path is possible), the
|
|
41
|
+
extension `.md` is appended if it has no extension, and the prefix
|
|
42
|
+
`ase-` is prepended if missing, so `tenets`, `ase-tenets`, and
|
|
43
|
+
`tenets.md` all select `ase-tenets.md`, while `format-specbook.yaml`
|
|
44
|
+
selects `ase-format-specbook.yaml`. An empty name, `.`, and `..` are
|
|
45
|
+
invalid.
|
|
46
|
+
|
|
47
|
+
## EXIT STATUS
|
|
48
|
+
|
|
49
|
+
Exits with status `0` on success, and with status `1` if a name is
|
|
50
|
+
invalid or a meta file cannot be read.
|
|
51
|
+
|
|
52
|
+
## EXAMPLES
|
|
53
|
+
|
|
54
|
+
```sh
|
|
55
|
+
# output the ASE constitution
|
|
56
|
+
$ ase util meta constitution
|
|
57
|
+
|
|
58
|
+
# output the tenets and the persona definition
|
|
59
|
+
$ ase util meta tenets persona
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## SEE ALSO
|
|
63
|
+
|
|
64
|
+
`ase`(1), `ase-util`(1), `ase-spec`(1).
|
|
65
|
+
|
|
66
|
+
## AUTHOR
|
|
67
|
+
|
|
68
|
+
Dr. Ralf S. Engelschall <rse@engelschall.com>
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# ase-util-metric(1) -- Measure the Length Metrics of a Text
|
|
2
|
+
|
|
3
|
+
## SYNOPSIS
|
|
4
|
+
|
|
5
|
+
`ase util metric`
|
|
6
|
+
\[`-h`|`--help`\]
|
|
7
|
+
\[`-f`|`--file` *file*\]
|
|
8
|
+
\[*text* \[...\]\]
|
|
9
|
+
|
|
10
|
+
## DESCRIPTION
|
|
11
|
+
|
|
12
|
+
**ase util metric** measures the length metrics of a text, given either
|
|
13
|
+
as the content of a *file* or as the *text* formed by the remaining
|
|
14
|
+
arguments (joined by single spaces), which are mutually exclusive and
|
|
15
|
+
of which exactly one has to be given. The metrics are printed to
|
|
16
|
+
standard output as a single-line JSON object with the fields:
|
|
17
|
+
|
|
18
|
+
- `words`:
|
|
19
|
+
The number of whitespace-separated tokens.
|
|
20
|
+
|
|
21
|
+
- `lines`:
|
|
22
|
+
The number of newline-separated lines, where a trailing line without
|
|
23
|
+
a final newline still counts as one line (and an empty text has `0`
|
|
24
|
+
lines).
|
|
25
|
+
|
|
26
|
+
- `chars`:
|
|
27
|
+
The number of Unicode characters, i.e., code points.
|
|
28
|
+
|
|
29
|
+
- `bytes`:
|
|
30
|
+
The number of octets: the raw file size for a *file* (as its
|
|
31
|
+
encoding is not necessarily UTF-8), resp. the UTF-8 length for a
|
|
32
|
+
*text*.
|
|
33
|
+
|
|
34
|
+
A *file* is decoded as UTF-8 for the other metrics. This backs the
|
|
35
|
+
MCP tool `ase_text_metric`, which the skills use instead of estimating
|
|
36
|
+
a text length themselves.
|
|
37
|
+
|
|
38
|
+
## OPTIONS
|
|
39
|
+
|
|
40
|
+
- \[`-h`|`--help`\]:
|
|
41
|
+
Show usage information and exit.
|
|
42
|
+
|
|
43
|
+
- \[`-f`|`--file` *file*\]:
|
|
44
|
+
Measure the content of *file* instead of the *text* arguments.
|
|
45
|
+
|
|
46
|
+
## ARGUMENTS
|
|
47
|
+
|
|
48
|
+
- \[*text* \[...\]\]:
|
|
49
|
+
The text to measure, formed by all arguments joined by single spaces
|
|
50
|
+
(mutually exclusive with `--file`).
|
|
51
|
+
|
|
52
|
+
## EXIT STATUS
|
|
53
|
+
|
|
54
|
+
Exits with status `0` on success, and with status `1` if both or none
|
|
55
|
+
of *file* and *text* are given, or *file* cannot be read.
|
|
56
|
+
|
|
57
|
+
## EXAMPLES
|
|
58
|
+
|
|
59
|
+
```sh
|
|
60
|
+
# measure a document
|
|
61
|
+
$ ase util metric -f README.md
|
|
62
|
+
|
|
63
|
+
# measure a text
|
|
64
|
+
$ ase util metric "Hello, World!"
|
|
65
|
+
{"words":2,"lines":1,"chars":13,"bytes":13}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## SEE ALSO
|
|
69
|
+
|
|
70
|
+
`ase`(1), `ase-util`(1), `wc`(1).
|
|
71
|
+
|
|
72
|
+
## AUTHOR
|
|
73
|
+
|
|
74
|
+
Dr. Ralf S. Engelschall <rse@engelschall.com>
|