codeflash-agent/packages/blackbox/pyproject.toml
Kevin Turcios 0ad5e60523
Add blackbox package: session flight recorder with HTMX dashboard (#39)
* feat(blackbox): add package with models, CLI, and HTMX dashboard

* test(blackbox): add comprehensive test coverage for dashboard

* feat(blackbox): cache session scanning via watcher invalidation

* docs(blackbox): add README and use fastapi[standard] for dev server

* refactor(blackbox): extract presentation logic into formatter classes

* refactor(blackbox): extract classify_error helpers

* feat(blackbox): wire analytics into session detail view

Show token usage, tool breakdowns, and session stats in a
collapsible panel when viewing a session.

* feat(blackbox): add codeflash plugin detection

Detect codeflash agent names, skills, and commands in transcripts.
Surface language, optimization domain, and capability badges in
the analytics panel.

* refactor(blackbox): remove underscore prefixes from internal functions

* chore: add ty python-version to root pyproject.toml

* chore(blackbox): fix lint errors in test files

* style(blackbox): apply ruff formatting to analytics

* feat(blackbox): add Playwright E2E tests for dashboard

Refactor app.py to expose create_app() factory accepting a projects_dir
override, enabling tests to run against fixture data instead of the real
~/.claude/projects/ directory. Routes now read projects_dir from
app.state instead of the module-level constant.

Add 26 Playwright tests across 5 files covering dashboard loading,
session list, session detail with filters and analytics, sidebar
collapse/localStorage persistence, and SSE log streaming. All tests
pass on chromium, firefox, and webkit (78 total).

CI gets a new e2e-blackbox job with a browser matrix strategy running
all three engines in parallel, conditional on blackbox path changes,
with trace upload on failure.

* fix(ci): sync only blackbox package in e2e job

* fix(ci): exclude e2e tests from unit test job

The test job doesn't install Playwright browsers, so e2e tests error
when pytest collects them. Ignore tests/e2e/ directories in the test
job — those are handled by the dedicated e2e-blackbox job.
2026-04-28 19:58:43 -05:00

95 lines
1.5 KiB
TOML

[project]
name = "blackbox"
version = "0.1.0"
description = "Flight data recorder for AI coding agent sessions"
requires-python = ">=3.12"
dependencies = [
"attrs>=24.2.0",
"danom>=0.13.0",
"fastapi[standard]>=0.115.0",
"jinja2>=3.1.0",
"sse-starlette>=2.0.0",
"uvicorn>=0.30.0",
"watchdog>=4.0.0",
]
[project.scripts]
blackbox = "blackbox.cli:main"
[build-system]
requires = ["uv_build>=0.7.2,<0.8"]
build-backend = "uv_build"
[tool.uv.sources]
danom = { git = "https://github.com/KRRT7/danom.git", branch = "feat/add-py-typed" }
[dependency-groups]
dev = [
"pytest>=9.0.3",
"pytest-cov>=6.2.1",
"ruff>=0.15.12",
"interrogate>=1.7.0",
"pytest-asyncio>=1.3.0",
"ty>=0.0.33",
"pytest-playwright>=0.7.2",
]
typing = [
"mypy>=1.20.2",
]
[tool.ty.environment]
python-version = "3.12"
[tool.mypy]
strict = true
warn_return_any = true
warn_unused_configs = true
[tool.pytest.ini_options]
asyncio_mode = "auto"
markers = [
"e2e: end-to-end browser tests (requires playwright)",
]
[tool.coverage.run]
source = ["blackbox"]
branch = true
[tool.coverage.report]
show_missing = true
skip_empty = true
[tool.interrogate]
fail-under = 100
verbose = 2
[tool.ruff]
line-length = 120
[tool.ruff.lint]
select = ["ALL"]
ignore = [
"A",
"ANN",
"ARG",
"ASYNC240",
"COM812",
"D",
"E501",
"EM",
"FBT",
"ISC001",
"PLR2004",
"RET504",
"S",
"SIM300",
"TC003",
"TRY003",
]
[tool.ruff.lint.per-file-ignores]
"tests/**" = [
"PLC0415",
"SIM300",
"SLF001",
]