scrollback 0.1.0__tar.gz → 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {scrollback-0.1.0 → scrollback-0.1.1}/CHANGELOG.md +10 -1
- {scrollback-0.1.0 → scrollback-0.1.1}/CONTRIBUTING.md +8 -4
- {scrollback-0.1.0 → scrollback-0.1.1}/PKG-INFO +3 -3
- {scrollback-0.1.0 → scrollback-0.1.1}/README.md +2 -2
- scrollback-0.1.1/assets/screenshots/cli.png +0 -0
- scrollback-0.1.1/assets/screenshots/cli.svg +58 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/scripts/screenshots.py +46 -6
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/__init__.py +1 -1
- scrollback-0.1.0/assets/screenshots/cli.svg +0 -91
- {scrollback-0.1.0 → scrollback-0.1.1}/.github/workflows/ci.yml +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/.github/workflows/publish.yml +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/.gitignore +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/LICENSE +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/ROADMAP.md +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/assets/icon-512.png +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/assets/icon.icns +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/assets/icon.svg +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/assets/screenshots/web.png +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/pyproject.toml +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/scripts/demo_data.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/assets/icon-256.png +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/assets/icon.icns +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/cli.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/clipboard.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/export.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/fts.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/highlight.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/katexbundle.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/launcher_install.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/launchers/scrollback.bat +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/launchers/scrollback.command +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/launchers/scrollback.desktop +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/launchers/scrollback.sh +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/mathspan.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/minimd.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/models.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/serialize.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/serverconfig.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/sources/__init__.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/sources/aider.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/sources/base.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/sources/claudecode.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/sources/codex.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/sources/opencode.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/sources/registry.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/store.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/termrender.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/__init__.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/app.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/app.js +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/apple-touch-icon.png +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/favicon.png +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/favicon.svg +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/index.html +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/style.css +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/highlight.min.js +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/hljs-dark.min.css +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/hljs-light.min.css +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/katex.min.css +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/katex/katex.min.js +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/marked.min.js +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/web/static/vendor/purify.min.js +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/src/scrollback/webopen.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_aider.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_claude_paging.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_claude_subagents.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_cli_helpers.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_codex.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_export.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_fts.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_highlight.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_launcher_install.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_minimd.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_models.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_serverconfig.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_sources_live.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_stats_resume.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_store_filters.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_web_api.py +0 -0
- {scrollback-0.1.0 → scrollback-0.1.1}/tests/test_webopen.py +0 -0
|
@@ -6,6 +6,14 @@ follow [Semantic Versioning](https://semver.org/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.1.1] - 2026-06-30
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- README images now render on PyPI: use absolute, release-pinned PNG URLs
|
|
14
|
+
(PyPI does not resolve relative paths or display SVGs). Adds a PyPI-
|
|
15
|
+
friendly `cli.png` alongside the GitHub SVG.
|
|
16
|
+
|
|
9
17
|
## [0.1.0] - 2026-06-30
|
|
10
18
|
|
|
11
19
|
The first release. scrollback reads AI coding-agent session history
|
|
@@ -82,5 +90,6 @@ export it from a CLI and a local web app.
|
|
|
82
90
|
- Negative pagination arguments are rejected; clearer errors for unknown
|
|
83
91
|
sources, failed exports, and unavailable data sources.
|
|
84
92
|
|
|
85
|
-
[Unreleased]: https://github.com/a-attia/scrollback/compare/v0.1.
|
|
93
|
+
[Unreleased]: https://github.com/a-attia/scrollback/compare/v0.1.1...HEAD
|
|
94
|
+
[0.1.1]: https://github.com/a-attia/scrollback/compare/v0.1.0...v0.1.1
|
|
86
95
|
[0.1.0]: https://github.com/a-attia/scrollback/releases/tag/v0.1.0
|
|
@@ -55,12 +55,16 @@ publish. To regenerate them after a UI change:
|
|
|
55
55
|
```bash
|
|
56
56
|
pip install -e ".[screenshots]"
|
|
57
57
|
playwright install chromium # one-time headless-browser download
|
|
58
|
-
python scripts/screenshots.py # writes assets/screenshots/{cli.svg,web.png}
|
|
58
|
+
python scripts/screenshots.py # writes assets/screenshots/{cli.svg,cli.png,web.png}
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
The CLI image is rendered with `rich` (
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
The CLI image is rendered with `rich` (SVG for GitHub, plus a PNG for PyPI,
|
|
62
|
+
which does not display SVGs); the web image is captured with headless
|
|
63
|
+
Chromium via Playwright. The README embeds the PNGs via absolute,
|
|
64
|
+
release-pinned `raw.githubusercontent.com` URLs so they render on both
|
|
65
|
+
GitHub and PyPI (relative paths only work on GitHub). When cutting a new
|
|
66
|
+
release, bump the version in those URLs. Neither the `screenshots` extra nor
|
|
67
|
+
the browser is needed to run scrollback.
|
|
64
68
|
|
|
65
69
|
## Submitting changes
|
|
66
70
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scrollback
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: Navigate, search, copy, and export your AI coding-agent sessions (opencode, Claude Code, ...) from one local, read-only tool.
|
|
5
5
|
Project-URL: Homepage, https://github.com/a-attia/scrollback
|
|
6
6
|
Project-URL: Repository, https://github.com/a-attia/scrollback
|
|
@@ -73,13 +73,13 @@ modifies, locks for writing, or uploads your data.
|
|
|
73
73
|
You can use it two ways. From the **command line**, list, search, and export
|
|
74
74
|
your sessions in a single scriptable tool:
|
|
75
75
|
|
|
76
|
-

|
|
77
77
|
|
|
78
78
|
Or open the **local web app** to read a transcript in full — with rendered
|
|
79
79
|
Markdown, syntax-highlighted code, and typeset LaTeX math:
|
|
80
80
|
|
|
81
81
|

|
|
82
|
+
rendered Markdown, highlighted code, and typeset equations.](https://raw.githubusercontent.com/a-attia/scrollback/v0.1.1/assets/screenshots/web.png)
|
|
83
83
|
|
|
84
84
|
Both views read the same on-disk session stores, so you can jump between
|
|
85
85
|
them freely. (The screenshots above use synthetic demo data.)
|
|
@@ -14,13 +14,13 @@ modifies, locks for writing, or uploads your data.
|
|
|
14
14
|
You can use it two ways. From the **command line**, list, search, and export
|
|
15
15
|
your sessions in a single scriptable tool:
|
|
16
16
|
|
|
17
|
-

|
|
18
18
|
|
|
19
19
|
Or open the **local web app** to read a transcript in full — with rendered
|
|
20
20
|
Markdown, syntax-highlighted code, and typeset LaTeX math:
|
|
21
21
|
|
|
22
22
|

|
|
23
|
+
rendered Markdown, highlighted code, and typeset equations.](https://raw.githubusercontent.com/a-attia/scrollback/v0.1.1/assets/screenshots/web.png)
|
|
24
24
|
|
|
25
25
|
Both views read the same on-disk session stores, so you can jump between
|
|
26
26
|
them freely. (The screenshots above use synthetic demo data.)
|
|
Binary file
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<svg class="rich-terminal" viewBox="0 0 1141 74.4" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<!-- Generated with Rich https://www.textualize.io -->
|
|
3
|
+
<style>
|
|
4
|
+
|
|
5
|
+
@font-face {
|
|
6
|
+
font-family: "Fira Code";
|
|
7
|
+
src: local("FiraCode-Regular"),
|
|
8
|
+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
|
|
9
|
+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
|
|
10
|
+
font-style: normal;
|
|
11
|
+
font-weight: 400;
|
|
12
|
+
}
|
|
13
|
+
@font-face {
|
|
14
|
+
font-family: "Fira Code";
|
|
15
|
+
src: local("FiraCode-Bold"),
|
|
16
|
+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
|
|
17
|
+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
|
|
18
|
+
font-style: bold;
|
|
19
|
+
font-weight: 700;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.terminal-387712033-matrix {
|
|
23
|
+
font-family: Fira Code, monospace;
|
|
24
|
+
font-size: 20px;
|
|
25
|
+
line-height: 24.4px;
|
|
26
|
+
font-variant-east-asian: full-width;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.terminal-387712033-title {
|
|
30
|
+
font-size: 18px;
|
|
31
|
+
font-weight: bold;
|
|
32
|
+
font-family: arial;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
</style>
|
|
37
|
+
|
|
38
|
+
<defs>
|
|
39
|
+
<clipPath id="terminal-387712033-clip-terminal">
|
|
40
|
+
<rect x="0" y="0" width="1121.3999999999999" height="23.4" />
|
|
41
|
+
</clipPath>
|
|
42
|
+
|
|
43
|
+
</defs>
|
|
44
|
+
|
|
45
|
+
<rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1139" height="72.4" rx="8"/><text class="terminal-387712033-title" fill="#c5c8c6" text-anchor="middle" x="569" y="27">scrollback</text>
|
|
46
|
+
<g transform="translate(26,22)">
|
|
47
|
+
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
|
|
48
|
+
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
|
|
49
|
+
<circle cx="44" cy="0" r="7" fill="#28c840"/>
|
|
50
|
+
</g>
|
|
51
|
+
|
|
52
|
+
<g transform="translate(9, 41)" clip-path="url(#terminal-387712033-clip-terminal)">
|
|
53
|
+
|
|
54
|
+
<g class="terminal-387712033-matrix">
|
|
55
|
+
|
|
56
|
+
</g>
|
|
57
|
+
</g>
|
|
58
|
+
</svg>
|
|
@@ -32,7 +32,12 @@ OUT.mkdir(parents=True, exist_ok=True)
|
|
|
32
32
|
|
|
33
33
|
# -- CLI screenshot (rich -> SVG, no browser) ----------------------------
|
|
34
34
|
|
|
35
|
-
def
|
|
35
|
+
def render_cli() -> list[Path]:
|
|
36
|
+
"""Render the CLI list to SVG (crisp on GitHub) and PNG (for PyPI).
|
|
37
|
+
|
|
38
|
+
PyPI's README renderer does not display SVG images, so a PNG is needed
|
|
39
|
+
there; GitHub renders both, and SVG stays sharp at any zoom.
|
|
40
|
+
"""
|
|
36
41
|
from rich.console import Console
|
|
37
42
|
from rich.table import Table
|
|
38
43
|
from rich.text import Text
|
|
@@ -66,10 +71,45 @@ def render_cli_svg() -> Path:
|
|
|
66
71
|
|
|
67
72
|
console.print(Text("$ scrollback list --usage", style="bold green"))
|
|
68
73
|
console.print(table)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
74
|
+
|
|
75
|
+
# PyPI-friendly PNG first: rich's save_svg() clears the record buffer, so
|
|
76
|
+
# the HTML export must happen before we write the SVG.
|
|
77
|
+
png_path = OUT / "cli.png"
|
|
78
|
+
try:
|
|
79
|
+
_svg_html_to_png(console, png_path)
|
|
80
|
+
print(f"wrote {png_path}")
|
|
81
|
+
except Exception as exc: # noqa: BLE001
|
|
82
|
+
print(f"cli.png skipped: {exc}", file=sys.stderr)
|
|
83
|
+
|
|
84
|
+
svg_path = OUT / "cli.svg"
|
|
85
|
+
console.save_svg(str(svg_path), title="scrollback")
|
|
86
|
+
print(f"wrote {svg_path}")
|
|
87
|
+
return [png_path, svg_path]
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _svg_html_to_png(console, out: Path) -> None:
|
|
91
|
+
from playwright.sync_api import sync_playwright
|
|
92
|
+
|
|
93
|
+
# rich returns a full HTML document; give it a dark terminal-like page and
|
|
94
|
+
# screenshot the <pre> block (which carries the real content dimensions).
|
|
95
|
+
html = console.export_html(
|
|
96
|
+
inline_styles=True,
|
|
97
|
+
code_format=(
|
|
98
|
+
"<!DOCTYPE html><html><head><meta charset='utf-8'>"
|
|
99
|
+
"<style>html,body{{margin:0}}"
|
|
100
|
+
"body{{background:#0d1117;display:inline-block;padding:22px 26px}}"
|
|
101
|
+
"pre{{margin:0;color:#c9d1d9;font:15px/1.5 Menlo,Consolas,monospace}}"
|
|
102
|
+
"</style></head>"
|
|
103
|
+
"<body><pre><code>{code}</code></pre></body></html>"
|
|
104
|
+
),
|
|
105
|
+
)
|
|
106
|
+
with sync_playwright() as p:
|
|
107
|
+
browser = p.chromium.launch()
|
|
108
|
+
page = browser.new_page(device_scale_factor=2)
|
|
109
|
+
page.set_content(html, wait_until="load")
|
|
110
|
+
# The inline-block body wraps tightly around the terminal block.
|
|
111
|
+
page.query_selector("body").screenshot(path=str(out))
|
|
112
|
+
browser.close()
|
|
73
113
|
|
|
74
114
|
|
|
75
115
|
# -- web screenshot (headless Chromium via Playwright) -------------------
|
|
@@ -132,7 +172,7 @@ def render_web_png() -> Path:
|
|
|
132
172
|
|
|
133
173
|
|
|
134
174
|
def main() -> int:
|
|
135
|
-
|
|
175
|
+
render_cli()
|
|
136
176
|
try:
|
|
137
177
|
render_web_png()
|
|
138
178
|
except Exception as exc: # noqa: BLE001
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
<svg class="rich-terminal" viewBox="0 0 1141 245.2" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<!-- Generated with Rich https://www.textualize.io -->
|
|
3
|
-
<style>
|
|
4
|
-
|
|
5
|
-
@font-face {
|
|
6
|
-
font-family: "Fira Code";
|
|
7
|
-
src: local("FiraCode-Regular"),
|
|
8
|
-
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
|
|
9
|
-
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
|
|
10
|
-
font-style: normal;
|
|
11
|
-
font-weight: 400;
|
|
12
|
-
}
|
|
13
|
-
@font-face {
|
|
14
|
-
font-family: "Fira Code";
|
|
15
|
-
src: local("FiraCode-Bold"),
|
|
16
|
-
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
|
|
17
|
-
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
|
|
18
|
-
font-style: bold;
|
|
19
|
-
font-weight: 700;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
.terminal-4113685748-matrix {
|
|
23
|
-
font-family: Fira Code, monospace;
|
|
24
|
-
font-size: 20px;
|
|
25
|
-
line-height: 24.4px;
|
|
26
|
-
font-variant-east-asian: full-width;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
.terminal-4113685748-title {
|
|
30
|
-
font-size: 18px;
|
|
31
|
-
font-weight: bold;
|
|
32
|
-
font-family: arial;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
.terminal-4113685748-r1 { fill: #98a84b;font-weight: bold }
|
|
36
|
-
.terminal-4113685748-r2 { fill: #c5c8c6 }
|
|
37
|
-
.terminal-4113685748-r3 { fill: #c5c8c6;font-weight: bold }
|
|
38
|
-
.terminal-4113685748-r4 { fill: #d0b344 }
|
|
39
|
-
.terminal-4113685748-r5 { fill: #868887 }
|
|
40
|
-
.terminal-4113685748-r6 { fill: #d75f00 }
|
|
41
|
-
</style>
|
|
42
|
-
|
|
43
|
-
<defs>
|
|
44
|
-
<clipPath id="terminal-4113685748-clip-terminal">
|
|
45
|
-
<rect x="0" y="0" width="1121.3999999999999" height="194.2" />
|
|
46
|
-
</clipPath>
|
|
47
|
-
<clipPath id="terminal-4113685748-line-0">
|
|
48
|
-
<rect x="0" y="1.5" width="1122.4" height="24.65"/>
|
|
49
|
-
</clipPath>
|
|
50
|
-
<clipPath id="terminal-4113685748-line-1">
|
|
51
|
-
<rect x="0" y="25.9" width="1122.4" height="24.65"/>
|
|
52
|
-
</clipPath>
|
|
53
|
-
<clipPath id="terminal-4113685748-line-2">
|
|
54
|
-
<rect x="0" y="50.3" width="1122.4" height="24.65"/>
|
|
55
|
-
</clipPath>
|
|
56
|
-
<clipPath id="terminal-4113685748-line-3">
|
|
57
|
-
<rect x="0" y="74.7" width="1122.4" height="24.65"/>
|
|
58
|
-
</clipPath>
|
|
59
|
-
<clipPath id="terminal-4113685748-line-4">
|
|
60
|
-
<rect x="0" y="99.1" width="1122.4" height="24.65"/>
|
|
61
|
-
</clipPath>
|
|
62
|
-
<clipPath id="terminal-4113685748-line-5">
|
|
63
|
-
<rect x="0" y="123.5" width="1122.4" height="24.65"/>
|
|
64
|
-
</clipPath>
|
|
65
|
-
<clipPath id="terminal-4113685748-line-6">
|
|
66
|
-
<rect x="0" y="147.9" width="1122.4" height="24.65"/>
|
|
67
|
-
</clipPath>
|
|
68
|
-
</defs>
|
|
69
|
-
|
|
70
|
-
<rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1139" height="243.2" rx="8"/><text class="terminal-4113685748-title" fill="#c5c8c6" text-anchor="middle" x="569" y="27">scrollback</text>
|
|
71
|
-
<g transform="translate(26,22)">
|
|
72
|
-
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
|
|
73
|
-
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
|
|
74
|
-
<circle cx="44" cy="0" r="7" fill="#28c840"/>
|
|
75
|
-
</g>
|
|
76
|
-
|
|
77
|
-
<g transform="translate(9, 41)" clip-path="url(#terminal-4113685748-clip-terminal)">
|
|
78
|
-
|
|
79
|
-
<g class="terminal-4113685748-matrix">
|
|
80
|
-
<text class="terminal-4113685748-r1" x="0" y="20" textLength="305" clip-path="url(#terminal-4113685748-line-0)">$ scrollback list --usage</text><text class="terminal-4113685748-r2" x="1122.4" y="20" textLength="12.2" clip-path="url(#terminal-4113685748-line-0)">
|
|
81
|
-
</text><text class="terminal-4113685748-r3" x="0" y="44.4" textLength="122" clip-path="url(#terminal-4113685748-line-1)">source    </text><text class="terminal-4113685748-r3" x="146.4" y="44.4" textLength="146.4" clip-path="url(#terminal-4113685748-line-1)">id          </text><text class="terminal-4113685748-r3" x="317.2" y="44.4" textLength="195.2" clip-path="url(#terminal-4113685748-line-1)">updated         </text><text class="terminal-4113685748-r3" x="536.8" y="44.4" textLength="48.8" clip-path="url(#terminal-4113685748-line-1)">msgs</text><text class="terminal-4113685748-r3" x="610" y="44.4" textLength="61" clip-path="url(#terminal-4113685748-line-1)"> cost</text><text class="terminal-4113685748-r3" x="695.4" y="44.4" textLength="122" clip-path="url(#terminal-4113685748-line-1)">tok in/out</text><text class="terminal-4113685748-r3" x="841.8" y="44.4" textLength="280.6" clip-path="url(#terminal-4113685748-line-1)">title                  </text><text class="terminal-4113685748-r2" x="1122.4" y="44.4" textLength="12.2" clip-path="url(#terminal-4113685748-line-1)">
|
|
82
|
-
</text><text class="terminal-4113685748-r4" x="0" y="68.8" textLength="122" clip-path="url(#terminal-4113685748-line-2)">opencode  </text><text class="terminal-4113685748-r5" x="146.4" y="68.8" textLength="146.4" clip-path="url(#terminal-4113685748-line-2)">ses_demo_hea</text><text class="terminal-4113685748-r5" x="317.2" y="68.8" textLength="195.2" clip-path="url(#terminal-4113685748-line-2)">2026-03-14 09:32</text><text class="terminal-4113685748-r2" x="536.8" y="68.8" textLength="48.8" clip-path="url(#terminal-4113685748-line-2)">   2</text><text class="terminal-4113685748-r2" x="610" y="68.8" textLength="61" clip-path="url(#terminal-4113685748-line-2)">$0.02</text><text class="terminal-4113685748-r2" x="695.4" y="68.8" textLength="122" clip-path="url(#terminal-4113685748-line-2)"> 1.8k/2.3k</text><text class="terminal-4113685748-r2" x="841.8" y="68.8" textLength="280.6" clip-path="url(#terminal-4113685748-line-2)">Derive a stable scheme </text><text class="terminal-4113685748-r2" x="1122.4" y="68.8" textLength="12.2" clip-path="url(#terminal-4113685748-line-2)">
|
|
83
|
-
</text><text class="terminal-4113685748-r2" x="841.8" y="93.2" textLength="280.6" clip-path="url(#terminal-4113685748-line-3)">for the heat equation  </text><text class="terminal-4113685748-r2" x="1122.4" y="93.2" textLength="12.2" clip-path="url(#terminal-4113685748-line-3)">
|
|
84
|
-
</text><text class="terminal-4113685748-r6" x="0" y="117.6" textLength="122" clip-path="url(#terminal-4113685748-line-4)">claudecode</text><text class="terminal-4113685748-r5" x="146.4" y="117.6" textLength="146.4" clip-path="url(#terminal-4113685748-line-4)">ses_demo_ref</text><text class="terminal-4113685748-r5" x="317.2" y="117.6" textLength="195.2" clip-path="url(#terminal-4113685748-line-4)">2026-03-14 08:10</text><text class="terminal-4113685748-r2" x="536.8" y="117.6" textLength="48.8" clip-path="url(#terminal-4113685748-line-4)">   2</text><text class="terminal-4113685748-r2" x="610" y="117.6" textLength="61" clip-path="url(#terminal-4113685748-line-4)">$0.01</text><text class="terminal-4113685748-r2" x="695.4" y="117.6" textLength="122" clip-path="url(#terminal-4113685748-line-4)">  1.2k/900</text><text class="terminal-4113685748-r2" x="841.8" y="117.6" textLength="280.6" clip-path="url(#terminal-4113685748-line-4)">Refactor load_config   </text><text class="terminal-4113685748-r2" x="1122.4" y="117.6" textLength="12.2" clip-path="url(#terminal-4113685748-line-4)">
|
|
85
|
-
</text><text class="terminal-4113685748-r2" x="841.8" y="142" textLength="280.6" clip-path="url(#terminal-4113685748-line-5)">with typed validation  </text><text class="terminal-4113685748-r2" x="1122.4" y="142" textLength="12.2" clip-path="url(#terminal-4113685748-line-5)">
|
|
86
|
-
</text><text class="terminal-4113685748-r4" x="0" y="166.4" textLength="122" clip-path="url(#terminal-4113685748-line-6)">opencode  </text><text class="terminal-4113685748-r5" x="146.4" y="166.4" textLength="146.4" clip-path="url(#terminal-4113685748-line-6)">ses_demo_bug</text><text class="terminal-4113685748-r5" x="317.2" y="166.4" textLength="195.2" clip-path="url(#terminal-4113685748-line-6)">2026-03-13 09:32</text><text class="terminal-4113685748-r2" x="536.8" y="166.4" textLength="48.8" clip-path="url(#terminal-4113685748-line-6)">   2</text><text class="terminal-4113685748-r2" x="610" y="166.4" textLength="61" clip-path="url(#terminal-4113685748-line-6)">$0.01</text><text class="terminal-4113685748-r2" x="695.4" y="166.4" textLength="122" clip-path="url(#terminal-4113685748-line-6)">   640/410</text><text class="terminal-4113685748-r2" x="841.8" y="166.4" textLength="280.6" clip-path="url(#terminal-4113685748-line-6)">Fix timezone-naive     </text><text class="terminal-4113685748-r2" x="1122.4" y="166.4" textLength="12.2" clip-path="url(#terminal-4113685748-line-6)">
|
|
87
|
-
</text><text class="terminal-4113685748-r2" x="841.8" y="190.8" textLength="280.6" clip-path="url(#terminal-4113685748-line-7)">timestamp crash in sort</text><text class="terminal-4113685748-r2" x="1122.4" y="190.8" textLength="12.2" clip-path="url(#terminal-4113685748-line-7)">
|
|
88
|
-
</text>
|
|
89
|
-
</g>
|
|
90
|
-
</g>
|
|
91
|
-
</svg>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|