Skip to content
Open
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
4 changes: 4 additions & 0 deletions .github/prompts/bloom-test-CURRENTPAGE.prompt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
description: use browser tools to test and debug
---
The backend should already be running and serving a page at http://localhost:<port>/bloom/CURRENTPAGE. <port> is usually 8089. If i include a port number, use that, otherwise use 8089. You may use chrome-devtools-mcp, playwright-mcp, or other browser management tools. If you can't find any, use askQuestions tool to ask me to enable something for you to use.
93 changes: 93 additions & 0 deletions .github/skills/reviewable-thread-replies/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
---
name: reviewable-thread-replies
description: 'Reply to GitHub and Reviewable PR discussion threads one-by-one. Use whenever the user asks you to respond to review comments with accurate in-thread replies and verification.'
argument-hint: 'Repo/PR and target comments to reply to (for example: BloomBooks/BloomDesktop#7557 + specific discussion links/IDs)'
note: it's not clear that this skill is adequately developed, it's not clear that it works.
---

# Reviewable Thread Replies

## What This Skill Does
Posts in-thread replies on both:
- GitHub PR review comments (`discussion_r...`)
- Reviewable-only discussion anchors quoted in review bodies

## When To Use
- The user asks you to respond to one or more PR comments.
- Some comments are directly replyable on GitHub, while others only exist as Reviewable anchors.
- You need one response per thread, posted in the right place.

## Inputs
- figure out the PR using the gh cli
- Target links or IDs (GitHub `discussion_r...` or Reviewable `#-...` anchors), or enough context to discover them.
- Reply text supplied by user, or instruction to compose replies from thread context.

## Required Reply Format
- Every posted reply must begin with `[<agent name>]`.
- Do not prepend workflow labels (for example `Will do, TODO`).

## Procedure
1. Collect and normalize targets.
- Build a list of target threads with: `target`, `context`, `response`.
- If response text is not provided, compose a concise response from the thread context.
- Separate items into:
- GitHub direct thread comments (have comment IDs / `discussion_r...`).
- Reviewable-only threads (anchor IDs like `-Oko...`).

2. Post direct GitHub thread replies first.
- Use GitHub PR review comment reply API/tool for each direct comment ID.
- Post exactly one response per thread.
- Verify the new reply IDs/URLs are returned.

3. Open Reviewable, give the user time to authenticate.
- Navigate to the PR in Reviewable.
- If the user session is not active, use Reviewable sign-in flow and confirm identity before posting.

4. Reply to Reviewable-only threads one by one.
- For each discussion anchor:
- Navigate to the anchor.
- Find the thread reply input for that discussion.
- Post response text with the required `[<agent name>]` prefix.
- Avoid adding status macros or extra prefixes.
- Wait for each post to render before moving to the next thread.

5. Verification pass.
- Re-check every target thread and confirm the expected response appears.
- Confirm no target remains unreplied due to navigation/context loss.
- Confirm no accidental text prefixes were added.

## Decision Points
- If target has GitHub comment ID: use GitHub API/tool reply path.
- If target exists only in Reviewable anchor: use browser automation path.
- If Reviewable shows sign-in or disabled reply controls: authenticate first, then retry.
- Never click `resolve`, `done`, or `acknowledge` controls and never change discussion resolution state.
- If reply input transitions into a temporary composer panel:
- Submit without modifying response text semantics.
- Keep the required `[<agent name>]` prefix and avoid workflow labels.
- If posted text does not match intended response: correct immediately before continuing.

## Quality Criteria
- Exactly one intended response posted per target thread.
- Responses are correct for thread context and begin with `[<agent name>]`.
- No unwanted prefixes like `Will do, TODO`.
- No unresolved posting errors left undocumented.
- Final status includes: posted targets and skipped/failed targets.

## Guardrails
- Do not post broad summary comments when thread-level replies were requested.
- Do not resolve, acknowledge, dismiss, or otherwise change PR discussion status; leave resolution actions to humans.
- Do not rely on internal/private page APIs for mutation unless officially supported and permission-safe.
- Do not assume draft state implies publication; verify thread-visible posted output.
- Do not continue after repeated auth/permission failures without reporting the blocker.

## Quick Command Hints
- List PR review comments:
```bash
gh api repos/<owner>/<repo>/pulls/<pr>/comments --paginate
```

- List PR reviews (to inspect review-body quoted discussions):
```bash
gh api repos/<owner>/<repo>/pulls/<pr>/reviews --paginate
```

6 changes: 3 additions & 3 deletions DistFiles/localization/am/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="am" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="am" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/ar/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="ar" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="ar" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/az/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="az" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="az" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/bn/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="bn" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="bn" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
41 changes: 38 additions & 3 deletions DistFiles/localization/en/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -727,11 +727,46 @@
<note>BookSettings.LockedByXMatter</note>
<note>{0} is the name of an xmatter pack</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<note>BookSettings.Title</note>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<note>BookAndPageSettings.Title</note>
<note>the heading of the dialog</note>
</trans-unit>
<trans-unit id="BookAndPageSettings.BookArea" sil:dynamic="true" translate="no">
<source xml:lang="en">Book</source>
<note>ID: BookAndPageSettings.BookArea</note>
<note>Area label for tabs/pages that affect all pages in the current book.</note>
</trans-unit>
<trans-unit id="BookAndPageSettings.BookArea.Description" sil:dynamic="true" translate="no">
<source xml:lang="en">Book settings apply to all of the pages of the current book.</source>
<note>ID: BookAndPageSettings.BookArea.Description</note>
<note>Description text shown for the Book area in the combined Book and Page Settings dialog.</note>
</trans-unit>
<trans-unit id="BookAndPageSettings.PageArea" sil:dynamic="true" translate="no">
<source xml:lang="en">Page</source>
<note>ID: BookAndPageSettings.PageArea</note>
<note>Area label for tabs/pages that affect only the current page.</note>
</trans-unit>
<trans-unit id="BookAndPageSettings.PageArea.Description" sil:dynamic="true" translate="no">
<source xml:lang="en">Page settings apply to the current page.</source>
<note>ID: BookAndPageSettings.PageArea.Description</note>
<note>Description text shown for the Page area in the combined Book and Page Settings dialog.</note>
</trans-unit>
<trans-unit id="BookAndPageSettings.Colors" sil:dynamic="true" translate="no">
<source xml:lang="en">Colors</source>
<note>ID: BookAndPageSettings.Colors</note>
<note>Label for the page-level Colors page within the combined Book and Page Settings dialog.</note>
</trans-unit>
<trans-unit id="PageSettings.Title" sil:dynamic="true" translate="no">
<source xml:lang="en">Page Settings</source>
<note>ID: PageSettings.Title</note>
<note>Title text for the standalone Page Settings dialog and the page settings button label above custom pages.</note>
</trans-unit>
<trans-unit id="PageSettings.OpenTooltip" sil:dynamic="true" translate="no">
<source xml:lang="en">Open Page Settings...</source>
<note>ID: PageSettings.OpenTooltip</note>
<note>Tooltip shown when hovering over the Page Settings button above a custom page.</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
<note>BookSettings.eBook.Image.MaxResolution</note>
Expand Down
8 changes: 4 additions & 4 deletions DistFiles/localization/es/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="es-ES" state="final">Bloqueado por {0} material de las páginas de inicio y final</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true" approved="yes">
<source xml:lang="en">Book Settings</source>
<target xml:lang="es-ES" state="final">Configuración del libro</target>
<note>BookSettings.Title</note>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="es-ES" state="needs-translation">Configuración del libro</target>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true" approved="yes">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/fr/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="fr" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true" approved="yes">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true" approved="yes">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="fr" state="final">Paramètres du Livre</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true" approved="yes">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/fuc/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="fuc" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="fuc" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/ha/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="ha" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="ha" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/hi/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="hi" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="hi" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/id/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="id" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="id" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/km/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="km" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="km" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/ksw/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="ksw" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="ksw" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/kw/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="kw" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="kw" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/ky/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="ky" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="ky" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/lo/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="lo" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="lo" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
6 changes: 3 additions & 3 deletions DistFiles/localization/mam/BloomMediumPriority.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -804,10 +804,10 @@
<target xml:lang="mam" state="needs-translation">Locked by {0} Front/Back matter</target>
<note>BookSettings.LockedByXMatter</note>
</trans-unit>
<trans-unit id="BookSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book Settings</source>
<trans-unit id="BookAndPageSettings.Title" sil:dynamic="true">
<source xml:lang="en">Book and Page Settings</source>
<target xml:lang="mam" state="needs-translation">Book Settings</target>
<note>BookSettings.Title</note>
<note>BookAndPageSettings.Title</note>
</trans-unit>
<trans-unit id="BookSettings.eBook.Image.MaxResolution" sil:dynamic="true">
<source xml:lang="en">Max Image Size</source>
Expand Down
Loading