# CLAUDE.md

このファイルはClaude Code (claude.ai/code) がこのリポジトリで作業する際のガイダンスを提供します。

## プロジェクト概要

`article-lint` は、日本語技術記事のMarkdownファイルをスタイルガイドラインに沿ってチェックするTypeScript製CLIツールです。フロントマター、ドキュメント構造、コールアウト、コードブロックを検証します。

## コマンド

```bash
# 依存関係のインストール
pnpm install

# ビルド
pnpm exec tsc

# リンターの実行
node dist/index.js <file.md>

# 開発時: ts-nodeで直接実行
npx ts-node --esm src/index.ts <file.md>
```

## アーキテクチャ

### エントリーポイント
- [src/index.ts](src/index.ts) - Commander.jsを使用したCLI、ファイル引数を処理して結果を出力

### コアリンティング
- [src/linter.ts](src/linter.ts) - unified/remarkエコシステムでMarkdownをパース、各ルールチェックを実行

### ルール (src/rules/)
各ルールモジュールはremark AST (mdast) を受け取り `LintResult[]` を返すチェック関数をエクスポート:

| ルール | ファイル | 検証内容 |
|--------|----------|----------|
| 1 | [frontmatter.ts](src/rules/frontmatter.ts) | YAMLフロントマターに`title`と`draft`が必須 |
| 2 | [toc.ts](src/rules/toc.ts) | `{{ toc }}` がフロントマター直後にあること |
| 3-6 | [structure.ts](src/rules/structure.ts) | 構造: `### 学習目標`セクション、末尾に`## まとめ`、学習項目はH2 |
| 8 | [callouts.ts](src/rules/callouts.ts) | `:::step` ディレクティブ内は番号付きリスト |
| 11-15 | [codeblocks.ts](src/rules/codeblocks.ts) | 言語指定必須、`//addstart`/`//addend`マーカー、ファイルブロック前にイタリックでパス |

### 主要な依存関係
- `unified` + `remark-parse` + `remark-gfm` + `remark-frontmatter` + `remark-directive` - Markdownパース
- `unist-util-visit` - AST走査
- `js-yaml` / `gray-matter` - フロントマターパース
- `commander` - CLIフレームワーク
- `chalk` - ターミナル色付け

## 新しいルールの追加方法

1. `src/rules/` に新規ファイルを作成し、関数をエクスポート: `(tree: Root) => LintResult[]`
2. `src/linter.ts` でインポートして呼び出し
3. `unist-util-visit` の `visit()` でmdastノードを走査

## 開発原則

開発するときには、以下の原則を厳守してください。

### 1. テスト駆動開発 (TDD)

**RED (テスト作成) → GREEN (実装) → REFACTOR** のサイクルを厳守してください。
実装後の `pnpm type-check` は必須です。

### 2. 責務分離 (SRP)

全てのクラス・関数は単一の責務を持ちます。ビジネスロジックはDomain層に集約し、UIやInfrastructureに漏れ出さないようにします。

### 3. オープン・クローズドの原則

UIや機能を大幅に変更する場合は、既存のコードを直接変更しないで、新しいUIや機能を追加して差し替えるようにしてください。
