diff --git a/.agents/skills/unidesk-hwpod-ops/SKILL.md b/.agents/skills/unidesk-hwpod-ops/SKILL.md index 7f8ceb3d..387b515c 100644 --- a/.agents/skills/unidesk-hwpod-ops/SKILL.md +++ b/.agents/skills/unidesk-hwpod-ops/SKILL.md @@ -56,9 +56,28 @@ description: >- bun scripts/cli.ts cicd status --node NC01 bun scripts/cli.ts hwlab nodes control-plane source-workspace status --node NC01 --lane v03 -trans :win ps '[ordered]@{home=$HOME; python=(python --version 2>&1 | Out-String).Trim(); config=(Test-Path (Join-Path $HOME ".hwlab\\config.json")); log=(Test-Path (Join-Path $HOME ".hwlab\\logs\\hwlab-node.log"))} | ConvertTo-Json -Compress' -trans :win ps 'Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match "hwlab-node|hwpod-node" } | Select-Object ProcessId,Name,CommandLine | ConvertTo-Json -Compress' -trans :win ps 'Get-ScheduledTask -ErrorAction SilentlyContinue | Where-Object { $_.TaskName -match "HWLAB|HWPOD" } | Select-Object TaskName,State | ConvertTo-Json -Compress' +trans :win ps <<'POWERSHELL' +[ordered]@{ + home = $HOME + python = (python --version 2>&1 | Out-String).Trim() + config = Test-Path (Join-Path $HOME ".hwlab\\config.json") + log = Test-Path (Join-Path $HOME ".hwlab\\logs\\hwlab-node.log") +} | ConvertTo-Json -Compress +POWERSHELL + +trans :win ps <<'POWERSHELL' +Get-CimInstance Win32_Process | + Where-Object { $_.CommandLine -match "hwlab-node|hwpod-node" } | + Select-Object ProcessId, Name, CommandLine | + ConvertTo-Json -Compress +POWERSHELL + +trans :win ps <<'POWERSHELL' +Get-ScheduledTask -ErrorAction SilentlyContinue | + Where-Object { $_.TaskName -match "HWLAB|HWPOD" } | + Select-Object TaskName, State | + ConvertTo-Json -Compress +POWERSHELL ``` - 状态分类: @@ -76,43 +95,61 @@ trans :win ps 'Get-ScheduledTask -ErrorAction SilentlyContinue | Where ## 变更流程 -1. 观察运行上下文: - - 选中的 HWLAB 节点/通道; - - 公共入口和 Python 发布元数据; - - Windows 用户/会话; - - 当前节点进程、任务/启动项、配置是否存在和旧运行器。 -2. 节点身份、工作区根、资源绑定、认证、能力或 MDTODO 来源变化时,先更新权威规格。 -3. 使用当前 CLI 帮助选定的仓库自带 `hwlab nodes hwpod-node` 规划/状态/应用命令族: - - 变更前要求预检解析 YAML 节点配置; - - 证明节点的 `trans` 路由可达; - - 命令族不存在时先实现它。 - - 云端认证与桌面部署分阶段执行: - - `--component cloud-auth` 先同步节点认证 Secret; - - HWLAB 发布完成后使用 `--component desktop` 部署桌面节点; - - `--component all` 只用于云端已引用该 Secret 的稳定运行面。 -4. 由受控 CLI 完成部署: - - 渲染并校验配置; - - 获取已发布 Python 文件并校验 SHA; - - 解析目标交互用户的 Windows `python.exe`; - - 安装文件并应用 YAML 声明的登录自启动策略; - - nodeId、地址、工作区和重连/更新设置不得硬编码进生成的辅助代码。 -5. 证明节点状态: - - 单一执行权威; - - 预期版本/nodeId 和注册; - - `node.health` 和 `node.inventory`; - - 有界工作区读取和结构化诊断。 -6. 通过 HWLAB Web 等价路径验收 MDTODO: - - 来源保存; - - 探测; - - 重建索引; - - 文件/任务可见; - - 直接 `trans cat` 只属于 P1 诊断。 -7. 记录证据: - - 源提交、文件 SHA 和 nodeId; - - 工作区指纹/路径摘要和注册状态; - - 操作 request/trace 标识; - - MDTODO 来源/重建索引结果; - - 默认不得记录 Markdown 正文或凭据。 +- 观察运行上下文: + - 选中的 HWLAB 节点/通道; + - 公共入口和 Python 发布元数据; + - Windows 用户/会话; + - 当前节点进程、任务/启动项、配置是否存在和旧运行器。 +- 节点身份、工作区根、资源绑定、认证、能力或 MDTODO 来源变化时: + - 先更新权威规格。 +- 使用当前 CLI 帮助选定的仓库自带 `hwlab nodes hwpod-node` 规划/状态/应用命令族: + - 变更前要求预检解析 YAML 节点配置; + - 证明节点的 `trans` 路由可达; + - 命令族不存在时先实现它。 + - 云端认证与桌面部署分阶段执行: + - `--component cloud-auth` 先同步节点认证 Secret; + - HWLAB 发布完成后使用 `--component desktop` 部署桌面节点; + - `--component all` 只用于云端已引用该 Secret 的稳定运行面。 +- 由受控 CLI 完成部署: + - 渲染并校验配置; + - 获取已发布 Python 文件并校验 SHA; + - 解析目标交互用户的 Windows `python.exe`; + - 安装文件并应用 YAML 声明的登录自启动策略; + - nodeId、地址、工作区和重连/更新设置不得硬编码进生成的辅助代码。 +- 证明节点状态: + - 单一执行权威; + - 预期版本/nodeId 和注册; + - `node.health` 和 `node.inventory`; + - 有界工作区读取和结构化诊断。 +- 通过 HWLAB Web 等价路径验收 MDTODO: + - 来源保存; + - 探测; + - 重建索引; + - 文件/任务可见; + - 直接 `trans cat` 只属于 P1 诊断。 +- 记录证据: + - 源提交、文件 SHA 和 nodeId; + - 工作区指纹/路径摘要和注册状态; + - 操作 request/trace 标识; + - MDTODO 来源/重建索引结果; + - 默认不得记录 Markdown 正文或凭据。 + +## Windows 运行态判定 + +- 使用 Windows Store Python 启动图形节点时: + - `pyw.exe` 可能作为常驻启动器; + - 实际节点进程是其派生的 `pythonw*.exe`; + - 单实例状态只统计 `python*.exe` 解释器; + - 停止旧实例时同时清理启动器和解释器。 +- 通过 `trans` 启动图形节点时: + - 必须显式重定向标准输出和标准错误; + - 禁止让图形进程继承 PowerShell 或 trans 的管道句柄; + - `apply` 和 `status` 必须返回结构化终态后才算入口可用。 +- 验收 MDTODO 文件时: + - `workspace.ls` 证明目录原始文件可达; + - Project Management `reindex` 只投影可识别的 MDTODO 文档; + - Web 文件选择必须使用已进入投影的文件名; + - 原始目录存在但未进入投影的文件,不得用于 Web 选择命令验收。 ## 停止条件