Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
144 commits
Select commit Hold shift + click to select a range
1b24e50
docs(q2-preview): epic plan + beads (bd-kw93) for q2 preview workstream
cscheid May 11, 2026
1e95b39
docs(q2-preview): hub-client decomposition sub-epic plan (bd-hfjj)
cscheid May 11, 2026
12347a5
feat(q2-preview): scaffold preview-renderer + preview-runtime workspa…
cscheid May 13, 2026
5d8bd2b
refactor(q2-preview): move types + utils to preview-renderer (bd-hfjj…
cscheid May 13, 2026
72a67e7
docs(hub-client): changelog entry for bd-hfjj Phase 2
cscheid May 13, 2026
7e45d2b
refactor(q2-preview): move framework subtree to preview-renderer (bd-…
cscheid May 13, 2026
b163720
docs(hub-client): changelog entry for bd-hfjj Phase 3
cscheid May 13, 2026
9c508c9
refactor(q2-preview): move services to preview-runtime (bd-hfjj Phase…
cscheid May 13, 2026
5404bb6
docs(hub-client): changelog entry for bd-hfjj Phase 5
cscheid May 13, 2026
6510577
refactor(q2-preview): move q2-preview + iframe + overlays to preview-…
cscheid May 13, 2026
0cdda76
docs(hub-client): changelog entry for bd-hfjj Phase 4
cscheid May 13, 2026
9e80360
feat(q2-preview): q2-preview-spa skeleton + cargo xtask verify integr…
cscheid May 13, 2026
06d0373
docs(hub-client): changelog entry for bd-hfjj Phases 6+7
cscheid May 13, 2026
8d95450
docs(q2-preview): Phase A plan (bd-kw93 sub-epic kickoff)
cscheid May 13, 2026
1e6c15d
sync beads: file 7 Phase A sub-issues under bd-kw93
cscheid May 13, 2026
ea1bb88
refactor(wasm-js-bridge): lift to @quarto/wasm-js-bridge workspace pa…
cscheid May 13, 2026
043f65e
docs(hub-client): changelog entry for bd-0xmt (q2-preview Phase A.0)
cscheid May 13, 2026
912c5b5
sync beads: close bd-0xmt (q2-preview Phase A.0)
cscheid May 13, 2026
28b599d
Merge bd-hfjj: hub-client decomposition (Phases 1-7) + Phase A plan
cscheid May 13, 2026
b91b4ed
Merge bd-0xmt: lift WASM JS bridge to @quarto/wasm-js-bridge (Phase A.0)
cscheid May 13, 2026
b28b735
feat(xtask): add `switch-task` for in-place sub-task transitions
cscheid May 13, 2026
82346ca
fix(xtask switch-task): branch off ref directly, don't switch first
cscheid May 13, 2026
53d777e
fix(xtask switch-task): write CLAUDE.local.md to the current worktree…
cscheid May 13, 2026
c833f01
sync beads: bd-yxqt → in_progress (Phase A.1+A.2 work begins)
cscheid May 13, 2026
e085ad7
feat(quarto-preview): CLI subcommand + new crate with embedded SPA (b…
cscheid May 13, 2026
38049e8
Merge bd-yxqt: quarto preview CLI + crates/quarto-preview shell (Phas…
cscheid May 13, 2026
65ad82a
sync beads: close bd-yxqt (Phase A.1+A.2 complete)
cscheid May 13, 2026
c992386
feat(q2-preview-spa): real boot path via PreviewApp + integration tes…
cscheid May 13, 2026
f5a489e
Merge bd-o5wd: q2-preview-spa real boot path (Phase A.3)
cscheid May 13, 2026
83865c2
sync beads: close bd-o5wd (Phase A.3 complete)
cscheid May 13, 2026
1d5fbc9
feat(xtask): `build-q2-preview-spa` + `build-all` chain (bd-501n, Pha…
cscheid May 13, 2026
8479951
Merge bd-501n: xtask build-q2-preview-spa + build-all wiring (Phase A.4)
cscheid May 13, 2026
2a2b328
sync beads: close bd-501n (Phase A.4 complete)
cscheid May 13, 2026
ea1728f
feat(quarto-preview): q2 preview boots, renders, and styles end-to-en…
cscheid May 13, 2026
d20d617
Merge bd-mflk: q2 preview boots, renders, and styles end-to-end (Phas…
cscheid May 13, 2026
d1e65e2
sync beads: close bd-mflk (Phase A.5 complete)
cscheid May 13, 2026
75493e2
feat(q2-preview-spa): always-visible force-refresh button (bd-b5hf, P…
cscheid May 13, 2026
d81f0c6
Merge bd-b5hf: always-visible force-refresh button (Phase A.6)
cscheid May 13, 2026
2359e1e
sync beads: close bd-b5hf (Phase A.6 complete)
cscheid May 13, 2026
afed12e
test(q2-preview-spa): Playwright E2E smoke for q2 preview (bd-vpsy, P…
cscheid May 13, 2026
072b4dd
Merge bd-vpsy: Playwright E2E smoke for q2 preview (Phase A.7)
cscheid May 13, 2026
63e27e8
sync beads: close bd-vpsy (Phase A.7 complete)
cscheid May 13, 2026
fec53e8
beads: file bd-u6ef (hub-client e2e fails: quarto-sync-client/dist re…
cscheid May 13, 2026
6972c64
plan(q2-preview): Phase B file-watcher + remap broadening (bd-z529, b…
cscheid May 13, 2026
66c08f9
feat(quarto-hub): WatchFilter enum + PreviewBroad for q2 preview (bd-…
cscheid May 13, 2026
a528da4
Merge bd-z529: WatchFilter + PreviewBroad for q2 preview (Phase B.1)
cscheid May 13, 2026
d04c695
sync beads: close bd-z529 (Phase B.1 complete)
cscheid May 13, 2026
ec72abc
test(q2-preview-spa): cross-doc include-shortcode propagation (bd-pf6…
cscheid May 13, 2026
0deb8e6
Merge bd-pf63: cross-doc include-shortcode propagation (Phase B.3)
cscheid May 13, 2026
18120d6
sync beads: close bd-pf63 (Phase B.3 complete)
cscheid May 13, 2026
df2f5f5
test(q2-preview-spa): config-file edit propagation (bd-mrx1, Phase B.4)
cscheid May 13, 2026
64e4d86
Merge bd-mrx1: config-file edit propagation (Phase B.4)
cscheid May 13, 2026
efdd052
sync beads: close bd-mrx1 (Phase B.4 complete), file bd-0mji follow-up
cscheid May 13, 2026
714651f
plan(q2-preview): Phase C engine execution + replay (draft)
cscheid May 13, 2026
1f881db
sync beads + plan: file Phase C sub-tasks (bd-kw93.1–bd-kw93.7)
cscheid May 14, 2026
2bdd6a5
feat(automerge-schema): IndexDocument capture sidecar (V2) — bd-kw93.1
cscheid May 14, 2026
6a0af0e
feat(sync-client): expose capture sidecar to consumers — bd-kw93.1
cscheid May 14, 2026
804b833
feat(quarto-hub): Rust IndexDocument capture sidecar mirror — bd-kw93.1
cscheid May 14, 2026
76a36b9
sync beads: close bd-kw93.1 (Phase C.3 schema complete)
cscheid May 14, 2026
e058472
plan(q2-preview): Phase C Progress section, C.3 checked off
cscheid May 14, 2026
7e82729
Merge bd-kw93.1: Phase C.3 IndexDocument capture sidecar schema
cscheid May 14, 2026
be7898a
feat(quarto-core): preview_record sub-pipeline for engine capture — b…
cscheid May 14, 2026
342a18c
feat(quarto-preview): eager engine-capture driver + server hook — bd-…
cscheid May 14, 2026
1b9c644
test(quarto-preview): end-to-end eager-capture integration — bd-kw93.2
cscheid May 14, 2026
31bfebb
plan(q2-preview): Phase C.1 checked off
cscheid May 14, 2026
0cebe4c
sync beads: close bd-kw93.2 (Phase C.1 complete)
cscheid May 14, 2026
5000268
Merge bd-kw93.2: Phase C.1 server-side eager engine capture
cscheid May 14, 2026
2f97c27
feat(q2-preview): browser-side capture replay — bd-kw93.3 (C.4)
cscheid May 14, 2026
36816ca
plan(q2-preview): Phase C.4 checked off
cscheid May 14, 2026
f1de3eb
sync beads: close bd-kw93.3 (Phase C.4 complete)
cscheid May 14, 2026
b5e1244
Merge bd-kw93.3: Phase C.4 browser-side capture replay
cscheid May 14, 2026
6c3b1ea
feat(quarto-core): compute_input_qmd for staleness checks — bd-kw93.4…
cscheid May 14, 2026
e0cc639
feat(q2-preview): wire staleness recompute into file-watcher path — b…
cscheid May 14, 2026
7caf027
plan(q2-preview): Phase C.2 checked off
cscheid May 14, 2026
a73336e
sync beads: close bd-kw93.4 (Phase C.2 complete), file bd-u3ze follow-up
cscheid May 14, 2026
66adaee
Merge bd-kw93.4: Phase C.2 staleness detection on doc-content change
cscheid May 14, 2026
cf33c60
feat(q2-preview): stale-capture overlay + /api/preview/re-execute — b…
cscheid May 14, 2026
8d31a32
plan(q2-preview): Phase C.5 checked off
cscheid May 14, 2026
17940b2
sync beads: close bd-kw93.5 (Phase C.5 complete)
cscheid May 14, 2026
462e0a1
Merge bd-kw93.5: Phase C.5 stale-capture UX overlay + re-execute endp…
cscheid May 14, 2026
9fc4c98
feat(q2-preview): preview.engine config (manual | auto | off) — bd-kw…
cscheid May 14, 2026
ab6bacc
plan(q2-preview): Phase C.6 checked off
cscheid May 14, 2026
6bd89e5
Merge bd-kw93.6: Phase C.6 preview.engine config (manual | auto | off)
cscheid May 14, 2026
3bac5e9
feat(q2-preview): per-doc capture filesystem cache — bd-kw93.7 (C.7)
cscheid May 14, 2026
2799e05
plan(q2-preview): Phase C complete
cscheid May 14, 2026
dee2647
Merge bd-kw93.7: Phase C.7 per-doc capture filesystem cache
cscheid May 14, 2026
dc662fe
plan(q2-preview): Phase D plan + sub-task issues
cscheid May 14, 2026
c91abd2
feat(q2-preview): auto-open browser + clear port-collision error — bd…
cscheid May 14, 2026
0efaa4d
plan(q2-preview): Phase D.1 checked off
cscheid May 14, 2026
0d3e01d
Merge bd-kw93.8: Phase D.1 browser-open + port-collision error
cscheid May 14, 2026
f9e2376
feat(q2-preview): initial-path resolution from CLI to SPA — bd-kw93.1…
cscheid May 14, 2026
dc3a60e
plan(q2-preview): Phase D.2 checked off
cscheid May 14, 2026
a64dcf8
Merge bd-kw93.13: Phase D.2 initial-path resolution
cscheid May 14, 2026
1d5c6c6
feat(q2-preview): non-terminal render-error overlay — bd-kw93.10 (D.4)
cscheid May 14, 2026
03c3b45
plan(q2-preview): Phase D.4 checked off
cscheid May 14, 2026
7732adf
Merge bd-kw93.10: Phase D.4 non-terminal render-error overlay
cscheid May 14, 2026
1ddcbea
feat(q2-preview): static-resource sync e2e + two bugfixes — bd-kw93.9…
cscheid May 14, 2026
65c4256
plan(q2-preview): Phase D.3 checked off
cscheid May 14, 2026
376b501
Merge bd-kw93.9: Phase D.3 static-file sync e2e + two drive-by fixes
cscheid May 14, 2026
7310d44
feat(q2-preview): dep-graph filter for re-renders — bd-kw93.12 (D.6)
cscheid May 14, 2026
562ee27
plan(q2-preview): Phase D.6 checked off
cscheid May 14, 2026
2e1136e
Merge bd-kw93.12: Phase D.6 dep-graph filter for re-renders
cscheid May 14, 2026
cb51fe7
refactor(q2-preview): walk AST for include deps instead of regex (D.6…
cscheid May 14, 2026
f5a5fac
docs(q2-preview): user-facing docs page + tighter --help — bd-kw93.11…
cscheid May 14, 2026
be015e3
plan(q2-preview): Phase D complete
cscheid May 14, 2026
cdae327
Merge bd-kw93.11: Phase D.5 user-facing docs + tighter --help
cscheid May 14, 2026
cc18047
test(q2-preview): in-process watcher→staleness integration — bd-u3ze
cscheid May 14, 2026
9314f73
plan(q2-preview): close Phase C.2 acceptance gap (bd-u3ze)
cscheid May 14, 2026
636db74
Merge bd-u3ze: watcher→staleness integration test + nextest serializa…
cscheid May 14, 2026
459f9cf
plan(q2-preview): Phase F (website chrome) + sub-tasks bd-kw93.{14,15}
cscheid May 14, 2026
217bebe
feat(q2-preview): Phase F.1 — cross-page nav + link-rewrite + Bootstr…
cscheid May 14, 2026
1c10491
Merge bd-kw93.14: Phase F.1 — cross-page navigation + link-rewriting …
cscheid May 14, 2026
ae126eb
feat(q2-preview): Phase F.2 — chrome injection + favicon + docs close…
cscheid May 14, 2026
0df1f0e
Merge bd-kw93.15: Phase F.2 — chrome injection + favicon + docs closeout
cscheid May 14, 2026
4cd5a5f
Merge remote-tracking branch 'origin/main' into feature/q2-preview-co…
cscheid May 15, 2026
f37b205
test(q2-preview): #[ignore] cell_edit_flips_staleness_in_sidecar (bd-…
cscheid May 15, 2026
d8d9193
sync beads: file bd-9brz (staleness test ignored, FSEvents flake)
cscheid May 15, 2026
2481e72
quiet default logging in quarto-hub + add -v/--verbose flag (bd-9mgd)
cscheid May 15, 2026
f4c16d6
Merge bd-9mgd: quiet default logging + -v flag
cscheid May 15, 2026
94d4e45
Fix samod URL prefix in getBinaryDocById for capture binary docs (bd-…
cscheid May 18, 2026
f3ec94f
Cell-targeted AST splice for q2 preview engine output (bd-lucp)
cscheid May 18, 2026
efd3034
sync beads: bd-m0mu closed (superseded), bd-4uvv + bd-lucp filed
cscheid May 18, 2026
58b920b
Merge bd-lucp + bd-4uvv: AST-splice for q2 preview capture consumption
cscheid May 18, 2026
2610cd9
Set browser-tab title from active doc's meta.title (bd-iuzmk)
cscheid May 18, 2026
a23358d
sync beads: bd-iuzmk closed
cscheid May 18, 2026
093b0bd
Merge bd-iuzmk: browser-tab title from doc meta.title
cscheid May 18, 2026
3bb7276
Highlight code cells in q2 preview (bd-nxslt)
cscheid May 18, 2026
d18f4f5
sync beads: bd-nxslt closed
cscheid May 18, 2026
d0d5574
Merge bd-nxslt: syntax-highlighted code cells in q2 preview
cscheid May 18, 2026
8d5b708
Match native HTML writer's CodeBlock DOM shape in preview (bd-y1fs3)
cscheid May 18, 2026
1ac1b82
sync beads: bd-y1fs3 closed
cscheid May 18, 2026
5907476
Merge bd-y1fs3: align CodeBlock DOM shape with native HTML writer
cscheid May 18, 2026
d005cd6
Emit <section> for Divs with class="section" in q2 preview (bd-coffj)
cscheid May 18, 2026
887209d
sync beads: bd-coffj closed
cscheid May 18, 2026
1d180af
Merge bd-coffj: emit <section> for Divs with class="section"
cscheid May 18, 2026
94ab379
Add preview-render-parity skill
cscheid May 18, 2026
d55756b
Merge preview-render-parity skill
cscheid May 18, 2026
89c6d4b
move docs into old-docs in preparation for new website
cscheid May 18, 2026
d66ff31
Accept website.navbar / website.page-footer / website.sidebar (bd-jje…
cscheid May 19, 2026
e26d8a6
sync beads: bd-jjep + bd-telo closed
cscheid May 19, 2026
461a2a4
Merge origin/main into feature/q2-preview-command
cscheid May 19, 2026
2a18272
sync beads: bd-zvh2p filed (q2-preview attribution producer gap)
cscheid May 19, 2026
ffca3ea
Retarget attribution integration test imports to @quarto/preview-rend…
cscheid May 19, 2026
30f2206
Fix smoke-all q2-preview fixture selectors for section-emitting footn…
cscheid May 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
32 changes: 27 additions & 5 deletions .beads/issues.jsonl

Large diffs are not rendered by default.

64 changes: 64 additions & 0 deletions .claude/rules/worktrees.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,68 @@
# Worktrees

## Two patterns, two commands

Worktrees and sub-task branches are separate concerns. Pick based on
the *shape* of the work, not on the beads-issue boundary.

- **`cargo xtask create-worktree`** — spin up a *new* worktree at
`.worktrees/<id>-<slug>/`. Right for **parallel** or
**investigation** work that benefits from isolation:
- `/investigate-beads` digs into a single issue without touching
the main checkout.
- `/triage` records context on a GH issue without committing on
top of in-flight work.
- `/upgrade-cargo-deps` runs full verification on a throwaway
branch.
- A reviewer wants to check out a colleague's branch *while* you
keep working.

These pay the fresh-worktree cost on purpose: `npm install` from
cold, `cargo build` from cold, no pollution of any other working
state. That's a feature, not a tax.

- **`cargo xtask switch-task <bd-id>`** — *reuse* the current
worktree's checkout, swap the branch in place. Right for
**sequential** implementation work inside an epic, where each
sub-task branches off the same integration line and benefits from
keeping `node_modules/` + `target/` warm.

Usage at sub-task hand-off:

```bash
# finish the previous sub-task (commit, close beads issue, etc.)
cargo xtask switch-task bd-yxqt --from feature/q2-preview-command
```

That switches the current worktree to `feature/q2-preview-command`,
fast-forward-pulls (so any sibling sub-tasks that merged in the
meantime show up), creates a fresh `beads/bd-yxqt-<slug>` topic
branch off the new tip, marks the beads issue `in_progress`, and
rewrites the `CLAUDE.local.md` context block. Omit `--from` to
branch off the current HEAD.

The two commands are siblings — `create-worktree` does *more* (it
adds a worktree); `switch-task` does *less* (it stays in place). Use
whichever matches the work.

## Integration-line convention

Epic work should accumulate on a long-lived **integration branch**
(commonly `feature/<short-name>` — e.g. `feature/q2-preview-command`).
Each sub-task lives on its own topic branch. When a sub-task closes:

```bash
git switch feature/q2-preview-command
git merge --no-ff beads/<id>-<slug>
git push origin feature/q2-preview-command
```

The `--no-ff` preserves the sub-task as a single merge commit, so
the integration branch's history reads as one entry per sub-task.
This is what `switch-task --from <branch>` expects to find when it
fast-forward-pulls — a clean integration line with all ready work
already merged in.

## Directory Convention

All worktrees live in `.worktrees/` at the project root. This directory is git-ignored.
Expand All @@ -8,6 +71,7 @@ All worktrees live in `.worktrees/` at the project root. This directory is git-i

- **GH issue triage worktree** → branch `issue-<N>` at `.worktrees/issue-<N>/`. Local branch stays bare; only the remote uses a prefix (see § Pushing for PR).
- **Beads issue investigation worktree** → branch `beads/<id>-<slug>` at `.worktrees/<id>-<slug>/`, where `<slug>` is a short kebab-case form of the issue title (3–5 words, lowercase).
- **In-place sub-task branch (via `switch-task`)** → branch `beads/<id>-<slug>` *without* a corresponding `.worktrees/` directory; the branch lives wherever the caller's worktree is checked out.

The directory mirrors the leaf of the branch name. The conventions are stable so colleagues and tooling can recognize a worktree's origin from the path alone.

Expand Down
283 changes: 283 additions & 0 deletions .claude/skills/preview-render-parity/SKILL.md

Large diffs are not rendered by default.

31 changes: 31 additions & 0 deletions .config/nextest.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Nextest configuration.
#
# Why this file exists (2026-05-14, bd-u3ze): on macOS, running multiple
# `cargo nextest` processes that each construct a `notify-rs` FSEvents
# watcher under default I/O capture causes filesystem events to silently
# fail to reach our `on_file_changed` callback. The symptom is the
# staleness test timing out at 15 s waiting for a write event that
# never propagates, while standalone runs and `--no-capture` runs both
# pass in ~1.1 s. The root cause appears to live in the interaction
# between notify-rs's CFRunLoop-based FSEvents backend and nextest's
# per-process stdout/stderr pipe setup; we couldn't fix it from the
# Rust side.
#
# Workaround: serialize the quarto-preview integration tests that boot
# the full server (and therefore arm a real FSEvents watcher). Each
# still runs in its own process; nextest just ensures only one of them
# is in flight at a time. Adds ~3-4 seconds to the workspace test suite
# at most, in exchange for deterministic results.
#
# If you're adding a new integration test under `crates/quarto-preview/
# tests/` that calls `run_with_on_ready` or otherwise instantiates the
# file watcher, add its binary name to the override filter below.

[test-groups]
# Quarto-preview integration tests that arm a `notify-rs` FSEvents
# watcher. Limited to one in-flight process at a time.
quarto-preview-fs-watcher = { max-threads = 1 }

[[profile.default.overrides]]
filter = "binary(staleness) | binary(eager_capture) | binary(boot)"
test-group = "quarto-preview-fs-watcher"
Loading
Loading