markuplint 4.14.0 → 5.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/ARCHITECTURE.ja.md +419 -0
  2. package/ARCHITECTURE.md +419 -0
  3. package/CHANGELOG.md +32 -2
  4. package/README.md +2 -2
  5. package/SKILL.md +110 -0
  6. package/docs/maintenance.ja.md +207 -0
  7. package/docs/maintenance.md +207 -0
  8. package/lib/api/index.d.ts +8 -0
  9. package/lib/api/index.js +8 -0
  10. package/lib/api/lint.d.ts +7 -0
  11. package/lib/api/lint.js +7 -0
  12. package/lib/api/ml-engine.d.ts +48 -0
  13. package/lib/api/ml-engine.js +118 -86
  14. package/lib/api/types.d.ts +6 -0
  15. package/lib/api/v1.d.ts +8 -3
  16. package/lib/api/v1.js +8 -3
  17. package/lib/cli/bootstrap.d.ts +14 -2
  18. package/lib/cli/bootstrap.js +10 -3
  19. package/lib/cli/command.d.ts +12 -0
  20. package/lib/cli/command.js +12 -0
  21. package/lib/cli/index.d.ts +7 -0
  22. package/lib/cli/index.js +7 -0
  23. package/lib/cli/init/create-config.d.ts +16 -0
  24. package/lib/cli/init/create-config.js +21 -1
  25. package/lib/cli/init/get-default-rules.d.ts +9 -0
  26. package/lib/cli/init/get-default-rules.js +9 -0
  27. package/lib/cli/init/index.d.ts +14 -0
  28. package/lib/cli/init/index.js +14 -0
  29. package/lib/cli/init/select-modules.d.ts +10 -0
  30. package/lib/cli/init/select-modules.js +10 -0
  31. package/lib/cli/init/types.d.ts +19 -0
  32. package/lib/cli/output.d.ts +11 -0
  33. package/lib/cli/output.js +11 -0
  34. package/lib/cli/search/index.d.ts +17 -0
  35. package/lib/cli/search/index.js +17 -0
  36. package/lib/debug.d.ts +9 -0
  37. package/lib/debug.js +9 -0
  38. package/lib/get-json-module.d.ts +10 -0
  39. package/lib/get-json-module.js +10 -0
  40. package/lib/global-settings.d.ts +15 -0
  41. package/lib/global-settings.js +12 -0
  42. package/lib/i18n.d.ts +10 -1
  43. package/lib/i18n.js +12 -10
  44. package/lib/index.d.ts +13 -4
  45. package/lib/index.js +12 -4
  46. package/lib/reporter/github-reporter.d.ts +9 -0
  47. package/lib/reporter/github-reporter.js +10 -1
  48. package/lib/reporter/index.d.ts +9 -0
  49. package/lib/reporter/index.js +9 -0
  50. package/lib/reporter/simple-reporter.d.ts +11 -0
  51. package/lib/reporter/simple-reporter.js +12 -1
  52. package/lib/reporter/standard-reporter.d.ts +12 -0
  53. package/lib/reporter/standard-reporter.js +13 -1
  54. package/lib/testing-tool/index.d.ts +44 -0
  55. package/lib/testing-tool/index.js +32 -0
  56. package/lib/types.d.ts +3 -0
  57. package/lib/v1.d.ts +3 -1
  58. package/lib/v1.js +3 -1
  59. package/lib/version.d.ts +3 -0
  60. package/lib/version.js +4 -4
  61. package/package.json +20 -17
@@ -0,0 +1,419 @@
1
+ # markuplint
2
+
3
+ ## 概要
4
+
5
+ `markuplint` は markuplint リンティングエコシステムのメイン統合パッケージです。CLI ツール、プログラマティック API、テストユーティリティを提供します。コアの `MLEngine` クラスがリンティングパイプライン全体をオーケストレーションし、ファイル解決→設定ロード→パーサー選択→ルール実行→結果出力を統括します。`@markuplint/file-resolver`、`@markuplint/ml-core`、`@markuplint/rules` 等のパッケージをエンドユーザー、エディタ拡張、CI/CD 環境向けの統一インターフェースに統合しています。
6
+
7
+ ## ディレクトリ構成
8
+
9
+ ```
10
+ bin/
11
+ └── markuplint.mjs -- CLI 実行可能エントリーポイント
12
+ src/
13
+ ├── index.ts -- パッケージエクスポート(MLEngine, テストツール, 型, i18n)
14
+ ├── types.ts -- MLResultInfo 型定義
15
+ ├── version.ts -- パッケージバージョン文字列(package.json から取得)
16
+ ├── i18n.ts -- ロケール検出とメッセージ読み込み
17
+ ├── debug.ts -- デバッグログ(名前空間: markuplint-cli)
18
+ ├── global-settings.ts -- グローバル設定管理(ロケール)
19
+ ├── get-json-module.ts -- 動的 JSON モジュールローダー(安全な require ラッパー)
20
+ ├── v1.ts -- 非推奨 v1 API の再エクスポート
21
+ ├── api/
22
+ │ ├── index.ts -- API エクスポート(MLEngine, lint)
23
+ │ ├── types.ts -- APIOptions, MLEngineEventMap
24
+ │ ├── ml-engine.ts -- MLEngine クラス(コアオーケストレーター)
25
+ │ ├── ml-engine.spec.ts -- MLEngine テスト
26
+ │ ├── lint.ts -- スタンドアロン lint() 関数
27
+ │ └── v1.ts -- 非推奨 v1 lint 関数
28
+ ├── cli/
29
+ │ ├── index.ts -- CLI エントリ(引数解析、コマンドディスパッチ)
30
+ │ ├── bootstrap.ts -- meow CLI 定義(フラグ、ヘルプテキスト)
31
+ │ ├── command.ts -- lint コマンド実装
32
+ │ ├── output.ts -- レポーターディスパッチ(format → reporter)
33
+ │ ├── index.spec.ts -- CLI 統合テスト
34
+ │ ├── init/ -- --init サブコマンド(対話式ウィザード)
35
+ │ │ ├── index.ts -- 初期化フロー制御
36
+ │ │ ├── types.ts -- Langs, Category, RuleSettingMode 型
37
+ │ │ ├── create-config.ts -- ユーザー選択からの設定生成
38
+ │ │ ├── get-default-rules.ts -- ビルトインルールメタデータ抽出
39
+ │ │ ├── select-modules.ts -- 言語選択からの npm モジュールリスト
40
+ │ │ └── *.spec.ts -- 初期化ウィザードテスト
41
+ │ └── search/ -- --search サブコマンド(CSS セレクタ検索)
42
+ │ └── index.ts -- 一時ルールを使った要素検索
43
+ ├── reporter/
44
+ │ ├── index.ts -- レポーターエクスポート
45
+ │ ├── standard-reporter.ts -- 詳細マルチライン形式(ソースコンテキスト付き)
46
+ │ ├── simple-reporter.ts -- コンパクト1行/違反形式
47
+ │ ├── github-reporter.ts -- GitHub Actions アノテーション形式(::error, ::warning)
48
+ │ └── github-reporter.spec.ts
49
+ └── testing-tool/
50
+ └── index.ts -- mlTest(), mlRuleTest(), mlTestFile()
51
+ ```
52
+
53
+ ## アーキテクチャ図
54
+
55
+ ```mermaid
56
+ flowchart TD
57
+ subgraph cli ["CLI レイヤー"]
58
+ bin["bin/markuplint.mjs"]
59
+ bootstrap["bootstrap.ts\n(meow フラグ)"]
60
+ cliIndex["cli/index.ts\n(ディスパッチ)"]
61
+ cmd["command.ts\n(lint コマンド)"]
62
+ initWiz["init/ (ウィザード)"]
63
+ searchCmd["search/ (CSS セレクタ)"]
64
+ end
65
+
66
+ subgraph api ["API レイヤー"]
67
+ MLEngine["MLEngine\n(コアオーケストレーター)"]
68
+ lintFn["lint()\n(複数ファイル)"]
69
+ end
70
+
71
+ subgraph reporters ["レポーターレイヤー"]
72
+ standard["standardReporter"]
73
+ simple["simpleReporter"]
74
+ github["githubReporter"]
75
+ json["JSON 出力"]
76
+ end
77
+
78
+ subgraph testing ["テストレイヤー"]
79
+ mlTest["mlTest()"]
80
+ mlRuleTest["mlRuleTest()"]
81
+ mlTestFile["mlTestFile()"]
82
+ end
83
+
84
+ subgraph deps ["依存パッケージ"]
85
+ fileResolver["@markuplint/file-resolver\n(ファイル, 設定, パーサー)"]
86
+ mlCore["@markuplint/ml-core\n(MLCore, ルール, verify)"]
87
+ rules["@markuplint/rules\n(ビルトインルール)"]
88
+ mlConfig["@markuplint/ml-config\n(Config 型, マージ)"]
89
+ end
90
+
91
+ bin --> cliIndex
92
+ cliIndex --> bootstrap
93
+ cliIndex -->|"--init"| initWiz
94
+ cliIndex -->|"--search"| searchCmd
95
+ cliIndex -->|"ファイル指定"| cmd
96
+ cmd --> MLEngine
97
+ cmd -->|"output()"| reporters
98
+ searchCmd --> cmd
99
+
100
+ lintFn --> MLEngine
101
+ mlTest --> lintFn
102
+ mlRuleTest --> mlTest
103
+ mlTestFile --> lintFn
104
+
105
+ MLEngine --> fileResolver
106
+ MLEngine --> mlCore
107
+ MLEngine --> rules
108
+ MLEngine --> mlConfig
109
+ ```
110
+
111
+ ## MLEngine クラス
112
+
113
+ リンティングパイプラインをオーケストレーションする中核クラス。`strict-event-emitter` の `Emitter<MLEngineEventMap>` を継承し、型安全なイベント発行を実現。
114
+
115
+ ### 静的メソッド
116
+
117
+ | メソッド | 説明 |
118
+ | -------------------------------- | ---------------------------------------------------------------------------- |
119
+ | `fromCode(sourceCode, options?)` | インラインソースコードから MLEngine を生成。内部で MLFile を解決 |
120
+ | `toMLFile(target)` | `Target`(ファイルパスまたはインラインソース)を `MLFile` インスタンスに変換 |
121
+
122
+ ### インスタンスメソッド
123
+
124
+ | メソッド | 説明 |
125
+ | ---------------------- | ----------------------------------------------------------------------------------------------------- |
126
+ | `exec()` | linting を実行: `setup()` → `core.verify(fix)` を呼び出し、`MLResultInfo` を返却。スキップ時は `null` |
127
+ | `setCode(code)` | ソースコードを更新し再パース。設定の再解決は行わない |
128
+ | `watchMode(enable)` | chokidar によるファイル監視の有効/無効。変更時: 設定再解決 → core 更新 → 再 lint |
129
+ | `close()` | すべてのイベントリスナーを除去しファイルウォッチャーを停止 |
130
+ | `resolveConfig(cache)` | 設定を解決(`--show-config` サポート用に公開) |
131
+
132
+ ### パイプライン: setup -> provide -> exec
133
+
134
+ ```mermaid
135
+ flowchart TD
136
+ Exec["exec()"] --> Setup["setup()"]
137
+ Setup --> CoreExists{"core が存在する?"}
138
+ CoreExists -->|Yes| ReturnCore["既存の core を返却"]
139
+ CoreExists -->|No| Provide["provide()"]
140
+
141
+ Provide --> ResolveConfig["resolveConfig()\n ConfigProvider.search() + マージ"]
142
+ ResolveConfig --> FileExists{"ファイルが存在する?"}
143
+ FileExists -->|No| ReturnNull1["null を返却"]
144
+ FileExists -->|Yes| ExcludeCheck{"除外対象?"}
145
+ ExcludeCheck -->|Yes| ReturnNull2["null を返却"]
146
+ ExcludeCheck -->|No| ResolveParser["resolveParser()\n パーサーモジュール選択"]
147
+ ResolveParser --> ExtCheck{"拡張子が一致?\n(--ignore-ext でなければ)"}
148
+ ExtCheck -->|No| ReturnNull3["null を返却"]
149
+ ExtCheck -->|Yes| ResolvePretenders["resolvePretenders()"]
150
+ ResolvePretenders --> ResolveRuleset["resolveRuleset()\n convertRuleset()"]
151
+ ResolveRuleset --> ResolveSchemas["resolveSchemas()"]
152
+ ResolveSchemas --> ResolveRules["resolveRules()\n プラグイン + カスタムルール"]
153
+ ResolveRules --> LoadI18n["i18n()\n ロケール読み込み"]
154
+ LoadI18n --> ReturnFabric["MLFabric を返却"]
155
+
156
+ ReturnFabric --> CreateCore["createCore(fabric)\n new MLCore(...)"]
157
+ CreateCore --> ReturnCore
158
+
159
+ ReturnCore --> Verify["core.verify(fix)"]
160
+ Verify --> EmitLint["'lint' イベント発行"]
161
+ EmitLint --> ReturnResult["MLResultInfo を返却"]
162
+ ```
163
+
164
+ ### 設定解決の優先順位
165
+
166
+ `resolveConfig()` メソッドは複数のソースから以下の優先順位(高い順)で設定を解決します:
167
+
168
+ ```
169
+ 1. options.config -- API 経由で渡されたインライン設定オブジェクト
170
+ 2. options.configFile -- 明示的な設定ファイルパス(--config フラグ)
171
+ 3. ConfigProvider.search()-- ファイル位置からの自動探索(--no-search-config でなければ)
172
+ 4. options.defaultConfig -- フォールバック設定
173
+ 5. markuplint:recommended -- 設定が一切見つからない場合のデフォルト
174
+ ```
175
+
176
+ これらは `ConfigProvider.resolve()` で結合され、`@markuplint/ml-config` の `mergeConfig()` を使用して全レイヤーをマージします。
177
+
178
+ ### イベントシステム
179
+
180
+ | イベント | ペイロード | 発行タイミング |
181
+ | --------------- | -------------------------------------------------- | ---------------------- |
182
+ | `log` | phase, message | 各処理段階 |
183
+ | `config` | filePath, configSet | 設定解決後 |
184
+ | `exclude` | filePath, setting | ファイルが除外された時 |
185
+ | `parser` | filePath, parserName | パーサー解決後 |
186
+ | `ruleset` | filePath, ruleset | ルールセット変換後 |
187
+ | `schemas` | filePath, schemas | スキーマ解決後 |
188
+ | `rules` | filePath, rules | ルール解決後 |
189
+ | `i18n` | filePath, locale | ロケール読み込み後 |
190
+ | `code` | filePath, sourceCode | ソースコード取得後 |
191
+ | `lint` | filePath, sourceCode, violations, fixedCode, debug | lint 完了後 |
192
+ | `lint-error` | filePath, sourceCode, error | lint エラー時 |
193
+ | `config-errors` | filePath, errors | 設定解決エラー時 |
194
+
195
+ ### Watch モード
196
+
197
+ 有効時、エンジンは `chokidar.FSWatcher` で設定ファイルを監視します(対象ファイル自体はエディタ/言語サーバーが管理するため監視しません):
198
+
199
+ 1. `resolveConfig()` が `configSet.files` をウォッチャーに追加
200
+ 2. ファイル変更時: `onChange()` が発火
201
+ 3. `provide(false)` でキャッシュなしの設定再解決
202
+ 4. `core.update(fabric)` で core を新しい設定で更新
203
+ 5. `exec()` でファイルを再 lint
204
+
205
+ ## CLI アーキテクチャ
206
+
207
+ ### エントリーポイントフロー
208
+
209
+ ```
210
+ bin/markuplint.mjs
211
+ -> import cli/index.ts
212
+ |-- -v -> cli.showVersion() (exit 0)
213
+ |-- -h -> cli.showHelp(0) (exit 0)
214
+ |-- --verbose -> verbosely()
215
+ |-- --init -> initialize() (exit 0/1)
216
+ |-- --create-rule -> エラーメッセージ (exit 1, @markuplint/create-rule を使用)
217
+ |-- files + --search -> search() (exit 0)
218
+ |-- files -> command() (exit 0/1)
219
+ |-- stdin (pipe) -> command([{sourceCode}]) (exit 0/1)
220
+ `-- (引数なし) -> cli.showHelp(1) (exit 1)
221
+ ```
222
+
223
+ ### command() の処理フロー
224
+
225
+ 1. `resolveFiles()` でファイル glob を `MLFile` リストに展開
226
+ 2. `ViolationCollector` を `maxCount` 制限付きで作成
227
+ 3. 各ファイルに対して:
228
+ - オプション付きで `MLEngine` を作成
229
+ - `--show-config` の場合: 計算済み設定を JSON で出力して終了
230
+ - `engine.exec()` で lint を実行
231
+ - `--progressive-output` かつ JSON 以外: 即座に出力
232
+ - それ以外: メモリに結果を蓄積
233
+ - 違反を `ViolationCollector` に収集
234
+ - `--fix` の場合: 修正済みコードでファイルを上書き
235
+ 4. 結果を出力(JSON: `collector.toArray()`、その他: ファイルごとに `output()` 経由)
236
+ 5. `--max-warnings` しきい値をチェック
237
+ 6. `hasError` を返却(終了コードとして使用)
238
+
239
+ ### CLI オプション
240
+
241
+ | フラグ | 型 | デフォルト | 説明 |
242
+ | -------------------------- | ------- | ------------ | --------------------------------------------- |
243
+ | `--config`, `-c` | string | -- | 設定ファイルパス |
244
+ | `--fix` | boolean | `false` | 違反を自動修正 |
245
+ | `--format`, `-f` | string | `"Standard"` | 出力形式: Standard, Simple, GitHub, JSON |
246
+ | `--no-search-config` | boolean | `false` | 設定ファイルの自動探索を無効化 |
247
+ | `--ignore-ext` | boolean | `false` | 拡張子に関係なくファイルを lint |
248
+ | `--no-import-preset-rules` | boolean | `false` | ビルトインルールを読み込まない |
249
+ | `--locale` | string | OS ロケール | 違反メッセージのロケール |
250
+ | `--no-color` | boolean | `false` | ANSI エスケープコードを除去 |
251
+ | `--problem-only`, `-p` | boolean | `false` | 違反のあるファイルのみ表示 |
252
+ | `--allow-warnings` | boolean | `false` | 警告があっても終了コード 0 |
253
+ | `--allow-empty-input` | boolean | `true` | ファイルリストが空でもエラーにしない |
254
+ | `--show-config` | string | -- | 計算済み設定を出力(`""` または `"details"`) |
255
+ | `--verbose` | boolean | `false` | デバッグ出力を有効化 |
256
+ | `--include-node-modules` | boolean | `false` | node_modules 内のファイルを含める |
257
+ | `--severity-parse-error` | string | `"error"` | パースエラーの重大度: error, warning, off |
258
+ | `--max-count` | number | `0` | 表示する違反数の上限(0 = 制限なし) |
259
+ | `--max-warnings` | number | `-1` | 非ゼロ終了の警告数しきい値(-1 = 制限なし) |
260
+ | `--progressive-output` | boolean | `false` | 各ファイル処理後に即座に結果を出力 |
261
+ | `--init` | boolean | `false` | 対話式セットアップウィザードを実行 |
262
+ | `--search` | string | -- | CSS セレクタで要素を検索 |
263
+
264
+ ## レポーターシステム
265
+
266
+ | 形式 | レポーター | 出力先 | 特徴 |
267
+ | -------- | ------------------ | ------------------------------ | ----------------------------------------------------------------- |
268
+ | Standard | `standardReporter` | stderr(違反)/ stdout(合格) | マルチライン: ソースコンテキスト、行番号、ハイライト領域 |
269
+ | Simple | `simpleReporter` | stderr / stdout | コンパクト: 1行/違反、重大度アイコン付き |
270
+ | GitHub | `githubReporter` | stderr / stdout | GitHub Actions: `::error`, `::warning`, `::notice` アノテーション |
271
+ | JSON | (command.ts 内) | stdout | 構造化 JSON、`ViolationCollector.toArray()` 経由 |
272
+
273
+ `cli/output.ts` の `output()` 関数が `--format` に応じて適切なレポーターにディスパッチします。違反は stderr に書き込み(`process.exitCode = 1` を設定)、問題のない結果は stdout に出力します。`--no-color` 時は `strip-ansi` で ANSI コードを除去します。
274
+
275
+ ## テストツール
276
+
277
+ | 関数 | 用途 |
278
+ | ------------------------------------------------------ | --------------------------------------- |
279
+ | `mlTest(sourceCode, config, rules?, locale?, fix?)` | インラインソースコードをフル設定で lint |
280
+ | `mlRuleTest(rule, sourceCode, config?, fix?, locale?)` | 個別ルール実装のユニットテスト |
281
+ | `mlTestFile(target, config?, rules?, locale?, fix?)` | ファイルターゲットの統合テスト lint |
282
+
283
+ ### mlRuleTest の内部動作
284
+
285
+ `mlRuleTest()` は `<current-rule>` という名前の一時的な `MLRule` を作成し、簡略化されたテスト設定を完全な markuplint `Config` に変換します:
286
+
287
+ - `config.rule` → `rules: { '<current-rule>': value }`
288
+ - `config.nodeRule` → `nodeRules`(`<current-rule>` 配下にルール設定)
289
+ - `config.childNodeRule` → `childNodeRules`(同様)
290
+ - lint 後、violations から `ruleId` を除去し、テストアサーションをルール名に非依存にする
291
+
292
+ ## 初期化ウィザード(--init)
293
+
294
+ 対話フロー:
295
+
296
+ 1. テンプレートエンジンを複数選択(JSX, Vue, Svelte, Pug, PHP 等)
297
+ 2. npm 依存パッケージのインストールを確認
298
+ 3. 選択: カテゴリごとにルールをカスタマイズ or recommended プリセット使用
299
+ 4. カスタマイズの場合: 各カテゴリを確認(validation, a11y, naming-convention, maintainability, style)
300
+ 5. パーサー/スペックマッピングと選択ルール付きで `.markuplintrc` を生成
301
+ 6. 確認されていれば npm パッケージを自動インストール
302
+
303
+ `createConfig()` 関数は以下のように設定を構築:
304
+
305
+ - 各言語をパーサーモジュールとファイル拡張子パターンにマッピング
306
+ - Vue(`@markuplint/vue-spec`)、React(`@markuplint/react-spec`)、Svelte(`@markuplint/svelte-spec`)、Alpine 用のスペックパッケージを追加
307
+ - 選択カテゴリまたは `markuplint:recommended` プリセットからルールを設定
308
+
309
+ ## Search サブコマンド(--search)
310
+
311
+ ファイル群から CSS セレクタに一致する要素を検索:
312
+
313
+ 1. `__CLI_SEARCH__` という名前の一時 `MLRule` を作成
314
+ 2. ルールの `verify()` が `document.querySelectorAll(selectors)` でマッチを検索
315
+ 3. マッチしたノードから `{file, line, col}` の位置情報を収集
316
+ 4. `file:line:col` 形式で stdout に結果を出力
317
+
318
+ `command()` を `importPresetRules: false`、`problemOnly: true` で呼び出し、完全な lint パイプラインを再利用します。
319
+
320
+ ## 主要ソースファイル
321
+
322
+ | ファイル | 目的 |
323
+ | ----------------------------------- | --------------------------------------------------------------------------- |
324
+ | `src/api/ml-engine.ts` | `MLEngine` クラス: パイプラインオーケストレーション、設定解決、watch モード |
325
+ | `src/api/lint.ts` | `lint()`: 複数ファイル lint の便利関数 |
326
+ | `src/api/types.ts` | `APIOptions`、`MLEngineEventMap` 型定義 |
327
+ | `src/cli/index.ts` | CLI エントリーポイント: 引数解析とコマンドディスパッチ |
328
+ | `src/cli/bootstrap.ts` | `meow` CLI 定義(全フラグとヘルプテキスト) |
329
+ | `src/cli/command.ts` | `command()`: ファイルイテレーション、違反収集、出力 |
330
+ | `src/cli/output.ts` | `output()`: レポーター選択と結果フォーマット |
331
+ | `src/reporter/standard-reporter.ts` | ソースコンテキスト付き詳細レポーター |
332
+ | `src/reporter/simple-reporter.ts` | コンパクト1行レポーター |
333
+ | `src/reporter/github-reporter.ts` | GitHub Actions アノテーションレポーター |
334
+ | `src/testing-tool/index.ts` | `mlTest()`、`mlRuleTest()`、`mlTestFile()` |
335
+ | `src/cli/init/index.ts` | 対話式初期化ウィザード制御 |
336
+ | `src/cli/init/create-config.ts` | ウィザード選択からの設定生成 |
337
+ | `src/cli/search/index.ts` | CSS セレクタ検索サブコマンド |
338
+ | `src/types.ts` | `MLResultInfo` 型定義 |
339
+ | `src/i18n.ts` | ロケール検出とメッセージセット読み込み |
340
+ | `src/debug.ts` | デバッグロガー(名前空間: `markuplint-cli`)と `verbosely()` |
341
+ | `src/global-settings.ts` | グローバル設定(ロケール)管理 |
342
+
343
+ ## 外部依存関係
344
+
345
+ | 依存パッケージ | 用途 |
346
+ | --------------------------- | -------------------------------------------------------------- |
347
+ | `@markuplint/file-resolver` | ファイル解決、設定読み込み、パーサー/スキーマ/ルール解決 |
348
+ | `@markuplint/ml-config` | `Config` 型、`mergeConfig()` |
349
+ | `@markuplint/ml-core` | `MLCore`、`MLRule`、`ViolationCollector`、`convertRuleset()` |
350
+ | `@markuplint/rules` | ビルトイン lint ルール |
351
+ | `@markuplint/html-parser` | デフォルト HTML パーサー |
352
+ | `@markuplint/html-spec` | HTML 仕様定義 |
353
+ | `@markuplint/i18n` | ロケールセット型と翻訳メッセージ |
354
+ | `@markuplint/cli-utils` | CLI 出力ユーティリティ、対話プロンプト、モジュールインストーラ |
355
+ | `@markuplint/shared` | 共有ユーティリティ関数 |
356
+ | `chokidar` | ファイルシステム監視(watch モード) |
357
+ | `debug` | 名前空間付きデバッグログ |
358
+ | `meow` | CLI 引数パーサー |
359
+ | `os-locale` | OS ロケール検出 |
360
+ | `strict-event-emitter` | 型安全イベントエミッター基底クラス |
361
+ | `strip-ansi` | ANSI エスケープコード除去(--no-color) |
362
+
363
+ ## 統合ポイント
364
+
365
+ ```mermaid
366
+ flowchart LR
367
+ subgraph upstream ["上流"]
368
+ fileResolver["@markuplint/file-resolver\n(ファイル解決,\n設定読み込み,\nパーサー/スキーマ解決)"]
369
+ mlConfig["@markuplint/ml-config\n(Config 型, マージ)"]
370
+ mlCore["@markuplint/ml-core\n(MLCore, verify,\nViolationCollector)"]
371
+ builtinRules["@markuplint/rules\n(ビルトインルール)"]
372
+ end
373
+
374
+ subgraph pkg ["markuplint"]
375
+ engine["MLEngine\n(オーケストレーター)"]
376
+ cli["CLI\n(meow, command, output)"]
377
+ reporters["レポーター\n(standard, simple, github)"]
378
+ testTools["テストツール\n(mlTest, mlRuleTest,\nmlTestFile)"]
379
+ end
380
+
381
+ subgraph downstream ["下流"]
382
+ users["ユーザー(CLI)"]
383
+ editors["エディタ拡張(API)"]
384
+ ci["CI/CD\n(GitHub Actions 形式)"]
385
+ ruleTests["ルール作者\n(テストユーティリティ)"]
386
+ end
387
+
388
+ fileResolver --> engine
389
+ mlConfig --> engine
390
+ mlCore --> engine
391
+ builtinRules --> engine
392
+
393
+ cli --> engine
394
+ engine --> reporters
395
+ testTools --> engine
396
+
397
+ cli --> users
398
+ engine --> editors
399
+ reporters --> ci
400
+ testTools --> ruleTests
401
+ ```
402
+
403
+ ### 上流
404
+
405
+ - **`@markuplint/file-resolver`** -- ファイルターゲットの解決、設定ファイルの探索と読み込み、パーサー/スキーマモジュールの解決
406
+ - **`@markuplint/ml-config`** -- `Config` 型と設定レイヤー統合用の `mergeConfig()` を提供
407
+ - **`@markuplint/ml-core`** -- ドキュメントのパースとルール検証用の `MLCore`、結果集約用の `ViolationCollector` を提供
408
+ - **`@markuplint/rules`** -- デフォルトで読み込まれるビルトインルールセットを提供
409
+
410
+ ### 下流
411
+
412
+ - **ユーザー** -- CLI 経由で呼び出し(`npx markuplint`)
413
+ - **エディタ拡張** -- リアルタイム linting 用に `MLEngine` API をプログラマティックに使用
414
+ - **CI/CD** -- インラインアノテーション用の GitHub Actions レポーター形式を使用
415
+ - **ルール作者** -- カスタムルール実装のユニットテストに `mlRuleTest()` を使用
416
+
417
+ ## ドキュメントマップ
418
+
419
+ - [メンテナンスガイド](docs/maintenance.ja.md) -- コマンド、レシピ、トラブルシューティング