Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
40d15b7
feat: configure Cloudflare D1 and update Workers setup
alexasomba Dec 27, 2025
9eaed9c
feat: add project setup guide and database configuration instructions
alexasomba Dec 27, 2025
ab27284
chore: integrate beads into VS Code
alexasomba Dec 27, 2025
c919e3a
chore(beads): ignore runtime artifacts
alexasomba Dec 27, 2025
026c0b2
chore(beads): add Better Auth Email OTP epic
alexasomba Dec 27, 2025
fbbd5e0
chore: add copilot agent skills
alexasomba Dec 27, 2025
7846b6c
feat(auth): add email OTP sign-in and email verification
alexasomba Dec 27, 2025
ad046b6
chore(beads): fix VS Code tasks to call bd
alexasomba Dec 27, 2025
78e7c1b
refactor(user-app): migrate from lucide-react to tabler icons
alexasomba Dec 27, 2025
c80d5a1
fix(ui): add missing shadcn dependency and restore tailwind import
alexasomba Dec 27, 2025
57cd854
refactor(ui): conform to new component patterns (Base UI) and fix typ…
alexasomba Dec 28, 2025
42ddaed
chore(config): standardize tsconfig for vite/react libraries
alexasomba Dec 28, 2025
a1f96be
chore(config): update user-application tsconfig to use shared vite co…
alexasomba Dec 28, 2025
eacaf06
chore(gitignore): add ui-example and wrangler to .gitignore
alexasomba Dec 28, 2025
30e5dfb
chore(database): remove unused SQLite database file from miniflare state
alexasomba Dec 28, 2025
ca5b4ef
chore(data-ops): support local D1 drizzle migrate
alexasomba Dec 28, 2025
67d9f3d
docs(skills): convert claude agents to copilot skills
alexasomba Dec 28, 2025
09c3046
Add skill creator scripts and documentation for skill initialization …
alexasomba Dec 28, 2025
bade233
chore: add CODEOWNERS, Dependabot, CI, CodeQL, and Security Audit wor…
alexasomba Dec 28, 2025
d02c0e7
docs(skills): add bun monorepo workflows skill
alexasomba Dec 28, 2025
a7c6797
fix: add cursor pointer to clickable components
ldsgroups Dec 28, 2025
50d9e0f
chore: migrate workspace dependencies to pnpm catalogs
ldsgroups Dec 28, 2025
dfed8ec
chore: update dependencies, setup linting, and fix type/lint errors
ldsgroups Dec 28, 2025
e3deaf5
refactor: standardize import order, update type imports, and remove e…
ldsgroups Dec 28, 2025
c120141
chore: update agents documentation formatting
ldsgroups Dec 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions .beads/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# SQLite databases
*.db
*.db?*
*.db-journal
*.db-wal
*.db-shm

# Daemon runtime files
daemon.lock
daemon.log
daemon.pid
bd.sock

# Local docs/runtime artifacts (not part of shared issue state)
README.md
interactions.jsonl

# Local version tracking (prevents upgrade notification spam after git ops)
.local_version

# Legacy database files
db.sqlite
bd.db

# Merge artifacts (temporary files from 3-way merge)
beads.base.jsonl
beads.base.meta.json
beads.left.jsonl
beads.left.meta.json
beads.right.jsonl
beads.right.meta.json

# Keep JSONL exports and config (source of truth for git)
!issues.jsonl
!metadata.json
!config.yaml
62 changes: 62 additions & 0 deletions .beads/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Beads Configuration File
# This file configures default behavior for all bd commands in this repository
# All settings can also be set via environment variables (BD_* prefix)
# or overridden with command-line flags

# Issue prefix for this repository (used by bd init)
# If not set, bd init will auto-detect from directory name
# Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc.
# issue-prefix: ""

# Use no-db mode: load from JSONL, no SQLite, write back after each command
# When true, bd will use .beads/issues.jsonl as the source of truth
# instead of SQLite database
# no-db: false

# Disable daemon for RPC communication (forces direct database access)
# no-daemon: false

# Disable auto-flush of database to JSONL after mutations
# no-auto-flush: false

# Disable auto-import from JSONL when it's newer than database
# no-auto-import: false

# Enable JSON output by default
# json: false

# Default actor for audit trails (overridden by BD_ACTOR or --actor)
# actor: ""

# Path to database (overridden by BEADS_DB or --db)
# db: ""

# Auto-start daemon if not running (can also use BEADS_AUTO_START_DAEMON)
# auto-start-daemon: true

# Debounce interval for auto-flush (can also use BEADS_FLUSH_DEBOUNCE)
# flush-debounce: "5s"

# Git branch for beads commits (bd sync will commit to this branch)
# IMPORTANT: Set this for team projects so all clones use the same sync branch.
# This setting persists across clones (unlike database config which is gitignored).
# Can also use BEADS_SYNC_BRANCH env var for local override.
# If not set, bd sync will require you to run 'bd config set sync.branch <branch>'.
sync-branch: "beads-sync"

# Multi-repo configuration (experimental - bd-307)
# Allows hydrating from multiple repositories and routing writes to the correct JSONL
# repos:
# primary: "." # Primary repo (where this database lives)
# additional: # Additional repos to hydrate from (read-only)
# - ~/beads-planning # Personal planning repo
# - ~/work-planning # Work planning repo

# Integration settings (access with 'bd config get/set')
# These are stored in the database, not in this file:
# - jira.url
# - jira.project
# - linear.url
# - linear.api-key
# - github.org
# - github.repo
10 changes: 10 additions & 0 deletions .beads/issues.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{"id":"cloudflare-workers-saas-kit-9v2","title":"VS Code beads integration","description":"Adds VS Code tasks + extension recommendation for bd.","status":"closed","priority":4,"issue_type":"chore","created_at":"2025-12-27T10:35:48.737495+01:00","updated_at":"2025-12-27T10:35:48.853832+01:00","closed_at":"2025-12-27T10:35:48.853832+01:00","close_reason":"Added .vscode tasks and extension recommendation; validated bd status/ready."}
{"id":"cloudflare-workers-saas-kit-9yb","title":"Add Better Auth Email OTP plugin","description":"Implement Better Auth Email OTP plugin per https://www.better-auth.com/docs/plugins/email-otp.\n\nScope:\n- Server: add emailOTP plugin + sendVerificationOTP handler\n- Client: add email OTP client plugin\n- UI flows: sign-in with OTP; (optional) email verification via OTP; password reset via OTP\n- Non-blocking email send on Workers (use waitUntil)\n\nAcceptance:\n- Can request sign-in OTP and sign in via OTP locally\n- sendVerificationOTP implemented (at least dev logger), no runtime errors","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-27T10:49:40.999159+01:00","updated_at":"2025-12-27T10:49:40.999159+01:00"}
{"id":"cloudflare-workers-saas-kit-9yb.1","title":"Spike: Email OTP plugin flows","description":"Review Better Auth Email OTP docs and decide which flows we ship first: sign-in, email verification override, forget-password.\n\nCapture decisions:\n- OTP length/expiry\n- disableSignUp / sendVerificationOnSignUp settings\n- storeOTP strategy (plain/hashed/encrypted)\n\nReference: https://www.better-auth.com/docs/plugins/email-otp","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-27T10:49:41.037835+01:00","updated_at":"2025-12-27T10:49:41.037835+01:00","dependencies":[{"issue_id":"cloudflare-workers-saas-kit-9yb.1","depends_on_id":"cloudflare-workers-saas-kit-9yb","type":"parent-child","created_at":"2025-12-27T10:49:41.042209+01:00","created_by":"daemon"}]}
{"id":"cloudflare-workers-saas-kit-9yb.2","title":"Server: wire emailOTP plugin","description":"Add emailOTP plugin to Better Auth config in packages/data-ops/src/auth/setup.ts.\n\nPer docs:\n- import emailOTP from better-auth/plugins\n- provide sendVerificationOTP({email, otp, type}) handler\n- consider overrideDefaultEmailVerification (if we choose it)\n\nAcceptance:\n- Server exposes Email OTP endpoints without throwing\n- sendVerificationOTP invoked for sign-in + verify + reset","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-27T10:49:41.080224+01:00","updated_at":"2025-12-27T10:49:41.080224+01:00","dependencies":[{"issue_id":"cloudflare-workers-saas-kit-9yb.2","depends_on_id":"cloudflare-workers-saas-kit-9yb","type":"parent-child","created_at":"2025-12-27T10:49:41.080734+01:00","created_by":"daemon"},{"issue_id":"cloudflare-workers-saas-kit-9yb.2","depends_on_id":"cloudflare-workers-saas-kit-9yb.1","type":"blocks","created_at":"2025-12-27T10:49:41.323709+01:00","created_by":"daemon"},{"issue_id":"cloudflare-workers-saas-kit-9yb.2","depends_on_id":"cloudflare-workers-saas-kit-9yb.3","type":"blocks","created_at":"2025-12-27T10:49:41.350226+01:00","created_by":"daemon"}]}
{"id":"cloudflare-workers-saas-kit-9yb.3","title":"Infra: implement OTP email delivery","description":"Implement sendVerificationOTP delivery for Cloudflare Workers.\n\nConstraints from Better Auth docs:\n- Prefer NOT awaiting send to reduce timing attacks\n- Use waitUntil (Workers) to ensure delivery\n\nAcceptance:\n- In dev: at minimum logs OTP (safe local-only)\n- In prod: uses a real provider (TBD)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-27T10:49:41.116061+01:00","updated_at":"2025-12-27T10:49:41.116061+01:00","dependencies":[{"issue_id":"cloudflare-workers-saas-kit-9yb.3","depends_on_id":"cloudflare-workers-saas-kit-9yb","type":"parent-child","created_at":"2025-12-27T10:49:41.117124+01:00","created_by":"daemon"}]}
{"id":"cloudflare-workers-saas-kit-9yb.4","title":"Client: add email OTP client plugin","description":"Update apps/user-application/src/lib/auth-client.ts to include the Email OTP client plugin.\n\nDocs show:\n- emailOTPClient plugin\n- authClient.emailOtp.sendVerificationOtp / checkVerificationOtp / verifyEmail / resetPassword\n\nAcceptance:\n- Client exposes email OTP methods and can call sendVerificationOtp","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-27T10:49:41.154215+01:00","updated_at":"2025-12-27T10:49:41.154215+01:00","dependencies":[{"issue_id":"cloudflare-workers-saas-kit-9yb.4","depends_on_id":"cloudflare-workers-saas-kit-9yb","type":"parent-child","created_at":"2025-12-27T10:49:41.154698+01:00","created_by":"daemon"},{"issue_id":"cloudflare-workers-saas-kit-9yb.4","depends_on_id":"cloudflare-workers-saas-kit-9yb.2","type":"blocks","created_at":"2025-12-27T10:49:41.375679+01:00","created_by":"daemon"}]}
{"id":"cloudflare-workers-saas-kit-9yb.5","title":"UI: sign-in with Email OTP","description":"Add UI flow to request OTP (email + type=sign-in) and sign in with signIn.emailOtp({ email, otp }).\n\nAcceptance:\n- User can sign in locally via OTP flow","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-27T10:49:41.189618+01:00","updated_at":"2025-12-27T10:49:41.189618+01:00","dependencies":[{"issue_id":"cloudflare-workers-saas-kit-9yb.5","depends_on_id":"cloudflare-workers-saas-kit-9yb","type":"parent-child","created_at":"2025-12-27T10:49:41.190064+01:00","created_by":"daemon"},{"issue_id":"cloudflare-workers-saas-kit-9yb.5","depends_on_id":"cloudflare-workers-saas-kit-9yb.2","type":"blocks","created_at":"2025-12-27T10:49:41.401855+01:00","created_by":"daemon"}]}
{"id":"cloudflare-workers-saas-kit-9yb.6","title":"UI: verify email via OTP (optional)","description":"If we enable overrideDefaultEmailVerification, add UI to request OTP type=email-verification and call emailOtp.verifyEmail({ email, otp }).","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-27T10:49:41.224828+01:00","updated_at":"2025-12-27T10:49:41.224828+01:00","dependencies":[{"issue_id":"cloudflare-workers-saas-kit-9yb.6","depends_on_id":"cloudflare-workers-saas-kit-9yb","type":"parent-child","created_at":"2025-12-27T10:49:41.225374+01:00","created_by":"daemon"},{"issue_id":"cloudflare-workers-saas-kit-9yb.6","depends_on_id":"cloudflare-workers-saas-kit-9yb.2","type":"blocks","created_at":"2025-12-27T10:49:41.429155+01:00","created_by":"daemon"}]}
{"id":"cloudflare-workers-saas-kit-9yb.7","title":"UI: reset password via OTP","description":"Add UI flow for forget-password via OTP:\n- forgetPassword.emailOtp({ email })\n- (optional) checkVerificationOtp\n- emailOtp.resetPassword({ email, otp, password })","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-27T10:49:41.260449+01:00","updated_at":"2025-12-27T10:49:41.260449+01:00","dependencies":[{"issue_id":"cloudflare-workers-saas-kit-9yb.7","depends_on_id":"cloudflare-workers-saas-kit-9yb","type":"parent-child","created_at":"2025-12-27T10:49:41.260995+01:00","created_by":"daemon"},{"issue_id":"cloudflare-workers-saas-kit-9yb.7","depends_on_id":"cloudflare-workers-saas-kit-9yb.2","type":"blocks","created_at":"2025-12-27T10:49:41.454865+01:00","created_by":"daemon"}]}
{"id":"cloudflare-workers-saas-kit-9yb.8","title":"Docs: Email OTP local dev setup","description":"Document required env vars and local dev steps (including where OTP is logged in dev).\n\nAlso document how to run smoke test for email OTP endpoints.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-27T10:49:41.295372+01:00","updated_at":"2025-12-27T10:49:41.295372+01:00","dependencies":[{"issue_id":"cloudflare-workers-saas-kit-9yb.8","depends_on_id":"cloudflare-workers-saas-kit-9yb","type":"parent-child","created_at":"2025-12-27T10:49:41.295859+01:00","created_by":"daemon"}]}
4 changes: 4 additions & 0 deletions .beads/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"database": "beads.db",
"jsonl_export": "issues.jsonl"
}
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

# Use bd merge for beads JSONL files
.beads/issues.jsonl merge=beads
5 changes: 5 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# CODEOWNERS for better-auth-paystack
# Owners listed below will be requested for changes to matching paths.

/examples/ @alexasomba
/.github/ @alexasomba
Loading