597 lines
23 KiB
HTML
597 lines
23 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>dist release console mock</title>
|
|
<link rel="stylesheet" href="styles.css" />
|
|
</head>
|
|
<body>
|
|
<div class="shell">
|
|
<header class="topbar">
|
|
<div class="brand-block">
|
|
<div class="brand-mark">d</div>
|
|
<div>
|
|
<div class="brand-name">dist</div>
|
|
<div class="brand-meta">UGREEN NAS - local.distro.test</div>
|
|
</div>
|
|
</div>
|
|
|
|
<label class="search">
|
|
<span>/</span>
|
|
<input type="search" placeholder="Search apps, releases, artifacts" />
|
|
</label>
|
|
|
|
<div class="top-actions">
|
|
<button class="icon-button" aria-label="Sync">
|
|
<span aria-hidden="true">R</span>
|
|
</button>
|
|
<button class="icon-button" aria-label="Notifications">
|
|
<span aria-hidden="true">!</span>
|
|
</button>
|
|
<div class="server-pill">
|
|
<span class="dot dot-ok"></span>
|
|
distd healthy
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
<aside class="sidebar">
|
|
<nav class="nav-list" aria-label="Primary">
|
|
<button class="nav-item is-active" data-view="apps">
|
|
<span class="nav-glyph">A</span>
|
|
Apps
|
|
</button>
|
|
<button class="nav-item" data-view="release">
|
|
<span class="nav-glyph">R</span>
|
|
Release
|
|
</button>
|
|
<button class="nav-item" data-view="install">
|
|
<span class="nav-glyph">I</span>
|
|
Install
|
|
</button>
|
|
<button class="nav-item" data-view="tokens">
|
|
<span class="nav-glyph">T</span>
|
|
Tokens
|
|
</button>
|
|
<button class="nav-item" data-view="audit">
|
|
<span class="nav-glyph">L</span>
|
|
Audit
|
|
</button>
|
|
<button class="nav-item" data-view="settings">
|
|
<span class="nav-glyph">S</span>
|
|
Settings
|
|
</button>
|
|
</nav>
|
|
|
|
<div class="sidebar-status">
|
|
<div class="side-label">Storage</div>
|
|
<div class="meter" aria-label="Storage used">
|
|
<span style="width: 58%"></span>
|
|
</div>
|
|
<div class="side-value">824 GB of 1.4 TB</div>
|
|
</div>
|
|
</aside>
|
|
|
|
<main class="workspace">
|
|
<section class="view is-active" id="view-apps">
|
|
<div class="page-head">
|
|
<div>
|
|
<h1>Applications</h1>
|
|
<p>5 apps - 31 active release artifacts - 3 pending checks</p>
|
|
</div>
|
|
<div class="head-actions">
|
|
<button class="secondary-button">Import manifest</button>
|
|
<button class="primary-button">New app</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="apps-layout">
|
|
<section class="panel app-list-panel" aria-label="Application list">
|
|
<div class="panel-toolbar">
|
|
<div class="segmented">
|
|
<button class="is-selected">All</button>
|
|
<button>Mobile</button>
|
|
<button>Desktop</button>
|
|
</div>
|
|
<button class="small-button">Filter</button>
|
|
</div>
|
|
|
|
<div class="app-list">
|
|
<button class="app-row is-selected" data-app="atlas">
|
|
<span class="app-icon app-icon-atlas">AN</span>
|
|
<span class="app-main">
|
|
<strong>Atlas Notes</strong>
|
|
<small>ios - apk - macos - windows</small>
|
|
</span>
|
|
<span class="status-badge status-live">Stable</span>
|
|
</button>
|
|
<button class="app-row" data-app="forge">
|
|
<span class="app-icon app-icon-forge">FB</span>
|
|
<span class="app-main">
|
|
<strong>Forge Build</strong>
|
|
<small>linux - windows - macos</small>
|
|
</span>
|
|
<span class="status-badge status-beta">Beta</span>
|
|
</button>
|
|
<button class="app-row" data-app="field">
|
|
<span class="app-icon app-icon-field">FK</span>
|
|
<span class="app-main">
|
|
<strong>FieldKit</strong>
|
|
<small>ios - apk</small>
|
|
</span>
|
|
<span class="status-badge status-hold">Hold</span>
|
|
</button>
|
|
<button class="app-row" data-app="ledger">
|
|
<span class="app-icon app-icon-ledger">LW</span>
|
|
<span class="app-main">
|
|
<strong>LedgerWorks</strong>
|
|
<small>windows - linux</small>
|
|
</span>
|
|
<span class="status-badge status-live">Stable</span>
|
|
</button>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="panel app-detail-panel" aria-label="Application detail">
|
|
<div class="detail-top">
|
|
<div class="app-title">
|
|
<span class="app-icon app-icon-atlas app-icon-large" id="detail-icon">AN</span>
|
|
<div>
|
|
<h2 id="detail-name">Atlas Notes</h2>
|
|
<p id="detail-subtitle">com.example.atlas - owner mobile-platform</p>
|
|
</div>
|
|
</div>
|
|
<div class="detail-actions">
|
|
<button class="secondary-button">Edit</button>
|
|
<button class="primary-button">Publish</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="metric-grid">
|
|
<div class="metric">
|
|
<span>Latest stable</span>
|
|
<strong id="metric-stable">2.8.4</strong>
|
|
<small>promoted 18 min ago</small>
|
|
</div>
|
|
<div class="metric">
|
|
<span>Downloads</span>
|
|
<strong id="metric-downloads">14,283</strong>
|
|
<small>last 30 days</small>
|
|
</div>
|
|
<div class="metric">
|
|
<span>Platforms</span>
|
|
<strong id="metric-platforms">4</strong>
|
|
<small>ios, apk, macos, windows</small>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="section-row">
|
|
<h3>Channels</h3>
|
|
<button class="small-button">Manage</button>
|
|
</div>
|
|
<div class="channel-grid">
|
|
<div class="channel-box">
|
|
<span class="dot dot-ok"></span>
|
|
<strong>stable</strong>
|
|
<small>2.8.4 - signed - public</small>
|
|
</div>
|
|
<div class="channel-box">
|
|
<span class="dot dot-warn"></span>
|
|
<strong>beta</strong>
|
|
<small>2.9.0-rc.3 - notarizing</small>
|
|
</div>
|
|
<div class="channel-box">
|
|
<span class="dot dot-cold"></span>
|
|
<strong>internal</strong>
|
|
<small>main.6814 - CI only</small>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="section-row">
|
|
<h3>Recent Releases</h3>
|
|
<button class="small-button" data-view-link="release">Open latest</button>
|
|
</div>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Version</th>
|
|
<th>Channel</th>
|
|
<th>Artifacts</th>
|
|
<th>Checks</th>
|
|
<th>Published</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>2.9.0-rc.3</td>
|
|
<td><span class="status-badge status-beta">beta</span></td>
|
|
<td>5</td>
|
|
<td><span class="check-text check-warn">2 pending</span></td>
|
|
<td>9 min ago</td>
|
|
</tr>
|
|
<tr>
|
|
<td>2.8.4</td>
|
|
<td><span class="status-badge status-live">stable</span></td>
|
|
<td>4</td>
|
|
<td><span class="check-text check-ok">passed</span></td>
|
|
<td>18 min ago</td>
|
|
</tr>
|
|
<tr>
|
|
<td>2.8.3</td>
|
|
<td><span class="status-badge status-live">stable</span></td>
|
|
<td>4</td>
|
|
<td><span class="check-text check-ok">passed</span></td>
|
|
<td>May 31</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="view" id="view-release">
|
|
<div class="page-head">
|
|
<div>
|
|
<h1>Atlas Notes 2.9.0-rc.3</h1>
|
|
<p>Release candidate - build 6814 - uploaded by ci-github</p>
|
|
</div>
|
|
<div class="head-actions">
|
|
<button class="secondary-button">Rollback</button>
|
|
<button class="primary-button">Promote to stable</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="release-layout">
|
|
<section class="panel">
|
|
<div class="section-row">
|
|
<h2>Artifacts</h2>
|
|
<button class="small-button">Upload</button>
|
|
</div>
|
|
<div class="artifact-list">
|
|
<div class="artifact-row">
|
|
<span class="platform-badge ios">iOS</span>
|
|
<div>
|
|
<strong>AtlasNotes.ipa</strong>
|
|
<small>sha256 verified - 92.4 MB - enterprise profile</small>
|
|
</div>
|
|
<span class="check-text check-ok">signed</span>
|
|
</div>
|
|
<div class="artifact-row">
|
|
<span class="platform-badge apk">APK</span>
|
|
<div>
|
|
<strong>atlas-notes.apk</strong>
|
|
<small>v2 signature - 78.1 MB - min sdk 26</small>
|
|
</div>
|
|
<span class="check-text check-ok">signed</span>
|
|
</div>
|
|
<div class="artifact-row">
|
|
<span class="platform-badge mac">mac</span>
|
|
<div>
|
|
<strong>Atlas Notes.app.zip</strong>
|
|
<small>notarization submitted - 134 MB</small>
|
|
</div>
|
|
<span class="check-text check-warn">pending</span>
|
|
</div>
|
|
<div class="artifact-row">
|
|
<span class="platform-badge linux">linux</span>
|
|
<div>
|
|
<strong>atlas-notes-x86_64.tar.gz</strong>
|
|
<small>ELF scan complete - 119 MB</small>
|
|
</div>
|
|
<span class="check-text check-ok">clean</span>
|
|
</div>
|
|
<div class="artifact-row">
|
|
<span class="platform-badge win">win</span>
|
|
<div>
|
|
<strong>AtlasNotesSetup.exe</strong>
|
|
<small>authenticode verified - 146 MB</small>
|
|
</div>
|
|
<span class="check-text check-warn">scan</span>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<aside class="panel release-side">
|
|
<h2>CI Publish</h2>
|
|
<div class="code-card">
|
|
<code>dist ci publish --manifest dist.json --channel beta --json</code>
|
|
</div>
|
|
<dl class="definition-list">
|
|
<div>
|
|
<dt>Token</dt>
|
|
<dd>ci-github-atlas</dd>
|
|
</div>
|
|
<div>
|
|
<dt>Policy</dt>
|
|
<dd>publish:atlas, promote:beta</dd>
|
|
</div>
|
|
<div>
|
|
<dt>Retention</dt>
|
|
<dd>keep 20 stable, 10 beta</dd>
|
|
</div>
|
|
</dl>
|
|
</aside>
|
|
</div>
|
|
|
|
<section class="panel timeline-panel">
|
|
<h2>Release Timeline</h2>
|
|
<ol class="timeline">
|
|
<li>
|
|
<span class="dot dot-ok"></span>
|
|
<div>
|
|
<strong>Manifest accepted</strong>
|
|
<small>All artifact targets matched app policy</small>
|
|
</div>
|
|
<time>09:21</time>
|
|
</li>
|
|
<li>
|
|
<span class="dot dot-ok"></span>
|
|
<div>
|
|
<strong>Mobile signatures verified</strong>
|
|
<small>iOS enterprise profile and APK v2 signature passed</small>
|
|
</div>
|
|
<time>09:23</time>
|
|
</li>
|
|
<li>
|
|
<span class="dot dot-warn"></span>
|
|
<div>
|
|
<strong>Desktop checks running</strong>
|
|
<small>macOS notarization and Windows malware scan pending</small>
|
|
</div>
|
|
<time>09:29</time>
|
|
</li>
|
|
</ol>
|
|
</section>
|
|
</section>
|
|
|
|
<section class="view" id="view-install">
|
|
<div class="page-head">
|
|
<div>
|
|
<h1>Install Experience</h1>
|
|
<p>Public web install page, mobile-safe flows, and platform fallbacks</p>
|
|
</div>
|
|
<div class="head-actions">
|
|
<button class="secondary-button">Preview</button>
|
|
<button class="primary-button">Publish page</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="install-layout">
|
|
<section class="panel install-phone-panel">
|
|
<div class="phone-frame" aria-label="Mobile install preview">
|
|
<div class="phone-speaker"></div>
|
|
<div class="mobile-page">
|
|
<span class="app-icon app-icon-atlas app-icon-large">AN</span>
|
|
<h2>Atlas Notes</h2>
|
|
<p>Version 2.8.4 - stable</p>
|
|
<button class="mobile-primary">Install</button>
|
|
<div class="mobile-platforms">
|
|
<span>iOS</span>
|
|
<span>Android</span>
|
|
<span>macOS</span>
|
|
<span>Windows</span>
|
|
</div>
|
|
<div class="mobile-note">
|
|
iOS opens the configured TestFlight, MDM, or enterprise install path.
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="panel install-config">
|
|
<div class="section-row">
|
|
<h2>iOS Path</h2>
|
|
<div class="segmented" id="ios-methods">
|
|
<button class="is-selected" data-method="testflight">TestFlight</button>
|
|
<button data-method="enterprise">Enterprise</button>
|
|
<button data-method="artifact">Artifact</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="method-detail" id="method-testflight">
|
|
<h3>TestFlight</h3>
|
|
<p>Install action opens Apple's TestFlight URL. The page still tracks release, channel, and access policy in dist.</p>
|
|
<div class="form-grid">
|
|
<label>
|
|
Public link
|
|
<input value="https://testflight.apple.com/join/atlasnotes" />
|
|
</label>
|
|
<label>
|
|
Fallback
|
|
<input value="/download/atlas/ios/2.8.4" />
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="method-detail is-hidden" id="method-enterprise">
|
|
<h3>Enterprise / MDM</h3>
|
|
<p>Install action serves a signed manifest plist over HTTPS for enrolled devices and keeps the IPA behind policy.</p>
|
|
<div class="form-grid">
|
|
<label>
|
|
Manifest path
|
|
<input value="/ios/atlas/2.8.4/install.plist" />
|
|
</label>
|
|
<label>
|
|
Allowed teams
|
|
<input value="mobile-platform, field-ops" />
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="method-detail is-hidden" id="method-artifact">
|
|
<h3>Artifact Only</h3>
|
|
<p>Install action becomes download-only. The page warns that sideload installation is not available on normal iOS devices.</p>
|
|
<div class="form-grid">
|
|
<label>
|
|
Artifact
|
|
<input value="AtlasNotes.ipa" />
|
|
</label>
|
|
<label>
|
|
Visibility
|
|
<input value="authenticated users" />
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="qr-row">
|
|
<div class="qr-code" aria-label="QR code preview">
|
|
<span></span><span></span><span></span><span></span><span></span>
|
|
<span></span><span></span><span></span><span></span><span></span>
|
|
<span></span><span></span><span></span><span></span><span></span>
|
|
<span></span><span></span><span></span><span></span><span></span>
|
|
<span></span><span></span><span></span><span></span><span></span>
|
|
</div>
|
|
<div>
|
|
<strong>install.local/atlas/stable</strong>
|
|
<small>QR and deep links resolve to the same access-controlled install page.</small>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="view" id="view-tokens">
|
|
<div class="page-head">
|
|
<div>
|
|
<h1>Access Tokens</h1>
|
|
<p>CI-friendly scoped credentials with short lived publish permissions</p>
|
|
</div>
|
|
<button class="primary-button">Create token</button>
|
|
</div>
|
|
|
|
<section class="panel">
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Name</th>
|
|
<th>Scope</th>
|
|
<th>Last used</th>
|
|
<th>Expires</th>
|
|
<th>Status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>ci-github-atlas</td>
|
|
<td>publish:atlas, promote:beta</td>
|
|
<td>9 min ago</td>
|
|
<td>30 days</td>
|
|
<td><span class="status-badge status-live">active</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>ci-gitlab-forge</td>
|
|
<td>publish:forge</td>
|
|
<td>3 hours ago</td>
|
|
<td>12 days</td>
|
|
<td><span class="status-badge status-live">active</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>old-jenkins-mobile</td>
|
|
<td>publish:fieldkit</td>
|
|
<td>May 12</td>
|
|
<td>expired</td>
|
|
<td><span class="status-badge status-hold">revoked</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
</section>
|
|
|
|
<section class="view" id="view-audit">
|
|
<div class="page-head">
|
|
<div>
|
|
<h1>Audit Log</h1>
|
|
<p>Release, token, and policy events across the distribution server</p>
|
|
</div>
|
|
<button class="secondary-button">Export</button>
|
|
</div>
|
|
|
|
<section class="panel">
|
|
<div class="audit-list">
|
|
<div class="audit-row">
|
|
<span class="audit-kind">publish</span>
|
|
<div>
|
|
<strong>ci-github-atlas uploaded Atlas Notes 2.9.0-rc.3</strong>
|
|
<small>5 artifacts - manifest dist.json - request 0c8f</small>
|
|
</div>
|
|
<time>09:21</time>
|
|
</div>
|
|
<div class="audit-row">
|
|
<span class="audit-kind">promote</span>
|
|
<div>
|
|
<strong>mira promoted Atlas Notes 2.8.4 to stable</strong>
|
|
<small>approval policy satisfied - public install page updated</small>
|
|
</div>
|
|
<time>08:52</time>
|
|
</div>
|
|
<div class="audit-row">
|
|
<span class="audit-kind">token</span>
|
|
<div>
|
|
<strong>kai rotated ci-gitlab-forge</strong>
|
|
<small>new token expires in 30 days - old token revoked</small>
|
|
</div>
|
|
<time>Yesterday</time>
|
|
</div>
|
|
<div class="audit-row">
|
|
<span class="audit-kind">policy</span>
|
|
<div>
|
|
<strong>Windows malware scan policy changed</strong>
|
|
<small>stable channel now requires completed scan before promotion</small>
|
|
</div>
|
|
<time>May 30</time>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</section>
|
|
|
|
<section class="view" id="view-settings">
|
|
<div class="page-head">
|
|
<div>
|
|
<h1>Server Settings</h1>
|
|
<p>NAS deployment, storage, HTTPS, and namespace policy</p>
|
|
</div>
|
|
<button class="primary-button">Save changes</button>
|
|
</div>
|
|
|
|
<div class="settings-grid">
|
|
<section class="panel">
|
|
<h2>Deployment</h2>
|
|
<div class="settings-list">
|
|
<label>
|
|
Docker image
|
|
<input value="ghcr.io/example/distd:0.1.0" />
|
|
</label>
|
|
<label>
|
|
Data directory
|
|
<input value="/volume1/docker/dist/data" />
|
|
</label>
|
|
<label>
|
|
Public base URL
|
|
<input value="https://install.example.test" />
|
|
</label>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2>Policy</h2>
|
|
<div class="check-list">
|
|
<label><input type="checkbox" checked /> Require checks before stable promotion</label>
|
|
<label><input type="checkbox" checked /> Require scoped tokens for CI publishing</label>
|
|
<label><input type="checkbox" /> Allow anonymous public downloads</label>
|
|
<label><input type="checkbox" checked /> Keep audit log immutable</label>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
</div>
|
|
|
|
<script src="app.js"></script>
|
|
</body>
|
|
</html>
|