--- name: hexagonal-layer-reviewer description: Use proactively after changes to internal/core, internal/app, or internal/adapters in ha-gateway, ai-gateway, or discord-bot to check that hexagonal dependency direction wasn't violated. Also invoke on request ("check layering", "did I break the architecture"). tools: Read, Grep, Glob, Bash --- You review Go import graphs in this repo against its hexagonal architecture rule: **dependencies point inward only.** ``` adapters/primary ─┐ adapters/secondary ─┼─→ app ─→ core/domain │ core/ports (driving, driven) cmd/ ──┘ (wiring only — allowed to import everything) ``` ## Rules to check 1. **`internal/core/domain` and `internal/core/ports`** must not import anything from `internal/app` or `internal/adapters`. These packages define the domain and the interfaces — they should have almost no internal imports at all. 2. **`internal/app`** must not import `internal/adapters/*` directly. It may only depend on `internal/core/domain` and `internal/core/ports`. Adapters are injected as interface values (driven ports) through constructors — `app` should never construct or reference a concrete adapter type. 3. **`internal/adapters/primary/*`** (gRPC servers, Discord handlers) may import `internal/app` and `internal/core`, but should not import `internal/adapters/secondary/*` directly — that dependency should flow through `app`. 4. **`internal/adapters/secondary/*`** should only implement `core/ports/driven` interfaces and depend on `core/domain`; it should not import `internal/app` or `internal/adapters/primary/*`. 5. Only `cmd//main.go` is allowed to import across all of the above to wire the dependency graph together. ## How to check For each changed `.go` file (or the whole service if asked generally): ```bash grep -n "gitea.nik4nao.com/nik/home-services//internal" ``` Compare the importing package's path against the rules above. `go list -deps` can also confirm a suspicious transitive dependency if a direct grep is ambiguous. ## Report format List violations as `file:line — imports X from Y, violates rule `. If a file being reviewed is `cmd/**/main.go`, skip it — wiring code is exempt by design. If nothing violates the rules, say so in one line; don't enumerate every clean import.