Daemon
The daemon watches one repository, caches facts, and serves the local API.
Runtime
The bundled daemon runs on Bun. The skill ships built JavaScript, UI assets, validators, and the engine runtime, so consumers do not install workspace packages to run it.
Lifecycle
opencanon daemon start # background
opencanon daemon serve # foreground
opencanon daemon status
opencanon daemon list # all registered daemons
opencanon daemon stop
opencanon daemon check # prerequisites only
State
Repo state lives under .opencanon/. The supervisor registry lives
in ~/.opencanon/daemons.json. Parser caches belong in Git ignore; doctor --fix safe can add the ignore entry. Runtime assets under .agents/skills/opencanon/runtime/ are release artifacts installed
into each checkout and ignored by the skill-local .gitignore, not
repository source.
Engine Runtime
The daemon uses the engine binary under .agents/skills/opencanon/runtime/engine/ for watching, hashing,
fact extraction, and affected-file calculation. JavaScript and TypeScript use
Oxc. Python source facts are available to validators, and Rust, Cargo, npm,
and Python dependency metadata feed generated project constants.
Project Types
While the daemon is running, it refreshes gitignored project authoring types when package manifests, Cargo files, Python dependency files, fixtures, or TypeScript config inputs change. Run generation manually during setup, CI, or recovery if the watcher reports stale generated types.
opencanon project-types generate
opencanon daemon status
Updates
Runtime updates are manifest-driven. The CLI selects the current target, verifies Bun and schema compatibility, checks the asset hash, and refuses to write while the daemon is running.
opencanon update check --manifest ./opencanon-runtime-manifest.json
opencanon daemon stop
opencanon update apply --manifest ./opencanon-runtime-manifest.json
opencanon daemon check
opencanon daemon start
API
The daemon exposes a JSON API over a local Unix socket. The CLI, hooks, and UI use the same endpoints.