Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
948eb63
feat: HealthKit/Google Fit 연동을 위한 health 패키지 의존성 추가
seunggulee1007 Oct 16, 2025
391a0a4
feat: iOS HealthKit 권한 및 설정 추가
seunggulee1007 Oct 16, 2025
34cc6e9
feat: HealthService 클래스 구현
seunggulee1007 Oct 16, 2025
917972c
feat: 러닝 화면에 실시간 심박수 추적 기능 추가
seunggulee1007 Oct 16, 2025
a6807b0
chore: 프로젝트 설정 파일 업데이트
seunggulee1007 Oct 16, 2025
e74cc28
chore: TaskMaster 및 Cursor 설정 파일 추가
seunggulee1007 Oct 16, 2025
9daaa52
fix: 지도 기능 복원 - 디버그 모드에서도 실제 지도 표시하도록 수정
seunggulee1007 Oct 17, 2025
a868d84
fix: Google Maps API 키 없이도 안전하게 작동하도록 수정
seunggulee1007 Oct 17, 2025
ed42635
feat: 지도 항상 표시 및 실시간 경로 추적 기능 개선
seunggulee1007 Oct 17, 2025
8549e80
docs: 실시간 지도 경로 추적 기능 문서 추가
seunggulee1007 Oct 17, 2025
ffd3d96
docs: Create professional portfolio README with visual enhancements
seunggulee1007 Oct 28, 2025
39a3aab
docs: Add comprehensive portfolio setup guides and templates
seunggulee1007 Oct 28, 2025
ee1d286
문서 구조 개선 및 불필요한 문서 정리할것
seunggulee1007 Oct 30, 2025
eed4116
iOS 앱 스크린샷 추가 및 스크린샷 가이드 개선할것
seunggulee1007 Oct 30, 2025
3c449a0
러닝 화면 UI 개선 및 위젯 리팩터링할것
seunggulee1007 Oct 30, 2025
fa2e3be
CI 워크플로우 추가 및 포트폴리오 통계 워크플로우 개선할것
seunggulee1007 Oct 30, 2025
12a41a5
포트폴리오 문서 및 프로젝트 설정 파일 업데이트할것
seunggulee1007 Oct 30, 2025
ddf9412
보안: Info.plist에서 하드코딩된 Google Maps API 키 제거 및 플레이스홀더로 대체할것
seunggulee1007 Oct 31, 2025
d4bc5ca
보안: 환경 변수를 통한 API 키 관리 시스템 구현할것
seunggulee1007 Oct 31, 2025
671533d
보안: API 키 노출 방지 Git Hook 및 자동화 스크립트 추가할것
seunggulee1007 Oct 31, 2025
37cc43c
main 브랜치 변경사항 병합할것
seunggulee1007 Oct 31, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .cursor/mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"mcpServers": {}
}
19 changes: 9 additions & 10 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
# Supabase Configuration
SUPABASE_URL=https://your-project-id.supabase.co
SUPABASE_ANON_KEY=your-supabase-anon-key
SUPABASE_URL=your_supabase_url_here
SUPABASE_ANON_KEY=your_supabase_anon_key_here

# Google OAuth Configuration
GOOGLE_WEB_CLIENT_ID=your-google-web-client-id.apps.googleusercontent.com
GOOGLE_IOS_CLIENT_ID=your-google-ios-client-id.apps.googleusercontent.com
GOOGLE_ANDROID_CLIENT_ID=your-google-android-client-id.apps.googleusercontent.com

# Kakao OAuth Configuration
KAKAO_NATIVE_APP_KEY=your-kakao-native-app-key
KAKAO_REST_API_KEY=your-kakao-rest-api-key
KAKAO_JAVASCRIPT_KEY=your-kakao-javascript-key
GOOGLE_WEB_CLIENT_ID=your_web_client_id_here
GOOGLE_IOS_CLIENT_ID=your_ios_client_id_here
GOOGLE_ANDROID_CLIENT_ID=your_android_client_id_here

# App Configuration
BUNDLE_ID=com.example.runnerApp

# Google Maps API Keys
GOOGLE_MAPS_API_KEY_IOS=your_ios_google_maps_api_key_here
GOOGLE_MAPS_API_KEY_ANDROID=your_android_google_maps_api_key_here
125 changes: 125 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
name: Flutter CI/CD

on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]

jobs:
build_and_test:
name: Build & Test
runs-on: ubuntu-latest

steps:
- name: 📥 Checkout code
uses: actions/checkout@v4

- name: ☕ Setup Java
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17'

- name: 🐦 Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.8.1'
channel: 'stable'
cache: true

- name: 📦 Install dependencies
run: flutter pub get

- name: 🔍 Verify formatting
run: dart format --set-exit-if-changed .

- name: 📊 Analyze code
run: flutter analyze

- name: 🧪 Run unit tests
run: flutter test --no-pub --coverage --test-randomize-ordering-seed random

- name: 📈 Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./coverage/lcov.info
fail_ci_if_error: false

- name: 🏗️ Build APK (Android)
run: flutter build apk --debug --no-pub

- name: 📤 Upload APK artifact
uses: actions/upload-artifact@v4
with:
name: app-debug-apk
path: build/app/outputs/flutter-apk/app-debug.apk

code_quality:
name: Code Quality Check
runs-on: ubuntu-latest

steps:
- name: 📥 Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: 🐦 Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.8.1'
channel: 'stable'

- name: 📦 Install dependencies
run: flutter pub get

- name: 🔍 Run static analysis
run: |
echo "## Code Quality Report 📊" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
flutter analyze > analysis.txt 2>&1 || true
if grep -q "No issues found!" analysis.txt; then
echo "✅ **No issues found!**" >> $GITHUB_STEP_SUMMARY
else
echo "⚠️ **Issues detected:**" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
cat analysis.txt >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
fi

- name: 📈 Generate test coverage report
run: |
flutter test --coverage
echo "### Test Coverage 🎯" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Coverage report generated. Check Codecov for detailed metrics." >> $GITHUB_STEP_SUMMARY

security:
name: Security Scan
runs-on: ubuntu-latest

steps:
- name: 📥 Checkout code
uses: actions/checkout@v4

- name: 🔒 Run security scan
run: |
echo "## Security Scan 🔒" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Check for hardcoded secrets
if grep -r "sk_" . --exclude-dir={.git,build,ios,android} || \
grep -r "api_key" . --exclude-dir={.git,build,ios,android} || \
grep -r "password" . --exclude-dir={.git,build,ios,android}; then
echo "⚠️ **Potential secrets detected!**" >> $GITHUB_STEP_SUMMARY
else
echo "✅ **No obvious secrets detected**" >> $GITHUB_STEP_SUMMARY
fi

# Check .env file is in .gitignore
if grep -q "\.env" .gitignore; then
echo "✅ **.env file is properly ignored**" >> $GITHUB_STEP_SUMMARY
else
echo "⚠️ **.env file is NOT in .gitignore!**" >> $GITHUB_STEP_SUMMARY
fi

54 changes: 54 additions & 0 deletions .github/workflows/portfolio-stats.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# GitHub Actions으로 프로젝트 통계 자동 생성
# 이 파일은 README에 자동으로 프로젝트 통계를 업데이트합니다

name: Portfolio Stats

on:
schedule:
# 매주 일요일 자정에 실행
- cron: "0 0 * * 0"
workflow_dispatch: # 수동 실행 가능

jobs:
update-stats:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Setup Dart
uses: dart-lang/setup-dart@v1
with:
sdk: stable

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: "3.8.1"
channel: "stable"

- name: Get dependencies
run: flutter pub get

- name: Run tests with coverage
run: flutter test --coverage

- name: Generate coverage report
run: |
sudo apt-get update
sudo apt-get install -y lcov
genhtml coverage/lcov.info -o coverage/html

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
files: ./coverage/lcov.info
fail_ci_if_error: false

- name: Count lines of code
run: |
echo "📊 프로젝트 통계" > stats.txt
echo "Dart 코드: $(find lib -name '*.dart' | xargs wc -l | tail -1 | awk '{print $1}')줄" >> stats.txt
echo "테스트 코드: $(find test -name '*.dart' | xargs wc -l | tail -1 | awk '{print $1}')줄" >> stats.txt
cat stats.txt
19 changes: 19 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
*.swp
.DS_Store
.atom/
.build/
.buildlog/
.history
.svn/
.swiftpm/
migrate_working_dir/

# IntelliJ related
Expand Down Expand Up @@ -195,3 +197,20 @@ node_modules/

# TernJS port file
.tern-port

logs
dev-debug.log
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# OS specific

# Task files
# tasks.json
# tasks/

44 changes: 44 additions & 0 deletions .taskmaster/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"models": {
"main": {
"provider": "anthropic",
"modelId": "claude-3-7-sonnet-20250219",
"maxTokens": 120000,
"temperature": 0.2
},
"research": {
"provider": "perplexity",
"modelId": "sonar-pro",
"maxTokens": 8700,
"temperature": 0.1
},
"fallback": {
"provider": "anthropic",
"modelId": "claude-3-7-sonnet-20250219",
"maxTokens": 120000,
"temperature": 0.2
}
},
"global": {
"logLevel": "info",
"debug": false,
"defaultNumTasks": 10,
"defaultSubtasks": 5,
"defaultPriority": "medium",
"projectName": "Taskmaster",
"ollamaBaseURL": "http://localhost:11434/api",
"bedrockBaseURL": "https://bedrock.us-east-1.amazonaws.com",
"responseLanguage": "y",
"enableCodebaseAnalysis": true,
"defaultTag": "master",
"azureOpenaiBaseURL": "https://your-endpoint.openai.azure.com/",
"userId": "1234567890"
},
"claudeCode": {},
"codexCli": {},
"grokCli": {
"timeout": 120000,
"workingDirectory": null,
"defaultModel": "grok-4-latest"
}
}
Loading
Loading