Metadata-Version: 2.4
Name: meeting-lens
Version: 0.1.0
Summary: CLI and library for extracting structured meeting summaries from transcripts.
Project-URL: Homepage, https://github.com/isonka/meeting-lens
Project-URL: Repository, https://github.com/isonka/meeting-lens
Project-URL: Bug Tracker, https://github.com/isonka/meeting-lens/issues
Author: isonka
License: MIT
License-File: LICENSE
Requires-Python: >=3.11
Requires-Dist: click>=8.1
Requires-Dist: pydantic>=2.0
Provides-Extra: all
Requires-Dist: anthropic>=0.20; extra == 'all'
Requires-Dist: openai>=1.0; extra == 'all'
Provides-Extra: anthropic
Requires-Dist: anthropic>=0.20; extra == 'anthropic'
Provides-Extra: dev
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Provides-Extra: openai
Requires-Dist: openai>=1.0; extra == 'openai'
Description-Content-Type: text/markdown

# meeting-lens

[![PyPI](https://img.shields.io/pypi/v/meeting-lens.svg)](https://pypi.org/project/meeting-lens/)
[![Python](https://img.shields.io/pypi/pyversions/meeting-lens.svg)](https://pypi.org/project/meeting-lens/)
[![Tests](https://github.com/isonka/meeting-lens/actions/workflows/tests.yml/badge.svg)](https://github.com/isonka/meeting-lens/actions/workflows/tests.yml)

`meeting-lens` is a Python CLI and library that turns raw meeting transcripts into structured summaries: decisions, action items, open questions, and sentiment.

## Why this exists

Meeting notes are painful for engineering managers and team leads: long transcripts are hard to skim, key decisions get buried, and follow-ups are easy to miss. `meeting-lens` converts transcript exports from common tools into concise, structured outputs that are easy to share or automate.

## Quick start

### 1) Install

```bash
pip install "meeting-lens[openai]"
```

Or install all backends:

```bash
pip install "meeting-lens[all]"
```

### 2) Set an API key

```bash
export OPENAI_API_KEY="your-key"
# or
export ANTHROPIC_API_KEY="your-key"
```

### 3) Run your first summary

```bash
meeting-lens transcript.vtt
```

## CLI usage

```bash
# Basic usage
meeting-lens transcript.vtt

# Specify backend and output format
meeting-lens transcript.txt --backend anthropic --format markdown

# Write to file
meeting-lens transcript.srt --backend openai --format json --out summary.json

# Override model
meeting-lens transcript.vtt --model gpt-4o-mini

# Pipe support
cat transcript.txt | meeting-lens - --backend anthropic
```

Options:

- `--backend`: `openai` | `anthropic` (default: `openai`)
- `--format`: `markdown` | `json` (default: `markdown`)
- `--out`: output file path (default: stdout)
- `--model`: override backend default model
- `--no-color`: disable ANSI color in markdown output

## Supported input formats

| Format | Extension | Notes |
|---|---|---|
| Plain text | `.txt` | Supports lines like `Speaker: message` |
| WebVTT | `.vtt` | Works with Zoom/Teams-style VTT exports |
| SubRip | `.srt` | Parses subtitle blocks and speaker prefixes |

## Backend comparison

| Backend | Package extra | API key env var | Default model |
|---|---|---|---|
| OpenAI | `meeting-lens[openai]` | `OPENAI_API_KEY` | `gpt-4o` |
| Anthropic | `meeting-lens[anthropic]` | `ANTHROPIC_API_KEY` | `claude-sonnet-4-20250514` |

## Markdown output example

```markdown
# Meeting Summary

**Date:** 2024-03-15  
**Participants:** Alice, Bob, Carol  
**Sentiment:** 🟡 Mixed — _Some tension around timeline but positive on outcome._

## TL;DR
Two-sentence summary of the meeting.

## ✅ Decisions
- **Alice:** We will migrate to the new auth system by Q2.
- **Team:** Daily standups move to 09:30.

## 📋 Action Items
| Owner | Task | Due |
|-------|------|-----|
| Bob | Write migration runbook | Friday |
| Carol | Schedule design review | — |

## ❓ Open Questions
- What is the rollback plan if migration fails? _(raised by Bob)_
- Who owns the staging environment credentials?

## 📊 Sentiment
**Mixed** — Brief explanation of sentiment rating.
```

## Library usage

```python
import asyncio
from meeting_lens.backends.openai_backend import OpenAIBackend
from meeting_lens.formatters.markdown import MarkdownFormatter
from meeting_lens.lens import MeetingLens

async def run() -> None:
    transcript = "Alice: We should ship Friday.\nBob: I will own rollout docs."
    lens = MeetingLens(backend=OpenAIBackend())
    summary = await lens.run(transcript, source_name="sync.txt")
    print(MarkdownFormatter().format(summary))

asyncio.run(run())
```

## Contributing

1. Fork and clone the repo.
2. Create a virtual environment and install dev dependencies.
3. Run tests with `pytest`.
4. Open a PR with clear commit messages and test notes.

## Publishing (maintainers)

`meeting-lens` is published to PyPI using standard Python packaging flow:

```bash
python -m pip install --upgrade build twine
python -m build
twine check dist/*
twine upload dist/*
```

Notes:

- Set `TWINE_USERNAME=__token__`
- Set `TWINE_PASSWORD` to your PyPI API token
- Always bump `version` in `pyproject.toml` before upload

## Related

- [context-trimmer](https://github.com/isonka/context-trimmer)
- [mobile-context-trimmer](https://github.com/isonka/mobile-context-trimmer)