vole
Clone
Read only, no credentials:
https://rodent.software/git/vole.git
Write over SSH with a registered key:
git clone ssh://git@0.0.0.0:2222/vole.git
A free and open-source forge that lives in your Git repo.
Build out change review and threaded discussions
f6f4b1db24292d1df877680714952a9c568e2b78 · Keenan Nemetz · 15d ago · parent 564acd4b
Build out change review and threaded discussions - Add Conversation, Files and Runs tabs to change requests. Files uses the code-browser shape with a changed-file tree and one selected-file diff; Runs lists the head commit's workflow results. - Show anchored review comments beneath the line, with a collapsed excerpt read from the exact blob that was reviewed, and return posted anchors to their line note. - Add comment threads: any comment can be replied to, the UI flattens the descendants under one root, reply context links back to the parent, and reply targets feed a single composer at the foot of the discussion. - Collapse reply groups while keeping the root visible, and scroll to the composer when Reply is selected. - Add comment context menus with Reply, Copy text, Copy link, Edit and Delete. Add web edit/delete routes with author or admin checks; deletion leaves a tombstone so replies keep their thread. - Support --reply-to in the issue and change CLI commands, and treat a missing parent as a tombstone rather than an invalid tree. - Fix the diff comment gutter, action button colours, reply labels, and keep the Files tree and diff pane aligned. Update metadata validation, web templates, CSS, JavaScript, tests, and the CLI/change-request/issue docs.
docs/issues.md +13−5
| @@ -119,17 +119,25 @@ vole issue new --title "the docs page is blank" \ | |||
| 119 | 119 | ||
| 120 | 120 | ## Comments | |
| 121 | 121 | ||
| 122 | A comment is a file at `issues/<id>/comments/<ulid>.md` with `author` and | ||
| 123 | `created` metadata. | ||
| 122 | A comment is a file at `issues/<id>/comments/<ulid>.md` with `author`, | ||
| 123 | `created`, and optionally `reply_to` metadata. `reply_to` names any comment in | ||
| 124 | the same thread. The web renders one level of nesting by collecting a root's | ||
| 125 | descendants beneath it. | ||
| 124 | 126 | ||
| 125 | 127 | Only the author of a comment can edit or delete it. Vole compares the author on | |
| 126 | 128 | the old version of the file with the account behind the SSH key. An admin can | |
| 127 | 129 | override this, for example to repair a thread after someone leaves, and the | |
| 128 | 130 | override is recorded in `data/audit.log`. | |
| 129 | 131 | ||
| 130 | Deleting a comment removes the file, but the text remains in Git history. Editing | ||
| 131 | a comment does not add an "edited" field; the commit carries the time. Deleting is | ||
| 132 | not redaction. Redaction means an admin force-push. | ||
| 132 | Deleting a comment replaces it with a tombstone ("Comment deleted") so replies | ||
| 133 | keep the thread they answer. The text remains in Git history, and a deleted | ||
| 134 | comment cannot be edited. Editing a comment does not add an "edited" field; the | ||
| 135 | commit carries the time. Deleting is not redaction. Redaction means an admin | ||
| 136 | force-push. | ||
| 137 | |||
| 138 | The web comment menu offers Reply, Copy, Edit and Delete. Editing and deleting | ||
| 139 | are limited to the author or an admin, and deletion leaves a tombstone so replies | ||
| 140 | keep their thread. | ||
| 133 | 141 | ||
| 134 | 142 | The issue itself works differently. Closing, relabeling, or assigning someone | |
| 135 | 143 | else's issue is normal triage, not a claim of authorship. | |