Iris: "the organization of the rust rewrite is a mess right now... there shouldn't be anything related to the app inside of iris. Iris is supposed to be the UI framework alone." And, on the crate count: "I'm confused why the app only code needs more than one crate though." Nine cargo workspaces become three, and the port's project code -- which sat in five places, four of them inside the framework -- becomes one crate, `ai-app`, in `app-rust/`: client-core -> app-rust/src/client iris/transcript-ui -> app-rust/src/ui iris/transcript-fixture -> app-rust/src/ui/fixture.rs + tests/ + touch/ iris/desktop-app -> app-rust/src/desktop + src/bin_desktop.rs iris/android-app -> app-rust/src/android + android-project/ android-shell -> app-rust/src/shell iris/ keeps core, macro, the iris crate, tabs-ui and rig-input, and now mentions no session, transcript, setup or server anywhere. Only two of the old splits had a reason that survived reading. event-model stays a crate at the repo root because server/ depends on it too, so a crate is what makes the backend and the app agree by construction. The two Android .so names looked like a hard constraint -- a package produces one library artifact -- until P2 turned out to already plan merging those two Android apps into one; both faces now come out of libai_app.so, picked apart by features so `--no-default-features --features shell` keeps wgpu, parley and iris out of the Compose app's APK. docs/RUST.md's "One app crate" has the rest, including what each remaining feature is for. DECISIONS.md and SUBAGENTS.md move into docs/ with everything else. Verified: ./run-tests.sh and `cd iris && cargo test` green, clippy and fmt clean in all five workspaces, `cargo ndk -t x86_64` links libai_app.so, build-apk.sh produces an APK that installs and launches on this checkout's emulator (Gl ... virgl, as expected), and the phone-sized headless screenshot renders the transcript unchanged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
63 lines
2.7 KiB
Bash
Executable File
63 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Rebuilds iris/core/assets/fonts/nerd_icons.ttf.
|
|
#
|
|
# iris draws its icons as glyphs in a Nerd Fonts subset it ships, rather
|
|
# than as ordinary Unicode out of whatever the platform resolved. Unicode's
|
|
# own geometric shapes are what this replaced: `tool.rs` set its disclosure
|
|
# mark with U+25B8/25BE/25B4, and once iris stopped bundling fonts
|
|
# (2026-09-07) Iris's phone drew an empty box for them and this VM drew a
|
|
# dot. UI_RULES: "don't rely on characters the platform might not have --
|
|
# ship the glyph or the asset rather than hoping."
|
|
#
|
|
# The whole symbols font is 3 MB for the handful below, so what is
|
|
# committed is a subset. Add a codepoint to GLYPHS *and* to
|
|
# `iris/core/src/icon.rs` (the two lists have to agree -- a codepoint in
|
|
# the Rust that this script did not subset is a glyph that silently isn't
|
|
# there), then run this and commit the result.
|
|
#
|
|
# Needs python3 and network access; fontTools is fetched into a temporary
|
|
# venv, so nothing has to be installed on the machine.
|
|
#
|
|
# The same arrangement as the Compose app's `app/build-icon-font.sh`, which
|
|
# this is copied from -- including the Mono face and the Material Design
|
|
# family, so an icon means the same thing in both apps. Copied rather than
|
|
# shared because most of it is the GLYPHS list, which has to differ: the
|
|
# point of subsetting is to ship only the codepoints one app draws.
|
|
set -euo pipefail
|
|
|
|
# Codepoint, then the Nerd Fonts glyph name it came from. Material Design
|
|
# Icons, as in the Compose app.
|
|
GLYPHS=(
|
|
U+F035D # md-menu_down -- a card that is open
|
|
U+F035F # md-menu_right -- a card that opens
|
|
U+F0360 # md-menu_up -- collapse this group again
|
|
)
|
|
|
|
url=https://github.com/ryanoasis/nerd-fonts/releases/latest/download/NerdFontsSymbolsOnly.zip
|
|
here="$(cd "$(dirname "$0")" && pwd)"
|
|
out="$here/assets/fonts/nerd_icons.ttf"
|
|
work="$(mktemp -d)"
|
|
trap 'rm -rf "$work"' EXIT
|
|
|
|
echo "Fetching $url"
|
|
curl -fsSL -o "$work/nf.zip" "$url"
|
|
python3 -c 'import sys,zipfile; zipfile.ZipFile(sys.argv[1]).extractall(sys.argv[2])' "$work/nf.zip" "$work"
|
|
|
|
python3 -m venv "$work/venv"
|
|
"$work/venv/bin/pip" -q install fonttools
|
|
|
|
unicodes="$(IFS=,; echo "${GLYPHS[*]}")"
|
|
mkdir -p "$(dirname "$out")"
|
|
# The Mono face, where every glyph is one em wide and one em tall, so two
|
|
# icons at the same font size are the same size without either being given
|
|
# one -- the same reason the Compose app's script takes it. It is also what
|
|
# makes an icon's box predictable beside a line of text.
|
|
"$work/venv/bin/pyftsubset" "$work/SymbolsNerdFontMono-Regular.ttf" \
|
|
--unicodes="$unicodes" \
|
|
--layout-features= \
|
|
--drop-tables+=DSIG \
|
|
--output-file="$out"
|
|
cp "$work/LICENSE" "$here/assets/fonts/NERD_FONTS_LICENSE.txt"
|
|
|
|
echo "Wrote $out ($(stat -c %s "$out") bytes) with ${#GLYPHS[@]} glyphs"
|