Skip to content

Commit eeb543e

Browse files
vikast908claude
andcommitted
release: 0.4.1 — big banner for every theme, live /theme preview, refreshed README banner
- All 11 themes render a big, bold wordmark: the 5 tiny personality faces (t3-chat, starry-night, vercel, fallout, mimi) → big block faces (big, nancyj, banner3, 3-d, puffy) at the full-contrast scale, still distinct. - /theme <name> reprints the masthead live on a cleared screen so a face + palette previews without relaunching — the clear also fixes a prompt_toolkit cursor desync on Windows that painted stale shell scrollback over the banner. - README banner SVG recolored from the deprecated blue wordmark to the editorial manuscript-red → ember → hot-gold gradient. - Docs (plan.md, design.md) + CHANGELOG updated; version → 0.4.1. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent db0391b commit eeb543e

9 files changed

Lines changed: 73 additions & 33 deletions

File tree

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,25 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
88

9+
## [0.4.1] - 2026-07-19
10+
11+
### Changed
12+
- **Every theme's masthead wordmark is now big and bold.** The five personality themes
13+
(`t3-chat`, `starry-night`, `vercel`, `fallout`, `mimi`) shipped tiny figlet faces that rendered
14+
a fraction of the size of the default; all now use large block faces at the same scale as
15+
`editorial`/`highcontrast` (`big`, `nancyj`, `banner3`, `3-d`, `puffy`), while staying visually
16+
distinct per theme.
17+
- **`/theme <name>` previews the new look live.** Switching a theme now reprints the masthead
18+
(palette + wordmark face) instead of waiting for the next launch, so themes can be compared in
19+
one session.
20+
21+
### Fixed
22+
- **Theme switching no longer corrupts the display.** The live banner reprint clears the screen
23+
first, fixing a prompt_toolkit cursor desync (seen on Windows terminals) where the new banner —
24+
and a following Ctrl+C — landed mid-screen and exposed stale shell scrollback.
25+
- **README banner refreshed** to the current editorial palette (manuscript-red → ember → hot-gold);
26+
it had been left in the deprecated blue wordmark.
27+
928
## [0.4.0] - 2026-07-19
1029

1130
### Added

assets/writing-agent-banner.svg

Lines changed: 16 additions & 16 deletions
Loading

docs/design.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,8 +644,10 @@ combobox/listbox keyboard and ARIA contract. **Error state** below.
644644
framed top and bottom by a mirrored flame rule. It sits on the **left**; on a wide
645645
terminal a GET STARTED command column sits beside it (stacking beneath on a narrow
646646
one, collapsing to a one-line wordmark when the mark would wrap), and it prints
647-
**every launch**. The gradient stops and figlet face are per-theme; a fallback face
648-
chain preserves the mark if a theme's font is unavailable.
647+
**every launch**. The gradient stops and figlet face are per-theme (each theme owns a *distinct*
648+
face, but all at the same big block scale - the small personality faces were retired in 0.4.1); a
649+
fallback face chain preserves the mark if a theme's font is unavailable. `/theme <name>` reprints
650+
the masthead live (on a cleared screen) so a face/palette previews without relaunching.
649651
- **Loader - the Caret** - a blinking `` (accent) for view/content loading,
650652
optionally with a live word/token counter. “Loading…” is never shown visually,
651653
but an equivalent localized status is always available to assistive technology.

docs/plan.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,10 @@ persisted to `config/models.yaml`), `/skills`, `/skill <name>`, `/seed-skills`,
634634
`/books`, `/user <id>`, `/config`, `/update [msg]` (describe your changes → AI reviews and
635635
advises), `/retry` (re-send the last chat message), `/reset` (clear the chat context), `/compact`
636636
(fold the chat history into one summary), `/theme [<name>]` (themes change *everything* - palette,
637-
wordmark figlet face, fleuron, gradient; each a distinct hue family. `editorial` ink-&-brass
637+
wordmark figlet face, fleuron, gradient; each a distinct hue family. Switching **reprints the
638+
banner live** (on a cleared screen, so it previews without a relaunch); every theme's face is a
639+
big block face at the full-contrast scale (the small personality faces were retired in 0.4.1).
640+
`editorial` ink-&-brass
638641
default (manuscript red + gold on parchment) with semantic status colors; alternates
639642
`highcontrast` (Okabe-Ito colourblind-safe, §13.1) · `kazama` (flame, sheared) · `supabase`
640643
(emerald) · `violet-bloom` (purple) · `t3-chat` (pink) · `starry-night` (indigo+gold) · `vercel`

src/writingagent/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
# Single source of truth for the version: pyproject derives from this (dynamic = version,
2222
# attr = writingagent.__version__) and the TUI/CLI import it - so there is exactly one place
2323
# to bump. Keep it a plain string literal (setuptools reads it statically).
24-
__version__ = "0.4.0"
24+
__version__ = "0.4.1"
2525

2626
__all__ = [
2727
"Agent", "Project", "Approach", "Status", "Evaluation", "WriteResult",

src/writingagent/shell/commands.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,12 +423,25 @@ def _cmd_dashboard(console, uid: str, rest: list[str]) -> None:
423423
style=DIM))
424424

425425

426-
def _set_theme(name: str, console, settings: Settings) -> None:
427-
"""Apply + persist a theme; shared by /theme and /set theme."""
426+
def _set_theme(name: str, console, settings: Settings, cfg: ModelConfig | None = None) -> None:
427+
"""Apply + persist a theme; shared by /theme and /set theme.
428+
429+
When ``cfg`` is given (the /theme path) the banner is reprinted so the new
430+
wordmark face + palette preview live - the writer can compare themes without
431+
quitting and relaunching (which is what they used to Ctrl+C out to do)."""
428432
settings.theme = name
429433
save_settings(settings)
430434
ui.apply_theme(name)
431435
_sync_palette()
436+
if cfg is not None and console:
437+
from .branding import _banner
438+
# Clear FIRST: reprinting the tall banner between prompt_toolkit prompts
439+
# otherwise desyncs its cursor tracking (Windows ConPTY especially) - the
440+
# next prompt, and a Ctrl+C, then land mid-banner and expose stale shell
441+
# scrollback. A clean screen re-anchors the prompt at the true bottom.
442+
if getattr(console, "is_terminal", False):
443+
console.clear()
444+
_banner(console, cfg, settings) # clean-screen live preview of the new theme's masthead
432445
_out(console, f"theme -> [{ui.GOLD}]{name}[/] [dim](saved - the prompt/completion "
433446
f"styles refresh on next launch)[/]")
434447

src/writingagent/shell/repl.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ def run_shell(parser, commands, cfg: ModelConfig, settings: Settings) -> None:
111111
else:
112112
line = (console.input(prompt_plain) if console else input(prompt_plain)).strip()
113113
except (EOFError, KeyboardInterrupt):
114+
# Ctrl+C / Ctrl+D at the idle prompt QUIT the app (like every shell). A ^C
115+
# DURING a run pauses the pipeline instead - that's caught deeper (dispatch/
116+
# dashboard), not here.
114117
break
115118
if not line:
116119
continue

src/writingagent/shell/slash.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ def _handle_slash(line: str, console, cfg: ModelConfig, settings: Settings, stat
172172
else:
173173
tname, cands = ui.smart_match(rest[0], ui.THEMES)
174174
if tname:
175-
_set_theme(tname, console, settings)
175+
_set_theme(tname, console, settings, cfg) # cfg → reprint banner as a live preview
176176
elif cands:
177177
_out(console, f"[{ERR}]'{rest[0]}' matches several:[/] [dim]{' · '.join(cands)}[/]")
178178
else:

src/writingagent/ui.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,41 +89,41 @@
8989
DIM="grey54", RULE="#59243f", ERR="#ff6b6b", ON_CLR="#6aaa5c",
9090
OFF_CLR="grey50", FLEURON="♥",
9191
STOPS=("#9d174d", "#ec4899", "#f9a8d4"),
92-
FONT="smblock", WORDS=("WRITING", "AGENT"), SHEAR=False,
93-
DESC="t3 chat - hot pink, light bubbly face",
92+
FONT="big", WORDS=("WRITING", "AGENT"), SHEAR=False,
93+
DESC="t3 chat - hot pink, big bubbly face",
9494
),
9595
"starry-night": dict(
9696
GOLD="#ffd86b", GOLD_HI="#ffeaa6", INK="#5b8dd9", PARCH="#cfdcf2",
9797
DIM="grey54", RULE="#27355c", ERR="#e06c75", ON_CLR="#6aaa5c",
9898
OFF_CLR="grey50", FLEURON="✶",
9999
STOPS=("#1e3a6e", "#5b8dd9", "#ffd86b"),
100-
FONT="elite", WORDS=("WRITING", "AGENT"), SHEAR=False,
101-
DESC="starry night - gold stars on van Gogh indigo, deco face",
100+
FONT="nancyj", WORDS=("WRITING", "AGENT"), SHEAR=False,
101+
DESC="starry night - gold stars on van Gogh indigo, big deco face",
102102
),
103103
"vercel": dict(
104104
GOLD="#ededed", GOLD_HI="#ffffff", INK="#888888", PARCH="#c8c8c8",
105105
DIM="grey54", RULE="#333333", ERR="#ff4444", ON_CLR="#50e3c2",
106106
OFF_CLR="grey50", FLEURON="▲",
107107
STOPS=("#555555", "#ededed", "#ffffff"),
108-
FONT="smmono9", WORDS=("WRITING", "AGENT"), SHEAR=False,
109-
DESC="vercel - monochrome minimal, hairline face",
108+
FONT="banner3", WORDS=("WRITING", "AGENT"), SHEAR=False,
109+
DESC="vercel - monochrome minimal, big hollow-block face",
110110
),
111111
# tweakcn imports (dark variants) - palettes from tweakcn.com/themes/<id>
112112
"fallout": dict(
113113
GOLD="#ffcc00", GOLD_HI="#ffe97a", INK="#00ff66", PARCH="#e0d5a0",
114114
DIM="grey54", RULE="#5d4a00", ERR="#ff4444", ON_CLR="#00ff66",
115115
OFF_CLR="grey50", FLEURON="►",
116116
STOPS=("#8a6d00", "#ffcc00", "#ffe97a"),
117-
FONT="pagga", WORDS=("WRITING", "AGENT"), SHEAR=False,
118-
DESC="fallout - pip-boy amber phosphor, terminal green, scanline face",
117+
FONT="3-d", WORDS=("WRITING", "AGENT"), SHEAR=False,
118+
DESC="fallout - pip-boy amber phosphor, terminal green, big CRT face",
119119
),
120120
"mimi": dict(
121121
GOLD="#e4a2b1", GOLD_HI="#fbe2a7", INK="#50afb6", PARCH="#f3e3ea",
122122
DIM="grey54", RULE="#324859", ERR="#e06c75", ON_CLR="#6aaa5c",
123123
OFF_CLR="grey50", FLEURON="♡",
124124
STOPS=("#c67b96", "#e4a2b1", "#fbe2a7"),
125-
FONT="double_blocky", WORDS=("WRITING", "AGENT"), SHEAR=False,
126-
DESC="mimi - dusky rose, cream and teal pastels, tiny playful face",
125+
FONT="puffy", WORDS=("WRITING", "AGENT"), SHEAR=False,
126+
DESC="mimi - dusky rose, cream and teal pastels, big playful face",
127127
),
128128
"astrovista": dict(
129129
# burnt-sienna rust (kept clear of the manuscript-red default accent)

0 commit comments

Comments
 (0)