ClaudeMods
☰
ZH-TW
● 0 人在線上 · 瀏覽 0 次
贊助提交作品
GitHub 儲存庫 · 發布者 KilimcininKorOglu

config-parse

解析編輯或寫入觸及的每個 JSON、YAML、TOML 或 .env 文件,立即記錄解析錯誤,而不是在下一次建置時記錄,並在稍後的編輯修復該錯誤時再次說明。

KilimcininKorOglu@KilimcininKorOglu

KilimcininKorOglu/claude-code-mods/tree/main/plugins/config-parse

已翻譯

關於這個 mod

配置解析

package.json 中缺少的逗號或 YAML 檔案中的錯誤縮排在創建時不會產生任何費用;你會在下一次建置或服務拒絕啟動時發現,通常與導致它的編輯相距甚遠。該 mod 在編輯或寫入觸及每個 JSON、YAML、TOML 或 .env 檔案後立即解析它,並當場告訴模型有關解析錯誤的資訊。

它的作用

/config-parse                 on or off, the mode, and the files that do not parse
/config-parse on | off        on by default
/config-parse mode note       note only; the default
/config-parse mode deny       a commit, a push and a merge also stop while a file does not parse

Q。每次編輯或寫入引擎執行後,它都會查看路徑。解析 .json、.jsonc、.yml、.yaml、.toml、.env 或 .env.<name> 檔案;所有其他檔案都保持原樣。他們自己的工具讀取為帶有註釋的 JSON 的檔案(.jsonc、tsconfig*.json、jsconfig*.json、.vscode/*.json、devcontainer.json)可能包含 // 和 /* */ 註釋和尾隨號。所有其他 JSON 檔案都會被嚴格解析。 2。 JSON 由 mod 本身解析。逐行讀取 .env 檔案:非空、非註解、非 KEY=value(前面有 export 即可)的行是找出結果及其行號。 3。 YAML 和 TOML 由 python3(具有安全性載入程式的 yaml.load_all 和 tomllib.load)解析,檔案路徑以 one argv 專案傳遞。讀取 --- 流的每個文檔,並接受 !Ref 或 !vault 等應用程式標記,因為兩者都是有效的 YAML。如果 python 或模組遺失,則會話會跳過該類型,而 one 行會告訴你。 4。未解析的檔案將進入 two 通道。模型會收到一個 context 註釋,命名該檔案和錯誤。你會在 側邊欄 流中看到一個紅色條目(首先是文件,然後是錯誤,解析器名稱的位置(例如 line 2 或 (line 3, column 5),為黃色)),或者在側邊欄關閉時出現轉錄行。該檔案是相對於會話啟動的 git 儲存庫或儲存庫外部的會話目錄顯示的。這根目錄會在會話啟動時讀取一次,因為 Bash cd 會移動會話自己的目錄。 5。當稍後的編輯再次解析相同的檔案時,常設條目將被清除,並顯示一條綠線。該行僅適用於你,因為模型本身修復了文件。當發現的檔案被刪除時,它會在下一個測量中以相同的方式關閉,即 <file> is gone, and its parse error with it。存在但無法讀取的檔案會保留其發現結果。 6。它從不否認編輯。文件先寫入,後再讀取。 7。在每個主循環結束時再次測量模型未關閉的結果,剩下的任何內容都會到達模型,如 one 在下一個提示中註釋:

   config-parse: 1 file(s) still do not parse: package.json. Fix them.

即每回合 one 音符,而不是每提示 one。如果沒有它,結果就會在編輯時被說一次,然後就坐在窗格中,而模型卻忘記了它。你沒有讀到任何新內容,因為窗格已經顯示了相同的發現。 8。在 deny 模式下,當檔案無法解析時,它也會停止 git commit、git push 和 git merge。在停止 one 之前,它會再次解析每個開啟的文件,因此一旦模型修復了它們,該命令就會自行執行。 git commit 只回答它自己的檔案:mod 讀取索引 (git diff --cached --name-only -z) 並在沒有開啟的檔案時讓提交執行,one 行告訴你還有多少個開啟的檔案。 config-parse: 1 file(s) still do not parse: package.json. Fix them. Q 和 merge 沒有可供讀取的索引,因此每個發現都很重要。沒有繞過:--dry-run、--help 和 -h 通過,但損壞檔案的真正提交等待修復。 note 模式是預設模式,不會停止任何操作。

在即時檢查中,用尾隨逗號破壞的 JSON 檔案得到了註解 (Property name must be a string literal),用 a: 1: 2 破壞的 YAML 檔案得到了 python 錯誤,而 a: 1 的下一個寫入則用 parses as YAML again 結束了發現。

指令

/config-parse                 on or off, the mode, and the files that do not parse
/config-parse on | off        on by default
/config-parse mode note       note only; the default
/config-parse mode deny       a commit, a push and a merge also stop while a file does not parse

安裝

claude plugin marketplace add KilimcininKorOglu/claude-code-mods
claude plugin install config-parse@kilimcininkoroglu-mods

函數鉤子是搶先體驗的。 Claude Code 2.1.288 以及後來預設載入它們,所以沒有什麼可以打開的。

安裝後

1。使用 PyYAML 安裝 python3 以進行 YAML 檢查 (python3 -m pip install pyyaml)。 TOML 只需要 python 3.11 或更新版本。如果沒有它們,那些 two 類型將被跳過; JSON 和 .env 仍然有效。 2。重新啟動Claude Code。

它可以達到什麼

在 Claude Code 2.1.283 上使用 claude plugin validate 進行驗證:

❯ ./register.ts hooks: session.start, command.run{command=config-parse}, tool.call{tool=Edit}, tool.call{tool=Write}, turn.complete, prompt.submit, tool.call{tool=Bash}
❯ ./register.ts calls: $.command.register, $.fs.exists (via isGone), $.fs.read (via fileText), $.process.run (via pythonCheck, shownRootOf, stagedPaths), $.session.cwd, $.sidebar.clear (via closeOne), $.sidebar.set (via toPerson), $.store.get (via readSettings), $.store.set (via runCommand, setMode), $.ui.log

到達 L2:它讀取檔案並執行進程。

1. Reads:    the path of each Edit and Write, the command of each Bash call, and the text of the edited JSON and .env files, and each open file again at the turn's end
2. Runs:     python3 -c, by argv, on YAML and TOML files; git rev-parse --show-toplevel once at the session's start, to name files against the repository root; and git rev-parse --show-toplevel plus git diff --cached --name-only -z at a commit in deny mode
3. Sends:    the file name and the parse error to the model, and one more note with the next prompt while a finding stands; nothing leaves the machine
4. Persists: the on/off setting and the mode in $.store
5. Hostile input: the path comes from the tool call and reaches python as one argv item, never through a shell; the python program is fixed text and reads sys.argv[1]

限制

  • 檢查在寫入後執行,因此損壞的檔案一直存在,直到下一次編輯修復它為止。任何編輯都不會被拒絕;在 deny 模式下只有提交、推送和合併停止。
  • deny 模式沒有旁路。當無法修復問題時,可以使用 /config-parse mode note 關閉門。
  • git 指令透過包裝器、別名或腳本執行,當 git commit|push|merge 通過大門時,mod 無法讀取這些指令。
  • git commit -a、-am 和 -- 之後帶有路徑規範的提交不會縮小到索引,因為它們提交索引尚未儲存的檔案。每一個公開的發現都很重要。
  • 在命令執行之前讀取索引。文件在讀取和執行之間發生變化的提交是根據讀取時索引所保存的內容來衡量的。
  • 僅檢查 .env 線的形狀。錯誤的值、缺少的引號或重複的鍵都不是結果。
  • Mod 不知道其名稱下帶有註釋的 JSON 檔案是帶有註釋的 JSON(專案 1 列表之外的 .json 名稱)被報告為損壞,因為該名稱被嚴格讀取。- YAML和TOML需要python3;在沒有它的機器上,這些檔案永遠不會被檢查。
  • 在「編輯與寫入」之外進行的編輯(例如由 Bash sed 進行的編輯)不會被看到。

發展

make install     # eslint, typescript-eslint, typescript
make lint        # complexity limit 10, the build fails above it
make typecheck   # needs .claude/types/ from /plugin-types
make validate
make test        # claude plugin test

安裝

請先查看作者 README,確認 marketplace 與外掛名稱;指令可能隨儲存庫結構而變動。

claude plugin marketplace add KilimcininKorOglu/claude-code-mods
claude plugin install config-parse
原文 / README

config-parse

A missing comma in package.json or a bad indent in a YAML file costs nothing at the moment it is made; you find out at the next build, or when a service refuses to start, often far from the edit that caused it. This mod parses every JSON, YAML, TOML or .env file right after an Edit or Write touches it, and tells the model about a parse error on the spot.

What it does

  1. After each Edit or Write the engine ran, it looks at the path. A .json, .jsonc, .yml, .yaml, .toml, .env or .env.<name> file is parsed; every other file is left alone. Files their own tool reads as JSON with comments (.jsonc, tsconfig*.json, jsconfig*.json, .vscode/*.json, devcontainer.json) may hold // and /* */ comments and trailing commas. Every other JSON file is parsed strictly.

  2. JSON is parsed by the mod itself. A .env file is read line by line: a line that is not empty, not a comment and not KEY=value (an export in front is fine) is the finding, with its line number.

  3. YAML and TOML are parsed by python3 (yaml.load_all with a safe loader, and tomllib.load), with the file path passed as one argv item. Every document of a --- stream is read, and application tags such as !Ref or !vault are accepted, because both are valid YAML. If python or the module is missing, that kind is skipped for the session and one line tells you.

  4. A file that does not parse goes to two channels. The model gets a context note naming the file and the error. You get a red entry in the sidebar stream (the file first, then the error, with the position the parser names, such as line 2 or (line 3, column 5), in yellow), or a transcript line when the sidebar is closed. The file is shown relative to the git repository the session started in, or to the session's directory outside a repository. That root is read once at the session's start, because a Bash cd moves the session's own directory.

  5. When a later edit makes the same file parse again, the standing entry is cleared and a green line says so. That line goes to you only, because the model fixed the file itself. A file deleted while its finding stands closes the same way at the next measure, with <file> is gone, and its parse error with it. A file that is there but cannot be read keeps its finding.

  6. It never denies an edit. The file is written first, then read.

  7. A finding the model did not close is measured again at the end of each main-loop turn, and whatever is left reaches the model as one note with your next prompt:

    config-parse: 1 file(s) still do not parse: package.json. Fix them.
    

    That is one note per turn, not one per prompt. Without it the finding would be said once, at the edit, and then sit in the pane while the model forgot about it. You read nothing new, because the pane already shows the same finding.

  8. In deny mode it also stops git commit, git push and git merge while a file does not parse. Before stopping one it parses every open file again, so the command goes through by itself once the model fixed them. A git commit answers for its own files alone: the mod reads the index (git diff --cached --name-only -z) and lets the commit run when it holds none of the open files, with one line telling you how many still stand. A push and a merge have no index to read, so every finding counts there. There is no bypass: --dry-run, --help and -h pass, but a real commit of a broken file waits for the fix. note mode is the default and stops nothing.

In the live check a JSON file broken with a trailing comma got the note (Property name must be a string literal), a YAML file broken with a: 1: 2 got the python error, and the next Write of a: 1 closed the finding with parses as YAML again.

Command

/config-parse                 on or off, the mode, and the files that do not parse
/config-parse on | off        on by default
/config-parse mode note       note only; the default
/config-parse mode deny       a commit, a push and a merge also stop while a file does not parse

Install

claude plugin marketplace add KilimcininKorOglu/claude-code-mods
claude plugin install config-parse@kilimcininkoroglu-mods

Function hooks are early access. Claude Code 2.1.288 and later load them by default, so there is nothing to switch on.

After installing

  1. Install python3 with PyYAML for the YAML check (python3 -m pip install pyyaml). TOML only needs python 3.11 or newer. Without them those two kinds are skipped; JSON and .env still work.
  2. Restart Claude Code.

What it can reach

Validated with claude plugin validate on Claude Code 2.1.283:

❯ ./register.ts hooks: session.start, command.run{command=config-parse}, tool.call{tool=Edit}, tool.call{tool=Write}, turn.complete, prompt.submit, tool.call{tool=Bash}
❯ ./register.ts calls: $.command.register, $.fs.exists (via isGone), $.fs.read (via fileText), $.process.run (via pythonCheck, shownRootOf, stagedPaths), $.session.cwd, $.sidebar.clear (via closeOne), $.sidebar.set (via toPerson), $.store.get (via readSettings), $.store.set (via runCommand, setMode), $.ui.log

Reach L2: it reads files and runs a process.

1. Reads:    the path of each Edit and Write, the command of each Bash call, and the text of the edited JSON and .env files, and each open file again at the turn's end
2. Runs:     python3 -c, by argv, on YAML and TOML files; git rev-parse --show-toplevel once at the session's start, to name files against the repository root; and git rev-parse --show-toplevel plus git diff --cached --name-only -z at a commit in deny mode
3. Sends:    the file name and the parse error to the model, and one more note with the next prompt while a finding stands; nothing leaves the machine
4. Persists: the on/off setting and the mode in $.store
5. Hostile input: the path comes from the tool call and reaches python as one argv item, never through a shell; the python program is fixed text and reads sys.argv[1]

Limits

  • The check runs after the write, so a broken file exists until the next edit fixes it. No edit is ever denied; in deny mode only a commit, a push and a merge stop.
  • The deny mode has no bypass. When a finding cannot be fixed, you turn the gate off with /config-parse mode note.
  • A git command run through a wrapper, an alias or a script that the mod cannot read as git commit|push|merge passes the gate.
  • A git commit -a, a -am and a commit with a pathspec after -- are not narrowed to the index, because they commit files the index does not hold yet. Every open finding counts for those.
  • The index is read before the command runs. A commit whose files change between that read and the run is measured against what the index held at the read.
  • A .env line is checked for its shape only. A wrong value, a missing quote or a duplicate key is not a finding.
  • A JSON file with comments under a name the mod does not know as JSON with comments (a .json name outside the list in item 1) is reported as broken, because that name is read strictly.
  • YAML and TOML need python3; on a machine without it those files are never checked.
  • An edit made outside Edit and Write, for example by a Bash sed, is not seen.

Development

make install     # eslint, typescript-eslint, typescript
make lint        # complexity limit 10, the build fails above it
make typecheck   # needs .claude/types/ from /plugin-types
make validate
make test        # claude plugin test

更多類似作品