Community研究&データ分析github.com

MinorBaek/wiki-lint

科学的なMarkdownウィキ(Obsidian互換)向けの診断・修復ツールキット。リンク、出典、フロントマター、テーブル、エンコーディング、合成ブロック、シールに関する33種類のヘルスチェックを提供します。

wiki-lint とは?

wiki-lintは、科学的なマークダウンウィキの品質を維持するための読み取り専用ヘルススキャンと3つの修復ツールを提供します。33のチェックにより、リンクの切れ、出典不足、フロントマターの不整合、テーブル構造の誤り、文字化け、合成ブロック(State-of-Knowledge)の更新漏れ、シールの欠落などを検出します。Windows、macOS、Linuxで同一動作し、Python標準ライブラリのみで構成されています。構成はすべてwiki.config.jsonに集約されているため、ウィキに新しいフィールドやフォルダが追加されてもロジックは変更する必要がありません。また、各チェックの存在理由はreferences/check-origins.mdに一元管理され、実行時には発火したチェックの理由が表示されるため、ノイズか本物かの判断を支援します。自己テスト機能により、変更後の動作保証が容易です。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/MinorBaek/science-wiki-kit/tree/HEAD/skills/wiki-lint

Installed? Explore more 研究&データ分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

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

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

ドキュメント

wiki-lint は何をしますか?

初回実行前に、キット内の docs/GOTCHAS.md(既知の誤検出、動作上の注意)をお読みください。

ウィキ(wiki_root in wiki.config.json)の読み取り専用ヘルススキャンと3つの修復ツールです。すべてPython標準ライブラリで構成され、Windows、macOS、Linuxで同一動作します。ウィキ固有のルール(フォルダ、ステータス分類、フィールドマップ、除外リスト、動詞リスト、プレースホルダーパターン、しきい値)はすべて設定ファイルに記述されているため、ウィキに新しいフィールド、フォルダ、チェックが追加されてもロジックは変更されません。3,000ノートを超えても高速に動作するよう設計されています(フル実行は数秒ですが、チェック13はその規模で約30秒かかります)。

関連スキル

  • wiki-ingest, wiki-ingest-book: このスキルがチェックするノートを作成します(ステータス判断とインデックスルーティングに同じ設定を使用)。
  • wiki-synthesize: チェック15がワークリストを作成し、チェック32がそのシールを監査します。
  • vocabulary-update: チェック30の修正手段です。

レイアウト

skills/wiki-lint/
  SKILL.md
  scripts/
    lint.py        # チェックの実行(--only, --out-dir, --self-test)
    fix.py         # 修復ツール:インデックス提案、チェック12のバックリンク、下書き昇格
  references/
    check-origins.md   # 各チェックの存在理由(単一の権威)
    cli-reference.md   # フラグ、設定キー、出力ファイル、レポート形式
wikikit/lint/        # 実装:context.py, checks_*.py, fixes.py, defaults.json
tests/fixtures/lint/ # すべてのチェックを実行する合成ミニウィキ + expected_counters.txt

各事実が存在する場所(これら間で重複しないこと):references/check-origins.md = チェックの存在理由;このファイル = 何をするか;wikikit/lint/checks_*.py = どのように実装されているか;tests/fixtures/lint/expected_counters.txt = フィクスチャ値がその値である理由。ライブ実行の最後に、ツールは発火したすべてのチェックの check-origins.md のポインターを出力するため、ヒットが本物かノイズかを判断する際に根拠が得られます。

エンジニアリング不変条件(破らないこと)

  1. すべてのファイルI/Oは wikikit.textio を経由する(バイトレベルのUTF-8、BOMなし、行末変換なし)。テキストモードの open() をデフォルトの改行処理で使用しないでください:CRLFファイルを読み書きすると、暗黙的に変換されます。
  2. CRLFを含む可能性のあるテキストに対してマルチライン正規表現で $ を使用しないこと:$ はCRとLFの間に位置し、ペアを分割します。行ごとに編集してください(frontmatter.set_key, fixes._insert_backlinks)。
  3. 設定が唯一の真実の情報源です。 ウィキにフィールド、フォルダ、ステータス、除外が追加された場合は、コードではなく wiki.config.json(lint セクション)を編集してください。デフォルト値は wikikit/lint/defaults.json にあります。
  4. スタブの除外は統一されています。 lint.stub_exempt_checks には status: stub のノートをスキップするチェック番号がリストされています。設定からリストを読み取り、散文で再記述しないでください。チェック10と11はスタブをインラインで除外します(ファイルシステムカウント)。
  5. プレースホルダー検出は未解決を条件としています。 ボールトインデックスで解決されるウィキリンクターゲットは、その名前がパターンに一致してもプレースホルダーとしてフラグされません。正当なALL-CAPS略語ノートはフラグされてはなりません。
  6. ロジック変更の前に自己テストを行ってください。 チェックへの編集(新しいチェック、しきい値変更、ヒューリスティックのリファクタリング)は、python skills/wiki-lint/scripts/lint.py --self-test がグリーンで通過しなければなりません。変更が意図的である場合は、tests/fixtures/lint/ と expected_counters.txt を一緒に更新してください。フィクスチャが識別することを証明してください:ロジック変更を元に戻し、再実行し、カウンターが変動することを確認してください。変更前後の両方でパスするフィクスチャは何も保護しません。
  7. ゼロは検出器の測定値であり、ウィキの測定値ではありません。 新しいチェックのゼロを信頼する前に、ポジティブケースを注入して発火することを確認してください。
  8. 警告マーカーの所有権は位置的であり、正規表現チェーンではありません(チェック22)。 ウィキは [[Paper]]⚠ と ⚠[[Paper]] の両方を使用する可能性があります。グリフの所有者は、左トリムされたテキストが ]] で終わる場合はそのすぐ左のリンク、そうでない場合は右のリンクです。リンクに隣接しないグリフは散文の注意喚起です。2つのチェーンされた正規表現でこれを解決しないでください(2番目が隣のリンクのマーカーを消費し、未検証のソースを静かにデフラグします)。マーカーの一括編集には、変更前後の引用キーごとの国勢調査が必要です。

チェックの動作方法

#名前フラグする内容除外
1孤立した概念論文/書籍からのバックリンクがゼロ(インラインリンクまたはconcepts_touched)かつ兄弟概念からのバックリンクもゼロ(インラインまたはrelated_concepts)。兄弟レグにより合成ハブからの誤検出を防止stub
2孤立した手法論文/書籍からのバックリンクがゼロかつ論文/書籍への発信リンクもゼロstub
3空のconcepts_touchedフィールドがnull、空、または[]の論文ノート(バッチ取り込みでのフロントマター破損のカナリアでもある)stub
4出典なしの主張主張動詞(verb_list)を含む行が少なくともunsourced_threshold行あり、かつその半径unsourced_radius内またはウィキリンクされた見出し下にウィキリンクがない概念ノートstub
5壊れた/プレースホルダーのウィキリンクボールト全体のインデックスにないターゲット(broken)、または非解決時にplaceholder_wikilink_patternsに一致するもの(placeholder)、または空([[]], empty-target)link_target_ignore_patterns(Bases埋め込み)
6下書きpromote:少なくともmin_distinct_sources_for_final個の異なるソース作品を引用する下書き(書籍とその章は1作品としてカウント)。stale:そのしきい値未満でstale_daysより古い下書き、または日付なしなし
7インデックスカバレッジベースネームがindex.md内のウィキリンックでないノートstub;index_modeがbasesの場合はスキップ
7bインデックスセクションの誤配置- [[X]] が誤った##セクション(index_sections)の下にあるbasesモードではスキップ
8書籍chapters_ingestedの同期宣言されたセットがディスク上の{book}_ChNN.mdファイルと異なるstub章
9book:のない章book:リンクが欠落しているか解決しない*_ChNNノートなし
10Quick Statsのずれ## Quick Statsで宣言された数値が、対応するフォルダのライブファイル数(quick_stats_labels)と異なるなし
11Coverage by Fieldのずれ## Coverage by Fieldの概念/手法列が、ライブの非スタブカウント(フィールド行はfield:、->サブフィールド行は[[MOC_*]]リンクに基づくsubfield:キー)と異なる;ノートがあるが行がないサブフィールドはMISSING-ROWstub;フィールドなしノートはINFO
12双方向concepts_touchedpaper -> concepts_touched[token] のターゲットに[[paper]]バックリンクがない(asymmetry、自動修正可能)またはノートに解決しない(missing_target、トークンをトリアージ)なし
13リンクのない別名別の概念/手法の散文で使用されている文書化された別名(特徴的な頭字語または複数単語のフレーズ)で、正規のノートへのリンクがない。INFOstub;alias_link_stoplist;引用ブロックは検索しない
14言語レーダーウィキの言語以外の見出し(H2-H6)、または散文内で少なくともprose_threshold個のストップワードヒット。報告のみ;language_radar.enabledが無効な場合は無効stub
15合成レーダーfinal概念/手法に適用:missing = State-of-Knowledgeブロックの対象だが存在しない;stale = ブロックが引用作品の最新last_verifiedより古い非final
16ステータス語彙status が status_by_type[type] にない、status または type が欠落、またはテンプレート漏れ(draft | final)なし
17source_verificationなしシールのない論文;abstractで始まる値はシールではない。INFOバックログstub
18検証済みだが不完全シールされた論文で、volumeまたはpagesが欠落しており、日付付きcheck18_exempt: "YYYY-MM-DD, reason"がないもの;会議論文と学位論文は会場と形式により免除stub
19evidence_levelが語彙外値がevidence_level_vocabにない(論文のみ)なし
20有用な引用]]## Useful Quotesの下の引用ブロックに漏れた]]があるなし
21全文以前のコホートsynthesis.prefulltext_cutoffより前の日付の論文で、全文レベルのシールがない。INFOstub
22古い全文以前マーカー所有ウィキリンクが既に全文シールを持つ論文である⚠が、3つの末尾除外(散文注釈、日付付きイタリック注釈、(N src信頼度)後も残っている。実際の誤検出ありなし
23未記入の主張プレースホルダーunfilled_claim_patternsに一致する行(ソースは名前が挙がっているが主張が書かれていない)なし
24非推奨フロントマターキーdeprecated_frontmatter_keys(デフォルトではjournalからvenue)のキー;完全一致のため誤検出なしなし
25引用なしの統計値統計値(numeric_claim_patterns)で、半径内にウィキリンクがなく、cited/block/methods/domainに分類されるもの。INFO。何も除外されないstub;引用ブロックはスキップ
26テーブル列不一致行のセル数が区切り行と異なるテーブル(唯一の構造チェック)なし
27文字化けencode('cp1252').decode('utf-8') のラウンドトリップで異なる文字列になる行なし
28last_verifiedなしのシールsource_verificationがありlast_verifiedがない論文/書籍(チェック15のstaleからは見えない)。INFOなし
29ボールト外スラッグリンクmemory_slug_prefixesのスラッグへのウィキリンク(ボールト全体)。リストが空でない場合のみ有効memory_slug_exempt_files
30語彙同期_VOCABULARY.mdにライブの概念/手法がない(missing)か、存在しないノートの行がある(ghost)。INFO;修正は/vocabulary-updateなし
31テキストなしのシール最大60文字で、どのチャンネルにも説明検証テキストがないシール。INFOなし
32シールのないペア(ノート、そのState-of-Knowledgeブロックで引用された作品)ペアで、ソースノートのシールがノートを名前で指定していない。ブロック;seal_debt_fileで宣言された負債は報告されるがカウントされない宣言された負債
33タイトルまたは会場なしtitleまたはvenueが空の論文stub

呼び出し方法

ボールトから(上方向に最も近い wiki.config.json が設定です):

python skills/wiki-lint/scripts/lint.py                 # すべてのチェック;リストは_temp/に出力
python skills/wiki-lint/scripts/lint.py --only 5,12     # 選択されたチェック
python skills/wiki-lint/scripts/lint.py --self-test     # フィクスチャ vs expected_counters.txt
python skills/wiki-lint/scripts/fix.py check12 --dry-run
python skills/wiki-lint/scripts/fix.py promote _temp/promote_batch.txt
python skills/wiki-lint/scripts/fix.py index            # index_mode "manual" と事前のlint実行が必要

フラグ、設定キー、各チェックの出力ファイル:references/cli-reference.md。

何をいつ編集するか

  • 新しいウィキフォルダ(例:datasets/):wiki.config.jsonのfoldersに追加します。ノートが作成される前に登録する必要があります。登録されていないと、そのフォルダへのリンクはすべて壊れたものとして扱われます。
  • 新しいステータス値:lint.status_by_type.{type}に追加します。新しいノートタイプ:許可されるステータスとともにタイプを追加します。
  • 概念/手法の新しいフィールド:スラッグをfield_titlecase_mapに追加します。
  • チェック4の調整:lint.verb_list。許容範囲の緩和/厳格化:lint.defaults.unsourced_radius。
  • 新しいプレースホルダーパターン:lint.placeholder_wikilink_patterns(非解決ターゲットにのみ適用されることに注意)。
  • チェックがスタブをスキップする必要がある場合:その番号をlint.stub_exempt_checksに追加します。
  • 言語レーダーの有効化:examples/languages/es.json(または独自のリスト)をlint.language_radarにコピーします。
  • 新しいチェックの追加:wikikit/lint/checks_*.pyに実装し、カウンターをexpected_counters.txtに追加し、それを実行するフィクスチャを追加し、そのエントリをreferences/check-origins.mdに記述します。動機が文書化されていないチェックは、最初にノイズのように見えたときに無効化されます。動機を特定できない場合は、「not documented」と記述します。決して作り出さないでください。

安全規則

  • lintはウィキに対して読み取り専用です。チェックごとのリストを--out-dir(デフォルト_temp/)に書き込むだけです。
  • fix.pyは報告した場所(バックリンク、ステータス)でのみノートを変更し、各ファイルの行末を保持し、すべての変更をロールバック用にログに記録します。
  • ヒューリスティックの変更が正しいかどうかわからない場合は、最初にフィクスチャを記述し、自己テストが失敗するのを確認してから変更を行ってください。
  • キャッシュディレクトリはバージョン管理されません(_temp/などは.gitignoreに残します)。バージョン管理された測定値は、数か月後に今日のものとして読まれます。

Individual skills in this repo

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

関連スキル