47 tasks organized across 8 phases by user story: Phase 1: Setup (3 tasks) - Install Shadcn Sheet and Badge components - Create component directory structure Phase 2: Foundation (5 tasks) ⚠️ BLOCKING - getRecentPolicySettings() Server Action - Extend searchPolicySettings() with limit param - Null-value filtering in backend - Type exports Phase 3: User Story 1 - Browse Recent (8 tasks) 🎯 MVP - PolicyTable component with click handlers - PolicySearchContainer client wrapper - Refactor page to Server Component - 50 newest policies on load, no empty state Phase 4: User Story 2 - Detail Sheet (9 tasks) 🎯 MVP - PolicyDetailSheet component - JSON detection and formatting - Click-to-open sheet integration - Handle long content and errors Phase 5: User Story 3 - Search (6 tasks) P2 - Integrate SearchInput component - Search state management - Null filtering in results Phase 6: User Story 4 - Visual (5 tasks) P3 - Badge color mapping - Badge rendering for policy types - Hover effects verification Phase 7: Navigation (4 tasks) - Update config/nav.ts - Remove 'All Settings' menu item - Consolidate to single 'Policy Explorer' Phase 8: Polish (7 tasks) - Responsive layout - Loading states - Performance validation (<2s load, <300ms sheet) - Accessibility and cross-browser testing MVP Scope: Phases 1-4 (25 tasks) Total: 47 tasks with dependency graph and parallel execution opportunities |
||
|---|---|---|
| .github | ||
| .specify | ||
| .vscode | ||
| app | ||
| components | ||
| config | ||
| lib | ||
| public | ||
| specs | ||
| .gitignore | ||
| components.json | ||
| debug-db.ts | ||
| Dockerfile | ||
| drizzle.config.ts | ||
| eslint.config.mjs | ||
| fix-constraint.ts | ||
| kirimase.config.json | ||
| next-auth.d.ts | ||
| next.config.ts | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.mjs | ||
| README.md | ||
| tailwind.config.ts | ||
| tsconfig.json | ||
TenantPilot
A multi-tenant SaaS application built with Next.js, Azure AD authentication, and Drizzle ORM.
Architecture Principles
This project follows strict architectural principles defined in our Constitution:
- Server-First: Next.js App Router with Server Actions, no client-side fetches
- Type Safety: TypeScript strict mode mandatory
- Database: Drizzle ORM exclusively
- UI: Shadcn UI components with Tailwind CSS
- Auth: Azure AD multi-tenant authentication
Getting Started
First, install dependencies:
npm install
Copy environment variables:
cp .env.example .env
Fill in your Azure AD credentials and database URL.
Run database migrations:
npm run db:push
Start the development server:
npm run dev
Open http://localhost:3000 to see the application.
Development
- Use Server Actions for all data operations
- Follow TypeScript strict mode requirements
- Use Shadcn UI for new components
- Test with Azure AD authentication
Deployment
Build the Docker image:
docker build -t tenantpilot .
Run with environment variables:
docker run -p 3000:3000 --env-file .env tenantpilot