AI 编程代理已经不再是实验玩具。Claude Code 坐在你的终端里,读文件、跑命令、发网络请求、写代码——全是以你的名义。便利是真实的,风险也是真实的:一个没有约束的代理可以误删生产配置、把密钥推到公开仓库、或者执行一条你根本没打算运行的 shell 命令。Prempti 的切入点很直接——策略(Policy)与可见性(Visibility),让团队对 AI 代理的行为有规则、有记录、有控制。
为什么需要策略层
当前大多数开发者用 AI 编程代理的方式是"全开模式":给代理完整的 shell 权限、完整的文件系统访问、不加过滤的网络能力。这在个人实验项目里勉强可以,但在团队协作和生产环境中,等同于给每个开发者发了一把没有钥匙限制的主钥匙。
具体风险场景:
- 文件越权写入:代理修改了
.env.production或terraform/main.tf,而你只打算让它改测试文件。 - 命令误执行:代理跑了一条
rm -rf或kubectl delete namespace production,因为它"觉得"那是清理步骤。 - 数据外泄:代理把包含内部 API 密钥的代码片段发送到外部 LLM 服务,而公司合规要求密钥不能离开内网。
- 行为不可审计:代理做了什么、什么时候做的、基于什么指令——没有结构化日志,事后无法追溯。
Prempti 的核心思路:在代理和操作系统之间插入一个策略引擎,代理的每个动作都经过规则校验和日志记录。
策略怎么写:从 YAML 到运行
Prempti 的策略用 YAML 定义,声明代理在哪些路径下能做什么操作。下面是一个可以直接用于项目的策略文件示例:
# prempti-policy.yaml — 放在项目根目录
version: "1"
agent:
name: claude-code
runtime: terminal
rules:
# 文件读写策略
file_access:
allow_read:
- "src/**"
- "tests/**"
- "docs/**"
- "README.md"
- "package.json"
allow_write:
- "src/**"
- "tests/**"
deny:
- ".env*"
- "terraform/**"
- "k8s/**"
- ".git/**"
- "**/secrets.*"
# Shell 命令策略
shell:
allow_patterns:
- "git status"
- "git diff*"
- "git log*"
- "npm test*"
- "pytest*"
- "ls *"
- "cat src/**"
deny_patterns:
- "rm -rf*"
- "kubectl delete*"
- "curl*http://external*"
- "sudo*"
- "chmod 777*"
# 允许但需要人工确认的命令
confirm_patterns:
- "git push*"
- "npm publish*"
- "docker push*"
# 网络策略
network:
allow_domains:
- "api.openai.com"
- "api.anthropic.com"
- "internal-api.mycompany.com"
deny_domains:
- "*" # 默认拒绝所有,只放行 allow 列表
block_leaked_patterns:
- pattern: "AKIA[0-9A-Z]{16}" # AWS Access Key
- pattern: "ghp_[0-9a-zA-Z]{36}" # GitHub PAT
- pattern: "sk-[0-9a-zA-Z]{48}" # OpenAI API Key
# 日志与审计
logging:
destinations:
- type: file
path: ".prempti/audit.log"
- type: webhook
url: "https://internal-api.mycompany.com/prempti/events"
fields:
- timestamp
- agent_name
- action_type # file_read / file_write / shell_exec / network_request
- target # 具体文件路径、命令、URL
- rule_matched # 哪条规则放行或拦截
- decision # allow / deny / confirm_required
把文件放到项目根目录后,启动代理时通过 Prempti 加载策略:
# 安装 Prempti(假设已发布为 npm 包或 pip 包)
npm install -g prempti # 或 pip install prempti
# 用 Prempti 启动 Claude Code,策略自动生效
prempti run --policy prempti-policy.yaml --agent claude-code
# 查看实时审计日志
tail -f .prempti/audit.log
当代理尝试执行被 deny 规则匹配的操作时,Prempti 会拦截并记录;命中 confirm_patterns 的操作会暂停并弹出确认提示,等待开发者按 y 才继续。
可见性:审计日志长什么样
策略拦截只是半件事,另一半是知道代理到底干了什么。Prempti 的审计日志输出结构化事件,便于接入现有的监控体系:
{
"timestamp": "2025-07-11T14:32:07Z",
"agent_name": "claude-code",
"action_type": "shell_exec",
"target": "kubectl delete namespace staging",
"rule_matched": "shell.deny_patterns[1]",
"decision": "deny",
"session_id": "abc123",
"user": "zhangwei"
}
{
"timestamp": "2025-07-11T14:33:12Z",
"agent_name": "claude-code",
"action_type": "file_write",
"target": "src/api/handlers.py",
"rule_matched": "file_access.allow_write[0]",
"decision": "allow",
"diff_summary": "+18/-3 lines",
"session_id": "abc123",
"user": "zhangwei"
}
你可以用简单脚本把日志转成团队可读的日报:
#!/usr/bin/env python3
"""prempti-daily-report.py — 生成 Prempti 审计日报"""
import json
from collections import Counter
from datetime import datetime, timedelta
from pathlib import Path
log_path = Path(".prempti/audit.log")
yesterday = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
actions = []
denies = []
confirms = []
for line in log_path.read_text().splitlines():
event = json.loads(line)
if not event["timestamp"].startswith(yesterday):
continue
actions.append(event["action_type"])
if event["decision"] == "deny":
denies.append(f"{event['action_type']}: {event['target']}")
if event["decision"] == "confirm_required":
confirms.append(f"{event['action_type']}: {event['target']}")
print(f"=== Prempti 日报 {yesterday} ===")
print(f"总操作数: {len(actions)}")
print(f"操作分布: {Counter(actions)}")
print(f"\n拦截事件 ({len(denies)}):")
for d in denies:
print(f" ✗ {d}")
print(f"\n待确认事件 ({len(confirms)}):")
for c in confirms:
print(f" ⏳ {c}")
# 运行日报脚本
python3 prempti-daily-report.py
团队落地:从个人实验到组织级管控
Prempti 解决的是"信任边界"问题。以下是一个分阶段推进的思路:
阶段一:个人开发者——先加可见性
不急着上严格策略,先把日志打开,观察自己用的代理到底在做什么。一周后回顾日志,你会发现代理的行为模式远比你直觉以为的更广——这是制定策略的数据基础。
# 最小起步:只开日志,不拦截
version: "1"
agent:
name: claude-code
runtime: terminal
rules:
file_access:
allow_read: ["**"]
allow_write: ["**"]
shell:
allow_patterns: ["*"]
network:
allow_domains: ["*"]
logging:
destinations:
- type: file
path: ".prempti/audit.log"
fields: [timestamp, action_type, target, decision]
阶段二:项目级——锁定敏感路径
根据日志观察结果,把生产配置、密钥文件、基础设施定义加入 deny 列表,把推送和发布操作加入 confirm 列表。这一步不影响日常开发效率,但堵住了最大的风险口。
阶段三:组织级——统一策略模板 + 集中审计
团队维护一份标准策略模板(比如 company-prempti-policy.yaml),所有项目继承并允许局部覆盖。审计日志通过 webhook 统一发到内部安全平台,和现有的 SIEM 或合规系统对接。
# 组织级策略继承示例
version: "1"
inherits: "https://internal-git.mycompany.com/devops/prempti-base-policy.yaml"
agent:
name: claude-code
runtime: terminal
rules:
# 继承基础策略后,项目级只做增量覆盖
file_access:
deny:
- ".env.production" # 项目额外加一条
shell:
confirm_patterns:
- "make deploy*" # 项目特有的部署命令需要确认
边界与取舍
Prempti 不是万能盾牌,几个现实边界需要正视:
- 策略过严会逼人绕过:如果 deny 列表太长,开发者会关掉 Prempti 直接跑裸代理。策略要精准,不是越多越好。
- 代理能力在快速扩展:今天的策略可能覆盖不了明天代理新增的能力(比如直接操作数据库)。策略需要跟着代理能力迭代。
- 确认提示打断流畅度:confirm_patterns 每弹一次确认就打断一次工作流。只对真正不可逆的操作加确认,别对
git commit也加。 - 本地策略无法防恶意代理:如果代理本身有意绕过策略引擎(比如直接调用系统 API 而不走 shell),本地策略层有被绕过的理论可能。这需要更深层的集成,比如 OS 级别的沙箱。
落地检查清单:
- ✅ 项目根目录有
prempti-policy.yaml - ✅
.env*、密钥文件、基础设施配置在 deny 列表 - ✅
rm -rf、kubectl delete、sudo在 shell deny 列表 - ✅
git push、npm publish、docker push在 confirm 列表 - ✅ 审计日志写入
.prempti/audit.log并接入团队监控 - ✅ 每周回顾一次日志,更新策略规则
AI 编程代理是好工具,但好工具也需要好护栏。Prempti 提供的策略和可见性,让团队在享受代理效率的同时,不用赌它不会踩坑。