Color mode

Diagnostics

Diagnostics は、Riebeckite の設定やコンテンツ、プラグイン、実行環境に問題がないかを検査し、開発者に報告するための仕組みです。

単にエラーメッセージを console.log へ出すのではなく、

  • 何が問題なのか
  • どこで問題が起きているのか
  • どの程度重要なのか
  • どう直せばよいのか

といった情報を、Riebeckite が扱える共通形式の診断情報(diagnostic)として表現します。

これにより、Core や各プラグインが見つけた問題を check や doctor からまとめて確認できます。

Diagnostics の流れ

プラグインは addDiagnostics を使って独自の診断を追加できます。

追加された診断は Core や integration によって集約され、主に check や doctor から利用されます。

診断を追加するときは、可能な限り次の情報を明確にしてください。

  • 問題が発生する条件
  • 問題のあるコンテンツや設定
  • 問題の重要度(severity)
  • 修正方法(remediation)

たとえば「設定が不正です」とだけ報告するのではなく、「どの設定が不正で、どのように変更すればよいか」まで分かる診断を推奨します。

check と doctor

check と doctor は役割が少し異なります。

check は主に設定やプラグインの構成が正しいかを検査します。

doctor はそれに加えて、Riebeckite が正常に動作できる状態かをより広く検査します。

Doctor では、1つの検査に失敗しても、可能な限り他の独立した検査を続行します。そのため、複数の問題がある場合でも一度の実行でまとめて確認できます。

問題が見つかった場合、コマンドは non-zero exit code で終了します。

Build state の検査

Doctor は incremental build で使用する build state も検査します。

主に次の状態を確認します。

  • 保存されている state を正常に読み込めるか
  • 保存された fingerprint と現在のコンテンツが一致しているか

前回の build 以降にコンテンツが追加・変更・削除されている場合は、変更件数と一部のサンプルを warning として報告します。

これは state の破損を意味するものではありません。次回の build が完了すると、現在のコンテンツに合わせて state が更新されます。

コンテンツ ID の検査

Riebeckite では、コンテンツを継続的に識別するための「安定コンテンツ ID」を設定できます。

通常はフロントマターの id を使用します。

yaml
---
id: my-article
---

この ID は、たとえば analytics プラグインがページごとの閲覧数を記録するときなど、URLとは別にコンテンツそのものを識別したい場合に利用されます。

Diagnostics プラグインは、コンテンツ ID について次の問題を検査します。

コード 重要度 意味
duplicate-content-id error 複数の公開コンテンツが同じ ID を使用している
invalid-content-id error id がコンテンツ ID のルールを満たしていない

たとえば、2つの記事が同じ ID を持っていると、analytics などで別の記事のデータが同じコンテンツとして扱われる可能性があります。

これらは analytics 専用の検査ではありません。コンテンツ ID を利用するすべての機能に共通する整合性チェックとして Diagnostics が担当します。

サイト全体のコンテンツ整合性

Diagnostics プラグインは、公開サイト内のリンクや参照が正しく解決できるかも検査します。

たとえば、次のような問題を検出します。

  • 存在しないページへのリンク
  • 解決できない Wikiリンク
  • 存在しない画像や添付ファイルへの参照
  • 複数のコンテンツによる公開パスの重複
  • 存在しない転送先へのリダイレクト
  • 循環しているリダイレクト

これらは content-integrity:* の診断として報告されます。

どの情報を使って検査するのか

整合性検査では、Riebeckite がすでに解決した公開コンテンツや公開パスの情報を使用します。

そのため、Diagnostics のためだけに Markdown をもう一度解析したり、コンテンツを最初から読み直したりすることはありません。

また、permalink、alias、rename、多言語化、公開・除外設定などによって最終的な公開先が変わっている場合も、Riebeckite が解決した結果を基準に検査します。

HTML の品質検査との違い

Diagnostics が担当するのは、主にサイト全体の参照や構成の整合性です。

一方で、

  • 画像に適切な alt があるか
  • 見出し構造が適切か
  • 生成された HTML に問題がないか

といった個々のページの HTML 品質は @riebeckite/plugin-quality が担当します。

プラグインからページやアセットを公開する場合

プラグインが独自のページ、生成ファイル、アセットなどを公開する場合は、Riebeckite が提供する対応する仕組みを使って登録してください。

正しく登録された公開先は Diagnostics からも認識されます。

そのため、たとえばプラグインが /explore というページを正式に公開していれば、

text
/explore

へのリンクが「存在しないページ」として誤って報告されることはありません。

Diagnostics を実装するときのルール

Diagnostics を追加するときは、次の原則に従ってください。

  • option validation ではファイルの読み込みや状態変更を行わない
  • 安全な結果を判断できない場合は、推測して処理を続けず診断として報告する
  • stack trace、token、不要な絶対パスをユーザー向けメッセージへ含めない
  • メッセージ文字列ではなく、安定した diagnostic identifier を使って問題を識別する
  • 可能な限り具体的な修正方法を示す
  • diagnostic の生成中に auto-fix、build、cache 更新、state 更新を行わない

Diagnostics は問題を発見して説明する仕組みです。問題を自動的に修正したり、ビルド状態を変更したりする仕組みではありません。

現在の状態そのものを確認したい場合は Inspector、ログやトレースを確認したい場合は Observability を参照してください。

History

1 changesCollapseExpand
1 + # Diagnostics
2 +
3 + Diagnostics は、Riebeckite の設定やコンテンツ、プラグイン、実行環境に問題がないかを検査し、開発者に報告するための仕組みです。
4 +
5 + 単にエラーメッセージを `console.log` へ出すのではなく、
6 +
7 + - 何が問題なのか
8 + - どこで問題が起きているのか
9 + - どの程度重要なのか
10 + - どう直せばよいのか
11 +
12 + といった情報を、Riebeckite が扱える共通形式の診断情報(diagnostic)として表現します。
13 +
14 + これにより、Core や各プラグインが見つけた問題を `check` や `doctor` からまとめて確認できます。
15 +
16 + ## Diagnostics の流れ
17 +
18 + プラグインは `addDiagnostics` を使って独自の診断を追加できます。
19 +
20 + 追加された診断は Core や integration によって集約され、主に `check` や `doctor` から利用されます。
21 +
22 + 診断を追加するときは、可能な限り次の情報を明確にしてください。
23 +
24 + - 問題が発生する条件
25 + - 問題のあるコンテンツや設定
26 + - 問題の重要度(severity)
27 + - 修正方法(remediation)
28 +
29 + たとえば「設定が不正です」とだけ報告するのではなく、「どの設定が不正で、どのように変更すればよいか」まで分かる診断を推奨します。
30 +
31 + ## `check` と `doctor`
32 +
33 + `check` と `doctor` は役割が少し異なります。
34 +
35 + `check` は主に設定やプラグインの構成が正しいかを検査します。
36 +
37 + `doctor` はそれに加えて、Riebeckite が正常に動作できる状態かをより広く検査します。
38 +
39 + Doctor では、1つの検査に失敗しても、可能な限り他の独立した検査を続行します。そのため、複数の問題がある場合でも一度の実行でまとめて確認できます。
40 +
41 + 問題が見つかった場合、コマンドは non-zero exit code で終了します。
42 +
43 + ### Build state の検査
44 +
45 + Doctor は incremental build で使用する build state も検査します。
46 +
47 + 主に次の状態を確認します。
48 +
49 + - 保存されている state を正常に読み込めるか
50 + - 保存された fingerprint と現在のコンテンツが一致しているか
51 +
52 + 前回の build 以降にコンテンツが追加・変更・削除されている場合は、変更件数と一部のサンプルを warning として報告します。
53 +
54 + これは state の破損を意味するものではありません。次回の build が完了すると、現在のコンテンツに合わせて state が更新されます。
55 +
56 + ## コンテンツ ID の検査
57 +
58 + Riebeckite では、コンテンツを継続的に識別するための「安定コンテンツ ID」を設定できます。
59 +
60 + 通常はフロントマターの `id` を使用します。
61 +
62 + ```yaml
63 + ---
64 + id: my-article
65 + ---
66 + ```
67 +
68 + この ID は、たとえば analytics プラグインがページごとの閲覧数を記録するときなど、URLとは別にコンテンツそのものを識別したい場合に利用されます。
69 +
70 + Diagnostics プラグインは、コンテンツ ID について次の問題を検査します。
71 +
72 + | コード | 重要度 | 意味 |
73 + | --- | --- | --- |
74 + | `duplicate-content-id` | error | 複数の公開コンテンツが同じ ID を使用している |
75 + | `invalid-content-id` | error | `id` がコンテンツ ID のルールを満たしていない |
76 +
77 + たとえば、2つの記事が同じ ID を持っていると、analytics などで別の記事のデータが同じコンテンツとして扱われる可能性があります。
78 +
79 + これらは analytics 専用の検査ではありません。コンテンツ ID を利用するすべての機能に共通する整合性チェックとして Diagnostics が担当します。
80 +
81 + ## サイト全体のコンテンツ整合性
82 +
83 + Diagnostics プラグインは、公開サイト内のリンクや参照が正しく解決できるかも検査します。
84 +
85 + たとえば、次のような問題を検出します。
86 +
87 + - 存在しないページへのリンク
88 + - 解決できない Wikiリンク
89 + - 存在しない画像や添付ファイルへの参照
90 + - 複数のコンテンツによる公開パスの重複
91 + - 存在しない転送先へのリダイレクト
92 + - 循環しているリダイレクト
93 +
94 + これらは `content-integrity:*` の診断として報告されます。
95 +
96 + ### どの情報を使って検査するのか
97 +
98 + 整合性検査では、Riebeckite がすでに解決した公開コンテンツや公開パスの情報を使用します。
99 +
100 + そのため、Diagnostics のためだけに Markdown をもう一度解析したり、コンテンツを最初から読み直したりすることはありません。
101 +
102 + また、permalink、alias、rename、多言語化、公開・除外設定などによって最終的な公開先が変わっている場合も、Riebeckite が解決した結果を基準に検査します。
103 +
104 + ### HTML の品質検査との違い
105 +
106 + Diagnostics が担当するのは、主にサイト全体の参照や構成の整合性です。
107 +
108 + 一方で、
109 +
110 + - 画像に適切な `alt` があるか
111 + - 見出し構造が適切か
112 + - 生成された HTML に問題がないか
113 +
114 + といった個々のページの HTML 品質は `@riebeckite/plugin-quality` が担当します。
115 +
116 + ## プラグインからページやアセットを公開する場合
117 +
118 + プラグインが独自のページ、生成ファイル、アセットなどを公開する場合は、Riebeckite が提供する対応する仕組みを使って登録してください。
119 +
120 + 正しく登録された公開先は Diagnostics からも認識されます。
121 +
122 + そのため、たとえばプラグインが `/explore` というページを正式に公開していれば、
123 +
124 + ```text
125 + /explore
126 + ```
127 +
128 + へのリンクが「存在しないページ」として誤って報告されることはありません。
129 +
130 + ## Diagnostics を実装するときのルール
131 +
132 + Diagnostics を追加するときは、次の原則に従ってください。
133 +
134 + - option validation ではファイルの読み込みや状態変更を行わない
135 + - 安全な結果を判断できない場合は、推測して処理を続けず診断として報告する
136 + - stack trace、token、不要な絶対パスをユーザー向けメッセージへ含めない
137 + - メッセージ文字列ではなく、安定した diagnostic identifier を使って問題を識別する
138 + - 可能な限り具体的な修正方法を示す
139 + - diagnostic の生成中に auto-fix、build、cache 更新、state 更新を行わない
140 +
141 + Diagnostics は問題を**発見して説明する仕組み**です。問題を自動的に修正したり、ビルド状態を変更したりする仕組みではありません。
142 +
143 + 現在の状態そのものを確認したい場合は [Inspector](inspector.md)、ログやトレースを確認したい場合は [Observability](observability.md) を参照してください。
144 +