| Age | Commit message (Collapse) | Author | Files | Lines |
|
SUPER+\ only flipped a property, so every restart of the desktop shell
brought her back. Whether she is shown is now `companion` in Prefs.qml,
set by the IPC and by a switch on a new Settings > Desktop > Companion
page. Prefs gains `ready`, so she waits for the file rather than showing
at the default and then vanishing; the greeting now plays on every
appearance, the one at login included.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A Restart button sits before Stop on a running app that has a restart
control. The assistant uses assistant.sh restart. llamachat has none,
and its --quit answers before the app has exited, so a --daemon sent
straight after finds an instance still running and does nothing: the
restart quits, waits for --ping to fail (5s at most), then starts it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The name and size were one string, so sizes started wherever the name
ended and a column of them could not be scanned. The size is now its own
right-anchored Text in the main text colour, and a long name elides in the
middle instead of pushing it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Update runs `docker compose -p <project> -f <files> up -d --pull always`
with the files read from the com.docker.compose.project.config_files label,
so only stacks compose itself made get the button: a plain `docker run`
container has no recipe to recreate it from, and the supabase CLI labels
the project and nothing else. It has its own Process because a pull runs
for minutes and must not be clobbered by a start or stop meanwhile.
Published TCP ports become localhost:<port> buttons opened by the default
browser. Docker cannot say which port is a web UI, so every published one
gets a button and a port ending in 443 is guessed https.
Prune images runs `docker image prune -a -f` behind a confirm step, since a
re-pull can be gigabytes. The images it would delete are listed under the
header from `docker image ls`'s {{.Containers}} count, which docker 29
fills in; images of stopped containers are kept. That count reads 0 for
images only used by `--rm` containers, such as the test-build ones, so the
list is the warning.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The Theme page applied a scheme on click, so a stray click reinstalled the
whole theme, and it was the one settings page without the header's
commit point. Clicking now stages the scheme (outlined yellow, "selected"),
and Reset / Apply in the header drop or apply it, as the wallpaper page
does. The applied notice and any failure moved into the SaveBar, and the
sidebar marks the page dirty while a scheme is staged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Shows the live scheme, accent and both wallpapers, the scheme and
wallpapers linking to their own pages, then every udt consumer in a
software and a hardware list, each with a Re-apply button running
`install.sh <name>`, and Re-apply all in the header. The list comes from
`install.sh --list`, so a consumer added in unified-desktop-theme shows up
here with no edit. One run at a time, and none during a scheme switch.
QML's JS engine has no Object.fromEntries either: it threw a TypeError
that only reached the log and left the page without its list. Noted in
AGENTS.md beside String.matchAll.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Docker.qml mirrors Virsh: the docker CLI, an event stream that runs for the
whole session, and `docker stats --no-stream` on the 2s timer only while the
page is up. Containers are grouped by compose project, since a stack is a
dozen containers that start and stop together; a container outside any
project is a group of one. Verbs are start, stop, restart and resume, by
container id, so no compose file is needed and nothing removes a container.
The event stream is filtered to lifecycle events: health checks emit exec_*
events every few seconds per container, which would make the stream a poll.
It dies with the daemon, so it is retried every 10s.
An inactive Loader keeps its last height and a Column still reserves it, so
collapsing one card left an empty box where its detail had been. Both the
container and VM detail loaders now hide while inactive; the VM one had the
same bug, unseen with a single VM.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The helper replaces its default [manifests] table with the file's, so
adding one manifest to a file without the table dropped neovim's, and
the page showed no rows for the default that was in effect. With no
table in the file the page now lists the helper's defaults, and the
first add, remove or URL edit writes them all before its own change.
Toml.js gains sections(), to tell a missing table from an empty one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The shared Switch flipped its own checked on click, which replaced the
caller's binding with a constant. Every use binds checked, so after a
click the switch stopped following its source: Discard on a settings
draft reverted the value and left the switch showing the click. Four
status rows and the headphones panel each carried a resync workaround
for it.
toggled now carries the new state and the switch moves only when the
caller's binding does. Handlers that read checked as the new value take
the argument instead; the workarounds are gone.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Toml: a value followed by anything but a comment was parsed as if the
line ended there, so a multi-line string (which opens with an empty one)
or `x = "a" junk` read as valid and set() could write a duplicate or
mangle it. entries() now skips such lines and set() refuses them with the
existing "cannot edit" error. The ponytail comment names the ceilings.
Store: a failed put left Save enabled with a stale draft; it now marks the
key invalid. An empty manifest URL used to unset, which removed the row
being typed in; it now marks the row invalid instead (Setting clears the
mark just before set, so the one made inside set stays). Noted that list
entries with spaces cannot be entered here.
Sbb: refresh() ran an ssh fetch for the desktop page too and let two
fetches overlap, or one run during a save. It is split into reloadDesktop()
and fetch(false), and fetch() returns while busy. A successful config-get
clears a stale VM error, and a missing text reads as empty. The put now
writes and records the draft as sent, so typing during the save is not
marked saved.
SbbVmModule: fields are read-only while busy, a Reload button sits beside
the status line, and the manifest URL field says Remove deletes the row.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Under SB Builder in the settings window. The desktop page edits
sb-builder's config.toml in place; VM control is a switch because an
emptied field means the default domain, not "". The VM page is
read-only until the helper answers config-get.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The desktop config is a watched local file; the VM one goes through the
helper's config-get and config-set over ssh, so the helper validates what
lands in root's file. Field text is typed after the key's default, the
same check sb-builder makes on load.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
The sb-builder pages need the same fields over another file. The store
defaults to Qtm, so the Mail pages are unchanged.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Same shape as qtmaildir's Ini.js, so a file the user annotated keeps its
comments: unset comments a key out, set reactivates it. A value spanning
lines throws instead of gaining a duplicate key, which TOML rejects.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
AssistantModule keeps each router model's input_modalities and exposes
hears: the model loading, else the first not unloaded (the daemon's
rule), reports audio. Unknown inputs or a router that is down count as
yes; the daemon's error covers the rest. The model list is now read on
every canvas open, not only when a preferred model is set, so hears is
current when the card shows.
Checked: the rule against the router's live /models (Gemma resident:
on; Qwen resident or loading: off; router down: on). Not yet seen by
eye after a desktop shell reload.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Quiet muted only the Claude and opencode hooks, which play their own
sounds and check the flag themselves. With notification sounds it now
means no sound at all while the balloons still show, so the balloon
player reads status.quiet the way Notify reads status.dnd, without
instantiating Status. A per-app quiet list was left out: the mute list
already covers an app that should make no sound.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
From the final review. Every save ran gsettings set, so saving a timeout
on a first run, with no soundTheme in the file, silently reset a system
theme set elsewhere to freedesktop; the page now writes it only when the
draft's theme differs from the file's, and flags any other mismatch as
before. An exit code outside 0-3, a save killed mid-run, now reads as an
error rather than a partial success. The player's comment no longer
claims the balloon's expiry check, which it does not need.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A save's outcome sat at the bottom of the page, out of sight on a long
one, while "unsaved changes" was already in the header. SaveBar gains
notice, shown once the page is clean, and error, shown in red over the
unsaved mark, since a refused or failed write leaves the draft dirty.
Wired for notifications, HyprIdle, Sunset, Wallpaper and the four Mail
pages, with their longer messages shortened to fit the header. Messages
that are not save results stay in their pages: the icon theme's
immediate apply, Sunset's location detection, the assistant restart.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A sound per urgency chosen with the widget file dialog, previewed with
pw-play, and the sound theme for apps' sound-name hints. Save writes the
theme to gsettings as well, and the page reads gsettings back on every
open so a change made elsewhere is shown, with a button to adopt it,
rather than overwritten.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Muted and suggested apps were the same chip in two unlabelled rows. Each
row now has a caption; muted chips are red, suggestions dimmed and cut to
the eight most recent, newest first. The suggestions were already bounded
by the live and history caps. Limits gains a line saying what the two
numbers do, like the one under Timeouts.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
From the final review. An edit broke the draft's binding to Notify.config
and Discard assigned a plain value, so a later change to the file read as
unsaved edits; discard and refresh now restore the binding. Save stays
disabled while the write runs, since a second click killed the first
mid-write. Unknown keys inside timeouts and balloons are merged rather
than replaced, as the spec asks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A bare TextInput defaults activeFocusOnTab to false, unlike the Controls
TextField some pages use, so Tab skipped every field built from one: the
settings search, Field, the qtmaildir, git, autostart, assistant, OBS,
user, VM and network rows, and the calendar editor. Multi-line TextEdits
stay out of the chain.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Typing replaces a Field's value binding, so Discard left the typed text
showing over the reverted draft, and a rejected timeout kept displaying.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Edits notifyd's config.json as a draft behind the SaveBar and runs
notifyctl reload after the write; a stopped daemon is reported as saved
but not applied, since it reads the file at its next start. Muting offers
the apps already seen in the queue and history.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The thumbnail list scrolled a fraction of a thumbnail per wheel notch,
which is ListView's default step and slow with rows this tall. A
MouseArea over the list (acceptedButtons: Qt.NoButton, so clicks and
hovers still reach the thumbnails) now moves one row per notch, and
keeps a touchpad's pixel delta as it is.
An open folder with many images scrolled its header out of view, so
folding it meant scrolling back to the top. A copy of the header is now
pinned over the list while the topmost row belongs to a folder whose own
header has scrolled off; clicking it folds that folder and positions the
view at its header. The header row became an inline component so the
list and the pinned copy draw the same thing.
Loads clean; not yet confirmed by eye.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
qtmaildir now takes --account, --thread and --message, and hands them to
a running window over its socket, so the drawer and the notifications can
open the exact thing they show instead of just launching the client.
mail-open.sh is the one place that turns an account and a thread into
selectors, shared by both callers. It looks up the thread's newest unread
message at click time rather than when the row or notification was built:
by then it may have been read, and an empty lookup falls back to the whole
thread instead of a miss in qtmaildir's status bar.
The notification never had a working click: dunstify is not installed, so
mail-notify.sh always took its notify-send fallback, which carried no
action. It now uses notify-send -A NAME=Text, one action per listed thread
(keyed by thread id, which is hex and so never holds the "=" separator)
plus the account as default. The round trip through notifyd was checked:
notifyctl action makes notify-send print the picked name.
On the page, the account header opens the account and a thread row its
newest unread message. Rows use TapHandler and HoverHandler because a
MouseArea cannot fill a Column. Launches are detached: a first launch is
the client itself, and the old reused Process would have killed it on the
next click. Opening anything now closes the drawer rather than going back.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The page shows a summary; btop is the full picture when the summary is
not enough. The button sits in the header's actions slot, so it stays
put while the panel scrolls, and closes the drawer on launch since the
terminal takes over from there.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The repository had no name of its own, only the framework's. It is now
Keystone, in the README, AGENTS.md, the settings window, notes commit
messages, calctl's PRODID and the user page's User-Agent.
Its files move off quickshell's name too:
~/.config/quickshell/greetings -> ~/.config/keystone/
~/.config/quickshell/obs-scene-icons.json -> ~/.config/keystone/
$XDG_STATE_HOME/quickshell/desktop.json -> $XDG_STATE_HOME/keystone/
~/.config/quickshell is Quickshell's own default config directory (a
bare qs loads its shell.qml), so sharing it was a collision rather than
a home. There is no fallback to the old paths: the files are moved once.
The layer namespaces become keystone-*, and the Hyprland blur rules in
hypr-theme are renamed to match in the same change. A running shell
keeps its old namespaces until restarted.
Left alone: the retired standalone mail and vm shells' namespaces,
which their READMEs keep as history; Quickshell's own app id, binary
and process name; and the repository directory.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Per-core load, the network rate, VRAM and the fan used to run only while
a PerfPanel existed, and closing the page cleared them. Opening the
drawer therefore always showed a fresh first sample and an empty network
graph, which made the page not very useful as a glance at what just
happened. Everything now samples for the whole session, so the graph
opens on the last minute of history.
The cost is the VRAM fdinfo scan, ~14ms every 2s, now unconditional; a
ponytail note beside it says to gate it on the panel again if that shows
up. The LAN address and the public IP check run once at startup instead
of on each page open.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The Mail, Assistant and Ask presets pages got a Save and Discard pair in
the page header; the rest still had their own buttons wherever their
page put them: User's Save at the bottom, Wallpaper's Apply and Reset
beside the mock screens, Icons' Apply and Reset under the cursor cards,
HyprSunset's and HyprIdle's Save + Restart in the page. They now all sit
in the header SaveBar, which takes the page's own verbs (Apply and
Reset, Save + Restart) and a busy state.
HyprSunset and HyprIdle had no notion of an unsaved change, so their
button was always live. They now count as changed when what save()
would write differs from what was read, which enables Save only then,
gives Discard (a reload) something to drop, and marks them in the
sidebar; a window open no longer reloads them over unsaved edits. The
staged cursor moved from IconsTab into the Icons singleton so the
header and the sidebar can see it.
Git and autostart act a row at a time, and a theme applies on click, so
those have no bar.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The qtmaildir, Assistant and Ask presets pages wrote a field on Enter,
and a switch or chip the moment it was clicked, so a half-finished
change reached the file and a slip could not be taken back. They now
edit a draft as fields are typed, and a Save and Discard pair in the
page header (SaveBar, through Page.actions) writes or drops it. Save
waits while a field holds a value that cannot be written, and a draft
over a file that changed on disk meanwhile is refused at Save rather
than written over it. A dot in the sidebar marks a page with unsaved
edits; drafts survive moving between pages. The four Mail pages share
one draft, since they are one file. Tool switches are staged too and
renamed on Save; model Load, Prefer and Restart stay immediate, being
actions rather than settings.
Live editing needed two rules. A field is no longer bound to its value,
which would reset the cursor and eat a typed trailing space; it follows
the value only when the draft moves under it. And a Repeater's model is
now the set of row keys (or a count), assigned only when that set
changes: an array rebuilt from the draft on each keystroke recreates
every row, including the one being typed in, which loses its focus.
Git, autostart's rows, HyprSunset, HyprIdle and User keep their own
buttons.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
QtQuick.Dialogs' ColorDialog opened light on the dark desktop. It paints
from the Qt Quick palette, which qt6ct leaves at Qt's default here: its
custom_palette is off and the dark comes from the kvantum-dark widget
style, which Qt Quick does not use. Qt.labs.platform's ColorDialog falls
back to the widget QColorDialog in a QApplication, which this process
already is for the tray menus, and widgets take the kvantum style like
every other application.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
An account's chip colour and each tag colour were #rrggbb typed by
hand. A swatch beside each now shows the colour and opens Qt's own
ColorDialog, which writes the choice back as #rrggbb; typing still
works. The add-tag row has one too, filling its field. Setting.qml
gains a colour flag rather than a second component, since a colour
key is an ordinary text key with a swatch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
qtmaildir is configured through qtmaildir.conf alone, which it reads at
startup and never writes. Four settings pages under a new Mail group
edit it: Mail ([general], [sync], [completion]), Compose, Accounts (a
card per account, add and remove) and Tags & shortcuts ([tagcolors] and
[keys]). Fields save on Enter and unset when emptied, with qtmaildir's
defaults as placeholders and numbers range-checked; the pages say when
qtmaildir is running and a change waits for its restart.
Ini.js edits the file line by line so its comments survive. Headers are
only whole [name] lines: a section is never cut at the next "[", since
values such as [Gmail]/Bozze hold brackets, the trap AGENTS.md records.
The shortcut actions are copied from qtmaildir's KeyMap::knownActions()
rather than exported by it, since a CLI flag there would have meant
translations and a changelog entry; the field also takes free text, and
the copy is marked as a ponytail ceiling.
The settings sidebar now clips, which a list long enough to scroll
showed it did not: entries drew over the search box.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Load set the preference as well as swapping the model in, so loading a
model from the settings page for any reason made it the assistant's
model too: after loading Qwen there, the canvas kept Qwen instead of
bringing the preferred Gemma back. Load and Prefer are now separate
buttons: Load swaps a model in now and leaves the preference alone, and
Prefer only records which model the canvas loads when it opens.
The canvas header also showed a stale model name after a swap; it now
takes the model from the daemon's ctx event, which carries it from
desktop-assistant f9d4644 on.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A preferred model that only took effect from the settings page did
nothing the next time another client had swapped it out. On this
desktop one model and one client run at a time, so opening the canvas
is when the assistant's model should come back: if the preferred one is
neither loaded nor loading, it is loaded, and the canvas header says so
until the router reports it in. The daemon still never asks for a model;
with no preference set nothing changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The daemon answers with whichever model llama-server has loaded and
never asks for one, so it never evicts a model another client is using.
The Assistant settings page now lists the router's models with their
state. Load saves one as the preferred model, in Prefs, and asks the
router to load it now, polling /v1/models until it reports loaded;
Prefer marks the loaded model as preferred without swapping. The swap
happens only on that click, so the daemon's rule holds.
AGENTS.md records the router's load endpoint and its two refusals, both
measured: it lives on the server root, not under /v1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Ten pages in one flat list had stopped reading as a list. A module now
names its group, and the sidebar sorts by it and draws a small heading
where it changes: Account (user, git), Appearance (wallpaper, theme,
icons), Desktop (HyprSunset, HyprIdle, autostart) and Assistant (the
daemon, Ask presets). Groups keep the order their first page is
declared in, so shell.qml's module order still decides.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Two settings pages for desktop-assistant.
Assistant edits the daemon's config.toml: server, temperature, tool
rounds, thinking, the system prompt, and the [env] values its tools
read; a switch per tool renames tools/<name>.toml to .toml.off, which
the daemon's glob skips. The daemon reads all of it at startup only, so
the page says when a change is pending and Restart runs assistant.sh
restart, showing its status when the daemon does not come back.
The file is edited line by line, like autostart.lua, so the comments
the example ships with survive: unset keys stay commented out in place.
Every write parses the whole new file with tomllib first and replaces
the old one atomically, so no edit can leave a config the daemon will
not start with. Defaults are read from assistant.py --defaults rather
than copied into QML.
Ask presets edits the canvas's canned questions, which Prefs already
stored for exactly this page: label, question, and the kinds each is
offered for. They apply live.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Moving the appearance files into the desktop added import "../.." after
the last line of each file that began with "import". In Icons.qml that
line is inside the embedded Python cursor script, so the import landed
there: python3 died on a SyntaxError, printed nothing, and every cursor
card stayed empty with nothing in the log. Icons.qml uses no Theme, so
the line goes. Every other moved file has it above its root object.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The mock screens took a third of the width beside the list, which left
both cramped in the settings window. They now sit on top, sized to half
the width and capped so the upright screen stays under 200px, with the
notes and the actions beside them; the folder list takes the full width
and the rest of the height below. The actions are a Flow, so they wrap
instead of clipping in a narrow window.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The drawer's greeting row stays, and clicking it now closes the drawer
and opens the user page in the settings window: Drawer.show already hands
a settings module to the window, so the row's handler is unchanged.
"More git settings" switches the window to the git page through the
same go() it used in the drawer. The page is searchable by the fields it
edits.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The labels and page titles only; the module names, and so the IPC verbs
and search keys, stay sunset and idle.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The appearance shell existed because a wallpaper picker needed more room
than the 600px drawer, so it ran as its own process with a full-screen
overlay. The settings window now gives it that room, and its five tabs
become five settings pages in the desktop process: Wallpaper, Theme,
Icons & cursor, Sunset and Idle. appearance/ is gone, and with it a
process, a keepalive window and a layer blur rule.
The files move to desktop/modules/appearance/ unchanged in what they do.
Each tab gets a small *Module.qml; the window's refresh-on-open calls the
singletons' refresh(), which the panel's show() used to. The two tabs that
were inline Components in AppearancePanel become ThemeTab and
WallpaperTab, owning the notices the panel printed. Sunset, Idle and
Icons drop their own Flickable so the page scrolls them and search can
reveal a row; the wallpaper list virtualises its rows and scrolls itself,
so it takes the page's new viewHeight instead.
Search finds a colour scheme and an icon or cursor theme by name.
The appearance IPC target moves to desktop/shell.qml with the same verbs,
so udt-steps and any keybind change only the path. Git now follows the
appearance pages and autostart in the sidebar.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Search used to stop at the page: clicking a result opened it at the top
and left the setting to be found by eye. Now each settings module keeps
its rows as searchItems, {text, key}, reread on every window open since
the page itself is not loaded until shown: git runs gitcfg list, and
autostart watches its file. A row hit opens the page, and Page.reveal()
finds the row whose objectName is the key, waiting up to 3s for the
page's own data, scrolls to it and flashes it in the accent. The reveal
lives in Page, so a page only names its rows.
Git's long keyword list was a stand-in for exactly this and is cut to
"gitconfig". The autostart page takes its path from the module now that
both read the file.
Also corrects the AGENTS note on missed hot reloads: it blamed sed -i
replacing the file, but the Edit tool writes a new inode too and usually
reloads. The cause is unknown; the note now says how to detect it and
that a process that stops watching needs a restart.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|