@rse/ase 1.0.7 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/dst/ase-agent-definition-api.d.ts +184 -0
  2. package/dst/ase-agent-definition-api.js +6 -0
  3. package/dst/ase-agent-definition-builtin/condenser.js +42 -0
  4. package/dst/ase-agent-definition-builtin/editor.js +45 -0
  5. package/dst/ase-agent-definition-builtin/estimator.js +98 -0
  6. package/dst/ase-agent-definition-builtin/implementer.js +121 -0
  7. package/dst/ase-agent-definition-builtin/integrator.js +56 -0
  8. package/dst/ase-agent-definition-builtin/qualifier.js +61 -0
  9. package/dst/ase-agent-definition-builtin/rebooter.js +41 -0
  10. package/dst/ase-agent-definition-builtin/researcher.js +77 -0
  11. package/dst/ase-agent-definition-core.js +827 -0
  12. package/dst/ase-agent-fleet.js +772 -0
  13. package/dst/ase-agent-process.js +232 -0
  14. package/dst/ase-agent-relay-client.js +509 -0
  15. package/dst/ase-agent-relay-core.js +213 -0
  16. package/dst/ase-agent-relay-server-bind.js +242 -0
  17. package/dst/ase-agent-relay-server-cli.js +50 -0
  18. package/dst/ase-agent-runtime-claim.js +189 -0
  19. package/dst/ase-agent-runtime-engine.js +1100 -0
  20. package/dst/ase-agent-runtime-exec.js +275 -0
  21. package/dst/ase-agent-runtime-phase.js +581 -0
  22. package/dst/ase-agent-runtime-request.js +272 -0
  23. package/dst/ase-agent-runtime-tool.js +207 -0
  24. package/dst/ase-agent-runtime.js +1316 -0
  25. package/dst/ase-agent.js +65 -0
  26. package/dst/ase-artifact.js +6 -5
  27. package/dst/ase-config-core.js +465 -0
  28. package/dst/ase-config-schema.js +357 -0
  29. package/dst/ase-config-scope.js +172 -0
  30. package/dst/ase-config.js +25 -585
  31. package/dst/ase-hook.js +228 -111
  32. package/dst/ase-lib-daemon-cli.js +130 -0
  33. package/dst/ase-lib-hash.js +20 -0
  34. package/dst/{ase-log.js → ase-lib-log.js} +40 -7
  35. package/dst/ase-lib-server-bind.js +115 -0
  36. package/dst/ase-lib-server-cli.js +474 -0
  37. package/dst/{ase-table.js → ase-lib-table.js} +1 -1
  38. package/dst/{ase-version.js → ase-lib-version.js} +8 -1
  39. package/dst/ase-man.js +96 -0
  40. package/dst/ase-mcp.js +166 -13
  41. package/dst/{ase-getopt.js → ase-service-getopt.js} +82 -80
  42. package/dst/{ase-markdown.js → ase-service-markdown.js} +18 -11
  43. package/dst/ase-service-otel.js +1246 -0
  44. package/dst/{ase-skills.js → ase-service-skills.js} +29 -64
  45. package/dst/ase-service-state.js +101 -0
  46. package/dst/ase-service.js +269 -81
  47. package/dst/ase-setup-common.js +141 -0
  48. package/dst/ase-setup-mcp.js +359 -0
  49. package/dst/ase-setup-settings.js +837 -0
  50. package/dst/ase-setup.js +113 -869
  51. package/dst/ase-spec.js +31 -19
  52. package/dst/ase-statusline.js +108 -43
  53. package/dst/ase-task-board-core.js +739 -0
  54. package/dst/ase-task-board-filter.js +127 -0
  55. package/dst/ase-task-board-flow.js +237 -0
  56. package/dst/ase-task-board-graph.js +497 -0
  57. package/dst/ase-task-board-stats.js +263 -0
  58. package/dst/ase-task-board-tui-control.js +775 -0
  59. package/dst/ase-task-board-tui-model.js +1008 -0
  60. package/dst/ase-task-board-tui-popup.js +626 -0
  61. package/dst/ase-task-board-tui-style.js +106 -0
  62. package/dst/ase-task-board-tui-view.js +847 -0
  63. package/dst/ase-task-board-tui.js +189 -0
  64. package/dst/ase-task-board-web-client.css +1 -0
  65. package/dst/ase-task-board-web-client.html +20 -0
  66. package/dst/ase-task-board-web-client.js +81 -0
  67. package/dst/ase-task-board-web-server.js +823 -0
  68. package/dst/ase-task-board.js +134 -0
  69. package/dst/ase-task-format.js +757 -0
  70. package/dst/ase-task-request.js +208 -0
  71. package/dst/ase-task-store-client.js +495 -0
  72. package/dst/ase-task-store-core.js +804 -0
  73. package/dst/ase-task-store-issues.js +237 -0
  74. package/dst/ase-task-store-plugin-api.js +6 -0
  75. package/dst/ase-task-store-plugin-ase.js +484 -0
  76. package/dst/ase-task-store-plugin-delegate.js +137 -0
  77. package/dst/ase-task-store-plugin-gitea.js +666 -0
  78. package/dst/ase-task-store-plugin-github.js +696 -0
  79. package/dst/ase-task-store-plugin-gitlab.js +668 -0
  80. package/dst/ase-task-store-server-bind.js +538 -0
  81. package/dst/ase-task-store-server-cli.js +154 -0
  82. package/dst/ase-task.js +1335 -357
  83. package/dst/{ase-compat.js → ase-util-compat.js} +2 -2
  84. package/dst/{ase-diagram.js → ase-util-diagram.js} +107 -32
  85. package/dst/{ase-meta.js → ase-util-meta.js} +2 -2
  86. package/dst/{ase-metric.js → ase-util-metric.js} +2 -2
  87. package/dst/{ase-mint.js → ase-util-mint.js} +19 -12
  88. package/dst/{ase-worktree.js → ase-util-worktree.js} +30 -19
  89. package/dst/ase-util.js +20 -0
  90. package/dst/ase.js +108 -32
  91. package/dst/man/ase-agent-adhoc.1 +515 -0
  92. package/dst/man/ase-agent-condenser.1 +193 -0
  93. package/dst/man/ase-agent-editor.1 +212 -0
  94. package/dst/man/ase-agent-estimator.1 +214 -0
  95. package/dst/man/ase-agent-fleet.1 +185 -0
  96. package/dst/man/ase-agent-implementer.1 +233 -0
  97. package/dst/man/ase-agent-integrator.1 +213 -0
  98. package/dst/man/ase-agent-qualifier.1 +214 -0
  99. package/dst/man/ase-agent-rebooter.1 +193 -0
  100. package/dst/man/ase-agent-relay.1 +128 -0
  101. package/dst/man/ase-agent-researcher.1 +217 -0
  102. package/dst/man/ase-agent.1 +264 -0
  103. package/dst/man/ase-artifact-list.1 +38 -0
  104. package/dst/man/ase-artifact-name.1 +39 -0
  105. package/dst/man/ase-artifact.1 +56 -0
  106. package/dst/man/ase-config-delete.1 +45 -0
  107. package/dst/man/ase-config-edit.1 +48 -0
  108. package/dst/man/ase-config-get.1 +46 -0
  109. package/dst/man/ase-config-init.1 +60 -0
  110. package/dst/man/ase-config-list.1 +42 -0
  111. package/dst/man/ase-config-set.1 +52 -0
  112. package/dst/man/ase-config.1 +231 -0
  113. package/dst/man/ase-hook-permission-request.1 +36 -0
  114. package/dst/man/ase-hook-pre-tool-use.1 +59 -0
  115. package/dst/man/ase-hook-session-end.1 +47 -0
  116. package/dst/man/ase-hook-session-persona.1 +37 -0
  117. package/dst/man/ase-hook-session-start.1 +81 -0
  118. package/dst/man/ase-hook-stop.1 +34 -0
  119. package/dst/man/ase-hook-user-prompt-submit.1 +34 -0
  120. package/dst/man/ase-hook.1 +51 -0
  121. package/dst/man/ase-man.1 +67 -0
  122. package/dst/man/ase-mcp.1 +61 -0
  123. package/dst/man/ase-service-log.1 +43 -0
  124. package/dst/man/ase-service-send.1 +47 -0
  125. package/dst/man/ase-service-start.1 +54 -0
  126. package/dst/man/ase-service-status.1 +46 -0
  127. package/dst/man/ase-service-stop.1 +37 -0
  128. package/dst/man/ase-service.1 +85 -0
  129. package/dst/man/ase-setup-disable.1 +44 -0
  130. package/dst/man/ase-setup-enable.1 +45 -0
  131. package/dst/man/ase-setup-install.1 +73 -0
  132. package/dst/man/ase-setup-mcp.1 +124 -0
  133. package/dst/man/ase-setup-status.1 +60 -0
  134. package/dst/man/ase-setup-statusline.1 +92 -0
  135. package/dst/man/ase-setup-telemetry.1 +92 -0
  136. package/dst/man/ase-setup-uninstall.1 +59 -0
  137. package/dst/man/ase-setup-update.1 +64 -0
  138. package/dst/man/ase-setup.1 +93 -0
  139. package/dst/man/ase-spec-export.1 +62 -0
  140. package/dst/man/ase-spec-lint.1 +40 -0
  141. package/dst/man/ase-spec-preview.1 +40 -0
  142. package/dst/man/ase-spec.1 +46 -0
  143. package/dst/man/ase-statusline.1 +189 -0
  144. package/dst/man/ase-task-assign.1 +71 -0
  145. package/dst/man/ase-task-board.1 +384 -0
  146. package/dst/man/ase-task-delete.1 +35 -0
  147. package/dst/man/ase-task-edit.1 +46 -0
  148. package/dst/man/ase-task-idscheme.1 +65 -0
  149. package/dst/man/ase-task-lifecycle.1 +57 -0
  150. package/dst/man/ase-task-list.1 +47 -0
  151. package/dst/man/ase-task-load.1 +36 -0
  152. package/dst/man/ase-task-newid.1 +61 -0
  153. package/dst/man/ase-task-purge.1 +37 -0
  154. package/dst/man/ase-task-rename.1 +44 -0
  155. package/dst/man/ase-task-request.1 +61 -0
  156. package/dst/man/ase-task-save.1 +48 -0
  157. package/dst/man/ase-task-status.1 +55 -0
  158. package/dst/man/ase-task-store.1 +194 -0
  159. package/dst/man/ase-task-view.1 +40 -0
  160. package/dst/man/ase-task.1 +160 -0
  161. package/dst/man/ase-util-compat.1 +25 -0
  162. package/dst/man/ase-util-diagram.1 +76 -0
  163. package/dst/man/ase-util-meta.1 +45 -0
  164. package/dst/man/ase-util-metric.1 +54 -0
  165. package/dst/man/ase-util-mint.1 +59 -0
  166. package/dst/man/ase-util-worktree.1 +72 -0
  167. package/dst/man/ase-util.1 +50 -0
  168. package/dst/man/ase.1 +124 -0
  169. package/package.json +81 -21
  170. package/plugin/.claude-plugin/plugin.json +1 -1
  171. package/plugin/.codex-plugin/plugin.json +1 -1
  172. package/plugin/.github/plugin/plugin.json +1 -1
  173. package/plugin/agents/ase-meta-diagram.md +12 -8
  174. package/plugin/agents/ase-repo-review.md +322 -0
  175. package/plugin/hooks/hooks-codex.json +5 -0
  176. package/plugin/hooks/hooks-copilot.json +5 -0
  177. package/plugin/hooks/hooks.json +8 -0
  178. package/plugin/meta/ase-common-approach.md +117 -0
  179. package/plugin/meta/ase-common-changeset.md +256 -0
  180. package/plugin/meta/ase-common-code.md +10 -173
  181. package/plugin/meta/ase-common-grill.md +317 -0
  182. package/plugin/meta/ase-common-resolve.md +305 -0
  183. package/plugin/meta/ase-common-task.md +83 -4
  184. package/plugin/meta/ase-constitution.md +0 -2
  185. package/plugin/meta/ase-format-specbook.md +208 -25
  186. package/plugin/meta/ase-format-specbook.yaml +242 -851
  187. package/plugin/meta/ase-format-task.md +669 -125
  188. package/plugin/meta/ase-persona.md +3 -4
  189. package/plugin/meta/ase-skill.md +9 -0
  190. package/plugin/mods/ase-mods.ts +409 -0
  191. package/plugin/mods/claude-code.d.ts +13417 -0
  192. package/plugin/skills/ase-arch-analyze/SKILL.md +1 -1
  193. package/plugin/skills/ase-arch-analyze/help.md +2 -2
  194. package/plugin/skills/ase-code-analyze/SKILL.md +59 -8
  195. package/plugin/skills/ase-code-analyze/help.md +29 -4
  196. package/plugin/skills/ase-code-edit/SKILL.md +107 -181
  197. package/plugin/skills/ase-code-edit/help.md +118 -31
  198. package/plugin/skills/ase-code-lint/SKILL.md +64 -13
  199. package/plugin/skills/ase-code-lint/help.md +32 -2
  200. package/plugin/skills/ase-docs-proofread/SKILL.md +4 -4
  201. package/plugin/skills/ase-docs-proofread/help.md +1 -1
  202. package/plugin/skills/ase-docs-refine/SKILL.md +4 -4
  203. package/plugin/skills/ase-docs-shorten/SKILL.md +4 -4
  204. package/plugin/skills/ase-help-intent/data.md +2164 -1087
  205. package/plugin/skills/ase-help-intent/help.md +1 -1
  206. package/plugin/skills/ase-help-skill/catalog.md +12 -9
  207. package/plugin/skills/ase-meta-brainstorm/SKILL.md +1 -1
  208. package/plugin/skills/ase-meta-config/SKILL.md +3 -4
  209. package/plugin/skills/ase-meta-config/help.md +31 -10
  210. package/plugin/skills/ase-meta-mint/SKILL.md +5 -5
  211. package/plugin/skills/ase-meta-mint/help.md +10 -5
  212. package/plugin/skills/ase-meta-why/help.md +1 -1
  213. package/plugin/skills/ase-meta-workflow/SKILL.md +7 -7
  214. package/plugin/skills/ase-meta-workflow/help.md +4 -4
  215. package/plugin/skills/ase-meta-workflow/sample.md +3 -3
  216. package/plugin/skills/ase-meta-workflow/workflow.txt +22 -18
  217. package/plugin/skills/{ase-meta-changelog → ase-repo-changelog}/SKILL.md +4 -3
  218. package/plugin/skills/{ase-meta-changelog → ase-repo-changelog}/help.md +5 -5
  219. package/plugin/skills/{ase-meta-commit → ase-repo-commit}/SKILL.md +6 -6
  220. package/plugin/skills/{ase-meta-commit → ase-repo-commit}/help.md +5 -5
  221. package/plugin/skills/{ase-meta-diff → ase-repo-diff}/SKILL.md +6 -6
  222. package/plugin/skills/{ase-meta-diff → ase-repo-diff}/help.md +8 -8
  223. package/plugin/skills/{ase-code-dissect → ase-repo-dissect}/SKILL.md +19 -19
  224. package/plugin/skills/{ase-code-dissect → ase-repo-dissect}/help.md +10 -12
  225. package/plugin/skills/ase-repo-merge/SKILL.md +346 -0
  226. package/plugin/skills/ase-repo-merge/help.md +107 -0
  227. package/plugin/skills/ase-repo-resolve/SKILL.md +158 -0
  228. package/plugin/skills/ase-repo-resolve/help.md +102 -0
  229. package/plugin/skills/ase-repo-review/SKILL.md +406 -0
  230. package/plugin/skills/ase-repo-review/help.md +181 -0
  231. package/plugin/skills/ase-spec-edit/SKILL.md +117 -183
  232. package/plugin/skills/ase-spec-edit/help.md +107 -26
  233. package/plugin/skills/ase-sync-reconcile/help.md +1 -1
  234. package/plugin/skills/ase-task-assign/SKILL.md +111 -0
  235. package/plugin/skills/ase-task-assign/help.md +119 -0
  236. package/plugin/skills/ase-task-condense/SKILL.md +21 -21
  237. package/plugin/skills/ase-task-condense/help.md +12 -10
  238. package/plugin/skills/ase-task-delete/SKILL.md +1 -1
  239. package/plugin/skills/ase-task-dissect/SKILL.md +71 -48
  240. package/plugin/skills/ase-task-dissect/help.md +10 -9
  241. package/plugin/skills/ase-task-edit/SKILL.md +379 -94
  242. package/plugin/skills/ase-task-edit/help.md +95 -22
  243. package/plugin/skills/ase-task-estimate/SKILL.md +492 -0
  244. package/plugin/skills/ase-task-estimate/help.md +158 -0
  245. package/plugin/skills/ase-task-grill/SKILL.md +246 -138
  246. package/plugin/skills/ase-task-grill/help.md +129 -26
  247. package/plugin/skills/ase-task-id/SKILL.md +8 -1
  248. package/plugin/skills/ase-task-id/help.md +6 -3
  249. package/plugin/skills/ase-task-implement/SKILL.md +535 -145
  250. package/plugin/skills/ase-task-implement/help.md +138 -47
  251. package/plugin/skills/ase-task-integrate/SKILL.md +549 -0
  252. package/plugin/skills/ase-task-integrate/help.md +187 -0
  253. package/plugin/skills/ase-task-list/SKILL.md +55 -23
  254. package/plugin/skills/ase-task-list/help.md +45 -21
  255. package/plugin/skills/ase-task-reboot/SKILL.md +84 -43
  256. package/plugin/skills/ase-task-reboot/help.md +28 -8
  257. package/plugin/skills/ase-task-rename/SKILL.md +10 -2
  258. package/plugin/skills/ase-task-research/SKILL.md +386 -0
  259. package/plugin/skills/ase-task-research/help.md +102 -0
  260. package/plugin/skills/ase-task-status/SKILL.md +137 -0
  261. package/plugin/skills/ase-task-status/help.md +80 -0
  262. package/plugin/skills/ase-task-view/SKILL.md +49 -24
  263. package/plugin/skills/ase-task-view/help.md +19 -9
  264. package/plugin/agents/ase-meta-review.md +0 -187
  265. package/plugin/skills/ase-code-craft/SKILL.md +0 -264
  266. package/plugin/skills/ase-code-craft/help.md +0 -122
  267. package/plugin/skills/ase-code-refactor/SKILL.md +0 -232
  268. package/plugin/skills/ase-code-refactor/help.md +0 -109
  269. package/plugin/skills/ase-code-resolve/SKILL.md +0 -289
  270. package/plugin/skills/ase-code-resolve/help.md +0 -116
  271. package/plugin/skills/ase-meta-review/SKILL.md +0 -210
  272. package/plugin/skills/ase-meta-review/help.md +0 -96
  273. package/plugin/skills/ase-task-preflight/SKILL.md +0 -166
  274. package/plugin/skills/ase-task-preflight/help.md +0 -82
  275. /package/dst/{ase-ignore.js → ase-lib-ignore.js} +0 -0
  276. /package/dst/{ase-stdio.js → ase-lib-stdio.js} +0 -0
  277. /package/dst/{ase-kv.js → ase-service-kv.js} +0 -0
  278. /package/dst/{ase-sleep.js → ase-service-sleep.js} +0 -0
  279. /package/dst/{ase-timestamp.js → ase-service-timestamp.js} +0 -0
@@ -13,13 +13,32 @@
13
13
  ## DESCRIPTION
14
14
 
15
15
  The `ase-task-reboot` skill re-creates an existing task plan *from
16
- scratch* by extracting the original `**WHAT**` and `**WHY**` sections
17
- (if present) from the current plan, using them as the new instruction,
18
- preserving the original creation timestamp, and writing fresh plan
19
- content via `ase_task_save`.
16
+ scratch* by extracting the `DOM` and `IFC` bullet points of the
17
+ `SPECIFICATION (WHAT)` section (if present) from the current plan,
18
+ using them as the new instruction, re-deriving the `DESIGN (HOW)` and
19
+ `VERIFICATION (WHEN)` sections grounded in the relevant specification
20
+ (`SPEC`), source code (`CODE`), and infrastructure (`INFR`) files of the
21
+ project (naming the actual files and symbols to change, the actual build,
22
+ lint, and test procedures, and a `CHANGELOG.md` entry if such a file
23
+ exists), preserving the original creation
24
+ timestamp, the remaining frontmatter keys, and all attachments, and
25
+ writing fresh plan content via `ase_task_save`. As the rebooted plan
26
+ starts its lifecycle anew, its `Status:` key is reset to the default
27
+ state of the task lifecycle model, all `grilled:` tags are dropped
28
+ from its `Tags:` key, and its `Source:`, `Changeset:`, and `Target:`
29
+ keys are dropped, so they read as their configured defaults
30
+ `project.task.default.{source,changeset,target}`.
31
+
32
+ A plan which does *not* follow the task format (or carries no `DOM` or
33
+ `IFC` bullet point) is rebooted from its entire body instead: all of
34
+ its existing content is *filed* into the `SPECIFICATION (WHAT)`,
35
+ `DESIGN (HOW)`, and `VERIFICATION (WHEN)` sections by classifying
36
+ each statement as a `DOM`, `IFC`, `ARC`, `IMP`, `REG`, or `CON` bullet
37
+ point, with no statement dropped and missing bullet points derived from
38
+ the existing content.
20
39
 
21
40
  After the reboot, the user is asked whether to stop or hand off to
22
- `ase-task-edit`, `ase-task-implement`, or `ase-task-preflight`,
41
+ `ase-task-edit` or `ase-task-implement` (optionally with `--draft`),
23
42
  unless `--next` pre-selects this choice.
24
43
 
25
44
  ## OPTIONS
@@ -33,7 +52,7 @@ unless `--next` pre-selects this choice.
33
52
  Recognized tokens at this skill: `none` (default, interactive
34
53
  answer required), `DONE` (stop), `EDIT` (hand off to
35
54
  `ase-task-edit`), `IMPLEMENT` (hand off to `ase-task-implement`),
36
- or `PREFLIGHT` (hand off to `ase-task-preflight`). Example:
55
+ or `DRAFT` (hand off to `ase-task-implement --draft`). Example:
37
56
  `--next EDIT,DONE` reboots, hands off to editing, and the editing
38
57
  loop will exit immediately.
39
58
 
@@ -46,8 +65,9 @@ unless `--next` pre-selects this choice.
46
65
  ## SCENARIOS
47
66
 
48
67
  - You want a task plan re-created from scratch
49
- - You want a fresh plan from the original WHAT and WHY
68
+ - You want a fresh plan from the original specification
50
69
  - You want planning restarted after a plan degraded
70
+ - You want a free-form or legacy plan filed into the task format
51
71
 
52
72
  ## EXAMPLES
53
73
 
@@ -65,5 +85,5 @@ Reboot a specific task and hand off to editing:
65
85
 
66
86
  ## SEE ALSO
67
87
 
68
- [`ase-task-edit`](../ase-task-edit/help.md), [`ase-task-preflight`](../ase-task-preflight/help.md), [`ase-task-implement`](../ase-task-implement/help.md),
88
+ [`ase-task-edit`](../ase-task-edit/help.md), [`ase-task-implement`](../ase-task-implement/help.md),
69
89
  [`ase-task-view`](../ase-task-view/help.md), [`ase-task-delete`](../ase-task-delete/help.md).
@@ -56,12 +56,12 @@ Procedure
56
56
  </template>
57
57
  </if>
58
58
 
59
- 5. <if condition="<old/> does NOT match the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$` OR <new/> does NOT match the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`">
59
+ 5. <if condition="<old/> does NOT match the regexp `^[a-zA-Z0-9#][a-zA-Z0-9#_-]*$` OR <new/> does NOT match the regexp `^[a-zA-Z0-9#][a-zA-Z0-9#_-]*$`">
60
60
  Only output the following <template/> and then immediately
61
61
  *STOP* processing the entire current skill:
62
62
 
63
63
  <template>
64
- ⧉ **ASE**: ☻ skill: **ase-task-rename**, ▶ ERROR: invalid task id (expected `^[a-zA-Z][a-zA-Z0-9_-]*$`)
64
+ ⧉ **ASE**: ☻ skill: **ase-task-rename**, ▶ ERROR: invalid task id (expected `^[a-zA-Z0-9#][a-zA-Z0-9#_-]*$`)
65
65
  </template>
66
66
  </if>
67
67
 
@@ -97,6 +97,14 @@ Procedure
97
97
  ⧉ **ASE**: ◉ task: **<new/>**, ▶ status: **task renamed**
98
98
  </template>
99
99
 
100
+ If <text/> additionally carries a line `NOTICE: <info/>`
101
+ (the new id does not conform to the task id scheme of the
102
+ project), additionally output:
103
+
104
+ <template>
105
+ ⧉ **ASE**: ◉ task: **<new/>**, ▶ NOTICE: <info/>
106
+ </template>
107
+
100
108
  2. <if condition="<renamed/> is `true` AND <old/> is equal <ase-task-id/>">
101
109
  Set <ase-task-id><new/></ase-task-id>. Call the `ase_task_id(id:
102
110
  "<ase-task-id/>", session: "<ase-session-id/>")` tool from the `ase`
@@ -0,0 +1,386 @@
1
+ ---
2
+ name: ase-task-research
3
+ argument-hint: "[--help|-h] [--services|-s=(all|perplexity|brave|exa|websearch)...] [--refine|-r] [--dry-run|-d] [<id> | <id>: [<topic>] | <topic>]"
4
+ description: >
5
+ Research a topic in depth for the current or given task plan, by
6
+ combining Internet/Web search with a grounding in the source
7
+ artifacts of the project, and append the resulting research report
8
+ to the "research" attachment of the task, optionally refining the
9
+ plan by its recommendations. Use when the user wants to "research",
10
+ "investigate", or "look into" a topic for a "task" or "plan".
11
+ user-invocable: true
12
+ disable-model-invocation: false
13
+ effort: high
14
+ ---
15
+
16
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
17
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
18
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
19
+
20
+ <purpose name="ase-task-research">
21
+ Research a Topic for a Task Plan
22
+ </purpose>
23
+
24
+ <expand name="getopt"
25
+ arg1="ase-task-research"
26
+ arg2="--services|-s=(all|perplexity|brave|exa|websearch)... --refine|-r --dry-run|-d --int-source-dir=">
27
+ $ARGUMENTS
28
+ </expand>
29
+
30
+ <objective>
31
+ *Research* a topic in depth for a task plan, grounded in both the
32
+ *Internet*/*Web* and the *source artifacts* of the project.
33
+ </objective>
34
+
35
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-format-task.md
36
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-format-meta.md
37
+
38
+ Procedure
39
+ ---------
40
+
41
+ <define name="search-agent">
42
+ ```text
43
+ Agent(
44
+ description: "Query Web Search Service: <arg1/>",
45
+ subagent_type: "ase:ase-meta-search",
46
+ prompt: <content/>,
47
+ run_in_background: false
48
+ )
49
+ ```
50
+ </define>
51
+
52
+ 1. **Determine Task and Topic:**
53
+
54
+ 1. Set <topic><getopt-arguments/></topic> initially, with any
55
+ leading and trailing whitespace stripped. Inherit the always
56
+ existing <ase-task-id/>, <ase-session-id/>, and
57
+ <ase-project-boxing/> from the current context. Do not output
58
+ anything.
59
+
60
+ 2. React on task and/or topic:
61
+
62
+ - If <topic/> matches the regexp `^[a-zA-Z0-9#][a-zA-Z0-9#_-]*$`,
63
+ or has the format `<id/>:` or `<id/>: <text/>` where <id/>
64
+ matches this regexp: set <ase-task-id><id/></ase-task-id> (or
65
+ to <topic/> itself for the first form) and <topic/> to <text/>
66
+ (or to empty for the first two forms), call the
67
+ `ase_task_id(id: "<ase-task-id/>", session: "<ase-session-id/>")`
68
+ tool of the `ase` MCP server to switch the task, and then only
69
+ output the following <template/>:
70
+
71
+ <template>
72
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **task given**
73
+ </template>
74
+
75
+ - Otherwise, only output the following <template/>:
76
+
77
+ <template>
78
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **task inherited**
79
+ </template>
80
+
81
+ 3. Treat <getopt-option-services/> as a comma-separated list of
82
+ *backend tokens*. The getopt parser validates only the *first*
83
+ token, so you *MUST* validate each remaining token yourself
84
+ against the allowed set `all`, `perplexity`, `brave`, `exa`,
85
+ `websearch`. If any token is *not* in this set, bind <token/> to
86
+ that offending token, then only output the following <template/>
87
+ and then immediately *STOP* processing the entire current skill:
88
+
89
+ <template>
90
+ ⧉ **ASE**: ☻ skill: **ase-task-research**, ▶ ERROR: invalid `--services` token: **<token/>**
91
+ </template>
92
+
93
+ A backend is *selected* if `all` is in <getopt-option-services/>
94
+ *OR* that backend's own name is in <getopt-option-services/>.
95
+
96
+ 4. *Load*: call the `ase_task_load(id: "<ase-task-id/>", tag: true)`
97
+ tool of the `ase` MCP server -- with the `variant` argument
98
+ defaulting to `source` and the `attachments` argument defaulting
99
+ to `elided` -- and set <plan/> to its `text` output field without
100
+ the trailing `<task-plan-tag>` delimiter line, and <tag/> to the
101
+ content of that line. If <plan/> is empty or starts with `ERROR:`
102
+ or `WARNING:`, only output the following <template/> and then
103
+ immediately *STOP* processing the entire current skill:
104
+
105
+ <template>
106
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: no task plan to research for
107
+ </template>
108
+
109
+ 5. <if condition="<topic/> is empty">
110
+ Research the *task plan itself*: set <topic/> to a concise,
111
+ self-contained summary of the `# TASK:` title and the `DOM`
112
+ bullet-points of <plan/> (skipping every bullet-point in the
113
+ *inert* checkbox states `[-]` and `[>]`).
114
+ </if>
115
+ Then only output the following <template/>:
116
+
117
+ <template>
118
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⌕ topic: **<topic/>**, ▶ status: **topic given**
119
+ </template>
120
+
121
+ 2. **Research the Web:**
122
+
123
+ 1. Derive *two to four* focused, complementary search *queries*
124
+ <queries/> from <topic/> -- like its established practices and
125
+ standards, its typical solutions, libraries, or patterns, and its
126
+ known pitfalls. Each query is a *self-contained* summary of an
127
+ aspect of <topic/> and *MUST* *NEVER* carry confidential project
128
+ internals: no file paths, no symbols or identifiers, and no
129
+ other names taken from the project or from <plan/>, as the
130
+ queries leave the project towards foreign search services. Do
131
+ not output anything.
132
+
133
+ 2. Invoke the following tool once per query <query/> of <queries/>
134
+ and per *selected* backend, emitting *all* invocations *in one
135
+ single message* so they run in *parallel*:
136
+
137
+ If the `perplexity` backend is *selected* and the MCP tool
138
+ `perplexity_search` from the MCP server `search-perplexity` is
139
+ available:
140
+
141
+ <expand name="search-agent" arg1="perplexity">
142
+ Call the MCP tool `perplexity_search(query: "<query/>")`
143
+ from the MCP server `search-perplexity`.
144
+ </expand>
145
+
146
+ If the `brave` backend is *selected* and the MCP tool
147
+ `brave_web_search` from the MCP server `search-brave` is
148
+ available:
149
+
150
+ <expand name="search-agent" arg1="brave">
151
+ Call the MCP tool `brave_web_search(query: "<query/>")`
152
+ from the MCP server `search-brave`.
153
+ </expand>
154
+
155
+ If the `exa` backend is *selected* and the MCP tool
156
+ `web_search_exa` from the MCP server `search-exa` is available:
157
+
158
+ <expand name="search-agent" arg1="exa">
159
+ Call the MCP tool `web_search_exa(query: "<query/>")`
160
+ from the MCP server `search-exa`.
161
+ </expand>
162
+
163
+ If the `websearch` backend is *selected* and the tool `WebSearch`
164
+ (or, if it is not available, the tool `web_search`) is available:
165
+
166
+ <expand name="search-agent" arg1="websearch">
167
+ Call the tool `WebSearch(query: "<query/>")`.
168
+ </expand>
169
+
170
+ If *none* of the selected backends could be invoked -- because no
171
+ corresponding tool is available -- only output the following
172
+ <template/> and then immediately *STOP* processing the entire
173
+ current skill:
174
+
175
+ <template>
176
+ ⧉ **ASE**: ✪ skill: **ase-task-research**, ▶ ERROR: no search backend available: **<getopt-option-services/>**
177
+ </template>
178
+
179
+ 3. Consolidate all responses into the *Web facts* <web-facts/>:
180
+ merge overlapping information, drop irrelevant and unsourced
181
+ information, and keep *every* remaining fact together with its
182
+ source URL. Do not output anything.
183
+
184
+ 3. **Ground in the Project:**
185
+
186
+ 1. Resolve the artifact kinds `spec`, `code`, `docs`, and `infr` to
187
+ their project-relative file lists:
188
+
189
+ <if condition="<getopt-option-int-source-dir/> is not empty">
190
+ The *code basis* of the task is the separate working copy
191
+ <getopt-option-int-source-dir/> (e.g. a checkout of the branch of
192
+ its `Source` key): run the command `ase artifact list` *once*
193
+ with <getopt-option-int-source-dir/> as its working directory and
194
+ parse its `# <kind/>:` and `- <file/>` output lines into the file
195
+ lists, and read every file *exclusively* from there -- the
196
+ `ase_artifact_list` tool always resolves against the *project*
197
+ working copy and hence *MUST* *NOT* be used here.
198
+ </if>
199
+ <else>
200
+ Call the `ase_artifact_list(kind: [ "spec", "code", "docs", "infr" ])`
201
+ tool of the `ase` MCP server *once* and read the returned
202
+ `artifacts` array of `{ kind, files }` objects into the file
203
+ lists.
204
+ </else>
205
+
206
+ 2. From these file lists, determine the files (or their parts) which
207
+ are relevant for <topic/> and <plan/> -- the specification parts,
208
+ source code modules, interfaces, and symbols, the documentation,
209
+ and the build, test, and deployment configuration the topic
210
+ touches or depends on -- and *read* them, strictly *read-only*
211
+ (never change, stage, or commit anything). Condense their
212
+ relevant *project facts* -- the current state, existing
213
+ decisions, conventions, constraints, and terminology -- each with
214
+ its project-relative file path, into <project-facts/>. Do not
215
+ output anything.
216
+
217
+ 4. **Synthesize the Research Report:**
218
+
219
+ Call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
220
+ `ase` MCP server and set <timestamp/> to the `text` field of its
221
+ response. Then set <section/> to the research *section* of this run
222
+ with the following <format/>, *bounded* to about `300` lines and at
223
+ most `10` findings (the most relevant ones), where every line of
224
+ every part is broken after about 100 characters, and where a part
225
+ without any content states `(none)`:
226
+
227
+ <format>
228
+ ## RESEARCH: <topic/>
229
+
230
+ *Researched: <timestamp/>*
231
+
232
+ ### Findings
233
+
234
+ 1. **<finding-summary/>**: <finding-text/> (<source-url/>)
235
+ [...]
236
+
237
+ ### Project Grounding
238
+
239
+ - `<project-file/>`: <project-fact/>
240
+ [...]
241
+
242
+ ### Assessment
243
+
244
+ <assessment/>
245
+
246
+ ### Recommendations
247
+
248
+ - **<recommendation-summary/>**: <recommendation-text/>
249
+ [...]
250
+ </format>
251
+
252
+ Here the *Findings* are the most relevant Web facts of <web-facts/>,
253
+ each with its source URL, the *Project Grounding* are the most
254
+ relevant project facts of <project-facts/>, each with its
255
+ project-relative file path, the *Assessment* states in 3-8 sentences
256
+ how the findings apply to the project, including the *gaps* (what
257
+ the project lacks) and the *conflicts* (where the project or <plan/>
258
+ deviates from the findings), and the *Recommendations* are the
259
+ concrete, actionable consequences for <plan/>. You *MUST* *NOT*
260
+ invent any finding, source URL, or project fact which is not backed
261
+ by <web-facts/> resp. <project-facts/>. The section *MUST* *NOT*
262
+ contain a line consisting of just `---`. Do not output anything.
263
+
264
+ 5. **Attach the Research Report:**
265
+
266
+ 1. <if condition="<getopt-option-dry-run/> is `true`">
267
+ Set <status>researched (dry-run, not attached)</status> and
268
+ continue with sub-step 3.
269
+ </if>
270
+
271
+ 2. *Persist*: update <plan/> as follows and save it, where a refused
272
+ save restarts this sub-step:
273
+
274
+ 1. If the backmatter of <plan/> contains an attachment block
275
+ with the `Type` key value `text/markdown; charset=utf-8;
276
+ kind="research"`, it carries the sections of *earlier*
277
+ research runs: fetch its payload via the
278
+ `ase_task_attachment(id: "<ase-task-id/>", type:
279
+ "text/markdown; charset=utf-8; kind=\"research\"")` tool of
280
+ the `ase` MCP server, whose `text` output field is the
281
+ payload *verbatim*, and set <payload/> to it, followed by an
282
+ empty line and <section/>, so the sections *accumulate* in
283
+ chronological order. Otherwise, set <payload/> to <section/>
284
+ and *append* a new attachment block to the backmatter of
285
+ <plan/>.
286
+
287
+ 2. Set the keys of this attachment block according to the plan
288
+ <format/>: `Type` to `text/markdown; charset=utf-8;
289
+ kind="research"`, `Desc` to <topic/> (truncated to at most 60
290
+ characters, ending in `…` if truncated), `Created` to its
291
+ already present value (or to <timestamp/> for a new block),
292
+ `Modified` to <timestamp/>, and `Data` to <payload/> as a
293
+ `|4+` literal block scalar, with *every* line -- including
294
+ empty lines -- indented by *exactly* 4 spaces.
295
+
296
+ 3. <if condition="<getopt-option-refine/> is `true`">
297
+ Treat the *Recommendations* of <section/> as a *refinement
298
+ instruction* for the plan and apply them *in-place* to the
299
+ body of <plan/>, preserving the overall structure and the
300
+ format of the plan <format/>: add new bullet-points in
301
+ checkbox state `[ ]` or adjust the <text/> of existing ones,
302
+ but *never* rewrite unrelated bullet-points and *never*
303
+ change a bullet-point in checkbox state `[x]`, `[-]`, or
304
+ `[>]`. Skip recommendations which the plan already reflects.
305
+ If the body actually changed, set the `Modified:` frontmatter
306
+ key to <timestamp/> -- the very same value as the `Modified`
307
+ key of the research attachment, so the attachment does not
308
+ fall behind the plan.
309
+ </if>
310
+
311
+ 4. Change *nothing else* of <plan/>: especially, do *not* change
312
+ the `Status:` key, pass the `Effort:` key through *verbatim*
313
+ (the task store drops it on its own if the body changed), and
314
+ pass all other attachment blocks through *verbatim* (with
315
+ their elided `Data` markers).
316
+
317
+ 5. Call the `ase_task_save(id: "<ase-task-id/>", text: "<plan/>",
318
+ base: "<tag/>")` tool of the `ase` MCP server, so the save is
319
+ refused if the plan was changed meanwhile by anybody else.
320
+ This `ase_task_save` MCP tool call is the *only* permitted way
321
+ to persist the plan -- *NEVER* write the plan file via
322
+ `Write`/`Edit` or by executing a shell command.
323
+
324
+ - On success, set <status>research attached</status>, or
325
+ <status>research attached, plan refined</status> if the
326
+ body was changed by sub-step 3 above.
327
+
328
+ - If the save is refused because the plan was *changed*
329
+ meanwhile, *reload* <plan/> and <tag/> as in step 1.4
330
+ and restart this sub-step 2 (keeping <section/>), at most
331
+ *three* times in total, and afterwards set
332
+ <status>failed: plan changed concurrently</status>.
333
+
334
+ - On any other error <info/>, set <status>failed:
335
+ <info/></status>.
336
+
337
+ 3. *Report*:
338
+
339
+ - <if condition="<status/> starts with `failed` or <ase-project-boxing/> is `black`">
340
+ Only output the following <template/>:
341
+
342
+ <template>
343
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **<status/>**
344
+ </template>
345
+ </if>
346
+
347
+ - <elseif condition="<ase-project-boxing/> is `grey`">
348
+ Only output the following <template/>, where <condensed/> is
349
+ the *Assessment* and the *Recommendations* of <section/>,
350
+ condensed to their essentials:
351
+
352
+ <template>
353
+ <ase-tpl-boxed title="RESEARCH" subtitle="<ase-task-id/>">
354
+ <condensed/>
355
+ </ase-tpl-boxed>
356
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **<status/>**
357
+ </template>
358
+ </elseif>
359
+
360
+ - <else>
361
+ Only output the following <template/>:
362
+
363
+ <template>
364
+ <ase-tpl-boxed title="RESEARCH" subtitle="<ase-task-id/>">
365
+ <section/>
366
+ </ase-tpl-boxed>
367
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **<status/>**
368
+ </template>
369
+ </else>
370
+
371
+ 4. Finally, give the closing hint by expanding the following (which,
372
+ depending on the configured <ase-guidance-level/>, may expand
373
+ into nothing and hence emit no output at all), and then *STOP*
374
+ processing the entire current skill:
375
+
376
+ <if condition="<getopt-option-dry-run/> is `true`">
377
+ <ase-tpl-hint level="normal">
378
+ Run `/ase-task-research` again without `--dry-run` to append the research report to the `research` attachment of the task.
379
+ </ase-tpl-hint>
380
+ </if>
381
+ <elseif condition="<getopt-option-refine/> is not `true` and <status/> starts with `research attached`">
382
+ <ase-tpl-hint level="verbose">
383
+ Use `/ase-task-research --refine` to additionally refine the plan by the recommendations, or `/ase-task-view --full` to view the research attachment.
384
+ </ase-tpl-hint>
385
+ </elseif>
386
+
@@ -0,0 +1,102 @@
1
+
2
+ ## NAME
3
+
4
+ `ase-task-research` - Research a Topic for a Task Plan
5
+
6
+ ## SYNOPSIS
7
+
8
+ `ase-task-research`
9
+ [`--help`|`-h`]
10
+ [`--services`|`-s` `all`|`perplexity`|`brave`|`exa`|`websearch`[,...]]
11
+ [`--refine`|`-r`]
12
+ [`--dry-run`|`-d`]
13
+ [*id* | *id*`:` [*topic*] | *topic*]
14
+
15
+ ## DESCRIPTION
16
+
17
+ The `ase-task-research` skill *researches* a topic in depth for a task
18
+ plan. It combines a *Web research* -- several focused queries, sent in
19
+ parallel to the Internet/Web search services of `ase-meta-search` --
20
+ with a *grounding* in the *source artifacts* of the project (its
21
+ specification, source code, documentation, and infrastructure).
22
+
23
+ The result is a *research report* with the parts *Findings* (the Web
24
+ facts, each with its source URL), *Project Grounding* (the relevant
25
+ project facts, each with its project file), *Assessment* (how the
26
+ findings apply to the project, including its gaps and conflicts), and
27
+ *Recommendations* (the concrete consequences for the plan), bounded to
28
+ about 300 lines and at most 10 findings.
29
+
30
+ The report is *appended* to the single `research` attachment of the
31
+ task (of type `text/markdown; charset=utf-8; kind="research"`), so the
32
+ reports of earlier researches are kept. With `--refine`, the
33
+ recommendations are additionally applied to the plan itself, preserving
34
+ its structure. Without a *topic*, the task plan itself (its title and
35
+ domain items) is researched.
36
+
37
+ The search queries carry only a self-contained summary of the topic and
38
+ never any project internals like file paths or identifiers, as they are
39
+ sent to foreign search services. The shown report follows the
40
+ configured `project.boxing`, while the attachment always carries the
41
+ full report.
42
+
43
+ The `ase agent researcher` command researches the tasks automatically
44
+ and always refines the plan by the recommendations: in its mode
45
+ `phase`, it researches and grounds the plans of the `DRAFTED` tasks
46
+ explicitly assigned to it, while in its mode `request`, it researches
47
+ the topics of the requests in any unfinished status, via `ase task
48
+ request <id> research [<topic>]` or key `R` of the task boards.
49
+
50
+ ## OPTIONS
51
+
52
+ - `--services`|`-s` `all`|`perplexity`|`brave`|`exa`|`websearch`[,...]:
53
+ The comma-separated search services to query (default: `all`).
54
+
55
+ - `--refine`|`-r`:
56
+ Additionally refine the task plan by the recommendations of the
57
+ research report.
58
+
59
+ - `--dry-run`|`-d`:
60
+ Research and show the report only, but do not change the task.
61
+
62
+ ## ARGUMENTS
63
+
64
+ - *id*:
65
+ The unique identifier of the task to research for. If omitted, the
66
+ *current* task is used. A single word without a trailing `:` is
67
+ always taken as a task identifier.
68
+
69
+ - *topic*:
70
+ The topic to research. If omitted, the task plan itself is
71
+ researched.
72
+
73
+ ## SCENARIOS
74
+
75
+ - You want to know the established practices and pitfalls of a topic before planning a task
76
+ - You want to check a task plan against the state of the art
77
+ - You want to keep the research findings of a task together with its plan
78
+
79
+ ## EXAMPLES
80
+
81
+ Research the current task plan itself:
82
+
83
+ ```text
84
+ ❯ /ase-task-research
85
+ ```
86
+
87
+ Research a topic for a specific task and refine its plan:
88
+
89
+ ```text
90
+ ❯ /ase-task-research --refine export-json: streaming JSON serialization of large data sets
91
+ ```
92
+
93
+ Research a topic with Perplexity only, without changing the task:
94
+
95
+ ```text
96
+ ❯ /ase-task-research --services perplexity --dry-run rate limiting of REST APIs
97
+ ```
98
+
99
+ ## SEE ALSO
100
+
101
+ [`ase-meta-search`](../ase-meta-search/help.md), [`ase-task-edit`](../ase-task-edit/help.md), [`ase-task-grill`](../ase-task-grill/help.md),
102
+ [`ase-task-view`](../ase-task-view/help.md).