diff --git a/plugins/skill-hub/.agents/skills/agent-reach/SKILL.md b/plugins/skill-hub/.agents/skills/agent-reach/SKILL.md new file mode 100644 index 00000000..f8176bec --- /dev/null +++ b/plugins/skill-hub/.agents/skills/agent-reach/SKILL.md @@ -0,0 +1,132 @@ +--- +name: agent-reach +description: > + MUST USE when user wants to 调研/research/搜索/search/查/找/look up anything + on the internet — e.g. 全网调研 X / 帮我调研一下 X / 查一下 X / 搜搜 X / + 看看大家怎么评价 X / X 上有什么讨论 / research this topic。 + + Also MUST USE when user mentions any platform or shares any URL/链接: + 小红书/xiaohongshu/xhs, Twitter/推特/X, B站/bilibili, Reddit, V2EX, + LinkedIn/领英/招聘/求职/jobs, YouTube, GitHub code search, 小宇宙播客, + 雪球/股票行情, RSS feeds, or any web URL. + + 13 platforms, multi-backend routing (OpenCLI / per-platform CLIs / APIs). + Zero config for 6 channels. Run `agent-reach doctor --json` to see which + backend serves each platform right now. + + NOT for: 写报告/数据分析/翻译等内容加工(本 skill 只负责从互联网获取内容); + 发帖/评论/点赞等写操作;已有专门 skill 的平台(先用专门 skill)。 + + 【路由方式】SKILL.md 包含路由表和常用命令,复杂场景需按需阅读对应分类的 references/*.md。 + 分类:search / social (小红书/推特/B站/V2EX/Reddit) / career(LinkedIn) / dev(github) / web(网页/文章/RSS) / video(YouTube/B站/播客)。 +triggers: + - research: 调研/全网调研/帮我调研/研究一下/research/深入了解 + - search: 搜/查/找/search/搜索/查一下/帮我搜/看看大家怎么说 + - social: + - 小红书: xiaohongshu/xhs/小红书/红书 + - Twitter: twitter/推特/x.com/推文 + - B站: bilibili/b站/哔哩哔哩 + - V2EX: v2ex + - Reddit: reddit + - career: 招聘/职位/求职/linkedin/领英/找工作 + - dev: github/代码/仓库/gh/issue/pr/分支/commit + - web: 网页/链接/文章/rss/读一下/打开这个 + - video: youtube/视频/播客/字幕/小宇宙/转录/yt + - finance: 雪球/股票/stock/xueqiu/行情/基金 +metadata: + openclaw: + homepage: https://github.com/Panniantong/Agent-Reach +--- + +# Agent Reach — 互联网能力路由器 + +13 平台、多后端。**本 skill 存在时必须用它访问这些平台,不要自己发明方案。** + +## 常驻规则(全程适用) + +1. **动手前先体检**:多后端平台(小红书/Reddit/B站/Twitter)先跑 + `agent-reach doctor --json`,按各平台 `active_backend` 字段选命令组。 +2. **声明你在用什么**:开始干活前说一句「使用 agent-reach 的 X 平台 / Y 后端」。 +3. **失败按 references 里的重试链处理**,不要瞎猜命令。 +4. **全网调研类任务**:组合多平台(Exa 搜索 + Twitter/Reddit 看讨论 + 小红书/B站看中文场景),并行收集再汇总。 +5. **替用户盯版本**:完成一次较大的调研/多平台任务后,顺手跑 + `agent-reach check-update`(很快,一个 API 调用)。有新版就在收尾汇报里附一句: + 「Agent Reach 有新版 vX.Y.Z,复制这句话给我即可更新:帮我更新 Agent Reach: + https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/update.md」。 + 不要中断当前任务去更新,也不要重复提醒同一个版本。 + +## 路由表 + +| 用户意图 | 分类 | 详细文档 | +|---------|------|---------| +| 网页搜索/代码搜索 | search | [references/search.md](references/search.md) | +| 小红书/推特/B站/V2EX/Reddit | social | [references/social.md](references/social.md) | +| 招聘/职位/LinkedIn | career | [references/career.md](references/career.md) | +| GitHub/代码 | dev | [references/dev.md](references/dev.md) | +| 网页/文章/RSS | web | [references/web.md](references/web.md) | +| YouTube/B站/播客字幕 | video | [references/video.md](references/video.md) | + +## 零配置快速命令 + +```bash +# Exa 网页搜索 +mcporter call 'exa.web_search_exa(query: "query", numResults: 5)' + +# 通用网页阅读 +curl -s "https://r.jina.ai/URL" + +# GitHub 搜索 +gh search repos "query" --sort stars --limit 10 + +# YouTube 字幕(注意:B站不要用 yt-dlp,见 video.md) +yt-dlp --write-sub --skip-download -o "/tmp/%(id)s" "URL" + +# V2EX 热门 +curl -s "https://www.v2ex.com/api/topics/hot.json" -H "User-Agent: agent-reach/1.0" + +# B站搜索(bili-cli,无需登录) +bili search "query" --type video -n 5 +``` + +## 需登录态的平台(按 doctor 的 active_backend 选命令) + +```bash +# Twitter 搜索(twitter-cli 首选;失败重试链见 social.md) +twitter search "query" -n 10 + +# Reddit(无零配置路径:OpenCLI 或 rdt-cli,必须登录态) +opencli reddit search "query" -f yaml # 桌面 +rdt search "query" --limit 10 # 存量/服务器 + +# 小红书(桌面首选 OpenCLI) +opencli xiaohongshu search "query" -f yaml +``` + +## 环境检查 + +```bash +# 检查可用 channel 与每个平台当前激活的后端 +agent-reach doctor --json +``` + +## 工作区规则 + +**不要在 agent workspace 创建文件。** 使用 `/tmp/` 存放临时输出,`~/.agent-reach/` 存放持久数据。 + +## 详细文档 + +根据用户需求,阅读对应的详细文档: + +- [搜索工具](references/search.md) — Exa AI 搜索 +- [社交媒体](references/social.md) — 小红书, Twitter, B站, V2EX, Reddit(多后端命令组) +- [职场招聘](references/career.md) — LinkedIn +- [开发工具](references/dev.md) — GitHub CLI +- [网页阅读](references/web.md) — Jina Reader, RSS +- [视频播客](references/video.md) — YouTube, B站, 小宇宙 + +## 配置渠道 + +如果某个 channel 需要配置,获取安装指南: +https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md + +用户只需提供 cookies,其他配置由 agent 完成。 diff --git a/plugins/skill-hub/.agents/skills/agent-reach/SKILL_en.md b/plugins/skill-hub/.agents/skills/agent-reach/SKILL_en.md new file mode 100644 index 00000000..d0aa9720 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/agent-reach/SKILL_en.md @@ -0,0 +1,125 @@ +--- +name: agent-reach +description: > + MUST USE when user wants to research/search/look up/find anything on the + internet — e.g. "research this topic", "do a deep dive on X", "search the + web for X", "see what people say about X", "look this up". + + Also MUST USE when user mentions any platform or shares any URL/link: + Twitter/X, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu, + Xiaoyuzhou Podcast, LinkedIn/jobs/recruiting, V2EX, Xueqiu (stocks), RSS. + + 13 platforms, multi-backend routing (OpenCLI / per-platform CLIs / APIs). + Zero config for 6 channels. Run `agent-reach doctor --json` to see which + backend serves each platform right now. + + NOT for: writing reports/analysis/translation (this skill only FETCHES + internet content); posting/commenting/liking (write operations); platforms + that already have a dedicated skill installed (prefer that skill). +metadata: + openclaw: + homepage: https://github.com/Panniantong/Agent-Reach +--- + +# Agent Reach — internet capability router + +13 platforms, multiple backends each. **When this skill exists, use it for +these platforms — do not invent your own approach.** + +## Standing rules (apply for the whole session) + +1. **Health-check before acting**: for multi-backend platforms (XiaoHongShu / + Reddit / Bilibili / Twitter), run `agent-reach doctor --json` first and + pick the command group matching each platform's `active_backend`. +2. **Announce what you use**: say "using agent-reach, platform X via backend Y" + before starting. +3. **On failure, follow the retry chains in references/** — never guess + commands. +4. **For broad research tasks**: combine platforms (Exa for web search + + Twitter/Reddit for discussions + XiaoHongShu/Bilibili for Chinese + perspectives), collect in parallel, then synthesize. +5. **Watch versions for the user**: after finishing a substantial + multi-platform task, run `agent-reach check-update` (fast, one API call). + If a new version exists, append one line to your wrap-up: "Agent Reach + vX.Y.Z is available — paste this to me to update: 帮我更新 Agent Reach: + https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/update.md". + Never interrupt the current task to update; never nag about the same version twice. + +## Routing table + +| User intent | Category | Details | +|---------|------|---------| +| Web / code search | search | [references/search.md](references/search.md) | +| XiaoHongShu / Twitter / Bilibili / V2EX / Reddit | social | [references/social.md](references/social.md) | +| Jobs / LinkedIn | career | [references/career.md](references/career.md) | +| GitHub / code | dev | [references/dev.md](references/dev.md) | +| Web pages / articles / RSS | web | [references/web.md](references/web.md) | +| YouTube / Bilibili / podcast transcripts | video | [references/video.md](references/video.md) | + +## Zero-config quick commands + +```bash +# Exa web search +mcporter call 'exa.web_search_exa(query: "query", numResults: 5)' + +# Read any web page +curl -s "https://r.jina.ai/URL" + +# GitHub search +gh search repos "query" --sort stars --limit 10 + +# YouTube subtitles (NOTE: never use yt-dlp for Bilibili — see video.md) +yt-dlp --write-sub --skip-download -o "/tmp/%(id)s" "URL" + +# V2EX hot topics +curl -s "https://www.v2ex.com/api/topics/hot.json" -H "User-Agent: agent-reach/1.0" + +# Bilibili search (bili-cli, no login needed) +bili search "query" --type video -n 5 +``` + +## Login-backed platforms (pick by doctor's active_backend) + +```bash +# Twitter search (twitter-cli preferred; retry chain in social.md) +twitter search "query" -n 10 + +# Reddit (NO zero-config path — OpenCLI or rdt-cli, login required) +opencli reddit search "query" -f yaml # desktop +rdt search "query" --limit 10 # legacy/server + +# XiaoHongShu (desktop prefers OpenCLI) +opencli xiaohongshu search "query" -f yaml +``` + +## Environment check + +```bash +# Channel availability + which backend serves each platform +agent-reach doctor --json +``` + +## Workspace rules + +**Never create files in the agent workspace.** Use `/tmp/` for temporary +output and `~/.agent-reach/` for persistent data. + +## Detailed references + +Read the matching file when you need specifics (commands above cover the +common cases; references hold per-backend command groups, caveats, retry +chains — note: reference docs are written in Chinese, commands are universal): + +- [Search](references/search.md) — Exa AI search +- [Social](references/social.md) — XiaoHongShu, Twitter, Bilibili, V2EX, Reddit (multi-backend groups) +- [Career](references/career.md) — LinkedIn +- [Dev](references/dev.md) — GitHub CLI +- [Web](references/web.md) — Jina Reader, RSS +- [Video](references/video.md) — YouTube, Bilibili, Xiaoyuzhou + +## Configure a channel + +If a channel needs setup, fetch the install guide: +https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md + +The user only provides cookies / one extension click; the agent does the rest. diff --git a/plugins/skill-hub/.agents/skills/agent-reach/references/career.md b/plugins/skill-hub/.agents/skills/agent-reach/references/career.md new file mode 100644 index 00000000..f1b46fe7 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/agent-reach/references/career.md @@ -0,0 +1,29 @@ +# 职场招聘 + +LinkedIn。 + +## LinkedIn + +```bash +# 获取个人资料 +mcporter call 'linkedin-scraper.get_person_profile(linkedin_url: "https://linkedin.com/in/username")' + +# 搜索人才 +mcporter call 'linkedin-scraper.search_people(keyword: "AI engineer", limit: 10)' + +# 获取公司资料 +mcporter call 'linkedin-scraper.get_company_profile(linkedin_url: "https://linkedin.com/company/xxx")' + +# 搜索职位 +mcporter call 'linkedin-scraper.search_jobs(keyword: "software engineer", limit: 10)' +``` + +> **需要登录**: LinkedIn scraper 需要有效的登录态。 + +### Fallback 方案 + +如果 MCP 不可用,可以用 Jina Reader: + +```bash +curl -s "https://r.jina.ai/https://linkedin.com/in/username" +``` diff --git a/plugins/skill-hub/.agents/skills/agent-reach/references/dev.md b/plugins/skill-hub/.agents/skills/agent-reach/references/dev.md new file mode 100644 index 00000000..ca247622 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/agent-reach/references/dev.md @@ -0,0 +1,62 @@ +# 开发工具 + +GitHub CLI + +## GitHub (gh CLI) + +GitHub 官方命令行工具,用于仓库、Issue、PR、Actions、Release 以及 API 访问。 + +```bash +# 认证 +gh auth login +gh auth status + +# 搜索 +gh search repos "query" --sort stars --limit 10 +gh search code "query" --language python + +# 仓库 +gh repo view owner/repo +gh repo clone owner/repo +gh repo create my-repo --private +gh repo fork owner/repo +gh repo fork owner/repo --clone +gh repo sync owner/repo + +# Issues +gh issue list -R owner/repo --state open +gh issue view 123 -R owner/repo +gh issue create -R owner/repo --title "Title" --body "Body" + +# Pull Requests +gh pr list -R owner/repo --state open +gh pr view 123 -R owner/repo +gh pr create -R owner/repo --title "Title" --body "Body" +gh pr checks 123 --repo owner/repo + +# Actions / CI +gh run list --repo owner/repo --limit 10 +gh run view --repo owner/repo +gh run view --repo owner/repo --log-failed +gh workflow list --repo owner/repo + +# Releases +gh release list -R owner/repo +gh release create v1.0.0 + +# API +gh api /user +gh api repos/owner/repo + +# JSON 输出 +gh issue list --repo owner/repo --json number,title --jq '.[] | "\(.number): \(.title)"' +``` + + +## 选择指南 + +| 工具 | 来源 | 用途 | +|-----|------|------| +| gh CLI | agent-reach | Git 操作 | +| zread | my-mcp-tools | 读仓库内容 | +| context7 | my-mcp-tools | 查技术文档 | diff --git a/plugins/skill-hub/.agents/skills/agent-reach/references/search.md b/plugins/skill-hub/.agents/skills/agent-reach/references/search.md new file mode 100644 index 00000000..4a0fa4c6 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/agent-reach/references/search.md @@ -0,0 +1,33 @@ +# 搜索工具 + +Exa AI 搜索引擎。 + +## Exa AI 搜索 + +高质量 AI 搜索引擎,擅长技术和代码搜索。 + +```bash +mcporter call 'exa.web_search_exa(query: "query", numResults: 5)' +mcporter call 'exa.get_code_context_exa(query: "code question", tokensNum: 3000)' +``` + +### 使用场景 + +| 场景 | 参数 | +|-----|------| +| 网页搜索 | `web_search_exa(query: "...", numResults: 5)` | +| 代码搜索 | `get_code_context_exa(query: "...", tokensNum: 3000)` | + +### 特点 + +- 擅长英文内容和技术文档 +- 支持代码上下文搜索 +- 结果质量高 + +## 与其他搜索工具对比 + +| 工具 | 来源 | 适用场景 | +|-----|------|---------| +| Exa | agent-reach | 英文/技术/代码搜索 | +| 智谱搜索 | my-mcp-tools | 中文搜索 | +| GitHub 搜索 | agent-reach (dev.md) | 仓库/代码搜索 | diff --git a/plugins/skill-hub/.agents/skills/agent-reach/references/social.md b/plugins/skill-hub/.agents/skills/agent-reach/references/social.md new file mode 100644 index 00000000..20ce5c4e --- /dev/null +++ b/plugins/skill-hub/.agents/skills/agent-reach/references/social.md @@ -0,0 +1,232 @@ +# 社交媒体 & 社区 + +小红书、Twitter/X、B站、V2EX、Reddit。 + +## 小红书 / XiaoHongShu(多后端) + +小红书有三个后端,**先跑 `agent-reach doctor --json` 看 xiaohongshu 的 `active_backend` 是哪个**,再用对应命令组。 + +### 后端 A:OpenCLI(桌面首选,复用浏览器登录态) + +```bash +# 搜索笔记 +opencli xiaohongshu search "query" -f yaml + +# 读笔记正文+互动数据(用搜索结果里的完整 URL,含 xsec_token) +opencli xiaohongshu note "NOTE_URL" -f yaml + +# 评论(支持楼中楼) +opencli xiaohongshu comments NOTE_ID -f yaml + +# 首页推荐 feed +opencli xiaohongshu feed -f yaml + +# 用户主页公开笔记 +opencli xiaohongshu user USER_ID -f yaml +``` + +> 要求 Chrome 打开且装了 OpenCLI 扩展。报 AUTH_REQUIRED 说明浏览器里没登录小红书,让用户在 Chrome 里登录一次即可。 + +### 后端 B:xiaohongshu-mcp(服务器场景) + +```bash +# 未登录时:先查状态,再取二维码给用户扫 +mcporter call 'xiaohongshu.check_login_status()' --timeout 120000 +mcporter call 'xiaohongshu.get_login_qrcode()' --timeout 120000 + +# 搜索 +mcporter call 'xiaohongshu.search_feeds(keyword: "query")' --timeout 120000 + +# 笔记详情+评论(feed_id 和 xsec_token 从搜索结果取) +mcporter call 'xiaohongshu.get_feed_detail(feed_id: "...", xsec_token: "...")' --timeout 120000 +``` + +> 首次调用会自动下载约 150MB 无头浏览器,务必带 `--timeout 120000`。未登录时 search 会挂死,先 check_login_status。 + +### 后端 C:xhs-cli(存量备选,上游 2026-03 起停更) + +```bash +xhs search "query" # 搜索 +xhs read NOTE_ID_OR_URL # 读笔记(必须用搜索结果中的 URL/ID,不能裸 note_id) +xhs comments NOTE_ID_OR_URL # 评论 +xhs hot # 热门 +xhs feed # 推荐 +``` + +> 已知不稳定:`xhs user` / `xhs user-posts` / `xhs favorites` 可能返回 API error(上游停更无人修)。新装用户建议直接走后端 A/B。 + +### 通用注意事项 + +> **xsec_token 限制**: 小红书强制 xsec_token 机制,**不能直接用裸 note_id 去读**。正确流程:先搜索/feed 拿结果,再用结果中的完整 URL/ID 去读。三个后端都一样。 +> +> **频率控制**: 高频请求(批量搜索、深翻评论)会触发验证码,平台限制无法绕过。每次操作间隔 2-3 秒。 +> +> **写操作(发帖/评论/点赞)**: 建议只读。xhs-cli v0.6.x 写操作可能因签名问题返回 406。 + +## Twitter/X (twitter-cli) + +### 稳定命令 + +```bash +# 首页时间线(最稳定) +twitter feed -n 20 + +# 读取单条推文(含回复) +twitter tweet URL_OR_ID + +# 读取长文 / X Article +twitter article URL_OR_ID + +# 用户时间线 +twitter user-posts @username -n 20 + +# 用户资料 +twitter user @username +``` + +### 可能不稳定的命令 + +```bash +# 搜索推文(Twitter 频繁改 GraphQL 端点,可能 404) +twitter search "query" -n 10 + +# likes(2024 年后只能看自己的,平台限制) +twitter likes +``` + +### search 失败时的重试链(按序执行,成功即停) + +1. 直接重试一次(偶发失败常见):`twitter search "query" -n 10` +2. 升级后再试:`pipx upgrade twitter-cli && twitter search "query" -n 10` +3. 换 OpenCLI 备选(桌面,复用浏览器登录态):`opencli twitter search "query" -f yaml` +4. 都不行就改用 `twitter feed` / `twitter user-posts @somebody` 等稳定命令绕路 + +### 重要注意事项 + +> **安装**: `pipx install twitter-cli`(确保 v0.8.5+) +> +> **认证**: 推荐用 Cookie-Editor 导出后设置环境变量 `TWITTER_AUTH_TOKEN` + `TWITTER_CT0`。自动提取在 SSH/Docker/无头环境不可用。 +> +> **IP 风控**: 不要在 VPS/数据中心 IP 上频繁调用,尤其是 followers/following,有封号风险。使用住宅代理或本地环境。 +> +> **OpenCLI 备选**: 桌面装了 OpenCLI 的话,`opencli twitter search/article/user-posts -f yaml` 全套可用(浏览器登录态,无需 cookie 环境变量)。 +> +> **输出格式**: 建议用 `--yaml` 或 `--json` 获得结构化输出,对 AI agent 更友好。 + +## B站 / Bilibili + +> ⚠️ **不要用 yt-dlp 读 B站**(风控已全面 412 拦截,实测无解)。用 bili-cli / OpenCLI。 + +```bash +# 搜索 / 热门 / 视频详情(bili-cli,只读无需登录) +bili search "query" --type video -n 5 +bili hot -n 10 +bili video BVxxx + +# 字幕(OpenCLI,需桌面 Chrome) +opencli bilibili subtitle BVxxx +``` + +> 详细命令(音频转写、API 直连兜底)见 [references/video.md](video.md)。 + +## V2EX (公开 API) + +无需认证,直接调用公开 API。 + +### 热门主题 + +```bash +curl -s "https://www.v2ex.com/api/topics/hot.json" -H "User-Agent: agent-reach/1.0" +``` + +### 节点主题 + +```bash +# node_name 如: python, tech, jobs, qna, programmers +curl -s "https://www.v2ex.com/api/topics/show.json?node_name=python&page=1" -H "User-Agent: agent-reach/1.0" +``` + +### 主题详情 + +```bash +# topic_id 从 URL 获取,如 https://www.v2ex.com/t/1234567 +curl -s "https://www.v2ex.com/api/topics/show.json?id=TOPIC_ID" -H "User-Agent: agent-reach/1.0" +``` + +### 主题回复 + +```bash +curl -s "https://www.v2ex.com/api/replies/show.json?topic_id=TOPIC_ID&page=1" -H "User-Agent: agent-reach/1.0" +``` + +### 用户信息 + +```bash +curl -s "https://www.v2ex.com/api/members/show.json?username=USERNAME" -H "User-Agent: agent-reach/1.0" +``` + +### Python 调用示例 + +```python +from agent_reach.channels.v2ex import V2EXChannel + +ch = V2EXChannel() + +# 获取热门帖子 +topics = ch.get_hot_topics(limit=10) +for t in topics: + print(f"[{t['node_title']}] {t['title']} ({t['replies']} 回复)") + +# 获取节点帖子 +node_topics = ch.get_node_topics("python", limit=5) + +# 获取帖子详情 + 回复 +topic = ch.get_topic(1234567) +print(topic["title"], "—", topic["author"]) + +# 获取用户信息 +user = ch.get_user("Livid") +``` + +> **节点列表**: https://www.v2ex.com/planes + +## Reddit(多后端,必须登录态) + +**Reddit 没有零配置路径**:匿名 `.json` 端点已被封(403),官方 API 自 2025-11 起人工审批基本不批。两个后端都靠登录态,先跑 `agent-reach doctor --json` 看 reddit 的 `active_backend`。中国大陆访问需代理。 + +### 后端 A:OpenCLI(桌面首选,复用浏览器登录态) + +```bash +# 搜索帖子 +opencli reddit search "query" -f yaml + +# 读帖子全文 + 评论 +opencli reddit read POST_ID -f yaml + +# 浏览 subreddit / 热门 / Popular +opencli reddit subreddit LocalLLaMA -f yaml +opencli reddit hot -f yaml +opencli reddit popular -f yaml + +# subreddit 元信息(订阅数、简介) +opencli reddit subreddit-info LocalLLaMA -f yaml +``` + +> 要求 Chrome 打开且浏览器里登录过 reddit.com。 + +### 后端 B:rdt-cli(存量/服务器备选,上游 2026-03 起停更) + +```bash +rdt search "query" --limit 10 # 搜索帖子 +rdt read POST_ID # 读帖子全文 + 评论 +rdt sub python --limit 20 # 浏览 subreddit +rdt popular --limit 10 # 浏览热门 +rdt all --limit 10 # 浏览 /r/all +``` + +> **安装**: `pipx install 'git+https://github.com/public-clis/rdt-cli.git'`(PyPI 版本落后,需从 GitHub 装 v0.4.2+)。先 `rdt login` 才能搜索和阅读(服务器无浏览器时手动写 Cookie,见 doctor 提示)。 +> 建议使用 `--yaml` 输出,对 AI agent 更友好。 + +### 高级选项:官方 API + PRAW(仅限已有凭证的用户) + +2025-11 前注册过 Reddit script app(持有 client_id/client_secret)的用户可以用 PRAW 走官方 API(100 QPM 免费)。新申请需人工审批且个人项目基本不批,**不要推荐新用户走这条路**。 diff --git a/plugins/skill-hub/.agents/skills/agent-reach/references/video.md b/plugins/skill-hub/.agents/skills/agent-reach/references/video.md new file mode 100644 index 00000000..5fdbc3db --- /dev/null +++ b/plugins/skill-hub/.agents/skills/agent-reach/references/video.md @@ -0,0 +1,130 @@ +# 视频/播客 + +YouTube、B站、小宇宙播客的字幕和转录。 + +## YouTube (yt-dlp) + +### 获取视频元数据 + +```bash +yt-dlp --dump-json "URL" +``` + +### 下载字幕 + +```bash +# 下载字幕 (不下载视频) +yt-dlp --write-sub --write-auto-sub --sub-lang "zh-Hans,zh,en" --skip-download -o "/tmp/%(id)s" "URL" + +# 然后读取 .vtt 文件 +cat /tmp/VIDEO_ID.*.vtt +``` + +### 获取评论 + +```bash +# 提取评论(best-effort,不保证完整) +yt-dlp --write-comments --skip-download --write-info-json \ + --extractor-args "youtube:max_comments=20" \ + -o "/tmp/%(id)s" "URL" +# 评论在 .info.json 的 comments 字段中 +``` + +### 搜索视频 + +```bash +yt-dlp --dump-json "ytsearch5:query" +``` + +> **字幕注意**: 手动上传的字幕提取可靠;自动生成字幕可能存在行间重复,需后处理。 +> **评论注意**: `--write-comments` 基于网页抓取(非 YouTube Data API),部分评论可能丢失。 + +### 无字幕兜底:Whisper 音频转写 + +```bash +# 视频没有字幕时的兜底:下载音频并用 Whisper 转写(Groq 免费 key 即可) +agent-reach transcribe "https://www.youtube.com/watch?v=VIDEO_ID" +agent-reach transcribe ./local_audio.mp3 -o /tmp/transcript.txt +``` + +> 需要先配置 key:`agent-reach configure groq-key gsk_xxx`(免费,console.groq.com) +> 或 `agent-reach configure openai-key sk-xxx`。默认 auto 模式:groq 失败自动降级 openai。 + +## B站 / Bilibili(bili-cli 为主,OpenCLI 补字幕) + +> ⚠️ **不要用 yt-dlp 读 B站**:B站风控已全面 412 拦截 yt-dlp(实测最新版、直连/代理/带 Cookie 全部无效)。yt-dlp 只用于 YouTube。 + +### 视频详情/搜索/热门/排行 (bili-cli,只读无需登录) + +```bash +# 视频详情(标题/UP主/时长/播放互动数据/字幕可用性) +bili video BVxxx + +# 搜索视频 +bili search "query" --type video -n 5 + +# 热门视频 / 排行榜 +bili hot -n 10 +bili rank -n 10 + +# 下载音频并切分为 ASR-ready WAV(无字幕时配合 agent-reach transcribe 转写) +bili audio BVxxx +``` + +### 字幕 (OpenCLI,需要桌面 Chrome) + +```bash +# 字幕逐句带时间轴 +opencli bilibili subtitle BVxxx + +# OpenCLI 也能搜索/读视频元数据(备选) +opencli bilibili search "query" -f yaml +opencli bilibili video BVxxx -f yaml +``` + +### 零配置兜底:搜索 API 直连 + +```bash +UA="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" +curl -s -c /tmp/bili_ck.txt -o /dev/null -A "$UA" "https://www.bilibili.com/" +curl -s -b /tmp/bili_ck.txt -A "$UA" -e "https://www.bilibili.com/" \ + "https://api.bilibili.com/x/web-interface/search/all/v2?keyword=QUERY&page=1" +``` + +> **安装 bili-cli**: `pipx install bilibili-cli`(上游 2026-03 起停更但实测健康;只读场景无需登录,`bili login` 扫码可解锁动态/收藏等个人功能)。 + +## 小宇宙播客 / Xiaoyuzhou Podcast + +### 转录单集播客(可选 --polish 增强标点) + +```bash +# 输出 Markdown 文件到 /tmp/。--polish 让 Llama 3.3 70B 给文稿补中文标点+合理分段 +~/.agent-reach/tools/xiaoyuzhou/transcribe.sh --polish "https://www.xiaoyuzhoufm.com/episode/EPISODE_ID" +``` + +> 转写 prompt 已要求 Whisper 输出中文标点;若标点效果仍不理想,可加 `--polish` 用 Groq 上免费的 Llama 3.3 70B 补标点+合理分段(9 分钟播客约多 ~7 秒)。每次转写多一轮 LLM 调用,按需使用。 + +### 前置要求 + +1. **ffmpeg**: `brew install ffmpeg` +2. **Groq API Key** (免费): https://console.groq.com/keys +3. **配置 Key**: `agent-reach configure groq-key YOUR_KEY` +4. **首次运行**: `agent-reach install --env=auto` 安装工具 + +### 检查状态 + +```bash +agent-reach doctor +``` + +> 输出 Markdown 文件默认保存到 `/tmp/`。 + +## 选择指南 + +| 场景 | 推荐工具 | +|-----|---------| +| YouTube 字幕 | yt-dlp | +| B站视频详情/搜索 | bili-cli | +| B站字幕 | opencli bilibili subtitle | +| 播客转录 | 小宇宙 transcribe.sh | +| 无字幕音视频 | agent-reach transcribe(B站音频先 `bili audio`) | diff --git a/plugins/skill-hub/.agents/skills/agent-reach/references/web.md b/plugins/skill-hub/.agents/skills/agent-reach/references/web.md new file mode 100644 index 00000000..5977b1c4 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/agent-reach/references/web.md @@ -0,0 +1,50 @@ +# 网页阅读 + +通用网页、RSS。 + +## 通用网页 (Jina Reader) + +```bash +# 读取任意网页内容 +curl -s "https://r.jina.ai/URL" + +# 示例 +curl -s "https://r.jina.ai/https://example.com/article" +``` + +**适用场景**: 大多数网页可以直接用 Jina Reader 读取。 + +## Web Reader (MCP) + +```bash +# 读取网页内容 (Markdown 格式) +mcporter call 'web-reader.webReader(url: "https://example.com")' + +# 保留图片 +mcporter call 'web-reader.webReader(url: "https://example.com", retain_images: true)' + +# 纯文本格式 +mcporter call 'web-reader.webReader(url: "https://example.com", return_format: "text")' +``` + +**适用场景**: 需要更精确控制输出格式时使用。 + +## RSS (feedparser) + +```python +python3 -c " +import feedparser +for e in feedparser.parse('FEED_URL').entries[:5]: + print(f'{e.title} — {e.link}') +" +``` + +**适用场景**: 订阅博客、新闻源、播客等 RSS feed。 + +## 选择指南 + +| 场景 | 推荐工具 | +|-----|---------| +| 通用网页 | Jina Reader (`curl r.jina.ai`) | +| 需要图片/格式控制 | web-reader MCP | +| RSS 订阅 | feedparser | diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/LICENSE.txt b/plugins/skill-hub/.agents/skills/aspnet-core/LICENSE.txt new file mode 100644 index 00000000..7a4a3ea2 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/SKILL.md b/plugins/skill-hub/.agents/skills/aspnet-core/SKILL.md new file mode 100644 index 00000000..c71ed6e7 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/SKILL.md @@ -0,0 +1,61 @@ +--- +name: aspnet-core +description: Build, review, refactor, or architect ASP.NET Core web applications using current official guidance for .NET web development. Use when working on Blazor Web Apps, Razor Pages, MVC, Minimal APIs, controller-based Web APIs, SignalR, gRPC, middleware, dependency injection, configuration, authentication, authorization, testing, performance, deployment, or ASP.NET Core upgrades. +--- + +# ASP.NET Core + +## Overview + +Choose the right ASP.NET Core application model, compose the host and request pipeline correctly, and implement features in the framework style Microsoft documents today. + +Load the smallest set of references that fits the task. Do not load every reference by default. + +## Workflow + +1. Confirm the target framework, SDK, and current app model. +2. Open [references/stack-selection.md](references/stack-selection.md) first for new apps or major refactors. +3. Open [references/program-and-pipeline.md](references/program-and-pipeline.md) next for `Program.cs`, DI, configuration, middleware, routing, logging, and static assets. +4. Open exactly one primary app-model reference: + - [references/ui-blazor.md](references/ui-blazor.md) + - [references/ui-razor-pages.md](references/ui-razor-pages.md) + - [references/ui-mvc.md](references/ui-mvc.md) + - [references/apis-minimal-and-controllers.md](references/apis-minimal-and-controllers.md) +5. Add cross-cutting references only as needed: + - [references/data-state-and-services.md](references/data-state-and-services.md) + - [references/security-and-identity.md](references/security-and-identity.md) + - [references/realtime-grpc-and-background-work.md](references/realtime-grpc-and-background-work.md) + - [references/testing-performance-and-operations.md](references/testing-performance-and-operations.md) +6. Open [references/versioning-and-upgrades.md](references/versioning-and-upgrades.md) before introducing new platform APIs into an older solution or when migrating between major versions. +7. Use [references/source-map.md](references/source-map.md) when you need the Microsoft Learn section that corresponds to a task not already covered by the focused references. + +## Default Operating Assumptions + +- Prefer the latest stable ASP.NET Core and .NET unless the repository or user request pins an older target. +- As of March 2026, prefer .NET 10 / ASP.NET Core 10 for new production work. Treat ASP.NET Core 11 as preview unless the user explicitly asks for preview features. +- Prefer `WebApplicationBuilder` and `WebApplication`. Avoid older `Startup` and `WebHost` patterns unless the codebase already uses them or the task is migration. +- Prefer built-in DI, options/configuration, logging, ProblemDetails, OpenAPI, health checks, rate limiting, output caching, and Identity before adding third-party infrastructure. +- Keep feature slices cohesive so the page, component, endpoint, controller, validation, service, data access, and tests are easy to trace. +- Respect the existing app model. Do not rewrite Razor Pages to MVC or controllers to Minimal APIs without a clear reason. + +## Reference Guide + +- [references/_sections.md](references/_sections.md): Quick index and reading order. +- [references/stack-selection.md](references/stack-selection.md): Choose the right ASP.NET Core application model and template. +- [references/program-and-pipeline.md](references/program-and-pipeline.md): Structure `Program.cs`, services, middleware, routing, configuration, logging, and static assets. +- [references/ui-blazor.md](references/ui-blazor.md): Build Blazor Web Apps, choose render modes, and use components, forms, and JS interop correctly. +- [references/ui-razor-pages.md](references/ui-razor-pages.md): Build page-focused server-rendered apps with handlers, model binding, and conventions. +- [references/ui-mvc.md](references/ui-mvc.md): Build controller/view applications with clear separation of concerns. +- [references/apis-minimal-and-controllers.md](references/apis-minimal-and-controllers.md): Build HTTP APIs with Minimal APIs or controllers, including validation and response patterns. +- [references/data-state-and-services.md](references/data-state-and-services.md): Use EF Core, `DbContext`, options, `IHttpClientFactory`, session, temp data, and app state responsibly. +- [references/security-and-identity.md](references/security-and-identity.md): Apply authentication, authorization, Identity, secrets, data protection, CORS, CSRF, and HTTPS guidance. +- [references/realtime-grpc-and-background-work.md](references/realtime-grpc-and-background-work.md): Use SignalR, gRPC, and hosted services. +- [references/testing-performance-and-operations.md](references/testing-performance-and-operations.md): Add integration tests, browser tests, caching, compression, health checks, rate limits, and deployment concerns. +- [references/versioning-and-upgrades.md](references/versioning-and-upgrades.md): Handle target frameworks, breaking changes, obsolete APIs, and migrations. +- [references/source-map.md](references/source-map.md): Map the official ASP.NET Core documentation tree to the references in this skill. + +## Execution Notes + +- When generating new code, start from the correct `dotnet new` template and keep the generated structure recognizable. +- When editing an existing solution, follow the solution's conventions first and use these references to avoid framework misuse or outdated patterns. +- When a task mentions "latest", verify the feature on Microsoft Learn or the ASP.NET Core docs repo before relying on memory. diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/agents/openai.yaml b/plugins/skill-hub/.agents/skills/aspnet-core/agents/openai.yaml new file mode 100644 index 00000000..03d861ea --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/agents/openai.yaml @@ -0,0 +1,5 @@ +interface: + display_name: "ASP.NET Core" + short_description: "[Windows only] Build and review ASP.NET Core web apps" + icon_large: "./assets/dotnet-logo.png" + default_prompt: "Create a new $aspnet-core website for me." diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/assets/dotnet-logo.png b/plugins/skill-hub/.agents/skills/aspnet-core/assets/dotnet-logo.png new file mode 100644 index 00000000..7a7ee241 Binary files /dev/null and b/plugins/skill-hub/.agents/skills/aspnet-core/assets/dotnet-logo.png differ diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/references/_sections.md b/plugins/skill-hub/.agents/skills/aspnet-core/references/_sections.md new file mode 100644 index 00000000..8cbf1e38 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/references/_sections.md @@ -0,0 +1,40 @@ +# Reference Sections + +Use this file as the routing table for the rest of the skill. + +## Start Here + +- New app or major redesign: `stack-selection.md` -> `program-and-pipeline.md` -> one primary app-model reference -> `security-and-identity.md` -> `testing-performance-and-operations.md` +- Existing app feature work: primary app-model reference -> `program-and-pipeline.md` -> any needed cross-cutting references +- API-first work: `apis-minimal-and-controllers.md` -> `security-and-identity.md` -> `data-state-and-services.md` -> `testing-performance-and-operations.md` +- Authentication, authorization, or secrets: `security-and-identity.md` +- Realtime, streaming, or background processing: `realtime-grpc-and-background-work.md` +- Upgrade or migration work: `versioning-and-upgrades.md` + +## Primary References + +| File | Open when | +| --- | --- | +| `stack-selection.md` | Choose Blazor, Razor Pages, MVC, Minimal APIs, controllers, SignalR, or gRPC | +| `program-and-pipeline.md` | Structure `Program.cs`, services, configuration, middleware, routing, logging, static files, and app startup | +| `ui-blazor.md` | Build or review Blazor Web Apps and component-based UI | +| `ui-razor-pages.md` | Build or review page-focused server-rendered applications | +| `ui-mvc.md` | Build or review controller/view applications | +| `apis-minimal-and-controllers.md` | Build or review HTTP APIs | + +## Cross-Cutting References + +| File | Open when | +| --- | --- | +| `data-state-and-services.md` | Register services, use EF Core, handle options/configuration, or manage app state | +| `security-and-identity.md` | Add Identity, cookies, bearer auth, policies, CORS, CSRF, HTTPS, or secrets handling | +| `realtime-grpc-and-background-work.md` | Add SignalR, gRPC, streaming, or hosted services | +| `testing-performance-and-operations.md` | Add tests, caching, compression, health checks, rate limits, deployment, or proxy configuration | +| `versioning-and-upgrades.md` | Migrate across ASP.NET Core versions, avoid obsolete APIs, or target preview features deliberately | +| `source-map.md` | Map a task to the official ASP.NET Core documentation tree | + +## Reading Strategy + +- Open one app-model reference at a time unless the codebase genuinely mixes models. +- Prefer the framework's built-in abstractions first. +- Check `versioning-and-upgrades.md` before introducing APIs that might not exist in the repository's target framework. diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/references/apis-minimal-and-controllers.md b/plugins/skill-hub/.agents/skills/aspnet-core/references/apis-minimal-and-controllers.md new file mode 100644 index 00000000..bc599eae --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/references/apis-minimal-and-controllers.md @@ -0,0 +1,81 @@ +# APIs: Minimal And Controllers + +Primary docs: +- https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis +- https://learn.microsoft.com/aspnet/core/web-api/ +- https://learn.microsoft.com/aspnet/core/fundamentals/error-handling-api + +## First Decision + +Choose between: + +- Minimal APIs for focused, low-ceremony HTTP endpoints +- controller-based APIs for richer MVC conventions and attribute-driven behavior + +Do not mix both styles in the same feature unless that split is genuinely useful. + +## Minimal API Guidance + +Prefer Minimal APIs when the surface is small to medium and you want concise endpoint definitions. + +Good defaults: + +- organize endpoints with route groups +- keep route handlers thin +- move business logic into services +- prefer `TypedResults` over untyped results +- use endpoint filters when cross-cutting behavior belongs at the endpoint layer +- use built-in validation support on supported target frameworks + +Minimal API reminders: + +- handler parameters can be bound from route, query, headers, body, form, or DI +- authorization can be applied with `RequireAuthorization` +- return `IResult` or `TypedResults` when response shape matters +- use OpenAPI support for discoverable contracts + +On .NET 10, Minimal APIs support built-in validation with `AddValidation()`. Use that instead of inventing parallel validation infrastructure when the target framework supports it. + +## Controller API Guidance + +Prefer controllers when the API needs: + +- `[ApiController]` behaviors +- attribute routing and conventions +- filters +- custom formatters +- mature controller organization in an existing codebase + +Controller defaults: + +- derive API controllers from `ControllerBase` +- annotate with `[ApiController]` +- use attribute routing +- return ProblemDetails-compatible failures +- let automatic model validation handle invalid requests unless there is a concrete override requirement + +Key `[ApiController]` behaviors: + +- attribute routing is required +- invalid model state automatically becomes HTTP 400 +- binding source inference applies +- error responses use ProblemDetails patterns + +## Shared API Practices + +- Keep request and response DTOs separate from persistence models +- Use version-stable route and payload contracts +- Use `CreatedAt...` patterns for resource creation +- Prefer explicit status codes and typed results over implicit behavior +- Apply authorization at the endpoint or controller boundary, not only inside service methods +- Use `ProblemDetails` for errors instead of ad hoc JSON shapes + +## Browser-Facing Notes + +- Be careful with cookie-authenticated API endpoints and CORS +- For browser-based form or file upload endpoints, account for antiforgery requirements +- In ASP.NET Core 10, known API endpoints no longer use cookie-login redirects by default; rely on API-appropriate unauthorized responses instead + +## Native AOT + +Use `dotnet new webapiaot` only when native AOT is an explicit deployment requirement. Treat it as a constraint that affects library choice, reflection, JSON patterns, and compatibility. diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/references/data-state-and-services.md b/plugins/skill-hub/.agents/skills/aspnet-core/references/data-state-and-services.md new file mode 100644 index 00000000..d2826e0d --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/references/data-state-and-services.md @@ -0,0 +1,69 @@ +# Data, State, And Services + +Primary docs: +- https://learn.microsoft.com/aspnet/core/data/ +- https://learn.microsoft.com/aspnet/core/fundamentals/dependency-injection +- https://learn.microsoft.com/aspnet/core/fundamentals/http-requests +- https://learn.microsoft.com/aspnet/core/fundamentals/app-state + +## Dependency Injection Defaults + +- Register infrastructure and business services in `Program.cs` +- Inject dependencies through constructors by default +- Keep scoped services request-bound +- Avoid resolving scoped services from singletons +- Use keyed or named patterns only when there is a real need for multiple implementations + +## EF Core And DbContext + +Use EF Core for common relational data access patterns unless the repository already uses another data layer. + +Default guidance: + +- register `DbContext` with `AddDbContext` +- treat `DbContext` as scoped +- keep queries and transactions in services, not UI code +- use migrations intentionally +- keep entities out of public API contracts and UI view models + +Use `IDbContextFactory` when the execution model is not request-scoped, such as: + +- Blazor components with longer-lived scopes +- background services +- explicit factory-driven data work + +## Options And Configuration + +- Bind structured configuration into options classes +- validate options early when bad configuration should fail fast +- keep configuration access close to the service that owns it +- avoid scattering raw configuration keys across the codebase + +## Outbound HTTP + +Use `IHttpClientFactory` for outbound HTTP calls. + +Prefer: + +- named clients for distinct external systems +- typed clients for richer integrations +- delegating handlers for retries, headers, or telemetry concerns + +Avoid manual `new HttpClient()` patterns scattered through request handlers. + +## App State + +Use the smallest state mechanism that fits: + +- query string or route values for transparent request state +- form posts for user input +- TempData for short-lived redirect-friendly messages +- session only when necessary and with an understanding of its server-side and scaling implications + +Do not treat session as the primary application data store. + +## Caching And State Boundaries + +- Keep cached data derivable from a durable source +- Separate cache shape from persistence shape when it improves safety or performance +- Revisit session, in-memory cache, and singleton state when the app scales to multiple instances diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/references/program-and-pipeline.md b/plugins/skill-hub/.agents/skills/aspnet-core/references/program-and-pipeline.md new file mode 100644 index 00000000..0b37686b --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/references/program-and-pipeline.md @@ -0,0 +1,103 @@ +# Program And Pipeline + +Primary docs: +- https://learn.microsoft.com/aspnet/core/fundamentals/ +- https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis/webapplication +- https://learn.microsoft.com/aspnet/core/fundamentals/middleware/ +- https://learn.microsoft.com/aspnet/core/fundamentals/configuration/ + +## Startup Shape + +Prefer the modern hosting model: + +1. Create `var builder = WebApplication.CreateBuilder(args);` +2. Register services on `builder.Services` +3. Build `var app = builder.Build();` +4. Configure middleware in the correct order +5. Map endpoints +6. Call `app.Run();` + +Use older `Startup` patterns only when the repository already uses them or the task is migration. + +## Service Registration + +- Register framework services explicitly: Razor Pages, controllers, Razor components, authentication, authorization, health checks, rate limiting, response compression, output caching, EF Core, and `IHttpClientFactory` +- Keep business logic in services instead of controllers, page models, or route handlers +- Use constructor injection as the default +- Use options classes for structured configuration +- Choose lifetimes intentionally: + - singleton: stateless or shared infrastructure + - scoped: request-bound work such as `DbContext` + - transient: lightweight stateless services + +## Configuration Defaults + +`WebApplication.CreateBuilder` already loads configuration from common providers such as: + +- `appsettings.json` +- environment-specific `appsettings.{Environment}.json` +- environment variables +- command-line arguments + +For secrets: + +- use Secret Manager in development +- use a secure external store in production +- do not commit secrets to source control + +## Middleware Order + +Middleware order is a frequent source of broken behavior. Favor this shape and adjust only with a concrete reason: + +1. Forwarded headers if behind a proxy or load balancer +2. Exception handling and HSTS for non-development environments +3. HTTPS redirection +4. Static files +5. Routing when explicit routing middleware is needed +6. CORS when endpoints require it +7. Authentication +8. Authorization +9. Endpoint-specific middleware such as rate limiting or session as required +10. Endpoint mapping with `MapRazorPages`, `MapControllers`, `MapGet`, `MapHub`, or `MapGrpcService` + +Important ordering rules: + +- Call `UseAuthentication()` before `UseAuthorization()` +- Keep proxy/header processing before auth, redirects, and link generation +- Do not insert custom middleware randomly between auth and authorization without a reason +- In Minimal API apps, explicit `UseRouting()` is usually unnecessary unless you need to control order + +## Routing And Endpoints + +- Prefer endpoint routing everywhere +- Use route groups for larger Minimal API surfaces +- Keep MVC and API routes explicit and predictable +- Use areas only when the application is large enough to benefit from bounded sections +- Keep endpoint names stable when generating links or integrating with clients + +## Error Handling + +- Use centralized exception handling instead of scattered `try/catch` blocks for ordinary request failures +- Prefer ProblemDetails-style responses for APIs +- Keep the developer exception page limited to development +- Separate user-facing failures from internal exception details + +## Logging And Diagnostics + +- Use `ILogger` from DI +- Log structured values, not concatenated strings +- Put correlation and request diagnostics in middleware or infrastructure, not business logic +- Enable HTTP logging only when the scenario warrants it and avoid leaking sensitive data + +## Static Assets And Web Root + +- Keep public assets in `wwwroot` +- Treat the web root as publicly readable content +- Prevent publishing local-only static content through project file rules when needed +- Use Razor Class Libraries for reusable UI assets across apps + +## Architectural Defaults + +- Keep `Program.cs` readable; extract feature registration to extension methods when it starts accumulating unrelated concerns +- Prefer vertical slices or feature folders over giant "Controllers", "Services", and "Repositories" buckets with weak boundaries +- Keep framework configuration close to the host and business logic out of it diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/references/realtime-grpc-and-background-work.md b/plugins/skill-hub/.agents/skills/aspnet-core/references/realtime-grpc-and-background-work.md new file mode 100644 index 00000000..3976dabd --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/references/realtime-grpc-and-background-work.md @@ -0,0 +1,58 @@ +# Realtime, gRPC, And Background Work + +Primary docs: +- https://learn.microsoft.com/aspnet/core/signalr/introduction +- https://learn.microsoft.com/aspnet/core/grpc/ +- https://learn.microsoft.com/aspnet/core/fundamentals/host/hosted-services + +## SignalR + +Use SignalR when the server must push updates to connected clients in near real time. + +Good fits: + +- chat +- dashboards +- notifications +- collaborative editing +- live status streams + +Guidance: + +- model the hub as a communication boundary, not the home of business logic +- use groups and user targeting deliberately +- authenticate connections when data is user-specific +- plan for scale-out if the app may run on multiple instances + +Remember that Blazor interactive server rendering already relies on a real-time connection. Do not add a second realtime channel unless the feature truly needs one. + +## gRPC + +Use gRPC for efficient service-to-service communication, strongly typed contracts, and streaming over HTTP/2. + +Prefer gRPC when: + +- both ends are under your control +- performance and contract fidelity matter +- streaming is a first-class requirement + +Guidance: + +- keep `.proto` contracts versioned and stable +- generate client and server types from contracts +- keep auth, logging, and DI integrated with the host +- account for browser interoperability differences before choosing gRPC for public browser clients + +## Background Work + +Use `IHostedService` or `BackgroundService` for in-process background tasks tied to the application host. + +Defaults: + +- keep background services small and observable +- create scopes for scoped dependencies +- do not capture scoped services directly in singleton hosted services +- respect cancellation tokens +- avoid long blocking startup paths + +If the work is durable, high-volume, or business-critical, consider whether it belongs in an out-of-process queue or worker instead of only inside the web host. diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/references/security-and-identity.md b/plugins/skill-hub/.agents/skills/aspnet-core/references/security-and-identity.md new file mode 100644 index 00000000..f7f7da11 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/references/security-and-identity.md @@ -0,0 +1,75 @@ +# Security And Identity + +Primary docs: +- https://learn.microsoft.com/aspnet/core/security/ +- https://learn.microsoft.com/aspnet/core/security/authentication/identity +- https://learn.microsoft.com/aspnet/core/security/authorization/introduction + +## Security Defaults + +- Use the most secure authentication flow available +- Keep secrets out of source code and plain configuration files +- Use Secret Manager in development +- Use a secure production secret store +- Enforce HTTPS +- Apply least privilege to users, services, and data access + +## Authentication And Authorization + +Authentication answers who the user or caller is. Authorization answers what they can do. + +Default pipeline order: + +1. `UseAuthentication()` +2. `UseAuthorization()` + +Apply authorization at boundaries: + +- `[Authorize]` on controllers, actions, page models, or hubs +- `RequireAuthorization()` on endpoints and route groups +- policies for reusable rules +- roles only when role-based checks are actually the right abstraction + +Use `AllowAnonymous` sparingly and intentionally. + +## Identity + +Use ASP.NET Core Identity when the app needs first-party user accounts, login flows, password management, email confirmation, MFA, or related account management. + +Useful starting points: + +- `dotnet new webapp -au Individual` +- `dotnet new mvc -au Individual` + +Identity guidance: + +- scaffold only the pages you truly need to customize +- keep Identity UI updates maintainable; full scaffolding increases merge and upgrade cost +- use policies and claims for authorization rather than encoding all decisions in page logic +- persist data-protection keys appropriately in multi-instance deployments + +On ASP.NET Core 10, Identity metrics are available for observing auth-related behavior. Use them when the app has meaningful authentication traffic or security monitoring requirements. + +## CSRF, CORS, And Browser Security + +- Use antiforgery protection for cookie-based interactive apps and form posts +- Do not confuse CORS with authentication or authorization +- Avoid permissive `AllowAnyOrigin` plus credentials combinations +- Treat browser-side state as untrusted + +## HTTPS, HSTS, And Forwarded Headers + +- redirect HTTP to HTTPS +- enable HSTS outside development when appropriate +- configure forwarded headers correctly when behind proxies or load balancers +- do not generate links or evaluate scheme-sensitive behavior before proxy headers are processed + +## Data Protection And Secrets + +- persist data-protection keys outside ephemeral local storage when the app runs on multiple instances +- do not use environment variables as the preferred long-term home for production secrets when a stronger secret store is available +- never check production credentials into source control + +## Blazor Note + +For Blazor apps, read the general ASP.NET Core security guidance first and then the Blazor-specific security docs. Some Blazor security guidance adds to or supersedes the general guidance. diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/references/source-map.md b/plugins/skill-hub/.agents/skills/aspnet-core/references/source-map.md new file mode 100644 index 00000000..390d63b8 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/references/source-map.md @@ -0,0 +1,43 @@ +# ASP.NET Core Source Map + +This skill is synthesized from the official ASP.NET Core documentation tree and overview pages. Use this file to map a task to the corresponding Microsoft Learn area before opening deeper docs. + +Core sources: + +- https://learn.microsoft.com/aspnet/core/ +- https://raw.githubusercontent.com/dotnet/AspNetCore.Docs/main/aspnetcore/toc.yml +- https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore + +## Documentation Tree Mapping + +| ASP.NET Core docs area | Use this skill reference first | +| --- | --- | +| Overview, Get started, What's new | `stack-selection.md`, `versioning-and-upgrades.md` | +| Fundamentals | `program-and-pipeline.md` | +| Web apps | `ui-blazor.md`, `ui-razor-pages.md`, `ui-mvc.md` | +| APIs | `apis-minimal-and-controllers.md` | +| Real-time apps | `realtime-grpc-and-background-work.md` | +| Remote Procedure Call apps | `realtime-grpc-and-background-work.md` | +| Servers, Host and deploy | `testing-performance-and-operations.md` | +| Test, Debug, Troubleshoot | `testing-performance-and-operations.md` | +| Data access | `data-state-and-services.md` | +| Security and Identity | `security-and-identity.md` | +| Performance | `testing-performance-and-operations.md` | +| Migration and updates | `versioning-and-upgrades.md` | + +## Areas To Consult Directly On Microsoft Learn + +The following topics are part of the ASP.NET Core documentation tree but are not expanded into their own dedicated reference file here: + +- globalization and localization +- advanced hosting and YARP details +- debugger and diagnostics tooling specifics +- narrow API-reference pages for individual types + +When a task is dominated by one of those areas, go straight to the matching Microsoft Learn section after checking the reference files in this skill. + +## Practical Deep-Dive Rule + +- Start with the focused reference in this skill +- If the task depends on a narrow platform detail, open the matching Learn article +- If the task depends on version-specific behavior, confirm the correct moniker or breaking-changes page diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/references/stack-selection.md b/plugins/skill-hub/.agents/skills/aspnet-core/references/stack-selection.md new file mode 100644 index 00000000..46473df1 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/references/stack-selection.md @@ -0,0 +1,63 @@ +# Stack Selection + +Primary docs: +- https://learn.microsoft.com/aspnet/core/ +- https://learn.microsoft.com/aspnet/core/blazor/ +- https://learn.microsoft.com/aspnet/core/razor-pages/ +- https://learn.microsoft.com/aspnet/core/mvc/overview +- https://learn.microsoft.com/aspnet/core/web-api/ +- https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis + +## Default Version Choice + +- Prefer the latest stable .NET and ASP.NET Core for new production work. +- As of March 2026, that means `net10.0` unless the repository or user request says otherwise. +- Treat ASP.NET Core 11 as preview. Do not adopt preview APIs by default. +- If the repository already targets `net8.0`, `net9.0`, or another framework, stay within that target unless the task is explicitly an upgrade. + +## Template Short Names + +The current .NET 10 SDK templates include: + +- `dotnet new blazor` +- `dotnet new webapp` +- `dotnet new mvc` +- `dotnet new webapi` +- `dotnet new webapiaot` +- `dotnet new grpc` +- `dotnet new web` +- `dotnet new razorclasslib` + +Verify template names with `dotnet new list` if the environment differs. + +## Application Model Matrix + +| Model | Prefer when | Watch out for | Typical starting point | +| --- | --- | --- | --- | +| Blazor Web App | Build full-stack .NET UI with SSR plus optional interactivity | Interactive server needs a live connection; WebAssembly increases payload size | `dotnet new blazor` | +| Razor Pages | Build page-focused CRUD, forms, dashboards, and line-of-business apps | Authorization cannot be applied per page handler; use MVC if handler-level control matters | `dotnet new webapp` | +| MVC | Build large server-rendered apps with clear controller/view separation, filters, and action-based patterns | More ceremony than Razor Pages for simple page flows | `dotnet new mvc` | +| Minimal APIs | Build focused HTTP APIs, internal services, lightweight backends, and small surface areas | Route handlers can become hard to manage if business logic or metadata grows without structure | `dotnet new webapi` or `dotnet new web` | +| Controller-based Web API | Build APIs that benefit from `[ApiController]`, content negotiation, filters, formatters, and mature controller conventions | More ceremony than Minimal APIs for small endpoints | `dotnet new webapi` | +| SignalR | Add server push, live updates, chat, collaborative UI, or notifications | Requires connection lifecycle management and scale-out planning | Add to an existing ASP.NET Core app | +| gRPC | Build service-to-service or streaming RPC over HTTP/2 | Browser support is different from ordinary JSON APIs; use gRPC-Web only when needed | `dotnet new grpc` | + +## Fast Heuristics + +- Choose Blazor Web App when the UI itself should be a .NET component model. +- Choose Razor Pages when the app is mostly page and form oriented. +- Choose MVC when actions, views, filters, and controller conventions are the center of the design. +- Choose Minimal APIs first for small to medium HTTP services. +- Switch to controllers when the API needs richer attribute-driven behavior, custom formatters, or strong alignment with existing MVC/Web API conventions. +- Keep the current app model in an existing codebase unless the mismatch is causing real complexity. + +## Mixed-Model Guidance + +ASP.NET Core can mix models in one host. Common combinations: + +- Razor Pages or MVC for server-rendered UI plus Minimal APIs for AJAX or mobile endpoints +- Blazor Web App plus Minimal APIs for external integration endpoints +- MVC or Razor Pages plus SignalR for live updates +- Web API plus gRPC for internal service-to-service calls + +Mix models only when it simplifies the public surface. Do not add a second app model just because ASP.NET Core allows it. diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/references/testing-performance-and-operations.md b/plugins/skill-hub/.agents/skills/aspnet-core/references/testing-performance-and-operations.md new file mode 100644 index 00000000..6e27c0eb --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/references/testing-performance-and-operations.md @@ -0,0 +1,92 @@ +# Testing, Performance, And Operations + +Primary docs: +- https://learn.microsoft.com/aspnet/core/test/integration-tests +- https://learn.microsoft.com/aspnet/core/host-and-deploy/ +- https://learn.microsoft.com/aspnet/core/host-and-deploy/health-checks +- https://learn.microsoft.com/aspnet/core/performance/ + +## Testing Strategy + +Use layered testing instead of relying on one style: + +- unit tests for pure services and business logic +- integration tests for request pipeline, DI, database, auth, and framework wiring +- browser tests for end-to-end user flows + +## Integration Tests + +Use `Microsoft.AspNetCore.Mvc.Testing` and `WebApplicationFactory` for integration tests. + +Guidance from the official docs: + +- use a test host and `HttpClient` +- replace services with test doubles when needed +- control redirects when asserting auth behavior +- handle antiforgery correctly for form posts +- prefer SQLite in-memory over the EF Core in-memory provider for more realistic database tests + +For SPA or browser-driven scenarios, Microsoft recommends browser automation such as Playwright for .NET. + +## Performance Defaults + +Reach for built-in features before custom optimization layers: + +- output caching +- response caching where appropriate +- response compression +- HTTP request timeouts +- rate limiting +- static file handling + +General performance guidance: + +- measure first +- keep database and network round trips visible +- reduce payload size +- use streaming or pagination when data is large +- keep synchronous blocking out of hot paths + +## Health Checks And Observability + +Add health checks for dependencies that matter operationally. + +Use separate checks or tags when you need: + +- liveness +- readiness +- dependency-specific health surfaces + +Also ensure: + +- structured logs +- request tracing where applicable +- metrics for critical paths such as auth, API latency, and background work + +## Hosting And Deployment + +Typical deployment flow: + +1. `dotnet publish` +2. deploy the publish output +3. run behind a process manager +4. place a reverse proxy in front when the environment requires it + +Know the deployment environment: + +- IIS or Windows Service on Windows +- Kestrel plus Nginx or another reverse proxy on Linux +- container hosting when the platform expects it + +Behind proxies or load balancers: + +- configure forwarded headers +- validate scheme, host, and remote IP behavior +- test auth redirects and callback URLs in the deployed topology + +## Operational Safeguards + +- add health checks for databases and critical external services +- fail fast on invalid configuration where possible +- keep secrets out of publish artifacts +- verify data-protection key persistence in multi-instance deployments diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/references/ui-blazor.md b/plugins/skill-hub/.agents/skills/aspnet-core/references/ui-blazor.md new file mode 100644 index 00000000..d7b58610 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/references/ui-blazor.md @@ -0,0 +1,53 @@ +# Blazor + +Primary docs: +- https://learn.microsoft.com/aspnet/core/blazor/ +- https://learn.microsoft.com/aspnet/core/blazor/fundamentals/ +- https://learn.microsoft.com/aspnet/core/blazor/security/ + +## Choose Blazor Deliberately + +Prefer Blazor when the UI itself should be built as reusable .NET components and the team wants a full-stack .NET model. + +Current guidance centers on the Blazor Web App model, which can combine: + +- static SSR for fast first render +- interactive server rendering +- interactive WebAssembly rendering +- per-component render mode choices + +Use standalone Blazor WebAssembly only when the app is intentionally client-heavy or must run as static files without a server-rendered host. + +## Render Mode Heuristics + +- Start with static SSR when the page is mostly read-only and fast first paint matters +- Use interactive server rendering when you want rich interactivity without shipping the full .NET runtime to the browser +- Use interactive WebAssembly when offline capability, client-side execution, or browser-local compute is the point +- Mix render modes only when the split is clear and justified + +## Component Patterns + +- Keep components focused and composable +- Move data access and business rules into injected services +- Pass data through parameters, not hidden global state +- Use forms and validation with Blazor's built-in editing and validation components +- Prefer shared Razor Class Libraries for reusable component sets + +## Data And Interactivity + +- Use DI in components with restraint; avoid turning components into service locators +- Treat JS interop as an edge mechanism for browser APIs or third-party libraries, not the primary application model +- Keep long-running work off the UI event path +- Be deliberate about prerendering, streaming rendering, and enhanced navigation when they improve perceived performance + +## Security Notes + +- Follow the general ASP.NET Core security guidance first, then load the Blazor-specific docs for details that supersede it +- Remember that client-side code and browser state are not trusted +- Keep secrets and privileged operations on the server +- Use authorization-aware UI only as a convenience layer; enforce rules on the server as well + +## When Not To Use Blazor + +- Do not force Blazor onto a mostly conventional server-rendered app that already fits Razor Pages or MVC well +- Do not choose WebAssembly by default for small interaction needs that SSR or interactive server rendering handles more simply diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/references/ui-mvc.md b/plugins/skill-hub/.agents/skills/aspnet-core/references/ui-mvc.md new file mode 100644 index 00000000..2d52a01e --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/references/ui-mvc.md @@ -0,0 +1,56 @@ +# MVC + +Primary docs: +- https://learn.microsoft.com/aspnet/core/mvc/overview +- https://learn.microsoft.com/aspnet/core/mvc/controllers/ +- https://learn.microsoft.com/aspnet/core/mvc/views/ + +## Choose MVC When Actions And Views Matter + +Prefer MVC when the application benefits from explicit controllers, action-based routing, filters, view models, and a strong separation between orchestration and presentation. + +This is often the right fit for: + +- large server-rendered sites +- applications with many cross-cutting filters or action conventions +- applications that mix views and APIs in the same controller layer +- teams already organized around controllers and views + +## Core Shape + +Enable MVC with views using: + +- `builder.Services.AddControllersWithViews();` +- `app.MapControllerRoute(...)` + +Keep views focused on presentation. Keep controllers focused on HTTP orchestration. Put business rules in services. + +## Controller Guidance + +- Derive from `Controller` when the controller returns views +- Keep actions small and explicit +- Use model binding and validation instead of manual request parsing +- Return view models, not EF entities, to views +- Use POST-Redirect-GET for form submissions + +## View Guidance + +- Use layouts, partial views, and Tag Helpers to keep markup consistent +- Keep complex display logic out of Razor markup when it becomes hard to follow +- Use strongly typed view models +- Avoid coupling views directly to persistence models + +## Structure And Scale + +- Use areas for large bounded sections such as Admin or BackOffice +- Keep route conventions explicit +- Apply filters when behavior truly belongs at the MVC layer +- Avoid giant god controllers; split by cohesive feature or resource + +## Choosing MVC Over Razor Pages + +Prefer MVC over Razor Pages when: + +- multiple related actions share controller-level behavior +- handler-level authorization or action filters matter +- URL and action design are more natural than page-file routing diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/references/ui-razor-pages.md b/plugins/skill-hub/.agents/skills/aspnet-core/references/ui-razor-pages.md new file mode 100644 index 00000000..f111acb6 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/references/ui-razor-pages.md @@ -0,0 +1,55 @@ +# Razor Pages + +Primary docs: +- https://learn.microsoft.com/aspnet/core/razor-pages/ +- https://learn.microsoft.com/aspnet/core/tutorials/razor-pages/ + +## Choose Razor Pages For Page-Centered Apps + +Prefer Razor Pages when requests naturally map to pages, forms, and page-level handlers. This is a strong default for internal tools, CRUD apps, account flows, and admin surfaces. + +## Core Shape + +Enable Razor Pages with: + +- `builder.Services.AddRazorPages();` +- `app.MapRazorPages();` + +Use the `@page` directive to turn a `.cshtml` file into an endpoint. Keep request logic in the paired `PageModel` class when the page is more than trivial. + +## Routing Model + +- File system location defines the route by default +- `Pages/Index.cshtml` maps to `/` +- `Pages/Store/Index.cshtml` maps to `/Store` +- Keep folder structure meaningful because it becomes the URL structure + +## PageModel Guidance + +- Use `OnGet`, `OnPost`, and named handlers for request processing +- Use bindable properties and model validation for forms +- Keep page models thin; move business logic into injected services +- Use Tag Helpers and model binding instead of manual request parsing + +## Good Fits + +- form-heavy workflows +- dashboards and back-office applications +- simple content with server-side validation +- applications where a page is the primary navigation unit + +## Key Limitation + +Do not rely on per-handler authorization with Razor Pages. Microsoft explicitly recommends using MVC controllers when different handlers on the same logical surface need different authorization behavior. + +Preferred responses to that limitation: + +- split the handlers into separate pages +- move the surface to MVC if action-level authorization is a better fit + +## Organizational Guidance + +- Group related pages into folders +- Use partial views for repeated fragments +- Use areas only when the application has clear bounded sections +- Keep shared layout and page conventions centralized diff --git a/plugins/skill-hub/.agents/skills/aspnet-core/references/versioning-and-upgrades.md b/plugins/skill-hub/.agents/skills/aspnet-core/references/versioning-and-upgrades.md new file mode 100644 index 00000000..3b93275d --- /dev/null +++ b/plugins/skill-hub/.agents/skills/aspnet-core/references/versioning-and-upgrades.md @@ -0,0 +1,51 @@ +# Versioning And Upgrades + +Primary docs: +- https://learn.microsoft.com/aspnet/core/release-notes/ +- https://learn.microsoft.com/aspnet/core/release-notes/aspnetcore-10.0 +- https://learn.microsoft.com/aspnet/core/release-notes/aspnetcore-9.0 +- https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/breaking-changes + +## Versioning Default + +- For new production apps in March 2026, prefer `net10.0` +- For existing apps, match the repository's target framework unless the task is explicitly an upgrade +- Before using a new API, confirm it exists in the target framework + +## Upgrade Workflow + +1. Identify the current target framework and SDK +2. Read the "What's new" and breaking-changes pages for each version hop +3. Compile and resolve obsoletions intentionally +4. Re-run integration tests and auth flows +5. Re-test deployment-specific behavior such as proxies, cookies, and static assets + +## High-Value Breaking-Change Checks + +When moving to ASP.NET Core 10, watch for: + +- cookie login redirects disabled for known API endpoints +- `WithOpenApi` deprecation +- `WebHostBuilder`, `IWebHost`, and `WebHost` obsolescence +- Razor runtime compilation obsolescence + +When moving to ASP.NET Core 9, watch for: + +- `ValidateOnBuild` and `ValidateScopes` enabled in development when using `HostBuilder` +- middleware constructor expectations and DI validation changes + +When moving to ASP.NET Core 8, watch for: + +- Minimal API `IFormFile` antiforgery requirements +- `AddRateLimiter()` and `AddHttpLogging()` requirements when corresponding middleware is used + +## Migration Principles + +- Prefer migration to the modern hosting model when touching startup extensively +- Remove compatibility shims only after tests confirm behavior +- Avoid mixing new framework idioms with old startup architecture in a half-migrated state +- Keep one authoritative target framework in project files unless multi-targeting is deliberate + +## Preview Feature Rule + +Do not introduce preview-only APIs or docs guidance unless the user explicitly asks for preview adoption or the repository is already on preview SDKs. diff --git a/plugins/skill-hub/.agents/skills/design-taste-frontend-v1/SKILL.md b/plugins/skill-hub/.agents/skills/design-taste-frontend-v1/SKILL.md new file mode 100644 index 00000000..4054982c --- /dev/null +++ b/plugins/skill-hub/.agents/skills/design-taste-frontend-v1/SKILL.md @@ -0,0 +1,226 @@ +--- +name: design-taste-frontend-v1 +description: The original v1 taste-skill, preserved for projects depending on its exact behavior. The current default is `design-taste-frontend` (v2 experimental), which is a substantial rewrite. Use this v1 install name only if you need exact backward compatibility. +--- + +# High-Agency Frontend Skill + +## 1. ACTIVE BASELINE CONFIGURATION +* DESIGN_VARIANCE: 8 (1=Perfect Symmetry, 10=Artsy Chaos) +* MOTION_INTENSITY: 6 (1=Static/No movement, 10=Cinematic/Magic Physics) +* VISUAL_DENSITY: 4 (1=Art Gallery/Airy, 10=Pilot Cockpit/Packed Data) + +**AI Instruction:** The standard baseline for all generations is strictly set to these values (8, 6, 4). Do not ask the user to edit this file. Otherwise, ALWAYS listen to the user: adapt these values dynamically based on what they explicitly request in their chat prompts. Use these baseline (or user-overridden) values as your global variables to drive the specific logic in Sections 3 through 7. + +## 2. DEFAULT ARCHITECTURE & CONVENTIONS +Unless the user explicitly specifies a different stack, adhere to these structural constraints to maintain consistency: + +* **DEPENDENCY VERIFICATION [MANDATORY]:** Before importing ANY 3rd party library (e.g. `framer-motion`, `lucide-react`, `zustand`), you MUST check `package.json`. If the package is missing, you MUST output the installation command (e.g. `npm install package-name`) before providing the code. **Never** assume a library exists. +* **Framework & Interactivity:** React or Next.js. Default to Server Components (`RSC`). + * **RSC SAFETY:** Global state works ONLY in Client Components. In Next.js, wrap providers in a `"use client"` component. + * **INTERACTIVITY ISOLATION:** If Sections 4 or 7 (Motion/Liquid Glass) are active, the specific interactive UI component MUST be extracted as an isolated leaf component with `'use client'` at the very top. Server Components must exclusively render static layouts. +* **State Management:** Use local `useState`/`useReducer` for isolated UI. Use global state strictly for deep prop-drilling avoidance. +* **Styling Policy:** Use Tailwind CSS (v3/v4) for 90% of styling. + * **TAILWIND VERSION LOCK:** Check `package.json` first. Do not use v4 syntax in v3 projects. + * **T4 CONFIG GUARD:** For v4, do NOT use `tailwindcss` plugin in `postcss.config.js`. Use `@tailwindcss/postcss` or the Vite plugin. +* **ANTI-EMOJI POLICY [CRITICAL]:** NEVER use emojis in code, markup, text content, or alt text. Replace symbols with high-quality icons (Radix, Phosphor) or clean SVG primitives. Emojis are BANNED. +* **Responsiveness & Spacing:** + * Standardize breakpoints (`sm`, `md`, `lg`, `xl`). + * Contain page layouts using `max-w-[1400px] mx-auto` or `max-w-7xl`. + * **Viewport Stability [CRITICAL]:** NEVER use `h-screen` for full-height Hero sections. ALWAYS use `min-h-[100dvh]` to prevent catastrophic layout jumping on mobile browsers (iOS Safari). + * **Grid over Flex-Math:** NEVER use complex flexbox percentage math (`w-[calc(33%-1rem)]`). ALWAYS use CSS Grid (`grid grid-cols-1 md:grid-cols-3 gap-6`) for reliable structures. +* **Icons:** You MUST use exactly `@phosphor-icons/react` or `@radix-ui/react-icons` as the import paths (check installed version). Standardize `strokeWidth` globally (e.g., exclusively use `1.5` or `2.0`). + + +## 3. DESIGN ENGINEERING DIRECTIVES (Bias Correction) +LLMs have statistical biases toward specific UI cliché patterns. Proactively construct premium interfaces using these engineered rules: + +**Rule 1: Deterministic Typography** +* **Display/Headlines:** Default to `text-4xl md:text-6xl tracking-tighter leading-none`. + * **ANTI-SLOP:** Discourage `Inter` for "Premium" or "Creative" vibes. Force unique character using `Geist`, `Outfit`, `Cabinet Grotesk`, or `Satoshi`. + * **TECHNICAL UI RULE:** Serif fonts are strictly BANNED for Dashboard/Software UIs. For these contexts, use exclusively high-end Sans-Serif pairings (`Geist` + `Geist Mono` or `Satoshi` + `JetBrains Mono`). +* **Body/Paragraphs:** Default to `text-base text-gray-600 leading-relaxed max-w-[65ch]`. + +**Rule 2: Color Calibration** +* **Constraint:** Max 1 Accent Color. Saturation < 80%. +* **THE LILA BAN:** The "AI Purple/Blue" aesthetic is strictly BANNED. No purple button glows, no neon gradients. Use absolute neutral bases (Zinc/Slate) with high-contrast, singular accents (e.g. Emerald, Electric Blue, or Deep Rose). +* **COLOR CONSISTENCY:** Stick to one palette for the entire output. Do not fluctuate between warm and cool grays within the same project. + +**Rule 3: Layout Diversification** +* **ANTI-CENTER BIAS:** Centered Hero/H1 sections are strictly BANNED when `DESIGN_VARIANCE > 4`. Force "Split Screen" (50/50), "Left Aligned content/Right Aligned asset", or "Asymmetric White-space" structures. + +**Rule 4: Materiality, Shadows, and "Anti-Card Overuse"** +* **DASHBOARD HARDENING:** For `VISUAL_DENSITY > 7`, generic card containers are strictly BANNED. Use logic-grouping via `border-t`, `divide-y`, or purely negative space. Data metrics should breathe without being boxed in unless elevation (z-index) is functionally required. +* **Execution:** Use cards ONLY when elevation communicates hierarchy. When a shadow is used, tint it to the background hue. + +**Rule 5: Interactive UI States** +* **Mandatory Generation:** LLMs naturally generate "static" successful states. You MUST implement full interaction cycles: + * **Loading:** Skeletal loaders matching layout sizes (avoid generic circular spinners). + * **Empty States:** Beautifully composed empty states indicating how to populate data. + * **Error States:** Clear, inline error reporting (e.g., forms). + * **Tactile Feedback:** On `:active`, use `-translate-y-[1px]` or `scale-[0.98]` to simulate a physical push indicating success/action. + +**Rule 6: Data & Form Patterns** +* **Forms:** Label MUST sit above input. Helper text is optional but should exist in markup. Error text below input. Use a standard `gap-2` for input blocks. + +## 4. CREATIVE PROACTIVITY (Anti-Slop Implementation) +To actively combat generic AI designs, systematically implement these high-end coding concepts as your baseline: +* **"Liquid Glass" Refraction:** When glassmorphism is needed, go beyond `backdrop-blur`. Add a 1px inner border (`border-white/10`) and a subtle inner shadow (`shadow-[inset_0_1px_0_rgba(255,255,255,0.1)]`) to simulate physical edge refraction. +* **Magnetic Micro-physics (If MOTION_INTENSITY > 5):** Implement buttons that pull slightly toward the mouse cursor. **CRITICAL:** NEVER use React `useState` for magnetic hover or continuous animations. Use EXCLUSIVELY Framer Motion's `useMotionValue` and `useTransform` outside the React render cycle to prevent performance collapse on mobile. +* **Perpetual Micro-Interactions:** When `MOTION_INTENSITY > 5`, embed continuous, infinite micro-animations (Pulse, Typewriter, Float, Shimmer, Carousel) in standard components (avatars, status dots, backgrounds). Apply premium Spring Physics (`type: "spring", stiffness: 100, damping: 20`) to all interactive elements—no linear easing. +* **Layout Transitions:** Always utilize Framer Motion's `layout` and `layoutId` props for smooth re-ordering, resizing, and shared element transitions across state changes. +* **Staggered Orchestration:** Do not mount lists or grids instantly. Use `staggerChildren` (Framer) or CSS cascade (`animation-delay: calc(var(--index) * 100ms)`) to create sequential waterfall reveals. **CRITICAL:** For `staggerChildren`, the Parent (`variants`) and Children MUST reside in the identical Client Component tree. If data is fetched asynchronously, pass the data as props into a centralized Parent Motion wrapper. + +## 5. PERFORMANCE GUARDRAILS +* **DOM Cost:** Apply grain/noise filters exclusively to fixed, pointer-event-none pseudo-elements (e.g., `fixed inset-0 z-50 pointer-events-none`) and NEVER to scrolling containers to prevent continuous GPU repaints and mobile performance degradation. +* **Hardware Acceleration:** Never animate `top`, `left`, `width`, or `height`. Animate exclusively via `transform` and `opacity`. +* **Z-Index Restraint:** NEVER spam arbitrary `z-50` or `z-10` unprompted. Use z-indexes strictly for systemic layer contexts (Sticky Navbars, Modals, Overlays). + +## 6. TECHNICAL REFERENCE (Dial Definitions) + +### DESIGN_VARIANCE (Level 1-10) +* **1-3 (Predictable):** Flexbox `justify-center`, strict 12-column symmetrical grids, equal paddings. +* **4-7 (Offset):** Use `margin-top: -2rem` overlapping, varied image aspect ratios (e.g., 4:3 next to 16:9), left-aligned headers over center-aligned data. +* **8-10 (Asymmetric):** Masonry layouts, CSS Grid with fractional units (e.g., `grid-template-columns: 2fr 1fr 1fr`), massive empty zones (`padding-left: 20vw`). +* **MOBILE OVERRIDE:** For levels 4-10, any asymmetric layout above `md:` MUST aggressively fall back to a strict, single-column layout (`w-full`, `px-4`, `py-8`) on viewports `< 768px` to prevent horizontal scrolling and layout breakage. + +### MOTION_INTENSITY (Level 1-10) +* **1-3 (Static):** No automatic animations. CSS `:hover` and `:active` states only. +* **4-7 (Fluid CSS):** Use `transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1)`. Use `animation-delay` cascades for load-ins. Focus strictly on `transform` and `opacity`. Use `will-change: transform` sparingly. +* **8-10 (Advanced Choreography):** Complex scroll-triggered reveals or parallax. Use Framer Motion hooks. NEVER use `window.addEventListener('scroll')`. + +### VISUAL_DENSITY (Level 1-10) +* **1-3 (Art Gallery Mode):** Lots of white space. Huge section gaps. Everything feels very expensive and clean. +* **4-7 (Daily App Mode):** Normal spacing for standard web apps. +* **8-10 (Cockpit Mode):** Tiny paddings. No card boxes; just 1px lines to separate data. Everything is packed. **Mandatory:** Use Monospace (`font-mono`) for all numbers. + +## 7. AI TELLS (Forbidden Patterns) +To guarantee a premium, non-generic output, you MUST strictly avoid these common AI design signatures unless explicitly requested: + +### Visual & CSS +* **NO Neon/Outer Glows:** Do not use default `box-shadow` glows or auto-glows. Use inner borders or subtle tinted shadows. +* **NO Pure Black:** Never use `#000000`. Use Off-Black, Zinc-950, or Charcoal. +* **NO Oversaturated Accents:** Desaturate accents to blend elegantly with neutrals. +* **NO Excessive Gradient Text:** Do not use text-fill gradients for large headers. +* **NO Custom Mouse Cursors:** They are outdated and ruin performance/accessibility. + +### Typography +* **NO Inter Font:** Banned. Use `Geist`, `Outfit`, `Cabinet Grotesk`, or `Satoshi`. +* **NO Oversized H1s:** The first heading should not scream. Control hierarchy with weight and color, not just massive scale. +* **Serif Constraints:** Use Serif fonts ONLY for creative/editorial designs. **NEVER** use Serif on clean Dashboards. + +### Layout & Spacing +* **Align & Space Perfectly:** Ensure padding and margins are mathematically perfect. Avoid floating elements with awkward gaps. +* **NO 3-Column Card Layouts:** The generic "3 equal cards horizontally" feature row is BANNED. Use a 2-column Zig-Zag, asymmetric grid, or horizontal scrolling approach instead. + +### Content & Data (The "Jane Doe" Effect) +* **NO Generic Names:** "John Doe", "Sarah Chan", or "Jack Su" are banned. Use highly creative, realistic-sounding names. +* **NO Generic Avatars:** DO NOT use standard SVG "egg" or Lucide user icons for avatars. Use creative, believable photo placeholders or specific styling. +* **NO Fake Numbers:** Avoid predictable outputs like `99.99%`, `50%`, or basic phone numbers (`1234567`). Use organic, messy data (`47.2%`, `+1 (312) 847-1928`). +* **NO Startup Slop Names:** "Acme", "Nexus", "SmartFlow". Invent premium, contextual brand names. +* **NO Filler Words:** Avoid AI copywriting clichés like "Elevate", "Seamless", "Unleash", or "Next-Gen". Use concrete verbs. + +### External Resources & Components +* **NO Broken Unsplash Links:** Do not use Unsplash. Use absolute, reliable placeholders like `https://picsum.photos/seed/{random_string}/800/600` or SVG UI Avatars. +* **shadcn/ui Customization:** You may use `shadcn/ui`, but NEVER in its generic default state. You MUST customize the radii, colors, and shadows to match the high-end project aesthetic. +* **Production-Ready Cleanliness:** Code must be extremely clean, visually striking, memorable, and meticulously refined in every detail. + +## 8. THE CREATIVE ARSENAL (High-End Inspiration) +Do not default to generic UI. Pull from this library of advanced concepts to ensure the output is visually striking and memorable. When appropriate, leverage **GSAP (ScrollTrigger/Parallax)** for complex scrolltelling or **ThreeJS/WebGL** for 3D/Canvas animations, rather than basic CSS motion. **CRITICAL:** Never mix GSAP/ThreeJS with Framer Motion in the same component tree. Default to Framer Motion for UI/Bento interactions. Use GSAP/ThreeJS EXCLUSIVELY for isolated full-page scrolltelling or canvas backgrounds, wrapped in strict useEffect cleanup blocks. + +### The Standard Hero Paradigm +* Stop doing centered text over a dark image. Try asymmetric Hero sections: Text cleanly aligned to the left or right. The background should feature a high-quality, relevant image with a subtle stylistic fade (darkening or lightening gracefully into the background color depending on if it is Light or Dark mode). + +### Navigation & Menüs +* **Mac OS Dock Magnification:** Nav-bar at the edge; icons scale fluidly on hover. +* **Magnetic Button:** Buttons that physically pull toward the cursor. +* **Gooey Menu:** Sub-items detach from the main button like a viscous liquid. +* **Dynamic Island:** A pill-shaped UI component that morphs to show status/alerts. +* **Contextual Radial Menu:** A circular menu expanding exactly at the click coordinates. +* **Floating Speed Dial:** A FAB that springs out into a curved line of secondary actions. +* **Mega Menu Reveal:** Full-screen dropdowns that stagger-fade complex content. + +### Layout & Grids +* **Bento Grid:** Asymmetric, tile-based grouping (e.g., Apple Control Center). +* **Masonry Layout:** Staggered grid without fixed row heights (e.g., Pinterest). +* **Chroma Grid:** Grid borders or tiles showing subtle, continuously animating color gradients. +* **Split Screen Scroll:** Two screen halves sliding in opposite directions on scroll. +* **Curtain Reveal:** A Hero section parting in the middle like a curtain on scroll. + +### Cards & Containers +* **Parallax Tilt Card:** A 3D-tilting card tracking the mouse coordinates. +* **Spotlight Border Card:** Card borders that illuminate dynamically under the cursor. +* **Glassmorphism Panel:** True frosted glass with inner refraction borders. +* **Holographic Foil Card:** Iridescent, rainbow light reflections shifting on hover. +* **Tinder Swipe Stack:** A physical stack of cards the user can swipe away. +* **Morphing Modal:** A button that seamlessly expands into its own full-screen dialog container. + +### Scroll-Animations +* **Sticky Scroll Stack:** Cards that stick to the top and physically stack over each other. +* **Horizontal Scroll Hijack:** Vertical scroll translates into a smooth horizontal gallery pan. +* **Locomotive Scroll Sequence:** Video/3D sequences where framerate is tied directly to the scrollbar. +* **Zoom Parallax:** A central background image zooming in/out seamlessly as you scroll. +* **Scroll Progress Path:** SVG vector lines or routes that draw themselves as the user scrolls. +* **Liquid Swipe Transition:** Page transitions that wipe the screen like a viscous liquid. + +### Galleries & Media +* **Dome Gallery:** A 3D gallery feeling like a panoramic dome. +* **Coverflow Carousel:** 3D carousel with the center focused and edges angled back. +* **Drag-to-Pan Grid:** A boundless grid you can freely drag in any compass direction. +* **Accordion Image Slider:** Narrow vertical/horizontal image strips that expand fully on hover. +* **Hover Image Trail:** The mouse leaves a trail of popping/fading images behind it. +* **Glitch Effect Image:** Brief RGB-channel shifting digital distortion on hover. + +### Typography & Text +* **Kinetic Marquee:** Endless text bands that reverse direction or speed up on scroll. +* **Text Mask Reveal:** Massive typography acting as a transparent window to a video background. +* **Text Scramble Effect:** Matrix-style character decoding on load or hover. +* **Circular Text Path:** Text curved along a spinning circular path. +* **Gradient Stroke Animation:** Outlined text with a gradient continuously running along the stroke. +* **Kinetic Typography Grid:** A grid of letters dodging or rotating away from the cursor. + +### Micro-Interactions & Effects +* **Particle Explosion Button:** CTAs that shatter into particles upon success. +* **Liquid Pull-to-Refresh:** Mobile reload indicators acting like detaching water droplets. +* **Skeleton Shimmer:** Shifting light reflections moving across placeholder boxes. +* **Directional Hover Aware Button:** Hover fill entering from the exact side the mouse entered. +* **Ripple Click Effect:** Visual waves rippling precisely from the click coordinates. +* **Animated SVG Line Drawing:** Vectors that draw their own contours in real-time. +* **Mesh Gradient Background:** Organic, lava-lamp-like animated color blobs. +* **Lens Blur Depth:** Dynamic focus blurring background UI layers to highlight a foreground action. + +## 9. THE "MOTION-ENGINE" BENTO PARADIGM +When generating modern SaaS dashboards or feature sections, you MUST utilize the following "Bento 2.0" architecture and motion philosophy. This goes beyond static cards and enforces a "Vercel-core meets Dribbble-clean" aesthetic heavily reliant on perpetual physics. + +### A. Core Design Philosophy +* **Aesthetic:** High-end, minimal, and functional. +* **Palette:** Background in `#f9fafb`. Cards are pure white (`#ffffff`) with a 1px border of `border-slate-200/50`. +* **Surfaces:** Use `rounded-[2.5rem]` for all major containers. Apply a "diffusion shadow" (a very light, wide-spreading shadow, e.g., `shadow-[0_20px_40px_-15px_rgba(0,0,0,0.05)]`) to create depth without clutter. +* **Typography:** Strict `Geist`, `Satoshi`, or `Cabinet Grotesk` font stack. Use subtle tracking (`tracking-tight`) for headers. +* **Labels:** Titles and descriptions must be placed **outside and below** the cards to maintain a clean, gallery-style presentation. +* **Pixel-Perfection:** Use generous `p-8` or `p-10` padding inside cards. + +### B. The Animation Engine Specs (Perpetual Motion) +All cards must contain **"Perpetual Micro-Interactions."** Use the following Framer Motion principles: +* **Spring Physics:** No linear easing. Use `type: "spring", stiffness: 100, damping: 20` for a premium, weighty feel. +* **Layout Transitions:** Heavily utilize the `layout` and `layoutId` props to ensure smooth re-ordering, resizing, and shared element state transitions. +* **Infinite Loops:** Every card must have an "Active State" that loops infinitely (Pulse, Typewriter, Float, or Carousel) to ensure the dashboard feels "alive". +* **Performance:** Wrap dynamic lists in `` and optimize for 60fps. **PERFORMANCE CRITICAL:** Any perpetual motion or infinite loop MUST be memoized (React.memo) and completely isolated in its own microscopic Client Component. Never trigger re-renders in the parent layout. + +### C. The 5-Card Archetypes (Micro-Animation Specs) +Implement these specific micro-animations when constructing Bento grids (e.g., Row 1: 3 cols | Row 2: 2 cols split 70/30): +1. **The Intelligent List:** A vertical stack of items with an infinite auto-sorting loop. Items swap positions using `layoutId`, simulating an AI prioritizing tasks in real-time. +2. **The Command Input:** A search/AI bar with a multi-step Typewriter Effect. It cycles through complex prompts, including a blinking cursor and a "processing" state with a shimmering loading gradient. +3. **The Live Status:** A scheduling interface with "breathing" status indicators. Include a pop-up notification badge that emerges with an "Overshoot" spring effect, stays for 3 seconds, and vanishes. +4. **The Wide Data Stream:** A horizontal "Infinite Carousel" of data cards or metrics. Ensure the loop is seamless (using `x: ["0%", "-100%"]`) with a speed that feels effortless. +5. **The Contextual UI (Focus Mode):** A document view that animates a staggered highlight of a text block, followed by a "Float-in" of a floating action toolbar with micro-icons. + +## 10. FINAL PRE-FLIGHT CHECK +Evaluate your code against this matrix before outputting. This is the **last** filter you apply to your logic. +- [ ] Is global state used appropriately to avoid deep prop-drilling rather than arbitrarily? +- [ ] Is mobile layout collapse (`w-full`, `px-4`, `max-w-7xl mx-auto`) guaranteed for high-variance designs? +- [ ] Do full-height sections safely use `min-h-[100dvh]` instead of the bugged `h-screen`? +- [ ] Do `useEffect` animations contain strict cleanup functions? +- [ ] Are empty, loading, and error states provided? +- [ ] Are cards omitted in favor of spacing where possible? +- [ ] Did you strictly isolate CPU-heavy perpetual animations in their own Client Components? diff --git a/plugins/skill-hub/.agents/skills/find-skills/SKILL.md b/plugins/skill-hub/.agents/skills/find-skills/SKILL.md new file mode 100644 index 00000000..114c6637 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/find-skills/SKILL.md @@ -0,0 +1,142 @@ +--- +name: find-skills +description: Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill. +--- + +# Find Skills + +This skill helps you discover and install skills from the open agent skills ecosystem. + +## When to Use This Skill + +Use this skill when the user: + +- Asks "how do I do X" where X might be a common task with an existing skill +- Says "find a skill for X" or "is there a skill for X" +- Asks "can you do X" where X is a specialized capability +- Expresses interest in extending agent capabilities +- Wants to search for tools, templates, or workflows +- Mentions they wish they had help with a specific domain (design, testing, deployment, etc.) + +## What is the Skills CLI? + +The Skills CLI (`npx skills`) is the package manager for the open agent skills ecosystem. Skills are modular packages that extend agent capabilities with specialized knowledge, workflows, and tools. + +**Key commands:** + +- `npx skills find [query]` - Search for skills interactively or by keyword +- `npx skills add ` - Install a skill from GitHub or other sources +- `npx skills check` - Check for skill updates +- `npx skills update` - Update all installed skills + +**Browse skills at:** https://skills.sh/ + +## How to Help Users Find Skills + +### Step 1: Understand What They Need + +When a user asks for help with something, identify: + +1. The domain (e.g., React, testing, design, deployment) +2. The specific task (e.g., writing tests, creating animations, reviewing PRs) +3. Whether this is a common enough task that a skill likely exists + +### Step 2: Check the Leaderboard First + +Before running a CLI search, check the [skills.sh leaderboard](https://skills.sh/) to see if a well-known skill already exists for the domain. The leaderboard ranks skills by total installs, surfacing the most popular and battle-tested options. + +For example, top skills for web development include: +- `vercel-labs/agent-skills` — React, Next.js, web design (100K+ installs each) +- `anthropics/skills` — Frontend design, document processing (100K+ installs) + +### Step 3: Search for Skills + +If the leaderboard doesn't cover the user's need, run the find command: + +```bash +npx skills find [query] +``` + +For example: + +- User asks "how do I make my React app faster?" → `npx skills find react performance` +- User asks "can you help me with PR reviews?" → `npx skills find pr review` +- User asks "I need to create a changelog" → `npx skills find changelog` + +### Step 4: Verify Quality Before Recommending + +**Do not recommend a skill based solely on search results.** Always verify: + +1. **Install count** — Prefer skills with 1K+ installs. Be cautious with anything under 100. +2. **Source reputation** — Official sources (`vercel-labs`, `anthropics`, `microsoft`) are more trustworthy than unknown authors. +3. **GitHub stars** — Check the source repository. A skill from a repo with <100 stars should be treated with skepticism. + +### Step 5: Present Options to the User + +When you find relevant skills, present them to the user with: + +1. The skill name and what it does +2. The install count and source +3. The install command they can run +4. A link to learn more at skills.sh + +Example response: + +``` +I found a skill that might help! The "react-best-practices" skill provides +React and Next.js performance optimization guidelines from Vercel Engineering. +(185K installs) + +To install it: +npx skills add vercel-labs/agent-skills@react-best-practices + +Learn more: https://skills.sh/vercel-labs/agent-skills/react-best-practices +``` + +### Step 6: Offer to Install + +If the user wants to proceed, you can install the skill for them: + +```bash +npx skills add -g -y +``` + +The `-g` flag installs globally (user-level) and `-y` skips confirmation prompts. + +## Common Skill Categories + +When searching, consider these common categories: + +| Category | Example Queries | +| --------------- | ---------------------------------------- | +| Web Development | react, nextjs, typescript, css, tailwind | +| Testing | testing, jest, playwright, e2e | +| DevOps | deploy, docker, kubernetes, ci-cd | +| Documentation | docs, readme, changelog, api-docs | +| Code Quality | review, lint, refactor, best-practices | +| Design | ui, ux, design-system, accessibility | +| Productivity | workflow, automation, git | + +## Tips for Effective Searches + +1. **Use specific keywords**: "react testing" is better than just "testing" +2. **Try alternative terms**: If "deploy" doesn't work, try "deployment" or "ci-cd" +3. **Check popular sources**: Many skills come from `vercel-labs/agent-skills` or `ComposioHQ/awesome-claude-skills` + +## When No Skills Are Found + +If no relevant skills exist: + +1. Acknowledge that no existing skill was found +2. Offer to help with the task directly using your general capabilities +3. Suggest the user could create their own skill with `npx skills init` + +Example: + +``` +I searched for skills related to "xyz" but didn't find any matches. +I can still help you with this task directly! Would you like me to proceed? + +If this is something you do often, you could create your own skill: +npx skills init my-xyz-skill +``` diff --git a/plugins/skill-hub/.agents/skills/frontend-design/LICENSE.txt b/plugins/skill-hub/.agents/skills/frontend-design/LICENSE.txt new file mode 100644 index 00000000..f433b1a5 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/frontend-design/LICENSE.txt @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/plugins/skill-hub/.agents/skills/frontend-design/SKILL.md b/plugins/skill-hub/.agents/skills/frontend-design/SKILL.md new file mode 100644 index 00000000..decdff43 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/frontend-design/SKILL.md @@ -0,0 +1,55 @@ +--- +name: frontend-design +description: Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults. +license: Complete terms in LICENSE.txt +--- + +# Frontend Design + +Approach this as the design lead at a small studio known for giving every client a visual identity that could not be mistaken for anyone else's. This client has already rejected proposals that felt templated, and is paying for a distinctive point of view: make deliberate, opinionated choices about palette, typography, and layout that are specific to this brief, and take one real aesthetic risk you can justify. + +## Ground it in the subject + +If the brief does not pin down what the product or subject is, pin it yourself before designing: name one concrete subject, its audience, and the page's single job, and state your choice. If there's any information in your memory about the human's preferences, context about what they're building, or designs you've made before – use that as a hint. The subject's own world, its materials, instruments, artifacts, and vernacular, is where distinctive choices come from. Build with the brief's real content and subject matter throughout. + +## Design principles + +For web designs, the hero is a thesis. Open with the most characteristic thing in the subject's world, in whatever form makes sense for it: a headline, an image, an animation, a live demo, an interactive moment. Be deliberate with your choice: a big number with a small label, supporting stats, and a gradient accent is the template answer, only use if that's truly the best option. + +Typography carries the personality of the page. Pair the display and body faces deliberately, not the same families you would reach for on any other project, and set a clear type scale with intentional weights, widths, and spacing. Make the type treatment itself a memorable part of the design, not a neutral delivery vehicle for the content. + +Structure is information. Structural devices, numbering, eyebrows, dividers, labels, should encode something true about the content, not decorate it. Many generic designs use numbered markers (01 / 02 / 03), but that's only appropriate if the content actually is a sequence - like a real process or a typed timeline where order carries information the reader needs. Question if choices like numbered markers actually make sense before incorporating them. + +Leverage motion deliberately. Think about where and if animation can serve the subject: a page-load sequence, a scroll-triggered reveal, hover micro-interactions, ambient atmosphere. An orchestrated moment usually lands harder than scattered effects; choose what the direction calls for. However, sometimes less is more, and extra animation contributes to the feeling that the design is AI-generated. + +Match complexity to the vision. Maximalist directions need elaborate execution; minimal directions need precision in spacing, type, and detail. Elegance is executing the chosen vision well. + +Consider written content carefully. Often a design brief may not contain real content, and it's up to you to come up with copy. Copy can make a design feel as templated as the design itself. See the below section on writing for more guidance. + +## Process: brainstorm, explore, plan, critique, build, critique again + +For calibration: AI-generated design right now clusters around three looks: (1) a warm cream background (near #F4F1EA) with a high-contrast serif display and a terracotta accent; (2) a near-black background with a single bright acid-green or vermilion accent; (3) a broadsheet-style layout with hairline rules, zero border-radius, and dense newspaper-like columns. All three are legitimate for some briefs, but they are defaults rather than choices, and they appear regardless of subject. Where the brief pins down a visual direction, follow it exactly — the brief's own words always win, including when it asks for one of these looks. Where it leaves an axis free, don't spend that freedom on one of these defaults. Just like a human designer who's hired, there's often a careful balance between doing what you're good at and taking each project as a chance to experiment and learn. + +Work in two passes. First, brainstorm a short design plan based on the human's design brief: create a compact token system with color, type, layout, and signature. Color: describe the palette as 4–6 named hex values. Type: the typefaces for 2+ roles (a characterful display face that's used with restraint, a complementary body face, and a utility face for captions or data if needed). Layout: a layout concept, using one-sentence prose descriptions and ASCII wireframes to ideate and compare. Signature: the single unique element this page will be remembered by that embodies the brief in an appropriate way. + +Then review that plan against the brief before building: if any part of it reads like the generic default you would produce for any similar page (work through a similar prompt to see if you arrive somewhere similar) rather than a choice made for this specific brief — revise that part, say what you changed and why. Only after you've confirmed the relative uniqueness of your design plan should you start to write the code, following the revised plan exactly and deriving every color and type decision from it. + +When writing the code, be careful of structuring your CSS selector specificities. It's easy to generate CSS classes that cancel each other out (especially with a type-based selector like .section and a element-based selector like .cta). This can happen often with paddings/margins between sections. + +Try to do a lot of this planning and iteration in your thinking, and only show ideas to the user when you have higher confidence it'll delight them. + +## Restraint and self-critique + +Spend your boldness in one place. Let the signature element be the one memorable thing, keep everything around it quiet and disciplined, and cut any decoration that does not serve the brief. Not taking a risk can be a risk itself! Build to a quality floor without announcing it: responsive down to mobile, visible keyboard focus, reduced motion respected. Critique your own work as you build, taking screenshots if your environment supports it – a picture is worth 1000 tokens. Consider Chanel's advice: before leaving the house, take a look in the mirror and remove one accessory. Human creators have memory and always try to do something new, so if you have a space to quickly jot down notes about what you've tried, it can help you in future passes. + +## More on writing in design + +Words appear in a design for one reason: to make it easier to understand, and therefore easier to use. They are design material, not decoration. Bring the same intentionality to copy that you would bring to spacing and color. Before writing anything, ask what the design needs to say, and how it can best be said to help the person navigate the experience. + +Write from the end user's side of the screen. Name things by what people control and recognize, never by how the system is built. A person manages notifications, not webhook config. Describe what something does in plain terms rather than selling it. Being specific is always better than being clever. + +Use active voice as default. A control should say exactly what happens when it's used: "Save changes," not "Submit." An action keeps the same name through the whole flow, so the button that says "Publish" produces a toast that says "Published." The vocabulary of an interface is the signposting for someone navigating the product. Cohesion and consistency are how people learn their way around. + +Treat failure and emptiness as moments for direction, not mood. Explain what went wrong and how to fix it, in the interface's voice rather than a person's. Errors don't apologize, and they are never vague about what happened. An empty screen is an invitation to act. + +Keep the register conversational and tuned: plain verbs, sentence case, no filler, with tone matched to the brand and the audience. Let each element do exactly one job. A label labels, an example demonstrates, and nothing quietly does double duty. diff --git a/plugins/skill-hub/.agents/skills/theme-factory/LICENSE.txt b/plugins/skill-hub/.agents/skills/theme-factory/LICENSE.txt new file mode 100644 index 00000000..4f881c52 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/theme-factory/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 Anthropic, PBC. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/plugins/skill-hub/.agents/skills/theme-factory/SKILL.md b/plugins/skill-hub/.agents/skills/theme-factory/SKILL.md new file mode 100644 index 00000000..90dfceaf --- /dev/null +++ b/plugins/skill-hub/.agents/skills/theme-factory/SKILL.md @@ -0,0 +1,59 @@ +--- +name: theme-factory +description: Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly. +license: Complete terms in LICENSE.txt +--- + + +# Theme Factory Skill + +This skill provides a curated collection of professional font and color themes themes, each with carefully selected color palettes and font pairings. Once a theme is chosen, it can be applied to any artifact. + +## Purpose + +To apply consistent, professional styling to presentation slide decks, use this skill. Each theme includes: +- A cohesive color palette with hex codes +- Complementary font pairings for headers and body text +- A distinct visual identity suitable for different contexts and audiences + +## Usage Instructions + +To apply styling to a slide deck or other artifact: + +1. **Show the theme showcase**: Display the `theme-showcase.pdf` file to allow users to see all available themes visually. Do not make any modifications to it; simply show the file for viewing. +2. **Ask for their choice**: Ask which theme to apply to the deck +3. **Wait for selection**: Get explicit confirmation about the chosen theme +4. **Apply the theme**: Once a theme has been chosen, apply the selected theme's colors and fonts to the deck/artifact + +## Themes Available + +The following 10 themes are available, each showcased in `theme-showcase.pdf`: + +1. **Ocean Depths** - Professional and calming maritime theme +2. **Sunset Boulevard** - Warm and vibrant sunset colors +3. **Forest Canopy** - Natural and grounded earth tones +4. **Modern Minimalist** - Clean and contemporary grayscale +5. **Golden Hour** - Rich and warm autumnal palette +6. **Arctic Frost** - Cool and crisp winter-inspired theme +7. **Desert Rose** - Soft and sophisticated dusty tones +8. **Tech Innovation** - Bold and modern tech aesthetic +9. **Botanical Garden** - Fresh and organic garden colors +10. **Midnight Galaxy** - Dramatic and cosmic deep tones + +## Theme Details + +Each theme is defined in the `themes/` directory with complete specifications including: +- Cohesive color palette with hex codes +- Complementary font pairings for headers and body text +- Distinct visual identity suitable for different contexts and audiences + +## Application Process + +After a preferred theme is selected: +1. Read the corresponding theme file from the `themes/` directory +2. Apply the specified colors and fonts consistently throughout the deck +3. Ensure proper contrast and readability +4. Maintain the theme's visual identity across all slides + +## Create your Own Theme +To handle cases where none of the existing themes work for an artifact, create a custom theme. Based on provided inputs, generate a new theme similar to the ones above. Give the theme a similar name describing what the font/color combinations represent. Use any basic description provided to choose appropriate colors/fonts. After generating the theme, show it for review and verification. Following that, apply the theme as described above. diff --git a/plugins/skill-hub/.agents/skills/theme-factory/theme-showcase.pdf b/plugins/skill-hub/.agents/skills/theme-factory/theme-showcase.pdf new file mode 100644 index 00000000..24495d14 Binary files /dev/null and b/plugins/skill-hub/.agents/skills/theme-factory/theme-showcase.pdf differ diff --git a/plugins/skill-hub/.agents/skills/theme-factory/themes/botanical-garden.md b/plugins/skill-hub/.agents/skills/theme-factory/themes/botanical-garden.md new file mode 100644 index 00000000..0c95bf73 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/theme-factory/themes/botanical-garden.md @@ -0,0 +1,19 @@ +# Botanical Garden + +A fresh and organic theme featuring vibrant garden-inspired colors for lively presentations. + +## Color Palette + +- **Fern Green**: `#4a7c59` - Rich natural green +- **Marigold**: `#f9a620` - Bright floral accent +- **Terracotta**: `#b7472a` - Earthy warm tone +- **Cream**: `#f5f3ed` - Soft neutral backgrounds + +## Typography + +- **Headers**: DejaVu Serif Bold +- **Body Text**: DejaVu Sans + +## Best Used For + +Garden centers, food presentations, farm-to-table content, botanical brands, natural products. diff --git a/plugins/skill-hub/.agents/skills/theme-factory/themes/forest-canopy.md b/plugins/skill-hub/.agents/skills/theme-factory/themes/forest-canopy.md new file mode 100644 index 00000000..90c2b265 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/theme-factory/themes/forest-canopy.md @@ -0,0 +1,19 @@ +# Forest Canopy + +A natural and grounded theme featuring earth tones inspired by dense forest environments. + +## Color Palette + +- **Forest Green**: `#2d4a2b` - Primary dark green +- **Sage**: `#7d8471` - Muted green accent +- **Olive**: `#a4ac86` - Light accent color +- **Ivory**: `#faf9f6` - Backgrounds and text + +## Typography + +- **Headers**: FreeSerif Bold +- **Body Text**: FreeSans + +## Best Used For + +Environmental presentations, sustainability reports, outdoor brands, wellness content, organic products. diff --git a/plugins/skill-hub/.agents/skills/theme-factory/themes/golden-hour.md b/plugins/skill-hub/.agents/skills/theme-factory/themes/golden-hour.md new file mode 100644 index 00000000..ed8fc256 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/theme-factory/themes/golden-hour.md @@ -0,0 +1,19 @@ +# Golden Hour + +A rich and warm autumnal palette that creates an inviting and sophisticated atmosphere. + +## Color Palette + +- **Mustard Yellow**: `#f4a900` - Bold primary accent +- **Terracotta**: `#c1666b` - Warm secondary color +- **Warm Beige**: `#d4b896` - Neutral backgrounds +- **Chocolate Brown**: `#4a403a` - Dark text and anchors + +## Typography + +- **Headers**: FreeSans Bold +- **Body Text**: FreeSans + +## Best Used For + +Restaurant presentations, hospitality brands, fall campaigns, cozy lifestyle content, artisan products. diff --git a/plugins/skill-hub/.agents/skills/theme-factory/themes/midnight-galaxy.md b/plugins/skill-hub/.agents/skills/theme-factory/themes/midnight-galaxy.md new file mode 100644 index 00000000..97e1c5f3 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/theme-factory/themes/midnight-galaxy.md @@ -0,0 +1,19 @@ +# Midnight Galaxy + +A dramatic and cosmic theme with deep purples and mystical tones for impactful presentations. + +## Color Palette + +- **Deep Purple**: `#2b1e3e` - Rich dark base +- **Cosmic Blue**: `#4a4e8f` - Mystical mid-tone +- **Lavender**: `#a490c2` - Soft accent color +- **Silver**: `#e6e6fa` - Light highlights and text + +## Typography + +- **Headers**: FreeSans Bold +- **Body Text**: FreeSans + +## Best Used For + +Entertainment industry, gaming presentations, nightlife venues, luxury brands, creative agencies. diff --git a/plugins/skill-hub/.agents/skills/theme-factory/themes/modern-minimalist.md b/plugins/skill-hub/.agents/skills/theme-factory/themes/modern-minimalist.md new file mode 100644 index 00000000..6bd26a29 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/theme-factory/themes/modern-minimalist.md @@ -0,0 +1,19 @@ +# Modern Minimalist + +A clean and contemporary theme with a sophisticated grayscale palette for maximum versatility. + +## Color Palette + +- **Charcoal**: `#36454f` - Primary dark color +- **Slate Gray**: `#708090` - Medium gray for accents +- **Light Gray**: `#d3d3d3` - Backgrounds and dividers +- **White**: `#ffffff` - Text and clean backgrounds + +## Typography + +- **Headers**: DejaVu Sans Bold +- **Body Text**: DejaVu Sans + +## Best Used For + +Tech presentations, architecture portfolios, design showcases, modern business proposals, data visualization. diff --git a/plugins/skill-hub/.agents/skills/theme-factory/themes/ocean-depths.md b/plugins/skill-hub/.agents/skills/theme-factory/themes/ocean-depths.md new file mode 100644 index 00000000..b675126f --- /dev/null +++ b/plugins/skill-hub/.agents/skills/theme-factory/themes/ocean-depths.md @@ -0,0 +1,19 @@ +# Ocean Depths + +A professional and calming maritime theme that evokes the serenity of deep ocean waters. + +## Color Palette + +- **Deep Navy**: `#1a2332` - Primary background color +- **Teal**: `#2d8b8b` - Accent color for highlights and emphasis +- **Seafoam**: `#a8dadc` - Secondary accent for lighter elements +- **Cream**: `#f1faee` - Text and light backgrounds + +## Typography + +- **Headers**: DejaVu Sans Bold +- **Body Text**: DejaVu Sans + +## Best Used For + +Corporate presentations, financial reports, professional consulting decks, trust-building content. diff --git a/plugins/skill-hub/.agents/skills/theme-factory/themes/sunset-boulevard.md b/plugins/skill-hub/.agents/skills/theme-factory/themes/sunset-boulevard.md new file mode 100644 index 00000000..df799a0c --- /dev/null +++ b/plugins/skill-hub/.agents/skills/theme-factory/themes/sunset-boulevard.md @@ -0,0 +1,19 @@ +# Sunset Boulevard + +A warm and vibrant theme inspired by golden hour sunsets, perfect for energetic and creative presentations. + +## Color Palette + +- **Burnt Orange**: `#e76f51` - Primary accent color +- **Coral**: `#f4a261` - Secondary warm accent +- **Warm Sand**: `#e9c46a` - Highlighting and backgrounds +- **Deep Purple**: `#264653` - Dark contrast and text + +## Typography + +- **Headers**: DejaVu Serif Bold +- **Body Text**: DejaVu Sans + +## Best Used For + +Creative pitches, marketing presentations, lifestyle brands, event promotions, inspirational content. diff --git a/plugins/skill-hub/.agents/skills/theme-factory/themes/tech-innovation.md b/plugins/skill-hub/.agents/skills/theme-factory/themes/tech-innovation.md new file mode 100644 index 00000000..e029a435 --- /dev/null +++ b/plugins/skill-hub/.agents/skills/theme-factory/themes/tech-innovation.md @@ -0,0 +1,19 @@ +# Tech Innovation + +A bold and modern theme with high-contrast colors perfect for cutting-edge technology presentations. + +## Color Palette + +- **Electric Blue**: `#0066ff` - Vibrant primary accent +- **Neon Cyan**: `#00ffff` - Bright highlight color +- **Dark Gray**: `#1e1e1e` - Deep backgrounds +- **White**: `#ffffff` - Clean text and contrast + +## Typography + +- **Headers**: DejaVu Sans Bold +- **Body Text**: DejaVu Sans + +## Best Used For + +Tech startups, software launches, innovation showcases, AI/ML presentations, digital transformation content. diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/LICENSE.txt b/plugins/skill-hub/.claude/skills/aspnet-core/LICENSE.txt new file mode 100644 index 00000000..7a4a3ea2 --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/SKILL.md b/plugins/skill-hub/.claude/skills/aspnet-core/SKILL.md new file mode 100644 index 00000000..c71ed6e7 --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/SKILL.md @@ -0,0 +1,61 @@ +--- +name: aspnet-core +description: Build, review, refactor, or architect ASP.NET Core web applications using current official guidance for .NET web development. Use when working on Blazor Web Apps, Razor Pages, MVC, Minimal APIs, controller-based Web APIs, SignalR, gRPC, middleware, dependency injection, configuration, authentication, authorization, testing, performance, deployment, or ASP.NET Core upgrades. +--- + +# ASP.NET Core + +## Overview + +Choose the right ASP.NET Core application model, compose the host and request pipeline correctly, and implement features in the framework style Microsoft documents today. + +Load the smallest set of references that fits the task. Do not load every reference by default. + +## Workflow + +1. Confirm the target framework, SDK, and current app model. +2. Open [references/stack-selection.md](references/stack-selection.md) first for new apps or major refactors. +3. Open [references/program-and-pipeline.md](references/program-and-pipeline.md) next for `Program.cs`, DI, configuration, middleware, routing, logging, and static assets. +4. Open exactly one primary app-model reference: + - [references/ui-blazor.md](references/ui-blazor.md) + - [references/ui-razor-pages.md](references/ui-razor-pages.md) + - [references/ui-mvc.md](references/ui-mvc.md) + - [references/apis-minimal-and-controllers.md](references/apis-minimal-and-controllers.md) +5. Add cross-cutting references only as needed: + - [references/data-state-and-services.md](references/data-state-and-services.md) + - [references/security-and-identity.md](references/security-and-identity.md) + - [references/realtime-grpc-and-background-work.md](references/realtime-grpc-and-background-work.md) + - [references/testing-performance-and-operations.md](references/testing-performance-and-operations.md) +6. Open [references/versioning-and-upgrades.md](references/versioning-and-upgrades.md) before introducing new platform APIs into an older solution or when migrating between major versions. +7. Use [references/source-map.md](references/source-map.md) when you need the Microsoft Learn section that corresponds to a task not already covered by the focused references. + +## Default Operating Assumptions + +- Prefer the latest stable ASP.NET Core and .NET unless the repository or user request pins an older target. +- As of March 2026, prefer .NET 10 / ASP.NET Core 10 for new production work. Treat ASP.NET Core 11 as preview unless the user explicitly asks for preview features. +- Prefer `WebApplicationBuilder` and `WebApplication`. Avoid older `Startup` and `WebHost` patterns unless the codebase already uses them or the task is migration. +- Prefer built-in DI, options/configuration, logging, ProblemDetails, OpenAPI, health checks, rate limiting, output caching, and Identity before adding third-party infrastructure. +- Keep feature slices cohesive so the page, component, endpoint, controller, validation, service, data access, and tests are easy to trace. +- Respect the existing app model. Do not rewrite Razor Pages to MVC or controllers to Minimal APIs without a clear reason. + +## Reference Guide + +- [references/_sections.md](references/_sections.md): Quick index and reading order. +- [references/stack-selection.md](references/stack-selection.md): Choose the right ASP.NET Core application model and template. +- [references/program-and-pipeline.md](references/program-and-pipeline.md): Structure `Program.cs`, services, middleware, routing, configuration, logging, and static assets. +- [references/ui-blazor.md](references/ui-blazor.md): Build Blazor Web Apps, choose render modes, and use components, forms, and JS interop correctly. +- [references/ui-razor-pages.md](references/ui-razor-pages.md): Build page-focused server-rendered apps with handlers, model binding, and conventions. +- [references/ui-mvc.md](references/ui-mvc.md): Build controller/view applications with clear separation of concerns. +- [references/apis-minimal-and-controllers.md](references/apis-minimal-and-controllers.md): Build HTTP APIs with Minimal APIs or controllers, including validation and response patterns. +- [references/data-state-and-services.md](references/data-state-and-services.md): Use EF Core, `DbContext`, options, `IHttpClientFactory`, session, temp data, and app state responsibly. +- [references/security-and-identity.md](references/security-and-identity.md): Apply authentication, authorization, Identity, secrets, data protection, CORS, CSRF, and HTTPS guidance. +- [references/realtime-grpc-and-background-work.md](references/realtime-grpc-and-background-work.md): Use SignalR, gRPC, and hosted services. +- [references/testing-performance-and-operations.md](references/testing-performance-and-operations.md): Add integration tests, browser tests, caching, compression, health checks, rate limits, and deployment concerns. +- [references/versioning-and-upgrades.md](references/versioning-and-upgrades.md): Handle target frameworks, breaking changes, obsolete APIs, and migrations. +- [references/source-map.md](references/source-map.md): Map the official ASP.NET Core documentation tree to the references in this skill. + +## Execution Notes + +- When generating new code, start from the correct `dotnet new` template and keep the generated structure recognizable. +- When editing an existing solution, follow the solution's conventions first and use these references to avoid framework misuse or outdated patterns. +- When a task mentions "latest", verify the feature on Microsoft Learn or the ASP.NET Core docs repo before relying on memory. diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/agents/openai.yaml b/plugins/skill-hub/.claude/skills/aspnet-core/agents/openai.yaml new file mode 100644 index 00000000..03d861ea --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/agents/openai.yaml @@ -0,0 +1,5 @@ +interface: + display_name: "ASP.NET Core" + short_description: "[Windows only] Build and review ASP.NET Core web apps" + icon_large: "./assets/dotnet-logo.png" + default_prompt: "Create a new $aspnet-core website for me." diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/assets/dotnet-logo.png b/plugins/skill-hub/.claude/skills/aspnet-core/assets/dotnet-logo.png new file mode 100644 index 00000000..7a7ee241 Binary files /dev/null and b/plugins/skill-hub/.claude/skills/aspnet-core/assets/dotnet-logo.png differ diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/references/_sections.md b/plugins/skill-hub/.claude/skills/aspnet-core/references/_sections.md new file mode 100644 index 00000000..8cbf1e38 --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/references/_sections.md @@ -0,0 +1,40 @@ +# Reference Sections + +Use this file as the routing table for the rest of the skill. + +## Start Here + +- New app or major redesign: `stack-selection.md` -> `program-and-pipeline.md` -> one primary app-model reference -> `security-and-identity.md` -> `testing-performance-and-operations.md` +- Existing app feature work: primary app-model reference -> `program-and-pipeline.md` -> any needed cross-cutting references +- API-first work: `apis-minimal-and-controllers.md` -> `security-and-identity.md` -> `data-state-and-services.md` -> `testing-performance-and-operations.md` +- Authentication, authorization, or secrets: `security-and-identity.md` +- Realtime, streaming, or background processing: `realtime-grpc-and-background-work.md` +- Upgrade or migration work: `versioning-and-upgrades.md` + +## Primary References + +| File | Open when | +| --- | --- | +| `stack-selection.md` | Choose Blazor, Razor Pages, MVC, Minimal APIs, controllers, SignalR, or gRPC | +| `program-and-pipeline.md` | Structure `Program.cs`, services, configuration, middleware, routing, logging, static files, and app startup | +| `ui-blazor.md` | Build or review Blazor Web Apps and component-based UI | +| `ui-razor-pages.md` | Build or review page-focused server-rendered applications | +| `ui-mvc.md` | Build or review controller/view applications | +| `apis-minimal-and-controllers.md` | Build or review HTTP APIs | + +## Cross-Cutting References + +| File | Open when | +| --- | --- | +| `data-state-and-services.md` | Register services, use EF Core, handle options/configuration, or manage app state | +| `security-and-identity.md` | Add Identity, cookies, bearer auth, policies, CORS, CSRF, HTTPS, or secrets handling | +| `realtime-grpc-and-background-work.md` | Add SignalR, gRPC, streaming, or hosted services | +| `testing-performance-and-operations.md` | Add tests, caching, compression, health checks, rate limits, deployment, or proxy configuration | +| `versioning-and-upgrades.md` | Migrate across ASP.NET Core versions, avoid obsolete APIs, or target preview features deliberately | +| `source-map.md` | Map a task to the official ASP.NET Core documentation tree | + +## Reading Strategy + +- Open one app-model reference at a time unless the codebase genuinely mixes models. +- Prefer the framework's built-in abstractions first. +- Check `versioning-and-upgrades.md` before introducing APIs that might not exist in the repository's target framework. diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/references/apis-minimal-and-controllers.md b/plugins/skill-hub/.claude/skills/aspnet-core/references/apis-minimal-and-controllers.md new file mode 100644 index 00000000..bc599eae --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/references/apis-minimal-and-controllers.md @@ -0,0 +1,81 @@ +# APIs: Minimal And Controllers + +Primary docs: +- https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis +- https://learn.microsoft.com/aspnet/core/web-api/ +- https://learn.microsoft.com/aspnet/core/fundamentals/error-handling-api + +## First Decision + +Choose between: + +- Minimal APIs for focused, low-ceremony HTTP endpoints +- controller-based APIs for richer MVC conventions and attribute-driven behavior + +Do not mix both styles in the same feature unless that split is genuinely useful. + +## Minimal API Guidance + +Prefer Minimal APIs when the surface is small to medium and you want concise endpoint definitions. + +Good defaults: + +- organize endpoints with route groups +- keep route handlers thin +- move business logic into services +- prefer `TypedResults` over untyped results +- use endpoint filters when cross-cutting behavior belongs at the endpoint layer +- use built-in validation support on supported target frameworks + +Minimal API reminders: + +- handler parameters can be bound from route, query, headers, body, form, or DI +- authorization can be applied with `RequireAuthorization` +- return `IResult` or `TypedResults` when response shape matters +- use OpenAPI support for discoverable contracts + +On .NET 10, Minimal APIs support built-in validation with `AddValidation()`. Use that instead of inventing parallel validation infrastructure when the target framework supports it. + +## Controller API Guidance + +Prefer controllers when the API needs: + +- `[ApiController]` behaviors +- attribute routing and conventions +- filters +- custom formatters +- mature controller organization in an existing codebase + +Controller defaults: + +- derive API controllers from `ControllerBase` +- annotate with `[ApiController]` +- use attribute routing +- return ProblemDetails-compatible failures +- let automatic model validation handle invalid requests unless there is a concrete override requirement + +Key `[ApiController]` behaviors: + +- attribute routing is required +- invalid model state automatically becomes HTTP 400 +- binding source inference applies +- error responses use ProblemDetails patterns + +## Shared API Practices + +- Keep request and response DTOs separate from persistence models +- Use version-stable route and payload contracts +- Use `CreatedAt...` patterns for resource creation +- Prefer explicit status codes and typed results over implicit behavior +- Apply authorization at the endpoint or controller boundary, not only inside service methods +- Use `ProblemDetails` for errors instead of ad hoc JSON shapes + +## Browser-Facing Notes + +- Be careful with cookie-authenticated API endpoints and CORS +- For browser-based form or file upload endpoints, account for antiforgery requirements +- In ASP.NET Core 10, known API endpoints no longer use cookie-login redirects by default; rely on API-appropriate unauthorized responses instead + +## Native AOT + +Use `dotnet new webapiaot` only when native AOT is an explicit deployment requirement. Treat it as a constraint that affects library choice, reflection, JSON patterns, and compatibility. diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/references/data-state-and-services.md b/plugins/skill-hub/.claude/skills/aspnet-core/references/data-state-and-services.md new file mode 100644 index 00000000..d2826e0d --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/references/data-state-and-services.md @@ -0,0 +1,69 @@ +# Data, State, And Services + +Primary docs: +- https://learn.microsoft.com/aspnet/core/data/ +- https://learn.microsoft.com/aspnet/core/fundamentals/dependency-injection +- https://learn.microsoft.com/aspnet/core/fundamentals/http-requests +- https://learn.microsoft.com/aspnet/core/fundamentals/app-state + +## Dependency Injection Defaults + +- Register infrastructure and business services in `Program.cs` +- Inject dependencies through constructors by default +- Keep scoped services request-bound +- Avoid resolving scoped services from singletons +- Use keyed or named patterns only when there is a real need for multiple implementations + +## EF Core And DbContext + +Use EF Core for common relational data access patterns unless the repository already uses another data layer. + +Default guidance: + +- register `DbContext` with `AddDbContext` +- treat `DbContext` as scoped +- keep queries and transactions in services, not UI code +- use migrations intentionally +- keep entities out of public API contracts and UI view models + +Use `IDbContextFactory` when the execution model is not request-scoped, such as: + +- Blazor components with longer-lived scopes +- background services +- explicit factory-driven data work + +## Options And Configuration + +- Bind structured configuration into options classes +- validate options early when bad configuration should fail fast +- keep configuration access close to the service that owns it +- avoid scattering raw configuration keys across the codebase + +## Outbound HTTP + +Use `IHttpClientFactory` for outbound HTTP calls. + +Prefer: + +- named clients for distinct external systems +- typed clients for richer integrations +- delegating handlers for retries, headers, or telemetry concerns + +Avoid manual `new HttpClient()` patterns scattered through request handlers. + +## App State + +Use the smallest state mechanism that fits: + +- query string or route values for transparent request state +- form posts for user input +- TempData for short-lived redirect-friendly messages +- session only when necessary and with an understanding of its server-side and scaling implications + +Do not treat session as the primary application data store. + +## Caching And State Boundaries + +- Keep cached data derivable from a durable source +- Separate cache shape from persistence shape when it improves safety or performance +- Revisit session, in-memory cache, and singleton state when the app scales to multiple instances diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/references/program-and-pipeline.md b/plugins/skill-hub/.claude/skills/aspnet-core/references/program-and-pipeline.md new file mode 100644 index 00000000..0b37686b --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/references/program-and-pipeline.md @@ -0,0 +1,103 @@ +# Program And Pipeline + +Primary docs: +- https://learn.microsoft.com/aspnet/core/fundamentals/ +- https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis/webapplication +- https://learn.microsoft.com/aspnet/core/fundamentals/middleware/ +- https://learn.microsoft.com/aspnet/core/fundamentals/configuration/ + +## Startup Shape + +Prefer the modern hosting model: + +1. Create `var builder = WebApplication.CreateBuilder(args);` +2. Register services on `builder.Services` +3. Build `var app = builder.Build();` +4. Configure middleware in the correct order +5. Map endpoints +6. Call `app.Run();` + +Use older `Startup` patterns only when the repository already uses them or the task is migration. + +## Service Registration + +- Register framework services explicitly: Razor Pages, controllers, Razor components, authentication, authorization, health checks, rate limiting, response compression, output caching, EF Core, and `IHttpClientFactory` +- Keep business logic in services instead of controllers, page models, or route handlers +- Use constructor injection as the default +- Use options classes for structured configuration +- Choose lifetimes intentionally: + - singleton: stateless or shared infrastructure + - scoped: request-bound work such as `DbContext` + - transient: lightweight stateless services + +## Configuration Defaults + +`WebApplication.CreateBuilder` already loads configuration from common providers such as: + +- `appsettings.json` +- environment-specific `appsettings.{Environment}.json` +- environment variables +- command-line arguments + +For secrets: + +- use Secret Manager in development +- use a secure external store in production +- do not commit secrets to source control + +## Middleware Order + +Middleware order is a frequent source of broken behavior. Favor this shape and adjust only with a concrete reason: + +1. Forwarded headers if behind a proxy or load balancer +2. Exception handling and HSTS for non-development environments +3. HTTPS redirection +4. Static files +5. Routing when explicit routing middleware is needed +6. CORS when endpoints require it +7. Authentication +8. Authorization +9. Endpoint-specific middleware such as rate limiting or session as required +10. Endpoint mapping with `MapRazorPages`, `MapControllers`, `MapGet`, `MapHub`, or `MapGrpcService` + +Important ordering rules: + +- Call `UseAuthentication()` before `UseAuthorization()` +- Keep proxy/header processing before auth, redirects, and link generation +- Do not insert custom middleware randomly between auth and authorization without a reason +- In Minimal API apps, explicit `UseRouting()` is usually unnecessary unless you need to control order + +## Routing And Endpoints + +- Prefer endpoint routing everywhere +- Use route groups for larger Minimal API surfaces +- Keep MVC and API routes explicit and predictable +- Use areas only when the application is large enough to benefit from bounded sections +- Keep endpoint names stable when generating links or integrating with clients + +## Error Handling + +- Use centralized exception handling instead of scattered `try/catch` blocks for ordinary request failures +- Prefer ProblemDetails-style responses for APIs +- Keep the developer exception page limited to development +- Separate user-facing failures from internal exception details + +## Logging And Diagnostics + +- Use `ILogger` from DI +- Log structured values, not concatenated strings +- Put correlation and request diagnostics in middleware or infrastructure, not business logic +- Enable HTTP logging only when the scenario warrants it and avoid leaking sensitive data + +## Static Assets And Web Root + +- Keep public assets in `wwwroot` +- Treat the web root as publicly readable content +- Prevent publishing local-only static content through project file rules when needed +- Use Razor Class Libraries for reusable UI assets across apps + +## Architectural Defaults + +- Keep `Program.cs` readable; extract feature registration to extension methods when it starts accumulating unrelated concerns +- Prefer vertical slices or feature folders over giant "Controllers", "Services", and "Repositories" buckets with weak boundaries +- Keep framework configuration close to the host and business logic out of it diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/references/realtime-grpc-and-background-work.md b/plugins/skill-hub/.claude/skills/aspnet-core/references/realtime-grpc-and-background-work.md new file mode 100644 index 00000000..3976dabd --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/references/realtime-grpc-and-background-work.md @@ -0,0 +1,58 @@ +# Realtime, gRPC, And Background Work + +Primary docs: +- https://learn.microsoft.com/aspnet/core/signalr/introduction +- https://learn.microsoft.com/aspnet/core/grpc/ +- https://learn.microsoft.com/aspnet/core/fundamentals/host/hosted-services + +## SignalR + +Use SignalR when the server must push updates to connected clients in near real time. + +Good fits: + +- chat +- dashboards +- notifications +- collaborative editing +- live status streams + +Guidance: + +- model the hub as a communication boundary, not the home of business logic +- use groups and user targeting deliberately +- authenticate connections when data is user-specific +- plan for scale-out if the app may run on multiple instances + +Remember that Blazor interactive server rendering already relies on a real-time connection. Do not add a second realtime channel unless the feature truly needs one. + +## gRPC + +Use gRPC for efficient service-to-service communication, strongly typed contracts, and streaming over HTTP/2. + +Prefer gRPC when: + +- both ends are under your control +- performance and contract fidelity matter +- streaming is a first-class requirement + +Guidance: + +- keep `.proto` contracts versioned and stable +- generate client and server types from contracts +- keep auth, logging, and DI integrated with the host +- account for browser interoperability differences before choosing gRPC for public browser clients + +## Background Work + +Use `IHostedService` or `BackgroundService` for in-process background tasks tied to the application host. + +Defaults: + +- keep background services small and observable +- create scopes for scoped dependencies +- do not capture scoped services directly in singleton hosted services +- respect cancellation tokens +- avoid long blocking startup paths + +If the work is durable, high-volume, or business-critical, consider whether it belongs in an out-of-process queue or worker instead of only inside the web host. diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/references/security-and-identity.md b/plugins/skill-hub/.claude/skills/aspnet-core/references/security-and-identity.md new file mode 100644 index 00000000..f7f7da11 --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/references/security-and-identity.md @@ -0,0 +1,75 @@ +# Security And Identity + +Primary docs: +- https://learn.microsoft.com/aspnet/core/security/ +- https://learn.microsoft.com/aspnet/core/security/authentication/identity +- https://learn.microsoft.com/aspnet/core/security/authorization/introduction + +## Security Defaults + +- Use the most secure authentication flow available +- Keep secrets out of source code and plain configuration files +- Use Secret Manager in development +- Use a secure production secret store +- Enforce HTTPS +- Apply least privilege to users, services, and data access + +## Authentication And Authorization + +Authentication answers who the user or caller is. Authorization answers what they can do. + +Default pipeline order: + +1. `UseAuthentication()` +2. `UseAuthorization()` + +Apply authorization at boundaries: + +- `[Authorize]` on controllers, actions, page models, or hubs +- `RequireAuthorization()` on endpoints and route groups +- policies for reusable rules +- roles only when role-based checks are actually the right abstraction + +Use `AllowAnonymous` sparingly and intentionally. + +## Identity + +Use ASP.NET Core Identity when the app needs first-party user accounts, login flows, password management, email confirmation, MFA, or related account management. + +Useful starting points: + +- `dotnet new webapp -au Individual` +- `dotnet new mvc -au Individual` + +Identity guidance: + +- scaffold only the pages you truly need to customize +- keep Identity UI updates maintainable; full scaffolding increases merge and upgrade cost +- use policies and claims for authorization rather than encoding all decisions in page logic +- persist data-protection keys appropriately in multi-instance deployments + +On ASP.NET Core 10, Identity metrics are available for observing auth-related behavior. Use them when the app has meaningful authentication traffic or security monitoring requirements. + +## CSRF, CORS, And Browser Security + +- Use antiforgery protection for cookie-based interactive apps and form posts +- Do not confuse CORS with authentication or authorization +- Avoid permissive `AllowAnyOrigin` plus credentials combinations +- Treat browser-side state as untrusted + +## HTTPS, HSTS, And Forwarded Headers + +- redirect HTTP to HTTPS +- enable HSTS outside development when appropriate +- configure forwarded headers correctly when behind proxies or load balancers +- do not generate links or evaluate scheme-sensitive behavior before proxy headers are processed + +## Data Protection And Secrets + +- persist data-protection keys outside ephemeral local storage when the app runs on multiple instances +- do not use environment variables as the preferred long-term home for production secrets when a stronger secret store is available +- never check production credentials into source control + +## Blazor Note + +For Blazor apps, read the general ASP.NET Core security guidance first and then the Blazor-specific security docs. Some Blazor security guidance adds to or supersedes the general guidance. diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/references/source-map.md b/plugins/skill-hub/.claude/skills/aspnet-core/references/source-map.md new file mode 100644 index 00000000..390d63b8 --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/references/source-map.md @@ -0,0 +1,43 @@ +# ASP.NET Core Source Map + +This skill is synthesized from the official ASP.NET Core documentation tree and overview pages. Use this file to map a task to the corresponding Microsoft Learn area before opening deeper docs. + +Core sources: + +- https://learn.microsoft.com/aspnet/core/ +- https://raw.githubusercontent.com/dotnet/AspNetCore.Docs/main/aspnetcore/toc.yml +- https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore + +## Documentation Tree Mapping + +| ASP.NET Core docs area | Use this skill reference first | +| --- | --- | +| Overview, Get started, What's new | `stack-selection.md`, `versioning-and-upgrades.md` | +| Fundamentals | `program-and-pipeline.md` | +| Web apps | `ui-blazor.md`, `ui-razor-pages.md`, `ui-mvc.md` | +| APIs | `apis-minimal-and-controllers.md` | +| Real-time apps | `realtime-grpc-and-background-work.md` | +| Remote Procedure Call apps | `realtime-grpc-and-background-work.md` | +| Servers, Host and deploy | `testing-performance-and-operations.md` | +| Test, Debug, Troubleshoot | `testing-performance-and-operations.md` | +| Data access | `data-state-and-services.md` | +| Security and Identity | `security-and-identity.md` | +| Performance | `testing-performance-and-operations.md` | +| Migration and updates | `versioning-and-upgrades.md` | + +## Areas To Consult Directly On Microsoft Learn + +The following topics are part of the ASP.NET Core documentation tree but are not expanded into their own dedicated reference file here: + +- globalization and localization +- advanced hosting and YARP details +- debugger and diagnostics tooling specifics +- narrow API-reference pages for individual types + +When a task is dominated by one of those areas, go straight to the matching Microsoft Learn section after checking the reference files in this skill. + +## Practical Deep-Dive Rule + +- Start with the focused reference in this skill +- If the task depends on a narrow platform detail, open the matching Learn article +- If the task depends on version-specific behavior, confirm the correct moniker or breaking-changes page diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/references/stack-selection.md b/plugins/skill-hub/.claude/skills/aspnet-core/references/stack-selection.md new file mode 100644 index 00000000..46473df1 --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/references/stack-selection.md @@ -0,0 +1,63 @@ +# Stack Selection + +Primary docs: +- https://learn.microsoft.com/aspnet/core/ +- https://learn.microsoft.com/aspnet/core/blazor/ +- https://learn.microsoft.com/aspnet/core/razor-pages/ +- https://learn.microsoft.com/aspnet/core/mvc/overview +- https://learn.microsoft.com/aspnet/core/web-api/ +- https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis + +## Default Version Choice + +- Prefer the latest stable .NET and ASP.NET Core for new production work. +- As of March 2026, that means `net10.0` unless the repository or user request says otherwise. +- Treat ASP.NET Core 11 as preview. Do not adopt preview APIs by default. +- If the repository already targets `net8.0`, `net9.0`, or another framework, stay within that target unless the task is explicitly an upgrade. + +## Template Short Names + +The current .NET 10 SDK templates include: + +- `dotnet new blazor` +- `dotnet new webapp` +- `dotnet new mvc` +- `dotnet new webapi` +- `dotnet new webapiaot` +- `dotnet new grpc` +- `dotnet new web` +- `dotnet new razorclasslib` + +Verify template names with `dotnet new list` if the environment differs. + +## Application Model Matrix + +| Model | Prefer when | Watch out for | Typical starting point | +| --- | --- | --- | --- | +| Blazor Web App | Build full-stack .NET UI with SSR plus optional interactivity | Interactive server needs a live connection; WebAssembly increases payload size | `dotnet new blazor` | +| Razor Pages | Build page-focused CRUD, forms, dashboards, and line-of-business apps | Authorization cannot be applied per page handler; use MVC if handler-level control matters | `dotnet new webapp` | +| MVC | Build large server-rendered apps with clear controller/view separation, filters, and action-based patterns | More ceremony than Razor Pages for simple page flows | `dotnet new mvc` | +| Minimal APIs | Build focused HTTP APIs, internal services, lightweight backends, and small surface areas | Route handlers can become hard to manage if business logic or metadata grows without structure | `dotnet new webapi` or `dotnet new web` | +| Controller-based Web API | Build APIs that benefit from `[ApiController]`, content negotiation, filters, formatters, and mature controller conventions | More ceremony than Minimal APIs for small endpoints | `dotnet new webapi` | +| SignalR | Add server push, live updates, chat, collaborative UI, or notifications | Requires connection lifecycle management and scale-out planning | Add to an existing ASP.NET Core app | +| gRPC | Build service-to-service or streaming RPC over HTTP/2 | Browser support is different from ordinary JSON APIs; use gRPC-Web only when needed | `dotnet new grpc` | + +## Fast Heuristics + +- Choose Blazor Web App when the UI itself should be a .NET component model. +- Choose Razor Pages when the app is mostly page and form oriented. +- Choose MVC when actions, views, filters, and controller conventions are the center of the design. +- Choose Minimal APIs first for small to medium HTTP services. +- Switch to controllers when the API needs richer attribute-driven behavior, custom formatters, or strong alignment with existing MVC/Web API conventions. +- Keep the current app model in an existing codebase unless the mismatch is causing real complexity. + +## Mixed-Model Guidance + +ASP.NET Core can mix models in one host. Common combinations: + +- Razor Pages or MVC for server-rendered UI plus Minimal APIs for AJAX or mobile endpoints +- Blazor Web App plus Minimal APIs for external integration endpoints +- MVC or Razor Pages plus SignalR for live updates +- Web API plus gRPC for internal service-to-service calls + +Mix models only when it simplifies the public surface. Do not add a second app model just because ASP.NET Core allows it. diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/references/testing-performance-and-operations.md b/plugins/skill-hub/.claude/skills/aspnet-core/references/testing-performance-and-operations.md new file mode 100644 index 00000000..6e27c0eb --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/references/testing-performance-and-operations.md @@ -0,0 +1,92 @@ +# Testing, Performance, And Operations + +Primary docs: +- https://learn.microsoft.com/aspnet/core/test/integration-tests +- https://learn.microsoft.com/aspnet/core/host-and-deploy/ +- https://learn.microsoft.com/aspnet/core/host-and-deploy/health-checks +- https://learn.microsoft.com/aspnet/core/performance/ + +## Testing Strategy + +Use layered testing instead of relying on one style: + +- unit tests for pure services and business logic +- integration tests for request pipeline, DI, database, auth, and framework wiring +- browser tests for end-to-end user flows + +## Integration Tests + +Use `Microsoft.AspNetCore.Mvc.Testing` and `WebApplicationFactory` for integration tests. + +Guidance from the official docs: + +- use a test host and `HttpClient` +- replace services with test doubles when needed +- control redirects when asserting auth behavior +- handle antiforgery correctly for form posts +- prefer SQLite in-memory over the EF Core in-memory provider for more realistic database tests + +For SPA or browser-driven scenarios, Microsoft recommends browser automation such as Playwright for .NET. + +## Performance Defaults + +Reach for built-in features before custom optimization layers: + +- output caching +- response caching where appropriate +- response compression +- HTTP request timeouts +- rate limiting +- static file handling + +General performance guidance: + +- measure first +- keep database and network round trips visible +- reduce payload size +- use streaming or pagination when data is large +- keep synchronous blocking out of hot paths + +## Health Checks And Observability + +Add health checks for dependencies that matter operationally. + +Use separate checks or tags when you need: + +- liveness +- readiness +- dependency-specific health surfaces + +Also ensure: + +- structured logs +- request tracing where applicable +- metrics for critical paths such as auth, API latency, and background work + +## Hosting And Deployment + +Typical deployment flow: + +1. `dotnet publish` +2. deploy the publish output +3. run behind a process manager +4. place a reverse proxy in front when the environment requires it + +Know the deployment environment: + +- IIS or Windows Service on Windows +- Kestrel plus Nginx or another reverse proxy on Linux +- container hosting when the platform expects it + +Behind proxies or load balancers: + +- configure forwarded headers +- validate scheme, host, and remote IP behavior +- test auth redirects and callback URLs in the deployed topology + +## Operational Safeguards + +- add health checks for databases and critical external services +- fail fast on invalid configuration where possible +- keep secrets out of publish artifacts +- verify data-protection key persistence in multi-instance deployments diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/references/ui-blazor.md b/plugins/skill-hub/.claude/skills/aspnet-core/references/ui-blazor.md new file mode 100644 index 00000000..d7b58610 --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/references/ui-blazor.md @@ -0,0 +1,53 @@ +# Blazor + +Primary docs: +- https://learn.microsoft.com/aspnet/core/blazor/ +- https://learn.microsoft.com/aspnet/core/blazor/fundamentals/ +- https://learn.microsoft.com/aspnet/core/blazor/security/ + +## Choose Blazor Deliberately + +Prefer Blazor when the UI itself should be built as reusable .NET components and the team wants a full-stack .NET model. + +Current guidance centers on the Blazor Web App model, which can combine: + +- static SSR for fast first render +- interactive server rendering +- interactive WebAssembly rendering +- per-component render mode choices + +Use standalone Blazor WebAssembly only when the app is intentionally client-heavy or must run as static files without a server-rendered host. + +## Render Mode Heuristics + +- Start with static SSR when the page is mostly read-only and fast first paint matters +- Use interactive server rendering when you want rich interactivity without shipping the full .NET runtime to the browser +- Use interactive WebAssembly when offline capability, client-side execution, or browser-local compute is the point +- Mix render modes only when the split is clear and justified + +## Component Patterns + +- Keep components focused and composable +- Move data access and business rules into injected services +- Pass data through parameters, not hidden global state +- Use forms and validation with Blazor's built-in editing and validation components +- Prefer shared Razor Class Libraries for reusable component sets + +## Data And Interactivity + +- Use DI in components with restraint; avoid turning components into service locators +- Treat JS interop as an edge mechanism for browser APIs or third-party libraries, not the primary application model +- Keep long-running work off the UI event path +- Be deliberate about prerendering, streaming rendering, and enhanced navigation when they improve perceived performance + +## Security Notes + +- Follow the general ASP.NET Core security guidance first, then load the Blazor-specific docs for details that supersede it +- Remember that client-side code and browser state are not trusted +- Keep secrets and privileged operations on the server +- Use authorization-aware UI only as a convenience layer; enforce rules on the server as well + +## When Not To Use Blazor + +- Do not force Blazor onto a mostly conventional server-rendered app that already fits Razor Pages or MVC well +- Do not choose WebAssembly by default for small interaction needs that SSR or interactive server rendering handles more simply diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/references/ui-mvc.md b/plugins/skill-hub/.claude/skills/aspnet-core/references/ui-mvc.md new file mode 100644 index 00000000..2d52a01e --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/references/ui-mvc.md @@ -0,0 +1,56 @@ +# MVC + +Primary docs: +- https://learn.microsoft.com/aspnet/core/mvc/overview +- https://learn.microsoft.com/aspnet/core/mvc/controllers/ +- https://learn.microsoft.com/aspnet/core/mvc/views/ + +## Choose MVC When Actions And Views Matter + +Prefer MVC when the application benefits from explicit controllers, action-based routing, filters, view models, and a strong separation between orchestration and presentation. + +This is often the right fit for: + +- large server-rendered sites +- applications with many cross-cutting filters or action conventions +- applications that mix views and APIs in the same controller layer +- teams already organized around controllers and views + +## Core Shape + +Enable MVC with views using: + +- `builder.Services.AddControllersWithViews();` +- `app.MapControllerRoute(...)` + +Keep views focused on presentation. Keep controllers focused on HTTP orchestration. Put business rules in services. + +## Controller Guidance + +- Derive from `Controller` when the controller returns views +- Keep actions small and explicit +- Use model binding and validation instead of manual request parsing +- Return view models, not EF entities, to views +- Use POST-Redirect-GET for form submissions + +## View Guidance + +- Use layouts, partial views, and Tag Helpers to keep markup consistent +- Keep complex display logic out of Razor markup when it becomes hard to follow +- Use strongly typed view models +- Avoid coupling views directly to persistence models + +## Structure And Scale + +- Use areas for large bounded sections such as Admin or BackOffice +- Keep route conventions explicit +- Apply filters when behavior truly belongs at the MVC layer +- Avoid giant god controllers; split by cohesive feature or resource + +## Choosing MVC Over Razor Pages + +Prefer MVC over Razor Pages when: + +- multiple related actions share controller-level behavior +- handler-level authorization or action filters matter +- URL and action design are more natural than page-file routing diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/references/ui-razor-pages.md b/plugins/skill-hub/.claude/skills/aspnet-core/references/ui-razor-pages.md new file mode 100644 index 00000000..f111acb6 --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/references/ui-razor-pages.md @@ -0,0 +1,55 @@ +# Razor Pages + +Primary docs: +- https://learn.microsoft.com/aspnet/core/razor-pages/ +- https://learn.microsoft.com/aspnet/core/tutorials/razor-pages/ + +## Choose Razor Pages For Page-Centered Apps + +Prefer Razor Pages when requests naturally map to pages, forms, and page-level handlers. This is a strong default for internal tools, CRUD apps, account flows, and admin surfaces. + +## Core Shape + +Enable Razor Pages with: + +- `builder.Services.AddRazorPages();` +- `app.MapRazorPages();` + +Use the `@page` directive to turn a `.cshtml` file into an endpoint. Keep request logic in the paired `PageModel` class when the page is more than trivial. + +## Routing Model + +- File system location defines the route by default +- `Pages/Index.cshtml` maps to `/` +- `Pages/Store/Index.cshtml` maps to `/Store` +- Keep folder structure meaningful because it becomes the URL structure + +## PageModel Guidance + +- Use `OnGet`, `OnPost`, and named handlers for request processing +- Use bindable properties and model validation for forms +- Keep page models thin; move business logic into injected services +- Use Tag Helpers and model binding instead of manual request parsing + +## Good Fits + +- form-heavy workflows +- dashboards and back-office applications +- simple content with server-side validation +- applications where a page is the primary navigation unit + +## Key Limitation + +Do not rely on per-handler authorization with Razor Pages. Microsoft explicitly recommends using MVC controllers when different handlers on the same logical surface need different authorization behavior. + +Preferred responses to that limitation: + +- split the handlers into separate pages +- move the surface to MVC if action-level authorization is a better fit + +## Organizational Guidance + +- Group related pages into folders +- Use partial views for repeated fragments +- Use areas only when the application has clear bounded sections +- Keep shared layout and page conventions centralized diff --git a/plugins/skill-hub/.claude/skills/aspnet-core/references/versioning-and-upgrades.md b/plugins/skill-hub/.claude/skills/aspnet-core/references/versioning-and-upgrades.md new file mode 100644 index 00000000..3b93275d --- /dev/null +++ b/plugins/skill-hub/.claude/skills/aspnet-core/references/versioning-and-upgrades.md @@ -0,0 +1,51 @@ +# Versioning And Upgrades + +Primary docs: +- https://learn.microsoft.com/aspnet/core/release-notes/ +- https://learn.microsoft.com/aspnet/core/release-notes/aspnetcore-10.0 +- https://learn.microsoft.com/aspnet/core/release-notes/aspnetcore-9.0 +- https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/breaking-changes + +## Versioning Default + +- For new production apps in March 2026, prefer `net10.0` +- For existing apps, match the repository's target framework unless the task is explicitly an upgrade +- Before using a new API, confirm it exists in the target framework + +## Upgrade Workflow + +1. Identify the current target framework and SDK +2. Read the "What's new" and breaking-changes pages for each version hop +3. Compile and resolve obsoletions intentionally +4. Re-run integration tests and auth flows +5. Re-test deployment-specific behavior such as proxies, cookies, and static assets + +## High-Value Breaking-Change Checks + +When moving to ASP.NET Core 10, watch for: + +- cookie login redirects disabled for known API endpoints +- `WithOpenApi` deprecation +- `WebHostBuilder`, `IWebHost`, and `WebHost` obsolescence +- Razor runtime compilation obsolescence + +When moving to ASP.NET Core 9, watch for: + +- `ValidateOnBuild` and `ValidateScopes` enabled in development when using `HostBuilder` +- middleware constructor expectations and DI validation changes + +When moving to ASP.NET Core 8, watch for: + +- Minimal API `IFormFile` antiforgery requirements +- `AddRateLimiter()` and `AddHttpLogging()` requirements when corresponding middleware is used + +## Migration Principles + +- Prefer migration to the modern hosting model when touching startup extensively +- Remove compatibility shims only after tests confirm behavior +- Avoid mixing new framework idioms with old startup architecture in a half-migrated state +- Keep one authoritative target framework in project files unless multi-targeting is deliberate + +## Preview Feature Rule + +Do not introduce preview-only APIs or docs guidance unless the user explicitly asks for preview adoption or the repository is already on preview SDKs. diff --git a/plugins/skill-hub/.editorconfig b/plugins/skill-hub/.editorconfig new file mode 100644 index 00000000..554080f6 --- /dev/null +++ b/plugins/skill-hub/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[*.{json,yaml,yml}] +indent_size = 2 diff --git a/plugins/skill-hub/.gitignore b/plugins/skill-hub/.gitignore new file mode 100644 index 00000000..deb2620e --- /dev/null +++ b/plugins/skill-hub/.gitignore @@ -0,0 +1,38 @@ +# 依赖 +node_modules + +# 构建产物 +dist/ +*.tsbuildinfo + +# 环境变量 +.env +.env.local +.env.*.local + +# 工具 +.claude/ +.mimocode/ +.agents/ +.skill-archive/ +api-tests/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# 测试 +coverage/ +test-builtin-skills.html + +# 日志 +*.log + +# OS +Thumbs.db +.DS_Store + +# 文档(本地副本,不提交) +docs/ztools-doc/ diff --git a/plugins/skill-hub/AGENTS.md b/plugins/skill-hub/AGENTS.md new file mode 100644 index 00000000..8f98c104 --- /dev/null +++ b/plugins/skill-hub/AGENTS.md @@ -0,0 +1,65 @@ +# Skill Hub + +ZTools 插件 — Vue 3 + Vite + TypeScript 技能商店与一键分发工具。 + +## 命令 + +```bash +pnpm dev # Vite 开发服务器 → http://localhost:5173 +pnpm build # vue-tsc 类型检查 → vite 构建 → dist/ +pnpm build-zip # 构建 + 打包 zip 到系统下载文件夹 +``` + +未配置测试/lint/格式化工具。`build` 是唯一的验证步骤。 + +## 架构 + +- **单页应用**:无 vue-router,手动管理路由状态(`route` ref in `App.vue`) +- **分栏布局**:左侧可调宽度面板 + 右侧内容区,通过 `startResize` 实现拖拽调整 +- **Preload 脚本**:`public/preload/services.js` 提供 Node.js 能力(文件系统、GitHub API、zip 解压) +- **技能扫描**:通过 `window.services.scanForSkillFiles()` 扫描目录中的 SKILL.md 文件 + +## 目录结构 + +``` +src/ +├── views/ # 页面组件(Home, SkillStore, AgentSkills, ProjectSkills, Settings, Sources) +├── components/ # 共享组件(Modal, Toast, PlatformIcon 等) +├── composables/ # Vue 组合式函数(useSettings 等) +├── utils/ # 工具函数(storage, theme 等) +├── data/ # 静态数据(platforms 等) +└── types.ts # TypeScript 类型定义 +public/ +├── preload/ +│ └── services.js # Node.js 服务(文件操作、GitHub API、压缩包处理) +└── plugin.json # ZTools 插件配置 +``` + +## 关键约束 + +- **禁止使用浏览器内置弹窗 API**:所有需要用户确认/提示/输入的场景,必须使用项目中已有的自定义 Modal 组件(如 `DeployModal`、`SkillDetailModal`、`AddProjectModal` 等)或 `AppToast`,不得使用 `alert()`、`confirm()`、`prompt()` + +- TypeScript `strict: false`,`noImplicitAny: false`(宽松模式) +- 无测试框架,构建即验证 +- Preload 脚本使用 CommonJS(`public/preload/package.json` 中 `"type": "commonjs"`) +- 主应用使用 ES Modules(`package.json` 中 `"type": "module"`) +- 样式使用 CSS 变量系统,支持明暗主题切换 + +## 开发注意 + +- 添加新功能需在 `src/App.vue` 的路由表中注册 +- Preload 服务通过 `window.services` 全局访问 +- ZTools API 通过 `window.ztools` 全局访问 +- 构建产物在 `dist/` 目录,需复制到 ZTools 插件目录测试 +- **打包 zip 文件时,保存到系统下载文件夹**:是系统下载路径,而非应用默认路径 + +## API 测试 + +- `api-tests/openai-api.http` — kulala.nvim 测试文件,包含 OpenAI API 多个接口 +- 使用前设置环境变量 `OPENAI_API_KEY` + +## ZTools 文档 + +- 本地副本:`docs/ztools-doc/`(9 个 markdown 文件) +- 在线地址:https://ztoolscenter.github.io/ZTools-doc/ +- 包含:快速开始、目录结构、plugin.json 配置、preload.js、Node.js 能力、插件 API、发布流程 diff --git a/plugins/skill-hub/LICENSE b/plugins/skill-hub/LICENSE new file mode 100644 index 00000000..36e125b2 --- /dev/null +++ b/plugins/skill-hub/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 zibo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/skill-hub/README.md b/plugins/skill-hub/README.md new file mode 100644 index 00000000..4739298a --- /dev/null +++ b/plugins/skill-hub/README.md @@ -0,0 +1,130 @@ +# Skill Hub + +> 一个 ZTools 插件 — AI 编写代码,本人负责使用与维护。 + +Vue 3 + Vite + TypeScript 构建的技能商店与一键分发工具。浏览 GitHub / skills.sh / 本地的 SKILL.md,扫描项目或 AI Agent 中的已有技能,并通过符号链接或复制的方式一键分发到多个 AI 平台。 + +## 快速开始 + +```bash +pnpm dev # 开发服务器 → http://localhost:5173 +pnpm build # vue-tsc 类型检查 → vite 构建 → dist/ +``` + +## 功能 + +### 我的 Skill(默认首页) + +列出已下载的技能,支持按分类筛选(全部/收藏/已分发/待分发)。每个技能卡片显示名称、作者、标签、来源,可一键安装到已检测到的 AI Agent 平台,或卸载、收藏、查看详情。 + +### Skill 商店 + +从多个来源浏览和搜索技能: + +- **Claude Code** — 官方 [anthropics/skills](https://github.com/anthropics/skills) 仓库 +- **OpenAI Codex** — 官方 [openai/skills](https://github.com/openai/skills) 仓库 +- **skills.sh** — 社区技能市场,支持搜索、热门排序、精选作者 +- **自定义源** — 可添加任意 GitHub 仓库或本地目录作为来源 + +商店支持模糊搜索和语义搜索,提供技能安全审计信息(风险等级、审查摘要)。 + +### 项目 Skill + +注册本地项目目录,自动扫描其中约定的子目录(`.claude/skills`、`.agents/skills`、`skills`、`.cursor/skills`、`.windsurf/skills` 等),识别项目内定义的 SKILL.md 文件。支持添加、编辑、删除项目,查看项目内技能的原始内容和元数据。 + +### Agent Skill + +自动检测本地已安装的 AI Agent 平台(Claude Code / Codex / Cursor / Windsurf / Cline 等),扫描各平台的技能目录,列出已有技能。支持查看技能详情和原始文件内容。 + +### 商店源管理 + +管理自定义技能来源,支持三种类型: + +- **GitHub 仓库** — 指定仓库名、分支和子目录 +- **skills.sh 源** — 社区市场 +- **本地目录** — 文件系统中的任意目录 + +### 设置 + +- 默认安装模式(符号链接/复制) +- GitHub Token 配置(用于 API 限频提升) +- 各 AI Agent 平台的路径自定义 +- 界面主题(浅色/深色/跟随系统) +- 主题色系(雾霾蓝/烟熏紫/豆沙绿/杏色橙/青碧色等莫兰迪色系) +- 字体大小、动画偏好、紧凑模式 +- 自定义背景图片 +- AI 翻译模型配置(用于技能内容的翻译) + +## 架构 + +``` +src/ +├── views/ 页面视图(8 个路由页面) +│ ├── MySkills/ 我的技能库 +│ ├── SkillStore/ 技能商店(列表 + 详情) +│ ├── ProjectSkills/ 项目技能管理 +│ ├── AgentSkills/ Agent 平台技能(列表 + 详情) +│ ├── Sources/ 商店源管理 +│ └── Settings/ 设置页面 +├── components/ 共享组件(15 个) +│ ├── Modal 家族 AddProjectModal / SkillDetailModal / ConfirmModal 等 +│ ├── AppToast 全局 Toast 提示 +│ ├── DownloadIndicator 下载进度指示器 +│ ├── PlatformIcon 平台图标 +│ ├── QuickSwitcher 快捷切换 +│ └── ... 编辑器、选择器等 +├── composables/ Vue 组合式函数 +│ ├── useSettings 设置读写与持久化 +│ ├── useProjectState 项目状态管理 +│ └── useDownloadQueue 下载队列 +├── utils/ 工具函数(9 个) +│ ├── storage.ts 本地存储(localStorage 封装) +│ ├── ai.ts AI 翻译与模型调用 +│ ├── theme.ts 主题切换 +│ ├── github.ts GitHub API 调用 +│ ├── frontmatter.ts SKILL.md 解析 +│ ├── skill-registry.ts 技能注册表 +│ ├── skills-sh.ts skills.sh API 客户端 +│ ├── source-info.ts 来源信息 +│ └── translate.ts 翻译服务 +├── data/ 静态数据 +│ ├── platforms.ts AI Agent 平台定义 +│ ├── ai-providers.ts AI 提供方配置 +│ └── skill-categories.ts 技能分类 +└── types.ts 全部 TypeScript 类型定义 + +public/ +├── plugin.json ZTools 插件配置(4 个 feature / 命令词) +└── preload/ + └── services.js Node.js 桥接层(30+ 方法) +``` + +## 平台支持 + +自动检测以下 AI Agent 平台的安装位置,支持一键分发技能: + +| 平台 | 类型 | +|---|---| +| Claude Code | 官方 | +| OpenAI Codex | 官方 | +| Cursor | 官方 | +| Windsurf | 官方 | +| Cline | 社区 | +| Gemini | 官方 | +| Trae | 社区 | +| Cherry Studio | 社区 | +| Kiro | 社区 | +| 及其他社区客户端 | — | + +## 技术栈 + +- **框架** Vue 3 + TypeScript +- **构建** Vite 6 +- **编辑器** CodeMirror 6(支持 YAML / JSON / Markdown / Python / JS / CSS / HTML 语法高亮) +- **后端** ZTools Preload 机制(Node.js 桥接) +- **包管理** pnpm + +## 说明 + +- 源代码由 AI 辅助生成,本人负责功能设计、使用与持续维护。 +- 详细开发约束与项目规范见 `AGENTS.md`。 diff --git a/plugins/skill-hub/index.html b/plugins/skill-hub/index.html new file mode 100644 index 00000000..eaa17316 --- /dev/null +++ b/plugins/skill-hub/index.html @@ -0,0 +1,11 @@ + + + + + + + +
+ + + diff --git a/plugins/skill-hub/package.json b/plugins/skill-hub/package.json new file mode 100644 index 00000000..dd013581 --- /dev/null +++ b/plugins/skill-hub/package.json @@ -0,0 +1,37 @@ +{ + "name": "skill-hub", + "version": "1.0.0", + "description": "A ZTools plugin", + "license": "MIT", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc && vite build", + "build-zip": "pnpm build && node scripts/build-zip.cjs" + }, + "dependencies": { + "@codemirror/autocomplete": "^6.20.3", + "@codemirror/commands": "^6.10.3", + "@codemirror/lang-css": "^6.3.1", + "@codemirror/lang-html": "^6.4.11", + "@codemirror/lang-javascript": "^6.2.5", + "@codemirror/lang-json": "^6.0.2", + "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/lang-python": "^6.2.1", + "@codemirror/lang-yaml": "^6.1.3", + "@codemirror/language": "^6.12.3", + "@codemirror/search": "^6.7.1", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.43.1", + "@lezer/highlight": "^1.2.3", + "codemirror": "^6.0.2", + "vue": "^3.5.13" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.1", + "@ztools-center/ztools-api-types": "^1.0.1", + "typescript": "^5.3.0", + "vite": "^6.0.11", + "vue-tsc": "^2.0.0" + } +} diff --git a/plugins/skill-hub/pnpm-lock.yaml b/plugins/skill-hub/pnpm-lock.yaml new file mode 100644 index 00000000..14e890e1 --- /dev/null +++ b/plugins/skill-hub/pnpm-lock.yaml @@ -0,0 +1,1157 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@codemirror/autocomplete': + specifier: ^6.20.3 + version: 6.20.3 + '@codemirror/commands': + specifier: ^6.10.3 + version: 6.10.3 + '@codemirror/lang-css': + specifier: ^6.3.1 + version: 6.3.1 + '@codemirror/lang-html': + specifier: ^6.4.11 + version: 6.4.11 + '@codemirror/lang-javascript': + specifier: ^6.2.5 + version: 6.2.5 + '@codemirror/lang-json': + specifier: ^6.0.2 + version: 6.0.2 + '@codemirror/lang-markdown': + specifier: ^6.5.0 + version: 6.5.0 + '@codemirror/lang-python': + specifier: ^6.2.1 + version: 6.2.1 + '@codemirror/lang-yaml': + specifier: ^6.1.3 + version: 6.1.3 + '@codemirror/language': + specifier: ^6.12.3 + version: 6.12.3 + '@codemirror/search': + specifier: ^6.7.1 + version: 6.7.1 + '@codemirror/state': + specifier: ^6.6.0 + version: 6.6.0 + '@codemirror/view': + specifier: ^6.43.1 + version: 6.43.1 + '@lezer/highlight': + specifier: ^1.2.3 + version: 1.2.3 + codemirror: + specifier: ^6.0.2 + version: 6.0.2 + vue: + specifier: ^3.5.13 + version: 3.5.38(typescript@5.9.3) + +devDependencies: + '@vitejs/plugin-vue': + specifier: ^5.2.1 + version: 5.2.4(vite@6.4.3)(vue@3.5.38) + '@ztools-center/ztools-api-types': + specifier: ^1.0.1 + version: 1.0.3 + typescript: + specifier: ^5.3.0 + version: 5.9.3 + vite: + specifier: ^6.0.11 + version: 6.4.3 + vue-tsc: + specifier: ^2.0.0 + version: 2.2.12(typescript@5.9.3) + +packages: + + /@babel/helper-string-parser@7.29.7: + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.29.7: + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + /@babel/parser@7.29.7: + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.29.7 + + /@babel/types@7.29.7: + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + /@codemirror/autocomplete@6.20.3: + resolution: {integrity: sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==} + dependencies: + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.1 + '@lezer/common': 1.5.2 + dev: false + + /@codemirror/commands@6.10.3: + resolution: {integrity: sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==} + dependencies: + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.1 + '@lezer/common': 1.5.2 + dev: false + + /@codemirror/lang-css@6.3.1: + resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@lezer/common': 1.5.2 + '@lezer/css': 1.3.3 + dev: false + + /@codemirror/lang-html@6.4.11: + resolution: {integrity: sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==} + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-javascript': 6.2.5 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.1 + '@lezer/common': 1.5.2 + '@lezer/css': 1.3.3 + '@lezer/html': 1.3.13 + dev: false + + /@codemirror/lang-javascript@6.2.5: + resolution: {integrity: sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==} + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/language': 6.12.3 + '@codemirror/lint': 6.9.7 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.1 + '@lezer/common': 1.5.2 + '@lezer/javascript': 1.5.4 + dev: false + + /@codemirror/lang-json@6.0.2: + resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==} + dependencies: + '@codemirror/language': 6.12.3 + '@lezer/json': 1.0.3 + dev: false + + /@codemirror/lang-markdown@6.5.0: + resolution: {integrity: sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==} + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/lang-html': 6.4.11 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.1 + '@lezer/common': 1.5.2 + '@lezer/markdown': 1.6.4 + dev: false + + /@codemirror/lang-python@6.2.1: + resolution: {integrity: sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw==} + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@lezer/common': 1.5.2 + '@lezer/python': 1.1.19 + dev: false + + /@codemirror/lang-yaml@6.1.3: + resolution: {integrity: sha512-AZ8DJBuXGVHybpBQhmZtgew5//4hv3tdkXnr3vDmOUMJRuB6vn/uuwtmTOTlqEaQFg3hQSVeA90NmvIQyUV6FQ==} + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + '@lezer/yaml': 1.0.4 + dev: false + + /@codemirror/language@6.12.3: + resolution: {integrity: sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==} + dependencies: + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.1 + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + style-mod: 4.1.3 + dev: false + + /@codemirror/lint@6.9.7: + resolution: {integrity: sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==} + dependencies: + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.1 + crelt: 1.0.6 + dev: false + + /@codemirror/search@6.7.1: + resolution: {integrity: sha512-uMe5UO6PamJtSHrXhhHOzSX3ReWtiJrva6GnPMwSOrZtiExb5X5eExhr2OUZQVvdxPsKpY3Ro2mFbQadpPWmHA==} + dependencies: + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.1 + crelt: 1.0.6 + dev: false + + /@codemirror/state@6.6.0: + resolution: {integrity: sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==} + dependencies: + '@marijn/find-cluster-break': 1.0.2 + dev: false + + /@codemirror/view@6.43.1: + resolution: {integrity: sha512-+BIjw/AG3tDQ4pJgTLPYdAW25eDE66YsvM4LKyVPgGzVgZ4a9Wj1SRX8kPVKgBDdPt8oHtZ15F0qx7p0oOHdHw==} + dependencies: + '@codemirror/state': 6.6.0 + crelt: 1.0.6 + style-mod: 4.1.3 + w3c-keyname: 2.2.8 + dev: false + + /@esbuild/aix-ppc64@0.25.12: + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.25.12: + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.25.12: + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.25.12: + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.25.12: + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.25.12: + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.25.12: + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.25.12: + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.25.12: + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.25.12: + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.25.12: + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.25.12: + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.25.12: + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.25.12: + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.25.12: + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.25.12: + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.25.12: + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-arm64@0.25.12: + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.25.12: + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-arm64@0.25.12: + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.25.12: + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openharmony-arm64@0.25.12: + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.25.12: + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.25.12: + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.25.12: + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.25.12: + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@jridgewell/sourcemap-codec@1.5.5: + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + /@lezer/common@1.5.2: + resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==} + dev: false + + /@lezer/css@1.3.3: + resolution: {integrity: sha512-RzBo8r+/6QJeow7aPHIpGVIH59xTcJXp399820gZoMo9noQDRVpJLheIBUicYwKcsbOYoBRoLZlf2720dG/4Tg==} + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + dev: false + + /@lezer/highlight@1.2.3: + resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} + dependencies: + '@lezer/common': 1.5.2 + dev: false + + /@lezer/html@1.3.13: + resolution: {integrity: sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==} + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + dev: false + + /@lezer/javascript@1.5.4: + resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==} + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + dev: false + + /@lezer/json@1.0.3: + resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + dev: false + + /@lezer/lr@1.4.10: + resolution: {integrity: sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==} + dependencies: + '@lezer/common': 1.5.2 + dev: false + + /@lezer/markdown@1.6.4: + resolution: {integrity: sha512-N0SxazMj4k65DBfaf1azqtMZd6u7MqluP84/NZnB/io8Td9aleFmAhz9hcbvSfsxT5tdYlJ5qgv5aMJGY4zEtA==} + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + dev: false + + /@lezer/python@1.1.19: + resolution: {integrity: sha512-MhQIURHRytsNzP/YXnqpYKW6la6voAH3kyplTOOiCdjyFY6cWWGFVmYVdHIPrElqSDf4iCDktQCockB9FxuhzQ==} + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + dev: false + + /@lezer/yaml@1.0.4: + resolution: {integrity: sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw==} + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + dev: false + + /@marijn/find-cluster-break@1.0.2: + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + dev: false + + /@rollup/rollup-android-arm-eabi@4.62.0: + resolution: {integrity: sha512-IPIQ55ythEHkfEd9jMEi32OQ7SxURsGA43JI22lj01OLZNt2NUbJX8YUHxkVWyQ6daHPNn0truF5nSj3DQp6YQ==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.62.0: + resolution: {integrity: sha512-M6s9cr10MibETyo8JsOkq+Lo1+lU6hcvb1MApnUql5qte/5hMEgzlN8/ReIKNfRV8rrqX50W1BX9zoUhC192RA==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.62.0: + resolution: {integrity: sha512-BqCoMoIbn0keKys+dEAdBa70EtOwV1bEsQCUgU9FdiZmmMge/Zk7LlkYGqbrdHR+Frnt0E1FOanly+rlwvvQzw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.62.0: + resolution: {integrity: sha512-SIMzST3VFNXDAbeIWDWiFCNM5qncUBDWaEV7NfE7oZbDt2mgfW4MvbKdbYiGOLoM32gbTv608UMd0XktEYSD7w==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-freebsd-arm64@4.62.0: + resolution: {integrity: sha512-ezjfSQMP7ArdUsbBwbQIfwAlhE84I2iVnzQNCFSveqV42q+BmKlzVpf7mxv5EchLcoWU4y6/heFzVg1F+hodUQ==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-freebsd-x64@4.62.0: + resolution: {integrity: sha512-9+qTWGW9AZRhnUgwtTwzNwcPlL87ngkeN0LA+q1bADvmY9aNvWaF2TFW8BZgnQPYxpDI7+rMVLivcd4V737TAQ==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.62.0: + resolution: {integrity: sha512-T1dMEQhXA/jkJ/jyMIw9IovK8bSUq7A8kLIlvZTb/6YIVsp2zLavr4F3oyllHWo7eIVJRyE5n3tUjQJEbE1IuQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.62.0: + resolution: {integrity: sha512-2as0LgT7qQpyceQq6VUJYnumUMUrgGQCWIiDIN9DE0/tglsk6o66uCB4f3djRawAltvfCNLyZZrsqbPA6inCsA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.62.0: + resolution: {integrity: sha512-bVURMg+6eNN9C/yc0aVjooZcwTTtYF4YW3xta5pP0//r3o1V8gXEHXWCndj47w/HhwsFroZrFhR+6uQP5T0n0g==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.62.0: + resolution: {integrity: sha512-Ful8pM/2yYI83PViWdFdpZhdI8HJ5qsXANe5atypbHDf+KIBBDsZsbyy8hbXnULVvW9NsTh5DHwbcBftyLTfiw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-loong64-gnu@4.62.0: + resolution: {integrity: sha512-9Gp/DgrkzfUBmNPVTyPTvay+4xEP7M/clXpj3efXBcm6uTIVIgDg4rqUpqKXvLEuFRVuEpSAOkhgNeecvaZ4Cg==} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-loong64-musl@4.62.0: + resolution: {integrity: sha512-m9tsJz54LUXkSYM8+8PG81B9IKK5r+2T0clMq4QrS16xFosufU7firBDAZEsDheDs7wTlP7h3++S7lMsU955HA==} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-ppc64-gnu@4.62.0: + resolution: {integrity: sha512-3UvJ5PNVU16aJf6M3tFI24pWzAl2/ynfbyRN3ICyQajK1lSkrnVYNnLz3v04J32qKa0FczJc22zeToc0lr2A3w==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-ppc64-musl@4.62.0: + resolution: {integrity: sha512-vRWUAbYLGHBZS6Q8Msb2sfnf1fvJf+47t8l/TwOerM2qArzy+IeNMTHrYLHXh95h8MoatPHI5hhSZNs+mGXKPg==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.62.0: + resolution: {integrity: sha512-c00T5SYENHAt86cfW47URaP3Us5vLC/4QO7GYud1G5VNRffCwwCuBspwqYrriuJB+5m0WFzClCn9wed0FBjKvg==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-musl@4.62.0: + resolution: {integrity: sha512-krrCDilhXOwFkSkO3Wm9I/f9H0L92XHHwy2fwxjukxIbh0dem8gZqOW5Y8BsHrpJv5qwlRBV+Wl4ZFyRWhUpwg==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.62.0: + resolution: {integrity: sha512-7pfYFSTc4/rUC/FtAI0Qp6QthDBCIi6/AuP1xYqFk5vanI6KnL5dWKP60OM/05LOsbwTmIcvr6eXC4CJuJ75IA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.62.0: + resolution: {integrity: sha512-7SDIalKeIpG0Ifogbbdn58HmSotYMlf23K3dCJEmiVd9Fg36Vmni82iPQec27N3wY4Bvbxftkxz6vSx9OcouTg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.62.0: + resolution: {integrity: sha512-eRZevouTH2i1HeAVLqJuLnt256krQkGY0TN6WsTmsIhuzbh457HuWDMakKwmi0Cjadux983CoSr8Lim2QhUIFw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-openbsd-x64@4.62.0: + resolution: {integrity: sha512-3oVS7FLGa4U1qcvao9ylGxrjXZyUQqR8UwxEcnUEyPX53O/C/mKDZegNXTdHCP+h3e6ta/f1EN38Yif1mmZHYg==} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-openharmony-arm64@4.62.0: + resolution: {integrity: sha512-yTB9TgfWj5wHe5QgktAgXTLLot1gvEjl1NiPPAUiCs4oPrIWFl5V4nC3GrkNdj9LaAU4s94nVrGbGOCqUpyWsg==} + cpu: [arm64] + os: [openharmony] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.62.0: + resolution: {integrity: sha512-5LOhoaesY3doG1c+ac/2JtgREpKoJr5bUHH8tKY0V8di7+uSV6BwLs2PlR0/yzefGOkR+wE7ZolZphHCsyG5Rw==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.62.0: + resolution: {integrity: sha512-yYkWHhmbhRTWTnWos5HC4GcPQfjlzzCNbM9e/+GXrLuaBXYA3qSDR9f0Vgufd5S8yX81U8jPKp7ZnAjZFMtRnw==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-gnu@4.62.0: + resolution: {integrity: sha512-SoTb6lPg25xZlA2ibwQ++ahCCnH+FP0qmEuafMJ4gznZKOlXioKEAeJLgCrqjM98ACziXM9V1amFjICVL4IFoA==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.62.0: + resolution: {integrity: sha512-5L+T1fMX4RIEBoZzT0+sQ0PhTS36NULFmMXtl1TZo44TMAROIMHbZufSOjVWt/Y622BtxgxtaNOokbTDvfsrZA==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@types/estree@1.0.9: + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + dev: true + + /@vitejs/plugin-vue@5.2.4(vite@6.4.3)(vue@3.5.38): + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + dependencies: + vite: 6.4.3 + vue: 3.5.38(typescript@5.9.3) + dev: true + + /@volar/language-core@2.4.15: + resolution: {integrity: sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==} + dependencies: + '@volar/source-map': 2.4.15 + dev: true + + /@volar/source-map@2.4.15: + resolution: {integrity: sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==} + dev: true + + /@volar/typescript@2.4.15: + resolution: {integrity: sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==} + dependencies: + '@volar/language-core': 2.4.15 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + dev: true + + /@vue/compiler-core@3.5.38: + resolution: {integrity: sha512-s99aGxWYig9ErHbct27KXEGhrBYlRI6c4MwAgXErOAbX9xiW37/uMa+XUDO69zLz83dng8UUZ70CTOJrLrYrEQ==} + dependencies: + '@babel/parser': 7.29.7 + '@vue/shared': 3.5.38 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + /@vue/compiler-dom@3.5.38: + resolution: {integrity: sha512-JTqp25l8aFfJYF7/KmsXZjAxJz7T+SjmTJLoXVjHtc2BrSgSiW2n9Aem/cWq1OPe68A8JL06B3eVdhlP0H4TVw==} + dependencies: + '@vue/compiler-core': 3.5.38 + '@vue/shared': 3.5.38 + + /@vue/compiler-sfc@3.5.38: + resolution: {integrity: sha512-DuA2GiZawSEW442iw/9+Fkol8hTgb4Ke5KkhmSry65QA7YuyMbIdy8p0XZRMvNwJdgRz307W8g1CSzdvS4nuNg==} + dependencies: + '@babel/parser': 7.29.7 + '@vue/compiler-core': 3.5.38 + '@vue/compiler-dom': 3.5.38 + '@vue/compiler-ssr': 3.5.38 + '@vue/shared': 3.5.38 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.15 + source-map-js: 1.2.1 + + /@vue/compiler-ssr@3.5.38: + resolution: {integrity: sha512-7s+W5Gc42FGxZMcuwl8H5B29T8BJPMdBT7KHFE+BbAuZ/iTEdTtv7z2XiMjiaUUw4w3ZcCEdHs36RuYJ2VA7bA==} + dependencies: + '@vue/compiler-dom': 3.5.38 + '@vue/shared': 3.5.38 + + /@vue/compiler-vue2@2.7.16: + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + + /@vue/language-core@2.2.12(typescript@5.9.3): + resolution: {integrity: sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 2.4.15 + '@vue/compiler-dom': 3.5.38 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.38 + alien-signals: 1.0.13 + minimatch: 9.0.9 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + typescript: 5.9.3 + dev: true + + /@vue/reactivity@3.5.38: + resolution: {integrity: sha512-pG6LV/NDNRbKizcUjFFLAfjaL8mcv4DmR9avNcUw2gDHBzZneuS2TWCmp633ynzxz9YYKNeEPK2I8Wraqy2HUQ==} + dependencies: + '@vue/shared': 3.5.38 + + /@vue/runtime-core@3.5.38: + resolution: {integrity: sha512-iyW8WVfF1CpCXxncZY5Ei6rSd6oZr5DgEom//fUjRBRl56AXPD+s9ATvukRt77ZFTuYlnVA1bxY+dJB94tWVYw==} + dependencies: + '@vue/reactivity': 3.5.38 + '@vue/shared': 3.5.38 + + /@vue/runtime-dom@3.5.38: + resolution: {integrity: sha512-apX2wt9sdfDshS+a2xueFZLVpt0GkRJZSoPmrW/SA4yzXTznhfcMVW59gr7h4YQeY0vJhdJkk2rsIDwgfFgC5A==} + dependencies: + '@vue/reactivity': 3.5.38 + '@vue/runtime-core': 3.5.38 + '@vue/shared': 3.5.38 + csstype: 3.2.3 + + /@vue/server-renderer@3.5.38(vue@3.5.38): + resolution: {integrity: sha512-vue8vbf2QlV4quHqzwmJy6dWfmRhP1J8l4wtZg60CL6VoKqcPY2oe7may3+1d9qfpedjK5PRLFqd5k3Isj9mUw==} + peerDependencies: + vue: 3.5.38 + dependencies: + '@vue/compiler-ssr': 3.5.38 + '@vue/shared': 3.5.38 + vue: 3.5.38(typescript@5.9.3) + + /@vue/shared@3.5.38: + resolution: {integrity: sha512-FTW0AFZNaK5/mOqvGBwVfUlNLU38TiQn4+DQgIFUnrBBJQ1crMJ82yeGQLV5jyKFsO8yRukpbuP7x+nRbH6aug==} + + /@ztools-center/ztools-api-types@1.0.3: + resolution: {integrity: sha512-dv1eOAIasAupqKaQL/gESk1i2+RebdM/1gvZhrvH2D/bo3enCUsAGJ8nrHnlCLBSOGB81eC/SU0IH8BNsUlmvA==} + dev: true + + /alien-signals@1.0.13: + resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /codemirror@6.0.2: + resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/commands': 6.10.3 + '@codemirror/language': 6.12.3 + '@codemirror/lint': 6.9.7 + '@codemirror/search': 6.7.1 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.1 + dev: false + + /crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + dev: false + + /csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + /de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + + /entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + /esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + /fdir@6.5.0(picomatch@4.0.4): + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + dependencies: + picomatch: 4.0.4 + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + /minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.1.1 + dev: true + + /muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + dev: true + + /nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + /picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + dev: true + + /postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + /rollup@4.62.0: + resolution: {integrity: sha512-nc72Wgq62I7rtDV4izT5/aaS0zxy3kttkinf9586ApknY3jZO9NYsmtc24fUckA0X7Q2v+ML4a15pdUlV5V/jA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.62.0 + '@rollup/rollup-android-arm64': 4.62.0 + '@rollup/rollup-darwin-arm64': 4.62.0 + '@rollup/rollup-darwin-x64': 4.62.0 + '@rollup/rollup-freebsd-arm64': 4.62.0 + '@rollup/rollup-freebsd-x64': 4.62.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.0 + '@rollup/rollup-linux-arm-musleabihf': 4.62.0 + '@rollup/rollup-linux-arm64-gnu': 4.62.0 + '@rollup/rollup-linux-arm64-musl': 4.62.0 + '@rollup/rollup-linux-loong64-gnu': 4.62.0 + '@rollup/rollup-linux-loong64-musl': 4.62.0 + '@rollup/rollup-linux-ppc64-gnu': 4.62.0 + '@rollup/rollup-linux-ppc64-musl': 4.62.0 + '@rollup/rollup-linux-riscv64-gnu': 4.62.0 + '@rollup/rollup-linux-riscv64-musl': 4.62.0 + '@rollup/rollup-linux-s390x-gnu': 4.62.0 + '@rollup/rollup-linux-x64-gnu': 4.62.0 + '@rollup/rollup-linux-x64-musl': 4.62.0 + '@rollup/rollup-openbsd-x64': 4.62.0 + '@rollup/rollup-openharmony-arm64': 4.62.0 + '@rollup/rollup-win32-arm64-msvc': 4.62.0 + '@rollup/rollup-win32-ia32-msvc': 4.62.0 + '@rollup/rollup-win32-x64-gnu': 4.62.0 + '@rollup/rollup-win32-x64-msvc': 4.62.0 + fsevents: 2.3.3 + dev: true + + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + /style-mod@4.1.3: + resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} + dev: false + + /tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + dev: true + + /typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + /vite@6.4.3: + resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.15 + rollup: 4.62.0 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + dev: true + + /vue-tsc@2.2.12(typescript@5.9.3): + resolution: {integrity: sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + dependencies: + '@volar/typescript': 2.4.15 + '@vue/language-core': 2.2.12(typescript@5.9.3) + typescript: 5.9.3 + dev: true + + /vue@3.5.38(typescript@5.9.3): + resolution: {integrity: sha512-vAMKHfImQlYSy0C+PBue4s3ERZ2xGKfgZg5GXAsLInq1dyh2H78ILVP5sK0KPFPVW4kv+OGCIvBEondcjpZp7A==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@vue/compiler-dom': 3.5.38 + '@vue/compiler-sfc': 3.5.38 + '@vue/runtime-dom': 3.5.38 + '@vue/server-renderer': 3.5.38(vue@3.5.38) + '@vue/shared': 3.5.38 + typescript: 5.9.3 + + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: false diff --git a/plugins/skill-hub/public/app-icon.png b/plugins/skill-hub/public/app-icon.png new file mode 100644 index 00000000..826ee103 Binary files /dev/null and b/plugins/skill-hub/public/app-icon.png differ diff --git a/plugins/skill-hub/public/logo.png b/plugins/skill-hub/public/logo.png new file mode 100644 index 00000000..826ee103 Binary files /dev/null and b/plugins/skill-hub/public/logo.png differ diff --git a/plugins/skill-hub/public/plugin.json b/plugins/skill-hub/public/plugin.json new file mode 100644 index 00000000..38eaf4b8 --- /dev/null +++ b/plugins/skill-hub/public/plugin.json @@ -0,0 +1,22 @@ +{ + "$schema": "../node_modules/@ztools-center/ztools-api-types/resource/ztools.schema.json", + "name": "skill-hub", + "title": "Skill Hub", + "description": "Skill 管理技能中心 — Skill 商店浏览下载、项目/Agent 扫描、一键分发", + "author": "zibo", + "version": "1.0.0", + "main": "index.html", + "preload": "preload/services.js", + "logo": "logo.png", + "development": { + "main": "http://localhost:5173" + }, + "features": [ + { + "code": "skills", + "explain": "Skill Hub — 技能商店浏览下载、项目/Agent 扫描、一键分发", + "icon": "logo.png", + "cmds": ["skills"] + } + ] +} diff --git a/plugins/skill-hub/public/preload/package-lock.json b/plugins/skill-hub/public/preload/package-lock.json new file mode 100644 index 00000000..0b59dbe5 --- /dev/null +++ b/plugins/skill-hub/public/preload/package-lock.json @@ -0,0 +1,243 @@ +{ + "name": "preload", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "adm-zip": "^0.5.17", + "extract-zip": "^2.0.1", + "tar": "^7.5.16" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@types/node": { + "version": "25.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.3.tgz", + "integrity": "sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==", + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/adm-zip": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz", + "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==", + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/tar": { + "version": "7.5.16", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", + "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "license": "MIT", + "optional": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/plugins/skill-hub/public/preload/package.json b/plugins/skill-hub/public/preload/package.json new file mode 100644 index 00000000..fa097681 --- /dev/null +++ b/plugins/skill-hub/public/preload/package.json @@ -0,0 +1,8 @@ +{ + "type": "commonjs", + "dependencies": { + "adm-zip": "^0.5.17", + "extract-zip": "^2.0.1", + "tar": "^7.5.16" + } +} diff --git a/plugins/skill-hub/public/preload/services.js b/plugins/skill-hub/public/preload/services.js new file mode 100644 index 00000000..4c3a69e0 --- /dev/null +++ b/plugins/skill-hub/public/preload/services.js @@ -0,0 +1,442 @@ +const fs = require('node:fs') +const path = require('node:path') +const https = require('node:https') +const http = require('node:http') +const os = require('node:os') +const { execFile } = require('node:child_process') +const AdmZip = require('adm-zip') +function homeDir() { + return os.homedir() +} + +function expandPath(p) { + if (!p) return '' + return p.replace(/^~/, homeDir()) +} + +function isWindows() { + return process.platform === 'win32' +} + +function isMacOS() { + return process.platform === 'darwin' +} + +function _downloadFileInternal(url, redirectCount) { + return new Promise((resolve, reject) => { + if (redirectCount > 5) { + return reject(new Error('Too many redirects')) + } + const client = url.startsWith('https') ? https : http + const chunks = [] + client.get(url, { headers: { 'User-Agent': 'skill-hub' } }, (res) => { + if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { + return resolve(_downloadFileInternal(res.headers.location, redirectCount + 1)) + } + if (res.statusCode !== 200) { + return reject(new Error(`Download failed: ${res.statusCode}`)) + } + res.on('data', (c) => chunks.push(c)) + res.on('end', () => resolve(Buffer.concat(chunks))) + res.on('error', reject) + }).on('error', reject) + }) +} + +function _fetchGitHubTextInternal(url, token, redirectCount) { + return new Promise((resolve, reject) => { + if (redirectCount > 5) { + return reject(new Error('Too many redirects')) + } + const headers = { + Accept: 'application/vnd.github.v3.raw', + 'User-Agent': 'skill-hub', + } + if (token) headers['Authorization'] = `Bearer ${token}` + const client = url.startsWith('https') ? https : http + client.get(url, { headers }, (res) => { + if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { + return resolve(_fetchGitHubTextInternal(res.headers.location, token, redirectCount + 1)) + } + let data = '' + res.on('data', (c) => (data += c)) + res.on('end', () => { + if (res.statusCode !== 200) reject(new Error(`GitHub raw: ${res.statusCode}`)) + else resolve(data) + }) + res.on('error', reject) + }).on('error', reject) + }) +} + +window.services = { + // === 原始保留服务 === + readFile(file) { + try { + return fs.readFileSync(expandPath(file), { encoding: 'utf-8' }) + } catch { + return null + } + }, + // === 路径工具 === + expandPath, + homeDir, + isWindows, + isMacOS, + pathJoin: (...parts) => path.join(...parts), + pathExists(p) { + const full = expandPath(p) + try { + fs.lstatSync(full) + return true + } catch { + return false + } + }, + mkdir(dir) { + fs.mkdirSync(expandPath(dir), { recursive: true }) + }, + openFolder(dir) { + const fullPath = expandPath(dir) + if (!fs.existsSync(fullPath)) return + if (isWindows()) { + execFile('explorer', [fullPath]) + } else if (process.platform === 'darwin') { + execFile('open', [fullPath]) + } else { + execFile('xdg-open', [fullPath]) + } + }, + readDir(dir) { + try { + return fs.readdirSync(expandPath(dir), { withFileTypes: true }).map((d) => ({ + name: d.name, + path: path.join(expandPath(dir), d.name), + isDirectory: d.isDirectory(), + isFile: d.isFile(), + isSymlink: d.isSymbolicLink(), + })) + } catch { + return [] + } + }, + readFileText(filePath) { + try { + return fs.readFileSync(expandPath(filePath), { encoding: 'utf-8' }) + } catch { + return null + } + }, + writeFile(filePath, content) { + const full = expandPath(filePath) + this.mkdir(path.dirname(full)) + fs.writeFileSync(full, content, { encoding: 'utf-8' }) + }, + removeFile(filePath) { + const full = expandPath(filePath) + try { + fs.lstatSync(full) + fs.rmSync(full, { recursive: true }) + } catch {} + }, + copyFile(src, dest) { + const fullSrc = expandPath(src) + const fullDest = expandPath(dest) + this.mkdir(path.dirname(fullDest)) + const tempDest = fullDest + `.tmp.${Date.now()}` + try { + fs.cpSync(fullSrc, tempDest, { recursive: true, dereference: true }) + try { + fs.lstatSync(fullDest) + fs.rmSync(fullDest, { recursive: true }) + } catch {} + fs.renameSync(tempDest, fullDest) + } catch (err) { + try { fs.rmSync(tempDest, { recursive: true, force: true }) } catch {} + throw err + } + }, + stat(p) { + try { + const s = fs.statSync(expandPath(p)) + return { exists: true, isDirectory: s.isDirectory(), isFile: s.isFile(), isSymlink: s.isSymbolicLink(), size: s.size, mtime: s.mtime.toISOString() } + } catch { + return { exists: false } + } + }, + + // === Symlink 支持 === + createSymlink(target, linkPath) { + const fullTarget = expandPath(target) + const fullLink = expandPath(linkPath) + this.mkdir(path.dirname(fullLink)) + try { + fs.lstatSync(fullLink) + fs.rmSync(fullLink, { recursive: true }) + } catch {} + if (isWindows()) { + try { + const stats = fs.statSync(fullTarget) + if (stats.isDirectory()) { + fs.symlinkSync(fullTarget, fullLink, 'junction') + } else { + fs.symlinkSync(fullTarget, fullLink, 'file') + } + } catch (e) { + throw new Error(`Cannot create symlink: target "${fullTarget}" does not exist or is not accessible`) + } + } else { + fs.symlinkSync(fullTarget, fullLink) + } + return fullLink + }, + // === 下载 === + downloadFile(url) { + return _downloadFileInternal(url, 0) + }, + fetchGitHubText(url, token) { + return _fetchGitHubTextInternal(url, token, 0) + }, + + // === 压缩包解压 === + extractBufferZip(buffer, dest) { + const fullDest = expandPath(dest) + this.mkdir(fullDest) + const zip = new AdmZip(Buffer.from(buffer)) + const entries = zip.getEntries() + for (const entry of entries) { + const entryPath = entry.entryName + const resolved = path.resolve(fullDest, entryPath) + if (!resolved.startsWith(fullDest + path.sep) && resolved !== fullDest) { + throw new Error(`Zip Slip detected: "${entryPath}" escapes destination`) + } + } + zip.extractAllTo(fullDest, true) + return fullDest + }, + // === SKILL.md 扫描 === + scanForSkills(rootDir) { + const fullRoot = expandPath(rootDir) + const results = [] + if (!fs.existsSync(fullRoot)) return results + try { + const entries = fs.readdirSync(fullRoot, { withFileTypes: true }) + for (const entry of entries) { + const entryPath = path.join(fullRoot, entry.name) + let isDir = entry.isDirectory() + let isSymlinkEntry = entry.isSymbolicLink ? entry.isSymbolicLink() : false + + if (!isDir && !isSymlinkEntry) { + try { + const st = fs.statSync(entryPath) + isDir = st.isDirectory() + } catch {} + } + + if (isDir || isSymlinkEntry) { + const skillPath = path.join(entryPath, 'SKILL.md') + if (fs.existsSync(skillPath)) { + const content = fs.readFileSync(skillPath, 'utf-8') + let isSymlink = isSymlinkEntry + if (!isSymlink) { + try { + const lstats = fs.lstatSync(entryPath) + isSymlink = lstats.isSymbolicLink() + } catch {} + } + results.push({ + name: entry.name, + dir: entryPath, + skillFile: skillPath, + content, + isSymlink, + manifest: parseSkillFrontmatter(content), + }) + } + } + } + } catch {} + return results + }, + scanForSkillFiles(dirs) { + const all = [] + for (const dir of dirs) { + const found = this.scanForSkills(dir) + all.push(...found) + } + return all + }, + parseSkillFile(filePath) { + const full = expandPath(filePath) + if (!fs.existsSync(full)) return null + const content = fs.readFileSync(full, 'utf-8') + return { content, manifest: parseSkillFrontmatter(content) } + }, + + // === Skill Update Check === + async checkSkillUpdate(repo, skillPath, token, branch) { + const pathCandidates = [ + skillPath ? `${skillPath}/SKILL.md` : null, + skillPath ? `skills/${skillPath}/SKILL.md` : null, + skillPath ? `agent-skills/${skillPath}/SKILL.md` : null, + 'SKILL.md', + ].filter(Boolean) + const branches = branch ? [branch, 'main', 'master'] : ['main', 'master'] + const tried = new Set() + for (const b of branches) { + if (tried.has(b)) continue + tried.add(b) + for (const p of pathCandidates) { + const url = `https://raw.githubusercontent.com/${repo}/${b}/${p}` + try { + const text = await this.fetchGitHubText(url, token) + return text + } catch (err) { + if (err.message?.includes('404')) continue + throw err + } + } + } + return null + }, + async updateSkillFromGitHub(repo, skillPath, targetDir, token, branch) { + let buffer + const branches = branch ? [branch, 'main', 'master'] : ['main', 'master'] + const tried = new Set() + for (const b of branches) { + if (tried.has(b)) continue + tried.add(b) + try { + buffer = await this.downloadFile(`https://api.github.com/repos/${repo}/zipball/${b}`) + break + } catch (err) { + if (b === branches[branches.length - 1]) throw err + } + } + const tempDir = path.join(homeDir(), '.cache/skill-hub/') + fs.mkdirSync(tempDir, { recursive: true }) + const extractDir = path.join(tempDir, `update-${Date.now()}`) + if (fs.existsSync(extractDir)) fs.rmSync(extractDir, { recursive: true }) + this.extractBufferZip(buffer, extractDir) + const extractedItems = this.readDir(extractDir) + const rootDir = extractedItems.find((d) => d.isDirectory) + const sourceRoot = rootDir ? rootDir.path : extractDir + const pathCandidates = [ + skillPath, + `skills/${skillPath}`, + `agent-skills/${skillPath}`, + ] + let skillSourceDir = '' + for (const p of pathCandidates) { + const candidate = path.join(sourceRoot, p) + if (fs.existsSync(candidate)) { skillSourceDir = candidate; break } + } + if (!skillSourceDir) { fs.rmSync(extractDir, { recursive: true }); return false } + if (fs.existsSync(targetDir)) fs.rmSync(targetDir, { recursive: true }) + fs.mkdirSync(targetDir, { recursive: true }) + this.copyFile(skillSourceDir, targetDir) + fs.rmSync(extractDir, { recursive: true }) + return true + }, + + // === Skills Repo === + getStateDir() { + const stateDir = path.join(window.ztools.getPath('userData'), 'skills-repo') + if (!fs.existsSync(stateDir)) { + fs.mkdirSync(stateDir, { recursive: true }) + } + return stateDir + }, +} + +function parseSkillFrontmatter(content) { + const manifest = { name: '', description: '', author: '', tags: [], format: 'opencode', language: 'en' } + const normalized = content.replace(/^\uFEFF/, '').replace(/\r\n/g, '\n').replace(/\r/g, '\n') + const match = normalized.match(/^---\n([\s\S]*?)\n---/) + if (!match) { + manifest.name = path.basename(process.cwd()) + } else { + const lines = match[1].split('\n') + let i = 0 + while (i < lines.length) { + const line = lines[i] + const kv = line.match(/^(\w+):\s*(.*)$/) + if (!kv) { i++; continue } + const [, key, val] = kv + if (key === 'tags') { + manifest.tags = val.replace(/[[\]']/g, '').split(',').map((t) => t.trim()).filter(Boolean) + } else if (key === 'name') manifest.name = val.trim() + else if (key === 'description') { + let d = val.trim() + const blockMatch = d.match(/^([>|])([+-]?)$/) + if (blockMatch) { + const style = blockMatch[1] + const chomp = blockMatch[2] + const blockLines = [] + i++ + while (i < lines.length) { + const next = lines[i] + if (next === '' || next.startsWith(' ') || next.startsWith('\t')) { + blockLines.push(next.trimEnd()) + i++ + } else { + break + } + } + i-- + if (style === '>') { + const paragraphs = [] + let current = [] + for (const bl of blockLines) { + if (bl === '') { + if (current.length) { paragraphs.push(current.join(' ')); current = [] } + } else { + current.push(bl) + } + } + if (current.length) paragraphs.push(current.join(' ')) + d = paragraphs.join('\n\n') + if (chomp === '+' && blockLines.length > 0) { + const trailing = blockLines.reduce((n, l) => l === '' ? n + 1 : 0, 0) + for (let t = 0; t < trailing; t++) d += '\n' + } + } else { + d = blockLines.join('\n').trimEnd() + } + } else if (d === '' || d === '""' || d === "''") { + const nextIdx = i + 1 + if (nextIdx < lines.length && (lines[nextIdx].startsWith(' ') || lines[nextIdx].startsWith('\t'))) { + const blockLines = [] + i++ + while (i < lines.length) { + const curr = lines[i] + if (curr.startsWith(' ') || curr.startsWith('\t')) { + blockLines.push(curr.trimEnd()) + i++ + } else { + break + } + } + i-- + d = blockLines.join(' ').replace(/\s+/g, ' ').trim() + } + } + if (d.startsWith('[') && d.endsWith(']')) { + d = d.slice(1, -1).trim() + } + manifest.description = d + } + else if (key === 'author') manifest.author = val.trim() + else if (key === 'format') manifest.format = val.trim() + else if (key === 'language') manifest.language = val.trim() + i++ + } + } + if (!manifest.description) { + const bodyStart = match ? match[0].length : 0 + const body = normalized.slice(bodyStart).trim() + const firstLine = body.split('\n').find((l) => l.trim() && !l.startsWith('#')) + if (firstLine) manifest.description = firstLine.trim().slice(0, 200) + } + return manifest +} diff --git a/plugins/skill-hub/scripts/build-zip.cjs b/plugins/skill-hub/scripts/build-zip.cjs new file mode 100644 index 00000000..a8442d94 --- /dev/null +++ b/plugins/skill-hub/scripts/build-zip.cjs @@ -0,0 +1,58 @@ +const fs = require('fs') +const path = require('path') +const os = require('os') +const { execSync } = require('child_process') + +const projectRoot = path.resolve(__dirname, '..') +const distDir = path.join(projectRoot, 'dist') + +if (!fs.existsSync(distDir)) { + console.error('dist/ directory not found. Run `pnpm build` first.') + process.exit(1) +} + +const pluginJson = JSON.parse(fs.readFileSync(path.join(distDir, 'plugin.json'), 'utf-8')) +const pluginName = pluginJson.name || 'skill-hub' +const version = pluginJson.version || '1.0.0' +const zipName = `${pluginName}-${version}.zip` +const AdmZip = require(path.join(projectRoot, 'public', 'preload', 'node_modules', 'adm-zip')) +const zip = new AdmZip() + +function addDirToZip(zipInstance, dirPath, zipPath) { + const entries = fs.readdirSync(dirPath, { withFileTypes: true }) + for (const entry of entries) { + const fullPath = path.join(dirPath, entry.name) + const entryPath = zipPath ? `${zipPath}/${entry.name}` : entry.name + if (entry.isDirectory()) { + addDirToZip(zipInstance, fullPath, entryPath) + } else { + zipInstance.addLocalFile(fullPath, path.dirname(entryPath) || '.') + } + } +} + +addDirToZip(zip, distDir, '') + +const tmpPath = path.join(distDir, zipName) +zip.writeZip(tmpPath) + +function getDownloadsDir() { + if (process.platform === 'win32') { + try { + const psScript = `(New-Object -ComObject Shell.Application).NameSpace('Shell:Downloads').Self.Path` + const result = execSync(`powershell -NoProfile -Command "${psScript}"`, { encoding: 'utf-8' }).trim() + if (result && fs.existsSync(result)) return result + } catch {} + } + return path.join(os.homedir(), 'Downloads') +} + +const downloadsDir = getDownloadsDir() +fs.mkdirSync(downloadsDir, { recursive: true }) +const outputPath = path.join(downloadsDir, zipName) +fs.copyFileSync(tmpPath, outputPath) +fs.unlinkSync(tmpPath) + +const stats = fs.statSync(outputPath) +const sizeKB = (stats.size / 1024).toFixed(1) +console.log(`Plugin zip moved to: ${outputPath} (${sizeKB} KB)`) diff --git a/plugins/skill-hub/src/App.vue b/plugins/skill-hub/src/App.vue new file mode 100644 index 00000000..8caec5a7 --- /dev/null +++ b/plugins/skill-hub/src/App.vue @@ -0,0 +1,893 @@ + + + + + diff --git a/plugins/skill-hub/src/assets/platforms/antigravity.svg b/plugins/skill-hub/src/assets/platforms/antigravity.svg new file mode 100644 index 00000000..093cce54 --- /dev/null +++ b/plugins/skill-hub/src/assets/platforms/antigravity.svg @@ -0,0 +1 @@ +Antigravity diff --git a/plugins/skill-hub/src/assets/platforms/cherry-studio.png b/plugins/skill-hub/src/assets/platforms/cherry-studio.png new file mode 100644 index 00000000..0f15b3af Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/cherry-studio.png differ diff --git a/plugins/skill-hub/src/assets/platforms/claude.png b/plugins/skill-hub/src/assets/platforms/claude.png new file mode 100644 index 00000000..64b6a212 Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/claude.png differ diff --git a/plugins/skill-hub/src/assets/platforms/claude.svg b/plugins/skill-hub/src/assets/platforms/claude.svg new file mode 100644 index 00000000..b6aa3242 --- /dev/null +++ b/plugins/skill-hub/src/assets/platforms/claude.svg @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/platforms/cline.svg b/plugins/skill-hub/src/assets/platforms/cline.svg new file mode 100644 index 00000000..33474a8c --- /dev/null +++ b/plugins/skill-hub/src/assets/platforms/cline.svg @@ -0,0 +1,16 @@ + + + Cline Icon + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/platforms/codebuddy-light.svg b/plugins/skill-hub/src/assets/platforms/codebuddy-light.svg new file mode 100644 index 00000000..b453b877 --- /dev/null +++ b/plugins/skill-hub/src/assets/platforms/codebuddy-light.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/platforms/codex.png b/plugins/skill-hub/src/assets/platforms/codex.png new file mode 100644 index 00000000..91bc9f53 Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/codex.png differ diff --git a/plugins/skill-hub/src/assets/platforms/copilot.png b/plugins/skill-hub/src/assets/platforms/copilot.png new file mode 100644 index 00000000..c9adf868 Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/copilot.png differ diff --git a/plugins/skill-hub/src/assets/platforms/copilot.svg b/plugins/skill-hub/src/assets/platforms/copilot.svg new file mode 100644 index 00000000..3095f2ee --- /dev/null +++ b/plugins/skill-hub/src/assets/platforms/copilot.svg @@ -0,0 +1,8 @@ + + + diff --git a/plugins/skill-hub/src/assets/platforms/cursor.png b/plugins/skill-hub/src/assets/platforms/cursor.png new file mode 100644 index 00000000..86fe0427 Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/cursor.png differ diff --git a/plugins/skill-hub/src/assets/platforms/gemini.png b/plugins/skill-hub/src/assets/platforms/gemini.png new file mode 100644 index 00000000..15aaef48 Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/gemini.png differ diff --git a/plugins/skill-hub/src/assets/platforms/gemini.svg b/plugins/skill-hub/src/assets/platforms/gemini.svg new file mode 100644 index 00000000..bbd87eab --- /dev/null +++ b/plugins/skill-hub/src/assets/platforms/gemini.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/platforms/generic.svg b/plugins/skill-hub/src/assets/platforms/generic.svg new file mode 100644 index 00000000..8c80ba27 --- /dev/null +++ b/plugins/skill-hub/src/assets/platforms/generic.svg @@ -0,0 +1 @@ + diff --git a/plugins/skill-hub/src/assets/platforms/hermes.svg b/plugins/skill-hub/src/assets/platforms/hermes.svg new file mode 100644 index 00000000..30219254 --- /dev/null +++ b/plugins/skill-hub/src/assets/platforms/hermes.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/platforms/kilo-light.svg b/plugins/skill-hub/src/assets/platforms/kilo-light.svg new file mode 100644 index 00000000..53469c85 --- /dev/null +++ b/plugins/skill-hub/src/assets/platforms/kilo-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/plugins/skill-hub/src/assets/platforms/kiro.png b/plugins/skill-hub/src/assets/platforms/kiro.png new file mode 100644 index 00000000..04527185 Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/kiro.png differ diff --git a/plugins/skill-hub/src/assets/platforms/mimo.png b/plugins/skill-hub/src/assets/platforms/mimo.png new file mode 100644 index 00000000..5570c340 Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/mimo.png differ diff --git a/plugins/skill-hub/src/assets/platforms/openclaw.png b/plugins/skill-hub/src/assets/platforms/openclaw.png new file mode 100644 index 00000000..71781843 Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/openclaw.png differ diff --git a/plugins/skill-hub/src/assets/platforms/opencode.png b/plugins/skill-hub/src/assets/platforms/opencode.png new file mode 100644 index 00000000..71b86683 Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/opencode.png differ diff --git a/plugins/skill-hub/src/assets/platforms/opencode.svg b/plugins/skill-hub/src/assets/platforms/opencode.svg new file mode 100644 index 00000000..6100225a --- /dev/null +++ b/plugins/skill-hub/src/assets/platforms/opencode.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/platforms/qoder.png b/plugins/skill-hub/src/assets/platforms/qoder.png new file mode 100644 index 00000000..17c53f9d Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/qoder.png differ diff --git a/plugins/skill-hub/src/assets/platforms/qoder.svg b/plugins/skill-hub/src/assets/platforms/qoder.svg new file mode 100644 index 00000000..9c47ae67 --- /dev/null +++ b/plugins/skill-hub/src/assets/platforms/qoder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/skill-hub/src/assets/platforms/qoderwork.png b/plugins/skill-hub/src/assets/platforms/qoderwork.png new file mode 100644 index 00000000..17c53f9d Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/qoderwork.png differ diff --git a/plugins/skill-hub/src/assets/platforms/skills-sh-favicon.ico b/plugins/skill-hub/src/assets/platforms/skills-sh-favicon.ico new file mode 100644 index 00000000..718d6fea Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/skills-sh-favicon.ico differ diff --git a/plugins/skill-hub/src/assets/platforms/trae.png b/plugins/skill-hub/src/assets/platforms/trae.png new file mode 100644 index 00000000..c27ce0c8 Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/trae.png differ diff --git a/plugins/skill-hub/src/assets/platforms/windsurf.png b/plugins/skill-hub/src/assets/platforms/windsurf.png new file mode 100644 index 00000000..767ad05c Binary files /dev/null and b/plugins/skill-hub/src/assets/platforms/windsurf.png differ diff --git a/plugins/skill-hub/src/assets/providers/302ai.svg b/plugins/skill-hub/src/assets/providers/302ai.svg new file mode 100644 index 00000000..8144a108 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/302ai.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/3min-top.svg b/plugins/skill-hub/src/assets/providers/3min-top.svg new file mode 100644 index 00000000..c49d5c23 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/3min-top.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/abacus.svg b/plugins/skill-hub/src/assets/providers/abacus.svg new file mode 100644 index 00000000..f17dd1e5 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/abacus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/skill-hub/src/assets/providers/ai-only.svg b/plugins/skill-hub/src/assets/providers/ai-only.svg new file mode 100644 index 00000000..b23b7c63 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/ai-only.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/ai-studio.svg b/plugins/skill-hub/src/assets/providers/ai-studio.svg new file mode 100644 index 00000000..f0a4976b --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/ai-studio.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/ai21.svg b/plugins/skill-hub/src/assets/providers/ai21.svg new file mode 100644 index 00000000..210bb2fb --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/ai21.svg @@ -0,0 +1,4 @@ + + + + diff --git a/plugins/skill-hub/src/assets/providers/aihubmix.svg b/plugins/skill-hub/src/assets/providers/aihubmix.svg new file mode 100644 index 00000000..d08badd7 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/aihubmix.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/aionlabs.svg b/plugins/skill-hub/src/assets/providers/aionlabs.svg new file mode 100644 index 00000000..570cb362 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/aionlabs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/skill-hub/src/assets/providers/alayanew.svg b/plugins/skill-hub/src/assets/providers/alayanew.svg new file mode 100644 index 00000000..ce431297 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/alayanew.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/allenai.svg b/plugins/skill-hub/src/assets/providers/allenai.svg new file mode 100644 index 00000000..9284bda4 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/allenai.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/anthropic.svg b/plugins/skill-hub/src/assets/providers/anthropic.svg new file mode 100644 index 00000000..c270b3dc --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/anthropic.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/application.svg b/plugins/skill-hub/src/assets/providers/application.svg new file mode 100644 index 00000000..2d8de64d --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/application.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/arcee-ai.svg b/plugins/skill-hub/src/assets/providers/arcee-ai.svg new file mode 100644 index 00000000..3068ed52 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/arcee-ai.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/aws-bedrock.svg b/plugins/skill-hub/src/assets/providers/aws-bedrock.svg new file mode 100644 index 00000000..cb9ae000 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/aws-bedrock.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/azureai.svg b/plugins/skill-hub/src/assets/providers/azureai.svg new file mode 100644 index 00000000..1ed8fd82 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/azureai.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/baai.svg b/plugins/skill-hub/src/assets/providers/baai.svg new file mode 100644 index 00000000..c7d5cdce --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/baai.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/baichuan.svg b/plugins/skill-hub/src/assets/providers/baichuan.svg new file mode 100644 index 00000000..c2af3b45 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/baichuan.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/baidu-cloud.svg b/plugins/skill-hub/src/assets/providers/baidu-cloud.svg new file mode 100644 index 00000000..0d51263b --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/baidu-cloud.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/baidu.svg b/plugins/skill-hub/src/assets/providers/baidu.svg new file mode 100644 index 00000000..9521ffa1 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/baidu.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/bailian.svg b/plugins/skill-hub/src/assets/providers/bailian.svg new file mode 100644 index 00000000..a11e9197 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/bailian.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/bfl.svg b/plugins/skill-hub/src/assets/providers/bfl.svg new file mode 100644 index 00000000..bfae844a --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/bfl.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/bing.svg b/plugins/skill-hub/src/assets/providers/bing.svg new file mode 100644 index 00000000..579fc7be --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/bing.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/bocha.svg b/plugins/skill-hub/src/assets/providers/bocha.svg new file mode 100644 index 00000000..ddc96e5f --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/bocha.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/bolt-new.svg b/plugins/skill-hub/src/assets/providers/bolt-new.svg new file mode 100644 index 00000000..63cfed78 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/bolt-new.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/burncloud.svg b/plugins/skill-hub/src/assets/providers/burncloud.svg new file mode 100644 index 00000000..908ae5b1 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/burncloud.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/bytedance.svg b/plugins/skill-hub/src/assets/providers/bytedance.svg new file mode 100644 index 00000000..ba9b9ad4 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/bytedance.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/cephalon.svg b/plugins/skill-hub/src/assets/providers/cephalon.svg new file mode 100644 index 00000000..7cc15232 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/cephalon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/cerebras.svg b/plugins/skill-hub/src/assets/providers/cerebras.svg new file mode 100644 index 00000000..2ddbfc10 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/cerebras.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/cherryin.svg b/plugins/skill-hub/src/assets/providers/cherryin.svg new file mode 100644 index 00000000..3cdc9d3f --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/cherryin.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/cloudflare.svg b/plugins/skill-hub/src/assets/providers/cloudflare.svg new file mode 100644 index 00000000..c7819b12 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/cloudflare.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/deepseek.svg b/plugins/skill-hub/src/assets/providers/deepseek.svg new file mode 100644 index 00000000..39203e7f --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/deepseek.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/devv.svg b/plugins/skill-hub/src/assets/providers/devv.svg new file mode 100644 index 00000000..d322a443 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/devv.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/dify.svg b/plugins/skill-hub/src/assets/providers/dify.svg new file mode 100644 index 00000000..765dd71d --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/dify.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/dmxapi.svg b/plugins/skill-hub/src/assets/providers/dmxapi.svg new file mode 100644 index 00000000..c6ac368f --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/dmxapi.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/doc2x.svg b/plugins/skill-hub/src/assets/providers/doc2x.svg new file mode 100644 index 00000000..97a55a8c --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/doc2x.svg @@ -0,0 +1,4 @@ + + + + diff --git a/plugins/skill-hub/src/assets/providers/dola.svg b/plugins/skill-hub/src/assets/providers/dola.svg new file mode 100644 index 00000000..f7b3be85 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/dola.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/dolphin-ai.svg b/plugins/skill-hub/src/assets/providers/dolphin-ai.svg new file mode 100644 index 00000000..30471cc3 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/dolphin-ai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/skill-hub/src/assets/providers/doubao.svg b/plugins/skill-hub/src/assets/providers/doubao.svg new file mode 100644 index 00000000..6c4f2471 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/doubao.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/duck.svg b/plugins/skill-hub/src/assets/providers/duck.svg new file mode 100644 index 00000000..0ea2053d --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/duck.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/elevenlabs.svg b/plugins/skill-hub/src/assets/providers/elevenlabs.svg new file mode 100644 index 00000000..c26cc0a0 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/elevenlabs.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/essential-ai.svg b/plugins/skill-hub/src/assets/providers/essential-ai.svg new file mode 100644 index 00000000..879fe07d --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/essential-ai.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/plugins/skill-hub/src/assets/providers/exa.svg b/plugins/skill-hub/src/assets/providers/exa.svg new file mode 100644 index 00000000..d009cbdf --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/exa.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/felo.svg b/plugins/skill-hub/src/assets/providers/felo.svg new file mode 100644 index 00000000..453fa6cb --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/felo.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/fireworks.svg b/plugins/skill-hub/src/assets/providers/fireworks.svg new file mode 100644 index 00000000..a3dfacdc --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/fireworks.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/flowith.svg b/plugins/skill-hub/src/assets/providers/flowith.svg new file mode 100644 index 00000000..86916162 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/flowith.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/genspark.svg b/plugins/skill-hub/src/assets/providers/genspark.svg new file mode 100644 index 00000000..92c16b5e --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/genspark.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/gitee-ai.svg b/plugins/skill-hub/src/assets/providers/gitee-ai.svg new file mode 100644 index 00000000..0b39dcd8 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/gitee-ai.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/github-copilot.svg b/plugins/skill-hub/src/assets/providers/github-copilot.svg new file mode 100644 index 00000000..b0566cbb --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/github-copilot.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/github.svg b/plugins/skill-hub/src/assets/providers/github.svg new file mode 100644 index 00000000..3394ad48 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/github.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/glama.svg b/plugins/skill-hub/src/assets/providers/glama.svg new file mode 100644 index 00000000..59fed594 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/glama.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/plugins/skill-hub/src/assets/providers/google.svg b/plugins/skill-hub/src/assets/providers/google.svg new file mode 100644 index 00000000..d1f0cd3c --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/google.svg @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/gpustack.svg b/plugins/skill-hub/src/assets/providers/gpustack.svg new file mode 100644 index 00000000..d7388d24 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/gpustack.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/graph-rag.svg b/plugins/skill-hub/src/assets/providers/graph-rag.svg new file mode 100644 index 00000000..25b12445 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/graph-rag.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/grok.svg b/plugins/skill-hub/src/assets/providers/grok.svg new file mode 100644 index 00000000..346a99ab --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/grok.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/groq.svg b/plugins/skill-hub/src/assets/providers/groq.svg new file mode 100644 index 00000000..a8774bf2 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/groq.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/higress.svg b/plugins/skill-hub/src/assets/providers/higress.svg new file mode 100644 index 00000000..aed25d6a --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/higress.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/huggingface.svg b/plugins/skill-hub/src/assets/providers/huggingface.svg new file mode 100644 index 00000000..4785042a --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/huggingface.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/hyperbolic.svg b/plugins/skill-hub/src/assets/providers/hyperbolic.svg new file mode 100644 index 00000000..57dde1f7 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/hyperbolic.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/ideogram.svg b/plugins/skill-hub/src/assets/providers/ideogram.svg new file mode 100644 index 00000000..41d28572 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/ideogram.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/ima.svg b/plugins/skill-hub/src/assets/providers/ima.svg new file mode 100644 index 00000000..ed9ed6b4 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/ima.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/inceptionlabs.svg b/plugins/skill-hub/src/assets/providers/inceptionlabs.svg new file mode 100644 index 00000000..d9422565 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/inceptionlabs.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/infini.svg b/plugins/skill-hub/src/assets/providers/infini.svg new file mode 100644 index 00000000..b254c02f --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/infini.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/inflection.svg b/plugins/skill-hub/src/assets/providers/inflection.svg new file mode 100644 index 00000000..cfc9c542 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/inflection.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/intel.svg b/plugins/skill-hub/src/assets/providers/intel.svg new file mode 100644 index 00000000..074d85b8 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/intel.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/internlm.svg b/plugins/skill-hub/src/assets/providers/internlm.svg new file mode 100644 index 00000000..54f275e5 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/internlm.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/jimeng.svg b/plugins/skill-hub/src/assets/providers/jimeng.svg new file mode 100644 index 00000000..e34d3aed --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/jimeng.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/kling.svg b/plugins/skill-hub/src/assets/providers/kling.svg new file mode 100644 index 00000000..6b2776c3 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/kling.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/kwaipilot.svg b/plugins/skill-hub/src/assets/providers/kwaipilot.svg new file mode 100644 index 00000000..1b7e8986 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/kwaipilot.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/lambda.svg b/plugins/skill-hub/src/assets/providers/lambda.svg new file mode 100644 index 00000000..093250c5 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/lambda.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/lanyun.svg b/plugins/skill-hub/src/assets/providers/lanyun.svg new file mode 100644 index 00000000..94639f45 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/lanyun.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/lepton.svg b/plugins/skill-hub/src/assets/providers/lepton.svg new file mode 100644 index 00000000..b2bd3d9f --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/lepton.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/lingxi.svg b/plugins/skill-hub/src/assets/providers/lingxi.svg new file mode 100644 index 00000000..48ba5e7e --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/lingxi.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/liquid.svg b/plugins/skill-hub/src/assets/providers/liquid.svg new file mode 100644 index 00000000..c94b9ce0 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/liquid.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/lmstudio.svg b/plugins/skill-hub/src/assets/providers/lmstudio.svg new file mode 100644 index 00000000..6cd6e4bc --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/lmstudio.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/longcat.svg b/plugins/skill-hub/src/assets/providers/longcat.svg new file mode 100644 index 00000000..234a4364 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/longcat.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/macos.svg b/plugins/skill-hub/src/assets/providers/macos.svg new file mode 100644 index 00000000..9a5c32a5 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/macos.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/mcp.svg b/plugins/skill-hub/src/assets/providers/mcp.svg new file mode 100644 index 00000000..17fbbec1 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/mcp.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/mcprouter.svg b/plugins/skill-hub/src/assets/providers/mcprouter.svg new file mode 100644 index 00000000..c92f8af7 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/mcprouter.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/mcpso.svg b/plugins/skill-hub/src/assets/providers/mcpso.svg new file mode 100644 index 00000000..3ff76a8f --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/mcpso.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/meta.svg b/plugins/skill-hub/src/assets/providers/meta.svg new file mode 100644 index 00000000..a6dee8bd --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/meta.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/metaso.svg b/plugins/skill-hub/src/assets/providers/metaso.svg new file mode 100644 index 00000000..52d88b86 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/metaso.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/mineru.svg b/plugins/skill-hub/src/assets/providers/mineru.svg new file mode 100644 index 00000000..68e881b4 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/mineru.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/minimax-agent.svg b/plugins/skill-hub/src/assets/providers/minimax-agent.svg new file mode 100644 index 00000000..27ed8886 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/minimax-agent.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/minimax.svg b/plugins/skill-hub/src/assets/providers/minimax.svg new file mode 100644 index 00000000..8e733d67 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/minimax.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/mistral.svg b/plugins/skill-hub/src/assets/providers/mistral.svg new file mode 100644 index 00000000..18303bb9 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/mistral.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/mixedbread.svg b/plugins/skill-hub/src/assets/providers/mixedbread.svg new file mode 100644 index 00000000..39ed59c9 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/mixedbread.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/modelscope.svg b/plugins/skill-hub/src/assets/providers/modelscope.svg new file mode 100644 index 00000000..ceee3f11 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/modelscope.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/monica.svg b/plugins/skill-hub/src/assets/providers/monica.svg new file mode 100644 index 00000000..1637c537 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/monica.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/moonshot.svg b/plugins/skill-hub/src/assets/providers/moonshot.svg new file mode 100644 index 00000000..269cf3ce --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/moonshot.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/n8n.svg b/plugins/skill-hub/src/assets/providers/n8n.svg new file mode 100644 index 00000000..c23bfa5d --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/n8n.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/nami-ai.svg b/plugins/skill-hub/src/assets/providers/nami-ai.svg new file mode 100644 index 00000000..a69053ff --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/nami-ai.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/netease-youdao.svg b/plugins/skill-hub/src/assets/providers/netease-youdao.svg new file mode 100644 index 00000000..7764fe8f --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/netease-youdao.svg @@ -0,0 +1,4 @@ + + + + diff --git a/plugins/skill-hub/src/assets/providers/newapi.svg b/plugins/skill-hub/src/assets/providers/newapi.svg new file mode 100644 index 00000000..97689f4e --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/newapi.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/nomic.svg b/plugins/skill-hub/src/assets/providers/nomic.svg new file mode 100644 index 00000000..cdcde999 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/nomic.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/notebooklm.svg b/plugins/skill-hub/src/assets/providers/notebooklm.svg new file mode 100644 index 00000000..a7fbbd5e --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/notebooklm.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/nousresearch.svg b/plugins/skill-hub/src/assets/providers/nousresearch.svg new file mode 100644 index 00000000..75aa28ce --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/nousresearch.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/nvidia.svg b/plugins/skill-hub/src/assets/providers/nvidia.svg new file mode 100644 index 00000000..2fa6dbdc --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/nvidia.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/o3.svg b/plugins/skill-hub/src/assets/providers/o3.svg new file mode 100644 index 00000000..6201b6a0 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/o3.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/ocoolai.svg b/plugins/skill-hub/src/assets/providers/ocoolai.svg new file mode 100644 index 00000000..f8fa00af --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/ocoolai.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/ollama.svg b/plugins/skill-hub/src/assets/providers/ollama.svg new file mode 100644 index 00000000..37ea6fa9 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/ollama.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/openai.svg b/plugins/skill-hub/src/assets/providers/openai.svg new file mode 100644 index 00000000..29d30ecd --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/openai.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/openclaw.svg b/plugins/skill-hub/src/assets/providers/openclaw.svg new file mode 100644 index 00000000..26d48902 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/openclaw.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/openrouter.svg b/plugins/skill-hub/src/assets/providers/openrouter.svg new file mode 100644 index 00000000..715ed5c7 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/openrouter.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/paddleocr.svg b/plugins/skill-hub/src/assets/providers/paddleocr.svg new file mode 100644 index 00000000..a0ce67ec --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/paddleocr.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/perplexity.svg b/plugins/skill-hub/src/assets/providers/perplexity.svg new file mode 100644 index 00000000..3796a8c9 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/perplexity.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/ph8.svg b/plugins/skill-hub/src/assets/providers/ph8.svg new file mode 100644 index 00000000..42741e0e --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/ph8.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/poe.svg b/plugins/skill-hub/src/assets/providers/poe.svg new file mode 100644 index 00000000..26ab9c05 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/poe.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/ppio.svg b/plugins/skill-hub/src/assets/providers/ppio.svg new file mode 100644 index 00000000..ea27e81a --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/ppio.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/pulse.svg b/plugins/skill-hub/src/assets/providers/pulse.svg new file mode 100644 index 00000000..e58c66de --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/pulse.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/qiniu.svg b/plugins/skill-hub/src/assets/providers/qiniu.svg new file mode 100644 index 00000000..c52f6a2f --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/qiniu.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/querit.svg b/plugins/skill-hub/src/assets/providers/querit.svg new file mode 100644 index 00000000..88c9da04 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/querit.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/qwen.svg b/plugins/skill-hub/src/assets/providers/qwen.svg new file mode 100644 index 00000000..ab654dfd --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/qwen.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/recraft.svg b/plugins/skill-hub/src/assets/providers/recraft.svg new file mode 100644 index 00000000..0f6c4869 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/recraft.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/relace.svg b/plugins/skill-hub/src/assets/providers/relace.svg new file mode 100644 index 00000000..55424759 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/relace.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/riverflow.svg b/plugins/skill-hub/src/assets/providers/riverflow.svg new file mode 100644 index 00000000..69844133 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/riverflow.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/runway.svg b/plugins/skill-hub/src/assets/providers/runway.svg new file mode 100644 index 00000000..b4d516a5 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/runway.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/searxng.svg b/plugins/skill-hub/src/assets/providers/searxng.svg new file mode 100644 index 00000000..2a585fad --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/searxng.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/sensetime.svg b/plugins/skill-hub/src/assets/providers/sensetime.svg new file mode 100644 index 00000000..e27ea28d --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/sensetime.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/silicon.svg b/plugins/skill-hub/src/assets/providers/silicon.svg new file mode 100644 index 00000000..814d06ce --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/silicon.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/skywork.svg b/plugins/skill-hub/src/assets/providers/skywork.svg new file mode 100644 index 00000000..8f8db229 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/skywork.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/smithery.svg b/plugins/skill-hub/src/assets/providers/smithery.svg new file mode 100644 index 00000000..c944e4f2 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/smithery.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/sophnet.svg b/plugins/skill-hub/src/assets/providers/sophnet.svg new file mode 100644 index 00000000..d62cbbbc --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/sophnet.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/stability.svg b/plugins/skill-hub/src/assets/providers/stability.svg new file mode 100644 index 00000000..e3f3c7cc --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/stability.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/step.svg b/plugins/skill-hub/src/assets/providers/step.svg new file mode 100644 index 00000000..b359e8f6 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/step.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/streamlake.svg b/plugins/skill-hub/src/assets/providers/streamlake.svg new file mode 100644 index 00000000..83bbcb11 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/streamlake.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/suno.svg b/plugins/skill-hub/src/assets/providers/suno.svg new file mode 100644 index 00000000..f369fc7c --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/suno.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/tavily.svg b/plugins/skill-hub/src/assets/providers/tavily.svg new file mode 100644 index 00000000..01531fb8 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/tavily.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/tencent-cloud-ti.svg b/plugins/skill-hub/src/assets/providers/tencent-cloud-ti.svg new file mode 100644 index 00000000..94137930 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/tencent-cloud-ti.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/plugins/skill-hub/src/assets/providers/tesseract-js.svg b/plugins/skill-hub/src/assets/providers/tesseract-js.svg new file mode 100644 index 00000000..8f7388d8 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/tesseract-js.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/think-any.svg b/plugins/skill-hub/src/assets/providers/think-any.svg new file mode 100644 index 00000000..57d6f461 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/think-any.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/tng.svg b/plugins/skill-hub/src/assets/providers/tng.svg new file mode 100644 index 00000000..86402c93 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/tng.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/together.svg b/plugins/skill-hub/src/assets/providers/together.svg new file mode 100644 index 00000000..7551f3b4 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/together.svg @@ -0,0 +1,4 @@ + + + + diff --git a/plugins/skill-hub/src/assets/providers/tokenflux.svg b/plugins/skill-hub/src/assets/providers/tokenflux.svg new file mode 100644 index 00000000..78b1d1f6 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/tokenflux.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/twitter.svg b/plugins/skill-hub/src/assets/providers/twitter.svg new file mode 100644 index 00000000..00eb0eaf --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/twitter.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/upstage.svg b/plugins/skill-hub/src/assets/providers/upstage.svg new file mode 100644 index 00000000..5318136e --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/upstage.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/vercel.svg b/plugins/skill-hub/src/assets/providers/vercel.svg new file mode 100644 index 00000000..608d02da --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/vercel.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/vertexai.svg b/plugins/skill-hub/src/assets/providers/vertexai.svg new file mode 100644 index 00000000..b06b8bab --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/vertexai.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/vidu.svg b/plugins/skill-hub/src/assets/providers/vidu.svg new file mode 100644 index 00000000..4d5f4791 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/vidu.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/volcengine.svg b/plugins/skill-hub/src/assets/providers/volcengine.svg new file mode 100644 index 00000000..2ce100ca --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/volcengine.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/wenxin.svg b/plugins/skill-hub/src/assets/providers/wenxin.svg new file mode 100644 index 00000000..8c627fa0 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/wenxin.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/workers-ai.svg b/plugins/skill-hub/src/assets/providers/workers-ai.svg new file mode 100644 index 00000000..2176381a --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/workers-ai.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/xiaoyi.svg b/plugins/skill-hub/src/assets/providers/xiaoyi.svg new file mode 100644 index 00000000..2740c1f0 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/xiaoyi.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/xinghuo.svg b/plugins/skill-hub/src/assets/providers/xinghuo.svg new file mode 100644 index 00000000..8e72b54d --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/xinghuo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/plugins/skill-hub/src/assets/providers/xirang.svg b/plugins/skill-hub/src/assets/providers/xirang.svg new file mode 100644 index 00000000..1ad6f0e7 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/xirang.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/you.svg b/plugins/skill-hub/src/assets/providers/you.svg new file mode 100644 index 00000000..8a44e38b --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/you.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/yuanbao.svg b/plugins/skill-hub/src/assets/providers/yuanbao.svg new file mode 100644 index 00000000..7d387b51 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/yuanbao.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/z-ai.svg b/plugins/skill-hub/src/assets/providers/z-ai.svg new file mode 100644 index 00000000..9101944a --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/z-ai.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/skill-hub/src/assets/providers/zero-one.svg b/plugins/skill-hub/src/assets/providers/zero-one.svg new file mode 100644 index 00000000..ce834c25 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/zero-one.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/zhida.svg b/plugins/skill-hub/src/assets/providers/zhida.svg new file mode 100644 index 00000000..d3ba2f0a --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/zhida.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/plugins/skill-hub/src/assets/providers/zhipu.svg b/plugins/skill-hub/src/assets/providers/zhipu.svg new file mode 100644 index 00000000..c30ab269 --- /dev/null +++ b/plugins/skill-hub/src/assets/providers/zhipu.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/plugins/skill-hub/src/components/AddProjectModal.vue b/plugins/skill-hub/src/components/AddProjectModal.vue new file mode 100644 index 00000000..fc9e3101 --- /dev/null +++ b/plugins/skill-hub/src/components/AddProjectModal.vue @@ -0,0 +1,455 @@ + + + + + diff --git a/plugins/skill-hub/src/components/AppToast.vue b/plugins/skill-hub/src/components/AppToast.vue new file mode 100644 index 00000000..35039afa --- /dev/null +++ b/plugins/skill-hub/src/components/AppToast.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/plugins/skill-hub/src/components/BatchSyncModal.vue b/plugins/skill-hub/src/components/BatchSyncModal.vue new file mode 100644 index 00000000..efa71695 --- /dev/null +++ b/plugins/skill-hub/src/components/BatchSyncModal.vue @@ -0,0 +1,307 @@ + + + + + diff --git a/plugins/skill-hub/src/components/CleanupSelectModal.vue b/plugins/skill-hub/src/components/CleanupSelectModal.vue new file mode 100644 index 00000000..80036e17 --- /dev/null +++ b/plugins/skill-hub/src/components/CleanupSelectModal.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/plugins/skill-hub/src/components/ConfirmBatchDeleteModal.vue b/plugins/skill-hub/src/components/ConfirmBatchDeleteModal.vue new file mode 100644 index 00000000..cdd3b084 --- /dev/null +++ b/plugins/skill-hub/src/components/ConfirmBatchDeleteModal.vue @@ -0,0 +1,199 @@ + + + + + diff --git a/plugins/skill-hub/src/components/ConfirmDeleteModal.vue b/plugins/skill-hub/src/components/ConfirmDeleteModal.vue new file mode 100644 index 00000000..e0674458 --- /dev/null +++ b/plugins/skill-hub/src/components/ConfirmDeleteModal.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/plugins/skill-hub/src/components/ConfirmModal.vue b/plugins/skill-hub/src/components/ConfirmModal.vue new file mode 100644 index 00000000..da30b7a6 --- /dev/null +++ b/plugins/skill-hub/src/components/ConfirmModal.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/plugins/skill-hub/src/components/DeployModal.vue b/plugins/skill-hub/src/components/DeployModal.vue new file mode 100644 index 00000000..f2080d30 --- /dev/null +++ b/plugins/skill-hub/src/components/DeployModal.vue @@ -0,0 +1,361 @@ + + + + + + + diff --git a/plugins/skill-hub/src/components/DownloadIndicator.vue b/plugins/skill-hub/src/components/DownloadIndicator.vue new file mode 100644 index 00000000..a8ff9cce --- /dev/null +++ b/plugins/skill-hub/src/components/DownloadIndicator.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/plugins/skill-hub/src/components/GlobalDistPanel.vue b/plugins/skill-hub/src/components/GlobalDistPanel.vue new file mode 100644 index 00000000..20209a21 --- /dev/null +++ b/plugins/skill-hub/src/components/GlobalDistPanel.vue @@ -0,0 +1,285 @@ + + + + + diff --git a/plugins/skill-hub/src/components/NewSkillModal.vue b/plugins/skill-hub/src/components/NewSkillModal.vue new file mode 100644 index 00000000..4ced6048 --- /dev/null +++ b/plugins/skill-hub/src/components/NewSkillModal.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/plugins/skill-hub/src/components/PlatformIcon.vue b/plugins/skill-hub/src/components/PlatformIcon.vue new file mode 100644 index 00000000..618a651c --- /dev/null +++ b/plugins/skill-hub/src/components/PlatformIcon.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/plugins/skill-hub/src/components/ProjectDistPanel.vue b/plugins/skill-hub/src/components/ProjectDistPanel.vue new file mode 100644 index 00000000..cc9458b7 --- /dev/null +++ b/plugins/skill-hub/src/components/ProjectDistPanel.vue @@ -0,0 +1,460 @@ + + + + + diff --git a/plugins/skill-hub/src/components/ProviderIcon.vue b/plugins/skill-hub/src/components/ProviderIcon.vue new file mode 100644 index 00000000..b7bc41c6 --- /dev/null +++ b/plugins/skill-hub/src/components/ProviderIcon.vue @@ -0,0 +1,147 @@ + + + + + \ No newline at end of file diff --git a/plugins/skill-hub/src/components/QuickSwitcher.vue b/plugins/skill-hub/src/components/QuickSwitcher.vue new file mode 100644 index 00000000..eb256218 --- /dev/null +++ b/plugins/skill-hub/src/components/QuickSwitcher.vue @@ -0,0 +1,513 @@ + + + + + diff --git a/plugins/skill-hub/src/components/SkillCodeEditor.vue b/plugins/skill-hub/src/components/SkillCodeEditor.vue new file mode 100644 index 00000000..3efe69af --- /dev/null +++ b/plugins/skill-hub/src/components/SkillCodeEditor.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/plugins/skill-hub/src/components/SkillDetailBase.vue b/plugins/skill-hub/src/components/SkillDetailBase.vue new file mode 100644 index 00000000..5228dd1f --- /dev/null +++ b/plugins/skill-hub/src/components/SkillDetailBase.vue @@ -0,0 +1,936 @@ + + +