diff --git a/.cursor/rules/agent-shell-python-safety.mdc b/.cursor/rules/agent-shell-python-safety.mdc new file mode 100644 index 0000000..32cdae7 --- /dev/null +++ b/.cursor/rules/agent-shell-python-safety.mdc @@ -0,0 +1,45 @@ +--- +description: 에이전트 셸·Python 원라이너 — 문법 오류 코드 금지로 토큰/재실행 낭비 방지 +alwaysApply: true +--- + +# 에이전트 셸 / Python 스니펫 안전 (토큰 절약) + +대화에서 실제로 낭비된 패턴: **실행 전에 문법이 틀린 Python을 heredoc으로 돌림** +(예: `from X import Y if False else None` → `SyntaxError` → 재작성으로 턴·토큰 낭비). + +## 1. 실행 전 문법 유효성 (필수) + +- `python - <<'PY'` / `-c` / 임시 `.py` 를 **돌리기 전에** 문법이 맞는지 스스로 확인. +- 확신이 없으면 파일로 쓴 뒤 `python -m py_compile path.py` **1회**만 하고 실행. +- `SyntaxError` / `IndentationError` 나면 **원인 고친 뒤 1회만** 재실행. 같은 스니펫을 살짝만 바꿔 반복 금지. + +## 2. 금지 패턴 (자주 나는 가짜 문법) + +- `from module import name if cond else None` — **문법 불가**. + → `import module as m` 후 `getattr(m, "name", None)` 또는 `try/except ImportError`. +- `from X import a, b if c` / 조건부 import를 `from` 한 줄에 섞기. +- 존재하지 않는 심볼을 **추측 import** (`get_scalp_grids` 등). + → 먼저 `hasattr` / `dir` / Grep으로 실명 확인 후 import. +- heredoc 안에서 이전에 실패한 코드를 **거의 그대로** 다시 붙여 넣기. + +## 3. 그리드·헬퍼 조회 스니펫 최소형 + +축 개수 세기 등은 아래처럼 **검증된 형태만** 사용 (조건부 from 금지): + +```python +from kis_trader.backtest.param_search_breakout import _breakout_grids +import kis_trader.backtest.param_search_scalping as sc + +bg = _breakout_grids() +print({m: len(a) for m, a in bg.items()}) +fn = getattr(sc, "_scalp_grids", None) +print({m: len(a) for m, a in fn().items()} if callable(fn) else "no _scalp_grids") +``` + +시그니처를 모르면 `inspect.signature(fn)` **먼저** — `_tail_grids(mode)` 처럼 인자가 필요한데 `()`로 호출하지 말 것. + +## 4. 토큰 절약 원칙 + +- “한 번에 여러 전략 import + 조건부 트릭”보다 **짧은 확정 코드 1회**. +- 실패 로그를 사용자에게 길게 반복 붙여 넣지 말 것. 고치고 결과만 보고. diff --git a/.cursor/rules/backtest-web-restart.mdc b/.cursor/rules/backtest-web-restart.mdc new file mode 100644 index 0000000..949393b --- /dev/null +++ b/.cursor/rules/backtest-web-restart.mdc @@ -0,0 +1,46 @@ +--- +description: 백테 웹 수정 후 systemctl 재시작 + 브라우저로 열어 클릭 검증까지 완료 +alwaysApply: true +--- + +# 백테 웹 재시작 + 브라우저 검증 (필수) + +`backtest_web.py` · `templates/backtest.html` · `static/js/backtest.js` · `kis_trader/web/**` 등 **웹 UI/API에 반영되는 코드**를 수정한 뒤에는: + +1. 사용자에게 “재시작/새로고침하세요”만 말하지 말고 **직접 재시작** +2. **페이지를 띄워 관련 UI를 눌러보는 검증까지** 끝낸 뒤에야 “완료”로 보고 + +`curl 200` / `systemctl active` 만으로는 검증 완료가 **아님**. 콘솔 `ReferenceError`·버튼 미동작은 브라우저 클릭 없이는 놓친다. + +## 1) 재시작 + +```bash +sudo systemctl restart kis_backtest_web.service +sleep 2 +systemctl is-active kis_backtest_web.service +curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:5050/ +``` + +- 유닛: `kis_backtest_web.service` (포트 **5050**) +- 실패 시: `journalctl -u kis_backtest_web.service -n 40 --no-pager` + +## 2) 브라우저 검증 (수정 범위만큼) + +브라우저 도구로 `http://127.0.0.1:5050/` (또는 LAN `http://192.168.0.149:5050/`) 을 연다. + +- 강력 새로고침에 해당하는 방식으로 최신 JS/HTML 로드 +- **수정한 탭·버튼·날짜 인풋·정렬·거래내역**을 실제로 클릭/입력 +- DevTools 콘솔에 `Uncaught` / `ReferenceError` / 빨간 네트워크 실패가 **없어야** 함 +- 스냅샷으로 화면 상태 확인 후, 잔여 오류가 있으면 고치고 재검증 + +최소 산출물(보고에 포함): + +- 재시작 결과 (`active` + HTTP 코드) +- 연 URL + 누른 탭/버튼 +- 콘솔 오류 유무 (없으면 “콘솔 오류 없음”) + +## 언제 + +- Python API/서버 변경 → 재시작 **필수** + 브라우저 검증 +- `static/` · `templates/` 만 변경 → 재시작(또는 캐시 무효) + **브라우저 검증 필수** +- 실매 봇(`kis_trader_main` 등)은 웹과 무관하면 재시작하지 말 것 diff --git a/.cursor/rules/db-adhoc-query-safety.mdc b/.cursor/rules/db-adhoc-query-safety.mdc new file mode 100644 index 0000000..ed9e86b --- /dev/null +++ b/.cursor/rules/db-adhoc-query-safety.mdc @@ -0,0 +1,50 @@ +--- +description: TradeDB/MariaDB 임시 조회 시 스키마 확인·PyMySQL % 이스케이프 필수 (실패 재시도 금지) +alwaysApply: true +--- + +# DB 임시 조회(adhoc) 안전 규칙 + +TradeDB/`database.py`로 SQL을 날릴 때 **추측 쿼리 금지**. 실패하면 같은 가정을 반복하지 말 것(토큰 낭비). + +## 1. 쿼리 전에 스키마 확인 (필수) + +모르는 테이블/컬럼이면 **먼저** `SHOW COLUMNS FROM
SHORT_DAILY_PROFIT_TARGET_ENABLED. 이번만 끄려면 체크 해제 후 실행(봇저장 X면 DB 유지).insert_env_snapshot → config_short + env_config 자동 분리BREAKOUT_DAILY_PROFIT_TARGET_ENABLED. 이번만 끄려면 체크 해제 후 실행(봇저장 X면 DB 유지).target_candidates_history) — 체크: DB 슬롯·후보 / 해제: ws_candles 전 종목
target_candidates_history, strategy_id=RANGE_BREAK)
+ MOMENTUM_DAILY_PROFIT_TARGET_ENABLED. 이번만 끄려면 체크 해제 후 실행(봇저장 X면 DB 유지).