@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.
- package/README.md +8 -7
- package/THIRD-PARTY-NOTICES.md +33 -0
- package/dist/src/agent-files.js +2 -2
- package/dist/src/agent-files.js.map +1 -1
- package/dist/src/agent-skills.d.ts +81 -0
- package/dist/src/agent-skills.js +530 -0
- package/dist/src/agent-skills.js.map +1 -0
- package/dist/src/cli.js +11 -3
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.js +5 -3
- package/dist/src/config.js.map +1 -1
- package/dist/src/doctor.js +7 -2
- package/dist/src/doctor.js.map +1 -1
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.js +23 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/manifest.d.ts +9 -0
- package/dist/src/manifest.js +45 -7
- package/dist/src/manifest.js.map +1 -1
- package/dist/src/refresh.js +40 -0
- package/dist/src/refresh.js.map +1 -1
- package/dist/src/structured.js +15 -4
- package/dist/src/structured.js.map +1 -1
- package/dist/src/transaction.d.ts +24 -3
- package/dist/src/transaction.js +191 -12
- package/dist/src/transaction.js.map +1 -1
- package/package.json +7 -4
- package/scripts/validate-skills.mjs +56 -0
- package/template/AGENTS.md +1 -1
- package/template/CLAUDE.md +1 -1
- package/template/canonical/canonical-specdev-goal-plan.md +156 -28
- package/template/canonical/canonical-specdev-grill-with-docs.md +153 -31
- package/template/canonical/canonical-specdev-spec.md +153 -27
- package/template/canonical/canonical-specdev-tickets.md +153 -27
- package/template/canonical/canonical-specdev-wayfinder.md +142 -27
- package/template/commands/retro.md +11 -9
- package/template/skills/archive-and-consolidate/SKILL.md +163 -7
- package/template/skills/archive-and-consolidate/references/cleanup-rules.md +1 -1
- package/template/skills/docs-sync/references/agents/claude-redirect.md +8 -8
- package/template/skills/docs-sync/references/agents/content-contract.md +1 -1
- package/template/skills/docs-sync/references/agents/manifest-discovery.md +7 -7
- package/template/skills/docs-sync/references/agents/role-classification.md +4 -4
- package/template/skills/docs-sync/references/agents-contract.md +1 -1
- package/template/skills/engineering-standards-builder/SKILL.md +149 -9
- package/template/skills/engineering-standards-builder/agents/openai.yaml +2 -0
- package/template/skills/engineering-standards-builder/manifest.txt +2 -1
- package/template/skills/engineering-standards-builder/references/rules/09-mechanical-guardrails.md +9 -0
- package/template/skills/engineering-standards-builder/scripts/validate-builder.mjs +4 -7
- package/template/skills/git-history-squash/SKILL.md +87 -11
- package/template/skills/git-history-squash/agents/openai.yaml +2 -0
- package/template/skills/optimize-codex-config/SKILL.md +71 -11
- package/template/skills/{speculo-retro/references/entry-procedure.md → retrospective/SKILL.md} +12 -8
- package/template/skills/{speculo-retro → retrospective}/references/friction-taxonomy.md +22 -13
- package/template/skills/{speculo-retro → retrospective}/references/issue-drafting-sop.md +10 -20
- package/template/skills/source-code-zip/SKILL.md +44 -8
- package/template/skills/source-code-zip/references/{entry-procedure.md → cli-reference.md} +0 -43
- package/template/skills/upstream-fork-sync/SKILL.md +71 -8
- package/template/skills/{writing-great-skills → writing-for-agents}/GLOSSARY.md +1 -1
- package/template/skills/writing-for-agents/SKILL.md +22 -0
- package/template/skills/writing-for-agents/agents/openai.yaml +2 -0
- package/template/skills/{writing-great-skills/references/entry-procedure.md → writing-for-agents/references/authoring-principles.md} +2 -9
- package/template/workflows/ops/D-project-deploy/D-project-deploy.md +1 -1
- package/template/workflows/ops/H-host-manage/H-host-manage.md +4 -0
- package/template/workflows/ops/H-host-manage/references/host-profiles.md +4 -0
- package/template/workflows/ops/I-initialize/I-initialize.md +1 -1
- package/template/workflows/ops/INDEX.md +2 -0
- package/template/workflows/ops/README.md +7 -3
- package/template/workflows/ops/S-server-connect/S-server-connect.md +5 -5
- package/template/workflows/ops/V-inventory-view/V-inventory-view.md +2 -0
- package/template/workflows/ops/common/CAPABILITIES.md +2 -0
- package/template/workflows/ops/common/USAGE.md +5 -5
- package/template/workflows/ops/common/WORKSPACE-USAGE.md +29 -2
- package/template/workflows/ops/common/examples/README.md +1 -1
- package/template/workflows/ops/common/examples/register.example.json +7 -3
- package/template/workflows/ops/common/examples/server-connection.example.json +11 -0
- package/template/workflows/ops/common/rules/deployment-layout.md +1 -1
- package/template/workflows/ops/common/rules/host-root-and-onboarding.md +47 -0
- package/template/workflows/ops/common/rules/persistence-and-secrets.md +1 -1
- package/template/workflows/ops/common/rules/research-and-decisions.md +8 -0
- package/template/workflows/ops/common/rules/server-onboarding.md +3 -3
- package/template/workflows/ops/common/rules/workspace-and-authorization.md +2 -2
- package/template/workflows/ops/common/schemas/fleet-view.schema.json +64 -0
- package/template/workflows/ops/common/schemas/host.schema.json +19 -0
- package/template/workflows/ops/common/schemas/plan.schema.json +57 -0
- package/template/workflows/ops/common/schemas/root-confirmation.schema.json +118 -0
- package/template/workflows/ops/common/schemas/server-connection.schema.json +67 -0
- package/template/workflows/ops/common/schemas/server-discovery.schema.json +171 -0
- package/template/workflows/ops/common/schemas/spec.schema.json +19 -0
- package/template/workflows/ops/common/schemas/status.schema.json +19 -0
- package/template/workflows/ops/common/templates/FLEET.html +1 -1
- package/template/workflows/ops/common/templates/HOST-README.md +3 -1
- package/template/workflows/ops/common/tests/test_ops.mjs +8 -11
- package/template/workflows/ops/common/tests/test_ops_bootstrap.mjs +101 -16
- package/template/workflows/ops/common/tests/test_ops_onboarding.mjs +225 -0
- package/template/workflows/ops/common/tests/test_ops_workspace.mjs +17 -8
- package/template/workflows/ops/common/tools/demo-local.mjs +4 -0
- package/template/workflows/ops/common/tools/opslib/agent.mjs +26 -0
- package/template/workflows/ops/common/tools/opslib/bootstrap.mjs +52 -26
- package/template/workflows/ops/common/tools/opslib/cli.mjs +1 -0
- package/template/workflows/ops/common/tools/opslib/core.mjs +1 -1
- package/template/workflows/ops/common/tools/opslib/docs.mjs +1 -0
- package/template/workflows/ops/common/tools/opslib/execution.mjs +4 -0
- package/template/workflows/ops/common/tools/opslib/fleet.mjs +26 -4
- package/template/workflows/ops/common/tools/opslib/host_recipes.mjs +34 -0
- package/template/workflows/ops/common/tools/opslib/model.mjs +6 -0
- package/template/workflows/ops/common/tools/opslib/onboarding.mjs +215 -0
- package/template/workflows/ops/common/tools/opslib/planner.mjs +3 -0
- package/template/workflows/ops/common/tools/opslib/transport.mjs +10 -6
- package/template/workflows/ops/common/tools/opslib/workspace_cli.mjs +20 -1
- package/template/workflows/ops/common/tools/server-discover.sh +65 -0
- package/template/workflows/ops/common/tools/validate-ops.mjs +1 -1
- package/template/workflows/ops/manifest.json +12 -5
- package/template/workflows/specdev/A-archive-and-consolidate/consolidation-interview.md +3 -3
- package/template/workflows/specdev/C-code-review/C-code-review.md +1 -1
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +6 -0
- package/template/workflows/specdev/G-grill-with-docs/references/interview-procedure.md +6 -6
- package/template/workflows/specdev/I-implement/references/implementation-procedure.md +1 -1
- package/template/workflows/specdev/I-implement/tdd-rules.md +4 -0
- package/template/workflows/specdev/I-init-setup/config-template.json +5 -1
- package/template/workflows/specdev/INDEX.md +2 -2
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +1 -1
- package/template/workflows/specdev/P-prototype/P-prototype.md +7 -3
- package/template/workflows/specdev/P-prototype/logic-protocol.md +11 -0
- package/template/workflows/specdev/P-prototype/logic-template.md +27 -0
- package/template/workflows/specdev/P-prototype/project-preview-protocol.md +9 -0
- package/template/workflows/specdev/R-retro/R-retro.md +26 -0
- package/template/workflows/specdev/R-retro/retro-template.md +27 -0
- package/template/workflows/specdev/R-review-architecture/references/selected-design.md +1 -1
- package/template/workflows/specdev/README.md +13 -2
- package/template/workflows/specdev/S-spec/S-spec.md +4 -0
- package/template/workflows/specdev/T-tickets/T-tickets.md +4 -0
- package/template/workflows/specdev/T-triage/T-triage.md +31 -25
- package/template/workflows/specdev/T-triage/capture-protocol.md +1 -1
- package/template/workflows/specdev/T-triage/ci-security-protocol.md +11 -0
- package/template/workflows/specdev/T-triage/intake-protocol.md +10 -4
- package/template/workflows/specdev/T-triage/pr-delivery-protocol.md +13 -0
- package/template/workflows/specdev/T-triage/pr-record-template.md +39 -0
- package/template/workflows/specdev/T-triage/publish-protocol.md +1 -1
- package/template/workflows/specdev/T-triage/queue-protocol.md +7 -0
- package/template/workflows/specdev/T-triage/reconcile-protocol.md +1 -1
- package/template/workflows/specdev/T-triage/references/issue-pr-policy.md +23 -0
- package/template/workflows/specdev/T-triage/references/release-authentication.md +9 -0
- package/template/workflows/specdev/T-triage/references/release-notes-injection.md +21 -0
- package/template/workflows/specdev/T-triage/references/workflow-yaml-reference.md +37 -0
- package/template/workflows/specdev/T-triage/release-preflight.md +13 -0
- package/template/workflows/specdev/T-triage/release-protocol.md +12 -0
- package/template/workflows/specdev/T-triage/release-recovery.md +18 -0
- package/template/workflows/specdev/T-triage/remote-operations.md +25 -0
- package/template/workflows/specdev/T-triage/scripts/github-transport.mjs +208 -0
- package/template/workflows/specdev/T-triage/source-template.md +7 -0
- package/template/workflows/specdev/T-triage/triage-run-template.md +34 -0
- package/template/workflows/specdev/T-triage/triage-template.md +4 -1
- package/template/workflows/specdev/common/rules/artifact-contract.md +7 -0
- package/template/workflows/specdev/common/rules/change-completion.md +6 -0
- package/template/workflows/specdev/common/rules/workflow-routing.md +6 -0
- package/template/workflows/specdev/common/rules/workflow-state-and-lifecycle.md +1 -1
- package/template/workflows/specdev/common/schemas/config.schema.json +137 -26
- package/template/workflows/specdev/common/schemas/logic-prototype.schema.json +62 -0
- package/template/workflows/specdev/common/schemas/pull-request.schema.json +90 -0
- package/template/workflows/specdev/common/schemas/retrospective.schema.json +58 -0
- package/template/workflows/specdev/common/schemas/triage-run.schema.json +149 -0
- package/template/workflows/specdev/common/schemas/triage.schema.json +117 -15
- package/template/workflows/specdev/common/tools/delivery-artifacts.mjs +95 -0
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +60 -19
- package/template/workflows/specdev/runtime-contract.json +4 -2
- package/template/skills/archive-and-consolidate/references/entry-procedure.md +0 -178
- package/template/skills/docs-sync/references/entry-procedure.md +0 -3
- package/template/skills/engineering-standards-builder/references/entry-procedure.md +0 -154
- package/template/skills/git-history-squash/references/entry-procedure.md +0 -94
- package/template/skills/github-npm-ops/SKILL.md +0 -19
- package/template/skills/github-npm-ops/references/ci-and-security-ops.md +0 -178
- package/template/skills/github-npm-ops/references/entry-procedure.md +0 -25
- package/template/skills/github-npm-ops/references/failure-recovery.md +0 -123
- package/template/skills/github-npm-ops/references/issue-pr-triage.md +0 -227
- package/template/skills/github-npm-ops/references/issue-transport.md +0 -26
- package/template/skills/github-npm-ops/references/package-json-checklist.md +0 -171
- package/template/skills/github-npm-ops/references/preflight-checklist.md +0 -39
- package/template/skills/github-npm-ops/references/publish-detection.md +0 -68
- package/template/skills/github-npm-ops/references/release-notes-injection.md +0 -238
- package/template/skills/github-npm-ops/references/release-pipeline.md +0 -108
- package/template/skills/github-npm-ops/references/setup-npm-token.md +0 -63
- package/template/skills/github-npm-ops/references/troubleshooting-playbook.md +0 -293
- package/template/skills/github-npm-ops/references/version-bump-flow.md +0 -217
- package/template/skills/github-npm-ops/references/workflow-yaml-reference.md +0 -268
- package/template/skills/github-npm-ops/scripts/issue-transport.mjs +0 -227
- package/template/skills/optimize-codex-config/references/entry-procedure.md +0 -78
- package/template/skills/speculo-retro/SKILL.md +0 -19
- package/template/skills/upstream-fork-sync/references/entry-procedure.md +0 -78
- package/template/skills/writing-great-skills/SKILL.md +0 -23
- /package/template/skills/{writing-great-skills → writing-for-agents}/references/document-contract.md +0 -0
- /package/template/workflows/specdev/{G-grill-with-docs → common/rules}/adr-format.md +0 -0
- /package/template/workflows/specdev/{G-grill-with-docs → common/rules}/context-format.md +0 -0
- /package/template/workflows/specdev/{I-implement → common/rules}/design-it-twice.md +0 -0
- /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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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",["服务器 / 名称","地址 / 系统","检查结果","检查详情(* 必需项)","项目","
|
|
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])));
|