Repository navigation
Explorer entries read "Open terminal here"; a window edges setting (#27) - #29
Merged
Merged
Conversation
…es setting (#27) Explorer entries (owner, 2026-09-19: "have it say Open Terminal here and don't have any of them mention Prism, you can see that by the logo"): both verbs are labelled "Open terminal here". An install that already has them is relabelled by reconcile at launch, under the narrowest rule that does it: no "no" on record, the key present and pointing at this exe, its label readable and different, and only the label value is written. Never under --e2e or unpackaged, never an entry the user turned off. Window edges (owner: "Hairline, Faint, or like Solid edges, or even No edges"): Settings > Appearance > Edges, stored as prism.window.edges. Applied where chromeTokens derives --p-divider and --p-line, so every edge in the window follows it, the core's components included, with no change to core/. Hairline is the default and is exactly the numbers hard-coded before. The DWM border round the window follows too; none removes it. Version 0.2.0 -> 0.3.0. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…s does (#27) Review of #29. The row offered Hairline, Faint, Solid, None: the order the owner happened to say the words in. He asked for the option "like we have in the main app", and Prism's Edges row is a scale (None, Faint, Hairline, Strong); a segmented control with its steps out of order does not read as one. Settings now builds its options from WINDOW_EDGES, so there is one list, and a new unit test pins that list as weakest to strongest by every number it carries (both line tokens, both grounds, and the DWM border step). The e2e's expected row text and the CLAUDE.md passage follow. Also: an over-long JSX line wrapped, and in main the comment about the DWM helper sits beside the constant it describes again. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Maxaubert
added a commit
that referenced
this pull request
Sep 25, 2026
…2e harness (#71) (#72) Settings: the colour editor saves the whole setup into Custom and is a theme pick (#8, #29); ThemeSwitchAsk registers once (#22); a hex field commits only a changed draft (#26); the dictation key is never a key that types or a chord the terminal owns, and a press elsewhere ends the capture (#27); the editor takes the focus, traps Tab and hears Escape, the pencil is its own button (#28); a finished download reads fresh state before picking the model (#30). Release and CI: release.yml tags the built commit (#11); core-release runs from main only (#34), waits for terminal-gate by name and its success (#38), and opens an issue when a core change cannot be released; core-version also requires the core version above the base's (#39). Harness: a time limit per scenario and closeApp (#35), profiles removed after each scenario (#36), the poll's first verdict awaited instead of 6 s (#37). Core 0.15.3, app 0.18.3. New reviewSettings e2e and unit tests. Claude-Session: https://claude.ai/code/session_01LJbePcRzre7AusNzPNS2Bk Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
github-actions Bot
pushed a commit
that referenced
this pull request
Sep 25, 2026
…2e harness (#71) (#72) Settings: the colour editor saves the whole setup into Custom and is a theme pick (#8, #29); ThemeSwitchAsk registers once (#22); a hex field commits only a changed draft (#26); the dictation key is never a key that types or a chord the terminal owns, and a press elsewhere ends the capture (#27); the editor takes the focus, traps Tab and hears Escape, the pencil is its own button (#28); a finished download reads fresh state before picking the model (#30). Release and CI: release.yml tags the built commit (#11); core-release runs from main only (#34), waits for terminal-gate by name and its success (#38), and opens an issue when a core change cannot be released; core-version also requires the core version above the base's (#39). Harness: a time limit per scenario and closeApp (#35), profiles removed after each scenario (#36), the poll's first verdict awaited instead of 6 s (#37). Core 0.15.3, app 0.18.3. New reviewSettings e2e and unit tests. Claude-Session: https://claude.ai/code/session_01LJbePcRzre7AusNzPNS2Bk Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #27
App version 0.2.0 -> 0.3.0 (a feature, so a minor bump; merging publishes
v0.3.0). Nothing undercore/is touched, so there is no core release and no Prism bump from this PR.1. Explorer entries: "Open terminal here"
Owner: "for the Terminal app, have it say Open Terminal here and don't have any of them mention Prism, you can see that by the logo".
VERB_LABELinsrc/main/shellVerb.ts). They were "Open in Prism Terminal" and "Open Prism Terminal here".reconcile(src/main/verbSwitch.ts) used to leave a present verb alone, so an existing user would have kept the old text for ever. It now relabels, under the narrowest rule that does the job:allowed: packaged and not--e2e, the existing guard, tests kept);reg add <key> /ve ...), not the icon or the command, andrelabelVerbrefuses any key that is not one of the app's two.REG_SZ, not the value's name, because reg.exe prints "(Default)" in the language of the Windows it runs on ("(Standard)" on a Norwegian one).build/installer.nshnames no labels (it deletes keys), so it is unchanged. Settings hint, README, CLAUDE.md and a note in the design spec are updated. The 2026-09-18 plan document is left as the historical record it is.2. Window edges
Owner: "add the option to specify the edges that you have in the Terminal app, like we have in the main app, where you can choose like Hairline, Faint, or like Solid edges, or even No edges".
data-pref="window-edges"): None / Faint / Hairline / Solid (weakest to strongest, the order of Prism's own Edges row; see the review note below), built from the core'sPref+Segmented. It is this app's own row (in Prism the edges belong to the app style, which has its own Edges row), so it is added to theoptionse2e's closed list of this app's rows and its key isprism.window.edges, notprism.term.*.src/renderer/src/lib/edgesPrefs.ts(same shape asnewTabPrefs). The numbers live insrc/shared/windowEdges.ts, shared because main reads them too.--p-divideror--p-line(I greppedsrc/andcore/: the tab separators, the title bar's rule, the settings rail and rows, control outlines, menus, dialogs, the find bar, the dictation pill).chromeTokenstakes the choice as a fourth argument and sets the alpha of those two tokens. No component knows the setting exists.--p-dividerand 9% / 12% for--p-line, the values that were hard-coded. A unit test pins#ffffff12/#ffffff17on the default theme and that the full token table for'hairline'equals the table with no argument; the e2e asserts the same on the running app with nothing stored.faintandstrong(lib/theme.ts). None is alpha00, still a colour, so borders keep their width and nothing shifts.src/main/windowEdge.ts): it was simple and safe, so it follows. The page tells main over a newwindow:edgesIPC (validated in main; anything unknown is the default),edgeForscales its step off the ground (hairline 0.13 / 0.16 as before, faint a third, solid a little over double), and None isDWMWA_COLOR_NONE, which a maximized window already gets.Verification
npm run typecheck: clean.npm run lint: 0 errors, 8 warnings, the same 8 as on main (react-refresh, in files this PR does not add to).npm test: 48 files, 612 tests, all passing (after the review commit). New: 6 label tests, 7 relabel tests against a fake registry behindexecFile(shellVerbRelabel.test.ts), 5 reconcile tests inverbSwitch.test.ts, 6 edges tests inchromeTheme.test.ts, 4 inedgesPrefs.test.ts, 4 inwindowEdge.test.ts. The label and chrome tests were written first and seen failing.spawn7,theme8,newTabFolder6,restore4,lastTab7,options10,edges35 (new; 4 runs, 4 passes, after the one fix below), pluscwdLabel,indicator,handoff,closeAsk,links,dropAndMenu,exitClosesTab,promptLayout. The twodictation*scenarios were deliberately NOT run (another suite was running on this machine and they count each other's speech servers).edgesscenario measures real edges, not tokens: the border between two tabs, the rule under the title bar, the settings rail's edge and the rule under a settings row. For each option it WAITS until every edge has arrived at its token (the strip's border colour transitions over 550ms), then asserts none = alpha 0, faint < hairline < solid (measured 0 / 0.024 / 0.07 / 0.16 for the chrome line and 0 / 0.03 / 0.09 / 0.18 for the list line), white ink on dark, black ink at 18% after switching to a light theme, no layout movement across options, that main heard each choice, and that Solid survives a real quit and relaunch, measured before Settings is opened.edgeshad one failure, in the test and not the app: I had asserted a1pxborder, and at this display's 225% scaling a CSS pixel computes to0.888889px. The check now compares widths across options instead of assuming 1px..e2e-shots/edges-hairline.png,edges-faint.png,edges-solid.png,edges-none.png,settings-general.png. Hairline looks like the page did before. Faint: the rules are barely there, control outlines almost gone. Solid: clearly stronger rules and outlines, nothing heavy. None: no rules at all; the dropdowns, the hex fields and the segmented controls still read because they keep their fill, and the selected theme card keeps its accent border. The Edges row sits at the foot of the Appearance list with one rule under it, no doubled line. On General, the Explorer row's hint reads"Open terminal here" on a folder. On Windows 11 it is under Show more options.on one line, not truncated.Not verified, and why
--e2eby design, and I did not install or launch a non-e2e build (the installed app was not to be touched). The colour maths is unit-tested and the e2e proves main receives the choice. Hands-on: pick each option on a floating window and look at its outer border; None should show no border.Independent review (second agent, commit 48818cb)
origin/mainand the CLAUDE.md passages it touches. No binaries or caches in the diff, no em-dashes, version and lock bumped, nothing undercore/.WINDOW_EDGES(one list, not two), and a newsrc/shared/windowEdges.test.tspins that list as weakest to strongest by every number it carries. E2E text and CLAUDE.md follow. Two small tidies: an over-long JSX line wrapped, and a comment insrc/main/index.tsput back beside the constant it describes.allowedgate; no test reaches the real registry,child_processis mocked whole); theREG_SZparse, including an unset default value (reg.exe prints a translated "(value not set)", which reads as different and is rewritten on our own key, which is right); hairline numbers equal to the old hard-coded ones; the debounced DWM apply at launch (ground, then edges, last one wins); the e2e waits (every read is behinduntil/settled, the onesleepis the bound of a race against the process exit).edges35,options10,theme8,spawn7,restore4,cwdLabel3,indicator9,newTabFolder6,handoff3,lastTab7,closeAsk8,links6,dropAndMenu5,exitClosesTab3,promptLayout2, all passing. Nodictation*scenario was run.edges-faint.png,edges-solid.png,edges-none.png,settings-general.png. The row reads None / Faint / Hairline / Solid with the pressed step filled; Solid's rules and control outlines are clearly stronger without being heavy; None has no rules at all and the controls still read by their fill; the Explorer hint fits on one line.For the owner
strongstep and used its numbers (16% / 18% ink). If you meant a fully opaque rule, that is one line insrc/shared/windowEdges.ts.--p-line(list rows) at a fixed hairline whatever the style's edges say. You asked for every edge, so here None also removes the rules between settings rows. The screenshot looks fine to me, but it is a difference from Prism worth a glance.🤖 Generated with Claude Code