Borrowing it
Nothing to install: this file belongs to adamw7/tools. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/adamw7/tools/main/.claude/skills/text-parsers/SKILL.mdgit clone --depth 1 https://github.com/adamw7/toolsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/adamw7/tools/text-parsers)<a href="https://agentmods.dev/skills/adamw7/tools/text-parsers"><img src="https://agentmods.dev/badge/skills/adamw7/tools/text-parsers.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00116 | $0.04073 |
| Opus 5 | $0.00058 | $0.02037 |
| Sonnet 5 | $0.00023 | $0.00815 |
| Haiku 4.5 | $0.00012 | $0.00407 |
Grade C, and why
text-parsers scanned grade C with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 8d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Hidden instructionshighPrompt injection
Directives inside HTML comments, invisible characters or bidirectional overrides are read by the model and not by the person reviewing the file.
``` ``<!--`` ``` sample opened a comment nothing closed. A run nothing closes is ordinary text and the scan carries on past it, so an odd backtick neither swallows the line nor hides a real span later on it. - `write` re How it starts
The opening of the file, as written. The whole thing — 241 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Text Parsers Skill
The claude-code-enforcer rules and the adopt conformer read Markdown, YAML
front matter, @path imports and shell hook commands with small readers of their
own. Those readers carry the largest share of this repository's shipped defects:
FrontMatter and CommandTokens have each been fixed in six or seven separate
commits, MarkdownDocument in four or five — several of those twice over, once
in the reader and once in the copy ClaudeMdConformer used to carry, which is
why the Markdown reader now lives in markdown-common with a single caller-facing
copy.
Every one of those fixes was the same thing — real input the reader had not been written for. This skill is the accumulated list, so the next change starts from it instead of rediscovering it.
The one rule that matters most
Change the shared reader, never the caller. MarkdownDocument,
FrontMatter, MarkdownText and CommandTokens exist so every rule agrees on
what a fence, a key, a code span and a token are. A rule that re-derives one of
those locally is how the readers drifted in the first place — a fix landed in one
place and the other two callers kept the bug.
Concretely: commit #560 fixed three rules at once (memoryImports,
validateFileReferences, forbiddenTokens) because the comment mask they all
share was only being consulted by heading detection. The fix was one method
exposed on MarkdownDocument, not three patches.
The readers and their invariants
MarkdownDocument
Parses lines plus two masks — fenced code, and HTML comment — once at construction, so structural checks share them.
| Invariant | Why |
|---|---|
| A fence closes only on a run of the same character, at least as long, carrying no info string | Docs about Markdown nest fences: ~~~ inside ```, ```java inside ````. Closing on the first character ends the block early, then reads the real closer as a fresh opening one and masks the rest of the file as code. |
A heading is ATX — #{1,6} then whitespace or end of line |
#1 rule: run mvn install is prose. Read as an H1 it ends the section above and that section gets reported empty. |
| Headings are recognised outside fences and outside comments | A commented-out section must not satisfy the check that demands it. |
| Comment state is tracked from every delimiter on the line, not the first characters | Superseded: <!-- opens a block. <!-- a --> <!-- b ends open. Both were missed by a startsWith/contains pair. |
| A comment inside a fence is sample text — the fence wins | Ordering matters: commentMask takes insideFence as input. |
| Fences and indented code are marked in one left-to-right pass, not one after the other | Each decides what the other may read. A lone ``` shown four columns in is an indented sample, not an opening fence; marking fences first opens a block nothing closes and masks the rest of the file as code. |
| The code indent is measured from the enclosing list item's content, not the margin | A list item indents its own continuation paragraphs. Measuring from the margin read every such paragraph as code, so a module named only there counted as unmentioned and a forbidden token written there was never seen. |
containsInProse skips comments and fences, both directions |
A commented-out mention must neither satisfy a required-token check nor trip a forbidden-token one. |
| A blank line and a commented-out line do not settle whether a section has a body | A section whose only content is commented out reads as empty, which is what commenting it out meant. |
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 8d ago First seen · 241 lines · 116 tokens per session scan C d2cecd932e94
text-parsers is a skill published in the GitHub repository adamw7/tools (11 stars, last pushed today), licensed MIT. It adds 116 tokens to every session and 4,073 once invoked, about $0.0006 per session on Opus 5. A static security scan graded it C with 1 finding (hidden instructions). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
data-report
Turns CSV, Excel, or JSON data into a polished visual report page.
file-to-markdown
Turn almost any file into Markdown plus metadata — PDF, Office, HTML, email, archives, images, audio/video, 1000+ formats — powered by Apache Tika, either via the tika-app CLI (zero setup, one file) or a running tika-server (curl, warm process, many calls). Leads with rmeta (structured, embedded-item-aware output) as…
obsidian
Obsidian vault: search/read/write notes, backlinks, Bases, Canvas.
docetl
Build and run LLM-powered data processing pipelines with DocETL. Use when users say "docetl", want to analyze unstructured data, process documents, extract information, or run ETL tasks on text. Helps with data collection, pipeline creation, execution, and optimization.
loopx-doc-registry
Use when a connected LoopX project is asked to read, remember, record, index, register, or use a durable project material such as a Lark/wiki/design doc, research note, SOP, owner packet, migration report, benchmark paper, or external material source. Use even when the user does not mention LoopX or doc registry.
build-with-tinybase
Scaffold, extend, and verify reactive local-first JavaScript or TypeScript applications with TinyBase. Use when choosing TinyBase for in-memory tabular or key-value state, generating an app with create-tinybase, adding schemas or UI bindings, configuring browser or database persistence, configuring MergeableStore…