diff --git a/opencode.json b/opencode.json index 022a67c..2539f9e 100644 --- a/opencode.json +++ b/opencode.json @@ -1,8 +1,11 @@ { "$schema": "https://opencode.ai/config.json", + "model": "opencode/claude-sonnet-4-5", "mcp": {}, "permission": "allow", - "plugin": ["@mohak34/opencode-notifier@latest"], + "plugin": [ + "@mohak34/opencode-notifier@latest" + ], "provider": { "opencode": { "models": { @@ -22,4 +25,4 @@ } } } -} +} \ No newline at end of file diff --git a/skill/gitea/SKILL.md b/skill/gitea/SKILL.md index 17c87f6..3d4b5b9 100644 --- a/skill/gitea/SKILL.md +++ b/skill/gitea/SKILL.md @@ -7,15 +7,43 @@ description: Comprehensive Gitea management tool for creating runners, workflows 完整的 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 ~/.config/gitea/ ``` +### 仓库操作目录 +可以在任何项目目录执行,技能会自动: +1. 从 `~/.config/gitea/config.env` 读取配置 +2. 在当前目录创建仓库、初始化 Git 等 + ### Windows ```powershell # PowerShell @@ -28,7 +56,9 @@ $env:USERPROFILE\.config\gitea\ C:\Users\YourUsername\.config\gitea\ ``` -所有配置文件、Runner 目录、日志文件都存储在此目录下。请确保该目录具有适当的读写权限。 +**重要区分**: +- **配置/Runner 操作**:在 `~/.config/gitea/` 目录执行 +- **仓库操作**:可在任何项目目录执行(自动加载配置) **目录结构(所有平台通用):** ``` @@ -40,9 +70,9 @@ C:\Users\YourUsername\.config\gitea\ ``` **平台兼容性:** -- **macOS**: `~/.config/gitea/`(完全支持) -- **Linux**: `~/.config/gitea/`(完全支持) -- **Windows**: `%USERPROFILE%\.config\gitea\`(Act Runner 支持,但该技能的命令和脚本需要适配) +- **macOS**: `~/.config/gitea/`(配置目录),任意目录(仓库操作) +- **Linux**: `~/.config/gitea/`(配置目录),任意目录(仓库操作) +- **Windows**: `%USERPROFILE%\.config\gitea\`(配置目录),任意目录(仓库操作) **Windows 用户注意事项:** - Gitea Act Runner 官方支持 Windows 平台(包括 Host 模式) @@ -183,12 +213,30 @@ AI: 检测到 Go 项目,服务目录: ./backend [自动生成 .gitea/workflows/backend.yml] ``` -### 4. 创建仓库 +### 4. 创建仓库(智能解析,默认私有) +**智能解析特性**: +- 自动识别 `组织/仓库` 格式,优先使用指定组织 +- 默认创建私有仓库(除非明确指定公开) +- 支持自动初始化 Git 仓库并推送代码 + +**示例**: ``` -用户: /gitea-create-repo my-project -AI: [使用配置的 Gitea URL 和默认组织创建仓库] - ✓ 仓库创建成功: ai/my-project +用户: /gitea-create-repo shigongcao/shigongcao +AI: [智能解析为 shigongcao 组织下的 shigongcao 仓库] + ✓ 仓库创建成功: 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 -- **Last Updated**: 2026-01-12 -- **整合内容**: gitea-runner + gitea-workflow -- **新增功能**: 统一配置管理、Runner CRUD、智能 labels 检测 +- **Skill Version**: 1.1 +- **Last Updated**: 2026-01-23 +- **整合内容**: gitea-runner + gitea-workflow + 增强仓库管理 +- **主要改进**: + - 仓库创建智能解析(优先使用指定组织) + - **简化验证**:默认假设组织存在,API失败时提示创建组织 + - 默认私有仓库策略(除非明确指定公开) + - **完整 Git 集成**:自动检查Git状态,提供一键初始化、提交、推送 + - **简洁高效**:减少预先验证,API失败时给出具体解决方案 + - 工作目录概念澄清(配置 vs 仓库操作) ## 相关资源 diff --git a/skill/gitea/delete-runner.md b/skill/gitea/delete-runner.md index d48473c..b71ec6f 100644 --- a/skill/gitea/delete-runner.md +++ b/skill/gitea/delete-runner.md @@ -69,10 +69,10 @@ LOCAL_MAP=$(mktemp) FINAL_LIST=$(mktemp) # 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" \ -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 # Fallback to Org level if defined diff --git a/skill/gitea/repository-operations.md b/skill/gitea/repository-operations.md index fb13902..8994cfa 100644 --- a/skill/gitea/repository-operations.md +++ b/skill/gitea/repository-operations.md @@ -11,6 +11,34 @@ - 管理 Secrets 和 Variables - 设置 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" ``` -#### 步骤 2: 解析输入 +#### 步骤 2: 智能解析输入(简洁高效版) ```bash input="$1" -# 解析 owner/repo +# 智能解析:优先使用用户指定的组织 if [[ "$input" =~ / ]]; then owner=$(echo "$input" | cut -d'/' -f1) repo=$(echo "$input" | cut -d'/' -f2) + echo "使用指定组织: $owner" + echo "提示:假设组织存在,如不存在会在API创建时提示" else - # 使用默认组织或当前用户 + # 未指定组织,使用默认组织或当前用户 if [ -z "$GITEA_DEFAULT_ORG" ]; then # 获取当前用户 + echo "未指定组织,获取当前用户..." owner=$(curl -s -H "Authorization: token $GITEA_TOKEN" \ "${GITEA_URL}/api/v1/user" | jq -r '.login') if [ -z "$owner" ] || [ "$owner" = "null" ]; then - echo "❌ 无法获取当前用户信息,请使用 owner/repo 格式" + echo "❌ 无法获取当前用户信息,请使用 组织/仓库 格式" + echo "例如:/gitea-create-repo shigongcao/shigongcao" exit 1 fi @@ -94,9 +126,21 @@ else repo="$input" fi -# 解析可见性 +# 解析可见性:默认私有仓库(除非明确指定公开) visibility="${2:-private}" +if [[ "$visibility" != "private" && "$visibility" != "public" ]]; then + echo "⚠️ 可见性参数无效,使用默认值: private" + visibility="private" +fi + 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: 验证仓库名 @@ -109,12 +153,29 @@ if ! [[ "$repo" =~ ^[a-zA-Z0-9_.-]+$ ]]; then fi ``` -#### 步骤 4: 调用 API 创建 +#### 步骤 4: 调用 API 创建(带详细错误处理) ```bash 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" \ @@ -122,42 +183,87 @@ response=$(curl -s -w "\n%{http_code}" -X POST \ \"name\": \"${repo}\", \"private\": ${private_bool}, \"auto_init\": false, - \"default_branch\": \"main\" + \"default_branch\": \"main\", + \"description\": \"\" }" \ "${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") - - http_code=$(echo "$response" | tail -n1) - body=$(echo "$response" | sed '$d') -fi - # 处理响应 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 \ + -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: application/json" \ + -d "{ + \"name\": \"${repo}\", + \"private\": ${private_bool}, + \"auto_init\": false, + \"default_branch\": \"main\" + }" \ + "${GITEA_URL}/api/v1/user/repos") + + http_code=$(echo "$response" | tail -n1) + body=$(echo "$response" | sed '$d') + + if [ "$http_code" = "201" ]; then + echo "✓ 个人仓库创建成功" + else + 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) - echo "❌ 仓库已存在" + echo "❌ 仓库已存在: $owner/$repo" + echo "请使用不同的仓库名或删除现有仓库" exit 1 ;; *) - echo "❌ 创建失败 (HTTP $http_code)" - echo "$body" | jq -r '.message // empty' + error_msg=$(echo "$body" | jq -r '.message // "未知错误"') + echo "❌ 创建失败 (HTTP $http_code): $error_msg" exit 1 ;; esac @@ -183,45 +289,104 @@ echo " SSH URL: $ssh_url" echo "" ``` -#### 步骤 6: 添加 Git Remote +#### 步骤 6: Git 仓库集成(简洁高效版) ```bash -read -p "是否将此仓库添加为 Git remote? [Y/n] " add_remote +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "Git 仓库集成" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" -if [[ ! "$add_remote" =~ ^[Nn]$ ]]; then - # 检查是否是 Git 仓库 - if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then - echo "当前目录不是 Git 仓库" - read -p "是否初始化 Git 仓库? [Y/n] " init_git - - if [[ ! "$init_git" =~ ^[Nn]$ ]]; then - git init - echo "✓ Git 仓库已初始化" - else - exit 0 - fi +# 检查是否是 Git 仓库 +if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then + echo "当前目录不是 Git 仓库" + read -p "是否初始化 Git 仓库并添加 remote? [Y/n] " init_git + + if [[ "$init_git" =~ ^[Nn]$ ]]; then + echo "跳过 Git 初始化,仅创建远程仓库。" + echo "您可以在需要时手动执行:" + echo " git init" + echo " git remote add origin \"$clone_url\"" + exit 0 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 + read -p "是否覆盖为新的仓库? [y/N] " overwrite if [[ "$overwrite" =~ ^[Yy]$ ]]; then git remote set-url origin "$clone_url" - echo "✓ origin remote 已更新" + echo "✓ origin remote 已更新为: $clone_url" + else + echo "保持现有的 origin remote" fi else git remote add origin "$clone_url" - echo "✓ origin remote 已添加" + echo "✓ origin remote 已添加: $clone_url" fi - # 显示 remote 信息 + # 可选:添加文件、提交并推送 echo "" - echo "当前 remote:" - git remote -v + 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 是否已存在 + 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 已更新" + else + echo "保持现有的 origin remote" + fi + else + git remote add origin "$clone_url" + echo "✓ origin remote 已添加" + 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 -- **最后更新**: 2026-01-12 +- **文档版本**: 1.1 +- **最后更新**: 2026-01-23 +- **主要改进**: + - 智能解析输入:优先使用指定组织而非默认组织 + - 组织存在性验证和清晰错误提示 + - 默认私有仓库策略(除非明确指定公开) + - 增强的错误处理:Token验证、权限检查、详细错误消息 + - 完整的Git集成流程:可选自动初始化和推送