This repository packages Keeper as a Wippy module monorepo.
keeper/publisheskeeper/keeper, the core Wippy control plane.usage/publisheskeeper/usage, the optional usage analytics module.
Each child directory is an independent Wippy module with its own wippy.yaml,
wippy.lock, source tree, tests, and optional frontend bundle.
Keeper provides the operator surface for a Wippy app:
- registry and namespace governance
- task orchestration and agent workflows
- MCP token management and MCP transport
- Hub dependency install/uninstall planning
- frontend component discovery, builds, screenshots, and UI automation tools
- logs, process/system inspection, tests, knowledge, changesets, and state graph APIs
The compiled Keeper UI is embedded in the module as keeper.components:ui_static_fs.
Consumer apps should install the module and serve the embedded UI; they should not
rebuild Keeper from stale app-local source unless they are actively developing this
repository.
Keeper Usage adds analytics pages and APIs on top of wippy/usage. It is separate
so deployments can install or remove usage analytics independently.
Keeper requires Wippy v0.3.44a or newer. Hub install previews use
registry.snapshot():changes():plan() to resolve module sources and requirements
before registry changes apply.
keeper/keeper is configured through namespace requirements, so app projects can
bind Keeper to their own runtime resources without editing Keeper entries:
keeper:api_routerdefaults toapp:apiand is applied to Keeper HTTP APIs.keeper:app_dbdefaults toapp:dband is used for Keeper app-owned tables.keeper:admin_scopedefaults toapp.security:admin.keeper:env_storagedefaults toapp.env:storeand stores Keeper settings and MCP flags.keeper:public_gatewaydefaults toapp:gatewayand hosts the Keeper MCP HTTP router.keeper:mcp_routedefaults to/keeper-mcp/and controls the MCP client path.keeper:ui_serverdefaults toapp:gatewayand serves embedded Keeper UI assets.keeper:process_hostdefaults toapp:processesfor Keeper-spawned runtime work.
The MCP client URL is the host application's public API base plus
keeper:mcp_route (for example /keeper-mcp/). Keeper does not require or
document a hardcoded local port for user connections.
The module also declares dependency requirements for Wippy runtime modules such as
wippy/agent, wippy/dataflow, wippy/llm, wippy/migration, wippy/security,
wippy/session, wippy/test, and wippy/views.
See RELEASES.md for release notes.
The Keeper Hub APIs are designed for runtime dependency management:
- browse modules and versions
- read module README content
- inspect installed dependencies
- plan installs, including transitive requirements and required parameters
- install or uninstall dependencies
- list and run migrations when the installed module provides them
Install planning should be used before install so the UI can show the complete requirement list and keep the user in the loop. Do not guess requirement values.
The planner keeps existing exact bindings, then uses a compatible declared default,
then binds a sole compatible meta.value_kind registry candidate. Agreeing bare
application profile values remain reusable. Multiple candidates remain suggestions
for users and MCP agents to select explicitly. The install API rejects unbound or
invalid required values with the requirement id and expected kind; the dialog
shows the same requirement state and disables Apply until it is complete.
Declared defaults remain resolved values in requirement rows and recommended parameters. Native previews and install payloads leave those defaults implicit in dependency entries. A supplied or recorded binding is not removed merely because its value equals a declared default.
Resource validation includes entries introduced by the selected package graph.
The selected kind takes precedence when a package replaces an existing entry.
meta.value_type declares a literal value: boolean, number, integer,
string, object, or array. It takes precedence over meta.value_kind, which
can retain a semantic hint for a literal descriptor. Object and array defaults
accept JSON text; malformed defaults reject the plan. Requirements without
value_type retain their existing binding behavior.
The plan and install actions accept a dependencies array. Keeper resolves
all requested roots together before requirement validation and commits them in
one governance changeset. Request order does not determine which dependency
capabilities are available. Existing single-component requests keep their shape.
Run the stored timestamp regressions in timezones on both sides of UTC:
TZ=Etc/GMT-4 make test SUITES=keeper.timestamps:test
TZ=Etc/GMT+7 make test SUITES=keeper.timestamps:testmake lint
make publish-dry-runmake publish-keeper
make publish-usageKeeper modules are distributed under the Mozilla Public License 2.0. See
LICENSE. The module metadata in keeper/wippy.yaml and
usage/wippy.yaml uses the same MPL-2.0 identifier.