All skills
harlan-zw avatar

/ts-design-patterns

Apply Harlan's Effect-inspired TypeScript design principles. Use for non-trivial state, errors, dependencies, module boundaries, or API design, and after a production error, where a guard at the failure site would leave the category open.

GitHub Updated 1 hour ago

Use this Skill: https://skilld.dev/gh/harlan-zw/harlan-agent-kit/ts-design-patterns

Raw
<!-- The six principles below are mirrored in agent-context/context.md. Run scripts/check-agent-context.sh after editing them. -->

TypeScript Design Patterns

Effect-inspired, without an Effect dependency.

  • Make illegal states unrepresentable. _tag discriminated unions, not optional-field + boolean soup.
  • Errors as values. Tagged Ok | Err for expected domain failures, so signatures show them. Unexpected and infra errors propagate; prefer .catch() over try/catch when handling is needed.
  • No silent catches. .catch(() => null) hides failures. Handle (log, surface, fallback with reason) or propagate. Swallow only genuinely ignorable failures, with a comment saying so.
  • Parse, don't validate. Parse untrusted input once at the boundary into a precise type; trust it inward.
  • Explicit dependencies. Pass clients, config, clock as args. No hidden singletons, no import-time side effects.
  • Pure core, effectful shell. Side effects at the edges, decision logic pure data-in/data-out.
  • Design out the bug. After a production error, find the design that kills the whole category. Prefer a type or structural change; guard at the failure site only when no design change exists.

As a review rubric

When reviewing TS, score against each principle and report only violations that change behaviour or block testing. A class that wraps state with no illegal-state risk is a style note, not a finding; a catch that swallows a network failure is a finding.

Source: SKILL.md on GitHub