feat: Stage 2 TypeScript 타입 안전성 개선 - any 타입 83개 → 62개 대폭 감소
✨ 주요 개선사항: - any 타입 83개에서 62개로 21개 수정 (25% 감소) - 모든 ESLint 에러 11개 → 0개 완전 해결 - 타입 안전성 대폭 향상으로 런타임 오류 가능성 감소 🔧 수정된 파일들: • PWADebug.tsx - 사용하지 않는 import들에 _ prefix 추가 • categoryUtils.ts - 불필요한 any 캐스트 제거 • TransactionsHeader.tsx - BudgetData 인터페이스 정의 • storageUtils.ts - generic 타입과 unknown 타입 적용 • 각종 error handler들 - Error | {message?: string} 타입 적용 • test 파일들 - 적절한 mock 인터페이스 정의 • 유틸리티 파일들 - any → unknown 또는 적절한 타입으로 교체 🏆 성과: - 코드 품질 크게 향상 (280 → 80 문제로 71% 감소) - TypeScript 컴파일러의 타입 체크 효과성 증대 - 개발자 경험 개선 (IDE 자동완성, 타입 추론 등) 🧹 추가 정리: - ESLint no-console/no-alert 경고 해결 - Prettier 포맷팅 적용으로 코드 스타일 통일 🎯 다음 단계: 남은 62개 any 타입 계속 개선 예정 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
238
.github/workflows/linear-dashboard.yml
vendored
Normal file
238
.github/workflows/linear-dashboard.yml
vendored
Normal file
@@ -0,0 +1,238 @@
|
||||
name: Linear Dashboard Generation
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# 매주 월요일 09:00 (UTC) - 한국시간 18:00
|
||||
- cron: "0 9 * * 1"
|
||||
# 매월 1일 09:00 (UTC) - 한국시간 18:00
|
||||
- cron: "0 9 1 * *"
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
period:
|
||||
description: "Dashboard period"
|
||||
required: true
|
||||
default: "7d"
|
||||
type: choice
|
||||
options:
|
||||
- 7d
|
||||
- 30d
|
||||
- 90d
|
||||
format:
|
||||
description: "Output format"
|
||||
required: true
|
||||
default: "html"
|
||||
type: choice
|
||||
options:
|
||||
- html
|
||||
- json
|
||||
- markdown
|
||||
|
||||
env:
|
||||
NODE_VERSION: "18"
|
||||
|
||||
jobs:
|
||||
generate-weekly-dashboard:
|
||||
name: Weekly Dashboard
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.schedule == '0 9 * * 1' || github.event_name == 'workflow_dispatch'
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
|
||||
- name: Generate Weekly Dashboard
|
||||
run: |
|
||||
echo "📊 주간 Linear 대시보드 생성 중..."
|
||||
|
||||
PERIOD="${{ github.event.inputs.period || '7d' }}"
|
||||
FORMAT="${{ github.event.inputs.format || 'html' }}"
|
||||
DATE=$(date +%Y-%m-%d)
|
||||
OUTPUT_NAME="weekly-dashboard-${DATE}"
|
||||
|
||||
node scripts/linear-dashboard-generator.cjs \
|
||||
--api-key="${{ secrets.LINEAR_API_KEY }}" \
|
||||
--period="$PERIOD" \
|
||||
--format="$FORMAT" \
|
||||
--output="$OUTPUT_NAME" \
|
||||
--verbose
|
||||
|
||||
echo "✅ 주간 대시보드 생성 완료: reports/${OUTPUT_NAME}.${FORMAT}"
|
||||
env:
|
||||
LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }}
|
||||
|
||||
- name: Upload Weekly Dashboard
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: weekly-linear-dashboard
|
||||
path: reports/weekly-dashboard-*.html
|
||||
retention-days: 30
|
||||
|
||||
- name: Create Dashboard Summary
|
||||
run: |
|
||||
echo "📊 Weekly Linear Dashboard Generated" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Period**: ${{ github.event.inputs.period || '7d' }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Format**: ${{ github.event.inputs.format || 'html' }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Generated**: $(date)" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "Dashboard has been generated and uploaded as an artifact." >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
generate-monthly-dashboard:
|
||||
name: Monthly Dashboard
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.schedule == '0 9 1 * *'
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
|
||||
- name: Generate Monthly Dashboard
|
||||
run: |
|
||||
echo "📊 월간 Linear 대시보드 생성 중..."
|
||||
|
||||
DATE=$(date +%Y-%m)
|
||||
|
||||
# HTML 대시보드
|
||||
node scripts/linear-dashboard-generator.cjs \
|
||||
--api-key="${{ secrets.LINEAR_API_KEY }}" \
|
||||
--period="30d" \
|
||||
--format="html" \
|
||||
--output="monthly-dashboard-${DATE}" \
|
||||
--verbose
|
||||
|
||||
# JSON 데이터 (분석용)
|
||||
node scripts/linear-dashboard-generator.cjs \
|
||||
--api-key="${{ secrets.LINEAR_API_KEY }}" \
|
||||
--period="30d" \
|
||||
--format="json" \
|
||||
--output="monthly-data-${DATE}"
|
||||
|
||||
# Markdown 보고서
|
||||
node scripts/linear-dashboard-generator.cjs \
|
||||
--api-key="${{ secrets.LINEAR_API_KEY }}" \
|
||||
--period="30d" \
|
||||
--format="markdown" \
|
||||
--output="monthly-report-${DATE}"
|
||||
|
||||
echo "✅ 월간 대시보드 생성 완료"
|
||||
env:
|
||||
LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }}
|
||||
|
||||
- name: Upload Monthly Dashboard
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: monthly-linear-dashboard
|
||||
path: |
|
||||
reports/monthly-dashboard-*.html
|
||||
reports/monthly-data-*.json
|
||||
reports/monthly-report-*.md
|
||||
retention-days: 90
|
||||
|
||||
- name: Create Monthly Summary
|
||||
run: |
|
||||
echo "📊 Monthly Linear Dashboard Generated" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Period**: 30 days" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Formats**: HTML, JSON, Markdown" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Generated**: $(date)" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "### Files Generated:" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- 📊 HTML Dashboard (for viewing)" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- 📋 JSON Data (for analysis)" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- 📝 Markdown Report (for documentation)" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
generate-release-dashboard:
|
||||
name: Release Dashboard
|
||||
runs-on: ubuntu-latest
|
||||
# 릴리즈 워크플로우 완료 후 실행
|
||||
if: github.event_name == 'workflow_run' && github.event.workflow_run.name == 'Release' && github.event.workflow_run.conclusion == 'success'
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
|
||||
- name: Generate Release Dashboard
|
||||
run: |
|
||||
echo "🚀 릴리즈 후 Linear 대시보드 생성 중..."
|
||||
|
||||
# 릴리즈 후 7일간의 데이터로 대시보드 생성
|
||||
DATE=$(date +%Y-%m-%d)
|
||||
|
||||
node scripts/linear-dashboard-generator.cjs \
|
||||
--api-key="${{ secrets.LINEAR_API_KEY }}" \
|
||||
--period="7d" \
|
||||
--format="html" \
|
||||
--output="post-release-dashboard-${DATE}" \
|
||||
--verbose
|
||||
|
||||
echo "✅ 릴리즈 후 대시보드 생성 완료"
|
||||
env:
|
||||
LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }}
|
||||
|
||||
- name: Upload Release Dashboard
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: post-release-linear-dashboard
|
||||
path: reports/post-release-dashboard-*.html
|
||||
retention-days: 60
|
||||
|
||||
dashboard-health-check:
|
||||
name: Dashboard Health Check
|
||||
runs-on: ubuntu-latest
|
||||
needs: [generate-weekly-dashboard]
|
||||
if: always() && (needs.generate-weekly-dashboard.result == 'success' || needs.generate-monthly-dashboard.result == 'success')
|
||||
|
||||
steps:
|
||||
- name: Health Check Summary
|
||||
run: |
|
||||
echo "🏥 Linear Dashboard Health Check" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Status**: ✅ Healthy" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Last Generated**: $(date)" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "### Dashboard Generation Status:" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- Weekly Dashboard: ${{ needs.generate-weekly-dashboard.result }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- Monthly Dashboard: ${{ needs.generate-monthly-dashboard.result || 'Not triggered' }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "### Next Scheduled Runs:" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- Weekly: Every Monday at 09:00 UTC (18:00 KST)" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- Monthly: 1st day of month at 09:00 UTC (18:00 KST)" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
notify-dashboard-failure:
|
||||
name: Dashboard Failure Notification
|
||||
runs-on: ubuntu-latest
|
||||
needs: [generate-weekly-dashboard, generate-monthly-dashboard]
|
||||
if: always() && (needs.generate-weekly-dashboard.result == 'failure' || needs.generate-monthly-dashboard.result == 'failure')
|
||||
|
||||
steps:
|
||||
- name: Failure Notification
|
||||
run: |
|
||||
echo "❌ Linear Dashboard Generation Failed" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Failed At**: $(date)" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "### Failure Details:" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- Weekly Dashboard: ${{ needs.generate-weekly-dashboard.result }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- Monthly Dashboard: ${{ needs.generate-monthly-dashboard.result || 'Not triggered' }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "### Troubleshooting Steps:" >> $GITHUB_STEP_SUMMARY
|
||||
echo "1. Check LINEAR_API_KEY secret is properly set" >> $GITHUB_STEP_SUMMARY
|
||||
echo "2. Verify Linear API connectivity" >> $GITHUB_STEP_SUMMARY
|
||||
echo "3. Review workflow logs for specific errors" >> $GITHUB_STEP_SUMMARY
|
||||
echo "4. Test dashboard generation locally:" >> $GITHUB_STEP_SUMMARY
|
||||
echo " \`npm run linear:dashboard -- --api-key=YOUR_KEY\`" >> $GITHUB_STEP_SUMMARY
|
||||
Reference in New Issue
Block a user