Skip to content

Latest commit

 

History

History
92 lines (68 loc) · 4.47 KB

File metadata and controls

92 lines (68 loc) · 4.47 KB

AGENTS.md

프로젝트 개요

  • 이 저장소는 개인용 URL 단축 서비스 Shortly이다.
  • Python 3.10 이상, Flask, SQLite를 사용한다.
  • 관리자 계정은 한 개이며 로그인한 사용자만 링크 생성·목록 확인·삭제를 할 수 있다.
  • 단축 URL 접속 시 원본 URL로 리디렉션하고 조회수를 증가시킨다.

유지해야 할 동작

  • 프로토콜이 없는 입력에는 https://를 자동으로 붙인다.
  • http://, https://뿐 아니라 obsidian://, mailto:, tel: 같은 커스텀 프로토콜도 허용한다.
  • javascript:, data:, vbscript:처럼 위험한 스킴은 차단한다.
  • 동일한 원본 URL이 이미 있으면 새 행을 만들지 말고 기존 단축 URL을 재사용한다.
  • 링크 생성 또는 중복 감지 후 단축 URL과 복사 버튼을 입력 영역 아래에 표시한다.
  • 다크 모드는 system, light, dark를 지원한다. 명시적인 사용자 선택만 localStorage에 저장하고, system 상태에서는 운영체제 설정 변경을 따른다.
  • 화면 문구는 자연스러운 한국어를 사용하고 모바일 및 키보드 접근성을 유지한다.

주요 파일

  • app.py: Flask 애플리케이션, 인증, SQLite, URL 검증 및 리디렉션
  • templates/: 로그인 및 대시보드 템플릿
  • static/style.css: 라이트·다크 테마와 반응형 스타일
  • static/theme.js: 테마 감지, 저장 및 전환
  • tests/test_app.py: 핵심 애플리케이션 테스트
  • instance/urls.sqlite3: 로컬 데이터이며 Git에 포함하지 않는다.

작업 규칙

  • 작업을 시작하기 전에 git status --short로 기존 변경사항을 확인한다.
  • 사용자의 기존 변경사항과 SQLite 데이터를 보존한다.
  • 요청 범위를 넘어서는 리팩터링이나 동작 변경은 하지 않는다.
  • 비밀정보를 코드에 하드코딩하거나 출력하지 않는다.
  • .env, .venv/, instance/는 Git에 추가하지 않는다.
  • 모든 코드와 텍스트 파일의 줄바꿈은 LF를 사용한다.
  • 모든 코드는 의도와 구조를 쉽게 파악할 수 있도록 human-readable하게 작성한다.
  • HTML, CSS, JavaScript, Python은 기존 파일의 포맷을 유지하며 여러 문장이나 선언을 한 줄로 압축하지 않는다.
  • CSS는 선택자와 선언을 여러 줄로 나누고, 선언당 한 줄과 2칸 들여쓰기를 사용한다.
  • CSS를 수정한 뒤에는 기존 pretty-print 형식을 유지한다.
  • 커밋은 사용자가 명시적으로 요청한 경우에만 만든다.
  • 작업 완료 응답에는 항상 핵심 git diff와 실행한 검증 결과를 함께 보여준다.

검증

기능 또는 템플릿을 변경한 뒤 전체 테스트를 실행한다.

.\.venv\Scripts\python.exe -m pytest -q

Linux 또는 WSL에서는 다음 명령을 사용한다.

.venv/bin/python -m pytest -q

static/theme.js를 변경했다면 JavaScript 문법 검사도 실행한다.

node --check static/theme.js

포맷 변경 후에는 git diff --check를 실행한다. 작업 완료 전 git status --shortgit diff를 다시 확인한다.

개발 서버

개발 서버는 다음 주소에서 실행한다.

http://127.0.0.1:5000

Windows 실행 예시:

.\.venv\Scripts\python.exe -m flask --app app run --host 0.0.0.0 --port 5000
  • 서버를 시작하거나 재시작하기 전에 포트 5000의 기존 리스너를 확인한다.
  • 이 환경에서는 터미널의 Ctrl+C가 Flask 하위 프로세스를 종료하지 못할 수 있다. 종료 후 반드시 실제 포트 점유 상태를 재확인한다.
  • 중복 서버가 있으면 이 프로젝트에서 실행한 정확한 PID만 종료한다. 관련 없는 프로세스를 종료하지 않는다.
  • 서버 실행 후 포트 5000을 점유한 리스너가 정확히 하나인지 확인한다.
  • Python 또는 템플릿 변경 후 실행 중인 서버가 이전 코드를 제공하면 단일 프로세스로 재시작한다. 정적 파일 변경은 일반적으로 재시작 없이 반영된다.

완료 기준

  • 요청한 동작이 구현되어 있다.
  • 기존 로그인, URL 생성, 중복 재사용, 리디렉션, 조회수, 삭제, 커스텀 프로토콜 및 테마 기능이 깨지지 않는다.
  • 관련 테스트와 검사가 통과한다.
  • 실행 서버와 현재 소스 코드가 일치한다.
  • 최종 응답에 변경 내용, diff, 테스트 결과 및 서버 상태를 간결하게 보고한다.