face-cli
A simulated face rendered in the browser that appears three-dimensional on a flat 2D screen and can look in any direction — an agent-drivable gaze surface for robots, kiosks, and screens.
Status: scaffold. The renderer does not exist yet. What ships today is the agent-first CLI baseline, the mesh identity, and CI. The face itself is being designed in the open — see the build brief and
CLAUDE.md.
The idea
Two halves, and both are the interesting part: the illusion of depth on a flat surface, and a gaze that can be pointed anywhere and reads as pointed there. Everything else is in service of those.
face-cli is the expressive output side of a face. Its sibling
face-recognition-cli
is the perceptual input side — it identifies real people from camera frames.
They share a subject and nothing else.
Decided so far
- The render target is the browser — a local page driven over canvas/WebGL/SVG. It needs no display server (so it runs on a headless robot box), the screen showing the face need not be the machine running the process, and a page can be screenshotted and diffed in CI. The technique within the browser is still open.
- The rendered face must survive face recognition. Not photorealism — a
detector-passing bar: OpenCV YuNet should detect it above the standard
0.6score threshold, and SFace's 128-dim embedding should stay stable across the whole gaze range. That turns "it looks 3D" into an assertion CI can actually make, and it is the seam along which this repo composes withface-recognition-cli.
Open questions — the gaze primitive, the control channel between a one-shot CLI
call and a live page, whether expression is in scope, one face or many — are
tracked in CLAUDE.md and the brief.
Quickstart
uv sync
uv run pytest -n auto # run the test suite
uv run face whoami # identity from culture.yaml
uv run face learn # self-teaching prompt (add --json)
uv run teken cli doctor . --strict # the agent-first rubric gate CI runs
The console command is face; the import package is face_cli and the
PyPI distribution is face-cli. The mismatch is deliberate — a bare face is
already a published distribution on PyPI, so squatting that import would shadow
it.
CLI
| Verb | What it does |
|---|---|
whoami |
Report this agent's nick, version, backend, and model from culture.yaml. |
learn |
Print a structured self-teaching prompt. |
explain <path> |
Markdown docs for any noun/verb path. |
overview |
Read-only descriptive snapshot of the agent. |
doctor |
Check the agent-identity invariants (prompt-file-present, backend-consistency). |
cli overview |
Describe the CLI surface itself. |
Every command supports --json. Results go to stdout, errors/diagnostics to
stderr (never mixed). Exit codes: 0 success, 1 user error, 2 environment
error, 3+ reserved.
No gaze or render verbs exist yet — the list above is the scaffold's introspection surface.
What's in the box
- An agent-first CLI cited from teken
(
afi-cli) — the runtime package has no third-party dependencies. - A mesh identity —
culture.yaml(suffix+backend) and the matching resident prompt file (AGENTS.colleague.md, since this agent runsbackend: colleague). - The canonical guildmaster skill kit under
.claude/skills/, vendored cite-don't-import. Seedocs/skill-sources.md. - A build + deploy baseline — pytest, lint, the agent-first rubric gate, and PyPI Trusted Publishing wired into GitHub Actions.
Contributing
Every PR bumps the version (version-check CI blocks merge otherwise) and adds
a real CHANGELOG entry. See CLAUDE.md for the full conventions —
the cicd PR lane, worktree layout, and deploy setup.
License
Apache 2.0 — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file face_cli-0.7.0.tar.gz.
File metadata
- Download URL: face_cli-0.7.0.tar.gz
- Upload date:
- Size: 161.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f4240f42c10b3c8dc007e968608a95a9701555af5c3bc8edce1aa29e398d01af
|
|
| MD5 |
c047cf5e68313f07373a079a7cb09a1d
|
|
| BLAKE2b-256 |
9993593e42f6c3d019d0e1e447956a25d151e79c275c02740b60dc33e50ce250
|
File details
Details for the file face_cli-0.7.0-py3-none-any.whl.
File metadata
- Download URL: face_cli-0.7.0-py3-none-any.whl
- Upload date:
- Size: 22.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cb394838f32ce1be6eabdc2b8d1e44e0e329a4b062d10b2a57513b4e08f073ef
|
|
| MD5 |
8a359fb5430652eadbb76b42960d5340
|
|
| BLAKE2b-256 |
6cf2c44d0b37eaab5b88b6785e0fc659bb660410b87578fc8d2959beffc2c01e
|