101 Commits

Author SHA1 Message Date
752db2ef1a fix: serialize Decimal as float in API responses and fix transaction field names
All checks were successful
Deploy to Production / deploy (push) Successful in 1m33s
Pydantic v2's model_dump(mode="json") serializes Decimal as strings (e.g.,
"33.33" instead of 33.33), causing frontend crashes when calling .toFixed()
on string values. Introduced FloatDecimal type alias with PlainSerializer
to ensure Decimal fields are serialized as floats in JSON responses.

Also fixed frontend Transaction interface to match backend field names
(created_at → executed_at, transaction_type → tx_type).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:47:48 +09:00
0a8d17a588 fix: use relative paths for postgres data and backups to avoid root permission issues
All checks were successful
Deploy to Production / deploy (push) Successful in 1m58s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:42:23 +09:00
4afd01c947 feat: add data explorer frontend page for viewing collected data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:34:50 +09:00
aa3e2d40d2 feat: add data explorer API for viewing collected stocks/ETFs/prices
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:33:11 +09:00
9fa97e595d feat: rebalance page with manual price input and strategy selection
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:32:49 +09:00
bffca88ce9 feat: add POST /rebalance/calculate endpoint with manual prices
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:30:22 +09:00
8c00359a50 feat: add rebalance calculation with manual prices and additional_buy strategy
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:28:40 +09:00
de77d5b2aa feat: add rebalance calculate schemas and tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:27:47 +09:00
6d7cf340ea feat: add historical data import script from data.txt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:27:36 +09:00
75a408362e fix: use host bind mount for postgres data to prevent data loss on deploy
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:26:55 +09:00
08710a6dba fix: remove nonexistent change column from price collector OHLCV mapping
All checks were successful
Deploy to Production / deploy (push) Successful in 1m10s
pykrx get_market_ohlcv returns 6 data columns (시가/고가/저가/종가/거래량/거래대금),
not 7. The 등락률 (change) column does not exist, causing a length mismatch error.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 23:27:23 +09:00
8b9fe7064c fix: correct pykrx ETF module import path and method call
All checks were successful
Deploy to Production / deploy (push) Successful in 1m42s
The pykrx library uses 'etx' not 'etf' as the module directory name,
and fetch() is the proper method that returns a DataFrame.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 21:27:41 +09:00
4261e9c777 fix: switch StockCollector and ValuationCollector from KRX CSV to pykrx
Some checks failed
Deploy to Production / deploy (push) Failing after 1m37s
KRX CSV download endpoint blocks requests from cloud/server IPs,
causing "No columns to parse from file" errors. Replaced with pykrx's
JSON-based API (get_market_ticker_list, get_market_cap_by_ticker,
get_market_fundamental_by_ticker) which is more reliable.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 23:08:50 +09:00
ecb3dca571 feat: add ETF data collectors and admin API endpoints
Add ETFCollector (KRX master data) and ETFPriceCollector (pykrx OHLCV)
with corresponding admin API endpoints and frontend collection UI buttons.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 23:00:27 +09:00
72c72994b2 fix: collector error
All checks were successful
Deploy to Production / deploy (push) Successful in 1m8s
2026-02-08 22:48:35 +09:00
9f756331c4 fix: remove passlib dependency and fix FastAPI deprecation warnings
All checks were successful
Deploy to Production / deploy (push) Successful in 1m9s
- Replace passlib with direct bcrypt usage to eliminate the
  'module bcrypt has no attribute __about__' warning
- Change Query(regex=) to Query(pattern=) per FastAPI deprecation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 22:34:32 +09:00
eadc935e46 fix: add ADMIN_* env vars to deploy workflow .env.prod generation
All checks were successful
Deploy to Production / deploy (push) Successful in 1m7s
Without these variables the admin user seed was skipped in production.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 22:28:08 +09:00
1dae2945c3 feat: client-side password hashing and admin user auto-seeding
All checks were successful
Deploy to Production / deploy (push) Successful in 1m31s
- Hash passwords with SHA-256 on frontend before transmission to prevent
  raw password exposure in network traffic and server logs
- Switch login endpoint from OAuth2 form-data to JSON body
- Auto-create admin user on startup from ADMIN_USERNAME/ADMIN_PASSWORD
  env vars, solving login failure after registration was disabled
- Update auth tests to match new SHA-256 + JSON login flow

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 22:21:36 +09:00
d6e45d01a6 feat: disable user registration endpoint
All checks were successful
Deploy to Production / deploy (push) Successful in 1m7s
Personal-use service — no new account creation needed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 00:17:21 +09:00
070f74d978 fix: use 127.0.0.1 instead of localhost in health checks
All checks were successful
Deploy to Production / deploy (push) Successful in 1m35s
Alpine's wget resolves localhost to IPv6 [::1] first, but Next.js
standalone listens on 0.0.0.0 (IPv4 only), causing connection refused.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 00:12:59 +09:00
72c502f1bc chore: port 설정 수정
Some checks failed
Deploy to Production / deploy (push) Failing after 3m40s
2026-02-08 00:06:21 +09:00
e22241dbc4 fix(ci): use retry loop for frontend health check
Some checks failed
Deploy to Production / deploy (push) Failing after 3m32s
The frontend container needs more time to initialize. Replace fixed
sleep with a retry loop that polls the container health status up to
30 times (150s max) before checking.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 23:58:06 +09:00
f43f26f43c fix(ci): redesign deploy workflow for containerized Act Runner
Some checks failed
Deploy to Production / deploy (push) Failing after 1m14s
- Install Docker CLI + Compose plugin in job container
- Remove rsync dependency (work directly from checkout workspace)
- Use --project-name for consistent compose project naming
- Use --env-file for compose variable substitution
- Use docker exec for health checks (job container can't reach host ports)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 23:40:23 +09:00
39d2226d95 feat: production deployment setup with Gitea Actions CI/CD
Some checks failed
Deploy to Production / deploy (push) Failing after 46s
- Remove nginx from docker-compose.prod.yml (NPM handles reverse proxy)
- Add Next.js rewrites to proxy /api/* to backend (backend fully hidden)
- Bind frontend to 127.0.0.1:3000 only (NPM proxies externally)
- Replace hardcoded localhost:8000 in history page with api client
- Make CORS origins configurable via environment variable
- Restrict CORS methods to GET/POST/PUT/DELETE
- Add Gitea Actions deploy workflow with secrets-based env management
- Add security headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy)
- Add BACKEND_URL build arg to frontend Dockerfile for standalone builds

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 23:09:22 +09:00
642514b227 chore: upgrade dependencies to latest compatible versions
- Node.js: 22 → 24 (Active LTS)
- PostgreSQL: 15 → 18
- FastAPI: 0.115.6 → 0.128.2
- Uvicorn: 0.34.0 → 0.40.0
- SQLAlchemy: 2.0.36 → 2.0.46
- Alembic: 1.14.0 → 1.18.3
- Pydantic: 2.10.4 → 2.12.5
- pandas: 2.2.3 → 2.3.3
- pykrx: 1.0.45 → 1.2.3
- React: 19.2.3 → 19.2.4

Breaking changes:
- Migrate from python-jose to PyJWT for JWT handling
- numpy downgraded to 1.26.4 for pykrx compatibility

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-07 11:12:16 +09:00
1dcb381a36 chore: 오류 수정, 실행 시 alembic 적용 2026-02-07 10:25:14 +09:00
d6f7d4a307 refactor: rename project from Galaxy-PO to Galaxis-Po
- Update all references in frontend, backend, and docker configs
- Update README, pyproject.toml, layout, sidebar
- Docker container names updated

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 23:24:53 +09:00
ad7191407f fix(frontend): update package-lock.json
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 23:19:45 +09:00
e14c5181ec fix(frontend): remove unused autoprefixer from postcss config
Tailwind CSS v4 with @tailwindcss/postcss includes autoprefixer

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 23:16:57 +09:00
4498ff9df1 feat(frontend): final polish and cleanup
- Toast notifications with sonner
- Loading skeleton components
- Improved loading states
- 404 page
- Cleanup old components

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 23:11:41 +09:00
3b741e1cfd feat(frontend): improve strategy and backtest pages
- Add StrategyCard component with icon, CAGR range, risk badge, and stock count
- Update strategy list page with improved cards and descriptions
- Redesign backtest page with split layout (form left, results right)
- Add summary cards for CAGR, MDD, Sharpe ratio, and total return
- Integrate charts for equity curve, drawdown, and yearly returns
- Add badge, select, and skeleton UI components
- Toggle between new backtest form and history view

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 23:07:19 +09:00
c3d43c97d0 feat(frontend): improve portfolio pages
- TradingView chart component with lightweight-charts v5 API
- PortfolioCard component with mini pie chart and return display
- Updated portfolio list with cards and empty state
- Portfolio detail with charts, tabs (holdings/transactions/analysis)
- Improved holdings table with progress bars for weight
- Added tabs component from shadcn

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 23:03:45 +09:00
4f432fb85c feat(frontend): add dashboard charts
- Sparkline for summary cards
- AreaChart for asset trends
- DonutChart for sector allocation
- BarChart for portfolio comparison

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 22:58:00 +09:00
eb3ce0e6e7 feat(frontend): apply DashboardLayout to all pages
- Portfolio pages updated with DashboardLayout and shadcn/ui Card components
- Strategy pages updated (multi-factor, quality, value-momentum)
- Backtest pages updated with consistent styling
- Admin data management page updated
- Login page improved with shadcn/ui Card, Input, Button, Label
- All pages now support dark mode via CSS variables
- Removed old Sidebar/Header imports, using unified DashboardLayout
- Added shadcn/ui input and label components

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 22:54:22 +09:00
3e733ec1b8 feat(frontend): add new layout components
- Collapsible Sidebar with navigation
- Header with page titles and logout
- DashboardLayout with responsive design
- Updated dashboard page

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 22:46:54 +09:00
0200ebc7ad test(frontend): add Phase 1 test page
- Verify shadcn/ui components render correctly
- Verify theme toggle works
- Verify Lucide icons display
- Temporary page for Phase 1 verification

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 22:25:12 +09:00
4178744afe feat(frontend): add chart libraries
- recharts for general charts
- lightweight-charts for TradingView financial charts

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 22:24:07 +09:00
c0fc599083 feat(frontend): add ThemeToggle component
- Dropdown menu with light/dark/system options
- Uses Lucide icons for sun/moon

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 22:23:22 +09:00
f4038ef539 feat(frontend): add core shadcn/ui components
- button, card, dropdown-menu, sheet, tooltip

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 22:21:51 +09:00
70bc032575 feat(frontend): add lucide-react icons
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 22:20:37 +09:00
0fce3f03f3 feat(frontend): add next-themes for dark/light mode
- Create ThemeProvider component
- Apply ThemeProvider to root layout
- Enable system theme detection

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 22:19:27 +09:00
6e30ecea03 feat(frontend): initialize shadcn/ui configuration
- Add tailwind.config.ts with shadcn/ui theme colors
- Update globals.css with CSS variables for dark/light mode
- Add utils.ts with cn() helper function
- Add components.json for shadcn/ui CLI
- Update postcss.config.mjs with autoprefixer
- Exclude playwright config from tsconfig to fix build

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 22:17:26 +09:00
f42f8a685a docs: add frontend UI redesign plan
Comprehensive redesign plan including:
- shadcn/ui + Lucide Icons + Recharts + TradingView charts
- Dark/light theme with system preference support
- Collapsible sidebar with responsive breakpoints
- Dashboard with charts and sparklines
- Portfolio pages with TradingView integration
- Strategy and backtest page improvements

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 21:55:25 +09:00
bfcb155a4f chore: uv 적용 2026-02-04 22:26:19 +09:00
926958c15a fix: remove unused function and fix lint warning
- Remove unused login helper in portfolio.spec.ts
- Add eslint-disable for useEffect in history page

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 12:30:54 +09:00
efcfc0e090 feat: add E2E tests for backend and frontend
Backend (pytest):
- Auth flow tests (login, token, protected routes)
- Portfolio CRUD and transaction tests
- Strategy endpoint tests
- Backtest flow tests
- Snapshot and returns tests

Frontend (Playwright):
- Auth page tests
- Portfolio navigation tests
- Strategy page tests
- Backtest page tests
- Playwright configuration

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 12:30:13 +09:00
e3b9ec1071 feat: update Docker configuration
- Backend Dockerfile: Python 3.12, non-root user, healthcheck
- Frontend Dockerfile: Multi-stage build, production stage
- docker-compose.yml: env_file, healthchecks, restart policies
- docker-compose.prod.yml: Production config with nginx
- .env.example: Updated with all variables

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 12:27:34 +09:00
89bd8fea53 feat: add scheduler, returns calculator, and history page
- APScheduler for daily snapshots (18:30 weekdays)
- ReturnsCalculator with CAGR, TWR, MDD, volatility
- Portfolio history page with snapshots and returns tabs
- FastAPI lifespan integration for scheduler

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 12:26:16 +09:00
8842928363 feat: add PriceService and snapshot API endpoints
- PriceService: Mock implementation using DB prices
- Snapshot schemas: SnapshotListItem, ReturnsResponse, ReturnDataPoint
- Snapshot API: list, create, get, delete snapshots
- Returns API: portfolio returns calculation with CAGR

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 12:23:56 +09:00
63ffe2439e docs: add Phase 6 finishing design document
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 12:20:39 +09:00