Contributing
Contributing to archeus
archeus has no build step and no runtime dependencies, so getting from a clone to a running copy is one command.
Thanks for looking. The memory and workspace layer for AI coding agents. In practice that is a terminal UI, a desktop GUI and a Claude Code plugin over one Python engine — Claude Code is the agent it drives today. It has zero runtime dependencies and that is a deliberate constraint, not an accident.
By taking part you agree to the Code of Conduct.
Getting set up
git clone https://github.com/babarmuhammad/archeus.git cd archeus python claude-sessions.py # terminal UI python claude-sessions.py --gui # desktop GUIThere is nothing to build and nothing to install first. Python 3.10 or newer, and the Claude Code CLI for anything that launches a session.
For the tests and the tooling:
python -m pip install pytest ruff # tests and lint python -m pip install -r requirements-docs.txt # the docs siteBefore you open a pull request
python -m pytest tests/ -q # the suite python -m ruff check . # lint mkdocs build --strict # only if you touched docs/ or mkdocs.ymlIf you changed anything the GUI renders:
python tools/smoke_gui.py # mounts, paints every page, parks the frame loop python tools/shot_gui.py # screenshots plus an overflow auditIf you changed the documentation site, a screenshot, or anything either published site serves:
python tools/check_site_seo.py # the BUILT html: titles, canonicals, JSON-LD, images python tools/optimize_images.py --check python tools/audit_site.py # every page at 390x844 and 768x1024, nothing past the right edge; # every paragraph at 1440px, nothing past 96chIf you changed anything under
www/— a component, a page,lib/— the apex has its own two, and CI runs both:cd www && npm run lint # eslint, including the react-hooks rules cd www && npm run build # the type check, and it prerenders every routenpm run lintis the one easy to forget, becausenpm run buildpasses without it: auseEffectthat callssetStatein its body type-checks, prerenders and renders correctly, and is rejected byreact-hooks/set-state-in-effect— which is right, and the fix (useSyncExternalStorefor anything that is really an external store) is usually simpler than what it replaces.check_site_seo.pyandaudit_site.pyreadsite/, so runmkdocs build --strictfirst. The full sequence, and what a page owes beyond passing them, is innotes/seo.md.audit_site.pyand the two GUI tools needpip install playwright && playwright install chromium;optimize_images.pyneeds Pillow. All three run in CI — the first two on every push, the third on the weekly schedule with the GUI smoke check.If you changed how the app LOOKS
Every published screenshot is generated, and a front-end change that does not re-shoot them ships a manual showing an app that no longer exists. After a change to layout, a skin or world, the stage, the nav, or a TUI screen:
py tools/shot_gui.py --docs # every page + the published set, then export py tools/shot_tui.py # the two terminal frames py tools/optimize_images.py # derive the WebP siblings, re-compressThe guided tour is recorded the same way, and for the same reason — it is the real app driven through the real steps, so it goes stale exactly when a screen does. Re-record after a change to the nav, the dashboard, or the tour itself:
py tools/capture_tour.py # the desktop app, as animated WebP py tools/shot_tui.py --tour # the same steps in the terminalBoth publish to
docs/img/andwww/public/img/. The recorder freezes the background scene: WebP compresses between frames, so a moving background makes every frame unique and the file is what a screen recording costs (860 KB against 154 KB, measured). Pass--live-motionif you want the scene, and check the image budget afterwards. Only the SHORT tour is published — a thirty-seven step slideshow is not something anyone watches, and the long one is walkable on the website instead.The architecture animation only needs re-capturing when the graph itself changes, and it must be shot from a CLEAN checkout named
archeus— the capture titles the graph after its directory and draws whatever is on disk, so one taken in a working tree publishes your scratch files:git worktree add ../archeus HEAD --detach py tools/capture_graph_gif.py --project ../archeus --frames 30 --fps 12 \ --width 900 --height 520 --out docs/graph-real.webp cp docs/graph-real.webp www/public/graph-real.webp git worktree remove ../archeusTwo things the tools decide for you, so do not fight them: the published captures are taken in the graph world (
DOC_PAGESintools/shot_gui.py), and both sites get the same files —docs/img/andwww/public/img/— because copying to one and remembering the other by hand is how the site ships a release behind the manual.Do not hand-edit an image under
docs/img/.tools/shot_gui.pyandtools/shot_tui.pywrite the PNGs andtools/optimize_images.pyderives the WebP the manual actually links;tests/test_demo_fixtures.pyrejects anything else in there.What the project cares about
Zero runtime dependencies. Everything the installed package imports comes from the standard library. Test, docs and build tooling live in their own install steps —
requirements-docs.txtand the CI job that needs them — never inpyproject.toml. PyQt6 is the one optional extra, and the GUI falls back to the browser without it.Read the gotchas first.
CLAUDE.mdin the repo root documents the traps this codebase has already fallen into: why animations may only touchtransformandopacity, why a module-level constant derived from mutable state is a cache with no invalidation, whysettings.jsonmust be written atomically, why the statusline is dispatched beforemainis imported. Most review comments on a first pull request are already answered there.A gate nobody has watched fail is not a gate. If you add a test that guards something, break the thing on purpose once and confirm the test goes red. This repo shipped a verification tool that printed
FAILURES: nonewhile executing zero checks; several tests now exist specifically because of it.Tests stay in
tests/, one file per area. They usepytestand nothing else. TUI screens are driven through the fake keyboard intests/harness.py; the GUI is driven through the stub server intools/smoke_gui.py.Never put real data in a fixture. Anything the screenshot tools are fed becomes a published PNG, so the demo workspace is fictional by design —
tests/test_demo_fixtures.pyfails the build if a fixture names a real home directory or a real-looking absolute path.Documentation is part of the change. A new feature updates its docs page,
tools/smoke_gui.pyif it renders, anddocs/api.mdviapython tools/gen_api_docs.pyif it adds a route. Generated files are never edited by hand.Commit messages
Conventional Commits (
feat:,fix:,docs:,chore:,refactor:,test:), a subject under about 50 characters, and a body that explains why when the reason is not obvious from the diff. The commit log is used as project memory here, so a message that records the reasoning is worth more than one that restates the patch.Reporting bugs
Open an issue with your OS, your Python version,
archeus --version, what you expected, and what happened. If a screen is involved, a screenshot helps — but check it for project names or paths you would rather not publish first.Security
Please do not open a public issue for a security problem. Use GitHub's private vulnerability reporting on the repository instead.
The website
The marketing site (
www/, Next.js) and the documentation (docs/, MkDocs Material) both live in this repository and both deploy frommain. The zero-dependency rule applies to the Python package — the website has its ownpackage.jsonand that is fine.