@rse/ase 0.9.26 → 0.9.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "homepage": "http://github.com/rse/ase",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "http://github.com/rse/ase/issues" },
9
- "version": "0.9.26",
9
+ "version": "0.9.28",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -18,20 +18,20 @@
18
18
  "devDependencies": {
19
19
  "eslint": "9.39.4",
20
20
  "@eslint/js": "9.39.4",
21
- "@typescript-eslint/parser": "8.61.1",
22
- "@typescript-eslint/eslint-plugin": "8.61.1",
21
+ "@typescript-eslint/parser": "8.62.0",
22
+ "@typescript-eslint/eslint-plugin": "8.62.0",
23
23
  "eslint-plugin-promise": "7.3.0",
24
24
  "eslint-plugin-import": "2.32.0",
25
25
  "neostandard": "0.13.0",
26
- "globals": "17.6.0",
26
+ "globals": "17.7.0",
27
27
  "typescript": "6.0.3",
28
28
 
29
29
  "@rse/stx": "1.1.6",
30
30
  "nodemon": "3.1.14",
31
31
  "shx": "0.4.0",
32
32
 
33
- "@types/node": "25.9.3",
34
- "@types/luxon": "3.7.1",
33
+ "@types/node": "26.0.1",
34
+ "@types/luxon": "3.7.2",
35
35
  "@types/which": "3.0.4",
36
36
  "@types/update-notifier": "6.0.8",
37
37
  "@types/shell-quote": "1.7.5",
@@ -42,7 +42,7 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "commander": "15.0.0",
45
- "@dotenvx/dotenvx": "1.73.1",
45
+ "@dotenvx/dotenvx": "1.75.1",
46
46
  "yaml": "2.9.0",
47
47
  "valibot": "1.4.1",
48
48
  "execa": "9.6.1",
@@ -57,7 +57,7 @@
57
57
  "zod": "4.4.3",
58
58
  "which": "7.0.0",
59
59
  "update-notifier": "7.3.1",
60
- "shell-quote": "1.8.4",
60
+ "shell-quote": "1.9.0",
61
61
  "get-stdin": "10.0.0",
62
62
  "proper-lockfile": "4.1.2",
63
63
  "write-file-atomic": "8.0.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.26",
3
+ "version": "0.9.28",
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.26",
3
+ "version": "0.9.28",
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.26",
3
+ "version": "0.9.28",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -18,7 +18,8 @@ export default defineConfig([
18
18
  ],
19
19
  rules: {
20
20
  "md/no-double-space": "off",
21
- "md/code-lang-shorthand": "off"
21
+ "md/code-lang-shorthand": "off",
22
+ "md/no-irregular-dash": "off"
22
23
  }
23
24
  }
24
25
  ])
@@ -87,3 +87,11 @@ Control Flow Constructs
87
87
  repetition of <for-body/>. A <break/> in <for-body/> can stop the
88
88
  repetition early. Do not output anything else.
89
89
 
90
+ - *IMPORTANT*: You *MUST* honor the following control flow construct:
91
+ <break/>:
92
+
93
+ This specifies an *early termination* of the innermost enclosing
94
+ <while/> or <for/> repetition: when reached, the current repetition
95
+ is finished and no further repetitions are performed. This construct
96
+ is expanded into nothing. Do not output anything else.
97
+
@@ -75,6 +75,10 @@ Let the *user interactively choose* an answer.
75
75
 
76
76
  3. Check the tool result and dispatch accordingly:
77
77
 
78
+ - If <result/> already starts with `ERROR:` (set by the
79
+ guard in step 2.1 above), keep <result/> unchanged and
80
+ *SKIP* all remaining dispatch in this step.
81
+
78
82
  - If the tool result contains `user doesn't want to proceed`,
79
83
  `tool use was rejected`, or `user declined to answer
80
84
  questions`, or the result clearly indicates that the
@@ -124,17 +128,27 @@ Let the *user interactively choose* an answer.
124
128
 
125
129
  3. Check the tool result and dispatch accordingly:
126
130
 
131
+ - If <result/> already starts with `ERROR:` (set by the
132
+ guard in step 2.1 above), keep <result/> unchanged and
133
+ *SKIP* all remaining dispatch in this step.
134
+
127
135
  - If the tool result contains `User skipped question`
128
136
  or the result clearly indicates that the
129
137
  dialog was cancelled, rejected or skipped, set
130
138
  <result>CANCEL</result>.
131
139
 
132
- - Otherwise, extract the selected answer from the tool result
133
- set <result/> accordingly. If <result/> is of the
134
- expected format `<label/>: <description/>`, set
135
- <result><label/></result> (set result to label). Else,
136
- if <result/> is NOT of the expected format `<label/>:
137
- <description/>`, set <result>OTHER: <result/></result>
140
+ - Otherwise, extract the selected answer from the tool
141
+ result and set <result/> accordingly. The harness may
142
+ return either the full `<label/>: <description/>` line or
143
+ just the bare `<label/>`. Determine the selected
144
+ <label/> by mapping the <result/> to one of the answer
145
+ labels parsed from <spec/> (lines 2 and following): if
146
+ <result/> is of the format `<label/>: <description/>`,
147
+ take its `<label/>` part; otherwise, if <result/> already
148
+ equals one of the answer labels, take it as-is. Set
149
+ <result><label/></result>. If <result/> is then NOT one
150
+ of the answer labels parsed from <spec/>, set
151
+ <result>OTHER: <result/></result>
138
152
  (prefix result with "OTHER").
139
153
 
140
154
  Do not output anything in this step!
@@ -219,11 +233,18 @@ following procedure:
219
233
  </else>
220
234
  </for>
221
235
 
236
+ <if condition="<keys/> is empty">
237
+ Set <keys>**CANCEL**</keys>.
238
+ </if>
239
+ <else>
240
+ Set <keys><keys/>/**CANCEL**</keys>.
241
+ </else>
242
+
222
243
  <if condition="<opts/> contains `--other`">
223
- Set <hint>Please choose *one* option by typing <keys/>/**CANCEL**, or other free-text instruction.</hint>.
244
+ Set <hint>Please choose *one* option by typing <keys/>, or other free-text instruction.</hint>.
224
245
  </if>
225
246
  <else>
226
- Set <hint>Please choose *one* option by typing <keys/>/**CANCEL**.</hint>.
247
+ Set <hint>Please choose *one* option by typing <keys/>.</hint>.
227
248
  </else>
228
249
 
229
250
  Set:
@@ -255,6 +276,10 @@ following procedure:
255
276
  3. Do not output anything in this step!
256
277
  Check the <result/> and dispatch accordingly:
257
278
 
279
+ 0. If <result/> already starts with `ERROR:` (set by the
280
+ guard in step 2.1 above), keep <result/> unchanged and
281
+ *SKIP* all remaining sub-steps 3.1-3.3 of this dispatch.
282
+
258
283
  1. If <result/> is `cancel`, `CANCEL`, `reject`, `REJECT`, or
259
284
  otherwise indicates that the user doesn't want to proceed,
260
285
  or the user declined to answer the question, or that
@@ -274,7 +299,9 @@ following procedure:
274
299
  </if>
275
300
  <else>
276
301
  Output the following <template/> and then *START OVER*
277
- by *GOING* to step 2.2 above.
302
+ by *GOING* to step 2.2 above, reusing the already-built
303
+ <text/> from step 2.1 unchanged (do *NOT* re-enter step 2.1
304
+ and do *NOT* rebuild <text/>, <keys/>, <n/>, or <width/>).
278
305
 
279
306
  <template>
280
307
  ⧉ **ASE**: ERROR: **Invalid option selected!**
@@ -23,8 +23,15 @@ Artifact Meta Information
23
23
 
24
24
  - `Tasks` (`TASK`), aka "Task Plans", "Issues", or "User Stories".
25
25
 
26
+ - `Infrastructure` (`INFR`), aka "Infrastructure as Code (IaC)",
27
+ "Deployment", or "Operations".
28
+
29
+ - `Other` (`OTHR`), the implicit catch-all for any artifacts not
30
+ covered by the other **Artifact Set**s.
31
+
26
32
  Each **Artifact Set** has a unique identifier <artifact-set-id/>,
27
- which is one of `SPEC`, `ARCH`, `CODE`, `DOCS`, or `TASK`.
33
+ which is one of `SPEC`, `ARCH`, `CODE`, `DOCS`, `TASK`, `INFR`, or
34
+ `OTHR`.
28
35
 
29
36
  - **Artifact**:
30
37
 
@@ -88,3 +95,9 @@ The exported file is stored *side-by-side* with the **Artifact** under
88
95
  the path:
89
96
 
90
97
  `<basedir/>/<artifact-set-id/>-<artifact-no/>-<artifact-id/>-<artifact-slug/>-<export-name/>.<export-ext/>`
98
+
99
+ where <artifact-slug/> is the same slug used in the **Artifact**'s own
100
+ file name -- derived from the **Artifact** name by Pascal-casing each
101
+ word and joining the words with `-` characters (e.g. `Customer-Journey`)
102
+ -- as defined by the **Artifact Set**'s own format definition (see
103
+ `ase-format-spec.md` and `ase-format-arch.md`).
@@ -662,7 +662,7 @@ manages, defining how information is organized and connected.
662
662
 
663
663
  - `Attribute` (`**<spec-dm-attribute-id/>**`)
664
664
  - `Type` (`<spec-dm-attribute-qualifier/><spec-dm-attribute-type/>`)
665
- - `Description` (`<spec-dm-relation-description/>, **BECAUSE** <spec-dm-relation-rationale/>.`)
665
+ - `Description` (`<spec-dm-attribute-description/>, **BECAUSE** <spec-dm-attribute-rationale/>.`)
666
666
 
667
667
  - <export-table-2/> is a Markdown table for the relation with one
668
668
  row per <spec-dm-relation-id/>, sorted by <spec-dm-relation-id/> --
@@ -672,6 +672,9 @@ manages, defining how information is organized and connected.
672
672
  - `Target` (`[<spec-dm-relation-target/>](#<spec-dm-relation-target-id/>) (<spec-dm-relation-cardinality/>)`)
673
673
  - `Description` (`<spec-dm-relation-description/>, **BECAUSE** <spec-dm-relation-rationale/>.`)
674
674
 
675
+ - In case a <spec-dm-entity/> has no relations at all, the
676
+ entire `### RELATIONS` block (including <export-table-2/>) is omitted.
677
+
675
678
  - Export: `export.svg`
676
679
 
677
680
  The entities, their attributes and their relations are
@@ -679,7 +682,7 @@ manages, defining how information is organized and connected.
679
682
  converted to SVG. For this, each <spec-dm-entity/> becomes
680
683
  a class whose members are the `<spec-dm-attribute-id/>:
681
684
  <spec-dm-attribute-qualifier/><spec-dm-attribute-type/>` attributes,
682
- and each <spec-dm-relation/> becomes a directed association
685
+ and each <spec-dm-relation-id/> becomes a directed association
683
686
  labeled with its <spec-dm-relation-id/> and annotated with its
684
687
  <spec-dm-relation-cardinality/> at the target end.
685
688
 
@@ -3,9 +3,13 @@ Persona Communication Style
3
3
  ---------------------------
4
4
 
5
5
  *IMPORTANT*: The communication style in your outputs *MUST* in all cases
6
- follow the following conditional rules. Re-evaluate and internalize them
7
- for each value change of <ase-persona-style/> in order to strictly honor
8
- the requested communication style at any time during a session.
6
+ follow the following conditional rules. Re-evaluate and internalize
7
+ them for each value change of <ase-persona-style/> in order to strictly
8
+ honor the requested communication style at any time during a session.
9
+ If <ase-persona-style/> is neither `writer`, `engineer`, `telegrapher`,
10
+ nor `caveman`, treat it as `engineer`. In the ordered list of personas
11
+ `writer`, `engineer`, `telegrapher`, and `caveman`, each following
12
+ persona uses a more terse communication style than the previous one.
9
13
 
10
14
  - If <ase-persona-style/> is `writer`:
11
15
  - You *MUST* use the decorative, eloquent, and explaining communication style of a *writer*.
@@ -28,9 +32,10 @@ the requested communication style at any time during a session.
28
32
  ("sure", "certainly", "of course", "happy to", etc).
29
33
  - You *MUST* *drop* hedging
30
34
  ("I think", "maybe", "perhaps", "it seems", "sort of",
31
- "probably", "I'm not sure but...", "it might be", etc).
35
+ "probably", "I'm not sure but", "it might be", etc).
36
+ - If <ase-persona-style/> is `engineer` or `telegrapher`:
32
37
  - You *MUST* *prefer* lists with bullet points, instead of long prose paragraphs.
33
- - You *MUST* *prefer* bullet points with one or two sentences.
38
+ - You *MUST* *prefer* bullet points with just one or two sentences.
34
39
 
35
40
  - If <ase-persona-style/> is `telegrapher` or `caveman`:
36
41
  - You *MUST* *use* shorter synonyms
@@ -40,20 +45,21 @@ the requested communication style at any time during a session.
40
45
  - You *MUST* *use* arrows for causality
41
46
  ("X → Y").
42
47
  - You *MUST* *use* em-dashes for short subsequent facts
43
- ("X - Y").
48
+ ("X Y").
44
49
  - You *MUST* *drop* articles
45
50
  ("a", "an", "the", etc).
46
51
  - You *MUST* *use* short separate sentences instead of conjunctions
47
- ("and", "but", "or", "so", "because", "however", "therefore", "although").
52
+ ("and", "but", "or", "so", "because", "however", "therefore", "although", etc).
48
53
  - You *MUST* *drop* all fluff in wording.
49
54
 
50
55
  - If <ase-persona-style/> is `caveman`:
51
- - You *MUST* *use* only one word, when one word is clear enough.
52
- - You *MUST* *use* only two words, when two words are clear enough.
53
- - You *MUST* *use* the three sentence patterns
56
+ - You *MUST* *use* only one word, when one word is expressive enough.
57
+ - You *MUST* *use* only two words, when two words are expressive enough.
58
+ - You *MUST* *use* the following three sentence patterns
59
+ when one or two words are not expressive enough
54
60
  (depending on what information has to be expressed):
55
- - `<subject/> <action/> <object/>, <reason/>.` → e.g. "Cat eats fish, hungry."
56
- - `<subject/> <action/> <object/>.` → e.g. "Dog chases ball."
57
- - `<subject/> <action/>.` → e.g. "Birds fly."
61
+ - `<subject/> <action/> <object/>, <reason/>.` → e.g. `Cat eats fish, hungry.`
62
+ - `<subject/> <action/> <object/>.` → e.g. `Dog chases ball.`
63
+ - `<subject/> <action/>.` → e.g. `Birds fly.`
58
64
  - You *MUST* *drop* all lists and their bullet points and instead
59
65
  provide very short subsequent sentences only.
@@ -130,8 +130,9 @@ Skill Sequential Processing
130
130
  no longer at hand.
131
131
 
132
132
  Then establish the strict order explicitly by chaining the created
133
- tasks with `TaskUpdate`: for each <step/> after the first one,
134
- resolve <this/> and <prev/> to the mapped `taskId` values and
133
+ tasks with `TaskUpdate`: for each <step/> after the first one, set
134
+ <this/> to the mapped taskId of this step and <prev/> to the mapped
135
+ taskId of the predecessor step from the reconstructed mapping, and
135
136
  call `TaskUpdate({ taskId: "<this/>", addBlockedBy: [ "<prev/>" ]
136
137
  })` so that every step (with `taskId` <this/>) is blocked by its
137
138
  predecessor step (with `taskId` <prev/>).
@@ -249,7 +250,7 @@ Template Patterns
249
250
 
250
251
  <template>
251
252
 
252
- ╭──────────────────────────────────────────────────────────────────────┈┈┈┈┈┈┈┈┈┈
253
+ ╭────────────────────────────────────────────────────────────────────┈┈┈┈┈┈┈┈┈
253
254
 
254
255
  </template>
255
256
 
@@ -271,17 +272,16 @@ Template Patterns
271
272
 
272
273
  <template>
273
274
 
274
- ╰──────────────────────────────────────────────────────────────────────┈┈┈┈┈┈┈┈┈┈
275
+ ╰───────────────────────────────────────────────────────────────────┈┈┈┈┈┈┈┈┈┈
275
276
 
276
277
  </template>
277
278
 
278
279
  - When `<ase-tpl-foot title="<title/>"/>` should be expanded, use
279
280
  (where <raw-title/> is the visible un-styled text `⧉ ASE: <title/>`,
280
- <raw-title-len/> is the number of characters in <raw-title/>, and
281
- <bar/> is the `─` character repeated exactly max(0, 67 - <raw-title-len/>)
282
- times -- clamped to zero so an over-long title never yields a negative
283
- count -- the very same bar-width rule as `<ase-tpl-head/>` and
284
- `<ase-tpl-boxed/>`, so equal visible text yields equal total width):
281
+ <raw-title-len/> is the number of characters in <raw-title/>,
282
+ and <bar/> is the `─` character repeated exactly max(0, 67 -
283
+ <raw-title-len/>) times -- clamped to zero so an over-long title
284
+ never yields a negative count.
285
285
 
286
286
  <template>
287
287
 
@@ -317,9 +317,7 @@ Template Patterns
317
317
  - Set <raw-title-len/> to the number of characters in the visible
318
318
  un-styled text <raw-title/>.
319
319
  - Set <bar/> to the `─` character repeated exactly max(0, 67 - <raw-title-len/>)
320
- times -- clamped to zero so an over-long title never yields a negative
321
- count -- the very same bar-width rule as `<ase-tpl-head/>` and
322
- `<ase-tpl-foot/>`, so equal visible text yields equal total width.
320
+ times -- clamped to zero so an over-long title never yields a negative count.
323
321
  - Set <body/> to <content/> with all line-starts prefixed with `│ `.
324
322
 
325
323
  <template>
@@ -121,7 +121,7 @@ RECONCILIATION TENETS
121
121
  ---------------------
122
122
 
123
123
  When *reconcile* a set of target artifacts to a set of source artifacts,
124
- you *MUST* honor the following so-called **ALIGNING TENETS**:
124
+ you *MUST* honor the following so-called **RECONCILIATION TENETS**:
125
125
 
126
126
  - **Directional Authority**:
127
127
  The *source* artifacts are the single source of truth; only the
@@ -6,7 +6,7 @@
6
6
  "homepage": "http://github.com/rse/ase",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "http://github.com/rse/ase/issues" },
9
- "version": "0.9.26",
9
+ "version": "0.9.28",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",