Communitygithub.com

wangnan0916/debug-mode-skill

與代理無關的除錯模式技能,支援本機 NDJSON 日誌收集。

debug-mode-skill 是什麼?

Debug Mode Skill 是一款與代理無關的除錯工具,專為需要臨時運行時儀器化來診斷問題的開發者設計。其核心是「假設驅動除錯循環」:使用者明確啟用後,AI 代理會讀取程式碼、重現細節和現有日誌,列出 2-5 個帶有 ID(如 H1、H2)的排序假設,然後透過在專用端點新增 3-8 個目標探針來區分這些假設。代理會等待使用者手動確認重現問題(A)、已修復(B)或其他情況(C),然後根據日誌證據判定假設為已確認、已拒絕或無結論,並僅在根因明確時進行最小修復。此技能支援 Node.js、Python、瀏覽器 JavaScript 等平台,並包含內建的本機 NDJSON 日誌收集器,可將日誌寫入作業系統暫存目錄,確保工作空間外安全。它嚴格禁止提交除錯日誌、秘密或個人資料,並要求事後使用清除清單移除所有暫時性儀器化。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add wangnan0916/debug-mode-skill

在你喜歡的 AI 中提問

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

說明文件

除錯模式

僅在使用者明確呼叫 debug-mode、$debug-mode、debug mode 或儀器化除錯後,才使用此技能。

如果使用者未明確選擇加入,請正常除錯。僅在暫時性執行時期儀器化能實質幫助時,才提及此技能。

核心循環

執行假設驅動的除錯循環:

  1. 閱讀相關程式碼、重現細節和現有日誌。
  2. 列出 2-5 個排序的假設,並帶有 ID,例如 H1、H2 和 H3。 每個假設必須預測執行時期探針將會顯示的結果。
  3. 啟動或重複使用迴路收集器(收集器合約)。
  4. 新增 3-8 個目標探針來區分這些假設。使用傳送至 DEBUG_URL + "/log" 的結構化事件,絕不使用 stdout/stderr。遵循下方的事件形狀、區域標記和輔助程式。
  5. 在人工檢查點停止。傳送檢查點範本。在使用者回覆 A、B 或 C 之前,不要分析、修復或移除探針。
  6. 在 A 之後,檢查列印出的 LOG_FILE,將每個假設分類為 CONFIRMED、REJECTED 或 INCONCLUSIVE,並且僅在日誌解釋了根本原因時,進行最小的修復。遵循下方的證據摘要。
  7. 讓探針在一次標記為 runId: "post-fix" 的修復後運行中保持啟用。
  8. 在使用者對修復後檢查點回覆 B 後,移除所有儀器化並執行相關檢查。遵循下方的清除清單。

嚴格規則

  • 絕不要在新增探針後跳過手動重現檢查點。
  • 絕不要在此技能啟用時憑猜測進行修復。
  • 絕不要在使用者確認修復後檢查之前移除探針。
  • 絕不要提交除錯日誌或暫時性儀器化。
  • 絕不要記錄機密、令牌、Cookie、授權標頭、API 金鑰、原始請求主體、可能包含私人資料的原始回應,或不必要的個人資料。

收集器合約

隨附的收集器特意設計為小巧:

  • GET /health 檢查現有收集器是否可重複使用。
  • POST /log 接受一個 JSON 物件,並以非同步方式附加一行 NDJSON。 驗證後回傳 200;該行在背景寫入。
  • 不同工作階段會寫入具有獨立佇列的個別檔案,因此寫入可以跨工作階段並行進行。
  • 日誌預設存放在作業系統暫存目錄下,位於工作空間之外。
  • --ensure 會列印 DEBUG_URL、SESSION_ID、LOG_DIR、LOG_FILE 和 HEALTH_URL。
  • 收集器在第一個事件時建立 LOG_FILE。不要在重現後對其執行 touch、預先建立、截斷或清除。
  • 收集器僅限迴路模式。不要將其綁定到 0.0.0.0 或任何公開介面。

使用以下方式啟動或重複使用:

node <skill-dir>/scripts/log-server.mjs --ensure --session <session_id> --host 127.0.0.1 --port 0

在封鎖本機連接埠監聽器的受管沙箱中,在首次嘗試時請求代理的正常核准。將原因限定為啟動或重複使用此僅限迴路的除錯收集器。

檢查點範本

新增探針後,停止並傳送此形狀,並使用實際的工作階段詳細資料:

我已新增除錯模式探針,收集器正在寫入:

- 工作階段:<session_id>
- 日誌檔案:<LOG_FILE>
- 除錯端點:<DEBUG_URL>/log

請手動重現錯誤,然後回覆:

A - 已重現
B - 已修復
C - 其他;請描述發生的情況

對於修復後驗證,僅更改開頭句子:

我為修復後驗證保留了除錯模式探針,收集器正在寫入:

- 工作階段:<session_id>
- 日誌檔案:<LOG_FILE>
- 除錯端點:<DEBUG_URL>/log

請手動驗證原始錯誤,然後回覆:

A - 已重現
B - 已修復
C - 其他;請描述發生的情況

將檢查點回覆視為一個小型狀態機:

  • 修復前的 A:讀取 NDJSON 日誌,分類假設證據,然後僅修復已確認的原因或新增更窄的探針。
  • 修復後的 A:錯誤仍然重現。讀取修復後的日誌並繼續使用更窄的假設或探針。
  • 修復前的 B:非終端狀態。將其視為錯誤在儀器化下未重現的證據,並要求澄清或更窄的重現步驟。
  • 修復後的 B:移除探針並執行最終檢查。
  • 任何時候的 C:將使用者的文字視為證據。調整重現步驟、假設或探針。

事件形狀

使用結構化、低容量的事件。典型事件看起來像:

{
  "session": "<session_id>",
  "runId": "pre-fix",
  "probe": "settings.beforePersist",
  "hypothesis": "H1",
  "file": "src/settings/save.ts",
  "fn": "saveSettings",
  "vars": {
    "enabled": true,
    "userId": "redacted"
  }
}

在修復前使用 runId: "pre-fix",在驗證時使用 runId: "post-fix"。對於高頻路徑,僅在狀態變更時記錄或積極取樣。

區域標記

包裹所有暫時性儀器化,以便清除可以機械化:

// #region DEBUG_MODE_PROBE <session_id> settings-before-persist
debugModeLog({
  probe: "settings.beforePersist",
  hypothesis: "H1",
  file: "src/settings/save.ts",
  fn: "saveSettings",
  vars: { enabled, userId: "redacted" },
});
// #endregion DEBUG_MODE_PROBE <session_id>

常見的註解形式:

// #region DEBUG_MODE_PROBE <session_id> ...    JavaScript、TypeScript、Java、C#、Go、Rust、C、C++
# #region DEBUG_MODE_PROBE <session_id> ...     Python、Ruby、Shell、YAML
<!-- #region DEBUG_MODE_PROBE <session_id> -->  HTML、Vue、Svelte
/* #region DEBUG_MODE_PROBE <session_id> */     CSS 和 C 風格區塊上下文
-- #region DEBUG_MODE_PROBE <session_id> ...    SQL、Lua

輔助程式

對於瀏覽器或前端 JavaScript,使用 assets/browser-log-helper.js 作為規範輔助範本。將其複製到儀器化的模組或腳本中,取代 <session_id> 和 <DEBUG_URL>,並保留函式名稱 debugModeLog。

對於 Node.js 或伺服器端 JavaScript,使用 assets/node-log-helper.js 作為規範輔助範本。將其複製到儀器化的模組或腳本中,取代 <session_id> 和 <DEBUG_URL>,並保留函式名稱 debugModeLog。

對於沒有第三方相依性的 Python:

# #region DEBUG_MODE_PROBE <session_id> debug-log-helper
import json
import urllib.request

DEBUG_MODE_URL = "<DEBUG_URL>/log"

def debug_mode_log(event):
    try:
        payload = {"session": "<session_id>", **event}
        data = json.dumps(payload).encode("utf-8")
        req = urllib.request.Request(
            DEBUG_MODE_URL,
            data=data,
            headers={"content-type": "application/json"},
            method="POST",
        )
        urllib.request.urlopen(req, timeout=0.5).close()
    except Exception:
        pass
# #endregion DEBUG_MODE_PROBE <session_id>

證據摘要

在 A 回覆後,在編輯程式碼之前摘要證據:

H1 設定狀態在 API 呼叫前遺失
狀態:CONFIRMED
證據:settings.beforePersist 記錄了 enabled=false,而 UI 事件記錄了 enabled=true。

H2 API 拒絕該值
狀態:REJECTED
證據:此次重現中沒有進行任何 API 呼叫。

下一步:修復 onToggle 和 saveSettings 之間的本機狀態傳遞。

如果每個假設都是 REJECTED 或 INCONCLUSIVE,則從不同的子系統產生新的假設並新增更窄的探針。不要憑感覺修補。

疑難排解

  • 空日誌:確認應用程式執行了儀器化的路徑、工作階段 ID 相符,且端點包含 /log。
  • 瀏覽器封鎖請求:檢查混合內容、CSP connect-src、擴充功能隔離或內容腳本上下文。
  • CORS/預檢問題:收集器處理 OPTIONS;如果仍然失敗,請嘗試 navigator.sendBeacon、同源開發伺服器代理程式或伺服器端儀器化。
  • 主機被拒絕:使用 127.0.0.1、localhost 或 ::1;絕不要綁定到 LAN 或公開介面。
  • 沙箱封鎖監聽器:使用此迴路收集器所需的核准重試一次。如果核准被拒絕,請說明本機收集被阻擋,並僅在存在安全的基於檔案的探針路徑時才回退。
  • 日誌過多:用更窄的狀態變更探針取代吵雜的探針。
  • 無法重現:詢問確切步驟、環境、輸入資料或螢幕錄製;不要憑空發明修復。

清除清單

在宣告任務完成之前:

  • 重新執行原始重現步驟或最接近可用的自動化檢查。
  • 移除每一對標記為 DEBUG_MODE_PROBE <session_id> 的區域。
  • 搜尋工作階段 ID、DEBUG_MODE_PROBE、#region DEBUG_MODE_PROBE 和 #endregion DEBUG_MODE_PROBE。
  • 移除位於列印出的 LOG_FILE 中的工作階段 NDJSON 日誌,或確認應將其保留作為本機證據。
  • 僅保留產品修復和任何實用的迴歸測試。

相關技能