60 Commits
Author SHA1 Message Date
Rūdolfs Ošiņš bbaf0d792b Keep file tree folders open when selecting a file
Opening another file collapsed every folder that didn't contain it,
which made browsing several folders tedious. Folders now stay open
until they're collapsed by hand.
2026-10-09 10:29:32 +02:00
Daniel Norman 040906ba6d Add list_canonical_tags command
- Load the release modal's tags with it
- Sort them with the shared sortedTags helper
- Test that peers' tags are left out
2026-10-08 18:21:48 +02:00
Daniel NormanandRūdolfs Ošiņš f90db0986a Warn about releases and artifacts by others
- Add an UntrustedWarning banner
- Warn on the Others releases list
- Warn on a release by a non-delegate
- Warn on artifacts by non-delegates on a delegate release
- Warn in the download popover for a non-delegate artifact
- Add E2E tests for both release cases

Co-authored-by: Rūdolfs Ošiņš <rudolfs@osins.org>
2026-10-08 18:21:48 +02:00
Daniel Norman e930bfd397 Link and mention releases
- Route release and release list links to their views
- Offer releases for a pasted ID or link
- List delegate releases in # search
- Show release references as chips
- Cache release lookups for mentions
- Record release mentions in ADR 0003
2026-10-08 18:21:48 +02:00
595a81150b Add Releases and Release views
- Add the Releases list and Release page
- Add modals to create, delete and redact releases
- Register artifacts and add or remove their locations
- Download, seed and unseed artifacts from the release page
- Share one artifact node state and show its status
- Pick the release commit from a list
- Rename Stop seeding to Unseed

Co-authored-by: Daniel Norman <daniel@norman.life>
Co-authored-by: Rūdolfs Ošiņš <rudolfs@osins.org>
2026-10-08 18:21:48 +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
Brandon OxendineandRūdolfs Ošiņš dc1a067396 Render mermaid diagrams
Mermaid code blocks showed up as code. Mermaid is loaded lazily, and
diagrams are redrawn when the app theme changes. DOMPurify's config
moves from a global `setConfig` to each call site, because the global
one stripped mermaid's SVG output.

Co-authored-by: Rūdolfs Ošiņš <rudolfs@osins.org>
2026-10-07 16:56:58 +02:00
Brandon OxendineandRūdolfs Ošiņš ab8300e09a Show repository images in READMEs
Relative images in markdown and AsciiDoc files were broken, nothing
resolved them against the repository. They're read through a new
`repo_blob_bytes` command, which skips the text encoding and last
commit lookup of `repo_blob`. Images now also keep their alt text.

Co-authored-by: Rūdolfs Ošiņš <rudolfs@osins.org>
2026-10-07 16:56:16 +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ņš 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ņš 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
Brandon Oxendine d6145300c1 Make task list items clickable in markdown 2026-10-06 14:33:08 +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ņš 2f283f1047 Open rad: links in the app 2026-10-05 17:37:03 +02:00
Brandon OxendineandRūdolfs Ošiņš 91ab693b4b Link Radicle entities from comments
References are picked or pasted in the composer, stored as `rad:` URIs
with a readable label, and shown as chips or links that open in-app when
the entity is here.

Co-Authored-By: Rūdolfs Ošiņš <rudolfs@osins.org>
2026-10-05 17:29:02 +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ņš 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ņš 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ņš 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ņš 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