feat(standards): MR-based tag strategy + repository inventory (registry://repos)

Versioning standard now documents the MR flow: bump pyproject.toml/VERSION and promote CHANGELOG in the MR (referencing the version/tag, not a commit id), merge/squash, then tag the resulting commit. Adds the agent-assisted tagging procedure (wait for the go-ahead, find the version-bump commit, tag only it, ask the user to push) to both the reference page and the releasing wiki runbook. Adds the repo inventory (src/repos.json -> mcp/repos.json), the registry://repos resource + list_repos tool, the 15_repository_inventory lib page, and two MCP prompts: compliance (remediate repos) and release (agent tagging).
This commit is contained in:
2026-10-15 14:39:21 +05:30
parent df03f41771
commit 5971f26c08
36 changed files with 2107 additions and 94 deletions

View File

@@ -528,21 +528,36 @@
</li>
<li class="md-nav__item">
<a href="#promote-the-changelog" class="md-nav__link">
<a href="#release-in-the-mr" class="md-nav__link">
<span class="md-ellipsis">
✍️ Promote the changelog
🌿 Release in the MR
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#bump-the-version-file" class="md-nav__link">
<a href="#tag-the-merged-commit" class="md-nav__link">
<span class="md-ellipsis">
🔢 Bump the version file
🏷️ Tag the merged commit
</span>
</a>
<nav class="md-nav" aria-label="🏷️ Tag the merged commit">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#agent-assisted-tagging" class="md-nav__link">
<span class="md-ellipsis">
🤖 Agent-assisted tagging
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
@@ -610,12 +625,14 @@
page <a href="../lib/11_versioning_and_changelog/">Versioning &amp; Changelog</a>; this is the
runbook you follow.</p>
<p>Every repository is one of two Drone shapes — a <strong>PyPI package</strong> or a <strong>Docker
deployment</strong> (<a href="../lib/10_drone_pipelines/">Drone Pipelines</a>). Both are
released the same way: bump the version file, promote the changelog, tag.</p>
deployment</strong> (<a href="../lib/10_drone_pipelines/">Drone Pipelines</a>). Both release the
same way: the version bump and changelog promotion go <strong>in the merge request</strong>,
and the tag is created on the merged commit.</p>
<hr />
<h2 id="before-you-start">🧾 Before you start</h2>
<ul>
<li><code>main</code> is green (the Drone quality gate passed on the last run).</li>
<li>You have an open <strong>merge request</strong> holding the change, and <code>main</code> is green
(the Drone quality gate passed on the last run).</li>
<li>You know whether this is a <strong>breaking</strong>, <strong>feature</strong>, or <strong>fix</strong> release.</li>
<li>The version file exists:</li>
<li>package → <code>version</code> in <code>pyproject.toml</code></li>
@@ -652,35 +669,44 @@ line (see the reference page); once at <code>1.0.0</code>, normal SemVer applies
</tbody>
</table>
<hr />
<h2 id="promote-the-changelog">✍️ Promote the changelog</h2>
<p>In <code>CHANGELOG.md</code>:</p>
<ol>
<li>Rename the content under <code>[Unreleased]</code> into a new
<code>## [x.y.z] - YYYY-MM-DD</code> heading (keep the sections that apply).</li>
<li>Leave a fresh, empty <code>## [Unreleased]</code> on top.</li>
<li>Add the compare links at the bottom:</li>
</ol>
<h2 id="release-in-the-mr">🌿 Release in the MR</h2>
<p>The version is known while the change is still a merge request, so the bump
rides along with it. Do both edits <strong>in the MR</strong>:</p>
<ul>
<li><strong>Promote the changelog</strong> in <code>CHANGELOG.md</code>: move the <code>[Unreleased]</code> content
under a new <code>## [x.y.z] - YYYY-MM-DD</code> heading, leave a fresh empty
<code>[Unreleased]</code> on top, and add the compare links — naming the <strong>version/tag</strong>,
never a commit id:</li>
</ul>
<div class="language-markdown highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span>
<span class="normal"><a href="#__codelineno-0-2">2</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a>[<span class="nl">Unreleased</span>]: <span class="na">https://git.aetoskia.com/aetos/&lt;repo&gt;/compare/x.y.z...HEAD</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2"></a>[<span class="nl">x.y.z</span>]: <span class="na">https://git.aetoskia.com/aetos/&lt;repo&gt;/compare/x.y.(z-1)...x.y.z</span>
</span></code></pre></div></td></tr></table></div>
<hr />
<h2 id="bump-the-version-file">🔢 Bump the version file</h2>
<ul>
<li><strong>Package:</strong> edit <code>version = "x.y.z"</code> in <code>pyproject.toml</code>.</li>
<li><strong>Service / site:</strong> edit the <code>VERSION</code> file.</li>
<li><strong>Bump the version file</strong> to the intended release version: <code>version = "x.y.z"</code>
in <code>pyproject.toml</code> (packages) or the <code>VERSION</code> file (services/sites).</li>
</ul>
<p>Then commit and tag:</p>
<div class="language-bash highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-1-1">1</a></span>
<span class="normal"><a href="#__codelineno-1-2">2</a></span>
<span class="normal"><a href="#__codelineno-1-3">3</a></span>
<span class="normal"><a href="#__codelineno-1-4">4</a></span>
<span class="normal"><a href="#__codelineno-1-5">5</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1"></a>git<span class="w"> </span>add<span class="w"> </span>CHANGELOG.md<span class="w"> </span>pyproject.toml<span class="w"> </span><span class="c1"># or VERSION</span>
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2"></a>git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;chore(release): x.y.z&quot;</span>
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3"></a>git<span class="w"> </span>tag<span class="w"> </span>x.y.z
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4"></a>git<span class="w"> </span>push<span class="w"> </span>origin<span class="w"> </span>HEAD
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5"></a>git<span class="w"> </span>push<span class="w"> </span>origin<span class="w"> </span>x.y.z
</span></code></pre></div></td></tr></table></div>
<hr />
<h2 id="tag-the-merged-commit">🏷️ Tag the merged commit</h2>
<ol>
<li><strong>Merge or squash</strong> the MR into <code>main</code>.</li>
<li><strong>Create the tag</strong> on the resulting commit: <code>git tag x.y.z</code> (lightweight).</li>
<li><strong>Push the tag</strong> (<code>git push origin x.y.z</code>) — Drone builds the release.</li>
</ol>
<h3 id="agent-assisted-tagging">🤖 Agent-assisted tagging</h3>
<p>The agent does not author or merge the MR and never tags before the merge. After
you confirm the MR is merged/squashed and tell it to proceed, the agent:</p>
<ol>
<li>Waits for that explicit go-ahead.</li>
<li>Finds the commit that introduced the bump:</li>
<li>package:
<code>git log -S 'version = "x.y.z"' -n 1 --format='%H %s' -- pyproject.toml</code></li>
<li>service / site:
<code>git log -S 'x.y.z' -n 1 --format='%H %s' -- VERSION</code></li>
<li>Verifies that commit's version file equals <code>x.y.z</code>, then tags <strong>only</strong> that
commit: <code>git tag x.y.z &lt;sha&gt;</code>.</li>
<li>Does <strong>not</strong> push — it asks you to run <code>git push origin x.y.z</code>.</li>
</ol>
<hr />
<h2 id="what-drone-does">🤖 What Drone does</h2>
<ul>