Questify

2.0.1

Released

Fixes

  • POST /api/billing/checkout refuses an account that already holds a Pro-granting subscription, with a 409 pointing at the Billing Portal. Hiding the buy buttons is not enforcement: a double click, a retry, or a direct call would open a second Checkout session, and Stripe will happily run two independent subscriptions for one customer (#486).

  • Stripe customer creation carries an idempotency key derived from the user id, so two concurrent first checkouts converge on one customer. Without it both saw no mapping, both created a customer, and the losing upsert left one holding a live Checkout session and its invoices that neither the mapping nor the Billing Portal could find again (#486).

  • Locked personas in the model picker render as plain cards rather than disabled buttons. The "Upgrade to Pro" link was interactive content nested inside a disabled <button> — invalid HTML, and unreachable by pointer and assistive technology alike, so the one control that could unlock the card was the one control that could not be used (#486).

  • The dev TUI re-checks for a live-mode context after an account switch. The guard ran before the switch was offered, so choosing a live account from the picker walked straight past it into fetching a live webhook signing secret into .env and forwarding production events at localhost (#486).

  • Synced pnpm-lock.yaml with apps/web/package.json to include @vitest/coverage-v8@^2.1.2, resolving ERR_PNPM_OUTDATED_LOCKFILE in CI when running pnpm install --frozen-lockfile.

  • Added E2E_SUPABASE_URL and E2E_SUPABASE_SERVICE_ROLE_KEY to the test:e2e env array in turbo.json, resolving turbo/no-undeclared-env-vars lint warnings across e2e/auth.spec.ts, e2e/fixtures.ts, e2e/global-setup.ts, and e2e/helpers/auth.ts.

  • Suppressed false-positive react-hooks/rules-of-hooks warnings in e2e/fixtures.ts — Playwright's use callback is not a React hook.

  • Renamed unused _config parameter to _ in e2e/global-setup.ts to satisfy @typescript-eslint/no-unused-vars.

  • Fixed reorderTaskIds tests in src/lib/tasks/types.edge.test.ts to pass QuestTask objects via the task() helper instead of plain strings, resolving a TypeError: Cannot read properties of undefined (reading 'localeCompare') caused by the function's sortOrder/createdAt fields being absent.

  • Fixed a TypeScript build error in e2e/fixtures.ts where authenticatedPage was typed as ReturnType<typeof base>['page'] (which resolves to never); replaced with the correct Page type imported directly from @playwright/test.