内容
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://shieldcn.dev/header/surface.svg?title=%E6%89%87%E6%9C%AF%E6%9D%91%E6%9F%B1&subtitle=%E4%B8%80%E4%B8%AA%E5%85%B1%E4%BA%AB%E7%9A%84%E5%BA%94%E7%94%B8%E5%BA%94%E5%90%8C%E5%90%8A%E5%90%8A%E5%90%8A.&size=wide&align=left&font=space-grotesk&border=true&radius=18&watermark=false&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI%2BPHBhdGggZmlsbD0iIzZiZDU4ZiIgZD0iTTMgM2gyNnY3SDExdjRoMTRsNCA0djExSDN2LTdoMTh2LTRIN2wtNC00VjNaIi8%2BPC9zdmc%2B&logoColor=6bd58f&bg=111a14&accent=6bd58f&titleColor=f7f8f4&subtitleColor=aab5aa&mode=dark" />
<img alt="Skills Board — 一個共用函式庫。不同代理人。" src="https://shieldcn.dev/header/surface.svg?title=%E6%89%87%E6%9C%AF%E6%9D%91%E6%9F%B1&subtitle=%E4%B8%80%E4%B8%AA%E5%85%B1%E4%BA%AB%E7%9A%84%E5%BA%94%E7%94%B8%E5%BA%94%E5%90%8C%E5%90%8A%E5%90%8A%E5%90%8A.&size=wide&align=left&font=space-grotesk&border=true&radius=18&watermark=false&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI%2BPHBhdGggZmlsbD0iIzAwODQzZCIgZD0iTTMgM2gyNnY3SDExdjRoMTRsNCA0djExSDN2LTdoMTh2LTRIN2wtNC00VjNaIi8%2BPC9zdmc%2B&logoColor=00843d&bg=f7f8f4&accent=00843d&titleColor=17231b&subtitleColor=5e6b61&mode=light" />
</picture>
</p>
<p align="center">
将团队推荐的 AI 技能集中在一个地方,让每个人都知道在哪里找到和使用它们。
</p>
<p align="center">
<a href="https://github.com/TommyBez/skillsboard/stargazers">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://shieldcn.dev/github/stars/TommyBez/skillsboard.svg?variant=outline&size=xs&theme=zinc&font=geist&mode=dark" />
<img alt="GitHub 明星" src="https://shieldcn.dev/github/stars/TommyBez/skillsboard.svg?variant=outline&size=xs&theme=zinc&font=geist&mode=light" />
</picture>
</a>
<a href="./LICENSE">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://shieldcn.dev/badge/license-MIT-27272a.svg?variant=outline&size=xs&theme=zinc&font=geist&mode=dark&logo=false" />
<img alt="MIT 许可证" src="https://shieldcn.dev/badge/license-MIT-27272a.svg?variant=outline&size=xs&theme=zinc&font=geist&mode=light&logo=false" />
</picture>
</a>
<a href="https://github.com/TommyBez/skillsboard/actions/workflows/ci.yml">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://shieldcn.dev/github/ci/TommyBez/skillsboard.svg?workflow=ci.yml&branch=main&variant=outline&size=xs&theme=zinc&font=geist&mode=dark" />
<img alt="CI 状态" src="https://shieldcn.dev/github/ci/TommyBez/skillsboard.svg?workflow=ci.yml&branch=main&variant=outline&size=xs&theme=zinc&font=geist&mode=light" />
</picture>
</a>
</p>
<p align="center">
<a href="https://skillsboard.sh"><strong>试用托管应用</strong></a>
·
<a href="#run-locally">本地运行</a>
·
<a href="./CONTRIBUTING.md">贡献</a>
</p>
## 为什么选择技能委员会
有用的技能推荐往往会消失在聊天记录、书签和个人代理设置中。技能委员会为团队提供了一个可搜索的地方来收集推荐的技能,并让每个团队成员选择如何使用它们。
- **一个团队库。** 保存有用的技能,一次组织,使用团队特定的标签,使其易于再次找到。
- **不同的代理欢迎。** 在 Claude、Codex、Cursor 等代理设置中共享相同的推荐。
- **选择权。** 打开原始来源,复制兼容的安装命令,或将最新的技能文件下载为 ZIP。
- **组织范围的访问。** 创建团队,邀请成员,并为其成员保留每个库的访问权限。
- **可选的 MCP 访问。** 连接兼容的代理到身份验证的只读工具,用于列表和搜索库。
> [!IMPORTANT]
> 保存的技能是团队推荐,而不是安全审查、兼容性认证或固定版本。技能委员会读取最新的可用源;在代理中使用之前请检查该源。
## 它是如何工作的
1. 创建团队库并从其 GitHub 仓库添加技能。
2. 技能委员会保留原始源的可见性,并为团队记录推荐。
3. 队友按任务、描述、仓库或标签进行搜索。
4. 每个队友打开源,复制兼容的命令,或将最新文件下载为 ZIP。
公共目录在部署具有 Vercel OIDC 时可以帮助发现。团队库和直接 GitHub 流仍然是核心产品。
## 本地运行
### 先决条件
- Node.js 20.9 或更新版本
- pnpm 10
- PostgreSQL 15 或更新版本
### 1. 安装应用
```bash
git clone https://github.com/TommyBez/skillsboard.git
cd skillsboard
corepack enable
pnpm install
cp .env.example .env.local
```
使用 `openssl rand -base64 32` 生成 Better Auth 机密,然后将其添加到 `.env.local` 中,以及 PostgreSQL 连接字符串。
### 2. 准备数据库
将 Drizzle 模式推送到新数据库。这会创建 Better Auth 表和 `lib/db/schema.ts` 中的应用特定表。
```bash
pnpm db:push
```
### 3. 开始开发
```bash
pnpm dev
```
打开 [http://localhost:3000](http://localhost:3000)。更改 `DATABASE_URL` 后重启服务器,因为 PostgreSQL 连接池在模块加载时创建。
### 环境变量
| 变量 | 必需 | 用途 |
| --- | --- | --- |
| `DATABASE_URL` | 是 | Better Auth 和 Drizzle 使用的 PostgreSQL 连接字符串。 |
| `BETTER_AUTH_SECRET` | 是 | 用于签名和加密身份验证数据的机密。 |
| `BETTER_AUTH_URL` | 推荐 | 公共应用源;本地使用 `http://localhost:3000`。 |
| `RESEND_API_KEY` | 否 | 通过 Resend 发送团队邀请电子邮件。 |
| `EMAIL_FROM` | 否 | 用于邀请电子邮件的验证发送者。 |
| `GITHUB_TOKEN` | 否 | 提高 GitHub API 速率限制,用于元数据和 ZIP 下载。 |
| `VERCEL_OIDC_TOKEN` | 否 | 由 Vercel 为可选的 skills.sh 目录自动提供。 |
如果没有 Resend,仍然可以创建邀请并手动复制链接。如果没有 Vercel OIDC,Discover 目录会优雅地降级,而团队库继续工作。
## MCP 访问
技能委员会在 `/api/mcp` 处公开了一个 OAuth 保护的 MCP 端点。登录后,打开 **设置 → MCP** 以进行连接流程。服务器提供只读工具来列出和搜索团队技能,获取保存的技能的安装命令,并浏览可选的公共目录。
## 技术栈
| 层 | 技术 |
| --- | --- |
| 应用 | Next.js 16 应用路由器,React 19,TypeScript |
| UI | Tailwind CSS 4,shadcn/ui,Base UI |
| 身份验证 | 具有组织和 OAuth 提供者支持的 Better Auth |
| 数据 | PostgreSQL,Drizzle ORM |
| 电子邮件 | Resend 和 React Email |
| 代理访问 | 通过 `mcp-handler` 的模型上下文协议 |
| 托管 | Vercel 和 Neon 在托管部署中;支持自托管 |
## 项目命令
| 命令 | 功能 |
| --- | --- |
| `pnpm dev` | 启动 Turbopack 开发服务器。 |
| `pnpm typecheck` | 运行 TypeScript 编译器而不发出文件。 |
| `pnpm check` | 运行存储库的所需本地检查。 |
| `pnpm db:push` | 将 Drizzle 模式推送到配置的 PostgreSQL 数据库。 |
| `pnpm build` | 创建生产版本。 |
| `pnpm start` | 启动生产服务器。 |
| `pnpm email` | 在端口 3001 上预览 React Email 模板。 |
## 贡献
欢迎提出问题和拉取请求。在进行重大更改之前,请阅读 [CONTRIBUTING.md](./CONTRIBUTING.md),遵循 [行为准则](./CODE_OF_CONDUCT.md),并通过 [SECURITY.md](./SECURITY.md) 中的流程报告漏洞。
在 [贡献者页面](https://github.com/TommyBez/skillsboard/graphs/contributors) 上查看帮助构建技能委员会的人员。
## 许可证
技能委员会在 [MIT 许可证](./LICENSE) 下可用。