# lefthook.yml — local git hooks for yellowjacket
# Install with: lefthook install
# Docs: https://github.com/evilmartians/lefthook

# Conventional Commits. CI runs the same script over every commit in a
# push, so skipping this locally only defers the failure.
commit-msg:
  commands:
    commit-check:
      run: ./scripts/commit-check.sh {1}

pre-commit:
  parallel: true
  commands:
    go-vet:
      glob: "*.go"
      run: go vet ./...

    golangci-lint:
      glob: "*.go"
      run: go tool golangci-lint run --timeout 5m ./...

    codegen-check:
      glob: "*.{go,sql,templ}"
      run: |
        go generate ./...
        if [ -n "$(git diff --name-only)" ]; then
          echo "Generated code is out of date. Run 'make generate' and stage the changes."
          # --no-pager, or this blocks forever on `less` waiting for a
          # keypress that a hook run without a tty will never get: the
          # commit hangs at exactly the moment it is trying to tell you
          # why it failed.
          git --no-pager diff --stat
          exit 1
        fi

    # frontend/bindings is generated by `wails3`, not `go generate`, so
    # the check above does not cover it.  ~3.5s warm, ~20s on a cold
    # build cache: v3's generator is a static analyser over the whole
    # package graph, where v2's built the app with a `bindings` tag and
    # ran it.
    bindings-check:
      glob: "*.go"
      run: ./scripts/bindings-check.sh

    # .pi/ documents make targets; a stale one sends an agent off a
    # cliff with total confidence.  Instant.
    skill-check:
      glob: "{Makefile,.pi/**/*.md}"
      run: ./scripts/skill-check.sh

    frontend-typecheck:
      glob: "frontend/**/*.{ts,tsx}"
      root: "frontend/"
      run: ./node_modules/.bin/tsc --noEmit

    # A backtick in a comment inside a css`` literal ends the literal.
    # tsc does catch it, as "Class static side incorrectly extends base
    # class static side" pointing at a line of prose; this says what
    # actually happened. Instant.
    css-literals:
      glob: "frontend/**/*.ts"
      root: "frontend/"
      run: node scripts/check-css-literals.mjs

pre-push:
  parallel: true
  commands:
    go-test:
      glob: "*.go"
      run: go test -race -count=1 -timeout 120s ./...

    go-mod-verify:
      run: go mod verify

    # The component and store tier: a real browser, no app. ~2s.
    ui-test:
      glob: "frontend/**/*.ts"
      root: "frontend/"
      run: ./node_modules/.bin/vitest run
