🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

云原生应用交付 goodrain/rainskills

DeepSeek Harnessv0.1.47
goodrain5 天前有提交已提供中文文档扫描:含敏感能力

让你的 AI 智能体把当前项目部署上线,并验证页面和 API。

39.1/100
综合分
12
GitHub 星标
1,274
npm 周下载
—/5
用户评分

数据截至 2026/10/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add rainskills
npm 源 · rainskills 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · tool
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功(非静态推断);本次验证针对插件 v0.1.50,当前版本为 v0.1.47
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包rainskills @ 0.1.47
✓Node 引擎要求 >=18 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 02:49:59

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 166 处,展示前 103 条)
  • 执行外部命令来自配置/变量
    bin/rainskills.js:832
    const child = spawn(invocation.executable, invocation.args, {
  • 读取本地文件
    rainbond-platform-installer/scripts/windows-onboarding.js:167
    info = fs.lstatSync(skillFile);
  • 读取本地文件
    rainbond-platform-installer/scripts/windows-onboarding.js:175
    const lines = fs.readFileSync(skillFile, "utf8").split(/ ? /);
  • 读取本地文件
    rainbond-platform-installer/scripts/windows-onboarding.js:189
    const skills = fs.readdirSync(packageRoot, { withFileTypes: true })
  • 读取本地文件
    rainbond-platform-installer/scripts/windows-onboarding.js:200
    if (fs.existsSync(rootSkill)) {
  • 读取本地文件
    rainbond-platform-installer/scripts/windows-onboarding.js:206
    officialPackage = JSON.parse(fs.readFileSync(packageFile, "utf8")).name === "rainskills";
  • 读取本地文件
    rainbond-platform-installer/scripts/windows-onboarding.js:225
    if (!fs.existsSync(current)) continue;
  • 写入本地文件
    rainbond-platform-installer/scripts/windows-onboarding.js:269
    fs.renameSync(destination, backup);
  • 写入本地文件
    rainbond-platform-installer/scripts/windows-onboarding.js:272
    fs.renameSync(temporary, destination);
  • 删除本地文件
    rainbond-platform-installer/scripts/windows-onboarding.js:273
    if (backedUp) fs.rmSync(backup, { recursive: true });
  • 写入本地文件
    rainbond-platform-installer/scripts/windows-onboarding.js:277
    fs.renameSync(backup, destination);
  • 写入本地文件
    rainbond-platform-installer/scripts/windows-onboarding.js:287
    fs.mkdirSync(destinationRoot, { recursive: true });
  • 读取本地文件
    rainbond-platform-installer/scripts/single-runtime.js:77
    if (!fs.existsSync(runtimePath)) return null;
  • 读取本地文件
    rainbond-platform-installer/scripts/single-runtime.js:79
    if (fs.lstatSync(runtimePath).size > MAX_BYTES) {
  • 读取本地文件
    rainbond-platform-installer/scripts/single-runtime.js:91
    if (fs.existsSync(runtimePath)) stateStore.assertProtectedRegularFile(runtimePath);
  • 读取本地文件
    rainbond-platform-installer/scripts/single-runtime.js:109
    if (!fs.existsSync(runtimePath)) return false;
  • 删除本地文件
    rainbond-platform-installer/scripts/single-runtime.js:111
    fs.unlinkSync(runtimePath);
  • 读取本地文件
    rainbond-platform-installer/scripts/runtime-state.js:186
    if (!fs.existsSync(statePath)) return { state: "not_started" };
  • 删除本地文件
    rainbond-platform-installer/scripts/runtime-state.js:311
    fs.unlinkSync(statePath);
  • 读取本地文件
    bin/runtime-integrity.js:21
    const info = fs.lstatSync(target);
  • 写入本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:24
    fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
  • 写入本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:25
    try { fs.chmodSync(directory, 0o700); } catch { }
  • 读取本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:30
    const info = fs.lstatSync(file);
  • 读取本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:32
    return fs.readFileSync(file, "utf8");
  • 写入本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:46
    fs.writeFileSync(temporary, content, { encoding: "utf8", flag: "wx", mode: 0o600 });
  • 写入本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:47
    fs.renameSync(temporary, file);
  • 写入本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:48
    fs.chmodSync(file, 0o600);
  • 删除本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:50
    try { fs.rmSync(temporary, { force: true }); } catch { }
  • 读取本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:121
    entries = fs.readdirSync(pending)
  • 读取本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:125
    return { file, mtimeMs: fs.lstatSync(file).mtimeMs };
  • 删除本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:136
    try { fs.rmSync(entry.file, { force: true }); } catch { }
  • 删除本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:198
    try { fs.rmSync(file, { force: true }); } catch { }
  • 读取本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:272
    files = fs.readdirSync(pendingDirectory(directory))
  • 删除本地文件
    rainbond-platform-installer/scripts/result-telemetry.js:286
    try { fs.rmSync(file, { force: true }); } catch { }
  • 读取本地文件
    rainbond-platform-installer/scripts/auto-update.js:370
    if (fs.existsSync(finalPath)) {
  • 读取本地文件
    rainbond-platform-installer/scripts/auto-update.js:377
    const pathIdentity = fs.lstatSync(finalPath);
  • 读取本地文件
    rainbond-platform-installer/scripts/auto-update.js:398
    const current = fs.lstatSync(finalPath);
  • 删除本地文件
    rainbond-platform-installer/scripts/auto-update.js:404
    ) fs.unlinkSync(finalPath);
  • 读取本地文件
    rainbond-platform-installer/scripts/auto-update.js:429
    const candidateIdentity = fs.lstatSync(candidatePath);
  • 读取本地文件
    rainbond-platform-installer/scripts/auto-update.js:441
    const finalIdentity = fs.lstatSync(finalPath);
  • 删除本地文件
    rainbond-platform-installer/scripts/auto-update.js:450
    fs.unlinkSync(candidatePath);
  • 读取本地文件
    rainbond-platform-installer/scripts/auto-update.js:464
    const current = fs.lstatSync(finalPath);
  • 删除本地文件
    rainbond-platform-installer/scripts/auto-update.js:470
    ) fs.unlinkSync(finalPath);
  • 删除本地文件
    rainbond-platform-installer/scripts/auto-update.js:479
    try { fs.unlinkSync(target); } catch (cleanupError) {
  • 写入本地文件
    rainbond-platform-installer/scripts/auto-update.js:838
    fs.mkdirSync(transactionRoot, { mode: 0o700 });
  • 写入本地文件
    rainbond-platform-installer/scripts/auto-update.js:841
    fs.mkdirSync(stagedRoot, { mode: 0o700 });
  • 写入本地文件
    rainbond-platform-installer/scripts/auto-update.js:842
    fs.mkdirSync(backupRoot, { mode: 0o700 });
  • 写入本地文件
    rainbond-platform-installer/scripts/auto-update.js:859
    if (existed) fs.renameSync(destination, backup);
  • 写入本地文件
    rainbond-platform-installer/scripts/auto-update.js:861
    fs.renameSync(staged, destination);
  • 写入本地文件
    rainbond-platform-installer/scripts/auto-update.js:865
    fs.renameSync(backup, destination);
  • 删除本地文件
    rainbond-platform-installer/scripts/auto-update.js:880
    fs.rmSync(transaction.transactionRoot, { recursive: true, force: true });
  • 读取本地文件
    rainbond-platform-installer/scripts/secure-state.js:46
    const info = fs.lstatSync(targetPath);
  • 读取本地文件
    rainbond-platform-installer/scripts/secure-state.js:65
    const info = fs.lstatSync(targetPath);
  • 写入本地文件
    rainbond-platform-installer/scripts/secure-state.js:114
    fs.chmodSync(targetPath, expectedKind === "file" ? 0o600 : 0o700);
  • 读取本地文件
    rainbond-platform-installer/scripts/secure-state.js:125
    if (!fs.existsSync(current)) fs.mkdirSync(current, { mode: 0o700 });
  • 读取本地文件
    rainbond-platform-installer/scripts/secure-state.js:149
    const info = fs.lstatSync(target);
  • 读取本地文件
    rainbond-platform-installer/scripts/secure-state.js:161
    if (fs.existsSync(target) && fs.lstatSync(target).isSymbolicLink()) {
  • 写入本地文件
    rainbond-platform-installer/scripts/secure-state.js:170
    fs.writeFileSync(fd, `${JSON.stringify(value, null, 2)}\n`, "utf8");
  • 写入本地文件
    rainbond-platform-installer/scripts/secure-state.js:177
    fs.renameSync(temporary, target);
  • 删除本地文件
    rainbond-platform-installer/scripts/secure-state.js:189
    fs.unlinkSync(temporary);
  • 读取本地文件
    rainbond-platform-installer/scripts/secure-state.js:199
    return JSON.parse(fs.readFileSync(target, "utf8"));
  • 写入本地文件
    rainbond-platform-installer/scripts/secure-state.js:224
    fs.writeFileSync(fd, `${JSON.stringify(owner)}\n`, "utf8");
  • 删除本地文件
    rainbond-platform-installer/scripts/secure-state.js:233
    fs.unlinkSync(candidatePath);
  • 删除本地文件
    rainbond-platform-installer/scripts/secure-state.js:243
    fs.unlinkSync(candidatePath);
  • 删除本地文件
    rainbond-platform-installer/scripts/secure-state.js:249
    fs.unlinkSync(lockPath);
  • 写入本地文件
    rainbond-platform-installer/scripts/secure-state.js:266
    fs.renameSync(lockPath, stalePath);
  • 删除本地文件
    rainbond-platform-installer/scripts/secure-state.js:267
    fs.unlinkSync(stalePath);
  • 删除本地文件
    rainbond-platform-installer/scripts/secure-state.js:292
    fs.unlinkSync(lockPath);
  • 执行外部命令来自配置/变量
    rainbond-platform-installer/scripts/windows-platform.js:76
    return spawnSync(command, args, {
  • 读取本地文件
    rainbond-platform-installer/scripts/windows-platform.js:226
    return crypto.createHash("sha256").update(fs.readFileSync(filePath)).digest("hex");
  • 读取本地文件
    rainbond-platform-installer/scripts/windows-platform.js:249
    const info = fs.statSync(filePath);
  • 读取本地文件
    rainbond-platform-installer/scripts/windows-platform.js:279
    const info = fs.lstatSync(absoluteDirectory);
  • 读取本地文件
    rainbond-platform-installer/scripts/windows-platform.js:283
    for (const entry of fs.readdirSync(absoluteDirectory, { withFileTypes: true })) {
  • 读取本地文件
    rainbond-platform-installer/scripts/windows-platform.js:286
    const childInfo = fs.lstatSync(absolute);
  • 读取本地文件
    rainbond-platform-installer/scripts/windows-platform.js:314
    if (fs.existsSync(destinationRoot) && fs.readdirSync(destinationRoot).length > 0) {
  • 写入本地文件
    rainbond-platform-installer/scripts/windows-platform.js:317
    fs.mkdirSync(destinationRoot, { recursive: true, mode: 0o700 });
  • 写入本地文件
    rainbond-platform-installer/scripts/windows-platform.js:318
    fs.chmodSync(destinationRoot, 0o700);
  • 写入本地文件
    rainbond-platform-installer/scripts/windows-platform.js:326
    fs.mkdirSync(path.dirname(destination), { recursive: true, mode: 0o700 });
  • 写入本地文件
    rainbond-platform-installer/scripts/windows-platform.js:327
    fs.copyFileSync(source, destination, fs.constants.COPYFILE_EXCL);
  • 写入本地文件
    rainbond-platform-installer/scripts/windows-platform.js:328
    fs.chmodSync(destination, 0o600);
  • 写入本地文件
    rainbond-platform-installer/scripts/windows-platform.js:337
    fs.writeFileSync(path.join(destinationRoot, "manifest.json"), `${JSON.stringify(manifest, null, 2)}\n`, { mode: 0o600, flag: "wx" });
  • 发起网络请求
    rainbond-platform-installer/scripts/windows-platform.js:474
    const request = https.get(currentUrl, {
  • 写入本地文件
    rainbond-platform-installer/scripts/telemetry.js:75
    fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
  • 写入本地文件
    rainbond-platform-installer/scripts/telemetry.js:76
    try { fs.chmodSync(directory, 0o700); } catch { }
  • 写入本地文件
    rainbond-platform-installer/scripts/telemetry.js:87
    fs.appendFileSync(filePath, `${JSON.stringify(event)}\n`, { encoding: "utf8", mode: 0o600 });
  • 写入本地文件
    rainbond-platform-installer/scripts/telemetry.js:88
    try { fs.chmodSync(filePath, 0o600); } catch { }
  • 发起网络请求
    bin/delivery-probe.js:125
    const request = client.request(url, {
  • 读取本地文件
    bin/rainskills-tools.js:79
    const info = fs.lstatSync(candidate);
  • 读取本地文件
    bin/rainskills-tools.js:96
    const info = fs.lstatSync(candidate);
  • 读取本地文件
    bin/rainskills-tools.js:470
    const stat = fs.lstatSync(directory);
  • 写入本地文件
    bin/rainskills-tools.js:472
    if ((stat.mode & 0o077) !== 0) fs.chmodSync(directory, 0o700);
  • 写入本地文件
    bin/rainskills-tools.js:478
    fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
  • 写入本地文件
    bin/rainskills-tools.js:479
    fs.chmodSync(directory, 0o700);
  • 读取本地文件
    bin/rainskills-tools.js:500
    const manifest = JSON.parse(fs.readFileSync(skillManifestPath(config), "utf8"));
  • 读取本地文件
    bin/rainskills-tools.js:560
    const info = fs.lstatSync(target);
  • 读取本地文件
    bin/rainskills-tools.js:567
    manifest = JSON.parse(fs.readFileSync(target, "utf8"));
  • 写入本地文件
    bin/rainskills-tools.js:641
    fs.writeFileSync(temporary, `${JSON.stringify(record)}\n`, { mode: 0o600 });
  • 写入本地文件
    bin/rainskills-tools.js:642
    fs.chmodSync(temporary, 0o600);
  • 写入本地文件
    bin/rainskills-tools.js:643
    fs.renameSync(temporary, target);
  • 发起网络请求
    bin/rainskills-tools.js:912
    const request = client.request(endpoint, {
  • 执行外部命令来自配置/变量
    bin/runtime-smoke.js:32
    const child = spawn(process.execPath, [bridge, ...args, "--input", "-", "--skill-id", "rainbond-app-assistant"], {
  • 删除本地文件
    bin/runtime-smoke.js:55
    fs.rmSync(probeHome, { recursive: true, force: true });
  • 读取本地文件
    dsh/index.mjs:47
    return parseSkillSource(readFileSync(skillPath, "utf8"), skillPath);
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

2 张 · 点击查看大图
展开完整介绍(131 字)↓

Rainskills 是一组开源 Agent Skills,让 Codex、Claude Code、Pi Agent、 DeepSeek Harness、WorkBuddy 和 Hermes Agent 能够完成应用识别、部署、 排错、交付验证、版本管理和回滚。

README

由 DeepSeek 最新模型翻译生成
RainSkills 让你的 AI 智能体把当前项目部署上线,并验证页面和 API。 RainSkills 是一组开源 Agent Skills,让 Codex、Claude Code、Pi Agent、 DeepSeek Harness、WorkBuddy 和 Hermes Agent 能够继续完成应用部署、故障排查、交付验证、版本管理和回滚。 它从智能体已经理解的当前项目出发,把前端、后端、数据库、缓存、端口和存储组织成 Rainbond 应用。应用可以运行在 Rainbond Cloud、你自己的服务器或 Kubernetes 中。 AI 负责生成,RainSkills 负责交付,Rainbond 负责持续运行。 产品介绍 ·安装与使用 ·视频教程 · Rainbond Cloud ·微信交流 为什么使用 RainSkills AI 智能体已经理解了代码、依赖和项目结构。进入部署阶段后,如果改用临时脚本或直接 SSH,这些上下文通常需要重新整理,部署结果也很难沉淀为可以持续维护的应用。
展开完整文档(README 剩余 1 节)
RainSkills

让你的 AI 智能体把当前项目部署上线,并验证页面和 API。

RainSkills 是一组开源 Agent Skills,让 Codex、Claude Code、Pi Agent、 DeepSeek Harness、WorkBuddy 和 Hermes Agent 能够继续完成应用部署、故障排查、交付验证、版本管理和回滚。

它从智能体已经理解的当前项目出发,把前端、后端、数据库、缓存、端口和存储组织成 Rainbond 应用。应用可以运行在 Rainbond Cloud、你自己的服务器或 Kubernetes 中。

AI 负责生成,RainSkills 负责交付,Rainbond 负责持续运行。

产品介绍 ·安装与使用 ·视频教程 · Rainbond Cloud ·微信交流

为什么使用 RainSkills

AI 智能体已经理解了代码、依赖和项目结构。进入部署阶段后,如果改用临时脚本或直接 SSH,这些上下文通常需要重新整理,部署结果也很难沉淀为可以持续维护的应用。

| 对比维度 | Agent 直接 SSH / 临时脚本 | RainSkills + Rainbond |
| 工作起点 | 重新整理服务器、端口、依赖和命令 | 直接复用当前项目上下文 |
| 应用结构 | 人工拼装进程、数据库、网络和存储 | 用应用拓扑管理组件与依赖 |
| 失败排查 | 手工寻找构建、容器和网关日志 | 智能体读取构建日志、运行日志、Pod 和平台事件 |
| 完成标准 | 命令成功或进程已经启动 | 页面和 API 完成实际访问验证 |
| 权限边界 | 智能体通常直接持有 SSH 或生产凭据 | 浏览器授权、受控工具调用和高风险操作确认 |
| 后续维护 | 继续维护脚本和服务器差异 | 在同一应用上升级、快照、发布和回滚 |

RainSkills 更适合多组件应用、自托管环境、私有化交付,以及需要持续排障和版本管理的项目。

RainSkills 如何工作

当前项目或部署目标 → Codex、Claude Code 等 AI Agent → RainSkills 选择对应的部署、排障或验证 Skill → 首次需要时选择并连接一个 Rainbond 运行环境 → Rainbond 构建并运行应用 → RainSkills 验证页面、API 和最终访问地址

RainSkills 安装与运行环境连接是两个阶段。安装完成后可以直接提出部署任务;第一次需要 Rainbond 时,智能体再引导你选择 Cloud、已有私有环境、本机或服务器。

RainSkills 在 AI Agent 中完成应用部署并返回访问地址

快速开始

使用 Skill 市场安装:

npx skills add goodrain/rainskills

或者直接运行官方安装器:

npx --yes rainskills

DeepSeek Harness 用户也可以把 RainSkills bootstrap 作为 profile bundle 安装:

dsh plugin --profile web add rainskills

安装后调用 /rainskills,或直接告诉智能体「安装 RainSkills」。该 bundle 只注册 bootstrap Skill;完整的 rainbond-* Skills 仍由官方安装器统一安装和更新。

npx 安装方式需要 Node.js 18 或更高版本。建议使用仍在维护的 Node.js 22 或 24。

安装完成后,在项目目录告诉智能体:

帮我部署当前项目,并验证页面和 API。

如果还没有可用的 Rainbond,智能体会在第一次需要运行环境时让你选择 Cloud、已有私有环境、本机或服务器,不会在安装 Skill 时替你决定目标环境。

可以直接告诉智能体什么

- 帮我部署当前项目
- 帮我部署这个 Git 仓库
- 帮我通过镜像或安装包部署应用
- 帮我安装一个应用模板
- 帮我部署 Dify、n8n 或 Harbor
- 帮我检查 backend 为什么构建失败
- 确认当前应用是否已经交付成功,并给我访问地址
- 给当前应用创建快照
- 把当前应用回滚到上一个快照

支持范围

AI Agent

- Codex
- Claude Code
- Pi Agent
- DeepSeek Harness
- WorkBuddy
- Hermes Agent

项目来源

- 当前本地项目
- 普通 Git 仓库
- 本地软件包
- 私有容器镜像或单镜像组件
- Compose、Helm 或多镜像描述
- Dify、n8n、Harbor 等第三方开源应用
- Rainbond 应用模板

Compose、Helm 和第三方应用中的特权容器、Operator、CRD、Job、主机网络或主机目录等语义,需要根据当前 Rainbond 能力单独判断,不承诺原样转换所有 Kubernetes 配置。

运行环境

- Rainbond Cloud
- 已经运行的私有 Rainbond
- 本机 Rainbond
- 独立服务器上的 Rainbond
- 已有 Kubernetes 集群中的 Rainbond

安全和权限边界

- 通过浏览器完成 Rainbond 授权,不要求在聊天中粘贴 JWT、密码或私钥。
- 创建、更新和删除资源前核对目标企业、团队、应用和组件。
- 删除资源、平台安装、数据变更和其他高风险操作需要明确确认。
- Rainbond 授权凭据保存在受保护的本地状态中,不写入项目文件。
- 部署完成后继续验证组件、页面和 API,不把命令成功当作交付完成。

用户明确选择在独立服务器安装 Rainbond 时,受控安装流程可能使用 SSH。
应用部署和后续管理仍通过 Rainbond 应用模型完成,而不是依赖散落的服务器命令。

适合哪些场景

- AI 智能体已经写完或改完项目,需要继续部署。
- 项目包含前端、后端、数据库、缓存或异步任务。
- 应用需要运行在自己的服务器、私有云或 Kubernetes 中。
- 部署完成后仍需日志、升级、快照、发布和回滚。
- 团队需要复用私有化或客户现场的交付流程。

哪些场景可能不需要 RainSkills

- 只发布纯静态页面,且接受完全托管。
- 团队已经有成熟的内部开发平台和 GitOps 流程。
- 只是一次性的本地实验,不需要持续运行、排障或回滚。

文档与支持

- RainSkills 产品介绍
- 安装与使用文档
- 安装与连接视频教程
- 市场上架 Runbook
- Rainbond 安装文档
- 提交问题

微信交流

扫码添加微信,备注「RainSkills」,交流安装、部署和使用问题。

License

Apache-2.0
预览分享卡片长什么样 ↓goodrain/rainskills
分享 · DeepSeek Harness Hub
goodrain/rainskills

让你的 AI 智能体把当前项目部署上线,并验证页面和 API。

这是你的仓库?认领条目

回到顶部