<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>madtea</title><link>https://madtea.lol/</link><description>Recent content on madtea</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 17 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://madtea.lol/index.xml" rel="self" type="application/rss+xml"/><item><title>Introducing madtea</title><link>https://madtea.lol/blog/introducing-madtea/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate><guid>https://madtea.lol/blog/introducing-madtea/</guid><description>&lt;p&gt;Git tooling was designed when the only developer in your terminal was you. Add an AI agent to that terminal, and familiar commands start failing in new ways: &lt;code&gt;git remote -v&lt;/code&gt; leaks a token into the agent&amp;rsquo;s context, a well-meaning issue edit pastes over your bug repro steps, &lt;code&gt;git reset --hard&lt;/code&gt; erases uncommitted work.&lt;/p&gt;
&lt;p&gt;madtea is a Forgejo/Gitea client built for that shared terminal: one binary, two ways in. A &lt;code&gt;gh&lt;/code&gt;-style CLI for you. An MCP server for your agent. Every command is safe to hand to an agent, and every guardrail explains itself to a human.&lt;/p&gt;</description></item><item><title>ActivityPub</title><link>https://madtea.lol/docs/reference/activitypub/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/activitypub/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-activitypub-actor"&gt;&lt;code&gt;madtea activitypub actor&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get instance ActivityPub actor&lt;/p&gt;
&lt;h3 id="madtea-activitypub-repo"&gt;&lt;code&gt;madtea activitypub repo&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get repository ActivityPub actor&lt;/p&gt;
&lt;h3 id="madtea-activitypub-user"&gt;&lt;code&gt;madtea activitypub user&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get user ActivityPub actor&lt;/p&gt;
&lt;h2 id="mcp-tools"&gt;MCP Tools&lt;/h2&gt;
&lt;h3 id="madt_activitypub"&gt;&lt;code&gt;madt_activitypub&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;ActivityPub federation endpoints (requires madt_enable(domains=[&amp;ldquo;activitypub&amp;rdquo;])): instance, user, and repository actors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Output schema&lt;/strong&gt;: declared&lt;/p&gt;
&lt;p&gt;One tool, action-dispatched. Set &lt;code&gt;action&lt;/code&gt; to one of:&lt;/p&gt;
&lt;h4 id="actionactor"&gt;&lt;code&gt;action=&amp;quot;actor&amp;quot;&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Get the instance ActivityPub actor.&lt;/p&gt;
&lt;h4 id="actionrepo"&gt;&lt;code&gt;action=&amp;quot;repo&amp;quot;&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Get a repository&amp;rsquo;s ActivityPub actor by numeric repository ID.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Required:&lt;/strong&gt; &lt;code&gt;repo_id&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="actionuser"&gt;&lt;code&gt;action=&amp;quot;user&amp;quot;&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Get a user&amp;rsquo;s ActivityPub actor by numeric user ID.&lt;/p&gt;</description></item><item><title>Admin</title><link>https://madtea.lol/docs/reference/admin/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/admin/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-admin-cron-list"&gt;&lt;code&gt;madtea admin cron list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List cron tasks&lt;/p&gt;
&lt;h3 id="madtea-admin-cron-run"&gt;&lt;code&gt;madtea admin cron run&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Run a cron task&lt;/p&gt;
&lt;h3 id="madtea-admin-emails-list"&gt;&lt;code&gt;madtea admin emails list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List all emails&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--limit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Maximum number of items to return (0 = server default)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--page&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Page number for pagination (0 = first page)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-admin-emails-search"&gt;&lt;code&gt;madtea admin emails search&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Search emails&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--limit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Maximum number of items to return (0 = server default)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--page&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Page number for pagination (0 = first page)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--q&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Search query (required)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-admin-hooks-create"&gt;&lt;code&gt;madtea admin hooks create&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Create a system hook&lt;/p&gt;</description></item><item><title>API Compatibility</title><link>https://madtea.lol/docs/appendices/compat/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/appendices/compat/</guid><description>&lt;p&gt;&lt;strong&gt;What this answers:&lt;/strong&gt; &amp;ldquo;will this madtea feature work against my server?&amp;rdquo; — madtea features × the Gitea and Forgejo REST APIs — plus the maintainer view: tracking drift between the two platforms. The client-vs-client question (&amp;ldquo;which CLI covers what&amp;rdquo;) is a different axis and lives in &lt;a href="https://madtea.lol/docs/appendices/comparison/"&gt;COMPARISON.md&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;madtea targets Gitea API v1 as its single API surface (&lt;a href="https://madtea.lol/docs/adr/0017-standard-forge-api-target/"&gt;ADR 0017&lt;/a&gt;); Forgejo is supported through the Gitea-compatible API it maintains. Where Forgejo diverges, madtea detects the platform and surfaces the gap as a typed, explained error — see &lt;a href="#how-madtea-handles-divergence"&gt;How madtea handles divergence&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Branches &amp; Tags</title><link>https://madtea.lol/docs/reference/branches-tags/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/branches-tags/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-branches-remote-create"&gt;&lt;code&gt;madtea branches-remote create&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Create branch via API&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--from&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Branch or ref to create from&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-branches-remote-delete"&gt;&lt;code&gt;madtea branches-remote delete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Delete remote branch&lt;/p&gt;
&lt;h3 id="madtea-branches-remote-get"&gt;&lt;code&gt;madtea branches-remote get&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get branch details&lt;/p&gt;
&lt;h3 id="madtea-branches-remote-list"&gt;&lt;code&gt;madtea branches-remote list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List remote branches&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--limit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Maximum number of items to return (0 = server default)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--page&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Page number for pagination (0 = first page)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-branches-remote-protect"&gt;&lt;code&gt;madtea branches-remote protect&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get branch protection rules&lt;/p&gt;</description></item><item><title>CI/CD &amp; Actions</title><link>https://madtea.lol/docs/reference/actions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/actions/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-actions-artifacts-delete"&gt;&lt;code&gt;madtea actions artifacts delete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Delete an artifact&lt;/p&gt;
&lt;h3 id="madtea-actions-artifacts-download"&gt;&lt;code&gt;madtea actions artifacts download&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Download an artifact zip&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--output&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Output file path (default: stdout)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-actions-artifacts-get"&gt;&lt;code&gt;madtea actions artifacts get&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get artifact details&lt;/p&gt;
&lt;h3 id="madtea-actions-artifacts-list"&gt;&lt;code&gt;madtea actions artifacts list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List repository artifacts&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--limit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Maximum number of items to return (0 = server default)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--page&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Page number for pagination (0 = first page)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-actions-dispatch"&gt;&lt;code&gt;madtea actions dispatch&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Trigger a workflow dispatch&lt;/p&gt;</description></item><item><title>CLI Comparison</title><link>https://madtea.lol/docs/appendices/comparison/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/appendices/comparison/</guid><description>&lt;p&gt;&lt;strong&gt;What this answers:&lt;/strong&gt; which client covers what, for someone — human or agent — picking a forge CLI. It compares madtea against the four relevant clients, feature by feature:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;gh&lt;/code&gt;&lt;/strong&gt; — the GitHub CLI, the Microsoft-backed benchmark everyone knows. gh cannot talk to a Forgejo/Gitea server at all; its column reads &amp;ldquo;gh offers this on its own forge&amp;rdquo; — the capability bar to clear, not an alternative client. gh is also madtea&amp;rsquo;s &lt;em&gt;naming yardstick&lt;/em&gt;: &lt;a href="https://madtea.lol/docs/adr/0016-gh-tea-vocabulary-parity/"&gt;ADR 0016&lt;/a&gt; makes gh-then-tea vocabulary a recorded, test-enforced rule (&lt;code&gt;internal/parity/&lt;/code&gt;), so gh muscle-memory lands on the right verb.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;glab&lt;/code&gt;&lt;/strong&gt; — GitLab&amp;rsquo;s official CLI. Like gh, it cannot talk to a Forgejo/Gitea server; its column reads &amp;ldquo;glab offers this on its own forge (GitLab)&amp;rdquo;. GitLab concepts are mapped to their forge equivalents (MR ≈ PR, pipeline ≈ Actions run, group ≈ org).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;tea&lt;/code&gt;&lt;/strong&gt; — Gitea&amp;rsquo;s official CLI. Same backend as madtea.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;fj&lt;/code&gt;&lt;/strong&gt; — forgejo-cli, the Forgejo-native community CLI. Same backend as madtea.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Server-side compatibility is a different question.&lt;/strong&gt; &amp;ldquo;Will this feature work against my Forgejo/Gitea server?&amp;rdquo; lives in &lt;a href="https://madtea.lol/docs/appendices/compat/"&gt;COMPAT.md&lt;/a&gt;, which owns the platform axis. A row below carries at most a terse pointer there.&lt;/p&gt;</description></item><item><title>Commits</title><link>https://madtea.lol/docs/reference/commits/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/commits/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-commits-compare"&gt;&lt;code&gt;madtea commits compare&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Compare two refs&lt;/p&gt;
&lt;h3 id="madtea-commits-diff"&gt;&lt;code&gt;madtea commits diff&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get commit as unified diff&lt;/p&gt;
&lt;h3 id="madtea-commits-get"&gt;&lt;code&gt;madtea commits get&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get full commit details&lt;/p&gt;
&lt;h3 id="madtea-commits-list"&gt;&lt;code&gt;madtea commits list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List commits&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--files&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Include file change list per commit&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--limit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Maximum number of items to return (0 = server default)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--not&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Exclude commits reachable from this ref&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--page&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Page number for pagination (0 = first page)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--path&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Filter to commits affecting this file path&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--sha&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Branch, tag, or commit SHA to start from&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--since&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Commits since timestamp (YYYY-MM-DD or RFC3339)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--stat&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Include diff statistics&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--until&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Commits until timestamp (YYYY-MM-DD or RFC3339)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--verification&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Include GPG signature verification info&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-commits-pr-for-commit"&gt;&lt;code&gt;madtea commits pr-for-commit&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get PR for a commit&lt;/p&gt;</description></item><item><title>Configuration &amp; first run</title><link>https://madtea.lol/docs/guides/setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/guides/setup/</guid><description>&lt;p&gt;How to point madtea at your forge, where it stores credentials, and how the override precedence resolves. This guide assumes the &lt;code&gt;madtea&lt;/code&gt; binary is already installed - see &lt;a href="https://madtea.lol/docs/guides/install/"&gt;install.md&lt;/a&gt; if not. For what scopes to enable on the token, see &lt;a href="https://madtea.lol/docs/appendices/permissions/"&gt;&lt;code&gt;PERMISSIONS.md&lt;/code&gt;&lt;/a&gt;. For how madtea stores the token and the credential-safety guarantees, see &lt;a href="https://madtea.lol/docs/safety/credential-safety/"&gt;&lt;code&gt;credential-safety.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="first-run"&gt;First run&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;madtea auth login&lt;/code&gt; walks you through entering your forge URL and pasting an API token, then stores the token securely in your OS keychain (or &lt;code&gt;pass&lt;/code&gt;, or &lt;code&gt;systemd-creds&lt;/code&gt; on a headless server, when no keychain is available). Run it once globally and every repo on that forge is covered:&lt;/p&gt;</description></item><item><title>ADR 0015 — One MCP tool per resource noun, action-dispatched</title><link>https://madtea.lol/docs/adr/0015-consolidated-action-dispatched-tools/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0015-consolidated-action-dispatched-tools/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-01&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1693 (OperationSpec registry), legacy tracker 1695 (action enum), legacy tracker 1646 (call-time git-repo check)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea&amp;rsquo;s MCP server must expose the full Forgejo/Gitea API surface to an
agent. Naively mapped, this is upwards of 200 discrete operations across a
dozen resource domains. Two competing pressures shape the design:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;An agent&amp;rsquo;s tool-picker is a search space.&lt;/strong&gt; Every additional tool the
model must discriminate among adds latency and increases mis-selection
probability. A 200-tool surface is impractical.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A single opaque &amp;ldquo;call anything&amp;rdquo; tool loses discoverability.&lt;/strong&gt; Without
structure, an agent cannot learn what operations are available without
reading extensive prose; it cannot self-correct from a bad choice; and the
schema cannot carry per-operation constraints.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The existing &lt;code&gt;madt_api_call&lt;/code&gt; passthrough tool fills the second role when
needed, but it carries no first-class operation semantics — it is the escape
hatch, not the primary surface.&lt;/p&gt;</description></item><item><title>Credential Safety</title><link>https://madtea.lol/docs/safety/credential-safety/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/safety/credential-safety/</guid><description>&lt;p&gt;How madtea stores your Forgejo/Gitea token locally and what the &amp;ldquo;credential-safe git wrappers&amp;rdquo; claim actually guarantees. For what scopes to enable on the token itself, see &lt;a href="https://madtea.lol/docs/appendices/permissions/"&gt;&lt;code&gt;PERMISSIONS.md&lt;/code&gt;&lt;/a&gt;. For how to report a credential-related vulnerability, see &lt;a href="https://codeberg.org/sixfold_space/madtea/src/commit/50f105638fd9481c1ac42fdf927229986985a216bb7f55dd09a27d4781f6a480/SECURITY.md"&gt;&lt;code&gt;SECURITY.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="storage-backends"&gt;Storage backends&lt;/h2&gt;
&lt;p&gt;By default &lt;code&gt;madtea auth login&lt;/code&gt; stores your token in a secure backend — the OS keychain when one is available, otherwise &lt;code&gt;pass&lt;/code&gt;, otherwise &lt;code&gt;systemd-creds&lt;/code&gt; on a headless server with systemd. The URL and username always go to git config (they are not secret). When no secure backend is available, madtea &lt;strong&gt;refuses to store the token&lt;/strong&gt; with an error naming the fix — plaintext git config is never an automatic fallback; it happens only with the explicit &lt;code&gt;--insecure-storage&lt;/code&gt; flag, which also forces the plaintext path when a keychain is present. The backend is not user-selectable beyond that: auto-detection always tries the OS keychain first, then &lt;code&gt;pass&lt;/code&gt;, then &lt;code&gt;systemd-creds&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>ADR 0013 — Credential storage: secure-backend-preferred, scope-consistent, never on argv</title><link>https://madtea.lol/docs/adr/0013-credential-storage-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0013-credential-storage-model/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-01&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1726, legacy tracker 1753, legacy tracker 1765; legacy tracker 1718 / ADR 0009&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea authenticates to a forge with a token; where and how it is stored sets
the blast radius of a leak. Several incidents shaped the model: plaintext tokens
written even under a secure backend (legacy tracker 1726), a token exposed by
&lt;code&gt;git config --get-regexp&lt;/code&gt; (legacy tracker 1753 / legacy tracker 1718), and a token read from the wrong
git-config scope so the wrong ciphertext was decrypted (legacy tracker 1765).&lt;/p&gt;</description></item><item><title>ADR 0011 — linux/macOS/windows are first-class; OS behavior behind build-tag splits</title><link>https://madtea.lol/docs/adr/0011-cross-platform-first-class/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0011-cross-platform-first-class/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-01&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1759, legacy tracker 1731 (Linux-assumption regressions); release/install overhaul epic&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea ships binaries for linux, macOS, and windows (GoReleaser builds
&lt;code&gt;linux_{amd64,arm64}&lt;/code&gt;, &lt;code&gt;darwin_{amd64,arm64}&lt;/code&gt;, &lt;code&gt;windows_amd64&lt;/code&gt;). Yet the code
carried Unix-only assumptions that surfaced only as Windows bugs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;internal/safeio&lt;/code&gt; fsynced the parent directory after a rename — legal on POSIX,
unsupported on Windows (&lt;code&gt;FlushFileBuffers&lt;/code&gt; on a directory handle errors), so
every credentialed write failed on Windows (legacy tracker 1759).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;internal/selfreplace&lt;/code&gt; relied on &lt;code&gt;os.Rename&lt;/code&gt; overwriting an existing
destination — POSIX-atomic, but Windows refuses, and a locked running &lt;code&gt;.old&lt;/code&gt;
image blocked the self-update (legacy tracker 1731).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;madtea install&lt;/code&gt; hardcoded &lt;code&gt;/usr/local/bin&lt;/code&gt; + &lt;code&gt;sudo cp&lt;/code&gt;/&lt;code&gt;chmod&lt;/code&gt; — meaningless
on Windows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each was caught late (by a user on Windows, or by a manual &lt;code&gt;GOOS=windows&lt;/code&gt; build
during review) because CI only builds and tests on linux (&lt;code&gt;golang:1.26-alpine&lt;/code&gt;).
The implicit default was &amp;ldquo;Unix,&amp;rdquo; and nothing structurally enforced otherwise.&lt;/p&gt;</description></item><item><title>ADR 0024 — Declared-files staging: a commit's file set must be named, never swept</title><link>https://madtea.lol/docs/adr/0024-declared-files-staging-contract/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0024-declared-files-staging-contract/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-10&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1981 (records the legacy tracker 1964 / PR legacy tracker 1977 contract as a first-class decision)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;madt_commit&lt;/code&gt; and &lt;code&gt;madt_finish&lt;/code&gt; (and &lt;code&gt;madt_add&lt;/code&gt;) once offered a blanket-staging
mode — &lt;code&gt;all=true&lt;/code&gt; on the MCP surface, &lt;code&gt;-A&lt;/code&gt;/&lt;code&gt;--all&lt;/code&gt; on the CLI — that ran the
equivalent of &lt;code&gt;git add -A&lt;/code&gt; before committing: stage every modified, deleted, and
untracked path in the worktree, then commit the lot. It sat beside the declared
form (&lt;code&gt;files=[...]&lt;/code&gt; on MCP, &lt;code&gt;--files&lt;/code&gt; on CLI), which stages and commits only the
named paths.&lt;/p&gt;</description></item><item><title>Destructive</title><link>https://madtea.lol/docs/reference/destructive/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/destructive/</guid><description>&lt;p&gt;Model of record: &lt;a href="https://madtea.lol/docs/adr/0029-strict-omission-destruction-model/"&gt;ADR 0029 (strict omission)&lt;/a&gt;. A madtea surface never carries an operation that can destroy unrecoverable work or data; destruction is offered only when madtea can machine-prove nothing is lost (content-verified prune, force-with-lease push, merged-only branch delete). The irreversible forge-data deletes (repository, issue, release, tag, wiki page) are omitted from both the MCP tools and the CLI: each &lt;code&gt;delete&lt;/code&gt; subcommand remains discoverable but refuses, naming the forge web UI. Use the forge web UI (or raw git) for a genuine hard delete.&lt;/p&gt;</description></item><item><title>ADR 0018 — internal/diag is the sole diagnostics emitter</title><link>https://madtea.lol/docs/adr/0018-diagnostics-via-internal-diag/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0018-diagnostics-via-internal-diag/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-01&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1528 (diagnostics visibility epic), legacy tracker 1549 (migration), legacy tracker 1550, legacy tracker 1548&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea ships as both a CLI binary and an MCP server (ADR 0014). The two
surfaces have different output channels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLI&lt;/strong&gt;: user-facing warnings, notices, and errors go to &lt;code&gt;os.Stderr&lt;/code&gt;.
ANSI color is appropriate when a TTY is detected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP tool call&lt;/strong&gt;: there is no stderr the agent can see. Diagnostics must
be captured and delivered &lt;strong&gt;inside the tool result&lt;/strong&gt; — a severity-prefixed
block that the agent reads as part of the response.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before legacy tracker 1528, every warning or notice in the codebase was written as a raw
&lt;code&gt;fmt.Fprintf(os.Stderr, &amp;quot;Warning: ...&amp;quot;)&lt;/code&gt; call. This worked on the CLI surface
but was invisible on the MCP surface: an agent calling &lt;code&gt;madt_issues&lt;/code&gt; that
triggered a credential-fallback warning or a pagination-truncation notice would
get the main response with no indication anything was unusual, because the
warning had gone to the server&amp;rsquo;s stderr log and not into the tool result.&lt;/p&gt;</description></item><item><title>Editor &amp; MCP client setup</title><link>https://madtea.lol/docs/guides/clients/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/guides/clients/</guid><description>&lt;p&gt;The same &lt;code&gt;madtea&lt;/code&gt; binary serves an MCP endpoint over stdio (&lt;code&gt;madtea serve&lt;/code&gt;). The consolidated MCP tools (one per resource noun, action-dispatched — issues, prs, repos, branches, releases, actions, …) are identical across every client; only the config file&amp;rsquo;s location and format differ.&lt;/p&gt;
&lt;p&gt;Every client launches the server the same way — running the &lt;code&gt;madtea&lt;/code&gt; binary with the single argument &lt;code&gt;serve&lt;/code&gt; and talking to it over stdio. The blocks below differ only in how each client spells that out.&lt;/p&gt;</description></item><item><title>Files &amp; Content</title><link>https://madtea.lol/docs/reference/files/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/files/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-dir-list"&gt;&lt;code&gt;madtea dir list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List directory contents&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--ref&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Branch, tag, or SHA&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-dir-list-root"&gt;&lt;code&gt;madtea dir list-root&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List root directory contents&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--ref&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Branch, tag, or SHA&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-file-batch"&gt;&lt;code&gt;madtea file batch&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Batch file operations&lt;/p&gt;
&lt;h3 id="madtea-file-contents"&gt;&lt;code&gt;madtea file contents&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get file contents via file-contents endpoint&lt;/p&gt;
&lt;h3 id="madtea-file-create"&gt;&lt;code&gt;madtea file create&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Create a new file&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--author-email&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Custom commit author email&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--author-name&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Custom commit author name&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--branch&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Branch to create file on&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--committer-email&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Custom committer email&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--committer-name&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Custom committer name&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--date-author&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Custom author date (ISO 8601)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--date-committer&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Custom committer date (ISO 8601)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--message&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Commit message (required)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--new-branch&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Create file on a new branch with this name&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-file-delete"&gt;&lt;code&gt;madtea file delete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Delete a file&lt;/p&gt;</description></item><item><title>ADR 0006 — `finish` always refuses to run from the default branch</title><link>https://madtea.lol/docs/adr/0006-finish-refuses-default-branch/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0006-finish-refuses-default-branch/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Amended: 2026-07-17 by ADR 0031 — &lt;code&gt;commit&lt;/code&gt; joins &lt;code&gt;finish&lt;/code&gt; in refusing the
default branch (per-call &lt;code&gt;--allow-default-branch&lt;/code&gt; override), closing the
branch-commit-finish loop at both ends.&lt;/li&gt;
&lt;li&gt;Date: 2026-06-24&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1621 (formalizes a rule locked on legacy tracker 1601).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;madtea finish&lt;/code&gt; completes a &lt;em&gt;feature&lt;/em&gt; branch: it commits, pushes, opens a PR,
merges it, and returns to the default branch. Running it &lt;em&gt;from&lt;/em&gt; the default
branch is a category error — there is no feature branch to merge, and the only
coherent interpretations (open a PR from the default onto itself; push the
default with no review) are exactly the unguarded paths finish exists to avoid.&lt;/p&gt;</description></item><item><title>ADR 0019 — Foreign-repo primary checkouts are immutable to madtea</title><link>https://madtea.lol/docs/adr/0019-foreign-primary-checkouts-immutable/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0019-foreign-primary-checkouts-immutable/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-03&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1912&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;ADR 0007 (structural fail-closed, multi-repo) introduced &lt;code&gt;dir=&lt;/code&gt; targeting: a
madtea agent can name any other on-disk git repository as the target of a
mutating local-git tool (&lt;code&gt;madt_branch_create&lt;/code&gt;, &lt;code&gt;madt_commit&lt;/code&gt;, &lt;code&gt;madt_push&lt;/code&gt;,
…). ADR 0009 (non-overridable guards) established that the agent-facing safety
hooks are structurally enforced with no opt-out.&lt;/p&gt;
&lt;p&gt;Issue legacy tracker 1862 (cross-repo intent contract) extended &lt;code&gt;dir=&lt;/code&gt; to &lt;em&gt;any&lt;/em&gt; repository on
disk — not just siblings sharing a workspace root — and built the worktree flow
as the sanctioned mechanism for agents contributing to a foreign repo:&lt;/p&gt;</description></item><item><title>ADR 0016 — Names match gh/tea verbatim; no invented vocabulary</title><link>https://madtea.lol/docs/adr/0016-gh-tea-vocabulary-parity/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0016-gh-tea-vocabulary-parity/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-01&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1225 (batch rename to parity), legacy tracker 1572 (stale CLAUDE.md vs deliberate bareword),
legacy tracker 1593 (no-negative-steers), legacy tracker 1604, legacy tracker 1605 (param-name ergonomics)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea exposes two surfaces — the Cobra CLI (&lt;code&gt;madtea …&lt;/code&gt;) and the MCP server
(&lt;code&gt;madt_&amp;lt;noun&amp;gt;&lt;/code&gt; tools) — and every operation appears on both. Without a
deliberate naming rule, each surface accumulates its own vocabulary as
contributors pick names that feel natural or internally consistent. Over time
this creates two problems:&lt;/p&gt;</description></item><item><title>Git</title><link>https://madtea.lol/docs/reference/cli-git/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/cli-git/</guid><description>&lt;p&gt;Foreign-checkout immutability model (madt_fetch, madt_pull, madt_worktrees): &lt;a href="https://madtea.lol/docs/adr/0019-foreign-primary-checkouts-immutable/"&gt;ADR 0019&lt;/a&gt;. Credential injection model (GIT_ASKPASS, never token-in-URL): &lt;a href="https://madtea.lol/docs/adr/0013-credential-storage-model/"&gt;ADR 0013&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-add"&gt;&lt;code&gt;madtea add&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Stage files for commit&lt;/p&gt;
&lt;h3 id="madtea-branch"&gt;&lt;code&gt;madtea branch&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Create, list, or delete local branches&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--base&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Start-point ref/sha to branch from (with -b; default: current HEAD)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--create&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Create and checkout a new branch&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--delete&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Delete a merged branch (safe; madtea never force-deletes)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--issue&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Link branch to Forgejo/Gitea issue number&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--list&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;List branches&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-checkout"&gt;&lt;code&gt;madtea checkout&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Switch branches&lt;/p&gt;</description></item><item><title>ADR 0030 — git-mirrored CLI commands anchor their argument shape to git's signature</title><link>https://madtea.lol/docs/adr/0030-git-mirrored-argument-shape/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0030-git-mirrored-argument-shape/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-17&lt;/li&gt;
&lt;li&gt;Tracking: #171&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;ADR 0016 pins CLI subcommand, flag, and MCP action &lt;em&gt;names&lt;/em&gt; to &lt;code&gt;gh&lt;/code&gt; then &lt;code&gt;tea&lt;/code&gt;
verbatim, and &lt;code&gt;docs/contributing/naming-conventions.md&lt;/code&gt; records the one
refinement it already needs: madtea&amp;rsquo;s thin wrappers over &lt;strong&gt;local git&lt;/strong&gt;
commands (&lt;code&gt;branch&lt;/code&gt;, &lt;code&gt;tag&lt;/code&gt;, &lt;code&gt;checkout&lt;/code&gt;, &lt;code&gt;stash&lt;/code&gt;, &lt;code&gt;worktree&lt;/code&gt;, …) match &lt;code&gt;git&lt;/code&gt;&amp;rsquo;s
vocabulary, not gh/tea&amp;rsquo;s, because they &lt;em&gt;are&lt;/em&gt; git — an agent or human reaching
for them arrives with &lt;code&gt;git&lt;/code&gt;&amp;rsquo;s muscle memory.&lt;/p&gt;
&lt;p&gt;Names are not the only muscle memory a git-mirrored command inherits. The
argument &lt;strong&gt;shape&lt;/strong&gt; — which operands are positionals versus flags, and what a
positional &lt;em&gt;means&lt;/em&gt; — is just as load-bearing, and ADR 0016 does not speak to
it. &lt;code&gt;madtea worktree add&lt;/code&gt; diverged here: it took the branch as a positional
(&lt;code&gt;add &amp;lt;path&amp;gt; [branch]&lt;/code&gt;) and had the service layer silently decide the meaning
— an existing branch was checked out, a missing one was created (&lt;code&gt;git worktree add -b&lt;/code&gt;). Raw git&amp;rsquo;s signature is &lt;code&gt;git worktree add &amp;lt;path&amp;gt; [&amp;lt;commit-ish&amp;gt;]&lt;/code&gt;: the
positional after the path is a commit-ish to &lt;strong&gt;check out&lt;/strong&gt; (an existing ref,
never a silent create), and creating a new branch is the explicit &lt;code&gt;-b &amp;lt;branch&amp;gt;&lt;/code&gt;. madtea&amp;rsquo;s &lt;code&gt;worktree add&lt;/code&gt; had no &lt;code&gt;-b&lt;/code&gt; at all.&lt;/p&gt;</description></item><item><title>Git Objects</title><link>https://madtea.lol/docs/reference/git-objects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/git-objects/</guid><description>&lt;h2 id="mcp-tools"&gt;MCP Tools&lt;/h2&gt;
&lt;h3 id="madt_git_objects"&gt;&lt;code&gt;madt_git_objects&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Low-level git object operations (current repo by default; requires madt_enable(domains=[&amp;ldquo;git-objects&amp;rdquo;])): refs, trees, blobs, annotated tags, notes, and diff/patch apply.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Output schema&lt;/strong&gt;: declared&lt;/p&gt;
&lt;p&gt;One tool, action-dispatched. Set &lt;code&gt;action&lt;/code&gt; to one of:&lt;/p&gt;
&lt;h4 id="actionapply_diff"&gt;&lt;code&gt;action=&amp;quot;apply_diff&amp;quot;&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Apply a diff or patch to the repository, creating a new commit. The target branch must already exist (create one via madt_branches_remote action=create); applying to a protected default branch is rejected.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Required:&lt;/strong&gt; &lt;code&gt;content&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Optional:&lt;/strong&gt; &lt;code&gt;branch&lt;/code&gt;, &lt;code&gt;message&lt;/code&gt;, &lt;code&gt;author&lt;/code&gt;&lt;/p&gt;</description></item><item><title>ADR 0022 — Hermetic test guard: `go test` cannot resolve real credentials or mutate the real checkout</title><link>https://madtea.lol/docs/adr/0022-hermetic-test-guard/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0022-hermetic-test-guard/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-07&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 2034&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;A handler test called &lt;code&gt;issuesDevelop&lt;/code&gt; without sandboxing. Because
&lt;code&gt;serviceissue.Develop&lt;/code&gt; operates on the process working directory&amp;rsquo;s git repo and
resolves credentials from the ambient environment, the test — run from the real
madtea checkout — resolved real issue legacy tracker 42 through the &lt;strong&gt;live&lt;/strong&gt; forge API, created
and checked out a branch, and &lt;strong&gt;pushed it to origin&lt;/strong&gt;. It did this silently,
through a full green gate, twice (origin gained
&lt;code&gt;issue-42-phase-3-git-commands-migration&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>ADR 0020 — Identifier arity is a hard boundary: a singular parameter never becomes a batch</title><link>https://madtea.lol/docs/adr/0020-identifier-arity-boundary/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0020-identifier-arity-boundary/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-07&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 2029 (PR legacy tracker 2035). Builds on ADR 0005 and the FlexIDs lineage (legacy tracker 881, legacy tracker 884, legacy tracker 1327).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;The FlexIDs lineage made identifier &lt;strong&gt;value shapes&lt;/strong&gt; liberal: &lt;code&gt;numbers&lt;/code&gt;
accepts &lt;code&gt;441&lt;/code&gt;, &lt;code&gt;&amp;quot;441&amp;quot;&lt;/code&gt;, &lt;code&gt;[441]&lt;/code&gt;, &lt;code&gt;[&amp;quot;441&amp;quot;]&lt;/code&gt;, and &lt;code&gt;&amp;quot;441, 442&amp;quot;&lt;/code&gt;, all normalized
to &lt;code&gt;[]string&lt;/code&gt;. ADR 0005 codified the complementary rule for &lt;strong&gt;names&lt;/strong&gt;:
parameter names are strict (gh/tea/API-anchored), with only a bounded
did-you-mean. legacy tracker 2029 extended shape liberality across operation arity in one
direction: every single-target action accepts a single-element &lt;code&gt;numbers=[N]&lt;/code&gt;
as equivalent to &lt;code&gt;number=N&lt;/code&gt; (&lt;code&gt;resolveOneNumber&lt;/code&gt;), because that input&amp;rsquo;s
meaning is unambiguous.&lt;/p&gt;</description></item><item><title>Issues</title><link>https://madtea.lol/docs/reference/issues/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/issues/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-issue-all-comments"&gt;&lt;code&gt;madtea issue all-comments&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List all comments in the repository&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--limit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Maximum number of items to return (0 = server default)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--page&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Page number for pagination (0 = first page)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--since&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Filter comments updated since this date (YYYY-MM-DD or RFC3339)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-issue-attachments"&gt;&lt;code&gt;madtea issue attachments&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List attachments on an issue&lt;/p&gt;
&lt;h3 id="madtea-issue-attachments-add"&gt;&lt;code&gt;madtea issue attachments add&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Upload an attachment to an issue&lt;/p&gt;
&lt;h3 id="madtea-issue-attachments-delete"&gt;&lt;code&gt;madtea issue attachments delete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Delete an attachment from an issue&lt;/p&gt;</description></item><item><title>Labels</title><link>https://madtea.lol/docs/reference/labels/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/labels/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-labels-add"&gt;&lt;code&gt;madtea labels add&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Add labels to an issue (keeps existing labels)&lt;/p&gt;
&lt;h3 id="madtea-labels-clone"&gt;&lt;code&gt;madtea labels clone&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Clone labels from a source repository&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--force&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;on create: update an existing same-named label; on clone: update existing instead of skipping&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-labels-create"&gt;&lt;code&gt;madtea labels create&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Create a label&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--color&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;cccccc&lt;/td&gt;
					&lt;td&gt;hex color, without leading #&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--description&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Optional label description — a short note explaining what the label means (e.g. &amp;lsquo;Something is not working&amp;rsquo;).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--exclusive&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;mark exclusive (only one label per group)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--force&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;on create: update an existing same-named label; on clone: update existing instead of skipping&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--is-archived&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;archive the label (hidden from selectors)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--name&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Label name (alternative to positional argument)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-labels-delete"&gt;&lt;code&gt;madtea labels delete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Delete a label&lt;/p&gt;</description></item><item><title>ADR 0027 — Launch scope is the credential boundary; `dir=` is never a token selector</title><link>https://madtea.lol/docs/adr/0027-launch-scope-credential-boundary/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0027-launch-scope-credential-boundary/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted (owner ruling 2026-07-15; enforcement tracked in #90, issue-filing carve-out implementation in #59)&lt;/li&gt;
&lt;li&gt;Date: 2026-07-15&lt;/li&gt;
&lt;li&gt;Tracking: #90&lt;/li&gt;
&lt;li&gt;Amended 2026-07-17 (#155): a third enumerated read-only carve-out — the
whoami-scoped local-resolution report (see &amp;ldquo;Carve-out 3&amp;rdquo; below).&lt;/li&gt;
&lt;li&gt;Amended 2026-07-19 (#263): the residual-risk paragraph in Consequences
restated honestly - the boundary is host-scoped by credential, not
clone-scoped (the on-disk clone is fabricable friction, not authorization).&lt;/li&gt;
&lt;li&gt;Amended 2026-07-19 (#264): carve-out 2&amp;rsquo;s repo-prefix is now enforced
structurally client-side - the dir= report client is confined by
gitea.WithRepoScope, which refuses any request outside the target repo&amp;rsquo;s own
subtree, not just by convention of which methods the carve-out handlers call.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dir=&lt;/code&gt; began as a repo selector for local-git tools (ADR 0007) and was extended
to any git repo on disk (legacy tracker 1862), with ADR 0019 clamping foreign primaries to
the worktree→finish contribution flow. Separately, ADR 0025 made credential
resolution host-keyed and per-checkout: a clone of a Codeberg repo can carry
working Codeberg credentials while the session&amp;rsquo;s launch checkout is authed to
a different forge — or to nothing at all.&lt;/p&gt;</description></item><item><title>ADR 0014 — CLI and MCP are thin surfaces over one service layer</title><link>https://madtea.lol/docs/adr/0014-layered-dual-surface/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0014-layered-dual-surface/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-01&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1492 (SoC audit), legacy tracker 1493 (client-construction dedup), legacy tracker 1495 (assignee set-merge dedup)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea ships two distinct user-facing surfaces: the Cobra CLI (&lt;code&gt;internal/cmd&lt;/code&gt;)
and the MCP server (&lt;code&gt;internal/mcp&lt;/code&gt;). Before the SoC audit (epic legacy tracker 1492), both
surfaces contained business logic, API client construction calls, and
result-assembly code that was either duplicated or subtly divergent. Concrete
examples found in the audit:&lt;/p&gt;</description></item><item><title>MCP Prompts</title><link>https://madtea.lol/docs/reference/prompts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/prompts/</guid><description>&lt;p&gt;madtea registers its golden-path workflows as MCP prompts. A client that supports prompts (such as Claude Code) surfaces each one as a slash command — invoke it as &lt;code&gt;/mcp__madtea__&amp;lt;name&amp;gt;&lt;/code&gt; followed by the prompt&amp;rsquo;s arguments.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Prompt&lt;/th&gt;
					&lt;th&gt;Invocation&lt;/th&gt;
					&lt;th&gt;Title&lt;/th&gt;
					&lt;th&gt;Arguments&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;file-issue&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/mcp__madtea__file-issue&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;File a well-formed issue&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;title&lt;/code&gt; (&lt;strong&gt;required&lt;/strong&gt;): concise issue title; &lt;code&gt;body&lt;/code&gt; (optional): issue body: context, expected vs actual, repro steps (optional)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;finish-branch&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/mcp__madtea__finish-branch&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Finish the current branch&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;summary&lt;/code&gt; (&lt;strong&gt;required&lt;/strong&gt;): what changed and why (PR body); &lt;code&gt;closes&lt;/code&gt; (optional): comma-separated issue numbers to close on merge (optional; e.g. 42,57)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;reconcile&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/mcp__madtea__reconcile&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Reconcile a conflicted pull request&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;number&lt;/code&gt; (&lt;strong&gt;required&lt;/strong&gt;): the pull request number to reconcile (e.g. 42)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;release&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/mcp__madtea__release&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Check release cadence and cut a release&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;review&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/mcp__madtea__review&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Review a pull request&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;number&lt;/code&gt; (&lt;strong&gt;required&lt;/strong&gt;): the pull request number to review (e.g. 42)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;standup&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/mcp__madtea__standup&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Recent activity summary&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;days&lt;/code&gt; (optional): how many days back to summarize (optional; default 7)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;start-feature&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/mcp__madtea__start-feature&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Start a feature branch&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;name&lt;/code&gt; (&lt;strong&gt;required&lt;/strong&gt;): branch/feature name (e.g. fix-login or issue-42-rate-limit)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;triage&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/mcp__madtea__triage&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Triage the open backlog&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;target&lt;/code&gt; (optional): what to rank: omit for the current repo, or pass owner/repo, or a bare owner to aggregate a whole org&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>ADR 0001 — The MCP layer is the universal source of truth for agent conventions</title><link>https://madtea.lol/docs/adr/0001-mcp-universal-source-of-truth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0001-mcp-universal-source-of-truth/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-06-02&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1316 (agent self-sufficiency). This ADR closes the &amp;ldquo;decide first&amp;rdquo; sub-issue legacy tracker 1317.&lt;/li&gt;
&lt;li&gt;Amended: 2026-07-02 — the Tier taxonomy below is forked by ADR 0008 (legacy tracker 1693);
see &amp;ldquo;ADR 0008 update&amp;rdquo; at the end of this document for what changed and what
didn&amp;rsquo;t.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea ships as both a CLI binary and a Model Context Protocol (MCP)
server, and as a Claude Code plugin that bundles skills and PreToolUse
hooks around that same binary. The plugin manifest advertises support for
&amp;ldquo;Claude Code, OpenAI Codex CLI, and Google Gemini CLI&amp;rdquo;, and the README
documents install paths for those plus Cursor, Windsurf, Cline, Zed, and
&amp;ldquo;any MCP client&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Milestones</title><link>https://madtea.lol/docs/reference/milestones/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/milestones/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-milestone-close"&gt;&lt;code&gt;madtea milestone close&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Close one or more milestones&lt;/p&gt;
&lt;h3 id="madtea-milestone-create"&gt;&lt;code&gt;madtea milestone create&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Create a new milestone&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--description&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Milestone description&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--due&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Due date (YYYY-MM-DD)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-milestone-delete"&gt;&lt;code&gt;madtea milestone delete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Delete a milestone&lt;/p&gt;
&lt;h3 id="madtea-milestone-get"&gt;&lt;code&gt;madtea milestone get&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get milestone details&lt;/p&gt;
&lt;h3 id="madtea-milestone-list"&gt;&lt;code&gt;madtea milestone list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List milestones&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--limit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Maximum number of items to return (0 = server default)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--page&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Page number for pagination (0 = first page)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--state&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;open&lt;/td&gt;
					&lt;td&gt;Filter by state: open, closed, all&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-milestone-reopen"&gt;&lt;code&gt;madtea milestone reopen&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Reopen one or more milestones&lt;/p&gt;</description></item><item><title>Miscellaneous</title><link>https://madtea.lol/docs/reference/misc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/misc/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-render-markdown"&gt;&lt;code&gt;madtea render markdown&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Render markdown to HTML&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--repo&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Repository context (owner/repo)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-render-markup"&gt;&lt;code&gt;madtea render markup&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Render markup to HTML&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--mode&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;gfm&lt;/td&gt;
					&lt;td&gt;Markup mode (gfm, comment, wiki)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--repo&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Repository context (owner/repo)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-server-info"&gt;&lt;code&gt;madtea server-info&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Show detected server platform and version&lt;/p&gt;
&lt;h3 id="madtea-settings-api"&gt;&lt;code&gt;madtea settings api&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;API settings&lt;/p&gt;
&lt;h3 id="madtea-settings-attachment"&gt;&lt;code&gt;madtea settings attachment&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Attachment settings&lt;/p&gt;
&lt;h3 id="madtea-settings-repository"&gt;&lt;code&gt;madtea settings repository&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Repository settings&lt;/p&gt;
&lt;h3 id="madtea-settings-ui"&gt;&lt;code&gt;madtea settings ui&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;UI settings&lt;/p&gt;</description></item><item><title>ADR 0009 — Agent-facing guards are non-overridable; no agent-reachable opt-out</title><link>https://madtea.lol/docs/adr/0009-non-overridable-agent-guards/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0009-non-overridable-agent-guards/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Amended: 2026-07-07 by ADR 0021 — pure-read local-git steering demoted to non-blocking advisory; blocking guards (mutation, credential-exposure, shared-state) are unchanged.&lt;/li&gt;
&lt;li&gt;Date: 2026-06-28&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1721&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea&amp;rsquo;s Claude Code plugin ships four &lt;code&gt;PreToolUse&lt;/code&gt; Bash hooks
(&lt;code&gt;check-git-{commit,local,cli,remote}.sh&lt;/code&gt;). They intercept the agent&amp;rsquo;s Bash
tool and either steer raw &lt;code&gt;git&lt;/code&gt; / &lt;code&gt;madtea&lt;/code&gt; CLI calls to the credential-safe
&lt;code&gt;madt_*&lt;/code&gt; tools, or hard-block the raw remote ops that would leak a credential
token embedded in a remote URL.&lt;/p&gt;</description></item><item><title>Notifications</title><link>https://madtea.lol/docs/reference/notifications/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/notifications/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-notifications-list"&gt;&lt;code&gt;madtea notifications list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List notifications&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--all&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Include read notifications&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--before&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Only show notifications updated before this time (YYYY-MM-DD or RFC3339)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--limit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Maximum number of items to return (0 = server default)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--page&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Page number for pagination (0 = first page)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--since&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Only show notifications updated after this time (YYYY-MM-DD or RFC3339)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--status-types&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;stringSlice&lt;/td&gt;
					&lt;td&gt;[]&lt;/td&gt;
					&lt;td&gt;Filter by status: read, unread, pinned&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--subject-type&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;stringSlice&lt;/td&gt;
					&lt;td&gt;[]&lt;/td&gt;
					&lt;td&gt;Filter by subject: issue, pull, commit, repository&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-notifications-new"&gt;&lt;code&gt;madtea notifications new&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get count of unread notifications&lt;/p&gt;</description></item><item><title>ADR 0008 — The OperationSpec registry is the single source of record for all operation help and metadata</title><link>https://madtea.lol/docs/adr/0008-operation-registry-source-of-record/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0008-operation-registry-source-of-record/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-06-28&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1693&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea ships as both a CLI binary and an MCP server, and today maintains
&lt;strong&gt;two independently-authored help corpora&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLI help&lt;/strong&gt; — Cobra &lt;code&gt;Short&lt;/code&gt;/&lt;code&gt;Long&lt;/code&gt;/flag-usage strings, hand-written per
command in &lt;code&gt;internal/cmd&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP help&lt;/strong&gt; — &lt;code&gt;ActionSpec.Summary&lt;/code&gt; and jsonschema param tags, authored in
&lt;code&gt;internal/mcp&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The parity test (&lt;code&gt;internal/parity&lt;/code&gt;) keeps &lt;em&gt;names&lt;/em&gt; aligned across surfaces but
never description text, so the two corpora drift freely. Concrete divergences
today: &lt;code&gt;pr merge&lt;/code&gt; exposes four boolean flags (&lt;code&gt;--squash&lt;/code&gt;, &lt;code&gt;--rebase&lt;/code&gt;,
&lt;code&gt;--rebase-merge&lt;/code&gt;, &lt;code&gt;--ff-only&lt;/code&gt;) on the CLI versus a single &lt;code&gt;strategy&lt;/code&gt; enum on
MCP; the CLI flag &lt;code&gt;--admin&lt;/code&gt; appears as &lt;code&gt;force_merge&lt;/code&gt; in MCP; &lt;code&gt;issues create&lt;/code&gt;
is described as &amp;ldquo;Create a new issue.&amp;rdquo; on the CLI and &amp;ldquo;Create an issue.&amp;rdquo; in
MCP. MCP summaries are also deliberately richer — a drift guard mandates that
footgun keywords appear inline — but that policy runs against MCP alone and
cannot protect the CLI description.&lt;/p&gt;</description></item><item><title>Organizations</title><link>https://madtea.lol/docs/reference/org/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/org/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-org-activity"&gt;&lt;code&gt;madtea org activity&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get organization activity feed&lt;/p&gt;
&lt;h3 id="madtea-org-avatar-delete"&gt;&lt;code&gt;madtea org avatar delete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Delete an organization&amp;rsquo;s avatar&lt;/p&gt;
&lt;h3 id="madtea-org-avatar-upload"&gt;&lt;code&gt;madtea org avatar upload&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Upload an organization avatar&lt;/p&gt;
&lt;h3 id="madtea-org-blocks-add"&gt;&lt;code&gt;madtea org blocks add&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Block a user&lt;/p&gt;
&lt;h3 id="madtea-org-blocks-check"&gt;&lt;code&gt;madtea org blocks check&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Check if a user is blocked&lt;/p&gt;
&lt;h3 id="madtea-org-blocks-list"&gt;&lt;code&gt;madtea org blocks list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List blocked users&lt;/p&gt;
&lt;h3 id="madtea-org-blocks-remove"&gt;&lt;code&gt;madtea org blocks remove&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Unblock a user&lt;/p&gt;
&lt;h3 id="madtea-org-create"&gt;&lt;code&gt;madtea org create&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Create a new organization&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--description&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Organization description&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--full-name&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Organization full/display name&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--location&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Organization location&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--repo-admin-change-team-access&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Allow repo admins to change team access&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--visibility&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;public&lt;/td&gt;
					&lt;td&gt;Organization visibility: public, limited, or private&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--website&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Organization website URL&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-org-edit"&gt;&lt;code&gt;madtea org edit&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Edit organization settings&lt;/p&gt;</description></item><item><title>ADR 0025 — Origin-first forge resolution and host-keyed credentials</title><link>https://madtea.lol/docs/adr/0025-origin-first-forge-resolution/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0025-origin-first-forge-resolution/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-12&lt;/li&gt;
&lt;li&gt;Tracking: &lt;a href="https://codeberg.org/sixfold_space/madtea/issues/30"&gt;epic #30&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Amends: &lt;a href="https://madtea.lol/docs/adr/0013-credential-storage-model/"&gt;0013&lt;/a&gt; (credential keying),
&lt;a href="https://madtea.lol/docs/adr/0007-structural-fail-closed-multi-repo/"&gt;0007&lt;/a&gt; (extends the structural
workspace detection to forge selection)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea resolves a repository&amp;rsquo;s &lt;em&gt;path&lt;/em&gt; (&lt;code&gt;owner/name&lt;/code&gt;) from its &lt;code&gt;origin&lt;/code&gt;
remote, but resolves the &lt;em&gt;API server&lt;/em&gt; from the single &lt;code&gt;madtea.url&lt;/code&gt; config
value. The two can disagree, and when they do madtea silently queries the
wrong forge.&lt;/p&gt;
&lt;p&gt;Observed failure (2026-07-12): a workspace holds clones from two forges —
a self-hosted Gitea (the configured &lt;code&gt;madtea.url&lt;/code&gt;) and Codeberg. In a clone
whose &lt;code&gt;origin&lt;/code&gt; is &lt;code&gt;codeberg.org/&amp;lt;org&amp;gt;/&amp;lt;repo&amp;gt;&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Packages</title><link>https://madtea.lol/docs/reference/packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/packages/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-packages-delete"&gt;&lt;code&gt;madtea packages delete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Delete a package version&lt;/p&gt;
&lt;h3 id="madtea-packages-files"&gt;&lt;code&gt;madtea packages files&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List package files&lt;/p&gt;
&lt;h3 id="madtea-packages-get"&gt;&lt;code&gt;madtea packages get&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get package version details&lt;/p&gt;
&lt;h3 id="madtea-packages-latest"&gt;&lt;code&gt;madtea packages latest&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get latest package version&lt;/p&gt;
&lt;h3 id="madtea-packages-link"&gt;&lt;code&gt;madtea packages link&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Link package to a repository&lt;/p&gt;
&lt;h3 id="madtea-packages-list"&gt;&lt;code&gt;madtea packages list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List packages for an owner&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--limit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Maximum number of items to return (0 = server default)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--page&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Page number for pagination (0 = first page)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--type&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Filter by package type (go, npm, container, etc.)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-packages-unlink"&gt;&lt;code&gt;madtea packages unlink&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Unlink package from repository&lt;/p&gt;</description></item><item><title>ADR 0005 — Parameter-name ergonomics: proactive schema clarity, not reactive matching</title><link>https://madtea.lol/docs/adr/0005-parameter-name-ergonomics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0005-parameter-name-ergonomics/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-06-24&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1604, legacy tracker 1605. Builds on legacy tracker 1577 (the bounded did-you-mean) and legacy tracker 1593 (no negative steers).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;Agents reach for a &amp;ldquo;natural&amp;rdquo; argument name that is not the tool&amp;rsquo;s canonical
parameter, the JSON unmarshaler silently drops it, and a wasted round-trip
follows. Recurring, real instances:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;madt_finish&lt;/code&gt; is keyed by &lt;code&gt;title&lt;/code&gt;; an agent passed &lt;code&gt;commit_message&lt;/code&gt; (and
&lt;code&gt;message&lt;/code&gt;) — &amp;ldquo;the commit message&amp;rdquo; is the reflex word for a commit subject.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;madt_search&lt;/code&gt; is keyed by &lt;code&gt;q&lt;/code&gt;; an agent passed &lt;code&gt;query&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each time one of these surfaces, the reflex is to reach for the &lt;strong&gt;reactive&lt;/strong&gt;
side — extend the unknown-argument did-you-mean (legacy tracker 1577) with another synonym, a
compound/&lt;code&gt;_&lt;/code&gt;-token splitter, or a broad alias table — until &amp;ldquo;no guess ever
fails.&amp;rdquo; That instinct keeps getting re-explored from scratch, and it pulls
toward exactly the failure mode we want to avoid: a never-fail matcher that is
confidently wrong (&lt;code&gt;user_message → body?&lt;/code&gt;, &lt;code&gt;review_id → id&lt;/code&gt;). This ADR records
the decision so a future &amp;ldquo;wrong parameter name&amp;rdquo; bug resolves by reference.&lt;/p&gt;</description></item><item><title>Pull Requests</title><link>https://madtea.lol/docs/reference/pull-requests/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/pull-requests/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-pr-body-append"&gt;&lt;code&gt;madtea pr body append&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Append content to the end of a pull-request body&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--file&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Read content from file (use - for stdin)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-pr-body-patch"&gt;&lt;code&gt;madtea pr body patch&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Apply anchored (old -&amp;gt; new) replacements to a pull-request body&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--file&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Read replacements JSON from file (use - for stdin)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--new&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;stringArray&lt;/td&gt;
					&lt;td&gt;[]&lt;/td&gt;
					&lt;td&gt;Replacement text (repeatable; pairs with &amp;ndash;old)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--old&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;stringArray&lt;/td&gt;
					&lt;td&gt;[]&lt;/td&gt;
					&lt;td&gt;Anchor text to find (repeatable; pairs with &amp;ndash;new)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--replace-all&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;boolSlice&lt;/td&gt;
					&lt;td&gt;[]&lt;/td&gt;
					&lt;td&gt;Replace every occurrence for the corresponding &amp;ndash;old/&amp;ndash;new pair (repeatable, in order)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-pr-body-section-replace"&gt;&lt;code&gt;madtea pr body section-replace&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Replace the content of a named marked section in a pull-request body&lt;/p&gt;</description></item><item><title>Raw API passthrough</title><link>https://madtea.lol/docs/guides/raw-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/guides/raw-api/</guid><description>&lt;p&gt;&lt;code&gt;madtea api&lt;/code&gt; makes a raw call against the forge&amp;rsquo;s REST API and prints the
response. It is the &lt;strong&gt;last-resort escape hatch&lt;/strong&gt;: prefer a first-class command
(&lt;code&gt;issue list&lt;/code&gt;, &lt;code&gt;pr create&lt;/code&gt;, &lt;code&gt;labels set&lt;/code&gt;, …) every time, because those carry
the safety, confirmation, and output handling that a raw call does not. Reach
for &lt;code&gt;api&lt;/code&gt; only when no built-in command covers the endpoint you need — and when
that happens, it&amp;rsquo;s worth
&lt;a href="https://codeberg.org/sixfold_space/madtea/issues/new"&gt;filing an issue&lt;/a&gt; so the
gap gets a real command.&lt;/p&gt;</description></item><item><title>ADR 0021 — Pure-read local-git steering is non-blocking advisory, not a hard deny</title><link>https://madtea.lol/docs/adr/0021-read-steering-is-advisory/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0021-read-steering-is-advisory/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-07&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 2044, legacy tracker 2047&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea&amp;rsquo;s Claude Code plugin ships a local-git steering hook
(&lt;code&gt;hooks/scripts/check-git-local.sh&lt;/code&gt;) that intercepts the agent&amp;rsquo;s Bash tool and
redirects raw &lt;code&gt;git&lt;/code&gt; forms to the &lt;code&gt;madt_*&lt;/code&gt; MCP tool that does the same job. Since
legacy tracker 1610/legacy tracker 1612 it did this by &lt;strong&gt;hard deny&lt;/strong&gt; — &lt;code&gt;permissionDecision: &amp;quot;deny&amp;quot;&lt;/code&gt;, no
agent-reachable opt-out (ADR 0009).&lt;/p&gt;
&lt;p&gt;Over time the hard-deny set grew to cover a large read surface: &lt;code&gt;git status&lt;/code&gt;,
&lt;code&gt;git branch&lt;/code&gt; read/list, &lt;code&gt;git rev-parse HEAD&lt;/code&gt;, &lt;code&gt;git log&lt;/code&gt; (every read form),
&lt;code&gt;git worktree list&lt;/code&gt;, &lt;code&gt;git ls-tree&lt;/code&gt;, &lt;code&gt;git show &amp;lt;ref&amp;gt;:&amp;lt;path&amp;gt;&lt;/code&gt;, &lt;code&gt;git grep &amp;lt;pattern&amp;gt; &amp;lt;ref&amp;gt;&lt;/code&gt;, &lt;code&gt;git tag -l&lt;/code&gt;, &lt;code&gt;git diff &amp;lt;ref&amp;gt;&lt;/code&gt;, &lt;code&gt;git ls-files --deleted&lt;/code&gt;,
and &lt;code&gt;git sparse-checkout list&lt;/code&gt;. The legacy tracker 2044 audit classified every hard-blocked
git form and found &lt;strong&gt;twelve pure reads&lt;/strong&gt; blocked &lt;em&gt;purely for MCP-tool steering&lt;/em&gt;
— they cannot mutate the object DB, refs, working tree, index, config, or
stashes, and never contact a remote. Their block carried no mutation,
credential, or shared-state rationale; the only reason was economics (steer the
agent onto the one-call structured &lt;code&gt;madt_*&lt;/code&gt; tool).&lt;/p&gt;</description></item><item><title>ADR 0031 - Recoverable-guard tier: refuse wrong-workflow acts by default, override per call</title><link>https://madtea.lol/docs/adr/0031-recoverable-guard-tier/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0031-recoverable-guard-tier/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-17&lt;/li&gt;
&lt;li&gt;Tracking: #222&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;ADR 0029 pinned the rule for unrecoverable acts: they are omitted from every
madtea surface. It deliberately said nothing about a second class this repo
keeps meeting: acts that destroy nothing but are almost always workflow
wreckage. The motivating incident (2026-07-17): a process with a confused
working directory committed a feature snapshot directly onto the local default
branch. Nothing was lost - the commit was branched off and the ref reset by the
user - but the damage cost real recovery work: a diverged local main, a broken
local build, and untangling by hand. Remote branch protection never entered the
picture; the commit was never pushed, and protection fires at push time anyway,
after work has stacked on the wrong base. Not every repo configures protection
at all.&lt;/p&gt;</description></item><item><title>ADR 0010 — A release is a git tag; one blessed cross-platform install</title><link>https://madtea.lol/docs/adr/0010-release-is-a-tag-and-one-blessed-install/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0010-release-is-a-tag-and-one-blessed-install/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-01&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1711 (release-mess report); release/install overhaul epic filed on acceptance&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;Every release left a trail on the default branch: a &lt;code&gt;docs(changelog): backfill [Unreleased]&lt;/code&gt; PR, a &lt;code&gt;chore: prepare release&lt;/code&gt; PR, and their merge commits (legacy tracker 1711).
Two coupled causes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The changelog was hand-maintained.&lt;/strong&gt; &lt;code&gt;CHANGELOG.md&lt;/code&gt;&amp;rsquo;s &lt;code&gt;[Unreleased]&lt;/code&gt; section
was updated per-PR by hand, so the discipline lapsed and a backfill scramble
preceded every cut (and &lt;code&gt;release.sh&lt;/code&gt; &lt;em&gt;refuses&lt;/em&gt; on an empty &lt;code&gt;[Unreleased]&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;release.sh&lt;/code&gt; committed to a protected branch.&lt;/strong&gt; It bumped
&lt;code&gt;.claude-plugin/plugin.json&lt;/code&gt;, promoted &lt;code&gt;[Unreleased] → [version]&lt;/code&gt;, and
regenerated docs — all commits, so on a branch-protected &lt;code&gt;main&lt;/code&gt; they went
through their own release PR.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;But the commit-to-&lt;code&gt;main&lt;/code&gt; step is unnecessary:&lt;/p&gt;</description></item><item><title>ADR 0012 — Release signing and trust-on-first-use update verification</title><link>https://madtea.lol/docs/adr/0012-release-signing-and-tofu-updates/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0012-release-signing-and-tofu-updates/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-01&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1266 (release signing key); release/install overhaul epic (ADR 0010)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;madtea update&lt;/code&gt; downloads a release and replaces the running binary. Without
integrity verification, a tampered release or a man-in-the-middle on the download
runs arbitrary code as the user. madtea depends on no third-party update service
and publishes to a self-hosted forge, so the trust model must be self-contained
in the binary plus the release artifacts.&lt;/p&gt;</description></item><item><title>Releases</title><link>https://madtea.lol/docs/reference/releases/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/releases/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-release-assets-edit"&gt;&lt;code&gt;madtea release assets edit&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Rename or edit a release asset&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--name&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;New name for the asset&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-release-assets-get"&gt;&lt;code&gt;madtea release assets get&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get a specific release asset&lt;/p&gt;
&lt;h3 id="madtea-release-assets-list"&gt;&lt;code&gt;madtea release assets list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List assets on a release&lt;/p&gt;
&lt;h3 id="madtea-release-by-tag"&gt;&lt;code&gt;madtea release by-tag&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get a release by tag name&lt;/p&gt;
&lt;h3 id="madtea-release-create"&gt;&lt;code&gt;madtea release create&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Create a release from a tag&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--asset&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;stringSlice&lt;/td&gt;
					&lt;td&gt;[]&lt;/td&gt;
					&lt;td&gt;Files to attach (can be repeated, supports globs)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--draft&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Create as draft release&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--hide-archive-links&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Hide auto-generated archive download links&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--notes&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Release notes (inline text)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--notes-file&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Read release notes from file (use - for stdin)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--prerelease&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Mark as pre-release&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--target&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Target commit or branch for the tag&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--title&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Release title (defaults to tag name)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-release-delete"&gt;&lt;code&gt;madtea release delete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Delete a release (refused — use the forge web UI)&lt;/p&gt;</description></item><item><title>Repository</title><link>https://madtea.lol/docs/reference/repo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/repo/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-project-disable"&gt;&lt;code&gt;madtea project disable&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Disable projects for the current repository&lt;/p&gt;
&lt;h3 id="madtea-project-enable"&gt;&lt;code&gt;madtea project enable&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Enable projects for the current repository&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--mode&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Projects mode: repo, owner, or all&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-project-status"&gt;&lt;code&gt;madtea project status&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Show project settings for the current repository&lt;/p&gt;
&lt;h3 id="madtea-repo-activity"&gt;&lt;code&gt;madtea repo activity&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get activity feed&lt;/p&gt;
&lt;h3 id="madtea-repo-archive"&gt;&lt;code&gt;madtea repo archive&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Download a repository archive&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--format&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;tar.gz&lt;/td&gt;
					&lt;td&gt;Archive format: tar.gz or zip&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--output&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Output file path (defaults to &lt;repo&gt;-&lt;ref&gt;.&lt;format&gt;)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-repo-assignees"&gt;&lt;code&gt;madtea repo assignees&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List available assignees&lt;/p&gt;</description></item><item><title>Safe body edits</title><link>https://madtea.lol/docs/safety/safe-body-edits/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/safety/safe-body-edits/</guid><description>&lt;p&gt;madtea has no command that overwrites an issue body or pull-request body wholesale. Every edit is &lt;strong&gt;surgical and anchored&lt;/strong&gt;: you change a specific span, line, or named region, and the write is &lt;strong&gt;rejected&lt;/strong&gt; if the text you anchored to has drifted or the body changed underneath you. That makes silent clobbering — by an AI agent working from a stale read, or by two writers racing — structurally impossible rather than merely discouraged. (Comments are the one surface Gitea gives no version token: there &lt;code&gt;comment-edit&lt;/code&gt; does a full-body replace guarded by an &lt;code&gt;--expected-body&lt;/code&gt; check — &lt;strong&gt;required&lt;/strong&gt; on the MCP/agent surface, optional on the CLI. See &lt;a href="#comments"&gt;Comments&lt;/a&gt;.)&lt;/p&gt;</description></item><item><title>ADR 0002 — Safe inline body updates: anchored capture-then-update with optimistic-lock write-back</title><link>https://madtea.lol/docs/adr/0002-safe-inline-body-updates/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0002-safe-inline-body-updates/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-06-03&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1349 (RFC / brainstorm). Supersedes and subsumes legacy tracker 1348 (reconcile CLI &lt;code&gt;--body&lt;/code&gt; with the MCP body-edit block; add a trample-safe checklist toggle). Unblocks the stale tracking-issue bodies on legacy tracker 1272, legacy tracker 934, legacy tracker 1282.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea lets an agent or a human edit issue bodies, pull-request bodies, and comment bodies. The motivating failure is &lt;em&gt;clobbering&lt;/em&gt;: an agent regenerates a tracking issue&amp;rsquo;s body from a stale read and silently discards everything that was there — closed sub-issue checkboxes, hand-written notes, a progress counter. The blunt fix that shipped earlier blocks issue-body edits on the MCP (agent) surface entirely and tells the agent to use a comment instead. That stopped the clobbering, but it also forbade every &lt;em&gt;legitimate&lt;/em&gt; inline update (tick a box, fix a typo, append a section, sync a checklist), so tracking-issue bodies rot while the truth lives in comments — exactly the live state on legacy tracker 1272, legacy tracker 934, and legacy tracker 1282.&lt;/p&gt;</description></item><item><title>Safety hooks</title><link>https://madtea.lol/docs/safety/safety-hooks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/safety/safety-hooks/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Claude Code only.&lt;/strong&gt; These bash hooks are Claude-Code-specific. They ship with the &lt;a href="https://madtea.lol/docs/guides/clients/#claude-code"&gt;Claude Code plugin&lt;/a&gt; — installing the plugin is the way to get them. Agents on other MCP clients (Codex, Antigravity, Cursor, Zed, …) get the same credential-safe MCP tools but &lt;strong&gt;not&lt;/strong&gt; these hooks — and don&amp;rsquo;t need them, because the MCP tools never put a token in argv, history, or errors in the first place.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Claude Code plugin installs seven &lt;code&gt;PreToolUse&lt;/code&gt; hooks that intercept tool calls before they run — they don&amp;rsquo;t change git itself, only what the agent is permitted to run. The plugin is the single delivery channel: a binary-only madtea (Homebrew, Scoop, release tarball) does not materialize these hooks — install the plugin to add them. An MCP-only user who installs neither still keeps the credential-safe MCP tools, which never leak credentials in the first place.&lt;/p&gt;</description></item><item><title>Search</title><link>https://madtea.lol/docs/reference/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/search/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-search-issues"&gt;&lt;code&gt;madtea search issues&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Search issues across the instance&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--label&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;stringSlice&lt;/td&gt;
					&lt;td&gt;[]&lt;/td&gt;
					&lt;td&gt;Label names (comma-separated or repeated)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--limit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Maximum number of items to return (0 = server default)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--owner&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Filter by repository owner&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--page&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Page number for pagination (0 = first page)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--state&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Filter by state: open, closed, all&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-search-prs"&gt;&lt;code&gt;madtea search prs&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Search pull requests across the instance&lt;/p&gt;</description></item><item><title>secret-exec — run a command with your token, never on disk</title><link>https://madtea.lol/docs/guides/secret-exec/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/guides/secret-exec/</guid><description>&lt;p&gt;&lt;code&gt;madtea secret-exec&lt;/code&gt; runs a child command with your stored Forgejo/Gitea
token injected into its environment. The token is fetched from wherever
madtea already keeps it — your OS keychain, &lt;code&gt;pass&lt;/code&gt;, the &lt;code&gt;MADTEA_TOKEN&lt;/code&gt;
environment variable, or git config — and placed into the child process&amp;rsquo;s
environment under the variable name(s) you choose. It is never printed,
logged, written to a file, or passed as a command-line argument.&lt;/p&gt;
&lt;p&gt;The use case: a deploy script, &lt;code&gt;goreleaser&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, or some other tool
needs the same token madtea uses, but you don&amp;rsquo;t want to copy it into a
shell variable, an &lt;code&gt;.env&lt;/code&gt; file, or your shell history to get it there.&lt;/p&gt;</description></item><item><title>ADR 0028 — Semver tiers within 0.x; no launch-gated version freeze</title><link>https://madtea.lol/docs/adr/0028-semver-tiers-within-0x/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0028-semver-tiers-within-0x/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted (owner ruling 2026-07-17); Amended 2026-07-17 (#244)&lt;/li&gt;
&lt;li&gt;Date: 2026-07-17&lt;/li&gt;
&lt;li&gt;Tracking:&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="amendment-2026-07-17-244"&gt;Amendment (2026-07-17, #244)&lt;/h2&gt;
&lt;p&gt;Two changes to the original decision:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;0.x MINOR tier narrowed to breaking-only.&lt;/strong&gt; The original text said
&amp;ldquo;breaking or feat bumps MINOR&amp;rdquo;. The amended rule is: only a breaking
change (&lt;code&gt;type!:&lt;/code&gt; / &lt;code&gt;BREAKING CHANGE&lt;/code&gt;) bumps MINOR within 0.x; &lt;code&gt;feat:&lt;/code&gt;
and every other releasable type (fix/ux/perf) bump PATCH. Post-1.0
mapping is unchanged. The cadence score weights are NOT affected - a
feat still scores 3 pts while releasing as a patch.&lt;/p&gt;</description></item><item><title>Setup</title><link>https://madtea.lol/docs/reference/cli-setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/cli-setup/</guid><description>&lt;p&gt;Credential storage model (OS keychain, never token-in-URL): &lt;a href="https://madtea.lol/docs/adr/0013-credential-storage-model/"&gt;ADR 0013&lt;/a&gt;. Install location policy (one blessed binary per OS): &lt;a href="https://madtea.lol/docs/adr/0010-release-is-a-tag-and-one-blessed-install/"&gt;ADR 0010&lt;/a&gt;. Launch-scope credential boundary (one token per session, no cross-clone shopping): &lt;a href="https://madtea.lol/docs/adr/0027-launch-scope-credential-boundary/"&gt;ADR 0027&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-auth-login"&gt;&lt;code&gt;madtea auth login&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Set up Forgejo/Gitea credentials&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--force&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Skip confirmations (for non-interactive use)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--insecure-storage&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Store the token in plaintext git config instead of a secure backend (OS keychain, pass, or systemd-creds).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--token&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;API token&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--url&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Forgejo/Gitea server URL&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--web&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Open a browser to authenticate&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-auth-logout"&gt;&lt;code&gt;madtea auth logout&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Clear madtea-stored credentials for a scope&lt;/p&gt;</description></item><item><title>ADR 0023 — Shipped strings are self-contained: no internal references in steering, error, or refusal text</title><link>https://madtea.lol/docs/adr/0023-shipped-strings-self-contained/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0023-shipped-strings-self-contained/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-10&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 2130&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea ships strings to users in three compiled-in forms: hook steering text
(the plugin&amp;rsquo;s PreToolUse scripts), error/refusal returns from the CLI and the
&lt;code&gt;madt_*&lt;/code&gt; tools, and MCP tool/parameter descriptions. The house habit — natural
while the project was internal-only — has been to justify a rule by citing the
governance artifact behind it: &amp;ldquo;ADR 0009&amp;rdquo;, &lt;code&gt;&amp;quot;the removed all=true, #1964&amp;quot;&lt;/code&gt;,
&lt;code&gt;&amp;quot;see #1862&amp;quot;&lt;/code&gt;. Those citations resolve only inside the org: they point at ADR
files in this repo and issues on an internal forge.&lt;/p&gt;</description></item><item><title>ADR 0003 — Side-effect confirmation is a structural, enforced convention</title><link>https://madtea.lol/docs/adr/0003-side-effect-confirmation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0003-side-effect-confirmation/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-06-03&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1370 (epic). This ADR is sub-issue legacy tracker 1371; the convention is implemented across legacy tracker 1372–legacy tracker 1381.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;A command that performs a side-effect must tell the caller &lt;strong&gt;what it did&lt;/strong&gt; — otherwise the caller re-runs work that already happened. The concrete failure that prompted this: &lt;code&gt;madtea finish&lt;/code&gt; ends by running &lt;code&gt;git checkout &amp;lt;default&amp;gt; &amp;amp;&amp;amp; git pull&lt;/code&gt; (&lt;code&gt;returnToDefaultBranch&lt;/code&gt;), but its output says only &lt;em&gt;&amp;ldquo;Returned to &amp;lt;default&amp;gt;&amp;rdquo;&lt;/em&gt; — never that it pulled, or to which commit. A caller can&amp;rsquo;t tell the pull happened and re-runs &lt;code&gt;madtea pull&lt;/code&gt; (an observed redundancy).&lt;/p&gt;</description></item><item><title>ADR 0017 — Target the standard Gitea API v1; surface Forgejo gaps transparently</title><link>https://madtea.lol/docs/adr/0017-standard-forge-api-target/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0017-standard-forge-api-target/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-01&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1011 (Forgejo actions probe), docs/contributing/forgejo-15-actions-probe.md&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea is described in the project CLAUDE.md as follows: &amp;ldquo;Forgejo
compatibility: Uses standard API v1 endpoints that Forgejo maintains for Gitea
compatibility. Works with both platforms without modification.&amp;rdquo; In practice, the
two platforms are close but not identical. Forgejo is a soft fork of Gitea that
maintains compatibility with the Gitea API v1 for the vast majority of endpoints
but has not implemented some Actions-family endpoints that Gitea ships (verified
empirically in &lt;code&gt;docs/contributing/forgejo-15-actions-probe.md&lt;/code&gt; against Forgejo 15).&lt;/p&gt;</description></item><item><title>Stats</title><link>https://madtea.lol/docs/reference/stats/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/stats/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-stats"&gt;&lt;code&gt;madtea stats&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Repository or organization statistics&lt;/p&gt;
&lt;h3 id="madtea-stats-contributors"&gt;&lt;code&gt;madtea stats contributors&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Contributor stats for a repository&lt;/p&gt;
&lt;h3 id="madtea-stats-issues"&gt;&lt;code&gt;madtea stats issues&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Issue analytics for a repository&lt;/p&gt;
&lt;h3 id="madtea-stats-org"&gt;&lt;code&gt;madtea stats org&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get organization statistics&lt;/p&gt;
&lt;h3 id="madtea-stats-repo"&gt;&lt;code&gt;madtea stats repo&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get repository statistics&lt;/p&gt;
&lt;h3 id="madtea-stats-usage"&gt;&lt;code&gt;madtea stats usage&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Local command usage statistics&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--html&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Write a self-contained HTML report to this path and print the path&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--limit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;20&lt;/td&gt;
					&lt;td&gt;Maximum rows to show (0 = all)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--since&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Filter events since date (YYYY-MM-DD) or Go duration (e.g. 720h)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="mcp-tools"&gt;MCP Tools&lt;/h2&gt;
&lt;h3 id="madt_stats"&gt;&lt;code&gt;madt_stats&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Repository, organization, contributor, and issue statistics.&lt;/p&gt;</description></item><item><title>ADR 0029 - Strict omission: no madtea surface carries a work-destroying override</title><link>https://madtea.lol/docs/adr/0029-strict-omission-destruction-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0029-strict-omission-destruction-model/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-17&lt;/li&gt;
&lt;li&gt;Tracking: #206 (epic), #207&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea&amp;rsquo;s destructive-operation surfaces grew case by case, and by mid-2026
three different safety models coexisted with no ADR pinning any of them:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Omission&lt;/strong&gt; - force-delete of a local branch exists on NO madtea surface.
The MCP &lt;code&gt;madt_branch_delete&lt;/code&gt; tool has no force parameter, and the CLI
&lt;code&gt;madtea branch -d&lt;/code&gt; refuses &lt;code&gt;-D&lt;/code&gt;/&lt;code&gt;--force-delete&lt;/code&gt;, redirecting to raw
&lt;code&gt;git branch -D&lt;/code&gt; in the user&amp;rsquo;s own shell (&lt;code&gt;internal/cmd/git/branch.go&lt;/code&gt;).
The plugin hooks then steer agents off raw git. Two independent layers,
neither depending on the other behaving.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Machine-proof destruction&lt;/strong&gt; - &lt;code&gt;madtea prune&lt;/code&gt; deletes a ref only after
content-verifying it is contained in the default branch, and &lt;code&gt;madtea push --force&lt;/code&gt; rides &lt;code&gt;--force-with-lease&lt;/code&gt;. Refs die; work provably does not.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consent-gated presence&lt;/strong&gt; - &lt;code&gt;madt_worktrees remove force=&lt;/code&gt; (#168) and the
&lt;code&gt;madt_delete&lt;/code&gt; tool (repo/issue/release/tag/wiki page) DO exist on the agent
surface, guarded by an elicitation dialog.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Model 3 leaked twice, and both leaks are structural, not incidental:&lt;/p&gt;</description></item><item><title>ADR 0007 — Structural fail-closed for mutating local-git tools in a multi-repo workspace</title><link>https://madtea.lol/docs/adr/0007-structural-fail-closed-multi-repo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0007-structural-fail-closed-multi-repo/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-06-25&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1631 (resolves the deferred legacy tracker 1313 no-signal dead-zone).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;The legacy tracker 1313 wrong-repo guard (&lt;code&gt;internal/mcp/repoguard.go&lt;/code&gt;, commit &lt;code&gt;352df60&lt;/code&gt;) fails
closed only when it has a caller-repo signal that &lt;em&gt;differs&lt;/em&gt; from the repo the
server resolved from its launch-fixed cwd. In our actual deployment that signal
effectively never exists, so the block path has — outside tests — never fired:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MADTEA_CALLER_REPO&lt;/code&gt; (the env hint) has &lt;strong&gt;zero non-test writers&lt;/strong&gt;. It is read
in &lt;code&gt;detectCallerRepoFromEnv&lt;/code&gt; but nothing sets it; its block branch was only
ever exercised by a synthetic &lt;code&gt;t.Setenv&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The roots path (&lt;code&gt;callerRepoFromRoots&lt;/code&gt;) fires only when the client advertises
exactly one root that is a git repo &lt;em&gt;differing&lt;/em&gt; from the cwd repo. In the
common umbrella-workspace setup the single advertised root &lt;em&gt;is&lt;/em&gt; the cwd repo,
so there is no mismatch; and Codex CLI / Gemini CLI advertise &lt;strong&gt;no&lt;/strong&gt; roots at
all, so the roots path can never fire for them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;docs/safety/wrong-repo-protection.md&lt;/code&gt; flagged this as a known coverage gap and
called fail-closed-on-unknown &amp;ldquo;a deferred design question, not current
behavior.&amp;rdquo; We were about to recommend &lt;code&gt;MADTEA_CALLER_REPO&lt;/code&gt; as the cross-repo
protection for roots-less harnesses — a safety path we had never dogfooded. This
ADR resolves the deferred question and closes the dogfooding gap.&lt;/p&gt;</description></item><item><title>Take a Seat</title><link>https://madtea.lol/docs/guides/install/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/guides/install/</guid><description>&lt;p&gt;Install madtea on Linux, macOS, or Windows - one self-contained binary, one prerequisite: &lt;code&gt;git&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="linux"&gt;Linux&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# amd64 shown; arm64: swap the arch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://codeberg.org/sixfold_space/madtea/releases/download/latest/madtea_linux_amd64.tar.gz &lt;span class="p"&gt;|&lt;/span&gt; tar -xz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./madtea_linux_amd64/madtea install &lt;span class="c1"&gt;# installs to /usr/local/bin; delete the extracted dir after&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="macos"&gt;macOS&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew tap sixfold_space/tap https://codeberg.org/sixfold_space/homebrew-tap.git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew install --cask madtea
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="windows"&gt;Windows&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scoop bucket add madtea https://codeberg.org/sixfold_space/scoop-bucket &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; scoop install madtea
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="any-os-from-source"&gt;Any OS, from source&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# needs Go&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go install codeberg.org/sixfold_space/madtea/cmd/madtea@latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Building from a clone instead is covered in &lt;a href="https://codeberg.org/sixfold_space/madtea/src/commit/50f105638fd9481c1ac42fdf927229986985a216bb7f55dd09a27d4781f6a480/README.md#build-madtea-from-source"&gt;Build madtea from source&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>ADR 0004 — A positive terminal-closure signal on completed results</title><link>https://madtea.lol/docs/adr/0004-terminal-closure-signal/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0004-terminal-closure-signal/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-06-23&lt;/li&gt;
&lt;li&gt;Tracking: legacy tracker 1597.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;A side-effecting command already confirms &lt;em&gt;what it did&lt;/em&gt; (ADR-0003): finish
names its merge and pull, a close says &amp;ldquo;Closed issue #42&amp;rdquo;. That cured the
caller re-running a step the tool had already performed — but it did not cure a
second, subtler redundancy: after a result that &lt;strong&gt;ends a unit of work&lt;/strong&gt;, an
agent re-verifies the &lt;em&gt;outcome&lt;/em&gt;. The concrete failure that prompted this:
&lt;code&gt;madt_finish&lt;/code&gt; reported a clean merge, and the agent then ran &lt;code&gt;go build&lt;/code&gt; to
re-confirm the merged tree compiled — work the finish had already validated and
landed. The same instinct fires after a release publish (re-fetch the release),
an issue close (re-get the issue), a branch delete (re-list branches).&lt;/p&gt;</description></item><item><title>ADR 0026 — Guard texts are terminal or forwarding: no guard cycles, no dead ends</title><link>https://madtea.lol/docs/adr/0026-terminal-forwarding-guards/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/adr/0026-terminal-forwarding-guards/</guid><description>&lt;ul&gt;
&lt;li&gt;Status: Accepted&lt;/li&gt;
&lt;li&gt;Date: 2026-07-14&lt;/li&gt;
&lt;li&gt;Tracking: #15&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;madtea steers agents away from raw, credential-unsafe or shared-state-unsafe
git through two families of guards: the Claude Code plugin&amp;rsquo;s PreToolUse hooks
(they deny/advise on the Bash tool) and the &lt;code&gt;madt_*&lt;/code&gt; tool refusals (they reject
an unsafe call and teach the safe one). Each guard was written well on its own.
The failure mode is at the &lt;em&gt;seams&lt;/em&gt; between them.&lt;/p&gt;
&lt;p&gt;A live case study (an agent in a foreign-repo worktree, mid-merge-conflict):&lt;/p&gt;</description></item><item><title>Token Permissions</title><link>https://madtea.lol/docs/appendices/permissions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/appendices/permissions/</guid><description>&lt;p&gt;What scopes to enable on your Forgejo/Gitea personal-access token. For how madtea &lt;em&gt;stores&lt;/em&gt; that token and the credential-safety guarantees, see &lt;a href="https://madtea.lol/docs/safety/credential-safety/"&gt;&lt;code&gt;credential-safety.md&lt;/code&gt;&lt;/a&gt;. For how to report a security issue, see &lt;a href="https://codeberg.org/sixfold_space/madtea/src/commit/50f105638fd9481c1ac42fdf927229986985a216bb7f55dd09a27d4781f6a480/SECURITY.md"&gt;&lt;code&gt;../SECURITY.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="what-to-enable"&gt;What to enable&lt;/h2&gt;
&lt;p&gt;madtea works against three rough token tiers. Pick the smallest one that covers what you&amp;rsquo;ll do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Read-only&lt;/strong&gt; (browse, list, search):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;read:repository&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read:issue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read:user&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Standard&lt;/strong&gt; (typical day-to-day: create PRs/issues, merge, comment, mark notifications read):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;read:repository&lt;/code&gt; + &lt;code&gt;write:repository&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read:issue&lt;/code&gt; + &lt;code&gt;write:issue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read:notification&lt;/code&gt; + &lt;code&gt;write:notification&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read:user&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Full&lt;/strong&gt; (org administration, packages, webhooks, branch protection, admin domains):&lt;/p&gt;</description></item><item><title>Troubleshooting Guide</title><link>https://madtea.lol/docs/guides/troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/guides/troubleshooting/</guid><description>&lt;p&gt;This guide covers common errors in madtea, their causes, and how to fix them. Error messages are taken directly from the codebase.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-configuration-errors"&gt;1. Configuration Errors&lt;/h2&gt;
&lt;h3 id="not-configured---run-madtea-auth-login-first"&gt;&lt;code&gt;not configured - run 'madtea auth login' first&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; No Forgejo/Gitea URL or token found in environment variables or git config.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recovery:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;madtea auth login &lt;span class="c1"&gt;# Interactive setup for this repo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;madtea auth login --global &lt;span class="c1"&gt;# Store credentials globally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Or set environment variables:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;MADTEA_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://forgejo.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;MADTEA_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-token
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="not-configured---run-madtea-auth-login-or-set-madtea_url-and-madtea_token"&gt;&lt;code&gt;not configured - run 'madtea auth login' or set MADTEA_URL and MADTEA_TOKEN&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; &lt;code&gt;GetConfig()&lt;/code&gt; found neither env vars nor git config entries. Same fix as above.&lt;/p&gt;</description></item><item><title>Users</title><link>https://madtea.lol/docs/reference/user/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/user/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-gpg-key-add"&gt;&lt;code&gt;madtea gpg-key add&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Add a GPG key&lt;/p&gt;
&lt;h3 id="madtea-gpg-key-delete"&gt;&lt;code&gt;madtea gpg-key delete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Delete a GPG key&lt;/p&gt;
&lt;h3 id="madtea-gpg-key-list"&gt;&lt;code&gt;madtea gpg-key list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List GPG keys&lt;/p&gt;
&lt;h3 id="madtea-user-activity"&gt;&lt;code&gt;madtea user activity&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get user activity feed&lt;/p&gt;
&lt;h3 id="madtea-user-avatar-delete"&gt;&lt;code&gt;madtea user avatar delete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Delete avatar&lt;/p&gt;
&lt;h3 id="madtea-user-avatar-upload"&gt;&lt;code&gt;madtea user avatar upload&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Upload avatar image&lt;/p&gt;
&lt;h3 id="madtea-user-blocks-add"&gt;&lt;code&gt;madtea user blocks add&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Block a user&lt;/p&gt;
&lt;h3 id="madtea-user-blocks-check"&gt;&lt;code&gt;madtea user blocks check&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Check if a user is blocked&lt;/p&gt;
&lt;h3 id="madtea-user-blocks-list"&gt;&lt;code&gt;madtea user blocks list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List blocked users&lt;/p&gt;
&lt;h3 id="madtea-user-blocks-remove"&gt;&lt;code&gt;madtea user blocks remove&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Unblock a user&lt;/p&gt;</description></item><item><title>Why madtea</title><link>https://madtea.lol/docs/appendices/why/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/appendices/why/</guid><description>&lt;p&gt;Other forge CLIs wrap the API. madtea wraps the workflow — and it is built on
the assumption that an AI agent with shell access may be driving it.&lt;/p&gt;
&lt;p&gt;This is the punch list: what madtea does that gh, tea, and raw API calls
don&amp;rsquo;t. Every claim below is verified against the source tree; where a
comparison against gh or tea is asserted, it is backed by the
&lt;a href="https://madtea.lol/docs/appendices/comparison/"&gt;CLI comparison&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="1-it-has-an-issue-graph-nobody-else-does"&gt;1. It has an issue graph. Nobody else does.&lt;/h2&gt;
&lt;p&gt;gh and tea have &lt;strong&gt;zero&lt;/strong&gt; dependency commands — this whole category is a
capability gap, not an ergonomics win.&lt;/p&gt;</description></item><item><title>Wiki</title><link>https://madtea.lol/docs/reference/wiki/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/wiki/</guid><description>&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-wiki-create"&gt;&lt;code&gt;madtea wiki create&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Create wiki page&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--file&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Read content from file (use - for stdin)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--message&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Commit message (required)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-wiki-delete"&gt;&lt;code&gt;madtea wiki delete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Delete a wiki page (refused — use the forge web UI)&lt;/p&gt;
&lt;h3 id="madtea-wiki-get"&gt;&lt;code&gt;madtea wiki get&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Get wiki page content&lt;/p&gt;
&lt;h3 id="madtea-wiki-list"&gt;&lt;code&gt;madtea wiki list&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List wiki pages&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--limit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Maximum number of items to return (0 = server default)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--page&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;0&lt;/td&gt;
					&lt;td&gt;Page number for pagination (0 = first page)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-wiki-revisions"&gt;&lt;code&gt;madtea wiki revisions&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List wiki page revisions&lt;/p&gt;</description></item><item><title>Workflows</title><link>https://madtea.lol/docs/reference/cli-workflows/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/reference/cli-workflows/</guid><description>&lt;p&gt;Destruction model for prune (content-verified, never force-delete) and branch delete: &lt;a href="https://madtea.lol/docs/adr/0029-strict-omission-destruction-model/"&gt;ADR 0029&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="cli-commands"&gt;CLI Commands&lt;/h2&gt;
&lt;h3 id="madtea-adr-check"&gt;&lt;code&gt;madtea adr check&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Verify ADR numbering, index bijection, and links (exit 1 on drift)&lt;/p&gt;
&lt;h3 id="madtea-adr-new"&gt;&lt;code&gt;madtea adr new&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Create the next ADR record and index row (number from origin)&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--offline&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;Number from the local tree instead of the origin default branch&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--title&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Record title (defaults to a title derived from the slug)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--tracking&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Tracking reference recorded in the header (e.g. an issue or epic)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="madtea-finish"&gt;&lt;code&gt;madtea finish&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Commit, push, create PR, merge, and return to default branch&lt;/p&gt;</description></item><item><title>Wrong-repo fail-closed guard</title><link>https://madtea.lol/docs/safety/wrong-repo-protection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://madtea.lol/docs/safety/wrong-repo-protection/</guid><description>&lt;p&gt;A repo-scoped MCP tool called &lt;strong&gt;without&lt;/strong&gt; an explicit &lt;code&gt;owner_repo&lt;/code&gt; resolves its target repo from the MCP server process&amp;rsquo;s working directory — not from any &lt;code&gt;cd&lt;/code&gt; the agent did. The server is a single long-lived process whose OS working directory is fixed at launch, and concurrent tool calls share it, so the server cannot follow an agent into a sibling repo. In a multi-repo workspace that fixed cwd may be the &lt;em&gt;wrong&lt;/em&gt; repo, which has caused real wrong-repo writes — a &lt;code&gt;finish&lt;/code&gt; merged the wrong branch to the wrong repo, and an &lt;code&gt;issue create&lt;/code&gt; filed on the wrong repo (hazard legacy tracker 1313). To keep that from happening silently, madtea applies a fail-closed guard before any repo-scoped handler runs.&lt;/p&gt;</description></item></channel></rss>