fix: mark planned auth and settings flows explicitly
This commit is contained in:
@@ -2,19 +2,19 @@
|
||||
|
||||
## Current
|
||||
|
||||
### `feat/manual-regression-pass`
|
||||
### `feat/post-regression-fixes`
|
||||
|
||||
Status: completed
|
||||
|
||||
DoD:
|
||||
- Playwright regression suite passes for the Alpine UI shell
|
||||
- manual smoke checklist exists for auth, workspace, operations, agents, API keys, logs, usage, secrets, wizard, streaming
|
||||
- public smoke targets are linked from the regression checklist
|
||||
- docs and TASKS reflect the current post-streaming baseline
|
||||
- misleading non-functional UI actions are clearly marked or disabled
|
||||
- login page no longer suggests working password-reset/SSO/request-access flows
|
||||
- settings planned capabilities look explicitly read-only and non-interactive
|
||||
- node checks, UI docker build, affected Playwright specs and workspace check pass
|
||||
|
||||
## Next
|
||||
|
||||
- `feat/post-regression-fixes`
|
||||
- `feat/deploy-and-staging-smoke`
|
||||
|
||||
## Backlog
|
||||
|
||||
|
||||
+70
-1
@@ -61,7 +61,18 @@
|
||||
.login-sub {
|
||||
font-size: 13.5px;
|
||||
color: var(--text-muted);
|
||||
margin-bottom: 28px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.login-note {
|
||||
margin-bottom: 24px;
|
||||
padding: 10px 12px;
|
||||
border-radius: 9px;
|
||||
background: rgba(59, 130, 246, 0.08);
|
||||
border: 1px solid rgba(59, 130, 246, 0.18);
|
||||
color: var(--text-secondary);
|
||||
font-size: 12.5px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.field {
|
||||
@@ -103,13 +114,31 @@
|
||||
}
|
||||
|
||||
.field-link {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 12px;
|
||||
color: var(--accent);
|
||||
text-decoration: none;
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.field-link:hover { text-decoration: underline; }
|
||||
|
||||
.field-link.is-disabled,
|
||||
.field-link:disabled {
|
||||
color: var(--text-muted);
|
||||
cursor: not-allowed;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.field-link.is-disabled:hover,
|
||||
.field-link:disabled:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.btn-signin {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
@@ -184,9 +213,49 @@
|
||||
|
||||
.btn-sso:hover { background: var(--bg-muted); color: var(--text-primary); }
|
||||
|
||||
.btn-sso:disabled {
|
||||
cursor: not-allowed;
|
||||
opacity: 0.7;
|
||||
background: var(--bg-overlay);
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.btn-sso:disabled:hover {
|
||||
background: var(--bg-overlay);
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.login-inline-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 2px 7px;
|
||||
border-radius: 999px;
|
||||
border: 1px solid rgba(148, 163, 184, 0.24);
|
||||
background: rgba(148, 163, 184, 0.08);
|
||||
color: var(--text-muted);
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.02em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.version-badge {
|
||||
text-align: center;
|
||||
margin-top: 28px;
|
||||
font-size: 11.5px;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.login-footer-action {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
margin-left: 6px;
|
||||
color: var(--text-muted);
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 0;
|
||||
cursor: not-allowed;
|
||||
font: inherit;
|
||||
}
|
||||
|
||||
@@ -142,3 +142,64 @@
|
||||
.role-admin { background: rgba(13,148,136,0.1); border-color: rgba(13,148,136,0.25); color: var(--accent); }
|
||||
.role-member { background: var(--bg-overlay); border-color: var(--border); color: var(--text-muted); }
|
||||
.role-viewer { background: rgba(88,166,255,0.07); border-color: var(--blue-border); color: var(--blue); }
|
||||
|
||||
.planned-section-title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin-bottom: 12px;
|
||||
font-size: 13.5px;
|
||||
font-weight: 600;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.planned-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 2px 8px;
|
||||
border-radius: 999px;
|
||||
border: 1px solid rgba(245, 158, 11, 0.24);
|
||||
background: rgba(245, 158, 11, 0.09);
|
||||
color: var(--amber);
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.02em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.planned-badge.small {
|
||||
padding: 1px 7px;
|
||||
}
|
||||
|
||||
.planned-list {
|
||||
display: grid;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.planned-item {
|
||||
padding: 14px 16px;
|
||||
border-radius: var(--radius);
|
||||
border: 1px solid var(--border);
|
||||
background: rgba(255, 255, 255, 0.02);
|
||||
}
|
||||
|
||||
.planned-item-head {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
gap: 10px;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.planned-item-title {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.planned-item-desc {
|
||||
font-size: 12.5px;
|
||||
line-height: 1.5;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
+12
-3
@@ -26,6 +26,7 @@
|
||||
<div class="login-box">
|
||||
<div class="login-heading" data-i18n="login.title">Sign in</div>
|
||||
<div class="login-sub" data-i18n="login.subtitle">Welcome back to your workspace</div>
|
||||
<div class="login-note" data-i18n="login.password_only">This build supports password sign-in only. Password reset, Google SSO and self-service access requests are not wired yet.</div>
|
||||
|
||||
<div class="login-error" id="login-error" data-i18n="login.error.invalid">
|
||||
Invalid email or password. Please try again.
|
||||
@@ -41,7 +42,10 @@
|
||||
<label class="field-label" for="password" data-i18n="login.password">Password</label>
|
||||
<input class="field-input" type="password" id="password" placeholder="••••••••" autocomplete="current-password">
|
||||
<div class="field-footer">
|
||||
<a href="#" class="field-link" data-i18n="login.forgot">Forgot password?</a>
|
||||
<button class="field-link is-disabled" type="button" disabled>
|
||||
<span data-i18n="login.forgot">Forgot password?</span>
|
||||
<span class="login-inline-badge" data-i18n="login.planned_badge">Planned</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -54,7 +58,7 @@
|
||||
<div class="login-divider-line"></div>
|
||||
</div>
|
||||
|
||||
<button class="btn-sso" type="button">
|
||||
<button class="btn-sso" type="button" disabled>
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
|
||||
<path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z" fill="#4285F4"/>
|
||||
<path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" fill="#34A853"/>
|
||||
@@ -62,12 +66,17 @@
|
||||
<path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" fill="#EA4335"/>
|
||||
</svg>
|
||||
<span data-i18n="login.sso_short">Google SSO</span>
|
||||
<span class="login-inline-badge" data-i18n="login.planned_badge">Planned</span>
|
||||
</button>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="login-footer">
|
||||
<span data-i18n="login.request_prefix">Don't have an account?</span> <a href="#" data-i18n="login.request_link">Request access</a>
|
||||
<span data-i18n="login.request_prefix">Don't have an account?</span>
|
||||
<button class="login-footer-action" type="button" disabled>
|
||||
<span data-i18n="login.request_link">Request access</span>
|
||||
<span class="login-inline-badge" data-i18n="login.planned_badge">Planned</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="version-badge">Crank v0.9.0-beta</div>
|
||||
|
||||
@@ -276,7 +276,10 @@
|
||||
|
||||
<div style="padding: 4px 20px 16px;">
|
||||
<div class="settings-section-divider" style="margin-top:0;"></div>
|
||||
<div style="font-size:13.5px;font-weight:600;color:var(--text-primary);margin-bottom:12px;" data-i18n="settings.security.capabilities_title">Planned security capabilities</div>
|
||||
<div class="planned-section-title">
|
||||
<span data-i18n="settings.security.capabilities_title">Planned security capabilities</span>
|
||||
<span class="planned-badge" data-i18n="settings.planned_badge">Planned</span>
|
||||
</div>
|
||||
<div class="callout warning" style="margin-bottom:0;">
|
||||
<svg class="callout-icon" width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="var(--amber)" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">
|
||||
<polygon points="8,1.5 15.5,14.5 0.5,14.5" fill="none"/><path d="M8 6v4M8 11.5v.5"/>
|
||||
@@ -307,7 +310,10 @@
|
||||
<div id="section-notifications" class="section-anchor">
|
||||
<div class="section-card" style="margin-bottom: 20px;">
|
||||
<div class="section-card-header">
|
||||
<div class="section-card-title" data-i18n="settings.notifications.title">Notification preferences</div>
|
||||
<div class="planned-section-title" style="margin-bottom:0;">
|
||||
<span class="section-card-title" data-i18n="settings.notifications.title">Notification preferences</span>
|
||||
<span class="planned-badge" data-i18n="settings.planned_badge">Planned</span>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding: 8px 20px 16px;">
|
||||
<div class="callout info" style="margin-bottom:14px;">
|
||||
@@ -321,15 +327,24 @@
|
||||
</div>
|
||||
<div class="planned-list">
|
||||
<div class="planned-item">
|
||||
<div class="planned-item-title" data-i18n="settings.notifications.spike_title">Operation error spike</div>
|
||||
<div class="planned-item-head">
|
||||
<div class="planned-item-title" data-i18n="settings.notifications.spike_title">Operation error spike</div>
|
||||
<span class="planned-badge small" data-i18n="settings.planned_badge">Planned</span>
|
||||
</div>
|
||||
<div class="planned-item-desc" data-i18n="settings.notifications.spike_body">Alert when error rate exceeds a rolling threshold for a published tool.</div>
|
||||
</div>
|
||||
<div class="planned-item">
|
||||
<div class="planned-item-title" data-i18n="settings.notifications.latency_title">Upstream latency degradation</div>
|
||||
<div class="planned-item-head">
|
||||
<div class="planned-item-title" data-i18n="settings.notifications.latency_title">Upstream latency degradation</div>
|
||||
<span class="planned-badge small" data-i18n="settings.planned_badge">Planned</span>
|
||||
</div>
|
||||
<div class="planned-item-desc" data-i18n="settings.notifications.latency_body">Notify operators when p99 latency rises sharply above the baseline.</div>
|
||||
</div>
|
||||
<div class="planned-item">
|
||||
<div class="planned-item-title" data-i18n="settings.notifications.digest_title">Quota and usage digests</div>
|
||||
<div class="planned-item-head">
|
||||
<div class="planned-item-title" data-i18n="settings.notifications.digest_title">Quota and usage digests</div>
|
||||
<span class="planned-badge small" data-i18n="settings.planned_badge">Planned</span>
|
||||
</div>
|
||||
<div class="planned-item-desc" data-i18n="settings.notifications.digest_body">Deliver periodic summaries for quota consumption, errors and workspace activity.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -407,6 +407,7 @@ var TRANSLATIONS = {
|
||||
'settings.notifications.title': 'Notification preferences',
|
||||
'settings.notifications.not_ready_title': 'Notifications are not wired yet.',
|
||||
'settings.notifications.not_ready_body': 'Alert routing and per-user preferences are planned, but this build does not persist or deliver notification settings.',
|
||||
'settings.planned_badge': 'Planned',
|
||||
'settings.notifications.spike_title': 'Operation error spike',
|
||||
'settings.notifications.spike_body': 'Alert when error rate exceeds a rolling threshold for a published tool.',
|
||||
'settings.notifications.latency_title': 'Upstream latency degradation',
|
||||
@@ -924,6 +925,8 @@ var TRANSLATIONS = {
|
||||
'login.sso_short': 'Google SSO',
|
||||
'login.request_prefix': "Don't have an account?",
|
||||
'login.request_link': 'Request access',
|
||||
'login.planned_badge': 'Planned',
|
||||
'login.password_only': 'This build supports password sign-in only. Password reset, Google SSO and self-service access requests are not wired yet.',
|
||||
'login.error.required': 'Please enter your email and password.',
|
||||
'login.error.invalid': 'Invalid email or password. Please try again.',
|
||||
'login.error.generic': 'Unable to sign in right now. Please try again.',
|
||||
@@ -1332,6 +1335,7 @@ var TRANSLATIONS = {
|
||||
'settings.notifications.title': 'Настройки уведомлений',
|
||||
'settings.notifications.not_ready_title': 'Уведомления пока не подключены.',
|
||||
'settings.notifications.not_ready_body': 'Маршрутизация алертов и настройки на пользователя запланированы, но эта сборка не сохраняет и не доставляет notification settings.',
|
||||
'settings.planned_badge': 'Запланировано',
|
||||
'settings.notifications.spike_title': 'Всплеск ошибок операции',
|
||||
'settings.notifications.spike_body': 'Алерт, когда доля ошибок превышает скользящий порог для опубликованного инструмента.',
|
||||
'settings.notifications.latency_title': 'Деградация задержки upstream',
|
||||
@@ -1848,6 +1852,8 @@ var TRANSLATIONS = {
|
||||
'login.sso_short': 'Google SSO',
|
||||
'login.request_prefix': 'Нет аккаунта?',
|
||||
'login.request_link': 'Запросить доступ',
|
||||
'login.planned_badge': 'Запланировано',
|
||||
'login.password_only': 'В этой сборке доступен только вход по паролю. Сброс пароля, Google SSO и самостоятельный запрос доступа пока не подключены.',
|
||||
'login.error.required': 'Введите email и пароль.',
|
||||
'login.error.invalid': 'Неверный email или пароль. Попробуйте еще раз.',
|
||||
'login.error.generic': 'Сейчас не удается войти. Попробуйте еще раз.',
|
||||
|
||||
Reference in New Issue
Block a user