Communityコーディング&開発github.com

EugineKosenko/majordom

ユーザーのプロジェクト内のOrg/MDファイルの散文を、~/.claude/rules/org-babel.mdに定義された書式規則に従ってチェック・修正します(~...~ / =...=マークアップ、頭字語の大文字・小文字、/.../用語集、実リンクとイタリック/プレーンテキストの区別、マークアップ間のスペース、末尾改行、桁揃えなど)。.org/.mdファイルの散文段落を編集した直後や、ユーザーが明示的にorgルールのチェック/リントを要求した際に、clippyの代わりとして積極的に使用します。

majordom とは?

このスキルは、Claude Codeエージェントが、Org形式またはMarkdown形式の散文ファイルに対して、`~/.claude/rules/org-babel.md`に文書化された書式規則を自動的に適用・チェックするためのものです。目的は、ユーザーが手動で個別のルールを記憶・再確認する負担を取り除き、編集後の散文を確実に一貫した形式に保つことです。 主な機能は、3段階のワークフローで構成されています。まず「Step 1: 機械的チェック」では、専用のPythonスクリプト(`lint.py`)を実行し、`~...~`や`=...=`マークアップの扱い、末尾改行の有無、不適切なファイルリンク、`#+begin_src`ブロックのパラメータ順序など、正規表現で検出可能な違反を機械的に特定・修正します。次に「Step 2: 手動チェックリスト」では、スクリプトでは捕捉できない、コード識別子と略語のマークアップの区別(`~...~` vs `=...=`)、頭字語の大文字・小文字ルール、同一ファイル内やファイル間の正しいリンク形式への変換、用語集へのリンクなど、より文脈依存のルールをエージェントが判断・調整します。最後に「Step 3: 桁揃え」では、Emacsの`fill-paragraph`機能を`emacsclient`経由で呼び出し、各行の長さを105文字以内に自動調整します。この際、`font-lock-ensure`を事前に実行することで、Orgファイルのリンクが正しく「折りたたまれた」状態で桁揃えが行われるよう保証します。 このスキルは、プロジェクト固有のルールを定義した設定ファイル(`~/.claude/rules/org-babel.md`)に依存します。ユーザーは事前にこの設定ファイルを配置しておく必要があります。対応プラットフォームはClaude Code(AIエージェント)であり、`.org`および`.md`ファイルを扱う開発環境全般で有用です。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/EugineKosenko/majordom/tree/HEAD/skills/org-lint

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

org-lint

.org/.mdファイルの散文書式ルール(~/.claude/rules/org-babel.mdに文書化)のためのリンターです。目的は、毎回手動で個々のルールを記憶(そして、ついさっき直したルールだけを修正して残りを忘れるリスク)に頼るのではなく、明示的なルールリストに対してテキストをチェックすることです。

使用タイミング

  • .org/.mdファイル内の散文段落を編集または新規作成した直後(結果をユーザーに表示する前に、各ルールを手動で再確認する代わりに)。
  • ユーザーから明示的に要求があった場合(「orgルールをチェックして」「リントを実行して」、またはclippyとの比較など)。
  • #+begin_src/#+begin_exampleブロック(コード)内の内容には適用しません。散文段落と見出しのみが対象です。

ステップ1 — 機械的チェック

編集したファイルに対してスクリプトを実行します。

python3 ~/.claude/skills/org-lint/scripts/lint.py ファイルパス.org

スクリプトは正規表現で以下を検出します。

  • ~...~/=...=の周りに空白がない/(例:~a~/~b~、正しくは~a~ / ~b~) — 確実な違反。
  • [[file:../ — 現在のディレクトリからの相対リンク。root: 省略形を使用すべき — 確実な違反。
  • ファイル末尾の改行なし — 確実な違反。
  • =...= 内の大文字の頭字語(例:=CSS=) — 要確認(稀な例外は許可)。
  • イタリック /単語/ — 要確認:これが本当にプロジェクト用語集の用語(spcfctn/glossary.org に対応するセクションがあるか?このファイル内の初出で用語集へのリンクがあるか?)なのか、それとも誤って変換されなかったセクション/ファイルへのリンク([[*セクション名][...]] であるべき)なのか。
  • =パス/ファイル.org= としてのファイル参照 — 要確認:実際の [[file:...]] リンクであるべきではないか。
  • 「パラメータ」(parameter)という単語 — 要確認:Rust/Yewコンポーネントのプロパティ(struct ...Props)について言及している場合、正しい訳語は「プロパティ」(properties)であり、「パラメータ」(parameters)は古い用語。Yewコンポーネント以外(関数パラメータ、CLI、REST手続きなど)では「パラメータ」でOK、変更しない。
  • :noweb-ref 定義 が :noweb-ref 宣言 よりも前のセクションにある — 要確認:ファイルを上から読んだ順で、宣言が最初に来るべき(org-babel.md参照)。
  • 同一の :tangle パス を持つ #+begin_src ブロックが複数あり、ファイル内に :noweb yes / <<...>> が全くない — 確実な違反(古い結合方法。古い gitignore.org のように。org-babel.md参照)。:tango + :noweb yes を持つ単一のコンテナブロックに <<名前>> プレースホルダと :noweb-ref 名前 セクションを使って書き直すこと。
  • ファイルが複数の異なるターゲットファイルにタングルされ、そのうち少なくとも2つが noweb を消費する(例:config.org → .env.example + parameters.php、スケルトン #+begin_src に :noweb yes を持つ)にもかかわらず、少なくとも1つの :noweb-ref/<<...>> ブロックがターゲットプレフィックスなしで命名されている(env:名前 ではなく 名前) — 確実な違反(org-babel.md、マルチターゲットorgファイルのプレフィックスルール参照)。単一ターゲットファイルの場合、および noweb を消費するターゲットが1つだけで、残りが自己完結型の単一ブロック :tangle ターゲット(<<...>> なし)であるファイル(例:gitignore.org:5つの :tangle ターゲットがあるが、ルートの .gitignore だけが noweb スケルトン経由) — プレフィックスは不要。実際のあいまいさがないため。
  • #+begin_src 行のパラメータの順序が間違っている — 確実な違反。正しい順序:ブロックタイプ → :noweb yes → :noweb-sep "..." → 残りのパラメータ → :tangle パス または :noweb-ref 名前(最後、org-babel.md参照)。
  • ファイル名が cargo.org — 確実な違反(Rustプロジェクトの古い名前。config.org にリネーム。org-babel.md参照)。
  • :tangle が絶対パス(/...、~/...)または上位ディレクトリ .. を使用している — 確実な違反(org-babel.md参照)。ターゲットはorgファイルからの純粋な下向き相対パスである必要がある。ターゲットが本当にソースツリーの外にある場合、../絶対パスではなく、symlink または別のディレクトリ構造が必要(事例:farba-override → farba-theme を ../farba-theme/... 経由、チケット FS-1085)。
  • =...= の外での大文字使用(例:NOT、ONLY) — 要確認:単語の強調であり、頭字語/略語でない場合、大文字ではなく org bold(*not*)に置き換える。
  • 「フック」(hook、React/Yewの訳語) — 古い用語。正しい訳語は「フック」(hook)のままとする(ただし、コード識別子 use_effect_with などは対象外。散文のみ)。
  • 105文字より長い散文行 — emacsclient 経由で fill-paragraph を実行する必要あり(下記参照)。

「確実な」検出結果は常に修正します。「手動確認が必要」なものは、それぞれ確認しますが、すべてがエラーとは限りません(例:=rest= / =forge-yew= は正当な略語/クレート名であり、違反ではありません)。

ステップ2 — 手動チェックリスト(スクリプトでは検出できないもの)

  • コード識別子/型/関数/変数/モジュール — および任意のコード断片や式(例:id=1、value == 0、items()) — チルダ ~...~。略語/頭字語およびクレート/ライブラリ名の「パブリック」形式(ハイフンを含む) — 等号 =...=。修飾パス クレート::型 はコードからの型名であるため、クレートプレフィックスが含まれていても全体をチルダで囲む。
  • 略語/頭字語 — 文の中では小文字、文頭のみ大文字(すべて大文字にはしない)。稀な確立された例外を除く。
  • 同一ファイル内のセクションへのリンク — [[*見出し名][名前]]。イタリックや単なるテキストではない。同一ディレクトリ内のファイルへのリンク — 単に [[file:隣のファイル.org][説明]]。別のディレクトリ内のファイル(特に共通のワークディレクトリ内の別のgitリポジトリ)へのリンク — root: 省略形を使用([[root:code/ads-back/ファイル.org::N][説明]])、../../../ のような現在のディレクトリからの相対パスは使用しない。省略形はワークディレクトリのルートにある .dir-locals.el で宣言される(eval フォーム、locate-dominating-file を使用)。プロジェクトにまだ存在しない場合は作成する。
  • イタリック /.../ — プロジェクト用語集の用語のみに使用(直後に (/translation/) を伴う)。各ファイル内で用語が最初に登場する箇所では、定義を繰り返すのではなく、[[file:.../spcfctn/glossary.org::*用語][...]] で該当セクションにリンクする。

ステップ3 — 桁揃え

編集した各段落に対して、手動で桁揃えをするのではなく、emacsclient --eval 経由で実際の fill-paragraph を呼び出します(org-babel.mdの該当ルール参照)。段落のテキストは new_string に、またはファイル作成時は1行で書き、自分で改行を推測しようとしないでください。fill-paragraph が改行を完全に決定します。

重要: fill-paragraph(または org-fill-paragraph)を呼び出す前に、必ず (font-lock-ensure) を実行してください。find-file-noselect でヘッドレスで開かれたバッファはフォント化が行われず、Orgリンク [[パス][説明]] が短い表示テキスト 説明 にまだ「折りたたまれていません」 — font-lock-ensure なしでは、fill-paragraph はリンクの表示幅ではなく、長い生テキストに基づいて改行を計算するため、結果がライブのインタラクティブEmacsで M-q を実行した場合と異なります。

例:

emacsclient --eval '
(let ((buf (find-file-noselect "ファイルパス.org")))
  (with-current-buffer buf
    (org-mode)
    (font-lock-ensure)
    (goto-char (point-min))
    (search-forward "段落内のユニークな文字列")
    (org-fill-paragraph)
    (save-buffer)))
'

Individual skills in this repo

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

EugineKosenko/majordom

Analyse a Figma .fig file kept in a project's spcfctn/ui/draft. Unpacks and decodes it offline (kiwi), breaks it into sections, screens, text rows and rasters, writes the analysis to spcfctn/ui/*.md, then fetches the author's comments through the figma MCP by link, binds them to screens by geometry, checks that the comments agree with the content of the file and asks the user to clarify what does not. Use when the user asks to analyse, decode or re-read a .fig file or Figma wireframes, or to refresh spcfctn/ui after a new export.

EugineKosenko/majordom

Керування сесіями claude-code-ide.el у живому Emacs через emacsclient headless — старт/continue/resume без блокуючих запитів, безпечна зупинка, перемикання permission-mode і auto-accept, навігація в інтерактивних picker'ах. Використовуй, коли сесія "Мажордом" має підняти, продовжити, зупинити чи інспектувати сесію claude-code-ide для іншого проєкту.

EugineKosenko/majordom

Scaffold a new component/command/crate in this user's literate org-babel Rust style (modeled on ads-back's crates/api and crates/cli patterns — one org file per command with a :tangle skeleton block, Декларації-before-Визначення/Дії noweb blocks, one heading per concern). Use whenever the user asks to add a new component, command, procedure, CLI subcommand, Yew component, module, or crate in an org-babel-literate Rust project (ads-back, ads-front, or similar), including wiring a brand-new crate's config.org/env.org/main.org into the workspace's federated config.org.

EugineKosenko/majordom

Bootstrap a new project in this user's standard layout — .claude-root, .dir-locals.el (root: org-link abbreviation), code/, spcfctn/code/ (with its own git repository) and a .claude/ directory with its own git repository and a CLAUDE.md that fixes the project's prose language and its short two-letter project code (chosen by the user from options the agent proposes) — and translate any files already present into that language. Use whenever the user asks to create, start, set up, initialise or "оформити" a new project (or to bring an existing bare directory to the standard layout).

関連スキル