I wouldn't merge this yet. There are 3 bugs that will break things, 1 SQL injection, and 1 risk. The original code was correct before this change.
src/orders/service.ts
L15: ๐ด bug: the loop runs one step too far.i <= order.items.lengthreadsorder.items[length], which isundefined, so.pricethrows a TypeError on every call. Use<, or keep the originalreduce, which was correct and shorter.L22: ๐ด bug:awaitwas removed fromthis.coupons.find(code), socouponis now a Promise.coupon.expiresAtisundefinedandundefined < Date.now()isfalse, so the expiry check never fires and expired coupons are accepted.coupon.idis alsoundefined. Put theawaitback.L24: ๐ด bug: the update is fire-and-forget and.catch(() => {})hides any failure. Callers see success even when the coupon was never saved, and nothing is logged. Put backawait this.repo.update(...)and let errors reach the caller.L22-23: ๐ก risk: iffindreturns null for an unknown code,coupon.expiresAtthrows a TypeError instead of a clear error. Addif (!coupon) throw new Error("invalid coupon").
L28: ๐ด security: SQL injection in listOrders. userId is put straight into the SQL string. A value like ' OR '1'='1 returns every user's orders, and with stacked queries an attacker could change or delete data (CWE-89, OWASP A03). Even if userId comes from an auth token today, this function can't assume that, and a single caller passing a request param makes it exploitable. Use a parameterized query, e.g. this.db.query("SELECT * FROM orders WHERE user_id = $1", [userId]) (use whatever placeholder syntax your driver expects).
L28: ๐ต nit:SELECT *returns every column and will pick up any column added later. List the columns you need.L27: ๐ต nit: no return type, unlikegetOrderTotal. AddPromise<Order[]>.
Real run recorded with claude-code / claude-opus-5-5. Output is shown verbatim, unmodified.
What it does
Writes code review comments in a compact L<line>: <problem>. <fix>. format, ready to paste into a pull request.
How it works
- Triggers on /caveman-review, "review this PR" or "review the diff".
- Gives each finding one line with the exact line number, symbol names in backticks and a concrete fix, plus an optional severity tag: ๐ด bug, ๐ก risk, ๐ต nit, โ question.
- Drops hedging and restating the diff. For security issues, architectural disagreements and onboarding situations it writes a full paragraph instead.
Good for
Reviewing diffs and pull requests when you want findings that are quick to scan.
Worth knowing
It only writes comments. It does not edit code, approve or request changes, or run linters.
Pure instruction file: no scripts, no network access and no file writes. The package also contains the README, LICENSE and NOTICE from the original repository. Review findings are model output; check them before posting.