rainskills 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -228,7 +228,7 @@ node ~/.rainbond/lib/rainskills/bin/rainskills.js platform install --onboarding-
228
228
 
229
229
  Rainskills 会在用户下一次发起业务动作时,由本地运行时立即返回环境查询结果,并另行启动后台任务静默检查更新。更新只跟随 npm `latest` 指向的正式版。当前版本是 RC 或其他预发布版本时不会查询、不会自动升级;npm 上的新 RC 版本也不参与正式版自动升级。
230
230
 
231
- 发现更高的正式版后,后台任务只委托到经过校验的精确版本,例如 `rainskills@0.1.11`,不会执行浮动的 `@latest` 业务代码。新版本原子刷新已经安装的 Rainskills Skills;当前业务继续使用启动时已经加载的版本,最迟从下一条新任务开始使用新版。npm 超时、版本检查失败、安装位置不安全或文件迁移失败时会保留旧版本,且不会阻塞或改变当前操作。
231
+ 发现更高的正式版后,后台任务只委托到经过校验的精确版本,例如 `rainskills@0.1.13`,不会执行浮动的 `@latest` 业务代码。新版本原子刷新已经安装的 Rainskills Skills;当前业务继续使用启动时已经加载的版本,最迟从下一条新任务开始使用新版。npm 超时、版本检查失败、安装位置不安全或文件迁移失败时会保留旧版本,且不会阻塞或改变当前操作。
232
232
 
233
233
  升级只更新 Rainskills 自身,不触发 Rainbond 安装、运行环境选择、登录授权或重新对接,也不会新增 Agent MCP 配置。更新内容仅包括 Skills 和本地 CLI。原始业务操作会继续执行;只有该业务操作本身需要运行环境时,才按既有门禁检查当前连接。可用连接直接复用,401 只重新授权一次,403 立即停止,从未连接过运行环境时才进入环境选择。
234
234
 
package/SKILL.md CHANGED
@@ -18,6 +18,8 @@ If the adjacent installer is missing, check the local Node.js version before cho
18
18
 
19
19
  Skills-only 安装不需要 Node.js;CDN fallback 只负责安装 Skill 文件,不代表运行环境连接、应用部署或平台安装已经可执行。用户首次提出需要运行环境的动作时,对应业务 Skill 才检查 Node.js;固定 Rainskills launcher 需要 Node.js 18 或更高版本。缺失或版本过低时保留原始 intent 并停止,等待用户或 agent 明确同意安装或升级 Node.js,安装完成消息不得提前提示 Node.js。
20
20
 
21
+ 执行优化:同一会话内只检查一次 Node.js(首次使用本地 CLI 前);仅在 Node.js 或 Rainskills 安装、升级,或 PATH 变更后失效。固定 launcher 和 argv 已在本 Skill 中,禁止读取、搜索或探测 `rainskills.js`,也禁止执行 `npm root -g`。每个新的业务操作仍需要刷新一次环境列表;带已有 `operation_id` 或 `onboarding-id` 的续接复用已绑定的环境 ID,不重复枚举环境。
22
+
21
23
  ## Completion Message
22
24
 
23
25
  The installer emits this text inside `RAINSKILLS_USER_MESSAGE_BEGIN:install.completed` and the matching END marker, followed by `RAINSKILLS_AGENT_SUMMARY_REQUIRED:include-next-actions`. Relay only the body exactly and print nothing else; do not expose the markers, summarize, reformat, add a source link, or add verification details. If the host still summarizes instead of relaying, its installation summary must retain at least one example from “下一步可以直接说”.
@@ -38,7 +40,9 @@ Rainskills 安装完成,下一条消息即可直接使用。
38
40
 
39
41
  ## Manage Runtime Environments
40
42
 
41
- 环境是全局列表,不是项目绑定。本地状态命令必须定位已安装的同级 `rainbond-platform-installer/scripts/local-runtime.js`,解析为绝对路径后通过 `node` argv 数组执行;不得为了查询本地环境访问 npm。只有连接或安装环境时才使用与当前技能包一致的固定 launcher `node <home>/.rainbond/lib/rainskills/bin/rainskills.js`(运行包版本 `rainskills@0.1.11`)。
43
+ 受限沙箱(包括 Codex)执行本地状态命令时,必须申请用户级受保护目录访问权限;在 Codex 中使用 `require_escalated`。不得修改 `~/.rainbond` 权限、复制受保护状态到工作区,或因沙箱权限错误建议重装。
44
+
45
+ 环境是全局列表,不是项目绑定。本地状态命令必须定位已安装的同级 `rainbond-platform-installer/scripts/local-runtime.js`,解析为绝对路径后通过 `node` 以 argv 数组执行;不得为了查询本地环境访问 npm。只有连接或安装环境时才使用与当前技能包一致的固定 launcher `node <home>/.rainbond/lib/rainskills/bin/rainskills.js`(运行包版本 `rainskills@0.1.13`)。
42
46
 
43
47
  - 列表:用本地 launcher 执行 `environment list --json`,只展示名称、类型、状态、是否默认和最近验证时间。
44
48
  - 重命名:用本地 launcher 执行 `environment rename --environment-id <uuid> --name <name>`。
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rainskills",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "description": "Install the complete Rainskills AI deployment skill suite as one product.",
5
5
  "author": {
6
6
  "name": "Goodrain",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rainskills",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "description": "Install the complete Rainskills AI deployment skill suite as one product.",
5
5
  "author": {
6
6
  "name": "Goodrain",
@@ -14,10 +14,12 @@ This is the single marketplace entry for the complete Rainskills product. The in
14
14
  3. Keep stdin, stdout, and stderr attached. When `RAINSKILLS_USER_INPUT_REQUIRED` appears, pause for that installer choice. If the installer emits `rainskills.next-action.v1`, execute only its fixed `argv` through the same launcher; never evaluate output as a shell command. If the adjacent `bin/rainskills.js` exists, use it for fixed next actions; otherwise use the same versioned npm package fallback described below.
15
15
  4. Stay attached until every independent Skill is installed. Do not select, connect, or configure an application runtime during installation. In the user-facing response, output only the fixed completion message below.
16
16
 
17
- If the adjacent installer is missing, check the local Node.js version before choosing the fallback. With `npx` and Node.js 18 or newer, use `npx --yes rainskills@0.1.11 <target>`. With no Node.js or a version below 18, use `bash <(curl -fsSL https://get.rainbond.com/rainskills/install.sh) <target>` instead. Omit `<target>` only when the host cannot be determined reliably. Keep either command attached to the interactive terminal. For an update or repair, refresh this marketplace Skill first, then run the installer again; it compares and updates every independent internal Skill.
17
+ If the adjacent installer is missing, check the local Node.js version before choosing the fallback. With `npx` and Node.js 18 or newer, use `npx --yes rainskills@0.1.13 <target>`. With no Node.js or a version below 18, use `bash <(curl -fsSL https://get.rainbond.com/rainskills/install.sh) <target>` instead. Omit `<target>` only when the host cannot be determined reliably. Keep either command attached to the interactive terminal. For an update or repair, refresh this marketplace Skill first, then run the installer again; it compares and updates every independent internal Skill.
18
18
 
19
19
  Skills-only 安装不需要 Node.js;CDN fallback 只负责安装 Skill 文件,不代表运行环境连接、应用部署或平台安装已经可执行。用户首次提出需要运行环境的动作时,对应业务 Skill 才检查 Node.js;固定 Rainskills launcher 需要 Node.js 18 或更高版本。缺失或版本过低时保留原始 intent 并停止,等待用户或 agent 明确同意安装或升级 Node.js,安装完成消息不得提前提示 Node.js。
20
20
 
21
+ 执行优化:同一会话内只检查一次 Node.js(首次使用本地 CLI 前);仅在 Node.js 或 Rainskills 安装、升级,或 PATH 变更后失效。固定 launcher 和 argv 已在本 Skill 中,禁止读取、搜索或探测 `rainskills.js`,也禁止执行 `npm root -g`。每个新的业务操作仍需要刷新一次环境列表;带已有 `operation_id` 或 `onboarding-id` 的续接复用已绑定的环境 ID,不重复枚举环境。
22
+
21
23
  ## Completion Message
22
24
 
23
25
  The installer emits this text inside `RAINSKILLS_USER_MESSAGE_BEGIN:install.completed` and the matching END marker, followed by `RAINSKILLS_AGENT_SUMMARY_REQUIRED:include-next-actions`. Relay only the body exactly and print nothing else; do not expose the markers, summarize, reformat, add a source link, or add verification details. If the host still summarizes instead of relaying, its installation summary must retain at least one example from “下一步可以直接说”.
@@ -38,7 +40,9 @@ Rainskills 安装完成,下一条消息即可直接使用。
38
40
 
39
41
  ## Manage Runtime Environments
40
42
 
41
- 环境是全局列表,不是项目绑定。本地状态命令必须定位已安装的同级 `rainbond-platform-installer/scripts/local-runtime.js`,解析为绝对路径后通过 `node` argv 数组执行;不得为了查询本地环境访问 npm。只有连接或安装环境时才使用与当前技能包一致的固定 launcher `node <home>/.rainbond/lib/rainskills/bin/rainskills.js`(运行包版本 `rainskills@0.1.11`)。
43
+ 受限沙箱(包括 Codex)执行本地状态命令时,必须申请用户级受保护目录访问权限;在 Codex 中使用 `require_escalated`。不得修改 `~/.rainbond` 权限、复制受保护状态到工作区,或因沙箱权限错误建议重装。
44
+
45
+ 环境是全局列表,不是项目绑定。本地状态命令必须定位已安装的同级 `rainbond-platform-installer/scripts/local-runtime.js`,解析为绝对路径后通过 `node` 以 argv 数组执行;不得为了查询本地环境访问 npm。只有连接或安装环境时才使用与当前技能包一致的固定 launcher `node <home>/.rainbond/lib/rainskills/bin/rainskills.js`(运行包版本 `rainskills@0.1.13`)。
42
46
 
43
47
  - 列表:用本地 launcher 执行 `environment list --json`,只展示名称、类型、状态、是否默认和最近验证时间。
44
48
  - 重命名:用本地 launcher 执行 `environment rename --environment-id <uuid> --name <name>`。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rainskills",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "description": "Interactive Rainbond skill installer for Codex, Claude Code, and Pi Agent",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/goodrain/rainskills#readme",
@@ -102,7 +102,7 @@ description: "Use whenever a user asks to deploy, run, deliver, publish, inspect
102
102
 
103
103
  第一步检查 Node.js 是否存在且主版本不低于 18。Node.js 缺失或低于 18 时,只说明“Rainskills 执行组件需要 Node.js 18 或更高版本”并停止:不选择运行环境,不调用 MCP,不猜测替代命令。只有用户或 agent 明确同意后才安装或升级 Node.js,再从同一原始 intent 继续。
104
104
 
105
- 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.11`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止使用 `rainskills@latest`,禁止拼接或执行 shell 字符串。
105
+ 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.13`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止使用 `rainskills@latest`,禁止拼接或执行 shell 字符串。
106
106
 
107
107
  本地 launcher 必须从当前 Skill 所在目录的同级目录定位 `rainbond-platform-installer/scripts/local-runtime.js`,解析为绝对路径后使用 `["node", "<绝对路径>"]` 执行。`environment list`、`operation begin`、`operation complete` 和 `runtime message` 只能使用本地 launcher;本地 launcher 只读取已安装文件和本机受保护状态,不得访问 npm 或其它网络。只有用户选定连接或安装运行环境后,才使用上面的固定本地 launcher。
108
108
 
@@ -114,7 +114,7 @@ description: "Use whenever a user asks to deploy, run, deliver, publish, inspect
114
114
  ```json
115
115
  {
116
116
  "schema": "rainskills.skill-runtime-contract.v1",
117
- "package_version": "rainskills@0.1.11",
117
+ "package_version": "rainskills@0.1.13",
118
118
  "launcher": ["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"],
119
119
  "local_launcher": ["node", "<installed-skills-root>/rainbond-platform-installer/scripts/local-runtime.js"],
120
120
  "local_argv": {
@@ -148,9 +148,13 @@ description: "Use whenever a user asks to deploy, run, deliver, publish, inspect
148
148
  连接或平台安装完成后,用固定 `onboarding-id` 执行 launcher + `["intent", "resume", "--onboarding-id", "<同一 onboarding-id>"]`,恢复原始 intent 和 `resume_step`,不得重新猜测动作。
149
149
 
150
150
  业务 MCP 返回 401 时,先执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "credential-expired"]`,再仅一次执行 launcher + `["runtime", "reconnect", "--onboarding-id", "<同一 onboarding-id>"]`,然后 resume 并只重试该步骤;第二次 401 立即停止。403 时执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "permission-denied"]` 后停止,不得 reconnect、重新授权或自动重试,只说明缺少的权限。
151
- <!-- rainskills-runtime-gate:end -->
151
+ <!-- rainskills-runtime-gate:end -->
152
152
 
153
- <!-- rainskills-runtime-routing:start -->
153
+ 受限沙箱(包括 Codex)执行本地状态命令时,必须申请用户级受保护目录访问权限;在 Codex 中使用 `require_escalated`。不得修改 `~/.rainbond` 权限、复制受保护状态到工作区,或因沙箱权限错误建议重装。
154
+
155
+ 执行优化:同一会话内只检查一次 Node.js(首次使用本地 CLI 前);仅在 Node.js 或 Rainskills 安装、升级,或 PATH 变更后失效。固定 launcher 和 argv 已在本 Skill 中,禁止读取、搜索或探测 `rainskills.js`,也禁止执行 `npm root -g`。每个新的业务操作仍需要刷新一次环境列表;带已有 `operation_id` 或 `onboarding-id` 的续接复用已绑定的环境 ID,不重复枚举环境。
156
+
157
+ <!-- rainskills-runtime-routing:start -->
154
158
  ## 缺少运行环境时
155
159
 
156
160
  先确认 intent 属于 new scope 还是 existing scope;确认前不展示环境选项。
@@ -18,7 +18,7 @@ description: "Use when a user explicitly asks for an existing Rainbond app versi
18
18
 
19
19
  第一步检查 Node.js 是否存在且主版本不低于 18。Node.js 缺失或低于 18 时,只说明“Rainskills 执行组件需要 Node.js 18 或更高版本”并停止:不选择运行环境,不调用 MCP,不猜测替代命令。只有用户或 agent 明确同意后才安装或升级 Node.js,再从同一原始 intent 继续。
20
20
 
21
- 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.11`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止 `rainskills@latest` 或执行 shell 字符串。
21
+ 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.13`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止 `rainskills@latest` 或执行 shell 字符串。
22
22
 
23
23
  本地 launcher 必须从当前 Skill 所在目录的同级目录定位 `rainbond-platform-installer/scripts/local-runtime.js`,解析为绝对路径后使用 `["node", "<绝对路径>"]` 执行。`environment list`、`operation begin`、`operation complete` 和 `runtime message` 只能使用本地 launcher;本地 launcher 只读取已安装文件和本机受保护状态,不得访问 npm 或其它网络。只有用户选定连接运行环境后,才使用上面的固定本地 launcher。
24
24
 
@@ -30,7 +30,7 @@ description: "Use when a user explicitly asks for an existing Rainbond app versi
30
30
  ```json
31
31
  {
32
32
  "schema": "rainskills.skill-runtime-contract.v1",
33
- "package_version": "rainskills@0.1.11",
33
+ "package_version": "rainskills@0.1.13",
34
34
  "launcher": ["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"],
35
35
  "local_launcher": ["node", "<installed-skills-root>/rainbond-platform-installer/scripts/local-runtime.js"],
36
36
  "local_argv": {
@@ -58,6 +58,10 @@ target 只允许 `codex`、`claude`、`pi`、`all`。校验 intent 后只执行
58
58
  连接完成后用固定 `onboarding-id` 执行 launcher + `["intent", "resume", "--onboarding-id", "<同一 onboarding-id>"]`,恢复原始 intent 和 `resume_step`。401 先执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "credential-expired"]`,再仅一次执行 launcher + `["runtime", "reconnect", "--onboarding-id", "<同一 onboarding-id>"]` 后 resume,只重试该步骤;第二次 401 停止。403 执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "permission-denied"]` 后停止,不得 reconnect、重新授权或自动重试。
59
59
  <!-- rainskills-runtime-gate:end -->
60
60
 
61
+ 受限沙箱(包括 Codex)执行本地状态命令时,必须申请用户级受保护目录访问权限;在 Codex 中使用 `require_escalated`。不得修改 `~/.rainbond` 权限、复制受保护状态到工作区,或因沙箱权限错误建议重装。
62
+
63
+ 执行优化:同一会话内只检查一次 Node.js(首次使用本地 CLI 前);仅在 Node.js 或 Rainskills 安装、升级,或 PATH 变更后失效。固定 launcher 和 argv 已在本 Skill 中,禁止读取、搜索或探测 `rainskills.js`,也禁止执行 `npm root -g`。每个新的业务操作仍需要刷新一次环境列表;带已有 `operation_id` 或 `onboarding-id` 的续接复用已绑定的环境 ID,不重复枚举环境。
64
+
61
65
  <!-- rainskills-runtime-routing:start -->
62
66
  ## 缺少运行环境时
63
67
 
@@ -50,7 +50,7 @@ description: "Use only when the user explicitly asks for final delivery or acces
50
50
 
51
51
  第一步检查 Node.js 是否存在且主版本不低于 18。Node.js 缺失或低于 18 时,只说明“Rainskills 执行组件需要 Node.js 18 或更高版本”并停止:不选择运行环境,不调用 MCP,不猜测替代命令。只有用户或 agent 明确同意后才安装或升级 Node.js,再从同一原始 intent 继续。
52
52
 
53
- 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.11`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止 `rainskills@latest` 或执行 shell 字符串。
53
+ 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.13`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止 `rainskills@latest` 或执行 shell 字符串。
54
54
 
55
55
  本地 launcher 必须从当前 Skill 所在目录的同级目录定位 `rainbond-platform-installer/scripts/local-runtime.js`,解析为绝对路径后使用 `["node", "<绝对路径>"]` 执行。`environment list`、`operation begin`、`operation complete` 和 `runtime message` 只能使用本地 launcher;本地 launcher 只读取已安装文件和本机受保护状态,不得访问 npm 或其它网络。只有用户选定连接运行环境后,才使用上面的固定本地 launcher。
56
56
 
@@ -62,7 +62,7 @@ description: "Use only when the user explicitly asks for final delivery or acces
62
62
  ```json
63
63
  {
64
64
  "schema": "rainskills.skill-runtime-contract.v1",
65
- "package_version": "rainskills@0.1.11",
65
+ "package_version": "rainskills@0.1.13",
66
66
  "launcher": ["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"],
67
67
  "local_launcher": ["node", "<installed-skills-root>/rainbond-platform-installer/scripts/local-runtime.js"],
68
68
  "local_argv": {
@@ -88,6 +88,10 @@ target 只允许 `codex`、`claude`、`pi`、`all`。校验 intent 后只执行
88
88
  连接完成后用固定 `onboarding-id` 执行 launcher + `["intent", "resume", "--onboarding-id", "<同一 onboarding-id>"]`,恢复原始 intent 和 `resume_step`。401 先执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "credential-expired"]`,再仅一次执行 launcher + `["runtime", "reconnect", "--onboarding-id", "<同一 onboarding-id>"]` 后 resume,只重试该步骤;第二次 401 停止。403 执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "permission-denied"]` 后停止,不得 reconnect、重新授权或自动重试。
89
89
  <!-- rainskills-runtime-gate:end -->
90
90
 
91
+ 受限沙箱(包括 Codex)执行本地状态命令时,必须申请用户级受保护目录访问权限;在 Codex 中使用 `require_escalated`。不得修改 `~/.rainbond` 权限、复制受保护状态到工作区,或因沙箱权限错误建议重装。
92
+
93
+ 执行优化:同一会话内只检查一次 Node.js(首次使用本地 CLI 前);仅在 Node.js 或 Rainskills 安装、升级,或 PATH 变更后失效。固定 launcher 和 argv 已在本 Skill 中,禁止读取、搜索或探测 `rainskills.js`,也禁止执行 `npm root -g`。每个新的业务操作仍需要刷新一次环境列表;带已有 `operation_id` 或 `onboarding-id` 的续接复用已绑定的环境 ID,不重复枚举环境。
94
+
91
95
  <!-- rainskills-runtime-routing:start -->
92
96
  ## 缺少运行环境时
93
97
 
@@ -18,7 +18,7 @@ description: "Use when a user explicitly asks to sync non-sensitive preview or p
18
18
 
19
19
  第一步检查 Node.js 是否存在且主版本不低于 18。Node.js 缺失或低于 18 时,只说明“Rainskills 执行组件需要 Node.js 18 或更高版本”并停止:不选择运行环境,不调用 MCP,不猜测替代命令。只有用户或 agent 明确同意后才安装或升级 Node.js,再从同一原始 intent 继续。
20
20
 
21
- 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.11`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止 `rainskills@latest` 或执行 shell 字符串。
21
+ 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.13`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止 `rainskills@latest` 或执行 shell 字符串。
22
22
 
23
23
  本地 launcher 必须从当前 Skill 所在目录的同级目录定位 `rainbond-platform-installer/scripts/local-runtime.js`,解析为绝对路径后使用 `["node", "<绝对路径>"]` 执行。`environment list`、`operation begin`、`operation complete` 和 `runtime message` 只能使用本地 launcher;本地 launcher 只读取已安装文件和本机受保护状态,不得访问 npm 或其它网络。只有用户选定连接运行环境后,才使用上面的固定本地 launcher。
24
24
 
@@ -30,7 +30,7 @@ description: "Use when a user explicitly asks to sync non-sensitive preview or p
30
30
  ```json
31
31
  {
32
32
  "schema": "rainskills.skill-runtime-contract.v1",
33
- "package_version": "rainskills@0.1.11",
33
+ "package_version": "rainskills@0.1.13",
34
34
  "launcher": ["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"],
35
35
  "local_launcher": ["node", "<installed-skills-root>/rainbond-platform-installer/scripts/local-runtime.js"],
36
36
  "local_argv": {
@@ -56,6 +56,10 @@ target 只允许 `codex`、`claude`、`pi`、`all`。校验 intent 后只执行
56
56
  连接完成后用固定 `onboarding-id` 执行 launcher + `["intent", "resume", "--onboarding-id", "<同一 onboarding-id>"]`,恢复原始 intent 和 `resume_step`。401 先执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "credential-expired"]`,再仅一次执行 launcher + `["runtime", "reconnect", "--onboarding-id", "<同一 onboarding-id>"]` 后 resume,只重试该步骤;第二次 401 停止。403 执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "permission-denied"]` 后停止,不得 reconnect、重新授权或自动重试。
57
57
  <!-- rainskills-runtime-gate:end -->
58
58
 
59
+ 受限沙箱(包括 Codex)执行本地状态命令时,必须申请用户级受保护目录访问权限;在 Codex 中使用 `require_escalated`。不得修改 `~/.rainbond` 权限、复制受保护状态到工作区,或因沙箱权限错误建议重装。
60
+
61
+ 执行优化:同一会话内只检查一次 Node.js(首次使用本地 CLI 前);仅在 Node.js 或 Rainskills 安装、升级,或 PATH 变更后失效。固定 launcher 和 argv 已在本 Skill 中,禁止读取、搜索或探测 `rainskills.js`,也禁止执行 `npm root -g`。每个新的业务操作仍需要刷新一次环境列表;带已有 `operation_id` 或 `onboarding-id` 的续接复用已绑定的环境 ID,不重复枚举环境。
62
+
59
63
  <!-- rainskills-runtime-routing:start -->
60
64
  ## 缺少运行环境时
61
65
 
@@ -18,7 +18,7 @@ description: "Use only when the user explicitly asks to create the Rainbond app
18
18
 
19
19
  第一步检查 Node.js 是否存在且主版本不低于 18。Node.js 缺失或低于 18 时,只说明“Rainskills 执行组件需要 Node.js 18 或更高版本”并停止:不选择运行环境,不调用 MCP,不猜测替代命令。只有用户或 agent 明确同意后才安装或升级 Node.js,再从同一原始 intent 继续。
20
20
 
21
- 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.11`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止 `rainskills@latest` 或执行 shell 字符串。
21
+ 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.13`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止 `rainskills@latest` 或执行 shell 字符串。
22
22
 
23
23
  本地 launcher 必须从当前 Skill 所在目录的同级目录定位 `rainbond-platform-installer/scripts/local-runtime.js`,解析为绝对路径后使用 `["node", "<绝对路径>"]` 执行。`environment list`、`operation begin`、`operation complete` 和 `runtime message` 只能使用本地 launcher;本地 launcher 只读取已安装文件和本机受保护状态,不得访问 npm 或其它网络。只有用户选定连接或安装运行环境后,才使用上面的固定本地 launcher。
24
24
 
@@ -30,7 +30,7 @@ description: "Use only when the user explicitly asks to create the Rainbond app
30
30
  ```json
31
31
  {
32
32
  "schema": "rainskills.skill-runtime-contract.v1",
33
- "package_version": "rainskills@0.1.11",
33
+ "package_version": "rainskills@0.1.13",
34
34
  "launcher": ["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"],
35
35
  "local_launcher": ["node", "<installed-skills-root>/rainbond-platform-installer/scripts/local-runtime.js"],
36
36
  "local_argv": {
@@ -64,6 +64,10 @@ target 只允许 `codex`、`claude`、`pi`、`all`。校验 intent 后按 `route
64
64
  连接完成后用固定 `onboarding-id` 执行 launcher + `["intent", "resume", "--onboarding-id", "<同一 onboarding-id>"]`,恢复原始 intent 和 `resume_step`。401 先执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "credential-expired"]`,再仅一次执行 launcher + `["runtime", "reconnect", "--onboarding-id", "<同一 onboarding-id>"]` 后 resume,只重试该步骤;第二次 401 停止。403 执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "permission-denied"]` 后停止,不得 reconnect、重新授权或自动重试。
65
65
  <!-- rainskills-runtime-gate:end -->
66
66
 
67
+ 受限沙箱(包括 Codex)执行本地状态命令时,必须申请用户级受保护目录访问权限;在 Codex 中使用 `require_escalated`。不得修改 `~/.rainbond` 权限、复制受保护状态到工作区,或因沙箱权限错误建议重装。
68
+
69
+ 执行优化:同一会话内只检查一次 Node.js(首次使用本地 CLI 前);仅在 Node.js 或 Rainskills 安装、升级,或 PATH 变更后失效。固定 launcher 和 argv 已在本 Skill 中,禁止读取、搜索或探测 `rainskills.js`,也禁止执行 `npm root -g`。每个新的业务操作仍需要刷新一次环境列表;带已有 `operation_id` 或 `onboarding-id` 的续接复用已绑定的环境 ID,不重复枚举环境。
70
+
67
71
  <!-- rainskills-runtime-routing:start -->
68
72
  ## 缺少运行环境时
69
73
 
@@ -50,7 +50,7 @@ description: "Use only when the user explicitly asks for a bounded build, runtim
50
50
 
51
51
  第一步检查 Node.js 是否存在且主版本不低于 18。Node.js 缺失或低于 18 时,只说明“Rainskills 执行组件需要 Node.js 18 或更高版本”并停止:不选择运行环境,不调用 MCP,不猜测替代命令。只有用户或 agent 明确同意后才安装或升级 Node.js,再从同一原始 intent 继续。
52
52
 
53
- 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.11`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止 `rainskills@latest` 或执行 shell 字符串。
53
+ 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.13`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止 `rainskills@latest` 或执行 shell 字符串。
54
54
 
55
55
  本地 launcher 必须从当前 Skill 所在目录的同级目录定位 `rainbond-platform-installer/scripts/local-runtime.js`,解析为绝对路径后使用 `["node", "<绝对路径>"]` 执行。`environment list`、`operation begin`、`operation complete` 和 `runtime message` 只能使用本地 launcher;本地 launcher 只读取已安装文件和本机受保护状态,不得访问 npm 或其它网络。只有用户选定连接运行环境后,才使用上面的固定本地 launcher。
56
56
 
@@ -62,7 +62,7 @@ description: "Use only when the user explicitly asks for a bounded build, runtim
62
62
  ```json
63
63
  {
64
64
  "schema": "rainskills.skill-runtime-contract.v1",
65
- "package_version": "rainskills@0.1.11",
65
+ "package_version": "rainskills@0.1.13",
66
66
  "launcher": ["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"],
67
67
  "local_launcher": ["node", "<installed-skills-root>/rainbond-platform-installer/scripts/local-runtime.js"],
68
68
  "local_argv": {
@@ -88,6 +88,10 @@ target 只允许 `codex`、`claude`、`pi`、`all`。校验 intent 后只执行
88
88
  连接完成后用固定 `onboarding-id` 执行 launcher + `["intent", "resume", "--onboarding-id", "<同一 onboarding-id>"]`,恢复原始 intent 和 `resume_step`。401 先执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "credential-expired"]`,再仅一次执行 launcher + `["runtime", "reconnect", "--onboarding-id", "<同一 onboarding-id>"]` 后 resume,只重试该步骤;第二次 401 停止。403 执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "permission-denied"]` 后停止,不得 reconnect、重新授权或自动重试。
89
89
  <!-- rainskills-runtime-gate:end -->
90
90
 
91
+ 受限沙箱(包括 Codex)执行本地状态命令时,必须申请用户级受保护目录访问权限;在 Codex 中使用 `require_escalated`。不得修改 `~/.rainbond` 权限、复制受保护状态到工作区,或因沙箱权限错误建议重装。
92
+
93
+ 执行优化:同一会话内只检查一次 Node.js(首次使用本地 CLI 前);仅在 Node.js 或 Rainskills 安装、升级,或 PATH 变更后失效。固定 launcher 和 argv 已在本 Skill 中,禁止读取、搜索或探测 `rainskills.js`,也禁止执行 `npm root -g`。每个新的业务操作仍需要刷新一次环境列表;带已有 `operation_id` 或 `onboarding-id` 的续接复用已绑定的环境 ID,不重复枚举环境。
94
+
91
95
  <!-- rainskills-runtime-routing:start -->
92
96
  ## 缺少运行环境时
93
97
 
@@ -18,7 +18,7 @@ Node.js 前置检查通过后,每次请求先执行本地 launcher + `["enviro
18
18
 
19
19
  第一步检查 Node.js 是否存在且主版本不低于 18。Node.js 缺失或低于 18 时,只说明“Rainskills 执行组件需要 Node.js 18 或更高版本”并停止:不选择运行环境,不调用 MCP,不猜测替代命令。只有用户或 agent 明确同意后才安装或升级 Node.js,再从同一原始 intent 继续。
20
20
 
21
- 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.11`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止 `rainskills@latest`,禁止拼接或执行 shell 字符串。
21
+ 固定 launcher 是 `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`;运行包版本标记为 `rainskills@0.1.13`,且必须与本技能包 `package.json` 一致。把 launcher 与参数拼成 argv 数组直接执行,禁止 `rainskills@latest`,禁止拼接或执行 shell 字符串。
22
22
 
23
23
  本地 launcher 必须从当前 Skill 所在目录的同级目录定位 `rainbond-platform-installer/scripts/local-runtime.js`,解析为绝对路径后使用 `["node", "<绝对路径>"]` 执行。`environment list`、`operation begin`、`operation complete` 和 `runtime message` 只能使用本地 launcher;本地 launcher 只读取已安装文件和本机受保护状态,不得访问 npm 或其它网络。只有用户选定连接或安装运行环境后,才使用固定 launcher。
24
24
 
@@ -30,7 +30,7 @@ Node.js 前置检查通过后,每次请求先执行本地 launcher + `["enviro
30
30
  ```json
31
31
  {
32
32
  "schema": "rainskills.skill-runtime-contract.v1",
33
- "package_version": "rainskills@0.1.11",
33
+ "package_version": "rainskills@0.1.13",
34
34
  "launcher": ["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"],
35
35
  "local_launcher": ["node", "<installed-skills-root>/rainbond-platform-installer/scripts/local-runtime.js"],
36
36
  "local_argv": {
@@ -57,6 +57,10 @@ target 只允许 `codex`、`claude`、`pi`、`all`。校验 intent 后只执行
57
57
  连接完成后用固定 `onboarding-id` 执行 launcher + `["intent", "resume", "--onboarding-id", "<同一 onboarding-id>"]`,恢复原始 intent 和 `resume_step`。401 先执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "credential-expired"]`,再仅一次执行 launcher + `["runtime", "reconnect", "--onboarding-id", "<同一 onboarding-id>"]` 后 resume,只重试该步骤;第二次 401 停止。403 执行 launcher + `["runtime", "record-failure", "--onboarding-id", "<同一 onboarding-id>", "--step", "<当前固定步骤>", "--reason", "permission-denied"]` 后停止,不得 reconnect、重新授权或自动重试。
58
58
  <!-- rainskills-runtime-gate:end -->
59
59
 
60
+ 受限沙箱(包括 Codex)执行本地状态命令时,必须申请用户级受保护目录访问权限;在 Codex 中使用 `require_escalated`。不得修改 `~/.rainbond` 权限、复制受保护状态到工作区,或因沙箱权限错误建议重装。
61
+
62
+ 执行优化:同一会话内只检查一次 Node.js(首次使用本地 CLI 前);仅在 Node.js 或 Rainskills 安装、升级,或 PATH 变更后失效。固定 launcher 和 argv 已在本 Skill 中,禁止读取、搜索或探测 `rainskills.js`,也禁止执行 `npm root -g`。每个新的业务操作仍需要刷新一次环境列表;带已有 `operation_id` 或 `onboarding-id` 的续接复用已绑定的环境 ID,不重复枚举环境。
63
+
60
64
  <!-- rainskills-runtime-routing:start -->
61
65
  ## 缺少运行环境时
62
66
 
@@ -17,6 +17,7 @@ This is an internal Rainskills onboarding capability. Do not present it as a sep
17
17
  - 一次只处理当前消息块;用户选择后只执行 helper 给出的固定 argv,不自行设计问题或命令。
18
18
  - 平台安装和授权必须留在原 AI 任务中执行;不得让用户把完整的 `platform install` 命令复制到外部终端。
19
19
  - helper 无法免密连接 SSH 时,无论当前任务是否有 TTY,都必须原样展示 `platform.ssh-authentication` 固定消息并停止。不得在 AI 任务中等待或读取 SSH 密码。
20
+ - 主机集群普通入口第一次输出 `platform.host-cluster-server-input` 时,只原样展示固定的 `servers.txt` 消息并停止。消息必须包含可点击链接、当前系统的打开命令、四个字段说明和“编辑完成后回复‘已完成’”;不要让用户编辑 YAML 或节点角色。
20
21
  - 单台服务器只执行消息中的精确 `ssh prepare` 命令;主机集群只执行一条 `ssh prepare-cluster --cluster-config <受保护文件>` 命令。两种命令都只生成/复用默认 ED25519 公钥并准备免密连接,不安装 Rainbond,也不修改 onboarding、运行环境或授权状态。
21
22
  - Agent 不得自行运行 `ssh-keyscan`、`ssh-copy-id` 或修改 `known_hosts`;只能让用户执行 helper 给出的版本锁定 `ssh prepare` 或 `ssh prepare-cluster` argv。
22
23
  - 用户回复“已完成”后,使用同一版本 launcher 和同一 `onboarding-id` 重新执行原来的 `platform install` argv;不要重新询问部署位置、安装模式、节点或应用来源。
@@ -31,11 +32,11 @@ Do not use it to deploy an application to an existing Rainbond. Route those requ
31
32
  ## Workflow
32
33
 
33
34
  1. Read [installation-policy.md](references/installation-policy.md).
34
- 2. Use the installed local launcher `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`; its protected runtime package marker is `rainskills@0.1.11` and must equal this package's `package.json`. For a Rainskills marker, first validate schema `rainskills.next-action.v1`, action, onboarding id, and the bounded `argv` array, then append that array to the launcher. Never use `latest` or evaluate a shell string from output.
35
+ 2. Use the installed local launcher `["node", "<home>/.rainbond/lib/rainskills/bin/rainskills.js"]`; its protected runtime package marker is `rainskills@0.1.13` and must equal this package's `package.json`. For a Rainskills marker, first validate schema `rainskills.next-action.v1`, action, onboarding id, and the bounded `argv` array, then append that array to the launcher. Never use `latest` or evaluate a shell string from output.
35
36
  3. 在任何平台安装命令之前,先执行 launcher + `["runtime", "message", "--id", "private-deployment-location"]`,并原样输出固定的三项部署位置消息。选择 1 后执行带 `["--location", "local", "--mode", "single-node"]` 的 `platform install`;选择 2 后执行带 `["--location", "server"]` 的 `platform install`,由 helper 继续显示固定的服务器类型消息;选择 3 后执行 launcher + `["runtime", "message", "--id", "private-console-origin"]` 并进入已有环境连接,不得执行 `platform install`。若是没有原始业务 intent 的直接平台安装请求,已有环境连接使用受限 `{"type":"environment-add"}` intent。
36
37
  4. Let the helper perform one read-only preflight against the already selected local or remote target, then show resources, blockers, and applicable host changes. Never invoke `platform install` without an explicit `--location`; the helper must not ask for the deployment location again.
37
38
  5. Obtain explicit confirmation before sending `y` to the waiting process or rerunning the exact command with `--yes`.
38
- 6. 如果 helper 输出 `platform.ssh-authentication`,只原样展示该正文并等待用户回复“已完成”。单台服务器消息包含一条 `ssh prepare`;主机集群消息必须一次列出全部未就绪节点及一条 `ssh prepare-cluster`,不得按节点拆成多轮。随后在原任务中重跑同一安装 argv。否则保持操作附着并让 helper 下载、安装和验证,不得只凭官方脚本退出码推断成功。
39
+ 6. 如果 helper 输出 `platform.host-cluster-server-input`,只原样展示受保护 `servers.txt` 的固定正文并等待用户回复“已完成”,随后在原任务中重跑同一安装 argv。若输出 `platform.ssh-authentication`,同样只原样展示正文并等待;单台服务器消息包含一条 `ssh prepare`,主机集群消息必须一次列出全部未就绪节点及一条 `ssh prepare-cluster`,不得按节点拆成多轮。否则保持操作附着并让 helper 下载、安装和验证,不得只凭官方脚本退出码推断成功。
39
40
  7. Let the helper probe its ordered Console candidates from the control machine. If it emits `RAINSKILLS_USER_INPUT_REQUIRED:console_address`, ask for one public IP or DNS name and rerun the same fixed argv with `--console-host <host>` appended.
40
41
  8. On success, allow the helper to resume Rainskills authorization automatically. The user completes login and authorization in the browser.
41
42
 
@@ -62,11 +63,13 @@ Do not use it to deploy an application to an existing Rainbond. Route those requ
62
63
  3、已有 Kubernetes 集群
63
64
  ```
64
65
 
65
- 主机集群驱动仍支持导入或恢复 12 N Linux 主机的有效配置;etcd 节点数必须是正奇数。
66
+ 主机集群普通入口接受 `3-100` 台 Linux 主机。第一次进入 configuration 阶段时,必须只生成权限为 `0600`(Windows 为仅当前用户可读写)的受保护 `servers.txt` 并停止等待,不得先生成 `cluster.yaml`、发起 SSH、下载或安装。该文件带中文标题、中文注释和三个节点区块;用户可复制完整区块扩展节点,只填写每台服务器的公网 IP、内网 IPSSH 端口和 root 密码。逐节点 SSH 端口按实际值填写,不要求为 22。固定消息必须包含可点击的 `servers.txt` 链接、当前系统的打开命令、`public_ip`、`private_ip`、`ssh_port`、`password` 四字段说明,以及“编辑完成后回复‘已完成’”。普通用户不编辑 `cluster.yaml`、YAML 或节点角色。
66
67
 
67
- 主机集群第一次进入 configuration 阶段时,必须自动生成受保护的三节点 `cluster.yaml` 示例文件并停止等待。必须原样转发安装器固定消息,其中包含可点击的 `cluster.yaml` 文件链接和当前系统的打开命令,以及“一次性修改服务器地址、SSH 端口和节点角色、填写每台服务器的 password,完成后回复‘已完成’”;不得只给文件路径,也不得逐台询问节点字段。每个 `hosts` 节点必须包含空的 `password` 字段和一次填写备注;用户只在权限为 `0600`(Windows 为仅当前用户可读写)的本地文件中填写真实值。密码不得输出到聊天、日志、状态或错误信息。生成模板仍禁止 private key、Token 或其他 secret 字段。
68
+ 用户继续同一 onboarding 时,读取同一份受保护 `servers.txt`(UTF-8,最大 1 MiB)并一次性列出全部可确定的区块、字段、地址、端口、重复节点和 3-100 节点数量问题。存在问题时保持原文件供修改,不创建 YAML 或产生其他副作用。校验通过后,自动生成受保护的 `cluster.yaml` 并自动分配拓扑:前三台承担 etcd/master,全部节点承担 worker/rbd-chaos,前两台承担 rbd-gateway,第一台承担 bootstrap/nfs-server。普通入口固定使用 3 etcd 节点;高级导入的 etcd 节点数仍必须是正奇数。在第一次 SSH 动作之前展示不含密码的完整逐节点角色拓扑、bootstrap 和存储摘要,再检查并准备全部节点的 SSH 免密连接。
68
69
 
69
- 用户继续同一 onboarding 时,读取同一份受保护文件并一次性列出全部可确定的 YAML、节点、角色、bootstrap、etcd 和存储问题。存在问题时不得发起 SSH、下载或安装;配置通过后展示节点数、etcd 数量、bootstrap 和存储模式,直接检查并准备全部节点的 SSH 免密连接。已有 `--cluster-config` 高级导入仍保留原始字节和未知字段。
70
+ 密码只保存在受保护的本地 `servers.txt`、自动生成的 `cluster.yaml` ROI 安装/恢复所需的受保护远端配置中;密码不会写入聊天、日志、状态或错误信息,摘要也不得包含密码。恢复时锁定 `servers.txt` 与自动生成 `cluster.yaml` 的摘要;只采用与当前输入逐字节匹配的 crash residue,来源不明、符号链接、不匹配或锁定后漂移的文件均停止。
71
+
72
+ 保留旧断点兼容:`config_source=generated-template` 继续原有 YAML 恢复流程。显式 `--cluster-config <path>` 是高级导入入口,仍可导入有效的 1、2 或 N 节点 ROI YAML,并保留原始字节和未知字段;这些兼容路径不得改变普通入口不要求用户编辑 YAML 或角色的规则。
70
73
 
71
74
  SSH 免密连接检查必须先检查全部节点。存在未就绪节点时,一次列出全部未就绪节点的序号、名称、IP 和端口,只输出一条版本锁定的 `ssh prepare-cluster --cluster-config <受保护文件>` 命令。该命令在系统终端依次准备所有节点,已经可以免密连接的节点自动跳过;完成后用户只统一回复一次“已完成”。不得发现一台就暂停,也不得逐台要求用户执行命令和回复。
72
75
 
@@ -78,7 +81,7 @@ SSH 免密连接检查必须先检查全部节点。存在未就绪节点时,
78
81
  ## Fixed CLI Handoffs
79
82
 
80
83
  - 通用:`platform install --onboarding-id <id> --location <local|server> --mode <single-node|host-cluster|existing-kubernetes>`
81
- - 主机集群:可追加 `--cluster-config <path>`。
84
+ - 主机集群:普通入口不传配置路径;高级导入可追加 `--cluster-config <path>`,旧 `generated-template` 仅用于恢复既有断点。
82
85
  - 已有 Kubernetes:使用 `--kubeconfig <path> --kube-context <name>`,可追加 `--values <path> --chart-version <version>`。
83
86
  - 非交互确认只接受在展示预检/变更后追加的 `--yes`;不能把缺少确认当作同意。
84
87
 
@@ -11,23 +11,26 @@
11
11
  - 推荐资源:4 核 CPU、8 GB 内存、50 GB 可用磁盘;预检最低门槛为 2 核 CPU、4 GB 内存、30 GB 可用磁盘。低于推荐值时会提示风险但继续安装,最终以 Rainbond 实际部署验证为准。
12
12
  - 安装前端口 `80`、`443`、`7070` 必须空闲。
13
13
 
14
- 远程单机只接受 `user@host` 或 `~/.ssh/config` 主机别名;ROI 主机集群逐节点使用配置中的 root 地址和端口。两种方式都先用 `BatchMode=yes` 检查现有免密连接。远程单机检查失败时固定输出一条版本锁定的 `ssh prepare`;主机集群先检查全部节点,再一次列出所有未就绪节点并输出一条版本锁定的 `ssh prepare-cluster --cluster-config`。用户只在自己电脑的系统终端执行,OpenSSH 读取每台服务器的指纹确认和一次密码;命令只准备公钥连接,不安装 Rainbond。全部完成后只统一回复一次“已完成”。恢复后所有 `ssh` / `scp` 均为免密非交互调用。Rainskills 不接收或保存 SSH 密码、私钥,也不支持离线安装或自动清理冲突环境。
14
+ 远程单机只接受 `user@host` 或 `~/.ssh/config` 主机别名;ROI 主机集群逐节点使用配置中的 root 地址和端口。两种方式都先用 `BatchMode=yes` 检查现有免密连接。远程单机检查失败时固定输出一条版本锁定的 `ssh prepare`;主机集群先检查全部节点,再一次列出所有未就绪节点并输出一条版本锁定的 `ssh prepare-cluster --cluster-config`。用户只在自己电脑的系统终端执行,OpenSSH 读取每台服务器的指纹确认和一次密码;命令只准备公钥连接,不安装 Rainbond。全部完成后只统一回复一次“已完成”。恢复后所有 `ssh` / `scp` 均为免密非交互调用。Rainskills 不接收聊天中的 SSH 密码或私钥,也不支持离线安装或自动清理冲突环境。
15
15
 
16
16
  远程单机安装使用 `ssh -G` 解析的实际主机作为新平台 EIP,不再优先使用 `hostname -I` 的首个内网地址。完成后从控制端依次验证显式 Console 主机、SSH 实际主机、SSH 字面主机、Rainbond 上报 EIP 和远端主网卡地址,保存第一个可访问的 `http://<host>:7070`。手动补充只接受 IP 或 DNS 域名。
17
17
 
18
18
  ## ROI 主机集群策略
19
19
 
20
- - 支持 1 台、2 台或任意数量的 Linux 节点,不把“三台以上”作为安装阻断条件。少于三个控制面或 etcd 节点时明确提示不具备高可用。
21
- - etcd 必须至少一个且数量为奇数;恰好一个 bootstrap,并且 bootstrap 必须属于 master。master、worker、rbd-gateway、rbd-chaos 均至少包含一个合法节点。
22
- - 内置 NFS 必须恰好选择一个 nfs-server;外部 NFS、已有 StorageClass 或外部存储不能配置 nfs-server。
23
- - 基础向导只生成内置 NFS、内置数据库和内置镜像仓库的最小配置,不询问或保存密码。高级配置通过 `--cluster-config` 导入。
24
- - 导入时只解析配置用于校验和摘要,受保护副本保留原始字节,不重新序列化未知 ROI 字段。拒绝符号链接、非普通文件、非当前用户文件,以及权限宽于 `0600` 的敏感配置。
20
+ - 普通入口支持 `3-100` Linux 节点。首次进入时只创建受保护的 `servers.txt` 并停止等待,不生成 `cluster.yaml`、不发起 SSH,也不下载或执行 ROI。固定消息提供可点击链接、macOS/Linux/Windows 对应打开命令、四字段说明和“编辑完成后回复‘已完成’”;普通用户不编辑 `cluster.yaml`、YAML 或节点角色。
21
+ - `servers.txt` 使用 UTF-8 文本,包含中文标题、中文注释和三个连续的 `[server-N]` 区块。每个区块只允许 `public_ip`(公网 IP)、`private_ip`(内网 IP)、`ssh_port`(逐节点 SSH 端口)和 `password`(root 密码);超过三台时复制完整区块并连续编号。每台服务器可使用不同端口,SSH 端口范围为 1-65535,不要求为 22。文件最大 1 MiB,最多 100 个节点;一次汇总全部格式、字段、地址、端口、重复 endpoint 和节点数量问题。
22
+ - `servers.txt` 必须是当前用户拥有的普通文件;POSIX 权限精确为 `0600`,Windows 使用仅当前用户可读写的 ACL。通过受保护 descriptor 读取并拒绝符号链接、替换、读取期间变化、非法 UTF-8、NUL/控制字符和超限内容。校验失败时保留同一文件供修改,不创建 YAML 或产生 SSH/下载副作用。
23
+ - 校验成功后自动生成受保护的 `cluster.yaml`:节点依次命名为 node1...nodeN,node1 为 bootstrap;前三台自动承担 etcd/master,全部节点承担 worker/rbd-chaos,前两台承担 rbd-gateway,node1 承担 nfs-server。使用内置 NFS、内置数据库和内置镜像仓库的最小配置。用户不选择或修改节点角色。
24
+ - SSH 前先展示不含凭据的完整逐节点角色拓扑摘要,包括节点数、每节点角色、bootstrap、存储模式和受保护配置路径。密码只保存在受保护的本地 `servers.txt`、自动生成的 `cluster.yaml` 和 ROI 安装/恢复所需的受保护远端配置中。允许内部 `parseHostServerInput` 返回的 host 对象携带 `password`,仅供生成受保护的 `cluster.yaml` 和后续 ROI 安装。对外用户消息、状态、遥测、日志、错误和对外返回值不得反射密码或原始输入,所有对外摘要都不含凭据;日志仍对 password、database、registry、token、secret 等字段脱敏。
25
+ - 状态只保存 `servers.txt` 和自动生成 `cluster.yaml` 的受保护路径及 SHA-256。恢复时两者必须保持字节不变;若崩溃发生在 YAML 已创建但摘要尚未持久化,只采用与当前 `servers.txt` 自动生成结果逐字节相同的 crash residue。来源不明、符号链接、不匹配或锁定后漂移的 `cluster.yaml` 均停止,不覆盖或猜测来源。
26
+ - 保留旧 `config_source=generated-template` 断点,继续原有 YAML 校验和恢复流程。显式 `--cluster-config <path>` 是高级导入入口,继续支持有效的 1、2 或 N 节点 ROI YAML;导入时只解析配置用于校验和摘要,受保护副本保留原始字节,不重新序列化未知 ROI 字段。拒绝符号链接、非普通文件、非当前用户文件,以及权限宽于 `0600` 的敏感配置。
27
+ - 高级/旧 YAML 仍要求 etcd 至少一个且数量为奇数、恰好一个属于 master 的 bootstrap,并满足 master、worker、rbd-gateway、rbd-chaos 和存储角色约束;少于三个控制面或 etcd 节点时明确提示不具备高可用。普通 `servers.txt` 入口固定生成三控制面/etcd 拓扑。
25
28
  - Rainskills 只检查并准备全部节点的 SSH 免密连接,不在 ROI 前自行检查 CPU、内存、磁盘容量、端口、安装源、网络或已有 RKE2/Rainbond,也不根据这些项目阻断安装。SSH 就绪并确认安装后,只对 bootstrap 节点执行固定的 `uname -m`,用于选择 `roi-amd64` 或 `roi-arm64`;实际安装条件由 ROI 判断。
26
29
  - 非交互执行必须显式提供 `--yes`。确认前不下载 ROI,也不传输配置或启动远端命令。
27
30
  - ROI 只允许 `https://get.rainbond.com/roi/roi-amd64` 和 `roi-arm64`,最多三次 `get.rainbond.com/roi/` 同源跳转,下载上限 128 MiB。校验 ELF 类型和架构,并运行固定的 `roi version`。
28
31
  - 安装器会主动探测策略中的官方 checksum 地址;发布 checksum 时必须匹配。官方明确未发布 checksum 时记录该事实,并锁定本次下载的最终 URL、版本和 SHA-256。
29
32
  - 恢复时必须复用字节完全相同的受保护 cluster.yaml 和 ROI。bootstrap 上再次校验两份文件的 SHA-256,然后通过已准备的免密 SSH 执行固定的 `roi up -f <protected-cluster.yaml>`。
30
- - 状态、事件和遥测不保存原始 YAML、SSH/ROI 原始输出或凭据。日志对 password、database、registry、token、secret 等字段脱敏。
33
+ - 状态、事件和遥测不保存原始 TXT/YAML、SSH/ROI 原始输出或凭据。
31
34
  - ROI 正常退出后仍需验证所有预期节点 Ready、rbd-api/rbd-gateway/rbd-app-ui 等关键组件就绪,以及 Console 从当前控制端可访问;全部通过后才能进入授权。
32
35
 
33
36
  ## 已有 Kubernetes 集群策略