{% extends "base.html" %} {% block title %}{{ package.id }} {{ v.version }}{% endblock %} {% block content %}

{{ package.id }} {{ v.version }}

{{ STATUS_NAMES.get(v.status, v.status) }} Risiko: {{ v.risk | label }} {{ v.compatibility | label }} {% if v.status == 'approved' %}Kanal {{ v.channel | label }}{% endif %} {% if v.status == 'in_review' %}Freigaben {{ review_round }} von {{ needed }}{% endif %}
{% if can_edit %} {{ 'Bearbeiten' if v.status == 'draft' else 'Neue Version auf dieser Basis' }} {% endif %} {% if can_submit %}
{% endif %} {% if can_decide %} {% endif %} {% if can_maintain and v.status in ('approved', 'deprecated') %}
{% if v.status == 'approved' %} {% else %} {% endif %}
{% endif %} {% if can_promote %}
{% endif %}
Beschreibung
{{ core.manifest.description_text }}
{% if core.manifest.changes %}
Änderung
{{ core.manifest.changes | trim }}
{% endif %}
Ziele
{{ core.manifest.targets | join(', ') }}
{% set local = core.manifest.server.local if core.manifest.server else none %} {% if local %}
Lokaler Server
{{ local.runtime | capitalize }}{% if local.python %} ≥ {{ local.python }}{% endif %}, Start: {{ local.entry }}{% if local.env %}, Umgebung: {{ local.env | join(', ') }}{% endif %}. Läuft auf jedem Rechner mit den Rechten der Person; installiert nach ~/.local/share/mcp/{{ package.id }}/{{ v.version }}/{% if 'requirements.txt' in core.files %}, Abhängigkeiten aus requirements.txt über pip{% endif %}.
{% endif %} {% if v.min_version_claude or v.min_version_opencode %}
Mindestversion
{% if v.min_version_claude %}Claude Code ≥ {{ v.min_version_claude }} {% endif %} {% if v.min_version_opencode %}OpenCode ≥ {{ v.min_version_opencode }}{% endif %}
{% endif %}
Prüfsumme
{{ v.checksum }}

Prüfung

{% set hints = v.linter | selectattr('severity', 'equalto', 'hint') | list %} {% if hints %}
    {% for b in hints %}
  • {{ b.code }} {{ b.text }}{% if b.file %} ({{ b.file }}){% endif %}
  • {% endfor %}
{% else %}

Linter ohne Hinweise.

{% endif %} {% if approvals %}
{% for f in approvals %}

{{ 'Freigegeben' if f.decision == 'approve' else 'Zurückgegeben' }}

{{ f.time.strftime('%d.%m.%Y %H:%M') }} · {{ reviewer.get(f.reviewer_key, '') }}

{% if f.comment %}

{{ f.comment }}

{% endif %}
{% endfor %}
{% endif %}
{% for path, text in content %}
{{ path }}
{{ text }}
{% endfor %}
{% if not predecessor %}

Erste Version: alles ist neu.

{% endif %} {% for d in differences %} {% if d.kind != 'equal' %}
{{ d.path }} {{ {'new': 'neu', 'removed': 'entfernt', 'changed': 'geändert'}.get(d.kind, d.kind) }}
{% for z in d.lines %}{{ z }}
{% endfor %}
{% endif %} {% endfor %} {% set equal = differences | selectattr('kind', 'equalto', 'equal') | list %} {% if predecessor and equal %}

Unverändert: {{ equal | map(attribute='path') | join(', ') }}

{% endif %}
{% for tool, entries in preview.items() %}

So kommt diese Version im Repo an ({{ tool }}).

{% for e in entries %}
{{ e.title }}
{{ e.content }}
{% endfor %}
{% endfor %}
{% if can_decide %} {% endif %} {% endblock %}