docs: forum archive search phase 55 and v0.8.20 roadmap
Add FORUM_ARCHIVE_SEARCH.md, update SEARCH, FORUM_CHANNELS, PLATFORM_ROADMAP, PEARCORD_PARITY, and GITEA_DEVELOPER for pearcord-forum-search module. Co-authored-by: Cursor <[email protected]>
This commit is contained in:
@@ -0,0 +1,40 @@
|
|||||||
|
# Forum archive search
|
||||||
|
|
||||||
|
P2P forum channels can hide archived posts from the default list while still finding them via search or an explicit toggle.
|
||||||
|
|
||||||
|
## Modules
|
||||||
|
|
||||||
|
| Package | Role |
|
||||||
|
|---------|------|
|
||||||
|
| `pearcord-threads` | `listForumPostsForParent(channels, parentId, { includeArchived })` |
|
||||||
|
| `pearcord-forum-search` | `forumPostHaystack`, `matchesForumQuery` |
|
||||||
|
| `pearcord-platform` | `setForumIncludeArchived`, `searchForumPosts`, guild search thread titles |
|
||||||
|
|
||||||
|
## Platform API
|
||||||
|
|
||||||
|
- `setForumIncludeArchived(include)` — when true, `view.forumPosts` includes `archived === true` threads
|
||||||
|
- `searchForumPosts(guildId, forumChannelId, query, { limit?, includeArchived? })` — title, starter body, tags, `archived` marker
|
||||||
|
- `setSearch({ query, scope })` — `scope` may be `channel`, `guild`, or `forum`
|
||||||
|
- `_resolveSearchResults()` — populates `view.searchResults` for `guild` and `forum` scopes
|
||||||
|
|
||||||
|
Guild-wide search (`searchGuildMessages`) also matches thread channel names and includes archived thread messages when the channel row is archived.
|
||||||
|
|
||||||
|
## IPC
|
||||||
|
|
||||||
|
| type | fields |
|
||||||
|
|------|--------|
|
||||||
|
| `set-forum-include-archived` | `include` (boolean) |
|
||||||
|
| `update-search` | `query`, `scope` (`channel` \| `guild` \| `forum`) |
|
||||||
|
|
||||||
|
## UI
|
||||||
|
|
||||||
|
- Forum header: **Show archived** / **Hide archived** toggle
|
||||||
|
- Search scope **Forum posts** (visible only on forum channels)
|
||||||
|
- Archived rows: muted style + **Archived** badge
|
||||||
|
- Forum scope search replaces the post list with `view.searchResults`
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd apps/pearcord && npm run test:forum-archive-search
|
||||||
|
```
|
||||||
+15
-2
@@ -33,8 +33,21 @@ P2P sync uses existing `CHANNEL_CREATE` / `CHANNEL_UPDATE` / `MESSAGE_CREATE` go
|
|||||||
|
|
||||||
## View fields
|
## View fields
|
||||||
|
|
||||||
- `forumPosts` — sorted posts when `activeChannel.type === 'forum'`
|
- `forumPosts` — sorted posts when `activeChannel.type === 'forum'` (archived hidden unless `forumIncludeArchived`)
|
||||||
- `threadsByParent[forumId]` — same threads, sidebar nesting
|
- `forumIncludeArchived` — when true, archived posts appear in the list
|
||||||
|
- `threadsByParent[forumId]` — same threads, sidebar nesting (active only)
|
||||||
|
|
||||||
|
## Archive search (v0.8.20)
|
||||||
|
|
||||||
|
- `setForumIncludeArchived(include)` — toggle archived posts in the forum list
|
||||||
|
- `searchForumPosts` + search scope **Forum posts** — finds archived posts by title, body, tags
|
||||||
|
- Guild-wide search also matches thread channel names (forum post titles)
|
||||||
|
|
||||||
|
See [FORUM_ARCHIVE_SEARCH.md](./FORUM_ARCHIVE_SEARCH.md).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run test:forum-archive-search # FORUM_ARCHIVE_SEARCH_SMOKE_OK
|
||||||
|
```
|
||||||
|
|
||||||
## Forum slowmode (v0.7.4)
|
## Forum slowmode (v0.7.4)
|
||||||
|
|
||||||
|
|||||||
@@ -114,6 +114,7 @@ git remote -v
|
|||||||
| `pearcord-settings` | User appearance prefs + `USER_PREFS_UPDATE` gossip |
|
| `pearcord-settings` | User appearance prefs + `USER_PREFS_UPDATE` gossip |
|
||||||
| `pearcord-step-up` | Local step-up PIN for sensitive actions |
|
| `pearcord-step-up` | Local step-up PIN for sensitive actions |
|
||||||
| `pearcord-forum` | Forum post tags + palette helpers |
|
| `pearcord-forum` | Forum post tags + palette helpers |
|
||||||
|
| `pearcord-forum-search` | Forum post search haystack helpers |
|
||||||
| `pearcord-stage` | Stage channel speaker roles + `STAGE_SPEAKER_UPDATE` gossip |
|
| `pearcord-stage` | Stage channel speaker roles + `STAGE_SPEAKER_UPDATE` gossip |
|
||||||
| `pearcord-automod` | Local automod rules + `AUTOMOD_CONFIG_UPDATE` gossip |
|
| `pearcord-automod` | Local automod rules + `AUTOMOD_CONFIG_UPDATE` gossip |
|
||||||
| `pearcord-voice-codec` | Opus/pcm voice frames for live P2P audio |
|
| `pearcord-voice-codec` | Opus/pcm voice frames for live P2P audio |
|
||||||
|
|||||||
+3
-1
@@ -129,7 +129,9 @@ Phases **0–2** and **4** are largely complete; **3** (live audio) and **5** (n
|
|||||||
| P53-1 | Multi-sticker composer picker (max 3, v0.8.18) | [x] |
|
| P53-1 | Multi-sticker composer picker (max 3, v0.8.18) | [x] |
|
||||||
| P54-1 | Live mesh profile banner fetch (`smoke-banner-mesh`, v0.8.19) | [x] |
|
| P54-1 | Live mesh profile banner fetch (`smoke-banner-mesh`, v0.8.19) | [x] |
|
||||||
|
|
||||||
**Next tranches:** Forum archive search · sticker soundboard · server-wide emoji slots UI.
|
| P11-2 | Forum archive search — P5-3 | [x] v0.8.20 `searchForumPosts`, show-archived toggle |
|
||||||
|
|
||||||
|
**Next tranches:** Sticker soundboard · Bare attach-mesh byte roundtrip · server-wide emoji slots UI.
|
||||||
|
|
||||||
When Phase 5 checklist is `[x]`, copy open items here into tracked rows in `PLATFORM_ROADMAP.md`.
|
When Phase 5 checklist is `[x]`, copy open items here into tracked rows in `PLATFORM_ROADMAP.md`.
|
||||||
|
|
||||||
|
|||||||
+16
-1
@@ -247,6 +247,20 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### Phase 55 — Forum archive search (v0.8.20)
|
||||||
|
|
||||||
|
| ID | Item | Status |
|
||||||
|
|----|------|--------|
|
||||||
|
| P55-1 | `pearcord-forum-search` haystack helpers | [x] |
|
||||||
|
| P55-2 | `listForumPostsForParent` + `setForumIncludeArchived` | [x] |
|
||||||
|
| P55-3 | `searchForumPosts` + guild search thread titles | [x] |
|
||||||
|
| P55-4 | Forum UI toggle + forum search scope + archived badges | [x] |
|
||||||
|
| P55-5 | smoke-forum-archive-search + FORUM_ARCHIVE_SEARCH.md | [x] |
|
||||||
|
|
||||||
|
**Next:** Sticker soundboard · Bare attach-mesh byte roundtrip · onboarding mesh E2E extension.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### Phase 54 — Live mesh banner fetch (v0.8.19)
|
### Phase 54 — Live mesh banner fetch (v0.8.19)
|
||||||
|
|
||||||
| ID | Item | Status |
|
| ID | Item | Status |
|
||||||
@@ -255,7 +269,7 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
|
|||||||
| P54-2 | `_ensureBannerAttachmentReady` prefetches via mesh before drive read | [x] |
|
| P54-2 | `_ensureBannerAttachmentReady` prefetches via mesh before drive read | [x] |
|
||||||
| P54-3 | smoke-banner-mesh + attach-mesh/gossip reliability fixes + docs | [x] |
|
| P54-3 | smoke-banner-mesh + attach-mesh/gossip reliability fixes + docs | [x] |
|
||||||
|
|
||||||
**Next:** Forum archive search · sticker soundboard · onboarding mesh E2E extension.
|
**Next:** ~~Forum archive search~~ (Phase 55) · sticker soundboard · onboarding mesh E2E extension.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -658,6 +672,7 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
|
|||||||
|
|
||||||
### Changelog
|
### Changelog
|
||||||
|
|
||||||
|
- **2026-05-21** — v0.8.20: forum archive search (`pearcord-forum-search`, `searchForumPosts`, show-archived toggle, forum search scope, smoke-forum-archive-search).
|
||||||
- **2026-05-21** — v0.8.15: profile banner images (`setProfileBannerImage`, hub card author avatars, smoke-profile-banner).
|
- **2026-05-21** — v0.8.15: profile banner images (`setProfileBannerImage`, hub card author avatars, smoke-profile-banner).
|
||||||
- **2026-05-21** — v0.8.14: profile cosmetics (`pearcord-profile-cosmetics`, RPC 56, banner/bio/avatar ring, smoke-profile-cosmetics).
|
- **2026-05-21** — v0.8.14: profile cosmetics (`pearcord-profile-cosmetics`, RPC 56, banner/bio/avatar ring, smoke-profile-cosmetics).
|
||||||
- **2026-05-21** — v0.8.13: rich hub mirror cards (`pearcord-hub-cards`, `hubMirrorJson`, UI card layout, smoke-hub-cards).
|
- **2026-05-21** — v0.8.13: rich hub mirror cards (`pearcord-hub-cards`, `hubMirrorJson`, UI card layout, smoke-hub-cards).
|
||||||
|
|||||||
@@ -7,14 +7,17 @@ Pearcord supports local message search without a central search index. All queri
|
|||||||
| Scope | UI label | Behavior |
|
| Scope | UI label | Behavior |
|
||||||
|-------|----------|----------|
|
|-------|----------|----------|
|
||||||
| `channel` | This channel | Filters `view.messages` in the active text channel (client-side) |
|
| `channel` | This channel | Filters `view.messages` in the active text channel (client-side) |
|
||||||
| `guild` | All channels | Sidecar runs `searchGuildMessages` across text + thread channels |
|
| `guild` | All channels | Sidecar runs `searchGuildMessages` across text + thread channels (includes archived thread titles) |
|
||||||
|
| `forum` | Forum posts | Sidecar runs `searchForumPosts` on the active forum channel (includes archived posts) |
|
||||||
|
|
||||||
Guild scope is only available in server (`guild`) mode.
|
Guild and forum scopes are only available in server (`guild`) mode. Forum scope requires the active channel to be `type: forum`.
|
||||||
|
|
||||||
## Platform API
|
## Platform API
|
||||||
|
|
||||||
- `setSearch({ query, scope })` — stores `_searchQuery` / `_searchScope` for `view()`
|
- `setSearch({ query, scope })` — stores `_searchQuery` / `_searchScope` for `view()`
|
||||||
- `searchGuildMessages(guildId, query, { limit? })` — returns hits with `channelName` attached
|
- `searchGuildMessages(guildId, query, { limit? })` — returns hits with `channelName` attached
|
||||||
|
- `searchForumPosts(guildId, forumChannelId, query, { limit?, includeArchived? })` — forum post hits with `snippet`, `tags`
|
||||||
|
- `setForumIncludeArchived(include)` — toggles archived posts in `view.forumPosts`
|
||||||
|
|
||||||
HyperDB engine scans per `channelId` (no guild-wide index yet). JSON engine uses `{ guildId }` find.
|
HyperDB engine scans per `channelId` (no guild-wide index yet). JSON engine uses `{ guildId }` find.
|
||||||
|
|
||||||
@@ -22,9 +25,12 @@ HyperDB engine scans per `channelId` (no guild-wide index yet). JSON engine uses
|
|||||||
|
|
||||||
| type | fields |
|
| type | fields |
|
||||||
|------|--------|
|
|------|--------|
|
||||||
| `update-search` | `query`, `scope` (`channel` \| `guild`) |
|
| `update-search` | `query`, `scope` (`channel` \| `guild` \| `forum`) |
|
||||||
|
| `set-forum-include-archived` | `include` |
|
||||||
|
|
||||||
`view.searchResults` is populated when `scope === 'guild'` and `query` is non-empty.
|
`view.searchResults` is populated when `scope` is `guild` or `forum` and `query` is non-empty.
|
||||||
|
|
||||||
|
See also [FORUM_ARCHIVE_SEARCH.md](./FORUM_ARCHIVE_SEARCH.md).
|
||||||
|
|
||||||
## UI
|
## UI
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user