✨ 주요 개선사항: - 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>
239 lines
8.7 KiB
YAML
239 lines
8.7 KiB
YAML
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
|