176 lines
4.6 KiB
Bash
Executable File
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 "$@" |