Files
GibSend/AGENTS.md
T
KM Koushik e3e9635a5f feat: add customizable contact double opt-in flow (#350)
* feat: add customizable contact double opt-in flow

* test: add double opt-in service coverage

* fix: address review comments for double opt-in PR

- Make pending status conditional on doubleOptInEnabled flag
- Backfill legacy unsubscribeReason for reliable pending detection
- Add doubleOptInContent to contact book listing select
- Fix duplicate toast on DOI editor subject save failure
- Harden searchParams parsing against string[] values
- Make default DOI template use link mark for clickable URL
- Make public API create+update atomic via transaction
- Prevent contact upsert failure when DOI email send fails
- Fix empty string template variable replacement

Co-authored-by: opencode <opencode@anthropic.com>

* fix: harden double opt-in confirmation safeguards

Preserve explicit unsubscribe intent in DOI flows and prevent confirmation links from re-subscribing opted-out contacts. Also sanitize subscribe-page error messaging and use timing-safe hash comparison for link verification.

* ui stuff

* fix: require doubleOptInUrl in double opt-in templates

* feat: add configurable from address for double opt-in emails

* feat: add resend confirmation flow for pending contacts

* fix: move subscribe confirmation to explicit POST flow

* test: add contact book public API endpoint coverage

* docs: add double opt-in documentation and update OpenAPI spec

Add a user guide for the double opt-in feature covering setup, contact
statuses, email customization, template variables, and best practices.
Update the OpenAPI spec to include doubleOptIn fields in all contactBook
request/response schemas.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: opencode <opencode@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 00:34:20 +11:00

2.6 KiB

Repository Guidelines

Project Structure & Module Organization

  • apps/web: Next.js app (primary product). Uses Prisma, TRPC, Tailwind.
  • apps/marketing: Public marketing site (Next.js, static export).
  • apps/docs: Mintlify docs content.
  • apps/smtp-server: SMTP proxy/server (TypeScript → tsup build).
  • packages/*: Shared libraries (email-editor, ui, eslint-config, tailwind-config, typescript-config, sdk).
  • docker/: Dev/compose files; .env* at repo root define configuration.

Build, Test, and Development Commands

  • pnpm i: Install workspace deps (Node >= 20).
  • pnpm dev: Turbo dev for all relevant apps (loads .env).
  • pnpm start:web:local: Run only apps/web locally on port 3000.
  • pnpm build: Turbo build across the monorepo.
  • pnpm dx / pnpm dx:up / pnpm dx:down: Spin up/down local infra via Docker Compose, then run migrations.
  • Database (apps/web filter): pnpm db:generate | db:migrate-dev | db:push | db:studio.
  • Never run migrations unless users explicitly asked

Coding Style & Naming Conventions

  • Files: React components PascalCase (e.g., AppSideBar.tsx); folders kebab/lowercase.
  • Paths (web): use alias ~/ for src imports (e.g., import { x } from "~/utils/x").
  • NEVER USE DYNAMIC IMPORTS. ALWAYS IMPORT ON THE TOP

Rules

  • Prefer to use trpc alway unless asked otherwise

Testing Guidelines

  • Web testing is configured with Vitest in apps/web; add tests when changes impact logic, APIs, or behavior.
  • Prefer targeted suites first: pnpm test:web:unit, pnpm test:web:trpc, pnpm test:web:api; use pnpm test:web for default non-integration coverage.
  • Test file conventions: *.unit.test.ts, *.trpc.test.ts, *.api.test.ts, *.integration.test.ts.
  • Integration tests require infra and env (RUN_INTEGRATION=true with Postgres/Redis available). Root commands pnpm test:web:all and pnpm test:web:integration:full auto-manage infra lifecycle.
  • Use pnpm test:infra:up / pnpm test:infra:down when running targeted integration commands manually.
  • pnpm test:web:integration:full and test:integration:prepare run Prisma migrations (prisma migrate deploy); never run these unless the user explicitly asks.
  • Test defaults are cloud mode (NEXT_PUBLIC_IS_CLOUD=true); keep new tests compatible with cloud behavior unless the task says otherwise.

Commit & Pull Request Guidelines

  • Prefer Conventional Commits (feat:, fix:, chore:, docs:). Git history shows frequent feat/fix usage.
  • PRs must include: clear description, linked issues, screenshots for UI changes, migration notes, and verification steps.
  • never run build,migration commands unless asked for