bazel-*
*.html
!testdata/**/*.html
# The playground's page is a source file, not something a command emits: the
# site is assembled from it at deploy time and never committed.
!web/**/*.html

# The website. www/ is committed — prose, plus the pages //site:sync writes and
# //site:site_test keeps fresh — but two things under it are not:
#
#   _site/      Zensical's output. Built in CI on every push to main; there is
#               nothing to gain from a second copy in git history.
#   the kit     the player and the embed loader, written into
#               www/assets/cinegram/ by `cinegram assets`. The canonical copy
#               lives in pkg/emit/html/assets and pkg/embedkit/assets, and a
#               committed duplicate of a 2.7 MB mermaid.min.js is a duplicate
#               that drifts. The compiled timelines beside them *are*
#               committed: they are generated from examples/ and checked.
_site/
www/assets/cinegram/*
!www/assets/cinegram/timelines/

# The local Zensical install. Bazel cannot run a Python package, so previewing
# the site is a virtualenv of your own — see the publish-site skill. A
# developer's tool, and no part of the build.
.venv/

# Byte-code the interpreter leaves beside the PyPI launcher in packaging/pypi
# whenever it is run from the source tree.
__pycache__/

.DS_Store
dist/
# Tool droppings: the Playwright MCP server's session logs and its npm cache.
.playwright-mcp/
.npm/
# Repo-local GitHub identity, referenced by core.sshCommand. Never committed.
.ssh/
