Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# Changelog

## 1.0.85

- Feat: three ways to browse pinned sessions, from the same `πŸ“Œ Pinned (N)` header
- **Pinned zone now sorts by recency** like every other list (it used to sort by when you pinned, which buried the session you touched five minutes ago beneath months-old pins)
- **Collapsing the zone now ungroups instead of hiding**: pinned sessions fall back to their normal chronological position, still marked β˜… β€” that gives you a pure "everything in time order" list, and no browsing state can make a pinned session invisible any more
- **New `only` toggle** on the right of the header: show β€” and search β€” pinned sessions only
- A pinned session is never folded away into the "minor sessions" group, and pins older than the loaded list stay visible in every mode
- Searching now also matches the title / branch / PR link of pinned sessions older than the loaded list β€” previously such a pin was visible while browsing but reported as "no match" the moment you searched for its name
- The `N sessions` count next to the search box reports the scoped total while `only` is on, instead of the unfiltered one

## 1.0.84

- Feat: session pins & manual hide β€” session-finding Batch 1 PR-2 (plan: `docs/session-finding-plan.md` Β§4.4)
Expand Down
22 changes: 22 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,28 @@
- After 3 back-to-back reviews, limited to 4 reviews per hour
- Each push triggers an incremental review β€” rapid pushes (4+ within an hour) will queue or delay reviews
- **Practical rule:** wait for all reviewers to finish, address all comments, then push fixes together (one or more commits is fine, but aim for a single push). This conserves review quota and avoids triggering redundant review cycles.
- **A green `CodeRabbit pass` does not mean it reviewed anything.** `gh pr checks` prints the same green tick whether CodeRabbit reviewed and found nothing or never ran. The distinction is only in the status description:

```bash
SHA=$(gh pr view <pr-number> --json headRefOid --jq .headRefOid)
gh api repos/grimmerk/codev/commits/"$SHA"/statuses \
--jq '.[] | select(.context=="CodeRabbit") | "\(.state) β€” \(.description)"'
# "success β€” Review completed" ← actually reviewed
# "success β€” Review rate limited" ← never ran; the tick is meaningless
```

**cubic needs a different source, and its review body is not it** β€” it does not always post one. On PR #137 it reviewed a head, found nothing, and posted no body at all, so a body-based check reported "not reviewed yet". Read the check-run output, which is always present and states the counts:

```bash
SHA=$(gh pr view <pr-number> --json headRefOid --jq .headRefOid)
gh api repos/grimmerk/codev/commits/"$SHA"/check-runs \
--jq '.check_runs[] | select(.name|test("cubic")) | "\(.conclusion) β€” \(.output.summary)"'
Comment thread
grimmerk marked this conversation as resolved.
# "success β€” AI review completed with 1 review. 0 issues found across 4 files"
```

When it *does* post a body, that body embeds the SHA it reviewed (`<!-- cubic:review-post:…:<sha>:… -->`), which is useful corroboration but not a substitute.
- **Findings arrive in three places, and only one of them has an unresolved count.** Inline review comments become threads (`reviewThreads`, resolvable); plain comments are issue comments; and CodeRabbit puts `🧹 Nitpick` and `⚠️ Outside diff range` blocks in the **review body** (`gh api repos/.../pulls/<n>/reviews --jq '.[].body'`), which is neither. Measured on PR #137: `reviewThreads` reported zero unresolved twice while a real finding β€” once a Major β€” sat in a review body. A review-body finding has no thread, so answer it with `gh pr comment` quoting it.
- **Whether a bot must review before merging is a judgment, not a rule.** Nothing here requires it, and CodeRabbit's free-plan rate limit can withhold a review indefinitely (it was limited on 4 of 6 heads in one evening on PR #137, largely self-inflicted by pushing four times). Default: wait for both. Escape hatch, when the wait stops being informative β€” if two attempts on the *current* head both come back rate-limited (the automatic run from the push, then one `@coderabbitai review` posted at least ~30 minutes after the rate-limit timestamp), treat CodeRabbit as unavailable and judge on cubic plus CI. Say so explicitly rather than reporting that both reviewers passed.

## Build Commands

Expand Down
11 changes: 9 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,16 @@ CodeV can list, search, and resume Claude Code sessions. Press `βŒƒ+⌘+R` to op

Search covers **every session and every user prompt you ever typed** (not just the ~100 most recent sessions shown in the list) plus titles, branches, PR links, and last AI replies. When a match sits in the middle of a conversation, the row shows a `βŒ• #N …` snippet with the surrounding context. Closed one-shot sessions (≀2 messages, untitled, no PR) fold into an expandable "minor sessions" row to keep the list scannable.

**Pin** the sessions you keep coming back to (hover πŸ“Œ on a row, or `⌘D` on the selected row): they **move into** a collapsible **πŸ“Œ Pinned** zone at the top (no duplicate left in the timeline; search still shows everything) β€” works even for old sessions found via deep search. **Hide** one-offs you never want in the main flow (hover ⊘, or `β‡§βŒ˜D`): they move into the minor-sessions fold, stay searchable, and can be unhidden from inside the fold (they carry a persistent ⊘ marker there). Pins and hides live in `~/.config/codev/session-marks.json`, shared across accounts.
**Pin** the sessions you keep coming back to (hover πŸ“Œ on a row, or `⌘D` on the selected row): they **move into** a **πŸ“Œ Pinned** zone at the top, ordered by recency like the rest of the list β€” works even for old sessions found via deep search. **Hide** one-offs you never want in the main flow (hover ⊘, or `β‡§βŒ˜D`): they move into the minor-sessions fold, stay searchable, and can be unhidden from inside the fold (they carry a persistent ⊘ marker there). Pins and hides live in `~/.config/codev/session-marks.json`, shared across accounts.

Keyboard semantics worth knowing: the shortcuts act on the **selected row** (the one with the blue left border β€” hovering selects), and require an explicit selection. `⌘D` = pin/unpin toggle; `β‡§βŒ˜D` = hide (on a pinned row this unpins *and* folds in one step β€” pin and hide are mutually exclusive). Collapsing the zone is a mouse action on the `πŸ“Œ Pinned (N)` header; when the last pin is removed the zone disappears entirely (that's normal, not a collapse).
The `πŸ“Œ Pinned (N)` header carries two independent toggles:

| Click | Effect |
|---|---|
| the `β–Ύ πŸ“Œ Pinned (N)` label | **Group / ungroup.** Ungrouped (`β–Έ`), pinned sessions drop back into their normal chronological position with a β˜… instead of sitting in a block at the top β€” use it when you want one list purely in time order. Nothing is ever hidden either way. |
| the `only` chip on the right | **Pinned only.** The list β€” and the search box β€” is scoped to pinned sessions. Click again to leave. |

Keyboard semantics worth knowing: the shortcuts act on the **selected row** (the one with the blue left border β€” hovering selects), and require an explicit selection. `⌘D` = pin/unpin toggle; `β‡§βŒ˜D` = hide (on a pinned row this unpins *and* folds in one step β€” pin and hide are mutually exclusive). When the last pin is removed the header disappears entirely (that's normal, not a collapse). A pinned session is never folded away as a "minor session", whatever its message count.

**Simple rule**: when running multiple sessions in the same project directory at the same time, give each running session a name. Closed sessions don't need names β€” they won't cause issues.

Expand Down
Loading
Loading