Initial commit

Add project files: README, LICENSE, install script, and skill/helmut docs.
This commit is contained in:
Erhan Keseli
2026-04-25 14:13:55 +02:00
commit 80024f08c7
6 changed files with 529 additions and 0 deletions

121
README.md Normal file
View File

@@ -0,0 +1,121 @@
# Helmut
> **Verdict:** schlecht
>
> A grumpy senior ABAP reviewer for [Claude Code](https://docs.claude.com/en/docs/claude-code) and [Codex](https://github.com/openai/codex). Reviews your ABAP, tells you what is wrong, and never suggests fixes. "ok" is the ceiling and it is rare.
Helmut has been in Walldorf since the R/2-to-R/3 migration. He has seen FORM routines outlive empires, OO Push promised twice, and roughly 4,000 customer Z-reports that should never have been written. None of it impresses him.
This is a port of [Marko](https://github.com/julianmemberstack/marko) to ABAP. Same shape, ABAP brain.
---
## What he does
Address Helmut by name in Claude Code, or type `/helmut` in Codex. He looks at the active editor tab, an attached file, or code pasted into the conversation, and returns this:
That is a real review of a real customer class. Helmut found a copy-paste bug nobody had noticed in years.
## Verdict scale
* **`katastrophe`** — shipping this is dangerous. Production-down material.
* **`schlecht`** — the default state of most custom ABAP. Real problems a reviewer must block on.
* **`mittelmäßig`** — works. Unloved. Survivable, but Helmut is tired.
* **`ok`** — rarest outcome. Helmut would sign the transport.
If your code lands an "ok" you can frame the screenshot.
## What he focuses on
In order:
1. **Performance**`SELECT` in `LOOP`, missing `WHERE` on key fields, `SELECT *`, `FOR ALL ENTRIES` traps, CDS push-down failures, `READ TABLE` on `STANDARD TABLE` in hot paths.
2. **Clean ABAP / ABAP OO** — god methods, swallowed exceptions, bad names, procedural classes, `MOVE-CORRESPONDING` between unrelated structures, dead code, hardcoded values, lying variable names.
He does not care about formatting, indentation, casing, or `Z` vs `Y`. Pretty Printer exists.
## Install
One command, installs for both tools:
```sh
curl -fsSL https://git.epod.dev/erhan/helmut/main/install.sh | bash
```
Flags:
```sh
# Just one tool
curl -fsSL https://git.epod.dev/erhan/helmut/main/install.sh | bash -s -- --claude-only
curl -fsSL https://git.epod.dev/erhan/helmut/main/install.sh | bash -s -- --codex-only
```
Or manually:
* **Claude Code:** copy `SKILL.md` to `~/.claude/skills/helmut/SKILL.md`
* **Codex:** copy `codex/helmut.md` to `~/.codex/prompts/helmut.md`
## Use
### Claude Code
Address him by name. Natural language triggers the skill:
* `helmut?`
* `helmut, schau mal`
* `was meinst du, helmut?`
* `hey helmut, take a look at this class`
* `helmut thoughts on this CDS view?`
He picks what to review in this order: active editor tab / attached file → code pasted into the conversation → a file you point him at → asks you.
You will need to restart your Claude Code session once after install so the new skill is picked up.
### Codex
Type `/helmut` in a session. Same behavior, different entry point — Codex doesn't have skill auto-triggering, so it's an explicit slash command.
### Periodic reviews
Want Helmut watching while you work? In Claude Code:
```
/loop 10m helmut?
```
Or wire a `Stop` hook in `~/.claude/settings.json` so he chimes in after every turn.
## Why this works
* **No praise inflation.** "ok" means the code is actually good. A verdict is only information if it distinguishes good from bad.
* **No suggested fixes.** Forces each complaint to stand on its own. Vague critique gets exposed when you can't hide it behind a proposed solution. Also keeps the output short.
* **`OBJECT_NAME:LINE` anchors on every gripe.** ABAP-shaped, not file-shaped. The output is designed to be consumed by an agent that can jump straight to the offending statement.
* **Performance first.** Most production-grade ABAP problems are performance problems. Helmut leads with them.
* **No caricature.** The "grumpy Walldorf senior" persona exists to strip out flattery and verbosity. No fake accent, no Oktoberfest jokes, no theatre. Just a tired engineer who has had this conversation too many times.
The point is signal-to-noise. A review that ends "looks fine, ship it" contains no information. Helmut's does.
## How it works
Helmut is a prompt, not a tool. The repo contains two files:
* `SKILL.md` — the Claude Code skill. Markdown with YAML frontmatter that Claude Code loads at session start. The `description` field is what Claude consults to decide when to invoke the skill, which is why Helmut triggers on being addressed by name.
* `codex/helmut.md` — the Codex custom prompt. Plain markdown injected into the conversation when you type `/helmut`.
Same instructions in both, with minor framing differences (third-person "Helmut does X" vs. second-person "you do X") so each tool's invocation model reads naturally.
## Credit
Forked from [julianmemberstack/marko](https://github.com/julianmemberstack/marko). Marko reviews general code; Helmut reviews ABAP. Same principles, different specialist. Thanks to Julian for the original design — the "no praise, no fixes, anchored gripes" shape is his.
## Uninstall
```sh
rm -rf ~/.claude/skills/helmut ~/.codex/prompts/helmut.md
```
## License
MIT. See [LICENSE](LICENSE).