DataFrame viewer widget for Jupyter + standalone browser. Python backend (uv/hatch), TypeScript/React frontend (AG-Grid, pnpm workspaces).
buckaroo/ Python package — analysis pipeline, server, compare tool, MCP
packages/
buckaroo-js-core/ Core TS/React components, AG-Grid integration, Storybook
buckaroo-widget/ anywidget wrapper (esbuild)
tests/
unit/ Python unit tests (pytest)
scripts/ Build, test, release scripts
# Full build (JS + Python wheel)
./scripts/full_build.sh
# Python
uv sync --dev --all-extras
pytest -vv tests/unit/
uv run ruff check --fix
# JavaScript
cd packages && pnpm install
cd packages/buckaroo-js-core && pnpm run build && pnpm test
cd packages/buckaroo-js-core && pnpm run test:pw # Playwright E2E against Storybook
# Storybook (component dev)
cd packages/buckaroo-js-core && pnpm storybookTest suite should complete in under 40 seconds. If it doesn't, something is wrong.
Runs on push to main and PRs. Key jobs: LintPython, TestJS, BuildWheel, TestPython (3.11-3.14), Playwright (Storybook, Jupyter, Marimo, WASM). Uses depot-ubuntu-latest runners.
- Column renaming: Internally rewrites column names to a,b,c... — use
orig_col_nameto map back to real names. - Styling config: Column behaviour driven by
column_configJSON from Python→JS. Supportscolor_map_config,tooltip_config,merge_rule,ag_grid_specs. - Adding a new color rule: Update
DFWhole.ts(TS interface),Styler.tsx(function + case), Python docs/tests. - gridUtils.ts:
dfToAgridmust uselcc3(pinned), notlcc2. Linter may revert this — commit promptly. provides_defaultsin ColAnalysis: Usenp.nannot0for numeric stats fallbacks.
- No bare
except:— useexcept Exception:(bare catches SystemExit). - Don't put imports inside functions unless absolutely necessary.
- Prefer surgical, generalizable changes — don't special-case code to pass tests.
- Slot new tests into existing test files when possible.
- Update CHANGELOG.md
- Trigger the Release workflow via GitHub Actions (
workflow_dispatch), choosingpatch,minor, ormajor - The workflow bumps the version in
pyproject.toml, creates the tag, builds, publishes to PyPI, and creates a GitHub release