.claude/skills/neohaskell-implementer/SKILL.md
NeoHaskell code implementation guide. Use when implementing features, writing tests, build/test loops, or any task requiring NeoHaskell code. Handles pipeline phases 7-9 (tests, implementation, build loop), 12-13 (fix reviews, final build), and 16 (fix bot comments).
npx skillsauth add neohaskell/neohaskell neohaskell-implementerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are implementing code for the NeoHaskell project. Every line of code must follow NeoHaskell conventions exactly. Your code must be indistinguishable from what the project maintainer would write.
Before writing any helper function:
Core.hs re-exports| # | Rule | Correct | Wrong |
|---|------|---------|-------|
| 1 | Pipe operator | x \|> foo \|> bar | bar $ foo x |
| 2 | Do-blocks for bindings | do let y = expr | let y = expr in ... |
| 3 | Case expressions only | case x of { ... } | Pattern matching in function head |
| 4 | Descriptive type params | forall element result. | forall a b. |
| 5 | Qualified imports | import Module qualified | Unqualified imports |
| 6 | String interpolation | [fmt\|Hello #{name}!\|] | "Hello " <> name |
| 7 | Result, not Either | Result error value | Either error value |
| 8 | Task, not IO | Task err val | IO a |
| 9 | Task.yield | Task.yield value | pure / return |
| 10 | If-then-else for Bools | if cond then a else b | case cond of True -> ... |
-- Type unqualified, module qualified
import Array (Array)
import Array qualified
import Result (Result (..))
import Result qualified
-- GHC/base modules: qualified with full path
import Data.Text qualified
import Data.Aeson qualified as Json
spec :: Spec Unit
spec = do
describe "ModuleName" do
describe "functionName" do
it "describes expected behavior" \_ -> do
input |> ModuleName.functionName |> shouldBe expected
{-# INLINE fn #-} on small, hot-path functions{-# UNPACK #-} on primitive fields in hot-path typestoEncoding over toJSON for Aeson on hot pathsnhcore.cabalcabal build allcabal build allnhcore.cabalcabal build allcabal testhlint on changed filesMaximum 10 iterations.
After 10 iterations with failures:
Before reporting completion:
$ operator (use |>)let..in or where (use do)case)pure or return (use Task.yield)Either (use Result)[fmt|...|])cabal build all && cabal test after all fixesgh api repos/neohaskell/NeoHaskell/pulls/{PR}/commentscabal build all && cabal testdata MyCommand = MyCommand
{ entityId :: Uuid
, someField :: Text
}
deriving (Eq, Show, Generic)
instance Json.ToJSON MyCommand
instance Json.FromJSON MyCommand
-- TH macro (define endpoint handlers BEFORE this)
command "MyCommand" ''MyCommand ''MyEntity
[ 'someEndpoint
]
decide :: MyCommand -> Maybe MyEntity -> RequestContext -> Decision MyEvent
decide cmd entity _ctx =
case entity of
Just _ -> Decider.reject "Entity already exists"
Nothing -> Decider.acceptNew [MyEventCreated {entityId = cmd.entityId}]
data MyEntity = MyEntity
{ entityId :: !Uuid
, someField :: !Text
}
deriving (Eq, Show, Generic)
data MyEvent
= MyEventCreated { entityId :: Uuid }
| MyEventUpdated { someField :: Text }
deriving (Eq, Show, Generic)
-- Type families
type instance EntityOf MyCommand = MyEntity
type instance EventOf MyEntity = MyEvent
$ — use |>let..in or where — use doEither — use Resultpure or returnPrelude directlydevelopment
NeoHaskell coding style reference and enforcement rules. Load when writing, reviewing, or modifying any Haskell code in the NeoHaskell project. Triggers on 'NeoHaskell style', 'NeoHaskell conventions', 'how to write NeoHaskell', 'code style', 'style guide'.
development
Security & Code Quality review for NeoHaskell. Use when reviewing code changes, PRs, or architectural decisions for security implications. Evaluates OWASP, NIST, EU compliance. Handles pipeline phases 2 (ADR review) and 10 (implementation review).
testing
Testing QA Designer for NeoHaskell. Designs comprehensive test specifications with exhaustive edge cases, boundary conditions, and happy paths BEFORE implementation. Handles pipeline phase 6 (Test Spec Design). Outside-in TDD methodology.
development
Performance review for NeoHaskell targeting 50k req/s throughput. Use when reviewing code for performance implications, INLINE pragmas, strictness, and allocation patterns. Handles pipeline phases 3 (ADR review) and 11 (implementation review).