Token导航 LogoToken导航

Agent Skill · AI 工具

enforce-contract(执行合同)

enforce-contract 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要围绕仓库状态、代码变更或协作事项进行整理时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

enforce-contract 是AI 工具类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为只读;许可证为 MIT,第三方扫描已通过,按安装量在AI 工具类的 2,536 个 Skill 里排第 2,349。

总安装 233周安装 10GitHub Stars 2下载 82核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:enforce-contract(执行合同)
来源仓库:https://github.com/knowlet/skills
仓库路径:skills/enforce-contract
安装命令:
npx skills add https://github.com/knowlet/skills --skill enforce-contract
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。不同来源提供的安装方式可能略有差异;本站展示可直接复制的安装命令,安装前请核对来源页面。

skills.shnpx skills
npx skills add https://github.com/knowlet/skills --skill enforce-contract

这个 Skill 是做什么的

AI 工具类 Skill 用来扩展助手本身的能力,例如接模型、接检索、接外部服务。

enforce-contract 基于 Design by Contract 方法定义边界条件,极大降低 AI 生成代码的幻觉概率。它通过 @pre、@post 和 invariant 契约标注规范,明确调用者与实现者的责任划分。使用时需在单元测试前完成契约定义,并在提交代码前验证所有公开方法是否符合约定。

安装前请评估 Javadoc 注释对团队协作的影响,确保团队成员理解契约式编程范式转变。适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。

来源仓库内路径:skills/enforce-contract

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/knowlet/skills --skill enforce-contract;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它标注为只读,先用只读任务试一次,确认行为符合预期再扩大使用范围。

常见问题

6 条

enforce-contract 怎么安装?

在终端执行 npx skills add https://github.com/knowlet/skills --skill enforce-contract。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

enforce-contract 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

enforce-contract 需要什么权限?

权限级别是只读。该 Skill 主要提供规则、说明或参考内容,本身偏只读;真正读写文件、联网或执行命令仍取决于宿主 Agent 的任务。

enforce-contract 是免费的吗?

来源标注的许可证是 MIT。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

enforce-contract 用的人多吗?

公开数据是累计安装 233 次,近一周安装 10 次,下载 82 次,GitHub 2 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

enforce-contract 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 3 个目录同时收录,说明这个 Skill 流传比较广。
  • 许可证明确为 MIT,商用和分发边界好判断。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理AI 工具类任务、又不想每次都手写提示词的人。
  • 需要许可证清楚、并且有第三方扫描结果的团队项目。

不太适合

  • 需要厂商级技术支持和 SLA 的生产系统。

AI 工具类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
executing-plans

执行计划 · Codex、Claude

1,515,336173,110只读MIT通过
verification-before-completion

完成前的验证 · Codex、Claude

1,319,472173,121权限未标注MIT通过
subagent-driven-development

子 Agent 驱动开发 · Codex、Claude

1,312,416173,138只读MIT通过
copy-editing

复制编辑 · Codex、Claude

1,209,57625,632只读MIT通过
paywall-upgrade-cro

付费专区升级 cro · Codex、Claude

1,030,17625,617只读MIT通过
enforce-contract

执行合同 · 本页

2332只读MIT通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Enforce Contract Skill

觸發時機

  • 編寫單元測試前
  • 實作 analyze-frame 產出的規格時
  • 代碼提交(commit)前
  • 實作新方法時
  • AI 生成代碼後的驗證

核心任務

透過 Design by Contract 明確定義每個方法的邊界條件,極大化減少 AI 幻覺。

契約式設計三要素

1. Pre-conditions(前置條件)

  • 定義:呼叫方法前必須滿足的條件
  • 責任歸屬:呼叫者 (Caller) 的責任
  • 違反時:方法可以拒絕執行

2. Post-conditions(後置條件)

  • 定義:方法執行完畢後保證成立的條件
  • 責任歸屬:被呼叫者 (Callee) 的責任
  • 違反時:表示方法實作有 bug

3. Invariants(不變量)

  • 定義:物件生命週期內始終成立的條件
  • 適用時機:任何公開方法呼叫前後
  • 違反時:表示物件狀態已損壞

契約標註格式

使用 Javadoc 標註

/**
 * 建立新訂單
 *
 * @param input 建立訂單的輸入參數
 * @return 建立成功的訂單資訊
 *
 * @pre input != null
 * @pre input.getCustomerId() != null
 * @pre input.getItems() != null && !input.getItems().isEmpty()
 * @pre 所有 items 的 quantity > 0
 * @pre 所有 items 的 productId 對應的商品存在
 *
 * @post result != null
 * @post result.getOrderId() != null
 * @post result.getStatus() == OrderStatus.CREATED
 * @post 訂單已持久化到資料庫
 * @post OrderCreatedEvent 已發布
 *
 * @throws CustomerNotFoundException 當 customerId 對應的客戶不存在
 * @throws ProductNotFoundException 當 productId 對應的商品不存在
 * @throws InsufficientInventoryException 當庫存不足
 */
public Output execute(Input input) {
    // 實作
}

使用程式碼驗證 Pre-conditions

public Output execute(Input input) {
    // ===== Pre-conditions =====
    Objects.requireNonNull(input, "input must not be null");
    Objects.requireNonNull(input.getCustomerId(), "customerId must not be null");

    if (input.getItems() == null || input.getItems().isEmpty()) {
        throw new IllegalArgumentException("items must not be empty");
    }

    for (OrderItemRequest item : input.getItems()) {
        if (item.getQuantity() <= 0) {
            throw new IllegalArgumentException(
                "quantity must be positive, got: " + item.getQuantity()
            );
        }
    }

    // ===== 主要邏輯 =====
    // ...

    // ===== Post-conditions (assert in development) =====
    assert result != null : "result must not be null";
    assert result.getOrderId() != null : "orderId must not be null";

    return result;
}

Entity/Aggregate 的 Invariants

範例:Order Aggregate

public class Order {
    private OrderId id;
    private CustomerId customerId;
    private List<OrderItem> items;
    private OrderStatus status;
    private Money totalAmount;

    /**
     * Order 的不變量:
     * @invariant id != null
     * @invariant customerId != null
     * @invariant items != null && !items.isEmpty()
     * @invariant totalAmount != null && totalAmount.isPositive()
     * @invariant status != null
     * @invariant 當 status == CANCELLED 時,不能再修改訂單內容
     */

    // 建構子必須建立有效狀態
    public Order(OrderId id, CustomerId customerId, List<OrderItem> items) {
        // Pre-conditions
        Objects.requireNonNull(id, "id must not be null");
        Objects.requireNonNull(customerId, "customerId must not be null");
        if (items == null || items.isEmpty()) {
            throw new IllegalArgumentException("items must not be empty");
        }

        this.id = id;
        this.customerId = customerId;
        this.items = new ArrayList<>(items);
        this.status = OrderStatus.CREATED;
        this.totalAmount = calculateTotal();

        // 驗證 invariants
        assertInvariants();
    }

    public void addItem(OrderItem item) {
        // Pre-conditions
        Objects.requireNonNull(item, "item must not be null");
        if (this.status == OrderStatus.CANCELLED) {
            throw new IllegalStateException("Cannot modify cancelled order");
        }

        // 執行變更
        this.items.add(item);
        this.totalAmount = calculateTotal();

        // Post-conditions & Invariants
        assertInvariants();
    }

    public void cancel() {
        // Pre-conditions
        if (this.status == OrderStatus.SHIPPED) {
            throw new IllegalStateException("Cannot cancel shipped order");
        }

        // 執行變更
        this.status = OrderStatus.CANCELLED;

        // Invariants
        assertInvariants();
    }

    private void assertInvariants() {
        assert id != null : "Invariant violated: id is null";
        assert customerId != null : "Invariant violated: customerId is null";
        assert items != null && !items.isEmpty() : "Invariant violated: items is empty";
        assert totalAmount != null && totalAmount.isPositive() :
            "Invariant violated: totalAmount is invalid";
        assert status != null : "Invariant violated: status is null";
    }
}

契約掃描檢查項目

必須檢查的項目

項目描述嚴重度
Null Check所有物件參數是否有 null 檢查🔴 嚴重
Empty Collection集合參數是否檢查 empty🟡 中度
Positive Numbers數量、金額等是否檢查正數🟡 中度
Valid State狀態轉換是否合法🔴 嚴重
Return Value回傳值是否可能為 null🟡 中度

掃描規則

contract_rules:
  pre_conditions:
    - rule: null_check_for_objects
      description: "物件型別參數必須有 null 檢查"
      pattern: "public.*\\(.*[A-Z]\\w+\\s+\\w+"
      check: "Objects.requireNonNull|!= null"

    - rule: empty_check_for_collections
      description: "集合型別必須檢查是否為空"
      applies_to: ["List", "Set", "Collection"]
      check: "isEmpty()|!.*\\.isEmpty()"

    - rule: positive_check_for_quantities
      description: "數量類型必須檢查大於零"
      applies_to: ["quantity", "amount", "count", "size"]
      check: "> 0|>= 1|isPositive"

  post_conditions:
    - rule: non_null_return
      description: "標註 @NonNull 的回傳值必須確保不為 null"

    - rule: state_consistency
      description: "狀態變更後 invariants 必須成立"

  invariants:
    - rule: aggregate_validity
      description: "Aggregate 必須定義 assertInvariants() 方法"
      applies_to: "Aggregate"

與測試的整合

契約驅動測試

class CreateOrderUseCaseTest {

    // ===== Pre-condition 測試 =====

    @Test
    @DisplayName("當 input 為 null 時,應拋出 NullPointerException")
    void should_throw_when_input_is_null() {
        // Given
        CreateOrderUseCase useCase = createUseCase();

        // When & Then
        assertThrows(NullPointerException.class, () -> {
            useCase.execute(null);
        });
    }

    @Test
    @DisplayName("當 items 為空時,應拋出 IllegalArgumentException")
    void should_throw_when_items_is_empty() {
        // Given
        Input input = new Input(customerId, Collections.emptyList(), address);

        // When & Then
        assertThrows(IllegalArgumentException.class, () -> {
            useCase.execute(input);
        });
    }

    // ===== Post-condition 測試 =====

    @Test
    @DisplayName("成功建立訂單後,應回傳有效的 OrderId")
    void should_return_valid_orderId_on_success() {
        // Given
        Input input = createValidInput();

        // When
        Output output = useCase.execute(input);

        // Then - 驗證 post-conditions
        assertNotNull(output);
        assertNotNull(output.getOrderId());
        assertEquals(OrderStatus.CREATED, output.getStatus());
    }

    @Test
    @DisplayName("成功建立訂單後,應發布 OrderCreatedEvent")
    void should_publish_event_on_success() {
        // Given
        Input input = createValidInput();

        // When
        useCase.execute(input);

        // Then - 驗證 post-condition
        verify(eventPublisher).publish(any(OrderCreatedEvent.class));
    }
}

檢查清單

實作新方法時

  • 是否定義並記錄 pre-conditions?
  • 是否在程式碼中驗證 pre-conditions?
  • 是否定義 post-conditions?
  • 是否有對應的測試案例?

實作 Entity/Aggregate 時

  • 是否定義 invariants?
  • 是否實作 assertInvariants() 方法?
  • 建構子是否建立有效狀態?
  • 所有公開方法是否維護 invariants?

代碼審查時

  • pre-conditions 是否足夠嚴謹?
  • 是否遺漏邊界條件?
  • 錯誤訊息是否足夠清楚?
  • 測試是否涵蓋所有契約?

AI 幻覺預防

透過契約式設計,可以有效減少 AI 幻覺:

  1. 明確邊界:AI 必須先定義什麼是有效輸入
  2. 強制思考:AI 必須考慮異常情況
  3. 可驗證性:契約可以被測試驗證
  4. 自我約束:AI 生成的代碼有明確的行為規範
契約完整度 ∝ 1 / AI 幻覺發生率

平台分布

trae

29.49%
按下载量换算24

Claude Code

24.19%
按下载量换算20

windsurf

19.13%
按下载量换算16

OpenCode

12.27%
按下载量换算10

Codex

7.54%
按下载量换算6

Antigravity

3.51%
按下载量换算3

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

只读

该 Skill 主要提供规则、说明或参考内容,本身偏只读;真正读写文件、联网或执行命令仍取决于宿主 Agent 的任务。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。

继续浏览同类 Skills