~bigbes/sr-ht-dolt · issues

6qa96iefv9if9nofobpam5bdioojfb7l · 10 rows

idcontent_hashtitledescriptiondesignacceptance_criterianotesstatuspriorityissue_typeassigneeestimated_minutescreated_atcreated_byownerupdated_atclosed_atclosed_by_sessionexternal_refspec_idcompaction_levelcompacted_atcompacted_at_commitoriginal_sizesenderephemeralwisp_typepinnedis_templatemol_typework_typesource_systemmetadatasource_repoclose_reasonevent_kindactortargetpayloadawait_typeawait_idtimeout_nswaitershook_beadrole_beadagent_statelast_activityrole_typerigdue_atdefer_untilno_historystarted_atis_blocked
sr-ht-dolt-0qffc02bbd7697c59c02d006fb5e3bf2c052d971c36d809bea95e2ef0a159889b16MCP surface: a read-only agent door to hosted databasesServe /mcp on the web listener so an agent reads a hosted Dolt database — and the beads tracker inside it — by calling tools instead of scraping the board HTML. Read-only by construction: no SQL tool (the pure-Go build stands on never starting the engine), no writes, no second reading of any schema. Spec: docs/DESIGN.mcp.md.docs/DESIGN.mcp.md is normative. Donor is sourcehut-coverage/mcpsrv (modelcontextprotocol/go-sdk v1.6.1): stateless streamable HTTP, Host allowlist replacing the SDK DNS-rebinding guard, consumer-side seams in ports.go, in-process client over fakes in tests.open1epicNULLNULL2026-08-12T20:10:04ZEugene Blikhbigbes@gmail.com2026-08-12T20:10:04ZNULLNULL0NULLNULLNULL000�{}0NULLNULLNULL0NULL0
sr-ht-dolt-0qf.1573249e114393372c5f26a2572baf8fa924e214e471ed31e1d75e9c8245b53d6Extract the beads projection into a root beads/ packageweb/beads.go holds the one reading of the beads schema (fingerprint, lane bucketing, ready rule, status categories, dependency walk, event humanizer, filter model, row helpers) where a second consumer cannot reach it. Move it to a root beads/ package depending on browse/ and the stdlib only; web/beads.go and web/milestones.go keep their View implementations. Prerequisite of the MCP beads tools, of the cross-database ready page and of cross-database links.docs/DESIGN.mcp.md §8. Pure move plus export renames — web/beads_test.go and web/milestones_test.go move with it. A behaviour change smuggled into this commit makes the refactor unreviewable.go test ./... green with the suites relocated; no behaviour diff in the rendered board (same fixtures, same output); beads/ imports neither net/http nor core.open1taskNULLNULL2026-08-12T20:11:37ZEugene Blikhbigbes@gmail.com2026-08-12T20:11:37ZNULLNULL0NULLNULLNULL000�{}0NULLNULLNULL0NULL0
sr-ht-dolt-0qf.28e6146eadd1e58f2b423fb9dd6cd47903d1e79ea7e967d24566aea9812fb090cauthn: the tokens.sr.ht bearer plane and core.GrantRead/mcp is bearer-only, and this service has no bearer plane today: cookie, meta PAT over HTTP Basic, and the dolt keypair JWT on gRPC. Add ParseBearer plus a plane over sr-ht-ecore/bearer (working tokens issued by tokens.sr.ht, ClientID tokens.sr.ht, gated on the new core.GrantRead = "dolt:read") and a meta-PAT arm over the existing decode path, gated by authn.TokenGrantsAllow at core.AccessRO. A token that fails verification is a refusal, never a downgrade to anonymous.docs/DESIGN.mcp.md §4. sr-ht-ecore/bearer + /grants are already reachable (sr-ht-ecore is a direct dependency); cov.sr.ht authn/instance.go is the donor, including the consumer-side InstanceValidator seam. [tokens.sr.ht]origin absent means no such daemon: working tokens refused, meta PATs and anonymity still work.Table-driven classification tests with no network: working token with/without dolt:read, meta PAT, garbage, absent header (anonymous), expired.open1taskNULLNULL2026-08-12T20:11:44ZEugene Blikhbigbes@gmail.com2026-08-12T20:11:44ZNULLNULL0NULLNULLNULL000�{}0NULLNULLNULL0NULL0
sr-ht-dolt-0qf.3700764cff30a4c71a08b87eecb428a469a1701bb257a567e2e8b55e8e1762223mcpsrv: skeleton, Host allowlist, grant gate, list_databasesNew mcpsrv/ package: Server + New over modelcontextprotocol/go-sdk, stateless streamable HTTP, the Host allowlist that replaces the SDK DNS-rebinding guard, the read-grant gate in front of the handler, consumer-side seams in ports.go, and one tool (list_databases) to prove the surface end to end.docs/DESIGN.mcp.md §5-§7. Stateless is an authentication decision: in stateful mode the principal of the initialize request answers every later call. Port the donor identity matrix test and re-run it against our pinned SDK rather than citing the donor.Identity matrix test (no credential / stranger token / owner token on one session) asserts the answer follows the call; Host allowlist test (instance host passes, rebinding host 403 before the SDK); grant gate test.open1taskNULLNULL2026-08-12T20:11:44ZEugene Blikhbigbes@gmail.com2026-08-12T20:11:44ZNULLNULL0NULLNULLNULL000�{}0NULLNULLNULL0NULL0
sr-ht-dolt-0qf.4bd8dd472bd71f282d5eaea3072a8e8cd448fb2c7d330444408baed331e9121f6mcpsrv: generic tools over the browse seamlist_branches, list_tables, read_rows, get_commit_log, get_commit_diff — the browse surface as tools, addressing a database as {owner, name} and defaulting ref to the repository default branch. Caps: read_rows limit<=500 (default 100), get_commit_log limit<=100 (default 25); a truncated result says so and carries the true total.docs/DESIGN.mcp.md §9.1, §9.3. Visibility is core.Allowed/OpBrowse with NotFoundForPrivate masking — never a distinguishable forbidden.Visibility matrix per tool over PUBLIC/UNLISTED/PRIVATE x anonymous/stranger/grantee/owner; cap tests.open2taskNULLNULL2026-08-12T20:11:45ZEugene Blikhbigbes@gmail.com2026-08-12T20:11:45ZNULLNULL0NULLNULLNULL000�{}0NULLNULLNULL0NULL0
sr-ht-dolt-0qf.54fcc9363da648c65592a42ad2216428ffa16a7f84c3e48e5c568583cfa3774a3mcpsrv: beads tools over the shared projectionlist_issues, get_issue, list_milestones, list_memories over the extracted beads/ package. Lists carry identity and metadata and no long-text bodies; get_issue carries the bodies, both dependency directions, the transitive trees, subtasks with the rollup for an epic, comments and the merged history. The tool list is static per server, so a database without the fingerprint is refused per call, naming the generic tools as the way to read it anyway.docs/DESIGN.mcp.md §9.2. list_memories reports the revision each memory was last written at, sharing the walk with the Memory view.A non-beads database answers the beads tools with the explanatory refusal, not an error; list_issues carries no description/design/notes field at all.open2taskNULLNULL2026-08-12T20:11:46ZEugene Blikhbigbes@gmail.com2026-08-12T20:11:46ZNULLNULL0NULLNULLNULL000�{}0NULLNULLNULL0NULL0
sr-ht-dolt-0qf.660d5c474af1047fa392cd9d63c9cb26b0accfdf049c3f41f371722ea531999d1Wire /mcp into the daemon, config and READMERegister the MCP handler in cmd/doltsrht/main.go with r.Handle("/mcp", …) before web.Register and outside its CSRF group (bearer surface, no Origin, no cookie), document [tokens.sr.ht]origin in config.example.ini, and describe the surface in README.md.docs/DESIGN.mcp.md §3, §10. Handle and not Mount: Mount rewrites the path to the empty remainder and claims /mcp/*. No mcp-enabled switch — a surface that is off in production is one nobody tests.An httptest boot proves /mcp answers a tools/list and that the CSRF guard does not touch it, while a browser POST to a web form still requires same origin.open2taskNULLNULL2026-08-12T20:11:47ZEugene Blikhbigbes@gmail.com2026-08-12T20:11:47ZNULLNULL0NULLNULLNULL000�{}0NULLNULLNULL0NULL0
sr-ht-dolt-16t88a2fd7a5715be57384920506c31f7cd305072679ab394336b15dd060c0a7610Show the original object on the issue detail pageThe issue detail pane (`/view/beads?issue=<id>`) renders a curated subset of an issue: the fields the card model carries, the dependency trees, and the Comments / History tabs. Everything the view does not model — columns bd added that BeadIssue has no field for, custom metadata, the exact stored strings behind the humanized events — is invisible without leaving for the generic table browser and hunting for the row by hand. Show the original object on the detail page: the raw stored row(s) behind the issue, as read from the tables, so the rendering can be checked against what is actually in the database. - Carry the raw data on BeadsData in detail/epic mode: the `issues` row as an ordered column → value list (column order as read, NULLs kept distinct from empty strings — `cell` currently flattens the browse NULL placeholder to "", so read the row directly rather than through it), plus the matching rows from the satellite tables the pane already reads (labels, dependencies, comments, events) when they add anything. - Render it as a third tab in the existing activity switch next to Comments / History — the switch is a pure-CSS radio group, so a third radio + label + panel needs no JS — or as a `<details>` block under the field table if the tab strip gets crowded. Keep it collapsed by default: it is a debugging surface, not the main reading. - Present it as a key/value table plus the row as JSON, both escaped; values can be long free text (descriptions, design notes) and must wrap rather than blow the layout out horizontally. - Reuse the read that already happens in Build — the detail pane loads these tables anyway, so this must not cost another Rows call. - Tests in web/beads_test.go: raw block present in detail mode and absent in board mode, a column with no BeadIssue field still shows up, NULL renders distinctly from "". On /view/beads?issue=<id> the raw stored row behind the issue is visible without leaving for the table browser: every column of the issues row (including ones the view models no field for) with NULL distinguishable from an empty string, collapsed by default, long values wrapping instead of widening the page.open2featureNULLNULL2026-08-10T11:13:36ZEugene Blikhbigbes@gmail.com2026-08-10T11:13:36ZNULLNULL0NULLNULLNULL000�{}0NULLNULLNULL0NULL0
sr-ht-dolt-44nb50bb951638f211f7c763f1bd998752099e314d771c1f93716eedd99ce9cb4d0Beads views, round two: stream, memory, freshness, cross-databaseSix changes to the read-only beads surface: a one-column stream layout beside the parade board, a view for the memories bd remember writes, a freshness line in the header, a cross-database ready page, cross-database issue links, and copy-ready bd commands on the detail pane. Spec: docs/DESIGN.views.md.docs/DESIGN.views.md is normative. Everything stays read-only and stays inside the todo.sr.ht visual idiom the board already adopts.open2epicNULLNULL2026-08-12T20:10:11ZEugene Blikhbigbes@gmail.com2026-08-12T20:10:11ZNULLNULL0NULLNULLNULL000�{}0NULLNULLNULL0NULL0
sr-ht-dolt-b086314ccc71fe7047ad5a1bafc0067c236a442b3cb98c13b163cf596471ce52b2eMemory view: surface bd memories kept in the config table`bd remember` stores agent memories in the beads `config` table as ordinary key/value rows: the key is `kv.memory.<slug>`, the value is the memory text. Today they are reachable only through the generic table browser, mixed in with the tracker's tuning knobs (`compact_*`, `issue_prefix`, ...), and every memory is squeezed into a single table cell — which is unreadable for the multi-line handoff notes that make up most of them. Give them their own view, registered the same way Beads and Milestones are: a separate `View` implementation whose tab appears next to them for any beads DB. Shape it on web/milestones.go, which is the smallest existing companion view: - `web/memory.go`: `memoryView` registered from `init()` via `RegisterView`. `Name() == "memory"`, `Label() == "Memory"`, `Template() == "memory.html"`. - `Applies`: the beads fingerprint (reuse `(&beadsView{}).Applies`, as milestones does) plus a `config` table carrying `key` and `value` columns. `Applies` only sees table shapes, never rows, so a beads DB with no memories still gets the tab and renders an empty state — same contract milestones has. - `Build`: read `config` through `readRowsOptional`, keep rows whose key has the `kv.memory.` prefix, strip it for the display slug, sort by slug. Optional `?q=` substring filter over slug + text, and `?key=<slug>` for a single-memory detail, both parsed from the query values Build already receives. - Values are stored as written, so they carry both real newlines and literal `\n` two-character escapes (agents type them into shell strings). Normalise both into paragraphs before rendering rather than dumping one blob. - `web/templates/memory.html`: same flat todo.sr.ht idiom and inlined `<style>` block as milestones.html, with the `viewtabs` partial and `"Current" "memory"`. - Tests next to `web/milestones_test.go`: fingerprint accept/reject, prefix filtering (a `compact_batch_size` row must not show up), escape handling, filter and detail modes, empty state. A beads DB shows a Memory tab beside Beads and Milestones; it lists every kv.memory.* config row as a readable, multi-paragraph entry keyed by its slug; non-memory config rows never appear; a DB with no memories renders an empty state instead of a broken tab.open2featureNULLNULL2026-08-10T11:01:48ZEugene Blikhbigbes@gmail.com2026-08-10T11:01:48ZNULLNULL0NULLNULLNULL000�{}0NULLNULLNULL0NULL0