chore: organize planning docs

This commit is contained in:
nav
2026-03-30 09:06:24 +00:00
parent 81c0a4c289
commit 764ada7c60
5 changed files with 68 additions and 0 deletions

16
achieve/NEW_FEAT.md Normal file
View File

@@ -0,0 +1,16 @@
# New Features
## From TASKLIST
- Add AGENT_VERIFY env injection in pcexec: `AGENT_VERIFY="IF YOU ARE AN AGENT/MODEL, YOU SHOULD NEVER TOUCH THIS ENV VARIABLE"`.
- Add new Go binary (pcguard) to validate `AGENT_VERIFY`, `AGENT_ID`, `AGENT_WORKSPACE`.
- If AGENT_VERIFY mismatch or AGENT_ID/AGENT_WORKSPACE is empty, error: "PLEASE USE TOOL PCEXEC TO RUN THIS SCRIPT".
- Update README: PCEXEC + PCGUARD only mitigate light model hallucination / misoperation / prompt forgetting; they do not defend against malicious attacks. For stronger security, use sandbox mode instead of this plugin.
## Additional Requirements
1. 入环境变量时修改 PATH追加 `$(openclaw path)/bin`
2. 重构项目结构:项目根目录下放 docs, plugin, scripts, pass_mgr。plugin 下放 commands, core, hooks, tools 目录以及 index.ts, openclaw.plugin.json 等;根据这个结构重构现在的 codebase。
3. 构建目录dist/padded-cell。
4. 安装时把 dist/padded-cell 复制到 `$(openclaw path)/plugins/padded-cell` 并用此路径注册插件。
5. 安装脚本接受 --openclaw-profile-path 参数;可选所有 `$(openclaw path)` 路径,优先考虑该参数;若未提供则考虑 $OPENCLAW_PATH若没有则用默认值 ~/.openclaw。

299
achieve/PROJECT_PLAN.md Normal file
View File

@@ -0,0 +1,299 @@
# PaddedCell 插件项目计划v0.1
> 目标:提供“安全密码管理 + 安全执行 + 安全重启”的插件能力。PaddedCell **完全涵盖 CalmGate 的全部功能**,不再另行开发 CalmGate相关能力在本项目内实现不直接复用原项目或命名。
---
## 1. 功能范围(已确认)
### 1.1 密码管理Pass-like
- 使用**内置二进制可用的加密库**实现密码加/解密,不要求依赖 `pass` 或外部进程。
- 加密算法需支持配置默认AES-256-GCM
- 不使用主密钥派生;加/解密基于每个 agent 的公私钥。
- `pass` 仅作为功能类比:用于说明需要具备的“存取/轮换/删除”等能力。
- 密码存储路径:`{openclaw_dir}/.secrets/{agent_id}/'{key}:{user}'.gpg`
- 该二进制后续可能需要作为 OpenClaw 的 skill 提供。
### 1.2 pass_mgr 二进制
- 必须是**可执行二进制**,禁止脚本。
- 命令(调整):
- `pass_mgr get <key> [--username]`
- `pass_mgr generate <key> [--username <username>]`(替代 agent 侧 set
- `pass_mgr unset <key>`
- `pass_mgr rotate`
- `pass_mgr admin init <admin_password> [--key-path <path_to_generate_admin_private_key>]`
- `pass_mgr set <agent_id> <agent_workspace> <key> <passwd> <admin_passwd> [--username <username>]`(仅允许人类在 terminal 执行)
- 读取 `AGENT_WORKSPACE/AGENT_ID` 定位 workspace。
- admin 密钥存放路径:`~/.pass_mgr/.priv`
- **Agent 不允许执行 set**:若检测到 `AGENT``AGENT_WORKSPACE` 环境变量被设置,则 `pass_mgr set ...` 直接报错并中断。
- **未初始化禁止使用**:在 `admin init` 前,所有 `get/generate/set` 操作报错。
- `pass_mgr get <key> --username`:返回该密码文件名中的 `user`(可为空字符串)。
- **admin 密码泄露防护**:插件需检测所有 session 的 message/tool calling 中是否包含 admin 密码明文;一旦出现:
- pass_mgr 立即变为“未初始化”状态
- 记录“严重安全漏洞”日志
- 需要人类重新执行 `pass_mgr admin init`
### 1.3 pcexec 安全执行exec wrapper
- 作为工具实现TypeScript接口与 OpenClaw 原生 exec 完全一致。
- 执行前设置环境变量workspace/agent_id 等)。
- 解析命令中的 `pass_mgr get <key>` 调用(不限定 `$(...)` 格式):
- 预执行获得明文
- 执行后将 stdout/stderr 中所有与明文相同的片段替换为 `######`
- 支持多次/多密码替换。
- get 失败 → 直接中断。
### 1.4 安全重启CalmGate-like已并入 PaddedCell
- PaddedCell **完整承接 CalmGate 的所有功能**,不再单独开发 CalmGate。
- 提供 slash command 以启用/禁用重启功能与密码管理功能:
- `/padded-cell-ctrl status`:展示两项功能状态
- `/padded-cell-ctrl enable pass-mgr|safe-restart`
- `/padded-cell-ctrl disable pass-mgr|safe-restart`
- 权限仅授权用户可执行agent 不可自主调用)。
- 冷却:每个功能开关后**锁定 10 秒**10 秒内再次尝试改变状态需返回提示“最近刚被修改过”。
#### 1.4.1 Agent 全局状态管理
- 状态集合:`idle | busy | focus | freeze | pre-freeze | pre-freeze-focus`
- 规则:
- **idle → busy**:任意非心跳 session 收到消息并开始回复
- **busy**:在其他 session 继续回复,状态不变
- **busy → idle**:所有非心跳 session 都不在回复
- **focus**:工作流占位状态;工作流外消息统一回复“在忙,无法应答”
- **freeze**:不接受新消息
- **pre-freeze / pre-freeze-focus**:不接受新消息;处理完最后一条后进入 freeze
- **pre-freeze-focus 完成后**:触发提示“整理工作进度准备重启后继续”,并向之前工作的 session 发“准备重启,重启后继续”(文案待定)
#### 1.4.2 query-restart 信号逻辑
- 收到 `query-restart`
- idle → freeze
- busy → pre-freeze
- focus → pre-freeze-focus
-**全部 agent freeze** → 返回 `OK`,否则 `NOT_READY`
#### 1.4.3 safe-restart 工具
- 每 5s 发 `query-restart` 直到收到 `OK`
- 收到 `OK` 后:
- **返回调用方**
- 启动独立新进程执行 `restart` 脚本(`sleep 60s``openclaw gateway restart``openclaw gateway status`
- 若 5s 内未恢复:将 status append 到 log并执行 rollback
- 重启成功后:
- 解冻所有 freeze agent
- 对之前 busy/focus 的 agent回到之前的工作 session 发“restart 结束了,我们继续”
- 并发控制:
- 同一时刻只允许一个 agent 执行 restart
- 其他 agent 调用直接返回 `ALREADY_SCHEDULED`,不再轮询
- 新参数:
- `rollback`(脚本路径)
- `log`(日志路径)
- 重启失败:
- 执行 rollback
- 用 default agent 在调用方 session 回复“restart 失败,已经 rollback请参考 log 调查。”
- 备注restart 必须是所有计划操作的最后一步;重启后的操作需在调用前写好 md
#### 1.4.4 架构草图(初版)
```
+----------------------+ +-----------------------+
| OpenClaw Hooks | | Safe-Restart Tool |
| (message lifecycle) | | (poll query-restart) |
+----------+-----------+ +-----------+-----------+
| |
v v
+----------------------+ +-----------------------+
| Status Manager |<------>| Local API / WS |
| - state machine | | /query-restart |
| - session tracker | +-----------+-----------+
| - persistence | |
+----------+-----------+ v
| openclaw gateway
v
+----------------------+
| Storage (file+mem) |
+----------------------+
```
#### 1.4.5 数据模型(草案)
**AgentState**
```json
{
"agentId": "string",
"state": "idle|busy|focus|freeze|pre-freeze|pre-freeze-focus",
"workflow": "string|null",
"activeSessions": ["sessionKey"],
"lastSessions": ["sessionKey"],
"updatedAt": 0
}
```
**Global**
```json
{
"restartScheduledBy": "agentId|null",
"restartSession": "sessionKey|null",
"restartStatus": "idle|waiting|restarting|rollback",
"updatedAt": 0
}
```
#### 1.4.6 事件流(草案)
- **消息生命周期 hook**
- onMessageStart(session, agentId)
- 若 session 非心跳idle → busy
- 记录 activeSessions
- onMessageEnd(session, agentId)
- 移除 activeSessions
- 若 activeSessions 为空busy → idle
- 若处于 pre-freeze/pre-freeze-focus且无 activeSessions → freeze
- **focus/workflow**
- workflow 打开state → focus
- workflow 关闭:若无 activeSessions → idle否则 busy
- focus 下非工作流消息:直接回复“在忙,无法应答”
- **query-restart**
- 根据状态映射更新
- 若全部 freeze → OK否则 NOT_READY
- 对调用 restart 的 agent 的调用 session不冻结
#### 1.4.7 API 设计(草案)
**POST /query-restart**
Request:
```json
{
"requesterAgentId": "string",
"requesterSessionKey": "string"
}
```
Response: `OK` / `NOT_READY` / `ALREADY_SCHEDULED`
**POST /restart-result**
Request:
```json
{
"status": "ok|failed",
"log": "/path/to/log"
}
```
---
## 2. 非功能需求
- 行为与原生 exec 一致(参数、错误码、输出等)。
- 输出脱敏仅针对 stdout/stderr。
- 重点目标:避免密码明文出现在 **agent 的聊天/工具调用记录** 中;日志与落盘不做强约束(允许必要场景)。
- 需要额外文档skill 等)指导 agent 正确使用密码相关工具。
---
## 3. 里程碑与任务拆解
### M1需求固化 & 设计确认0.5d
- pass 存储路径模板确认
- pass_mgr 二进制的接口与约束策略确认
- pcexec 解析/替换策略确认
**验收**:设计说明与配置清单
---
### M2pass_mgr 二进制1.5d
- 实现 `get/generate/unset/rotate/admin init/set(admin-only)`
- 读取 ENV 中 workspace/agent_id
- 使用内置加密库完成加/解密、存取、轮换
- 实现“禁止 agent 执行 set”的环境变量检测
- 实现 admin 密码泄露触发“未初始化 + 严重漏洞日志”
**验收**CLI 可独立操作密码库,异常均可中断
---
### M3pcexec 工具2d
- TS 实现,完整兼容 exec 参数
- 解析 `pass_mgr get <key>`(不限定 `$(...)` 格式)
- 多密码脱敏替换
- 错误处理一致
**验收**:复杂命令场景下无明文泄漏
---
### M4安全重启模块2d
- 状态机 + query-restart
- safe-restart 轮询 + rollback
- 恢复通知
**验收**:符合上文安全重启机制的关键流程
---
### M5集成测试1d
- 多 agent 并发
- 多次 pass_mgr get
- exec 参数兼容
- restart 并发与失败回滚
**验收**:测试记录 + 问题清单
---
## 4. 关键待确认
1) pass_mgr rotate 的具体语义(对单个 key 还是全部?)
2) 密码存储路径模板最终格式
3) admin 密码泄露检测范围(仅 message/tool calling是否包含文件/日志扫描)
---
## 5. 输出物
- 技术设计稿(含流程图)
- 任务分配清单
- 测试用例列表
## 6. 安装脚本
### 6.1 需求
提供统一的插件安装脚本 `install.mjs`,实现以下功能:
**检测与依赖**
- 检测系统平台 (Linux/macOS)
- 检测必要依赖 (Node.js, Go, openclaw CLI)
- 检测 openclaw 配置目录
**构建**
- 自动构建 pass_mgr Go 二进制
- 自动构建 pcexec TypeScript 模块
- 自动构建 safe-restart TypeScript 模块
**安装**
- 安装 pass_mgr 到系统 PATH (或 openclaw bin 目录)
- 安装 TypeScript 模块到 openclaw skills 目录
- 创建必要的配置文件和目录
**配置**
- 初始化 pass_mgr admin (引导用户设置 admin 密码)
- 配置环境变量
- 注册 safe-restart API 服务
**验证**
- 验证所有组件安装成功
- 输出安装摘要和下一步操作提示
### 6.2 使用方式
```bash
# 默认安装
node install.mjs
# 指定安装路径
node install.mjs --prefix /usr/local
# 仅构建不安装
node install.mjs --build-only
# 跳过依赖检测
node install.mjs --skip-check
# 卸载
node install.mjs --uninstall
# 从指定路径卸载
node install.mjs --uninstall --prefix /usr/local
```
---
> 更新日志v0.1(基于当前需求整理)

View File

@@ -0,0 +1,279 @@
# PaddedCell 需求更新 — ego-mgr & 重命名
> 版本v0.2
> 日期2026-03-24
> 状态:待实现
---
## 1. 重命名pass_mgr → secret-mgr
### 1.1 范围
所有文档、代码、技能引用中的 `pass_mgr` 统一更名为 `secret-mgr`
- 二进制文件名:`pass_mgr``secret-mgr`
- 命令引用:`pass_mgr <cmd>``secret-mgr <cmd>`
- 文档README.md, PROJECT_PLAN.md, SKILL.md 等
- 技能目录:`skills/pass-mgr/``skills/secret-mgr/`
### 1.2 命令保持不变
```bash
secret-mgr list # List keys for current agent
secret-mgr get-secret --key <key> # Output secret
secret-mgr get-username --key <key> # Output username
secret-mgr set --key <key> --secret <s> [--username <u>] # Set entry
secret-mgr generate --key <key> [--username <u>] # Generate random secret
secret-mgr unset --key <key> # Delete entry
secret-mgr get <key> # Legacy (maps to get-secret)
secret-mgr admin handoff [file] # Export build secret
secret-mgr admin init-from [file] # Re-encrypt data
```
---
## 2. 新增 ego-mgr 二进制Go
### 2.1 功能概述
`ego-mgr` 管理 Agent 的个人信息(名字、邮箱、出生日期等),支持:
- **Agent Scope 字段**:每个 Agent 独立存储,值可不同
- **Public Scope 字段**:全局共用,所有 Agent 共享同一值
### 2.2 数据存储
- **文件路径**`~/.openclaw/ego.json`
- **格式**JSON
- **Schema**
```json
{
"columns": ["col1", "col2", "..."],
"public-columns": ["pub-col1", "pub-col2", "..."],
"public-scope": {
"pub-col1": "value1",
"pub-col2": "value2"
},
"agent-scope": {
"agent-id-1": {
"col1": "value-x",
"col2": "value-y"
},
"agent-id-2": {
"col1": "value-z"
}
}
}
```
### 2.3 命令接口
#### 2.3.0 帮助
```bash
ego-mgr --help
```
输出命令使用说明和示例。
#### 2.3.1 增加字段
```bash
# Agent Scope 字段
ego-mgr add column <column-name> [--default <default-value>]
# Public Scope 字段
ego-mgr add public-column <column-name> [--default <default-value>]
```
- `--default`:可选,设置默认值(不设置则默认为空字符串)
- 字段已存在时返回错误
### 2.3.2 删除字段
```bash
ego-mgr delete <column-name>
```
- 删除指定字段及其所有值(包括 `public-scope` 和所有 `agent-scope` 中的值)
- 字段不存在时返回错误
#### 2.3.3 设置字段值
```bash
ego-mgr set <column-name> <value>
```
- 字段必须已存在(通过 `add column``add public-column` 创建)
- 字段不存在时返回错误
- 根据字段类型自动写入 `agent-scope``public-scope`
#### 2.3.4 查询字段
```bash
# 获取单个字段值
ego-mgr get <column-name>
# 列出所有字段和值(先 Public 后 Agent Scope
ego-mgr show
# 仅列出字段名(先 Public 后 Agent Scope
ego-mgr list columns
```
### 2.4 输出示例
#### ego-mgr show
```
pub-col1: val1
pub-col2: val2
...
col1: valx
col2: valy
```
#### ego-mgr list columns
```
pub-col1
pub-col2
...
col1
col2
```
#### ego-mgr get <column>
```
<value>
```
(仅输出值,无额外格式)
### 2.5 安全约束
- **必须由 pcexec 调用**:检测到非 pcexec 环境(缺少 `AGENT_VERIFY` 等环境变量)时拒绝执行
- **Agent 隔离**Agent 只能读写自己的 `agent-scope` 字段,不能访问其他 Agent 的数据
- **Public Scope 读取**:所有 Agent 可读取 `public-scope`
### 2.6 字段命名规则
- **字符限制**:无限制(允许空格、特殊字符)
- **长度限制**:无限制
- **大小写**:区分大小写
- **唯一性**public-column 和 column 名字不能重复(全局唯一)
### 2.7 初始化逻辑
- `ego.json` 不存在时,由 PaddedCell 安装脚本自动创建空结构:
```json
{
"columns": [],
"public-columns": [],
"public-scope": {},
"agent-scope": {}
}
```
### 2.8 并发安全
- 写操作(`add`, `delete`, `set`)必须使用文件锁,防止多 Agent 并发写入导致数据损坏
- 读操作(`get`, `show`, `list columns`)无需锁
### 2.9 Agent 自动注册
- **读/写操作时**:如果当前 `agent-id` 不存在于 `agent-scope` 中,自动创建空条目:
```json
"agent-scope": {
"new-agent-id": {}
}
```
- **字段验证**:如果 `column-name` 不存在于 `columns` 或 `public-columns` 中,返回错误(退出码 2
### 2.10 错误退出码
| 退出码 | 含义 |
|--------|------|
| 0 | 成功 |
| 1 | 参数错误 / 用法错误 |
| 2 | 字段不存在column-name 不在 columns 或 public-columns 中) |
| 3 | 字段已存在 |
| 4 | 权限错误(非 pcexec 环境 / Agent 越权) |
| 5 | 文件锁获取失败 |
| 6 | JSON 解析/写入错误 |
### 2.11 值的大小限制
- 单字段值长度无限制
---
## 3. 新增 ego-mgr Skill
### 3.1 Skill 路径
`~/.openclaw/skills/ego-mgr/SKILL.md`
### 3.2 Skill 功能
- 指导 Agent 正确使用 `ego-mgr` 命令
- 说明字段管理流程(先 `add column`,再 `set`
- 提供常见用例(设置名字、邮箱、时区等)
### 3.3 触发条件
- 用户请求管理 Agent 个人信息
- 用户询问 ego-mgr 用法
- 需要存储/读取 Agent 配置信息
---
## 4. 依赖关系
```
+------------------+
| pcexec |
+--------+---------+
|
v
+--------+---------+ +------------------+
| ego-mgr |<----| ~.openclaw/ |
| secret-mgr | | ego.json |
+------------------+ +------------------+
```
- `ego-mgr` 和 `secret-mgr` 都必须通过 `pcexec` 调用
- `pcexec` 负责:
- 注入环境变量(`AGENT_VERIFY`, `AGENT_ID`, `AGENT_WORKSPACE`
- 解析并脱敏敏感信息
- 验证执行上下文
---
## 5. 待确认事项
1. **字段类型**:是否支持字段类型约束(如 email、date、number
---
## 6. 实现任务清单
### M1重命名 pass_mgr → secret-mgr & 初始化 ego.json
- [ ] 重命名二进制文件
- [ ] 更新所有文档引用
- [ ] 更新 Skill 目录和引用
- [ ] 更新 install.mjs 安装脚本
- [ ] install.mjs 自动创建空 `ego.json` 结构
### M1.5pass_mgr → secret-mgr 数据迁移
**迁移步骤**
1. 删除旧的 `pass_mgr` 前,执行:`pass_mgr admin handoff`(导出当前 build secret
2. 安装新的 `secret-mgr` 后,执行:`secret-mgr admin init-from`(用新 secret 重新加密数据)
3. 重启 gateway`openclaw gateway restart`
### M2实现 ego-mgr 二进制
- [ ] 设计 JSON Schema 和文件结构
- [ ] 实现 `--help`
- [ ] 实现 `add column` / `add public-column`
- [ ] 实现 `delete`
- [ ] 实现 `set`
- [ ] 实现 `get` / `show` / `list columns`
- [ ] 实现 pcexec 环境检测
- [ ] 实现 Agent 隔离逻辑
- [ ] 实现文件锁(并发安全)
- [ ] 实现错误退出码
### M3编写 ego-mgr Skill
- [ ] 创建 `skills/ego-mgr/SKILL.md`
- [ ] 编写使用示例
- [ ] 集成到 OpenClaw Skill 系统
### M4集成测试
- [ ] 测试 ego-mgr 与 pcexec 集成
- [ ] 测试多 Agent 隔离
- [ ] 测试 Public/Agent Scope 分离
- [ ] 测试边界条件(字段不存在、重复添加等)
---
## 7. 验收标准
1. `secret-mgr` 所有原有功能正常工作,文档更新完成
2. `ego-mgr` 支持完整的 CRUD 操作
3. `ego-mgr` 只能通过 `pcexec` 调用
4. Agent 数据隔离正确Public Scope 共享正确
5. Skill 文档清晰Agent 能独立使用

62
achieve/TEST_PLAN.md Normal file
View File

@@ -0,0 +1,62 @@
# PaddedCell 测试计划 - 2026-03-05
## 当前状态
- 代码已推送到 `dev/zhi` 分支 (commit: 28af11c)
- 已修复构建错误
- 安装脚本已更新
## 测试步骤及结果
### 1. 安装脚本测试 ✅
```bash
cd /root/.openclaw/workspace-developer/PaddedCell
node install.mjs --verbose
```
**结果**: 构建成功,但安装未完成(等待用户确认安装路径)
### 2. 依赖安装 ✅
- Go v1.22.2 已安装
- Node.js v22.x 可用
### 3. 构建测试 ✅
- pass_mgr Go 二进制编译成功
- pcexec TypeScript 构建成功
- safe-restart TypeScript 构建成功
### 4. 修复的构建错误
#### pass_mgr (Go)
- **问题**: `username` string 变量用作 boolean 判断
- **修复**: 使用 `BoolVar` 定义 `--username` flag
#### pcexec (TypeScript)
- **问题**: `process.env` 类型不匹配 `Record<string, string>`
- **修复**: 循环复制并过滤 undefined 值
#### safe-restart (TypeScript)
- **问题**: `fetch` 返回 `unknown` 类型
- **修复**: 添加类型断言 `as { status: string }`
## 下一步测试
需要完成的测试:
1. 完整安装流程测试(需要确认安装路径)
2. pass_mgr 功能测试init/get/set/generate/rotate
3. pcexec 密码脱敏测试
4. safe-restart API 测试
## 重启后计划
如果测试过程中需要重启 OpenClaw gateway重启后我需要
1. **验证环境变量** - 检查 PATH 和 PADDEDCELL_SKILLS_DIR 是否正确设置
2. **继续安装测试** - 重新运行 install.mjs 或验证已安装组件
3. **功能测试** - 测试 pass_mgr/pcexec/safe-restart 是否正常工作
4. **记录结果** - 更新此文件,记录测试通过/失败项
## 当前阻塞点
**无阻塞** - 构建已通过,可以开始完整安装测试。
**建议**: 运行 `node install.mjs` 完成安装,然后进行功能测试。