docs: document agent messaging workflow

Amolith created

Update the manpage source and generated man/html docs for agent-skill,
stdin/password-command handling, sent archive cursors, MAM list/receive
fields, compact XML output, and send-then-wait usage.

Amp-Thread-ID: https://ampcode.com/threads/T-019f2fe4-f392-7688-8b2f-8d40eb9fa4b8

Change summary

doc/xmppc.1      |  123 ++
doc/xmppc.1.adoc |   76 +
doc/xmppc.1.html | 2282 +++++++++++++++++++++++++------------------------
3 files changed, 1,375 insertions(+), 1,106 deletions(-)

Detailed changes

doc/xmppc.1 🔗

@@ -2,12 +2,12 @@
 .\"     Title: xmppc
 .\"    Author: [see the "AUTHOR" section]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 07/29/2023
+.\"      Date: 07/05/2026
 .\"    Manual: \ \&
 .\"    Source: \ \&
 .\"  Language: English
 .\"
-.TH "XMPPC" "1" "07/29/2023" "\ \&" "\ \&"
+.TH "XMPPC" "1" "07/05/2026" "\ \&" "\ \&"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -34,11 +34,15 @@ xmppc \- XMPP Command line Tool
 \fIxmppc\fR [\fIOPTIONS\fR] \-m \fIMODE\fR \fICOMMAND\fR [<args>\&...]
 .sp
 \fIxmppc\fR [\-a \fIACCOUNT\fR] [\-j \fIJID\fR] [\-p \fIPASSWORD\fR] \-m \fIMODE\fR \fICOMMAND\fR [<args>\&...]
+.sp
+\fIxmppc\fR \fIagent\-skill\fR [\fIinstall\fR]
 .SH "DESCRIPTION"
 .sp
 xmppc is a XMPP command line tool\&. You need an XMPP Account to use this tool\&. The account information can be defined via command line argument \-j \fIJID\fR\&. If no password is provided via \-p \fIPASSWORD\fR xmppc will ask the user to enter the password\&. Another option is to define 1 or more accounts within a configuration file\&. The option \-a \fIACCOUNT\fR can be used to select the account\&.
 .sp
 The argument \-m \fIMODE\fR defines the xmppc \fIMODE\fR which should be used (roster, message, pgp, omemo, openpgp, monitor, bookmark, mam, discovery)\&. The \fICOMMAND\fR and the args required by the \fICOMMAND\fR depends on the chosen \fIMODE\fR\&.
+.sp
+The \fIagent\-skill\fR command prints or installs instructions for agent use\&. It does not connect to XMPP\&.
 .SH "OPTIONS"
 .PP
 \fB\-a, \-\-attribute\fR \fIACCOUNT\fR
@@ -55,7 +59,9 @@ of the XMPP Account\&.
 .PP
 \fB\-p, \-\-pwd\fR \fIPWD\fR
 .RS 4
-Password of the XMPP Account\&.
+Password of the XMPP Account\&. Use
+\fI\-\fR
+to read the password from stdin\&.
 .RE
 .PP
 \fB\-v\fR \fIVERBOSE\fR, Verbose flags\&. \-v[v[v[v]]]
@@ -67,6 +73,13 @@ Password of the XMPP Account\&.
 .RS 4
 Print program version number and help
 .RE
+.PP
+\fBagent\-skill\fR [\fIinstall\fR]
+.RS 4
+Print the agent\-facing xmppc instructions\&. With
+\fIinstall\fR, write a small agent skill that tells agents to run
+\fIxmppc agent\-skill\fR\&.
+.RE
 .SH "MODES AND COMMANDS"
 .sp
 xmppc modes\&.
@@ -113,7 +126,25 @@ The message mode can be used to send unencrypted messages to another xmpp accoun
 .IP \(bu 2.3
 .\}
 \fBchat <jid> <message>\fR
-\- Sending unencrypted message to jid
+\- Sending unencrypted message to jid\&. On success, prints one compact XML record after the sent stanza appears in MAM:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+<sent archive\-id="mam\-id" message\-id="stanza\-id" to="jid"/>
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The
+\fIarchive\-id\fR
+is the MAM archive cursor\&. Use it as
+\fImam receive after\-id\fR
+when waiting for a reply\&. The
+\fImessage\-id\fR
+is the client stanza id and is not a MAM cursor\&.
 .RE
 .RE
 .PP
@@ -238,8 +269,59 @@ Message Archive Management (XEP\-0313)
 .sp -1
 .IP \(bu 2.3
 .\}
-\fBlist <jid>\fR
-\- List messages from <jid>
+\fBlist <jid> [field=value \&...]\fR
+\- List archived messages\&. A bare
+\fIjid\fR
+is shorthand for
+\fIwith=jid\fR\&. Supported fields are
+\fIwith\fR,
+\fIstart\fR,
+\fIend\fR,
+\fIafter\-id\fR,
+\fIbefore\-id\fR,
+\fIids\fR, and
+\fImax\fR\&. Field arguments are unordered\&. If no range or id field is supplied,
+\fIstart=\-5m\fR
+is used\&.
+\fImax\fR
+defaults to 5 and is capped at 50\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+\fBreceive <jid> after\-id=<mam\-id> [timeout=300s] [max=5]\fR
+\- Poll MAM with RSM
+\fIafter\fR
+until at least one newer archived message is available or the timeout is reached\&. Prints at most
+\fImax\fR
+messages\&. If no message arrives before the timeout, prints nothing\&.
+.sp
+\fIlist\fR
+and
+\fIreceive\fR
+print one compact XML record per archived message:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+<message id="mam\-id" message\-id="stanza\-id" stamp="\&.\&.\&." from="\&.\&.\&." to="\&.\&.\&."><body>escaped body</body></message>
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The
+\fIid\fR
+attribute is the MAM archive cursor\&. The
+\fImessage\-id\fR
+attribute is the client stanza id\&.
 .RE
 .RE
 .PP
@@ -271,6 +353,16 @@ Service Discovery (XEP\-0030)
 \- item request for <jid>
 .RE
 .RE
+.SH "SEND\-THEN\-WAIT WORKFLOW"
+.sp
+To send a message and then wait for a reply, capture the \fI<sent \&.../>\fR line from \fImessage chat\fR, extract its \fIarchive\-id\fR, and pass that value to \fImam receive\fR as \fIafter\-id\fR\&. This skips the sender\(cqs outgoing archived message and waits for newer archived messages in the conversation\&.
+.sp
+If \fIarchive\-id\fR is empty, the message was sent but the archive cursor was not resolved before timeout\&. Fall back to \fImam list\fR over a recent time window, find the line whose \fImessage\-id\fR matches the \fI<sent \&.../>\fR \fImessage\-id\fR, then use that line\(cqs \fIid\fR as the receive cursor\&.
+.SH "AGENT SKILL"
+.sp
+\fIxmppc agent\-skill\fR prints the agent\-facing contract for using xmppc safely\&. Agents should read $HOME/\&.config/xmppc/AGENTS\&.md when it exists for local policy, allowed accounts, and preferred contacts\&. Agents must not print secrets, password commands, or $HOME/\&.config/xmppc\&.conf\&.
+.sp
+\fIxmppc agent\-skill install\fR writes the small skill $HOME/\&.config/agents/skills/communicating\-through\-xmppc/SKILL\&.md\&. The installed skill points agents back to \fIxmppc agent\-skill\fR for the current command contract\&.
 .SH "ENVIRONMENT VARIABLES"
 .sp
 .RS 4
@@ -340,6 +432,25 @@ pwd=password3
 .RE
 .\}
 .RE
+.sp
+Instead of \fIpwd\fR, an account may use \fIpwd\-cmd\fR to read the password from a local command:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+[account4]
+jid=account4@domain\&.tld
+pwd\-cmd=pass show xmpp/account4
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+\fB$HOME/\&.config/xmppc/AGENTS\&.md\fR
+.RS 4
+Optional user\-written policy for agents using xmppc\&. This file can describe allowed accounts, contacts, and usage rules without exposing secrets\&.
+.RE
 .SH "EXIT STATUS"
 .PP
 \fB0\fR

doc/xmppc.1.adoc 🔗

@@ -12,6 +12,8 @@ SYNOPSIS
 
 'xmppc' [-a 'ACCOUNT'] [-j 'JID'] [-p 'PASSWORD']  -m 'MODE' 'COMMAND' [<args>...]
 
+'xmppc' 'agent-skill' ['install']
+
 
 DESCRIPTION
 -----------
@@ -25,6 +27,9 @@ The argument -m 'MODE' defines the xmppc 'MODE' which should be used (roster,
 message, pgp, omemo, openpgp, monitor, bookmark, mam, discovery). The 'COMMAND'
 and the args required by the 'COMMAND' depends on the chosen 'MODE'.
 
+The 'agent-skill' command prints or installs instructions for agent use. It does
+not connect to XMPP.
+
 
 OPTIONS
 -------
@@ -35,7 +40,7 @@ OPTIONS
   'JID' of the XMPP Account.
 
 *-p, --pwd* 'PWD'::
-  Password of the XMPP Account.
+  Password of the XMPP Account. Use '-' to read the password from stdin.
 
 *-v* 'VERBOSE'::
   Verbose flags. -v[v[v[v]]]::
@@ -44,6 +49,10 @@ OPTIONS
 *--help*::
     Print program version number and help
 
+*agent-skill* ['install']::
+    Print the agent-facing xmppc instructions. With 'install', write a small
+    agent skill that tells agents to run 'xmppc agent-skill'.
+
 
 MODES AND COMMANDS
 ------------------
@@ -60,7 +69,16 @@ roster. The roster is the XMPP list of contacts.
 The message mode can be used to send unencrypted messages to another xmpp
 account.
 
-* *chat <jid> <message>* - Sending unencrypted message to jid
+* *chat <jid> <message>* - Sending unencrypted message to jid. On success,
+  prints one compact XML record after the sent stanza appears in MAM:
++
+----
+<sent archive-id="mam-id" message-id="stanza-id" to="jid"/>
+----
++
+The 'archive-id' is the MAM archive cursor. Use it as 'mam receive after-id' when
+waiting for a reply. The 'message-id' is the client stanza id and is not a MAM
+cursor.
 
 *-m pgp*:: 
 PGP Mode (XEP-0027)
@@ -90,7 +108,24 @@ Monitot mode
 
 *-m mam*:: Message Archive Management (XEP-0313)
 
-* *list <jid>* - List messages from <jid>
+* *list <jid> [field=value ...]* - List archived messages. A bare 'jid' is
+  shorthand for 'with=jid'. Supported fields are 'with', 'start', 'end',
+  'after-id', 'before-id', 'ids', and 'max'. Field arguments are unordered.
+  If no range or id field is supplied, 'start=-5m' is used. 'max' defaults to 5
+  and is capped at 50.
+* *receive <jid> after-id=<mam-id> [timeout=300s] [max=5]* - Poll MAM with RSM
+  'after' until at least one newer archived message is available or the timeout
+  is reached. Prints at most 'max' messages. If no message arrives before the
+  timeout, prints nothing.
++
+'list' and 'receive' print one compact XML record per archived message:
++
+----
+<message id="mam-id" message-id="stanza-id" stamp="..." from="..." to="..."><body>escaped body</body></message>
+----
++
+The 'id' attribute is the MAM archive cursor. The 'message-id' attribute is the
+client stanza id.
 
 *-m discovery*:: Service Discovery (XEP-0030)
 
@@ -98,6 +133,30 @@ Monitot mode
 * *item <jid>* - item request for <jid>
 
 
+SEND-THEN-WAIT WORKFLOW
+-----------------------
+To send a message and then wait for a reply, capture the '<sent .../>' line from
+'message chat', extract its 'archive-id', and pass that value to 'mam receive'
+as 'after-id'. This skips the sender's outgoing archived message and waits for
+newer archived messages in the conversation.
+
+If 'archive-id' is empty, the message was sent but the archive cursor was not
+resolved before timeout. Fall back to 'mam list' over a recent time window, find
+the line whose 'message-id' matches the '<sent .../>' 'message-id', then use that
+line's 'id' as the receive cursor.
+
+AGENT SKILL
+-----------
+'xmppc agent-skill' prints the agent-facing contract for using xmppc safely.
+Agents should read +$HOME/.config/xmppc/AGENTS.md+ when it exists for local policy,
+allowed accounts, and preferred contacts. Agents must not print secrets,
+password commands, or +$HOME/.config/xmppc.conf+.
+
+'xmppc agent-skill install' writes the small skill
++$HOME/.config/agents/skills/communicating-through-xmppc/SKILL.md+. The installed
+skill points agents back to 'xmppc agent-skill' for the current command contract.
+
+
 ENVIRONMENT VARIABLES
 ---------------------
 
@@ -131,6 +190,17 @@ Example:
   jid=account3@domain.tld
   pwd=password3
 
+Instead of 'pwd', an account may use 'pwd-cmd' to read the password from a local
+command:
+
+  [account4]
+  jid=account4@domain.tld
+  pwd-cmd=pass show xmpp/account4
+
+*$HOME/.config/xmppc/AGENTS.md*::
+Optional user-written policy for agents using xmppc. This file can describe
+allowed accounts, contacts, and usage rules without exposing secrets.
+
 EXIT STATUS
 -----------
 *0*::

doc/xmppc.1.html 🔗

@@ -1,1097 +1,1185 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"

-    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

-<head>

-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />

-<meta name="generator" content="AsciiDoc 8.6.10" />

-<title>XMPPC(1)</title>

-<style type="text/css">

-/* Shared CSS for AsciiDoc xhtml11 and html5 backends */

-

-/* Default font. */

-body {

-  font-family: Georgia,serif;

-}

-

-/* Title font. */

-h1, h2, h3, h4, h5, h6,

-div.title, caption.title,

-thead, p.table.header,

-#toctitle,

-#author, #revnumber, #revdate, #revremark,

-#footer {

-  font-family: Arial,Helvetica,sans-serif;

-}

-

-body {

-  margin: 1em 5% 1em 5%;

-}

-

-a {

-  color: blue;

-  text-decoration: underline;

-}

-a:visited {

-  color: fuchsia;

-}

-

-em {

-  font-style: italic;

-  color: navy;

-}

-

-strong {

-  font-weight: bold;

-  color: #083194;

-}

-

-h1, h2, h3, h4, h5, h6 {

-  color: #527bbd;

-  margin-top: 1.2em;

-  margin-bottom: 0.5em;

-  line-height: 1.3;

-}

-

-h1, h2, h3 {

-  border-bottom: 2px solid silver;

-}

-h2 {

-  padding-top: 0.5em;

-}

-h3 {

-  float: left;

-}

-h3 + * {

-  clear: left;

-}

-h5 {

-  font-size: 1.0em;

-}

-

-div.sectionbody {

-  margin-left: 0;

-}

-

-hr {

-  border: 1px solid silver;

-}

-

-p {

-  margin-top: 0.5em;

-  margin-bottom: 0.5em;

-}

-

-ul, ol, li > p {

-  margin-top: 0;

-}

-ul > li     { color: #aaa; }

-ul > li > * { color: black; }

-

-.monospaced, code, pre {

-  font-family: "Courier New", Courier, monospace;

-  font-size: inherit;

-  color: navy;

-  padding: 0;

-  margin: 0;

-}

-pre {

-  white-space: pre-wrap;

-}

-

-#author {

-  color: #527bbd;

-  font-weight: bold;

-  font-size: 1.1em;

-}

-#email {

-}

-#revnumber, #revdate, #revremark {

-}

-

-#footer {

-  font-size: small;

-  border-top: 2px solid silver;

-  padding-top: 0.5em;

-  margin-top: 4.0em;

-}

-#footer-text {

-  float: left;

-  padding-bottom: 0.5em;

-}

-#footer-badges {

-  float: right;

-  padding-bottom: 0.5em;

-}

-

-#preamble {

-  margin-top: 1.5em;

-  margin-bottom: 1.5em;

-}

-div.imageblock, div.exampleblock, div.verseblock,

-div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,

-div.admonitionblock {

-  margin-top: 1.0em;

-  margin-bottom: 1.5em;

-}

-div.admonitionblock {

-  margin-top: 2.0em;

-  margin-bottom: 2.0em;

-  margin-right: 10%;

-  color: #606060;

-}

-

-div.content { /* Block element content. */

-  padding: 0;

-}

-

-/* Block element titles. */

-div.title, caption.title {

-  color: #527bbd;

-  font-weight: bold;

-  text-align: left;

-  margin-top: 1.0em;

-  margin-bottom: 0.5em;

-}

-div.title + * {

-  margin-top: 0;

-}

-

-td div.title:first-child {

-  margin-top: 0.0em;

-}

-div.content div.title:first-child {

-  margin-top: 0.0em;

-}

-div.content + div.title {

-  margin-top: 0.0em;

-}

-

-div.sidebarblock > div.content {

-  background: #ffffee;

-  border: 1px solid #dddddd;

-  border-left: 4px solid #f0f0f0;

-  padding: 0.5em;

-}

-

-div.listingblock > div.content {

-  border: 1px solid #dddddd;

-  border-left: 5px solid #f0f0f0;

-  background: #f8f8f8;

-  padding: 0.5em;

-}

-

-div.quoteblock, div.verseblock {

-  padding-left: 1.0em;

-  margin-left: 1.0em;

-  margin-right: 10%;

-  border-left: 5px solid #f0f0f0;

-  color: #888;

-}

-

-div.quoteblock > div.attribution {

-  padding-top: 0.5em;

-  text-align: right;

-}

-

-div.verseblock > pre.content {

-  font-family: inherit;

-  font-size: inherit;

-}

-div.verseblock > div.attribution {

-  padding-top: 0.75em;

-  text-align: left;

-}

-/* DEPRECATED: Pre version 8.2.7 verse style literal block. */

-div.verseblock + div.attribution {

-  text-align: left;

-}

-

-div.admonitionblock .icon {

-  vertical-align: top;

-  font-size: 1.1em;

-  font-weight: bold;

-  text-decoration: underline;

-  color: #527bbd;

-  padding-right: 0.5em;

-}

-div.admonitionblock td.content {

-  padding-left: 0.5em;

-  border-left: 3px solid #dddddd;

-}

-

-div.exampleblock > div.content {

-  border-left: 3px solid #dddddd;

-  padding-left: 0.5em;

-}

-

-div.imageblock div.content { padding-left: 0; }

-span.image img { border-style: none; vertical-align: text-bottom; }

-a.image:visited { color: white; }

-

-dl {

-  margin-top: 0.8em;

-  margin-bottom: 0.8em;

-}

-dt {

-  margin-top: 0.5em;

-  margin-bottom: 0;

-  font-style: normal;

-  color: navy;

-}

-dd > *:first-child {

-  margin-top: 0.1em;

-}

-

-ul, ol {

-    list-style-position: outside;

-}

-ol.arabic {

-  list-style-type: decimal;

-}

-ol.loweralpha {

-  list-style-type: lower-alpha;

-}

-ol.upperalpha {

-  list-style-type: upper-alpha;

-}

-ol.lowerroman {

-  list-style-type: lower-roman;

-}

-ol.upperroman {

-  list-style-type: upper-roman;

-}

-

-div.compact ul, div.compact ol,

-div.compact p, div.compact p,

-div.compact div, div.compact div {

-  margin-top: 0.1em;

-  margin-bottom: 0.1em;

-}

-

-tfoot {

-  font-weight: bold;

-}

-td > div.verse {

-  white-space: pre;

-}

-

-div.hdlist {

-  margin-top: 0.8em;

-  margin-bottom: 0.8em;

-}

-div.hdlist tr {

-  padding-bottom: 15px;

-}

-dt.hdlist1.strong, td.hdlist1.strong {

-  font-weight: bold;

-}

-td.hdlist1 {

-  vertical-align: top;

-  font-style: normal;

-  padding-right: 0.8em;

-  color: navy;

-}

-td.hdlist2 {

-  vertical-align: top;

-}

-div.hdlist.compact tr {

-  margin: 0;

-  padding-bottom: 0;

-}

-

-.comment {

-  background: yellow;

-}

-

-.footnote, .footnoteref {

-  font-size: 0.8em;

-}

-

-span.footnote, span.footnoteref {

-  vertical-align: super;

-}

-

-#footnotes {

-  margin: 20px 0 20px 0;

-  padding: 7px 0 0 0;

-}

-

-#footnotes div.footnote {

-  margin: 0 0 5px 0;

-}

-

-#footnotes hr {

-  border: none;

-  border-top: 1px solid silver;

-  height: 1px;

-  text-align: left;

-  margin-left: 0;

-  width: 20%;

-  min-width: 100px;

-}

-

-div.colist td {

-  padding-right: 0.5em;

-  padding-bottom: 0.3em;

-  vertical-align: top;

-}

-div.colist td img {

-  margin-top: 0.3em;

-}

-

-@media print {

-  #footer-badges { display: none; }

-}

-

-#toc {

-  margin-bottom: 2.5em;

-}

-

-#toctitle {

-  color: #527bbd;

-  font-size: 1.1em;

-  font-weight: bold;

-  margin-top: 1.0em;

-  margin-bottom: 0.1em;

-}

-

-div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {

-  margin-top: 0;

-  margin-bottom: 0;

-}

-div.toclevel2 {

-  margin-left: 2em;

-  font-size: 0.9em;

-}

-div.toclevel3 {

-  margin-left: 4em;

-  font-size: 0.9em;

-}

-div.toclevel4 {

-  margin-left: 6em;

-  font-size: 0.9em;

-}

-

-span.aqua { color: aqua; }

-span.black { color: black; }

-span.blue { color: blue; }

-span.fuchsia { color: fuchsia; }

-span.gray { color: gray; }

-span.green { color: green; }

-span.lime { color: lime; }

-span.maroon { color: maroon; }

-span.navy { color: navy; }

-span.olive { color: olive; }

-span.purple { color: purple; }

-span.red { color: red; }

-span.silver { color: silver; }

-span.teal { color: teal; }

-span.white { color: white; }

-span.yellow { color: yellow; }

-

-span.aqua-background { background: aqua; }

-span.black-background { background: black; }

-span.blue-background { background: blue; }

-span.fuchsia-background { background: fuchsia; }

-span.gray-background { background: gray; }

-span.green-background { background: green; }

-span.lime-background { background: lime; }

-span.maroon-background { background: maroon; }

-span.navy-background { background: navy; }

-span.olive-background { background: olive; }

-span.purple-background { background: purple; }

-span.red-background { background: red; }

-span.silver-background { background: silver; }

-span.teal-background { background: teal; }

-span.white-background { background: white; }

-span.yellow-background { background: yellow; }

-

-span.big { font-size: 2em; }

-span.small { font-size: 0.6em; }

-

-span.underline { text-decoration: underline; }

-span.overline { text-decoration: overline; }

-span.line-through { text-decoration: line-through; }

-

-div.unbreakable { page-break-inside: avoid; }

-

-

-/*

- * xhtml11 specific

- *

- * */

-

-div.tableblock {

-  margin-top: 1.0em;

-  margin-bottom: 1.5em;

-}

-div.tableblock > table {

-  border: 3px solid #527bbd;

-}

-thead, p.table.header {

-  font-weight: bold;

-  color: #527bbd;

-}

-p.table {

-  margin-top: 0;

-}

-/* Because the table frame attribute is overriden by CSS in most browsers. */

-div.tableblock > table[frame="void"] {

-  border-style: none;

-}

-div.tableblock > table[frame="hsides"] {

-  border-left-style: none;

-  border-right-style: none;

-}

-div.tableblock > table[frame="vsides"] {

-  border-top-style: none;

-  border-bottom-style: none;

-}

-

-

-/*

- * html5 specific

- *

- * */

-

-table.tableblock {

-  margin-top: 1.0em;

-  margin-bottom: 1.5em;

-}

-thead, p.tableblock.header {

-  font-weight: bold;

-  color: #527bbd;

-}

-p.tableblock {

-  margin-top: 0;

-}

-table.tableblock {

-  border-width: 3px;

-  border-spacing: 0px;

-  border-style: solid;

-  border-color: #527bbd;

-  border-collapse: collapse;

-}

-th.tableblock, td.tableblock {

-  border-width: 1px;

-  padding: 4px;

-  border-style: solid;

-  border-color: #527bbd;

-}

-

-table.tableblock.frame-topbot {

-  border-left-style: hidden;

-  border-right-style: hidden;

-}

-table.tableblock.frame-sides {

-  border-top-style: hidden;

-  border-bottom-style: hidden;

-}

-table.tableblock.frame-none {

-  border-style: hidden;

-}

-

-th.tableblock.halign-left, td.tableblock.halign-left {

-  text-align: left;

-}

-th.tableblock.halign-center, td.tableblock.halign-center {

-  text-align: center;

-}

-th.tableblock.halign-right, td.tableblock.halign-right {

-  text-align: right;

-}

-

-th.tableblock.valign-top, td.tableblock.valign-top {

-  vertical-align: top;

-}

-th.tableblock.valign-middle, td.tableblock.valign-middle {

-  vertical-align: middle;

-}

-th.tableblock.valign-bottom, td.tableblock.valign-bottom {

-  vertical-align: bottom;

-}

-

-

-/*

- * manpage specific

- *

- * */

-

-body.manpage h1 {

-  padding-top: 0.5em;

-  padding-bottom: 0.5em;

-  border-top: 2px solid silver;

-  border-bottom: 2px solid silver;

-}

-body.manpage h2 {

-  border-style: none;

-}

-body.manpage div.sectionbody {

-  margin-left: 3em;

-}

-

-@media print {

-  body.manpage div#toc { display: none; }

-}

-

-

-</style>

-<script type="text/javascript">

-/*<![CDATA[*/

-var asciidoc = {  // Namespace.

-

-/////////////////////////////////////////////////////////////////////

-// Table Of Contents generator

-/////////////////////////////////////////////////////////////////////

-

-/* Author: Mihai Bazon, September 2002

- * http://students.infoiasi.ro/~mishoo

- *

- * Table Of Content generator

- * Version: 0.4

- *

- * Feel free to use this script under the terms of the GNU General Public

- * License, as long as you do not remove or alter this notice.

- */

-

- /* modified by Troy D. Hanson, September 2006. License: GPL */

- /* modified by Stuart Rackham, 2006, 2009. License: GPL */

-

-// toclevels = 1..4.

-toc: function (toclevels) {

-

-  function getText(el) {

-    var text = "";

-    for (var i = el.firstChild; i != null; i = i.nextSibling) {

-      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.

-        text += i.data;

-      else if (i.firstChild != null)

-        text += getText(i);

-    }

-    return text;

-  }

-

-  function TocEntry(el, text, toclevel) {

-    this.element = el;

-    this.text = text;

-    this.toclevel = toclevel;

-  }

-

-  function tocEntries(el, toclevels) {

-    var result = new Array;

-    var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');

-    // Function that scans the DOM tree for header elements (the DOM2

-    // nodeIterator API would be a better technique but not supported by all

-    // browsers).

-    var iterate = function (el) {

-      for (var i = el.firstChild; i != null; i = i.nextSibling) {

-        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {

-          var mo = re.exec(i.tagName);

-          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {

-            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);

-          }

-          iterate(i);

-        }

-      }

-    }

-    iterate(el);

-    return result;

-  }

-

-  var toc = document.getElementById("toc");

-  if (!toc) {

-    return;

-  }

-

-  // Delete existing TOC entries in case we're reloading the TOC.

-  var tocEntriesToRemove = [];

-  var i;

-  for (i = 0; i < toc.childNodes.length; i++) {

-    var entry = toc.childNodes[i];

-    if (entry.nodeName.toLowerCase() == 'div'

-     && entry.getAttribute("class")

-     && entry.getAttribute("class").match(/^toclevel/))

-      tocEntriesToRemove.push(entry);

-  }

-  for (i = 0; i < tocEntriesToRemove.length; i++) {

-    toc.removeChild(tocEntriesToRemove[i]);

-  }

-

-  // Rebuild TOC entries.

-  var entries = tocEntries(document.getElementById("content"), toclevels);

-  for (var i = 0; i < entries.length; ++i) {

-    var entry = entries[i];

-    if (entry.element.id == "")

-      entry.element.id = "_toc_" + i;

-    var a = document.createElement("a");

-    a.href = "#" + entry.element.id;

-    a.appendChild(document.createTextNode(entry.text));

-    var div = document.createElement("div");

-    div.appendChild(a);

-    div.className = "toclevel" + entry.toclevel;

-    toc.appendChild(div);

-  }

-  if (entries.length == 0)

-    toc.parentNode.removeChild(toc);

-},

-

-

-/////////////////////////////////////////////////////////////////////

-// Footnotes generator

-/////////////////////////////////////////////////////////////////////

-

-/* Based on footnote generation code from:

- * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html

- */

-

-footnotes: function () {

-  // Delete existing footnote entries in case we're reloading the footnodes.

-  var i;

-  var noteholder = document.getElementById("footnotes");

-  if (!noteholder) {

-    return;

-  }

-  var entriesToRemove = [];

-  for (i = 0; i < noteholder.childNodes.length; i++) {

-    var entry = noteholder.childNodes[i];

-    if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")

-      entriesToRemove.push(entry);

-  }

-  for (i = 0; i < entriesToRemove.length; i++) {

-    noteholder.removeChild(entriesToRemove[i]);

-  }

-

-  // Rebuild footnote entries.

-  var cont = document.getElementById("content");

-  var spans = cont.getElementsByTagName("span");

-  var refs = {};

-  var n = 0;

-  for (i=0; i<spans.length; i++) {

-    if (spans[i].className == "footnote") {

-      n++;

-      var note = spans[i].getAttribute("data-note");

-      if (!note) {

-        // Use [\s\S] in place of . so multi-line matches work.

-        // Because JavaScript has no s (dotall) regex flag.

-        note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];

-        spans[i].innerHTML =

-          "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +

-          "' title='View footnote' class='footnote'>" + n + "</a>]";

-        spans[i].setAttribute("data-note", note);

-      }

-      noteholder.innerHTML +=

-        "<div class='footnote' id='_footnote_" + n + "'>" +

-        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +

-        n + "</a>. " + note + "</div>";

-      var id =spans[i].getAttribute("id");

-      if (id != null) refs["#"+id] = n;

-    }

-  }

-  if (n == 0)

-    noteholder.parentNode.removeChild(noteholder);

-  else {

-    // Process footnoterefs.

-    for (i=0; i<spans.length; i++) {

-      if (spans[i].className == "footnoteref") {

-        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");

-        href = href.match(/#.*/)[0];  // Because IE return full URL.

-        n = refs[href];

-        spans[i].innerHTML =

-          "[<a href='#_footnote_" + n +

-          "' title='View footnote' class='footnote'>" + n + "</a>]";

-      }

-    }

-  }

-},

-

-install: function(toclevels) {

-  var timerId;

-

-  function reinstall() {

-    asciidoc.footnotes();

-    if (toclevels) {

-      asciidoc.toc(toclevels);

-    }

-  }

-

-  function reinstallAndRemoveTimer() {

-    clearInterval(timerId);

-    reinstall();

-  }

-

-  timerId = setInterval(reinstall, 500);

-  if (document.addEventListener)

-    document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);

-  else

-    window.onload = reinstallAndRemoveTimer;

-}

-

-}

-asciidoc.install();

-/*]]>*/

-</script>

-</head>

-<body class="article">

-<div id="header">

-<h1>XMPPC(1)</h1>

-</div>

-<div id="content">

-<div class="sect1">

-<h2 id="_name">NAME</h2>

-<div class="sectionbody">

-<div class="paragraph"><p>xmppc - XMPP Command line Tool</p></div>

-</div>

-</div>

-<div class="sect1">

-<h2 id="_synopsis">SYNOPSIS</h2>

-<div class="sectionbody">

-<div class="paragraph"><p><em>xmppc</em> [<em>OPTIONS</em>] -m <em>MODE</em> <em>COMMAND</em> [&lt;args&gt;&#8230;]</p></div>

-<div class="paragraph"><p><em>xmppc</em> [-a <em>ACCOUNT</em>] [-j <em>JID</em>] [-p <em>PASSWORD</em>]  -m <em>MODE</em> <em>COMMAND</em> [&lt;args&gt;&#8230;]</p></div>

-</div>

-</div>

-<div class="sect1">

-<h2 id="_description">DESCRIPTION</h2>

-<div class="sectionbody">

-<div class="paragraph"><p>xmppc is a XMPP command line tool. You need an XMPP Account to use this tool.

-The account information can be defined via command line argument -j <em>JID</em>. If no

-password is provided via -p <em>PASSWORD</em> xmppc will ask the user to enter the

-password. Another option is to define 1 or more accounts within a configuration

-file. The option -a <em>ACCOUNT</em> can be used to select the account.</p></div>

-<div class="paragraph"><p>The argument -m <em>MODE</em> defines the xmppc <em>MODE</em> which should be used (roster,

-message, pgp, omemo, openpgp, monitor, bookmark, mam, discovery). The <em>COMMAND</em>

-and the args required by the <em>COMMAND</em> depends on the chosen <em>MODE</em>.</p></div>

-</div>

-</div>

-<div class="sect1">

-<h2 id="_options">OPTIONS</h2>

-<div class="sectionbody">

-<div class="dlist"><dl>

-<dt class="hdlist1">

-<strong>-a, --attribute</strong> <em>ACCOUNT</em>

-</dt>

-<dd>

-<p>

-  <em>ACCOUNT</em> is a name of a xmpp account defined within the configuration file.

-</p>

-</dd>

-<dt class="hdlist1">

-<strong>-j, --jid</strong> <em>JID</em>

-</dt>

-<dd>

-<p>

-  <em>JID</em> of the XMPP Account.

-</p>

-</dd>

-<dt class="hdlist1">

-<strong>-p, --pwd</strong> <em>PWD</em>

-</dt>

-<dd>

-<p>

-  Password of the XMPP Account.

-</p>

-</dd>

-<dt class="hdlist1">

-<strong>-v</strong> <em>VERBOSE</em>

-</dt>

-<dt class="hdlist1">

-Verbose flags. -v[v[v[v]]]

-</dt>

-<dd>

-<p>

-  -v is WARN -vv is INFO --vvv is DEBUG -vvvv is TRACE

-</p>

-</dd>

-<dt class="hdlist1">

-<strong>--help</strong>

-</dt>

-<dd>

-<p>

-    Print program version number and help

-</p>

-</dd>

-</dl></div>

-</div>

-</div>

-<div class="sect1">

-<h2 id="_modes_and_commands">MODES AND COMMANDS</h2>

-<div class="sectionbody">

-<div class="paragraph"><p>xmppc modes.</p></div>

-<div class="dlist"><dl>

-<dt class="hdlist1">

-<strong>-m roster</strong>

-</dt>

-<dd>

-<p>

-The Roster mode can be used to provided information of the xmpp account&#8217;s

-roster. The roster is the XMPP list of contacts.

-</p>

-<div class="ulist"><ul>

-<li>

-<p>

-<strong>list</strong> - List all contacts

-</p>

-</li>

-<li>

-<p>

-<strong>export</strong> - Exports all contacts

-</p>

-</li>

-</ul></div>

-</dd>

-<dt class="hdlist1">

-<strong>-m message</strong>

-</dt>

-<dd>

-<p>

-The message mode can be used to send unencrypted messages to another xmpp

-account.

-</p>

-<div class="ulist"><ul>

-<li>

-<p>

-<strong>chat &lt;jid&gt; &lt;message&gt;</strong> - Sending unencrypted message to jid

-</p>

-</li>

-</ul></div>

-</dd>

-<dt class="hdlist1">

-<strong>-m pgp</strong>

-</dt>

-<dd>

-<p>

-PGP Mode (XEP-0027)

-</p>

-<div class="ulist"><ul>

-<li>

-<p>

-<strong>chat &lt;jid&gt; &lt;message&gt;</strong> - Sending pgp encrypted message to jid

-</p>

-</li>

-</ul></div>

-</dd>

-<dt class="hdlist1">

-<strong>-m omemo</strong>

-</dt>

-<dd>

-<p>

-OMEMO Mode (XEP-0384)

-</p>

-<div class="ulist"><ul>

-<li>

-<p>

-<strong>list</strong> - List the device IDs and fingerprints

-</p>

-</li>

-</ul></div>

-</dd>

-<dt class="hdlist1">

-<strong>-m openpgp</strong>

-</dt>

-<dd>

-<p>

-openpgp mode (XEP-0373)

-</p>

-<div class="ulist"><ul>

-<li>

-<p>

-<strong>signcrypt &lt;jid&gt; &lt;message&gt;</strong> - Sending pgp signed and encrypted message to jid

-</p>

-</li>

-</ul></div>

-</dd>

-<dt class="hdlist1">

-<strong>-m monitor</strong>

-</dt>

-<dd>

-<p>

-Monitot mode

-</p>

-<div class="ulist"><ul>

-<li>

-<p>

-<strong>stanza</strong> - Stanza Monitor

-</p>

-</li>

-<li>

-<p>

-<strong>monitor</strong> - microblog Monitor microblog (XEP-0277)

-</p>

-</li>

-</ul></div>

-</dd>

-<dt class="hdlist1">

-<strong>-m bookmark</strong>

-</dt>

-<dd>

-<p>

-Bookmark mode (XEP-0048)

-</p>

-<div class="ulist"><ul>

-<li>

-<p>

-<strong>list</strong> - List bookmarks

-</p>

-</li>

-</ul></div>

-</dd>

-<dt class="hdlist1">

-<strong>-m mam</strong>

-</dt>

-<dd>

-<p>

-Message Archive Management (XEP-0313)

-</p>

-<div class="ulist"><ul>

-<li>

-<p>

-<strong>list &lt;jid&gt;</strong> - List messages from &lt;jid&gt;

-</p>

-</li>

-</ul></div>

-</dd>

-<dt class="hdlist1">

-<strong>-m discovery</strong>

-</dt>

-<dd>

-<p>

-Service Discovery (XEP-0030)

-</p>

-<div class="ulist"><ul>

-<li>

-<p>

-<strong>info &lt;jid&gt;</strong> - info request for &lt;jid&gt;

-</p>

-</li>

-<li>

-<p>

-<strong>item &lt;jid&gt;</strong> - item request for &lt;jid&gt;

-</p>

-</li>

-</ul></div>

-</dd>

-</dl></div>

-</div>

-</div>

-<div class="sect1">

-<h2 id="_environment_variables">ENVIRONMENT VARIABLES</h2>

-<div class="sectionbody">

-<div class="ulist"><ul>

-<li>

-<p>

-HOME

-</p>

-</li>

-</ul></div>

-</div>

-</div>

-<div class="sect1">

-<h2 id="_examples">EXAMPLES</h2>

-<div class="sectionbody">

-<div class="literalblock">

-<div class="content">

-<pre><code>xmppc --jid user@domain.tld --pwd "secret" --mode roster list

-xmppc --jid user@domain.tld --mode pgp chat friend@domain.tld "Hello"

-xmppc -a account1 --mode discovery item conference@domain.tld

-xmppc --mode bookmark list</code></pre>

-</div></div>

-</div>

-</div>

-<div class="sect1">

-<h2 id="_files">FILES</h2>

-<div class="sectionbody">

-<div class="paragraph"><p>Configuration file to setup accounts.</p></div>

-<div class="dlist"><dl>

-<dt class="hdlist1">

-<strong>~/.config/xmppc.conf</strong>

-</dt>

-<dd>

-<p>

-Example:

-</p>

-<div class="literalblock">

-<div class="content">

-<pre><code>[default]

-jid=account1@domain.tld

-pwd=password1</code></pre>

-</div></div>

-<div class="literalblock">

-<div class="content">

-<pre><code>[account2]

-jid=account2@domain.tld</code></pre>

-</div></div>

-<div class="literalblock">

-<div class="content">

-<pre><code>[account3]

-jid=account3@domain.tld

-pwd=password3</code></pre>

-</div></div>

-</dd>

-</dl></div>

-</div>

-</div>

-<div class="sect1">

-<h2 id="_exit_status">EXIT STATUS</h2>

-<div class="sectionbody">

-<div class="dlist"><dl>

-<dt class="hdlist1">

-<strong>0</strong>

-</dt>

-<dd>

-<p>

-    Success

-</p>

-</dd>

-<dt class="hdlist1">

-<strong>1</strong>

-</dt>

-<dd>

-<p>

-    Failure

-</p>

-</dd>

-</dl></div>

-</div>

-</div>

-<div class="sect1">

-<h2 id="_bugs">BUGS</h2>

-<div class="sectionbody">

-<div class="paragraph"><p>See <a href="https://codeberg.org/Anoxinon_e.V./xmppc/issues">https://codeberg.org/Anoxinon_e.V./xmppc/issues</a></p></div>

-</div>

-</div>

-<div class="sect1">

-<h2 id="_author">AUTHOR</h2>

-<div class="sectionbody">

-<div class="ulist"><ul>

-<li>

-<p>

-DebXWoody (OpenPGP: A602F76893F138B4A8EFDDD5C2DC916F35751C24)

-</p>

-</li>

-</ul></div>

-</div>

-</div>

-<div class="sect1">

-<h2 id="_resources">RESOURCES</h2>

-<div class="sectionbody">

-<div class="paragraph"><p>Source: <a href="https://codeberg.org/Anoxinon_e.V./xmppc">https://codeberg.org/Anoxinon_e.V./xmppc</a></p></div>

-<div class="paragraph"><p>Documentation: <a href="https://codeberg.org/Anoxinon_e.V./xmppc/wiki">https://codeberg.org/Anoxinon_e.V./xmppc/wiki</a></p></div>

-</div>

-</div>

-<div class="sect1">

-<h2 id="_copying">COPYING</h2>

-<div class="sectionbody">

-<div class="paragraph"><p>Copyright (C) 2020 Anoxinon e.V. Free use of this software is

-granted under the terms of the GNU General Public License (GPL).</p></div>

-</div>

-</div>

-</div>

-<div id="footnotes"><hr /></div>

-<div id="footer">

-<div id="footer-text">

-Last updated

- 2020-05-16 08:40:22 CEST

-</div>

-</div>

-</body>

-</html>

+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
+<title>XMPPC(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+  font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+  font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+  margin: 1em 5% 1em 5%;
+}
+
+a {
+  color: blue;
+  text-decoration: underline;
+}
+a:visited {
+  color: fuchsia;
+}
+
+em {
+  font-style: italic;
+  color: navy;
+}
+
+strong {
+  font-weight: bold;
+  color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  color: #527bbd;
+  margin-top: 1.2em;
+  margin-bottom: 0.5em;
+  line-height: 1.3;
+}
+
+h1, h2, h3 {
+  border-bottom: 2px solid silver;
+}
+h2 {
+  padding-top: 0.5em;
+}
+h3 {
+  float: left;
+}
+h3 + * {
+  clear: left;
+}
+h5 {
+  font-size: 1.0em;
+}
+
+div.sectionbody {
+  margin-left: 0;
+}
+
+hr {
+  border: 1px solid silver;
+}
+
+p {
+  margin-top: 0.5em;
+  margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+  margin-top: 0;
+}
+ul > li     { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+  font-family: "Courier New", Courier, monospace;
+  font-size: inherit;
+  color: navy;
+  padding: 0;
+  margin: 0;
+}
+pre {
+  white-space: pre-wrap;
+}
+
+#author {
+  color: #527bbd;
+  font-weight: bold;
+  font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+  font-size: small;
+  border-top: 2px solid silver;
+  padding-top: 0.5em;
+  margin-top: 4.0em;
+}
+#footer-text {
+  float: left;
+  padding-bottom: 0.5em;
+}
+#footer-badges {
+  float: right;
+  padding-bottom: 0.5em;
+}
+
+#preamble {
+  margin-top: 1.5em;
+  margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+  margin-top: 1.0em;
+  margin-bottom: 1.5em;
+}
+div.admonitionblock {
+  margin-top: 2.0em;
+  margin-bottom: 2.0em;
+  margin-right: 10%;
+  color: #606060;
+}
+
+div.content { /* Block element content. */
+  padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+  color: #527bbd;
+  font-weight: bold;
+  text-align: left;
+  margin-top: 1.0em;
+  margin-bottom: 0.5em;
+}
+div.title + * {
+  margin-top: 0;
+}
+
+td div.title:first-child {
+  margin-top: 0.0em;
+}
+div.content div.title:first-child {
+  margin-top: 0.0em;
+}
+div.content + div.title {
+  margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+  background: #ffffee;
+  border: 1px solid #dddddd;
+  border-left: 4px solid #f0f0f0;
+  padding: 0.5em;
+}
+
+div.listingblock > div.content {
+  border: 1px solid #dddddd;
+  border-left: 5px solid #f0f0f0;
+  background: #f8f8f8;
+  padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+  padding-left: 1.0em;
+  margin-left: 1.0em;
+  margin-right: 10%;
+  border-left: 5px solid #f0f0f0;
+  color: #888;
+}
+
+div.quoteblock > div.attribution {
+  padding-top: 0.5em;
+  text-align: right;
+}
+
+div.verseblock > pre.content {
+  font-family: inherit;
+  font-size: inherit;
+}
+div.verseblock > div.attribution {
+  padding-top: 0.75em;
+  text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+  text-align: left;
+}
+
+div.admonitionblock .icon {
+  vertical-align: top;
+  font-size: 1.1em;
+  font-weight: bold;
+  text-decoration: underline;
+  color: #527bbd;
+  padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+  padding-left: 0.5em;
+  border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+  border-left: 3px solid #dddddd;
+  padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+  margin-top: 0.8em;
+  margin-bottom: 0.8em;
+}
+dt {
+  margin-top: 0.5em;
+  margin-bottom: 0;
+  font-style: normal;
+  color: navy;
+}
+dd > *:first-child {
+  margin-top: 0.1em;
+}
+
+ul, ol {
+    list-style-position: outside;
+}
+ol.arabic {
+  list-style-type: decimal;
+}
+ol.loweralpha {
+  list-style-type: lower-alpha;
+}
+ol.upperalpha {
+  list-style-type: upper-alpha;
+}
+ol.lowerroman {
+  list-style-type: lower-roman;
+}
+ol.upperroman {
+  list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+  margin-top: 0.1em;
+  margin-bottom: 0.1em;
+}
+
+tfoot {
+  font-weight: bold;
+}
+td > div.verse {
+  white-space: pre;
+}
+
+div.hdlist {
+  margin-top: 0.8em;
+  margin-bottom: 0.8em;
+}
+div.hdlist tr {
+  padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+  font-weight: bold;
+}
+td.hdlist1 {
+  vertical-align: top;
+  font-style: normal;
+  padding-right: 0.8em;
+  color: navy;
+}
+td.hdlist2 {
+  vertical-align: top;
+}
+div.hdlist.compact tr {
+  margin: 0;
+  padding-bottom: 0;
+}
+
+.comment {
+  background: yellow;
+}
+
+.footnote, .footnoteref {
+  font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+  vertical-align: super;
+}
+
+#footnotes {
+  margin: 20px 0 20px 0;
+  padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+  margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+  border: none;
+  border-top: 1px solid silver;
+  height: 1px;
+  text-align: left;
+  margin-left: 0;
+  width: 20%;
+  min-width: 100px;
+}
+
+div.colist td {
+  padding-right: 0.5em;
+  padding-bottom: 0.3em;
+  vertical-align: top;
+}
+div.colist td img {
+  margin-top: 0.3em;
+}
+
+@media print {
+  #footer-badges { display: none; }
+}
+
+#toc {
+  margin-bottom: 2.5em;
+}
+
+#toctitle {
+  color: #527bbd;
+  font-size: 1.1em;
+  font-weight: bold;
+  margin-top: 1.0em;
+  margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+div.toclevel2 {
+  margin-left: 2em;
+  font-size: 0.9em;
+}
+div.toclevel3 {
+  margin-left: 4em;
+  font-size: 0.9em;
+}
+div.toclevel4 {
+  margin-left: 6em;
+  font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+  margin-top: 1.0em;
+  margin-bottom: 1.5em;
+}
+div.tableblock > table {
+  border: 3px solid #527bbd;
+}
+thead, p.table.header {
+  font-weight: bold;
+  color: #527bbd;
+}
+p.table {
+  margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+  border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+  border-left-style: none;
+  border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+  border-top-style: none;
+  border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+  margin-top: 1.0em;
+  margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+  font-weight: bold;
+  color: #527bbd;
+}
+p.tableblock {
+  margin-top: 0;
+}
+table.tableblock {
+  border-width: 3px;
+  border-spacing: 0px;
+  border-style: solid;
+  border-color: #527bbd;
+  border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+  border-width: 1px;
+  padding: 4px;
+  border-style: solid;
+  border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+  border-left-style: hidden;
+  border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+  border-top-style: hidden;
+  border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+  border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+  text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+  text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+  text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+  vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+  vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+  vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+  padding-top: 0.5em;
+  padding-bottom: 0.5em;
+  border-top: 2px solid silver;
+  border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+  border-style: none;
+}
+body.manpage div.sectionbody {
+  margin-left: 3em;
+}
+
+@media print {
+  body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = {  // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+  function getText(el) {
+    var text = "";
+    for (var i = el.firstChild; i != null; i = i.nextSibling) {
+      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+        text += i.data;
+      else if (i.firstChild != null)
+        text += getText(i);
+    }
+    return text;
+  }
+
+  function TocEntry(el, text, toclevel) {
+    this.element = el;
+    this.text = text;
+    this.toclevel = toclevel;
+  }
+
+  function tocEntries(el, toclevels) {
+    var result = new Array;
+    var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+    // Function that scans the DOM tree for header elements (the DOM2
+    // nodeIterator API would be a better technique but not supported by all
+    // browsers).
+    var iterate = function (el) {
+      for (var i = el.firstChild; i != null; i = i.nextSibling) {
+        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+          var mo = re.exec(i.tagName);
+          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+          }
+          iterate(i);
+        }
+      }
+    }
+    iterate(el);
+    return result;
+  }
+
+  var toc = document.getElementById("toc");
+  if (!toc) {
+    return;
+  }
+
+  // Delete existing TOC entries in case we're reloading the TOC.
+  var tocEntriesToRemove = [];
+  var i;
+  for (i = 0; i < toc.childNodes.length; i++) {
+    var entry = toc.childNodes[i];
+    if (entry.nodeName.toLowerCase() == 'div'
+     && entry.getAttribute("class")
+     && entry.getAttribute("class").match(/^toclevel/))
+      tocEntriesToRemove.push(entry);
+  }
+  for (i = 0; i < tocEntriesToRemove.length; i++) {
+    toc.removeChild(tocEntriesToRemove[i]);
+  }
+
+  // Rebuild TOC entries.
+  var entries = tocEntries(document.getElementById("content"), toclevels);
+  for (var i = 0; i < entries.length; ++i) {
+    var entry = entries[i];
+    if (entry.element.id == "")
+      entry.element.id = "_toc_" + i;
+    var a = document.createElement("a");
+    a.href = "#" + entry.element.id;
+    a.appendChild(document.createTextNode(entry.text));
+    var div = document.createElement("div");
+    div.appendChild(a);
+    div.className = "toclevel" + entry.toclevel;
+    toc.appendChild(div);
+  }
+  if (entries.length == 0)
+    toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+  // Delete existing footnote entries in case we're reloading the footnodes.
+  var i;
+  var noteholder = document.getElementById("footnotes");
+  if (!noteholder) {
+    return;
+  }
+  var entriesToRemove = [];
+  for (i = 0; i < noteholder.childNodes.length; i++) {
+    var entry = noteholder.childNodes[i];
+    if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+      entriesToRemove.push(entry);
+  }
+  for (i = 0; i < entriesToRemove.length; i++) {
+    noteholder.removeChild(entriesToRemove[i]);
+  }
+
+  // Rebuild footnote entries.
+  var cont = document.getElementById("content");
+  var spans = cont.getElementsByTagName("span");
+  var refs = {};
+  var n = 0;
+  for (i=0; i<spans.length; i++) {
+    if (spans[i].className == "footnote") {
+      n++;
+      var note = spans[i].getAttribute("data-note");
+      if (!note) {
+        // Use [\s\S] in place of . so multi-line matches work.
+        // Because JavaScript has no s (dotall) regex flag.
+        note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+        spans[i].innerHTML =
+          "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+          "' title='View footnote' class='footnote'>" + n + "</a>]";
+        spans[i].setAttribute("data-note", note);
+      }
+      noteholder.innerHTML +=
+        "<div class='footnote' id='_footnote_" + n + "'>" +
+        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+        n + "</a>. " + note + "</div>";
+      var id =spans[i].getAttribute("id");
+      if (id != null) refs["#"+id] = n;
+    }
+  }
+  if (n == 0)
+    noteholder.parentNode.removeChild(noteholder);
+  else {
+    // Process footnoterefs.
+    for (i=0; i<spans.length; i++) {
+      if (spans[i].className == "footnoteref") {
+        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+        href = href.match(/#.*/)[0];  // Because IE return full URL.
+        n = refs[href];
+        spans[i].innerHTML =
+          "[<a href='#_footnote_" + n +
+          "' title='View footnote' class='footnote'>" + n + "</a>]";
+      }
+    }
+  }
+},
+
+install: function(toclevels) {
+  var timerId;
+
+  function reinstall() {
+    asciidoc.footnotes();
+    if (toclevels) {
+      asciidoc.toc(toclevels);
+    }
+  }
+
+  function reinstallAndRemoveTimer() {
+    clearInterval(timerId);
+    reinstall();
+  }
+
+  timerId = setInterval(reinstall, 500);
+  if (document.addEventListener)
+    document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+  else
+    window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="article">
+<div id="header">
+<h1>XMPPC(1)</h1>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_name">NAME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>xmppc - XMPP Command line Tool</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="paragraph"><p><em>xmppc</em> [<em>OPTIONS</em>] -m <em>MODE</em> <em>COMMAND</em> [&lt;args&gt;&#8230;]</p></div>
+<div class="paragraph"><p><em>xmppc</em> [-a <em>ACCOUNT</em>] [-j <em>JID</em>] [-p <em>PASSWORD</em>]  -m <em>MODE</em> <em>COMMAND</em> [&lt;args&gt;&#8230;]</p></div>
+<div class="paragraph"><p><em>xmppc</em> <em>agent-skill</em> [<em>install</em>]</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>xmppc is a XMPP command line tool. You need an XMPP Account to use this tool.
+The account information can be defined via command line argument -j <em>JID</em>. If no
+password is provided via -p <em>PASSWORD</em> xmppc will ask the user to enter the
+password. Another option is to define 1 or more accounts within a configuration
+file. The option -a <em>ACCOUNT</em> can be used to select the account.</p></div>
+<div class="paragraph"><p>The argument -m <em>MODE</em> defines the xmppc <em>MODE</em> which should be used (roster,
+message, pgp, omemo, openpgp, monitor, bookmark, mam, discovery). The <em>COMMAND</em>
+and the args required by the <em>COMMAND</em> depends on the chosen <em>MODE</em>.</p></div>
+<div class="paragraph"><p>The <em>agent-skill</em> command prints or installs instructions for agent use. It does
+not connect to XMPP.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<strong>-a, --attribute</strong> <em>ACCOUNT</em>
+</dt>
+<dd>
+<p>
+  <em>ACCOUNT</em> is a name of a xmpp account defined within the configuration file.
+</p>
+</dd>
+<dt class="hdlist1">
+<strong>-j, --jid</strong> <em>JID</em>
+</dt>
+<dd>
+<p>
+  <em>JID</em> of the XMPP Account.
+</p>
+</dd>
+<dt class="hdlist1">
+<strong>-p, --pwd</strong> <em>PWD</em>
+</dt>
+<dd>
+<p>
+  Password of the XMPP Account. Use <em>-</em> to read the password from stdin.
+</p>
+</dd>
+<dt class="hdlist1">
+<strong>-v</strong> <em>VERBOSE</em>
+</dt>
+<dt class="hdlist1">
+Verbose flags. -v[v[v[v]]]
+</dt>
+<dd>
+<p>
+  -v is WARN -vv is INFO --vvv is DEBUG -vvvv is TRACE
+</p>
+</dd>
+<dt class="hdlist1">
+<strong>--help</strong>
+</dt>
+<dd>
+<p>
+    Print program version number and help
+</p>
+</dd>
+<dt class="hdlist1">
+<strong>agent-skill</strong> [<em>install</em>]
+</dt>
+<dd>
+<p>
+    Print the agent-facing xmppc instructions. With <em>install</em>, write a small
+    agent skill that tells agents to run <em>xmppc agent-skill</em>.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_modes_and_commands">MODES AND COMMANDS</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>xmppc modes.</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<strong>-m roster</strong>
+</dt>
+<dd>
+<p>
+The Roster mode can be used to provided information of the xmpp account&#8217;s
+roster. The roster is the XMPP list of contacts.
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+<strong>list</strong> - List all contacts
+</p>
+</li>
+<li>
+<p>
+<strong>export</strong> - Exports all contacts
+</p>
+</li>
+</ul></div>
+</dd>
+<dt class="hdlist1">
+<strong>-m message</strong>
+</dt>
+<dd>
+<p>
+The message mode can be used to send unencrypted messages to another xmpp
+account.
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+<strong>chat &lt;jid&gt; &lt;message&gt;</strong> - Sending unencrypted message to jid. On success,
+  prints one compact XML record after the sent stanza appears in MAM:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code>&lt;sent archive-id="mam-id" message-id="stanza-id" to="jid"/&gt;</code></pre>
+</div></div>
+<div class="paragraph"><p>The <em>archive-id</em> is the MAM archive cursor. Use it as <em>mam receive after-id</em> when
+waiting for a reply. The <em>message-id</em> is the client stanza id and is not a MAM
+cursor.</p></div>
+</li>
+</ul></div>
+</dd>
+<dt class="hdlist1">
+<strong>-m pgp</strong>
+</dt>
+<dd>
+<p>
+PGP Mode (XEP-0027)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+<strong>chat &lt;jid&gt; &lt;message&gt;</strong> - Sending pgp encrypted message to jid
+</p>
+</li>
+</ul></div>
+</dd>
+<dt class="hdlist1">
+<strong>-m omemo</strong>
+</dt>
+<dd>
+<p>
+OMEMO Mode (XEP-0384)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+<strong>list</strong> - List the device IDs and fingerprints
+</p>
+</li>
+<li>
+<p>
+<strong>delete-device-list</strong> - Deletes the OMEMO device list
+</p>
+</li>
+</ul></div>
+</dd>
+<dt class="hdlist1">
+<strong>-m openpgp</strong>
+</dt>
+<dd>
+<p>
+openpgp mode (XEP-0373)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+<strong>signcrypt &lt;jid&gt; &lt;message&gt;</strong> - Sending pgp signed and encrypted message to jid
+</p>
+</li>
+</ul></div>
+</dd>
+<dt class="hdlist1">
+<strong>-m monitor</strong>
+</dt>
+<dd>
+<p>
+Monitot mode
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+<strong>stanza</strong> - Stanza Monitor
+</p>
+</li>
+<li>
+<p>
+<strong>monitor</strong> - microblog Monitor microblog (XEP-0277)
+</p>
+</li>
+</ul></div>
+</dd>
+<dt class="hdlist1">
+<strong>-m bookmark</strong>
+</dt>
+<dd>
+<p>
+Bookmark mode (XEP-0048)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+<strong>list</strong> - List bookmarks
+</p>
+</li>
+</ul></div>
+</dd>
+<dt class="hdlist1">
+<strong>-m mam</strong>
+</dt>
+<dd>
+<p>
+Message Archive Management (XEP-0313)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+<strong>list &lt;jid&gt; [field=value &#8230;]</strong> - List archived messages. A bare <em>jid</em> is
+  shorthand for <em>with=jid</em>. Supported fields are <em>with</em>, <em>start</em>, <em>end</em>,
+  <em>after-id</em>, <em>before-id</em>, <em>ids</em>, and <em>max</em>. Field arguments are unordered.
+  If no range or id field is supplied, <em>start=-5m</em> is used. <em>max</em> defaults to 5
+  and is capped at 50.
+</p>
+</li>
+<li>
+<p>
+<strong>receive &lt;jid&gt; after-id=&lt;mam-id&gt; [timeout=300s] [max=5]</strong> - Poll MAM with RSM
+  <em>after</em> until at least one newer archived message is available or the timeout
+  is reached. Prints at most <em>max</em> messages. If no message arrives before the
+  timeout, prints nothing.
+</p>
+<div class="paragraph"><p><em>list</em> and <em>receive</em> print one compact XML record per archived message:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><code>&lt;message id="mam-id" message-id="stanza-id" stamp="..." from="..." to="..."&gt;&lt;body&gt;escaped body&lt;/body&gt;&lt;/message&gt;</code></pre>
+</div></div>
+<div class="paragraph"><p>The <em>id</em> attribute is the MAM archive cursor. The <em>message-id</em> attribute is the
+client stanza id.</p></div>
+</li>
+</ul></div>
+</dd>
+<dt class="hdlist1">
+<strong>-m discovery</strong>
+</dt>
+<dd>
+<p>
+Service Discovery (XEP-0030)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+<strong>info &lt;jid&gt;</strong> - info request for &lt;jid&gt;
+</p>
+</li>
+<li>
+<p>
+<strong>item &lt;jid&gt;</strong> - item request for &lt;jid&gt;
+</p>
+</li>
+</ul></div>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_send_then_wait_workflow">SEND-THEN-WAIT WORKFLOW</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>To send a message and then wait for a reply, capture the <em>&lt;sent &#8230;/&gt;</em> line from
+<em>message chat</em>, extract its <em>archive-id</em>, and pass that value to <em>mam receive</em>
+as <em>after-id</em>. This skips the sender&#8217;s outgoing archived message and waits for
+newer archived messages in the conversation.</p></div>
+<div class="paragraph"><p>If <em>archive-id</em> is empty, the message was sent but the archive cursor was not
+resolved before timeout. Fall back to <em>mam list</em> over a recent time window, find
+the line whose <em>message-id</em> matches the <em>&lt;sent &#8230;/&gt;</em> <em>message-id</em>, then use that
+line&#8217;s <em>id</em> as the receive cursor.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_agent_skill">AGENT SKILL</h2>
+<div class="sectionbody">
+<div class="paragraph"><p><em>xmppc agent-skill</em> prints the agent-facing contract for using xmppc safely.
+Agents should read <code>$HOME/.config/xmppc/AGENTS.md</code> when it exists for local policy,
+allowed accounts, and preferred contacts. Agents must not print secrets,
+password commands, or <code>$HOME/.config/xmppc.conf</code>.</p></div>
+<div class="paragraph"><p><em>xmppc agent-skill install</em> writes the small skill
+<code>$HOME/.config/agents/skills/communicating-through-xmppc/SKILL.md</code>. The installed
+skill points agents back to <em>xmppc agent-skill</em> for the current command contract.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_environment_variables">ENVIRONMENT VARIABLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+HOME
+</p>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="literalblock">
+<div class="content">
+<pre><code>xmppc --jid user@domain.tld --pwd "secret" --mode roster list
+xmppc --jid user@domain.tld --mode pgp chat friend@domain.tld "Hello"
+xmppc -a account1 --mode discovery item conference@domain.tld
+xmppc --mode bookmark list</code></pre>
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_files">FILES</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Configuration file to setup accounts.</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<strong>~/.config/xmppc.conf</strong>
+</dt>
+<dd>
+<p>
+Example:
+</p>
+<div class="literalblock">
+<div class="content">
+<pre><code>[default]
+jid=account1@domain.tld
+pwd=password1</code></pre>
+</div></div>
+<div class="literalblock">
+<div class="content">
+<pre><code>[account2]
+jid=account2@domain.tld</code></pre>
+</div></div>
+<div class="literalblock">
+<div class="content">
+<pre><code>[account3]
+jid=account3@domain.tld
+pwd=password3</code></pre>
+</div></div>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Instead of <em>pwd</em>, an account may use <em>pwd-cmd</em> to read the password from a local
+command:</p></div>
+<div class="literalblock">
+<div class="content">
+<pre><code>[account4]
+jid=account4@domain.tld
+pwd-cmd=pass show xmpp/account4</code></pre>
+</div></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<strong>$HOME/.config/xmppc/AGENTS.md</strong>
+</dt>
+<dd>
+<p>
+Optional user-written policy for agents using xmppc. This file can describe
+allowed accounts, contacts, and usage rules without exposing secrets.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_exit_status">EXIT STATUS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<strong>0</strong>
+</dt>
+<dd>
+<p>
+    Success
+</p>
+</dd>
+<dt class="hdlist1">
+<strong>1</strong>
+</dt>
+<dd>
+<p>
+    Failure
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_bugs">BUGS</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>See <a href="https://codeberg.org/Anoxinon_e.V./xmppc/issues">https://codeberg.org/Anoxinon_e.V./xmppc/issues</a></p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_author">AUTHOR</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+DebXWoody
+</p>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_resources">RESOURCES</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Source: <a href="https://codeberg.org/Anoxinon_e.V./xmppc">https://codeberg.org/Anoxinon_e.V./xmppc</a></p></div>
+<div class="paragraph"><p>Documentation: <a href="https://codeberg.org/Anoxinon_e.V./xmppc/wiki">https://codeberg.org/Anoxinon_e.V./xmppc/wiki</a></p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_copying">COPYING</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Copyright (C) 2020 Anoxinon e.V. Free use of this software is
+granted under the terms of the GNU General Public License (GPL).</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2026-07-05 02:27:50 UTC
+</div>
+</div>
+</body>
+</html>