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:
| Setting | Value | Rationale |
|---|---|---|
no-unused-vars | warn | Surfaces dead code without blocking builds |
no-console | off | Server-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 allowedretries— 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:
npm installnpm audit --audit-level=high --omit=dev(non-blocking)npx eslint . --max-warnings=0(non-blocking)npx tsx scripts/lint-inngest.ts(blocking)npm run typechecknpm run build