All Docs
Getting StartedAuto Day PlannerUpdated March 11, 2026

v0.1.6: Unblocking CI, Adding ESLint & Inngest Linting

v0.1.6: Unblocking CI, Adding ESLint & Inngest Linting

Release v0.1.6 is a focused infrastructure release. No user-facing features changed — but a broken CI pipeline has been fixed, a modern ESLint configuration has been introduced, and a new static analysis script now enforces correctness standards on Inngest background functions.


The CI Problem

Every CI run triggered via workflow_dispatch was failing immediately on the dependency-install step:

npm error The `npm ci` command can only install with an existing package-lock.json

npm ci is designed for reproducible installs from a committed lockfile. Because package-lock.json is not committed to this repository, the command has no file to work from and aborts.

The fix is straightforward: both the build and deploy jobs in .github/workflows/ci.yml now call npm install instead. CI is fully unblocked.


ESLint Flat Config

A new eslint.config.mjs file introduces ESLint using the modern flat config format (the default since ESLint v9).

Key decisions:

SettingValueRationale
no-unused-varswarnSurfaces dead code without blocking builds
no-consoleoffServer-side and background function logging is intentional
Ignored paths.next/, out/, build/, node_modules/Avoid linting generated output

ESLint now runs as its own CI step (npx eslint . --max-warnings=0), separate from the Next.js build. To prevent double-running, next build is configured to skip its built-in ESLint pass:

// next.config.ts
const nextConfig: NextConfig = {
  eslint: {
    ignoreDuringBuilds: true,
  },
};

Inngest Function Linter

A new script at scripts/lint-inngest.ts statically validates every Inngest function file in src/inngest/functions/.

What It Checks

All function files must declare both:

  • concurrency — controls how many concurrent executions are allowed
  • retries — defines retry behaviour on failure

Omitting either field is treated as a hard error: the script exits with a non-zero status code and prints the file path and missing fields.

Example Output

On failure:

❌  /app/src/inngest/functions/daily-briefing.ts
    Missing required field(s): retries

Inngest lint failed. All function files must declare `concurrency` and `retries`.

On success:

✅  All 3 Inngest function file(s) passed lint.

Running Locally

npx tsx scripts/lint-inngest.ts

This script also runs automatically in CI after ESLint and before the TypeScript typecheck.


Updated CI Step Order

The full CI pipeline now runs in this sequence:

  1. npm install
  2. npm audit --audit-level=high --omit=dev (non-blocking)
  3. npx eslint . --max-warnings=0 (non-blocking)
  4. npx tsx scripts/lint-inngest.ts (blocking)
  5. npm run typecheck
  6. npm run build