@namewta/speculo 1.0.19 → 1.0.21

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.
Files changed (194) hide show
  1. package/README.md +8 -7
  2. package/THIRD-PARTY-NOTICES.md +33 -0
  3. package/dist/src/agent-files.js +2 -2
  4. package/dist/src/agent-files.js.map +1 -1
  5. package/dist/src/agent-skills.d.ts +81 -0
  6. package/dist/src/agent-skills.js +530 -0
  7. package/dist/src/agent-skills.js.map +1 -0
  8. package/dist/src/cli.js +11 -3
  9. package/dist/src/cli.js.map +1 -1
  10. package/dist/src/config.js +5 -3
  11. package/dist/src/config.js.map +1 -1
  12. package/dist/src/doctor.js +7 -2
  13. package/dist/src/doctor.js.map +1 -1
  14. package/dist/src/index.d.ts +8 -0
  15. package/dist/src/index.js +23 -3
  16. package/dist/src/index.js.map +1 -1
  17. package/dist/src/manifest.d.ts +9 -0
  18. package/dist/src/manifest.js +45 -7
  19. package/dist/src/manifest.js.map +1 -1
  20. package/dist/src/refresh.js +40 -0
  21. package/dist/src/refresh.js.map +1 -1
  22. package/dist/src/structured.js +15 -4
  23. package/dist/src/structured.js.map +1 -1
  24. package/dist/src/transaction.d.ts +24 -3
  25. package/dist/src/transaction.js +191 -12
  26. package/dist/src/transaction.js.map +1 -1
  27. package/package.json +7 -4
  28. package/scripts/validate-skills.mjs +56 -0
  29. package/template/AGENTS.md +1 -1
  30. package/template/CLAUDE.md +1 -1
  31. package/template/canonical/canonical-specdev-goal-plan.md +156 -28
  32. package/template/canonical/canonical-specdev-grill-with-docs.md +153 -31
  33. package/template/canonical/canonical-specdev-spec.md +153 -27
  34. package/template/canonical/canonical-specdev-tickets.md +153 -27
  35. package/template/canonical/canonical-specdev-wayfinder.md +142 -27
  36. package/template/commands/retro.md +11 -9
  37. package/template/skills/archive-and-consolidate/SKILL.md +163 -7
  38. package/template/skills/archive-and-consolidate/references/cleanup-rules.md +1 -1
  39. package/template/skills/docs-sync/references/agents/claude-redirect.md +8 -8
  40. package/template/skills/docs-sync/references/agents/content-contract.md +1 -1
  41. package/template/skills/docs-sync/references/agents/manifest-discovery.md +7 -7
  42. package/template/skills/docs-sync/references/agents/role-classification.md +4 -4
  43. package/template/skills/docs-sync/references/agents-contract.md +1 -1
  44. package/template/skills/engineering-standards-builder/SKILL.md +149 -9
  45. package/template/skills/engineering-standards-builder/agents/openai.yaml +2 -0
  46. package/template/skills/engineering-standards-builder/manifest.txt +2 -1
  47. package/template/skills/engineering-standards-builder/references/rules/09-mechanical-guardrails.md +9 -0
  48. package/template/skills/engineering-standards-builder/scripts/validate-builder.mjs +4 -7
  49. package/template/skills/git-history-squash/SKILL.md +87 -11
  50. package/template/skills/git-history-squash/agents/openai.yaml +2 -0
  51. package/template/skills/optimize-codex-config/SKILL.md +71 -11
  52. package/template/skills/{speculo-retro/references/entry-procedure.md → retrospective/SKILL.md} +12 -8
  53. package/template/skills/{speculo-retro → retrospective}/references/friction-taxonomy.md +22 -13
  54. package/template/skills/{speculo-retro → retrospective}/references/issue-drafting-sop.md +10 -20
  55. package/template/skills/source-code-zip/SKILL.md +44 -8
  56. package/template/skills/source-code-zip/references/{entry-procedure.md → cli-reference.md} +0 -43
  57. package/template/skills/upstream-fork-sync/SKILL.md +71 -8
  58. package/template/skills/{writing-great-skills → writing-for-agents}/GLOSSARY.md +1 -1
  59. package/template/skills/writing-for-agents/SKILL.md +22 -0
  60. package/template/skills/writing-for-agents/agents/openai.yaml +2 -0
  61. package/template/skills/{writing-great-skills/references/entry-procedure.md → writing-for-agents/references/authoring-principles.md} +2 -9
  62. package/template/workflows/ops/D-project-deploy/D-project-deploy.md +1 -1
  63. package/template/workflows/ops/H-host-manage/H-host-manage.md +4 -0
  64. package/template/workflows/ops/H-host-manage/references/host-profiles.md +4 -0
  65. package/template/workflows/ops/I-initialize/I-initialize.md +1 -1
  66. package/template/workflows/ops/INDEX.md +2 -0
  67. package/template/workflows/ops/README.md +7 -3
  68. package/template/workflows/ops/S-server-connect/S-server-connect.md +5 -5
  69. package/template/workflows/ops/V-inventory-view/V-inventory-view.md +2 -0
  70. package/template/workflows/ops/common/CAPABILITIES.md +2 -0
  71. package/template/workflows/ops/common/USAGE.md +5 -5
  72. package/template/workflows/ops/common/WORKSPACE-USAGE.md +29 -2
  73. package/template/workflows/ops/common/examples/README.md +1 -1
  74. package/template/workflows/ops/common/examples/register.example.json +7 -3
  75. package/template/workflows/ops/common/examples/server-connection.example.json +11 -0
  76. package/template/workflows/ops/common/rules/deployment-layout.md +1 -1
  77. package/template/workflows/ops/common/rules/host-root-and-onboarding.md +47 -0
  78. package/template/workflows/ops/common/rules/persistence-and-secrets.md +1 -1
  79. package/template/workflows/ops/common/rules/research-and-decisions.md +8 -0
  80. package/template/workflows/ops/common/rules/server-onboarding.md +3 -3
  81. package/template/workflows/ops/common/rules/workspace-and-authorization.md +2 -2
  82. package/template/workflows/ops/common/schemas/fleet-view.schema.json +64 -0
  83. package/template/workflows/ops/common/schemas/host.schema.json +19 -0
  84. package/template/workflows/ops/common/schemas/plan.schema.json +57 -0
  85. package/template/workflows/ops/common/schemas/root-confirmation.schema.json +118 -0
  86. package/template/workflows/ops/common/schemas/server-connection.schema.json +67 -0
  87. package/template/workflows/ops/common/schemas/server-discovery.schema.json +171 -0
  88. package/template/workflows/ops/common/schemas/spec.schema.json +19 -0
  89. package/template/workflows/ops/common/schemas/status.schema.json +19 -0
  90. package/template/workflows/ops/common/templates/FLEET.html +1 -1
  91. package/template/workflows/ops/common/templates/HOST-README.md +3 -1
  92. package/template/workflows/ops/common/tests/test_ops.mjs +8 -11
  93. package/template/workflows/ops/common/tests/test_ops_bootstrap.mjs +101 -16
  94. package/template/workflows/ops/common/tests/test_ops_onboarding.mjs +225 -0
  95. package/template/workflows/ops/common/tests/test_ops_workspace.mjs +17 -8
  96. package/template/workflows/ops/common/tools/demo-local.mjs +4 -0
  97. package/template/workflows/ops/common/tools/opslib/agent.mjs +26 -0
  98. package/template/workflows/ops/common/tools/opslib/bootstrap.mjs +52 -26
  99. package/template/workflows/ops/common/tools/opslib/cli.mjs +1 -0
  100. package/template/workflows/ops/common/tools/opslib/core.mjs +1 -1
  101. package/template/workflows/ops/common/tools/opslib/docs.mjs +1 -0
  102. package/template/workflows/ops/common/tools/opslib/execution.mjs +4 -0
  103. package/template/workflows/ops/common/tools/opslib/fleet.mjs +26 -4
  104. package/template/workflows/ops/common/tools/opslib/host_recipes.mjs +34 -0
  105. package/template/workflows/ops/common/tools/opslib/model.mjs +6 -0
  106. package/template/workflows/ops/common/tools/opslib/onboarding.mjs +215 -0
  107. package/template/workflows/ops/common/tools/opslib/planner.mjs +3 -0
  108. package/template/workflows/ops/common/tools/opslib/transport.mjs +10 -6
  109. package/template/workflows/ops/common/tools/opslib/workspace_cli.mjs +20 -1
  110. package/template/workflows/ops/common/tools/server-discover.sh +65 -0
  111. package/template/workflows/ops/common/tools/validate-ops.mjs +1 -1
  112. package/template/workflows/ops/manifest.json +12 -5
  113. package/template/workflows/specdev/A-archive-and-consolidate/consolidation-interview.md +3 -3
  114. package/template/workflows/specdev/C-code-review/C-code-review.md +1 -1
  115. package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +6 -0
  116. package/template/workflows/specdev/G-grill-with-docs/references/interview-procedure.md +6 -6
  117. package/template/workflows/specdev/I-implement/references/implementation-procedure.md +1 -1
  118. package/template/workflows/specdev/I-implement/tdd-rules.md +4 -0
  119. package/template/workflows/specdev/I-init-setup/config-template.json +5 -1
  120. package/template/workflows/specdev/INDEX.md +2 -2
  121. package/template/workflows/specdev/P-goal-plan/planning-modes.md +1 -1
  122. package/template/workflows/specdev/P-prototype/P-prototype.md +7 -3
  123. package/template/workflows/specdev/P-prototype/logic-protocol.md +11 -0
  124. package/template/workflows/specdev/P-prototype/logic-template.md +27 -0
  125. package/template/workflows/specdev/P-prototype/project-preview-protocol.md +9 -0
  126. package/template/workflows/specdev/R-retro/R-retro.md +26 -0
  127. package/template/workflows/specdev/R-retro/retro-template.md +27 -0
  128. package/template/workflows/specdev/R-review-architecture/references/selected-design.md +1 -1
  129. package/template/workflows/specdev/README.md +13 -2
  130. package/template/workflows/specdev/S-spec/S-spec.md +4 -0
  131. package/template/workflows/specdev/T-tickets/T-tickets.md +4 -0
  132. package/template/workflows/specdev/T-triage/T-triage.md +31 -25
  133. package/template/workflows/specdev/T-triage/capture-protocol.md +1 -1
  134. package/template/workflows/specdev/T-triage/ci-security-protocol.md +11 -0
  135. package/template/workflows/specdev/T-triage/intake-protocol.md +10 -4
  136. package/template/workflows/specdev/T-triage/pr-delivery-protocol.md +13 -0
  137. package/template/workflows/specdev/T-triage/pr-record-template.md +39 -0
  138. package/template/workflows/specdev/T-triage/publish-protocol.md +1 -1
  139. package/template/workflows/specdev/T-triage/queue-protocol.md +7 -0
  140. package/template/workflows/specdev/T-triage/reconcile-protocol.md +1 -1
  141. package/template/workflows/specdev/T-triage/references/issue-pr-policy.md +23 -0
  142. package/template/workflows/specdev/T-triage/references/release-authentication.md +9 -0
  143. package/template/workflows/specdev/T-triage/references/release-notes-injection.md +21 -0
  144. package/template/workflows/specdev/T-triage/references/workflow-yaml-reference.md +37 -0
  145. package/template/workflows/specdev/T-triage/release-preflight.md +13 -0
  146. package/template/workflows/specdev/T-triage/release-protocol.md +12 -0
  147. package/template/workflows/specdev/T-triage/release-recovery.md +18 -0
  148. package/template/workflows/specdev/T-triage/remote-operations.md +25 -0
  149. package/template/workflows/specdev/T-triage/scripts/github-transport.mjs +208 -0
  150. package/template/workflows/specdev/T-triage/source-template.md +7 -0
  151. package/template/workflows/specdev/T-triage/triage-run-template.md +34 -0
  152. package/template/workflows/specdev/T-triage/triage-template.md +4 -1
  153. package/template/workflows/specdev/common/rules/artifact-contract.md +7 -0
  154. package/template/workflows/specdev/common/rules/change-completion.md +6 -0
  155. package/template/workflows/specdev/common/rules/workflow-routing.md +6 -0
  156. package/template/workflows/specdev/common/rules/workflow-state-and-lifecycle.md +1 -1
  157. package/template/workflows/specdev/common/schemas/config.schema.json +137 -26
  158. package/template/workflows/specdev/common/schemas/logic-prototype.schema.json +62 -0
  159. package/template/workflows/specdev/common/schemas/pull-request.schema.json +90 -0
  160. package/template/workflows/specdev/common/schemas/retrospective.schema.json +58 -0
  161. package/template/workflows/specdev/common/schemas/triage-run.schema.json +149 -0
  162. package/template/workflows/specdev/common/schemas/triage.schema.json +117 -15
  163. package/template/workflows/specdev/common/tools/delivery-artifacts.mjs +95 -0
  164. package/template/workflows/specdev/common/tools/validate-specdev.mjs +60 -19
  165. package/template/workflows/specdev/runtime-contract.json +4 -2
  166. package/template/skills/archive-and-consolidate/references/entry-procedure.md +0 -178
  167. package/template/skills/docs-sync/references/entry-procedure.md +0 -3
  168. package/template/skills/engineering-standards-builder/references/entry-procedure.md +0 -154
  169. package/template/skills/git-history-squash/references/entry-procedure.md +0 -94
  170. package/template/skills/github-npm-ops/SKILL.md +0 -19
  171. package/template/skills/github-npm-ops/references/ci-and-security-ops.md +0 -178
  172. package/template/skills/github-npm-ops/references/entry-procedure.md +0 -25
  173. package/template/skills/github-npm-ops/references/failure-recovery.md +0 -123
  174. package/template/skills/github-npm-ops/references/issue-pr-triage.md +0 -227
  175. package/template/skills/github-npm-ops/references/issue-transport.md +0 -26
  176. package/template/skills/github-npm-ops/references/package-json-checklist.md +0 -171
  177. package/template/skills/github-npm-ops/references/preflight-checklist.md +0 -39
  178. package/template/skills/github-npm-ops/references/publish-detection.md +0 -68
  179. package/template/skills/github-npm-ops/references/release-notes-injection.md +0 -238
  180. package/template/skills/github-npm-ops/references/release-pipeline.md +0 -108
  181. package/template/skills/github-npm-ops/references/setup-npm-token.md +0 -63
  182. package/template/skills/github-npm-ops/references/troubleshooting-playbook.md +0 -293
  183. package/template/skills/github-npm-ops/references/version-bump-flow.md +0 -217
  184. package/template/skills/github-npm-ops/references/workflow-yaml-reference.md +0 -268
  185. package/template/skills/github-npm-ops/scripts/issue-transport.mjs +0 -227
  186. package/template/skills/optimize-codex-config/references/entry-procedure.md +0 -78
  187. package/template/skills/speculo-retro/SKILL.md +0 -19
  188. package/template/skills/upstream-fork-sync/references/entry-procedure.md +0 -78
  189. package/template/skills/writing-great-skills/SKILL.md +0 -23
  190. /package/template/skills/{writing-great-skills → writing-for-agents}/references/document-contract.md +0 -0
  191. /package/template/workflows/specdev/{G-grill-with-docs → common/rules}/adr-format.md +0 -0
  192. /package/template/workflows/specdev/{G-grill-with-docs → common/rules}/context-format.md +0 -0
  193. /package/template/workflows/specdev/{I-implement → common/rules}/design-it-twice.md +0 -0
  194. /package/template/workflows/specdev/{G-grill-with-docs/domain-modeling-rules.md → common/rules/domain-modeling.md} +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 硬性路径
4
4
 
5
- Host 登记后 root 固定;Project 使用 kebab ID;Deployment 默认 root/project,同级 APP 与公共服务。多实例显式用 root/project/instances/env/instance。不能通过 symlink、junction、UNC、ADS、相对路径越界或双重登记绕过。
5
+ 首次接入按 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path> 探测实际登录主目录,建议其 ops 子目录并由用户选定。Host 登记后 root 固定,更换账号不改根;Project 使用 kebab ID;Deployment 默认 root/project,同级 APP 与公共服务。多实例显式用 root/project/instances/env/instance。不能通过 symlink、junction、UNC、ADS、相对路径越界或双重登记绕过。
6
6
 
7
7
  业务持久化目录为 data/component/purpose;日志 logs/component;环境 env/;生成配置 config/。Dockerfile 与 Compose 同在 compose/。原生服务配置在 service/,其文件不自动改变业务数据归属。系统服务文件是单独审批的控制文件例外,不是数据存储例外。
8
8
 
@@ -9,6 +9,14 @@
9
9
  | [SSH configuration Skill](https://github.com/BagelHole/DevOps-Security-Agent-Skills/blob/0365f57a079b1332f95cf26e31dd2d5332a8399f/infrastructure/servers/ssh-configuration/SKILL.md) | key/agent、指纹、客户端配置、公钥分发、轮换先验证新 key | 密钥/agent 优先、公钥认证单独验收、保留旧通道、接入失败明确阻塞 | 不默认无口令私钥,不自动清 agent,不照搬 sshd 算法清单/关闭密码登录,不隐式添加 ProxyJump 能力 |
10
10
  | [Speculo 基线执行器](https://github.com/NAMEWTA/Speculo/tree/60389759ede9f8c4f14b2f7e70da614dfe574ece/template/workflows/ops/common/tools/opslib) | planner、execution、transport、agent、CLI 与 schema | 复用摘要批准、受限写集、身份验证、失败停止、双边回执 | 不重写已有安全底座,不移动历史 Run,不用可视化替代真实验收 |
11
11
 
12
+ ## 2.3 首次根确认与 Host/Project 分工
13
+
14
+ - [Ansible 主机变量与连接参数](https://docs.ansible.com/projects/ansible/latest/inventory_guide/intro_inventory.html):采用机器身份、登录账号和提权参数分别表达的方法,账号主目录在提权前探测。
15
+ - [Kamal 服务器声明](https://kamal-deploy.org/docs/configuration/servers/):采用项目显式声明目标服务器的方法,保留 Deployment 环境/实例关联;默认 root 登录和自动 Docker 安装不进入本 workflow 的默认初始化。
16
+ - [pyinfra](https://github.com/pyinfra-dev/pyinfra):采用先获取事实、再计算必要操作的方法;最小初始化只生成缺失目录动作,保留原摘要批准和恢复。
17
+
18
+ 资料于 2026-10-08 在线读取,只采用方法并自行实现,没有复制外部代码或增加运行依赖。已有 SSH Skill 的固定提交、许可与采用边界保留。新增行为是首次根目录的真实用户选择门;建议不等于确认。换账号保留原根,旧 v3 不自动迁移或补写历史确认。
19
+
12
20
  ## 设计取舍
13
21
 
14
22
  一次授权的对象是有限任务与精确规格,不是“此后所有运维”。本次任务 runner 增加编译前/后的目标与修改集检查,保留原逐 Run 审批文件,但不要求每步由用户再次对话确认。它不是签名授权系统,也不是防御拥有控制端写权限的恶意管理员的沙箱。
@@ -4,13 +4,13 @@
4
4
 
5
5
  ## 接入顺序
6
6
 
7
- 确认用户已经提供的 server_id、地址/端口、远端账号、专用 host.root、可信主机指纹、控制端 SSH 客户端与认证来源;不重复索取已有输入,不把别名相似当作同一服务器。首次指纹必须经云控制台/控制台/既有可信渠道核对,ssh-keyscan 只能收集候选值,不能完成信任。
7
+ 先读 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>。确认用户已经提供的 server_id、地址/端口、远端账号、可信主机指纹、控制端 SSH 客户端与认证来源;不重复索取已有输入,不把别名相似当作同一服务器。首次指纹必须经云控制台/控制台/既有可信渠道核对,ssh-keyscan 只能收集候选值,不能完成信任。
8
8
 
9
9
  优先复用受限私钥与 ssh-agent。免密登录指无需重复输入服务器账号密码,不等于私钥必须无口令;不得默认 ssh-keygen -N "",不得复制私钥到服务器、项目或看板,也不把密码放在 JSON/argv/日志。只登记 identity_file 的本地受限路径;使用 agent 时不能自动清空用户已有 agent。
10
10
 
11
11
  已有可信登录通道时,仅在原明确授权范围内分发指定公钥,保持旧登录通道,核验新会话成功后才讨论轮换撤销。公钥分发/sshd 修改不是 task-run 的隐式能力;当前执行器不提供首次密码登录或 authorized_keys 写入适配。缺少已验证 key/agent 时,给出待用户在可信交互终端/云控制台完成的最小公钥分发步骤与精确目标,记录“接入阻塞”,不要宣称自动完成,也不要绕过 ops 的写入网关用 sshpass 或任意 shell 写服务器。禁止为方便部署自动关闭密码登录、改 SSH 端口或重启 sshd;这些需要专用可恢复方案。
12
12
 
13
- 信任和公钥认证具备后,用 USAGE 中的 discovery/probe 读取身份;Linux SSH 缺 Node 时走原 bootstrap-node 的固定 Volta/Node、已审核 tar SHA256 与独立 ack。复用已有 Node,不改 shell profile。随后 enroll(或 register + probe --host)把真实身份与盘点持久化;identity=discover 不可用于 apply。
13
+ 信任和公钥认证具备后,先用 server-discover 不提权读取实际账号主目录与身份,由用户指定或接受主目录下 ops,使用 server-root-confirm 保存真实确认;新 root 未确认不安装、不登记。随后用 USAGE 中的 probe 读取运行环境;Linux SSH 缺 Node 时走原 bootstrap-node 的固定 Volta/Node、已审核 tar SHA256 与独立 ack。复用已有 Node,不改 shell profile。随后 enroll(或 register + probe --host)把真实身份与盘点持久化;identity=discover 不可用于 apply。
14
14
 
15
15
  最后运行 `server-check --server ID --profile base`。只有成功验证严格主机密钥、公钥认证和实际机器身份后,才写“接入检查通过”;未通过项与证据文件必须列出。需要 Docker 的项目再走 H 的 compose profile,不能把 base-ready 等同完整部署基线。
16
16
 
@@ -22,6 +22,6 @@
22
22
 
23
23
  ## 固定 Node 引导的完成门
24
24
 
25
- Linux SSH 缺 Node 时由 S 使用 `ops.mjs bootstrap-node`:控制端校验已审核 tar 的 SHA256,scp 到目标,远端 POSIX 展开固定 Volta/Node;必须使用独立 ack/SHA256 网关,不走 H/D plan/approve。引导后必须 enroll(或 register 后 probe --host),取得真实 inventory/snapshot 与 status.hosts 记录,不能只把盘点留在对话中。
25
+ Linux SSH 缺 Node 时由 S 使用 `ops.mjs bootstrap-node`:先核对 root_confirmation、真实机器与根权限,控制端校验已审核 tar 的 SHA256,使用登录账号 scp 到已确认根,远端 POSIX 展开固定 Volta/Node;必须使用独立 ack/SHA256 网关,不走 H/D plan/approve。引导后必须 enroll(或 register 后 probe --host),取得真实 inventory/snapshot 与 status.hosts 记录,不能只把盘点留在对话中。
26
26
 
27
27
  已有 Node 不重复安装、不改 shell profile。缺 Node 可以阻塞 apply,但不阻塞安全的登记;Windows/macOS 仍要求目标已有 Node。该能力不绕过初次主机信任、可用 SSH 登录或用户批准的固定构件。
@@ -7,7 +7,7 @@
7
7
  | 用户目的 | scope / Work | 必需输入 | 明确不做 |
8
8
  | --- | --- | --- | --- |
9
9
  | 准备发起操作的本机 | controller / I | 控制端 ID、绝对 state 根 | 不默认把本机登记为服务器 |
10
- | 接入一台服务器 | access / S | 一个 server_id、可信连接与身份 | 不部署项目、不自动信任主机密钥 |
10
+ | 接入一台服务器 | access / S | 一个 server_id、可信连接与身份、首次根选择 | 不部署项目、不自动信任主机密钥 |
11
11
  | 配置系统环境、Docker、Nginx | server / H | 一个已登记 server_id | 不从 cwd 推断 project |
12
12
  | 安装 APP 或共享服务 | project / D | 一个 project_id、明确 server_ids、真实需求 | 不猜服务器、不把主机级入口伪装成 APP |
13
13
  | 看服务器/项目清单 | inventory / V | 已初始化 state 根 | 不联网、不部署、不授予后续操作权限 |
@@ -36,4 +36,4 @@ H 入口选择一台明确服务器;一个 server 任务可以串行多个 H
36
36
 
37
37
  正常完成必须以原 apply 返回 completed 且双边回执成立为准,再生成 V 的本地视图。V 失败记为“执行结果已保存、视图生成失败”,不能重跑业务。文档或索引不会自动变成永久知识;知识写入仍走原 owner/gateway 并获得独立同意。
38
38
 
39
- 当前任务编排只接入 H/D;I 初始化和 S 的首次信任建立/固定 Node bootstrap 保留原网关,不用任务授权掩盖缺失的 SSH 登录条件。
39
+ 首次根选择按 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path> 执行。server-root-confirm 只记录真实用户路径决定,不代替安装授权;已有明确指定不重复询问。当前任务编排只接入 H/D;I 初始化和 S 的首次信任建立/固定 Node bootstrap 保留原网关,不用任务授权掩盖缺失的 SSH 登录条件。
@@ -170,6 +170,70 @@
170
170
  ],
171
171
  "additionalProperties": false
172
172
  }
173
+ },
174
+ "login_account": {
175
+ "type": "string"
176
+ },
177
+ "root_confirmation": {
178
+ "type": "object",
179
+ "properties": {
180
+ "status": {
181
+ "enum": [
182
+ "confirmed",
183
+ "unverified",
184
+ "legacy-registered"
185
+ ]
186
+ },
187
+ "login_home": {
188
+ "type": [
189
+ "string",
190
+ "null"
191
+ ]
192
+ },
193
+ "confirmed_at": {
194
+ "type": [
195
+ "string",
196
+ "null"
197
+ ]
198
+ }
199
+ },
200
+ "required": [
201
+ "status",
202
+ "login_home",
203
+ "confirmed_at"
204
+ ],
205
+ "additionalProperties": false
206
+ },
207
+ "initialization": {
208
+ "type": "object",
209
+ "properties": {
210
+ "registered": {
211
+ "const": true
212
+ },
213
+ "directory": {
214
+ "type": "string"
215
+ },
216
+ "documents": {
217
+ "enum": [
218
+ "unknown",
219
+ "both-sides-verified"
220
+ ]
221
+ },
222
+ "runtime": {
223
+ "enum": [
224
+ "unverified",
225
+ "native",
226
+ "compose"
227
+ ]
228
+ }
229
+ },
230
+ "required": [
231
+ "registered",
232
+ "directory",
233
+ "documents",
234
+ "runtime"
235
+ ],
236
+ "additionalProperties": false
173
237
  }
174
238
  },
175
239
  "required": [
@@ -76,6 +76,25 @@
76
76
  },
77
77
  "host_services": {
78
78
  "$ref": "#/$defs/host_services"
79
+ },
80
+ "root_confirmation": {
81
+ "type": "object",
82
+ "properties": {
83
+ "receipt_id": {
84
+ "type": "string",
85
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
86
+ "maxLength": 80
87
+ },
88
+ "digest": {
89
+ "type": "string",
90
+ "pattern": "^[a-f0-9]{64}$"
91
+ }
92
+ },
93
+ "required": [
94
+ "receipt_id",
95
+ "digest"
96
+ ],
97
+ "additionalProperties": false
79
98
  }
80
99
  },
81
100
  "required": [
@@ -242,6 +242,25 @@
242
242
  ],
243
243
  "additionalProperties": false
244
244
  }
245
+ },
246
+ "root_confirmation": {
247
+ "type": "object",
248
+ "properties": {
249
+ "receipt_id": {
250
+ "type": "string",
251
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
252
+ "maxLength": 80
253
+ },
254
+ "digest": {
255
+ "type": "string",
256
+ "pattern": "^[a-f0-9]{64}$"
257
+ }
258
+ },
259
+ "required": [
260
+ "receipt_id",
261
+ "digest"
262
+ ],
263
+ "additionalProperties": false
245
264
  }
246
265
  },
247
266
  "required": [
@@ -717,6 +736,25 @@
717
736
  ],
718
737
  "additionalProperties": false
719
738
  }
739
+ },
740
+ "root_confirmation": {
741
+ "type": "object",
742
+ "properties": {
743
+ "receipt_id": {
744
+ "type": "string",
745
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
746
+ "maxLength": 80
747
+ },
748
+ "digest": {
749
+ "type": "string",
750
+ "pattern": "^[a-f0-9]{64}$"
751
+ }
752
+ },
753
+ "required": [
754
+ "receipt_id",
755
+ "digest"
756
+ ],
757
+ "additionalProperties": false
720
758
  }
721
759
  },
722
760
  "required": [
@@ -1408,6 +1446,25 @@
1408
1446
  ],
1409
1447
  "additionalProperties": false
1410
1448
  }
1449
+ },
1450
+ "root_confirmation": {
1451
+ "type": "object",
1452
+ "properties": {
1453
+ "receipt_id": {
1454
+ "type": "string",
1455
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
1456
+ "maxLength": 80
1457
+ },
1458
+ "digest": {
1459
+ "type": "string",
1460
+ "pattern": "^[a-f0-9]{64}$"
1461
+ }
1462
+ },
1463
+ "required": [
1464
+ "receipt_id",
1465
+ "digest"
1466
+ ],
1467
+ "additionalProperties": false
1411
1468
  }
1412
1469
  },
1413
1470
  "required": [
@@ -0,0 +1,118 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:speculo:ops:root-confirmation:v1",
4
+ "type": "object",
5
+ "properties": {
6
+ "schema_version": {
7
+ "const": 1
8
+ },
9
+ "artifact": {
10
+ "const": "ops-root-confirmation"
11
+ },
12
+ "receipt_id": {
13
+ "type": "string",
14
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
15
+ "maxLength": 80
16
+ },
17
+ "host_id": {
18
+ "type": "string",
19
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
20
+ "maxLength": 80
21
+ },
22
+ "platform": {
23
+ "enum": [
24
+ "linux",
25
+ "windows",
26
+ "darwin"
27
+ ]
28
+ },
29
+ "transport": {
30
+ "enum": [
31
+ "local",
32
+ "ssh"
33
+ ]
34
+ },
35
+ "identity": {
36
+ "type": "string",
37
+ "pattern": "^[a-f0-9]{64}$"
38
+ },
39
+ "root": {
40
+ "type": "string",
41
+ "minLength": 1
42
+ },
43
+ "account": {
44
+ "type": "object",
45
+ "properties": {
46
+ "username": {
47
+ "type": "string",
48
+ "minLength": 1
49
+ },
50
+ "uid": {
51
+ "type": "string"
52
+ },
53
+ "home": {
54
+ "type": "string",
55
+ "minLength": 1
56
+ }
57
+ },
58
+ "required": [
59
+ "username",
60
+ "uid",
61
+ "home"
62
+ ],
63
+ "additionalProperties": false
64
+ },
65
+ "endpoint_digest": {
66
+ "type": "string",
67
+ "pattern": "^[a-f0-9]{64}$"
68
+ },
69
+ "discovery": {
70
+ "type": "object",
71
+ "properties": {
72
+ "receipt_id": {
73
+ "type": "string",
74
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
75
+ "maxLength": 80
76
+ },
77
+ "digest": {
78
+ "type": "string",
79
+ "pattern": "^[a-f0-9]{64}$"
80
+ }
81
+ },
82
+ "required": [
83
+ "receipt_id",
84
+ "digest"
85
+ ],
86
+ "additionalProperties": false
87
+ },
88
+ "confirmed_at": {
89
+ "type": "string",
90
+ "minLength": 1
91
+ },
92
+ "by": {
93
+ "type": "string",
94
+ "minLength": 1
95
+ },
96
+ "statement": {
97
+ "type": "string",
98
+ "minLength": 1
99
+ }
100
+ },
101
+ "required": [
102
+ "schema_version",
103
+ "artifact",
104
+ "receipt_id",
105
+ "host_id",
106
+ "platform",
107
+ "transport",
108
+ "identity",
109
+ "root",
110
+ "account",
111
+ "endpoint_digest",
112
+ "discovery",
113
+ "confirmed_at",
114
+ "by",
115
+ "statement"
116
+ ],
117
+ "additionalProperties": false
118
+ }
@@ -0,0 +1,67 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:speculo:ops:server-connection:v1",
4
+ "type": "object",
5
+ "properties": {
6
+ "platform": {
7
+ "enum": [
8
+ "linux",
9
+ "windows",
10
+ "darwin"
11
+ ]
12
+ },
13
+ "transport": {
14
+ "enum": [
15
+ "local",
16
+ "ssh"
17
+ ]
18
+ },
19
+ "connection": {
20
+ "type": "object",
21
+ "properties": {
22
+ "hostname": {
23
+ "type": "string",
24
+ "minLength": 1
25
+ },
26
+ "username": {
27
+ "type": "string",
28
+ "minLength": 1
29
+ },
30
+ "port": {
31
+ "type": "integer",
32
+ "minimum": 1,
33
+ "maximum": 65535
34
+ },
35
+ "known_hosts": {
36
+ "type": "string",
37
+ "minLength": 1
38
+ },
39
+ "identity_file": {
40
+ "type": "string",
41
+ "minLength": 1
42
+ },
43
+ "node": {
44
+ "type": "string",
45
+ "minLength": 1
46
+ },
47
+ "sudo": {
48
+ "type": "boolean"
49
+ },
50
+ "shell": {
51
+ "enum": [
52
+ "posix",
53
+ "powershell"
54
+ ]
55
+ }
56
+ },
57
+ "required": [],
58
+ "additionalProperties": false
59
+ }
60
+ },
61
+ "required": [
62
+ "platform",
63
+ "transport",
64
+ "connection"
65
+ ],
66
+ "additionalProperties": false
67
+ }
@@ -0,0 +1,171 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:speculo:ops:server-discovery:v1",
4
+ "type": "object",
5
+ "properties": {
6
+ "schema_version": {
7
+ "const": 1
8
+ },
9
+ "artifact": {
10
+ "const": "ops-server-discovery"
11
+ },
12
+ "discovery_id": {
13
+ "type": "string",
14
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
15
+ "maxLength": 80
16
+ },
17
+ "host_id": {
18
+ "type": "string",
19
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
20
+ "maxLength": 80
21
+ },
22
+ "discovered_at": {
23
+ "type": "string",
24
+ "minLength": 1
25
+ },
26
+ "endpoint": {
27
+ "type": "object",
28
+ "properties": {
29
+ "host_id": {
30
+ "type": "string",
31
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
32
+ "maxLength": 80
33
+ },
34
+ "platform": {
35
+ "enum": [
36
+ "linux",
37
+ "windows",
38
+ "darwin"
39
+ ]
40
+ },
41
+ "transport": {
42
+ "enum": [
43
+ "local",
44
+ "ssh"
45
+ ]
46
+ },
47
+ "connection": {
48
+ "type": "object",
49
+ "properties": {
50
+ "hostname": {
51
+ "type": "string",
52
+ "minLength": 1
53
+ },
54
+ "username": {
55
+ "type": "string",
56
+ "minLength": 1
57
+ },
58
+ "port": {
59
+ "type": "integer",
60
+ "minimum": 1,
61
+ "maximum": 65535
62
+ },
63
+ "known_hosts": {
64
+ "type": "string",
65
+ "minLength": 1
66
+ },
67
+ "identity_file": {
68
+ "type": "string",
69
+ "minLength": 1
70
+ },
71
+ "node": {
72
+ "type": "string",
73
+ "minLength": 1
74
+ },
75
+ "sudo": {
76
+ "type": "boolean"
77
+ },
78
+ "shell": {
79
+ "enum": [
80
+ "posix",
81
+ "powershell"
82
+ ]
83
+ }
84
+ },
85
+ "required": [],
86
+ "additionalProperties": false
87
+ }
88
+ },
89
+ "required": [
90
+ "host_id",
91
+ "platform",
92
+ "transport",
93
+ "connection"
94
+ ],
95
+ "additionalProperties": false
96
+ },
97
+ "endpoint_digest": {
98
+ "type": "string",
99
+ "pattern": "^[a-f0-9]{64}$"
100
+ },
101
+ "facts": {
102
+ "type": "object",
103
+ "properties": {
104
+ "identity": {
105
+ "type": "string",
106
+ "pattern": "^[a-f0-9]{64}$"
107
+ },
108
+ "platform": {
109
+ "enum": [
110
+ "linux",
111
+ "windows",
112
+ "darwin"
113
+ ]
114
+ },
115
+ "username": {
116
+ "type": "string",
117
+ "minLength": 1
118
+ },
119
+ "uid": {
120
+ "type": "string"
121
+ },
122
+ "home": {
123
+ "type": "string",
124
+ "minLength": 1
125
+ },
126
+ "node": {
127
+ "type": [
128
+ "string",
129
+ "null"
130
+ ]
131
+ },
132
+ "node_version": {
133
+ "type": [
134
+ "string",
135
+ "null"
136
+ ]
137
+ }
138
+ },
139
+ "required": [
140
+ "identity",
141
+ "platform",
142
+ "username",
143
+ "uid",
144
+ "home",
145
+ "node",
146
+ "node_version"
147
+ ],
148
+ "additionalProperties": false
149
+ },
150
+ "suggested_root": {
151
+ "type": "string",
152
+ "minLength": 1
153
+ },
154
+ "registered": {
155
+ "type": "boolean"
156
+ }
157
+ },
158
+ "required": [
159
+ "schema_version",
160
+ "artifact",
161
+ "discovery_id",
162
+ "host_id",
163
+ "discovered_at",
164
+ "endpoint",
165
+ "endpoint_digest",
166
+ "facts",
167
+ "suggested_root",
168
+ "registered"
169
+ ],
170
+ "additionalProperties": false
171
+ }
@@ -160,6 +160,25 @@
160
160
  ],
161
161
  "additionalProperties": false
162
162
  }
163
+ },
164
+ "root_confirmation": {
165
+ "type": "object",
166
+ "properties": {
167
+ "receipt_id": {
168
+ "type": "string",
169
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
170
+ "maxLength": 80
171
+ },
172
+ "digest": {
173
+ "type": "string",
174
+ "pattern": "^[a-f0-9]{64}$"
175
+ }
176
+ },
177
+ "required": [
178
+ "receipt_id",
179
+ "digest"
180
+ ],
181
+ "additionalProperties": false
163
182
  }
164
183
  },
165
184
  "required": [
@@ -362,6 +362,25 @@
362
362
  ],
363
363
  "additionalProperties": false
364
364
  }
365
+ },
366
+ "root_confirmation": {
367
+ "type": "object",
368
+ "properties": {
369
+ "receipt_id": {
370
+ "type": "string",
371
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
372
+ "maxLength": 80
373
+ },
374
+ "digest": {
375
+ "type": "string",
376
+ "pattern": "^[a-f0-9]{64}$"
377
+ }
378
+ },
379
+ "required": [
380
+ "receipt_id",
381
+ "digest"
382
+ ],
383
+ "additionalProperties": false
365
384
  }
366
385
  },
367
386
  "required": [
@@ -47,7 +47,7 @@ function render(){const server=$("server").value,project=$("project").value,st=$
47
47
  const ds=data.deployments.filter(d=>(!server||d.server_id===server)&&(!project||d.project_id===project)&&(!st||d.status===st)&&match(d));
48
48
  const ss=data.servers.filter(s=>(!server||s.server_id===server)&&(!project||s.deployment_ids.some(id=>byDeployment.get(id)?.project_id===project))&&(!st||ds.some(d=>d.server_id===s.server_id))&&(match(s)||ds.some(d=>d.server_id===s.server_id)));
49
49
  const ps=data.projects.filter(p=>(!project||p.project_id===project)&&(!server||p.deployment_ids.some(id=>byDeployment.get(id)?.server_id===server))&&(!st||ds.some(d=>d.project_id===p.project_id))&&(match(p)||ds.some(d=>d.project_id===p.project_id)));
50
- table("servers",["服务器 / 名称","地址 / 系统","检查结果","检查详情(* 必需项)","项目","部署根"],ss.map(s=>[links("server",[s.server_id]),`${s.name} · ${s.address}${s.port?":"+s.port:""} / ${s.platform}`,badge(s.readiness),checks(s),links("project",s.project_ids),s.root]));
50
+ table("servers",["服务器 / 名称","地址 / 系统","检查结果","检查详情(* 必需项)","项目","账号 / 持久化根 / 确认 / 文档"],ss.map(s=>[links("server",[s.server_id]),`${s.name} · ${s.address}${s.port?":"+s.port:""} / ${s.platform}`,badge(s.readiness),checks(s),links("project",s.project_ids),`${s.login_account} / ${s.root} / ${s.root_confirmation.status} / ${s.initialization.documents}`]));
51
51
  table("projects",["项目","名称","类别 / 服务类型","所在服务器","部署数量"],ps.map(p=>[link("project",p.project_id),p.name,`${p.kind} / ${p.service_type||"—"}`,links("server",p.server_ids),p.deployment_ids.length]));
52
52
  table("deployments",["部署实例","项目 / 服务器","环境 / 方法","记录状态","计划版本","验证版本","根目录 / 更新时间"],ds.map(d=>{const where=node("div");where.append(link("project",d.project_id),node("div"),link("server",d.server_id));return[d.deployment_id,where,`${d.environment} / ${d.instance} / ${d.method}`,badge(d.status),d.desired_version,d.observed_version,`${d.root} / ${d.updated_at||"未验证"}`];}));
53
53
  table("services",["服务器","主机级服务","类型","systemd 单元","监听端口"],ss.flatMap(s=>s.host_services.map(v=>[link("server",s.server_id),v.service_id,v.kind,v.unit,v.port])));