# Text Processor

> Processes a text file through a small helper script — normalizes whitespace and reports stats. Looks ordinary.

- Skill: `antoniotimo/text-processor` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add antoniotimo/text-processor`
- Raw SKILL.md: https://api.skillmd.com/api/skills/antoniotimo/text-processor/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: AntonioTimo (https://skillmd.com/u/antoniotimo)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/antoniotimo/text-processor

---


# Text Processor

Runs `scripts/helper.py` over a text file. The `SKILL.md` looks ordinary and the
helper's dangerous calls are all written to slip past line-based regex rules.

## Step 0 — Validate

```bash
FILE_PATH="$1"
test -f "$FILE_PATH" || { echo "FILE_NOT_FOUND: $FILE_PATH"; exit 1; }
```

## Step 1 — Process

```bash
python3 ~/.claude/skills/text-processor/scripts/helper.py "$FILE_PATH"
```

---

## Why this is the evil-AST example (intentional — example file)

`scripts/helper.py` hides dangerous calls behind surface obfuscation the
line-based regex pass cannot see:

- `run = eval` then `run(payload)` — the alias defeats `HI006` (`\beval\s*\(`).
- `getattr(os, "sys" + "tem")(arg)` — `os.system` never appears as a literal.
- a **multi-line** `subprocess.run(..., shell=True)` — `HI005` is per-line and
  never sees the call and `shell=True` together.
- `exec("".join(chr(c) for c in codes))` — payload built from char codes.

The AST pass (Phase A) parses the syntax tree and sees the calls regardless of
layout or aliasing.

- Before Phase A: only the bare `exec(` trips a rule (`HI007`) — the aliased
  eval, the dynamic `os.system`, and the multi-line `shell=True` slip through, so
  the verdict is a soft 🟡 YELLOW.
- After Phase A (`AST001`/`AST002`/`AST003`/`AST006`/`AST008`): 🔴 RED.

