fix(gitea): 修复 delete-runner API 端点错误

- 修复 delete-runner.md 中的 API 端点从 /api/v1/admin/runners 改为 /api/v1/admin/actions/runners
- 更新 SKILL.md 和 repository-operations.md 文档
- 更新 opencode.json 配置
This commit is contained in:
voson
2026-01-28 08:48:04 +08:00
parent 02d870a2d6
commit 32d674a4c0
4 changed files with 296 additions and 68 deletions

View File

@@ -1,8 +1,11 @@
{ {
"$schema": "https://opencode.ai/config.json", "$schema": "https://opencode.ai/config.json",
"model": "opencode/claude-sonnet-4-5",
"mcp": {}, "mcp": {},
"permission": "allow", "permission": "allow",
"plugin": ["@mohak34/opencode-notifier@latest"], "plugin": [
"@mohak34/opencode-notifier@latest"
],
"provider": { "provider": {
"opencode": { "opencode": {
"models": { "models": {

View File

@@ -7,15 +7,43 @@ description: Comprehensive Gitea management tool for creating runners, workflows
完整的 Gitea 管理工具,提供 Runner、Workflow、仓库的创建和管理功能。 完整的 Gitea 管理工具,提供 Runner、Workflow、仓库的创建和管理功能。
## 最新改进 (2026-01-23)
### 仓库创建功能增强(简洁高效版)
1. **智能解析**:自动识别 `组织/仓库` 格式,优先使用指定组织而非默认组织
2. **简化验证**默认假设组织存在API创建失败时清晰提示如何创建组织
3. **默认私有**:除非明确指定,所有仓库默认创建为私有
4. **Git集成**自动检查当前目录是否为Git仓库提供一键初始化、提交、推送
5. **错误处理**详细的Token验证、权限检查API错误时给出具体解决方案
6. **工作目录澄清**:仓库操作可在任何目录执行,配置操作在 `~/.config/gitea/`
7. **流程优化**减少不必要的预先验证API失败时再提示更简洁高效
### 使用示例
```bash
# 智能解析组织/仓库格式
/gitea-create-repo shigongcao/shigongcao
# 创建公开仓库
/gitea-create-repo org/project public
# 自动初始化并推送
/gitea-create-repo org/project --init
```
## 工作目录 ## 工作目录
**重要:该技能和所有相关命令的工作目录统一为:** **重要:Gitea 配置和 Runner 相关操作的工作目录为 `~/.config/gitea/`,但仓库操作可以在任何目录执行。**
### macOS / Linux ### 配置和 Runner 目录
```bash ```bash
~/.config/gitea/ ~/.config/gitea/
``` ```
### 仓库操作目录
可以在任何项目目录执行,技能会自动:
1.`~/.config/gitea/config.env` 读取配置
2. 在当前目录创建仓库、初始化 Git 等
### Windows ### Windows
```powershell ```powershell
# PowerShell # PowerShell
@@ -28,7 +56,9 @@ $env:USERPROFILE\.config\gitea\
C:\Users\YourUsername\.config\gitea\ C:\Users\YourUsername\.config\gitea\
``` ```
所有配置文件、Runner 目录、日志文件都存储在此目录下。请确保该目录具有适当的读写权限。 **重要区分**
- **配置/Runner 操作**:在 `~/.config/gitea/` 目录执行
- **仓库操作**:可在任何项目目录执行(自动加载配置)
**目录结构(所有平台通用):** **目录结构(所有平台通用):**
``` ```
@@ -40,9 +70,9 @@ C:\Users\YourUsername\.config\gitea\
``` ```
**平台兼容性:** **平台兼容性:**
- **macOS**: `~/.config/gitea/`完全支持 - **macOS**: `~/.config/gitea/`配置目录),任意目录(仓库操作
- **Linux**: `~/.config/gitea/`完全支持 - **Linux**: `~/.config/gitea/`配置目录),任意目录(仓库操作
- **Windows**: `%USERPROFILE%\.config\gitea\`Act Runner 支持,但该技能的命令和脚本需要适配 - **Windows**: `%USERPROFILE%\.config\gitea\`配置目录),任意目录(仓库操作
**Windows 用户注意事项:** **Windows 用户注意事项:**
- Gitea Act Runner 官方支持 Windows 平台(包括 Host 模式) - Gitea Act Runner 官方支持 Windows 平台(包括 Host 模式)
@@ -183,12 +213,30 @@ AI: 检测到 Go 项目,服务目录: ./backend
[自动生成 .gitea/workflows/backend.yml] [自动生成 .gitea/workflows/backend.yml]
``` ```
### 4. 创建仓库 ### 4. 创建仓库(智能解析,默认私有)
**智能解析特性**
- 自动识别 `组织/仓库` 格式,优先使用指定组织
- 默认创建私有仓库(除非明确指定公开)
- 支持自动初始化 Git 仓库并推送代码
**示例**
``` ```
用户: /gitea-create-repo my-project 用户: /gitea-create-repo shigongcao/shigongcao
AI: [使用配置的 Gitea URL 和默认组织创建仓库] AI: [智能解析为 shigongcao 组织下的 shigongcao 仓库]
✓ 仓库创建成功: ai/my-project ✓ 仓库创建成功: shigongcao/shigongcao (私有)
✓ 组织验证通过
✓ 可选的 Git 初始化流程...
用户: /gitea-create-repo my-project public
AI: [使用默认组织创建公开仓库]
✓ 仓库创建成功: ai/my-project (公开)
用户: /gitea-create-repo org/project --init
AI: [创建仓库并自动初始化当前目录的 Git 仓库]
✓ 仓库创建成功: org/project
✓ Git 初始化完成
✓ 代码已推送到远程仓库
``` ```
## 配置管理 ## 配置管理
@@ -376,10 +424,16 @@ AI 会自动:
## 版本 ## 版本
- **Skill Version**: 1.0 - **Skill Version**: 1.1
- **Last Updated**: 2026-01-12 - **Last Updated**: 2026-01-23
- **整合内容**: gitea-runner + gitea-workflow - **整合内容**: gitea-runner + gitea-workflow + 增强仓库管理
- **新增功能**: 统一配置管理、Runner CRUD、智能 labels 检测 - **主要改进**:
- 仓库创建智能解析(优先使用指定组织)
- **简化验证**默认假设组织存在API失败时提示创建组织
- 默认私有仓库策略(除非明确指定公开)
- **完整 Git 集成**自动检查Git状态提供一键初始化、提交、推送
- **简洁高效**减少预先验证API失败时给出具体解决方案
- 工作目录概念澄清(配置 vs 仓库操作)
## 相关资源 ## 相关资源

View File

@@ -69,10 +69,10 @@ LOCAL_MAP=$(mktemp)
FINAL_LIST=$(mktemp) FINAL_LIST=$(mktemp)
# 2.1 Fetch Remote Runners (Try Admin first, then Org) # 2.1 Fetch Remote Runners (Try Admin first, then Org)
# Note: Admin endpoint /api/v1/admin/runners lists all runners # Note: Admin endpoint /api/v1/admin/actions/runners lists all runners
HTTP_CODE=$(curl -s -w "%{http_code}" -o "$REMOTE_LIST" \ HTTP_CODE=$(curl -s -w "%{http_code}" -o "$REMOTE_LIST" \
-H "Authorization: token $GITEA_TOKEN" \ -H "Authorization: token $GITEA_TOKEN" \
"${GITEA_URL}/api/v1/admin/runners?page=1&limit=100") "${GITEA_URL}/api/v1/admin/actions/runners?page=1&limit=100")
if [ "$HTTP_CODE" != "200" ]; then if [ "$HTTP_CODE" != "200" ]; then
# Fallback to Org level if defined # Fallback to Org level if defined

View File

@@ -11,6 +11,34 @@
- 管理 Secrets 和 Variables - 管理 Secrets 和 Variables
- 设置 Webhooks - 设置 Webhooks
## 快速使用
### 核心原则(简洁高效)
1. **智能解析**:自动识别 `组织/仓库` 格式,优先使用指定组织而非默认组织
2. **默认私有**:除非明确指定,所有仓库默认创建为私有
3. **简化验证**默认假设组织存在API创建失败时清晰提示解决方案
4. **Git集成**自动检查Git仓库状态提供一键初始化、提交、推送完整流程
5. **错误处理**API失败时给出具体操作建议而非预先复杂验证
### 常用命令(简洁高效)
```bash
# 智能解析组织/仓库格式(默认私有)
/gitea-create-repo shigongcao/shigongcao
# 使用默认组织创建公开仓库
/gitea-create-repo my-project public
# 自动检查Git状态提供完整初始化流程
/gitea-create-repo org/project
# 特性说明:
# 1. 自动识别组织/仓库格式
# 2. 默认创建私有仓库除非指定public
# 3. 自动检查当前目录Git状态
# 4. 提供一键初始化、提交、推送选项
# 5. API失败时给出清晰解决方案如组织不存在
```
## 创建仓库 ## 创建仓库
### 使用命令创建 ### 使用命令创建
@@ -65,24 +93,28 @@ fi
source "$config_file" source "$config_file"
``` ```
#### 步骤 2: 解析输入 #### 步骤 2: 智能解析输入(简洁高效版)
```bash ```bash
input="$1" input="$1"
# 解析 owner/repo # 智能解析:优先使用用户指定的组织
if [[ "$input" =~ / ]]; then if [[ "$input" =~ / ]]; then
owner=$(echo "$input" | cut -d'/' -f1) owner=$(echo "$input" | cut -d'/' -f1)
repo=$(echo "$input" | cut -d'/' -f2) repo=$(echo "$input" | cut -d'/' -f2)
echo "使用指定组织: $owner"
echo "提示假设组织存在如不存在会在API创建时提示"
else else
# 使用默认组织或当前用户 # 未指定组织,使用默认组织或当前用户
if [ -z "$GITEA_DEFAULT_ORG" ]; then if [ -z "$GITEA_DEFAULT_ORG" ]; then
# 获取当前用户 # 获取当前用户
echo "未指定组织,获取当前用户..."
owner=$(curl -s -H "Authorization: token $GITEA_TOKEN" \ owner=$(curl -s -H "Authorization: token $GITEA_TOKEN" \
"${GITEA_URL}/api/v1/user" | jq -r '.login') "${GITEA_URL}/api/v1/user" | jq -r '.login')
if [ -z "$owner" ] || [ "$owner" = "null" ]; then if [ -z "$owner" ] || [ "$owner" = "null" ]; then
echo "❌ 无法获取当前用户信息,请使用 owner/repo 格式" echo "❌ 无法获取当前用户信息,请使用 组织/仓库 格式"
echo "例如:/gitea-create-repo shigongcao/shigongcao"
exit 1 exit 1
fi fi
@@ -94,9 +126,21 @@ else
repo="$input" repo="$input"
fi fi
# 解析可见性 # 解析可见性:默认私有仓库(除非明确指定公开)
visibility="${2:-private}" visibility="${2:-private}"
if [[ "$visibility" != "private" && "$visibility" != "public" ]]; then
echo "⚠️ 可见性参数无效,使用默认值: private"
visibility="private"
fi
private_bool=$([ "$visibility" = "private" ] && echo "true" || echo "false") private_bool=$([ "$visibility" = "private" ] && echo "true" || echo "false")
echo "仓库可见性: $visibility"
# 提前检查当前目录是否是 Git 仓库(为后续步骤做准备)
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "⚠️ 当前目录不是 Git 仓库"
echo "提示:创建远程仓库后可以初始化本地 Git 仓库并推送代码"
fi
``` ```
#### 步骤 3: 验证仓库名 #### 步骤 3: 验证仓库名
@@ -109,12 +153,73 @@ if ! [[ "$repo" =~ ^[a-zA-Z0-9_.-]+$ ]]; then
fi fi
``` ```
#### 步骤 4: 调用 API 创建 #### 步骤 4: 调用 API 创建(带详细错误处理)
```bash ```bash
echo "正在创建仓库: $owner/$repo ($visibility)" echo "正在创建仓库: $owner/$repo ($visibility)"
# 尝试组织仓库 # 检查 Token 权限
echo "检查 Token 权限..."
user_info=$(curl -s -H "Authorization: token $GITEA_TOKEN" "${GITEA_URL}/api/v1/user")
username=$(echo "$user_info" | jq -r '.login // empty')
if [ -z "$username" ] || [ "$username" = "null" ]; then
echo "❌ Token 无效或权限不足"
echo "请检查:"
echo "1. Token 是否有效"
echo "2. Token 是否有 'repo' 权限"
echo "3. GITEA_URL 是否正确"
exit 1
fi
echo "✓ Token 有效,当前用户: $username"
# 尝试创建组织仓库
echo "调用 Gitea API 创建仓库..."
response=$(curl -s -w "\n%{http_code}" -X POST \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"name\": \"${repo}\",
\"private\": ${private_bool},
\"auto_init\": false,
\"default_branch\": \"main\",
\"description\": \"\"
}" \
"${GITEA_URL}/api/v1/orgs/${owner}/repos")
http_code=$(echo "$response" | tail -n1)
body=$(echo "$response" | sed '$d')
# 处理响应
case "$http_code" in
201)
echo "✓ 仓库创建成功"
;;
400)
error_msg=$(echo "$body" | jq -r '.message // "未知错误"')
echo "❌ 请求参数错误: $error_msg"
echo "请检查:"
echo "1. 仓库名格式是否正确"
echo "2. 是否缺少必要参数"
exit 1
;;
403)
echo "❌ 权限不足"
echo "请检查:"
echo "1. 是否有在组织 '$owner' 下创建仓库的权限"
echo "2. 是否是组织成员"
echo "3. Token 权限是否足够"
exit 1
;;
404)
# 组织不存在API 返回 404
echo "❌ API 创建失败:组织 '$owner' 不存在"
# 检查是否为当前用户(可能用户输入的是自己的用户名)
if [ "$owner" = "$username" ]; then
echo "检测到 '$owner' 是当前用户,创建个人仓库..."
response=$(curl -s -w "\n%{http_code}" -X POST \ response=$(curl -s -w "\n%{http_code}" -X POST \
-H "Authorization: token $GITEA_TOKEN" \ -H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
@@ -124,40 +229,41 @@ response=$(curl -s -w "\n%{http_code}" -X POST \
\"auto_init\": false, \"auto_init\": false,
\"default_branch\": \"main\" \"default_branch\": \"main\"
}" \ }" \
"${GITEA_URL}/api/v1/orgs/${owner}/repos")
http_code=$(echo "$response" | tail -n1)
body=$(echo "$response" | sed '$d')
# 如果 404可能是用户而非组织
if [ "$http_code" = "404" ]; then
echo "⚠️ 组织不存在,尝试创建用户仓库..."
response=$(curl -s -w "\n%{http_code}" -X POST \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"name\": \"${repo}\",
\"private\": ${private_bool}
}" \
"${GITEA_URL}/api/v1/user/repos") "${GITEA_URL}/api/v1/user/repos")
http_code=$(echo "$response" | tail -n1) http_code=$(echo "$response" | tail -n1)
body=$(echo "$response" | sed '$d') body=$(echo "$response" | sed '$d')
fi
# 处理响应 if [ "$http_code" = "201" ]; then
case "$http_code" in echo "✓ 个人仓库创建成功"
201) else
echo "✓ 仓库创建成功" error_msg=$(echo "$body" | jq -r '.message // "未知错误"')
echo "❌ 个人仓库创建失败 (HTTP $http_code): $error_msg"
exit 1
fi
else
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "组织不存在,请先创建组织"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "您可以通过以下方式创建组织 '$owner'"
echo "1. 访问 ${GITEA_URL}/org/create"
echo "2. 使用 Gitea Web 界面创建组织"
echo "3. 或者使用个人仓库格式: $username/$repo"
echo ""
echo "创建组织后,重新运行此命令创建仓库。"
exit 1
fi
;; ;;
409) 409)
echo "❌ 仓库已存在" echo "❌ 仓库已存在: $owner/$repo"
echo "请使用不同的仓库名或删除现有仓库"
exit 1 exit 1
;; ;;
*) *)
echo "❌ 创建失败 (HTTP $http_code)" error_msg=$(echo "$body" | jq -r '.message // "未知错误"')
echo "$body" | jq -r '.message // empty' echo "❌ 创建失败 (HTTP $http_code): $error_msg"
exit 1 exit 1
;; ;;
esac esac
@@ -183,25 +289,78 @@ echo " SSH URL: $ssh_url"
echo "" echo ""
``` ```
#### 步骤 6: 添加 Git Remote #### 步骤 6: Git 仓库集成(简洁高效版)
```bash ```bash
read -p "是否将此仓库添加为 Git remote? [Y/n] " add_remote echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Git 仓库集成"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
if [[ ! "$add_remote" =~ ^[Nn]$ ]]; then
# 检查是否是 Git 仓库 # 检查是否是 Git 仓库
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "当前目录不是 Git 仓库" echo "当前目录不是 Git 仓库"
read -p "是否初始化 Git 仓库? [Y/n] " init_git read -p "是否初始化 Git 仓库并添加 remote? [Y/n] " init_git
if [[ ! "$init_git" =~ ^[Nn]$ ]]; then if [[ "$init_git" =~ ^[Nn]$ ]]; then
git init echo "跳过 Git 初始化,仅创建远程仓库。"
echo "✓ Git 仓库已初始化" echo "您可以在需要时手动执行:"
else echo " git init"
echo " git remote add origin \"$clone_url\""
exit 0 exit 0
fi fi
# 初始化 Git 仓库
echo "正在初始化 Git 仓库..."
git init
echo "✓ Git 仓库已初始化"
# 检查 origin 是否已存在
if git remote get-url origin >/dev/null 2>&1; then
existing_url=$(git remote get-url origin)
echo "⚠️ origin remote 已存在: $existing_url"
read -p "是否覆盖为新的仓库? [y/N] " overwrite
if [[ "$overwrite" =~ ^[Yy]$ ]]; then
git remote set-url origin "$clone_url"
echo "✓ origin remote 已更新为: $clone_url"
else
echo "保持现有的 origin remote"
fi
else
git remote add origin "$clone_url"
echo "✓ origin remote 已添加: $clone_url"
fi fi
# 可选:添加文件、提交并推送
echo ""
read -p "是否添加当前文件、提交并推送到远程仓库? [Y/n] " push_code
if [[ ! "$push_code" =~ ^[Nn]$ ]]; then
echo "添加所有文件到暂存区..."
git add .
echo "创建初始提交..."
git commit -m "Initial commit" || {
echo "⚠️ 提交失败(可能没有文件可提交)"
echo "请手动添加文件后提交"
}
echo "推送到远程仓库 (main 分支)..."
git branch -M main 2>/dev/null
git push -u origin main
echo "✓ 代码已推送到远程仓库"
else
echo "跳过推送,您可以在需要时手动推送代码。"
fi
else
# 已经是 Git 仓库,询问是否添加/更新 remote
echo "当前目录已是 Git 仓库"
read -p "是否添加/更新 origin remote 为此仓库? [Y/n] " add_remote
if [[ ! "$add_remote" =~ ^[Nn]$ ]]; then
# 检查 origin 是否已存在 # 检查 origin 是否已存在
if git remote get-url origin >/dev/null 2>&1; then if git remote get-url origin >/dev/null 2>&1; then
existing_url=$(git remote get-url origin) existing_url=$(git remote get-url origin)
@@ -211,17 +370,23 @@ if [[ ! "$add_remote" =~ ^[Nn]$ ]]; then
if [[ "$overwrite" =~ ^[Yy]$ ]]; then if [[ "$overwrite" =~ ^[Yy]$ ]]; then
git remote set-url origin "$clone_url" git remote set-url origin "$clone_url"
echo "✓ origin remote 已更新" echo "✓ origin remote 已更新"
else
echo "保持现有的 origin remote"
fi fi
else else
git remote add origin "$clone_url" git remote add origin "$clone_url"
echo "✓ origin remote 已添加" echo "✓ origin remote 已添加"
fi fi
# 显示 remote 信息
echo ""
echo "当前 remote:"
git remote -v
fi fi
fi
# 显示当前状态
echo ""
echo "当前 Git 状态:"
git status --short 2>/dev/null || echo "(非 Git 仓库)"
echo ""
echo "Remote 配置:"
git remote -v 2>/dev/null || echo "(无 remote 配置)"
``` ```
## 仓库初始化 ## 仓库初始化
@@ -689,5 +854,11 @@ curl -s -H "Authorization: token $GITEA_TOKEN" \
## 版本 ## 版本
- **文档版本**: 1.0 - **文档版本**: 1.1
- **最后更新**: 2026-01-12 - **最后更新**: 2026-01-23
- **主要改进**:
- 智能解析输入:优先使用指定组织而非默认组织
- 组织存在性验证和清晰错误提示
- 默认私有仓库策略(除非明确指定公开)
- 增强的错误处理Token验证、权限检查、详细错误消息
- 完整的Git集成流程可选自动初始化和推送