# License Header Management

This document explains how to manage license headers in the DeerFlow project.

## License Header Format

All source files in this project should include license headers.

### Python Files

```python
# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
# SPDX-License-Identifier: MIT
```

For files with a shebang (`#!/usr/bin/env python3`), the header is placed after the shebang:

```python
#!/usr/bin/env python3
# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
# SPDX-License-Identifier: MIT

import something
```

### TypeScript Files

```typescript
// Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
// SPDX-License-Identifier: MIT

import { something } from "somewhere";
```

## Makefile Targets

### Check License Headers

Check if all Python and TypeScript files have the required license header:

```bash
# Check all files (Python and TypeScript)
make check-license-all

# Check only Python files
make check-license

# Check only TypeScript files
make check-license-ts
```

These commands:
- Scan all source files in `src/`, `tests/`, `web/src/`, `web/tests/`, and root-level files
- Report files missing the license header
- Return exit code 1 if any files are missing headers (useful for CI/CD)
- Return exit code 0 if all files have headers

### Add License Headers

Automatically add license headers to files that don't have them:

```bash
# Add to all files (Python and TypeScript)
make add-license-all

# Add only to Python files
make add-license

# Add only to TypeScript files
make add-license-ts
```

These commands:
- Add the appropriate license header to files that don't have it
- Preserve shebangs at the top of Python files
- Add appropriate spacing after headers
- Show vTypeScript files
uv run python scripts/license_header.py web/src/components/ --check

# Check a single file (works for both .py and .ts/.tsx)
uv run python scripts/license_header.py src/workflow.py --check
uv run python scripts/license_header.py web/src/core/api/chat.ts --check
```

### Script Options

- `--check`: Check mode - verify headers without modifying files
- `--verbose` / `-v`: Show detailed output for each file processed
- `paths`: One or more paths (files or directories) to process

### Supported File Types

The script automatically detects and processes:
- Python files (`.py`)
- TypeScript files (`.ts`)
- TypeScript React files (`.tsx`)

## Pre-commit Hook

The license header check is integrated into the pre-commit hook. Before allowing a commit, it will:

1. Run linting (`make lint`)
2. Run formatting (`make format`)

This ensures all merged code has proper license headers for both Python and TypeScript fileill be blocked. Run `make add-license-all` to fix.

## CI/CD Integration

For continuous integration, add the license check to your workflow:

```bash
# In your CI script or GitHub Actions
- make check-license `.next` (Next.js build directory)
```

This ensures all merged code has proper license headers.

## Files Excluded

The license header tool automatically skips:
- `__pycache__` directories
- `.pytest_cache`, `.ruff_cache`, `.mypy_cache`
- `node_modules`
- Virtual environment directories (`.venv`, `venv`, `.tox`)
- Build artifacts (`build`, `dist`)
- `.git` directory

## Customization

### Changing the License Header
S` dictionary in `scripts/license_header.py`:

```python
LICENSE_HEADERS: Dict[str, str] = {
    "python": """# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
# SPDX-License-Identifier: MIT
""",
    "typescript": """// Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
// SPDX-License-Identifier: MIT
""",
}
```

### Adding Licenserce header to all files:
    @uv run python scripts/license_header.py src/ tests/ scripts/ web/src/ web/test
1. Add the extension to `FILE_TYPE_MAP` in `scripts/license_header.py`
2. Add the corresponding header format to `LICENSE_HEADERS`

```python
FILE_TYPE_MAP = {
    ".py": "python",
    ".ts": "typescript",
    ".tsx": "typescript",
    ".js": "javascript",  # Example: adding JavaScript support
}

LICENSE_HEADERS = {
    # ... existing headers ...
    "javascript": """// Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
// SPDX-License-Identifier: MIT
""",
}PDX-License-Identifier: MIT
"""
```
-all
Checking license headers in all source files...
✅ All 289 source file(s) have license headers.
```

### Example 2: Check Only Python and TypeScript Files
```bash
$ make check-license-all
Checking license headers in Python and TypeScript files...
❌ 3 file(s) missing license header:
  - web/src/components/new-component.tsx
  - web/src/core/api/new-api.ts
  - web/tests/new-test.test.ts

Run 'make add-license-all' to add headers.
```

### Example 3: Add Headers to New Module
```bash
$ make add-license-all
Adding license headers to all source files...
✅ Added license header to 11 file(s).
```

### Example 4: Check Specific Directory
```bash
$ uv run python scripts/license_header.py web/src/components/ --check --verbose
Header already present: web/src/components/deer-flow/logo.tsx
Header already present: web/src/components/deer-flow/markdown.tsx
Header already present: web/src/components/editor/index.tsx
✅ All 24 sourceooks for exact matches (ignoring leading/trailing whitespace)

### "Pre-commit hook blocks my commit"
- Run `make add-license-all` to add headers to all files
- Or disable the check temporarily by editing the `pre-commit` file

## Examples

### Example 1: Check All Files
```bash
$ make check-license-all
Checking license headers in Python files...
✅ All 156 Python file(s) have license headers.
```

### Example 2: Add Headers to New Module
```bash
$ make add-license-all
Adding license headers to Python files...
✅ Added license header to 11 file(s).
```

### Example 3: Check Specific Directory
```bash
$ uv run python scripts/license_header.py src/agents/ --check --verbose
Header already present: src/agents/base.py
Header already present: src/agents/coordinator.py
✅ All 8 Python file(s) have license headers.
```
