尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Site d'investissement boursier - Analyse fondamentale & de valorisation pour repérer les meilleures actions parmi les plus de 6 000 couvertes
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Application web d'analyse fondamentale d'actions (style Interactive Brokers, theme clair). • 25 critères de quality investing : 10 chiffrés (calculés depuis Finnhub) + 14 qualitatifs (GPT) + 1 valorisation DCF • Watchlist persistante avec P/FCF et score chiffres en temps réel • News filtrées des 60 derniers jours • Cache qualitatif 30 jours (1 appel GPT par ticker)查看完整 README ↗
Application web d'analyse fondamentale d'actions (style Interactive Brokers, theme clair).
lubin-investment/
├── apps/
│ ├── web/ # React frontend (port 5173)
│ └── api/ # Express backend (port 3001)
├── packages/
│ └── shared/ # Types TS partagés
├── cron/ # (Phase 4 — jobs schedulés)
├── docker-compose.yml # Postgres local
├── .env.example
└── pnpm-workspace.yaml
corepack enable && corepack prepare pnpm@latest --activate)cd lubin-investment
pnpm install
cp .env.example .env
# Édite .env et remplis OPENAI_API_KEY, FINNHUB_API_KEY, FMP_API_KEY (optionnel)
pnpm db:up # docker compose up postgres en arrière-plan
pnpm db:migrate # crée les tables (WatchlistEntry, QualitativeCache)
pnpm dev # lance Vite (web) + Express (api) en parallèle
| Commande | Effet |
|---|---|
pnpm dev | Tout-en-un : auto-start Docker + Postgres puis lance Web + API en parallèle |
pnpm dev:web | Frontend seul (auto-start DB aussi) |
pnpm dev:api | Backend seul (auto-start DB aussi) |
pnpm clean | Tue tous les processus zombies sur ports 3001/5173 (utile après un crash) |
pnpm db:up | Force-start Docker + Postgres (idempotent, safe à appeler) |
pnpm db:down | Arrête Postgres (Docker reste) |
pnpm db:logs | Tail des logs Postgres |
pnpm db:migrate | Applique les migrations Prisma (à faire après chaque modif du schema) |
pnpm db:studio | UI graphique Prisma pour explorer la DB |
pnpm build | Build de tous les packages |
pnpm test | Tests Vitest (33 tests sur l'API) |
Tu peux pnpm dev même si Docker Desktop n'est pas ouvert : le hook predev
(via scripts/ensure-db.sh) :
lubin-postgres si arrêté, le crée si absentpnpm devTu fermes ton Mac, tu reviens demain, pnpm dev → tout repart tout seul.
| Méthode | Route | Effet |
|---|---|---|
| GET | /health | Health-check + check des clés |
| GET | /api/analyze?ticker=MEDP | Analyse complète (chiffres + qualitatif + valo + news) |
| POST | /api/analyze/revalue | Recalcule la valo avec params { ticker, params: ValoParams } |
| POST | /api/analyze/refresh-qual | Force re-fetch GPT pour { ticker } (bypass cache) |
| GET | /api/watchlist | Liste la watchlist |
| POST | /api/watchlist | Ajoute { ticker } |
| DELETE | /api/watchlist/:ticker | Retire |
| POST | /api/watchlist/refresh | Refresh tous les snapshots |
pnpm --filter @lubin/api run test # tests Vitest backend (run unique)
pnpm --filter @lubin/api run test:watch # mode watch
20 tests couvrent :
derivedMetrics : calculs purs (10 critères chiffrés + valuation DCF)filterNews : whitelist Bettin / blacklist clickbaitretry : retry exponentiel sur 429/5xx, abandon sur 4xx/health, /api/analyze (validation 400, 404)| Scope | Limite | Réponse si dépassé |
|---|---|---|
/api/* (global) | 100 req/min/IP | 429 |
/api/analyze* | 10 req/min/IP | 429 |
/api/watchlist POST/DELETE | 30 req/min/IP | 429 |
| Finnhub (outbound) | 50 req/min, concurrence 5 | queue interne |
| OpenAI (outbound) | 60 req/min, concurrence 3 | queue interne |
| FMP (outbound) | 30 req/min, concurrence 3 | queue interne |
Sur appels Finnhub/FMP/OpenAI :
fetchWithRetry)Optionnel — défini par les vars d'env :
SENTRY_DSN (backend)VITE_SENTRY_DSN (frontend)Si vide, désactivé (logs [sentry] désactivé au boot).
<ErrorBoundary> capture les erreurs React, propose recharger/réessayer<ToastProvider> + useToast() pour notifs non-bloquantesapi.ts typé : ApiError avec status + retriable + bouton "Réessayer" auto-affichéLe code est prêt pour la prod sans modification : il suffit de remplacer le Postgres local par un Neon cloud le jour où tu veux déployer.
lubin-investment, région eu-central-1.env :
DATABASE_URL="postgresql://user:[email protected]/neondb?sslmode=require"
pnpm db:migrate
Le code Prisma + Express + React est exactement le même, c'est juste l'URL de la DB qui change.