Community程式設計與開發github.com

zheref/ren

預設情況下,每個請求都在一個獨立的工作樹(worktree)中執行,並在繼續執行時重新檢查隔離性。暖機、編寫、驗證、在本地提交、處理啟動、產出報告並響鈴,然後等待。在儲存庫中使用 `$ren <request>` 或透過回合迴圈進行一般工作。Ren 由六個技能組成;它永遠不會推送或開啟 PR,並且僅在維護者呼叫 `$aka` 或 `$tensho` 時結束。

ren 是什麼?

Ren 是一個複合技能,專為需要嚴謹、隔離、回合制工作流程的開發者與 AI 代理設計。它以 '一個請求,一個回合' 的原則運作,確保每個任務都在一個隔離的 Git 工作樹中從頭開始執行,有助於維護乾淨、可驗證的變更歷史,避免不同工作之間的汙染。這在處理多個並行任務或需要高可靠性的專案時特別有用。Ren 本身不直接處理程式碼;它協調六個專門技能(暖機、編寫、驗證、提交、啟動和報告),並在回合開始時強制進行隔離檢查。它在 Cursor 和 Codex 等平台上作為預設工作流程,引導代理完成從暖機到報告的每個步驟,最後會發出一個可聽見的'鈴聲'來標記回合結束。關鍵的設計決定是它 '永遠不會推送或開啟 PR',確保完成的工作保持在本地,讓維護者完全掌控何時共享或整合變更。它支援 'fast'、'standard' 和 'thorough' 等配置檔案,以控制驗證深度(例如,跳過啟動或執行更廣泛的測試套件)。默認情況下,工作樹會基於遠端分支的最新狀態隔離建立,從而避免使用可能過時的本地分支,進一步增強隔離性。

相容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/zheref/hatsu/tree/HEAD/surfaces/codex/ren

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

共享政策位置: docs/DISCOVERY.md、docs/WORKFLOW.md、 docs/LAUNCH-MIGRATION.md、docs/STANDALONE-ENTRY.md、docs/PROCESS.md、docs/using/README.md 和 docs/using/mirrors.md 屬於已解析的 Hatsu 插件根目錄,而不是使用中的儲存庫。在已安裝的表面上,使用 ten 列印的絕對根目錄來讀取這些檔案(如果不可用,則透過該技能重新解析)。下方的相對連結標示原始位置;消費者缺少 docs/ 副本不是缺少政策,且不得觸發重複歸檔。絕不要在目標儲存庫中複製或發明第二個政策。

Ren — 一個請求,一個回合,每一次

沒有固定模式。 Ren 是一個複合運行:模式由 請求 決定 — 產品程式碼為 強化者,規範為 召喚者,機械為 轉化者 — 在該回合中持有,並在回覆中命名,同時在回合的報告步驟運行時,操控者 會與其一起命名。說明正在使用的模式,何時以及為何切換,絕不在一個標題下混合兩種模式(claude/agents/kurapika.md)。

接受請求。如果是第一個請求則進行暖機,編寫它、驗證它並提交它、處理啟動、向我顯示報告、響鈴一次。然後等待。

Ren 是本地平面中 一般工作的形狀。它不是批次執行器,也不是監視器:一次呼叫就是一個請求,一個請求就是一個回合。 迴圈是,下一個請求啟動下一個回合,而暖機步驟已經完成。

此檔案用於組合。它不會重新定義。 下面的每個步驟都是另一個技能的,已命名和連結,其程序、其退出碼反應、其拒絕和其殘留物都位於該技能中。如果您在此處找到一個實際上屬於該技能的規則,那它就在錯誤的檔案中 — 去它被撰寫的地方閱讀它,因為一個規則在兩個地方重述會在其中一個地方產生偏差。


1. 調用

P1 — 此次運行以 $ten ren 開頭(ten § 6 在其自己的名稱下處理此階段缺少的先決條件;此次運行呼叫的階段則跳過它們的先決條件)。

$ren <request> [--profile fast|standard|thorough]
nen parse ren --grammar "<request> [--profile <profile:fast|standard|thorough>]" \
  --line "<the request, minus the $ren prefix>"

profile: (clause absent) 表示 profile.default(§ 2a);請求中的 "fast turn" 或 "thorough turn" 字詞被視為相同的覆寫。

在 v0.3.0(docs/ab/ren.md § 2.1)即時驗證:一個請求行解析為 request: <the whole line>,退出碼 0,一個空行在退出碼 2 時拒絕 — " 是必需的,且該行未提供" — 並列印更正後的行。絕不會從會話上次執行的內容推斷出沒有請求的回合 — 它會以自由文字的形式被詢問:請求是維護者的話(行 missing-maintainer-choice,透過 nen stop answer 記錄,docs/WORKFLOW.md § 4 維護者的話永遠不會被推導出來),因此會話建議的任何解讀都會被列出以供參考,不會有星號標記,也不會是選擇器選項,並且回合將根據維護者輸入的內容運行。

Ren 也是預設的形狀,而不僅僅是顯式呼叫。 在一個其 nen/workflow.json 描述了此迴圈的儲存庫中,來自維護者的普通請求 就是 一個 ren 回合;在第一個上說明這一點,這樣在最後的報告和鈴聲出現時,沒有人會感到驚訝。

2. 回合,按順序

#步驟擁有該步驟的技能為什麼在這裡
1暖機$breath在每個入口點綁定/重新驗證隔離,根據 WORKFLOW § 工作樹存在於何處,在 Ten 追趕或變更之前;在該簽出中,為每個新的努力分支進行暖機並證明一個新鮮分支 — 在觀察到的鉤子拒絕(HR-374)時,會話自己的工具工作樹。顯式繼續只會重用已驗證的努力擁有的工作樹。紅色的基礎是一個 G5,發生在編寫之前;其憲法檢查(breath § 4a)中的衝突條款也是如此,記錄在此步驟的分類賬條目中
2編寫變更$rasengan撰寫維護者要求的內容,基於此儲存庫聲明的堆疊:編輯、測試、文件以及其慣例要求的更新日誌 — 使用聲明的 iteration.checks 作為作者自己的回饋,在工作在他們面前時運行
3驗證並提交$kokusen在 完成 的樹上運行每個便宜的 iteration.checks 命令和聲明好的聚焦測試,紅色則拒絕;然後進行分類,詢問標記的內容,一個結構化的提交 — 僅限本地
4啟動$amaterasu一個隔離的努力報告乾燥運行命令並記錄 core launch deferred; explicit maintainer call required,然後 在不詢問的情況下 繼續,即使在串行模式下也是如此。沒有目標 → no launch target declared; skipped。核心啟動永遠不會將編寫或交付移出其綁定的工作樹
5報告$spiritual-message as turn頁面:已完成、挑戰、未交付、架構、截圖、確切的啟動命令、決策
6鈴聲$jutaisho(§ 1 決定頁面的詢問是否使其成為一個停止點)工作流程聲明的橫檔 — 只有在真正需要時才停止

步驟 2 本身就是變更,它在 2026-09-10 不再是半數的步驟。 這個表格曾經有一個步驟 1.5 — "工作",不屬於任何技能 — 旁邊是一個名為 建立 的步驟 2,它將 rasengan 解讀為 運行構建命令 而不是 構建事物。維護者的裁決(docs/ROSTER.md HR-55)解決了這個問題:rasengan 就是編寫階段,因此工作有了一個技能,六個整數再次是六個技能,而編譯-然後-提交則與暫存樹的階段放在一起。

順序有五個關鍵點,而這五個是 ren 唯一斷言的事項:

  • 1 在 2 之前 — 在未經驗證的基礎上不進行編寫。 Breath 從 origin/<branch.base> 的最新獲取提示切出分支,並在其上證明聲明的檢查,因此變更的第一行落在一個已知已構建的樹上,任何人看到的第一個紅色是由此努力引起的。紅色基礎提示是一個 G5 停止點,發生在撰寫任何行之前;它永遠不會在此努力內部被修復。breath § 4a 的憲法檢查也是如此,其閘門在 breath § 6 中說明(WORKFLOW.md § 憲法檢查)。
  • 2 在 3 之前 — 不會提交未在此回合中編寫和在該回合中驗證的內容。 Rasengan 撰寫變更並保持其自身的內部迴圈誠實;kokusen 然後在 完成 的樹上運行聲明的檢查並在紅色時拒絕提交。兩次運行不是重複:在作者最後一次檢查之後,樹會隨著每一行文字的撰寫而移動,因此提交可以依賴的唯一運行是由持有索引的階段執行的。在一個回合迭代(撰寫、檢查、再次撰寫)的地方,它是步驟 2 與自身迭代,而步驟 3 只進入一次。
  • 3 在 4 之前。 啟動處理遵循已提交的結果;隔離不授權核心啟動。延遲的命令不是對此努力樹的演示。
  • 4 在 5 之前。 報告區分了延遲的乾運行命令與實際運行的 argv。
  • 5 在 6 之前。 鈴聲攜帶報告的連結。在頁面存在之前響起的鈴聲將維護者帶往虛無。

此複合體呼叫的階段會跳過其各自的 ## 0. Standalone entry 章節。 docs/STANDALONE-ENTRY.md 是針對手動在任意簽出中鍵入階段的契約;從此處達到的階段繼承此運行的 P1–P4 — 暖機、方向、變更集以及每個派生參數 — 重新派生它們將對此複合體已解決的問題產生第二個答案。每個階段會說明是哪個複合體正在持有它。

在步驟 1 內部,每個分類的努力執行一次,$direct 會運行 — 對於命名了一個 issue(請求中的 <CODE>#<N>)或已標記的文字分類的努力 — 使用此會話的 --surface、--model 和 --effort(在工具隱藏一個的情況下為 unread),完全如 build § 2b 所述;其 § 6 擁有比較和一次詢問,而鍵入的 $ren 已經是決定在此工作的決策,因此它 永遠不會阻塞。其答案 B 結束此 回合,而不是迴圈:步驟 5 和 6 仍然運行,並且報告命名了重啟行。沒有 job/ 標籤的努力是 undirectable,一行,然後回合繼續。它不是第七個步驟,也不斷言自身順序:它在暖機內部讀取,最多詢問一次,不編寫任何內容 — 而其 § 7 發布步驟 不在這裡運行:Ren 無法離開機器(§ 3),因此判決保留在報告和本地分類賬中,而 direct.publish 僅在 build、file(一旦歸檔)或獨立模式下運作。

暖機對每個努力運行一次;簽出選擇在每個入口點都被檢查。 後續回合和 PR 階段在步驟 2 或任何追趕之前,在 $hatsu_root/docs/WORKFLOW.md § 工作樹存在於何處 下重新驗證已綁定的絕對努力路徑。報告路徑、原始提示豁免狀態以及 Breath 是進行了暖機還是僅重新驗證。繼續永遠不會繞過隔離。

一個新的請求是一個新的努力,除非呼叫者明確繼續當前努力。 停留在來自先前努力的乾淨功能分支上不是繼續(zheref/hatsu#60;$breath § 2a)。Breath 仍然會運行,仍然會獲取配置的基礎,並且仍然會切出一個新渲染的分支。重用僅在顯式的 "continue" / "same effort" / "on this branch",或者對於其步驟 1 已在此會話中切出 此 分支的迴圈的第 2+ 次回合時進行。

當此努力的後續回合,或 $mukai,重新進入 $hanten 時,它會重用同一個週期分類賬 — .nen/hanten/<branch-slug>.cycle.json。修補不會重置審查者計數。Breath 切出一個新分支是唯一的新週期(zheref/hatsu#63;hanten § 2a)。

2a. 配置檔案與階段分類賬

nen/workflow.json 中的 profile.default 塑造回合(當缺失時為 standard);§ 1 的 --profile 覆蓋它,profile.allowed 之外的值會再次被詢問,並將允許列表作為選擇器的選項,而回合的第一行會說明正在使用的配置檔案。

配置檔案§ 2 中會發生什麼變化
fast步驟 1 驗證綁定;暖機仍然運行一次;步驟 2 和 3 按宣告執行;步驟 4 跳過,啟動行顯示 deferred by profile fast; isolation still requires an explicit maintainer core-launch call;步驟 5 渲染 --variant turn-fast
standard今天的回合,如上表所述
thoroughstandard,並且在步驟 3 之後,kotoamatsukami 的受影響套件會運行,在每個回合上

配置檔案決定哪些步驟運行以及步驟 5 渲染哪個變體,絕不會決定步驟內部發生什麼。 步驟 2 和 3 在每個配置檔案下都會按照其技能所說的運行。在 fast 下,受影響的套件不會運行(它們是 mukai 的,在那裡是步驟 4);在 thorough 下,kotoamatsukami 的受影響套件會在步驟 3 之後運行,ren 是該技能的第三個呼叫者。啟動會被跳過,而不是移動:mukai 沒有啟動步驟,而 amaterasu § 1a 說明了跳過啟動如何被處理。覆蓋率不會被任何 ren 配置檔案捕獲;那是 byakugan 的,在 mukai 那裡。

一個 landing(mukai)總是運行 thorough,無論其之前的回合命名了什麼。

每個步驟是一個分類賬條目(WORKFLOW.md § 努力的賬本 擁有機制;屬於 ren 的是哪些步驟以及何時進行)。在一個步驟之前,nen phase begin --effort <branch> --phase <step-name> --surface <s> [--model <reported-model>] --dial <level>;如果模型是工具報告的服務 ID,則添加 --note "model-kind=served; registry alias <alias>"(WORKFLOW § 努力的賬本);在第一個階段記錄時,如果曝露了工具標題/id,則 nen session record,每個會話一次;在一個步驟之後,nen phase end --effort <branch> --phase <step-name> --exit <code>,因此 .nen/phases/<effort>.json 每個階段攜帶一個計時條目,包括被拒絕的步驟。步驟 1 的 end 攜帶 breath § 4a 的記錄作為其 --note,與步驟 1 開始時的備註組合,因為 end --note 會取代它(腳本的 --begin-note;WORKFLOW § 憲法檢查,步驟 3、5 和 6,擁有這些形式)。該檢查不是它自己的條目,因此六個步驟仍然是六個條目(HR-58)。使用條目在步驟 5 中記錄:nen usage record --effort <branch> --surface <s> [--model] --dial <level> [--input] [--output] [--cache-read] [--cache-write] [--minutes] 來自表面自身的成本讀數,在不公開任何內容的表面上使用 --not-reported。

一個恢復的努力在寫入之前會先讀取(zheref/hatsu#444, zheref/hatsu#445;nen 0.28,固定的版本)。一個其分支已有階段分類賬或 PR 的努力,是恢復:首先,如果存在 PR — 開啟的那個:後繼者的編號,絕不是基礎刪除關閉的 PR(en § 6) — nen pr ledger read --target <owner/name> --pr <n> --effort <branch> --repo <checkout> --json,僅在 nen phase show 未找到本地分類賬時添加 --restore;然後 nen phase show --effort <branch> --json。WORKFLOW § 努力的賬本、持久切片,擁有判決和一個跳過行形式;跳過的 breath 條目的備註在步驟 2 之前被讀取(WORKFLOW § 憲法檢查,步驟 7)。按階段順序:以退出碼 0 結束 → **

…

[此處截斷以進行翻譯]

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相關技能