writing / 2026-09-19
One Claude Code config on every machine
A personal plugin marketplace for the skills, a plugin that pulls the global config at session start and pushes local edits back, and a review bot that lands clean pull requests.
Claude Code runs here on Windows clients, Linux clients and RHEL servers. Each has a global CLAUDE.md, a settings.json, some skills and commands, and each had drifted into a slightly different set. The old fix was copying by hand, or an Ansible role that pushed files out when someone remembered to run it. Neither noticed an edit made on one machine that never made it back.
A marketplace for the skills
Claude Code can install plugins from a marketplace, and a marketplace is just a git repo with a manifest listing its plugins. On 2026-09-18 a private repo became one. It now lists five plugins:
- workshop: the build-plan and shopcad-model skills behind the physical plans on this site;
- homelab-ops: the skill that submits LLM jobs to the homelab fleet;
- gpu-llm: a skill plus an MCP server for an on-demand local model on a gaming GPU;
- docs-tools: Mermaid diagrams and Obsidian Markdown;
- config-sync: the plugin that keeps everything else current.
Most started as loose skills in a dotfiles repo. The gpu-llm plugin existed only on one machine, in a commit that had never been pushed. It was pulled into the marketplace from that checkout and changed to reach its host by DNS name instead of an IP address that had already drifted.
Two sources of truth
The dotfiles repo is the source of truth for files: the global CLAUDE.md, settings.json, the skills that are not plugins, and the commands. The marketplace is the source of truth for plugins, and a plugin change ships by bumping its version. Per-project memory, settings.local.json, credentials and caches are never touched.
config-sync
The config-sync plugin, built on 2026-09-19, is a bash script and a SessionStart hook. Each session start it hashes every tracked item and applies what is safe. The network work (fast-forward the dotfiles checkout, update the marketplace, install or update every plugin it lists) happens at most once every 24 hours. When everything is in step, it prints nothing. When something needs a decision, it prints lines starting with config-sync:, and a skill in the same plugin tells Claude how to read and settle them.
The part that makes it safe is a small state file holding the hash last applied for each item. That turns every comparison into a three-way one:
- the repo moved and the local copy did not: apply it, silently;
- the local copy moved and the repo did not: report it and never overwrite it;
pushcarries the edit back to the repo so the other machines pick it up; - both moved: report a conflict;
--forceonapplyorpushpicks the winner.
settings.json is compared as JSON with key order ignored, so a reordered file does not count as an edit.
The script’s surface is small:
config-sync.sh status # what differs, changes nothing
config-sync.sh apply [--force] # pull, apply safe updates, update plugins
config-sync.sh push [-m msg] # fold local edits back, commit, push
config-sync.sh diff <key> # installed vs repo for one item
On a new machine the bootstrap is two lines, register the marketplace and install config-sync, then a restart. The first session’s hook clones the dotfiles repo and installs the global config and the other four plugins. Windows runs it under Git Bash.
The tests run fifteen checks against a throwaway home and dotfiles repo with a stubbed claude binary and no network. On the first real machine, status adopted all nine tracked items as already in step, and the first push carried a new section of the global CLAUDE.md back into the repo.
A review bot, later
On 2026-09-24 a GitHub Action was added to review every pull request that is not a draft, post an approve or request-changes verdict pinned to the head commit, and merge the clean ones. It merges only when the head has not moved, there is no no-automerge label, and nothing under the workflow or plugin directories changed. The first version reviewed with Claude; a follow-up the same night moved reviews to the free local model on the NanoClaw fleet so they stay on the LAN. Because the bot will not merge changes to its own workflow directory, the pull request that adds it needed a human to merge it.
What did not work
- The push-only Ansible role. It is kept as a fallback, but pushing config out cannot see edits made on the far end. Pulling at session start can.
- Writing the plugin into place. Claude Code’s auto mode refused to write the script and the hook file into the plugin directory, flagging it as self-modification. Staging them elsewhere and copying them in was allowed. The review bot hit the same wall on its merge script (“merge without review”) and was written only after the owner approved it outside auto mode.
- Test stubs in
/tmp./tmpis mountednoexecon the main server, so stub binaries placed there are silently skipped and the real one runs. For config-sync the stubs now run throughsh. For the review bot, the tests reached the real GitHub CLI, got a 422, and posted nothing;ghis now stubbed as a shell function.
What carries forward
A global edit now has one path: make it on any machine, push, and the rest converge at their next session start. A new tracked file is one case in the script and a version bump. The dotfiles repo’s copies of the skills that moved into plugins are still there, and come out once every machine runs config-sync.
すべてのマシンに1つのClaude Code設定を
スキル用の個人用プラグインマーケットプレイス、セッション開始時にグローバル設定を取得してローカル編集を戻すプラグイン、およびクリーンなプルリクエストを適用するレビュー bot。
Claude Code は Windows クライアント、Linux クライアント、RHEL サーバーのすべてで実行されます。それぞれにグローバル CLAUDE.md、settings.json、いくつかのスキルとコマンドがあり、それぞれがやや異なるセットに進化してきました。古い対処法は手動でのコピー、または誰かが実行を思い出したときにファイルをプッシュする Ansible ロールでした。どちらも、あるマシンで行った編集が他のマシンに反映されないことに気づいていませんでした。
スキルのマーケットプレイス
Claude Code はマーケットプレイスからプラグインをインストールできます。マーケットプレイスとは、プラグインを一覧表示するマニフェストが含まれた git リポジトリのことです。2026-09-18 にプライベートリポジトリが一つこのようなマーケットプレイスになりました。現在、5つのプラグインを一覧表示しています:
- workshop: このサイトの物理的なプランに背後にある build-plan と shopcad-model スキル;
- homelab-ops: ホメラボ艦隊に LLM ジョブを送信するスキル;
- gpu-llm: ゲーミング GPU 上でオンデマンドのローカルモデルを実行するためのスキルと MCP サーバー;
- docs-tools: Mermaid 図と Obsidian Markdown;
- config-sync: 他のすべてを最新に保つプラグイン。
これらの多くは、ドットファイルリポジトリ内にあったスキルから始まりました。gpu-llm プラグインは、一度もプッシュされなかったコミットの中に存在していました。このチェックアウトからマーケットプレイスに引き込まれ、IP アドレスではなく DNS 名でホストに到達できるように変更されました。
2つの真実の情報源
ドットファイルリポジトリはファイルの真実の情報源です:グローバル CLAUDE.md、settings.json、プラグインでないスキル、コマンド。マーケットプレイスはプラグインの真実の情報源であり、プラグインの変更はバージョンを上げることによって配信されます。プロジェクトごとのメモリ、settings.local.json、資格情報、キャッシュは一切変更されません。
config-sync
2026-09-19に構築されたconfig-syncプラグインは、bashスクリプトとSessionStartハックの組み合わせです。各セッションの開始時に、追跡されているすべてのアイテムのハッシュを計算し、安全に適用可能なものを適用します。ネットワーク関連の作業(dotfilesのチェックアウトをファストフォワード、マーケットプレイスを更新、リストされているすべてのプラグインをインストールまたは更新)は、最大24時間に1回行われます。すべてが同期されている場合、何も出力しません。何か決定が必要な場合は、config-sync:から始まる行を出力し、同じプラグイン内のスキルがClaudeにそれらを読み取り、解決する方法を教えるようにします。
安全にするための仕組みは、各アイテムに最後に適用されたハッシュを保持する小さな状態ファイルです。これにより、すべての比較は三つのケースに分類されます:
- レポジトリが更新され、ローカルコピーは更新されていない:静かに適用します;
- ローカルコピーが更新され、レポジトリは更新されていない:報告し、決して上書きしません;
pushは編集をレポジトリに戻すため、他のマシンがそれを取得します; - 両方とも更新されている:競合を報告します;
--forceはapplyまたはpushで勝者を選定します。
settings.jsonは、キーの順序を無視してJSONとして比較されるため、ファイルの順序が変わっただけでは編集とはみなされません。
スクリプトの表面的な部分は小さく、
config-sync.sh status # what differs, changes nothing
config-sync.sh apply [--force] # pull, apply safe updates, update plugins
config-sync.sh push [-m msg] # fold local edits back, commit, push
config-sync.sh diff <key> # installed vs repo for one item
新しいマシンでブートストラップを行うには、2行で、マーケットプレイスを登録し、config-syncをインストールしてから再起動します。最初のセッションのフックは、dotfilesリポジトリをクローンし、グローバルな設定とその他の4つのプラグインをインストールします。Windowsでは、Git Bashの下で実行されます。
テストでは、一時的なホームとdotfilesリポジトリに対して15のチェックを行い、スタブ化されたclaudeバイナリとネットワークなしで実行します。最初の実際のマシンでは、statusは9つの追跡項目すべてを既にステップに進んでいると採用し、最初のpushはグローバルなCLAUDE.mdの新しいセクションをリポジトリに戻しました。
後日、レビュー・ボット
2026-09-24に、GitHub Actionが追加され、ドラフトでないすべてのプルリクエストをレビューし、ヘッドコミットに承認または変更要求の判定をピン留めし、クリーンなプルリクエストをマージします。このアクションは、ヘッドが動いていない、no-automergeラベルがない、ワークフローまたはプラグインディレクトリ以下の変更がない場合にのみマージします。最初のバージョンではClaudeを使用してレビューを行いました。同日の夜に行われた後続の作業では、レビューをNanoClaw艦隊のローカルモデルに移し、それによりLAN内に保持されるようにしました。ボットは、自身のワークフロー・ディレクトリへの変更をマージしないので、このボットを追加するプルリクエストは、人間によるマージが必要でした。
うまくいかなかったこと
- プッシュ専用の Ansible ロール。 フォールバックとして保持されていますが、設定をプッシュして送信することはできません。遠方の端末で編集された内容は見えていないためです。セッション開始時にプルすることで確認できます。
- プラグインを配置する。 Claude Code の auto モードでは、スクリプトやホークファイルをプラグインディレクトリに書き込むことを拒否し、自己変更とみなして警告を出しました。他の場所に一時的に配置し、それをコピーして配置する方法は許可されました。レビュー bot は、同じように「レビューなしでマージ」するスクリプトで壁にぶつかり、所有者が auto モードの外で承認した後にのみ書き込まれました。
/tmpにおけるテストスタブ。/tmpはメインサーバーにnoexecとしてマウントされています。そのため、そこに配置されたスタブバイナリは静かにスキップされ、実際のバイナリが実行されます。config-sync ではスタブはshを経由して実行されます。レビュー bot に関しては、テストが実際の GitHub CLI に到達し、422 エラーを返され、何も投稿されませんでした。ghは今やシェル関数としてスタブ化されています。
進展する内容
グローバルな編集は今や1つのパスをとります:任意のマシンで編集を行い、push に変更を加え、他のマシンは次のセッション開始時に同期されます。新しい追跡ファイルはスクリプト内での1つのケースとバージョンアップの必要がある場合です。dotfiles レポジトリ内の、プラグインに移動したスキルのコピーはまだ残っており、各マシンが config-sync を実行するたびに反映されます。
모든 머신에 하나의 Claude Code 설정
기술용 개인 플러그인 마켓플레이스, 세션 시작 시 글로벌 설정을 끌어다 놓고 로컬 편집을 다시 밀어넣는 플러그인, 그리고 깨끗한 풀리퀘스트를 생성하는 리뷰 봇.
Claude Code는 Windows 클라이언트, Linux 클라이언트 및 RHEL 서버에서 실행됩니다. 각각은 전역 CLAUDE.md, settings.json, 일부 기술 및 명령어를 가지고 있으며, 각각은 약간 다른 세트로 발전해왔습니다. 이전의 해결책은 수동으로 복사하거나, 누군가 실행을 잊지 않고 실행할 때 파일을 밀어내는 Ansible 역할을 사용하는 것이었습니다. 하지만 이 방법은 한 대의 기계에서 이루어진 수정이 다른 기계로 돌아가지 않는 경우를 알아차리지 못했습니다.
기술의 시장
Claude Code는 플러그인을 시장에서 설치할 수 있으며, 시장은 단순히 플러그인을 나열하는 매니페스트가 있는 git 저장소일 뿐입니다. 2026-09-18에 개인 저장소가 하나가 되었습니다. 이제 이 시장은 다섯 개의 플러그인을 나열하고 있습니다:
- workshop: 이 사이트의 물리적 계획에 뒤따르는 build-plan 및 shopcad-model 기술;
- homelab-ops: homelab 대규모 컴퓨팅 클러스터에 LLM 작업을 제출하는 기술;
- gpu-llm: 게임용 GPU에서 수요에 따라 로컬 모델을 실행하기 위한 기술과 MCP 서버;
- docs-tools: Mermaid 다이어그램과 Obsidian 마크다운;
- config-sync: 나머지 모든 것을 최신 상태로 유지하는 플러그인.
대부분은 dotfiles 저장소에 있는 느슨한 기술로 시작했습니다. gpu-llm 플러그인은 한 대의 기계에만 존재했으며, 이 커밋은 아직도 푸시되지 않았습니다. 이 플러그인은 해당 체크아웃에서 시장으로 끌어들여졌고, 이미 드리프트된 IP 주소 대신 호스트의 DNS 이름을 통해 접근하도록 변경되었습니다.
두 가지 진실의 출처
dotfiles 저장소는 파일의 진실 출처입니다: 전역 CLAUDE.md, settings.json, 플러그인이 아닌 기술, 명령어. 시장은 플러그인의 진실 출처이며, 플러그인 변경은 버전을 업데이트함으로써 전달됩니다. 프로젝트별 메모리, settings.local.json, 자격 증명 및 캐시는 절대 변경되지 않습니다.
config-sync
2026-09-19에 작성된 config-sync 플러그인은 bash 스크립트와 SessionStart 훅입니다. 각 세션 시작 시마다 추적되는 모든 항목의 해시를 생성하고 안전하게 적용합니다. 네트워크 작업(도트파일 체크아웃을 빠르게 전진시키기, 시장 업데이트, 나열된 모든 플러그인을 설치하거나 업데이트)은 하루에 최대 한 번만 발생합니다. 모든 것이 동기화되면 아무것도 출력하지 않습니다. 결정이 필요한 경우 config-sync:로 시작하는 줄을 출력하고, 동일한 플러그인의 기능이 Claude에게 이를 읽고 해결하는 방법을 알려줍니다.
안전하게 만드는 부분은 각 항목에 대해 마지막으로 적용된 해시를 저장하는 작은 상태 파일입니다. 이는 모든 비교를 세 가지 요소를 고려한 비교로 바꿉니다:
- 저장소가 이동했지만 로컬 복사본은 이동하지 않았다면: 조용히 적용합니다;
- 로컬 복사본이 이동했지만 저장소는 이동하지 않았다면: 보고하고 절대 덮어쓰지 않습니다.
push는 편집 내용을 저장소로 되돌려 보내 다른 머신들이 이를 반영하도록 합니다; - 둘 다 이동했다면: 충돌을 보고합니다.
--force는apply또는push에서 승자를 결정합니다.
settings.json는 키 순서를 무시한 JSON으로 비교되므로, 파일의 순서가 바뀌었어도 편집으로 간주되지 않습니다.
스크립트의 표면은 작습니다:
config-sync.sh status # what differs, changes nothing
config-sync.sh apply [--force] # pull, apply safe updates, update plugins
config-sync.sh push [-m msg] # fold local edits back, commit, push
config-sync.sh diff <key> # installed vs repo for one item
새로운 기계에서 부트스트랩은 두 줄입니다. 시장에 등록하고 config-sync를 설치한 후 재시작합니다. 첫 번째 세션의 훅은 dotfiles 저장소를 복제하고 전역 설정과 다른 네 개의 플러그인을 설치합니다. Windows는 Git Bash에서 이를 실행합니다.
테스트는 네트워크 없이 스텁된 claude 이진 파일과 함께 임시 홈 디렉토리 및 dotfiles 저장소에 대해 15개의 점검을 수행합니다. 첫 번째 실제 기계에서 status은 추적된 9개 항목 모두가 이미 단계에 있다고 판단했고, 첫 번째 push는 전역 CLAUDE.md의 새로운 섹션을 저장소로 다시 가져왔습니다.
후에 리뷰 봇
2026-09-24에 GitHub Action이 추가되어, 드래프트가 아닌 모든 pull request를 검토하고, 헤드 커밋에 승인 또는 변경 요청 판정을 고정하며, 깨끗한 pull request는 병합합니다. 이 봇은 헤드가 이동하지 않았고, no-automerge 라벨이 없으며, 워크플로우 또는 플러그인 디렉토리 아래의 변경이 없는 경우에만 병합합니다. 첫 번째 버전은 Claude로 검토했고, 같은 날 밤에 NanoClaw 편대의 무료 로컬 모델로 검토를 이전하여 LAN 내에서 유지하도록 했습니다. 봇은 자신의 워크플로우 디렉토리에 대한 변경을 병합하지 않기 때문에, 이를 추가하는 pull request는 인간이 병합해야 했습니다.
작동하지 않은 사항
- Push-only Ansible role. 이 역할은 대체 수단으로 유지되지만, 설정을 원격으로 푸시하는 경우 원격에서 이루어진 편집은 확인할 수 없다. 세션 시작 시에는 끌어올 수 있다.
- 플러그인을 설치하는 과정. Claude Code의 자동 모드는 스크립트와 훅 파일을 플러그인 디렉터리에 쓰는 것을 거부하고, 이는 자가 수정으로 간주되었다. 다른 위치에 임시로 배치하고 그 후에 복사하는 것은 허용되었다. 리뷰 봇은 자신의 병합 스크립트(“리뷰 없이 병합”)에 동일한 문제를 겪었으며, 소유자가 자동 모드 외부에서 승인한 후에야 작성되었다.
/tmp의 테스트 스텁./tmp은 메인 서버에서noexec에 마운트되어 있기 때문에, 거기서 배치된 스텁 바이너리는 무시되고 실제 바이너리가 실행된다. config-sync의 경우 스텁은sh을 통해 실행된다. 리뷰 봇의 경우, 테스트는 실제 GitHub CLI에 도달했고 422 오류를 받았으며 아무것도 게시하지 않았다.gh는 이제 쉘 함수로 스텁 처리된다.
이어지는 내용
전역 편집은 이제 하나의 경로만 있다: 어떤 머신에서든 push에서 편집하고 나머지는 다음 세션 시작 시에 수렴한다. 새로운 추적 파일은 스크립트에서 하나의 사례로 나타나고 버전 업데이트가 필요하다. dotfiles 저장소에 있는 플러그인으로 이전된 스킬의 복사본은 여전히 존재하며, 모든 머신이 config-sync를 실행할 때마다 한 번씩 출력된다.
每台机器上都运行一个 Claude Code 配置
一个面向技能的个人插件市场,一个在会话开始时拉取全局配置并推送本地编辑的插件,以及一个能够生成干净拉取请求的审查机器人。
Claude Code 在 Windows 客户端、Linux 客户端和 RHEL 服务器上运行。每个都有一个全局 CLAUDE.md,一个 settings.json,一些技能和命令,而且每个都逐渐发展出略微不同的集合。旧的解决方法是手动复制,或者使用一个 Ansible 角色,当有人记得运行它时,将文件推送到其他机器。但这些方法都无法察觉在一台机器上做出的编辑,无法同步到其他机器。
技能的市场
Claude Code 可以从一个市场安装插件,而市场只是一个带有清单文件的 git 仓库,列出其中的插件。在 2026-09-18,一个私有仓库变成了市场。现在它列出了五个插件:
- workshop:网站上实体计划背后的 build-plan 和 shopcad-model 技能;
- homelab-ops:将 LLM 任务提交给家庭实验室舰队的技能;
- gpu-llm:一个技能加上一个 MCP 服务器,用于在游戏 GPU 上按需运行本地模型;
- docs-tools:Mermaid 图表和 Obsidian Markdown;
- config-sync:保持其他所有内容更新的插件。
大多数最初是 dotfiles 仓库中的松散技能。gpu-llm 插件只存在于一台机器上,且其提交从未被推送到远程仓库。它从该仓库的检出中被拉入市场,并被修改为通过 DNS 名称而不是已经漂移的 IP 地址来连接其主机。
两个真理来源
dotfiles 仓库是文件的真理来源:全局 CLAUDE.md、settings.json、非插件的技能以及命令。市场是插件的真理来源,插件的更改通过提升其版本号来发布。每个项目的内存、settings.local.json、凭证和缓存从不被修改。
config-sync
2026-09-19 构建的 config-sync 插件是一个 bash 脚本和一个 SessionStart 钩子。每次会话开始时,它会对每个跟踪项进行哈希处理,并应用安全的操作。网络操作(快速前向 dotfiles 检出、更新市场、安装或更新它列出的每个插件)最多每 24 小时发生一次。当所有内容都同步时,它不会输出任何内容。当某些内容需要决策时,它会输出以 config-sync: 开头的行,而同一插件中的一个技能会告诉 Claude 如何读取和解决这些行。
使其安全的部分是一个小状态文件,其中保存了每个项目最后一次应用的哈希值。这将每个比较转换为一个三方比较:
- 仓库更新了,而本地副本没有更新:静默地应用更新;
- 本地副本更新了,而仓库没有更新:报告此情况,并且永远不会覆盖本地副本;
push会将更改带回仓库,这样其他机器可以获取到这些更改; - 两者都更新了:报告冲突;
--force在apply或push上选择胜出者。
settings.json 作为 JSON 进行比较,忽略键的顺序,因此重新排序的文件不会被视为编辑。
脚本的表面很简单:
config-sync.sh status # what differs, changes nothing
config-sync.sh apply [--force] # pull, apply safe updates, update plugins
config-sync.sh push [-m msg] # fold local edits back, commit, push
config-sync.sh diff <key> # installed vs repo for one item
在新机器上,引导过程只有两行,注册市场并安装 config-sync,然后重启。第一个会话的钩子会克隆 dotfiles 仓库并安装全局配置和其他四个插件。Windows 下是在 Git Bash 中运行的。
测试使用一个临时的 home 和 dotfiles 仓库运行十五项检查,其中使用了模拟的 claude 二进制文件,并且没有网络连接。在第一台真正的机器上,status 将所有九个跟踪项都标记为已处于步骤中,而第一个 push 将全局 CLAUDE.md 的新部分带回了仓库。
后续的审查机器人
2026-09-24 添加了一个 GitHub Action,用于审查所有非草稿的拉取请求,在头部提交中添加批准或请求更改的结论,并合并干净的拉取请求。它只在头部未移动、没有 no-automerge 标签、并且工作流或插件目录下的内容没有更改时才进行合并。第一个版本使用 Claude 进行审查;同一天晚些时候,审查工作转移到了 NanoClaw 队列上的本地免费模型,以确保它们保留在局域网中。由于机器人不会合并对其自身工作流目录的更改,因此添加它的拉取请求需要人工进行合并。
未成功的工作
- 仅推送的 Ansible 角色。 它作为后备方案保留,但推送配置无法看到远端所做的更改。在会话开始时拉取可以。
- 将插件写入到位。 Claude Code 的自动模式拒绝将脚本和钩子文件写入插件目录,将其标记为自我修改。将它们暂存到其他位置然后复制进去是允许的。审查机器人在它的合并脚本(“无需审查的合并”)上遇到了同样的问题,只有在所有者在自动模式之外批准后才被编写。
- 在
/tmp中的测试桩。/tmp挂载在主服务器的noexec上,因此放置在那里的桩二进制文件会被静默跳过,实际的程序会运行。对于 config-sync,桩现在通过sh运行。对于审查机器人,测试达到了真正的 GitHub CLI,得到了 422 错误,并且没有发布任何内容;现在gh被作为 shell 函数进行桩处理。
延续的内容
现在全局编辑只有一条路径:在任意机器上进行修改,push,其余部分将在下次会话启动时进行收敛。一个新的被跟踪的文件是脚本中的一种情况和版本号的提升。dotfiles 仓库中那些已移动到插件中的技能的副本仍然存在,并且在每台机器运行 config-sync 时会再次出现。
Una configuración de Claude Code en cada máquina
Un mercado de plugins personalizado para las habilidades, un plugin que extrae la configuración global al inicio de la sesión y empuja los cambios locales de vuelta, y un bot de revisión que realiza solicitudes de extracción limpias.
Claude Code se ejecuta aquí en clientes de Windows, clientes de Linux y servidores RHEL. Cada uno tiene un global CLAUDE.md, un settings.json, algunas habilidades y comandos, y cada uno se ha desviado ligeramente hacia un conjunto diferente. La antigua solución era copiar a mano, o un rol de Ansible que enviaba archivos cuando alguien recordaba ejecutarlo. Ninguna de estas soluciones notaba un cambio hecho en una máquina que nunca regresaba.
Un mercado para las habilidades
Claude Code puede instalar plugins desde un mercado, y un mercado es simplemente un repositorio git con un manifiesto que enumera sus plugins. El 2026-09-18 un repositorio privado se convirtió en uno. Ahora enumera cinco plugins:
- workshop: las habilidades build-plan y shopcad-model detrás de los planes físicos en este sitio;
- homelab-ops: la habilidad que envía trabajos de LLM a la flota de homelab;
- gpu-llm: una habilidad más un servidor MCP para un modelo local a demanda en una GPU de juego;
- docs-tools: diagramas Mermaid y Markdown de Obsidian;
- config-sync: el plugin que mantiene todo lo demás actualizado.
La mayoría comenzaron como habilidades sueltas en un repositorio de dotfiles. El plugin gpu-llm existía solo en una máquina, en un commit que nunca se había empujado. Fue extraído del mercado desde ese checkout y cambiado para alcanzar su host por nombre de DNS en lugar de una dirección IP que ya se había desviado.
Dos fuentes de verdad
El repositorio de dotfiles es la fuente de verdad para los archivos: el global CLAUDE.md, settings.json, las habilidades que no son plugins y los comandos. El mercado es la fuente de verdad para los plugins, y un cambio en un plugin se envía incrementando su versión. La memoria por proyecto, settings.local.json, credenciales y cachés nunca se tocan.
config-sync
El plugin config-sync, construido el 2026-09-19, es un script de bash y un SessionStart hook. Cada inicio de sesión, genera un hash de cada elemento rastreado y aplica lo que sea seguro. El trabajo de red (adelantar el checkout de dotfiles, actualizar el mercado, instalar o actualizar cada plugin que enumere) ocurre como máximo una vez cada 24 horas. Cuando todo está al día, no imprime nada. Cuando algo requiere una decisión, imprime líneas que comienzan con config-sync:, y una habilidad en el mismo plugin le dice a Claude cómo leerlas y resolverlas.
La parte que lo hace seguro es un pequeño archivo de estado que contiene el hash aplicado por última vez para cada elemento. Eso convierte cada comparación en una de tres maneras:
- el repositorio se movió y la copia local no lo hizo: aplícalo, en silencio;
- la copia local se movió y el repositorio no lo hizo: reporta esto y nunca sobrescríbalo;
pushlleva el cambio de vuelta al repositorio para que las otras máquinas lo recojan; - ambos se movieron: reporta un conflicto;
--forceenapplyopushelige al ganador.
settings.json se compara como JSON ignorando el orden de las claves, por lo tanto, un archivo reordenado no se considera un cambio.
La superficie del script es pequeña:
config-sync.sh status # what differs, changes nothing
config-sync.sh apply [--force] # pull, apply safe updates, update plugins
config-sync.sh push [-m msg] # fold local edits back, commit, push
config-sync.sh diff <key> # installed vs repo for one item
En una nueva máquina, el arranque es de dos líneas: registrar el mercado y instalar config-sync, luego un reinicio. El primer hook de la sesión clona el repositorio de dotfiles e instala la configuración global y los otros cuatro plugins. Windows lo ejecuta bajo Git Bash.
Las pruebas realizan quince verificaciones contra un home y un repositorio de dotfiles de uso temporal con un binario de claude estubado y sin conexión a red. En la primera máquina real, status adoptó los nueve elementos seguidos como ya en paso, y la primera push llevó una nueva sección de la configuración global CLAUDE.md de vuelta al repositorio.
Un bot de revisión, más tarde
El 2026-09-24 se añadió una acción de GitHub para revisar cada solicitud de extracción que no sea un borrador, publicar un veredicto de aprobación o solicitar cambios anclado al commit principal y fusionar las limpias. Solo fusiona cuando el head no haya cambiado, no haya etiqueta no-automerge y nada bajo los directorios de workflow o plugin haya cambiado. La primera versión revisó con Claude; una actualización la misma noche movió las revisiones al modelo local gratuito en la flota de NanoClaw para que permanezcan en la LAN. Debido a que el bot no fusionará cambios en su propio directorio de workflow, la solicitud de extracción que lo añade necesitó una persona para fusionarla.
Lo que no funcionó
- El rol de Ansible de solo envío. Se mantiene como un respaldo, pero enviar la configuración no puede ver los cambios realizados en el extremo remoto. Al hacerlo al inicio de la sesión, sí se pueden ver.
- Escribir el plugin en su lugar. El modo automático de Claude Code se negó a escribir el script y el archivo de enlace en el directorio del plugin, marcándolo como modificación propia. Colocarlos en otro lugar y copiarlos dentro fue permitido. El bot de revisión se encontró con el mismo problema en su script de fusión (“fusionar sin revisión”) y solo fue escrito después de que el propietario lo aprobó fuera del modo automático.
- Estilos de prueba en
/tmp./tmpse montanoexecen el servidor principal, por lo tanto, los binarios de prueba colocados allí se omiten silenciosamente y se ejecuta el real. Para config-sync, los estilos ahora se ejecutan a través desh. Para el bot de revisión, las pruebas llegaron al cliente real de GitHub, obtuvieron un 422 y publicaron nada;ghahora se finge como una función de shell.
¿Qué se lleva hacia adelante
Un cambio global ahora tiene un solo camino: hacerlo en cualquier máquina, push, y el resto convergerá en su próximo inicio de sesión. Un nuevo archivo rastreado es un caso en el script y un incremento de versión. Las copias del repositorio de dotfiles de las habilidades que se movieron a plugins aún están allí, y se mostrarán una vez que cada máquina ejecute config-sync.
Eine Claude Code-Konfiguration auf jedem Rechner
Ein persönlicher Plugin-Marktplatz für die Skills, ein Plugin, das bei Session-Start die globale Konfiguration abruft und lokale Änderungen zurücksendet, und ein Review-Bot, der saubere Pull-Requests landet.
Claude Code läuft hier auf Windows-Clienten, Linux-Clienten und RHEL-Servern. Jeder hat eine globale CLAUDE.md, eine settings.json, einige Fähigkeiten und Befehle, und jeder hatte sich in eine leicht unterschiedliche Menge entwickelt. Das alte Fix war manuelles Kopieren oder eine Ansible-Rolle, die Dateien verteilt hat, wenn jemand daran erinnert wurde, sie auszuführen. Beides bemerkte keine Änderung, die auf einem Gerät vorgenommen wurde, die nie zurückkehrte.
Ein Marktplatz für die Fähigkeiten
Claude Code kann Plugins aus einem Marktplatz installieren, und ein Marktplatz ist einfach ein Git-Repo mit einer Manifestdatei, die seine Plugins auflistet. Am 2026-09-18 wurde ein privates Repo zu einem solchen. Es listet jetzt fünf Plugins:
- workshop: die build-plan- und shopcad-model-Fähigkeiten hinter den physischen Plänen auf dieser Seite;
- homelab-ops: die Fähigkeit, die LLM-Aufträge an die homelab-Flotte sendet;
- gpu-llm: eine Fähigkeit plus ein MCP-Server für ein auf Anfrage lokales Modell auf einem Gaming-GPU;
- docs-tools: Mermaid-Diagramme und Obsidian-Markdown;
- config-sync: das Plugin, das alles andere aktuell hält.
Die meisten begannen als lose Fähigkeiten in einem dotfiles-Repo. Das gpu-llm-Plugin existierte nur auf einem Gerät, in einem Commit, der nie gepusht wurde. Es wurde aus diesem Checkout in den Marktplatz gezogen und geändert, um seinen Host über einen DNS-Namen anstelle einer bereits veralteten IP-Adresse zu erreichen.
Zwei Quellen der Wahrheit
Das dotfiles-Repo ist die Quelle der Wahrheit für Dateien: die globale CLAUDE.md, settings.json, die Fähigkeiten, die keine Plugins sind, und die Befehle. Der Marktplatz ist die Quelle der Wahrheit für Plugins, und eine Änderung eines Plugins wird durch das Erhöhen seiner Version übertragen. Projektbezogene Speicher, settings.local.json, Anmeldeinformationen und Zwischenspeicher werden nie berührt.
config-sync
Der config-sync-Plugin, erstellt am 2026-09-19, ist ein Bash-Skript und ein SessionStart-Hook. Bei jedem Sitzungsstart hashiert er jedes verfolgte Element und wendet das Sicherere an. Die Netzwerkaktivitäten (dotfiles-Checkout beschleunigen, den Marketplace aktualisieren, jeden aufgelisteten Plugin installieren oder aktualisieren) finden maximal einmal alle 24 Stunden statt. Wenn alles im Einklang ist, gibt es nichts aus. Wenn etwas eine Entscheidung benötigt, gibt es Zeilen, die mit config-sync: beginnen, und eine Fähigkeit im selben Plugin erklärt Claude, wie diese gelesen und entschieden werden sollen.
Der Teil, der es sicher macht, ist eine kleine Zustandsdatei, die den zuletzt angewandten Hash für jedes Element enthält. Das verwandelt jede Vergleichsoperation in eine Dreier-Vergleichsoperation:
- Das Repo hat sich verändert und die lokale Kopie nicht: wende es an, still und leise;
- Die lokale Kopie hat sich verändert und das Repo nicht: melde es und überschreibe es nie;
pushträgt die Änderung zurück ins Repo, damit die anderen Maschinen sie aufnehmen; - Beide haben sich verändert: melde einen Konflikt;
--forceaufapplyoderpushwählt den Sieger.
settings.json wird als JSON verglichen, wobei die Reihenfolge der Schlüssel ignoriert wird, so dass eine umgeordnete Datei nicht als Änderung zählt.
Die Oberfläche des Skripts ist klein:
config-sync.sh status # what differs, changes nothing
config-sync.sh apply [--force] # pull, apply safe updates, update plugins
config-sync.sh push [-m msg] # fold local edits back, commit, push
config-sync.sh diff <key> # installed vs repo for one item
Auf einer neuen Maschine ist das Bootstrap-Verfahren zwei Zeilen: den Marketplace registrieren und config-sync installieren, gefolgt von einem Neustart. Der Hook der ersten Sitzung klont das dotfiles-Repo und installiert die globale Konfiguration sowie die anderen vier Plugins. Windows führt es unter Git Bash aus.
Die Tests führen fünfzehn Prüfungen an einem temporären Heimat- und dotfiles-Repo durch, mit einem gestubbeden claude-Binary und ohne Netzwerk. Auf der ersten echten Maschine übernahm status alle neun verfolgten Elemente als bereits im Schritt vorhanden, und der erste push brachte einen neuen Abschnitt der globalen CLAUDE.md zurück ins Repo.
Ein Review-Bot, später
Am 2026-09-24 wurde eine GitHub Action hinzugefügt, um jeden Pull Request zu überprüfen, der nicht als Entwurf markiert ist, und eine Genehmigung oder eine Anfrage zur Änderung an den Kopf-Commit anzuhängen, sowie die sauberen Pull Requests zu mergen. Es wird nur gemerged, wenn der Kopf-Commit nicht verschoben wurde, keine no-automerge-Beschriftung vorhanden ist und nichts unter den Verzeichnissen workflow oder plugin geändert wurde. Die erste Version überprüfte mit Claude; eine Folge am selben Abend wanderte die Überprüfung auf den kostenlosen lokalen Modell auf der NanoClaw-Flotte, damit sie im LAN bleiben. Da der Bot keine Änderungen an seinem eigenen workflow-Verzeichnis mergen wird, benötigte der Pull Request, der ihn hinzufügt, einen Menschen, um ihn zu mergen.
Was nicht funktioniert hat
- Der push-only Ansible Role. Er wird als Ausweichlösung beibehalten, aber das Pushen von Konfigurationen kann keine Änderungen am entfernten Ende erkennen. Das Pullen beim Start der Sitzung kann das jedoch.
- Das Schreiben des Plugins an die richtige Stelle. Der Auto-Modus von Claude Code weigerte sich, das Skript und die Hookdatei in das Plugin-Verzeichnis zu schreiben, da dies als Selbstmodifikation markiert wurde. Das Staging an einem anderen Ort und das anschließende Kopieren in das Zielverzeichnis war jedoch erlaubt. Der Review-Bot stieß auf die gleiche Wand in seinem Merge-Skript (“Merge ohne Review”) und wurde erst nachdem der Besitzer ihn außerhalb des Auto-Modus genehmigte, geschrieben.
- Teststubs in
/tmp./tmpwirdnoexecauf dem Hauptserver gemountet, sodass die dort platzierten Stub-Binärdateien stillgeschaltet werden und die echte Datei ausgeführt wird. Für config-sync laufen die Stubs nun durchsh. Für den Review-Bot erreichten die Tests das echte GitHub CLI, erhielten eine 422 und posteten nichts;ghwird nun als Shell-Funktion gestubbed.
Was weitergegeben wird
Ein globales Edit hat nun einen Pfad: es wird auf jedem beliebigen Gerät push vorgenommen, und der Rest konvergiert beim nächsten Start der Sitzung. Eine neue verfolgte Datei ist ein Fall im Skript und eine Versionserhöhung. Die Kopien der Fähigkeiten im dotfiles-Repository, die in Plugins verschoben wurden, sind immer noch vorhanden und werden einmal ausgeführt, sobald alle Geräte config-sync ausführen.