diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..67401c0 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,14 @@ +{ + "permissions": { + "allow": [ + "Bash(rtk grep *)", + "Bash(rtk read *)", + "Bash(rtk git *)" + ], + "additionalDirectories": [ + "/config/.claude/skills/security-audit", + "/config/security-audit-skill", + "/config/.cargo/registry" + ] + } +} diff --git a/.rtk/filters.toml b/.rtk/filters.toml new file mode 100644 index 0000000..d9bd43f --- /dev/null +++ b/.rtk/filters.toml @@ -0,0 +1,13 @@ +# Project-local RTK filters — commit this file with your repo. +# Filters here override user-global and built-in filters. +# Docs: https://github.com/rtk-ai/rtk#custom-filters +schema_version = 1 + +# Example: suppress build noise from a custom tool +# [filters.my-tool] +# description = "Compact my-tool output" +# match_command = "^my-tool\\s+build" +# strip_ansi = true +# strip_lines_matching = ["^\\s*$", "^Downloading", "^Installing"] +# max_lines = 30 +# on_empty = "my-tool: ok" diff --git a/CHANGELOG.md b/CHANGELOG.md index c10977d..a36579c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,11 @@ The long form, with what was wrong before and how it was found, is in - An unused icon glyph (`minus`) left over from before Unsubscribe settled on `circleMinus`. +### Fixed + +- Add a feed opened over Directory or Popular now shows its Popular list instead of staying on + "Loading…", and no longer cuts the Directory behind it down to ten. + ## [0.5.4] - 2026-09-14 ### Added diff --git a/CLAUDE.md b/CLAUDE.md index ca14ad6..8d4ca98 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -154,3 +154,14 @@ Deliberate simplifications get a `ponytail:` comment naming the ceiling and the (documented in [docs/sso.md](docs/sso.md)). * A feed's `` subtitle is dropped whenever `content:encoded` exists, which loses Substack-style subtitles. + + +# Command output + +Command output here is condensed to save tokens, keeping every signal and +dropping costly noise. Treat it as the complete result: run commands +normally, and batch related commands into one call to avoid extra turns. +Truncated results state their recovery path in their own output. Re-run a +command as `rtk proxy ` only when its result is unusable: empty when +output was clearly expected, contradicting its exit code, or garbled. + \ No newline at end of file diff --git a/tests/ui/app.spec.js b/tests/ui/app.spec.js index 1c32655..01b0315 100644 --- a/tests/ui/app.spec.js +++ b/tests/ui/app.spec.js @@ -703,6 +703,12 @@ test('Popular lists what everyone here reads, but never a private feed', async ( await expect(offered.filter({ hasText: /Test Subscriptions/ })).toHaveCount(0); await expect(offered.filter({ hasText: /Paid Show|paid-show/ })).toHaveCount(0); + // Add a feed opened over Directory fills its own list, not the pane behind it. + await piper.locator('#addFeed').click(); + await expect(piper.locator('#modalCard .childrow', { hasText: 'Test Show' })).toBeVisible(); + await expect(offered).toHaveCount(dir.length); + await piper.locator('#modalCard button[title="Cancel"]').click(); + const row = async () => (await (await piper.request.get('/api/popular')).json()).find(p => p.id === 'test-show'); const before = await row(); diff --git a/web/index.html b/web/index.html index 4680e06..84238cc 100644 --- a/web/index.html +++ b/web/index.html @@ -1625,11 +1625,11 @@ $('#addFeed').onclick=()=>{ Only items matching a keyword are downloaded.
-
+

Loading…

`); $('#nurl').focus(); - listFeeds('/api/popular'); + listFeeds('/api/popular',$('#npopular')); $('#nsave').onclick=async()=>{ const url=$('#nurl').value.trim(); if(!url) return; $('#nsave').disabled=true; $('#nsave').title='Adding…'; @@ -1644,9 +1644,9 @@ $('#addFeed').onclick=()=>{ }; // What everyone here reads, you included, as a place to start. The rows carry an id, never a -// URL, so a key in someone's feed address never reaches this page. -async function listFeeds(url){ - const box=$('#popular'); +// URL, so a key in someone's feed address never reaches this page. The caller hands over the +// box: looked up by id, the Add a feed dialog's list landed in the Directory pane behind it. +async function listFeeds(url,box){ let rows=[]; try{ rows=await api(url)||[]; }catch{} box.innerHTML=rows.length?'':'

Nothing yet. Feeds people here subscribe to show up here.

'; @@ -1691,7 +1691,7 @@ async function renderListed(v){ ${listening?`
Currently Listening

Loading…

`:''}`; $('#count').textContent=v.title; - const n=await listFeeds(v.url); + const n=await listFeeds(v.url,$('#popular',box)); if(VIEWS[S.feed]===v) $('#count').textContent=`${v.title}: ${n} feed${n===1?'':'s'}`; if(listening) renderListening(); }