dramaling-app/sop/scripts/maintenance/create_issue.sh

176 lines
4.6 KiB
Bash
Executable File

#!/bin/bash
# Drama Ling 問題建立工具
# 用途:快速建立和記錄問題
# 使用方法: ./create_issue.sh "問題標題" [優先級] [模組]
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
ISSUES_FILE="$PROJECT_ROOT/docs/04_technical/issues-tracking.md"
# 顏色定義
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 顯示使用說明
show_help() {
echo -e "${BLUE}問題建立工具使用說明:${NC}"
echo "使用方法: $0 \"問題標題\" [優先級] [模組]"
echo ""
echo -e "${BLUE}優先級:${NC}"
echo " critical - 🔴 Critical (嚴重)"
echo " important - 🟡 Important (重要)"
echo " normal - 🔵 Normal (一般)"
echo " low - 🟢 Low (輕微)"
echo ""
echo -e "${BLUE}模組:${NC}"
echo " auth - 認證系統"
echo " learning - 學習內容"
echo " ui - 使用者介面"
echo " api - API 規格"
echo " db - 資料庫"
echo " docs - 文檔"
echo ""
echo -e "${BLUE}範例:${NC}"
echo " $0 \"API endpoint naming conflict\" critical api"
echo " $0 \"UI component specification unclear\" important ui"
}
# 獲取下一個問題編號
get_next_issue_number() {
if [ ! -f "$ISSUES_FILE" ]; then
echo "001"
return
fi
# 從問題追蹤檔案中找到最大的問題編號
local max_num=$(grep -o "Issue #[0-9]*" "$ISSUES_FILE" | grep -o "[0-9]*" | sort -n | tail -1)
if [ -z "$max_num" ]; then
echo "001"
else
printf "%03d" $((10#$max_num + 1))
fi
}
# 轉換優先級格式
format_priority() {
case $1 in
critical|1) echo "🔴 Critical" ;;
important|2) echo "🟡 Important" ;;
normal|3) echo "🔵 Normal" ;;
low|4) echo "🟢 Low" ;;
*) echo "🔵 Normal" ;;
esac
}
# 轉換模組格式
format_module() {
case $1 in
auth) echo "認證系統" ;;
learning) echo "學習內容" ;;
ui) echo "使用者介面" ;;
api) echo "API 規格" ;;
db) echo "資料庫" ;;
docs) echo "文檔" ;;
*) echo "一般" ;;
esac
}
# 建立問題
create_issue() {
local title="$1"
local priority="$2"
local module="$3"
if [ -z "$title" ]; then
echo -e "${RED}❌ 錯誤: 請提供問題標題${NC}"
show_help
exit 1
fi
# 預設值
priority=${priority:-"normal"}
module=${module:-"general"}
local issue_number=$(get_next_issue_number)
local formatted_priority=$(format_priority "$priority")
local formatted_module=$(format_module "$module")
local current_date=$(date +"%Y-%m-%d")
# 建立問題內容
local issue_content="
---
## Issue #${issue_number} - ${title}
**優先級**: ${formatted_priority}
**狀態**: Open
**標籤**: \`type:spec\` \`module:${module}\` \`status:open\`
**建立日期**: ${current_date}
**負責人**: [待指派]
**預計解決**: [待設定]
### 問題描述
[請詳細描述問題的內容、影響範圍和背景資訊]
### 相關文件
- 檔案: [檔案路徑:行號]
### 可能解決方案
1. 方案A: [待分析]
- 優點: [待列出]
- 缺點: [待列出]
### 決議
[待決定]
### 執行紀錄
- ${current_date}: 建立問題
"
# 確保問題追蹤檔案存在
if [ ! -f "$ISSUES_FILE" ]; then
echo -e "${YELLOW}⚠️ 問題追蹤檔案不存在,將建立新檔案${NC}"
touch "$ISSUES_FILE"
fi
# 在問題追蹤看板區域之前添加新問題
if grep -q "## 📊 問題追蹤看板" "$ISSUES_FILE"; then
# 找到看板區域,在其前面插入問題
awk '/## 📊 問題追蹤看板/ { print "'"${issue_content}"'"; print; next } 1' "$ISSUES_FILE" > "${ISSUES_FILE}.tmp" && mv "${ISSUES_FILE}.tmp" "$ISSUES_FILE"
else
# 如果沒有看板區域,直接添加到檔案末尾
echo "$issue_content" >> "$ISSUES_FILE"
fi
echo -e "${GREEN}✅ 問題 #${issue_number} 建立成功!${NC}"
echo -e "標題: ${title}"
echo -e "優先級: ${formatted_priority}"
echo -e "模組: ${formatted_module}"
echo -e "檔案: ${ISSUES_FILE}"
# 詢問是否要開啟編輯器
read -p "是否要開啟編輯器完善問題描述? (y/N): " edit_choice
if [[ $edit_choice =~ ^[Yy]$ ]]; then
${EDITOR:-nano} "$ISSUES_FILE"
fi
}
# 主程式
main() {
if [ "$1" = "help" ] || [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
show_help
exit 0
fi
create_issue "$1" "$2" "$3"
}
# 執行主程式
main "$@"