@rse/ase 0.9.43 → 0.9.45

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 (86) hide show
  1. package/dst/ase-artifact.js +28 -24
  2. package/dst/ase-config.js +27 -36
  3. package/dst/ase-diagram.js +15 -35
  4. package/dst/ase-getopt.js +10 -15
  5. package/dst/ase-hook.js +29 -27
  6. package/dst/ase-kv.js +24 -29
  7. package/dst/ase-log.js +10 -3
  8. package/dst/ase-markdown.js +135 -102
  9. package/dst/ase-mcp.js +3 -10
  10. package/dst/ase-meta.js +6 -4
  11. package/dst/ase-persona.js +7 -11
  12. package/dst/ase-service.js +28 -28
  13. package/dst/ase-setup.js +65 -28
  14. package/dst/ase-skills.js +2 -2
  15. package/dst/ase-statusline.js +26 -34
  16. package/dst/ase-task.js +60 -63
  17. package/dst/ase-version.js +2 -1
  18. package/dst/ase.js +7 -11
  19. package/package.json +12 -10
  20. package/plugin/.claude-plugin/plugin.json +1 -1
  21. package/plugin/.codex-plugin/plugin.json +1 -1
  22. package/plugin/.github/plugin/plugin.json +2 -2
  23. package/plugin/agents/ase-code-lint.md +15 -4
  24. package/plugin/agents/ase-docs-proofread.md +9 -1
  25. package/plugin/agents/ase-meta-chat.md +19 -13
  26. package/plugin/agents/ase-meta-diagram.md +1 -1
  27. package/plugin/agents/ase-meta-search.md +1 -2
  28. package/plugin/etc/eslint.mjs +0 -2
  29. package/plugin/meta/ase-common-task.md +145 -0
  30. package/plugin/meta/ase-constitution.md +5 -2
  31. package/plugin/meta/ase-control.md +1 -1
  32. package/plugin/meta/ase-dialog.md +7 -7
  33. package/plugin/meta/ase-format-arch.md +12 -12
  34. package/plugin/meta/ase-format-spec.md +23 -23
  35. package/plugin/meta/ase-format-task.md +9 -11
  36. package/plugin/meta/ase-getopt.md +1 -1
  37. package/plugin/meta/ase-persona.md +3 -3
  38. package/plugin/meta/ase-skill.md +3 -3
  39. package/plugin/meta/ase-tenets.md +4 -4
  40. package/plugin/package.json +8 -8
  41. package/plugin/skills/ase-arch-analyze/SKILL.md +2 -3
  42. package/plugin/skills/ase-arch-analyze/help.md +2 -2
  43. package/plugin/skills/ase-arch-discover/SKILL.md +2 -2
  44. package/plugin/skills/ase-arch-discover/help.md +3 -2
  45. package/plugin/skills/ase-code-analyze/SKILL.md +0 -1
  46. package/plugin/skills/ase-code-craft/SKILL.md +11 -11
  47. package/plugin/skills/ase-code-lint/SKILL.md +31 -13
  48. package/plugin/skills/ase-code-refactor/SKILL.md +13 -13
  49. package/plugin/skills/ase-code-refactor/help.md +1 -1
  50. package/plugin/skills/ase-code-resolve/SKILL.md +10 -10
  51. package/plugin/skills/ase-code-resolve/help.md +1 -1
  52. package/plugin/skills/ase-docs-distill/SKILL.md +6 -6
  53. package/plugin/skills/ase-docs-distill/help.md +6 -4
  54. package/plugin/skills/ase-docs-proofread/SKILL.md +23 -8
  55. package/plugin/skills/ase-meta-brainstorm/help.md +1 -1
  56. package/plugin/skills/ase-meta-changelog/SKILL.md +9 -5
  57. package/plugin/skills/ase-meta-commit/SKILL.md +8 -6
  58. package/plugin/skills/ase-meta-compat/SKILL.md +14 -5
  59. package/plugin/skills/ase-meta-diaboli/SKILL.md +6 -6
  60. package/plugin/skills/ase-meta-diff/SKILL.md +10 -10
  61. package/plugin/skills/ase-meta-evaluate/SKILL.md +6 -9
  62. package/plugin/skills/ase-meta-persona/SKILL.md +1 -1
  63. package/plugin/skills/ase-meta-quorum/SKILL.md +43 -12
  64. package/plugin/skills/ase-meta-search/SKILL.md +1 -1
  65. package/plugin/skills/ase-meta-search/help.md +4 -2
  66. package/plugin/skills/ase-meta-steelman/SKILL.md +5 -5
  67. package/plugin/skills/ase-meta-steelman/help.md +5 -3
  68. package/plugin/skills/ase-meta-why/SKILL.md +2 -2
  69. package/plugin/skills/ase-meta-why/help.md +3 -1
  70. package/plugin/skills/ase-sync-export/SKILL.md +20 -17
  71. package/plugin/skills/ase-sync-import/SKILL.md +20 -16
  72. package/plugin/skills/ase-sync-import/help.md +2 -2
  73. package/plugin/skills/ase-sync-reconcile/SKILL.md +10 -10
  74. package/plugin/skills/ase-sync-reconcile/help.md +1 -1
  75. package/plugin/skills/ase-task-condense/SKILL.md +39 -85
  76. package/plugin/skills/ase-task-delete/SKILL.md +1 -1
  77. package/plugin/skills/ase-task-edit/SKILL.md +43 -51
  78. package/plugin/skills/ase-task-grill/SKILL.md +11 -13
  79. package/plugin/skills/ase-task-id/SKILL.md +7 -3
  80. package/plugin/skills/ase-task-implement/SKILL.md +18 -111
  81. package/plugin/skills/ase-task-implement/help.md +2 -2
  82. package/plugin/skills/ase-task-list/SKILL.md +3 -0
  83. package/plugin/skills/ase-task-preflight/SKILL.md +22 -115
  84. package/plugin/skills/ase-task-reboot/SKILL.md +39 -71
  85. package/plugin/skills/ase-task-reboot/help.md +2 -1
  86. package/plugin/skills/ase-task-view/SKILL.md +7 -7
package/dst/ase.js CHANGED
@@ -6,17 +6,17 @@
6
6
  */
7
7
  import { Command, CommanderError, Option } from "commander";
8
8
  import Log from "./ase-log.js";
9
+ import SetupCommand from "./ase-setup.js";
9
10
  import ConfigCommand from "./ase-config.js";
10
- import ServiceCommand from "./ase-service.js";
11
11
  import MCPCommand from "./ase-mcp.js";
12
+ import ServiceCommand from "./ase-service.js";
12
13
  import HookCommand from "./ase-hook.js";
13
- import DiagramCommand from "./ase-diagram.js";
14
- import SetupCommand from "./ase-setup.js";
15
14
  import StatuslineCommand from "./ase-statusline.js";
16
15
  import TaskCommand from "./ase-task.js";
17
16
  import ArtifactCommand from "./ase-artifact.js";
18
17
  import MetaCommand from "./ase-meta.js";
19
18
  import CompatCommand from "./ase-compat.js";
19
+ import DiagramCommand from "./ase-diagram.js";
20
20
  import pkg from "../package.json" with { type: "json" };
21
21
  /* globally initialize logger */
22
22
  const log = new Log("ase", "info", "-");
@@ -37,8 +37,8 @@ const main = async () => {
37
37
  .showHelpAfterError()
38
38
  .enablePositionalOptions()
39
39
  .exitOverride();
40
- /* establish shared logger with defaults and then apply parsed
41
- global options to the logger before any subcommand action */
40
+ /* apply parsed global options to the logger
41
+ before any subcommand action */
42
42
  program.hook("preAction", async () => {
43
43
  const opts = program.opts();
44
44
  log.logLevel(opts.logLevel);
@@ -62,12 +62,8 @@ const main = async () => {
62
62
  process.exit(0);
63
63
  };
64
64
  main().catch((err) => {
65
- if (err instanceof CommanderError) {
66
- if (err.exitCode !== 0)
67
- process.exit(err.exitCode);
68
- else
69
- process.exit(0);
70
- }
65
+ if (err instanceof CommanderError)
66
+ process.exit(err.exitCode);
71
67
  const message = err instanceof Error ? err.message : String(err);
72
68
  log.write("error", message);
73
69
  process.exit(1);
package/package.json CHANGED
@@ -3,23 +3,23 @@
3
3
  "description": "Agentic Software Engineering (ASE)",
4
4
  "publishConfig": { "access": "public" },
5
5
  "keywords": [ "agentic", "ai", "coding", "tool", "cli", "software", "engineering" ],
6
- "homepage": "http://github.com/rse/ase",
6
+ "homepage": "https://ase.tools",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
- "bugs": { "url": "http://github.com/rse/ase/issues" },
9
- "version": "0.9.43",
8
+ "bugs": { "url": "https://github.com/rse/ase/issues" },
9
+ "version": "0.9.45",
10
10
  "license": "Apache-2.0",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
13
13
  "email": "rse@engelschall.com",
14
- "url": "http://engelschall.com"
14
+ "url": "https://engelschall.com"
15
15
  },
16
16
  "type": "module",
17
17
  "bin": { "ase": "bin/ase" },
18
18
  "devDependencies": {
19
19
  "eslint": "9.39.4",
20
20
  "@eslint/js": "9.39.4",
21
- "@typescript-eslint/parser": "8.63.0",
22
- "@typescript-eslint/eslint-plugin": "8.63.0",
21
+ "@typescript-eslint/parser": "8.65.0",
22
+ "@typescript-eslint/eslint-plugin": "8.65.0",
23
23
  "eslint-plugin-promise": "7.3.0",
24
24
  "eslint-plugin-import": "2.32.0",
25
25
  "neostandard": "0.13.0",
@@ -42,10 +42,10 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "commander": "15.0.0",
45
- "@dotenvx/dotenvx": "2.2.2",
45
+ "@dotenvx/dotenvx": "2.15.1",
46
46
  "yaml": "2.9.0",
47
47
  "valibot": "1.4.2",
48
- "execa": "9.6.1",
48
+ "execa": "10.0.0",
49
49
  "mkdirp": "3.0.1",
50
50
  "@hapi/hapi": "21.4.9",
51
51
  "beautiful-mermaid": "1.1.3",
@@ -58,15 +58,17 @@
58
58
  "zod": "4.4.3",
59
59
  "which": "7.0.0",
60
60
  "update-notifier": "7.3.1",
61
- "shell-quote": "1.9.0",
61
+ "shell-quote": "1.10.0",
62
62
  "get-stdin": "10.0.0",
63
63
  "proper-lockfile": "4.1.2",
64
64
  "write-file-atomic": "8.0.0",
65
65
  "pacote": "22.0.0",
66
66
  "ofetch": "1.5.1",
67
- "picomatch": "4.0.5"
67
+ "picomatch": "4.0.5",
68
+ "lru-cache": "11.5.2"
68
69
  },
69
70
  "allowScripts": {
71
+ "fsevents": true
70
72
  },
71
73
  "engines": {
72
74
  "npm": ">=10.0.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.43",
3
+ "version": "0.9.45",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.43",
3
+ "version": "0.9.45",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.43",
3
+ "version": "0.9.45",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -11,7 +11,7 @@
11
11
  "email": "rse@engelschall.com",
12
12
  "url": "https://engelschall.com"
13
13
  },
14
- "hooks": "hooks/hooks-copilot.json",
14
+ "hooks": "./hooks/hooks-copilot.json",
15
15
  "mcpServers": {
16
16
  "ase": {
17
17
  "command": "ase",
@@ -50,7 +50,7 @@ Workflow
50
50
  - **A03 - CLEANLINESS**:
51
51
  Check for unclean code and inconsistent code.
52
52
 
53
- For unclean code, especially detect out-dated code construct
53
+ For unclean code, especially detect outdated code construct
54
54
  patterns. For inconsistent code, especially detect code
55
55
  variations for equal intentions.
56
56
 
@@ -246,7 +246,7 @@ Workflow
246
246
  *masks* another bug (e.g., unreachable code after a misplaced
247
247
  `return` that skips cleanup logic).
248
248
 
249
- Be conservative only report clear, well-grounded issues
249
+ Be conservative - only report clear, well-grounded issues
250
250
  that require an actual *code change*. Think twice to avoid
251
251
  *false positives*.
252
252
 
@@ -303,6 +303,17 @@ Workflow
303
303
  which should be changed. Set <new-text/> to the lines of the
304
304
  new code in <file/> which will replace it.
305
305
 
306
+ Keep the hunk *minimal*: <old-text/> and <new-text/>
307
+ *MUST* *NOT* share any common leading or trailing
308
+ lines - *strip* such lines, as they are *unchanged*
309
+ context and not part of the change. When two changed
310
+ regions are separated by unchanged lines, emit *two
311
+ separate* change hunks instead of one large hunk which
312
+ re-states the unchanged lines. Render a *moved* block
313
+ as one pure-deletion hunk at its old location plus one
314
+ pure-insertion hunk at its new location - *never* by
315
+ deleting and re-adding the unchanged lines in between.
316
+
306
317
  3. Set <context-before/> to exactly *up to two* lines of
307
318
  *unchanged* code context which occurs in <file/>
308
319
  directly *before* <old-text/>, i.e., the lines (<line/>
@@ -314,9 +325,9 @@ Workflow
314
325
  4. Set <context-after/> to exactly *up to two* lines of
315
326
  *unchanged* code content which occurs in <file/>
316
327
  directly *after* <old-text/>, i.e., the lines (<line/>
317
- + <n/> + 1) and (<line/> + <n/> + 2), where <n/> is the
328
+ + <n/>) and (<line/> + <n/> + 1), where <n/> is the
318
329
  number of lines in <old-text/>. Reduce to just one line
319
- (<line/> + <n/> + 1) if <old-text/> is the second-last
330
+ (<line/> + <n/>) if <old-text/> is the second-last
320
331
  line of the file. Set <context-after/> to empty if
321
332
  <old-text/> is the last line in the file.
322
333
 
@@ -40,7 +40,15 @@ Workflow
40
40
 
41
41
  3. Set <old-text/> to the lines of the old text which
42
42
  should be changed. Set <new-text/> to the lines of the
43
- new text which will be changed.
43
+ new text which will replace it.
44
+
45
+ Keep the change *minimal*: <old-text/> and <new-text/>
46
+ *MUST* *NOT* share any common leading or trailing
47
+ lines - *strip* such lines, as they are *unchanged*
48
+ context and not part of the change. When two changed
49
+ regions are separated by unchanged lines, report them
50
+ as *two separate* problems instead of one large change
51
+ which re-states the unchanged lines.
44
52
 
45
53
  4. Set <description/> to an ultra-brief and concise
46
54
  Markdown-formatted description of the problem with
@@ -3,12 +3,15 @@ name: ase-meta-chat
3
3
  description: "Query Foreign LLM for Chat via MCP Tool"
4
4
  effort: high
5
5
  tools:
6
- - mcp__chat-openai-chatgpt__query
7
- - mcp__chat-google-gemini__query
8
- - mcp__chat-deepseek__query
9
- - mcp__chat-xai-grok__query
10
- - mcp__chat-zai-glm__query
11
- - mcp__chat-alibaba-qwen__query
6
+ - "mcp__chat-openai-chatgpt__query"
7
+ - "mcp__chat-google-gemini__query"
8
+ - "mcp__chat-deepseek__query"
9
+ - "mcp__chat-xai-grok__query"
10
+ - "mcp__chat-zai-glm__query"
11
+ - "mcp__chat-alibaba-qwen__query"
12
+ - "mcp__chat-anthropic-claude__query"
13
+ - "mcp__chat-openai-codex__query"
14
+ - "mcp__chat-github-copilot__query"
12
15
  ---
13
16
 
14
17
  @../meta/ase-control.md
@@ -20,19 +23,22 @@ tools:
20
23
 
21
24
  2. Set <server></server> (set to empty).
22
25
 
23
- <if condition="<llm/> is equal 'chatgpt'"> <server>chat-openai-chatgpt</server></if>
24
- <if condition="<llm/> is equal 'gemini'"> <server>chat-google-gemini</server> </if>
25
- <if condition="<llm/> is equal 'deepseek'"><server>chat-deepseek</server> </if>
26
- <if condition="<llm/> is equal 'grok'"> <server>chat-xai-grok</server> </if>
27
- <if condition="<llm/> is equal 'glm'"> <server>chat-zai-glm</server> </if>
28
- <if condition="<llm/> is equal 'qwen'"> <server>chat-alibaba-qwen</server> </if>
26
+ <if condition="<llm/> is equal 'chatgpt'"> <server>chat-openai-chatgpt</server> </if>
27
+ <if condition="<llm/> is equal 'gemini'"> <server>chat-google-gemini</server> </if>
28
+ <if condition="<llm/> is equal 'deepseek'"><server>chat-deepseek</server> </if>
29
+ <if condition="<llm/> is equal 'grok'"> <server>chat-xai-grok</server> </if>
30
+ <if condition="<llm/> is equal 'glm'"> <server>chat-zai-glm</server> </if>
31
+ <if condition="<llm/> is equal 'qwen'"> <server>chat-alibaba-qwen</server> </if>
32
+ <if condition="<llm/> is equal 'claude'"> <server>chat-anthropic-claude</server></if>
33
+ <if condition="<llm/> is equal 'codex'"> <server>chat-openai-codex</server> </if>
34
+ <if condition="<llm/> is equal 'copilot'"> <server>chat-github-copilot</server> </if>
29
35
 
30
36
  <if condition="<server/> is empty">
31
37
  You *MUST* output the following <template/> and immediately *STOP* processing
32
38
  (do *NOT* continue with any further step and do *NOT* call any MCP tool):
33
39
 
34
40
  <template>
35
- ERROR: unknown LLM `<llm/>` (has to be one of: chatgpt, gemini, deepseek, grok, glm, qwen)
41
+ ERROR: unknown LLM `<llm/>` (has to be one of: chatgpt, gemini, deepseek, grok, glm, qwen, claude, codex, copilot)
36
42
  </template>
37
43
  </if>
38
44
 
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: ase-meta-diagram
3
3
  description: "Diagram Rendering"
4
+ effort: high
4
5
  tools:
5
6
  - "mcp__plugin_ase_ase__ase_diagram"
6
- effort: high
7
7
  ---
8
8
 
9
9
  Your role is to render a *single* diagram, with *deterministic* and
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: ase-meta-search
3
- description: Query the Web
4
- model: sonnet
3
+ description: "Query the Web"
5
4
  effort: low
6
5
  tools:
7
6
  - "mcp__search-perplexity__perplexity_search"
@@ -5,11 +5,9 @@
5
5
  */
6
6
 
7
7
  import { defineConfig } from "eslint/config"
8
- import markdown from "@eslint/markdown"
9
8
  import md from "eslint-markdown"
10
9
 
11
10
  export default defineConfig([
12
- // markdown.configs.recommended,
13
11
  md.configs.recommended,
14
12
  {
15
13
  files: [
@@ -0,0 +1,145 @@
1
+
2
+ Task Skill Common Steps
3
+ =======================
4
+
5
+ <define name="task-react-id">
6
+
7
+ 1. <if condition="
8
+ <instruction/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`
9
+ ">
10
+ Set <ase-task-id><instruction/></ase-task-id> (set task
11
+ id to instruction) and <instruction></instruction> (set
12
+ instruction empty), call the `ase_task_id(id: "<ase-task-id/>",
13
+ session: "<ase-session-id/>")` tool from the `ase` MCP
14
+ server to switch the task, and then only output the
15
+ following <template/>:
16
+
17
+ <template>
18
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **task given**
19
+ </template>
20
+ </if>
21
+
22
+ 2. <elseif condition="
23
+ <instruction/> has the format `<id/>: <text/>` where
24
+ <id/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$` and
25
+ <text/> is *empty*
26
+ ">
27
+ Set <instruction></instruction> (set instruction to empty)
28
+ and <ase-task-id><id/></ase-task-id> (set task id to
29
+ id) and call the `ase_task_id(id: "<ase-task-id/>", session:
30
+ "<ase-session-id/>")` tool from the `ase` MCP server to
31
+ switch the task, and then only output the following
32
+ <template/>:
33
+
34
+ <template>
35
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **task given**
36
+ </template>
37
+ </elseif>
38
+
39
+ 3. <elseif condition="<instruction/> is NOT empty">
40
+ The argument is neither empty nor a valid task id. As this
41
+ skill only accepts an optional `[<id>]` argument and *never*
42
+ a free-text instruction, only output the following <template/>
43
+ and then immediately *STOP* processing the entire current skill:
44
+
45
+ <template>
46
+ ⧉ **ASE**: ☻ skill: **<arg1/>**, ▶ ERROR: expected single `[<id>]` argument
47
+ </template>
48
+ </elseif>
49
+
50
+ </define>
51
+
52
+ <define name="task-load-content">
53
+
54
+ <if condition="
55
+ <getopt-option-int-reuse-task/> is equal `true`
56
+ *and* a `ase_task_save(id: '<ase-task-id/>', ...)` tool call
57
+ exists earlier in the current session
58
+ ">
59
+ Set <text/> to the `text` argument of the most recent
60
+ `ase_task_save(id: '<ase-task-id/>', ...)` tool call,
61
+ *without* calling `ase_task_load` again. Set <status>plan
62
+ reused</status>. Do not output anything.
63
+ </if>
64
+ <else>
65
+ Call the `ase_task_load(id: "<ase-task-id/>")` tool of the
66
+ `ase` MCP server to load the current task plan content and
67
+ set <text/> to the `text` output field of this `ase_task_load`
68
+ tool call. Do not output anything related to this MCP tool
69
+ call. Set <status>plan loaded</status>.
70
+ </else>
71
+
72
+ - If <text/> starts with `ERROR:` or `WARNING:`:
73
+ Set <task-content></task-content> (set task content to empty).
74
+ Set <words/> to "0".
75
+
76
+ - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
77
+ Set <task-content><text/></task-content> (set task content to text).
78
+ Calculate the number of words <words/> of <task-content/>.
79
+
80
+ Only output the following <template/>:
81
+
82
+ <template>
83
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **<status/>**
84
+ </template>
85
+
86
+ </define>
87
+
88
+ <define name="task-save-content">
89
+
90
+ Update <timestamp-modified/> with the current time in ISO-style
91
+ format, which has to be determined by calling the
92
+ `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the `ase`
93
+ MCP server and use the `text` field of its response. If
94
+ <timestamp-created/> is still unset (because the plan content
95
+ had no `Created:` line), set
96
+ <timestamp-created><timestamp-modified/></timestamp-created>
97
+ (fall back to the modified timestamp). Re-insert the current
98
+ <ase-task-id/>, the original <timestamp-created/>, and the
99
+ refreshed <timestamp-modified/> into <task-content/> and calculate
100
+ the number of words <words/> of <task-content/>.
101
+
102
+ Call the `ase_task_save(id: "<ase-task-id/>", text:
103
+ "<task-content/>")` tool of the `ase` MCP server to save the task
104
+ plan content. Do not output anything related to this MCP call
105
+ except the following <template/>:
106
+
107
+ <template>
108
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **<arg1/>**
109
+ </template>
110
+
111
+ </define>
112
+
113
+ <define name="task-next-select">
114
+
115
+ - If <getopt-option-next/> is not equal to `none`:
116
+ Treat <getopt-option-next/> as a comma-separated chronological
117
+ list of pre-selected next-step tokens. *Split* it on `,`,
118
+ take the *first* token as <head/>, and store the remaining
119
+ tokens (joined back with `,`, or `none` if empty) into
120
+ <getopt-option-next/> so downstream skills can consume the tail.
121
+
122
+ - If <head/> matches the regex `^(<arg2/>)$`:
123
+ Honor the pre-selected token.
124
+ Set <result><head/></result>.
125
+
126
+ - else:
127
+ Only output the following <template/> and then immediately
128
+ *STOP* processing the entire current skill:
129
+
130
+ <template>
131
+ ⧉ **ASE**: ☻ skill: **<arg1/>**, ▶ ERROR: invalid `--next` token: **<head/>**
132
+ </template>
133
+
134
+ - If <getopt-option-next/> is equal to `none`:
135
+
136
+ In the following, you *MUST* *NOT* use your built-in
137
+ <user-dialog-tool/> tool! Instead, you *MUST* just show a
138
+ custom dialog according to the expanded `custom-dialog`
139
+ definition. You *MUST* closely follow this definition:
140
+
141
+ <expand name="custom-dialog" arg1="--no-other">
142
+ <content/>
143
+ </expand>
144
+
145
+ </define>
@@ -6,7 +6,7 @@ You are an expert-level AI coding assistant.
6
6
  You have the **Agentic Software Engineering (ASE)** companion toolkit enabled,
7
7
  which boosts you to an expert-level Software Engineering AI agent.
8
8
 
9
- If ((<ase-agent-tool/> is equal `codex`) *AND* (<ase-headless/> is empty
9
+ If ((<ase-agent-tool/> is equal to `codex`) *AND* (<ase-headless/> is empty
10
10
  or not set)) you *MUST* output the following <template/> *exactly once*
11
11
  as the very *first* thing in your *first* response of this session --
12
12
  *before* any other text, *before* any tool call, and *before* entering
@@ -34,6 +34,8 @@ Commandments
34
34
  ------------
35
35
 
36
36
  - Be *honest* and *transparent* in all your responses.
37
+ - *Ground* factual and technical claims in verifiable evidence (code base, local files, or web)
38
+ with a reference, rather than unverified model knowledge; state explicitly when a claim cannot be verified.
37
39
  - Before proposing any code changes, explain *WHAT* the proposed changes do and *WHY* it is necessary.
38
40
  - Use *concise* and *type-safe code* only.
39
41
  - Use *precise* and *surgical code changes* only.
@@ -45,7 +47,8 @@ Commandments
45
47
  - Always use *parentheses around arrow function parameters*, even for a single parameter.
46
48
  - Make a line break before the keywords "else", "catch", and "finally".
47
49
  - Try to *vertically align similar operators* on consecutive, similar lines.
48
- - Place spaces after opening and before closing angle brackets and braces.
50
+ - Place spaces after opening and before closing angle brackets
51
+ (except for array access and array types) and braces (except for regular expression ranges).
49
52
  - Use *double-quotes* (`"[...]"`) instead of single-quotes (`'[...]'`) for all strings.
50
53
  - Use K&R coding style with *opening braces* at the end of lines and *closing braces* at the beginning of lines.
51
54
  - When a language has a *more strongly-typed variant*, prefer that variant.
@@ -93,5 +93,5 @@ Control Flow Constructs
93
93
  This specifies an *early termination* of the innermost enclosing
94
94
  <while/> or <for/> repetition: when reached, the current repetition
95
95
  is finished and no further repetitions are performed. This construct
96
- is expanded into nothing. Do not output anything else.
96
+ is expanded into nothing. Do not output anything.
97
97
 
@@ -3,13 +3,13 @@ User Dialog
3
3
  ===========
4
4
 
5
5
  <user-dialog-tool>unknown</user-dialog-tool>
6
- <if condition="<ase-agent-tool/> is 'claude'">
6
+ <if condition="<ase-agent-tool/> is `claude`">
7
7
  <user-dialog-tool>AskUserQuestion</user-dialog-tool>
8
8
  </if>
9
- <if condition="<ase-agent-tool/> is 'copilot'">
9
+ <if condition="<ase-agent-tool/> is `copilot`">
10
10
  <user-dialog-tool>ask_user</user-dialog-tool>
11
11
  </if>
12
- <if condition="<ase-agent-tool/> is 'codex'">
12
+ <if condition="<ase-agent-tool/> is `codex`">
13
13
  <user-dialog-tool>none</user-dialog-tool>
14
14
  </if>
15
15
 
@@ -81,7 +81,7 @@ following procedure:
81
81
  Set <keys><keys/>/**CANCEL**</keys>.
82
82
  </else>
83
83
 
84
- <if condition="<opts/> contains `--other`">
84
+ <if condition="<opts/> contains `--other` and does *not* contain `--no-other`">
85
85
  Set <hint>Please choose *one* option by typing <keys/>, or other free-text instruction.</hint>.
86
86
  </if>
87
87
  <else>
@@ -134,14 +134,14 @@ following procedure:
134
134
 
135
135
  4. If <result/> is then *NEITHER* one of the "key"
136
136
  *NOR* "label" values from <spec/>:
137
- <if condition="<opts/> contains `--other`">
137
+ <if condition="<opts/> contains `--other` and does *not* contain `--no-other`">
138
138
  Set <result>OTHER: <result/></result>
139
139
  (prefix result with `OTHER: `).
140
140
  </if>
141
141
  <else>
142
142
  Output the following <template/> and then *START OVER*
143
- by *GOING* to step 2.2.2 above, reusing the already-built
144
- <text/> from step 2.2.1 unchanged (do *NOT* re-enter step 2.2.1
143
+ by *GOING* to step 2.2 above, reusing the already-built
144
+ <text/> from step 2.1 unchanged (do *NOT* re-enter step 2.1
145
145
  and do *NOT* rebuild <text/>, <keys/>, <n/>, or <width/>).
146
146
 
147
147
  <template>
@@ -209,7 +209,7 @@ at runtime.
209
209
  - Kind: <arch-fv-component-kind/>
210
210
  - Responsibility: <arch-fv-component-responsibility/>
211
211
  - Interface: <arch-fv-component-interface/>
212
- - Depends On: <arch-fv-component-dependency/>, [...]
212
+ - Depends On: <arch-fv-component-dependency/>[, ...]
213
213
 
214
214
  <arch-fv-component-description/>,
215
215
  **BECAUSE** <arch-fv-component-rationale/>.
@@ -286,7 +286,7 @@ flow.
286
286
  ## ASPECT: <arch-iv-aspect-name/> <a id="ARCH-IV-<arch-iv-aspect-id/>"></a>
287
287
 
288
288
  - Concern: <arch-iv-aspect-concern/>
289
- - Entities: <arch-iv-aspect-entity/>, [...]
289
+ - Entities: <arch-iv-aspect-entity/>[, ...]
290
290
  - Owner: <arch-iv-aspect-owner/>
291
291
  - Lifecycle: <arch-iv-aspect-lifecycle/>
292
292
 
@@ -364,7 +364,7 @@ communicate.
364
364
  ## UNIT: <arch-co-unit-name/> <a id="ARCH-CO-<arch-co-unit-id/>"></a>
365
365
 
366
366
  - Kind: <arch-co-unit-kind/>
367
- - Hosts: <arch-co-unit-element/>, [...]
367
+ - Hosts: <arch-co-unit-element/>[, ...]
368
368
  - Multiplicity: <arch-co-unit-multiplicity/>
369
369
  - Coordination: <arch-co-unit-coordination/>
370
370
 
@@ -411,7 +411,7 @@ communicate.
411
411
  the chosen concurrency structure.
412
412
 
413
413
  - In case the unit hosts no functional components, the
414
- entire `- Hosts:` bullet point is omitted.
414
+ entire `- Hosts:` bullet point is omitted.
415
415
 
416
416
  - In case the rationale is not present, the
417
417
  entire `, **BECAUSE** [...]` clause is omitted.
@@ -507,7 +507,7 @@ elements to the runtime platform, hardware, and network topology.
507
507
 
508
508
  - Kind: <arch-dp-node-kind/>
509
509
  - Platform: <arch-dp-node-platform/>
510
- - Hosts: <arch-dp-node-element/>, [...]
510
+ - Hosts: <arch-dp-node-element/>[, ...]
511
511
  - Network: <arch-dp-node-network/>
512
512
 
513
513
  <arch-dp-node-description/>,
@@ -551,7 +551,7 @@ elements to the runtime platform, hardware, and network topology.
551
551
  the node's placement and platform choice.
552
552
 
553
553
  - In case the node hosts no functional components, the
554
- entire `- Hosts:` bullet point is omitted.
554
+ entire `- Hosts:` bullet point is omitted.
555
555
 
556
556
  - In case the rationale is not present, the
557
557
  entire `, **BECAUSE** [...]` clause is omitted.
@@ -584,7 +584,7 @@ production, defining installation, monitoring, and management concerns.
584
584
  ## CONCERN: <arch-ov-concern-name/> <a id="ARCH-OV-<arch-ov-concern-id/>"></a>
585
585
 
586
586
  - Category: <arch-ov-concern-category/>
587
- - Element: <arch-ov-concern-element/>, [...]
587
+ - Element: <arch-ov-concern-element/>[, ...]
588
588
 
589
589
  <arch-ov-concern-description/>,
590
590
  **BECAUSE** <arch-ov-concern-rationale/>.
@@ -619,7 +619,7 @@ production, defining installation, monitoring, and management concerns.
619
619
  for the operational approach.
620
620
 
621
621
  - In case the element reference is not present, the
622
- entire `- Element:` bullet point is omitted.
622
+ entire `- Element:` bullet point is omitted.
623
623
 
624
624
  - In case the rationale is not present, the
625
625
  entire `, **BECAUSE** [...]` clause is omitted.
@@ -651,9 +651,9 @@ How the Non-Functional Requirements (NR) are addressed.
651
651
  ## PERSPECTIVE: <arch-qp-perspective-name/> <a id="ARCH-QP-<arch-qp-perspective-id/>"></a>
652
652
 
653
653
  - Quality: <arch-qp-perspective-quality/>
654
- - Addresses: <arch-qp-perspective-requirement/>, [...]
654
+ - Addresses: <arch-qp-perspective-requirement/>[, ...]
655
655
  - Tactic: <arch-qp-perspective-tactic/>
656
- - Affects: <arch-qp-perspective-element/>, [...]
656
+ - Affects: <arch-qp-perspective-element/>[, ...]
657
657
 
658
658
  <arch-qp-perspective-description/>,
659
659
  **BECAUSE** <arch-qp-perspective-rationale/>.
@@ -707,7 +707,7 @@ How the Non-Functional Requirements (NR) are addressed.
707
707
  ("why") for the chosen tactic over alternatives.
708
708
 
709
709
  - In case the element reference is not present, the
710
- entire `- Affects:` bullet point is omitted.
710
+ entire `- Affects:` bullet point is omitted.
711
711
 
712
712
  - In case the rationale is not present, the
713
713
  entire `, **BECAUSE** [...]` clause is omitted.
@@ -740,7 +740,7 @@ forces at play, the chosen response, and the reasoning that justifies it.
740
740
  ## DECISION: <arch-dr-decision-name/> <a id="ARCH-DR-<arch-dr-decision-id/>"></a>
741
741
 
742
742
  - Status: <arch-dr-decision-status/>
743
- - Affects: <arch-dr-decision-element/>, [...]
743
+ - Affects: <arch-dr-decision-element/>[, ...]
744
744
  - Superseded-By: <arch-dr-decision-superseded-by/>
745
745
  - Created: <arch-dr-decision-created/>
746
746
  - Modified: <arch-dr-decision-modified/>