跳轉至
繁體中文 English

把 ToppleCat 加進 Java 專案

ToppleCat 0.2.0 已發布到 Maven Central。直接把 Gradle plugin 和 JUnit library 加進 現有專案即可,不必下載 ToppleCat 原始碼,也不用自己 build。

ToppleCat 的 runtime 與 Gradle/plugin 執行需要 JDK 21 或 25。發布的 artifact 以 Java 21 為 target,維護者的 release build 使用 JDK 25。使用端專案可以使用 Java 17、21 或 25 source target,但執行 JDK 必須是 21 或 25;只使用 JDK 17 執行 ToppleCat 不受支援。

目前不承諾 Gradle daemon JDK 與 consumer contract compiler JDK 不同的組合。 現有 custom contract compiler 使用 daemon 的 system compiler;要擴大這項承諾, 必須先有獨立且經測試的 compiler seam。

加入新的 LTS 時,會先加入 CI,再標示最舊的支援 runtime 為 deprecated;移除前必須有 文件化的 migration window 與 release boundary。相依套件升級若提高 Java floor,也遵循 同樣的相容性變更規則。

這一頁會帶你完成三件事:安裝 ToppleCat、讓 AI 能把已確認的規則寫成可執行檢查,並知道 功能完成後該用哪個指令驗證。

它在檢查什麼

結帳規則是:使用 SAVE100 優惠券時,訂單小計折 100 元。開發者先把規則寫成一般的 Java/JUnit 驗收方法:

@ToppleAcceptanceTest("AC-CART-COUPON")
@DisplayName("使用 SAVE100 折抵訂單小計")
void appliesCoupon(ToppleCase c, ToppleScenario scenario, CouponStage coupon) {
    scenario.given(coupon).a_payable_cart(c.input("cart", Cart.class));
    scenario.when(coupon).checks_out();
    scenario.then(coupon).receipt_shows_discount_and_discounted_subtotal(c);
}

JSON 或 YAML 案例列提供一台具體購物車,以及預期收到的收據。這個方法和案例列合在 一起,就是公開的可執行契約。實作 AI 可以讀它,也可以在開發時執行 ./gradlew test

正式驗證時,ToppleCat 會用審閱者另外選出的案例重跑同一個公開方法。AI 不需要先 知道那些案例,仍然可以照公開規則完成實作。

把 ToppleCat 和撰寫契約的 skill 加到專案

如果要讓實作 AI 和 ToppleCat 一起工作,要準備兩樣東西:

  • Gradle plugin 在 Java/JUnit 專案裡執行 ToppleCat。
  • topplecat-acceptance skill 告訴 AI,怎麼把你選定的驗收條件寫成 Java/JUnit 能執行的驗收方法與案例。

ToppleCat 的正式套件 已發布到 Maven Central。先在 settings.gradle.kts 設定 plugin marker 與 library 的來源:

pluginManagement {
    repositories {
        gradlePluginPortal()
        mavenCentral()
    }
}

dependencyResolutionManagement {
    repositories { mavenCentral() }
}

再到 build.gradle.kts 加入 plugin 與 JUnit dependencies:

plugins {
    java
    id("io.github.samzhu.topplecat") version "0.2.0"
}

dependencies {
    testImplementation("io.github.samzhu.topplecat:topplecat-junit:0.2.0")
    testImplementation("org.junit.jupiter:junit-jupiter:6.1.1")
    testRuntimeOnly("org.junit.platform:junit-platform-launcher:6.1.1")
}

tasks.test { useJUnitPlatform() }

接著,把這個 skill 安裝到 AI 要工作的專案:

npx skills@latest add samzhu/topplecat --skill topplecat-acceptance

在讓 agent 讀寫專案前,先讀 skill 原始碼。 它不會替你補寫需求。它會協助 AI 問清楚規則,再把你選定的規則綁成 ToppleCat 可以執行的 Java/JUnit 驗收內容。

和 AI 準備一次交付

ToppleCat 可以和任何 SDD 開發流程一起用。團隊原本怎麼談需求、寫 Spec、安排工作、叫 AI 實作,就照原本方式進行;那些事仍由你的工作流負責。ToppleCat 從你選定驗收條件後才加入: 它把條件寫成 Java/JUnit 可執行檢查,等 AI 說做完後再獨立驗證。

下面用 Matt Pocock 的 skills 示範一條完整流程。你使用別的 SDD 工作流也沒關係,照同樣的 ToppleCat 步驟即可。

先安裝需要的 skills

在 Codex 或其他 coding agent 裡,先把 Matt Pocock 的 skills 安裝到專案:

npx skills@latest add mattpocock/skills

安裝程式會讓你選 skill。請選 setup-matt-pocock-skillsto-specto-ticketsimplementimplement 收尾時會使用 code-review,所以不用把 code review 當成 ToppleCat 另外要求的一步。

每個專案第一次使用時,再在 agent 對話裡執行:

$setup-matt-pocock-skills

它會詢問這個專案的工作追蹤位置和領域文件放在哪裡。也要安裝前一節的 ToppleCat acceptance skill;兩組 skills 都準備好後,再開始這次交付。

在同一段對話裡寫規則和可執行檢查

假設規則是:可以結帳的購物車使用 SAVE100 時,折 100 元。在同一段對話中一起使用:

$to-spec + $topplecat-acceptance

$to-spec 會把對話中已經談妥的規則整理成 Spec。$topplecat-acceptance 會把你選定的 每一條 Acceptance Condition(AC)寫成 Java/JUnit 驗收方法和 ToppleCat 能執行的案例。 它會準備實作 AI 可以看的公開內容,也會另外準備給審閱者的內容。

規則有兩種可能意思時,先回答問題,不要讓 AI 自己選。例如,優惠券是否能套用到含有 排除商品的購物車?這種決定要由人寫回規則,skill 不能代替你決定。

這時你已經有寫下來的規則、公開的 Java 驗收程式和公開案例。下一步是看 Java 程式究竟 會檢查什麼。

在終端機裡:檢視準備好的驗收內容

Spec 和 Java 驗收程式準備好後,執行:

./gradlew toppleCatReview --spec specs/checkout/spec.md

toppleCatReview 是 Gradle 指令,不是 agent skill。它會產生只給審閱者看的 Spec Review 頁面。你可以把選定的 Spec、Java 驗收方法編譯出的 Given/When/Then 呈現,以及案例放在 一起閱讀。這份頁面沒有測試結果;它要回答的是「Java 程式寫的驗收內容,是否就是原本的 規則?」

Review 會執行它需要的 Check,所以主流程不用再列 toppleCatCheck。如果只想快速檢查 驗收方法和案例有沒有綁好,可以另外執行 ./gradlew toppleCatCheck --spec specs/checkout/spec.md

在 agent 對話裡:需要時才拆票

如果已確認的 Spec 有好幾塊可以分開完成的工作,使用 $to-tickets。它會產生可以各自 完成的工作票,並標示先後關係。小改動可以略過這一步,直接依 Spec 實作。

在終端機裡:實作前保護驗收內容

看完 Spec Review 後,執行:

./gradlew toppleCatSeal

Seal 會把只給審閱者看的原始碼移到本機保管區,並記錄當時完整的驗收內容與驗證設定。 接下來實作 AI 只會看到公開專案。之後正式驗證時,ToppleCat 可以檢查這些內容或政策是否 在 Seal 後被改動。

Seal 是內容完整性記錄,不是加密、作業系統隔離,也不是人已經接受最後交付。

在 agent 對話裡:實作已確認的工作

把 Spec 或 tickets 交給 $implement。它會在開發時使用專案原本的測試,並在收尾時使用 code-review。實作 AI 只根據公開驗收程式工作;不要把私人的 Spec Review、審閱者案例或 審閱者原始碼交給它。

AI 說完成後,回到終端機進行正式驗證。

驗證交付結果

實作 AI 說工作完成後,執行:

./gradlew toppleCatVerify

toppleCatVerify 會重跑公開契約、執行每一道已啟用的獨立檢查,並產生只給審閱者 看的 Verification Report。機器可讀的結論在 build/topplecat/evidence.json。這是 Gradle 指令,不是 agent skill。

審閱者若只想快速看這次交付,可以指定 Spec 或 AC ID;報告會清楚標示範圍。CI 應該使用不帶範圍的 toppleCatVerify,檢查完整契約。

根據證據做決定

PASS 表示封存政策要求的每一道檢查都在這次執行中通過。FAIL 表示某道完成的 檢查找到阻擋問題。INCOMPLETE 表示 ToppleCat 沒有取得足夠、可信的當次證據。

如果是指定 Spec 或 AC 的有限範圍驗證,PASS 只涵蓋那次指定的範圍。這些結果都不會替人 判斷原始業務規則是否完整。人要讀清楚跑了什麼、發生什麼,再決定是否接受交付。

準備導入專案時,接著讀把規則寫成可執行檢查。 要解讀報告時,讀ToppleCat 如何檢查交付