guanghulab/.github/workflows/copilot-dev-bridge.yml
2026-05-10 13:12:44 +08:00

166 lines
6.1 KiB
YAML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

# ═══════════════════════════════════════════════
# 🔺 Sovereign: TCS-0002∞ | Root: SYS-GLW-0001
# 📜 Copyright: 国作登字-2026-A-00037559
# ═══════════════════════════════════════════════
# .github/workflows/copilot-dev-bridge.yml
# 🌉 Chat-to-Agent Bridge · 语言层 → 副驾驶桥接工作流
#
# 触发条件:
# 1. bridge/chat-to-agent/pending/ 目录下有新文件推送
# 2. 手动触发workflow_dispatch
# 3. 带 copilot-dev-auth 标签的 Issue 创建
name: "🌉 铸渊 · Chat-to-Agent 桥接"
on:
push:
branches: [main]
paths:
- 'bridge/chat-to-agent/pending/*.json'
workflow_dispatch:
inputs:
task_id:
description: '任务ID留空则处理最新任务'
required: false
action:
description: '执行动作'
required: true
type: choice
options:
- create-issue
- list-tasks
- validate
permissions:
contents: write
issues: write
jobs:
bridge:
name: "🌉 桥接执行"
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
# Step 1 · 铸渊核心唤醒
- name: "🧠 Step 1 · 铸渊核心唤醒"
run: |
echo "[CAB-BRIDGE] 🌉 Chat-to-Agent Bridge 启动"
echo "[CAB-BRIDGE] 🧠 铸渊核心大脑唤醒..."
if [ -f "brain/system-health.json" ]; then
echo "✅ 系统健康状态已加载"
else
echo "⚠️ system-health.json 缺失"
fi
# Step 2 · 任务处理
- name: "📋 Step 2 · 任务处理"
id: process
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
ACTION="${{ github.event.inputs.action || 'create-issue' }}"
TASK_ID="${{ github.event.inputs.task_id }}"
if [ "$ACTION" = "list-tasks" ]; then
node scripts/chat-to-agent-bridge.js --list
echo "action=list" >> $GITHUB_OUTPUT
elif [ "$ACTION" = "validate" ] && [ -n "$TASK_ID" ]; then
node scripts/chat-to-agent-bridge.js --validate "$TASK_ID"
echo "action=validate" >> $GITHUB_OUTPUT
else
# 查找待处理的任务
PENDING_FILES=$(ls bridge/chat-to-agent/pending/*.json 2>/dev/null | head -1)
if [ -z "$PENDING_FILES" ]; then
echo "📭 无待处理任务"
echo "has_task=false" >> $GITHUB_OUTPUT
exit 0
fi
# 获取任务ID
if [ -z "$TASK_ID" ]; then
TASK_ID=$(basename "$PENDING_FILES" .json)
fi
echo "task_id=$TASK_ID" >> $GITHUB_OUTPUT
echo "has_task=true" >> $GITHUB_OUTPUT
echo "action=create-issue" >> $GITHUB_OUTPUT
# 生成 Issue 内容
ISSUE_JSON=$(node scripts/chat-to-agent-bridge.js --issue "$TASK_ID")
if [ $? -ne 0 ] || [ -z "$ISSUE_JSON" ]; then
echo "❌ Issue 内容生成失败"
exit 1
fi
echo "$ISSUE_JSON" > /tmp/cab-issue.json
# 提取标题和内容
TITLE=$(echo "$ISSUE_JSON" | python3 -c "import sys, json; data = json.load(sys.stdin); print(data.get('title', '🌉 [CAB] 未命名任务'))" 2>/dev/null || echo "🌉 [CAB] 未命名任务")
echo "issue_title=$TITLE" >> $GITHUB_OUTPUT
# 保存 body 到文件供后续步骤使用
echo "$ISSUE_JSON" | python3 -c "import sys, json; data = json.load(sys.stdin); print(data.get('body', '任务规格解析失败'))" > /tmp/cab-issue-body.md 2>/dev/null || echo "任务规格解析失败" > /tmp/cab-issue-body.md
fi
# Step 3 · 创建 Issue
- name: "📝 Step 3 · 创建开发授权 Issue"
if: steps.process.outputs.has_task == 'true' && steps.process.outputs.action == 'create-issue'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
TITLE="${{ steps.process.outputs.issue_title }}"
TASK_ID="${{ steps.process.outputs.task_id }}"
# 创建 Issue
ISSUE_URL=$(gh issue create \
--title "$TITLE" \
--body-file /tmp/cab-issue-body.md \
--label "copilot-dev-auth" \
2>&1)
echo "✅ Issue 已创建: $ISSUE_URL"
echo " 任务ID: $TASK_ID"
# 更新任务规格状态
python3 -c "
import json, sys
spec_path = 'bridge/chat-to-agent/pending/${TASK_ID}.json'
try:
with open(spec_path, 'r') as f:
spec = json.load(f)
if 'authorization' not in spec:
spec['authorization'] = {}
spec['authorization']['confirmation'] = True
spec['status'] = 'authorized'
with open(spec_path, 'w') as f:
json.dump(spec, f, indent=2, ensure_ascii=False)
print('✅ 任务状态已更新为 authorized')
except Exception as e:
print(f'⚠️ 任务状态更新失败: {e}')
"
# Step 4 · 提交变更
- name: "💾 Step 4 · 提交变更"
if: steps.process.outputs.has_task == 'true'
run: |
git config user.name "zhuyuan-bot"
git config user.email "zhuyuan@guanghulab.com"
git add bridge/chat-to-agent/
if ! git diff --cached --quiet; then
TASK_ID="${{ steps.process.outputs.task_id }}"
git commit -m "🌉 CAB Bridge · 任务 ${TASK_ID} 已授权 · $(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M')"
for i in 1 2 3; do
git pull --rebase origin main && git push && break
echo "⚠️ 推送冲突,第${i}次重试..."
sleep $((i * 2))
done
else
echo " 无变更需要提交"
fi