star-cloud/workflow
sky121113 7766fce1d4 [FEAT] 新增全域 workflow 指令入口
1. 新增 ./workflow 統一執行器,支援 load-ids、daily-work-log、hotfix-prod、demo-day-pptx、start-task、promote-env、monthly-report、now-push。
2. 補充 docs/workflow-commands.md 使用說明與參數範例,便於團隊直接操作。
2026-05-28 16:20:27 +08:00

219 lines
5.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
set -euo pipefail
WF_DIR="${HOME}/.gemini/config/global_workflows"
SELF_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
usage() {
cat <<'EOF'
Usage:
./workflow list
./workflow run <name> [args...]
Workflows:
load-ids
daily-work-log
hotfix-prod <hotfix-name>
demo-day-pptx
start-task <feat|fix|refactor|docs> <task-name-kebab> [--stash]
promote-env <dev|demo> <demo|main> [--force-main]
monthly-report <year> <month>
now-push <target-branch> <prefix:FIX|FEAT|DOCS|STYLE|REFACTOR> "<summary>" ["detail 1" "detail 2"...]
EOF
}
require_repo() {
git -C "${SELF_DIR}" rev-parse --is-inside-work-tree >/dev/null
}
ensure_dev_window_for_main() {
local now_dow now_hm
now_dow="$(date +%u)" # 1..7 = Mon..Sun
now_hm="$(date +%H%M)"
if [[ "${now_dow}" -gt 4 || "${now_hm}" -gt 1200 ]]; then
echo "WARNING: 現在不在標準上線時段(週一至週四 12:00 前)。"
if [[ "${1:-}" != "--force-main" ]]; then
echo "中止。若確認要繼續,請加上 --force-main。"
exit 1
fi
fi
}
cmd_list() {
ls -1 "${WF_DIR}" 2>/dev/null | sed 's/\.md$//'
}
cmd_load_ids() {
sed -n '1,120p' "${HOME}/.gemini/AGENTS.md"
echo
sed -n '1,120p' "${HOME}/.gemini/GEMINI.md"
echo
echo "身份與全域規範已加載完成。"
}
cmd_daily_work_log() {
require_repo
git -C "${SELF_DIR}" log --since="midnight" --pretty=format:"%h - %s (%an)"
}
cmd_hotfix_prod() {
require_repo
local name="${1:-}"
if [[ -z "${name}" ]]; then
echo "hotfix-prod 需要 hotfix 名稱。"
exit 1
fi
git -C "${SELF_DIR}" checkout main
git -C "${SELF_DIR}" pull origin main
git -C "${SELF_DIR}" checkout -b "hotfix/${name}"
echo "已建立分支 hotfix/${name}。完成修復後請自行合併到 main再回補 demo/dev。"
}
cmd_demo_day_pptx() {
cat <<'EOF'
demo-day-pptx 已觸發:
1) 先產出 implementation_plan.md7-9頁給你確認
2) 確認後再執行 PPTX 產製
EOF
}
cmd_start_task() {
require_repo
local kind="${1:-}" name="${2:-}" stash_opt="${3:-}"
if [[ ! "${kind}" =~ ^(feat|fix|refactor|docs)$ ]] || [[ -z "${name}" ]]; then
echo "用法:./workflow run start-task <feat|fix|refactor|docs> <task-name-kebab> [--stash]"
exit 1
fi
if [[ -n "$(git -C "${SELF_DIR}" status --porcelain)" && "${stash_opt}" == "--stash" ]]; then
git -C "${SELF_DIR}" stash push -u -m "workflow:start-task"
fi
git -C "${SELF_DIR}" checkout dev
git -C "${SELF_DIR}" pull origin dev
git -C "${SELF_DIR}" checkout -b "${kind}/${name}"
if git -C "${SELF_DIR}" stash list | rg -q "workflow:start-task"; then
git -C "${SELF_DIR}" stash pop || true
fi
echo "已切到分支 ${kind}/${name}"
}
cmd_promote_env() {
require_repo
local src="${1:-}" dst="${2:-}" force_main="${3:-}"
if [[ -z "${src}" || -z "${dst}" ]]; then
echo "用法:./workflow run promote-env <dev|demo> <demo|main> [--force-main]"
exit 1
fi
if [[ "${src}" == "dev" && "${dst}" != "demo" ]]; then
echo "僅允許 dev -> demo。"
exit 1
fi
if [[ "${src}" == "demo" && "${dst}" != "main" ]]; then
echo "僅允許 demo -> main。"
exit 1
fi
if [[ "${dst}" == "main" ]]; then
ensure_dev_window_for_main "${force_main:-}"
fi
echo "=== 待晉升提交 ==="
git -C "${SELF_DIR}" log "${dst}..${src}" --oneline || true
echo
echo "=== 敏感檔案檢查 ==="
git -C "${SELF_DIR}" diff --name-only "${dst}...${src}" | rg "^(database/migrations/|\.env\.example|rbac-rules\.md)" || true
git -C "${SELF_DIR}" checkout "${dst}"
git -C "${SELF_DIR}" pull origin "${dst}"
git -C "${SELF_DIR}" merge "${src}" --no-ff -m "[PROMOTE] ${src} -> ${dst}"
git -C "${SELF_DIR}" push origin "${dst}"
git -C "${SELF_DIR}" checkout dev
}
cmd_monthly_report() {
local year="${1:-}" month="${2:-}"
if [[ ! "${year}" =~ ^[0-9]{4}$ ]] || [[ ! "${month}" =~ ^[0-9]{1,2}$ ]]; then
echo "用法:./workflow run monthly-report <year> <month>"
exit 1
fi
local out="${SELF_DIR}/docs/monthly-report-${year}-$(printf "%02d" "${month}").md"
mkdir -p "${SELF_DIR}/docs"
cat > "${out}" <<EOF
# Monthly Report Draft (${year}-$(printf "%02d" "${month}"))
## Data Source
- Notion Work Log (to be fetched)
- Git commits for the target month
## Slide Plan
1. 封面與概要
2. 月初至月底時序成果
3. 關鍵技術專題
4. 下月展望
EOF
echo "已建立草稿:${out}"
}
cmd_now_push() {
require_repo
local target="${1:-}" prefix="${2:-}" summary="${3:-}"
shift 3 || true
if [[ -z "${target}" || -z "${prefix}" || -z "${summary}" ]]; then
echo '用法:./workflow run now-push <target-branch> <prefix:FIX|FEAT|DOCS|STYLE|REFACTOR> "<summary>" ["detail 1" ...]'
exit 1
fi
local p="[${prefix}]"
if [[ ! "${p}" =~ ^\[(FIX|FEAT|DOCS|STYLE|REFACTOR)\]$ ]]; then
echo "prefix 僅能為 FIX/FEAT/DOCS/STYLE/REFACTOR"
exit 1
fi
if [[ "${target}" == "main" ]]; then
ensure_dev_window_for_main "${4:-}"
fi
local msg="${p} ${summary}"
if [[ "$#" -gt 0 ]]; then
msg+=$'\n\n'
local i=1
for item in "$@"; do
msg+="${i}. ${item}"$'\n'
i=$((i+1))
done
fi
git -C "${SELF_DIR}" add -A
git -C "${SELF_DIR}" commit -m "${msg}"
local cur
cur="$(git -C "${SELF_DIR}" branch --show-current)"
git -C "${SELF_DIR}" push origin "${cur}:${target}"
}
main() {
local action="${1:-}"
case "${action}" in
list) cmd_list ;;
run)
local name="${2:-}"
shift 2 || true
case "${name}" in
load-ids) cmd_load_ids "$@" ;;
daily-work-log) cmd_daily_work_log "$@" ;;
hotfix-prod) cmd_hotfix_prod "$@" ;;
demo-day-pptx) cmd_demo_day_pptx "$@" ;;
start-task) cmd_start_task "$@" ;;
promote-env) cmd_promote_env "$@" ;;
monthly-report) cmd_monthly_report "$@" ;;
now-push) cmd_now_push "$@" ;;
*) usage; exit 1 ;;
esac
;;
*) usage; exit 1 ;;
esac
}
main "$@"