From 6db3bc90ac7469f31c7792354a820950d16cad0d Mon Sep 17 00:00:00 2001 From: Alex Yoo Date: Mon, 25 May 2026 21:34:06 +1000 Subject: [PATCH] feat: project finalized --- TactixAI_Performance_Report_AlexYoo.pdf | Bin 11074 -> 0 bytes frontend/.env.example | 10 + frontend/README.md | 244 +++++++++++++----------- 3 files changed, 147 insertions(+), 107 deletions(-) delete mode 100644 TactixAI_Performance_Report_AlexYoo.pdf create mode 100644 frontend/.env.example diff --git a/TactixAI_Performance_Report_AlexYoo.pdf b/TactixAI_Performance_Report_AlexYoo.pdf deleted file mode 100644 index 79749803dc20c95e742c36225c6c253548de539d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11074 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 F{{SkUc{%_9 diff --git a/frontend/.env.example b/frontend/.env.example new file mode 100644 index 0000000..981c91a --- /dev/null +++ b/frontend/.env.example @@ -0,0 +1,10 @@ +# API endpoints +VITE_DEV_BASE_URL=http://localhost:8000 +VITE_PROD_BASE_URL=https://tactixai-api-production.up.railway.app # Replace with live api server base url +VITE_PROD_WS_BASE_URL=wss://tactixai-api-production.up.railway.app # Replace with live websocket base url + +# Runtime mode: 'DEV' uses VITE_DEV_BASE_URL, anything else uses VITE_PROD_BASE_URL +VITE_MODE='DEV' + +# JWT storage key +VITE_TOKEN_KEY='TOKEN_KEY' # Authentication Token of your choice diff --git a/frontend/README.md b/frontend/README.md index 29c6c77..da2965b 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -1,19 +1,22 @@ -# 🔴 TactixAI. — Cyber Threat Negotiation Training Platform +# TactixAI — Cyber Threat Negotiation Training Platform -> A GenAI-powered chatbot platform for simulating real-world ransomware negotiation scenarios. -> Built for **FlameTree Cyber** | IFN735 Industry Project — Group 34, QUT +> A GenAI-powered chatbot platform for simulating real-world ransomware negotiation scenarios. +> Built for **FlameTree Cyber** | IFN735 Industry Project — TigerByte(Group 34), QUT --- -## 📌 Project Overview +## Live Demo -Tactix ai. is a web-based training platform that allows security professionals to practice -ransomware negotiation in a safe, AI-driven environment. Learners engage with realistic -threat actor personas, receive performance feedback, and build negotiation skills aligned -with cybersecurity best practices. +[https://tactix-ai.vercel.app/](https://tactix-ai.vercel.app/) + +--- + +## Project Overview + +Tactix AI is a web-based training platform that allows security professionals to practice ransomware negotiation in a safe, AI-driven environment. Learners engage with realistic threat actor personas, receive performance feedback, and build negotiation skills aligned with cybersecurity best practices. **Key capabilities:** -- Role-based access control (Learner, Reviewer, Admin) +- Role-based access control (Learner, Admin) - AI-powered threat actor simulation with configurable personas and scenarios - Session tracking, performance metrics, and downloadable reports @@ -21,75 +24,123 @@ This repository contains the **frontend client** application. --- -## Demo Link - -[Click to navigate](https://tactix-ai.vercel.app/) - ---- - -## 🛠 FE Tech Stack +## Tech Stack | Layer | Technology | |---|---| | Framework | React 19 + TypeScript | -| Build Tool | Vite | -| Styling | Tailwind CSS v3 | -| Routing | React Router DOM v6 | -| State Management | Context API | +| Build Tool | Vite 8 | +| Styling | Tailwind CSS v4 | +| Routing | React Router DOM v7 | +| State Management | Context API + React Query | +| Form Handling | React Hook Form + Zod | | HTTP Client | Axios | +| WebSocket | react-use-websocket | | Icons | lucide-react | +| Testing | Jest + Testing Library | | Deployment | Vercel | --- -## 🚀 Getting Started +## Local Development ### Prerequisites - Node.js `v20+` - npm `v9+` -### Installation +### 1. Clone and install ```bash -# 1. Clone the repository -git clone https://github.com/your-org/tactix_ai-client.git -cd tactix_ai-client - -# 2. Install dependencies +git clone https://github.com/your-org/tactix_ai.git +cd tactix_ai/frontend npm install - -# 3. Set up environment variables -cp .env.example .env ``` -### Environment Variables +### 2. Configure environment ```bash -# .env -VITE_API_URL=http://localhost:5173 # Backend API base URL -VITE_USE_MOCK=true # true = use mock auth (no backend needed) +cp .env.example .env ``` -### Run Locally +Then edit `.env` and fill in the values. See `.env.example` for descriptions of each variable. + +### 3. Run dev server ```bash npm run dev # → http://localhost:5173 ``` -### Build for Production +> In `DEV` mode, API requests are proxied through Vite to `VITE_DEV_BASE_URL`. The proxy strips the `/api` prefix before forwarding. + +--- + +## Production Build ```bash +# Type-check and compile npm run build + +# Preview the built output locally npm run preview ``` +The output is written to `dist/`. This is the directory Vercel deploys. + +--- + +## Deployment — Vercel + +### Auto-deploy + +Pushes to `main` automatically trigger a Vercel deployment. No manual steps required. + +### Manual deploy via CLI + +```bash +npm install -g vercel +vercel --prod +``` + +### Vercel environment variables + +Set these in the Vercel project dashboard under **Settings → Environment Variables**: + +| Variable | Value | +|---|---| +| `VITE_DEV_BASE_URL` | `http://localhost:8000` | +| `VITE_PROD_BASE_URL` | `https://tactixai-api-production.up.railway.app` | +| `VITE_PROD_WS_BASE_URL` | `wss://tactixai-api-production.up.railway.app` | +| `VITE_MODE` | `PROD` | +| `VITE_TOKEN_KEY` | `FLAMETREE_TOKEN_KEY` | + +### SPA routing + +`vercel.json` rewrites all routes to `index.html` so React Router handles client-side navigation: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +--- + +## Running Tests + +```bash +npm run test # run all tests once +npm run test:watch # watch mode +``` + +Tests are located in `src/__tests__/` and cover reducers, hooks, forms, and schemas. + --- -## 🔐 Dev Test Accounts +## Test Accounts -When `VITE_USE_MOCK=true`, use these credentials (any password): +Use these credentials against the live or local backend: | Email | Role | Access | |---|---|---| @@ -98,84 +149,74 @@ When `VITE_USE_MOCK=true`, use these credentials (any password): --- -## 📁 Folder Structure +## Folder Structure ``` -src/ -├── api/ # Axios API calls (1:1 with backend endpoints) -│ ├── client.ts # Axios instance + JWT interceptor -│ ├── auth.api.ts -│ ├── user.api.ts (to be added) -│ └── chat.api.ts (to be added) -│ -├── components/ -│ ├── ui/ # Generic, reusable primitives (no page-specific logic) -│ │ ├── Logo.tsx # Brand logo used across all pages -│ │ ├── StatsCard.tsx # Metric display card -│ │ ├── DifficultyBadge.tsx -│ │ └── PanelHeader.tsx # Reusable panel/section header -│ ├── admin/ # Admin dashboard tab components -│ │ ├── OverviewTab.tsx -│ │ ├── AnalyticsTab.tsx -│ │ └── UsersTab.tsx -│ ├── forms/ # Form components -│ │ └── SubmitForm.tsx -│ ├── layout/ # App shell (Navbar, Sidebar, AppLayout) -│ └── guards/ # RBAC route protection -│ ├── ProtectedRoute.tsx -│ └── RoleGuard.tsx -│ -├── context/ # Global state (Context API) -│ └── AuthContext.tsx -│ -├── hooks/ # Custom hooks -│ ├── useAuth.ts -│ └── useRBAC.ts (to be added) -│ -├── pages/ # One file per route -│ ├── auth/ # Login, Register -│ ├── learner/ # Learner Dashboard, Chat -│ ├── admin/ # Admin Dashboard, User Management -│ └── common/ # Unauthorized, NotFound +frontend/ +├── public/ +├── src/ +│ ├── api/ # Axios API calls (1:1 with backend endpoints) +│ │ ├── client.ts # Axios instance + JWT interceptor +│ │ ├── auth.api.ts +│ │ ├── admin.api.ts +│ │ └── learner.api.ts +│ │ +│ ├── components/ +│ │ ├── ui/ # Reusable primitives (no page-specific logic) +│ │ ├── admin/ # Admin dashboard tab components +│ │ ├── learner/ # Learner-specific components +│ │ ├── layout/ # App shell (AppLayout) +│ │ └── guards/ # RBAC route protection +│ │ +│ ├── context/ # Global state (AuthContext, ScenarioContext, StatsContext) +│ ├── hooks/ # Custom hooks + reducers +│ ├── mocks/ # Static mock data for development +│ ├── pages/ +│ │ ├── auth/ # Login, ForgotPassword, SetPassword +│ │ ├── learner/ # Dashboard, Scenarios, Chat, Performance, Profile +│ │ └── admin/ # Admin Dashboard, Learner Details, Chat History +│ │ +│ ├── router/ +│ │ ├── AppRouter.tsx # Route declarations +│ │ └── routes.ts # Route path constants +│ │ +│ ├── schemas/ # Zod validation schemas +│ ├── types/ # Shared TypeScript types +│ ├── utils/ # Token helpers, formatters, parsers +│ └── config.ts # Env-aware API base URL config │ -├── router/ -│ ├── AppRouter.tsx # All route declarations -│ └── routes.ts # Route path constants -│ -├── types/ # Shared TypeScript types -├── utils/ # Token helpers, formatters -└── styles/ # Global CSS +├── vercel.json +├── vite.config.ts +└── package.json ``` --- -## 🌿 Git Branching Strategy +## Git Branching Strategy ``` main ← production (auto-deploys to Vercel) -└── feature/- ← feature branches - └── PR → reviewed → merged into main +└── feature/- ← feature branches merged via PR ``` -**Branch naming convention:** +**Branch naming:** ``` feature/epic-3-auth-scaffold -feature/epic-4-admin-dashboard -feature/epic-5-RBAC +feature/epic-7-performance-analysis fix/login-redirect ``` **Commit message format:** ``` -feat: new feature -fix: bug fix -chore: config / dependency changes -docs: documentation only +feat: new feature +fix: bug fix +chore: config / dependency changes +docs: documentation only ``` --- -## 👥 Team — Group 34 +## Team — TigerByte(Group 34) | Name | Role | Responsibility | |---|---|---| @@ -188,19 +229,8 @@ docs: documentation only --- -## 🗺 MVP Roadmap - -| MVP | Target Week | Scope | -|---|---|---| -| **MVP 1** | Week 4 | Auth + RBAC + Mock Chat + Admin Basics | -| **MVP 2** | Week 8 | AI Integration + Scenario Config + Tracking | -| **MVP 3** | Week 10-12 | Full Analytics + Reports + Final Delivery | - ---- - -## 📄 License +## License -This project was developed as part of **IFN735 Industry Project** at -Queensland University of Technology (QUT) in collaboration with **FlameTree Cyber**. +Developed as part of **IFN735 Industry Project** at Queensland University of Technology (QUT) in collaboration with **FlameTree Cyber**. -© 2026 Group 34 — All rights reserved. \ No newline at end of file +© 2026 TigerByte(Group 34) — All rights reserved.