Thank you for your interest in contributing! Volunteer, open source, 100% free.
git clone https://github.com/thierryvm/TerminalLearning.git
cd TerminalLearning
npm install
cp .env.example .env.local # fill in VITE_SUPABASE_URL + VITE_SUPABASE_ANON_KEY
npm run devEnv vars (see .env.example):
VITE_SUPABASE_URL— Supabase dashboard → Settings → APIVITE_SUPABASE_ANON_KEY— same location (public anon key, safe for client)VITE_SENTRY_DSN— optional, Sentry project DSN
npm run type-check # zero TypeScript errors
npm run lint # zero ESLint errors
npm run test # all tests pass
npm run build # production build succeeds- Branch from
main→feature/THI-XX-descriptionorfix/THI-XX-description - Follow Conventional Commits
- Open a PR — CI must pass before merge
See docs/CONVENTIONS.md for full branch/commit/PR conventions.
| File | Risk |
|---|---|
src/app/data/curriculum.ts |
Modifying breaks tests + user progress |
src/app/context/ProgressContext.tsx |
Bug = data loss for users |
src/app/data/terminalEngine.ts |
Each new command needs a test |
vercel.json |
Loosening CSP is a security regression |
New commands go in src/app/data/terminalEngine.ts inside executeCommand.
Each command must have a test in src/test/terminalEngine.test.ts.
Lessons live in src/app/data/curriculum.ts. Each lesson needs:
- A unique
id(slug),title,description,blocks(content), optionalexercise
Use useAuth() from src/app/context/AuthContext.tsx to access session/user.
Use useProgress() from src/app/context/ProgressContext.tsx for synced progress.
Upcoming (Phase 7) — RBAC: a useRole() hook will expose the user's role
(super_admin, institution_admin, teacher, student). Do not implement role checks
ad-hoc before this is in place — use useAuth() for now and leave a // TODO(THI-37) comment.
See docs/ARCHITECTURE.md for source structure, data flow, and DB schema.
GitHub Issues for bugs. For security vulnerabilities → SECURITY.md.
By contributing, your code is released under the MIT License.