intel_coupling.html
html
sha256:3c58668648c7323bb9f5c6881cfe6a3f14fc93fcb73b537d253732952a5bf8bf
chore: bump version to 0.2.0rc12
Sonnet 4.6
patch
8 days ago
| 1 | {% extends "musehub/base.html" %} |
| 2 | |
| 3 | {% block title %}Coupling · {{ owner }}/{{ repo_slug }}{% endblock %} |
| 4 | {% block breadcrumb %} |
| 5 | <a href="/{{ owner }}">{{ owner }}</a> / |
| 6 | <a href="{{ base_url }}">{{ repo_slug }}</a> / |
| 7 | <a href="{{ base_url }}/intel">intel</a> / |
| 8 | coupling |
| 9 | {% endblock %} |
| 10 | {% block repo_nav %}{% include "musehub/partials/repo_nav.html" %}{% endblock %} |
| 11 | |
| 12 | {% block content %} |
| 13 | <div class="cp-wrap intel-wrap"> |
| 14 | |
| 15 | <div class="intel-subhd"> |
| 16 | <a href="{{ base_url }}/intel" class="intel-back">← Intel Hub</a> |
| 17 | <div class="intel-subhd-title intel-subhd-title--spectral"><span style="color:var(--color-success)">{{ icon("activity", 16) }}</span> Coupling</div> |
| 18 | <div class="intel-subhd-desc">File pairs that co-change most frequently — structural coupling signal.</div> |
| 19 | </div> |
| 20 | |
| 21 | {% if index_meta %} |
| 22 | <div class="intel-meta-bar"> |
| 23 | <span class="intel-meta-pill"> |
| 24 | <span class="intel-meta-key">pairs</span> |
| 25 | <span class="intel-meta-val">{{ total_count | fmtnum }}</span> |
| 26 | </span> |
| 27 | <span class="intel-meta-pill"> |
| 28 | <span class="intel-meta-key">ref</span> |
| 29 | <span class="intel-meta-val font-mono">{{ index_meta.ref[:14] if index_meta.ref else "—" }}</span> |
| 30 | </span> |
| 31 | {% if index_meta.built_at %} |
| 32 | <span class="intel-meta-pill"> |
| 33 | <span class="intel-meta-key">built</span> |
| 34 | <span class="intel-meta-val">{{ index_meta.built_at[:10] }}</span> |
| 35 | </span> |
| 36 | {% endif %} |
| 37 | </div> |
| 38 | {% endif %} |
| 39 | |
| 40 | {# ── Filter bar ──────────────────────────────────────────────────────────── #} |
| 41 | <form method="get" class="cp-filter-bar"> |
| 42 | <div class="cp-filter-group"> |
| 43 | <label class="cp-filter-label">min co-changes ≥</label> |
| 44 | <input type="number" name="min_co" value="{{ min_co }}" min="1" step="1" |
| 45 | class="input input--sm" style="width:4rem"> |
| 46 | </div> |
| 47 | <div class="cp-filter-group"> |
| 48 | <label class="cp-filter-label">show</label> |
| 49 | <select name="top" class="input input--sm"> |
| 50 | {% for t in valid_tops %} |
| 51 | <option value="{{ t }}"{% if t == selected_top %} selected{% endif %}>{{ t }}</option> |
| 52 | {% endfor %} |
| 53 | </select> |
| 54 | </div> |
| 55 | <button type="submit" class="btn btn-sm btn-secondary" style="margin-left:auto">Apply</button> |
| 56 | </form> |
| 57 | |
| 58 | {# ── Pair list ───────────────────────────────────────────────────────────── #} |
| 59 | {% if pairs %} |
| 60 | <div class="cp-list"> |
| 61 | {% for p in pairs %} |
| 62 | <div class="cp-pair-row"> |
| 63 | |
| 64 | <div class="cp-files"> |
| 65 | <span class="cp-file-a" title="{{ p.file_a }}">{{ p.short_a }}</span> |
| 66 | <span class="cp-arrow">↔</span> |
| 67 | <span class="cp-file-b" title="{{ p.file_b }}">{{ p.short_b }}</span> |
| 68 | </div> |
| 69 | |
| 70 | <span class="cp-count">{{ p.co_changes | fmtnum }}</span> |
| 71 | |
| 72 | <div class="cp-bar-wrap"> |
| 73 | <div class="cp-bar-track"> |
| 74 | <div class="cp-bar-fill{% if p.heat_modifier %} cp-bar-fill--{{ p.heat_modifier }}{% endif %}" |
| 75 | style="width:{{ p.bar_pct }}%"></div> |
| 76 | </div> |
| 77 | </div> |
| 78 | |
| 79 | </div> |
| 80 | {% endfor %} |
| 81 | </div> |
| 82 | {% else %} |
| 83 | <div class="cp-empty-state"> |
| 84 | {{ icon("zap", 32) }} |
| 85 | <div>No coupling data found with current filters.</div> |
| 86 | </div> |
| 87 | {% endif %} |
| 88 | |
| 89 | </div> |
| 90 | {% endblock %} |
File History
1 commit
sha256:35d76015db2541686c33edd44343ea2d9f751325b4a5556cc9c4c9c0f84edbbe
chore: bump version to 0.2.0rc12
Sonnet 4.6
patch
6 days ago