From 17afecbaa803646f43208d90fb3bc8b3ae39341f Mon Sep 17 00:00:00 2001 From: Kishan C Date: Fri, 24 Jul 2026 11:25:25 +0530 Subject: [PATCH 1/8] feat: Add projectpilot-ai kit --- README.md | 7 +- kits/projectpilot-ai/README.md | 141 + kits/projectpilot-ai/agent.md | 110 + kits/projectpilot-ai/apps/.env.example | 6 + kits/projectpilot-ai/apps/.gitignore | 28 + kits/projectpilot-ai/apps/README.md | 106 + .../apps/actions/orchestrate.ts | 85 + kits/projectpilot-ai/apps/app/globals.css | 126 + kits/projectpilot-ai/apps/app/layout.tsx | 45 + kits/projectpilot-ai/apps/app/page.tsx | 267 + kits/projectpilot-ai/apps/components.json | 21 + .../apps/components/header.tsx | 47 + .../apps/components/theme-provider.tsx | 11 + .../apps/components/ui/accordion.tsx | 66 + .../apps/components/ui/alert-dialog.tsx | 157 + .../apps/components/ui/alert.tsx | 66 + .../apps/components/ui/aspect-ratio.tsx | 11 + .../apps/components/ui/avatar.tsx | 53 + .../apps/components/ui/badge.tsx | 46 + .../apps/components/ui/breadcrumb.tsx | 109 + .../apps/components/ui/button-group.tsx | 83 + .../apps/components/ui/button.tsx | 60 + .../apps/components/ui/calendar.tsx | 213 + .../apps/components/ui/card.tsx | 92 + .../apps/components/ui/carousel.tsx | 241 + .../apps/components/ui/chart.tsx | 353 ++ .../apps/components/ui/checkbox.tsx | 32 + .../apps/components/ui/collapsible.tsx | 33 + .../apps/components/ui/command.tsx | 184 + .../apps/components/ui/context-menu.tsx | 252 + .../apps/components/ui/dialog.tsx | 143 + .../apps/components/ui/drawer.tsx | 135 + .../apps/components/ui/dropdown-menu.tsx | 257 + .../apps/components/ui/empty.tsx | 104 + .../apps/components/ui/field.tsx | 244 + .../apps/components/ui/form.tsx | 167 + .../apps/components/ui/hover-card.tsx | 44 + .../apps/components/ui/input-group.tsx | 169 + .../apps/components/ui/input-otp.tsx | 77 + .../apps/components/ui/input.tsx | 21 + .../apps/components/ui/item.tsx | 193 + .../apps/components/ui/kbd.tsx | 28 + .../apps/components/ui/label.tsx | 24 + .../apps/components/ui/menubar.tsx | 276 + .../apps/components/ui/navigation-menu.tsx | 166 + .../apps/components/ui/pagination.tsx | 127 + .../apps/components/ui/popover.tsx | 48 + .../apps/components/ui/progress.tsx | 31 + .../apps/components/ui/radio-group.tsx | 45 + .../apps/components/ui/resizable.tsx | 56 + .../apps/components/ui/scroll-area.tsx | 58 + .../apps/components/ui/select.tsx | 185 + .../apps/components/ui/separator.tsx | 28 + .../apps/components/ui/sheet.tsx | 139 + .../apps/components/ui/sidebar.tsx | 726 +++ .../apps/components/ui/skeleton.tsx | 13 + .../apps/components/ui/slider.tsx | 63 + .../apps/components/ui/sonner.tsx | 25 + .../apps/components/ui/spinner.tsx | 16 + .../apps/components/ui/switch.tsx | 31 + .../apps/components/ui/table.tsx | 116 + .../apps/components/ui/tabs.tsx | 66 + .../apps/components/ui/textarea.tsx | 18 + .../apps/components/ui/toast.tsx | 129 + .../apps/components/ui/toaster.tsx | 35 + .../apps/components/ui/toggle-group.tsx | 73 + .../apps/components/ui/toggle.tsx | 47 + .../apps/components/ui/tooltip.tsx | 61 + .../apps/components/ui/use-mobile.tsx | 19 + .../apps/components/ui/use-toast.ts | 191 + kits/projectpilot-ai/apps/hooks/use-mobile.ts | 19 + kits/projectpilot-ai/apps/hooks/use-toast.ts | 191 + .../apps/lib/lamatic-client.ts | 17 + kits/projectpilot-ai/apps/lib/utils.ts | 6 + kits/projectpilot-ai/apps/next.config.mjs | 11 + kits/projectpilot-ai/apps/package-lock.json | 5292 +++++++++++++++++ kits/projectpilot-ai/apps/package.json | 80 + kits/projectpilot-ai/apps/postcss.config.mjs | 5 + kits/projectpilot-ai/apps/tsconfig.json | 41 + kits/projectpilot-ai/constitutions/default.md | 21 + kits/projectpilot-ai/flows/blueprint-flow.ts | 144 + kits/projectpilot-ai/flows/discovery-flow.ts | 144 + kits/projectpilot-ai/flows/execution-flow.ts | 144 + kits/projectpilot-ai/lamatic.config.ts | 17 + ...uctor-llmnode-851_generative-model-name.ts | 15 + ...uctor-llmnode-710_generative-model-name.ts | 15 + ...uctor-llmnode-603_generative-model-name.ts | 15 + ...nt-flow_instructor-llmnode-851_system_0.md | 1 + ...rint-flow_instructor-llmnode-851_user_1.md | 1 + ...ry-flow_instructor-llmnode-710_system_0.md | 1 + ...very-flow_instructor-llmnode-710_user_1.md | 1 + ...on-flow_instructor-llmnode-603_system_0.md | 1 + ...tion-flow_instructor-llmnode-603_user_1.md | 1 + registry.json | 69 +- 94 files changed, 13692 insertions(+), 5 deletions(-) create mode 100644 kits/projectpilot-ai/README.md create mode 100644 kits/projectpilot-ai/agent.md create mode 100644 kits/projectpilot-ai/apps/.env.example create mode 100644 kits/projectpilot-ai/apps/.gitignore create mode 100644 kits/projectpilot-ai/apps/README.md create mode 100644 kits/projectpilot-ai/apps/actions/orchestrate.ts create mode 100644 kits/projectpilot-ai/apps/app/globals.css create mode 100644 kits/projectpilot-ai/apps/app/layout.tsx create mode 100644 kits/projectpilot-ai/apps/app/page.tsx create mode 100644 kits/projectpilot-ai/apps/components.json create mode 100644 kits/projectpilot-ai/apps/components/header.tsx create mode 100644 kits/projectpilot-ai/apps/components/theme-provider.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/accordion.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/alert-dialog.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/alert.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/aspect-ratio.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/avatar.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/badge.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/breadcrumb.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/button-group.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/button.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/calendar.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/card.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/carousel.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/chart.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/checkbox.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/collapsible.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/command.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/context-menu.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/dialog.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/drawer.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/dropdown-menu.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/empty.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/field.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/form.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/hover-card.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/input-group.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/input-otp.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/input.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/item.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/kbd.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/label.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/menubar.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/navigation-menu.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/pagination.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/popover.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/progress.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/radio-group.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/resizable.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/scroll-area.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/select.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/separator.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/sheet.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/sidebar.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/skeleton.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/slider.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/sonner.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/spinner.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/switch.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/table.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/tabs.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/textarea.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/toast.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/toaster.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/toggle-group.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/toggle.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/tooltip.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/use-mobile.tsx create mode 100644 kits/projectpilot-ai/apps/components/ui/use-toast.ts create mode 100644 kits/projectpilot-ai/apps/hooks/use-mobile.ts create mode 100644 kits/projectpilot-ai/apps/hooks/use-toast.ts create mode 100644 kits/projectpilot-ai/apps/lib/lamatic-client.ts create mode 100644 kits/projectpilot-ai/apps/lib/utils.ts create mode 100644 kits/projectpilot-ai/apps/next.config.mjs create mode 100644 kits/projectpilot-ai/apps/package-lock.json create mode 100644 kits/projectpilot-ai/apps/package.json create mode 100644 kits/projectpilot-ai/apps/postcss.config.mjs create mode 100644 kits/projectpilot-ai/apps/tsconfig.json create mode 100644 kits/projectpilot-ai/constitutions/default.md create mode 100644 kits/projectpilot-ai/flows/blueprint-flow.ts create mode 100644 kits/projectpilot-ai/flows/discovery-flow.ts create mode 100644 kits/projectpilot-ai/flows/execution-flow.ts create mode 100644 kits/projectpilot-ai/lamatic.config.ts create mode 100644 kits/projectpilot-ai/model-configs/blueprint-flow_instructor-llmnode-851_generative-model-name.ts create mode 100644 kits/projectpilot-ai/model-configs/discovery-flow_instructor-llmnode-710_generative-model-name.ts create mode 100644 kits/projectpilot-ai/model-configs/execution-flow_instructor-llmnode-603_generative-model-name.ts create mode 100644 kits/projectpilot-ai/prompts/blueprint-flow_instructor-llmnode-851_system_0.md create mode 100644 kits/projectpilot-ai/prompts/blueprint-flow_instructor-llmnode-851_user_1.md create mode 100644 kits/projectpilot-ai/prompts/discovery-flow_instructor-llmnode-710_system_0.md create mode 100644 kits/projectpilot-ai/prompts/discovery-flow_instructor-llmnode-710_user_1.md create mode 100644 kits/projectpilot-ai/prompts/execution-flow_instructor-llmnode-603_system_0.md create mode 100644 kits/projectpilot-ai/prompts/execution-flow_instructor-llmnode-603_user_1.md diff --git a/README.md b/README.md index 43ce093e5..1900524e3 100644 --- a/README.md +++ b/README.md @@ -53,14 +53,14 @@ The section below is **auto-generated from [`registry.json`](./registry.json)**. -**Total:** 70 entries -β€’ **22** kits (full apps) +**Total:** 71 entries +β€’ **23** kits (full apps) β€’ **6** bundles (multi-flow pipelines) β€’ **42** templates (single flows) --- -#### πŸš€ Kits (22) +#### πŸš€ Kits (23) | Name | Description | Author | Live Demo | Path | |---|---|---|---|---| @@ -83,6 +83,7 @@ The section below is **auto-generated from [`registry.json`](./registry.json)**. | **Medical Assistant** | An AI-powered medical assistant chatbot that provides general medical information, symptom checks, and health guidance through a conversational interface built with Lamatic.ai. | Lamatic AI | β€” | [`/kits/medical-assistant`](./kits/medical-assistant) | | **PageIndex NotebookLM β€” Vectorless Tree-Structured RAG** | Upload any PDF and chat with it using vectorless, tree-structured RAG powered entirely by Lamatic AI flows. No vector database, no external Python server, no chunking β€” just a hierarchical document index built from the table of contents. | Saurabh Tiwari | [![Live Demo](https://img.shields.io/badge/Live%20Demo-black?style=for-the-badge)](https://pageindex-notebooklm.vercel.app/) | [`/kits/pageindex-notebooklm`](./kits/pageindex-notebooklm) | | **Poster Generation** | β€” | Naitik Kapadia | β€” | [`/kits/poster-generator`](./kits/poster-generator) | +| **ProjectPilot AI** | AI-powered final year project mentor guiding engineering students from project ideation through completion, including project recommendations, tech stack and architecture blueprints, and development roadmaps with documentation and viva/resume preparation. | Kishan C | β€” | [`/kits/projectpilot-ai`](./kits/projectpilot-ai) | | **Reddit Scout** | Search Reddit for real product reviews and opinions. Get structured summaries of what real users are saying about any product or topic. | Reddit Scout | [![Live Demo](https://img.shields.io/badge/Live%20Demo-black?style=for-the-badge)](https://reddit-scout-tawny.vercel.app/) | [`/kits/reddit-scout`](./kits/reddit-scout) | | **Stock Analysis Kit** | β€” | Naitik Kapadia | β€” | [`/kits/stock-analysis`](./kits/stock-analysis) | | **System Design Analyzer** | AI-powered system design analyzer that identifies architectural issues and provides recommendations for scalable, resilient systems. | Lamatic.ai | β€” | [`/kits/system-design-analyzer`](./kits/system-design-analyzer) | diff --git a/kits/projectpilot-ai/README.md b/kits/projectpilot-ai/README.md new file mode 100644 index 000000000..87708f980 --- /dev/null +++ b/kits/projectpilot-ai/README.md @@ -0,0 +1,141 @@ +# ProjectPilot AI β€” Final Year Project Mentor + +ProjectPilot AI guides engineering students from picking a final year project through to being ready to build, document, and defend it. Give it your branch, interest, skill level, timeline, and team type, and it walks you through three grounded stages: project discovery, technical blueprinting, and execution planning. + +> ProjectPilot AI is a planning aid. It does not write your code, guarantee project approval, or replace guidance from your actual project supervisor. + +## What it solves + +Choosing a final year project is often the hardest part β€” students either pick something too ambitious, too generic, or with no clear execution path. ProjectPilot AI turns a handful of inputs into a specific, buildable project idea with a concrete tech stack, a week-by-week roadmap, and interview/viva prep material β€” all grounded in the exact idea and stack chosen, not generic filler. + +## Capabilities + +- Generates 5-8 project ideas ranked by difficulty, industry relevance, and innovation score, based on branch, interest, skill level, duration, and team type. +- Recommends a specific frontend, backend, database, AI/ML framework, and deployment platform for a chosen idea, with an architecture explanation and relevant datasets/APIs. +- Produces a week-by-week development roadmap, a ~150-word abstract, five viva questions (beginner to advanced), and three ATS-friendly resume bullet points β€” all explicitly grounded in the chosen project and its actual tech stack, never generic filler. + +## Architecture + +```text +Browser + β†’ Next.js form (branch, interest, skill level, duration, team type) + β†’ Lamatic SDK + β†’ discovery-flow (API Request β†’ Generate JSON β†’ API Response) + β†’ user selects an idea + β†’ Lamatic SDK + β†’ blueprint-flow (API Request β†’ Generate JSON β†’ API Response) + β†’ user confirms + β†’ Lamatic SDK + β†’ execution-flow (API Request β†’ Generate JSON β†’ API Response) + β†’ final results screen (roadmap, abstract, viva questions, resume bullets) +``` + +Three independent, sequentially-chained Lamatic flows, each with its own trigger, structured-output LLM node, and response mapping. + +### Flow inputs + +**discovery-flow** + +| Input | Type | Description | +|---|---|---| +| `branch` | string | Engineering branch (e.g. CSE, AIML, ECE, IT) | +| `interest` | string | Area of interest (e.g. AI/ML, Web Development, IoT) | +| `skillLevel` | string | Beginner, Intermediate, or Advanced | +| `duration` | string | 1 month, 3 months, or 6 months | +| `teamType` | string | Individual or Team | + +**blueprint-flow** + +| Input | Type | Description | +|---|---|---| +| `selectedIdea` | string | Title of the chosen project idea | +| `skillLevel` | string | Beginner, Intermediate, or Advanced | + +**execution-flow** + +| Input | Type | Description | +|---|---|---| +| `selectedIdea` | string | Title of the chosen project idea | +| `blueprint` | string | JSON-stringified blueprint from blueprint-flow | +| `duration` | string | Project timeline | + +## Repository structure + +```text +projectpilot-ai/ +β”œβ”€β”€ apps/ # Next.js application +β”œβ”€β”€ constitutions/ # Agent-level behavioral guardrails +β”œβ”€β”€ flows/ # discovery-flow.ts, blueprint-flow.ts, execution-flow.ts +β”œβ”€β”€ model-configs/ # Generate JSON model configuration per flow +β”œβ”€β”€ prompts/ # Externalized system and user prompts per flow +β”œβ”€β”€ agent.md # Agent identity and operations reference +└── lamatic.config.ts # AgentKit metadata and flow setup +``` + +## Prerequisites + +- Node.js 18 or later +- npm 9 or later +- A Lamatic account and deployed copies of `discovery-flow`, `blueprint-flow`, and `execution-flow` +- A configured structured-generation model credential in Lamatic (this kit uses Groq's `llama-3.3-70b-versatile`) + +## Lamatic setup + +1. Import or recreate the three flows in `flows/` in Lamatic Studio. +2. Configure each flow's Generate JSON node with a supported model credential. +3. Test each flow with sample input matching the schemas above. +4. Deploy all three flows. +5. Copy each Flow ID, plus the Project ID, project API endpoint, and a Lamatic API key. + +Provider credentials (e.g. Groq keys) stay inside Lamatic. They are not application environment variables. + +## Application setup + +```bash +cd kits/projectpilot-ai/apps +cp .env.example .env.local +npm install --legacy-peer-deps +npm run dev +``` + +Fill in `apps/.env.local`: + +```env +DISCOVERY_FLOW_ID=your_discovery_flow_id +BLUEPRINT_FLOW_ID=your_blueprint_flow_id +EXECUTION_FLOW_ID=your_execution_flow_id +LAMATIC_API_URL=your_lamatic_project_api_url +LAMATIC_PROJECT_ID=your_lamatic_project_id +LAMATIC_API_KEY=your_lamatic_api_key +``` + +Open `http://localhost:3000`. Real credentials belong only in `.env.local` and deployment secrets; never commit them. + +## Validation + +From `apps/`: + +```bash +npm run build +``` + +Recommended acceptance tests: + +1. Submit the form with a specific branch/interest combination and confirm the returned ideas are plausible and varied, not repeated templates. +2. Select an idea and confirm the blueprint explicitly names that idea and recommends a coherent stack for it. +3. Generate the execution plan and confirm the abstract, roadmap, viva questions, and resume bullets all reference the specific project name and its actual tech stack β€” not generic machine-learning boilerplate. +4. Run the form twice with different inputs and confirm the two runs produce meaningfully different, appropriately grounded output. + +## Known limitations + +- Project ideas, tech stack recommendations, and roadmaps are AI-generated suggestions and should be reviewed by a project supervisor before formal submission. +- Duration estimates are approximate and may not account for institution-specific milestones. +- The tool does not verify real-world dataset availability or licensing terms for suggested datasets. + +## Deployment + +Deploy `kits/projectpilot-ai/apps` as the Vercel root directory and configure the six application environment variables listed above. + +## Responsible use + +Use ProjectPilot AI to accelerate project selection and planning, then validate the chosen idea and roadmap with your actual project supervisor or mentor before committing to it. \ No newline at end of file diff --git a/kits/projectpilot-ai/agent.md b/kits/projectpilot-ai/agent.md new file mode 100644 index 000000000..e1ee7a909 --- /dev/null +++ b/kits/projectpilot-ai/agent.md @@ -0,0 +1,110 @@ +# ProjectPilot AI Agent + +## Overview + +ProjectPilot AI is a three-stage agentic mentor for engineering students planning their final year project. It moves a student from raw preferences (branch, interest, skill level, duration, team type) to a specific project idea, a grounded technical blueprint, and a complete execution plan β€” with every stage explicitly conditioned on the student's actual choices, not generic templates. + +## Purpose + +Final year project planning tools often stop at idea generation and leave the student to figure out the stack, timeline, and defense prep alone. ProjectPilot AI chains three purpose-built agents so each stage builds on the confirmed output of the last, while enforcing that every output stays grounded in the specific project and technologies chosen β€” a deliberate guardrail added after early testing showed generic LLM output ignoring the actual selected project. + +## Flow 1: Discovery + +### Trigger +The synchronous API Request accepts `branch`, `interest`, `skillLevel`, `duration`, and `teamType`. + +### Processing +The Generate JSON node produces 5-8 ranked project ideas, each with a difficulty rating, industry relevance, and an innovation score out of 10, tailored to the student's inputs. + +### Response +The API Response exposes `ideas` β€” an array of `{ title, difficulty, industryRelevance, innovationScore }`. + +### When to use +Use at the start of final year project planning, once a student knows their branch and rough area of interest but hasn't committed to a specific idea. + +### Dependencies +- Lamatic synchronous API runtime +- A structured-output-capable generative model (this kit uses Groq `llama-3.3-70b-versatile`) + +## Flow 2: Blueprint + +### Trigger +The synchronous API Request accepts `selectedIdea` and `skillLevel`. + +### Processing +The Generate JSON node recommends a frontend, backend, database, AI/ML framework, and deployment platform specific to the chosen idea, along with a short architecture explanation and 2-3 relevant datasets or APIs. + +### Response +The API Response exposes `frontend`, `backend`, `database`, `aiFrameworks`, `deployment`, `architectureExplanation`, and `datasets`. + +### When to use +Use immediately after a student selects one idea from the Discovery stage. + +### Dependencies +- Lamatic synchronous API runtime +- The same structured-output-capable generative model as Discovery + +## Flow 3: Execution + +### Trigger +The synchronous API Request accepts `selectedIdea`, `blueprint` (JSON-stringified output from Blueprint), and `duration`. + +### Processing +The Generate JSON node produces a week-by-week roadmap, a ~150-word abstract, five viva questions (beginner to advanced), and three ATS-friendly resume bullet points β€” all required to explicitly reference the specific project and its actual technology stack rather than a generic or unrelated project template. + +### Response +The API Response exposes `roadmap` (array of `{ week, task }`), `abstract`, `vivaQuestions`, and `resumeBullets`. + +### When to use +Use once the student has confirmed the technical blueprint and is ready to plan execution and defense prep. + +### Dependencies +- Lamatic synchronous API runtime +- The same structured-output-capable generative model as the other two flows + +## Guardrails + +- Never generate a generic or unrelated project β€” every output across all three flows must explicitly reference the specific project idea and, where applicable, the confirmed technology stack. +- Never fabricate an idea, stack recommendation, or roadmap step that ignores the student's stated branch, interest, skill level, or duration. +- Treat the student's inputs as the sole source of truth for grounding; do not default to common training-data patterns (e.g. generic "machine learning project" templates) when specific input is provided. +- Recommendations are suggestions for a student and their supervisor to evaluate β€” never present output as a guarantee of project approval or academic success. +- Avoid recommending datasets, APIs, or tools that require paid licenses without noting the cost. + +## Integration reference + +| Service | Purpose | Credential | +|---|---|---| +| Lamatic API | Executes the three deployed flows | `LAMATIC_API_KEY` | +| Lamatic project | Selects the project runtime | `LAMATIC_PROJECT_ID`, `LAMATIC_API_URL` | +| Deployed flows | Selects each stage's workflow | `DISCOVERY_FLOW_ID`, `BLUEPRINT_FLOW_ID`, `EXECUTION_FLOW_ID` | +| Model provider | Produces schema-constrained output | Stored in Lamatic (Groq), never in the app | + +## Environment setup + +| Variable | Required | Source | Purpose | +|---|:---:|---|---| +| `LAMATIC_API_KEY` | Yes | Lamatic Settings β†’ API Keys | Authenticates server-side flow execution. | +| `LAMATIC_PROJECT_ID` | Yes | Lamatic project settings/API Docs | Identifies the deployed project. | +| `LAMATIC_API_URL` | Yes | Lamatic API Docs | Base endpoint for the project runtime. | +| `DISCOVERY_FLOW_ID` | Yes | Flow menu β†’ Copy Flow ID | Identifies the discovery-flow deployment. | +| `BLUEPRINT_FLOW_ID` | Yes | Flow menu β†’ Copy Flow ID | Identifies the blueprint-flow deployment. | +| `EXECUTION_FLOW_ID` | Yes | Flow menu β†’ Copy Flow ID | Identifies the execution-flow deployment. | + +## Quickstart + +1. Deploy all three Lamatic flows and configure their shared model credential. +2. Copy `apps/.env.example` to `apps/.env.local`. +3. Fill the six required Lamatic values. +4. Run `npm install --legacy-peer-deps` from `apps/`. +5. Run `npm run dev` and open the local URL. +6. Fill the form, generate ideas, select one, review the blueprint, then generate the execution plan. + +## Common failure modes + +| Symptom | Likely cause | Fix | +|---|---|---| +| Blueprint or execution fields render empty | Wrong Flow ID in `.env.local`, or the API Response node's output mapping is missing a field | Verify each `*_FLOW_ID` matches the correct flow in Studio; check Output Variables mapping on the API Response node. | +| Roadmap/abstract reference a generic or unrelated project | Prompt isn't strongly grounding output in the specific input | Strengthen the system/user prompt to explicitly forbid generic output, as done in this kit's `execution-flow` prompt. | +| "Missing environment variable" error | One or more application environment variables are missing | Compare `.env.local` with `.env.example` and restart the dev server. | +| Deploy fails with a generic Edge deployment error | Transient Lamatic platform issue, or the flow's Active toggle is off | Confirm the flow is toggled Active before deploying; retry; check status.lamatic.ai. | +| Model returns invalid JSON | Prompt is too long/complex for the model to follow reliably | Simplify the prompt while keeping the core grounding instruction. | \ No newline at end of file diff --git a/kits/projectpilot-ai/apps/.env.example b/kits/projectpilot-ai/apps/.env.example new file mode 100644 index 000000000..30632c0d8 --- /dev/null +++ b/kits/projectpilot-ai/apps/.env.example @@ -0,0 +1,6 @@ +DISCOVERY_FLOW_ID="Your discovery-flow Flow ID" +BLUEPRINT_FLOW_ID="Your blueprint-flow Flow ID" +EXECUTION_FLOW_ID="Your execution-flow Flow ID" +LAMATIC_API_URL="Your Lamatic Project API URL" +LAMATIC_PROJECT_ID="Your Lamatic Project ID" +LAMATIC_API_KEY="Your Lamatic API Key" \ No newline at end of file diff --git a/kits/projectpilot-ai/apps/.gitignore b/kits/projectpilot-ai/apps/.gitignore new file mode 100644 index 000000000..57d6d37a7 --- /dev/null +++ b/kits/projectpilot-ai/apps/.gitignore @@ -0,0 +1,28 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules + +# next.js +/.next/ +/out/ + +# production +/build + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files +.env +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts \ No newline at end of file diff --git a/kits/projectpilot-ai/apps/README.md b/kits/projectpilot-ai/apps/README.md new file mode 100644 index 000000000..5943f657b --- /dev/null +++ b/kits/projectpilot-ai/apps/README.md @@ -0,0 +1,106 @@ +# Agent Kit Generation by Lamatic.ai + +

+ + Live Demo + +

+ + +**Agent Kit Generation** is an AI-powered content generation system built with [Lamatic.ai](https://lamatic.ai). It uses intelligent workflows to generate text, images, and JSON content through a modern Next.js interface with markdown rendering support. + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/Lamatic/AgentKit&root-directory=kits/agentic/generation&env=AGENTIC_GENERATE_CONTENT,LAMATIC_API_URL,LAMATIC_PROJECT_ID,LAMATIC_API_KEY&envDescription=Your%20Lamatic%20Generation%20keys%20are%20required.&envLink=https://lamatic.ai/templates/agentkits/agentic/agent-kit-generation) + +--- + +## Lamatic Setup (Pre and Post) + +Before running this project, you must build and deploy the flow in Lamatic, then wire its config into this codebase. + +Pre: Build in Lamatic +1. Sign in or sign up at https://lamatic.ai +2. Create a project (if you don’t have one yet) +3. Click β€œ+ New Flow” and select "Templates" +4. Select the 'Generation' agent kit +5. Configure providers/tools/inputs as prompted +6. Deploy the kit in Lamatic and obtain your .env keys +7. Copy the keys from your studio + +Post: Wire into this repo +1. Create a .env file and set the keys +2. Install and run locally: + - npm install + - npm run dev +3. Deploy (Vercel recommended): + - Import your repo, set the project's Root Directory (if applicable) + - Add env vars in Vercel (same as your .env) + - Deploy and test your live URL + +Notes +- Coming soon: single-click export and "Connect Git" in Lamatic to push config directly to your repo. + +--- + +## πŸ”‘ Setup +## Required Keys and Config + +You’ll need these things to run this project locally: + +1. **.env Keys** β†’ get it from your [Lamatic account](https://lamatic.ai) post kit deployment. + + +| Item | Purpose | Where to Get It | +| ----------------- | -------------------------------------------- | ----------------------------------------------- | +| .env Key | Authentication for Lamatic AI APIs and Orchestration | [lamatic.ai](https://lamatic.ai) | + +### 1. Environment Variables + +Create `.env.local` with: + +```bash +# Lamatic +AGENTIC_GENERATE_CONTENT = "AGENTIC_GENERATE_CONTENT Flow ID" +LAMATIC_API_URL = "LAMATIC_API_URL" +LAMATIC_PROJECT_ID = "LAMATIC_PROJECT_ID" +LAMATIC_API_KEY = "LAMATIC_API_KEY" +``` + +### 2. Install & Run + +```bash +npm install +npm run dev +# Open http://localhost:3000 +``` +--- + +## πŸ“‚ Repo Structure + +``` +/actions + └── orchestrate.ts # Lamatic workflow orchestration +/app + └── page.tsx # Main generation form UI +/components + β”œβ”€β”€ header.tsx # Header component with navigation + └── ui # shadcn/ui components +/lib + └── lamatic-client.ts # Lamatic SDK client +/public + └── lamatic-logo.png # Lamatic branding +/flows + └── ... # Lamatic Flows +/package.json # Dependencies & scripts +``` + +--- + +## 🀝 Contributing + +We welcome contributions! Open an issue or PR in this repo. + +--- + +## πŸ“œ License + +MIT License – see [LICENSE](../../../LICENSE). diff --git a/kits/projectpilot-ai/apps/actions/orchestrate.ts b/kits/projectpilot-ai/apps/actions/orchestrate.ts new file mode 100644 index 000000000..ec6179626 --- /dev/null +++ b/kits/projectpilot-ai/apps/actions/orchestrate.ts @@ -0,0 +1,85 @@ +"use server"; + +import { lamaticClient } from "@/lib/lamatic-client"; + +export interface ProjectIdea { + title: string; + difficulty: string; + industryRelevance: string; + innovationScore: number; +} + +export interface Blueprint { + frontend: string; + backend: string; + database: string; + aiFrameworks: string; + deployment: string; + architectureExplanation: string; + datasets: string[]; +} + +export interface ExecutionPlan { + roadmap: { week: string; task: string }[]; + abstract: string; + vivaQuestions: string[]; + resumeBullets: string[]; +} + +function getFlowId(envKey: string): string { + const id = process.env[envKey]; + if (!id) { + throw new Error(`Missing environment variable: ${envKey}`); + } + return id; +} + +export async function getProjectIdeas(input: { + branch: string; + interest: string; + skillLevel: string; + duration: string; + teamType: string; +}): Promise<{ success: boolean; data?: ProjectIdea[]; error?: string }> { + try { + const flowId = getFlowId("DISCOVERY_FLOW_ID"); + const resData = await lamaticClient.executeFlow(flowId, input); + const ideas = resData?.result?.ideas; + if (!ideas) throw new Error("No ideas found in response"); + return { success: true, data: ideas }; + } catch (error) { + return { success: false, error: error instanceof Error ? error.message : "Unknown error" }; + } +} + +export async function getBlueprint(input: { + selectedIdea: string; + skillLevel: string; +}): Promise<{ success: boolean; data?: Blueprint; error?: string }> { + try { + const flowId = getFlowId("BLUEPRINT_FLOW_ID"); + const resData = await lamaticClient.executeFlow(flowId, input); + const blueprint = resData?.result; + if (!blueprint) throw new Error("No blueprint found in response"); + return { success: true, data: blueprint }; + } catch (error) { + return { success: false, error: error instanceof Error ? error.message : "Unknown error" }; + } +} + +export async function getExecutionPlan(input: { + selectedIdea: string; + blueprint: string; + duration: string; +}): Promise<{ success: boolean; data?: ExecutionPlan; error?: string }> { + try { + const flowId = getFlowId("EXECUTION_FLOW_ID"); + const resData = await lamaticClient.executeFlow(flowId, input); + const plan = resData?.result; + if (!plan) throw new Error("No execution plan found in response"); + return { success: true, data: plan }; + } catch (error) { + return { success: false, error: error instanceof Error ? error.message : "Unknown error" }; + } +} + diff --git a/kits/projectpilot-ai/apps/app/globals.css b/kits/projectpilot-ai/apps/app/globals.css new file mode 100644 index 000000000..4d7f2a413 --- /dev/null +++ b/kits/projectpilot-ai/apps/app/globals.css @@ -0,0 +1,126 @@ +@import 'tailwindcss'; +@import 'tw-animate-css'; + + +@custom-variant dark (&:is(.dark *)); + +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --destructive-foreground: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.145 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.145 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.985 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.396 0.141 25.723); + --destructive-foreground: oklch(0.637 0.237 25.331); + --border: oklch(0.269 0 0); + --input: oklch(0.269 0 0); + --ring: oklch(0.439 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(0.269 0 0); + --sidebar-ring: oklch(0.439 0 0); +} + +@theme inline { + --font-sans: 'Geist', 'Geist Fallback'; + --font-mono: 'Geist Mono', 'Geist Mono Fallback'; + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/kits/projectpilot-ai/apps/app/layout.tsx b/kits/projectpilot-ai/apps/app/layout.tsx new file mode 100644 index 000000000..4489638db --- /dev/null +++ b/kits/projectpilot-ai/apps/app/layout.tsx @@ -0,0 +1,45 @@ +import type { Metadata } from 'next' +import { Geist, Geist_Mono } from 'next/font/google' +import { Analytics } from '@vercel/analytics/next' +import './globals.css' + +const _geist = Geist({ subsets: ["latin"] }); +const _geistMono = Geist_Mono({ subsets: ["latin"] }); + +export const metadata: Metadata = { + title: 'v0 App', + description: 'Created with v0', + generator: 'v0.app', + icons: { + icon: [ + { + url: '/icon-light-32x32.png', + media: '(prefers-color-scheme: light)', + }, + { + url: '/icon-dark-32x32.png', + media: '(prefers-color-scheme: dark)', + }, + { + url: '/icon.svg', + type: 'image/svg+xml', + }, + ], + apple: '/apple-icon.png', + }, +} + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode +}>) { + return ( + + + {children} + + + + ) +} diff --git a/kits/projectpilot-ai/apps/app/page.tsx b/kits/projectpilot-ai/apps/app/page.tsx new file mode 100644 index 000000000..e3fdc7b25 --- /dev/null +++ b/kits/projectpilot-ai/apps/app/page.tsx @@ -0,0 +1,267 @@ +"use client"; + +import { useState } from "react"; +import { + getProjectIdeas, + getBlueprint, + getExecutionPlan, + type ProjectIdea, + type Blueprint, + type ExecutionPlan, +} from "@/actions/orchestrate"; + +type Stage = "form" | "ideas" | "blueprint" | "execution"; + +export default function Home() { + const [stage, setStage] = useState("form"); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const [form, setForm] = useState({ + branch: "", + interest: "", + skillLevel: "Beginner", + duration: "3 months", + teamType: "Individual", + }); + + const [ideas, setIdeas] = useState([]); + const [selectedIdea, setSelectedIdea] = useState(""); + const [blueprint, setBlueprint] = useState(null); + const [executionPlan, setExecutionPlan] = useState(null); + + async function handleGetIdeas(e: React.FormEvent) { + e.preventDefault(); + setLoading(true); + setError(null); + const res = await getProjectIdeas(form); + setLoading(false); + if (res.success && res.data) { + setIdeas(res.data); + setStage("ideas"); + } else { + setError(res.error || "Failed to generate ideas"); + } + } + + async function handleSelectIdea(title: string) { + setSelectedIdea(title); + setLoading(true); + setError(null); + const res = await getBlueprint({ selectedIdea: title, skillLevel: form.skillLevel }); + setLoading(false); + if (res.success && res.data) { + setBlueprint(res.data); + setStage("blueprint"); + } else { + setError(res.error || "Failed to generate blueprint"); + } + } + + async function handleGenerateExecutionPlan() { + if (!blueprint) return; + setLoading(true); + setError(null); + const res = await getExecutionPlan({ + selectedIdea, + blueprint: JSON.stringify(blueprint), + duration: form.duration, + }); + setLoading(false); + if (res.success && res.data) { + setExecutionPlan(res.data); + setStage("execution"); + } else { + setError(res.error || "Failed to generate execution plan"); + } + } + + return ( +
+
+

ProjectPilot AI

+

+ Your AI mentor for final year project selection, planning, and execution. +

+ + {error && ( +
+ {error} +
+ )} + + {/* STAGE 1: FORM */} + {stage === "form" && ( +
+
+ + setForm({ ...form, branch: e.target.value })} + /> +
+
+ + setForm({ ...form, interest: e.target.value })} + /> +
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ )} + + {/* STAGE 2: IDEAS */} + {stage === "ideas" && ( +
+

Pick a project idea

+ {ideas.map((idea, i) => ( +
+
+

{idea.title}

+
+ Difficulty: {idea.difficulty} + Industry Relevance: {idea.industryRelevance} + Innovation: {idea.innovationScore}/10 +
+
+ +
+ ))} +
+ )} + + {/* STAGE 3: BLUEPRINT */} + {stage === "blueprint" && blueprint && ( +
+

Technical Blueprint

+
+

Project: {selectedIdea}

+

Frontend: {blueprint.frontend}

+

Backend: {blueprint.backend}

+

Database: {blueprint.database}

+

AI Frameworks: {blueprint.aiFrameworks}

+

Deployment: {blueprint.deployment}

+

Architecture: {blueprint.architectureExplanation}

+
+ Datasets/APIs: +
    + {(blueprint.datasets || []).map((d, i) => ( +
  • {d}
  • + ))} +
+
+
+ +
+ )} + + {/* STAGE 4: EXECUTION PLAN */} + {stage === "execution" && executionPlan && ( +
+

Execution Plan

+
+
+

Abstract

+

{executionPlan.abstract}

+
+
+

Roadmap

+
    + {executionPlan.roadmap.map((r, i) => ( +
  • + Week {r.week}: {r.task} +
  • + ))} +
+
+
+

Viva Questions

+
    + {executionPlan.vivaQuestions.map((q, i) => ( +
  • {q}
  • + ))} +
+
+
+

Resume Bullets

+
    + {executionPlan.resumeBullets.map((b, i) => ( +
  • {b}
  • + ))} +
+
+
+ +
+ )} +
+
+ ); +} \ No newline at end of file diff --git a/kits/projectpilot-ai/apps/components.json b/kits/projectpilot-ai/apps/components.json new file mode 100644 index 000000000..4ee62ee10 --- /dev/null +++ b/kits/projectpilot-ai/apps/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/kits/projectpilot-ai/apps/components/header.tsx b/kits/projectpilot-ai/apps/components/header.tsx new file mode 100644 index 000000000..2c2fcc5ae --- /dev/null +++ b/kits/projectpilot-ai/apps/components/header.tsx @@ -0,0 +1,47 @@ +import Link from "next/link" +import { FileText, Github } from "lucide-react" +import Image from "next/image" + +export function Header() { + return ( +
+
+ +
+ Lamatic Logo +

+ Lamatic + Generator +

+
+ +
+ + + Docs + + + + GitHub + +
+
+
+ ) +} diff --git a/kits/projectpilot-ai/apps/components/theme-provider.tsx b/kits/projectpilot-ai/apps/components/theme-provider.tsx new file mode 100644 index 000000000..55c2f6eb6 --- /dev/null +++ b/kits/projectpilot-ai/apps/components/theme-provider.tsx @@ -0,0 +1,11 @@ +'use client' + +import * as React from 'react' +import { + ThemeProvider as NextThemesProvider, + type ThemeProviderProps, +} from 'next-themes' + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return {children} +} diff --git a/kits/projectpilot-ai/apps/components/ui/accordion.tsx b/kits/projectpilot-ai/apps/components/ui/accordion.tsx new file mode 100644 index 000000000..e538a33b9 --- /dev/null +++ b/kits/projectpilot-ai/apps/components/ui/accordion.tsx @@ -0,0 +1,66 @@ +'use client' + +import * as React from 'react' +import * as AccordionPrimitive from '@radix-ui/react-accordion' +import { ChevronDownIcon } from 'lucide-react' + +import { cn } from '@/lib/utils' + +function Accordion({ + ...props +}: React.ComponentProps) { + return +} + +function AccordionItem({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AccordionTrigger({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + svg]:rotate-180', + className, + )} + {...props} + > + {children} + + + + ) +} + +function AccordionContent({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + +
{children}
+
+ ) +} + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/kits/projectpilot-ai/apps/components/ui/alert-dialog.tsx b/kits/projectpilot-ai/apps/components/ui/alert-dialog.tsx new file mode 100644 index 000000000..970445266 --- /dev/null +++ b/kits/projectpilot-ai/apps/components/ui/alert-dialog.tsx @@ -0,0 +1,157 @@ +'use client' + +import * as React from 'react' +import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog' + +import { cn } from '@/lib/utils' +import { buttonVariants } from '@/components/ui/button' + +function AlertDialog({ + ...props +}: React.ComponentProps) { + return +} + +function AlertDialogTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogPortal({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + + ) +} + +function AlertDialogHeader({ + className, + ...props +}: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function AlertDialogFooter({ + className, + ...props +}: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function AlertDialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogAction({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogCancel({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +} diff --git a/kits/projectpilot-ai/apps/components/ui/alert.tsx b/kits/projectpilot-ai/apps/components/ui/alert.tsx new file mode 100644 index 000000000..e6751abe6 --- /dev/null +++ b/kits/projectpilot-ai/apps/components/ui/alert.tsx @@ -0,0 +1,66 @@ +import * as React from 'react' +import { cva, type VariantProps } from 'class-variance-authority' + +import { cn } from '@/lib/utils' + +const alertVariants = cva( + 'relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current', + { + variants: { + variant: { + default: 'bg-card text-card-foreground', + destructive: + 'text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +function Alert({ + className, + variant, + ...props +}: React.ComponentProps<'div'> & VariantProps) { + return ( +
+ ) +} + +function AlertTitle({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function AlertDescription({ + className, + ...props +}: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +export { Alert, AlertTitle, AlertDescription } diff --git a/kits/projectpilot-ai/apps/components/ui/aspect-ratio.tsx b/kits/projectpilot-ai/apps/components/ui/aspect-ratio.tsx new file mode 100644 index 000000000..40bb1208d --- /dev/null +++ b/kits/projectpilot-ai/apps/components/ui/aspect-ratio.tsx @@ -0,0 +1,11 @@ +'use client' + +import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio' + +function AspectRatio({ + ...props +}: React.ComponentProps) { + return +} + +export { AspectRatio } diff --git a/kits/projectpilot-ai/apps/components/ui/avatar.tsx b/kits/projectpilot-ai/apps/components/ui/avatar.tsx new file mode 100644 index 000000000..aa98465a3 --- /dev/null +++ b/kits/projectpilot-ai/apps/components/ui/avatar.tsx @@ -0,0 +1,53 @@ +'use client' + +import * as React from 'react' +import * as AvatarPrimitive from '@radix-ui/react-avatar' + +import { cn } from '@/lib/utils' + +function Avatar({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AvatarImage({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AvatarFallback({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/kits/projectpilot-ai/apps/components/ui/badge.tsx b/kits/projectpilot-ai/apps/components/ui/badge.tsx new file mode 100644 index 000000000..fc4126b7a --- /dev/null +++ b/kits/projectpilot-ai/apps/components/ui/badge.tsx @@ -0,0 +1,46 @@ +import * as React from 'react' +import { Slot } from '@radix-ui/react-slot' +import { cva, type VariantProps } from 'class-variance-authority' + +import { cn } from '@/lib/utils' + +const badgeVariants = cva( + 'inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden', + { + variants: { + variant: { + default: + 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90', + secondary: + 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90', + destructive: + 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', + outline: + 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +function Badge({ + className, + variant, + asChild = false, + ...props +}: React.ComponentProps<'span'> & + VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot : 'span' + + return ( + + ) +} + +export { Badge, badgeVariants } diff --git a/kits/projectpilot-ai/apps/components/ui/breadcrumb.tsx b/kits/projectpilot-ai/apps/components/ui/breadcrumb.tsx new file mode 100644 index 000000000..1750ff26a --- /dev/null +++ b/kits/projectpilot-ai/apps/components/ui/breadcrumb.tsx @@ -0,0 +1,109 @@ +import * as React from 'react' +import { Slot } from '@radix-ui/react-slot' +import { ChevronRight, MoreHorizontal } from 'lucide-react' + +import { cn } from '@/lib/utils' + +function Breadcrumb({ ...props }: React.ComponentProps<'nav'>) { + return