# Dokumentasi File Root Level - Straps Dev

## Gambaran Umum

File-file di root level workspace berisi konfigurasi project, dependencies, build settings, dan utility scripts untuk development dan production.

---

## 📁 Struktur File Root

```
straps-dev/
├── .env                          # Environment variables (secrets)
├── .gitignore                    # Git ignore rules
├── README.md                     # Project documentation
├── package.json                  # NPM dependencies & scripts
├── package-lock.json             # Locked dependency versions
├── tsconfig.json                 # TypeScript compiler config
├── next.config.ts                # Next.js configuration
├── postcss.config.mjs            # PostCSS (Tailwind) config
├── eslint.config.mjs             # ESLint linting rules
├── prisma.config.ts              # Prisma configuration
├── next-env.d.ts                 # Next.js type definitions (auto-generated)
├── tsconfig.tsbuildinfo          # TypeScript incremental build cache (auto-generated)
├── debug_menu.js                 # Quick database inspection script
├── integrated.js                 # Legacy fall detection + rehab system (100KB!)
├── exercise_rules.pdf            # Exercise configuration documentation
└── DOKUMENTASI_*.md              # Project documentation files (generated)
```

---

## 🔧 Configuration Files

### **1. `package.json`** ⭐

**Path**: `/package.json`

**Fungsi**: NPM package configuration - dependencies, scripts, metadata

**Size**: ~1.3 KB

#### **Project Metadata**:

```json
{
	"name": "straps-dev",
	"version": "0.1.0",
	"private": true
}
```

#### **NPM Scripts**:

```json
{
	"scripts": {
		"dev": "concurrently \"next dev --webpack\" \"prisma studio\"",
		"build": "prisma generate && next build --webpack",
		"start": "next start",
		"lint": "eslint",
		"db:studio": "prisma studio"
	}
}
```

**Command Breakdown**:
| Command | Description | Use Case |
|---------|-------------|----------|
| `npm run dev` | Start dev server + Prisma Studio | Development (hot reload) |
| `npm run build` | Generate Prisma Client + Build production | Pre-deployment |
| `npm start` | Run production server | Production mode |
| `npm run lint` | Run ESLint | Code quality check |
| `npm run db:studio` | Open Prisma Studio only | Database management |

**Key Features**:

- ✅ `concurrently` runs dev server + Prisma Studio simultaneously
- ✅ `--webpack` flag for webpack mode (vs Turbopack)
- ✅ Prisma Client auto-generation before build

#### **Dependencies** (Production):

```json
{
	"@mediapipe/pose": "^0.5.1675469404", // Legacy pose detection
	"@mediapipe/tasks-vision": "^0.10.22", // MediaPipe AI
	"@prisma/client": "^6.19.1", // Database ORM
	"@tensorflow-models/pose-detection": "^2.1.3", // TensorFlow pose
	"@tensorflow/tfjs": "^4.22.0", // TensorFlow.js
	"axios": "^1.13.2", // HTTP client
	"bcryptjs": "^3.0.3", // Password hashing
	"framer-motion": "^12.23.26", // Animations
	"lucide-react": "^0.562.0", // Icon library
	"next": "^16.1.1", // Next.js framework
	"next-auth": "^5.0.0-beta.30", // Authentication
	"react": "^19.2.3", // React 19
	"zod": "^4.2.1" // Validation
}
```

**Tech Stack**:

- **Frontend**: React 19 + Next.js 16
- **AI**: MediaPipe + TensorFlow.js
- **Database**: PostgreSQL + Prisma
- **Auth**: NextAuth v5 (beta)
- **Styling**: Tailwind CSS v4

#### **DevDependencies**:

```json
{
	"@tailwindcss/postcss": "^4", // Tailwind v4
	"@types/node": "^20", // Node types
	"@types/react": "^19", // React types
	"concurrently": "^9.2.1", // Run multiple commands
	"eslint": "^9", // Linting
	"tsx": "^4.21.0", // TypeScript executor
	"typescript": "^5" // TypeScript compiler
}
```

#### **Prisma Seed Config**:

```json
{
	"prisma": {
		"seed": "npx tsx prisma/seed.ts"
	}
}
```

- Auto-runs `seed.ts` after `prisma migrate reset`

---

### **2. `next.config.ts`** ⚙️

**Path**: `/next.config.ts`

**Fungsi**: Next.js build and webpack configuration

**Size**: ~1.2 KB

#### **Code**:

```typescript
const nextConfig = {
	// Transpile ESM packages to CommonJS
	transpilePackages: [
		"@tensorflow-models/pose-detection",
		"@/app/generated/client",
	],

	experimental: {
		esmExternals: "loose", // Allow mixing CJS/ESM
	},

	webpack: (config: any) => {
		// Alias @mediapipe/pose to custom shim
		const path = require("path");
		config.resolve.alias["@mediapipe/pose"] = path.resolve(
			__dirname,
			"lib/mediapipe-shim.js",
		);

		// Extension alias for JS/TS interop
		config.resolve.extensionAlias = {
			".js": [".ts", ".tsx", ".js", ".jsx"],
		};
		return config;
	},

	// CORS headers for API routes
	async headers() {
		return [
			{
				source: "/api/:path*",
				headers: [
					{ key: "Access-Control-Allow-Origin", value: "*" },
					{
						key: "Access-Control-Allow-Methods",
						value: "GET, POST, PUT, DELETE, OPTIONS",
					},
					{
						key: "Access-Control-Allow-Headers",
						value: "Content-Type, Authorization",
					},
				],
			},
		];
	},
};
```

**Key Features**:

1. **MediaPipe Shim**: Custom polyfill untuk resolve MediaPipe compatibility
2. **ESM Transpilation**: Convert pose-detection library to CommonJS
3. **CORS Enabled**: Allow external API requests
4. **Extension Alias**: Support `.ts` imports dengan `.js` extension

**Why Needed**:

- MediaPipe has module resolution issues di browser
- Pose detection library is ESM-only, Next.js needs CommonJS
- API routes accessible dari external domains

---

### **3. `tsconfig.json`** 📘

**Path**: `/tsconfig.json`

**Fungsi**: TypeScript compiler configuration

**Size**: ~663 bytes

#### **Code**:

```json
{
	"compilerOptions": {
		"target": "ES2017", // Compile to ES2017 (async/await support)
		"lib": ["dom", "dom.iterable", "esnext"],
		"allowJs": true, // Allow .js files
		"skipLibCheck": true, // Skip type checking node_modules
		"strict": true, // Strict type checking
		"noEmit": true, // No JS output (Next.js handles compilation)
		"esModuleInterop": true,
		"module": "esnext",
		"moduleResolution": "node",
		"resolveJsonModule": true, // Import JSON files
		"isolatedModules": true, // Each file as separate module
		"jsx": "react-jsx", // React 19 JSX transform
		"incremental": true, // Faster rebuilds
		"plugins": [{ "name": "next" }], // Next.js TypeScript plugin
		"paths": {
			"@/*": ["./*"] // Path alias: @/lib → /lib
		}
	},
	"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
	"exclude": ["node_modules"]
}
```

**Important Settings**:

- ✅ `strict: true` - Maximum type safety
- ✅ `noEmit: true` - Next.js handles compilation
- ✅ `paths: { "@/*": ["./*"] }` - Import shorthand
- ✅ `incremental: true` - Faster rebuilds (uses `.tsbuildinfo`)

**Path Alias Usage**:

```typescript
// Instead of:
import { HARCore } from "../../../lib/pose/HARCore";

// Use:
import { HARCore } from "@/lib/pose/HARCore";
```

---

### **4. `postcss.config.mjs`** 🎨

**Path**: `/postcss.config.mjs`

**Fungsi**: PostCSS configuration untuk Tailwind CSS v4

**Size**: ~94 bytes

#### **Code**:

```javascript
const config = {
	plugins: {
		"@tailwindcss/postcss": {},
	},
};

export default config;
```

**Purpose**:

- Enable Tailwind CSS v4 processing
- Auto-process `globals.css` dengan Tailwind directives

**Tailwind v4 Changes**:

- No more `tailwind.config.js`
- All config via PostCSS
- Faster build times

---

### **5. `eslint.config.mjs`** ✅

**Path**: `/eslint.config.mjs`

**Fungsi**: ESLint code quality rules

**Size**: ~465 bytes

#### **Code**:

```javascript
import { defineConfig, globalIgnores } from "eslint/config";
import nextVitals from "eslint-config-next/core-web-vitals";
import nextTs from "eslint-config-next/typescript";

const eslintConfig = defineConfig([
	...nextVitals, // Next.js best practices
	...nextTs, // TypeScript rules
	globalIgnores([".next/**", "out/**", "build/**", "next-env.d.ts"]),
]);

export default eslintConfig;
```

**Rules Applied**:

1. **Next.js Core Web Vitals**: Performance, accessibility, SEO
2. **TypeScript**: Type-aware linting
3. **Ignores**: Build artifacts, generated files

**Run Lint**:

```bash
npm run lint
```

---

### **6. `prisma.config.ts`** 🗄️

**Path**: `/prisma.config.ts`

**Fungsi**: Prisma ORM configuration (alternative to `schema.prisma` for programmatic config)

**Size**: ~527 bytes

#### **Code**:

```typescript
import "dotenv/config";
import { defineConfig } from "prisma/config";

export default defineConfig({
	schema: "prisma/schema.prisma",
	migrations: {
		path: "prisma/migrations",
	},
	datasource: {
		url: process.env["DATABASE_URL"]!,
	},
	// @ts-expect-error - seed is valid at runtime
	seed: {
		command: "npx tsx prisma/seed.ts",
	},
});
```

**Note**: Ini adalah **optional config file**

- Prisma masih menggunakan `schema.prisma` sebagai source of truth
- File ini untuk advanced configuration (custom generators, etc.)
- Tidak wajib untuk basic usage

---

### **7. `.gitignore`** 🚫

**Path**: `/.gitignore`

**Fungsi**: Git ignore rules untuk exclude files dari version control

**Size**: ~503 bytes

#### **Key Exclusions**:

```gitignore
# Dependencies
/node_modules

# Build outputs
/.next/
/out/
/build

# Environment variables
.env*

# TypeScript
*.tsbuildinfo
next-env.d.ts

# Prisma generated
/app/generated/prisma
```

**Why**:

- ✅ `node_modules` - Too large, regenerate via `npm install`
- ✅ `.next/` - Build cache, regenerate on `npm run dev`
- ✅ `.env` - **CRITICAL**: Contains secrets (DATABASE_URL, API keys)
- ✅ `tsbuildinfo` - TypeScript cache, auto-regenerated

**Security**:

- ❌ **NEVER** commit `.env` to Git
- ✅ Provide `.env.example` with placeholder values

---

###**8. `.env`** 🔐
**Path**: `/.env`

**Fungsi**: Environment variables (secrets, config)

**Size**: ~123 bytes

**Status**: ⚠️ **CONFIDENTIAL** - Not shown in docs

**Expected Contents**:

```bash
# Database
DATABASE_URL="postgresql://user:pass@localhost:5432/straps_db"

# NextAuth (if used)
NEXTAUTH_SECRET="your-secret-key"
NEXTAUTH_URL="http://localhost:3000"

# API Keys (if any)
NEXT_PUBLIC_API_URL="http://localhost:3000/api"
```

**Best Practices**:

1. ✅ Use `NEXT_PUBLIC_` prefix for client-side variables
2. ✅ Create `.env.example` dengan placeholder values
3. ❌ Never commit `.env` to Git
4. ✅ Use different `.env` untuk dev/staging/production

---

## 📄 Auto-Generated Files

### **9. `next-env.d.ts`** (Auto-Generated)

**Path**: `/next-env.d.ts`

**Fungsi**: Next.js TypeScript type definitions

**Size**: ~251 bytes

**Content**:

```typescript
/// <reference types="next" />
/// <reference types="next/image-types/global" />

// NOTE: This file should not be edited
// see https://nextjs.org/docs for more information.
```

**Purpose**:

- Enable TypeScript autocomplete untuk Next.js APIs
- Auto-regenerated oleh Next.js
- ❌ **DO NOT EDIT**

---

### **10. `tsconfig.tsbuildinfo`** (Auto-Generated)

**Path**: `/tsconfig.tsbuildinfo`

**Fungsi**: TypeScript incremental build cache

**Size**: **~170 KB** (Large!)

**Purpose**:

- Speed up TypeScript compilation
- Stores type information dari previous builds
- Safe to delete (will regenerate)

**When to Delete**:

```bash
# If TypeScript acting weird
rm tsconfig.tsbuildinfo
npm run dev  # Will regenerate
```

---

## 🛠️ Utility Scripts

### **11. `debug_menu.js`** 🐛

**Path**: `/debug_menu.js`

**Fungsi**: Quick script untuk inspect latest menu dari database

**Size**: ~706 bytes

#### **Code**:

```javascript
const { PrismaClient } = require("./app/generated/client");
const prisma = new PrismaClient();

async function main() {
	const menus = await prisma.training_menus.findMany({
		orderBy: { id: "desc" },
		take: 1,
	});

	if (menus.length > 0) {
		console.log("Latest Menu:", JSON.stringify(menus[0], null, 2));
		const ex = menus[0].exercises;
		if (typeof ex === "string") {
			console.log("Exercises (parsed):", JSON.parse(ex));
		} else {
			console.log("Exercises (raw):", ex);
		}
	} else {
		console.log("No menus found.");
	}
}

main()
	.catch((e) => console.error(e))
	.finally(async () => await prisma.$disconnect());
```

**How to Run**:

```bash
node debug_menu.js
```

**Output**:

```json
Latest Menu: {
  "id": 1,
  "name": "Upper Body Day 1",
  "exercises": [
    { "name": "Bicep Curl", "reps": 10, "weight": 15 }
  ],
  ...
}
```

**Use Cases**:

- ✅ Verify menu saved correctly
- ✅ Debug JSON parsing issues
- ✅ Quick database inspection tanpa Prisma Studio

---

### **12. `integrated.js`** 🏋️ (Legacy)

**Path**: `/integrated.js`

**Fungsi**: Legacy fall detection + rehabilitation exercise system

**Size**: **~100 KB** (Very Large!)

**Status**: ⚠️ **DEPRECATED** - Superseded by TypeScript implementation

**Content**: 3,380 lines of JavaScript

- Fall detection using MediaPipe
- 7 rehabilitation exercises
- ROI (Region of Interest) for sleeping detection
- Firebase integration
- Telegram alerts
- Form accuracy scoring
- Rehab mode workout queue

**Why So Large**:

- Contains entire UI logic
- Embedded exercise Config
- Firebase SDK imports
- Telegram integration
- Canvas drawing functions

**Current Usage**: Likely **NOT USED**

- Modern app uses `/lib/pose/` TypeScript modules
- Check if referenced anywhere:
  ```bash
  grep -r "integrated.js" app/
  ```

**Recommendation**:

- ✅ Archive to `/legacy/` folder
- ✅ Or delete if not referenced

---

### **13. `exercise_rules.pdf`** 📖

**Path**: `/exercise_rules.pdf`

**Fungsi**: Documentation of exercise configuration rules

**Size**: ~24 KB

**Content** (Likely):

- Explanation of `ExerciseRules.ts` config
- Angle thresholds untuk setiap exercise
- Form validation rules
- Diagrams/illustrations

**Use Case**:

- Reference untuk non-technical stakeholders
- Onboarding documentation
- Exercise configuration guide

**Recommendation**:

- Move to `/docs/` folder for better organization

---

## 📚 Documentation Files

### **14-18. `DOKUMENTASI_*.md`** 📝

**Path**: `/DOKUMENTASI_*.md`

**Files**:

1. `DOKUMENTASI_APP_FOLDER.md` (~10 KB)
2. `DOKUMENTASI_LIB_FOLDER.md` (~17 KB)
3. `DOKUMENTASI_PRISMA_FOLDER.md` (~17 KB)
4. `DOKUMENTASI_PUBLIC_FOLDER.md` (~12 KB)
5. `DOKUMENTASI_SCRIPTS_FOLDER.md` (~16 KB)

**Fungsi**: Project documentation dalam Bahasa Indonesia

**Total Size**: ~72 KB

**Created**: Recently generated for project documentation

**Content**: Comprehensive guides untuk each major folder

---

### **19. `README.md`** 📘

**Path**: `/README.md`

**Fungsi**: Project README (default Next.js template)

**Size**: ~1.5 KB

**Content**:

```markdown
This is a Next.js project bootstrapped with create-next-app.

## Getting Started

npm run dev

Open http://localhost:3000

## Learn More

- Next.js Documentation
- Learn Next.js tutorial

## Deploy on Vercel

[Link to Vercel deployment docs]
```

**Status**: ⚠️ **NEEDS UPDATE**

**Recommendation**: Replace with custom README:

```markdown
# Straps Fitness - AI-Powered Form Tracking

## Tech Stack

- Next.js 16 + React 19
- PostgreSQL + Prisma
- MediaPipe AI
- Tailwind CSS v4

## Quick Start

\`\`\`bash
npm install
npm run dev
\`\`\`

## Features

- Real-time form tracking
- Per-rep analysis
- Coach-client management
- Training recap dashboard

[... more details ...]
```

---

## 🔐 Security Checklist

### **✅ Safe to Commit**:

- `package.json`, `package-lock.json`
- `tsconfig.json`
- `next.config.ts`
- `postcss.config.mjs`
- `eslint.config.mjs`
- `.gitignore`
- `README.md`
- `DOKUMENTASI_*.md`

### **❌ NEVER Commit**:

- `.env` - **Contains DATABASE_URL, secrets**
- `node_modules/` - Too large
- `.next/` - Build artifacts
- `tsconfig.tsbuildinfo` - Cache file

### **⚠️ Sensitive Files**:

- `integrated.js` - May contain hardcoded API keys/tokens
  - **Action**: Review before committing

---

## 📊 File Size Summary

| File                   | Size       | Status  | Editable?     |
| ---------------------- | ---------- | ------- | ------------- |
| `.env`                 | 123 B      | Secret  | ✅ (config)   |
| `.gitignore`           | 503 B      | Config  | ✅            |
| `postcss.config.mjs`   | 94 B       | Config  | ⚠️ (rarely)   |
| `prisma.config.ts`     | 527 B      | Config  | ⚠️ (optional) |
| `eslint.config.mjs`    | 465 B      | Config  | ✅            |
| `tsconfig.json`        | 663 B      | Config  | ✅            |
| `debug_menu.js`        | 706 B      | Utility | ✅            |
| `package.json`         | 1.3 KB     | Config  | ✅            |
| `next.config.ts`       | 1.2 KB     | Config  | ✅            |
| `README.md`            | 1.5 KB     | Docs    | ✅            |
| `next-env.d.ts`        | 251 B      | Auto    | ❌            |
| `exercise_rules.pdf`   | 24 KB      | Docs    | ✅            |
| `integrated.js`        | **100 KB** | Legacy  | ⚠️ (archive)  |
| `tsconfig.tsbuildinfo` | **170 KB** | Cache   | ❌            |
| `package-lock.json`    | **293 KB** | Lock    | ❌ (auto)     |

**Total Configurable**: ~40 KB  
**Total Auto-Generated**: ~460 KB

---

## 🚀 Common Workflows

### **Workflow 1: Fresh Setup**

```bash
# Clone repo
git clone [repo-url]
cd straps-dev

# Install dependencies
npm install

# Create .env
cp .env.example .env
# Edit .env dengan DATABASE_URL

# Setup database
npx prisma migrate dev
npx prisma db seed

# Start dev server
npm run dev
```

---

### **Workflow 2: Add New Dependency**

```bash
# Add production dependency
npm install [package-name]

# Add dev dependency
npm install -D [package-name]

# Verify package.json updated
git diff package.json
```

---

### **Workflow 3: Production Build**

```bash
# Generate Prisma Client + Build
npm run build

# Test production locally
npm start

# Deploy (example: Vercel)
vercel deploy --prod
```

---

### **Workflow 4: Update Dependencies**

```bash
# Check outdated packages
npm outdated

# Update specific package
npm update [package-name]

# Update all (careful!)
npm update

# Test after update
npm run build
npm run dev
```

---

## 💡 Troubleshooting

### **Issue**: `npm install` fails

```bash
Error: ENOENT: no such file or directory
```

**Solution**:

```bash
# Clear npm cache
npm cache clean --force

# Delete node_modules
rm -rf node_modules package-lock.json

# Reinstall
npm install
```

---

### **Issue**: TypeScript errors after update

```bash
Error: Cannot find module '@/lib/...'
```

**Solution**:

```bash
# Clear TS cache
rm tsconfig.tsbuildinfo

# Restart TS server (VSCode)
Cmd/Ctrl + Shift + P → "TypeScript: Restart TS Server"
```

---

### **Issue**: Next.js build errors

```bash
Error: Module not found: @mediapipe/pose
```

**Solution**:

```bash
# Check next.config.ts webpack alias
# Verify file exists: lib/mediapipe-shim.js

# Try clean build
rm -rf .next
npm run build
```

---

### **Issue**: Prisma Client not found

```bash
Error: Cannot find module '@prisma/client'
```

**Solution**:

```bash
# Regenerate Prisma Client
npx prisma generate

# Verify generation
ls app/generated/client/
```

---

## 📈 Maintenance Tips

### **Regular Tasks**:

#### **Weekly**:

- ✅ Run `npm outdated` to check dependency updates
- ✅ Review `.env` for unused variables
- ✅ Check `.gitignore` if adding new tools

#### **Monthly**:

- ✅ Update dependencies (major versions carefully)
- ✅ Review `integrated.js` - still needed?
- ✅ Clean up `debug_*.js` scripts

#### **Before Deployment**:

- ✅ `npm run lint` - No errors
- ✅ `npm run build` - Build succeeds
- ✅ Test production mode locally
- ✅ Verify `.env.production` configured

---

## 🎯 Optimization Opportunities

### **1. Remove Unused Dependencies**:

```bash
# Check bundle size
npm run build

# Analyze bundle
npm install -D @next/bundle-analyzer

# Identify unused packages
npx depcheck
```

---

### **2. Archive Legacy Code**:

```bash
# Move to legacy folder
mkdir legacy
mv integrated.js legacy/
git commit -m "Archive legacy integrated.js"
```

---

### **3. Update README**:

- Replace boilerplate with project-specific content
- Add architecture diagram
- Document environment variables
- Add troubleshooting guide

---

## ✅ Summary

**Total Root Files**: 19 (excluding folders)

**Categories**:

- 🔧 **Configuration**: 9 files (package.json, tsconfig, etc.)
- 📄 **Auto-Generated**: 3 files (next-env.d.ts, tsbuildinfo, package-lock.json)
- 🛠️ **Utilities**: 2 files (debug_menu.js, integrated.js)
- 📚 **Documentation**: 6 files (README.md, DOKUMENTASI\_\*.md, exercise_rules.pdf)
- 🔐 **Secrets**: 1 file (.env)

**Key Files to Know**:

1. `package.json` - Dependencies & scripts
2. `next.config.ts` - Build configuration
3. `tsconfig.json` - TypeScript settings
4. `.env` - **Secrets** (never commit!)
5. `.gitignore` - Version control rules

**Total Size**: ~570 KB (mainly `package-lock.json` + cache files)

**Security**: ✅ `.env` properly ignored from Git

Dokumentasi ini mencakup semua file penting di root level! 🚀
