This project is a fork of
openclaw/wacli and evolves it into an all-in-one platform:
- CLI for operator and script workflows.
- Daemon API for service-to-service integrations.
- UI entrypoints for product-style consumption.
- MCP adapters for automation tooling.
All surfaces are intended to be layered on top of the same core logic derived from wacli, so new features can be adopted once in the core and then exposed to CLI/API/UI/MCP with small integration work.
- Keep existing CLI behavior compatible.
- Provide a practical API/service surface without breaking current workflows.
- Keep contracts centralized to avoid drift.
- Move from temporary
exec-based daemon execution toward a shared service layer. - Make feature rollouts easy: when wacli gains features, propagate them to contracts incrementally instead of rewriting logic.
At the moment, cmd/kirimy-daemon uses the exec wrapper approach for fast delivery:
- CLI remains the primary command entrypoint in
cmd/wacli/. - Daemon API runs from
cmd/kirimy-daemon/. - Active API surfaces are
POST /api/v1/exec,GET /api/v1/commands, andGET/POST/PUT/PATCH /api/v1/{command...}.
Planned evolution toward shared core service layer:
- Keep exec wrapper stable (minimal risk, fast iteration).
- Add internal service adapters that call
internal/appandinternal/configdirectly. - Route selected APIs through service adapters, while CLI and other surfaces continue existing behavior.
- Expand to UI/MCP surfaces using the same service contract.
cmd/wacli/: CLI entrypoint.cmd/kirimy-daemon/: Daemon API entrypoint.internal/*: Reusable core packages (internal/app,internal/config,internal/store, etc.).api/: Endpoint contracts and OpenAPI.daemon/: Operational runbook and deployment notes.
cd path/to/kirimy
CGO_ENABLED=1 CGO_CFLAGS='-Wno-error=missing-braces' go build -tags sqlite_fts5 -o ./bin/wacli ./cmd/wacli
CGO_ENABLED=1 CGO_CFLAGS='-Wno-error=missing-braces' go build -tags sqlite_fts5 -o ./bin/kirimy-daemon ./cmd/kirimy-daemon./bin/wacli --help
./bin/wacli auth
./bin/wacli sync --follow
./bin/wacli messages search "meeting"
./bin/wacli send text --to 1234567890 --message "hello"
./bin/wacli doctor./bin/kirimy-daemon --listen :8080 --store ~/.wacli --jsonImportant daemon flags:
--wacli-binary: path to the CLI binary (wacli) used by the wrapper.--store,--account: default runtime context.--read-only: safer mode for read-only workloads.--json,--full,--events: default CLI-style output modes.--command-timeout: per-request timeout.--api-token: enableAuthorization: Bearer <token>.
GET /healthzGET /readyzGET /api/v1/commandsPOST /api/v1/execGET/POST/PUT/PATCH /api/v1/{command...}(resource-first)
Example:
GET /api/v1/messages→wacli messages listGET /api/v1/messages/search?q=invoice→wacli messages search invoiceGET /api/v1/contacts/search?query=nama→wacli contacts search namaPOST /api/v1/send/text?to=1234567890&message=halo→wacli send text ...POST /api/v1/auth/statusPOST /api/v1/sync?once=truePOST /api/v1/execwith body{ "command": ["messages","search"], "args": ["meeting"], "json": true }
- API contract and examples: api/README.md
- OpenAPI: api/openapi.yaml
- Daemon operations: daemon/README.md
For every new feature:
- Update CLI behavior and command contract in
cmd/wacli/. - Update API contract in
api/(or expose viaPOST /api/v1/exec). - Update deployment notes if operational behavior changes.
- When feature is ready for shared service layer, route it through adapters before adding UI/MCP surfaces.