diff --git a/AGENTS.md b/AGENTS.md index c7c1392..b2df5af 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,123 +1,62 @@ -# PROJECT KNOWLEDGE BASE +# AGENTS -**Generated:** Tue Mar 24 2026 -**Commit:** 8ebde9d -**Branch:** main -**Tag:** 2.1.9-rc10 +FLVX — traffic forwarding panel: Go admin API + Vite/React UI + Go agent. -## OVERVIEW -FLVX (formerly Flux Panel) is a traffic forwarding management system built on a forked GOST v3 stack. It ships as a Go-based admin API (SQLite/PostgreSQL) + Vite/React UI + Go forwarding agent, with optional mobile WebView wrappers. +## Structure -## STRUCTURE -``` -./ -├── go-gost/ # Go forwarding agent (forked gost + local x/) -│ └── x/ # Local fork of github.com/go-gost/x (replace => ./x) -├── go-backend/ # Go Admin API (GORM + SQLite/PostgreSQL, net/http) -│ └── tests/contract/ # Integration/contract tests -├── vite-frontend/ # React/Vite dashboard (shadcn bridge + Tailwind v4) -│ └── src/shadcn-bridge/heroui/ # HeroUI-compatible facade -├── docker-compose-v4.yml # Panel deploy (IPv4-only bridge) -├── docker-compose-v6.yml # Panel deploy (IPv6-enabled bridge) -├── panel_install.sh # Panel installer/upgrader (downloads compose) -├── install.sh # Node installer/upgrader (downloads gost binary) -└── .github/workflows/ # CI: build/test + Docker push + release artifacts -``` +| Dir | Role | Entry | +|-----|------|-------| +| `go-backend/` | Admin API (GORM + SQLite/PG, net/http) | `cmd/paneld/main.go` | +| `go-gost/` | Forwarding agent (forked GOST) | `main.go` | +| `go-gost/x/` | Protocol handlers/dialers/listeners (own module) | — | +| `vite-frontend/` | React dashboard (shadcn bridge + Tailwind v4) | `src/App.tsx` | -## WHERE TO LOOK -| Task | Location | Notes | -|------|----------|-------| -| **Deploy (Docker)** | `docker-compose-v4.yml` | Env: `JWT_SECRET`, `BACKEND_PORT`, `FRONTEND_PORT` | -| **Deploy (IPv6)** | `docker-compose-v6.yml` | Same as v4 + IPv6-enabled bridge | -| **Panel install** | `panel_install.sh` | Picks v4/v6, generates `JWT_SECRET`, downloads compose | -| **Node install** | `install.sh` | Installs `/etc/flux_agent/flux_agent` + writes `config.json`/`gost.json` + systemd `flux_agent.service` | -| **Admin API** | `go-backend/` | Go Admin API (SQLite/PostgreSQL) | -| **Web UI** | `vite-frontend/` | React/Vite dashboard (shadcn bridge + Tailwind v4) | -| **UI Compatibility** | `vite-frontend/src/shadcn-bridge/heroui/` | HeroUI-compatible API wrappers backed by shadcn/radix | -| **Theme Tokens** | `vite-frontend/src/styles/tailwind-theme.pcss` | Tailwind v4 `@theme inline` semantic color mapping | -| **Go Agent** | `go-gost/` | Forwarding agent (forked gost + local x/) | -| **Go Core** | `go-gost/x/` | Handlers/listeners/dialers + management API | -| **Repository Layer** | `go-backend/internal/store/repo/` | GORM data access (repository.go 83k LOC) | -| **Contract Tests** | `go-backend/tests/contract/` | Integration tests for auth, federation, tunnels | -| **CI Workflows** | `.github/workflows/` | ci-build.yml, docker-build.yml, deploy-docs.yml | +`go-gost/go.mod` uses `replace github.com/go-gost/x => ./x`. -## CODE MAP -| Symbol | Type | Location | Role | -|--------|------|----------|------| -| `flvx` | Project | `.` | Root directory | -| `main` | Func | `go-backend/cmd/paneld/main.go` | Backend Entry | -| `App` | Component | `vite-frontend/src/App.tsx` | Frontend Entry | -| `main` | Func | `go-gost/main.go` | Agent Entry | -| `Repository` | Struct | `go-backend/internal/store/repo/repository.go` | Data Access Layer | -| `Handler` | Struct | `go-backend/internal/http/handler/handler.go` | HTTP Handlers | -| `websocket_reporter` | Func | `go-gost/x/socket/websocket_reporter.go` | Panel Telemetry | +## Commands -## CONVENTIONS -- **Skills & MCP**: Always prefer using available skills (via `skill` tool) and MCP tools when applicable. Check for relevant skills before implementing from scratch. -- **Auth**: `Authorization` header carries the raw JWT token (no `Bearer` prefix) between `vite-frontend/` and `go-backend/`. -- **Module Fork**: `go-gost/` uses `replace github.com/go-gost/x => ./x` and `go-gost/x/` is also its own Go module. -- **Encryption**: Agent-to-panel communication uses AES encryption with node `secret` as PSK. -- **API Envelope**: All REST responses follow `{code, msg, data, ts}` structure (code 0 = success). -- **Frontend UI Layer**: Import UI primitives from `src/shadcn-bridge/heroui/*` (legacy-compatible facade), not direct `@heroui/*` packages. -- **Tailwind v4 Semantic Colors**: `src/styles/globals.css` must import `src/styles/tailwind-theme.pcss`; removing it breaks semantic classes like `bg-primary`, `text-foreground`, and `border-input`. -- **Go Versions**: `go-backend` uses Go 1.24, `go-gost` uses Go 1.23, `go-gost/x` uses Go 1.22. - -## ANTI-PATTERNS (THIS PROJECT) -- **DO NOT EDIT** generated protobuf output: `go-gost/x/internal/util/grpc/proto/*.pb.go`, `go-gost/x/internal/util/grpc/proto/*_grpc.pb.go`. -- **DO NOT ADD** `Bearer` prefix to Authorization header - expects raw JWT token. -- **DO NOT MODIFY** `install.sh` or `panel_install.sh` locally - CI overwrites these on release. -- **DO NOT** let backend handlers call `repo.DB()` directly — add a Repository method instead. -- **DO NOT ADD** frontend tests - project has no test infrastructure (Vitest/Jest not configured). -- **DO NOT REINTRODUCE** `@heroui/*` or `@nextui-org/*` dependencies; migration is now shadcn bridge-based. -- **DO NOT** use `type:jsonb` or `type:serial` in GORM tags (SQLite incompatible). -- **DO NOT** omit `TableName()` on new models — GORM pluralizes by default. - -## COMMANDS ```bash -# Panel (Docker) -docker compose -f docker-compose-v4.yml up -d -docker compose -f docker-compose-v6.yml up -d - -# Release-based install scripts -./panel_install.sh -./install.sh - -# Local dev (per subproject) +# Backend +(cd go-backend && go run ./cmd/paneld) # SERVER_ADDR defaults to :6365 (cd go-backend && make build) -(cd vite-frontend && npm run dev) -(cd go-gost && go run .) - -# Testing (cd go-backend && go test ./...) -(cd go-backend && go test ./tests/contract/...) + +# Frontend +(cd vite-frontend && npm install --legacy-peer-deps) +(cd vite-frontend && npm run dev) # host 0.0.0.0:3000 +(cd vite-frontend && npm run build) # tsc && vite build +(cd vite-frontend && npm run lint) # eslint --fix (no typecheck command) + +# Agent +(cd go-gost && go run .) ``` -## UNIQUE STYLES -- **Flat Monorepo**: Language-prefixed dirs (`go-backend`, `go-gost`, `vite-frontend`) instead of `apps/`/`libs/`. -- **Asymmetric Go Layout**: `go-backend` follows `cmd//main.go` while `go-gost` uses `root/main.go`. -- **Frontend Hybrid Mode**: `App.tsx` detects "H5 mode" (mobile WebView) vs desktop, dictating layout strategy. -- **Experimental Bundler**: `vite-frontend` uses `rolldown-vite` (Rust-based) instead of standard Vite. -- **Non-minified Builds**: `vite.config.ts` sets `minify: false`, `treeshake: false` for debugging. +## Conventions -## NOTES -- LSP servers are not installed in this environment (gopls/typescript-language-server); rely on grep-based navigation. -- `vite-frontend/vite.config.ts` sets `minify: false` and disables treeshake; expect larger bundles. -- `vite-frontend` uses `rolldown-vite` (experimental Rust bundler) instead of standard Vite. -- Install scripts (`install.sh`, `panel_install.sh`) self-delete after execution - common pattern in one-liner installs. -- CI uses UPX compression (`--best --lzma`) on Go binaries before release. -- CI dynamically injects `PINNED_VERSION` into install scripts and docker-compose files during releases. -- `panel_install.sh` auto-detects IPv6 and modifies `/etc/docker/daemon.json` to enable IPv6 bridge. -- Download proxy `https://gcode.hostcentral.cc/` used for GitHub downloads in China/restricted environments. -- Backend has contract tests in `go-backend/tests/contract/` - frontend has no test infrastructure. -- `analysis/3x-ui/` contains a separate git repo for reference/comparison - not part of FLVX core. -- CI workflows: `ci-build.yml` (build check), `docker-build.yml` (multi-arch images + release), `deploy-docs.yml` (MkDocs). -- PostgreSQL migration supported via `panel_install.sh` menu option using pgloader. -- Repository layer is large: `repository.go` (83k LOC), `repository_mutations.go` (43k LOC). -- Button visual parity relies on `vite-frontend/src/shadcn-bridge/heroui/button.tsx` color mapping + `vite-frontend/src/styles/tailwind-theme.pcss` token export. +- **Auth**: raw JWT in `Authorization` header — **no `Bearer` prefix** (both frontend and backend). +- **API envelope**: all responses `{code, msg, data, ts}` (code 0 = success). +- **Frontend UI**: import from `src/shadcn-bridge/heroui/*`, never `@heroui/*` or `@nextui-org/*`. +- **Tailwind theme**: `globals.css` must import `tailwind-theme.pcss` or semantic classes break. +- **Backend DB**: handlers use Repository methods, never `repo.DB()` directly. +- **GORM models**: always define `TableName()` (GORM pluralizes by default). +- **GORM tags**: no `type:jsonb` or `type:serial` (SQLite incompatible). +- **Go versions**: `go.mod` says 1.25.0 for all three modules; CI builds with 1.23. -## PLAN DOCUMENT RULE -- Every new implementation plan must have a dedicated Markdown plan document. -- Store plan documents under `plans/`. -- Use an incrementing numeric prefix and a short plan-summary name: `NNN-.md` (for example, `001-auth-refactor.md`, `002-federation-api-cleanup.md`). -- The numeric prefix must increase by 1 for each new plan. -- In each plan document, keep a task checklist and mark each task as completed immediately after finishing it. +## Anti-patterns + +- Don't edit `install.sh` or `panel_install.sh` locally (CI overwrites on release). +- Don't edit `go-gost/x/internal/util/grpc/proto/*.pb.go` (generated). +- Don't add frontend tests (no Vitest/Jest configured). +- Don't reintroduce `@heroui/*` or `@nextui-org/*` packages. + +## Testing + +- Backend: `(cd go-backend && go test ./...)` — includes contract tests in `tests/contract/`. +- Frontend: no test infrastructure. +- CI runs one PostgreSQL contract test: env var `FLVX_POSTGRES_TEST_DSN`. + +## Build quirks + +- `vite-frontend` uses `rolldown-vite` (Rust bundler), not standard Vite. +- `vite.config.ts`: `minify: false`, `treeshake: false` (debugging mode). +- CI builds `go-gost` with `CGO_ENABLED=0` then compresses with UPX `--best --lzma`. diff --git a/go-backend/AGENTS.md b/go-backend/AGENTS.md index 8425da5..ab914be 100644 --- a/go-backend/AGENTS.md +++ b/go-backend/AGENTS.md @@ -1,72 +1,38 @@ -# GO BACKEND KNOWLEDGE BASE +# go-backend -**Generated:** Fri Mar 20 2026 -**Commit:** f45f960 -**Branch:** main -**Tag:** 2.1.9-beta6 +Admin API for FLVX. Go + net/http + GORM (SQLite/PostgreSQL). -## OVERVIEW -Go-based Admin API for FLVX. Replaced legacy Spring Boot backend. -**Stack:** Go 1.24, net/http (std lib), GORM + SQLite/PostgreSQL (glebarez/sqlite - CGO-free). +## Structure -## STRUCTURE -``` -go-backend/ -├── cmd/paneld/main.go # Entry point; starts HTTP server + WebSocket -├── internal/ -│ ├── http/ # HTTP layer -│ │ ├── router.go # Routes (NewServeMux) + Middleware chain -│ │ ├── handler/ # API Handlers (User, Tunnel, Node, etc.) -│ │ ├── middleware/ # JWT, CORS, Logging, Recover -│ │ └── response/ # JSON response helpers -│ ├── store/ -│ │ ├── model/model.go # GORM model structs (single source of truth) -│ │ └── repo/ # Data Access Layer (Repository pattern, GORM) -│ │ ├── repository.go # Core queries, Open/OpenPostgres, AutoMigrate (83k LOC) -│ │ ├── repository_mutations.go # Mutation helpers (user/node/tunnel/forward CRUD, 43k LOC) -│ │ ├── repository_federation.go # Federation-specific queries -│ │ ├── repository_flow.go # Flow/forward status queries -│ │ ├── repository_control.go # Control plane queries -│ │ └── repository_groups.go # Group management queries -│ └── auth/ # Auth logic -├── tests/contract/ # Integration/contract tests (14 tests) -├── Dockerfile # Multi-stage build (golang:1.24-bookworm → debian:bookworm-slim) -└── Makefile # Build commands -``` +| Dir | Role | +|-----|------| +| `cmd/paneld/main.go` | Entry point, HTTP server + WebSocket | +| `internal/http/router.go` | Route registration (`http.ServeMux`) + middleware chain | +| `internal/http/handler/` | API handlers | +| `internal/http/middleware/` | JWT, CORS, logging, recover | +| `internal/http/response/` | JSON envelope helpers | +| `internal/store/model/model.go` | All GORM models (single file) | +| `internal/store/repo/` | Repository layer (never access DB directly) | +| `internal/auth/` | Auth logic | +| `tests/contract/` | Integration tests | -## WHERE TO LOOK -| Task | Location | Notes | -|------|----------|-------| -| **API Routes** | `go-backend/internal/http/router.go` | Registers handlers to `http.ServeMux` | -| **DB Models** | `go-backend/internal/store/model/model.go` | GORM structs with `TableName()` methods | -| **Repository** | `go-backend/internal/store/repo/` | GORM-based queries, all DB ops encapsulated | -| **Auth Middleware** | `go-backend/internal/http/middleware/jwt.go` | Extracts `Authorization` header | -| **WebSocket** | `go-backend/internal/ws/` | Real-time updates (traffic, status) | -| **Contract Tests** | `go-backend/tests/contract/` | Integration tests for auth, federation, tunnels | +## Conventions -## CONVENTIONS -- **GORM ORM**: Uses GORM with `glebarez/sqlite` (CGO-free) and `gorm.io/driver/postgres`. -- **AutoMigrate**: Schema created at startup via `autoMigrateAll()` — no hand-written DDL. -- **TableName()**: All models define explicit `TableName()` returning singular snake_case names. -- **Repository Pattern**: Handlers never access `*gorm.DB` directly — all queries go through `repo.Repository` methods. -- **Standard Lib**: Uses `net/http` for routing (Go 1.22+ patterns). -- **Auth**: Expects raw JWT in `Authorization` header (no `Bearer` prefix). -- **API Envelope**: All responses use `response.R{code, msg, data, ts}` structure. -- **Config**: Loaded from environment variables (see `cmd/paneld/main.go`). -- **SQLite Constraints**: `MaxOpenConns(1)`, WAL mode, busy_timeout=5000. -- **PostgreSQL**: Supported via `DB_TYPE=postgres` and `DATABASE_URL` env vars. +- **Auth**: raw JWT in `Authorization` header — no `Bearer` prefix. +- **API envelope**: `{code, msg, data, ts}`, code 0 = success. +- **Repository pattern**: handlers call repo methods, never `repo.DB()` directly. +- **GORM**: `TableName()` on every model (GORM pluralizes by default). +- **GORM tags**: no `type:jsonb` or `type:serial` (SQLite incompatible). +- **SQLite**: `MaxOpenConns(1)`, WAL mode, `busy_timeout=5000`. +- **Schema**: created via `autoMigrateAll()` at startup, no hand-written DDL. +- **PostgreSQL**: set `DB_TYPE=postgres` and `DATABASE_URL` env vars. +- **Config**: all from environment variables. -## ANTI-PATTERNS -- **DO NOT** let handlers call `repo.DB()` directly — add a Repository method instead. -- **DO NOT CHANGE** handler signatures without updating `router.go`. -- **DO NOT** use `type:jsonb` or `type:serial` in GORM tags (SQLite incompatible). -- **DO NOT** omit `TableName()` on new models — GORM pluralizes by default. +## Commands -## COMMANDS ```bash -cd go-backend -go run ./cmd/paneld # Default: SERVER_ADDR=:6365 -go test ./... # Unit tests -go test ./tests/contract/... # Contract tests +go run ./cmd/paneld # SERVER_ADDR defaults to :6365 make build +go test ./... # includes contract tests +go test ./tests/contract/... # contract tests only ``` diff --git a/go-gost/AGENTS.md b/go-gost/AGENTS.md index e881dfa..1510442 100644 --- a/go-gost/AGENTS.md +++ b/go-gost/AGENTS.md @@ -1,46 +1,30 @@ -# GO-GOST SERVICE KNOWLEDGE BASE +# go-gost -**Generated:** Fri Mar 20 2026 -**Commit:** f45f960 -**Branch:** main -**Tag:** 2.1.9-beta6 +Forwarding agent (forked GOST v3). Uses local `x/` module via `replace github.com/go-gost/x => ./x`. -## OVERVIEW -Forwarding agent built on GOST v3 with a local fork of `github.com/go-gost/x` under `x/`. -**Stack:** Go 1.23, github.com/go-gost/core v0.3.1, local `go-gost/x` module. +## Structure -## STRUCTURE -``` -go-gost/ -├── main.go # Entry; reads panel config.json; starts svc.Run(program) -├── config.go # Panel config.json loader (addr/secret + ports) -├── program.go # GOST runtime: parse config, run/reload services -├── x/ # Local fork of github.com/go-gost/x (has its own go.mod) -└── go.mod # replace github.com/go-gost/x => ./x -``` +| File | Role | +|------|------| +| `main.go` | Entry point, reads `config.json`, starts reporter + service | +| `config.go` | Panel integration config loader (addr, secret, ports) | +| `program.go` | GOST runtime: parse config, run/reload services (SIGHUP) | +| `x/` | Local fork of `github.com/go-gost/x` (own `go.mod`) | -## WHERE TO LOOK -| Task | Location | Notes | -|------|----------|-------| -| **Panel integration config** | `go-gost/config.go` | Expects `config.json` in cwd by default | -| **Service lifecycle/reload** | `go-gost/program.go` | Parses config; handles SIGHUP reload | -| **WebSocket reporting** | `go-gost/main.go` | Starts reporter + sets HTTP report URL | -| **Protocol behaviors** | `go-gost/x/` | Handlers/listeners/dialers live here | -| **Build** | `go-gost/Makefile` | Cross-compile targets for amd64/arm64 | +## Conventions -## CONVENTIONS -- Two configs exist: panel integration uses `config.json`; forwarding services use GOST config (defaults to `gost.{json,yaml}` via viper search paths). -- `go-gost/x/` is the primary extension surface; avoid editing vendored deps. -- Agent communicates with panel via WebSocket (real-time commands) + HTTP (batch traffic reports). +- Two config files: panel integration uses `config.json`; forwarding uses GOST config (`gost.{json,yaml}`). +- `x/` is the extension surface — add handlers/listeners/dialers there, not in vendored deps. +- Agent→panel: WebSocket (real-time commands) + HTTP (batch traffic reports). - All panel communication uses AES encryption with node `secret` as PSK. -- CI builds with `CGO_ENABLED=0` for static binaries, then compresses with UPX. -## ANTI-PATTERNS -- **DO NOT EDIT** generated protobuf in `x/internal/util/grpc/proto/`. +## Anti-patterns + +- Don't edit `x/internal/util/grpc/proto/*.pb.go` (generated protobuf). + +## Commands -## COMMANDS ```bash -cd go-gost go run . go test ./... go build . diff --git a/go-gost/x/AGENTS.md b/go-gost/x/AGENTS.md index 66762cd..e3bcd38 100644 --- a/go-gost/x/AGENTS.md +++ b/go-gost/x/AGENTS.md @@ -1,50 +1,35 @@ -# GO-GOST/X KNOWLEDGE BASE +# go-gost/x -**Generated:** Fri Mar 20 2026 -**Commit:** f45f960 -**Branch:** main -**Tag:** 2.1.9-beta6 +Local fork of `github.com/go-gost/x`. Standalone Go module, used by `go-gost/` via `replace => ./x`. -## OVERVIEW -Local fork of `github.com/go-gost/x` used by `go-gost/` via `replace github.com/go-gost/x => ./x`. Most protocol/runtime behavior changes happen here. 30+ top-level packages - framework-style layout. +## Key packages -## STRUCTURE -``` -go-gost/x/ -├── api/ # Gin management API + embedded swagger docs (22 files) -├── config/ # Config model + parsing/load/reload -├── connector/ # Outbound connect implementations -├── dialer/ # Outbound dialers (tcp/tls/ws/quic/...) -├── handler/ # Protocol handlers (socks/http/tunnel/relay/...) -├── listener/ # Inbound listeners (tcp/udp/tun/tap/redirect/...) -├── limiter/ # Traffic/rate/conn limiters -├── registry/ # Registries for services/handlers/listeners/etc (20 files) -├── service/ # Service wrappers + reporting hooks -├── socket/ # WebSocket reporter / panel integration (6 files) -└── internal/ # Shared internals (grpc proto, net utils, sniffing, tls, ...) -``` +| Dir | Role | +|-----|------| +| `handler/` | Protocol handlers (socks, http, tunnel, relay, ...) | +| `listener/` | Inbound listeners (tcp, udp, tun, tap, redirect, ...) | +| `dialer/` | Outbound dialers (tcp, tls, ws, quic, ...) | +| `connector/` | Outbound connect implementations | +| `service/` | Service wrappers + reporting hooks | +| `socket/` | WebSocket reporter / panel integration | +| `config/` | Config model + parsing/load/reload | +| `registry/` | Component registries (`Register{Type}(name, creator)`) | +| `api/` | Gin management API + embedded swagger docs | +| `limiter/` | Traffic/rate/conn limiters | +| `internal/` | gRPC proto, net utils, sniffing, TLS | -## WHERE TO LOOK -| Task | Location | Notes | -|------|----------|-------| -| **Management API routes/auth** | `go-gost/x/api/api.go` | `/docs`, `/config/*`; BasicAuth + interceptor | -| **Service config parsing** | `go-gost/x/config/parsing/` | Converts config to running services | -| **Add a handler** | `go-gost/x/handler/` | Per-protocol subdirs | -| **Add a listener/dialer** | `go-gost/x/listener/`, `go-gost/x/dialer/` | Transport variants | -| **Panel reporting** | `go-gost/x/socket/` | WebSocket + HTTP report URL hooks | -| **Register new component** | `go-gost/x/registry/` | `Register{Type}(name, creator)` | +## Conventions -## CONVENTIONS -- `go-gost/x/` is a standalone Go module (`go-gost/x/go.mod`); run go tooling from this dir when debugging module resolution. -- Generated gRPC/proto code lives under `go-gost/x/internal/util/grpc/proto/`. -- Handlers/listeners/dialers follow consistent pattern: `{type}.go` + `metadata.go` per protocol. -- OS-specific code uses `name_[os].go` suffix (e.g., `tun_linux.go`, `tun_darwin.go`). +- Each protocol follows `{type}.go` + `metadata.go` pattern. +- OS-specific code uses `name_[os].go` suffix (e.g. `tun_linux.go`). +- Run Go tooling from this directory for module resolution issues. -## ANTI-PATTERNS -- Do not edit generated files in `go-gost/x/internal/util/grpc/proto/` (`*.pb.go`, `*_grpc.pb.go`). +## Anti-patterns + +- Don't edit `internal/util/grpc/proto/*.pb.go` or `*_grpc.pb.go` (generated). + +## Commands -## COMMANDS ```bash -cd go-gost/x go test ./... -``` \ No newline at end of file +``` diff --git a/vite-frontend/AGENTS.md b/vite-frontend/AGENTS.md index b18db80..34f8fb9 100644 --- a/vite-frontend/AGENTS.md +++ b/vite-frontend/AGENTS.md @@ -1,70 +1,40 @@ -# VITE FRONTEND KNOWLEDGE BASE +# vite-frontend -**Generated:** Fri Mar 20 2026 -**Commit:** f45f960 -**Branch:** main -**Tag:** 2.1.9-beta6 +React dashboard for FLVX. rolldown-vite + TypeScript + Tailwind v4 + shadcn/radix. -## OVERVIEW -Web management console for FLVX. -**Stack:** React 18, rolldown-vite, TypeScript, Tailwind CSS v4, shadcn/radix primitives with HeroUI-compatible bridge. +## Structure -## STRUCTURE -``` -vite-frontend/ -├── src/ -│ ├── api/ # Axios wrapper + typed endpoint helpers -│ ├── components/ui/ # shadcn/radix primitive components -│ ├── shadcn-bridge/heroui/ # HeroUI-compatible facade (23 components) -│ ├── pages/ # Route views + page modules (forward/node/tunnel) -│ ├── hooks/ # H5/WebView/mobile hooks -│ ├── styles/ -│ │ ├── globals.css # Base styles + imports tailwind-theme.pcss -│ │ └── tailwind-theme.pcss # Tailwind v4 @theme inline semantic token mapping -│ ├── App.tsx # Routes + ProtectedRoute + H5 layout selection -│ ├── main.tsx # ReactDOM + BrowserRouter + Provider -│ └── provider.tsx # Toast/theme/provider composition -├── components.json # shadcn/ui config -├── tailwind.config.js # Compatibility config for migration scaffolding -├── vite.config.ts # base '/', host 0.0.0.0:3000; minify/treeshake disabled -└── package.json -``` +| Dir/File | Role | +|----------|------| +| `src/App.tsx` | Routes + ProtectedRoute + H5 layout selection | +| `src/main.tsx` | Entry: ReactDOM + BrowserRouter | +| `src/api/` | Axios wrapper, sends raw JWT in `Authorization` | +| `src/pages/` | Route views (forward, node, tunnel, settings, ...) | +| `src/shadcn-bridge/heroui/` | HeroUI-compatible facade — **import from here only** | +| `src/components/ui/` | shadcn/radix primitives | +| `src/styles/globals.css` | Base styles — **must import `tailwind-theme.pcss`** | +| `src/styles/tailwind-theme.pcss` | Tailwind v4 `@theme inline` semantic tokens | +| `vite.config.ts` | host `0.0.0.0:3000`, `minify: false`, `treeshake: false` | -## WHERE TO LOOK -| Task | Location | Notes | -|------|----------|-------| -| **Route definitions** | `src/App.tsx` | React Router v6 + ProtectedRoute | -| **API Client/Auth header** | `src/api/network.ts` | Sends raw JWT in `Authorization` header | -| **Login Flow** | `src/pages/index.tsx` | Calls `login()`, stores `localStorage.token` | -| **Auth helpers** | `src/utils/auth.ts`, `src/utils/jwt.ts` | Role checks + token expiration parsing | -| **UI bridge usage** | `src/shadcn-bridge/heroui/` | Import from bridge, not `@heroui/*` | -| **Button parity mapping** | `src/shadcn-bridge/heroui/button.tsx` | Legacy `color`/`variant` mapped to shadcn classes | -| **Semantic theme tokens** | `src/styles/tailwind-theme.pcss` | Restores classes like `bg-primary`, `border-input` | -| **Theme wiring** | `src/styles/globals.css` | Must import `./tailwind-theme.pcss` | +## Conventions -## CONVENTIONS -- **Auth Header**: Use raw JWT token (no `Bearer` prefix). -- **API Envelope**: Responses follow `{code, msg, data, ts}`. -- **UI Imports**: Use `src/shadcn-bridge/heroui/*` in app pages/layouts for compatibility. -- **Semantic Colors**: Keep `globals.css -> tailwind-theme.pcss` import intact or semantic classes break. -- **Build profile**: `minify: false`, `treeshake: false` for debugging. -- **Layout mode**: H5/mobile mode controlled by existing route/query and hook logic. +- **Auth**: raw JWT in `Authorization` header — no `Bearer` prefix. +- **API envelope**: `{code, msg, data, ts}`, code 0 = success. +- **UI imports**: `src/shadcn-bridge/heroui/*` only, never `@heroui/*` or `@nextui-org/*`. +- **Theme**: don't remove `tailwind-theme.pcss` import from `globals.css` — breaks semantic classes (`bg-primary`, `text-foreground`, `border-input`). -## ANTI-PATTERNS -- **DO NOT ADD** `Bearer` to auth header in frontend requests. -- **DO NOT REINTRODUCE** `@heroui/*` or `@nextui-org/*` dependencies. -- **DO NOT REMOVE** `src/styles/tailwind-theme.pcss` import from `src/styles/globals.css`. -- **DO NOT ADD** frontend tests; no Vitest/Jest setup exists. +## Anti-patterns -## NOTES -- Uses `rolldown-vite` (experimental Rust bundler) instead of standard Vite. -- Build outputs are non-minified (debugging mode). -- No test infrastructure exists (Vitest/Jest not configured). +- Don't add `Bearer` prefix to auth header. +- Don't reintroduce `@heroui/*` or `@nextui-org/*` packages. +- Don't add frontend tests (no test infrastructure). +- Don't remove `tailwind-theme.pcss` import. + +## Commands -## COMMANDS ```bash -cd vite-frontend -npm run dev -npm run build -npm run lint +npm install --legacy-peer-deps +npm run dev # http://0.0.0.0:3000 +npm run build # tsc && vite build +npm run lint # eslint --fix ```