diff options
| author | Craig Jennings <c@cjennings.net> | 2026-06-23 23:40:27 -0400 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-06-23 23:40:27 -0400 |
| commit | 8869a083c3cc28c20efa63e8932347329b2865f4 (patch) | |
| tree | 8959775eb2cae28a3418542ab8e2fc235fe465f2 /README.org | |
| parent | 92ae9d8b56a9fabadf6ea8beb2163655c7a8ffb8 (diff) | |
| download | pearl-8869a083c3cc28c20efa63e8932347329b2865f4.tar.gz pearl-8869a083c3cc28c20efa63e8932347329b2865f4.zip | |
feat(sources): single-issue source (favorites + open-issue-by-id)
I wired the issue kind into the same pipeline every other source uses, so a favorited issue renders in the buffer as its own subtree instead of the v1 browser punt. The new pearl-open-issue-by-id command does the same for an issue you type by identifier or id. It's handy when someone hands you ENG-123 and you'd rather read it in Pearl than a browser.
Linear's issue(id:) accepts both the UUID and the human identifier, so there's no resolution step. I fetch by whatever was given and build the :type issue source from the returned node, so the stored id and identifier stay authoritative. Refresh re-fetches the one issue and merges by LINEAR-ID like the filter and view sources.
Tests cover the source constructor, the header round-trip, and the fetch/render and command paths across Normal, Boundary, and Error.
Diffstat (limited to 'README.org')
| -rw-r--r-- | README.org | 57 |
1 files changed, 31 insertions, 26 deletions
@@ -177,7 +177,8 @@ The hot-path commands sit one key under the prefix; the rest are grouped into su |-----------+----------------------------------------------------------------------------------------------------------| | =m= | open the full transient menu | |-----------+----------------------------------------------------------------------------------------------------------| -| =f= ... | fetch (issue sources): =s= pick source, =o= open issues, =p= by project, =f= filter | +| =f= ... | fetch (issue sources): =s= pick source, =o= open issues, =p= by project, =f= filter, =i= open issue by | +| | id | |-----------+----------------------------------------------------------------------------------------------------------| | =v= ... | views: =l= run local, =L= run Linear, =c= create, =e= edit, =k= delete, =u= publish, =U= publish | | | current, =d= save Linear view locally, =D= set default, =s= sort, =g= group, =r= reverse order | @@ -225,7 +226,9 @@ A *source* is anything Pearl can fetch from: a Linear favorite, a Custom View, a [local → Linear:Personal] My ICEBOX scratchpad (synced) #+end_example -Pick one and it fetches. List-capable favorites (Custom View / project / cycle / label / user) resolve to the existing filter or view fetch and render into the active file; non-list favorites (issue, document, dashboard, ...) open in the browser instead. Favorites are picker entries, never persisted -- a chosen favorite resolves to a concrete filter/view source before rendering, so refresh re-runs that resolved source and stays stable even if your favorites list later changes. Label and user favorites resolve by id, not by name or email, so renames in Linear don't break a saved fetch. +Pick one and it fetches. List-capable favorites (Custom View / project / cycle / label / user) resolve to the existing filter or view fetch and render into the active file. An issue favorite renders that one issue in the buffer as its own source -- its full subtree (description, comments, drawer), the same as every other source. The remaining non-list favorites (document, dashboard, ...) open in the browser instead. Favorites are picker entries, never persisted -- a chosen favorite resolves to a concrete source before rendering, so refresh re-runs that resolved source and stays stable even if your favorites list later changes. Label and user favorites resolve by id, not by name or email, so renames in Linear don't break a saved fetch. + +To open a single issue you don't have favorited, use =pearl-open-issue-by-id= (=C-; L f i=, or =i= in the transient). Type an identifier like =ENG-123= (or a raw issue id) and Pearl fetches and renders that one issue. Handy when someone hands you an issue id and you'd rather have it in Pearl than a browser tab. A local view you've published to Linear (see [[*Publishing a local view as a Linear view]] below) renders as =[local → Linear:<Team or Personal>] Name= so you can see at a glance that it's published and to which scope. The arrow reads "this local view is mirrored there." The local view is the source of truth: picking it runs *your local filter*, not the Linear mirror, so editing the local view and running it shows your edits even before you publish them. To run the server-side Linear view instead, use =pearl-run-linear-view=. Plain =[local]= entries are local-only. =[local → Linear:?]= means the entry is published but Pearl couldn't resolve the team id (deleted or renamed on Linear) -- running still works, the label is just flagging stale scope metadata. @@ -289,30 +292,32 @@ Linear stores a view's filter as an =and=/=or= tree that's richer than Pearl's A *** Fetching and refreshing -| Command | What it does | -|--------------------------------+-------------------------------------------------------------------| -| =pearl-pick-source= | Pick a Linear favorite or local view and fetch it | -|--------------------------------+-------------------------------------------------------------------| -| =pearl-list-issues= | Fetch your open issues | -|--------------------------------+-------------------------------------------------------------------| -| =pearl-list-issues-by-project= | Fetch every open issue in a chosen project (all assignees) | -|--------------------------------+-------------------------------------------------------------------| -| =pearl-list-issues-filtered= | Build an ad-hoc issue filter interactively | -|--------------------------------+-------------------------------------------------------------------| -| =pearl-run-linear-view= | Run a Linear Custom View server-side | -|--------------------------------+-------------------------------------------------------------------| -| =pearl-run-local-view= | Run a named local view from =pearl-local-views= | -|--------------------------------+-------------------------------------------------------------------| -| =pearl-publish-local-view= | Publish (or update) a local view as a Linear Custom View | -|--------------------------------+-------------------------------------------------------------------| -| =pearl-publish-current-view= | Publish the current buffer's local view (reads =#+LINEAR-SOURCE=) | -|--------------------------------+-------------------------------------------------------------------| -| =pearl-delete-local-view= | Delete a local view (and optionally its linked Linear view) | -|--------------------------------+-------------------------------------------------------------------| -| =pearl-refresh-current-view= | Re-run the source recorded in the active file | -|--------------------------------+-------------------------------------------------------------------| -| =pearl-refresh-current-issue= | Re-fetch the issue at point | -|--------------------------------+-------------------------------------------------------------------| +| Command | What it does | +|--------------------------------+----------------------------------------------------------------------| +| =pearl-pick-source= | Pick a Linear favorite or local view and fetch it | +|--------------------------------+----------------------------------------------------------------------| +| =pearl-list-issues= | Fetch your open issues | +|--------------------------------+----------------------------------------------------------------------| +| =pearl-list-issues-by-project= | Fetch every open issue in a chosen project (all assignees) | +|--------------------------------+----------------------------------------------------------------------| +| =pearl-list-issues-filtered= | Build an ad-hoc issue filter interactively | +|--------------------------------+----------------------------------------------------------------------| +| =pearl-open-issue-by-id= | Open one issue by its identifier (ENG-123) or id, rendered in-buffer | +|--------------------------------+----------------------------------------------------------------------| +| =pearl-run-linear-view= | Run a Linear Custom View server-side | +|--------------------------------+----------------------------------------------------------------------| +| =pearl-run-local-view= | Run a named local view from =pearl-local-views= | +|--------------------------------+----------------------------------------------------------------------| +| =pearl-publish-local-view= | Publish (or update) a local view as a Linear Custom View | +|--------------------------------+----------------------------------------------------------------------| +| =pearl-publish-current-view= | Publish the current buffer's local view (reads =#+LINEAR-SOURCE=) | +|--------------------------------+----------------------------------------------------------------------| +| =pearl-delete-local-view= | Delete a local view (and optionally its linked Linear view) | +|--------------------------------+----------------------------------------------------------------------| +| =pearl-refresh-current-view= | Re-run the source recorded in the active file | +|--------------------------------+----------------------------------------------------------------------| +| =pearl-refresh-current-issue= | Re-fetch the issue at point | +|--------------------------------+----------------------------------------------------------------------| Running a Linear Custom View (via =pearl-run-linear-view= or by picking a favorited view in =pearl-pick-source=) mirrors the view as Linear shows it: its own filter runs server-side, its configured sort order is reproduced, and its "completed issues" display setting is honored. A view set to hide completed issues shows only open issues in Pearl too; a view set to show completed issues from the past day/week/month/quarter/year shows open issues plus those completed or canceled within that window (the windows are fixed-day approximations of Linear's). Refreshing the view recomputes the window relative to the refresh time. |
