Chuyển đến nội dung chính
failproofai sử dụng các tệp cấu hình JSON để kiểm soát các chính sách nào đang hoạt động, cách chúng hoạt động và nơi tải các chính sách tùy chỉnh. Cấu hình được thiết kế để dễ dàng chia sẻ với nhóm của bạn - cam kết nó vào kho lưu trữ của bạn và mọi nhà phát triển sẽ nhận được cùng một lưới bảo vệ cho agent.

Các phạm vi cấu hình

Có ba phạm vi cấu hình, được đánh giá theo thứ tự ưu tiên:
Phạm viĐường dẫn tệpMục đích
project.failproofai/policies-config.jsonCài đặt cho mỗi kho, được cam kết vào kiểm soát phiên bản
local.failproofai/policies-config.local.jsonGhi đè cục bộ cho mỗi kho, được gitignore
global~/.failproofai/policies-config.jsonGiá trị mặc định cấp người dùng trên tất cả các dự án
Khi failproofai nhận một sự kiện hook, nó sẽ tải và hợp nhất cả ba tệp tồn tại cho thư mục làm việc hiện tại.

Quy tắc hợp nhất

enabledPolicies - hợp của cả ba phạm vi. Một chính sách được bật ở bất kỳ cấp nào đều hoạt động.
project:  ["block-sudo"]
local:    ["block-rm-rf"]
global:   ["block-sudo", "sanitize-api-keys"]

resolved: ["block-sudo", "block-rm-rf", "sanitize-api-keys"]  ← hợp đã khử trùng
policyParams - phạm vi đầu tiên xác định tham số cho một chính sách nhất định sẽ chiến thắng hoàn toàn. Không có hợp nhất sâu của các giá trị trong tham số của chính sách.
project:  block-sudo → { allowPatterns: ["sudo apt-get update"] }
global:   block-sudo → { allowPatterns: ["sudo systemctl status"] }

resolved: { allowPatterns: ["sudo apt-get update"] }   ← project chiến thắng, global bị bỏ qua
project:  (không có mục block-sudo)
local:    (không có mục block-sudo)
global:   block-sudo → { allowPatterns: ["sudo systemctl status"] }

resolved: { allowPatterns: ["sudo systemctl status"] }  ← rơi vào global
customPoliciesPath - phạm vi đầu tiên xác định nó sẽ chiến thắng. llm - phạm vi đầu tiên xác định nó sẽ chiến thắng.

Định dạng tệp cấu hình

{
  "enabledPolicies": [
    "block-sudo",
    "block-rm-rf",
    "block-push-master",
    "sanitize-api-keys",
    "sanitize-jwt",
    "block-env-files",
    "block-read-outside-cwd"
  ],
  "policyParams": {
    "block-sudo": {
      "allowPatterns": ["sudo systemctl status", "sudo journalctl"]
    },
    "block-push-master": {
      "protectedBranches": ["main", "release", "prod"]
    },
    "block-rm-rf": {
      "allowPaths": ["/tmp"]
    },
    "block-read-outside-cwd": {
      "allowPaths": ["/shared/data", "/opt/company"]
    },
    "sanitize-api-keys": {
      "additionalPatterns": [
        { "regex": "myco_[A-Za-z0-9]{32}", "label": "MyCo API key" }
      ]
    },
    "warn-large-file-write": {
      "thresholdKb": 512
    }
  },
  "customPoliciesPath": "/home/alice/myproject/my-policies.js"
}

Tham chiếu trường

enabledPolicies

Kiểu: string[] Danh sách tên chính sách cần bật. Tên phải khớp chính xác với các định danh chính sách được hiển thị bởi failproofai policies. Xem Built-in Policies để có danh sách đầy đủ. Các chính sách không có trong enabledPolicies không hoạt động, ngay cả khi chúng có các mục trong policyParams.

policyParams

Kiểu: Record<string, Record<string, unknown>> Ghi đè tham số cho từng chính sách. Khóa bên ngoài là tên chính sách; các khóa bên trong là dành riêng cho từng chính sách. Mỗi chính sách ghi lại các tham số có sẵn của nó trong Built-in Policies. Nếu một chính sách có các tham số nhưng bạn không chỉ định chúng, các giá trị mặc định tích hợp của chính sách sẽ được sử dụng. Người dùng không cấu hình policyParams hoàn toàn sẽ nhận được hành vi giống hệt như các phiên bản trước. Các khóa không xác định bên trong khối tham số của chính sách bị bỏ qua im lặng khi hook kích hoạt nhưng được đánh dấu là cảnh báo khi bạn chạy failproofai policies.

hint (cross-cutting)

Kiểu: string (tùy chọn) Một thông điệp được nối thêm vào lý do khi một chính sách trả về deny hoặc instruct. Sử dụng nó để cung cấp hướng dẫn có thể hành động cho Claude mà không cần sửa đổi chính sách. Hoạt động với bất kỳ loại chính sách nào - tích hợp sẵn, tùy chỉnh (custom/), quy ước dự án (.failproofai-project/), hoặc quy ước người dùng (.failproofai-user/).
{
  "policyParams": {
    "block-force-push": {
      "hint": "Hãy thử tạo một nhánh mới."
    },
    "block-sudo": {
      "allowPatterns": ["sudo apt-get"],
      "hint": "Sử dụng apt-get trực tiếp mà không cần sudo."
    },
    "custom/my-policy": {
      "hint": "Yêu cầu sự phê duyệt của người dùng trước."
    }
  }
}
Khi block-force-push từ chối, Claude sẽ thấy: “Force-pushing bị chặn. Hãy thử tạo một nhánh mới.” Các giá trị không phải chuỗi và chuỗi rỗng bị bỏ qua im lặng. Nếu hint không được đặt, hành vi không thay đổi (tương thích ngược).

customPoliciesPath

Kiểu: string (đường dẫn tuyệt đối) Đường dẫn đến tệp JavaScript chứa các chính sách hook tùy chỉnh. Điều này được đặt tự động bởi failproofai policies --install --custom <path> (đường dẫn được phân giải thành tuyệt đối trước khi được lưu trữ). Tệp được tải lại trên mỗi sự kiện hook - không có bộ đệm. Xem Custom Policies để biết chi tiết tác giả.

Các chính sách dựa trên quy ước

Ngoài customPoliciesPath rõ ràng, failproofai tự động phát hiện và tải các tệp chính sách từ các thư mục .failproofai/policies/:
CấpThư mụcPhạm vi
Dự án.failproofai/policies/Chia sẻ với nhóm qua kiểm soát phiên bản
Người dùng~/.failproofai/policies/Cá nhân, áp dụng cho tất cả các dự án
Khớp tệp: Chỉ các tệp khớp với *policies.{js,mjs,ts} được tải (ví dụ: security-policies.mjs, workflow-policies.js). Các tệp khác trong thư mục bị bỏ qua. Không cần cấu hình: Các chính sách quy ước không yêu cầu các mục trong policies-config.json. Chỉ cần thả các tệp vào thư mục và chúng sẽ được chọn khi sự kiện hook tiếp theo xảy ra. Tải hợp: Cả hai thư mục quy ước dự án và người dùng được quét. Tất cả các tệp khớp từ cả hai cấp đều được tải (không giống customPoliciesPath sử dụng first-scope-wins). Xem Custom Policies để biết thêm chi tiết và ví dụ.

llm

Kiểu: object (tùy chọn) Cấu hình máy khách LLM cho các chính sách thực hiện các lệnh gọi AI. Không cần thiết cho hầu hết các thiết lập.
{
  "llm": {
    "model": "claude-sonnet-4-6",
    "apiKey": "sk-ant-..."
  }
}

Quản lý cấu hình từ CLI

Các lệnh policies --installpolicies --uninstall ghi vào tệp cài đặt hook của CLI agent của bạn (các điểm vào hook), trong khi policies-config.json là tệp bạn quản lý trực tiếp. Hai tệp này là riêng biệt:
  • Cài đặt Agent CLI — yêu cầu agent gọi failproofai --hook <event> trên mỗi sử dụng công cụ:
    • Claude Code: ~/.claude/settings.json (người dùng), <cwd>/.claude/settings.json (dự án), <cwd>/.claude/settings.local.json (cục bộ)
    • OpenAI Codex: ~/.codex/hooks.json (người dùng), <cwd>/.codex/hooks.json (dự án) — Codex không có phạm vi local
    • GitHub Copilot CLI (beta): ~/.copilot/hooks/failproofai.json (người dùng), <cwd>/.github/hooks/failproofai.json (dự án) — Copilot không có phạm vi local. Các mục hook sử dụng các trường lệnh bash/powershell được xác định theo hệ điều hành của Copilot với timeoutSec; tệp mang một đánh dấu version: 1 cấp cao nhất. Hỗ trợ Copilot CLI là beta trong khi chúng tôi xác minh lược đồ bản ghi events.jsonl (mà các tài liệu công khai không chỉ định) so với các phiên làm việc thực tế hơn.
    • Cursor Agent (beta): ~/.cursor/hooks.json (người dùng), <cwd>/.cursor/hooks.json (dự án) — Cursor không có phạm vi local. Các mục hook sử dụng hình thức {type, command, timeout} dạng Claude (không chia bash/powershell), nhưng được lưu trữ dưới các khóa sự kiện camelCase (preToolUse, beforeSubmitPrompt, …) trong một mảng phẳng theo hooks schema của Cursor; tệp mang một đánh dấu version: 1 cấp cao nhất. Trình xử lý chính tắc hóa camelCase → PascalCase thông qua CURSOR_EVENT_MAP để các chính sách tích hợp sẵn hiện có kích hoạt không thay đổi. Hỗ trợ Cursor Agent là beta trong khi chúng tôi xác minh định dạng bảng điểm của Cursor trên đĩa (không được chỉ định trong tài liệu công khai) so với nhiều bản cài đặt thực tế hơn.
    • OpenCode (beta): ~/.config/opencode/opencode.json + ~/.config/opencode/plugins/failproofai.mjs (người dùng), <cwd>/.opencode/opencode.json + <cwd>/.opencode/plugins/failproofai.mjs (dự án) — OpenCode không có phạm vi local. Không giống như sáu CLI khác, OpenCode không có hệ thống hook lệnh bên ngoài: nó tải các plugin JS/TS trong quy trình được đăng ký rõ ràng qua mảng plugin: [] trong opencode.json (tự động khám phá từ .opencode/plugins/ không phải cách các plugin được tải trên opencode v1.14.33). Install thả một shim plugin nhỏ được tạo ra gọi lệnh phụ vào nhị phân failproofai và dịch phản hồi JSON dạng Claude của nhị phân trở lại ngữ semantics plugin: throw new Error() để từ chối sự kiện công cụ (hủy lệnh gọi công cụ), client.session.prompt(...) để instruct VÀ để từ chối Stop / SubagentStop (gửi lý do từ chối làm thông điệp người dùng tiếp theo — kênh retry-buộc duy nhất vì session.idle chỉ là thông báo và ném từ nó là no-op), và no-op cho phép. Shim chính tắc hóa cả tên công cụ (chữ thường → PascalCase qua OPENCODE_TOOL_MAP) và các khóa đối số đầu vào công cụ (camelCase → snake_case qua OPENCODE_TOOL_INPUT_MAP cho Read / Write / Edit, ví dụ: filePathfile_path, oldStringold_string) trước khi chuyển tiếp đến nhị phân, vì vậy các chính sách kiểm tra đường dẫn tích hợp sẵn như block-read-outside-cwd, block-env-files, và block-secrets-write kích hoạt không thay đổi trên các lệnh gọi công cụ OpenCode. Các phiên sống trong cơ sở dữ liệu SQLite của opencode tại ~/.local/share/opencode/opencode.db; trình xem phiên của bảng điều khiển đọc chúng qua opencode db --format jsonopencode export <id>. Hỗ trợ OpenCode là beta trong khi chúng tôi xác minh hành vi trên các phiên bản và so với nhiều phiên làm việc thực tế hơn. Xem tài liệu plugin OpenCode.
    • Pi (beta): ~/.pi/agent/settings.json (người dùng), <cwd>/.pi/settings.json (dự án) — Pi không có phạm vi local. Pi tải các gói mở rộng TypeScript khi khởi động; tệp cài đặt là một mảng chuỗi phẳng {"packages": ["./relative/path", …]}. failproofai ghi một mục mảng gói duy nhất trỏ vào thư mục pi-extension/ được đóng gói của nó. Phần mở rộng trội theo dõi các sự kiện tool_call / user_bash / input / session_start của Pi và lệnh shell tới failproofai --hook <Event> --cli pi; trình xử lý chính tắc hóa underscore_lower_snake_case → PascalCase thông qua PI_EVENT_MAP để các chính sách tích hợp sẵn hiện có kích hoạt không thay đổi. Các đối số đầu vào công cụ cũng được chính tắc hóa qua PI_TOOL_INPUT_MAP (Pi’s Read / Write / Edit giao path thay vì file_path; ánh xạ khóa cấp cao nhất cho phép block-env-filesblock-secrets-write kích hoạt — block-read-outside-cwd đã có một dự phòng path). Hỗ trợ Pi là beta trong khi API mở rộng Pi và bố cục nhật ký phiên ổn định.
    • Gemini CLI (beta): ~/.gemini/settings.json (người dùng), <cwd>/.gemini/settings.json (dự án) — Gemini không có phạm vi local (nó ghi lại một phạm vi system tại /etc/gemini-cli/settings.json mà failproofai không hiển thị). Các mục hook sử dụng hình thức {type, command, timeout} của Claude được bao bọc trong lược đồ bộ khớp {matcher, hooks: [...]} của Gemini với matcher: "*" theo mặc định. Các sự kiện là PascalCase (SessionStart, BeforeAgent, AfterAgent, BeforeModel, AfterModel, BeforeToolSelection, BeforeTool, AfterTool, PreCompress, Notification, SessionEnd); trình xử lý ánh xạ tới các tên canonical Claude qua GEMINI_EVENT_MAP. Tên công cụ là snake_case (run_shell_command, read_file, write_file, replace, …) — trình xử lý chính tắc hóa qua GEMINI_TOOL_MAP để các chính sách tích hợp sẵn hiện có kích hoạt không thay đổi. Đánh giá chính sách phát ra hình dạng phẳng {decision: "deny", reason} của Gemini (ưa thích theo “Golden Rule” hợp đồng exit-0 của Gemini), {hookSpecificOutput: {hookEventName, additionalContext}} để tiêm bối cảnh trên BeforeAgent / AfterTool / SessionStart, và {decision: "block", reason} trên AfterAgent để sử dụng ngữ semantics retry-buộc. Hỗ trợ Gemini CLI là beta trong khi chúng tôi mở rộng độ bao phủ thực tế. Xem tài liệu hooks Gemini CLI.
  • policies-config.json — yêu cầu failproofai đánh giá chính sách nào và với những tham số nào (dùng chung trên tất cả các CLI agent)
Chuyển --cli claude|codex|copilot|cursor|opencode|pi|gemini để nhắm mục tiêu vào một agent cụ thể (cách nhau bằng dấu cách hoặc lặp lại cho bất kỳ tập hợp con nào):
failproofai policies --install --cli codex --scope project
failproofai policies --install --cli copilot --scope project
failproofai policies --install --cli cursor --scope project
failproofai policies --install --cli opencode --scope project
failproofai policies --install --cli pi --scope project
failproofai policies --install --cli gemini --scope project
failproofai policies --install --cli claude codex copilot cursor opencode pi gemini
Khi --cli bị bỏ qua, failproofai phát hiện CLI agent nào được cài đặt (which claude / which codex / which copilot / which cursor-agent / which opencode / which pi / which gemini):
  • Một CLI được phát hiện — tự động chọn CLI đó mà không cần nhắc.
  • Nhiều CLI được phát hiện trong terminal tương tác — hiển thị lời nhắc chọn đơn với phím mũi tên được nhóm thành một phần Detected (N) (với một hàng tổng hợp Install for all N detected + từng CLI được phát hiện riêng lẻ) và một phần Not installed (M) · install hooks ahead of time liệt kê mọi CLI được hỗ trợ chưa được phát hiện như một tùy chọn cài đặt phía trước (↑↓ để di chuyển, Enter để chọn, ^C để thoát). Luồng gỡ cài đặt chỉ hiển thị phần Detected.
  • Nhiều CLI được phát hiện trong lần chạy không tương tác (CI, không TTY) — cài đặt cho tất cả các CLI được phát hiện mà không cần nhắc.
  • Không có cái nào được phát hiện — quay trở lại claude, với cảnh báo rằng không tìm thấy nhị phân agent nào trong PATH; lệnh hook vẫn được ghi để nó kích hoạt ngay khi bạn cài đặt một lệnh.
Bạn có thể chỉnh sửa policies-config.json trực tiếp bất cứ lúc nào; các thay đổi có hiệu lực ngay lập tức trên sự kiện hook tiếp theo mà không cần khởi động lại.

Ví dụ: cấu hình cấp dự án có giá trị mặc định nhóm

Cam kết .failproofai/policies-config.json vào kho lưu trữ của bạn:
{
  "enabledPolicies": [
    "block-sudo",
    "block-rm-rf",
    "block-push-master",
    "sanitize-api-keys",
    "block-env-files"
  ],
  "policyParams": {
    "block-push-master": {
      "protectedBranches": ["main", "release", "hotfix"]
    }
  }
}
Mỗi nhà phát triển sau đó có thể tạo .failproofai/policies-config.local.json (gitignored) để ghi đè cá nhân mà không ảnh hưởng đến các đồng đội.