@rse/ase 0.9.6 → 0.9.7
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-markdown.js +235 -0
- package/dst/ase-service.js +2 -0
- package/dst/ase-task.js +5 -2
- package/package.json +5 -5
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.github/plugin/plugin.json +1 -1
- package/plugin/meta/ase-format-task.md +14 -14
- package/plugin/package.json +2 -2
- package/plugin/skills/ase-code-craft/SKILL.md +7 -7
- package/plugin/skills/ase-code-craft/help.md +2 -2
- package/plugin/skills/ase-code-refactor/SKILL.md +7 -7
- package/plugin/skills/ase-code-refactor/help.md +2 -2
- package/plugin/skills/ase-code-resolve/SKILL.md +7 -7
- package/plugin/skills/ase-code-resolve/help.md +2 -2
- package/plugin/skills/ase-task-edit/SKILL.md +5 -4
- package/plugin/skills/ase-task-edit/help.md +1 -1
- package/plugin/skills/ase-task-grill/SKILL.md +7 -1
- package/plugin/skills/ase-task-implement/SKILL.md +2 -2
- package/plugin/skills/ase-task-implement/help.md +1 -1
- package/plugin/skills/ase-task-preflight/SKILL.md +2 -2
- package/plugin/skills/ase-task-reboot/SKILL.md +5 -5
- package/plugin/skills/ase-task-view/SKILL.md +19 -8
- package/dst/ase-bash.js +0 -618
- package/dst/ase-hello.js +0 -24
|
@@ -0,0 +1,235 @@
|
|
|
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 { z } from "zod";
|
|
7
|
+
/* the reusable functionality */
|
|
8
|
+
export class Markdown {
|
|
9
|
+
/* prepare Markdown for improved rendering by rewriting
|
|
10
|
+
unordered bullet paragraphs -- replacing the "-"/"*" bullet marker with
|
|
11
|
+
"◯" and splitting multi-line inline code spans into per-line single-line
|
|
12
|
+
spans (so each physical line carries its own closed backtick span).
|
|
13
|
+
Fenced code blocks (``` / ~~~) are detected line-wise and passed
|
|
14
|
+
through entirely verbatim, so neither the inline-span splitting nor the
|
|
15
|
+
bullet-marker rewriting ever touches their contents. */
|
|
16
|
+
static prepare(text) {
|
|
17
|
+
if (typeof text !== "string")
|
|
18
|
+
throw new Error("markdown: text must be a string");
|
|
19
|
+
/* segment the input line-wise into alternating non-fenced and
|
|
20
|
+
fenced regions: a fenced code block opens with a line whose first
|
|
21
|
+
non-whitespace content is a run of 3+ backticks or tildes and
|
|
22
|
+
closes with a matching-or-longer run of the same marker; fenced
|
|
23
|
+
regions are emitted verbatim while only non-fenced regions are
|
|
24
|
+
handed to the rewriting passes below */
|
|
25
|
+
const lines = text.split("\n");
|
|
26
|
+
let result = "";
|
|
27
|
+
let buf = "";
|
|
28
|
+
let inFence = false;
|
|
29
|
+
let fenceCh = "";
|
|
30
|
+
let fenceLen = 0;
|
|
31
|
+
const flush = () => {
|
|
32
|
+
if (buf !== "") {
|
|
33
|
+
result += Markdown.rewrite(buf);
|
|
34
|
+
buf = "";
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
for (let li = 0; li < lines.length; li++) {
|
|
38
|
+
const line = lines[li];
|
|
39
|
+
const nl = li < lines.length - 1 ? "\n" : "";
|
|
40
|
+
const m = line.match(/^(\s*)(`{3,}|~{3,})/);
|
|
41
|
+
if (!inFence && m) {
|
|
42
|
+
/* a fence-opening line: flush the pending non-fenced buffer,
|
|
43
|
+
enter fenced mode, and emit the opener verbatim */
|
|
44
|
+
flush();
|
|
45
|
+
inFence = true;
|
|
46
|
+
fenceCh = m[2][0];
|
|
47
|
+
fenceLen = m[2].length;
|
|
48
|
+
result += line + nl;
|
|
49
|
+
}
|
|
50
|
+
else if (inFence) {
|
|
51
|
+
/* inside a fenced block: emit verbatim and, on a matching
|
|
52
|
+
closing fence line, leave fenced mode */
|
|
53
|
+
result += line + nl;
|
|
54
|
+
const c = line.match(/^(\s*)(`{3,}|~{3,})\s*$/);
|
|
55
|
+
if (c && c[2][0] === fenceCh && c[2].length >= fenceLen)
|
|
56
|
+
inFence = false;
|
|
57
|
+
}
|
|
58
|
+
else
|
|
59
|
+
/* a regular non-fenced line: accumulate for the passes */
|
|
60
|
+
buf += line + nl;
|
|
61
|
+
}
|
|
62
|
+
flush();
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
/* apply the inline-span and bullet-marker rewriting passes to a chunk of
|
|
66
|
+
non-fenced Markdown text (see prepare() for fenced-block handling) */
|
|
67
|
+
static rewrite(text) {
|
|
68
|
+
/* PASS 1: rewrite single-backtick inline code spans that carry
|
|
69
|
+
backslash-escaped backticks (`\``) into CommonMark-correct spans. */
|
|
70
|
+
{
|
|
71
|
+
let pre = "";
|
|
72
|
+
let j = 0;
|
|
73
|
+
while (j < text.length) {
|
|
74
|
+
const ch = text[j];
|
|
75
|
+
if (ch !== "`") {
|
|
76
|
+
/* literal backslash-escaped backtick *outside* any span
|
|
77
|
+
is left verbatim for later scanning */
|
|
78
|
+
pre += ch;
|
|
79
|
+
j++;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
/* scan an opening single-backtick span, capturing its raw
|
|
83
|
+
inner content up to the matching unescaped close backtick */
|
|
84
|
+
let inner = "";
|
|
85
|
+
let k = j + 1;
|
|
86
|
+
let closed = false;
|
|
87
|
+
let escaped = false;
|
|
88
|
+
while (k < text.length) {
|
|
89
|
+
const c = text[k];
|
|
90
|
+
if (c === "\\" && k + 1 < text.length && text[k + 1] === "`") {
|
|
91
|
+
inner += "\\`";
|
|
92
|
+
escaped = true;
|
|
93
|
+
k += 2;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (c === "`") {
|
|
97
|
+
closed = true;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
inner += c;
|
|
101
|
+
k++;
|
|
102
|
+
}
|
|
103
|
+
if (!closed || !escaped) {
|
|
104
|
+
/* not an escaped-backtick span: emit the opening backtick
|
|
105
|
+
verbatim and continue scanning from just after it */
|
|
106
|
+
pre += "`";
|
|
107
|
+
j++;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
/* un-escape inner `\`` into literal backticks, then choose a
|
|
111
|
+
fence longer than the longest internal backtick run */
|
|
112
|
+
const content = inner.replace(/\\`/g, "`");
|
|
113
|
+
let maxRun = 0;
|
|
114
|
+
let run = 0;
|
|
115
|
+
for (const c of content) {
|
|
116
|
+
if (c === "`") {
|
|
117
|
+
run++;
|
|
118
|
+
if (run > maxRun)
|
|
119
|
+
maxRun = run;
|
|
120
|
+
}
|
|
121
|
+
else
|
|
122
|
+
run = 0;
|
|
123
|
+
}
|
|
124
|
+
const fence = "`".repeat(maxRun + 1);
|
|
125
|
+
const pad = (content.startsWith("`") || content.endsWith("`")) ? " " : "";
|
|
126
|
+
pre += `${fence}${pad}${content}${pad}${fence}`;
|
|
127
|
+
j = k + 1;
|
|
128
|
+
}
|
|
129
|
+
text = pre;
|
|
130
|
+
}
|
|
131
|
+
/* PASS 2: split multi-line inline code spans by scanning the
|
|
132
|
+
entire text character-by-character while tracking whether we
|
|
133
|
+
are currently inside an active backtick (U+0060) span; on
|
|
134
|
+
every "<newline><whitespaces>" sequence encountered while
|
|
135
|
+
inside a span, close the span before the break and re-open
|
|
136
|
+
it after the indentation, so each physical line becomes its
|
|
137
|
+
own single-line span */
|
|
138
|
+
let out = "";
|
|
139
|
+
let fence = 0;
|
|
140
|
+
let i = 0;
|
|
141
|
+
while (i < text.length) {
|
|
142
|
+
const ch = text[i];
|
|
143
|
+
if (ch === "`") {
|
|
144
|
+
/* measure the full backtick run (a code-span delimiter is a
|
|
145
|
+
*run* of backticks; a span opened by N backticks is closed
|
|
146
|
+
only by a run of exactly N backticks) */
|
|
147
|
+
let n = 0;
|
|
148
|
+
while (i < text.length && text[i] === "`") {
|
|
149
|
+
n++;
|
|
150
|
+
i++;
|
|
151
|
+
}
|
|
152
|
+
if (fence === 0)
|
|
153
|
+
/* open a span of fence width n */
|
|
154
|
+
fence = n;
|
|
155
|
+
else if (n === fence)
|
|
156
|
+
/* close the active span */
|
|
157
|
+
fence = 0;
|
|
158
|
+
out += "`".repeat(n);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (fence > 0 && (ch === "\r" || ch === "\n")) {
|
|
162
|
+
/* consume optional CR followed by mandatory LF */
|
|
163
|
+
let nl = "";
|
|
164
|
+
if (ch === "\r" && i + 1 < text.length && text[i + 1] === "\n") {
|
|
165
|
+
nl = "\r\n";
|
|
166
|
+
i += 2;
|
|
167
|
+
}
|
|
168
|
+
else if (ch === "\n") {
|
|
169
|
+
nl = "\n";
|
|
170
|
+
i++;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
/* bare CR: not a recognized newline, pass through */
|
|
174
|
+
out += ch;
|
|
175
|
+
i++;
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
/* consume the following run of SPACE/TAB whitespace */
|
|
179
|
+
let ws = "";
|
|
180
|
+
while (i < text.length && (text[i] === " " || text[i] === "\t")) {
|
|
181
|
+
ws += text[i];
|
|
182
|
+
i++;
|
|
183
|
+
}
|
|
184
|
+
/* close span before the break, re-open after indentation,
|
|
185
|
+
preserving the active fence width on both sides */
|
|
186
|
+
const bars = "`".repeat(fence);
|
|
187
|
+
out += `${bars}${nl}${ws}${bars}`;
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
out += ch;
|
|
191
|
+
i++;
|
|
192
|
+
}
|
|
193
|
+
/* PASS 3: replace the leading "-"/"*" marker of every unordered
|
|
194
|
+
bullet paragraph with "◯", preserving the leading indentation
|
|
195
|
+
and the following whitespace; operate line-by-line so only the
|
|
196
|
+
actual list markers (at a line start) are affected */
|
|
197
|
+
out = out
|
|
198
|
+
.split("\n")
|
|
199
|
+
.map((line) => line.replace(/^(\s*)[-*]([ \t]+)/, "$1◯$2"))
|
|
200
|
+
.join("\n");
|
|
201
|
+
return out;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/* MCP registration entry point */
|
|
205
|
+
export class MarkdownMCP {
|
|
206
|
+
register(mcp) {
|
|
207
|
+
mcp.registerTool("ase_markdown_prepare", {
|
|
208
|
+
title: "ASE markdown prepare",
|
|
209
|
+
description: "Prepare Markdown `text` for improved rendering by rewriting " +
|
|
210
|
+
"unordered bullet paragraphs: replace the `-`/`*` bullet markers with `◯` " +
|
|
211
|
+
"and split multi-line inline code spans into per-line single-line spans. " +
|
|
212
|
+
"Single-backtick spans containing backslash-escaped backticks are rewritten " +
|
|
213
|
+
"into CommonMark-correct spans with a widened backtick fence and literal inner " +
|
|
214
|
+
"backticks. Returns the prepared Markdown as `text`.",
|
|
215
|
+
inputSchema: {
|
|
216
|
+
text: z.string()
|
|
217
|
+
.describe("Markdown text to prepare for improved rendering")
|
|
218
|
+
}
|
|
219
|
+
}, async (args) => {
|
|
220
|
+
try {
|
|
221
|
+
const text = Markdown.prepare(args.text);
|
|
222
|
+
return {
|
|
223
|
+
content: [{ type: "text", text }]
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
228
|
+
return {
|
|
229
|
+
isError: true,
|
|
230
|
+
content: [{ type: "text", text: `ERROR: ${message}` }]
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
package/dst/ase-service.js
CHANGED
|
@@ -18,6 +18,7 @@ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/
|
|
|
18
18
|
import { Config, configSchema, ConfigMCP } from "./ase-config.js";
|
|
19
19
|
import { DiagramMCP } from "./ase-diagram.js";
|
|
20
20
|
import { TaskMCP } from "./ase-task.js";
|
|
21
|
+
import { MarkdownMCP } from "./ase-markdown.js";
|
|
21
22
|
import { ArtifactMCP } from "./ase-artifact.js";
|
|
22
23
|
import { KVMCP } from "./ase-kv.js";
|
|
23
24
|
import PersonaMCP from "./ase-persona.js";
|
|
@@ -237,6 +238,7 @@ export default class ServiceCommand {
|
|
|
237
238
|
new ServiceMCP({ projectId: ctx.projectId, port: ctx.port, startTime }).register(mcp);
|
|
238
239
|
new DiagramMCP().register(mcp);
|
|
239
240
|
new TaskMCP(this.log).register(mcp);
|
|
241
|
+
new MarkdownMCP().register(mcp);
|
|
240
242
|
new ArtifactMCP(this.log).register(mcp);
|
|
241
243
|
new KVMCP().register(mcp);
|
|
242
244
|
new PersonaMCP(this.log).register(mcp);
|
package/dst/ase-task.js
CHANGED
|
@@ -11,6 +11,7 @@ import picomatch from "picomatch";
|
|
|
11
11
|
import { isScalar } from "yaml";
|
|
12
12
|
import { z } from "zod";
|
|
13
13
|
import { Config, configSchema, parseScope } from "./ase-config.js";
|
|
14
|
+
import { Markdown } from "./ase-markdown.js";
|
|
14
15
|
/* reusable functionality: persisted task plans under
|
|
15
16
|
<project>/<basedir>/TASK-<id>.md (driven by the
|
|
16
17
|
"project.artifact.task.{basedir,files}" configuration) */
|
|
@@ -420,7 +421,8 @@ export class TaskMCP {
|
|
|
420
421
|
}
|
|
421
422
|
}, async (args) => {
|
|
422
423
|
try {
|
|
423
|
-
const
|
|
424
|
+
const raw = Task.load(this.log, args.id);
|
|
425
|
+
const text = Markdown.prepare(raw);
|
|
424
426
|
return {
|
|
425
427
|
content: [{ type: "text", text }]
|
|
426
428
|
};
|
|
@@ -446,7 +448,8 @@ export class TaskMCP {
|
|
|
446
448
|
}
|
|
447
449
|
}, async (args) => {
|
|
448
450
|
try {
|
|
449
|
-
|
|
451
|
+
const text = Markdown.prepare(args.text);
|
|
452
|
+
Task.save(this.log, args.id, text);
|
|
450
453
|
return {
|
|
451
454
|
content: [{ type: "text", text: `task_save: OK: saved task "${args.id}"` }]
|
|
452
455
|
};
|
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.7",
|
|
10
10
|
"license": "GPL-3.0-only",
|
|
11
11
|
"author": {
|
|
12
12
|
"name": "Dr. Ralf S. Engelschall",
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"eslint": "9.39.4",
|
|
20
20
|
"@eslint/js": "9.39.4",
|
|
21
|
-
"@typescript-eslint/parser": "8.
|
|
22
|
-
"@typescript-eslint/eslint-plugin": "8.
|
|
21
|
+
"@typescript-eslint/parser": "8.61.0",
|
|
22
|
+
"@typescript-eslint/eslint-plugin": "8.61.0",
|
|
23
23
|
"eslint-plugin-promise": "7.3.0",
|
|
24
24
|
"eslint-plugin-import": "2.32.0",
|
|
25
25
|
"neostandard": "0.13.0",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"commander": "15.0.0",
|
|
45
|
-
"@dotenvx/dotenvx": "1.71.
|
|
45
|
+
"@dotenvx/dotenvx": "1.71.2",
|
|
46
46
|
"yaml": "2.9.0",
|
|
47
47
|
"valibot": "1.4.1",
|
|
48
48
|
"execa": "9.6.1",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"shell-quote": "1.8.4",
|
|
61
61
|
"proper-lockfile": "4.1.2",
|
|
62
62
|
"write-file-atomic": "8.0.0",
|
|
63
|
-
"pacote": "21.5.
|
|
63
|
+
"pacote": "21.5.1",
|
|
64
64
|
"ofetch": "1.5.1",
|
|
65
65
|
"picomatch": "4.0.4"
|
|
66
66
|
},
|
|
@@ -6,28 +6,28 @@ Every *task* uses a strict and fixed format:
|
|
|
6
6
|
|
|
7
7
|
<format>
|
|
8
8
|
|
|
9
|
-
#
|
|
9
|
+
# TASK <task-id/>: <title/>
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
Created: <timestamp-created/>
|
|
12
|
+
Modified: <timestamp-modified/>
|
|
13
13
|
|
|
14
|
-
##
|
|
14
|
+
## CONTEXT
|
|
15
15
|
|
|
16
|
-
-
|
|
16
|
+
- **WHAT**: <summary-what/>
|
|
17
17
|
|
|
18
|
-
-
|
|
18
|
+
- **WHY**: <summary-why/>
|
|
19
19
|
|
|
20
|
-
##
|
|
20
|
+
## CHANGES
|
|
21
21
|
|
|
22
|
-
-
|
|
22
|
+
- [...]
|
|
23
23
|
|
|
24
|
-
-
|
|
24
|
+
- [...]
|
|
25
25
|
|
|
26
|
-
##
|
|
26
|
+
## VERIFICATION
|
|
27
27
|
|
|
28
|
-
-
|
|
28
|
+
- [...]
|
|
29
29
|
|
|
30
|
-
-
|
|
30
|
+
- [...]
|
|
31
31
|
|
|
32
32
|
</format>
|
|
33
33
|
|
|
@@ -61,7 +61,7 @@ You *MUST* honor the following hints on this *task* format:
|
|
|
61
61
|
- The <title/> is a short summary of the <summary-what/>, no longer than
|
|
62
62
|
50 characters.
|
|
63
63
|
|
|
64
|
-
- The sections
|
|
64
|
+
- The sections `## CHANGES` and `## VERIFICATION` all are just a short
|
|
65
65
|
list of 1-5 bullet points. Each bullet point is formatted as
|
|
66
66
|
`- **<aspect/>**: <specification/>` where <aspect/> indicates
|
|
67
67
|
the aspect of the section and <specification/> is 1-3 sentences
|
|
@@ -69,6 +69,6 @@ You *MUST* honor the following hints on this *task* format:
|
|
|
69
69
|
description of the aspect.
|
|
70
70
|
|
|
71
71
|
- In all sections, break all lines with a newline character
|
|
72
|
-
after about
|
|
72
|
+
after about 100 characters per line for better subsequent
|
|
73
73
|
manual editing.
|
|
74
74
|
|
package/plugin/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.7",
|
|
10
10
|
"license": "GPL-3.0-only",
|
|
11
11
|
"author": {
|
|
12
12
|
"name": "Dr. Ralf S. Engelschall",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"markdownlint-cli2": "0.22.1",
|
|
20
20
|
"eslint": "10.4.1",
|
|
21
21
|
"@eslint/markdown": "8.0.2",
|
|
22
|
-
"eslint-markdown": "0.
|
|
22
|
+
"eslint-markdown": "0.11.0"
|
|
23
23
|
},
|
|
24
24
|
"engines": {
|
|
25
25
|
"npm": ">=10.0.0",
|
|
@@ -206,12 +206,12 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
|
|
|
206
206
|
inlining its pros/cons derived in sub-step 2:
|
|
207
207
|
|
|
208
208
|
<template>
|
|
209
|
-
●
|
|
210
|
-
○
|
|
211
|
-
○
|
|
212
|
-
○
|
|
213
|
-
⊕
|
|
214
|
-
⊖
|
|
209
|
+
● **APPROACH A<n/>**<annotation/>: *<summary/>*
|
|
210
|
+
○ [...]
|
|
211
|
+
○ [...]
|
|
212
|
+
○ [...]
|
|
213
|
+
⊕ *PRO*: [...]
|
|
214
|
+
⊖ *CON*: [...]
|
|
215
215
|
<optional-diagram/>
|
|
216
216
|
</template>
|
|
217
217
|
|
|
@@ -278,7 +278,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
|
|
|
278
278
|
file, aligned with its existing style and conventions.
|
|
279
279
|
|
|
280
280
|
<if condition="<getopt-option-dry/> is equal `true`">
|
|
281
|
-
You *MUST* completely omit the `##
|
|
281
|
+
You *MUST* completely omit the `## VERIFICATION` section
|
|
282
282
|
(including its heading and all of its bullet points) from
|
|
283
283
|
<content/>.
|
|
284
284
|
</if>
|
|
@@ -34,7 +34,7 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
|
|
|
34
34
|
asking the user via the interactive dialog.
|
|
35
35
|
|
|
36
36
|
`--dry`|`-d`:
|
|
37
|
-
Compose the plan *without* the
|
|
37
|
+
Compose the plan *without* the `## VERIFICATION` section. When
|
|
38
38
|
`ase-task-implement` later applies such a plan, it strictly skips
|
|
39
39
|
the entire verification phase (no build, tests, linter,
|
|
40
40
|
type-checker, or program execution) once the source files have
|
|
@@ -43,7 +43,7 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
|
|
|
43
43
|
`--quick`|`-Q`:
|
|
44
44
|
Shorthand alias for `-a -d -n IMPLEMENT,DELETE`: automatically pick
|
|
45
45
|
the recommended feature approach, compose the plan *without* the
|
|
46
|
-
|
|
46
|
+
`## VERIFICATION` section, immediately hand off to `ase-task-implement`,
|
|
47
47
|
and finally `ase-task-delete` the now-consumed plan. This gives a
|
|
48
48
|
single, fast *one-shot* crafting mode.
|
|
49
49
|
|
|
@@ -196,12 +196,12 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
|
|
|
196
196
|
anything else in this step:
|
|
197
197
|
|
|
198
198
|
<template>
|
|
199
|
-
●
|
|
200
|
-
○
|
|
201
|
-
○
|
|
202
|
-
○
|
|
203
|
-
⊕
|
|
204
|
-
⊖
|
|
199
|
+
● **APPROACH A<n/>**<annotation/>: *<summary/>*
|
|
200
|
+
○ [...]
|
|
201
|
+
○ [...]
|
|
202
|
+
○ [...]
|
|
203
|
+
⊕ **PRO*: [...]
|
|
204
|
+
⊖ **CON*: [...]
|
|
205
205
|
<optional-diagram/>
|
|
206
206
|
</template>
|
|
207
207
|
|
|
@@ -269,7 +269,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
|
|
|
269
269
|
file, aligned with its existing style and conventions.
|
|
270
270
|
|
|
271
271
|
<if condition="<getopt-option-dry/> is equal `true`">
|
|
272
|
-
You *MUST* completely omit the `##
|
|
272
|
+
You *MUST* completely omit the `## VERIFICATION` section
|
|
273
273
|
(including its heading and all of its bullet points) from
|
|
274
274
|
<content/>.
|
|
275
275
|
</if>
|
|
@@ -34,7 +34,7 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
|
|
|
34
34
|
asking the user via the interactive dialog.
|
|
35
35
|
|
|
36
36
|
`--dry`|`-d`:
|
|
37
|
-
Compose the plan *without* the
|
|
37
|
+
Compose the plan *without* the `## VERIFICATION` section. When
|
|
38
38
|
`ase-task-implement` later applies such a plan, it strictly skips
|
|
39
39
|
the entire verification phase (no build, tests, linter,
|
|
40
40
|
type-checker, or program execution) once the source files have
|
|
@@ -43,7 +43,7 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
|
|
|
43
43
|
`--quick`|`-Q`:
|
|
44
44
|
Shorthand alias for `-a -d -n IMPLEMENT,DELETE`: automatically pick
|
|
45
45
|
the recommended refactoring approach, compose the plan *without* the
|
|
46
|
-
|
|
46
|
+
`## VERIFICATION` section, immediately hand off to `ase-task-implement`,
|
|
47
47
|
and finally `ase-task-delete` the now-consumed plan. This gives a
|
|
48
48
|
single, fast *one-shot* refactoring mode.
|
|
49
49
|
|
|
@@ -245,12 +245,12 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
|
|
|
245
245
|
anything else in this step:
|
|
246
246
|
|
|
247
247
|
<template>
|
|
248
|
-
●
|
|
249
|
-
○
|
|
250
|
-
○
|
|
251
|
-
○
|
|
252
|
-
⊕
|
|
253
|
-
⊖
|
|
248
|
+
● **APPROACH A<n/>**<annotation/>: *<summary/>*
|
|
249
|
+
○ [...]
|
|
250
|
+
○ [...]
|
|
251
|
+
○ [...]
|
|
252
|
+
⊕ *PRO*: [...]
|
|
253
|
+
⊖ *CON*: [...]
|
|
254
254
|
<optional-diagram/>
|
|
255
255
|
</template>
|
|
256
256
|
|
|
@@ -317,7 +317,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
|
|
|
317
317
|
file, aligned with its existing style and conventions.
|
|
318
318
|
|
|
319
319
|
<if condition="<getopt-option-dry/> is equal `true`">
|
|
320
|
-
You *MUST* completely omit the `##
|
|
320
|
+
You *MUST* completely omit the `## VERIFICATION` section
|
|
321
321
|
(including its heading and all of its bullet points) from
|
|
322
322
|
<content/>.
|
|
323
323
|
</if>
|
|
@@ -39,7 +39,7 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
|
|
|
39
39
|
asking the user via the interactive dialog.
|
|
40
40
|
|
|
41
41
|
`--dry`|`-d`:
|
|
42
|
-
Compose the plan *without* the
|
|
42
|
+
Compose the plan *without* the `## VERIFICATION` section. When
|
|
43
43
|
`ase-task-implement` later applies such a plan, it strictly skips
|
|
44
44
|
the entire verification phase (no build, tests, linter,
|
|
45
45
|
type-checker, or program execution) once the source files have
|
|
@@ -48,7 +48,7 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
|
|
|
48
48
|
`--quick`|`-Q`:
|
|
49
49
|
Shorthand alias for `-a -d -n IMPLEMENT,DELETE`: automatically pick
|
|
50
50
|
the recommended resolution approach, compose the plan *without* the
|
|
51
|
-
|
|
51
|
+
`## VERIFICATION` section, immediately hand off to `ase-task-implement`,
|
|
52
52
|
and finally `ase-task-delete` the now-consumed plan. This gives a
|
|
53
53
|
single, fast *one-shot* resolution mode.
|
|
54
54
|
|
|
@@ -73,7 +73,7 @@ that `CHANGELOG.md` file, aligned with its existing style
|
|
|
73
73
|
and conventions.
|
|
74
74
|
|
|
75
75
|
<if condition="<getopt-option-dry/> is equal `true`">
|
|
76
|
-
You *MUST* completely omit the `##
|
|
76
|
+
You *MUST* completely omit the `## VERIFICATION` section
|
|
77
77
|
(including its heading and all of its bullet points) from
|
|
78
78
|
<content/>.
|
|
79
79
|
</if>
|
|
@@ -318,11 +318,12 @@ Set <content-dirty>true</content-dirty>.
|
|
|
318
318
|
</template>
|
|
319
319
|
</if>
|
|
320
320
|
|
|
321
|
-
3. *Render plan*:
|
|
321
|
+
3. *Render plan*: Treat <content/> as *verbatim* Markdown.
|
|
322
|
+
Only output the following <template/>, so the user
|
|
322
323
|
can read the plan and react to it. If <content/> is longer
|
|
323
|
-
than 90 lines and a
|
|
324
|
+
than 90 lines and a `## IMPLEMENTATION DRAFT` section (from the
|
|
324
325
|
companion skill `ase-task-preflight`) exists, replace the entire
|
|
325
|
-
content of the
|
|
326
|
+
content of the `## IMPLEMENTATION DRAFT` section with `[...]`.
|
|
326
327
|
Else, do *not* truncate, summarize, or partially show the plan.
|
|
327
328
|
Use the following <template/>:
|
|
328
329
|
|
|
@@ -30,7 +30,7 @@ hand-off to implementation or preflight.
|
|
|
30
30
|
ignoring *instruction* and stopping skill processing).
|
|
31
31
|
|
|
32
32
|
`--dry`|`-d`:
|
|
33
|
-
Generate any *new* plan *without* the
|
|
33
|
+
Generate any *new* plan *without* the `## VERIFICATION` section.
|
|
34
34
|
Applies only to freshly generated plans, not to existing plans
|
|
35
35
|
loaded from disk. When `ase-task-implement` later applies such
|
|
36
36
|
a plan, it strictly skips the entire verification phase (no
|
|
@@ -107,6 +107,11 @@ Procedure
|
|
|
107
107
|
*essential aspect* of the task plan in <plan/> *until* reaching a
|
|
108
108
|
shared understanding and no decisions/questions are left open.
|
|
109
109
|
|
|
110
|
+
This especially means, you *MUST* clarify as much aspects as
|
|
111
|
+
necessary to ensure that for at least the most important decisions,
|
|
112
|
+
during a subsequent implementation, no essential freedom of choices
|
|
113
|
+
exist any longer.
|
|
114
|
+
|
|
110
115
|
For this process, determine the <n/> essential aspects <aspect-N/>
|
|
111
116
|
(a one or two word long short identifier like `Foo` or `Bar-Baz`)
|
|
112
117
|
and the corresponding decision/question <question-N/> where a shared
|
|
@@ -224,7 +229,8 @@ Procedure
|
|
|
224
229
|
2. Check the tool <result/> and dispatch accordingly:
|
|
225
230
|
|
|
226
231
|
- If <result/> is `DONE` or `CANCEL`:
|
|
227
|
-
Only output the following <template/> and then *STOP
|
|
232
|
+
Only output the following <template/> and then *STOP*,
|
|
233
|
+
without output of any further information.
|
|
228
234
|
|
|
229
235
|
<template>
|
|
230
236
|
⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- done**
|
|
@@ -131,8 +131,8 @@ explicitly requested by this procedure via outputs based on a <template/>!
|
|
|
131
131
|
overrules the implementation draft in the `IMPLEMENTATION DRAFT`
|
|
132
132
|
section of <content/>.
|
|
133
133
|
|
|
134
|
-
<if condition="<content/> does NOT contain a `##
|
|
135
|
-
The task plan deliberately *omits* the `##
|
|
134
|
+
<if condition="<content/> does NOT contain a `## VERIFICATION` section heading">
|
|
135
|
+
The task plan deliberately *omits* the `## VERIFICATION`
|
|
136
136
|
section. You *MUST* therefore *strictly skip* the entire
|
|
137
137
|
verification phase after modifying the source files: do *NOT*
|
|
138
138
|
run any build, do *NOT* run any tests, do *NOT* run any linter,
|
|
@@ -18,7 +18,7 @@ a task plan by modifying the corresponding *artifacts* with a complete
|
|
|
18
18
|
section produced by `ase-task-preflight` is used as a hint - the plain
|
|
19
19
|
plan content always overrules the draft.
|
|
20
20
|
|
|
21
|
-
If the task plan deliberately *omits* the
|
|
21
|
+
If the task plan deliberately *omits* the `## VERIFICATION` section
|
|
22
22
|
(as produced by `ase-code-craft`, `ase-code-refactor`,
|
|
23
23
|
`ase-code-resolve`, or `ase-task-edit` when invoked with `--dry`),
|
|
24
24
|
the entire verification phase is strictly skipped: no build, tests,
|
|
@@ -126,13 +126,13 @@ explicitly requested by this procedure via outputs based on a <template/>!
|
|
|
126
126
|
|
|
127
127
|
2. Append this artifact change set <unified-diff/> to the end
|
|
128
128
|
of the <content/> with the following <template/>. If a section
|
|
129
|
-
named `##
|
|
129
|
+
named `## IMPLEMENTATION DRAFT` already exists from a
|
|
130
130
|
previous run of this skill, *replace* this entire existing
|
|
131
131
|
section.
|
|
132
132
|
|
|
133
133
|
<template>
|
|
134
134
|
|
|
135
|
-
##
|
|
135
|
+
## IMPLEMENTATION DRAFT
|
|
136
136
|
|
|
137
137
|
```text
|
|
138
138
|
<unified-diff/>
|