feat(web): welcome hero footnotes + drop operator Overview section
Welcome hero on /home gains a hairline-separated footnotes row below the four pillars carrying the privacy posture (telemetry travels, raw data stays local, /agnes-private toggles per-session) and the workspace-layout convention (work under ~/<workspace_dir>/Projects/, anything outside is invisible to the platform). Renders for both onboarded and not-onboarded users. Lede 2 gains a trailing sentence so the workspace-folder framing lands before the reader scrolls past. The operator-owned <section class="home-overview"> is removed — its privacy / workspace-layout copy now ships inline in the welcome footnotes, so a separate operator surface for the same content is redundant. The get_instance_overview() helper and instance.overview yaml field remain (harmless if set; just not rendered) so existing instances that override them don't trip on a removed config key.
This commit is contained in:
parent
eb75c8d204
commit
61262e2bbb
3 changed files with 76 additions and 49 deletions
22
CHANGELOG.md
22
CHANGELOG.md
|
|
@ -41,6 +41,19 @@ CalVer image tags (`stable-YYYY.MM.N`, `dev-YYYY.MM.N`) are produced for every C
|
|||
bar, and per-step number badges next to each install block.
|
||||
|
||||
### Changed
|
||||
- `/home` welcome hero gains a *footnotes* row beneath the four
|
||||
pillars: a hairline-separated block carrying the privacy posture
|
||||
(*"What leaves your machine"* — telemetry travels, raw data
|
||||
stays local, `/agnes-private` toggles per-session) and the
|
||||
workspace-layout convention (*"Get the most out of it"* — work
|
||||
under `~/<workspace_dir>/Projects/`, anything outside the
|
||||
workspace root is invisible to the platform). Renders for both
|
||||
onboarded and not-onboarded users so the operating model is
|
||||
visible on every visit.
|
||||
- Welcome hero's *"AI Chief of Staff"* lede gains a trailing
|
||||
sentence ("*You run all your projects inside and it learns
|
||||
from it.*") so the workspace-folder framing lands before the
|
||||
reader scrolls past.
|
||||
- Default `instance.theme` flipped from `navy` to `blue`. The brand-blue
|
||||
palette is now the out-of-the-box look; `navy` (dark hero + mint-green
|
||||
CTAs) is the opt-in via `AGNES_INSTANCE_THEME` / `instance.theme`
|
||||
|
|
@ -242,6 +255,15 @@ CalVer image tags (`stable-YYYY.MM.N`, `dev-YYYY.MM.N`) are produced for every C
|
|||
top of `/home` (the in-page anchor it carried — *Setup Agnes in
|
||||
your Claude Code* / *Go deeper into your AI workspace* — duplicated
|
||||
links already reachable from the install hero and `/setup-advanced`).
|
||||
- Operator-owned *Overview* `<section>` on `/home` (rendered the
|
||||
`instance.overview` / `AGNES_INSTANCE_OVERVIEW` HTML body between
|
||||
the first-session walkthrough and the surfaces grid). The
|
||||
privacy-posture / workspace-layout copy it carried now ships
|
||||
inline in the welcome hero footnotes, so a separate operator
|
||||
surface for the same content is no longer needed. The
|
||||
`get_instance_overview()` helper and yaml field remain (harmless
|
||||
if set; just not rendered) so existing instances that override
|
||||
it don't trip on a removed config key.
|
||||
|
||||
### Removed
|
||||
|
||||
|
|
|
|||
|
|
@ -1103,6 +1103,34 @@
|
|||
line-height: 1.55;
|
||||
margin: 0;
|
||||
}
|
||||
/* Hero footnotes — two short paragraphs about telemetry + workspace layout,
|
||||
rendered below the pillars row inside the same dark navy hero. Same
|
||||
hairline separator pattern as `.home-hero-pillars` so the section
|
||||
reads as a continuation of the welcome card. */
|
||||
.home-mock .home-hero-footnotes {
|
||||
margin-top: 26px;
|
||||
padding-top: 26px;
|
||||
border-top: 1px solid rgba(255, 255, 255, 0.12);
|
||||
position: relative;
|
||||
}
|
||||
.home-mock .home-hero-footnotes p {
|
||||
font-size: 13.5px;
|
||||
color: rgba(255, 255, 255, 0.78);
|
||||
line-height: 1.6;
|
||||
margin: 0 0 12px;
|
||||
max-width: 860px;
|
||||
}
|
||||
.home-mock .home-hero-footnotes p:last-child { margin-bottom: 0; }
|
||||
.home-mock .home-hero-footnotes strong { color: #ffffff; font-weight: 600; }
|
||||
.home-mock .home-hero-footnotes code {
|
||||
background: rgba(15, 23, 42, 0.55);
|
||||
color: #FBBF24;
|
||||
border: 1px solid rgba(251, 191, 36, 0.30);
|
||||
padding: 1px 6px;
|
||||
border-radius: 4px;
|
||||
font-family: var(--ds-font-mono);
|
||||
font-size: 11.5px;
|
||||
}
|
||||
@media (max-width: 880px) {
|
||||
.home-mock .home-hero-intro { padding: 32px 24px 28px; }
|
||||
.home-mock .home-hero-intro h1 { font-size: 26px; }
|
||||
|
|
@ -2235,7 +2263,7 @@
|
|||
<p class="lede">
|
||||
Think of it as your <em>AI Chief of Staff</em> — it lives in a folder on your computer,
|
||||
gives you access to company data and curated skills, and lets you share your own skills
|
||||
and plugins back to the team.
|
||||
and plugins back to the team. You run all your projects inside and it learns from it.
|
||||
</p>
|
||||
<div class="home-hero-cta">
|
||||
{% if not onboarded %}
|
||||
|
|
@ -2261,6 +2289,23 @@
|
|||
<p>Shared analyst knowledge and prior solutions, fed back into Claude's context on demand.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="home-hero-footnotes">
|
||||
<p>
|
||||
<strong>What leaves your machine.</strong> Session telemetry — prompts, tool calls,
|
||||
and tool responses — flows back to the central catalog so the team can analyse failure
|
||||
patterns. Raw data rows you query locally stay on your machine; only the prompt/response
|
||||
transcript travels. Need a session off the record? Toggle Private in Claude Code to disable
|
||||
telemetry for that chat by calling command <code>/agnes-private</code> in {{ instance_brand }}
|
||||
project folder — nothing from that session reaches the system.
|
||||
</p>
|
||||
<p>
|
||||
<strong>Get the most out of it</strong> by working under <code>~/{{ workspace_dir }}/Projects/</code>.
|
||||
Create every project there — existing or new, fresh starts or clones of repos you already
|
||||
use. The bundled plugin keeps each project in sync with the central catalog (data packages,
|
||||
plugins, skills, memory) automatically, and the session-analysis loop is scoped to that root.
|
||||
Anything outside <code>~/{{ workspace_dir }}/</code> is invisible to the platform.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{# Homepage status frame — five counters with 24h/7d toggle.
|
||||
|
|
@ -2771,24 +2816,6 @@ Want me to draft a 1-page brief, or dig into one of these?
|
|||
</div>
|
||||
</section>
|
||||
|
||||
{# Overview section — operator-owned, opt-in. Body comes from the
|
||||
`instance.overview` yaml field via get_instance_overview()
|
||||
(`AGNES_INSTANCE_OVERVIEW` env override). Empty value hides the
|
||||
whole section, keeping the OSS vendor-neutral. #}
|
||||
{# Overview is operator-owned reference content, not per-user
|
||||
chrome — no dismiss button on purpose. A one-time per-device
|
||||
hide would mean returning users who wanted to re-read the
|
||||
privacy posture / telemetry policy can't get back to it
|
||||
without clearing localStorage. The whole section is opt-in at
|
||||
the operator level (empty yaml → section absent), which is
|
||||
the right axis of control. #}
|
||||
{% if config.INSTANCE_OVERVIEW %}
|
||||
<section class="home-overview">
|
||||
<h2>Overview</h2>
|
||||
<div class="home-overview-body">{{ config.INSTANCE_OVERVIEW | safe }}</div>
|
||||
</section>
|
||||
{% endif %}
|
||||
|
||||
{# Surfaces — four places to use {{ instance_brand }}. Mirrors the
|
||||
design spec's "Where you can use it" section: VS Code (RECOMMENDED),
|
||||
Terminal, Claude Desktop, Cowork (claude.ai). Each card carries
|
||||
|
|
|
|||
|
|
@ -359,39 +359,16 @@ def test_setup_section_renders_for_not_onboarded(fresh_db):
|
|||
assert '<div class="setup-section-header"' not in body2
|
||||
|
||||
|
||||
def test_overview_section_renders_when_yaml_set(fresh_db, monkeypatch):
|
||||
"""Setting `AGNES_INSTANCE_OVERVIEW` env (mirrors
|
||||
instance.overview yaml) injects raw HTML into the Overview section
|
||||
via the same `| safe` filter as news_intro. The marker text must
|
||||
appear inside the rendered section wrapper. Overview deliberately
|
||||
has NO dismiss button — it's operator-owned reference content
|
||||
(privacy posture, telemetry policy, product framing), and a
|
||||
per-device hide would leave returning users unable to re-read
|
||||
it without clearing localStorage."""
|
||||
def test_overview_section_never_renders(fresh_db, monkeypatch):
|
||||
"""The operator-owned Overview `<section>` was removed from
|
||||
`/home` — its privacy / workspace-layout copy now ships inline
|
||||
in the welcome hero footnotes. The `get_instance_overview()`
|
||||
helper and `instance.overview` yaml field still exist (to avoid
|
||||
breaking instances that override them), but the rendered
|
||||
section MUST NOT appear regardless of the env value."""
|
||||
monkeypatch.setenv("AGNES_INSTANCE_OVERVIEW", "<p>OVERVIEW_TEST_MARKER</p>")
|
||||
from src.db import get_system_db, close_system_db
|
||||
|
||||
conn = get_system_db()
|
||||
try:
|
||||
_, sess = _make_user_and_session(conn)
|
||||
finally:
|
||||
conn.close()
|
||||
close_system_db()
|
||||
body = _client().get("/home", cookies={"access_token": sess}).text
|
||||
assert '<section class="home-overview">' in body
|
||||
assert "OVERVIEW_TEST_MARKER" in body
|
||||
# Overview must NOT carry a dismiss key — content stays
|
||||
# reachable on every visit so users can re-read it.
|
||||
assert 'data-dismiss-key="agnes_home_overview_dismissed"' not in body
|
||||
|
||||
|
||||
def test_overview_section_hidden_when_yaml_empty(fresh_db, monkeypatch):
|
||||
"""Default empty `instance.overview` (no env override) hides the
|
||||
section entirely so the OSS ships without a stray empty
|
||||
Overview placeholder."""
|
||||
monkeypatch.delenv("AGNES_INSTANCE_OVERVIEW", raising=False)
|
||||
from src.db import get_system_db, close_system_db
|
||||
|
||||
conn = get_system_db()
|
||||
try:
|
||||
_, sess = _make_user_and_session(conn)
|
||||
|
|
@ -400,3 +377,4 @@ def test_overview_section_hidden_when_yaml_empty(fresh_db, monkeypatch):
|
|||
close_system_db()
|
||||
body = _client().get("/home", cookies={"access_token": sess}).text
|
||||
assert '<section class="home-overview">' not in body
|
||||
assert "OVERVIEW_TEST_MARKER" not in body
|
||||
|
|
|
|||
Loading…
Reference in a new issue