返回顶部
g

github-issue-resolverGitHub问题解决器

Autonomous GitHub Issue Resolver Agent with guardrails. Use when the user wants to discover, analyze, and fix open issues in GitHub repositories. Triggers on requests like "fix GitHub issues", "resolve issues in repo", "work on GitHub bugs", or when the user provides a GitHub repository URL and asks for issue resolution. Supports the full workflow from issue discovery to PR submission with safety guardrails preventing scope creep, unauthorized access, and dangerous operations.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.0.0
安全检测
已通过
1,543
下载量
免费
免费
1
收藏
概述
安装方式
版本历史

github-issue-resolver

GitHub Issue 解决器

用于发现、分析和修复开放 GitHub Issue 的自主代理 — 配备5层防护栏系统。

⚠️ 防护栏 — 请先阅读

每个操作都经过防护栏检查。 在执行任何操作之前:

  1. 1. 加载 guardrails.json 配置
  2. 验证范围(仓库、分支、路径)
  3. 检查操作门控(自动/通知/审批)
  4. 根据允许列表验证命令
  5. 记录到审计追踪

有关防护栏的详细信息,请参阅 references/guardrails-guide.md

关键规则(不可协商)

  • - 绝不触碰受保护分支(main、master、production)
  • 绝不修改 .env、密钥、CI配置、凭证
  • 绝不强制推送
  • 未经明确批准绝不修改依赖文件
  • 绝不修改自身技能/插件文件
  • 一次只处理一个 Issue — 完成或放弃后才能开始新任务
  • 所有危险操作均需用户批准(编写代码、提交、推送、PR)
  • 所有操作均记录到 audit/ 目录

工作流程

阶段 1 — Issue 发现

触发条件: 用户提供 GitHub 仓库(owner/repo)。

步骤:

  1. 1. 根据防护栏验证仓库:
bash python3 scripts/guardrails.py repo

如果被阻止,告知用户并停止。

  1. 2. 使用推荐引擎获取、评分并展示 Issue:
bash python3 scripts/recommend.py

此脚本自动获取开放 Issue,过滤掉 PR,根据严重性/影响/工作量/新鲜度进行评分,并以格式化推荐形式展示。

始终使用 recommend.py — 绝不要手动格式化 Issue 输出。该脚本确保每次展示的一致性。

如需原始 JSON(例如用于进一步处理):
bash
python3 scripts/recommend.py --json

⏹️ 停止。等待用户选择 Issue。



阶段 2 — 修复

触发条件: 用户选择 Issue。

步骤:

  1. 1. 锁定 Issue(一次只处理一个的强制措施):
bash python3 scripts/guardrails.py issuelock number>
  1. 2. 阅读完整 Issue 线程,包括评论。
  1. 3. 克隆仓库(门控:notify):
bash python3 scripts/sandbox.py run git clone https://github.com//.git /tmp/openclaw-work/
  1. 4. 创建安全分支(门控:auto):
bash python3 scripts/sandbox.py run git checkout -b fix-issue-
  1. 5. 探索代码库 — 读取相关文件。对于每个文件:
bash python3 scripts/guardrails.py path
  1. 6. 制定修复方案 — 向用户解释方法:

## 建议修复方案
- 问题:[根本原因]
- 解决方案:[变更内容]
- 文件:[文件列表及各文件变更内容]
- 预估差异大小:[行数]

⏹️ 停止。等待用户批准方案后再实施。

  1. 7. 实施修复(门控:approve):
- 应用变更 - 检查差异大小:python3 scripts/guardrails.py diff - 记录:python3 scripts/audit.py logaction writecode success

阶段 3 — 测试

实施后:

  1. 1. 查找并运行测试(门控:notify):
bash python3 scripts/sandbox.py run npm test # 或 pytest、cargo test 等
  1. 2. 如果测试失败且 autoRollbackOnTestFail 为 true:
- 回滚所有变更 - 通知用户 - 建议替代方案
  1. 3. 如果没有测试存在,编写覆盖修复内容的基本测试。
  1. 4. 向用户报告结果。

阶段 4 — 草稿 PR 供审查(需要审批)

⚠️ 绝不自动创建 PR。始终先询问。

不要在聊天中倾倒完整差异。 对于任何非平凡项目,推送分支并让用户在 GitHub 上审查,那里有语法高亮、逐文件导航和内联评论。

  1. 1. 提交变更(门控:approve):
bash python3 scripts/sandbox.py run git add . python3 scripts/sandbox.py run git commit -m Fix #: <ol><li>2. <strong>展示变更摘要</strong>(而非原始差异)— 保持简洁:</li></ol> <p>## 变更内容<br> - <strong>src/models.py</strong> — 添加字段验证(标题长度、枚举检查)<br> - <strong>app.py</strong> — 为 POST 端点添加验证、400 错误响应<br> - <strong>tests/test_app.py</strong> — 22 个覆盖验证规则的新测试<br> - 4 个文件变更,约 100 行源代码 + 约 150 行测试代码<br> - 所有测试通过 ✅</p> <ol><li>3. <strong>明确询问:</strong> 准备好推送并创建草稿 PR 了吗?</li></ol> <ol><li>4. <strong>仅在用户说是之后</strong>(门控:approve):</li></ol> bash python3 scripts/sandbox.py run git push -u origin fix-issue-<number> python3 scripts/sandbox.py run gh pr create --draft --title ... --body ... <p>注意:PR 默认始终创建为<strong>草稿</strong>。<br> PR 正文应包含所有变更的详细描述、测试结果以及 Issue 链接(Closes #N)。</p> <ol><li>5. <strong>分享 PR 链接</strong> — 用户在 GitHub 上审查。</li></ol> <ol><li>6. <strong>解锁 Issue:</strong></li></ol> bash python3 scripts/guardrails.py issue_unlock <hr> <h2>脚本参考</h2> <table><thead><tr><th>脚本</th><th>用途</th><th>无需阅读即可运行</th></tr></thead><tbody><tr><td>scripts/recommend.py</td><td><strong>主要入口点</strong> — 获取、评分并展示 Issue</td><td>✅</td></tr><tr><td>scripts/fetch_issues.py</td></tr></tbody></table> 原始 Issue 获取器(由 recommend.py 内部使用) | ✅ | | scripts/analyze_issue.py | 单个 Issue 的深度分析 | ✅ | | scripts/create_pr.py | PR 创建封装器 | ✅ | | scripts/guardrails.py | 防护栏执行引擎 | ✅ | | scripts/sandbox.py | 安全命令执行封装器 | ✅ | | scripts/audit.py | 操作记录器 | ✅ | <h2>参考资料</h2> <ul><li>- <a href="references/quick-reference.md" target="<em>blank" rel="noopener">references/quick-reference.md</a> — GitHub API 参考、评分标准、测试命令</li><li><a href="references/guardrails-guide.md" target="</em>blank" rel="noopener">references/guardrails-guide.md</a> — 完整防护栏文档和自定义配置</li></ul></div> </div> <div class="tags"> <h4>标签</h4> <span class="tag">skill</span> <span class="tag">ai</span> </div> </div> </div> <div class="tab-content" id="tab-install"> <div class="install-panel"> <h3>通过对话安装</h3> <p>该技能支持在以下平台通过对话安装:</p> <div class="platform-list"> <span class="platform-tag">OpenClaw</span> <span class="platform-tag">WorkBuddy</span> <span class="platform-tag">QClaw</span> <span class="platform-tag">Kimi</span> <span class="platform-tag">Claude</span> </div> <div class="install-method"> <h4>方式一:安装 SkillHub 和技能</h4> <div class="code-block"> <button class="copy-btn" onclick="copyToClipboard('帮我安装 SkillHub 和 github-issue-resolver-1776288738 技能', this)">复制</button> <code>帮我安装 SkillHub 和 github-issue-resolver-1776288738 技能</code> </div> </div> <div class="install-method"> <h4>方式二:设置 SkillHub 为优先技能安装源</h4> <div class="code-block"> <button class="copy-btn" onclick="copyToClipboard('设置 SkillHub 为我的优先技能安装源,然后帮我安装 github-issue-resolver-1776288738 技能', this)">复制</button> <code>设置 SkillHub 为我的优先技能安装源,然后帮我安装 github-issue-resolver-1776288738 技能</code> </div> </div> <h3 style="margin-top: 30px;">通过命令行安装</h3> <div class="install-method"> <div class="code-block"> <button class="copy-btn" onclick="copyToClipboard('skillhub install github-issue-resolver-1776288738', this)">复制</button> <code>skillhub install github-issue-resolver-1776288738</code> </div> </div> <h3 style="margin-top: 30px;">下载</h3> <a href="plugin.php?id=hl_skillhub&mod=download&version_id=18086&token=f13d6e8501c0529d26ebe8abaa464ab1" class="download-btn"> ⬇ 下载 github-issue-resolver v1.0.0(免费) </a> <p class="download-info"> 文件大小: 29.71 KB | 发布时间: 2026-4-16 18:15 </p> </div> </div> <div class="tab-content" id="tab-versions"> <div class="version-list"> <div class="version-item"> <div class="version-header"> <span class="version-number">v1.0.0</span> <span class="latest-tag">最新</span> <span class="version-date">2026-4-16 18:15</span> </div> <div class="changelog"> - Initial release of the GitHub Issue Resolver agent.<br /> - Automates the GitHub issue resolution workflow: discover, analyze, plan, fix, test, and submit PRs.<br /> - Implements a 5-layer guardrail system to prevent scope creep, unauthorized access, and dangerous operations.<br /> - Strictly enforces one-issue-at-a-time, approval gates for all critical actions, comprehensive logging, and never touches protected branches or sensitive files.<br /> - Includes utility scripts for safe execution, auditing, and guardrail checks, with detailed workflow documentation. </div> </div> </div> </div> <!-- 推荐技能 --> <div class="related-skills"> <h3>相关推荐</h3> <div class="skill-list-related"> <div class="skillhub-card-related"> <a href="plugin.php?id=hl_skillhub&mod=detail&slug=self-improving-agent-1776396682"> <div class="skill-icon"> <div class="default-icon">s</div> </div> <h3 class="skill-name">self-improvement</h3> <p class="skill-desc">Captures learnings, errors, and corrections to enable continuous improvement. Use when: (1) A command or operation fails unexpectedly, (2) User corrects Claude ('No, that's wrong...', 'Actually...'), (3) User requests a capability that doesn't exist, (4) An external API or tool fails, (5) Claude realizes its knowledge is outdated or incorrect, (6) A better approach is discovered for a recurring task. Also review learnings before major tasks.</p> <div class="skill-meta"> <div class="stats"> <span>⭐ 3209</span> <span>⬇ 392961</span> </div> <span class="skill-source">AI智能</span> </div> </a> </div> <div class="skillhub-card-related"> <a href="plugin.php?id=hl_skillhub&mod=detail&slug=self-improving-agent-1776382578"> <div class="skill-icon"> <div class="default-icon">s</div> </div> <h3 class="skill-name">self-improvement</h3> <p class="skill-desc">Captures learnings, errors, and corrections to enable continuous improvement. Use when: (1) A command or operation fails unexpectedly, (2) User corrects Claude ('No, that's wrong...', 'Actually...'), (3) User requests a capability that doesn't exist, (4) An external API or tool fails, (5) Claude realizes its knowledge is outdated or incorrect, (6) A better approach is discovered for a recurring task. Also review learnings before major tasks.</p> <div class="skill-meta"> <div class="stats"> <span>⭐ 3209</span> <span>⬇ 392960</span> </div> <span class="skill-source">AI智能</span> </div> </a> </div> <div class="skillhub-card-related"> <a href="plugin.php?id=hl_skillhub&mod=detail&slug=self-improving-agent-1776282374"> <div class="skill-icon"> <div class="default-icon">s</div> </div> <h3 class="skill-name">self-improvement</h3> <p class="skill-desc">Captures learnings, errors, and corrections to enable continuous improvement. Use when: (1) A command or operation fails unexpectedly, (2) User corrects Claude ('No, that's wrong...', 'Actually...'), (3) User requests a capability that doesn't exist, (4) An external API or tool fails, (5) Claude realizes its knowledge is outdated or incorrect, (6) A better approach is discovered for a recurring task. Also review learnings before major tasks.</p> <div class="skill-meta"> <div class="stats"> <span>⭐ 3195</span> <span>⬇ 389592</span> </div> <span class="skill-source">AI智能</span> </div> </a> </div> <div class="skillhub-card-related"> <a href="plugin.php?id=hl_skillhub&mod=detail&slug=self-improving-agent-1776190579"> <div class="skill-icon"> <div class="default-icon">s</div> </div> <h3 class="skill-name">self-improvement</h3> <p class="skill-desc">Captures learnings, errors, and corrections to enable continuous improvement. Use when: (1) A command or operation fails unexpectedly, (2) User corrects Claude ('No, that's wrong...', 'Actually...'), (3) User requests a capability that doesn't exist, (4) An external API or tool fails, (5) Claude realizes its knowledge is outdated or incorrect, (6) A better approach is discovered for a recurring task. Also review learnings before major tasks.</p> <div class="skill-meta"> <div class="stats"> <span>⭐ 3177</span> <span>⬇ 386647</span> </div> <span class="skill-source">AI智能</span> </div> </a> </div> </div> </div> </div> </div> <style> .skill-detail { padding: 20px 0; min-height: 100vh; } .breadcrumb { margin-bottom: 20px; color: #666; } .breadcrumb a { color: #155BD5; } .breadcrumb span { margin: 0 5px; } .skill-detail-header { display: flex; gap: 24px; padding: 30px; background: #fff; border-radius: 12px; margin-bottom: 20px; border: 1px solid #e8e8e8; } .skill-icon-large { width: 120px; height: 120px; flex-shrink: 0; } .skill-icon-large img { width: 100%; height: 100%; border-radius: 20px; object-fit: cover; } .skill-icon-large .default-icon-large { width: 100%; height: 100%; border-radius: 20px; background: #155BD5; color: #fff; display: flex; align-items: center; justify-content: center; font-size: 48px; font-weight: bold; } .skill-info { flex: 1; } .skill-header-action { flex-shrink: 0; display: flex; align-items: center; padding-left: 20px; } .header-download-btn { display: inline-flex; align-items: center; gap: 8px; padding: 12px 24px; background: #155BD5; color: #fff; border-radius: 8px; text-decoration: none; font-size: 14px; font-weight: 500; transition: all 0.2s ease; white-space: nowrap; } .header-download-btn:hover { background: #0d4bb5; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(21, 91, 213, 0.3); } .header-download-btn.buy { background: #f97316; } .header-download-btn.buy:hover { background: #ea580c; box-shadow: 0 4px 12px rgba(249, 115, 22, 0.3); } .skill-info h1 { font-size: 36px; font-weight: 700; color: #1e293b; margin-bottom: 10px; display: flex; align-items: center; flex-wrap: wrap; gap: 12px; } .skill-info h1 .name-cn { font-size: 20px; color: #666; font-weight: 500; background: #f1f5f9; padding: 4px 14px; border-radius: 20px; white-space: nowrap; } .skill-info .skill-desc { font-size: 16px; color: #666; margin-bottom: 8px; } .skill-info .skill-scenarios { font-size: 14px; color: #999; margin-bottom: 10px; } .skill-info .skill-author { font-size: 13px; color: #999; } /* 统计面板 */ .stats-panel { display: flex; align-items: center; background: #fff; border-radius: 12px; padding: 24px 0; margin-bottom: 24px; border: 1px solid #e8e8e8; box-shadow: 0 1px 3px rgba(0,0,0,0.05); } .stats-panel .stats-item { flex: 1; text-align: center; padding: 0 16px; } .stats-panel .stats-divider { width: 1px; height: 48px; background: linear-gradient(180deg, transparent, #e8e8e8, transparent); } .stats-panel .stats-icon { width: 40px; height: 40px; margin: 0 auto 8px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 18px; background: #f1f5f9; color: #64748b; } .stats-panel .stats-icon.source-icon { background: #e0e7ff; color: #6366f1; } .stats-panel .stats-icon.version-icon { background: #fef3c7; color: #d97706; } .stats-panel .stats-icon.security-icon { background: #fee2e2; color: #9ca3af; } .stats-panel .stats-icon.security-icon.verified { background: #d1fae5; color: #10b981; } .stats-panel .stats-value { font-size: 15px; font-weight: 600; color: #374151; margin-bottom: 4px; } .stats-panel .stats-number { font-size: 24px; font-weight: 700; color: #111827; margin-bottom: 4px; line-height: 1.2; } .stats-panel .stats-label { font-size: 13px; color: #9ca3af; } .stats-panel .stats-item.highlight .stats-label { color: #6b7280; } .skill-tabs { display: flex; gap: 40px; border-bottom: 1px solid #e8e8e8; margin-bottom: 20px; } .skill-tabs .tab-item { padding: 15px 0; color: #666; cursor: pointer; border-bottom: 2px solid transparent; font-size: 16px; } .skill-tabs .tab-item.active { color: #155BD5; border-bottom-color: #155BD5; } .tab-content { background: #fff; border-radius: 12px; padding: 30px; margin-bottom: 20px; border: 1px solid #e8e8e8; opacity: 0; transform: translateY(10px); transition: all 0.3s ease; display: none; } .tab-content.active { opacity: 1; transform: translateY(0); display: block; } .lang-switcher { display: flex; gap: 8px; margin-bottom: 16px; justify-content: flex-end; } .lang-switcher .lang-btn { padding: 4px 16px; border: 1px solid #d1d5db; background: #fff; border-radius: 20px; font-size: 13px; color: #6b7280; cursor: pointer; transition: all 0.2s; } .lang-switcher .lang-btn:hover { border-color: #155BD5; color: #155BD5; } .lang-switcher .lang-btn.active { background: #155BD5; color: #fff; border-color: #155BD5; } .overview-content h3 { margin-bottom: 15px; } /* Markdown 预览样式 */ .markdown-body { line-height: 1.8; color: #333; margin-bottom: 20px; } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { margin-top: 24px; margin-bottom: 16px; font-weight: 600; line-height: 1.25; color: #1e293b; } .markdown-body h1 { font-size: 2em; border-bottom: 1px solid #e8e8e8; padding-bottom: 8px; } .markdown-body h2 { font-size: 1.5em; border-bottom: 1px solid #e8e8e8; padding-bottom: 8px; } .markdown-body h3 { font-size: 1.25em; } .markdown-body p { margin-bottom: 16px; } .markdown-body ul, .markdown-body ol { padding-left: 2em; margin-bottom: 16px; } .markdown-body li { margin-bottom: 4px; } .markdown-body code { padding: 2px 6px; background: #f1f5f9; border-radius: 4px; font-family: 'Consolas', monospace; font-size: 0.9em; color: #155BD5; } .markdown-body pre { padding: 16px; background: #1e1e1e; border-radius: 8px; overflow-x: auto; margin-bottom: 16px; } .markdown-body pre code { background: transparent; color: #d4d4d4; padding: 0; } .markdown-body blockquote { padding: 0 1em; border-left: 4px solid #155BD5; color: #666; margin-bottom: 16px; } .markdown-body table { width: 100%; border-collapse: collapse; margin-bottom: 16px; } .markdown-body th, .markdown-body td { padding: 8px 12px; border: 1px solid #e8e8e8; } .markdown-body th { background: #f8f9fa; font-weight: 600; } .markdown-body a { color: #155BD5; text-decoration: none; } .markdown-body a:hover { text-decoration: underline; } .markdown-body img { max-width: 100%; border-radius: 8px; } .overview-content .tags { margin-top: 20px; } .overview-content .tags h4 { margin-bottom: 10px; } .overview-content .tag { display: inline-block; padding: 4px 12px; background: #f0f0f0; border-radius: 4px; margin-right: 8px; margin-bottom: 8px; font-size: 13px; } .install-panel h3 { margin-bottom: 15px; } .platform-list { margin-bottom: 20px; } .platform-tag { display: inline-block; padding: 4px 12px; background: #e3f2fd; color: #1976d2; border-radius: 4px; margin-right: 8px; font-size: 13px; } .install-method { margin-bottom: 25px; } .install-method h4 { margin-bottom: 10px; font-size: 14px; color: #666; } .code-block { position: relative; background: #1e1e1e; border-radius: 8px; padding: 16px 60px 16px 16px; } .code-block code { color: #d4d4d4; font-family: 'Consolas', monospace; font-size: 14px; } .copy-btn { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); padding: 4px 12px; background: #333; border: none; border-radius: 4px; color: #fff; cursor: pointer; font-size: 12px; } .copy-btn:hover { background: #444; } .copy-btn.copied { background: #10b981 !important; animation: copyPulse 0.3s ease; } @keyframes copyPulse { 0%, 100% { transform: translateY(-50%) scale(1); } 50% { transform: translateY(-50%) scale(1.1); } } .download-btn { display: inline-block; padding: 12px 24px; background: #155BD5; color: #fff; border-radius: 8px; text-decoration: none; font-size: 14px; } .download-btn:hover { background: #0d4bb5; } .download-info { margin-top: 10px; font-size: 13px; color: #999; } .version-list .version-item { padding: 20px 0; border-bottom: 1px solid #e8e8e8; } .version-list .version-item:last-child { border-bottom: none; } .version-header { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; } .version-header .version-number { font-size: 18px; font-weight: 600; } .version-header .latest-tag { padding: 2px 8px; background: #e8f5e9; color: #4caf50; border-radius: 4px; font-size: 12px; } .version-header .version-date { margin-left: auto; color: #999; font-size: 13px; } .changelog { color: #666; line-height: 1.6; } /* 相关推荐 */ .related-skills { margin-top: 40px; padding: 24px; background: #fff; border-radius: 12px; border: 1px solid #e8e8e8; } .related-skills h3 { margin-bottom: 20px; font-size: 18px; font-weight: 600; color: #1e293b; display: flex; align-items: center; gap: 8px; } .related-skills h3:before { content: ''; width: 4px; height: 20px; background: #155BD5; border-radius: 2px; } .skill-list-related { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 20px; } .skillhub-card-related { border-radius: 16px; padding: 20px; transition: all 0.3s ease; background: rgba(255, 255, 255, 0.95); backdrop-filter: blur(10px); border: 1px solid rgba(0, 0, 0, 0.08); box-shadow: 0 1px 3px rgba(0,0,0,0.05), 0 4px 12px rgba(0,0,0,0.03); } .skillhub-card-related:hover { box-shadow: 0 8px 24px rgba(21, 91, 213, 0.15); transform: translateY(-4px); } .skillhub-card-related:active { transform: scale(0.98); } .skillhub-card-related a { color: inherit; text-decoration: none; } .skillhub-card-related .skill-icon { width: 56px; height: 56px; margin-bottom: 12px; } .skillhub-card-related .skill-icon .default-icon { width: 100%; height: 100%; border-radius: 12px; background: #155BD5; color: #fff; display: flex; align-items: center; justify-content: center; font-size: 24px; font-weight: bold; } .skillhub-card-related .skill-name { font-size: 16px; font-weight: 600; margin-bottom: 8px; color: #333; } .skillhub-card-related .skill-desc { font-size: 13px; color: #666; line-height: 1.5; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; margin-bottom: 12px; min-height: 39px; } .skillhub-card-related .skill-meta { display: flex; justify-content: space-between; align-items: center; font-size: 12px; color: #999; } .skillhub-card-related .skill-meta .stats { display: flex; gap: 12px; } .skillhub-card-related .skill-source { background: #f0f0f0; padding: 2px 10px; border-radius: 12px; font-size: 12px; } @media screen and (max-width: 768px) { .skill-detail-header { flex-direction: column; text-align: center; padding: 24px 20px; } .skill-icon-large { width: 80px; height: 80px; } .skill-icon-large .default-icon-large { font-size: 32px; } .skill-info h1 { font-size: 24px; } .skill-info h1 .name-cn { font-size: 14px; padding: 2px 10px; margin-left: 0; margin-top: 6px; } .skill-header-action { padding-left: 0; padding-top: 16px; width: 100%; justify-content: center; } .header-download-btn { width: 100%; justify-content: center; max-width: 280px; } .stats-panel { flex-wrap: wrap; padding: 16px 0; } .stats-panel .stats-item { flex: 1 1 30%; min-width: 80px; padding: 12px 8px; } .stats-panel .stats-divider { width: 1px; height: 36px; } .stats-panel .stats-icon { width: 32px; height: 32px; font-size: 14px; } .stats-panel .stats-number { font-size: 18px; } .stats-panel .stats-value { font-size: 13px; } .stats-panel .stats-label { font-size: 11px; } .skill-tabs { overflow-x: auto; gap: 24px; -webkit-overflow-scrolling: touch; } .skill-tabs .tab-item { white-space: nowrap; } .code-block { padding: 16px 50px 16px 16px; } .code-block code { font-size: 12px; word-break: break-all; } } /* Paid skill notice */ .paid-notice { text-align: center; padding: 40px 24px; background: linear-gradient(135deg, #fff7ed, #ffedd5); border-radius: 12px; border: 1px solid #fed7aa; } .paid-notice-icon { width: 56px; height: 56px; margin: 0 auto 16px; background: #fff; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 28px; color: #f97316; box-shadow: 0 2px 8px rgba(249,115,22,0.15); } .paid-notice h3 { font-size: 20px; color: #9a3412; margin-bottom: 8px; } .paid-notice p { font-size: 14px; color: #c2410c; margin: 4px 0; } .paid-buy-box { padding: 20px; background: #fff7ed; border-radius: 8px; border: 1px solid #fed7aa; margin-bottom: 12px; } .paid-buy-box p { color: #7c2d12; font-size: 15px; margin: 0; }</style> <script> // 复制功能 function copyToClipboard(text, btn) { if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(text).then(function() { showCopied(btn); }).catch(function() { fallbackCopy(text, btn); }); } else { fallbackCopy(text, btn); } } function fallbackCopy(text, btn) { var textarea = document.createElement('textarea'); textarea.value = text; textarea.style.position = 'fixed'; textarea.style.opacity = '0'; document.body.appendChild(textarea); textarea.select(); try { document.execCommand('copy'); showCopied(btn); } catch (err) { btn.textContent = '失败'; } document.body.removeChild(textarea); } function showCopied(btn) { var originalText = btn.textContent; btn.textContent = '已复制!'; btn.classList.add('copied'); setTimeout(function() { btn.textContent = originalText; btn.classList.remove('copied'); }, 2000); } // Tab 切换 document.addEventListener('DOMContentLoaded', function() { var tabItems = document.querySelectorAll('.skill-tabs .tab-item'); var tabContents = document.querySelectorAll('.tab-content'); tabItems.forEach(function(item) { item.addEventListener('click', function() { var target = this.getAttribute('data-tab'); var targetContent = document.getElementById('tab-' + target); // 移除所有 active tabItems.forEach(function(t) { t.classList.remove('active'); }); tabContents.forEach(function(c) { c.classList.remove('active'); }); // 添加 active this.classList.add('active'); // 延迟添加动画类,确保过渡效果 setTimeout(function() { targetContent.classList.add('active'); }, 50); window.location.hash = target; }); }); var hash = window.location.hash.replace('#', ''); if (hash) { var targetTab = document.querySelector('.skill-tabs .tab-item[data-tab="' + hash + '"]'); if (targetTab) { targetTab.click(); } } // 中英文描述切换 var langSwitcher = document.getElementById('langSwitcher'); if (langSwitcher) { var descEn = document.querySelector('#markdownContent .desc-en'); var descCn = document.querySelector('#markdownContent .desc-cn'); var toggleBtn = document.getElementById('langToggleBtn'); var currentLang = 'cn'; toggleBtn.addEventListener('click', function() { if (currentLang === 'en') { currentLang = 'cn'; toggleBtn.textContent = 'English'; if (descEn) descEn.style.display = 'none'; if (descCn) descCn.style.display = 'block'; } else { currentLang = 'en'; toggleBtn.textContent = '中文'; if (descCn) descCn.style.display = 'none'; if (descEn) descEn.style.display = 'block'; } }); } }); </script></div> <script src="source/plugin/hl_skillhub/static/js/main.js"></script><div style="height:299px; overflow:hidden" class="cl"> <div class="hl_footer cl"> <div class="hl_fttop cl"> <div class="w1180 cl"> <div class="hl_ftl" style=" position: relative;"> <ul> <li> <div class="hl_h5">闲社论坛</div> <a href="plugin.php?id=hl_techmarket&mod=list" target="_blank">定制服务</a> <a href="plugin.php?id=keke_video_base&ac=list" target="_blank">闲社视频</a> <a href="portal.php?mod=topic&topicid=1">会员介绍</a> <a href="plugin.php?id=keke_group" target="_blank">开通会员</a> </li> <li> <div class="hl_h5">闲社论坛</div> <a href="forum.php" target="_blank">智能体论坛</a> <a href="plugin.php?id=hl_skillhub&mod=bundle&ac=list" target="_blank">技能自动化</a> <a href="plugin.php?id=hl_techmarket">AI服务市场</a> <a href="forum-9-1.html" target="_blank">大模型社区</a> </li> <li> <div class="hl_h5">网站服务</div> <a href="https://wpa.qq.com/msgrd?v=3&uin=515151560&site=qq&menu=yes" target="_blank" rel="nofollow">会员咨询:515151560</a> <a href="https://wpa.qq.com/msgrd?v=3&uin=515151570&site=qq&menu=yes" target="_blank" rel="nofollow">广告合作:515151570</a> <a href="https://wpa.qq.com/msgrd?v=3&uin=515151580&site=qq&menu=yes" target="_blank" rel="nofollow">投诉建议:515151580</a> <a href="https://wpa.qq.com/msgrd?v=3&uin=515151590&site=qq&menu=yes" target="_blank" rel="nofollow">售后指导:515151590</a> </li> <div class="clear"></div> </ul> <p style="font-size: 16px;color: #fff;width: 370px;text-align: center;margin-top: 5px;position: absolute; left:0px; bottom:0px"> 多链集团旗下-闲社网</p> </div> <div class="hl_ftm"> <div class="hl_h5">闲社网热线 </div> <div class="hl_h2">免费联系电话 </div> <div class="hl_fttel"> 0527-80111111 </div> <h6 class="cl mtm hl_time"><a href="http://wpa.b.qq.com/cgi/wpa.php?ln=1&key=XzkzODA1MTM1NF80NjQ5NDZfNDAwMDgwOTkxMV8yXw" target="_blank" rel="nofollow"><img src="template/xianshe/neoconex/qqline.png"></a>            <a href="http://wpa.b.qq.com/cgi/wpa.php?ln=1&key=XzkzODA1MTM1NF80NjQ5NDZfNDAwMDgwOTkxMV8yXw" target="_blank" rel="nofollow"><img alt="qqline" title="qqline" src="template/xianshe/neoconex/qqline.png"></a></h6> <p class="hl_time">服务时间:周一到周日 8:00-24:00</p> </div> <div class="hl_ftl"> <ul> <li> <div class="hl_h5">公众号</div> <span style="font-size:18px;color: #fff;display: block;">闲社</span> <span style="font-size:18px;color: #fff;">APP下载 闲社</span> </li> <div class="clear"></div> </ul> </div> <div class="hl_ftr"> <div class="hl_h5">关注闲社网</div> <div class="hl_guznzhuxx"> <ul> <li> <img alt="wxkf" title="wxkf" src="template/xianshe/neoconex/wxkf.jpg"> <p>闲社在线客服</p> </li> <li> <img alt="wx" title="wx" src="template/xianshe/neoconex/wx.jpg"> <p>关注闲社网微信</p> </li> <li style=" margin-right: 0;"> <img alt="app" title="app" src="template/xianshe/neoconex/app.png"> <p>闲社网APP</p> </li> <div class="clear"></div> </ul> </div> </div> <div class="clear"></div> </div> </div> </div> <div class="hl_ftbottom"> <div class="w1180 cl"> <div class="hl_ftblt"> <p> <a href="archiver/" rel="nofollow">Archiver</a><span>·</span><a href="forum.php?mobile=yes" rel="nofollow">手机版</a><span>·</span><span>闲社网·闲社论坛·智能体自动化市场· 多链控股集团有限公司</span> <span>·</span> <a href="http://beian.miit.gov.cn/" target="_blank" rel="nofollow">苏ICP备2025199260号-1</a></p> <p> Powered by <a href="http://www.discuz.net" target="_blank" rel="nofollow">Discuz!</a> <em>X5.0</em>   © 2024-2026 <a href="https://www.xianshe.com/" target="_blank">闲社网·AI智能体论坛·AI自动化解决方案·http://xianshe.com</a> </p> </div> <div class="hl_ftrgh"> <a id="_pingansec_bottomimagelarge_p2p" rel="nofollow" href="https://kashen.com/d/?z6"><img alt="p2p_official_large" title="p2p_official_large" src="template/xianshe/neoconex/p2p_official_large.jpg" /></a> </div> <div class="clear"></div> </div> </div> </div> <div id="scrolltop"> <span hidefocus="true"><a title="返回顶部" onclick="window.scrollTo('0','0')" class="scrolltopa"><b>返回顶部</b></a></span> </div> <script type="text/javascript">_attachEvent(window, 'scroll', function () { showTopLink(); }); checkBlind();</script> </body> </html>