Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

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.

Phase 2: issue CLI, cross-references, backlinks, filter and search

c1e3e3ca696c2bae8692775977fdae21ed50bc4a · Keenan Nemetz · 17d ago · parent 37c01e5a

Phase 2: issue CLI, cross-references, backlinks, filter and search

The issue format needed no client, and still does not: every one of these is
sugar over files anyone can write. The CLI exists so the common case is not
ceremony.

- `vole issue new|comment|close|reopen|list|show` works on the clone in the
  current directory. It fetches the issues branch first so its commit is a
  fast-forward the server will accept, validates locally so a malformed issue
  never costs a round trip, then pushes. Writing goes through gitx.CommitFiles,
  the shared CAS path, so a concurrent author's commit cannot be clobbered.
- Ids may be abbreviated. `list` prints eight characters, so every id-taking
  command resolves prefixes and refuses an ambiguous one with the candidates
  listed. This was a real bug: list printed short ids while comment and close
  demanded the full ULID, so copying the id from the CLI's own output failed.
  The integration test now drives the CLI with a prefix.
- `#<ulid>` in an issue body or comment renders as a link. Rewriting happens on
  the markdown source, skipping fenced blocks so a reference inside a code
  sample stays literal; a test asserts both halves.
- Backlinks: commits whose message mentions an id are listed on the issue, found
  with `git log --grep`. git does the search, so there is no second index.
- Filtering and search on the list page: state, label, and a LIKE over title and
  body, backed by an `issue_labels` table and an indexed `body` column.

Notifications are deliberately not built. The web is read-only and has no user
identity, so "in-app" has nobody to notify and email would need subscriptions,
which need a store. The honest fit is a per-repo Atom feed when someone wants
one; the roadmap says so rather than leaving a phantom item.

Verified by hand with a clone and a key: filed an issue, listed it, commented
using the short id, closed it, confirmed the web showed the closed state, the
rendered comment and the label filter, and that an ambiguous prefix is refused.

docs/roadmap.md +17−5

@@ -146,14 +146,26 @@ Shipped:
146 146 existing full rebuild. The detail page reads from git so bodies are never stale.
147 147 - **Read-only rendering**: list, thread, GFM markdown sanitised with bluemonday —
148 148 issue bodies arrive by push, so they are untrusted input on a public page.
149 - **`vole issue new|comment|close|reopen|list|show`**: sugar over the same tree.
150 It fetches the issues branch first so its commit is a fast-forward, validates
151 locally so a bad issue never costs a round trip, then pushes.
152 - **Cross-references**: `#<ulid>` renders as a link, except inside fenced code.
153 - **Backlinks**: commits whose message mentions an id are listed on the issue,
154 via `git log --grep`. No second index to keep in sync.
155 - **Filtering and search**: state, label, and a LIKE search over title and body,
156 backed by an `issue_labels` table and an indexed `body` column.
149 157
150 158 Remaining:
151 159
152 - `vole issue` CLI as sugar: allocate a ULID, scaffold the files, commit, push
153 - State changes are hand edits today (closing an issue is editing `state`)
154 - Cross-references (`#<ulid>`) and backlinks from commits
155 - Filtering by label/assignee and search over the derived index
156 - Notifications: in-app first, then email
160 - **Notifications are deliberately not built.** There is no user identity on a
161 read-only web, so "in-app" has nobody to notify, and email needs subscriptions
162 that would themselves need a store. The natural fit for this architecture is a
163 per-repo Atom feed of issue and commit activity, which needs no auth — worth
164 doing when someone asks, instead of building a notification system nobody can
165 log into.
166 - Assignees are in `meta.json` but not rendered or filterable yet
167 - Comment editing and deletion (today: append another comment, or rewrite
168 history and force-push)
157 169
158 170 Exit criteria: a user with an editor and a key files, comments on and closes an
159 171 issue without installing Vole; an invalid tree is rejected with the offending path