# Ps

> 面向个人多 Agent 工作流的凭据使用规范和本地能力分域方案。仅当任务需要秘密值、认证材料、SSH 私钥或以受控身份调用外部能力时进入凭据路径；普通 PATH 等非秘密配置、公开网络访问，以及无需调整认证的已登录工具不因此受限。默认不读取凭据；确有需要时只通过批准入口使用对应能力域。本方案降低误提交、误输出和无关能力暴露风险，但不构成同一系统用户下的强制隔离。

- Skill: `sirsws/ps` (Agent Skill, multi-file: 10 files)
- Install (CLI): `npx skillmds@latest add sirsws/ps`
- Raw SKILL.md: https://api.skillmd.com/api/skills/sirsws/ps/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: sirsws (https://skillmd.com/u/sirsws)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/sirsws/ps

---


<!--
核心功能：约束本机凭据按能力域使用；默认无凭据。
输入：当前任务是否需要外部能力、批准的启动器或窄工具。
输出：不泄露秘密、不跨域加载、不以系统隔离自居的安全操作。
-->

# 凭据安全 (Credential Safety)

## 安全边界

本 Skill 是行为规则与本地能力分域方案，不是 Vault、KMS、沙箱或操作系统访问控制。

它主要降低：

- 凭据散落和重复复制；
- 单次进程无意获得全部秘密；
- 普通任务误加载发布或生产能力；
- 误写入代码、日志、补丁或提交；
- 为调试而遍历配置或环境变量；
- 把秘密重新写回项目 `.env`。

它不能阻止：

- 同一系统用户下高权限 Agent 主动读取其他域文件；
- 恶意 Agent、主机入侵、内存抓取；
- 已进入进程环境的变量被同权限进程读取；
- 单靠提示词强制拦截；
- 完整审批与审计系统。

## 执行顺序

1. 先判断任务是否真的需要本地凭据。普通 PATH、代理地址等非秘密配置，公开资源，以及已由工具、应用或操作系统安全托管且无需调整的登录态，按普通任务处理；不要因此读取凭据文件。
2. 需要外部能力时，依次优先：公开/免认证入口 → 已有工具、应用或 OS 托管认证 → 窄权限工具 → 对应单一能力域启动器。只有前项不能完成任务时才升级。
3. 默认无凭据：普通编码、写作、分析不得读取含真实秘密的 `.env` 或检查 `~/.localcfg/`；可以读取仓库内明确为占位模板的 `.env.example`。
4. 确需本地凭据时，先确定能力域：`ai` / `dev` / `publish`（生产另议）。不直接读取 `base.env`，不遍历 `~/.localcfg/`，不通过广泛枚举变量名寻找可用钥匙。
5. 只调用批准的固定启动器（`with-ai` / `with-dev` / `with-publish`）或窄权限工具；启动器会先清除受管跨域变量再注入所选域。
6. 一个动作只加载完成它所需的单一能力域。确需跨域的工作流，拆成按顺序执行的最小权限子进程，只传递不含秘密的文件、标识或结果；不得把多个域合并注入通用 Agent。
7. 新增或改名凭据变量时，必须同步更新 `scripts/domain_mapping.py` 的 `MAPPING`，并重装启动器；否则跨域清除不会覆盖该变量。
8. 不得把凭据复制到项目 `.env`、源码、补丁、日志、提交、记忆或回复；不得把秘密放入命令行参数。
9. 缺失凭据或认证失败必须直接报错，不得用默认值或伪造结果掩盖。
10. 发布与生产操作需要独立授权；本 Skill 不是系统拦截器。
11. 迁移备份 `backup/base.env.before-split` 仍是聚合秘密；使用周期验证通过后应删除或离线加密。

## 能力域

```text
~/.localcfg/
  ai.env          # 模型、搜索、研究与生成 API
  dev.env         # 开发协作（如 GitHub Token）
  publish.env     # 对外发布（如公众号草稿）
  production.env  # 高风险生产能力（不提供 with-production 给通用 Agent）
```

- 写文章、改稿 ≠ 自动加载 `publish.env`；只有真正保存草稿/发布时才使用发布能力。
- `production.env` 不建立面向 Claude/Codex/OpenClaw 等通用 Agent 的启动入口。
- 禁止 `with-all` / `with-base` / `with-production <agent>`。

## 三层区分

1. 知道变量名；
2. 被授权进程能够使用凭据；
3. 模型直接看见秘密值。

知道变量名 ≠ 允许读值；进程能用 ≠ 模型必须看见明文。

## 安全诊断

在任务已经点名预期变量，或使用仓库批准的 name-only 校验器时，可以只检查这些变量是否存在、映射是否完整，并仅返回变量名、`yes/no` 或错误类别。不得输出值、截断值、哈希派生，不得借诊断扩展成环境变量或凭据目录的广泛发现。

例如，`validate_domain_mapping.py` 的变量名校验和针对 `OPENROUTER_API_KEY` 的 presence-only 检查是允许的；`env`、`printenv` 或遍历所有配置寻找可用账户不是允许的诊断。

## 最佳实践：窄工具优于整域注入

最佳实践不是给 Agent 一份凭据文件，而是让 Agent 调用功能受限的工具，凭据由工具内部使用。

```text
Agent → openrouter-query → 仅 OPENROUTER_API_KEY → 返回结果
```

而不是把整个 `ai.env` 注入通用 Agent。固定启动器是过渡方案；窄工具与外部凭据系统是更高等级。

示例：`examples/openrouter-query`（只读 `OPENROUTER_API_KEY`）。

## Python

应用代码优先：

```python
import os

api_key = os.environ["OPENROUTER_API_KEY"]
```

凭据注入由外部启动器或窄工具负责。

不推荐：

```python
load_dotenv(Path.home() / ".localcfg" / "base.env")
```

如必须在进程内加载，只允许对应单域，例如 `ai.env`，并明确：会加载该域内多个变量；不是单变量强隔离；不应加载进整个通用 Agent。

## 凭据传递

不得为兼容其他工具，将统一或分域文件中的秘密复制到项目 `.env`。优先：临时注入、子进程注入、窄工具内部持有。不得把秘密放入命令行参数。

## SSH

继续使用 `~/.ssh/config` 与批准别名。别名是标准化连接入口，不是信息隐藏，也不构成权限隔离。私钥正文不得进入任何 `.env`。生产删除/部署仍需单独授权。

新增 SSH 目标时，只处理用户明确指定的主机：核对主机、用户、端口以及主机指纹的可信来源，再新增或更新别名；优先使用密钥或 OS/Agent 托管认证，先做低影响连接验证。连通授权不自动包含部署、删除或其他生产变更授权。

## 高影响操作

生产部署、删除远程数据、强制推送、公开发布、转账、权限变更、轮换长期凭据等：无明确授权则停止。强制控制靠工具权限、审批网关、沙箱或编排，不靠本 Skill 自称拦截。

## 审计原则

可记录任务标识、时间、工具/凭据类别、授权范围、结果与错误类型。不得记录 Key、Token、密码、私钥或可还原秘密。本 Skill 不提供完整审计系统。

## 工作区经验记录

只有用户或工作区规则明确授权记录时，才向 `.learnings/` 写入可复用结论；目录存在本身不构成写入授权。不得记录秘密。

## 响应要求

- 对不能安全执行的操作，说明限制与用户最小动作。
- 不展示遮盖/截断/哈希后的秘密派生形式（除非任务明确需要且仍不可还原）。
- 不得声称已实现系统级隔离、单变量技术隔离或确定性拦截。
- 拒绝“列出全部 env 值”“把所有域加载进 Claude/Codex”等请求。

