{% extends "components/_cc_shell.html" %} {% block content %}

Command Center

{# B9 #17: two-row layout — row 1 = Folder/Project/Version cascade, row 2 = Report + Period + Run + Pin + pinned readout. Replaces the single flex-wrap row that overflowed and re-flowed unpredictably. The cascade now reads Folder / Project / Version (was Folder / Target / bare "@"). #}
Folder Project Version
Report
{# B9 #17: Period control — hidden until the selected report is a period recipe (driven client-side by recipe.applicability.show_period, mirroring PERIOD_RECIPES). Blank = recipe default; the value rides /api/run as the already-supported `period` override. #}
{# Finding 7: also render a folder-only pin (pinned_folder, no project) on initial server render — not only after a client pin/unpin. Project wins over folder in the readout (mirrors the run-bar precedence); a folder-only pin shows a folder icon + resolved name (pinned_folder_name), falling back to the ID (pinned_folder) when the name couldn't be resolved. #} {% if pinned_report or pinned_project or pinned_folder %} Pinned: {{ pinned_report or '—' }}{% if pinned_project %} · {{ pinned_project }}{% if pinned_version %} @ {{ pinned_version }}{% endif %}{% elif pinned_folder %} · {{ pinned_folder_name or pinned_folder }}{% endif %} {% endif %}
Platform
Scans / 30d
0
Reports run / 30d
0
Active users / 30d
0

Scan Health

30d

Running Reports

Live Scan Queue

Loading…
{# Recent Activity was removed — it duplicated Report History (/reports) and sat below the fold; the Running Reports panel already surfaces recent completed runs at the top. Browse past runs via Report History (sidebar / the panel's "more →" link). #}

Launch a Report

All Executive Investigation Remediation Compliance Sort Recent A–Z
{% for r in recipes %}
{{ r.nav_category }}

{{ r.name }}

{# B10 #23: card front shows the short card_description (falls back to the full description); the full text rides as the title tooltip. #}

{{ r.card_description or r.description }}

{% if r.kind %}{{ r.kind }}{% endif %} Run
{% endfor %} {# Synthetic Comparison card — rendered only when comparison recipes exist. Deep-links into the Builder comparison editor instead of flipping to a back-face (the authoring back-face has been retired; the Builder owns comparison authoring now). Clicking anywhere on the card navigates to /workflows/builder?kind=comparison&new=1. No data-comparison attribute (the retired flip path is removed from command-center.js). #} {% if comparison_recipes %}
Investigation

Comparison

Compare two scopes — pick the diffs and left/right targets.

Open in Builder
{% endif %} {# Synthetic Compound card — deep-links into the Builder compound editor. Clicking anywhere on the card navigates to /workflows/builder?kind=compound&new=1. Compound reports need no installed recipes, so no gating condition. #}
Investigation

Compound

Combine multiple report sections into one deliverable. Open in Builder.

Open in Builder
{# A standalone one-shot destructive apply (NOT a report-run input): upload a vex_recommendations.json (kind=recs) → dry-run preview via /api/vex/apply-file → "Apply for real" (confirm-gated). Reuses the shared .fs-upload control + uploads.js. The endpoint canonicalizes + confines the path to ~/.fs-report/uploads/recs/ and requires confirm for a real write (server-enforced). Wired by command-center.js wireApplyVexFile(). #}
{% endblock %} {% block scripts %} {# Fix 1 (PR #117 review): the card-back Version Comparison pickers call initVersionPicker, which (along with initScopeDropdowns) is defined in _scope_dropdowns.html. The dashboard has no prerun-fragment loaded at page load, so without this include the function is undefined and the card-back baseline/current pickers stay inert. Include it once here (after command-center.js is loaded by _cc_shell.html) so the definition exists when a card back is wired. Both functions are plain hoisted `function` declarations that only DEFINE on load (no side-effecting top-level calls), so if the prerun modal fragment later injects this same template via HTMX the re-declaration is harmless. #} {% include "components/_scope_dropdowns.html" %} {% endblock %}