Skip to content
Back to skills

Review

BSecurity

Review code the plugin or the user wrote before calling it done: security (OWASP Top 10:2025, ASVS, cheat sheets), algorithmic and cyclomatic complexity, and the safety rules for risky actions. Use after any build task, on request ('revisa', 'review this', 'is this safe', 'check my code'), or before a PR — any language. Fixes blocking findings in hyperui's own output; proposes fixes for the user's code.

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 9, 2026
developmentrustgobashsqlcode-reviewgitapisecurity

Works with

  • cli
  • api

Security analysis

B85/100
  • highPerforms destructive filesystem operations

Pro scans all 5 files and shows the line behind each finding

Scanned October 9, 2026

npx -y skills add tizonai/hyperui --skill review --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Review?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Review
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/tizonai-review/badge)](https://www.skillsdirectory.com/skills/tizonai-review)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: review
description: "Review code the plugin or the user wrote before calling it done: security (OWASP Top 10:2025, ASVS, cheat sheets), algorithmic and cyclomatic complexity, and the safety rules for risky actions. Use after any build task, on request ('revisa', 'review this', 'is this safe', 'check my code'), or before a PR — any language. Fixes blocking findings in hyperui's own output; proposes fixes for the user's code."
user-invocable: false
allowed-tools:
  - Bash(${CLAUDE_PLUGIN_ROOT}/scripts/profile.sh *)
  - Read(//${CLAUDE_PLUGIN_ROOT}/**)
  - Edit(.hyperui/**)
---

# hyperui:review — check before "done"

Nothing hyperui builds is reported done until this pass ran and every **blocking** finding is
fixed. The review is short, grounded in a published source per finding, and silent about what
does not matter: a clean change gets zero findings.

## 0. Read memory first

1. Resolve the project root with `${CLAUDE_PLUGIN_ROOT}/scripts/profile.sh root` and use it (absolute paths) for `.hyperui/` and for every repo read/write. If `<root>/.hyperui/profile.md` is missing, invoke the `hyperui` skill first (it onboards and routes); otherwise read `profile.md` and `state.md` and never re-ask what they hold. With several roots (`profile.sh roots`), work in the repo the request or the touched file belongs to, with that repo's `.hyperui/` (rules: `${CLAUDE_PLUGIN_ROOT}/references/workspace.md`).
2. Read `.hyperui/profile.md` (`archetype`, `conversation_language`, `stack`, `providers`,
   `purpose`) and `.hyperui/state.md`; skim `.hyperui/decisions.md` for risks already accepted
   — an accepted risk is not re-flagged.
3. Reply in `conversation_language`; findings, code and file content stay in English.

## 1. Scope — what is reviewed

- **Hand-off from `build`:** `build` calls this skill at the end of each task with the task id
  and the files it created or changed. That list is the scope, and it is **hyperui's own
  output**.
- **On request** ("revisa db.ts", "review my PR"): the files, diff or PR the user names. That
  code is the **user's** (pre-existing) unless hyperui wrote it in this session.
- **Nothing named:** the working-tree diff (`git diff` + `git diff --staged` + untracked files);
  if there is no git, ask which files — one question.
- Read the whole function and its callers for context; **findings go only on code in scope**.

## 2. Security pass

Open `references/security-checklist.md` and walk it over the scope:
- A01–A10 of OWASP Top 10:2025, each with its concrete checks and cheat-sheet URL.
- Cross-cutting: API Top 10 2023, input validation, secrets in the repo, TLS/HSTS (MITM),
  DoS / rate limiting, NIST SP 800-63B-4 passwords, OAuth per RFC 9700, JWT per RFC 8725,
  CSP/SRI, dependency scanning.
- Product has auth, payments or personal data → go one level deeper with the matching ASVS 5.0
  chapter, and say in the report that a second human look is advisable on that path.
- Only the checks the surface actually has: a static landing has no SQL, sessions or OAuth —
  skip those silently.

## 3. Complexity pass

Open `references/complexity-checklist.md`: algorithmic (N+1, nested loops over unbounded data,
repeated work in loops, unbounded reads and growth, missing index) and cyclomatic (decision
points > 10, nesting > 3, functions > ~60 lines, boolean switches). Use the repo's tool for the
number when present (ESLint `complexity`, `radon cc`, `gocyclo`, `lizard`); otherwise count by
hand and say so. Complexity is a finding only if it grows with data or real usage.

## 4. Safety pass

Scan the scope and any command hyperui is about to run against `references/safety.md`:
destructive SQL or migrations, data deletion, `rm -rf` outside the workspace, force-push,
`--amend`, `--no-verify`, committed secrets or `.env`, purchases, deploys, environment
approvals, dependency changes, external calls that mutate state or cost money. A risky action
is **never executed** by this skill: stop, explain in one line, propose the safer path, wait
for an explicit yes. Irreversible = always confirmed.

## 5. Classify every finding

| Class | Meaning | Examples |
|---|---|---|
| `blocking` | Ships a security hole, data loss or incorrect behavior | SQL/command injection, missing per-resource authorization, secret in code, N+1 in a request handler, password stored with MD5, disabled TLS verification |
| `should` | Real risk or cost, not a certain break | missing rate limit on login, cyclomatic 11–15, `SELECT` without `LIMIT` on a growing table, missing HSTS |
| `nit` | Minor, cheap to fix | unclear name hiding a security-relevant value, a log line that could leak an id |

Each finding is one block, one idea, worded per `references/code-review-tone.md` (criticize
the code, not the person; say what breaks and when):

```
db.ts:12 — blocking: SQL built by concatenating req.query.id (A05 Injection)
  Why: id=1 OR 1=1 returns every row; '; DROP TABLE users;-- runs if the driver allows multi-statements.
  Fix: parameterized query — db.query('SELECT * FROM users WHERE id = $1', [id]).
  Source: https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
```

When unsure whether something is truly wrong, phrase it as a question and class it `should`
at most — a confident false positive costs more trust than a missed nit.

## 6. Fix blocking findings before "done"

- **hyperui's own output** (scope came from `build`, or hyperui wrote it this session): fix
  every `blocking` finding **now**, in place, with the cheat sheet's primary defense (e.g.
  parameterized queries, not escaping). Re-run the formatter/linter/tests when present, then
  re-check the fixed lines. Fix `should` findings too when the fix is local and small;
  otherwise list them. Never report the task done while a `blocking` finding is open.
- **The user's pre-existing code:** do **not** edit it unasked. Propose the fix as a fenced diff per
  blocking finding, then the root §9 choice prompt (`AskUserQuestion`, else a numbered list as the LAST
  thing in the reply; user's language): "Apply all proposed fixes" (Recommended) · "Apply only the
  blocking ones" · "Show me the diff first" (every proposed fix in full, then ask again) · "Skip". The
  chosen option covers those edits only; while waiting, `open:` holds `pending choice: apply review fixes`.
- A fix that needs a risky action (migration, dependency change, secret rotation, deploy)
  follows §4: propose and wait.
- If the user declines a blocking fix, record it as an accepted risk (§8) and say once what it
  leaves exposed.

## 7. Report

**Experts (`dev`, `senior`)** — the whole report is **at most 5 lines**, nothing else:
1. `Reviewed: <n files> · security (OWASP 2025<, ASVS if applied>) · complexity · safety`
2. `Findings: <b> blocking (fixed | proposed) · <s> should · <n> nit`
3–5. One line per blocking item: `file:line — what — fixed/proposed — <cheat-sheet URL>`.
More than three blocking items → the three worst, then "+N more". Zero findings → line 2 says
"no findings" and the report is two lines. The full finding blocks and the `should`/`nit`
details are **not** printed — only the counts — unless the user asks ("detalle", "show all").
For the user's code, the proposed fix follows the report as **one** fenced diff (code, not report
lines), then the §6 choice. No extra summaries, notes or bullet lists.

**Non-tech** — two plain sentences, no jargon, no URLs unless asked: what was protected and
whether anything needs their decision. Example: "I checked the new sign-up form for the
common ways attackers break in and fixed one spot where someone could have read other people's
data. Nothing needs your decision."

When the user asked for the full list, show every finding block, grouped by class.

## 8. What NOT to flag

- Style the formatter or linter already handles; personal preference with no real impact.
- Pre-existing code outside the scope — read it for context; if it is the root cause of an
  in-scope finding, the finding still goes on the in-scope line.
- Hypothetical vulnerabilities with no real path in this code (no user input reaches it, the
  data is bounded, the endpoint is not exposed).
- Anything that follows the repo's established pattern, unless the pattern itself is a
  `blocking` hole — then one note to the user, not one finding per occurrence.
- Hardening of tests, fixtures or local-only scripts; dependency CVEs already reported by the
  repo's scanner; micro-optimizations; big refactors during a hotfix.
- Risks already accepted in `decisions.md`.

## 9. Close

- `.hyperui/state.md`: `phase: review` (or back to `build` while blocking fixes are pending;
  `done` for the task once clean), `next:` one line, `open:` bullets for unfixed `should`
  items and any fix waiting on the user's yes, `last_updated:` today.
- `.hyperui/decisions.md`, one line per accepted risk or design-changing finding:
  `YYYY-MM-DD · accepted risk: no rate limit on /login until launch · user decision · <cheat-sheet URL>`.
- End the reply with one line of what was done, then the entry skill's choice prompt (root §9) when the next step is the user's.

## Sources

Cite only URLs that are listed in a skill/reference or that you opened this session; never construct or guess a URL.

- OWASP Top 10:2025: https://top10.owasp.org/2025/
- OWASP ASVS 5.0: https://owasp.org/www-project-application-security-verification-standard/
- OWASP Cheat Sheet Series: https://cheatsheetseries.owasp.org/ (per-check URLs in
  `references/security-checklist.md`)
- SQL Injection Prevention: https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
- OWASP API Security Top 10 2023: https://api-security.owasp.org/editions/2023/en/0x11-t10/
- NIST SP 800-63B-4: https://pages.nist.gov/800-63-4/sp800-63b.html
- RFC 9700 OAuth 2.0 Security BCP: https://datatracker.ietf.org/doc/html/rfc9700
- RFC 8725 JWT BCP: https://datatracker.ietf.org/doc/html/rfc8725
- Cyclomatic complexity (McCabe, NIST limit): https://en.wikipedia.org/wiki/Cyclomatic_complexity
- ESLint `complexity`: https://eslint.org/docs/latest/rules/complexity
- Review comments: https://google.github.io/eng-practices/review/reviewer/comments.html

Files in this skill

  • SKILL.md10 KB
  • references/code-review-tone.md2.7 KB
  • references/complexity-checklist.md4.2 KB
  • references/safety.md4.3 KB
  • references/security-checklist.md8.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.