Commit Graph
100 Commits
Author SHA1 Message Date
Rūdolfs Ošiņš a1515fe4a6 Fix npm audit reported issues 2026-10-09 09:36:03 +02:00
Rūdolfs Ošiņš 840f1b0c08 Only let an AppImage claim the rad: scheme
A dev build or an AppImage registered itself whenever it wasn't already
the handler, replacing the installed app as the target of rad: links.
Now installers own the scheme, and an AppImage only claims it when no
other handler is set. Dev builds never register; the README explains
how to test links in them instead.
2026-10-08 10:35:46 +02:00
Rūdolfs Ošiņš 344e10d967 Give dev builds their own identifier
Since we started opening rad: links in the app, a dev build and an
installed release can't run side by side: they share the identifier, so
whichever starts second hands over to the first and quits. A separate
identifier also keeps dev from sharing window state and logs with the
release.
2026-10-08 10:35:46 +02:00
Rūdolfs Ošiņš 021c9f8a59 Link AsciiDoc cross references to their source
`xref:other.adoc[]` linked to `other.html`, which doesn't exist in the
repository, so following it showed a missing file instead.
2026-10-08 10:29:43 +02:00
Rūdolfs Ošiņš 38279298d1 Keep document links inside the app
Clicking a relative link in a README reloaded the whole app, and links
starting with `/` dropped you in the inbox. Links to files in the repo
now open in the source view, at the linked section if there is one, and
links the app can't follow explain why instead of navigating the window
away.

This also fixes a missing linked file showing the previous file's
content instead of an error, and section links disabling the back
button.
2026-10-08 10:29:43 +02:00
Rūdolfs Ošiņš 1bc5ffa9fe Don't abort blob URLs in e2e tests
The remote request guard read the empty hostname of a `blob:` URL as
remote, so embed previews never loaded in tests.
2026-10-07 16:41:54 +02:00
Rūdolfs Ošiņš 9ca793f393 Suggest assignees by alias as you type
Assigning someone meant finding and pasting their DID. Now the input
searches aliases and lists you, the repo's delegates and other known
peers, so a DID is only needed for someone the node has never seen.
2026-10-07 14:06:15 +02:00
Rūdolfs Ošiņš 66dcf55fd3 Show popovers above modals
The NodeId card opened from an assignee in the new issue modal ended up
underneath the modal's scrim.
2026-10-07 14:06:15 +02:00
Rūdolfs Ošiņš ffb4aa4d3a Raise the chunk size warning limit to 5 MB
The 500 kB default is meant for websites, but Tauri loads the bundle
from disk. The limit stays close to the main chunk's size, so we still
hear about it when it grows noticeably.
2026-10-06 16:49:20 +02:00
Rūdolfs Ošiņš 6eec206caf Silence Asciidoctor warnings in the build 2026-10-06 16:46:06 +02:00
Rūdolfs Ošiņš 5aaf12500e Fix npm audit reported issues 2026-10-06 16:41:49 +02:00
Rūdolfs Ošiņš 67785a8c30 Keep the browsed file in the source view route
Browsing the file tree only changed component state, so no file view
was ever a history entry and back left the repository. The path now
travels as a query parameter, since trailing URL segments are already
consumed by the revision.
2026-10-06 16:28:14 +02:00
Rūdolfs Ošiņš 651af122b2 Render AsciiDoc readmes in repo source view
Uses @asciidoctor/core, lazily imported so the main bundle is
unchanged, with its own DOMPurify instance because the markdown
allowlist is pinned globally via setConfig.

Include directives resolve through a registered HttpCache that maps
Asciidoctor's URI reads onto repo_blob, so tag, line-range and
nesting handling stay upstream. A per-conversion token in base_dir
scopes each read to one repository and commit.
2026-10-06 16:28:10 +02:00
Rūdolfs Ošiņš 2a0dd5a747 Share code block enhancement between renderers
The copy button and syntax highlighting setup for code blocks moves out
of the Markdown component, so other document renderers can reuse it.
2026-10-06 16:27:01 +02:00
Rūdolfs Ošiņš 41eac34ddc Don't reload the dev app on E2E test output
Playwright traces written to tests/artifacts kept reloading the app
running in `npm run tauri dev`.
2026-10-06 15:53:56 +02:00
Rūdolfs Ošiņš b2bbf6f5ad Send embed bytes over IPC without JSON
Embeds went over IPC as JSON number arrays, so a 9MB image turned into
~36MB of JSON. On upload Tauri parses that on the main thread, which
beachballed the app while dropping a large screenshot.
2026-10-06 15:53:56 +02:00
Rūdolfs Ošiņš cd8a32a5e7 Show Retina screenshots at their intended size
macOS saves Retina screenshots at 144 DPI and we rendered them at twice
the size they had on screen. We now scale PNGs with a 2x or 3x density
down; everything else, including 300 DPI print exports, stays 1:1.
2026-10-06 15:53:52 +02:00
Rūdolfs Ošiņš 118abffdea Drop files only into the textarea under the cursor 2026-10-06 14:44:28 +02:00
Rūdolfs Ošiņš dee73cb8f8 Fetch a new seed from preferred and known seeds
Seeding a repo only fetched from seeds we were already connected to, so
one nobody had announced to us yet stayed in the fetching state. Also
try the preferred seeds and connect to known ones, like `rad seed`.
2026-10-06 11:16:14 +02:00
Rūdolfs Ošiņš e793ed5f01 Allow seeding a missing repo from a reference
Following a link to a repo we don't have only led to the explorer, but
the reason it's missing is usually that we haven't seeded it yet.
A deep link that can't be opened now says so instead of doing nothing.
2026-10-06 11:16:14 +02:00
Rūdolfs Ošiņš e010517b79 Sort merged patches by merge time
When looking at merged patches you want to see what landed recently, not
what was opened recently. We take the earliest merge, which is exact for
repos that need a single delegate to merge.
2026-10-06 11:13:39 +02:00
Rūdolfs Ošiņš 94413587ba Show latest revision's diffstat in patch list 2026-10-06 11:00:51 +02:00
Rūdolfs Ošiņš 2f283f1047 Open rad: links in the app 2026-10-05 17:37:03 +02:00
Rūdolfs Ošiņš 990e51c38e Add a library for RIP 4 rad: URIs
The desktop and radicle-explorer render the same comment text, so they
have to agree on what a reference means.
2026-10-05 17:29:02 +02:00
Rūdolfs Ošiņš 8f21eab664 Add ADR for references to Radicle entities 2026-10-05 17:29:02 +02:00
Rūdolfs Ošiņš 6c9e83c763 Ignore fetches cancelled by goto in e2e tests 2026-10-01 21:58:39 +02:00
Rūdolfs Ošiņš 8903f853ea Only ignore personal files under .claude
Ignoring the whole directory would keep shared settings, rules and
skills out of the repo. Only local settings and worktrees are personal.
2026-10-01 19:57:36 +02:00
Rūdolfs Ošiņš bd57ef824f Trim CLAUDE.md and bring it in line with the code 2026-10-01 19:57:26 +02:00
Rūdolfs Ošiņš 92ad43990d Add ADR 0002 for the backend architecture
Record why the backend is split into a shared core and two thin
drivers, and that we intend to move away from radicle-surf.
2026-10-01 19:57:03 +02:00
Rūdolfs Ošiņš eaf2740907 Drop unused radicle-surf leftovers 2026-10-01 19:56:53 +02:00
Rūdolfs Ošiņš b454f29a6e Test rebuilding a broken COB cache end to end
Corrupt a cached issue and patch so the list and counts disagree, and
check that rebuilding brings them back and clears the warning.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 1f95ad0bb2 Test CI job results end to end
Build rad-job from the radicle-job version the app uses, so tests can
record runs. Check the status summary and that runs link to their logs.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 49cf789cbc Test the remaining write paths and permissions
Reactions, review edits, patch comments, title, description and
assignees, stopping seeding, creating an identity, and that a
contributor can't resolve someone else's review comment.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 47d55c4418 Check the published verdict in the draft review test
Publishing an accept as a reject went unnoticed, since the test only
checked that the review appeared.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 699e0604f5 Test the keyboard shortcuts end to end
Cover the shortcut list, sidebar toggle, editor bold taking priority
over it, new issue, settings, jumping to a repo and stepping through a
patch's commits.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš e74fc654f1 Ignore ResizeObserver loop notices in e2e tests
WebKit reports them as page errors, but they only mean some resize
notifications waited for the next frame.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 088b13af48 Test the read views and persisted UI state end to end
Cover the repo home, file tree, commits, a contributor's branch, patch
filters and the identity page, and check that the sidebar, pins,
hints, diff style and revision sort survive a reload.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš c7bb072eb5 Test editing, permissions, seeding and the inbox end to end
Every write path gets a happy path and the contributor gets the
permission cases the ADR asks for: labels, assignees, state, titles,
comments, deleting, seeding by bare RID and clearing notifications.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 3edd0306b2 Add e2e helpers for writes and a second peer
The UI updates before a write lands, so a reload right after could
cancel it; tests now wait for the command. WebKit also reports such
a cancelled fetch as "Load failed". A delegate and a connected
contributor let tests cover what non-delegates may do.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 6608856eb2 Test the patch review flows end to end
The diff, comment and review logic was only unit-tested in pieces.
These cover the wiring: a code comment keeps its line across a
reload, a review publishes with its verdict and comments, and a
review comment stays resolved.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 731c552661 Add unit tests for the lib modules 2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 92e866f7b8 Move sidebar resize math into lib
The first press no longer pairs with an imaginary one at time zero.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš f0d4d678aa Focus the last menu item on ArrowUp
With nothing focused yet, ArrowUp landed on the second to last item.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 08057ba962 Move context menu key navigation into lib 2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 9a023b625c Move identity state labels into lib 2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš a1c3622f05 Move input validation into lib 2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 71c31e234c Move commit co-author credits into lib 2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 6cf4d6010f Move notification teaser helpers into lib 2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 41f93a0921 Share checked-file progress with the patch view
It had its own copy of the path a file diff goes by.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 05b6e01dc8 Set the dock badge in one place
The sidebar already follows the count, so the inbox and the poll don't need to set it too.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 7a42679bdf Share the list search
Issues, patches, commits and the peer selector each had their own
debounce, and issues and patches the same search index. Vitest now
resolves Svelte's browser build, as effects never run in the server one.
2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš 2c81138871 Share verdict labels with the draft review bar 2026-10-01 18:20:25 +02:00
Rūdolfs Ošiņš af5ed76ac4 Reuse the file status label in the diff header 2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš cbb21e7513 Move diff annotation helpers into lib
The snippet and the code thread had their own copies.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 7d2081a8aa Move ref sorting out of the peer selector 2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 520ffe3d19 Name embeds dropped from Windows paths correctly 2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 7a6c88f847 Share one embed upload path in the textarea
Drag-drop, attach and paste each had their own copy. Every upload now
shows its own placeholder instead of overwriting the previous one.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš bda26136c9 Share repo ordering between the sidebar and the inbox
Both toggled pins and ordered pinned repos with their own copies.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš ceeab4e2c6 Share which commits each revision adds
Patch and Revision each computed it with their own copy of the loop.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 9ff5529c9f Move revision description helpers into lib
The commit-list check was written twice, and revision titles and the
commit group collapse rule were untested inside components.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš c7387ac540 Keep asterisks between spaces in comment previews
"2 * 3 * 4" read as emphasis and lost its asterisks. Markdown doesn't
treat a marker with a space just inside it as emphasis.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš f6a23e0b0f Move comment preview text into lib
The regex-heavy markdown stripping was untested in the component.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš a15a20393c Move commit day grouping into lib
Today/Yesterday labels and grouping by day had date edge cases that
nothing tested.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš f267d3d16f Move comment and commit stepping into lib
The order the stepper walks comments in and its wraparound index math
were untested, and ReviewPage ordered its file groups with its own copy.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 6e1176ffcf Move discussion timeline grouping into lib
The rules for grouping a person's consecutive activity and when to repeat
their name lived in an untested loop in the component.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš ca3b059a62 Move CI job grouping into lib
The status chip's grouping, dedupe and summary rules were untested inside
the component, and a wrong CI status is very visible.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 974235b1fe Share comment thread building between patch views
Revision and ReviewPage built threads and checked who may resolve a
comment with their own near-identical copies.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš a43031ad70 Show assignee changes correctly in timelines
Assignees were compared by object identity, and each action carries its
own copies, so every change listed everyone as both removed and added.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 5887220ec7 Move issue and patch timeline building into lib
Both views built their activity feed inline, with the shared part written
twice. It now lives in tested modules.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 89131f3b3a Keep every review comment in inbox summaries
Notification actions were deduplicated by operation and type, so the
several code comments of one published review collapsed into one.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 5b3bc10a06 Check bare RIDs against already seeded repos
The seed form accepts a RID without the rad: prefix but compared it as
typed against lists that have the prefix, so duplicates got through.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 56e495ba8d Add unit tests for patch review logic and draft storage
Code review is the app's core workflow and had almost no coverage. A
mutation run checked that each test fails when the logic it covers breaks.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 6df7827bb9 Don't break the inbox on invalid stored pins
The pinned and hidden inbox repos were read with a bare JSON.parse, so
corrupted storage threw while the inbox loaded.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 331a3d5432 Fetch a repo right after seeding it
Seeding only set the policy, so a repo stayed unreplicated until a
seed happened to announce it again. Fetch from connected seeds in the
background, like `rad seed` does.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš c4dcb61675 Stop the timer when resetting a dynamic interval
Resetting only forgot the key, so the pending timeout still fired and
rescheduled itself: the sidebar kept reloading repos every 5 seconds
after nothing was left to replicate, and after it unmounted.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš be0c2a424b Don't throw on empty or invalid frontmatter
Since js-yaml 5 an empty or comment-only block throws instead of returning
undefined, as does invalid YAML. Markdown renders the content from the
same parse, so one such block made the whole document fail to render.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 5d8bc00f13 Show alias errors when creating an identity
The errors weren't reactive state, so the hints never rendered.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš a178aaade2 Only prepare code blocks inside each Markdown block
Every Markdown instance searched the whole page, so code blocks got an
extra wrapper and copy button for each other Markdown block on the page.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 17e7a29cb9 Treat RIDs with non-base58 characters as invalid
parseRepositoryId threw instead of returning undefined, so the seed form
crashed on a typo instead of saying the RID is invalid.
2026-10-01 18:20:24 +02:00
Rūdolfs Ošiņš 4a3cdd9849 Upload e2e artifacts from CI runs
A flaky test that passed on retry left nothing to debug with. The
fixture already drops passing tests' folders, so this stays small.
2026-10-01 18:16:29 +02:00
Rūdolfs Ošiņš dababb90cf Make e2e output easier to read
Browser logs are indented and dimmed like in explorer, and npm's
per-script notices and Vite's bundle size warning no longer bury the
results.
2026-10-01 18:16:29 +02:00
Rūdolfs Ošiņš 7728c9272e Start e2e specs at a route that exists
/repos is no longer a route, so specs fell back to the inbox and logged a
routing error. The inbox opens the first-launch guide, so tests now start
with it dismissed. The router now logs the URL it couldn't resolve
instead of just "URL".
2026-10-01 18:16:29 +02:00
Rūdolfs Ošiņš b0fcde4d4b Drop redundant steps from the checks
svelte-check already type-checks what tsc did, clippy already runs cargo
check, and radicle-tauri has no doc tests. Linting all targets also
covers test code, which cargo test builds but never lints.
2026-10-01 18:16:29 +02:00
Rūdolfs Ošiņš 1d50ed5c95 Add a script that runs the CI checks locally
Runs the same steps as the workflows and logs each step's output, exit
code and duration, so a failed run can be read back without the terminal.
The output ends with a summary of each step.
2026-10-01 18:16:29 +02:00
Rūdolfs Ošiņš fa2c82b00b Document the testing strategy and e2e conventions
An ADR records how we decide what to test and where, and a checklist lets
people and agents check a change against it.
2026-10-01 18:16:29 +02:00
Rūdolfs Ošiņš 0172253b4d Put invoke timing logs behind VITE_LOG_INVOKE_TIMINGS
They flooded the dev console and test logs; perf work can turn them on.
2026-10-01 18:16:29 +02:00
Rūdolfs Ošiņš c01f1a9a8a Run e2e tests against a production build
The dev server's unbundled modules made each page load take seconds, which
is most of the time a test spends; E2E_DEV_SERVER=1 keeps the dev server.
Each run writes a JSON report, and CI uses two workers now that the
dropped keep-alive connections behind the flakiness are fixed.
2026-10-01 18:16:29 +02:00
Rūdolfs Ošiņš 086afbb5dc Give each e2e test its own reliable peer
The page always talked to the shared palm backend, so tests couldn't set
up peers of their own. Peers now have no passphrase by default, so tests
don't need an ssh-agent and test keys stay out of the developer's agent.
Fixtures wait for replication instead of relying on gossip timing, and a
request cancelled by a reload no longer counts as a page error.
2026-10-01 18:16:29 +02:00
Rūdolfs Ošiņš f512682ec6 Build test-http-api once per e2e run
Each peer ran it through cargo run, which could take minutes to start.
2026-10-01 18:16:29 +02:00
Rūdolfs Ošiņš 2bfa19f1af Run e2e tests against heartwood 1.10.3
Matches the radicle 0.25 crate the app links against.
2026-10-01 18:16:29 +02:00
Rūdolfs Ošiņš 851fbc54be Read request bodies before test-http-api handlers run
Hyper closes a keep-alive connection when a handler leaves the body unread,
and browsers don't retry the next POST on it, which made e2e tests flaky.
2026-10-01 18:16:29 +02:00
Rūdolfs Ošiņš b0a519d1c5 Mirror every Tauri command in test-http-api
Several commands had no route or returned stubs, so e2e tests silently got
null or empty data. A missing route now fails loudly, the profile loads on
first use so onboarding works, and node status is polled over HTTP. A
parity test keeps the routes from drifting from the Tauri handlers again;
it also caught revisions_by_patch being registered twice.
2026-10-01 18:16:29 +02:00
Rūdolfs Ošiņš aed733ade6 Move command logic from Tauri handlers into radicle-types
Auth, inbox, CLI detection and cache rebuilds lived only in the Tauri
commands, so test-http-api couldn't share them and stubbed them instead.
2026-10-01 10:20:19 +02:00
Rūdolfs Ošiņš a99631e611 Add unit tests for the router, utils and caches
Covers the pure modules the rest of the app builds on, starting with the cheapest layer of the testing strategy.
2026-10-01 10:20:19 +02:00
Rūdolfs Ošiņš 6b1f0e601c Handle failed CI job lookups 2026-09-29 17:28:46 +02:00
Rūdolfs Ošiņš 73bea06ee1 Serialize writes in the test HTTP API
Parallel e2e tests hit the repo's sigrefs lock when creating COBs
concurrently, which the Tauri avoids by running these commands on
the main thread serially.
2026-09-29 17:28:34 +02:00
Rūdolfs Ošiņš 4e6137db5b Match test browser platform to the host 2026-09-29 17:24:48 +02:00
Rūdolfs Ošiņš 4d45516970 Allow creating issues with only a subject 2026-09-29 16:57:11 +02:00
Rūdolfs Ošiņš 3c13166776 Centralise keyboard shortcuts in a registry
A single catalog in lib/shortcuts defines every shortcut's keys and
description. Components bind behaviour to it by id for as long as they
are mounted, and one listener applies the shared rules for text fields,
modals, priority and cycling. The shortcuts modal lists the catalog.
2026-09-25 13:02:38 +02:00
Rūdolfs Ošiņš 7c29fae1a7 Render checkboxes in markdown with appropriate styling 2026-09-23 17:43:55 +02:00