Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/majiayu000/sage --skill sage-tool-development명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | sage-tool-development |
| description | Sage 工具开发规范,包含 TOOL.md 描述文件标准、权限系统、沙箱集成 |
| when_to_use | 当需要开发新工具、修改现有工具、或设计工具系统时使用 |
| allowed_tools | ["Read","Grep","Glob","Edit","Write","Bash"] |
| user_invocable | true |
| priority | 90 |
每个工具必须包含代码实现和描述文件:
crates/sage-tools/src/
├── bash/
│ ├── mod.rs # 工具实现
│ ├── TOOL.md # 工具描述(注入 system prompt)
│ ├── safety.rs # 安全检查(可选)
│ └── tests.rs # 测试
├── edit/
│ ├── mod.rs
│ ├── TOOL.md
│ ├── diff.rs # 辅助功能
│ └── tests.rs
├── read/
│ ├── mod.rs
│ ├── TOOL.md
│ └── tests.rs
...
---
name: ToolName
description: 简短描述(一行)
dangerous: true|false
requires_permission: true|false
category: file|shell|web|mcp
---
## Description
详细描述工具的功能和用途。
## Parameters
| 参数名 | 类型 | 必需 | 默认值 | 描述 |
|-------|------|------|-------|------|
| `param1` | string | 是 | - | 参数说明 |
| `param2` | number | 否 | 100 | 参数说明 |
## Usage Notes
- 使用注意事项
- 最佳实践
- 常见陷阱
## Examples
\`\`\`
示例调用
\`\`\`
## Security Considerations
安全相关说明(如有)
//! {工具名} - {简短描述}
use async_trait::async_trait;
use sage_core::tools::{Tool, ToolCall, ToolResult, ToolSchema, ToolError};
use serde::{Deserialize, Serialize};
/// 工具参数
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct {ToolName}Params {
/// 参数描述
pub required_param: String,
/// 可选参数描述
#[serde(default)]
pub optional_param: Option<i32>,
}
/// {工具名}工具
pub struct {ToolName}Tool {
// 工具状态(如需要)
}
impl {ToolName}Tool {
pub fn new() -> Self {
Self {}
}
}
#[async_trait]
impl Tool for {ToolName}Tool {
fn name(&self) -> &str {
"{tool_name}" // 小写,用于调用
}
fn description(&self) -> &str {
include_str!("TOOL.md") // 从描述文件加载
.lines()
.skip_while(|l| l.starts_with() || !l.())
.()
.(|l| !l.())
.collect::<<_>>()
.()
.()
}
(&) ToolSchema {
ToolSchema::(.(), .(), [
])
}
(&, call: &ToolCall) <ToolResult, ToolError> {
: {ToolName}Params = call.()?;
.(¶ms)?;
= .(¶ms).?;
(ToolResult::(
&result,
.(),
))
}
(&) {
}
(&) {
}
}
{ToolName}Tool {
(&, params: &{ToolName}Params) <(), ToolError> {
(())
}
(&, params: &{ToolName}Params) <, ToolError> {
todo!()
}
}
tests {
super::*;
() {
}
() {
}
}
pub enum PermissionLevel {
/// 无需权限(Read, Glob, Grep)
None,
/// 需要用户确认(Edit, Write)
Confirm,
/// 需要明确授权(Bash, 危险操作)
Authorize,
/// 禁止执行(根据规则)
Deny,
}
impl Tool for MyTool {
fn permission_level(&self, call: &ToolCall) -> PermissionLevel {
// 根据调用参数动态决定权限级别
if self.is_destructive(call) {
PermissionLevel::Authorize
} else {
PermissionLevel::Confirm
}
}
}
危险工具必须在沙箱中执行:
impl Tool for BashTool {
async fn execute(&self, call: &ToolCall) -> Result<ToolResult, ToolError> {
let sandbox = SandboxBuilder::new()
.with_timeout(Duration::from_secs(120))
.with_memory_limit(512 * 1024 * 1024) // 512MB
.with_network(false) // 禁用网络(除非必要)
.build()?;
sandbox.execute(|| {
// 在沙箱中执行命令
}).await
}
}
| 类别 | 工具 | 权限 | 沙箱 |
|---|---|---|---|
| 只读 | Read, Glob, Grep, WebFetch | None | 否 |
| 写入 | Edit, Write | Confirm | 否 |
| 执行 | Bash | Authorize | 是 |
| 系统 | TaskOutput, KillShell | Authorize | 否 |
| MCP | 动态工具 | 按配置 | 按配置 |
// sage-tools/src/lib.rs
pub fn register_builtin_tools(registry: &mut ToolRegistry) {
// 只读工具
registry.register(ReadTool::new());
registry.register(GlobTool::new());
registry.register(GrepTool::new());
// 写入工具
registry.register(EditTool::new());
registry.register(WriteTool::new());
// 执行工具(需要沙箱)
registry.register(BashTool::new().with_sandbox());
// 加载 TOOL.md 描述
registry.load_descriptions("src/");
}
开发新工具前确认:
{tool_name}/TOOL.md 描述文件Tool trait