@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.
- package/dst/ase-hello.js +24 -0
- package/dst/ase-statusline.js +15 -5
- package/package.json +2 -2
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.github/plugin/plugin.json +1 -1
- package/plugin/agents/ase-meta-review.md +188 -0
- package/plugin/etc/eslint.mjs +25 -0
- package/plugin/etc/markdownlint.yaml +13 -11
- package/plugin/etc/stx.conf +2 -1
- package/plugin/meta/ase-control.md +7 -2
- package/plugin/meta/ase-dialog.md +2 -0
- package/plugin/meta/ase-format-arch.md +317 -102
- package/plugin/meta/ase-format-meta.md +12 -0
- package/plugin/meta/ase-format-spec.md +535 -251
- package/plugin/meta/ase-getopt.md +1 -0
- package/plugin/meta/ase-persona.md +1 -1
- package/plugin/meta/ase-skill.md +6 -6
- package/plugin/package.json +5 -2
- package/plugin/skills/ase-arch-analyze/SKILL.md +33 -33
- package/plugin/skills/ase-code-lint/SKILL.md +1 -1
- package/plugin/skills/ase-code-lint/help.md +1 -1
- package/plugin/skills/ase-docs-distill/SKILL.md +158 -0
- package/plugin/skills/ase-docs-distill/help.md +76 -0
- package/plugin/skills/ase-docs-proofread/SKILL.md +1 -1
- package/plugin/skills/ase-docs-proofread/help.md +1 -1
- package/plugin/skills/ase-meta-brainstorm/SKILL.md +17 -11
- package/plugin/skills/ase-meta-brainstorm/help.md +4 -4
- package/plugin/skills/ase-meta-diaboli/SKILL.md +4 -4
- package/plugin/skills/ase-meta-diaboli/help.md +2 -2
- package/plugin/skills/ase-meta-diff/SKILL.md +110 -64
- package/plugin/skills/ase-meta-diff/help.md +30 -6
- package/plugin/skills/ase-meta-review/SKILL.md +166 -0
- package/plugin/skills/ase-meta-review/help.md +70 -0
- package/plugin/skills/ase-meta-steelman/SKILL.md +159 -0
- package/plugin/skills/ase-meta-steelman/help.md +60 -0
- package/plugin/skills/ase-meta-why/help.md +1 -1
- package/plugin/skills/ase-task-condense/SKILL.md +3 -3
- package/plugin/skills/ase-task-implement/help.md +1 -1
- package/plugin/meta/ase-format-adr.md +0 -199
package/dst/ase-hello.js
ADDED
|
@@ -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
|
+
}
|
package/dst/ase-statusline.js
CHANGED
|
@@ -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 = (
|
|
101
|
-
|
|
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.
|
|
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.
|
|
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",
|
|
@@ -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:
|
|
10
|
-
line-length:
|
|
11
|
-
ol-prefix:
|
|
12
|
-
list-marker-space:
|
|
13
|
-
first-line-heading:
|
|
14
|
-
no-space-in-code:
|
|
15
|
-
ul-indent:
|
|
16
|
-
ol-indent:
|
|
17
|
-
heading-style:
|
|
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:
|
|
20
|
-
code-block-style:
|
|
19
|
+
blanks-around-tables: false
|
|
20
|
+
code-block-style: false
|
|
21
|
+
no-duplicate-heading: false
|
|
22
|
+
link-fragments: false
|
|
21
23
|
|
package/plugin/etc/stx.conf
CHANGED
|
@@ -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
|
-
|
|
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>:
|