Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
d395d73
feat: initialize project with monorepo structure, authentication, RBA…
logusivam Jul 15, 2026
b43a83f
feat: bootstrap core infrastructure with RBAC and OAuth integration
logusivam Jul 15, 2026
c2de664
feat: add Gemini design system skills and agent tooling
logusivam Jul 15, 2026
e17fb38
fix: remove deprecated husky shebang and allow empty test stubs
logusivam Jul 15, 2026
b081f25
test: add placeholder test suites to unblock pre-push gate
logusivam Jul 15, 2026
fe384b8
fix: add globals to vitest project configs to resolve describe not de…
logusivam Jul 15, 2026
d620e61
fix: resolve FormEvent deprecations, environment setups and add eye t…
logusivam Jul 16, 2026
6f393d3
fix: ignore dynamic delete warning in sanitize middleware
logusivam Jul 16, 2026
ed2382a
feat: implement environment variable validation using Zod for API con…
logusivam Jul 16, 2026
1e2f11c
fix: resolve FormEvent deprecation warning in LandingPage.tsx
logusivam Jul 17, 2026
ba79cc3
fix: restore pointer-events clickability on landing page and retain s…
logusivam Jul 17, 2026
ab6148e
feat: add landing page to provide product overview and key feature hi…
logusivam Jul 17, 2026
3e03dd2
feat: redesign pages 2, 3, 4, 5, 6, 8, 9 resolving no-undef warnings
logusivam Jul 17, 2026
9f492e5
fix: route authenticated users to dashboard from landing page
logusivam Jul 17, 2026
48d711c
fix: resolve err.md flow bugs, seed rbac, fix photo upload, and clean…
logusivam Jul 19, 2026
8644be1
fix: skip session check if not authenticated or loading to prevent re…
logusivam Jul 19, 2026
e3fe6bf
fix: resolve loop redirects when refresh fails on login/register pages
logusivam Jul 20, 2026
62a92a4
fix: log missing refresh token as debug instead of operational warnin…
logusivam Jul 20, 2026
16b8a84
fix: bypass silent refresh on login/register 401 failures to prevent …
logusivam Jul 20, 2026
65d34ff
fix: resolve profile id, expose primary role, and make password edit …
logusivam Jul 20, 2026
27eee9f
fix: render profile image, fix google oauth state parameters, and con…
logusivam Jul 20, 2026
06f9e0f
fix: enforce strict oldPassword checks and fix mobile sidebar toggles
logusivam Jul 20, 2026
5985aa3
fix: resolve compiler warning and clean up hasState checks in callbac…
logusivam Jul 20, 2026
b7c025a
fix(admin): resolve PATCH role update undefined error & query stats
logusivam Jul 20, 2026
8e35b2b
fix(admin): restrict moderator visibility of admin panel write features
logusivam Jul 20, 2026
b2e289d
fix(admin): customize admin layout and remove overview for moderators
logusivam Jul 20, 2026
fac719f
fix(config): centralize API URL configuration
logusivam Jul 20, 2026
334bba2
fix(config): update logos in navbar, sidebar, footer, and favicon
logusivam Jul 22, 2026
b0a7bc4
feat: add footer and navbar logo SVG assets
logusivam Jul 22, 2026
afb41c9
fix(config): add SEO meta, preloader screen, and JSON-LD markup
logusivam Jul 22, 2026
1f15f44
fix(config): add sitemap.xml, robots.txt, and update SEO keywords
logusivam Jul 22, 2026
d4c9b69
fix(config): stack 5-step strip vertically on mobile screens
logusivam Jul 22, 2026
984ad52
fix(config): add vertical dashed connector line in mobile timeline
logusivam Jul 22, 2026
09e67f4
fix(config): add missing visual layout sections to LandingPage
logusivam Jul 22, 2026
feab590
fix(config): highlight code snippet and route CTA by auth state
logusivam Jul 22, 2026
3edcf1e
feat: implement base styles and create landing page for authenticatio…
logusivam Jul 22, 2026
997293f
docs(config): add templates, spec documents, and configure action wor…
logusivam Jul 30, 2026
1102265
fix(config): configure legacy peer dependencies fallback
logusivam Jul 30, 2026
7d1eee3
fix(config): conditionally install husky during prepare script
logusivam Jul 30, 2026
9e9bc30
feat: initialize TypeScript configuration for api app
logusivam Jul 30, 2026
2581837
fix(config): move type definitions to production dependencies
logusivam Jul 30, 2026
3c050d4
fix(config): link shared workspace types dependency
logusivam Jul 30, 2026
dfa92c7
fix(config): resolve tsconfig path aliases at runtime
logusivam Jul 30, 2026
aa8e4dd
fix(config): update relative module alias target directory
logusivam Jul 30, 2026
27f7df8
fix(config): register path aliases programmatically
logusivam Jul 30, 2026
d38ce93
fix(config): update module-alias import namespace syntax
logusivam Jul 30, 2026
b88d849
fix(config): synchronize package-lock for module-alias
logusivam Jul 30, 2026
2d5a903
fix(config): set strictNullChecks for ESLint alignment
logusivam Jul 30, 2026
e18f1be
feat: initialize API workspace with express, mongoose, and core depen…
logusivam Jul 30, 2026
abf8b45
Potential fix for pull request finding 'CodeQL / Missing rate limiting'
logusivam Jul 30, 2026
09e2ef9
Potential fix for pull request finding 'CodeQL / Missing rate limiting'
logusivam Jul 30, 2026
7782f58
Potential fix for pull request finding 'CodeQL / Database query built…
logusivam Jul 30, 2026
d65b0a2
Potential fix for pull request finding 'CodeQL / Missing rate limiting'
logusivam Jul 30, 2026
6a828ca
Potential fix for pull request finding 'CodeQL / Missing rate limiting'
logusivam Jul 30, 2026
6f661a8
Potential fix for pull request finding 'CodeQL / Missing rate limiting'
logusivam Jul 30, 2026
3166cd4
fix: resolve CI errors and fix test suites
logusivam Jul 30, 2026
60b0125
Merge branch 'dev' of https://github.com/logusivam/tokenforge into dev
logusivam Jul 30, 2026
d32857e
fix(deps): restore modern eslint-plugin-import to fix flat config val…
logusivam Jul 31, 2026
032a374
fix(deps): upgrade vitest to v4 to match coverage-v8 v4 API
logusivam Jul 31, 2026
8315317
fix(ci): allow brace-expansion GHSA and remove global coverage flag
logusivam Jul 31, 2026
809f1bd
fix(ci): restore coverage flag and lower API thresholds for todo tests
logusivam Jul 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Force LF line endings for all text files — prevents CRLF issues on Windows dev machines
* text=auto eol=lf

# Explicitly LF
*.ts text eol=lf
*.tsx text eol=lf
*.js text eol=lf
*.mjs text eol=lf
*.json text eol=lf
*.md text eol=lf
*.yml text eol=lf
*.yaml text eol=lf
*.env* text eol=lf
*.sh text eol=lf

# Binary — never diff or merge
*.png binary
*.jpg binary
*.ico binary
*.woff2 binary
*.pdf binary
*.pem binary

# PEM key files — never show in diffs (sensitive)
*.pem diff=nodiff

# Linguist — tell GitHub what this repo is
*.ts linguist-language=TypeScript
*.tsx linguist-language=TypeScript

# Collapse generated/vendored files in GitHub diffs
CHANGELOG.md linguist-generated=true
package-lock.json linguist-generated=true
22 changes: 22 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Global fallback — all files require review from a core maintainer
* @logusivam

# Backend auth module — security-critical, requires security review
apps/api/src/modules/auth/ @logusivam
apps/api/src/modules/token/ @logusivam
apps/api/src/modules/oauth/ @logusivam
apps/api/src/middleware/ @logusivam

# RBAC — permission model changes require admin sign-off
apps/api/src/modules/rbac/ @logusivam

# CI/CD workflows — pipeline changes require maintainer approval
.github/workflows/ @logusivam

# Shared types — breaking change risk
packages/types/ @logusivam

# Environment + deployment config
apps/api/.env.example @logusivam
apps/web/.env.example @logusivam
docker-compose*.yml @logusivam
4 changes: 4 additions & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
github: [logusivam]
patreon: logusivam
ko_fi: logusivam
custom: ['https://loganathangp-dev-portfolio.vercel.app']
63 changes: 63 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: Bug Report
description: Report a bug or unexpected behaviour in TokenForge
title: "[BUG] "
labels: ["bug", "triage"]
body:
- type: markdown
attributes:
value: |
Thank you for reporting a bug. Please fill in all fields — incomplete reports will be closed.

- type: dropdown
id: area
attributes:
label: Affected Area
options:
- Authentication (login / register)
- Token Refresh / Rotation
- OAuth2 (Google / GitHub)
- RBAC / Permissions
- Admin Panel
- Frontend / UI
- CI / CD / Deployment
- Documentation
validations:
required: true

- type: textarea
id: description
attributes:
label: Bug Description
placeholder: What happened? What did you expect to happen?
validations:
required: true

- type: textarea
id: steps
attributes:
label: Steps to Reproduce
placeholder: |
1. POST /api/v1/auth/login with ...
2. Then POST /api/v1/auth/refresh ...
3. Observe ...
validations:
required: true

- type: textarea
id: environment
attributes:
label: Environment
placeholder: |
Node.js version:
OS:
Browser (if frontend):
Deployment: local / Railway / other
validations:
required: true

- type: checkboxes
id: security
attributes:
label: Security Impact
options:
- label: This bug has a security implication (token bypass, privilege escalation, data leak)
47 changes: 47 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Feature Request
description: Propose a new feature, enhancement, or visual element for TokenForge
title: '[FEATURE] '
labels: ['enhancement', 'triage']
body:
- type: markdown
attributes:
value: |
Thank you for suggesting a feature! Please provide details to help us evaluate the request.

- type: textarea
id: problem
attributes:
label: Problem Statement
description: Is your feature request related to a problem or limitation?
placeholder: A clear and concise description of what the problem is. e.g., I'm frustrated when...
validations:
required: true

- type: textarea
id: solution
attributes:
label: Proposed Solution
description: Provide a clear description of what you want to happen.
placeholder: A clear and concise description of the feature or enhancement you want added.
validations:
required: true

- type: textarea
id: alternatives
attributes:
label: Alternatives Considered
description: Describe any alternative solutions or workarounds you have considered.
placeholder: A description of alternative behaviors or API structures you've thought about.
validations:
required: false

- type: checkboxes
id: scope
attributes:
label: Affected Component Scopes
description: Select the parts of the codebase this change would affect.
options:
- label: '@tokenforge/api (Backend API endpoints, database schemas)'
- label: '@tokenforge/web (Frontend React UI components, states)'
- label: CI/CD Workflows / Docker configs
- label: Documentation
23 changes: 23 additions & 0 deletions .github/ISSUE_TEMPLATE/security_vulnerability.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Security Vulnerability
description: >
STOP — do not file a public issue for security vulnerabilities.
Please email devbridgeenquirz@gmail.com or use GitHub's private
vulnerability reporting (Security → Report a vulnerability).
title: '[SECURITY] Use private reporting — see description'
labels: ['invalid']
body:
- type: markdown
attributes:
value: |
## ⚠️ Do NOT report security vulnerabilities here

Public issues are visible to everyone, including potential attackers.

**To report a security vulnerability:**
1. Go to the **Security** tab of this repository
2. Click **"Report a vulnerability"** (GitHub private reporting)
3. Or email **devbridgeenquirz@gmail.com**

We will respond within 48 hours and coordinate a responsible disclosure.

See [SECURITY.md](../../SECURITY.md) for our full disclosure policy.
47 changes: 47 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
## Summary

<!-- One paragraph: what does this PR do and why? -->

## Type of Change

- [ ] Bug fix (non-breaking)
- [ ] New feature (non-breaking)
- [ ] Breaking change (requires version bump + CHANGELOG entry)
- [ ] Refactor (no behaviour change)
- [ ] Documentation update
- [ ] CI / tooling change

## Security Checklist

<!-- Required for any change touching auth, token, oauth, rbac, or middleware -->

- [ ] No secrets, API keys, or credentials added to source
- [ ] Input validation added/updated for new endpoints
- [ ] RBAC permissions verified for new/changed routes
- [ ] Rate limiting considered for new public endpoints
- [ ] Audit log event added for new auth actions
- [ ] Cookie options unchanged (httpOnly, Secure, SameSite)
- [ ] No token data exposed in URLs, logs, or response bodies

## Testing

- [ ] Unit tests added / updated
- [ ] Integration tests added / updated
- [ ] All existing tests pass (`npm test`)
- [ ] Coverage threshold maintained (≥80%)

## Documentation

- [ ] JSDoc added for public functions / classes
- [ ] `docs/api-reference.md` updated if endpoints changed
- [ ] `docs/rbac-model.md` updated if permissions changed
- [ ] `CHANGELOG.md` entry added (or handled by semantic-release)
- [ ] `.env.example` updated if new env vars added

## Linked Issues

Closes #<!-- issue number -->

## Screenshots / Logs (if UI or behaviour change)

<!-- Paste relevant logs, screenshots, or curl examples -->
96 changes: 96 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
name: CI

on:
push:
branches: [main, dev]
pull_request:
branches: [main, dev]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true # Cancel stale runs on new pushes

jobs:
lint:
name: Lint & Type Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
- run: npm ci
- run: npx turbo run lint
- run: npx tsc --noEmit --project apps/api/tsconfig.json
- run: npx tsc --noEmit --project apps/web/tsconfig.json

test:
name: Unit + Integration Tests
runs-on: ubuntu-latest
needs: lint
services:
mongodb:
image: mongo:8
ports: ['27017:27017']
redis:
image: redis:7-alpine
ports: ['6379:6379']
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
env:
NODE_ENV: test
MONGO_URI: ${{ secrets.MONGO_URI_TEST }}
REDIS_URL: ${{ secrets.REDIS_URL_TEST }}
JWT_PRIVATE_KEY: ${{ secrets.JWT_PRIVATE_KEY_TEST }}
JWT_PUBLIC_KEY: ${{ secrets.JWT_PUBLIC_KEY_TEST }}
JWT_ACCESS_EXPIRY: 15m
JWT_REFRESH_EXPIRY: 7d
COOKIE_SECRET: ${{ secrets.COOKIE_SECRET_TEST }}
CLIENT_URL: https://tokenforge-dev.vercel.app
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
- run: npm ci
- run: npx turbo run test -- --coverage
- uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true

build:
name: Build
runs-on: ubuntu-latest
needs: test
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
- run: npm ci
- run: npx turbo run build

deploy:
name: Deploy
runs-on: ubuntu-latest
needs: build
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
steps:
- uses: actions/checkout@v4
- name: Deploy API → Render
run: |
curl -f -X POST "${{ secrets.RENDER_DEPLOY_HOOK_URL }}"
- name: Deploy Web → Vercel
uses: amondnet/vercel-action@v25
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
vercel-args: '--prod'
26 changes: 26 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: CodeQL SAST

on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: '0 2 * * 1' # Weekly Monday 2am scan

jobs:
analyze:
name: Analyze TypeScript
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
steps:
- uses: actions/checkout@v4
- uses: github/codeql-action/init@v3
with:
languages: typescript
queries: security-extended # Broader security query suite
- uses: github/codeql-action/autobuild@v3
- uses: github/codeql-action/analyze@v3
22 changes: 22 additions & 0 deletions .github/workflows/dependency-review.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: Dependency Review

on:
pull_request:
branches: [main, dev]

jobs:
dependency-review:
name: Block HIGH/CRITICAL CVE Dependencies
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/dependency-review-action@v4
with:
fail-on-severity: high # Block high + critical CVEs
deny-licenses: GPL-2.0, GPL-3.0 # Block copyleft licenses
# GHSA-qwww-vcr4-c8h2: react-router RSC Mode CSRF — only affects SSR/RSC apps.
# This project is a Vite client-side app (no SSR/RSC), so this CVE is not exploitable.
# react-router-dom has no v8.x release; no non-breaking fix exists in the 7.x line.
# GHSA-mh99-v99m-4gvg: brace-expansion DoS — in transitive build-tooling deps only,
# not reachable from production server code; no non-breaking fix available in 1.x line.
allow-ghsas: GHSA-qwww-vcr4-c8h2,GHSA-mh99-v99m-4gvg
Loading
Loading