branch: elpa/jabber
commit c5df814a72047baf9d46fddeee9cd75b542aa79c
Author: Talos Apollo <[email protected]>
Commit: Talos Apollo <[email protected]>

    docs: Add contributor agent guide
---
 AGENTS.md | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)

diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000000..83f3401022
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,74 @@
+# AGENTS.md
+
+Public guidance for contributors and coding agents working on `emacs-jabber`.
+
+## Project
+
+`emacs-jabber` is an XMPP client for GNU Emacs 29.1+. Emacs Lisp sources live
+in `lisp/`, ERT tests in `tests/`, and the optional OMEMO module in `src/`.
+Runtime package dependencies are `fsm` and `keymap-popup`.
+
+## Architecture
+
+- `jabber-core.el` owns the `jabber-connection` finite-state machine;
+  `jabber-conn.el` owns transport. Preserve state transitions for connection,
+  authentication, binding, Stream Management, resume, and disconnect.
+- `jabber-stanza.el` dispatches incoming IQ, message, and presence stanzas
+  through `jabber-iq-chain`, `jabber-message-chain`, and
+  `jabber-presence-chain`. Add protocol behavior through the appropriate chain.
+- Keep module dependencies layered. In particular, `jabber-chatbuffer.el` must
+  remain independent of `jabber-chat.el`, which already depends on it.
+- Keep parsing and decisions separate from network, SQLite, process, buffer,
+  timer, and notification effects. Async callbacks must verify that their
+  connection, process, and buffer are still live.
+
+## Protocol and data safety
+
+- Read the relevant XEP before changing protocol behavior. Account for every
+  applicable MUST and SHOULD, preserve namespaces and fallback rules, and add
+  focused stanza tests. Update `doap.xml` when support status changes.
+- SQLite contains real user history and encryption state. Schema changes need a
+  forward migration in `jabber-db--migrate`, an updated fresh schema/version,
+  adjusted queries, and migration tests. Never replace migration with a
+  destructive database rebuild.
+- Treat OMEMO and OpenPGP changes as security-sensitive. Preserve encrypted
+  stanza deduplication: the Double Ratchet must not process the same ciphertext
+  twice. Never replace valid stored text with a failed-decryption placeholder.
+- Never expose credentials, message plaintext, keys, or trust data in logs,
+  errors, fixtures, or test artifacts.
+
+## Emacs Lisp conventions
+
+- Use lexical binding. Public names use `jabber-`; internal helpers use
+  `jabber--` or `jabber-MODULE--`.
+- Keep interactive commands thin. Prefer small pure helpers and explicit data
+  flow; apply effects at module boundaries.
+- Use `defvar-local` for buffer state. Every `defcustom` needs an accurate
+  `:type` and `:group`.
+- Use `require` for real module dependencies. Reserve `declare-function` for a
+  verified load cycle or the external OMEMO module.
+- Keep changes focused and add ERT coverage for changed behavior, especially
+  stanza handling, reconnection, persistence, and encryption paths.
+
+## Verification
+
+The Makefile enters the Nix development environment when available.
+
+```sh
+make test      # Parallel ERT files plus the OMEMO module
+make lint      # check-declare, checkdoc, package-lint, relint, test compile
+make module    # Build the OMEMO dynamic module
+make dev       # Autoloads, compile, module, lint, isolated and one-shot tests
+```
+
+Use `make dev` before submission. Tests must use temporary databases and must
+never open a user's live Jabber database; the Makefile sets `jabber-db-path` to
+nil for batch tests.
+
+## Contributions
+
+Send patches to <[email protected]> with a subject like
+`[PATCH emacs-jabber] Short description`.
+
+Send bugs and feature requests to <[email protected]> with a subject like
+`[BUG emacs-jabber] Short description`.

Reply via email to