Each recipe lists the exact minimal file set to touch. Read only those files.
mcp_server/tools/<group>.py— implementasync def handle_<tool>(args) -> str.mcp_server/tool_registry.py— add the tool schema to theTOOLSlist, a dispatch entry in theDISPATCHdict pointing to your handler, and a tier entry inTIER_DISPATCH(file_read/git/shell/ …). All three tables live in this one file;mcp_server/tool_tiers.pyonly filters tools byKIM_ENABLED_TOOL_TIERS— no per-tool entry goes there.tests/— add a unit test for the new tool (schema↔dispatch parity is enforced bytests/test_invariants.pyandtests/test_tool_registry_schema.py).
Invariant: schema and dispatch entries must be added in the same commit — startup validation catches mismatches.
orchestrator/providers/<name>.py— subclassBaseProvider, implementasync def complete(messages, tools, system) -> dict. Return{"type": "tool_call", "tool": ..., "args": ...}or{"type": "text", "content": ...}.orchestrator/providers/__init__.py— add the provider to the factory mapping.tests/test_providers.py— add the provider to the parametrized contract-test suite (text reply, tool call, tool-result round-trip).
desktop/src/components/settings/<PaneName>Pane.tsx— create the React pane component.desktop/src/components/kim-ui/RevampSettings.tsx— add the pane toPANE_METAand the pane router switch.desktop/src/components/kim-ui/settings-panes/— if adding a nav icon, add it toicons.tsx.
desktop/src/types/events.schema.json— define the new event shape.- Run
npm run gen:events(fromdesktop/) — regenerates all three codegen targets:desktop/src/types/events.gen.ts,desktop/src-tauri/src/events.gen.rs, andorchestrator/events_gen.py(do not hand-edit any of them). - Emit site (e.g.
orchestrator/agent.py/orchestrator/cli.py) — call the generatedemit_<event>(...)helper fromorchestrator/events_gen.py. desktop/src/hooks/useChatStream.ts(or the relevant consumer) — add a listener for the typedkim:<event>Tauri event (names inKimEventNames,events.gen.ts).
Typed IPC (ipc_protocol: typed) is the default. Legacy mode (ipc_protocol: legacy in config.yaml) forwards raw stdout lines on kim-agent-output; text-tag parsing for that path lives in desktop/src/components/chat/parsers.ts.
mcp_server/tools/web/— main web tool handlers, split by concern:actions.py(web_fill_form, clicks),navigation.py,observation.py(web_observe,FORM_SCHEMA),resolution.py,browser.py(Playwright/CDP session).mcp_server/tools/web_element_scoring.py— element resolver, synonym table, scoring logic.orchestrator/providers/browser/site_configs.py— per-site overrides (SITE_CONFIGS) for the browser provider.tests/evals/<fixture>.py— add or update a fixture-driven eval for the bug scenario (e.g.tests/evals/test_web_fill_form_eval.py).tests/test_web_*.py— unit test for the specific fix (e.g.test_web_resolver.py,test_web_wait_for.py).
# Python — all
python -m pytest tests/ -q
# Python — agent + providers only
python -m pytest tests/test_agent*.py tests/test_providers*.py -v
# Python — MCP tools only
python -m pytest tests/test_mcp*.py -v
# Python — web evals
python -m pytest tests/evals/ -v
# Frontend
cd desktop && npm run test && npx tsc --noEmit
# Rust
cd desktop/src-tauri && cargo test
cd cli && cargo test