Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 43e138b19e | |||
| 75462f3412 | |||
| 5d9efea7ab |
21
README.md
21
README.md
@@ -1,30 +1,14 @@
|
||||
# OpenCode
|
||||
|
||||
|
||||
## 📊 项目统计
|
||||
|
||||
- **15 个 CLI 命令** - 涵盖 Git 和 Gitea 操作
|
||||
- **7 个开发领域技能库** - Android、iOS、Go、Electron、MQTT 等
|
||||
- **4 套 CI/CD 工作流模板** - 适配多种项目类型
|
||||
|
||||
## 🌟 核心特性
|
||||
|
||||
- **智能命令系统** - 自动生成提交信息、管理版本标签、安全地暂存文件
|
||||
- **可复用技能** - 预定义的开发工作流,如 Git 工作流、Android 开发等
|
||||
- **安全优先** - 自动过滤敏感文件,防止意外泄露凭证
|
||||
- **中文友好** - 完整的中文支持和交互提示
|
||||
|
||||
## 目录
|
||||
|
||||
```
|
||||
opencode/
|
||||
├── command/ # CLI 命令定义
|
||||
│ ├── git-add.md # 智能暂存文件(自动过滤敏感文件)
|
||||
│ ├── git-commit.md # 自动生成提交信息并提交
|
||||
│ ├── git-pull.md # 拉取远程最新变更
|
||||
│ ├── git-push.md # 提交+创建标签+推送(一键完成)
|
||||
│ ├── git-push-tags.md # 推送所有标签到远程
|
||||
│ ├── git-status.md # 查看仓库状态
|
||||
│ ├── gitea-config.md # 查看 Gitea 配置和 Runner 状态
|
||||
│ ├── gitea-create-repo.md # 在 Gitea 创建新仓库
|
||||
│ ├── gitea-create-runner.md # 创建并启动 Gitea Actions Runner
|
||||
@@ -73,13 +57,8 @@ opencode/
|
||||
│ ├── mqtts-quick-reference.md # 快速参考
|
||||
│ └── USAGE_EXAMPLES.md # 使用示例
|
||||
│
|
||||
├── plugin/ # 插件扩展系统
|
||||
│ └── notification.ts # 通知插件(邮件、Slack、钉钉等)
|
||||
│
|
||||
├── README.md # 项目说明文档(当前文件)
|
||||
├── AGENTS.md # 全局开发规范和指南
|
||||
├── opencode.json # 项目配置文件
|
||||
├── package.json # Node.js 依赖配置
|
||||
└── .gitignore # Git 忽略文件配置
|
||||
```
|
||||
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
---
|
||||
description: Stage changes with automatic filtering of sensitive files
|
||||
---
|
||||
|
||||
Intelligently stage changes while automatically filtering security-sensitive files.
|
||||
|
||||
Please perform the following:
|
||||
|
||||
1. **Detect all unstaged changes:**
|
||||
- Modified files (M)
|
||||
- Deleted files (D)
|
||||
- Untracked files (??) - **重要:第一次就显示并提供选项**
|
||||
|
||||
2. **Filter sensitive files** - Automatically exclude:
|
||||
- `.env*` - Environment files
|
||||
- `*.key`, `*.pem`, `*.p8` - Private keys
|
||||
- `.aws/*`, `.gcloud/*`, `.ssh/*` - Cloud/SSH credentials
|
||||
- `credentials.json`, `secrets.json` - Credential files
|
||||
- `node_modules/`, `vendor/`, `.venv/` - Dependencies
|
||||
- `dist/`, `build/`, `.next/` - Build artifacts
|
||||
- `.DS_Store`, `Thumbs.db` - System files
|
||||
|
||||
3. **Categorize files:**
|
||||
- **已跟踪的修改/删除** (tracked modified/deleted)
|
||||
- **未跟踪的安全文件** (untracked safe files)
|
||||
- **敏感文件** (sensitive files - filtered)
|
||||
|
||||
4. **Display preview in Chinese:**
|
||||
```
|
||||
=== 将要暂存的文件 (N) ===
|
||||
M [tracked modified files]
|
||||
D [tracked deleted files]
|
||||
|
||||
=== 未跟踪的文件 (N) ===
|
||||
?? [untracked safe files]
|
||||
|
||||
=== 敏感文件已过滤 (N) ===
|
||||
⚠ [sensitive files with reasons]
|
||||
|
||||
=== 操作选项 ===
|
||||
- 输入 "y" 或 "yes" 暂存已修改/已删除的文件(不包括未跟踪文件)
|
||||
- 输入 "all" 或 "u" 暂存所有安全文件(包括未跟踪文件)✓ 推荐
|
||||
- 输入 "force" 强制暂存所有文件(包括敏感文件)⚠️ 谨慎使用
|
||||
- 输入 "no" 或 "cancel" 取消操作
|
||||
- 输入文件路径 暂存特定文件
|
||||
```
|
||||
|
||||
5. **Wait for user confirmation**
|
||||
|
||||
6. **Execute staging based on user choice:**
|
||||
- `y/yes`: Stage tracked modified/deleted only
|
||||
- `all/u`: Stage all safe files (including untracked)
|
||||
- `force`: Show warning, require "confirm" input, then stage everything
|
||||
- `no/cancel`: Abort
|
||||
- File path: Stage specific file(s)
|
||||
|
||||
7. **Display result in Chinese:**
|
||||
```
|
||||
✓ 暂存成功
|
||||
|
||||
已暂存 N 个文件:
|
||||
[列出已暂存的文件]
|
||||
|
||||
敏感文件已过滤并排除,保护了你的凭证信息。
|
||||
|
||||
下一步:
|
||||
- 运行 /git-commit 生成提交信息并提交
|
||||
- 运行 /git-status 查看暂存区状态
|
||||
```
|
||||
|
||||
**重要:第一次运行就显示所有选项,包括未跟踪文件的处理方式,不需要用户多次运行命令。**
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: Commit staged files with auto-generated message and create version tag
|
||||
description: 提交暂存文件,自动生成提交信息并创建版本标签
|
||||
---
|
||||
|
||||
Auto-generate a commit message for staged files, commit to the local repository, and create a version tag following semantic versioning.
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
---
|
||||
description: Pull latest changes from remote repository
|
||||
---
|
||||
|
||||
Pull the latest changes from the remote repository for the current branch.
|
||||
|
||||
Please perform the following tasks:
|
||||
|
||||
1. **Run `git pull`** to fetch and merge remote changes
|
||||
2. **Handle merge conflicts if they occur:**
|
||||
- Check conflict files with `git status`
|
||||
- Guide me through conflict resolution
|
||||
- Help stage resolved files with `git add <file>`
|
||||
- Complete the merge with `git commit`
|
||||
3. **Show the result** with branch status and changes summary
|
||||
|
||||
If there are any errors or conflicts, explain them clearly in Chinese and provide step-by-step guidance for resolution.
|
||||
|
||||
Present the final result showing:
|
||||
- Branch name
|
||||
- Number of commits pulled
|
||||
- Files changed
|
||||
- Any conflicts that need attention
|
||||
@@ -1,55 +0,0 @@
|
||||
---
|
||||
description: Push all local tags to remote repository
|
||||
---
|
||||
|
||||
Push all local tags to the remote repository.
|
||||
|
||||
Please perform the following:
|
||||
|
||||
1. **List local tags:**
|
||||
```bash
|
||||
git tag --list | sort -V
|
||||
```
|
||||
|
||||
2. **Check remote tags:**
|
||||
```bash
|
||||
git ls-remote --tags origin
|
||||
```
|
||||
|
||||
3. **Identify unpushed tags** - Compare local and remote to find tags that need to be pushed
|
||||
|
||||
4. **Display summary in Chinese:**
|
||||
```
|
||||
本地标签总数:N 个
|
||||
远程标签总数:M 个
|
||||
待推送标签:K 个
|
||||
- [list of unpushed tags]
|
||||
|
||||
确认推送所有标签到 origin?
|
||||
```
|
||||
|
||||
5. **Wait for user confirmation** (or proceed if no confirmation needed)
|
||||
|
||||
6. **Push all tags:**
|
||||
```bash
|
||||
git push --tags
|
||||
```
|
||||
|
||||
7. **Verify and display result in Chinese:**
|
||||
```
|
||||
✓ 已成功推送所有标签到 origin
|
||||
|
||||
最近 5 个远程标签:
|
||||
- [list of recent tags]
|
||||
```
|
||||
|
||||
**Use cases:**
|
||||
- After creating multiple local tags
|
||||
- Sync tags with remote repository
|
||||
- Before triggering CI/CD release workflows
|
||||
- Share version tags with team
|
||||
|
||||
**Notes:**
|
||||
- Pushes ALL local tags, not just one
|
||||
- To push a specific tag: `git push origin <tag-name>`
|
||||
- Safe operation: won't overwrite existing tags (no force push)
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: Commit staged files, create version tag, and push to remote repository
|
||||
description: 提交暂存文件,创建版本标签并推送到远程仓库
|
||||
---
|
||||
|
||||
Complete workflow: auto-generate commit message, create version tag, commit, and push everything to remote repository.
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
---
|
||||
description: Check git working directory status and file changes
|
||||
---
|
||||
|
||||
Check the current git repository status and display file changes in a clear, organized format.
|
||||
|
||||
Please perform the following tasks:
|
||||
|
||||
1. **Run `git status`** to show the current state of the working tree
|
||||
2. **Display current branch** using `git branch --show-current`
|
||||
3. **List unstaged changes** with `git diff --name-only`
|
||||
4. **List staged changes** with `git diff --cached --name-only`
|
||||
|
||||
Present the information in Chinese with the following structure:
|
||||
|
||||
```
|
||||
当前分支: [branch_name]
|
||||
|
||||
暂存区文件 ([count]):
|
||||
[列出已暂存的文件]
|
||||
|
||||
未暂存的修改 ([count]):
|
||||
[列出未暂存的修改文件]
|
||||
|
||||
未跟踪的文件 ([count]):
|
||||
[列出未跟踪的文件]
|
||||
```
|
||||
|
||||
Use clear formatting and emoji indicators (✓, ⚠️, etc.) to make the output easy to read.
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: View current Gitea configuration and runner status
|
||||
description: 查看当前 Gitea 配置和 Runner 状态
|
||||
---
|
||||
|
||||
Display the current Gitea configuration and runner status.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: Create a new Git repository on Gitea
|
||||
description: 在 Gitea 上创建新的 Git 仓库
|
||||
---
|
||||
|
||||
Create a new Git repository on Gitea via API.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: Create and start a Gitea Actions runner (default host mode)
|
||||
description: 创建并启动 Gitea Actions Runner(默认使用 host 模式)
|
||||
agent: general
|
||||
subtask: true
|
||||
---
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: Delete a Gitea runner configuration (interactive)
|
||||
description: 删除 Gitea Runner 配置(交互式)
|
||||
agent: general
|
||||
subtask: true
|
||||
---
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: List all global runners on Gitea server
|
||||
description: 列出 Gitea 服务器上的所有全局 Runner
|
||||
---
|
||||
|
||||
List all global runners registered on the Gitea server.
|
||||
|
||||
@@ -1,132 +0,0 @@
|
||||
---
|
||||
description: Reset Gitea configuration with interactive setup wizard
|
||||
agent: general
|
||||
subtask: true
|
||||
---
|
||||
|
||||
Launch an interactive configuration wizard to set up or reset Gitea configuration.
|
||||
|
||||
## 工作目录
|
||||
|
||||
**macOS / Linux:**
|
||||
```
|
||||
~/.config/gitea/
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
```
|
||||
%USERPROFILE%\.config\gitea\
|
||||
```
|
||||
|
||||
配置文件和 Runner 目录都将存储在此位置。
|
||||
|
||||
Please perform the following:
|
||||
|
||||
1. **Create configuration directory:**
|
||||
|
||||
**macOS / Linux:**
|
||||
```bash
|
||||
mkdir -p ~/.config/gitea/runners
|
||||
```
|
||||
|
||||
**Windows PowerShell:**
|
||||
```powershell
|
||||
New-Item -Path "$env:USERPROFILE\.config\gitea\runners" -ItemType Directory -Force
|
||||
```
|
||||
|
||||
2. **Interactive input - Gitea URL:**
|
||||
- Prompt: "请输入 Gitea 实例地址 (例如: https://git.digitevents.com):"
|
||||
- Validate: Must start with http:// or https://
|
||||
- Remove trailing slash
|
||||
|
||||
3. **Interactive input - Personal Access Token:**
|
||||
- Prompt: "请输入 Personal Access Token:"
|
||||
- Before input, show help:
|
||||
```
|
||||
提示:获取 Personal Access Token 的步骤:
|
||||
1. 登录 Gitea
|
||||
2. 右上角头像 → 设置 → 应用 → 访问令牌
|
||||
3. 点击 "生成新令牌"
|
||||
4. 设置令牌名称(如 opencode-cli)
|
||||
5. 选择权限:repo, admin:org, write:runner(推荐)
|
||||
6. 点击 "生成令牌"
|
||||
7. 复制生成的 Token
|
||||
```
|
||||
- Validate: Not empty
|
||||
- Use `read -sp` for secure input (password style)
|
||||
|
||||
4. **Test connection:**
|
||||
- API: `GET ${GITEA_URL}/api/v1/user`
|
||||
- If fails: Show error and possible reasons
|
||||
- If success: Show username
|
||||
|
||||
5. **Validate token permissions:**
|
||||
- Check `repo`: `GET /api/v1/user/repos` (required)
|
||||
- Check `admin:org`: `GET /api/v1/user/orgs` (optional, for org runners)
|
||||
- Check `write:runner`: Try to get registration token (optional, for runners)
|
||||
- Warn if missing required permissions
|
||||
|
||||
6. **Input default organization (optional):**
|
||||
- Prompt: "请输入默认组织名称 (回车跳过):"
|
||||
- If provided, validate it exists: `GET /api/v1/orgs/${org_name}`
|
||||
|
||||
7. **Save configuration:**
|
||||
|
||||
**macOS / Linux** - Save to `~/.config/gitea/config.env`:
|
||||
```bash
|
||||
GITEA_URL=...
|
||||
GITEA_TOKEN=...
|
||||
GITEA_DEFAULT_ORG=... (if set)
|
||||
GITEA_RUNNER_CAPACITY=2
|
||||
GITEA_RUNNER_TIMEOUT=3h
|
||||
```
|
||||
- Set permissions: `chmod 600 ~/.config/gitea/config.env`
|
||||
- Create `.gitignore` to exclude sensitive files
|
||||
|
||||
**Windows** - Save to `%USERPROFILE%\.config\gitea\config.env`:
|
||||
```bash
|
||||
GITEA_URL=...
|
||||
GITEA_TOKEN=...
|
||||
GITEA_DEFAULT_ORG=... (if set)
|
||||
GITEA_RUNNER_CAPACITY=2
|
||||
GITEA_RUNNER_TIMEOUT=3h
|
||||
```
|
||||
- Set file permissions to restrict access (see setup-guide.md for PowerShell script)
|
||||
- Create `.gitignore` to exclude sensitive files
|
||||
|
||||
8. **Display completion summary in Chinese:**
|
||||
|
||||
**macOS / Linux:**
|
||||
```
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
配置完成
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
配置文件: ~/.config/gitea/config.env
|
||||
Runner 目录: ~/.config/gitea/runners
|
||||
|
||||
下一步:
|
||||
- 查看配置: /gitea-config
|
||||
- 创建 Runner: 告诉 AI '创建一个 runner'
|
||||
- 创建仓库: /create-gitea-repo <repo-name>
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
```
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
配置完成
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
配置文件: %USERPROFILE%\.config\gitea\config.env
|
||||
Runner 目录: %USERPROFILE%\.config\gitea\runners
|
||||
|
||||
下一步:
|
||||
- 查看配置: /gitea-config
|
||||
- 创建 Runner: 告诉 AI '创建一个 runner'
|
||||
- 创建仓库: /create-gitea-repo <repo-name>
|
||||
```
|
||||
|
||||
**Security notes:**
|
||||
- Config file permissions: 600 (owner read/write only)
|
||||
- Token is never displayed after initial input
|
||||
- Sensitive files excluded in .gitignore
|
||||
@@ -1,82 +0,0 @@
|
||||
---
|
||||
description: Switch default Gitea organization
|
||||
---
|
||||
|
||||
Switch the default Gitea organization in configuration.
|
||||
|
||||
## 工作目录
|
||||
|
||||
**macOS / Linux:**
|
||||
```
|
||||
~/.config/gitea/
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
```
|
||||
%USERPROFILE%\.config\gitea\
|
||||
```
|
||||
|
||||
**User input format:** `$ARGUMENTS` = organization name
|
||||
|
||||
**Example usage:**
|
||||
```
|
||||
/gitea-switch-org ai
|
||||
/gitea-switch-org my-team
|
||||
```
|
||||
|
||||
Please perform the following:
|
||||
|
||||
1. **Check configuration exists:**
|
||||
- Config file:
|
||||
- macOS/Linux: `~/.config/gitea/config.env`
|
||||
- Windows: `%USERPROFILE%\.config\gitea\config.env`
|
||||
- If not exists: prompt user to run `/gitea-reset`
|
||||
|
||||
2. **Load configuration:**
|
||||
|
||||
**macOS / Linux:**
|
||||
```bash
|
||||
source ~/.config/gitea/config.env
|
||||
```
|
||||
|
||||
**Windows PowerShell:**
|
||||
```powershell
|
||||
Get-Content "$env:USERPROFILE\.config\gitea\config.env" | ForEach-Object {
|
||||
if ($_ -match '^([^=]+)=(.*)$') {
|
||||
[Environment]::SetEnvironmentVariable($matches[1], $matches[2], 'Process')
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. **Parse user input:**
|
||||
- Organization name from `$ARGUMENTS`
|
||||
- If empty: show usage and examples
|
||||
|
||||
4. **Validate organization exists:**
|
||||
- API: `GET ${GITEA_URL}/api/v1/orgs/${org_name}`
|
||||
- Header: `Authorization: token ${GITEA_TOKEN}`
|
||||
- If 404: Show error and list available organizations:
|
||||
```bash
|
||||
curl -s -H "Authorization: token $GITEA_TOKEN" \
|
||||
"${GITEA_URL}/api/v1/user/orgs" | jq -r '.[].username'
|
||||
```
|
||||
|
||||
5. **Update configuration file:**
|
||||
- If `GITEA_DEFAULT_ORG` exists: update the line
|
||||
- If not exists: add after `GITEA_TOKEN`
|
||||
- Handle macOS (sed -i '') and Linux (sed -i) differences
|
||||
|
||||
6. **Display result in Chinese:**
|
||||
```
|
||||
✓ 默认组织已切换到: [org_name]
|
||||
|
||||
现在可以:
|
||||
- 创建仓库: /create-gitea-repo my-project
|
||||
(将创建到 [org_name]/my-project)
|
||||
- 查看配置: /gitea-config
|
||||
```
|
||||
|
||||
**Notes:**
|
||||
- Switching organization doesn't affect existing repositories or runners
|
||||
- Only affects default owner for future repository creation
|
||||
- Can switch anytime
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: Review code or documentation and provide suggestions
|
||||
description: 审查代码或文档并提供建议
|
||||
agent: plan
|
||||
---
|
||||
|
||||
|
||||
84
command/summarize-conversation.md
Normal file
84
command/summarize-conversation.md
Normal file
@@ -0,0 +1,84 @@
|
||||
---
|
||||
description: 归纳总结当前对话中有价值的内容,生成 Markdown 文件以便后续参考
|
||||
agent: general
|
||||
---
|
||||
|
||||
# 对话内容总结
|
||||
|
||||
你的任务是归纳总结当前对话中有价值的内容,生成一个结构化的 Markdown 文件,方便后续与 AI 对话时快速回顾,避免重复查询。
|
||||
|
||||
## 总结内容
|
||||
|
||||
请从对话历史中提取以下信息:
|
||||
|
||||
1. **对话主题** - 用户的主要需求和目标
|
||||
2. **关键决策** - 用户做出的重要选择、确定的技术方案
|
||||
3. **代码更改** - 创建、修改或删除的代码文件及核心逻辑
|
||||
4. **配置更新** - 环境变量、配置文件、依赖项变更
|
||||
5. **待办事项** - 用户明确提到的未来任务或计划
|
||||
6. **下一步行动** - 建议的后续步骤
|
||||
7. **重要注意事项** - 需要特别记住的细节、限制条件
|
||||
8. **相关文件路径** - 涉及的重要文件位置(格式:`文件路径:行号`)
|
||||
|
||||
## 生成文件
|
||||
|
||||
1. **默认文件名**:`conversation-summary.md`
|
||||
2. **文件位置**:当前工作目录
|
||||
3. **文件格式**:使用 Markdown 语法,包含清晰的标题和列表
|
||||
4. **时间戳**:在文件开头添加生成时间(格式:YYYY-MM-DD HH:MM:SS)
|
||||
5. **对话上下文**:简要描述对话的背景和目的
|
||||
|
||||
## 执行步骤
|
||||
|
||||
1. **分析对话** - 回顾完整的对话历史,识别有价值的信息点
|
||||
2. **提取内容** - 按照上述分类整理信息,确保准确性和完整性
|
||||
3. **生成总结** - 创建结构化的 Markdown 内容,使用中文描述
|
||||
4. **保存文件** - 将总结写入 `conversation-summary.md` 文件
|
||||
5. **验证内容** - 检查文件是否包含所有关键信息
|
||||
6. **通知用户** - 告知用户文件已生成,并提供文件路径
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 只总结**有价值**的内容,忽略闲聊和无关信息
|
||||
- 保持总结简洁明了,便于快速查阅
|
||||
- 涉及代码时,提供文件路径和关键行号引用
|
||||
- 如果有未完成的任务,明确标注状态(待处理/进行中/已完成)
|
||||
- 如果对话中涉及敏感信息(如密码、密钥),**不要**包含在总结中
|
||||
|
||||
## 输出示例
|
||||
|
||||
```
|
||||
# 对话总结
|
||||
|
||||
**生成时间**: 2025-01-15 14:30:00
|
||||
**对话主题**: 创建 OpenCode 命令用于总结对话内容
|
||||
|
||||
## 关键决策
|
||||
- 命令名称: `summarize-conversation`
|
||||
- 文件位置: 全局命令目录 (`~/.config/opencode/command/`)
|
||||
- 代理类型: general
|
||||
|
||||
## 代码更改
|
||||
- 创建命令文件: `command/summarize-conversation.md`
|
||||
|
||||
## 配置更新
|
||||
- 无
|
||||
|
||||
## 待办事项
|
||||
- 测试命令功能:运行 `/summarize-conversation`
|
||||
- 考虑添加文件命名参数支持
|
||||
|
||||
## 下一步行动
|
||||
1. 使用 `/summarize-conversation` 测试命令效果
|
||||
2. 根据使用反馈优化总结模板
|
||||
|
||||
## 重要注意事项
|
||||
- 总结文件保存在当前工作目录的 `conversation-summary.md`
|
||||
- 每次运行会覆盖之前的总结文件
|
||||
- 建议定期备份重要总结
|
||||
|
||||
## 相关文件
|
||||
- `command/summarize-conversation.md`
|
||||
```
|
||||
|
||||
**完成标准**:成功生成包含上述所有部分的 Markdown 文件,并通知用户文件位置。
|
||||
@@ -1,5 +1,8 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/config.json",
|
||||
"mcp": {},
|
||||
"permission": "allow",
|
||||
"plugin": ["@mohak34/opencode-notifier@latest"],
|
||||
"provider": {
|
||||
"opencode": {
|
||||
"models": {
|
||||
@@ -10,19 +13,15 @@
|
||||
"budgetTokens": 16000
|
||||
}
|
||||
}
|
||||
},
|
||||
"claude-sonnet-4-5": {
|
||||
"options": {
|
||||
"thinking": {
|
||||
"type": "enabled",
|
||||
"budgetTokens": 16000
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"zhipuai-coding-plan": {
|
||||
"options": {
|
||||
"apiKey": "0f76aea86295476dbfa98724013b0fe8.o2EaJVqcl4Cf7WLP"
|
||||
}
|
||||
}
|
||||
},
|
||||
"mcp": {
|
||||
},
|
||||
"permission": "allow"
|
||||
"model": "deepseek/deepseek-resoner",
|
||||
"small_model": "deepseek/deepseek-resoner"
|
||||
}
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
import type { Plugin } from "@opencode-ai/plugin"
|
||||
|
||||
/**
|
||||
* 通知 Plugin
|
||||
* 在会话完成或发生错误时发送系统通知
|
||||
*/
|
||||
export const NotificationPlugin: Plugin = async ({ project, client, $ }) => {
|
||||
// 检测操作系统
|
||||
const platform = process.platform
|
||||
|
||||
/**
|
||||
* 发送系统通知
|
||||
* @param title 通知标题
|
||||
* @param message 通知内容
|
||||
* @param isError 是否为错误通知
|
||||
*/
|
||||
const sendNotification = async (title: string, message: string, isError: boolean = false) => {
|
||||
try {
|
||||
if (platform === "darwin") {
|
||||
// macOS - 使用 osascript
|
||||
const sound = isError ? ' sound name "Basso"' : ''
|
||||
await $`osascript -e 'display notification "${message}" with title "${title}"${sound}'`
|
||||
} else if (platform === "linux") {
|
||||
// Linux - 使用 notify-send
|
||||
const urgency = isError ? "-u critical" : ""
|
||||
await $`notify-send "${title}" "${message}" ${urgency}`
|
||||
} else if (platform === "win32") {
|
||||
// Windows - 使用 PowerShell
|
||||
const script = `Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show('${message}', '${title}')`
|
||||
await $`powershell -Command "& {${script}}"`
|
||||
}
|
||||
|
||||
// 记录日志
|
||||
await client.app.log({
|
||||
service: "notification",
|
||||
level: "info",
|
||||
message: `已发送通知: ${title} - ${message}`,
|
||||
})
|
||||
} catch (error) {
|
||||
// 如果通知发送失败,记录错误但不中断流程
|
||||
await client.app.log({
|
||||
service: "notification",
|
||||
level: "error",
|
||||
message: `发送通知失败: ${error}`,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
event: async ({ event }) => {
|
||||
const projectName = project?.name || "OpenCode"
|
||||
|
||||
// 会话完成时发送通知
|
||||
if (event.type === "session.idle") {
|
||||
await sendNotification(
|
||||
projectName,
|
||||
"会话已完成!",
|
||||
false
|
||||
)
|
||||
}
|
||||
|
||||
// 会话错误时发送通知
|
||||
if (event.type === "session.error") {
|
||||
await sendNotification(
|
||||
projectName,
|
||||
"会话发生错误!",
|
||||
true
|
||||
)
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
442
skill/agent-browser/SKILL.md
Normal file
442
skill/agent-browser/SKILL.md
Normal file
@@ -0,0 +1,442 @@
|
||||
---
|
||||
name: ab
|
||||
description: 浏览器自动化工具,用于网页测试、表单填写、截图、数据提取等
|
||||
---
|
||||
|
||||
# 浏览器自动化工具 agent-browser
|
||||
|
||||
ab是 agent-browser 的缩写,它是一个为 AI 代理设计的无头浏览器自动化 CLI 工具,基于 Rust 和 Playwright 构建。支持快速导航、元素交互、页面截图、数据提取等功能。
|
||||
|
||||
注意:必须使用 agent-browser 全称作为命令关键字。
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 安装检查
|
||||
agent-browser 默认已安装。如果遇到 "command not found" 错误,请运行以下命令安装:
|
||||
|
||||
```bash
|
||||
# 全局安装
|
||||
npm install -g agent-browser
|
||||
|
||||
# 下载 Chromium 浏览器
|
||||
agent-browser install
|
||||
```
|
||||
|
||||
### 核心工作流程(4步法)
|
||||
```bash
|
||||
# 使用 agent-browser
|
||||
1. agent-browser open <url>
|
||||
2. agent-browser snapshot -i
|
||||
3. agent-browser click @e1
|
||||
4. agent-browser fill @e2 "文本"
|
||||
```
|
||||
|
||||
## 核心工作流程详解
|
||||
|
||||
### 1. 导航到页面
|
||||
```bash
|
||||
agent-browser open https://example.com
|
||||
```
|
||||
|
||||
### 2. 获取页面快照(推荐使用交互模式)
|
||||
```bash
|
||||
agent-browser snapshot -i # 仅显示交互元素(按钮、输入框、链接)
|
||||
```
|
||||
|
||||
**输出示例:**
|
||||
```
|
||||
- link "Learn more" [ref=e1]
|
||||
- textbox "Email" [ref=e2]
|
||||
- button "Submit" [ref=e3]
|
||||
```
|
||||
|
||||
### 3. 使用 Refs 进行交互
|
||||
快照中的 `[ref=e1]`、`[ref=e2]` 等是元素的唯一引用标识,**推荐使用 refs 而非 CSS 选择器**:
|
||||
- **确定性**:ref 指向快照中的确切元素
|
||||
- **快速**:无需重新查询 DOM
|
||||
- **AI 友好**:适合 LLM 处理
|
||||
|
||||
### 4. 页面变化后重新快照
|
||||
页面发生重大变化(导航、表单提交等)后,需要重新获取快照:
|
||||
```bash
|
||||
agent-browser snapshot -i # 重新获取新的 refs
|
||||
```
|
||||
|
||||
## 命令参考
|
||||
|
||||
### 导航命令
|
||||
```bash
|
||||
agent-browser open <url> # 导航到 URL(或:ab open <url>)
|
||||
agent-browser back # 后退(或:ab back)
|
||||
agent-browser forward # 前进(或:ab forward)
|
||||
agent-browser reload # 重新加载页面(或:ab reload)
|
||||
agent-browser close # 关闭浏览器(或:ab close)
|
||||
```
|
||||
|
||||
### 快照命令(页面分析)
|
||||
```bash
|
||||
agent-browser snapshot # 完整可访问性树(或:ab snapshot)
|
||||
agent-browser snapshot -i # 仅交互元素(推荐)(或:ab snapshot -i)
|
||||
agent-browser snapshot -c # 紧凑输出(移除空结构元素)(或:ab snapshot -c)
|
||||
agent-browser snapshot -d 3 # 限制深度为 3 级(或:ab snapshot -d 3)
|
||||
agent-browser snapshot -s "#main" # 限定到 CSS 选择器范围(或:ab snapshot -s "#main")
|
||||
```
|
||||
|
||||
### 交互命令(使用 @refs)
|
||||
```bash
|
||||
# 基础交互
|
||||
agent-browser click @e1 # 单击
|
||||
agent-browser dblclick @e1 # 双击
|
||||
agent-browser fill @e2 "文本" # 清空并填写
|
||||
agent-browser type @e2 "文本" # 不清空直接输入
|
||||
agent-browser press Enter # 按键(支持组合键 Control+a)
|
||||
agent-browser hover @e1 # 悬停
|
||||
agent-browser focus @e1 # 聚焦
|
||||
|
||||
# 表单操作
|
||||
agent-browser check @e1 # 勾选复选框
|
||||
agent-browser uncheck @e1 # 取消勾选
|
||||
agent-browser select @e1 "值" # 选择下拉选项
|
||||
agent-browser upload @e1 file1.jpg # 上传文件
|
||||
|
||||
# 滚动
|
||||
agent-browser scroll down 500 # 向下滚动 500px
|
||||
agent-browser scrollintoview @e1 # 滚动元素到可见区域
|
||||
```
|
||||
|
||||
### 获取信息
|
||||
```bash
|
||||
agent-browser get text @e1 # 获取元素文本
|
||||
agent-browser get value @e1 # 获取输入框值
|
||||
agent-browser get html @e1 # 获取 innerHTML
|
||||
agent-browser get attr @e1 id # 获取属性
|
||||
agent-browser get title # 获取页面标题
|
||||
agent-browser get url # 获取当前 URL
|
||||
agent-browser get count ".item" # 计数匹配元素
|
||||
agent-browser get box @e1 # 获取边界框
|
||||
```
|
||||
|
||||
### 检查状态
|
||||
```bash
|
||||
agent-browser is visible @e1 # 检查是否可见
|
||||
agent-browser is enabled @e1 # 检查是否启用
|
||||
agent-browser is checked @e1 # 检查是否勾选
|
||||
```
|
||||
|
||||
### 截图命令
|
||||
```bash
|
||||
agent-browser screenshot # 截图到标准输出
|
||||
agent-browser screenshot page.png # 保存到文件
|
||||
agent-browser screenshot --full # 完整页面截图
|
||||
```
|
||||
|
||||
### 等待命令
|
||||
```bash
|
||||
agent-browser wait @e1 # 等待元素可见
|
||||
agent-browser wait 2000 # 等待毫秒数
|
||||
agent-browser wait --text "成功" # 等待文本出现
|
||||
agent-browser wait --url "*/dashboard" # 等待 URL 模式匹配
|
||||
agent-browser wait --load networkidle # 等待网络空闲
|
||||
|
||||
# 加载状态选项:load, domcontentloaded, networkidle
|
||||
```
|
||||
|
||||
### 语义化定位器(替代 refs)
|
||||
```bash
|
||||
agent-browser find role button click --name "提交"
|
||||
agent-browser find text "登录" click
|
||||
agent-browser find label "邮箱" fill "user@test.com"
|
||||
agent-browser find placeholder "请输入" fill "内容"
|
||||
agent-browser find first ".item" click
|
||||
agent-browser find nth 2 "a" text
|
||||
```
|
||||
|
||||
## 认证与状态管理
|
||||
|
||||
### 方法1:手动登录流程(推荐用于首次)
|
||||
```bash
|
||||
# 导航到登录页面
|
||||
agent-browser open https://example.com/login
|
||||
|
||||
# 填写表单
|
||||
agent-browser snapshot -i
|
||||
# 输出显示:textbox "邮箱" [ref=e1], textbox "密码" [ref=e2], button "登录" [ref=e3]
|
||||
|
||||
agent-browser fill @e1 "user@example.com"
|
||||
agent-browser fill @e2 "password123"
|
||||
agent-browser click @e3
|
||||
|
||||
# 等待登录成功
|
||||
agent-browser wait --url "*/dashboard"
|
||||
|
||||
# 保存认证状态(重要!)
|
||||
agent-browser state save auth.json
|
||||
```
|
||||
|
||||
### 方法2:加载已保存状态(后续使用)
|
||||
```bash
|
||||
# 加载保存的认证状态
|
||||
agent-browser state load auth.json
|
||||
|
||||
# 直接访问受保护页面
|
||||
agent-browser open https://example.com/dashboard
|
||||
```
|
||||
|
||||
### 方法3:HTTP Headers 认证(跳过登录界面)
|
||||
```bash
|
||||
# 为特定域名设置认证头
|
||||
agent-browser open https://api.example.com --headers '{"Authorization": "Bearer <token>"}'
|
||||
```
|
||||
|
||||
### 方法4:Cookies 管理
|
||||
```bash
|
||||
# 设置 cookie
|
||||
agent-browser cookies set session_id "abc123"
|
||||
|
||||
# 查看所有 cookies
|
||||
agent-browser cookies
|
||||
```
|
||||
|
||||
## 高级功能
|
||||
|
||||
### 无头/有头模式
|
||||
```bash
|
||||
# 默认:无头模式(无界面)
|
||||
agent-browser open example.com
|
||||
|
||||
# 有头模式:显示浏览器窗口(适合调试)
|
||||
agent-browser --headed open example.com
|
||||
```
|
||||
|
||||
**无头模式特点**:
|
||||
- 后台运行 Chromium
|
||||
- 不占用屏幕空间
|
||||
- 更快的执行速度
|
||||
- 适合自动化测试和 AI Agent 使用
|
||||
|
||||
### 会话隔离
|
||||
```bash
|
||||
# 创建独立会话
|
||||
agent-browser --session user1 open site-a.com
|
||||
agent-browser --session user2 open site-b.com
|
||||
|
||||
# 查看活动会话
|
||||
agent-browser session list
|
||||
|
||||
# 每个会话独立:
|
||||
# - 浏览器实例
|
||||
# - Cookies 和存储
|
||||
# - 导航历史
|
||||
# - 认证状态
|
||||
```
|
||||
|
||||
### JSON 输出(适合机器解析)
|
||||
```bash
|
||||
agent-browser snapshot -i --json
|
||||
agent-browser get text @e1 --json
|
||||
agent-browser is visible @e2 --json
|
||||
```
|
||||
|
||||
### 自定义浏览器可执行文件
|
||||
```bash
|
||||
# 使用自定义 Chromium 路径
|
||||
agent-browser --executable-path /path/to/chromium open example.com
|
||||
|
||||
# 环境变量方式
|
||||
AGENT_BROWSER_EXECUTABLE_PATH=/path/to/chromium agent-browser open example.com
|
||||
```
|
||||
|
||||
### CDP 模式(连接现有浏览器)
|
||||
```bash
|
||||
# 连接通过 Chrome DevTools Protocol 运行的浏览器
|
||||
agent-browser --cdp 9222 snapshot
|
||||
|
||||
# 可控制:Electron 应用、启用远程调试的 Chrome、WebView2 等
|
||||
```
|
||||
|
||||
### 调试工具
|
||||
```bash
|
||||
agent-browser console # 查看控制台消息
|
||||
agent-browser errors # 查看页面错误
|
||||
agent-browser console --clear # 清空控制台
|
||||
agent-browser errors --clear # 清空错误
|
||||
agent-browser highlight @e1 # 高亮显示元素
|
||||
```
|
||||
|
||||
## 示例场景
|
||||
|
||||
### 示例1:表单提交
|
||||
```bash
|
||||
# 1. 导航到表单页面
|
||||
agent-browser open https://example.com/form
|
||||
|
||||
# 2. 获取交互元素快照
|
||||
agent-browser snapshot -i
|
||||
# 输出:textbox "邮箱" [ref=e1], textbox "密码" [ref=e2], button "提交" [ref=e3]
|
||||
|
||||
# 3. 填写并提交表单
|
||||
agent-browser fill @e1 "user@example.com"
|
||||
agent-browser fill @e2 "password123"
|
||||
agent-browser click @e3
|
||||
|
||||
# 4. 等待结果并验证
|
||||
agent-browser wait --load networkidle
|
||||
agent-browser snapshot -i # 检查结果
|
||||
```
|
||||
|
||||
### 示例2:带认证的完整流程
|
||||
```bash
|
||||
# 首次:登录并保存状态
|
||||
agent-browser open https://app.example.com/login
|
||||
agent-browser fill "#email" "username"
|
||||
agent-browser fill "#password" "password123"
|
||||
agent-browser click "#submit"
|
||||
agent-browser wait --url "**/dashboard"
|
||||
agent-browser state save app-auth.json
|
||||
|
||||
# 后续使用:加载状态
|
||||
agent-browser state load app-auth.json
|
||||
agent-browser open https://app.example.com/dashboard
|
||||
|
||||
# 执行操作
|
||||
agent-browser snapshot -i
|
||||
agent-browser click @e1
|
||||
```
|
||||
|
||||
### 示例3:数据提取
|
||||
```bash
|
||||
# 提取列表数据
|
||||
agent-browser open https://example.com/products
|
||||
agent-browser wait --load networkidle
|
||||
|
||||
# 获取所有产品标题
|
||||
for i in $(seq 1 10); do
|
||||
agent-browser get text "@e$i" --json
|
||||
done
|
||||
|
||||
# 或使用 CSS 选择器
|
||||
agent-browser get text ".product-title"
|
||||
```
|
||||
|
||||
### 示例4:并行测试
|
||||
```bash
|
||||
# 会话1:用户A
|
||||
agent-browser --session userA open site.com
|
||||
agent-browser --session userA fill "#email" "userA@test.com"
|
||||
agent-browser --session userA fill "#password" "passA123"
|
||||
|
||||
# 会话2:用户B(同时运行)
|
||||
agent-browser --session userB open site.com
|
||||
agent-browser --session userB fill "#email" "userB@test.com"
|
||||
agent-browser --session userB fill "#password" "passB123"
|
||||
```
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 优先使用 Refs
|
||||
- 从 `snapshot -i` 获取 refs
|
||||
- 使用 `@e1`、`@e2` 而非 CSS 选择器
|
||||
- 页面变化后重新快照获取新 refs
|
||||
|
||||
### 2. 合理使用等待
|
||||
- 页面加载:`wait --load networkidle`
|
||||
- 元素出现:`wait @e1`
|
||||
- 文本出现:`wait --text "成功"`
|
||||
- 避免硬编码 sleep,使用条件等待
|
||||
|
||||
### 3. 状态管理策略
|
||||
- 首次登录后使用 `state save`
|
||||
- 后续使用 `state load` 避免重复登录
|
||||
- 敏感操作使用 `--session` 隔离
|
||||
|
||||
### 4. 错误处理
|
||||
- 检查元素是否存在:`is visible @e1`
|
||||
- 查看控制台日志:`console`
|
||||
- 调试时使用 `--headed` 模式
|
||||
|
||||
### 5. 性能优化
|
||||
- 使用 `-i` 参数限制快照输出
|
||||
- 批量操作使用循环
|
||||
- 合理使用等待避免超时
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 常见问题
|
||||
|
||||
**1. "command not found: agent-browser" 错误**
|
||||
```bash
|
||||
# 错误原因:agent-browser 未安装
|
||||
# 解决方案:运行安装命令
|
||||
npm install -g agent-browser
|
||||
agent-browser install
|
||||
```
|
||||
|
||||
**2. "Unsupported token @e1" 错误**
|
||||
```bash
|
||||
# 错误原因:快照后页面已刷新,refs 失效
|
||||
# 解决方案:重新获取快照
|
||||
agent-browser snapshot -i
|
||||
agent-browser click @e1 # 使用新的 ref
|
||||
```
|
||||
|
||||
**3. 元素找不到**
|
||||
```bash
|
||||
# 检查元素是否存在
|
||||
agent-browser is visible @e1
|
||||
|
||||
# 等待元素出现
|
||||
agent-browser wait @e1
|
||||
|
||||
# 使用语义化查找
|
||||
agent-browser find role button click --name "提交"
|
||||
```
|
||||
|
||||
**4. 登录状态丢失**
|
||||
```bash
|
||||
# 重新登录并保存状态
|
||||
agent-browser state save auth.json
|
||||
|
||||
# 或设置 cookies
|
||||
agent-browser cookies set session_id "value"
|
||||
```
|
||||
|
||||
**5. 页面加载缓慢**
|
||||
```bash
|
||||
# 增加等待时间
|
||||
agent-browser wait --load networkidle
|
||||
agent-browser wait 5000
|
||||
|
||||
# 或设置超时
|
||||
agent-browser set timeout 30000
|
||||
```
|
||||
|
||||
## 平台支持
|
||||
|
||||
| 平台 | 原生二进制 | 回退方案 |
|
||||
|------|-----------|----------|
|
||||
| macOS ARM64 | ✓ | Node.js |
|
||||
| macOS x64 | ✓ | Node.js |
|
||||
| Linux ARM64 | ✓ | Node.js |
|
||||
| Linux x64 | ✓ | Node.js |
|
||||
| Windows x64 | ✓ | Node.js |
|
||||
|
||||
## 技术架构
|
||||
|
||||
agent-browser 采用客户端-守护进程架构:
|
||||
1. **Rust CLI**(原生二进制)- 解析命令,与守护进程通信
|
||||
2. **Node.js 守护进程** - 管理 Playwright 浏览器实例
|
||||
3. **回退方案** - 如果原生二进制不可用,直接使用 Node.js
|
||||
|
||||
守护进程在首次命令时自动启动,并在命令间持久化以实现快速后续操作。
|
||||
|
||||
**浏览器引擎**:默认使用 Chromium。守护进程也支持通过 Playwright 协议使用 Firefox 和 WebKit。
|
||||
|
||||
## 相关资源
|
||||
|
||||
- 官方仓库:https://github.com/vercel-labs/agent-browser
|
||||
- 官方文档:https://agent-browser.dev
|
||||
- npm 包:https://www.npmjs.com/package/agent-browser
|
||||
|
||||
## 许可证
|
||||
|
||||
Apache-2.0
|
||||
151
skill/opencode/SKILL.md
Normal file
151
skill/opencode/SKILL.md
Normal file
@@ -0,0 +1,151 @@
|
||||
---
|
||||
name: opencode
|
||||
description: Create and manage OpenCode commands and skills with templates and best practices. Use this skill when users ask to create commands or skills.
|
||||
---
|
||||
|
||||
# OpenCode Command and Skill Management
|
||||
|
||||
You are an expert in OpenCode configuration and extension development. This skill serves as the entry point for creating and managing OpenCode commands and skills.
|
||||
|
||||
**Trigger Phrases**: When users mention any of the following, automatically use this skill:
|
||||
- "创建command", "创建命令", "make command", "create command"
|
||||
- "创建skill", "创建技能", "make skill", "create skill"
|
||||
- "添加command", "添加命令", "add command"
|
||||
- "添加skill", "添加技能", "add skill"
|
||||
- "opcode command", "opencode skill"
|
||||
|
||||
## Overview
|
||||
|
||||
OpenCode extensions are organized into two main types:
|
||||
- **Commands**: User-invoked prompts for repetitive tasks, defined in `command/` directory
|
||||
- **Skills**: Reusable behavior definitions for agents, defined in `skill/<name>/SKILL.md`
|
||||
|
||||
## Detailed Guides
|
||||
|
||||
This skill folder contains comprehensive guides for command and skill creation:
|
||||
|
||||
### Command Creation
|
||||
For detailed command creation guidelines, refer to:
|
||||
- `skill/opencode/command-creation.md` - Complete guide to creating OpenCode commands
|
||||
- Includes: file structure, templates, best practices, troubleshooting
|
||||
|
||||
### Skill Creation
|
||||
For detailed skill creation guidelines, refer to:
|
||||
- `skill/opencode/skill-creation.md` - Complete guide to creating OpenCode skills
|
||||
- Includes: directory structure, naming rules, templates, testing
|
||||
|
||||
## Quick Start
|
||||
|
||||
### To Create a Command
|
||||
1. Determine command name (kebab-case, descriptive)
|
||||
2. **Default location**: global (`~/.config/opencode/command/`)
|
||||
3. Create file: `<command-name>.md`
|
||||
4. Add frontmatter with `description`
|
||||
5. Write template with `$ARGUMENTS` support
|
||||
|
||||
### To Create a Skill
|
||||
1. Validate skill name (lowercase, hyphens, alphanumeric)
|
||||
2. **Default location**: global (`~/.config/opencode/skill/<skill-name>/`)
|
||||
3. Create directory: `skill/<skill-name>/`
|
||||
4. Create `SKILL.md` with required frontmatter
|
||||
5. Add structured content: Purpose, Usage, Examples, Troubleshooting
|
||||
|
||||
## Automatic Name Generation
|
||||
|
||||
When users request command or skill creation, names are automatically generated based on the description to provide a seamless experience.
|
||||
|
||||
### For Commands:
|
||||
1. **Keyword Extraction**: Identify action verbs and target nouns from the description
|
||||
2. **English Conversion**: Convert Chinese keywords to English equivalents (e.g., "创建" → "create", "总结" → "summarize")
|
||||
3. **Kebab-case Format**: Combine words with hyphens, all lowercase (e.g., "create-summary")
|
||||
4. **Conflict Resolution**: Check if name exists in `command/` directory, append numeric suffix if needed
|
||||
|
||||
### For Skills:
|
||||
1. **Function Extraction**: Identify core functionality from the description
|
||||
2. **Simplified Naming**: Use lowercase, hyphen-separated words describing the skill's purpose
|
||||
3. **Validation**: Ensure name follows `[a-z0-9-]+` pattern
|
||||
4. **Conflict Check**: Verify uniqueness in `skill/` directory
|
||||
|
||||
### Examples:
|
||||
- "创建command,用于归纳总结当前对话中有价值的内容" → `summarize-conversation`
|
||||
- "创建skill,用于管理git工作流" → `git-workflow`
|
||||
- "添加命令来处理图片压缩" → `compress-images`
|
||||
- "创建技能用于代码审查" → `code-review`
|
||||
|
||||
### User Override:
|
||||
If users explicitly provide a name in their request, use the provided name instead of auto-generation.
|
||||
|
||||
## Response Guide for Creation Requests
|
||||
|
||||
When users ask to create commands or skills, follow this structured approach:
|
||||
|
||||
### For "创建command" or "创建命令" requests:
|
||||
1. **自动生成名称**: 基于用户描述自动生成 kebab-case 命令名称
|
||||
- 从描述中提取关键词(动词+名词)
|
||||
- 转换为英文 kebab-case 格式
|
||||
- 如果名称已存在,添加数字后缀(如 `-2`, `-3`)
|
||||
2. **验证名称**: 确保名称符合 kebab-case 规范
|
||||
3. **默认位置**: 全局 (`~/.config/opencode/command/`)
|
||||
4. **创建模板**:
|
||||
- 生成包含 `description` 的 frontmatter
|
||||
- 创建支持 `$ARGUMENTS` 的模板
|
||||
- 包含使用示例
|
||||
5. **写入文件**: 在默认位置创建命令文件
|
||||
6. **测试**: 验证文件存在且格式正确
|
||||
|
||||
### For "创建skill" or "创建技能" requests:
|
||||
1. **自动生成名称**: 基于用户描述自动生成 skill 名称
|
||||
- 从描述中提取核心功能关键词
|
||||
- 转换为小写字母、连字符格式
|
||||
- 如果名称已存在,添加数字后缀
|
||||
2. **验证名称**: 确保名称符合命名规则(小写字母、连字符、字母数字)
|
||||
3. **默认位置**: 全局 (`~/.config/opencode/skill/<name>/`)
|
||||
4. **创建目录**: `skill/<name>/`
|
||||
5. **创建 SKILL.md**:
|
||||
- 包含 `name` 和 `description` 的 frontmatter
|
||||
- 结构化内容:Purpose, Usage, Examples, Best Practices, Troubleshooting
|
||||
6. **写入文件**: 在默认位置创建完整的 SKILL.md 文件
|
||||
7. **测试**: 验证技能可正常加载 `skill({ name: "<skill-name>" })`
|
||||
|
||||
### Sample Response Format:
|
||||
```
|
||||
我将帮你创建 [command/skill]。
|
||||
|
||||
基于您的描述,自动生成名称:[generated-name]
|
||||
|
||||
**自动命名规则**:
|
||||
- 从描述中提取关键词(动词+名词)
|
||||
- 转换为 kebab-case 格式(小写字母、连字符)
|
||||
- 检查名称冲突,自动添加数字后缀
|
||||
|
||||
**文件详情**:
|
||||
- 名称: [generated-name]
|
||||
- 用途: [brief-description]
|
||||
- 位置: 全局 (~/.config/opencode/[command|skill]/)
|
||||
|
||||
已创建 [file-path]:
|
||||
|
||||
```markdown
|
||||
[complete file content]
|
||||
```
|
||||
|
||||
要测试,请运行:[/command-name] 或 skill({ name: "skill-name" })
|
||||
```
|
||||
|
||||
## Resources
|
||||
|
||||
- [OpenCode Skills Documentation](https://opencode.ai/docs/skills)
|
||||
- [OpenCode Commands Documentation](https://opencode.ai/docs/commands)
|
||||
- [OpenCode Configuration Guide](https://opencode.ai/docs/config)
|
||||
- [GitHub Repository](https://github.com/anomalyco/opencode)
|
||||
|
||||
## Updates and Maintenance
|
||||
|
||||
1. **Regular Review**: Periodically review and update commands/skills
|
||||
2. **Version Tracking**: Use Git to track changes
|
||||
3. **Community Sharing**: Share useful commands/skills with community
|
||||
4. **Feedback Integration**: Incorporate user feedback for improvements
|
||||
|
||||
---
|
||||
|
||||
*Last updated: 2026-01-15*
|
||||
201
skill/opencode/command-creation.md
Normal file
201
skill/opencode/command-creation.md
Normal file
@@ -0,0 +1,201 @@
|
||||
# Command Creation Guide
|
||||
|
||||
## Overview
|
||||
OpenCode commands are user-invoked prompts for repetitive tasks, defined in the `command/` directory.
|
||||
|
||||
## File Location
|
||||
- **Default location (Global)**: `~/.config/opencode/command/<name>.md`
|
||||
- **Project-specific**: `.opencode/command/<name>.md` (when needed)
|
||||
|
||||
## Command Structure
|
||||
Each command file must contain YAML frontmatter followed by the prompt template.
|
||||
|
||||
### Required Frontmatter Fields
|
||||
- `description`: Brief description shown in TUI (1-2 sentences)
|
||||
|
||||
### Optional Frontmatter Fields
|
||||
- `agent`: Specific agent to execute this command
|
||||
- `model`: Override default model
|
||||
- `subtask`: Boolean to force subagent invocation
|
||||
|
||||
## Template Features
|
||||
The command template supports several placeholders:
|
||||
|
||||
- `$ARGUMENTS`: All arguments passed to the command
|
||||
- `$1`, `$2`, `$3`: Individual positional arguments
|
||||
- `!``command``: Execute bash command and inject output
|
||||
- `@filename`: Include file content in prompt
|
||||
|
||||
## Example Command
|
||||
Create `~/.config/opencode/command/new-skill.md`:
|
||||
|
||||
```markdown
|
||||
---
|
||||
description: Create a new OpenCode skill with proper structure
|
||||
---
|
||||
|
||||
Create a new OpenCode skill named "$ARGUMENTS" with comprehensive documentation.
|
||||
|
||||
**Skill Requirements:**
|
||||
1. Directory: `skill/$ARGUMENTS/SKILL.md`
|
||||
2. Frontmatter with `name` and `description`
|
||||
3. Clear sections for usage, examples, best practices
|
||||
4. Follow naming conventions: lowercase, hyphens, alphanumeric
|
||||
|
||||
**Steps:**
|
||||
1. Create directory structure
|
||||
2. Write SKILL.md with frontmatter
|
||||
3. Include practical examples
|
||||
4. Add troubleshooting section
|
||||
|
||||
Output the complete SKILL.md content for review.
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Command Design
|
||||
1. **Clear Purpose**: Each command should have a single, focused purpose
|
||||
2. **Descriptive Names**: Use verbs that describe the action (e.g., `create-`, `review-`, `analyze-`)
|
||||
3. **Argument Handling**: Use `$ARGUMENTS` or `$1`, `$2` for flexible input
|
||||
4. **Error Handling**: Include validation in prompts
|
||||
5. **Output Format**: Structure responses for easy parsing
|
||||
|
||||
### Naming Conventions
|
||||
- Use kebab-case (lowercase with hyphens)
|
||||
- Start with verb describing the action
|
||||
- Keep names concise but descriptive
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Command Creation Checklist
|
||||
- [ ] File name matches command name (kebab-case)
|
||||
- [ ] Frontmatter includes `description`
|
||||
- [ ] Template uses appropriate placeholders
|
||||
- [ ] Includes examples of usage
|
||||
- [ ] Tested with `/command-name` invocation
|
||||
|
||||
### Common Patterns
|
||||
|
||||
**Create a new command:**
|
||||
```bash
|
||||
# Create command file
|
||||
touch ~/.config/opencode/command/my-command.md
|
||||
|
||||
# Edit with template
|
||||
cat > ~/.config/opencode/command/my-command.md << 'EOF'
|
||||
---
|
||||
description: Description of my command
|
||||
---
|
||||
|
||||
Command template with $ARGUMENTS support.
|
||||
|
||||
Example: /my-command argument1 argument2
|
||||
EOF
|
||||
```
|
||||
|
||||
## Testing and Validation
|
||||
|
||||
### Test Command Loading
|
||||
```bash
|
||||
# Check if command appears in TUI
|
||||
# Type "/" in OpenCode TUI and search for your command
|
||||
```
|
||||
|
||||
### Verify Syntax
|
||||
```bash
|
||||
# Check YAML frontmatter
|
||||
head -20 command/my-command.md
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Command Not Appearing
|
||||
1. **Check file location**: Ensure command is in correct `command/` directory
|
||||
2. **Verify frontmatter**: Must have `description` field
|
||||
3. **Check permissions**: No restrictive permissions blocking command
|
||||
4. **Restart OpenCode**: Some changes require restart
|
||||
|
||||
### Common Errors
|
||||
- **"Command not found"**: File not in correct location or missing `.md` extension
|
||||
- **"Invalid frontmatter"**: Missing required fields or YAML syntax error
|
||||
|
||||
## Integration with OpenCode Config
|
||||
|
||||
### Permissions Configuration
|
||||
Add to `opencode.json`:
|
||||
```json
|
||||
{
|
||||
"permission": {
|
||||
"skill": {
|
||||
"*": "allow",
|
||||
"experimental-*": "ask",
|
||||
"internal-*": "deny"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Agent-Specific Settings
|
||||
```json
|
||||
{
|
||||
"agent": {
|
||||
"plan": {
|
||||
"permission": {
|
||||
"skill": {
|
||||
"analysis-*": "allow"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Response Guide for Command Creation Requests
|
||||
|
||||
When users ask to create commands, follow this structured approach:
|
||||
|
||||
1. **自动生成名称**: 基于用户描述自动生成 kebab-case 命令名称
|
||||
- 从描述中提取关键词(动词+名词)
|
||||
- 转换为英文 kebab-case 格式
|
||||
- 如果名称已存在,添加数字后缀(如 `-2`, `-3`)
|
||||
2. **验证名称**: 确保名称符合 kebab-case 规范
|
||||
3. **默认位置**: 全局 (`~/.config/opencode/command/`) - commands are created here by default
|
||||
4. **创建模板**:
|
||||
- 生成包含 `description` 的 frontmatter
|
||||
- 创建支持 `$ARGUMENTS` 的模板
|
||||
- 包含使用示例
|
||||
5. **写入文件**: 创建命令文件并写入内容
|
||||
6. **测试**: 验证文件存在且格式正确
|
||||
|
||||
### Sample Response Format:
|
||||
```
|
||||
我将帮你创建命令。
|
||||
|
||||
基于您的描述,自动生成名称:[generated-name]
|
||||
|
||||
**自动命名规则**:
|
||||
- 从描述中提取关键词(动词+名词)
|
||||
- 转换为 kebab-case 格式(小写字母、连字符)
|
||||
- 检查名称冲突,自动添加数字后缀
|
||||
|
||||
**文件详情**:
|
||||
- 名称: [generated-name]
|
||||
- 用途: [brief-description]
|
||||
- 位置: 全局 (~/.config/opencode/command/)
|
||||
|
||||
已创建 [file-path]:
|
||||
|
||||
```markdown
|
||||
[complete file content]
|
||||
```
|
||||
|
||||
要测试,请运行:[/command-name]
|
||||
```
|
||||
|
||||
## Resources
|
||||
- [OpenCode Commands Documentation](https://opencode.ai/docs/commands)
|
||||
- [OpenCode Configuration Guide](https://opencode.ai/docs/config)
|
||||
|
||||
---
|
||||
|
||||
*Last updated: 2026-01-15*
|
||||
251
skill/opencode/skill-creation.md
Normal file
251
skill/opencode/skill-creation.md
Normal file
@@ -0,0 +1,251 @@
|
||||
# Skill Creation Guide
|
||||
|
||||
## Overview
|
||||
OpenCode skills are reusable behavior definitions for agents, defined in `skill/<name>/SKILL.md` files.
|
||||
|
||||
## Directory Structure
|
||||
**Default location (Global):**
|
||||
```
|
||||
~/.config/opencode/skill/
|
||||
└── <skill-name>/
|
||||
└── SKILL.md
|
||||
```
|
||||
|
||||
**Project-specific location (when needed):**
|
||||
```
|
||||
.opencode/skill/
|
||||
└── <skill-name>/
|
||||
└── SKILL.md
|
||||
```
|
||||
|
||||
## Skill File Requirements
|
||||
|
||||
### Frontmatter (Required)
|
||||
- `name`: Skill name (must match directory name)
|
||||
- `description`: Concise description (1-1024 characters)
|
||||
|
||||
### Frontmatter (Optional)
|
||||
- `license`: License identifier
|
||||
- `compatibility`: Compatibility constraints
|
||||
- `metadata`: Key-value pairs for additional context
|
||||
|
||||
## Naming Rules
|
||||
Skill names must:
|
||||
- Be 1-64 characters
|
||||
- Use lowercase alphanumeric with single hyphens
|
||||
- Not start or end with hyphen
|
||||
- Not contain consecutive hyphens
|
||||
- Match regex: `^[a-z0-9]+(-[a-z0-9]+)*$`
|
||||
|
||||
## Skill Content Structure
|
||||
A well-structured skill should include:
|
||||
|
||||
1. **Introduction**: Purpose and scope
|
||||
2. **Usage Instructions**: When and how to use the skill
|
||||
3. **Examples**: Practical implementation examples
|
||||
4. **Best Practices**: Recommended approaches
|
||||
5. **Troubleshooting**: Common issues and solutions
|
||||
6. **References**: Related documentation
|
||||
|
||||
## Example Skill Template
|
||||
```markdown
|
||||
---
|
||||
name: example-skill
|
||||
description: Brief description of what this skill does
|
||||
---
|
||||
|
||||
# Skill Title
|
||||
|
||||
## Purpose
|
||||
Explain what this skill helps achieve and when to use it.
|
||||
|
||||
## Core Concepts
|
||||
- Key principle 1
|
||||
- Key principle 2
|
||||
|
||||
## Usage
|
||||
Step-by-step instructions for using this skill.
|
||||
|
||||
## Examples
|
||||
### Basic Example
|
||||
```bash
|
||||
# Example code or commands
|
||||
```
|
||||
|
||||
### Advanced Example
|
||||
Detailed example with explanation.
|
||||
|
||||
## Best Practices
|
||||
1. Recommended approach 1
|
||||
2. Recommended approach 2
|
||||
|
||||
## Troubleshooting
|
||||
| Issue | Solution |
|
||||
|-------|----------|
|
||||
| Common problem | How to fix it |
|
||||
|
||||
## References
|
||||
- [Documentation link](https://opencode.ai/docs)
|
||||
- Related skills or commands
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Skill Development
|
||||
1. **Modular Design**: Keep skills focused on specific domains
|
||||
2. **Comprehensive Documentation**: Include examples and edge cases
|
||||
3. **Consistent Formatting**: Follow existing skill patterns
|
||||
4. **Testing**: Verify skill loads correctly with `skill({ name: "skill-name" })`
|
||||
5. **Version Control**: Track skill changes in Git
|
||||
|
||||
### Organization
|
||||
1. **Default location**: Global (`~/.config/opencode/skill/`) - skills are created here by default for reuse across projects
|
||||
2. **Naming Conventions**: Use kebab-case for all skill names
|
||||
3. **Documentation**: Maintain README or index of available skills
|
||||
4. **Permissions**: Configure access controls in `opencode.json`
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Skill Creation Checklist
|
||||
- [ ] Directory name matches skill name
|
||||
- [ ] SKILL.md contains required frontmatter
|
||||
- [ ] Description is 1-1024 characters
|
||||
- [ ] Name follows naming rules
|
||||
- [ ] Content includes usage and examples
|
||||
- [ ] Skill loads without errors
|
||||
|
||||
### Common Patterns
|
||||
|
||||
**Create a new skill:**
|
||||
```bash
|
||||
# Create skill directory
|
||||
mkdir -p ~/.config/opencode/skill/my-skill
|
||||
|
||||
# Create SKILL.md
|
||||
cat > ~/.config/opencode/skill/my-skill/SKILL.md << 'EOF'
|
||||
---
|
||||
name: my-skill
|
||||
description: Description of my skill
|
||||
---
|
||||
|
||||
# My Skill
|
||||
|
||||
## Usage
|
||||
Instructions here.
|
||||
|
||||
## Examples
|
||||
Example content.
|
||||
EOF
|
||||
```
|
||||
|
||||
## Testing and Validation
|
||||
|
||||
### Test Skill Loading
|
||||
```bash
|
||||
# In OpenCode session
|
||||
skill({ name: "my-skill" })
|
||||
```
|
||||
|
||||
### Verify Syntax
|
||||
```bash
|
||||
# Check YAML frontmatter
|
||||
head -20 skill/my-skill/SKILL.md
|
||||
|
||||
# Validate naming
|
||||
echo "skill-name" | grep -E '^[a-z0-9]+(-[a-z0-9]+)*$'
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Skill Not Loading
|
||||
1. **Directory name**: Must match skill name in frontmatter
|
||||
2. **File name**: Must be `SKILL.md` (all caps)
|
||||
3. **Frontmatter**: Requires `name` and `description`
|
||||
4. **Naming rules**: Verify name follows conventions
|
||||
5. **Permissions**: Check `opencode.json` permissions
|
||||
|
||||
### Common Errors
|
||||
- **"Skill not found"**: Directory name mismatch or missing SKILL.md
|
||||
- **"Invalid frontmatter"**: Missing required fields or YAML syntax error
|
||||
- **"Permission denied"**: Skill blocked by permission configuration
|
||||
|
||||
## Integration with OpenCode Config
|
||||
|
||||
### Permissions Configuration
|
||||
Add to `opencode.json`:
|
||||
```json
|
||||
{
|
||||
"permission": {
|
||||
"skill": {
|
||||
"*": "allow",
|
||||
"experimental-*": "ask",
|
||||
"internal-*": "deny"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Agent-Specific Settings
|
||||
```json
|
||||
{
|
||||
"agent": {
|
||||
"plan": {
|
||||
"permission": {
|
||||
"skill": {
|
||||
"analysis-*": "allow"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Response Guide for Skill Creation Requests
|
||||
|
||||
When users ask to create skills, follow this structured approach:
|
||||
|
||||
1. **自动生成名称**: 基于用户描述自动生成 skill 名称
|
||||
- 从描述中提取核心功能关键词
|
||||
- 转换为小写字母、连字符格式
|
||||
- 如果名称已存在,添加数字后缀
|
||||
2. **验证名称**: 确保名称符合命名规则(小写字母、连字符、字母数字)
|
||||
3. **默认位置**: 全局 (`~/.config/opencode/skill/<name>/`) - skills are created here by default
|
||||
4. **创建 SKILL.md**:
|
||||
- 包含 `name` 和 `description` 的 frontmatter
|
||||
- 结构化内容:Purpose, Usage, Examples, Best Practices, Troubleshooting
|
||||
5. **写入文件**: 创建完整的 SKILL.md 文件
|
||||
6. **测试**: 验证技能可正常加载 `skill({ name: "<skill-name>" })`
|
||||
|
||||
### Sample Response Format:
|
||||
```
|
||||
我将帮你创建技能。
|
||||
|
||||
基于您的描述,自动生成名称:[generated-name]
|
||||
|
||||
**自动命名规则**:
|
||||
- 从描述中提取核心功能关键词
|
||||
- 转换为小写字母、连字符格式
|
||||
- 检查名称冲突,自动添加数字后缀
|
||||
|
||||
**文件详情**:
|
||||
- 名称: [generated-name]
|
||||
- 主要功能: [brief-description]
|
||||
- 位置: 全局 (~/.config/opencode/skill/)
|
||||
|
||||
已创建 [file-path]:
|
||||
|
||||
```markdown
|
||||
[complete file content]
|
||||
```
|
||||
|
||||
要测试,请运行:skill({ name: "skill-name" })
|
||||
```
|
||||
|
||||
## Resources
|
||||
- [OpenCode Skills Documentation](https://opencode.ai/docs/skills)
|
||||
- [OpenCode Configuration Guide](https://opencode.ai/docs/config)
|
||||
- [GitHub Repository](https://github.com/anomalyco/opencode)
|
||||
|
||||
---
|
||||
|
||||
*Last updated: 2026-01-15*
|
||||
Reference in New Issue
Block a user