@rse/ase 1.0.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +351 -0
  29. package/dst/ase-config-scope.js +172 -0
  30. package/dst/ase-config.js +25 -585
  31. package/dst/ase-hook.js +230 -116
  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} +3 -0
  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 +251 -76
  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 +225 -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 +79 -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
@@ -0,0 +1,549 @@
1
+ ---
2
+ name: ase-task-integrate
3
+ argument-hint: "[--help|-h] [--next|-n <option>[,...]] [--worktree|-w <name>] [--changeset|-c <changeset>] [--draft|-d] [--target|-t <target>] [--mode|-m merge|rebase|squash] [--no-cleanup|-K] [--stateless|-S] [<id>]"
4
+ description: >
5
+ Integrate the change set or implementation draft of the current or given
6
+ task plan into its target. Use when the user calls to "deliver" or
7
+ "apply" the change set or draft of the "task" or "plan". For merging
8
+ a plain Git branch, use `ase-repo-merge` instead.
9
+ user-invocable: true
10
+ disable-model-invocation: false
11
+ effort: high
12
+ ---
13
+
14
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
15
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
16
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
17
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
18
+
19
+ <purpose name="ase-task-integrate">
20
+ Integrate a Task Change Set
21
+ </purpose>
22
+
23
+ <expand name="getopt"
24
+ arg1="ase-task-integrate"
25
+ arg2="--next|-n=(none|DONE|DELETE)... --worktree|-w= --changeset|-c= --draft|-d --target|-t= --mode|-m=(merge|rebase|squash) --no-cleanup|-K --stateless|-S --int-reuse-task">
26
+ $ARGUMENTS
27
+ </expand>
28
+
29
+ <objective>
30
+ *Integrate* the change set of the task plan from its *changeset*
31
+ location into its *target* through a Git merge.
32
+ </objective>
33
+
34
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-format-task.md
35
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-common-task.md
36
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-common-changeset.md
37
+
38
+ <define name="integrate-temp-remove">
39
+ If <temp-dir/> is not empty, remove the temporary worktree and branch
40
+ by running the commands `git worktree remove --force "<temp-dir/>"`,
41
+ `git worktree prune`, and `git branch -D "<temp-branch/>"` (taken
42
+ exactly as given), ignoring any failure, and set <temp-dir></temp-dir>
43
+ (empty). Do not output anything.
44
+ </define>
45
+
46
+ Procedure
47
+ ---------
48
+
49
+ 1. **Determine Task:**
50
+
51
+ 1. Set <instruction><getopt-arguments/></instruction> initially, with any
52
+ leading and trailing whitespace stripped, and set <temp-dir></temp-dir>
53
+ (empty). Inherit the always existing <ase-task-id/> from the current
54
+ context. Inherit the always existing <ase-session-id/> from the
55
+ current context. Do not output anything.
56
+
57
+ 2. React on task id:
58
+
59
+ <expand name="task-react-id" arg1="ase-task-integrate"></expand>
60
+
61
+ 3. Resolve the draft shorthand: if <getopt-option-draft/> is `true`
62
+ and <getopt-option-changeset/> is not empty, only output the
63
+ following <template/> and then immediately *STOP* processing the
64
+ entire current skill:
65
+
66
+ <template>
67
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: options `--draft` and `--changeset` are mutually exclusive
68
+ </template>
69
+
70
+ Otherwise, if <getopt-option-draft/> is `true`, set
71
+ <getopt-option-changeset>attachment:draft</getopt-option-changeset>,
72
+ so the *implementation draft* in the attachment `draft` of the
73
+ plan is delivered. Do not output anything.
74
+
75
+ 2. **Determine Operation:**
76
+
77
+ 1. Determine the current task plan content:
78
+
79
+ <expand name="task-load-content"></expand>
80
+
81
+ 2. If the <task-content/> is still empty, complain and tell the user to
82
+ use the `ase-task-edit` skill first to create a task plan, and
83
+ `ase-task-implement` to create its change set. Then immediately
84
+ stop processing this skill.
85
+
86
+ 3. <if condition="<getopt-option-stateless/> is not equal `true`, the task lifecycle model <ase-project-task-lifecycle/> is `solo`, and the `Status:` frontmatter key of <task-content/> is present and not equal `OPEN`">
87
+ Only an `OPEN` plan can be integrated in the `solo` model, as
88
+ only `OPEN` transitions directly into `CLOSED`. Set <status/> to
89
+ the value of this key. Only output the
90
+ following <template/>, directly followed by the hint, and then
91
+ immediately *STOP* processing the entire current skill, leaving
92
+ the plan and the artifacts *untouched*:
93
+
94
+ <template>
95
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: plan with status **<status/>** cannot be integrated (expected **OPEN**)
96
+ </template>
97
+
98
+ <ase-tpl-hint level="minimal">
99
+ Run `/ase-task-status OPEN` first to re-open the plan.
100
+ </ase-tpl-hint>
101
+ </if>
102
+
103
+ 3. **Prepare Changeset and Target:**
104
+
105
+ The *changeset* (location of the change set) and the *target*
106
+ (place of integration) are controlled by the `Changeset:` and
107
+ `Target:` frontmatter keys of the plan, which the `--changeset` and
108
+ `--target` options override *ad-hoc* without changing the plan.
109
+ The `worktree` value of the changeset refers to the *context
110
+ worktree*, selected by the `--worktree` option, the `worktree` value
111
+ of the target (and of the source it may refer to) to the *origin
112
+ working copy* the skill was started in (both are the same without
113
+ `--worktree`). An integration never creates a context worktree.
114
+
115
+ 1. Set <task-changeset/> to <getopt-option-changeset/> if it is not
116
+ empty, otherwise to the value of the `Changeset:` frontmatter key
117
+ of <task-content/>, or to the configured default
118
+ <ase-project-task-default-changeset/> if the key is absent, and
119
+ parse it:
120
+
121
+ <expand name="changeset-value"
122
+ arg1="Changeset"
123
+ arg2="<task-changeset/>"
124
+ arg3="`worktree`, `branch`, `attachment`"
125
+ arg4="◉ task: **<ase-task-id/>**"></expand>
126
+
127
+ Set <changeset-type><value-type/></changeset-type> and
128
+ <changeset-name><value-name/></changeset-name>.
129
+
130
+ 2. <if condition="<getopt-option-worktree/> is not empty and <changeset-type/> is not `worktree`">
131
+ The context worktree serves the `worktree` changeset only, so a
132
+ `branch:` or `attachment:` changeset would leave it unused (e.g.
133
+ on a mistyped option). Only output the following <template/> and
134
+ then immediately *STOP* processing the entire current skill,
135
+ leaving the working copy *untouched*:
136
+
137
+ <template>
138
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: option `--worktree` requires a `worktree` changeset (got **<task-changeset/>**)
139
+ </template>
140
+ </if>
141
+
142
+ Otherwise, prepare the context worktree:
143
+
144
+ <expand name="changeset-context"
145
+ arg1="<getopt-option-worktree/>"
146
+ arg2="◉ task: **<ase-task-id/>**"
147
+ arg3="false"
148
+ arg4="false"></expand>
149
+
150
+ 3. Set <task-target/> to <getopt-option-target/> if it is not
151
+ empty, otherwise to the value of the `Target:` frontmatter key of
152
+ <task-content/>, or to the configured default
153
+ <ase-project-task-default-target/> if the key is absent, and parse
154
+ it:
155
+
156
+ <expand name="changeset-value"
157
+ arg1="Target"
158
+ arg2="<task-target/>"
159
+ arg3="`worktree`, `branch`, `source`"
160
+ arg4="◉ task: **<ase-task-id/>**"></expand>
161
+
162
+ Set <target-type><value-type/></target-type> and
163
+ <target-name><value-name/></target-name>. If <target-type/> is
164
+ `source`, the target is whatever the `Source:` frontmatter key of
165
+ <task-content/> refers to (or the configured default
166
+ <ase-project-task-default-source/> if the key is absent):
167
+ set <task-target/> to this value and parse it:
168
+
169
+ <expand name="changeset-value"
170
+ arg1="Source"
171
+ arg2="<task-target/>"
172
+ arg3="`worktree`, `branch`"
173
+ arg4="◉ task: **<ase-task-id/>**"></expand>
174
+
175
+ Set <target-type><value-type/></target-type> and
176
+ <target-name><value-name/></target-name>.
177
+
178
+ 4. Determine the *target branch* <target-branch/>: if <target-type/>
179
+ is `worktree`, capture the output of the command
180
+ `git -C "<origin-dir/>" branch --show-current`, otherwise set it
181
+ to <target-name/>. If <target-branch/> is empty (detached `HEAD`)
182
+ or the command
183
+ `git rev-parse --verify --quiet "refs/heads/<target-branch/>"`
184
+ fails, only output the following <template/> and then
185
+ immediately *STOP* processing the entire current skill:
186
+
187
+ <template>
188
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: target **<task-target/>** is no existing branch
189
+ </template>
190
+
191
+ 5. Determine the *merge source branch* <merge-source/> according to
192
+ <changeset-type/>:
193
+
194
+ - `worktree`: Capture the output of the command
195
+ `git -C "<context-dir/>" branch --show-current` into
196
+ <merge-source/>. If it is empty (detached `HEAD`), only output
197
+ the following <template/> and then immediately *STOP*
198
+ processing the entire current skill:
199
+
200
+ <template>
201
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: worktree **<context-label/>** has no checked-out branch
202
+ </template>
203
+
204
+ - `branch`: Set <merge-source><changeset-name/></merge-source>.
205
+ If the command
206
+ `git rev-parse --verify --quiet "refs/heads/<merge-source/>"`
207
+ fails, only output the following <template/> and then
208
+ immediately *STOP* processing the entire current skill:
209
+
210
+ <template>
211
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: changeset branch **<merge-source/>** does not exist
212
+ </template>
213
+
214
+ - `attachment`: The change set is materialized on a *temporary*
215
+ branch at the commit it is based on, so that the merge below
216
+ can resolve any drift of the target semantically.
217
+
218
+ 1. <if condition="the backmatter of <task-content/> contains NO attachment block with the `Type` key value `text/x-diff; charset=utf-8; kind="<changeset-name/>"`">
219
+ Only output the following <template/>, directly followed
220
+ by the hint, and then immediately *STOP* processing the
221
+ entire current skill:
222
+
223
+ <template>
224
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: no change set attachment **<changeset-name/>** exists
225
+ </template>
226
+
227
+ <ase-tpl-hint level="minimal">
228
+ Run `/ase-task-implement --changeset <task-changeset/>` first to create the change set attachment.
229
+ </ase-tpl-hint>
230
+ </if>
231
+
232
+ 2. <if condition="this attachment block is *stale* according to the plan <format/> (its `Modified` key is absent or older than the `Modified` key of the frontmatter)">
233
+ The change set was created for an *earlier* version of
234
+ the plan, so integrating it would deliver the wrong plan.
235
+ Only output the following <template/>, directly followed
236
+ by the hint, and then immediately *STOP* processing the
237
+ entire current skill, leaving the plan and the artifacts
238
+ *untouched*:
239
+
240
+ <template>
241
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: change set attachment **<changeset-name/>** is **stale** (older than the plan)
242
+ </template>
243
+
244
+ <ase-tpl-hint level="minimal">
245
+ Run `/ase-task-implement --changeset <task-changeset/>` again or remove the attachment.
246
+ </ase-tpl-hint>
247
+ </if>
248
+
249
+ 3. <if condition="the `Desc` key of this attachment block carries a `merged <commit/>` value according to the plan <format/>">
250
+ The change set was already *delivered* by an earlier
251
+ integration, so integrating it again would replay it onto
252
+ a target which already contains it. Set <merged-commit/>
253
+ to this <commit/>, only output the following <template/>,
254
+ directly followed by the hint, and then immediately *STOP*
255
+ processing the entire current skill, leaving the plan and
256
+ the artifacts *untouched*:
257
+
258
+ <template>
259
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: change set attachment **<changeset-name/>** was already integrated (merged **<merged-commit/>**)
260
+ </template>
261
+
262
+ <ase-tpl-hint level="minimal">
263
+ Run `/ase-task-implement --changeset <task-changeset/>` to create a new change set or remove the attachment.
264
+ </ase-tpl-hint>
265
+ </if>
266
+
267
+ 4. Set <temp-base/> to the commit of the `base <commit/>`
268
+ value of the `Desc:` key of this attachment block. If
269
+ the key is absent or the command
270
+ `git rev-parse --verify --quiet "<temp-base/>^{commit}"`
271
+ fails, set <temp-base><target-branch/></temp-base>
272
+ instead.
273
+
274
+ 5. Set <temp-hash/> to the first 8 characters of the output
275
+ of the `ase_mint(type: "sha1", hint:
276
+ "<ase-task-id/>:<changeset-name/>:integrate")` tool of the
277
+ `ase` MCP server, which keeps <temp-id/> *unique* per task
278
+ and attachment. Set <temp-id/> to <ase-task-id/> with all
279
+ characters other than `A-Z`, `a-z`, `0-9`, `_`, and `-`
280
+ stripped, followed by
281
+ `-<changeset-name/>-integrate-<temp-hash/>`, and set
282
+ <temp-branch>ase-integrate/<temp-id/></temp-branch>.
283
+ Determine <temp-dir/> by calling the `ase_worktree_path(id:
284
+ "<temp-id/>", temp: true, create: true)` tool of the `ase`
285
+ MCP server, which places it into the namespace of the
286
+ *temporary* worktrees, disjoint from all other worktrees.
287
+ You *MUST* *NEVER* assemble this path yourself.
288
+
289
+ <if condition="<temp-dir/> exists and is *not* a worktree registered according to `git worktree list --porcelain` whose record carries the line `branch refs/heads/<temp-branch/>`">
290
+ It is *not* owned by this skill, so set
291
+ <temp-dir></temp-dir> (empty) to protect it from any
292
+ removal, only output the following <template/>, and then
293
+ immediately *STOP* processing the entire current skill,
294
+ leaving the task plan *untouched*:
295
+
296
+ <template>
297
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: directory **<temp-id/>** for attachment **<changeset-name/>** exists, but is no temporary worktree
298
+ </template>
299
+ </if>
300
+
301
+ Otherwise, remove any *leftover* of an earlier run which
302
+ stopped before its cleanup by expanding the following, and
303
+ then determine <temp-dir/> once again the same way:
304
+
305
+ <expand name="integrate-temp-remove"></expand>
306
+
307
+ 6. Create the temporary worktree and branch by running the
308
+ command
309
+ `git worktree add -b "<temp-branch/>" "<temp-dir/>" "<temp-base/>"`
310
+ (taken exactly as given), and apply the `Data` payload of
311
+ the attachment block inside it *verbatim*. As this payload
312
+ is *elided* in <task-content/>, fetch it via the
313
+ `ase_task_attachment(id: "<ase-task-id/>", type: "text/x-diff;
314
+ charset=utf-8; kind=\"<changeset-name/>\"")` tool of the `ase`
315
+ MCP server, whose `text` output field is the payload
316
+ *verbatim* (without any indentation), and apply it, e.g. via
317
+ `git -C "<temp-dir/>" apply --3way`, re-applying hunks
318
+ which no longer apply manually. You *MUST* *NEVER* modify
319
+ anything *outside* of <temp-dir/>. Leave the change set
320
+ *uncommitted*, as the merge below commits it. Set
321
+ <merge-source><temp-branch/></merge-source>.
322
+
323
+ If any of these sub-steps fails, expand the following:
324
+
325
+ <expand name="integrate-temp-remove"></expand>
326
+
327
+ Then only output the following <template/> and then
328
+ immediately *STOP* processing the entire current skill,
329
+ leaving the task plan *untouched*:
330
+
331
+ <template>
332
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: change set attachment **<changeset-name/>** failed to materialize
333
+ </template>
334
+
335
+ 6. Check that the change set can be delivered at all. Determine the
336
+ *change set directory* <merge-dir/>: for <changeset-type/>
337
+ `worktree` it is <context-dir/>, for `attachment` it is
338
+ <temp-dir/>, and for `branch` it is the directory of the
339
+ registered worktree in which <merge-source/> is checked out
340
+ according to `git worktree list --porcelain` (or empty if there
341
+ is none). Do not output anything, except for the templates
342
+ below.
343
+
344
+ - <if condition="<merge-source/> is equal <target-branch/> and (<changeset-type/> is not `worktree` or <context-dir/> differs from <origin-dir/>)">
345
+ The change set and the target are the very same branch --
346
+ either in a separate context worktree, so nothing would ever
347
+ reach the origin working copy, or selected as `branch:`
348
+ changeset, so a merge would just commit its uncommitted
349
+ changes in place, which only the `worktree` changeset of the
350
+ origin working copy documents. Expand the following, then only
351
+ output the following <template/>, directly followed by the
352
+ hint, and then immediately *STOP* processing the entire
353
+ current skill, leaving the plan and the artifacts *untouched*:
354
+
355
+ <expand name="integrate-temp-remove"></expand>
356
+
357
+ <template>
358
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: change set and target are the same branch **<target-branch/>**
359
+ </template>
360
+
361
+ <ase-tpl-hint level="minimal">
362
+ Use `--target branch:<name>` to select a different target branch.
363
+ </ase-tpl-hint>
364
+ </if>
365
+
366
+ - <elseif condition="the command `git rev-list --count "<target-branch/>..<merge-source/>"` reports `0` and either <merge-dir/> is empty or the command `git -C "<merge-dir/>" status --porcelain` reports no output">
367
+ The change set carries neither commits beyond the target nor
368
+ uncommitted changes, so an integration would report a
369
+ success without delivering anything. Expand the following,
370
+ then only output the following <template/> and then
371
+ immediately *STOP* processing the entire current skill,
372
+ leaving the plan and the artifacts *untouched*:
373
+
374
+ <expand name="integrate-temp-remove"></expand>
375
+
376
+ <template>
377
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ ERROR: nothing to integrate -- change set **<task-changeset/>** carries no changes beyond target **<target-branch/>**
378
+ </template>
379
+ </elseif>
380
+
381
+ 4. **Integrate Change Set:**
382
+
383
+ 1. <if condition="<getopt-option-stateless/> is not equal `true` and the task lifecycle model <ase-project-task-lifecycle/> defines the state `INTEGRATING` (i.e. `enterprise`)">
384
+ Mark the plan as being integrated: set the `Status:` key of
385
+ <task-content/> to `INTEGRATING` (*creating* the key at its
386
+ position in the key order of the plan <format/> if absent), but
387
+ *only* if `INTEGRATING` is reachable from the current state along
388
+ the transitions of the task lifecycle model -- from `QUALIFIED`
389
+ or `DEFERRED` (via `QUALIFIED`), or from `IMPLEMENTED` (via
390
+ `QUALIFYING` and `QUALIFIED`, as the explicit integration request
391
+ of the user counts as the qualification) -- and persist this
392
+ frontmatter-only change -- without refreshing the `Modified:` key
393
+ -- by calling the `ase_task_save(id: "<ase-task-id/>", text:
394
+ "<task-content/>")` tool of the `ase` MCP server. Do not output
395
+ anything.
396
+ </if>
397
+
398
+ 2. Capture the outputs of the commands
399
+ `git rev-parse "refs/heads/<target-branch/>"` and
400
+ `git rev-parse "refs/heads/<target-branch/>^{tree}"` into
401
+ <target-before/> and <target-tree-before/>, the target branch
402
+ and its content *before* the merge. Do not output anything.
403
+
404
+ 3. Set <merge-args>--target "<target-branch/>" --mode "<getopt-option-mode/>"</merge-args>,
405
+ which passes the merge mode (`merge`, `rebase`, or `squash`)
406
+ through. If <changeset-type/> is `attachment`, or
407
+ <getopt-option-no-cleanup/> is not equal `true`, append
408
+ ` --cleanup` to <merge-args/>, so the merged source branch (and
409
+ its worktree) is removed afterwards. Then merge the change set by
410
+ invoking the `ase-repo-merge` skill, which commits still
411
+ uncommitted changes of the source branch, resolves merge
412
+ conflicts semantically, and checks that the source branch landed:
413
+
414
+ <skill name="ase:ase-repo-merge" args="<merge-args/> <merge-source/>" result="merge-result"/>
415
+
416
+ Set <merge-verdict/> to the `MERGE VERDICT` reported by the
417
+ `ase-repo-merge` skill in <merge-result/> (`MERGED`,
418
+ `CONFLICT`, or `FAILED`), or to `FAILED` if it reported none.
419
+
420
+ 4. <if condition="<merge-verdict/> is `MERGED` and the output of the command `git rev-parse "refs/heads/<target-branch/>^{tree}"` equals <target-tree-before/>">
421
+ The merge succeeded, but the content of the target is unchanged,
422
+ as the change set already landed earlier (e.g. on a repeated
423
+ integration), so nothing was delivered: set
424
+ <merge-verdict>NOOP</merge-verdict>. Capture the output of the
425
+ command `git rev-parse "refs/heads/<target-branch/>"` into
426
+ <target-after/>, and if it differs from <target-before/> and the
427
+ output of the command
428
+ `git rev-parse "refs/heads/<target-branch/>^1"` equals
429
+ <target-before/>, drop the resulting empty commit by running
430
+ the command
431
+ `git update-ref "refs/heads/<target-branch/>" "<target-before/>" "<target-after/>"`
432
+ (taken exactly as given), which leaves the index and working tree
433
+ of the target intact, as their content is unchanged. Do not
434
+ output anything.
435
+ </if>
436
+
437
+ 5. If <changeset-type/> is `attachment`, expand the following:
438
+
439
+ <expand name="integrate-temp-remove"></expand>
440
+
441
+ 6. Update the frontmatter and backmatter of <task-content/> as
442
+ follows, but persist them *only* if anything changed:
443
+
444
+ - <if condition="<getopt-option-stateless/> is not equal `true`">
445
+ If <merge-verdict/> is `MERGED`, set the `Status:` key to
446
+ `CLOSED` for the `solo` model (traversing the transition from
447
+ `OPEN`) or to `INTEGRATED` for the `enterprise` model (if it
448
+ was set to `INTEGRATING` in step 1 above). Otherwise, keep
449
+ the `Status:` key for the `solo` model (`OPEN`), and set it
450
+ to `QUALIFIED` (for <merge-verdict/> `NOOP`) or `DEFERRED`
451
+ (otherwise) for the `enterprise` model (if it was set to
452
+ `INTEGRATING` in step 1 above). The `team` model defines no
453
+ integration states, so its `Status:` key stays *untouched*.
454
+ </if>
455
+
456
+ - <if condition="<changeset-type/> is `attachment` and <merge-verdict/> is `MERGED`">
457
+ The delivered attachment block with the `Type` key value
458
+ `text/x-diff; charset=utf-8; kind="<changeset-name/>"` must
459
+ never be delivered again: if <getopt-option-no-cleanup/> is
460
+ not equal `true`, remove it from the "backmatter". Otherwise,
461
+ keep it, but capture the output of the command
462
+ `git rev-parse "refs/heads/<target-branch/>"` into
463
+ <merged-commit/> and append `, merged <merged-commit/>` to the
464
+ value of its `Desc` key, which marks it as *delivered*
465
+ according to the plan <format/>. Its `Modified` key stays
466
+ *untouched*, as its `Data` payload is not changed.
467
+ </if>
468
+
469
+ The `Modified:` key stays *untouched*, as the "body" is not
470
+ changed. Apart from the above, the plan *MUST* stay *exactly* as
471
+ loaded -- in particular, a *change set snapshot*, which is
472
+ maintained by the `ase agent` agents only, is passed through
473
+ *verbatim*. To persist the plan, call the `ase_task_save(id:
474
+ "<ase-task-id/>", text: "<task-content/>")` tool of the `ase`
475
+ MCP server. This `ase_task_save` MCP tool call is the *only*
476
+ permitted way to persist the plan -- *NEVER* write the plan file
477
+ via `Write`/`Edit` or by executing a shell command. Do not
478
+ output anything in this sub-step.
479
+
480
+ 7. <if condition="<merge-verdict/> is `MERGED`">
481
+ Only output the following <template/>:
482
+
483
+ <template>
484
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇢ changeset: **<task-changeset/>**, ⎇ target: **<target-branch/>**, ▶ status: **plan integrated**
485
+ </template>
486
+ </if>
487
+ <elseif condition="<merge-verdict/> is `NOOP`">
488
+ Only output the following <template/>, directly followed by the
489
+ hint, and then immediately *STOP* processing the entire current
490
+ skill:
491
+
492
+ <template>
493
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇢ changeset: **<task-changeset/>**, ⎇ target: **<target-branch/>**, ▶ ERROR: nothing integrated -- change set is already contained in target
494
+ </template>
495
+
496
+ <ase-tpl-hint level="minimal">
497
+ Run `/ase-task-implement` first to create a new change set, or select a different one via `--changeset`.
498
+ </ase-tpl-hint>
499
+ </elseif>
500
+ <else>
501
+ Only output the following <template/>, directly followed by the
502
+ hint, and then immediately *STOP* processing the entire current
503
+ skill:
504
+
505
+ <template>
506
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇢ changeset: **<task-changeset/>**, ⎇ target: **<target-branch/>**, ▶ ERROR: integration failed with verdict **<merge-verdict/>**
507
+ </template>
508
+
509
+ <ase-tpl-hint level="minimal">
510
+ Resolve the reported problem (e.g. commit or stash uncommitted changes of the target, or check out the target branch in a worktree) and run `/ase-task-integrate` again.
511
+ </ase-tpl-hint>
512
+ </else>
513
+
514
+ 5. **Decide Next Step:**
515
+
516
+ 1. *Determine next step*:
517
+
518
+ <expand name="task-next-select"
519
+ arg1="ase-task-integrate"
520
+ arg2="DONE|DELETE">
521
+ Next Step: How would you like to proceed with the plan?
522
+ DONE: Stop processing and PRESERVE task plan.
523
+ DELETE: Stop processing and DELETE the task plan.
524
+ </expand>
525
+
526
+ 2. Check the tool <result/> and dispatch accordingly:
527
+
528
+ - If <result/> is `DONE` or `CANCEL`:
529
+ Only output the following <template/> and then *STOP*.
530
+
531
+ <template>
532
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan integrated -- done**
533
+ </template>
534
+
535
+ - If <result/> is `DELETE`:
536
+ Set <args></args> (empty). Do *not* forward any remaining
537
+ `--next` list tokens, because the `ase:ase-task-delete`
538
+ skill accepts only an optional `[<id>]` argument and no
539
+ `--next` option; remaining tokens are intentionally discarded.
540
+ Only output the following <template/> and then call the
541
+ tool `Skill(skill: "ase:ase-task-delete", args: "<args/>")`
542
+ to invoke the `ase:ase-task-delete` skill in order to
543
+ *delete* the updated plan. Immediately stop processing the
544
+ current skill once the `Skill` tool was used.
545
+
546
+ <template>
547
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan integrated -- hand-off to delete task**
548
+ </template>
549
+