# Issue #27: プロジェクトテンプレートに py.typed 追加

## 優先度: 中

## 概要

`railway init` で生成されるプロジェクトの `src/` ディレクトリに `py.typed` マーカーを追加し、ユーザーのコードも mypy の型チェック対象になるようにする。

## 現状の問題

### 生成されるプロジェクト構造
```
my_project/
├── src/
│   ├── __init__.py
│   ├── hello.py
│   ├── contracts/
│   └── nodes/
├── tests/
├── config/
└── pyproject.toml
```

### mypy 実行時
```bash
$ uv run mypy src/
Success: no issues found in 1 source file
```

一見成功するが、`src/` がパッケージとして認識されていないため、インポート時に型情報が失われる可能性がある。

### 問題のシナリオ
```python
# tests/test_example.py
from contracts.users_fetch_result import UsersFetchResult

# mypy: Module "contracts" has no attribute "users_fetch_result"
# （py.typed がないと型スタブが見つからない）
```

## 解決策

### railway/cli/init.py の変更

`_create_project_structure()` で `src/py.typed` を作成:

```python
def _create_project_structure(project_path: Path, with_examples: bool = False) -> None:
    """Create project directory structure."""
    # ... 既存のディレクトリ作成 ...

    # Add py.typed marker for type checking
    _create_py_typed(project_path / "src")
```

```python
def _create_py_typed(directory: Path) -> None:
    """Create py.typed marker for PEP 561 compliance."""
    content = "# PEP 561 marker - this package supports type checking\n"
    _write_file(directory / "py.typed", content)
```

### 生成後のプロジェクト構造
```
my_project/
├── src/
│   ├── __init__.py
│   ├── py.typed          # ← 追加
│   ├── hello.py
│   ├── contracts/
│   └── nodes/
├── tests/
├── config/
└── pyproject.toml
```

## テスト（TDD準拠）

```python
# tests/unit/cli/test_init_py_typed.py
import tempfile
import os
from pathlib import Path
from typer.testing import CliRunner
from railway.cli.main import app

runner = CliRunner()


class TestInitPyTyped:
    def test_creates_py_typed_in_src(self):
        """railway init で src/py.typed が作成される"""
        with tempfile.TemporaryDirectory() as tmpdir:
            os.chdir(tmpdir)
            runner.invoke(app, ["init", "test_project"])

            py_typed = Path(tmpdir) / "test_project" / "src" / "py.typed"
            assert py_typed.exists(), "py.typed should exist in src/"

    def test_py_typed_contains_pep561_marker(self):
        """py.typed に PEP 561 マーカーが含まれる"""
        with tempfile.TemporaryDirectory() as tmpdir:
            os.chdir(tmpdir)
            runner.invoke(app, ["init", "test_project"])

            py_typed = Path(tmpdir) / "test_project" / "src" / "py.typed"
            content = py_typed.read_text()
            assert "PEP 561" in content

    def test_mypy_recognizes_src_as_typed_package(self):
        """mypy が src/ を typed package として認識する"""
        import subprocess

        with tempfile.TemporaryDirectory() as tmpdir:
            os.chdir(tmpdir)
            runner.invoke(app, ["init", "test_project"])
            project_path = Path(tmpdir) / "test_project"

            # mypy 実行
            result = subprocess.run(
                ["uv", "run", "mypy", "src/"],
                cwd=project_path,
                capture_output=True,
                text=True,
            )
            # エラーなしで完了
            assert result.returncode == 0, f"mypy failed: {result.stderr}"
```

## 実装計画（TDD）

### Phase 1: Red
上記テストを作成し、失敗することを確認

### Phase 2: Green
```python
# railway/cli/init.py
def _create_py_typed(directory: Path) -> None:
    """Create py.typed marker for PEP 561 compliance."""
    content = "# PEP 561 marker - this package supports type checking\n"
    _write_file(directory / "py.typed", content)

def _create_project_structure(project_path: Path, with_examples: bool = False) -> None:
    # ... 既存のディレクトリ作成 ...
    _create_py_typed(project_path / "src")
```

### Phase 3: Refactor
TUTORIAL に説明を追加

## TUTORIAL への追記

Step 7（型チェック）に説明を追加:

```markdown
### 7.4 プロジェクトの型チェック

`src/py.typed` マーカーにより、あなたのコードも型チェック対象になります:

```bash
uv run mypy src/
```
```

## 受け入れ条件

- [ ] `railway init` で `src/py.typed` が作成される
- [ ] mypy が `src/` を typed package として認識
- [ ] TUTORIAL に説明を追加
- [ ] テストで動作を検証

## 関連

- Issue #17: py.typed追加（Railway本体）
- Issue #23: mypyトラブルシューティング
- PEP 561: Distributing and Packaging Type Information
