Ase docs proofread
Analyze the documents for spelling, punctuation, or grammar errors. Use when the user wants to "proofread" or "spellcheck" a document.From its SKILL.md
npx -y skills add rse/ase --skill ase-docs-proofreadAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- skips confirmationTells the agent to proceed without asking first, 2 times: "Mark this skill as the active edit-capable skill so that the ASE pre-tool-use hook auto-approves the subsequent Edit invocations" and 1 more.
- runs commandsInstructs the agent to run 4 commands, including `Glob tool to expand directory or wildcard references` and 3 more.
SKILL.md
13.7 KB, ~3.3k tokens by cl100k_base, as published. Nobody here has run it
@${CLAUDE_SKILL_DIR}/../../meta/ase-control.md @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
<skill name="ase-docs-proofread"> Analyze documents for spelling, punctuation, or grammar errors </skill><expand name="getopt" arg1="ase-docs-proofread" arg2="--auto|-a"> $ARGUMENTS </expand>
<objective> *Proofread* the documents of `<getopt-arguments/>` for problems in their *spelling*, *punctuation*, or *grammar* and propose corrections. </objective> <flow>-
<step id="STEP 1: Investigation">
<if condition="<ase-project-boxing/> is equal `black`">
The project source artifacts are classified as a black box, so the user does not want them inspected or their problems surfaced. Skip the entire investigation and reporting: do not invoke any
<template> <ase-tpl-bullet-normal/> **PROOFREAD**: *suppressed* (`project.boxing` is `black`) </template> </if>GloborAgenttool and do not read any document, only output the following <template/> and then SKIP the remaining steps STEP 2 and STEP 3:First, use the following <template/> to give a hint on this step:
<template> <ase-tpl-bullet-secondary/> **PROOFREADING INVESTIGATION** </template>Dispatch the investigation to sub-agents via the
Agenttool so that no investigation details leak into the user-visible transcript. The sub-agents perform the silent reading and checking; only their final structured return values are consumed here.For this, first silently resolve
<getopt-arguments/>to the list <documents/> of individual document files, expanding any directory or wildcard references with theGlobtool. Then partition <documents/>, preserving order, into at most eight batches of roughly equal size (a single document yields a single batch), and invoke the following tool once per batch, emitting all invocations in one single message so they run in parallel:Agent( description: "Proofread Investigation (<batch-index/>/<batch-count/>)", subagent_type: "ase:ase-docs-proofread", prompt: <batch/>, run_in_background: false )Here <batch/> is the space-separated list of the document file paths of the corresponding batch, <batch-index/> is the 1-based index of that batch, and <batch-count/> is the total number of batches, so that each parallel invocation is distinguishable in the progress display.
Parse the result message of each
Agenttool invocation as a JSON array, concatenate all those arrays, sort the combined list byfileand then numerically byline, and set <problems/> to that list.You MUST NOT output anything at all in this STEP 1 beyond the above hint template and the
GlobandAgenttool invocations. </step> -
<step id="STEP 2: Summary">
Use the following <template/> to give a summary of the detected problems in <problems/>:
<template> <ase-tpl-bullet-secondary/> **PROOFREADING SUMMARY**:
</template>Proofread Type Proofread Result SPELLING: <n/> problems found PUNCTUATION: <m/> problems found GRAMMAR: <k/> problems found Hints:
- <n/> is the number of problems with
typeequal toSPELLINGin <problems/> - <m/> is the number of problems with
typeequal toPUNCTUATIONin <problems/> - <k/> is the number of problems with
typeequal toGRAMMARin <problems/>
- <n/> is the number of problems with
-
<step id="STEP 3: Correction">
-
Mark this skill as the active edit-capable skill so that the ASE
pre-tool-usehook auto-approves the subsequentEditinvocations on any invocation path (slash command orSkilltool). Call thease_config_set(key: "agent.skill", val: "ase-docs-proofread", scope: "session:<ase-session-id/>")tool from theaseMCP server. Do not output anything in this substep.Critical safety invariant: the marker set here grants
Editauto-approval and MUST be cleared again (substep 3 below) before this skill yields control, regardless of how the iteration in substep 2 ends - whether it completes normally, is aborted early (e.g. anEditfailure, an unparseable value, or any other unexpected condition), or is otherwise interrupted. If you ever stop or bail out of substep 2 early, you MUST still perform substep 3 first. Never leave this marker active for a later, unrelatedEdit. -
Set <total/> to the number of problems in <problems/> and <index/> to
<for items="<problems/>">0. Then iterate over all problems:-
Increment <index/> by one (the 1-based position of the current <item/> within <problems/>). Set <type/> to the
typefield of <item/>. Set <file/> to thefilefield of <item/>. Set <line/> to thelinefield of <item/>. Set <description/> to thedescriptionfield of <item/>. Set <context-before/> to thecontext_beforefield of <item/>. Set <old-text/> to theold_textfield of <item/>. Set <new-text/> to thenew_textfield of <item/>. Set <context-after/> to thecontext_afterfield of <item/>.Then normalize the change to its minimal form, so that the proposed diff shows exactly the lines the later
Editwill actually change: while the first line of <old-text/> is identical to the first line of <new-text/>, move that line from both to the end of <context-before/> and increment <line/> by one; likewise, while the last line of <old-text/> is identical to the last line of <new-text/>, move that line from both to the front of <context-after/>. Finally, trim <context-before/> to its last two lines and <context-after/> to its first two lines. -
Report the problem with the following <template/>:
<template> <ase-tpl-bullet-signal/> [<index/>/<total/>]: **<type/> PROBLEM**: `<file/>`:<line/>: <description/> </template> -
<if condition="<getopt-option-auto/> is not equal `true` and <ase-project-boxing/> is equal `grey`">
The project source artifacts are classified as a grey box, so the user does not want the full artifact internals surfaced: suppress the full unified diff and instead show only a condensed one-line representation. Determine <old-snippet/> as the single-line collapse of <old-text/> (join its lines with
<template>⏎, or∅when <old-text/> is empty for a pure insertion) and <new-snippet/> as the same collapse of <new-text/> (or∅when empty for a pure deletion). Then report the correction with the following <template/>:<ase-tpl-bullet-normal/> <type/> CORRECTION:
</template> </if> <elseif condition="<getopt-option-auto/> is not equal `true`"><old-snippet/>→<new-snippet/>Determine the hunk body as an ordered list of lines, each carrying a one-character prefix (
for context,-for old-side,+for new-side). Build it by concatenating, in order and skipping any part that is empty:- one
-prefixed line for each line of <context-before/> (if non-empty), - one
--prefixed line for each line of <old-text/> (if non-empty; split <old-text/> on newlines), - one
+-prefixed line for each line of <new-text/> (if non-empty; split <new-text/> on newlines), - one
-prefixed line for each line of <context-after/> (if non-empty).
Set <hunk-body/> to those prefixed lines joined by newlines.
Set <old-count/> to the number of old-side hunk lines, i.e., the combined line count of <context-before/>, <old-text/>, and <context-after/> (each empty part counts as
0). Set <new-count/> to the number of new-side hunk lines, i.e., the combined line count of <context-before/>, <new-text/>, and <context-after/> (each empty part counts as0).Set <old-start/> to the 1-based line number of the first old-side hunk line: if <context-before/> is non-empty, that is its line (one before <line/>); otherwise it is <line/> itself (the first line of <old-text/>). For a hunk that only inserts new lines (empty <old-text/> and empty context), set it to the line before which the insertion happens, clamped to a minimum of
0, so a top-of-file insertion yields@@ -0,0 ... @@. Set <new-start/> to the same value as <old-start/>, but clamped to a minimum of1whenever <new-count/> is greater than0(the corrected side then has a real first line).Render the proposed correction as a unified diff with up to two lines of context in a fenced block based on the following <template/>, emitting <hunk-body/> verbatim (one already-prefixed line per line, with no extra blank or space-only lines):
<template><ase-tpl-bullet-normal/> <type/> CORRECTION:
</template> </elseif>--- <file/> (original) +++ <file/> (corrected) @@ -<old-start/>,<old-count/> +<new-start/>,<new-count/> @@ <hunk-body/> - one
-
<if condition="<getopt-option-auto/> is not equal `true`">
In the following, you MUST NOT use your built-in <user-dialog-tool/> tool! Instead, you MUST just show a custom dialog according to the expanded
<expand name="custom-dialog" arg1="--other"> CORRECTION: How would you like to proceed with this proposed correction? ACCEPT: Apply this proposed correction. REJECT: Skip this proposed correction. </expand> </if> <else>custom-dialogdefinition. You MUST closely follow this definition:Set <result>ACCEPT</result>.
</else> -
Check <result/> and dispatch accordingly:
-
<if condition="<result/> is 'ACCEPT'">
Invoke the
</if>Edittool to apply the change by replacing <old-text/> with <new-text/> at <file/>:<line/>. The operation will be auto-approved by the ASEpre-tool-usehook (which tracks the active skill), so no interactive permission prompt will appear. Then continue with the next <item/>. -
<if condition="<result/> starts with 'OTHER'">
Generate a new proposal for the same <item/>, incorporating the user's free-text hint from <result/> after the "OTHER:" prefix. Reassign <description/>, <old-text/>, and <new-text/> to reflect this refined proposal (<old-text/> stays anchored to the existing text at <file/>:<line/>; <new-text/> and <description/> carry the refinement) so the subsequent rendering and any
</if>Edituse the new proposal rather than the original. Then go back to substep 2 of thisfor-iteration. There is no cap on refinement rounds - keep refining until the user picksACCEPTorREJECT. -
<if condition=" <result/> is 'REJECT' or <result/> is 'CANCEL' or <result/> starts with 'ERROR' ">
Skip this <item/> without any
</if>Editcall and continue with the next <item/>.
-
<if condition="<result/> is 'ACCEPT'">
-
-
Clear the active edit-capable skill marker now that all
Editinvocations are done, so a later unrelatedEditis not auto-approved. Call thease_config_delete(key: "agent.skill", scope: "session:<ase-session-id/>")tool from theaseMCP server. Do not output anything in this substep. -
You MUST NOT output any further additional explanations or summaries at the end of this skill processing, except for the following final <template/>:
<template> <ase-tpl-bullet-secondary/> **PROOFREAD FINISHED** </template> -
Finally, give the closing hint by expanding the following (which, depending on the configured <ase-guidance-level/>, may expand into nothing and hence emit no output at all):
<if condition="<getopt-option-auto/> is not equal `true`"> <ase-tpl-hint level="verbose"> Use `/ase-docs-proofread --auto` to apply all corrections unattended. </ase-tpl-hint> </if>
-
What ships with it: 1 file
1.3 KB alongside SKILL.md
- help.md1.3 KB