Replace the single file-structure.md with a stratified layout designed
for AI/agent skill consumption: tables and concrete identifiers over
prose, files loaded on demand, content separated by churn rate.
Layers:
- architecture/ stable structural reference (overview, source-map,
test-map, data-flow)
- patterns/ memory, commands, autocomplete, events, xmpp,
encryption, ui, plugins
- testing/ unit-tests, stubs, functional-tests, bench
- build/ local, docker, ci
- playbooks/ add-command, add-test, add-autocomplete,
add-event-handler, add-encryption
- gotchas.md append-only dated entries (seven seed entries)
- wip/ branch-specific notes; deleted on merge to master
Stable layers describe cproof on master only. In-flight feature
branches (currently feat/ai) get a single file under wip/.
INDEX.md is the entry map with churn labels; SKILL.md is the
always-loaded skill hint pointing to it.
2.7 KiB
2.7 KiB
Data flow
High-level paths through the codebase. Use this when reasoning about where a change should land or where a bug originates.
User input → action
keypress
→ src/ui/inputwin.c (line editor, key dispatch)
→ src/command/cmd_ac.c (autocomplete on Tab)
→ src/command/cmd_defs.c (parse / lookup)
→ src/command/cmd_funcs.c (handler: cmd_<name>)
→ side effects: src/xmpp/, src/config/, src/ui/, src/event/
- Tab triggers autocomplete via
cmd_ac.clookup inac_funcshash table (key:/cmd, value: per-command_<cmd>_autocompletefunction). - Enter parses input via
parse_args()(src/tools/parser.c), looks up theCommand*viacmd_get()(src/command/cmd_defs.c), invokes the handler declared withCMD_MAINFUNCor one of theCMD_SUBFUNCS.
Outgoing chat message
cmd_msg / typing-into-chatwin
→ src/xmpp/message.c (build message stanza)
→ src/xmpp/stanza.c (assemble XML)
→ libstrophe (send)
→ src/chatlog.c (persist locally)
→ src/ui/chatwin.c (echo into window)
Encryption injects between message build and send:
- OMEMO via
src/xmpp/omemo.c→src/omemo/omemo.c(libsignal-protocol). - OTR via
src/otr/otr.c(libotr). - PGP / OX via
src/pgp/gpg.c/src/pgp/ox.c→src/xmpp/ox.c.
Incoming stanza
libstrophe callback
→ src/xmpp/{message,presence,iq,muc,roster}.c (parse, validate)
→ src/event/server_events.c (sv_ev_*)
→ src/ui/{chatwin,mucwin,console,...}.c (render)
→ src/chatlog.c (persist)
server_events.c is the chokepoint — every inbound XMPP event flows through a
sv_ev_* function. UI updates and persistence fan out from there.
Client-initiated events
src/event/client_events.c mirrors server_events.c for events that
originate locally (UI actions, command-driven state changes) but need the
same downstream fan-out.
Connection state
src/xmpp/connection.cowns thejabber_conn_status_t(declared inconnection.h).connection_get_status()returns the current state. Many code paths gate onJABBER_CONNECTED— seepatterns/xmpp.md.- Tests must
will_return(connection_get_status, JABBER_CONNECTED)(or the desired state) before exercising any code path that consults it. Seegotchas.md.
Plugin hook points
Plugin callbacks (src/plugins/callbacks.c) sit on:
- Pre/post message send and receive (around
src/xmpp/message.cflow). - Connection lifecycle (around
src/xmpp/session.c). - Window-switch events (around
src/ui/window_list.c).
See patterns/plugins.md.