Skip to content

kcd-dev/codex-no-limit

Repository files navigation

Codex Session Patcher

AI 编码工具会话清理器 & CTF/渗透测试提示词注入工具

支持 Codex CLI · Claude Code · OpenCode

English | 简体中文

GitHub stars GitHub release License: MIT Python


是什么

在安全测试、CTF 比赛、渗透测试等场景下,AI 编码工具(Codex、Claude Code、OpenCode)会频繁拒绝涉及安全操作的请求,导致会话中断。

Codex Session Patcher 提供两类解决方案:

1. 会话清理 — 扫描已产生的拒绝回复,替换为配合性内容,让会话可以 resume 继续

2. CTF 提示词注入 — 在配置层面注入安全测试上下文,从源头降低被拒绝的概率


功能特性

会话清理

  • 智能检测 — 两级拒绝检测策略(强短语全文匹配 + 弱关键词开头匹配),低误报率
  • AI 智能改写 — 调用 LLM 根据对话上下文生成符合语境的替换回复(支持 OpenAI / Ollama / OpenRouter 等兼容接口)
  • 批量清理 — 处理会话中所有拒绝回复,而非仅最后一条
  • 推理内容擦除 — 删除 Reasoning / Thinking block 加密推理内容
  • 备份还原 — 清理前自动备份,支持一键还原到任意历史版本
  • Diff 对比 — 清理前后 Side-by-side 对比视图

CTF/渗透测试提示词注入

  • Codex Profile 模式 — 创建 ctf profile,仅 codex -p ctf 启动时生效,不影响正常会话
  • Codex 全局模式 — 注入到全局配置,所有新会话自动生效
  • Claude Code 工作空间 — 创建专用 CTF 工作空间 ~/.claude-ctf-workspace,通过项目级 CLAUDE.md 注入
  • OpenCode 工作空间 — 创建专用 CTF 工作空间 ~/.opencode-ctf-workspace,通过 AGENTS.md 注入
  • 提示词自定义 — Web UI 内直接编辑注入提示词,支持模板保存与切换
  • AI 提示词改写 — 结合已注入的 CTF 系统提示词,AI 改写你的请求使其更易被接受

平台支持

平台 会话清理 CTF 注入 会话格式
Codex CLI ✅ Profile + 全局 JSONL
Claude Code ✅ 专用工作空间 JSONL
OpenCode ✅ 专用工作空间 SQLite

Web UI

  • 会话列表 — 多平台统一管理,按日期分组,支持按格式/拒绝状态/备份状态过滤
  • 可视化清理 — 预览面板 + Diff 对比 + 一键执行
  • 多语言 — 支持中文 / English 界面切换
  • 实时日志 — WebSocket 推送,操作日志实时显示

安装

git clone https://github.com/ryfineZ/codex-session-patcher.git
cd codex-session-patcher

# CLI 版本(零额外依赖)
python -m pip install -e .

# Web UI 版本
python -m pip install -e ".[web]"
cd web/frontend && npm install && npm run build && cd ../..

启动与访问

先说结论

  • Web UI 默认只监听本机http://127.0.0.1:47832
  • 开发模式前端地址http://127.0.0.1:3000
  • 本机默认可无密码直接进入
  • 如果配置了 Web 管理密码,整站 API 才需要先登录
  • 默认启动时自动确保 Codex Profile CTF/渗透模式可用
  • 不会再把普通 codex 会话偷偷改成全局安全模式

调用方式速查

场景 在哪里执行 命令 说明
首次完整启动 仓库根目录 ./scripts/start-web.sh 会检查依赖、构建前端、启动服务,并自动确保 Codex Profile CTF/渗透模式可用
首次完整启动 scripts/ 目录 ./start-web.sh 与上面等价,脚本会自动回到仓库根目录
依赖和前端已准备好,只想直接启动后端 仓库根目录 python -m web.backend.main 最快,不会再跑 pip install 和前端构建,且会自动确保 Codex Profile CTF/渗透模式可用
手动用 uvicorn 启动 仓库根目录 python -m uvicorn web.backend.main:app --host 127.0.0.1 --port 47832 仅后端启动,不经过内置启动包装
前后端热更新开发 仓库根目录 ./scripts/dev-web.sh 启动 127.0.0.1:47832 后端 + 127.0.0.1:3000 前端
手动执行一次自动清理 仓库根目录 ./scripts/auto-clean-sessions.sh 默认扫描并清理最新 Codex 会话中的拒绝回复
macOS 开机自动启动 + 每分钟自动清理 仓库根目录 ./scripts/install-launch-agent.sh 安装当前用户的 launchd Web 服务和 60 秒自动清理任务

推荐顺序:

  1. 第一次跑项目,用 ./scripts/start-web.sh
  2. 之后如果只是本机打开 Web UI,优先用 python -m web.backend.main
  3. 只有前端代码要热更新时,才用 ./scripts/dev-web.sh

默认行为:

  • 以上三种启动方式都会在启动时检查并自动确保 Codex Profile CTF/渗透模式 可用
  • 启动后如果你要进入该模式,请显式执行:
codex -p ctf
  • 如果你明确不想自动确保该 Profile,可临时设置:
export CODEX_PATCHER_AUTO_ENABLE_PROFILE=0

1)可选:配置 Web 管理密码

如果你只是本机使用,现在可以不配密码直接启动

如果你想给 Web 面板加一层登录保护,再用下面任一方式:

方式 A:环境变量(最直接)

export CODEX_PATCHER_WEB_PASSWORD='请改成你的强密码'

方式 B:写入 ~/.codex-patcher/config.json 的密码哈希(更适合长期本机使用)

{
  "web_password_hash": "pbkdf2_sha256$..."
}

说明:

  • 登录成功后,后端会下发 HttpOnly session cookie
  • GET /api/settings 不再返回完整 ai_key,只会返回掩码
  • 若未配置密码:
    • 本机访问可直接进入
    • WebSocket 仍会校验 Origin
    • 非本机地址仍然禁止无认证监听

2)生产/日常本地使用:启动完整 Web UI

# 在仓库根目录执行
./scripts/start-web.sh

这个脚本会做三件事:

  1. 安装 Python Web 依赖
  2. 安装并构建前端
  3. 启动 FastAPI 服务,并自动确保 Codex Profile CTF/渗透模式可用

启动后访问:

http://127.0.0.1:47832

如果你当前就在 scripts/ 目录,也可以直接执行:

./start-web.sh

这两种写法是等价的。

3)已安装依赖后,直接启动后端

如果你已经跑过一次完整启动,或者已经确认下面两项都存在:

  • Python Web 依赖已经装好
  • web/frontend/dist/index.html 已存在

那么后续最省事的调用方式是:

python -m web.backend.main

访问地址:

http://127.0.0.1:47832

启动时会自动检查并确保 Codex Profile CTF/渗透模式可用;也就是说,你之后如果要进入该模式,执行:

codex -p ctf

即可带渗透模式,而不会污染普通 codex 会话。

如果你还没准备好依赖和前端产物,再执行下面这套手动准备流程:

python -m pip install -e ".[web]"
cd web/frontend && npm install && npm run build && cd ../..
python -m web.backend.main

或:

python -m uvicorn web.backend.main:app --host 127.0.0.1 --port 47832

访问地址同样是:

http://127.0.0.1:47832

4)开发模式(前后端热更新)

# 在仓库根目录执行
./scripts/dev-web.sh

启动后:

  • 前端开发服务器:http://127.0.0.1:3000
  • 后端 API:http://127.0.0.1:47832
  • API 文档:http://127.0.0.1:47832/docs

5)登录方式

如果你配置了 Web 管理密码,打开 Web 页面后会先出现登录框。

  • 输入你配置的 Web 管理密码
  • 登录成功后,页面才会加载会话列表、设置页、WebSocket 日志流
  • 退出登录会清空前端状态并关闭 WebSocket 连接

如果你没有配置 Web 管理密码:

  • 页面会直接进入主界面
  • 不需要登录

5.1)macOS 开机自动启动 + 每分钟自动清理

如果你希望登录 macOS 后自动拉起这个服务,并且每 60 秒自动清理一次最新 Codex 会话里的拒绝回复,使用:

# 在仓库根目录执行
./scripts/install-launch-agent.sh

它会安装当前用户的两个 LaunchAgent:

  • Web 服务标签:com.houzi.codex-session-patcher.web
  • Web 配置文件:~/Library/LaunchAgents/com.houzi.codex-session-patcher.web.plist
  • Web 标准输出日志:~/.codex-patcher/launchd/stdout.log
  • Web 标准错误日志:~/.codex-patcher/launchd/stderr.log
  • 自动清理标签:com.houzi.codex-session-patcher.auto-clean
  • 自动清理配置文件:~/Library/LaunchAgents/com.houzi.codex-session-patcher.auto-clean.plist
  • 自动清理标准输出日志:~/.codex-patcher/auto-clean/stdout.log
  • 自动清理标准错误日志:~/.codex-patcher/auto-clean/stderr.log

注意:

  • 这条开机自启动链路走的是 ./scripts/start-web-daemon.sh
  • 每分钟自动清理链路走的是 ./scripts/auto-clean-sessions.sh
  • 默认每 60 秒扫描一次
  • 默认只扫 最新 Codex 会话
  • 不会在每次开机时重复执行 pip installnpm run build
  • 如果 127.0.0.1:47832 已被本项目旧的手动实例占用,start-web-daemon.sh 会先回收旧实例,再由 launchd 接管
  • 如果 127.0.0.1:47832 被别的无关进程占用,LaunchAgent 会拒绝强杀并直接报错
  • 它要求你至少先成功准备过一次运行环境,也就是:
    • Python Web 依赖已经装好
    • web/frontend/dist/index.html 已存在

如果你要修改自动清理策略,可以在安装前先导出环境变量,再执行安装脚本:

export CODEX_PATCHER_AUTO_CLEAN_FORMAT=codex
export CODEX_PATCHER_AUTO_CLEAN_SCOPE=latest
export CODEX_PATCHER_AUTO_CLEAN_INTERVAL=60
export CODEX_PATCHER_AUTO_CLEAN_NO_BACKUP=0
export CODEX_PATCHER_AUTO_CLEAN_BACKUP_DIR=/Volumes/otherdata/mac/codex/bak/sessions
./scripts/install-launch-agent.sh

可选值说明:

  • CODEX_PATCHER_AUTO_CLEAN_FORMATcodex / claude-code / opencode
  • CODEX_PATCHER_AUTO_CLEAN_SCOPElatest / all
  • CODEX_PATCHER_AUTO_CLEAN_INTERVAL:秒,默认 60
  • CODEX_PATCHER_AUTO_CLEAN_NO_BACKUP1 表示不备份,默认 0
  • CODEX_PATCHER_AUTO_CLEAN_BACKUP_DIR:JSONL 清理前备份目录,默认 /Volumes/otherdata/mac/codex/bak/sessions

如果你想卸载开机自启动:

./scripts/uninstall-launch-agent.sh

卸载时不会直接删除 plist,而是归档到:

~/.codex-patcher/launchd/.trash/

5.2)手动执行一次自动清理

如果你不想等到下一轮定时任务,也可以随时手动执行一次:

./scripts/auto-clean-sessions.sh

默认行为:

  • 扫描 ~/.codex/sessions/ 里的最新会话
  • 检测到拒绝回复后立即改写并保存
  • 默认保留 .bak 备份

如果你想一次性扫全部会话,可以临时这样执行:

CODEX_PATCHER_AUTO_CLEAN_SCOPE=all ./scripts/auto-clean-sessions.sh

6)公网暴露限制(重要)

项目内置的安全启动入口 python -m web.backend.main 默认禁止绑定 0.0.0.0 / ::

也就是说,下面这种显式公网绑定会被拒绝:

python -c "from web.backend.main import run_server; run_server(host='0.0.0.0', port=47832)"

若你在代码里调用 run_server(host="0.0.0.0"),也会被拒绝。

如果你确实要让内置安全启动入口监听公网地址,必须同时满足:

  1. 已配置 Web 管理密码
  2. 显式设置:
export CODEX_PATCHER_ALLOW_PUBLIC=1

否则后端会直接拒绝启动。

注意:uvicorn web.backend.main:app --host 0.0.0.0 ... 会绕过 run_server() 这一层 Python 启动保护,所以不要这么用。这个项目的推荐启动方式始终是 python -m web.backend.main./scripts/start-web.sh

7)跨域与浏览器访问限制

  • CORS 不再是 *
  • 默认只允许本机白名单来源:
    • http://127.0.0.1:3000
    • http://localhost:3000
    • http://127.0.0.1:8080
    • http://localhost:8080
    • http://127.0.0.1:47832
    • http://localhost:47832
  • WebSocket 会额外校验 Origin
  • 当启用了密码登录时,WebSocket 还会继续校验登录 cookie

如果你需要自定义来源白名单,可使用:

export CODEX_PATCHER_ALLOWED_ORIGINS='http://127.0.0.1:3000,http://127.0.0.1:47832'

或写入 ~/.codex-patcher/config.json

{
  "web_allowed_origins": [
    "http://127.0.0.1:3000",
    "http://127.0.0.1:47832"
  ]
}

使用方式

Web UI(推荐)

# 本地完整启动
./scripts/start-web.sh

# 或手动启动
python -m uvicorn web.backend.main:app --host 127.0.0.1 --port 47832

访问 http://127.0.0.1:47832

开发模式(前后端热更新):

./scripts/dev-web.sh

访问 http://127.0.0.1:3000

CLI

# 预览模式(不修改文件)
codex-patcher --dry-run --show-content

# 清理最新会话
codex-patcher --latest

# 清理所有会话
codex-patcher --all

# 指定格式(claude / opencode)
codex-patcher --latest --format claude
codex-patcher --latest --format opencode

# 安装/卸载 Codex Profile 模式
codex-patcher --install-ctf-config
codex-patcher --uninstall-ctf-config

# 安装/卸载 Claude Code / OpenCode CTF
codex-patcher --install-claude-ctf
codex-patcher --install-opencode-ctf

# 执行一次自动清理(默认最新 Codex 会话)
./scripts/auto-clean-sessions.sh

不启动 Web,直接让 Codex 全局生效

可以。

全局模式 的本质不是“Web 在后台常驻”,而是把默认配置写进 ~/.codex/config.toml,同时写入提示词文件:

  • ~/.codex/config.toml
  • ~/.codex/prompts/security_mode.md

一旦写进去,后续你直接运行:

codex

新的 Codex 会话就会默认带上这套安全测试上下文;这时不需要再启动 Web UI

当前仓库里,Profile 模式 有现成 CLI:

codex-patcher --install-ctf-config

全局模式 目前没有单独封装成 CLI 参数,只有:

  • Web UI 按钮
  • 或直接调用安装器

如果你不想启动 Web,可以在仓库根目录直接执行:

python -c "from codex_session_patcher.ctf_config import CTFConfigInstaller; ok, msg = CTFConfigInstaller().install_global(); print(msg); raise SystemExit(0 if ok else 1)"

注意:

  • 如果你的 ~/.codex/config.toml 顶层已经有自己的 model_instructions_file(例如指向 ~/.codex/AGENTS.md),全局模式会和现有配置冲突
  • 当前仓库会直接拒绝这种冲突写入,避免再制造 duplicate key
  • 这种场景请改用 Profile 模式,也就是 codex -p ctf

禁用全局模式:

python -c "from codex_session_patcher.ctf_config import CTFConfigInstaller; ok, msg = CTFConfigInstaller().uninstall_global(); print(msg); raise SystemExit(0 if ok else 1)"

生效方式:

  1. 执行一次上面的 install_global()
  2. 之后直接运行 codex
  3. 不再需要 codex -p ctf
  4. 也不再需要启动 Web,除非你想用可视化界面管理或清理会话

如果你只是偶尔需要安全测试上下文,还是更建议用 Profile 模式;因为 全局模式 会影响所有新的 Codex 会话。


CTF/渗透测试工作流

Codex

1. 安装 CTF Profile
   codex-patcher --install-ctf-config

2. 使用 CTF Profile 启动(不影响普通会话)
   codex -p ctf

3. 发送请求,若遇到拒绝 → 打开 Web UI 清理会话

4. resume 继续
   codex resume

Codex 全局模式

1. 启用全局模式
   python -c "from codex_session_patcher.ctf_config import CTFConfigInstaller; ok, msg = CTFConfigInstaller().install_global(); print(msg); raise SystemExit(0 if ok else 1)"

2. 直接启动 Codex
   codex

3. 所有新会话自动带安全测试上下文

4. 用完后禁用
   python -c "from codex_session_patcher.ctf_config import CTFConfigInstaller; ok, msg = CTFConfigInstaller().uninstall_global(); print(msg); raise SystemExit(0 if ok else 1)"

Claude Code

1. Web UI → 提示词增强 → Claude Code → 启用
   (创建 ~/.claude-ctf-workspace)

2. 从专用工作空间启动
   cd ~/.claude-ctf-workspace && claude

3. 遇到拒绝 → Web UI 清理 → 继续对话

OpenCode

1. Web UI → 提示词增强 → OpenCode → 启用
   (创建 ~/.opencode-ctf-workspace)

2. 从专用工作空间启动
   cd ~/.opencode-ctf-workspace && opencode

3. 遇到拒绝 → Web UI 清理 → 继续对话

配置

CLI 和 Web UI 共享配置文件 ~/.codex-patcher/config.json

配置项 说明 默认值
mock_response 默认替换文本 配合性回复
ai_enabled 启用 AI 改写 false
ai_endpoint LLM API 地址
ai_key API Key
ai_model 模型名称
custom_keywords 自定义拒绝检测关键词 {}
ctf_prompts 各平台自定义 CTF 提示词 内置模板
ctf_templates 用户保存的提示词模板 {}
web_password_hash Web 管理密码哈希
web_allowed_origins Web UI / WebSocket 允许的来源白名单 本机默认白名单

项目结构

codex-session-patcher/
├── codex_session_patcher/        # 核心库
│   ├── auto_clean.py             # 定时自动清理入口
│   ├── cli.py                    # CLI 入口
│   ├── core/
│   │   ├── formats.py            # 多平台格式策略
│   │   ├── parser.py             # 会话解析器(JSONL + SQLite)
│   │   ├── sqlite_adapter.py     # OpenCode SQLite 适配器
│   │   ├── detector.py           # 拒绝检测器
│   │   └── patcher.py            # 清理逻辑
│   └── ctf_config/
│       ├── installer.py          # CTF 注入安装器(三平台)
│       ├── templates.py          # 内置提示词模板
│       └── status.py             # 状态检测
├── web/
│   ├── backend/                  # FastAPI 后端
│   │   ├── api.py                # API 路由
│   │   ├── ai_service.py         # AI 分析 & 改写
│   │   ├── prompt_rewriter.py    # 提示词改写服务
│   │   └── schemas.py            # 数据模型
│   └── frontend/                 # Vue 3 + Naive UI
│       └── src/
│           ├── components/       # 页面组件
│           ├── stores/           # Pinia 状态管理
│           └── locales/          # i18n 国际化
├── tests/
├── scripts/
└── pyproject.toml

局限性说明

  • 无法突破平台最高安全策略 — 对于明确违规的请求仍可能被拒绝
  • 效果因版本而异 — 模型版本更新可能影响效果
  • OpenCode 需从工作空间目录启动 — OpenCode 无 profile 机制,CTF 注入依赖工作空间
  • 清理后需 resume — 会话清理后需手动 resume 继续上下文

支持作者

如果这个项目对你有帮助,欢迎:

  • ⭐ 点个 Star
  • ☕ Buy me a coffee — Web UI 右上角有赞赏入口(微信 / USDC)
  • 📢 关注微信公众号「钢之AI术师」获取更多 AI 工具技巧

许可证

MIT License


GitHub · X (Twitter) · 微信公众号:钢之AI术师

About

突破限制

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors