-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path21.html
More file actions
276 lines (276 loc) · 24.7 KB
/
Copy path21.html
File metadata and controls
276 lines (276 loc) · 24.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="CodeClub - OpenCode Skills" />
<meta name="author" content="Jackson" />
<title>OpenCode Skills - CodeClub</title>
<link rel="icon" type="image/x-icon" href="../../img/logo.png" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
rel="stylesheet"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
crossorigin="anonymous"
referrerpolicy="no-referrer"
/>
<link rel="stylesheet" href="../../css/main.css" />
<link rel="stylesheet" href="../../css/dark-mode.css" />
<link rel="stylesheet" href="../../css/mobile-optimizations.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/12.0.0/marked.min.js"></script>
<style>
.tutorial-page {
max-width: 1200px;
margin: 70px auto 40px;
padding: 0 20px;
display: flex;
gap: 20px;
}
.tutorial-sidebar {
width: 240px;
flex-shrink: 0;
position: sticky;
top: 70px;
max-height: calc(100vh - 90px);
overflow-y: auto;
background: var(--bg-secondary, #fff);
border-radius: 8px;
padding: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.tutorial-sidebar h3 {
font-size: 15px;
margin: 0 0 12px;
color: var(--text-primary, #1a1a2e);
padding-bottom: 8px;
border-bottom: 2px solid var(--primary, #3b82f6);
}
.tutorial-sidebar a {
display: block;
padding: 5px 8px;
color: var(--text-secondary, #666);
text-decoration: none;
font-size: 13px;
border-radius: 4px;
line-height: 1.4;
}
.tutorial-sidebar a:hover {
background: var(--primary, #3b82f6);
color: #fff;
}
.tutorial-sidebar a.active {
background: var(--primary, #3b82f6);
color: #fff;
font-weight: 600;
}
.tutorial-main {
flex: 1;
min-width: 0;
}
.tutorial-article {
background: var(--bg-secondary, #fff);
border-radius: 8px;
padding: 32px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.tutorial-article h1 {
font-size: 26px;
margin-bottom: 16px;
color: var(--text-primary, #1a1a2e);
border-bottom: 2px solid var(--primary, #3b82f6);
padding-bottom: 12px;
}
.markdown-body {
font-size: 15px;
line-height: 1.8;
color: var(--text-secondary, #333);
}
.markdown-body h1 {
font-size: 24px;
border-bottom: 1px solid var(--border, #e5e7eb);
padding-bottom: 8px;
}
.markdown-body h2 {
font-size: 20px;
border-bottom: 1px solid var(--border, #e5e7eb);
padding-bottom: 6px;
}
.markdown-body h3 {
font-size: 17px;
}
.markdown-body pre {
background: #1e1e2e;
color: #cdd6f4;
padding: 16px;
border-radius: 8px;
overflow-x: auto;
}
.markdown-body code {
font-family: 'Fira Code', 'Cascadia Code', monospace;
font-size: 14px;
}
.markdown-body p code {
background: #f1f5f9;
padding: 2px 6px;
border-radius: 4px;
color: #e83e8c;
}
.markdown-body blockquote {
border-left: 4px solid var(--primary, #3b82f6);
padding: 12px 20px;
margin: 16px 0;
background: #f8fafc;
border-radius: 0 8px 8px 0;
}
.markdown-body img {
max-width: 100%;
border-radius: 8px;
}
.markdown-body table {
border-collapse: collapse;
width: 100%;
margin: 16px 0;
}
.markdown-body table th,
.markdown-body table td {
border: 1px solid var(--border, #e5e7eb);
padding: 8px 12px;
text-align: left;
}
.markdown-body table th {
background: var(--bg-primary, #f8fafc);
font-weight: 600;
}
.markdown-body table tr:nth-child(2n) {
background: var(--bg-primary, #f8fafc);
}
.markdown-body ul,
.markdown-body ol {
padding-left: 24px;
margin: 12px 0;
}
.markdown-body li {
margin: 4px 0;
}
.markdown-body hr {
border: none;
border-top: 1px solid var(--border, #e5e7eb);
margin: 24px 0;
}
.markdown-body a {
color: var(--primary, #3b82f6);
text-decoration: none;
}
.markdown-body a:hover {
text-decoration: underline;
}
.page-navigation {
display: flex;
justify-content: space-between;
margin-top: 24px;
padding-top: 16px;
border-top: 1px solid var(--border, #e5e7eb);
}
.page-nav-link {
color: var(--primary, #3b82f6);
text-decoration: none;
font-weight: 500;
font-size: 14px;
}
.page-nav-link:hover {
text-decoration: underline;
}
.source-link {
margin-top: 16px;
font-size: 13px;
color: var(--text-secondary, #999);
}
.source-link a {
color: var(--primary, #3b82f6);
}
@media (max-width: 768px) {
.tutorial-page {
flex-direction: column;
}
.tutorial-sidebar {
width: 100%;
position: static;
max-height: 200px;
}
}
</style>
</head>
<body>
<nav class="navbar">
<div class="navbar-container">
<a class="navbar-brand" href="../../index.html">
<img src="../../img/logo.png" alt="CodeClub" width="32" height="32" />
<span>CodeClub</span>
</a>
<button class="mobile-menu-toggle" aria-label="切换导航菜单"><span></span><span></span><span></span></button>
<ul class="navbar-nav">
<li><a class="nav-link" href="../../index.html">首页</a></li>
<li><a class="nav-link" href="../../nav.html">网址导航</a></li>
<li><a class="nav-link" href="../../blog/">博客</a></li>
<li><a class="nav-link" href="../../wiki/index.html" target="_blank">WiKi</a></li>
<li><a class="nav-link active" href="../index.html">教程</a></li>
<li><a class="nav-link" href="../../book.html">图书</a></li>
<li><a class="nav-link" href="../../contact.html">联系我</a></li>
<li><a class="nav-link" href="../../about.html">关于我</a></li>
</ul>
</div>
</nav>
<div class="tutorial-page">
<div class="tutorial-sidebar">
<h3>📖 OpenCode</h3>
<a href="0.html">OpenCode 教程</a>
<a href="1.html">OpenCode 简介</a>
<a href="2.html">OpenCode 安装</a>
<a href="3.html">OpenCode 配置</a>
<a href="4.html">OpenCode 第一次使用</a>
<a href="5.html">OpenCode VSCode</a>
<a href="6.html">OpenCode 终端界面</a>
<a href="7.html">OpenCode CLI 使用</a>
<a href="8.html">OpenCode Web 使用</a>
<a href="9.html">OpenCode GitHub</a>
<a href="10.html">OpenCode GitLab</a>
<a href="11.html">OpenCode 工具</a>
<a href="12.html">OpenCode 规则</a>
<a href="13.html">OpenCode 代理</a>
<a href="14.html">OpenCode 主题</a>
<a href="15.html">OpenCode 快捷键</a>
<a href="16.html">OpenCode 自定义命令</a>
<a href="17.html">OpenCode 格式化工具</a>
<a href="18.html">OpenCode 权限配置</a>
<a href="19.html">OpenCode LSP 服务器配置</a>
<a href="20.html">OpenCode MCP 服务器配置</a>
<a href="21.html" class="active">OpenCode Skills</a>
<a href="22.html">OpenCode 自定义工具</a>
</div>
<div class="tutorial-main">
<div class="tutorial-article">
<div class="markdown-body" id="md-content"></div>
<div class="page-navigation">
<a href="20.html" class="page-nav-link">← OpenCode MCP 服务器配置</a>
<a href="22.html" class="page-nav-link">OpenCode 自定义工具 →</a>
</div>
<div class="source-link">原文来源:<a href="https://www.runoob.com" target="_blank">菜鸟教程</a></div>
</div>
</div>
</div>
<footer class="footer">
<div class="footer-content"><p>© 2024 CodeClub. All rights reserved.</p></div>
</footer>
<script src="../../js/dark-mode.js"></script>
<script src="../../js/mobile-menu.js"></script>
<script>
const md = `# OpenCode Skills\n\n\n\n在 OpenCode 中,**代理技能(Skills)**是一种用于封装可复用行为的机制,通过 \`SKILL.md\` 文件定义,使 LLM 能够**按需加载、按需执行**特定能力。\n\n\n\n\n相比普通提示词,技能更接近模块化能力单元,可以在多个项目或团队中复用。\n\n\n\n\nSkills 是 OpenCode 的**能力插件系统**,它将 AI 行为从单次提示升级为可复用能力模块,使开发流程更加标准化、可组合,并适用于复杂工程体系。\n\n\n\n\n更多 Skills 可以参考:\n\n \n\n\n- \nSkills 教程:[https://www.runoob.com/ai-agent/skills-agent.html](https://www.runoob.com/ai-agent/skills-agent.html)\n\n \n- \nOpenCode skills 使用:[https://www.runoob.com/ai-agent/opencode-skills-intro.html](https://www.runoob.com/ai-agent/opencode-skills-intro.html)\n\n\n\n\n\n\n### 核心机制\n\n\n\nSkills 通过内置的 \`skill\` 工具进行管理,工作流程如下:\n\n\n\n\n\n\n- 扫描本地和全局技能目录\n\n- 在上下文中暴露可用技能列表\n\n- 代理根据任务自动选择技能\n\n- 按需加载 SKILL.md 内容\n\n\n\n\n这种机制避免了将所有规则一次性加载,提高了性能和上下文利用率。\n\n\n\n\n---\n\n\n## 文件放置位置\n\n \n每个技能需要一个独立的文件夹,文件夹内放置 \`SKILL.md\` 文件(注意:文件名必须全部大写)。OpenCode 会自动搜索以下六个位置:\n\n\n \n\n \n \n 类型\n 路径\n 适用范围\n \n \n \n \n 项目配置\n \`.opencode/skills//SKILL.md\`\n 仅当前项目\n \n \n 全局配置\n \`~/.config/opencode/skills//SKILL.md\`\n 所有项目\n \n \n 项目 Claude 兼容\n \`.claude/skills//SKILL.md\`\n 仅当前项目\n \n \n 全局 Claude 兼容\n \`~/.claude/skills//SKILL.md\`\n 所有项目\n \n \n 项目代理兼容\n \`.agents/skills//SKILL.md\`\n 仅当前项目\n \n \n 全局代理兼容\n \`~/.agents/skills//SKILL.md\`\n 所有项目\n \n \n\n \n典型的项目目录结构如下:\n\n\n \n\n\`\`\`\n\nyour-repo/\n├── .opencode/\n│ └── skills/\n│ ├── git-release/\n│ │ └── SKILL.md ← 发版流程技能\n│ ├── code-review/\n│ │ └── SKILL.md ← 代码审查技能\n│ └── api-doc/\n│ └── SKILL.md ← API 文档编写技能\n├── src/\n└── package.json\n\n\`\`\`\n\n \n\n---\n\n\n## 发现机制\n\n \nOpenCode 的技能发现分为两个层级:\n\n\n \n**项目本地技能:**OpenCode 从当前工作目录开始,**向上逐层遍历目录树**,直到到达 Git 工作树的根目录为止。在此过程中,它会收集沿途每一层目录下 \`.opencode/skills/*/SKILL.md\`、\`.claude/skills/*/SKILL.md\`、\`.agents/skills/*/SKILL.md\` 中所有匹配的技能文件。\n\n\n \n**全局技能:**同时从 \`~/.config/opencode/skills/*/SKILL.md\`、\`~/.claude/skills/*/SKILL.md\`、\`~/.agents/skills/*/SKILL.md\` 中加载所有已定义的全局技能。\n\n\n \n两个层级的技能会合并后一起提供给代理使用。如果项目本地技能与全局技能同名,**项目本地技能优先**。\n\n\n \n\n---\n\n\n## 编写 SKILL.md\n\n \n\n### 1、Frontmatter 字段\n\n \n每个 \`SKILL.md\` 文件必须以 YAML frontmatter 开头(即 \`---\` 包裹的部分)。OpenCode 只识别以下字段,未知字段会被自动忽略:\n\n\n \n\n \n \n 字段\n 是否必填\n 类型\n 说明\n \n \n \n \n \`name\`\n 必填\n 字符串\n 技能的唯一标识名,必须与所在文件夹名称一致,且符合命名规则\n \n \n \`description\`\n 必填\n 字符串\n 技能的描述,代理依据此内容决定是否调用,1–1024 个字符\n \n \n \`license\`\n 可选\n 字符串\n 技能内容的许可证类型,如 \`MIT\`、\`Apache-2.0\`\n \n \n \`compatibility\`\n 可选\n 字符串\n 标注与哪个工具兼容,如 \`opencode\`、\`claude\`\n \n \n \`metadata\`\n 可选\n 对象(字符串到字符串的映射)\n 自定义的附加元数据,如目标受众、工作流类型等,键值均为字符串\n \n \n\n \n\n### 2、命名规则\n\n \n\`name\` 字段的值必须同时满足以下所有条件,否则技能将无法被加载:\n\n\n \n\n\n\n- 长度为 **1–64 个字符**\n\n- 只能包含**小写字母**和**数字**,单词之间可以用单个连字符(\`-\`)分隔\n\n- 不能以 \`-\` 开头或结尾\n\n- 不能包含连续的 \`--\`\n\n- 必须与包含该 \`SKILL.md\` 的**文件夹名称完全一致**\n\n\n \n等效的正则表达式:\n\n\n \n\n\`\`\`\n^[a-z0-9]+(-[a-z0-9]+)*$\n\`\`\`\n\n \n合法命名示例:\`git-release\`、\`api-doc\`、\`code-review\`、\`deploy2prod\`\n\n\n非法命名示例:\`Git-Release\`(含大写)、\`-release\`(以 \`-\` 开头)、\`git--release\`(连续 \`--\`)\n\n\n \n\n### 3、编写描述\n\n \n\`description\` 字段的内容直接影响代理是否能正确选择和调用该技能。**建议描述要具体明确**,说明该技能做什么、在什么场景下使用,避免过于笼统:\n\n\n \n\n\n\n- ❌ 过于笼统:\`帮助完成发版任务\`\n\n- ✅ 具体明确:\`从合并的 PR 中起草发版说明、提出版本号建议,并生成可直接使用的 gh release create 命令\`\n\n\n \n\n### 4、完整示例\n\n \n在项目中创建 \`.opencode/skills/git-release/SKILL.md\`,内容如下:\n\n\n \n\n## 实例\n\n---\n\nname: git-release\n\ndescription: Create consistent releases and changelogs\n\nlicense: MIT\n\ncompatibility: opencode\n\nmetadata:\n\n audience: maintainers # 自定义元数据:目标受众\n\n workflow: github # 自定义元数据:工作流类型\n\n---\n\n \n\n## What I do\n\n- Draft release notes from merged PRs\n\n- Propose a version bump\n\n- Provide a copy-pasteable \`gh release create\` command\n\n \n\n## When to use me\n\nUse this when you are preparing a tagged release.\n\nAsk clarifying questions if the target versioning scheme is unclear.\n\n\n \nFrontmatter 中的 \`name\` 值必须与文件夹名称一致。本例中文件夹名为 \`git-release\`,因此 \`name\` 也必须写 \`git-release\`,否则技能无法被识别。\n\n\n \n\n---\n\n\n## 代理如何发现和加载技能\n\n \nOpenCode 启动后,会将当前所有可用技能以 XML 格式注入到 \`skill\` 工具的描述中。代理可以通过查看工具描述来了解有哪些技能可用:\n\n\n \n\n\`\`\`\n\n\n \n git-release\n Create consistent releases and changelogs\n \n \n code-review\n Perform structured code reviews with consistent criteria\n \n\n\n\`\`\`\n\n \n当代理判断某个技能与当前任务相关时,会主动调用 \`skill\` 工具来加载该技能的完整 \`SKILL.md\` 内容:\n\n\n \n\n\`\`\`\nskill({ name: "git-release" })\n\`\`\`\n\n \n加载完成后,技能中定义的指令和上下文信息会进入代理的工作记忆,从而影响后续的行为和输出。技能本身不会自动执行任何操作,只是为代理提供额外的上下文和行为规范。\n\n\n \n\n---\n\n\n## 配置技能权限\n\n \n在 \`opencode.json\` 中,使用 \`permission.skill\` 字段控制代理可以访问哪些技能,支持精确名称和 Glob 通配符两种匹配方式:\n\n\n \n\n## 实例\n\n{\n\n "$schema": "https://opencode.ai/config.json",\n\n "permission": {\n\n "skill": {\n\n "*": "allow", // 兜底规则:默认允许加载所有技能\n\n "pr-review": "allow", // 精确匹配:允许加载 pr-review 技能\n\n "internal-*": "deny", // Glob 匹配:拒绝加载所有 internal- 开头的技能(对代理完全隐藏)\n\n "experimental-*": "ask" // Glob 匹配:加载 experimental- 开头的技能前需用户确认\n\n }\n\n }\n\n}\n\n\n \n三种权限动作对技能的具体效果如下:\n\n\n \n\n \n \n 权限值\n 效果\n \n \n \n \n \`"allow"\`\n 技能立即加载,代理无需任何确认\n \n \n \`"deny"\`\n 技能对代理完全隐藏,\`\` 列表中不会出现该技能,代理无法感知其存在\n \n \n \`"ask"\`\n 代理尝试加载该技能时弹出确认提示,由用户决定是否允许\n \n \n\n \n\n---\n\n\n## 按代理覆盖权限\n\n \n不同代理可能需要访问不同的技能集,可以为每个代理单独配置权限,覆盖全局默认值。\n\n\n \n\n### 1、在自定义代理的 Frontmatter 中配置\n\n \n\n## 实例\n\n# 文件路径:~/.config/opencode/agents/my-agent.md\n\n---\n\npermission:\n\n skill:\n\n "documents-*": "allow" # 该代理可以加载所有 documents- 开头的技能\n\n # 其他技能遵循全局权限配置\n\n---\n\n \n\nYou are a documentation assistant.\n\n\n \n\n### 2、在 opencode.json 中为内置代理配置\n\n \n\n## 实例\n\n{\n\n "$schema": "https://opencode.ai/config.json",\n\n "agent": {\n\n "plan": { // 内置代理名称\n\n "permission": {\n\n "skill": {\n\n "internal-*": "allow" // plan 代理可以加载 internal- 开头的技能,\n\n // 即使全局配置中对其设置了 deny\n\n }\n\n }\n\n }\n\n }\n\n}\n\n\n \n\n---\n\n\n## 禁用技能工具\n\n \n对于完全不需要使用技能的代理,可以直接禁用 \`skill\` 工具。禁用后,\`\` 列表将从代理的上下文中完全移除,既节省 Token 消耗,又避免代理尝试加载任何技能。\n\n\n \n\n### 1、在自定义代理的 Frontmatter 中禁用\n\n \n\n## 实例\n\n---\n\ntools:\n\n skill: false # 对该代理完全禁用技能功能,available_skills 列表不会出现在上下文中\n\n---\n\n \n\nYou are a quick answer assistant. Just answer questions directly.\n\n\n \n\n### 2、在 opencode.json 中为内置代理禁用\n\n \n\n## 实例\n\n{\n\n "$schema": "https://opencode.ai/config.json",\n\n "agent": {\n\n "plan": {\n\n "tools": {\n\n "skill": false // plan 代理不使用任何技能\n\n }\n\n }\n\n }\n\n}\n\n\n \n\n---\n\n\n## 排查技能加载问题\n\n \n如果某个技能没有出现在可用列表中,请按以下顺序逐项检查:\n\n\n \n\n\n\n- \n **确认文件名大小写**\n\n\n \`SKILL.md\` 的文件名必须全部大写,写成 \`skill.md\` 或 \`Skill.md\` 都不会被识别。\n\n\n \n\n- \n **检查 Frontmatter 完整性**\n\n\n 确保 \`SKILL.md\` 开头有正确的 YAML frontmatter,且包含 \`name\` 和 \`description\` 两个必填字段。缺少任意一个,技能都不会被加载。\n\n\n \n\n- \n **确认技能名称唯一且格式正确**\n\n\n 如果不同路径下存在同名技能,可能产生冲突。同时检查 \`name\` 字段是否符合命名规则(仅小写字母和数字,以连字符分隔),且与文件夹名称完全一致。\n\n\n \n\n- \n **检查权限配置**\n\n\n 在 \`opencode.json\` 的 \`permission.skill\` 中,权限为 \`"deny"\` 的技能会对代理完全隐藏,不会出现在 \`\` 列表中。检查是否有通配符规则(如 \`"*": "deny"\`)意外匹配到了该技能。\n\n\n \n\n \n \n \n \n \n\n \n \n [ OpenCode 自定义工具](http://www.runoob.com/opencode/opencode-custom-tools.html)\n \n\n \n \n \n \n \n\n\n\n\n \n \n \n### 点我分享笔记\n\n \n \n \n \n \n \n [取消](https://www.runoob.comjavascript:;)\n\n\n \n \n \n \n \n \n\n\n 分享笔记\n \n \n \n \n \n \n\n 昵称昵称 (必填)\n 邮箱邮箱 (必填)\n 引用地址引用地址\n \n\n \n \n \n \n\n \n \n\n\n\n\n\n\n\n\n\n \n\n \n\n\n\n\n\n\n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n \n\n\n\n\n\n 在线实例\n\n\n ·[HTML 实例](https://www.runoob.com/html/html-examples.html)\n\n\n ·[CSS 实例](https://www.runoob.com/css/css-examples.html)\n\n\n ·[JavaScript 实例](https://www.runoob.com/js/js-examples.html)\n\n\n ·[Ajax 实例](https://www.runoob.com/ajx/ajax-examples.html)\n\n\n ·[jQuery 实例](https://www.runoob.com/jquery/jquery-examples.html)\n\n\n ·[XML 实例](https://www.runoob.com/xml/xml-examples.html)\n\n\n ·[Java 实例](https://www.runoob.com/java/java-examples.html)\n\n\n\n\n\n 字符集&工具\n\n\n · [HTML 字符集设置](https://www.runoob.com/charsets/html-charsets.html)\n\n\n · [HTML ASCII 字符集](https://www.runoob.com/tags/html-ascii.html)\n\n\n · [JS 混淆/加密](https://www.jyshare.com/front-end/6939/)\n\n\n · [PNG/JPEG 图片压缩](https://www.jyshare.com/front-end/6232/)\n\n\n · [HTML 拾色器](https://www.runoob.com/tags/html-colorpicker.html)\n\n\n · [JSON 格式化工具](https://www.jyshare.com/front-end/53)\n\n\n · [随机数生成器](https://www.jyshare.com/front-end/6680/)\n\n\n\n\n 最新更新\n\n\n ·\n [\n OpenCode 自定义... ](http://www.runoob.com/opencode/opencode-custom-tools.html)\n\n\n ·\n [\n OpenCode Skills ](http://www.runoob.com/opencode/opencode-skills.html)\n\n\n ·\n [\n OpenCode MCP 服... ](http://www.runoob.com/opencode/opencode-mcp.html)\n\n\n ·\n [\n OpenCode LSP 服... ](http://www.runoob.com/opencode/opencode-lsp.html)\n\n\n ·\n [\n OpenCode 权限配置 ](http://www.runoob.com/opencode/opencode-permissions.html)\n\n\n ·\n [\n OpenCode 格式化... ](http://www.runoob.com/opencode/opencode-formatter.html)\n\n\n ·\n [\n OpenCode 自定义... ](http://www.runoob.com/opencode/opencode-commands.html)\n\n\n\n\n 站点信息\n\n\n ·\n [意见反馈](https://www.runoob.commailto:admin@runoob.com)\n\n\n ·\n [免责声明](https://www.runoob.com/disclaimer)\n\n\n ·\n [关于我们](https://www.runoob.com/aboutus)\n\n\n ·\n [文章归档](https://www.runoob.com/archives)\n\n\n\n\n\n\n\n **关注微信**\n\n\n\n \n\n\n\n\n\n\n Copyright © 2013-2026 **[菜鸟教程](https://www.runoob.com//www.runoob.com/)** \n **[runoob.com](https://www.runoob.com//www.runoob.com/)** All Rights Reserved. 备案号:[闽ICP备15012807号-1](https://beian.miit.gov.cn/)\n\n\n\n [ ](https://www.runoob.comjavascript:void(0))\n [](https://www.runoob.comjavascript:void(0))\n [](https://www.runoob.comjavascript:void(0))\n\n\n\n#### 微信关注\n\n `;
document.getElementById('md-content').innerHTML = marked.parse(md);
</script>
</body>
</html>