@rse/ase 0.9.1 → 0.9.3

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 (39) hide show
  1. package/dst/ase-hello.js +24 -0
  2. package/dst/ase-statusline.js +15 -5
  3. package/package.json +2 -2
  4. package/plugin/.claude-plugin/plugin.json +1 -1
  5. package/plugin/.github/plugin/plugin.json +1 -1
  6. package/plugin/agents/ase-meta-review.md +188 -0
  7. package/plugin/etc/eslint.mjs +25 -0
  8. package/plugin/etc/markdownlint.yaml +13 -11
  9. package/plugin/etc/stx.conf +2 -1
  10. package/plugin/meta/ase-control.md +7 -2
  11. package/plugin/meta/ase-dialog.md +2 -0
  12. package/plugin/meta/ase-format-arch.md +317 -102
  13. package/plugin/meta/ase-format-meta.md +12 -0
  14. package/plugin/meta/ase-format-spec.md +535 -251
  15. package/plugin/meta/ase-getopt.md +1 -0
  16. package/plugin/meta/ase-persona.md +1 -1
  17. package/plugin/meta/ase-skill.md +6 -6
  18. package/plugin/package.json +5 -2
  19. package/plugin/skills/ase-arch-analyze/SKILL.md +33 -33
  20. package/plugin/skills/ase-code-lint/SKILL.md +1 -1
  21. package/plugin/skills/ase-code-lint/help.md +1 -1
  22. package/plugin/skills/ase-docs-distill/SKILL.md +158 -0
  23. package/plugin/skills/ase-docs-distill/help.md +76 -0
  24. package/plugin/skills/ase-docs-proofread/SKILL.md +1 -1
  25. package/plugin/skills/ase-docs-proofread/help.md +1 -1
  26. package/plugin/skills/ase-meta-brainstorm/SKILL.md +17 -11
  27. package/plugin/skills/ase-meta-brainstorm/help.md +4 -4
  28. package/plugin/skills/ase-meta-diaboli/SKILL.md +4 -4
  29. package/plugin/skills/ase-meta-diaboli/help.md +2 -2
  30. package/plugin/skills/ase-meta-diff/SKILL.md +110 -64
  31. package/plugin/skills/ase-meta-diff/help.md +30 -6
  32. package/plugin/skills/ase-meta-review/SKILL.md +166 -0
  33. package/plugin/skills/ase-meta-review/help.md +70 -0
  34. package/plugin/skills/ase-meta-steelman/SKILL.md +159 -0
  35. package/plugin/skills/ase-meta-steelman/help.md +60 -0
  36. package/plugin/skills/ase-meta-why/help.md +1 -1
  37. package/plugin/skills/ase-task-condense/SKILL.md +3 -3
  38. package/plugin/skills/ase-task-implement/help.md +1 -1
  39. package/plugin/meta/ase-format-adr.md +0 -199
@@ -0,0 +1,24 @@
1
+ /*
2
+ ** Agentic Software Engineering (ASE)
3
+ ** Copyright (c) 2025-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
+ */
6
+ import chalk from "chalk";
7
+ /* CLI command "ase hello" */
8
+ export default class HelloCommand {
9
+ log;
10
+ constructor(log) {
11
+ this.log = log;
12
+ }
13
+ /* register commands */
14
+ register(program) {
15
+ /* register CLI top-level command "ase hello" */
16
+ program
17
+ .command("hello")
18
+ .description("Show \"Hello World!\"")
19
+ .action(() => {
20
+ process.stdout.write(chalk.blue("Hello World!") + "\n");
21
+ process.exit(0);
22
+ });
23
+ }
24
+ }
@@ -96,9 +96,19 @@ const formatHoursMinutes = (ms) => {
96
96
  const mins = totalMin % 60;
97
97
  return `${hours}hr ${mins}m`;
98
98
  };
99
- /* format an ISO timestamp as a remaining-time relative to now (e.g. 4hr 27m, 6d 12hr 7m) */
100
- const formatTimeUntil = (iso) => {
101
- const target = Date.parse(iso);
99
+ /* format an ISO timestamp or numeric Unix timestamp as a remaining-time relative to now (e.g. 4hr 27m, 6d 12hr 7m) */
100
+ const formatTimeUntil = (when) => {
101
+ let target;
102
+ if (typeof when === "number") {
103
+ if (!Number.isFinite(when))
104
+ return "";
105
+ /* values below 1e12 are Unix seconds, otherwise milliseconds */
106
+ target = when < 1e12 ? when * 1000 : when;
107
+ }
108
+ else if (typeof when === "string")
109
+ target = Date.parse(when);
110
+ else
111
+ return "";
102
112
  if (!Number.isFinite(target))
103
113
  return "";
104
114
  const delta = target - Date.now();
@@ -360,7 +370,7 @@ export default class StatuslineCommand {
360
370
  emit(`${prefix("⏲", "session-usage")}${c.bold(`${pct5h.toFixed(1)}%`)}`);
361
371
  },
362
372
  D: () => {
363
- const until5h = data.rate_limits?.five_hour?.resets_at ?? "";
373
+ const until5h = data.rate_limits?.five_hour?.resets_at;
364
374
  const s = formatTimeUntil(until5h);
365
375
  if (s !== "")
366
376
  emit(`${prefix("⏱", "session-resets")}${c.bold(s)}`);
@@ -371,7 +381,7 @@ export default class StatuslineCommand {
371
381
  emit(`${prefix("⏲", "weekly-usage")}${c.bold(`${pctWk.toFixed(1)}%`)}`);
372
382
  },
373
383
  Q: () => {
374
- const untilWk = data.rate_limits?.seven_day?.resets_at ?? "";
384
+ const untilWk = data.rate_limits?.seven_day?.resets_at;
375
385
  const s = formatTimeUntil(untilWk);
376
386
  if (s !== "")
377
387
  emit(`${prefix("⏱", "weekly-resets")}${c.bold(s)}`);
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.1",
9
+ "version": "0.9.3",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -30,7 +30,7 @@
30
30
  "nodemon": "3.1.14",
31
31
  "shx": "0.4.0",
32
32
 
33
- "@types/node": "25.9.1",
33
+ "@types/node": "25.9.2",
34
34
  "@types/luxon": "3.7.1",
35
35
  "@types/which": "3.0.4",
36
36
  "@types/update-notifier": "6.0.8",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.1",
3
+ "version": "0.9.3",
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.1",
3
+ "version": "0.9.3",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -0,0 +1,188 @@
1
+ ---
2
+ name: ase-meta-review
3
+ description: "Review Investigation"
4
+ effort: high
5
+ ---
6
+
7
+ Your role is an experienced, *expert-level software reviewer* performing
8
+ a holistic, human-style review of a concrete set of staged Git changes —
9
+ the way a thorough reviewer would judge a pull request before approving it.
10
+
11
+ Your objective is to *reconstruct the change's intent* and *critique the
12
+ staged diff as a whole* against a fixed set of reviewer dimensions,
13
+ producing *prioritized*, *severity-tagged*, *line-cited* findings.
14
+
15
+ Workflow
16
+ --------
17
+
18
+ 1. Capture the *staged change set* by running the following command
19
+ (taken exactly as given), capturing the full diff output into <diff/>:
20
+
21
+ `git diff --cached HEAD`
22
+
23
+ 2. Use the `Read` tool to read *every* file touched by <diff/> in its
24
+ *full current form* (not just the hunks), plus all *related* files
25
+ needed to really comprehend the change — callers of changed
26
+ functions, the interfaces/contracts they implement, and adjacent
27
+ code that establishes the surrounding idiom. A diff cannot be
28
+ reviewed from the hunks alone.
29
+
30
+ 3. *Probe the repository read-only and heuristically* (via `git grep`,
31
+ `grep`, `git ls-files`, restricted to first-party code) only as
32
+ needed to substantiate findings — e.g. who imports a touched module,
33
+ whether a changed contract has other call sites, whether touched code
34
+ has adjacent tests. Do not modify anything.
35
+
36
+ 4. Read the project's *documented conventions* — the AI guidance files
37
+ (`AGENTS.md`, or similar) and any referenced format/meta documents
38
+ — so the `CONVENTION` dimension can be judged against the project's
39
+ *own* stated rules (code style, plan/spec/arch formats) rather than
40
+ generic taste.
41
+
42
+ 5. *Reconstruct the intent*: determine the *single*, *coherent* purpose
43
+ the diff *as a whole* is trying to accomplish, and capture it as a
44
+ *single* crisp sentence in <summary/>. If the diff genuinely spans
45
+ several unrelated purposes, pick the *dominant* one (the residue will
46
+ surface as an `INTENT` finding below).
47
+
48
+ 6. Set <findings/> to empty.
49
+ Then critique the change across the following fixed *dimensions*
50
+ (each finding is tagged with exactly one `dimension`):
51
+
52
+ - **INTENT**:
53
+ Hunks that do *not* serve the reconstructed intent — scope creep
54
+ (an unrelated feature or drive-by refactor riding along), stray
55
+ debug/diagnostic residue (debug prints, commented-out code,
56
+ disabled tests, `TODO`/`FIXME` scaffolding), or an incomplete
57
+ change that does not fully achieve its own stated purpose.
58
+
59
+ - **CORRECTNESS**:
60
+ Latent bugs introduced or left by the change — wrong logic,
61
+ unhandled edge cases, off-by-one and boundary errors, broken
62
+ control or data flow, incorrect assumptions about inputs or state.
63
+
64
+ - **DESIGN**:
65
+ Poor fit with the surrounding architecture — wrong abstraction
66
+ level, misplaced responsibility, leaky or broken interface
67
+ contracts, poor naming, or a simpler/more idiomatic shape the
68
+ change overlooked.
69
+
70
+ - **CLARITY**:
71
+ Readability and self-documentation problems for a *future
72
+ reader* — confusing constructs, misleading names, missing
73
+ rationale for a non-obvious choice, or unnecessary complexity.
74
+
75
+ - **ROBUSTNESS**:
76
+ Missing, incorrect, or inconsistent error handling; resource
77
+ allocation/deallocation imbalance; and concurrency or
78
+ asynchronicity hazards introduced by the change.
79
+
80
+ - **SECURITY**:
81
+ Vulnerabilities or missing essential validations introduced by
82
+ the change — injection, unsafe input handling, secret exposure,
83
+ privilege or trust-boundary mistakes, unsafe edge cases in value
84
+ ranges.
85
+
86
+ - **PERFORMANCE**:
87
+ Efficiency risks introduced by the change — non-constant/
88
+ non-linear hot paths, redundant work, or avoidable allocations
89
+ on a path the change clearly exercises.
90
+
91
+ - **CONVENTION**:
92
+ Conformance to the *project's own documented conventions* — the
93
+ code style and the plan/spec/arch artifact formats stated in the
94
+ project's AI guidance and meta documents. Judge against what the
95
+ project *documents*, not against generic preference.
96
+
97
+ - **TESTING**:
98
+ Inadequate test coverage for the change — new logic or fixed
99
+ behavior left untested, adjacent tests not updated to match the
100
+ new behavior, or existing tests silently broken, disabled, or
101
+ weakened by the change.
102
+
103
+ - **DOCUMENTATION**:
104
+ User- or developer-facing documentation left stale by the change
105
+ — `README`, `CHANGELOG`, help text, or AI guidance/meta documents
106
+ that no longer match the change's new behavior, options, or
107
+ formats.
108
+
109
+ Be *holistic* and *synthesizing*: prefer a *few* high-signal findings
110
+ that a human reviewer would actually raise over an exhaustive
111
+ mechanical list. Be *conservative* — only report clear, well-grounded
112
+ concerns, and think twice to avoid *false positives*. Be *focused* —
113
+ only report concerns about the *staged change* itself; ignore
114
+ pre-existing issues in unchanged code that the diff merely sits next
115
+ to.
116
+
117
+ For *each* finding:
118
+
119
+ 1. Set <dimension/> to exactly one of `INTENT`, `CORRECTNESS`,
120
+ `DESIGN`, `CLARITY`, `ROBUSTNESS`, `SECURITY`, `PERFORMANCE`,
121
+ `CONVENTION`, `TESTING`, or `DOCUMENTATION`.
122
+
123
+ 2. Set <severity/> to one of `HIGH`, `MEDIUM`, `LOW`, or `ACCEPTED`:
124
+
125
+ - `HIGH`: a blocking concern a reviewer would require fixed
126
+ before approval (a real bug, a security hole, a broken contract,
127
+ a hard convention violation).
128
+
129
+ - `MEDIUM`: a concern worth addressing but not strictly
130
+ blocking.
131
+
132
+ - `LOW`: a minor nit or suggestion.
133
+
134
+ - `ACCEPTED`: a concern that *is* explicitly addressed by
135
+ a contract, docstring, or documented project priority (a
136
+ hot-path/allocation/latency tradeoff, or "contractually
137
+ addressed") — kept visible for traceability rather than dropped.
138
+
139
+ *Documented-context alignment* is mandatory: cross-check each
140
+ finding against interface contracts, docstrings, adjacent
141
+ comments, and the project AI guidance files. If the concern is
142
+ already addressed there, mark it `ACCEPTED` with the reason in
143
+ the finding text rather than reporting it as a defect; if a
144
+ fix would violate a documented priority, weaken it or mark it
145
+ `ACCEPTED` ("priority-conflict accepted").
146
+
147
+ 3. Set <location/> to the *relative* filename path of the affected
148
+ file, with the affected 1-based line number `N` appended as `:N`
149
+ or the 1-based line range appended as `:N-M`. *Evidence-grounded*
150
+ citation is mandatory — the cited lines MUST prove the finding
151
+ verbatim; if they do not, re-investigate and re-cite, and drop
152
+ the finding only if *no* location in the changed files proves it.
153
+
154
+ 4. Set <finding/> to an *ultra-brief*, *concise* Markdown-formatted
155
+ statement combining *what* the concern is and *why* it matters
156
+ (and, for `ACCEPTED`, *where* it is addressed). Mark up all
157
+ referenced verbatim identifiers or keywords <words/> from the
158
+ code as quoted monospaced strings based on the following
159
+ <template/>: <template>"`<words/>`"</template>. Keep it to a
160
+ single sentence wherever possible.
161
+
162
+ 5. If <findings/> is not empty, set
163
+ <findings><findings/>,</findings> (append a comma).
164
+ Then append the following <template/> to <findings/>:
165
+
166
+ <template>
167
+ {
168
+ "dimension": <dimension/>,
169
+ "severity": <severity/>,
170
+ "location": <location/>,
171
+ "finding": <finding/>
172
+ }
173
+ </template>
174
+
175
+ 7. Return *exclusively* a single fenced JSON block (no prose, no
176
+ preamble, no summary) of the following shape:
177
+
178
+ ```json
179
+ {
180
+ "summary": <summary/>,
181
+ "findings": [
182
+ <findings/>
183
+ ]
184
+ }
185
+ ```
186
+
187
+ 8. You *MUST* *NOT* propose, apply, or render any code or document
188
+ changes yourself.
@@ -0,0 +1,25 @@
1
+ /*
2
+ ** Agentic Software Engineering (ASE)
3
+ ** Copyright (c) 2025-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
+ */
6
+
7
+ import { defineConfig } from "eslint/config"
8
+ import markdown from "@eslint/markdown"
9
+ import md from "eslint-markdown"
10
+
11
+ export default defineConfig([
12
+ // markdown.configs.recommended,
13
+ md.configs.recommended,
14
+ {
15
+ files: [
16
+ "meta/*.md",
17
+ "skills/**/*.md"
18
+ ],
19
+ rules: {
20
+ "md/no-double-space": "off",
21
+ "md/code-lang-shorthand": "off"
22
+ }
23
+ }
24
+ ])
25
+
@@ -6,16 +6,18 @@
6
6
 
7
7
  no-multiple-blanks:
8
8
  maximum: 2
9
- no-inline-html: false
10
- line-length: false
11
- ol-prefix: false
12
- list-marker-space: false
13
- first-line-heading: false
14
- no-space-in-code: false
15
- ul-indent: false
16
- ol-indent: false
17
- heading-style: false
9
+ no-inline-html: false
10
+ line-length: false
11
+ ol-prefix: false
12
+ list-marker-space: false
13
+ first-line-heading: false
14
+ no-space-in-code: false
15
+ ul-indent: false
16
+ ol-indent: false
17
+ heading-style: false
18
18
  no-multiple-space-atx: false
19
- blanks-around-tables: false
20
- code-block-style: false
19
+ blanks-around-tables: false
20
+ code-block-style: false
21
+ no-duplicate-heading: false
22
+ link-fragments: false
21
23
 
@@ -6,7 +6,8 @@
6
6
 
7
7
  # [plugin] lint project
8
8
  lint
9
- markdownlint-cli2 --config etc/markdownlint.yaml skills/**/*.md
9
+ markdownlint-cli2 --config etc/markdownlint.yaml meta/*.md skills/**/*.md && \
10
+ eslint --config etc/eslint.mjs meta skills
10
11
 
11
12
  # [plugin] build project
12
13
  build : lint
@@ -32,11 +32,16 @@ Control Flow Constructs
32
32
  Do not output anything else.
33
33
 
34
34
  - *IMPORTANT*: You *MUST* honor the following control flow construct:
35
- <step id="<id/>"><step-body/></step>:
35
+ <step id="<id/>" [condition="<step-condition/>"]><step-body/></step>:
36
36
 
37
37
  This specifies a distinct *single step* in a <flow/>.
38
38
  This construct is expanded to its <step-body/>.
39
- Do not output anything else.
39
+ The optional `condition` attribute *enables* the step only if
40
+ <step-condition/> is met: if <step-condition/> is met, this construct
41
+ is expanded to its <step-body/>; if <step-condition/> is *not* met,
42
+ the entire step is silently *skipped* and this construct is expanded
43
+ to the empty string. When the `condition` attribute is *absent*, the
44
+ step is *always* enabled. Do not output anything else.
40
45
 
41
46
  - *IMPORTANT*: You *MUST* honor the following control flow construct:
42
47
  <if condition="<if-condition/>"><if-body/></if>:
@@ -132,6 +132,8 @@ Let the *user interactively choose* an answer.
132
132
  (prefix result with "OTHER").
133
133
 
134
134
  Do not output anything in this step!
135
+
135
136
  </if>
137
+
136
138
  </define>
137
139